Lychgate was formed in 2011 by Vortigern (guitars) with the collaboration of G. A. Chandler (vocals and guitars), Aran (Bass) and T. J. F. Vallely (drums). The debut album, self-titled, was recorded in 2012 and released in the first quarter of 2013. The debut album material was, however, old before it was recorded; based on pre-Lychgate material from between 2006 and 2010.
Between January 2012 and December 2013, Vortigern wrote material for the second album entitled 'An Antidote for the Glass Pill', which was almost entirely recorded at Priory Studios intermittently in the second half of 2014. After successful sessions it was then offered to the Finnish/USA label Blood Music (Emperor, Moonsorrow, Perturbator, Sigh, etc.) who released the work on 18th August 2015. The main focus on this album was with the utilisation of the pipe organ as the backbone to all pieces, where formerly this instrument had only occasional parts to play. To achieve its grandeur and authenticity on recording the band invited Kevin Bowyer to perform the organ parts. With the second album came a switch to a much more advanced approach to song-writing. The sound which was born represented the meeting of two worlds: the juxtaposition between "correct" harmony (traditional) and departures from it (current).
The band features members who have been part of other projects such as Esoteric, The One, Macabre Omen, Lunar Aurora and Omega Centauri.


Forex brokers with Free VPS Hosting 100Forexbrokers. Top best forex trading vps for metatrader robot expert advisorsEA) There are several advantages of using a Forex VPS with MetaTrader Expert AdvisorsEAs.
Vps forex trader. One second too late, the market shifts.
How Forex VPS Hosting Helps You Make Money VPSLand Hosting. Com The VPS service available at XM ensures seamless trading operations at an increased speed, without having to worry about any negative factors such as internet.
VSD VPS x Forex TradingKVM) LowEndTalk. Com trial period to test the service.
Fast VPS Hosting for Forex Traders Metatrader MT4 MT5. The best MetaTrader MT4 platform at the cheap price.
Therefore, any problem of any kind at your physical end will not affect the working of your private server. Adamant Finance VPSVirtual Private Server) offers a 24 7 access to a remote server with operational system installed.
Best Dedicated Premium Cheap Forex VPS Hosting MT4 Platform We offer reliable VPS hosting for Forex traders. Com VPS allows Forex traders to run their automated trading strategies EAs without having to maintain any hardware systems, backup internet or power supply.
Forex VPS Services Myfxbook reviews and ratings a forex VPS service rated and reviewed by forex traders. This should minimise the chance of system downtime due to technology and connectivity failures.
Forex Trading with Solar VPS. Forex VPS High Availability MetaTrader 4 Server ServerMule.
How to Get a Cheap VPS for Forex Trading Charts Trading Heroes. I ve been recommended linkuphost by my friend but I m not s.
Access to a fast, efficient and reliable server is critical for trading financial markets. Beeks FC VPS Forex Hosting.
All trading terminals as well as experts work here 247 independently from your PC. VPS ForexPorque Usar VPS en MetaTrader. Get premium Forex VPS. Look for VPS for Forex Trading I m looking for a VPS for forex trading.
AvaTrade VPSVirtual Private Server) de alojamiento permite a los operadores ejecutar algoritmos automatizados para el trading online Reciba bono de hasta10k. VPS for Forex Trading Protect Your Forex Robots.
Forex Trading VPS. So, today you will learn: Why you need VPS server for; Where it is better to rent it; How to connect to it.
Turnkey Forex Virtual Private ServerVPS) allows Forex traders to run a variety of automated trading strategies, including expert advisorsEAs) 24 hours a day 7 days a week. Fast VPS Hosting for Forex Traders Pepperstone VPSVirtual Private Server) hosting allows Forex traders to run automated algorithmic strategies, including expert advisors 24 hours a day 7 days a week on a Virtual Machine.
Cheap Windows VPS for Forex Traders Cheap Windows VPS service provider for Forex TradersForex VPS) allows Forex traders to run automated algorithmic strategies, including expert advisors on ahyper v) Virtual Machine. Our remote CORE VPS server is intended for active traders using robotsEAs, and Algos.
Forex VPS Free MT4 VPS from XM. FREE VPS hosting for forex trading. The beauty of using VPS for any kind of work is that it is not dependent on your resources. Core VPS Core Liquidity Markets VPS Server for Active Forex Traders.
The Most Popular Forex VPS That Top Traders Use Valutrades. MetaTrader 4 Forex trade VPS hosting.
US Forex VPS Hosting Forex VPS, VPS for Forex Trading, Best. Any VPS will likely be ok for running forex trade.
Low Latency FX Software. It is a 24/ 7 and free of charge access to the remote trading terminal, server of which is situated near the main MetaTrader 4 trading servers, thus providing a fast connection speed ping less than 3 ms.
Shenzhen stock exchange trading system Vps forex uk, Forex. 1ms latency to FX Brokers.
4 forex VPS deals to make your trading more reliable Smart Forex. Vps forex trading LiteForex As a fore trader, it is important to keep up with researching the forex world for new and better ways of trading the forex market.
Is there any of your service can be used for trading forexinstalling windows based MT4. Forex VPS cheap and reliable servers for auto trading with EA robots Forex VPS hosting cheap and reliable Windows VPS only for Forex starting from 7.
Forex Trading VPS With Windows SSD AccuWeb Hosting Buy a Windows VPS SSD plan for Forex trading. What is VPS server.
Of course the VPS needs to be stable and fastI don t want downtime between Monday FridayForex trading hours) as this can cause huge financial losses. Forex VPS hosting for traders.
Forex VPS Hosting Service Trader s Way Trader s Way, a prime on line FOREX and CFD broker, offer VPS trading terminal hosting for Expert Advisors, robots and scripts work without interruption. We Provides US Forex VPS Hosting, Forex VPS, Best Forex VPS, Forex VPS Hosting, VPS for Forex Trading, Best VPS For Forex, VPS for Forex Robot, VPS For Forex EA, Forex VPS For Metatrader, VPS For Forex, VPS Forex, Cheap Forex VPS, Forex Hosting VPS. Enhancing the Trading Experience. This is very convenient if you use trading robots or copy deals using trading signals.
Virtual Hosting in MetaTrader 4 is the Optimal Solution. ThinkMarkets ThinkMarkets provides you with one of the best forex VPS on the market via reduced latency, and lets you trade from anywhere with fast execution.
Web Hosting Talk. Forex VPS 24 7 MT4 and cTrader VPSServer.
As a rule, when you have an account with a broker, your VPS. In a global market that never sleeps, neither should your trading platform.
The concept of using a forex VPS to run trading software. The virtual hosting service allows your trades to be executed at any time with minimum delay.
Trade whenever or wherever you want with AxiTrader s MT4 forex VPS hosting services. Net s blazing fast hosting services to support trading.
Low Latency Servers. FXDDCloud Trading System Storage.
VPS FOR INSTALLING MT4 AND TRADING IN FOREX. FXDDCloud Trade Platform Storage, Forex Cloud Computing.
Forex VPS servers provide a stable way to trade the market 24 hours a day 5 days a week. Net London, NY MT4, cTrader 24h Support Forex VPS for MetaTrader 4, cTrader and other Trading Platforms.
For freerequirements) or for a fee of USD 30. We, at Zola Host, understand your requirements and the importance to keep your system running all the time so that your business is uninterrupted.
FXDD s innovative FXDDCloud system stores your trading information within our computing infrastructure. Thanks for the info and sorry for my bad Englis.
VPS for Forex Virtual Windows Server for Forex Trading VPS for Forex VPS Forex, Virtual Servers for Forex. Udemy Forex: A step by step guide to setting up your VPS MetaTrader 4 for reliable Algorithmic Trading in Forex.
Click on the link to learn more about our virtual hosting service. Run automated expert advisors 24 hours a day to maximise your profits.
DigitalOcean Hi, I used to be one of your customer. That is why EA vendors always recommend that you run their applications on a.
Com However, some basic knowledge about hosting, server configuration etc might be needed to select the best deal money wise and execution wise as well. Never lose money with MT4 and trader.
4 Answers What is the best VPS for forex. ForexTime FXTM VPS Hosting for Forex Trading. For example, if you use. If you do not go into the technical details and features, the VPS server is a computer with.
Financial Hosting Locations: LondonUK) New YorkUS. When you are ready to step up to real hosting, this cheap VPS for Forex trading charts will help you get the biggest bang for your buck. Look for VPS for Forex Trading. The most important features include fast connection to trading servers and a secure access 24 7.
Forex Trading Tools VPS Service. Forex VPS hosting is mostly suitable for heavy forex traders making use of expert advisorsEAs.
Browse our range of platforms and services, and instantly download to your chosen device. Having in place a VPS ensures that you can run your EA s in a trouble free.
Круглые рынки Circle Markets Лучший Forex Trading VPS для торговли с низкой задержкой. VPS For Forex Trading zolahost.
Your Free Independent. Best Forex Trading Platform.
Forex VPS is a high availability MetaTrader4 server for forex traders. Order your Forex VPS server now.
You may be sure that even when you sleep, your trading. What is Forex VPS FX Trading Revolution.
AccuWeb Hosting provides quality Windows SSD virtual servers for Forex VPS trading applications. Expert advisors are automated systems which use specific strategies and require your computer to run 24 7 for optimal results.
Forex VPS hosting becomes very popular. MT4 Forex VPS Hosting Services For Forex Trading At Anytime.
VPS servers have become wildly popular in the Forex trading community. Best Forex VPS Hosting MT4 for Auto Trading Any Broker Forex VPS Hosting Optimized for MetaTrader 4, cTrader and Other Trading Platforms. VPSForex Broker TradingForex. Free VPS Server RoboForex The RoboForex is glad to provide its clients with a service VPS server.
Forex VPS for MetaTrader Forex Central. As demand for remotely hosted trading increases, Forex brokers start to offer their VPS services as well.
Finally article on installing and configuring of VPS server is ready. Forex Cloud VPS Hosting.
Details CPU 2 4 cores dedicated4 GB dedicated20 30 GB SSDDDos protectedKVM. I started to trade in forex and will find to automate my trading via vps.
In most cases, FOREX traders. Servers for Forex traders Reliable Forex VPS hosting for Forex traders.
There are a few Windows VPS threads on this forum but I am specifically looking for a Windows VPS to run MT4 Trader. The result is a super light platform loaded with features that.
Hello, fellow Forex traders. In Forex Trading, timing is everything.
Ping to my forex broker Tickmill must be under 5 ms, the IP is live02. Net learn more about Atlantic. I ve written about my personal experiences with some of what I consider the best forex VPS solutions, have a look if you re interested. I m really happy with Forex EA VPS.
Stock trading tfsa nyheter forex analisa forex untuk pemula forex accelerator/ decelerator oscillatorforex trading explained bollinger bands scalper ea fx options sentiment. VPSVirtual Private Server) hosting allows Forex traders to run automated algorithmic strategies, including expert advisors 24 hours a day 7 days a week on a Virtual Machine.
IC Markets A Virtual Private ServerVPS) allows Forex traders to run a variety of automated trading strategies, including expert advisorsEAs) 24 hours a day 7 days a week without having to maintain any computer hardware, back up internet or power supply. Virtual Private Server.
Virtual Hosting in MetaTrader 4 Trading Platform The virtual hosting provides round the clock operation of the client terminal Forex VPS. Then you must be looking for a Meta Trader Platform that will keep running 24 hours a day.
I ve done a bit of research. VPS Forex Trader Reviews Expert Opinion Dec HostAdvice See real customers reviews our expert s opinion of VPS Forex Trader before signing up and learn why they are ranked 1681st out of 4009 web hosting companies.
Forex VPS Hosting For Forex Traders GetCloudServices. Trading Tech and.
When it comes to Forex Trading, everyone knows time makes all the difference. A virtual private serverabbreviation VPS) is a virtual space and machine that can be rented for a monthly fee and used for different purposes.
The biggest benefit is that a VPS enables traders to execute orders at high speeds, which is essential for the best performance of EAs. VPS for Forex Trading. Main VPS advantage is that it works 24 7, 365 days per year without interruption. 24 7 Live Support Uptime for your broker software.
Ultra low latency, 100% uptime. Here are the most popular forex VPS that top traders are using.
Basically, it s a virtual computer that you can rent and use it for your needs. Exness Our company offers clients access to a trading terminal and forex trading through a free VPS hosting service.
Hello i m looking to a Windows serverServer as pic enclosedhttp / prnt. Top and The Best VPS For Forex Trading FXDailyReport.
Forex VPS hosting the list of only the best, reliable but cheap forex VPS hosting to run MetaTrader MT4 software and expert advisors. A lot of new strategies and techniques are being developed and launched as often than one can keep up with making it impossible to investigate them all and have some more time left for trading.
All Platforms Allowed. Best Forex VPS for Auto Trading Any Broker.
Learn how Forex VPS hosting helps you and why you should be using it. So, we offer the most efficient and powerful range of trading platforms on web, tablet or mobile.
Day Forex Trading Profx Market Get the best offer for your trading robots vps availability and almost no latency with our European data centre. Forex VPS from InstaForex VPS for Forex trading is the best solution for your trading with InstaForex.
Due to this, Solar VPS allows you the ability to provision your VPS Forex accounts from. Net Forex Cloud VPS Hosting by Atlantic. Vps forex trader. I m a newbie and not sure what specs to look for.
Quora Hi there, great question. Rather, it depends on the resources of the third party service provider.
Free VPS for Forex trading from FXOpen Forex VPS available to all FXOpen ECN, STP and Crypto account holders. VPS for Forex Trading iNVEZZ.
VPS Hosting for Forex Trading. FXPRIMUS FXPRIMUS knows that our traders require quick access to their trading accounts anywhere in the world, and at any time of day.
Need Windows VPS For Forex Trading VPS Web hosting Whirlpool. Please see below for a list of recommended VPS.
Forex EA VPS Forex VPS Forex Hosting MetaTrader hosting Expert Advisors. Com Are you a serious Forex Trader.
Net Automated trading using a forex VPSVirtual Private Server) to trade with a MetaTrader 4 Expert Advisor. Com Start your Forex VPS for automatic trading.
A forex VPS has the power to reinvent the way you trade. Forex traders can install their trading.
Our promise to our clients from the start has been to enhance the trading experience and optimize. FXVM Forex VPS MT4, cTrader Hosting New York, London Equinix FXVM provides Best Forex VPS hosting for Forex Traders. The rapid development of ForexTimeFXTM) is a result of our commitment to constant innovation and the frequent launch of new products and services.


The greatest Jewish crime, for early modern Christians, was the rejection and killing of Christ. But they also had a long list of other faults they found, from physical marks, ugliness and proneness to illness to moral failings such as greed, clannishness and lack of manly courage.
Martin Luther believed the papacy to be one of the great human agencies through which Satan operated on earth. This goes a long way to explaining the virulence of his polemic against the Catholic church, which still has the power to cause some offence.


Good Morning!!! NASA is doing some amazing things with pictures from SPACE. We now are able to see EARTH in a different PERSPECTIVE. What APPEARS so BIG is really quiet SMALL. Our problems can also be SMALL but APPEAR BIG. They can even TAKE OFF like a ROCKET. We seem to ENDEAVOUR problems just by looking at a FULL MOON. Our TELESCOPE we tend to LOOK thru is just ENHANCING the IMAGE. The CHALLENGER before us lies in the DISCOVEY of God. When problems seem OUT OF THIS WORLD and you SHUTTLE. Let God fill the SPACE of your life and EXPLORE NEW GALAXIES like never before. It's a BLAST OFF, the SKY'S the limit. Joy Unspeakable, Love you!


text:
December 30, 2011 | Quote
Obama Administration Secretly Preparing Options for Aiding the Syrian Opposition
Tony Badran
"It seems awfully risky for the U.S. to be putting its chips all in on that mission," said Tony Badran, a research fellow with the conservative Foundation for Defense of Democracies. "There never was a serious mechanism for it to be a strong initiative."
Badran said that the Arab League monitoring mission just gives the Assad regime time and space to maneuver, and provides Russia with another excuse to delay international action on Syria.
"Now you understand why the Russians pushed the Syrians to accept the monitors," he said. "It allows the Syrians to delay the emergence of consensus."

redpajama_set_name: RedPajamaCommonCrawl


Made of durable styrofoam to help retain warmth and keep a constant temperature. Incubators feature two 4 inch x 8 inch viewing windows - ideal for educational purposes - and solid state thermostat control, thermometer and moisture rings. This deluxe model includes a fully installed circulated air fan it. The Fan Kit improves egg hatching conditions by circulating a constant flow of warm air throughout the incubator. Helps maintain a constant temp of 99.5 degrees F.


text:
Listen to Louis CK and Marc Maron talk for two hours about their lives and comedy careers
As if I need to tell you that listening to Louis CK talk about his life, comedy career and friendship with Marc Maron for two hours on Maron's WTF podcast is something worth your time.
Do you even enjoy comedy? Do you care about comedy? Then listen!
Louis CK and Marc Maron have known each other since they started together in the Boston comedy scene in the 1980s. This pic, Maron says, dates to about 1989.
Now listen to Maron and CK. Part One. Part Two.
Oct 7, 2010 2:00:00 PM | Louis CK, Marc Maron
Harry Hamlin tried stand-up at the Hollywood Improv for debut of "Harry Loves Lisa," but what did he learn? If you watched the series debut last night of TV Land's Harry Loves Lisa -- and why would you have, really? Really. This show is merely the latest in a continuing trend of celebrities letting TV crews into their homes...
Ian Roberts floats Conan O'Brien's blimp, so to speak. Watch all of the TBS ads If you watch TBS, and especially if you watch during the baseball playoffs, then you know it's time for them to roll out all of the CONAN promos for Conan O'Brien. The biggest promo this fall is the big orange...


Our thermal arm warmers are ideal for chilly morning riding. The stretch fabric protects the body and wicks moisture from the surface of the skin. The silicone bicep gripper holds in place to keep you warm while allowing for full range of motion.


Alerts and Messages for U.S. visitors to Senegal.
Find the closest American Space in Senegal where you can connect with the U.S.
A U.S.-backed project helped the Chapoto community in Zimbabwe create an audiobook that teaches malaria prevention and treatment in their own language.
The U.S. announces it is ending all waivers to countries purchasing Iranian crude oil and ensures a steady transition to other other oil suppliers.
The Lebanese-based terrorist organization Hizballah commits acts of terror around the world. The U.S. is offering rewards to disrupt its finances.
Life for Uighur Muslims in Xinjiang is like living in an open-air prison, with cameras everywhere, police on every corner and no privacy.
Meet Karen Uhlenbeck, a U.S. professor whose work has led to some of the most dramatic advances in mathematics in 40 years.
An American scientist has traveled to Egypt and Kenya to champion science to women and girls and hosted female scientists from South Africa and Tunisia.
This is the official website of the U.S. Embassy in Senegal. External links to other Internet sites should not be construed as an endorsement of the views or privacy policies contained therein.


text:
package org.apache.geode.management.internal.configuration.converters;

import static org.assertj.core.api.SoftAssertions.assertSoftly;

import java.util.ArrayList;

import org.junit.Test;

import org.apache.geode.cache.configuration.DiskDirType;
import org.apache.geode.cache.configuration.DiskStoreType;
import org.apache.geode.management.configuration.DiskDir;
import org.apache.geode.management.configuration.DiskStore;

public class DiskStoreConverterTest {
  private final DiskStoreConverter diskStoreConverter = new DiskStoreConverter();

  @Test
  public void fromNonNullConfigObjectCopiesPropertiesCorrectly() {
    DiskStore config = new DiskStore();
    config.setName("name");
    config.setAllowForceCompaction(false);
    config.setAutoCompact(false);
    config.setCompactionThreshold(50);
    config.setDiskUsageCriticalPercentage(80F);
    config.setDiskUsageWarningPercentage(70F);
    config.setMaxOplogSizeInBytes(10L);
    config.setQueueSize(5);
    config.setTimeInterval(1L);
    config.setWriteBufferSize(1);

    ArrayList<DiskDir> directories = new ArrayList<>();
    directories.add(new DiskDir("directoryName", 1));
    config.setDirectories(directories);

    DiskStoreType diskStoreType = diskStoreConverter.fromNonNullConfigObject(config);

    assertSoftly(softly -> {
      softly.assertThat(diskStoreType.isAllowForceCompaction())
          .isEqualTo(config.isAllowForceCompaction());
      softly.assertThat(diskStoreType.isAutoCompact())
          .isEqualTo(config.isAutoCompact());
      softly.assertThat(diskStoreType.getCompactionThreshold())
          .isEqualTo(config.getCompactionThreshold().toString());
      softly.assertThat(diskStoreType.getDiskUsageCriticalPercentage())
          .isEqualTo(config.getDiskUsageCriticalPercentage().toString());
      softly.assertThat(diskStoreType.getDiskUsageWarningPercentage())
          .isEqualTo(config.getDiskUsageWarningPercentage().toString());
      softly.assertThat(diskStoreType.getMaxOplogSize())
          .isEqualTo(config.getMaxOplogSizeInBytes().toString());
      softly.assertThat(diskStoreType.getQueueSize())
          .isEqualTo(config.getQueueSize().toString());
      softly.assertThat(diskStoreType.getTimeInterval())
          .isEqualTo(config.getTimeInterval().toString());
      softly.assertThat(diskStoreType.getWriteBufferSize())
          .isEqualTo(config.getWriteBufferSize().toString());
      softly.assertThat(diskStoreType.getDiskDirs().size())
          .isEqualTo(config.getDirectories().size());

    });
  }

  @Test
  public void fromNonNullXmlObjectCopiesPropertiesCorrectly() {
    DiskStoreType diskStoreType = new DiskStoreType();
    diskStoreType.setName("name");
    diskStoreType.setAllowForceCompaction(false);
    diskStoreType.setAutoCompact(false);
    diskStoreType.setCompactionThreshold("50");
    diskStoreType.setDiskUsageCriticalPercentage("80");
    diskStoreType.setDiskUsageWarningPercentage("70");
    diskStoreType.setMaxOplogSize("10");
    diskStoreType.setQueueSize("5");
    diskStoreType.setTimeInterval("1");
    diskStoreType.setWriteBufferSize("1");

    ArrayList<DiskDirType> diskDirs = new ArrayList<>();
    diskDirs.add(new DiskDirType());
    diskStoreType.setDiskDirs(diskDirs);

    DiskStore config = diskStoreConverter.fromNonNullXmlObject(diskStoreType);

    assertSoftly(softly -> {
      softly.assertThat(config.isAllowForceCompaction())
          .isEqualTo(diskStoreType.isAllowForceCompaction());
      softly.assertThat(config.isAutoCompact())
          .isEqualTo(diskStoreType.isAutoCompact());
      softly.assertThat(config.getCompactionThreshold().toString())
          .isEqualTo(diskStoreType.getCompactionThreshold());
      softly.assertThat(config.getDiskUsageCriticalPercentage().toString())
          .contains(diskStoreType.getDiskUsageCriticalPercentage());
      softly.assertThat(config.getDiskUsageWarningPercentage().toString())
          .contains(diskStoreType.getDiskUsageWarningPercentage());
      softly.assertThat(config.getMaxOplogSizeInBytes().toString())
          .isEqualTo(diskStoreType.getMaxOplogSize());
      softly.assertThat(config.getQueueSize().toString())
          .isEqualTo(diskStoreType.getQueueSize());
      softly.assertThat(config.getTimeInterval().toString())
          .isEqualTo(diskStoreType.getTimeInterval());
      softly.assertThat(config.getWriteBufferSize().toString())
          .isEqualTo(diskStoreType.getWriteBufferSize());
      softly.assertThat(config.getDirectories().size())
          .isEqualTo(diskStoreType.getDiskDirs().size());
    });
  }
}

redpajama_set_name: RedPajamaGithub


Growing up, Easter was always one of our favorite holidays. We'd wake up early to put on our Easter bests, head to church with the family to celebrate the resurrection of our Savior and then return home to gather with extended family for an afternoon spent eating, connecting and Easter egg hunting. And every year, the Easter bunny was sure to pay us a visit, leaving our beloved Reese's Peanut Butter Eggs and our favorite gift – a new bathing suit! It's been several years since the bunny has brought us a basket with a new suit, but we'll never forget how much joy it brought us. So, this year as we were setting our dining room table for the holiday, we decided to come up with some Easter basket ideas for adults that would spark the same joy.
And as much as you know we love to host and appreciate those who host us, we headed to Old Time Pottery to gather some beautiful hostess essentials to create the perfect Easter basket this year. Below, we are sharing what we filled our basket with plus a few additional ideas while you shop for your Easter hostess this year.
Now, we'd love to know if you're planning on gifting an Easter basket this year to your favorite hostess, family member or friend. If so, what do you plan to include? We'd love to hear in the comments below.


There could be a smaller version of the Samsung Galaxy S9 heading our way. Powerful, compact versions of flagships seem to have been less forthcoming of late, but Samsung may be bringing them back. A Samsung Galaxy S8 Mini could be released, according to recent rumours.
A well-known source for Samsung leaks has released some information on Weibo that we could be getting a little S9. The leak doesn't name the Galaxy S9 Mini however, it states that it will be a "full screen" device with a display coming in under 5-inches. This indicates it will have the small bezels and screen ratio as seen on the Galaxy S8 range.
There have been some other whispers about the Samsung Galaxy S9 Mini so it could be a good bet that the phone will be released as part of the Galaxy S range.
.There is no mention of a release date so far for the Galaxy S9 Mini and we would expect the Galaxy S9 and S9 Plus will take centre stage at a Samsung launch event at the beginning of next year. So we can expect a later release date or perhaps it will debut at the MWC 2018.


text:
Not hurt by Wriddhiman Saha's comments but he deserved honesty and clarity about his position: Rahul Dravid | Cricket News – Times of India
KOLKATA: India's head coach Rahul Dravid is not at all "hurt" that veteran keeper Wriddhiman Saha has revealed a very classified conversation that he had on his future but at the same time wanted to give the Bengal stumper clarity about his position in the team.
Wriddhiman, whose India career has come to a halt, had told the media that head coach Dravid had asked him to consider retirement during a private conversation after the South Africa series.
"I'm actually not hurt at all. I have deep respect for Wriddhi and his achievements and his contribution to Indian cricket. My conversation came from that place. I think he deserved honesty and clarity," Dravid replied in his typical classy manner where he revealed little about a breach of trust with regards to dressing room conversation.
The 'Wall' said that he will continue having such conversations with players whether they like the content of the discussion or not.
Rahul Dravid (AFP Photo)
"It's about conversations I constantly have with players. I don't expect players to always agree with everything I say about them. That's not how it works. You can have difficult conversations with the players, but that doesnt mean you brush it under the carpet and don't have the conversations," Dravid was crystal clear in his approach.
Dravid said that his philosophy is to discuss with players even before every playing eleven being picked.
"I always believe in having those conversations before every playing XI is picked and be open to questions such as why they are not playing. It's natural for players to get upset and feel hurt."
Dravid also explained that rationale behind speaking to Wriddhiman was because Rishabh Pant has already established himself as the new No 1 keeper and the Bengal man wouldn't have got chances.
Wriddhiman Saha (Photo by Ryan Pierse/Getty Images)
"I was just trying to convey that with RP (Pant) having established himself as our No.1 wicketkeeper-batsman, the idea was to say that we are looking to groom a younger wicketkeeper (KOna Bharat). This doesnt change my feelings or respect for Wriddhi."
For Dravid, telling a harsh truth is better than avoiding a conversation.
"Easiest thing for me is to not have those conversations and not speak to players about it. That's not what I am going to do.
"But at some stage, I hope they respect the fact that I was able to front up and have those conversations," he added.
TaggedIndian cricket teamrahul dravidrishabh pantTeam Indiawriddhiman saha
hijab: Panel To Police: Ensure Sensible Media Coverage | India News – Times of India
BCCI will investigate Saha quote and tweet; wants action to be taken against those found guilty | Cricket News – Times of India
Times of India-Gadgets Now Awards announced: Meet the winners | Gadgets Now
More than 9 lakh 'precaution doses' of Covid vaccine administered on first day | India News – Times of India
2021 was the best year for Apple in India


text:
LAW HONOURED
Former Manchester United and Scotland striker Denis Law awarded freedom of the City of Aberdeen
The Aberdeen born footballer had the honour bestowed upon him at a special event at the Beach Ballroom
By Robert Collins
DENIS Law has been awarded the Freedom of the City of Aberdeen at a ceremony.
The former Manchester United and Scotland striker had the honour bestowed upon him at a special event at the Beach Ballroom on Saturday.
Law was presented the honour todayCredit: PA:Press Association
Previous recipients include Sir Winston Churchill, Nelson and Winnie Mandela, Mikhail Gorbachev and Sir Alex Ferguson.
The 77-year-old, who was born in the city, said: "To get the Freedom of the City of Aberdeen is a real highlight in my life and something I will never forget.
"It was very emotional, looking around the audience and seeing all of our family and people from Aberdeen.
"It was a proud day for our children and grandchildren - they have never been to something like this and it was a very special event.
Still Game's Greg Hemphill weighs into furious spat between Ally McCoist and Chris Sutton by telling Celtic legend to 'calm it son'
Foul-mouthed Aberdeenshire teacher saw schoolboy stabbed with pencil after asking him to give 'little s***' classmate a Chinese burn
Scotland colder than ANTARCTICA as snowy White Saturday follows Black Friday
Rangers caretaker boss Graeme Murty brands Dundee defeat UNACCEPTABLE and claims he and the players let the club down
Sickening moment fox is ripped to shreds by pack of blood-thirsty hounds in Fife…thanks to legal loopholes
"I was looking forward to it but was nervous about the occasion. Fortunately, my good friend the Lord Provost gave me his backing and it went very well."
The ceremony saw Mr Law sign the Freedom Roll and have the Burgess Ticket pinned to his hat, a Scotland cap provided by the Scottish Football Association.
A parade down Union Street, led by Mr Law, will take place on Sunday when he is expected to greet crowds from the Town House balcony.
The Lord Provost of Aberdeen Barney Crockett said: "Today's ceremony was a fantastic occasion to honour an incredible individual, a man who put Aberdeen on the world map and who has never forgotten his roots.
The special event was held at the Beach BallroomCredit: PA:Press Association
"He will always be recognised a hero for his sporting achievements, but Denis is also a charity figurehead and has been a driving force for the efforts of the Denis Law Legacy Trust in Aberdeen.
"Through the trust, he is making a lasting difference to the lives of young people in the city and he deserves enormous credit for that.
"Denis Law has received the Freedom of the City today and with it comes the best wishes and goodwill of everyone in Aberdeen."
One of the projects backed by the trust won an accolade on Wednesday at the 2017 National Pride of Sport Awards.
Streetsport came out as the winner of the TSB Community Partner award, which recognises a group of people who have worked together for a good cause in their area.
The programme aims to reduce instances of youth crime and anti-social behaviour while helping develop the employability and aspirations of young people in Aberdeen.
We pay for your stories and videos! Do you have a story or video for The Scottish Sun Online? Email us at scottishsundigital@news.co.uk or call 0141 420 5266


text:
Experiences with Bruno Gröning
Anny Baroness Ebner von Eschenbach 1960
Copy (PDF)
In the year 1954 I drove to Bruno Gröning from Munich to Grafrath (a little town in Germany) together with a Franciscan Padre after an earlier request. The relatives of this monk have asked me to make the connection and to make sure, that this Padre wouldn't notice something about suffering from this incurable illness. He suffered on a Cerebral Tumor which was inoperable, couldn't be removed through an operation. He was in a constant danger of his life, but nobody had told him about.
In the train to Grafrath he sat in front of me very pale on his face. He was tall, a very handsome appearance of appr. 40 years old. He had lived a long time as a mission-ary in Africa. He suffered from disturbances of his consciousness and from constantly painful headaches.
In Grafrath Mrs. Josette Gröning picked us up in a car. In his home then Bruno Grö-ning welcomed us warmly with a cup of coffee. Approaching the house Bruno Grö-ning lived (which was not his own property) I had noticed that the Padre's face was covered with a light flashing red colour. When he was seated finally in the workroom of Bruno Gröning in a big armchair, he brought out in sweat and suddenly his eyes started to shine much brighter.
He was very inspired and attended intensely to the conversation with Bruno Gröning. He told him about his activity as a missionary in Africa and about his experiences with indigenous medicine men, how they heal their sick ones with operations reaching partly into the area of spiritual healing. Some European doctor could learn from them, the Padre said.
When the conversation came to the point of life in a convent, Bruno Gröning said: "Once I wanted to take the veil in a monastery too, because I thought there I would get more support and protection into my task of helping people. But I would have to submit to the rules of the convent, and it would have been highly doubtful, if I would have got enough time to get close to many ill people."
Then the Padre said: " No, in a convent you are very bound to it's rules. The day is exactly scaled and you are very subjected to the opinions of your superior."
Suddenly the Padre saw on a cupboard a big Silver Ball (from tinfoil) standing with a cross on it.
The Padre asked: "What a beautiful big ball you have there with a cross on it; but what does the cross mean above it?"
"That's the sin of the world", was the answer. Baffled the Padre looked to Bruno Grö-ning.
"Yes, the greatest Friend of Man was killed with it!"
After thinking for a while about these words the Padre said:
"From this point of view I've never considered it. But you are right! It's really a SHAME for whole humankind! And I am sure, nowadays they would do it again, of course with different means!"
"Yes, today they put them under "paragraph 51" in Germany (a paragraph for insane people) or they make life for them so difficult, that they leave the country."
During the conversation Bruno Gröning asked the padre always again: "What do you feel? Tell me what's going on within you!"
The padre explained how well he feels, like a new born man. The first time since two years he has no headaches anymore! He would like to go back to Africa at once.
Bruno Gröning handed over to him a little tinfoil ball with the words:
"Take in the Divine Power daily with it and recreate your body! There has something to be renewed that was in strong disorder. There can appear some pains of – as I say: "Regulation". But never you should be afraid if it, at the contrary: you should enjoy when new life is coming in. Everything will be bent into shapes and that hurts sometimes. Don't storm out at once, but you have got a wonderful chance during your prayer to surrender totally to Divine Power in your silent cell!"
"So I will get a chance to deliver from my illness? There is so much work to do in fu-ture!"
"YOUR illness? That's completely WRONG! Illness doesn't belong to a human being. God created and creates a healthy body, but what people are doing with it, how they are thinking and what they want, this creates disorder and deliver them to Satan. Who is always dealing with sickness, hold it tight and blocks the path to Divine Forces. It is so important, which kind of thoughts man takes up, for thoughts are forces! When man wants good, God will help him, when he wants bad, Satan will help him! Then illness is coming, because it's a work of Satan.
Nowadays people are so much delivered to Satan and they are so far away from God! I want to guide them back to GOD, but it's very difficult to move them to return!"
"Yes", the Padre said, "I can tell you a thing or two about it, our world is in a terribly state, but you are able to give an evidence of Divine Forces to human beings – this I've got to feel so wonderfully today.
This is something what our Church is missing today. With us are many nice words but no power behind."
Then Bruno Gröning said: "You too can pass the Divine Force to others, if you are tuning in for it, I will help you then!"
At evening, as the Padre had to leave to his convent, we left Bruno Gröning. Without pains, like a young man he felt, full of energy, the Padre drove back to Munich. The doctors wondered when they heard about the almost declared dead Padre speaking now on great lecture tours.
When I met this Padre after one year on such a lecture, he welcomed me warmly after finishing and called full of joy:
"Please greet my great friend Bruno Gröning!"
Afterwards, as I brought the greetings to Bruno Gröning, he said: "Please greet him back, and tell him, he shouldn't overload his body, because a once broken string doesn't has to be overstretched. Slowly it has to come into a new order again"
Josette Gröning (Publ.): The mental-spiritual healer (Denkendorf at Plochingen/Neckar 1960) No. 4, Page 48-50


No, I'm not talking about acting, but I think it's a telling sign of society's prejudice to assume that meaning first. People, especially Christians, believe women must not be in high government positions, believing them to be unsuited for the pressures.
As if being a wife and mother involves no pressure! We're "merely" teaching children how to walk, talk, relieve themselves, dress themselves, and be good citizens of tomorrow. No pressure. And there is no better training for diplomacy than settling disputes between siblings. But I digress.
I can already hear the male supremacists yelling (in their deepest manly voices), "The pressures of national government are too great for a woman." Says who? Has it been tried? Yes, and successfully so, just not in this country. Have women done everything else men declared them unable to do? Yes, everything. Can women do worse in national government than men have done? I seriously doubt that.
Gone in a few paragraphs is the sole proof text for the alleged divine wrath expressed in having women in national government's top positions. And the Bible does show women as national leaders in good standing (Deborah, Huldah, Miriam). Excuses are offered but the fact remains that the Bible never says women can't be national government leaders, or even that they shouldn't be. But most importantly, it does not say that having a woman in such a position is a sign of God's anger or judgment against a nation. And one only needs to look at how men have run governments to see that if God wanted to show his displeasure with a nation, if anything he'd surely choose a man.
Which is a telling commentary on the current presidential race in America. The fact that we have had a long string of charlatans in all three branches, with no viable alternatives having any chance at being elected, is surely a sign of God's judgment against our nation. The people who get nominated by one of the two parties are sold out to those parties, not the people, and it matters not what a candidate's gender or race is.
God looks on the heart, the character. To think God would turn from that and prefer an empty shell with the right "decoration" over a woman of depth and honor, would be to think God is shallow and petty and stupid. I think we should honor God by never attributing such things to him, and start looking on the heart.
A note to those eager to jump to conclusions: I most emphatically DO NOT endorse Hillary. I will never endorse anyone with such contempt for our constitution and our people. I also do not endorse any of the others. We need a Constitutionalist, not a Republican or a Democrat.


Invitations have been sent to NAITA Members.
Please contact NAITA if you are a member and have not received your invitation.
If you're not yet a NAITA member, join today for 2019!
Visit https://naita.org/membership/ or call 256-532-3505 for membership details.


text:
EI Towers
About Sigfox
Antonio Preti
Carlos Lambarri
Fabio Caccia
Sigfox technology
A connected world
The internet of Everything
LPWA technology
Emergency services & security
Intelligent buildings
Smart city & public transport
Solutions Off-the-shelf
Technology Enablers
Solutions Enablers
Home 1M2M
CONNECTING THE WORLD...
"SIGFOX technology enables us to target markets that were not available before. For economic reasons, but also for power consumption reasons." says Jean Pierre Hoefnagel, 1M2M Founder.
Our origin lies in a Dutch company called Embedded Designers B.V. This company was founded in early 2004 by Jean Pierre Hoefnagel and its main activity was and is developing GPRS/GPS based track and trace solutions, both hardware and software, server-side and application/analysis/presentation software.
In June 2013 Embedded Designers came across SIGFOX, and it was immediately clear that the SIGFOX system would enable Embedded Designers to develop for markets that were impossible to develop with GSM. For economic reasons, but also for power consumption reasons.
Initially, the SIGFOX development activity was performed by Embedded Designers, in parallel with GPS/GSM based solutions. However, after a few months and lots of new ideas Embedded Designers realized that the potential in Europe and the rest of the world was so huge that it justified the founding of a new spin-off company with only one focus: SIGFOX applications. This company was founded on the 27th of November 2013 and is called 1M2M.
1M2M is pronounced as One M to M or WAN M to M. WAN stands for "Wide Area Network" and M2M for "Machine to Machine".
What is 1M2M's mission?
To enable as many remote sensor applications as possible. Not only in Europe, but also in developing countries in Africa and South America. 1M2M wants to create and extend a hardware and tools platform on which integrators can base their solutions. Speed and flexibility are therefore vital in helping these companies create their solutions.
The only way to do that is to offer suitable hardware and tools.This is possible thanks to the long-standing experience of our engineers in similar projects over the last 10 years and other projects before that. In total 1M2M has 120 years of in-house engineering experience …
Why SIGFOX?
SIGFOX offers an almost perfect solution for a lot of applications that either used GSM for small data quantities or could not use GSM at all for several reasons like coverage, power use, SIM-cost etc.
Almost perfect… There are some network properties that are not comparable to the GSM network, such as high-speed download channel. On the other hand, there are many situations where this is no problem at all, and there are some serious benefits too. These include not only price, but also better indoor coverage and a much longer autonomy for battery-driven modules.
We strongly believe there is a huge market for SIGFOX applications. It will partly overlap low-traffic GSM based systems, but a much higher volume will come from totally new
applications that were just not economical with GSM-based solutions.
VISIT PARTNER WEBSITE
SIGFOX READY PRODUCTS BY 1M2M
ED1600 GENERIC SENSOR
The leading IoT company in Italy to efficiently connect objects, things … everything!
Vía Zanella, 21 Lissone 20851 Italia
Copyright © Nettrotter. All Rights Reserved.
Direzione e coordinamento EI Towers s.p.a. / Cap. Soc. 1.000.000,00 € i.v. sottoscritto e versato / C.F. e Iscr. Reg. Imprese MB 09179270963 / P.IVA 09179270963


text:
The University of North Texas Jazz Singers is the premier vocal jazz ensemble within the Division of Jazz Studies in the College of Music. Under the direction of Jennifer Barnes, Jazz Singers consists of ten to fourteen vocalists and a four-piece rhythm section who perform a challenging and varied repertoire of jazz and jazz-influenced music, emphasizing close vocal harmonies, cutting-edge repertoire and improvisation. The ensemble was awarded Graduate Winner as a Large Vocal Ensemble in the 2019 and 2016 DownBeat Student Music Awards, and has been awarded Outstanding Performance status numerous times under the leadership of both Jennifer Barnes and the founding director, Paris Rutherford. UNT Jazz Singers has performed at state, national and international music conferences and festivals, including those for the Jazz Education Network, International Association for Jazz Education, the American Choral Directors Association and the Texas Music Educators Association. UNT Jazz Singers is one of four vocal jazz ensembles that are part of the comprehensive Vocal Jazz Studies major at UNT, which comprises a global student population of 25 – 35 students who pursue Bachelor's, Masters and Doctoral level degree programs.
Avenue C, Third Street & West End
Avenue C, Third Street and West End are also complete vocal jazz ensembles in the Jazz Studies Division, directed by our Graduate Teaching Fellows. Differences between the four levels of ensembles include size of the group, composition of the group (all females or all males, for example), and repertoire focus.


Home Fires recounts the stories of various women left at home in New Zealand during World War Two.
Struggling with questions of loyalty, independence and desire, these characters reflect the tensions present within both a nation at war and a society moving towards greater equality.
Additional information can be found at Mairangi Players.


Enjoy the soothing silence in our house, furnished with love and care.
Our rooms have shower / toilet, balcony or terrace and SAT-TV.
The 58 m² apartment has two double rooms, kitchen, living room with SAT-TV, bathroom and toilet.


Fanboy of PHP for more than 8 years. When you say "PHP is dead" he is able to convince you that's definately not true.
For more than 3 years focused on e-commerce solutions, mostly based on Magento. Łukasz is also Magento 2 code and documentation contributor.
In March 2018 was one of the first 3 Poles that passed Magento 2 Certified Professional Developer exam. As an extra job, he offers trainings for the developers.


text:
10 months ago A unique Sri Lankan taste - Anura Kalubowila
10 months ago ජනපති පාර්ලිමේන්තුව විසිරවීම වැරදියි
Adele from Streets of London to world stage
Ten-time Grammy winner Adele released her first single in over three years on Friday, titled "Hello."
The British singer, best known for smash hits like "Rolling in The Deep" and "Set Fire to The Rain," had previously been out of the music scene because, as she detailed on Twitter, "life happened."
Her short professional career, which started in 2008, has earned her 86 awards, including 10 Grammys and one Oscar. Still, she's considered by many to be one of the best singers in the world.
Now she wants to get back on track and make up for lost time. Adele will release her next album, titled "25," on November 20.
Keep scrolling to see how a girl from Tottenham, England, with a powerful voice has been able to have such a massive presence on the world stage


text:
Detective S : Mystery game & Find the differences
Find Differences 200 Levels
Find The Differences – The Detective
Snoopy Spot the Difference
Spot it: Find the Difference
Board, Casual
Arclite Systems
Spot It: Find the Difference - Enjoy a Fun Photo Hunting Match
Do you love spotting the difference games? These are the kinds of games where your objective is to find the difference between the two photos. It's fun, exciting, and boosts your visual perception skills! It's the perfect game to play if you want to kill time. It helps the player concentrate, think, and learn how to notice every little detail.
It strengthens the brain by playing a simple game of finding the difference between two almost similar photos! One such example is the Spot It – Find the Difference game. It's simple, yet it's super fun. Get the spot: find the difference for pc now. Download it at here without thinking twice! It's for free, and you won't have to pay for anything at all! Get a chance to play this game on a bigger screen so you can find those differences easily and quickly.
Finding the Difference: The Fun Game Way
Spot It – Find the Difference pc is a game by Arclite Systems. It's a kind of puzzle game that will force your brain to concentrate. Concentration is what this game is all about because you need to find the subtle differences between the two pictures. There are hundreds of levels, which are all exciting and provide you with simple enjoyment.
It's toddler-tested, which means kids can play it and have fun! They will have a grand time playing, and it's not that hard or challenging for kids to play. If you want to enjoy this pattern recognition game, get the spot it – find the difference download. It's the best photo hunting game that you or your children will enjoy!
How to Play Spot It – Find the Difference
Spot It – Find the Difference is all about finding what's the difference between the two pictures. You have to have total concentration and study both photos very well to find the subtle differences right away. There are hundreds of levels you will love to play. It's all challenging but not too difficult for kids to play.
There are gorgeous pictures that are clear and visually appealing, which are perfect for children. Just click on the difference, and the game will encircle it. It develops your focus and fine motor skills. Invest in games like Spot It – Find the Difference because it trains the brain. It's fun, but it's also the kind of challenge you will want your brain to be trained on.
Free Game Features
Visual-perception game for kids & adults
Beautiful photos
Hundreds of levels
Free to play and download
Develop concentration, focus, & motor skills
This fun match might only be one of the thousands game available for you to play! Catch more casual games for free here now! Enjoy games like My Tamagotchi Forever or Among Us on your PC now! Download it with your friends and play this game together.


Ms. Nasima D/O M.Hashim is student of Khoshi Girls' High School has stated that before we did not know about women rights and civil rights, after receiving training workshop about both of them we have got comprehensive awareness on both women and civil rights. Before knowing these subjects we were believed not to be a decision maker in the family especially for our future life. It is a custom among afghan people while fighting among the communities or families are happened, further to have peace within their communities or family, the elder are exchanging girls or daughter without asking them, they marriage her/them with unknown man. daughter did not have right to choose her life partner in future and the same is the case with boy's family, life partner for both boy and girls could be burden on them by the family leader, the Afghan Constitution and Civil Law awareness made us strong to defense from our rights, though the law breaker is our father, mother and brother. One more thing that son of the family has more value and respect in the families rather than daughter, most of men believe that women and girls do not have the ability to work out side of the house and also believe that women are inferior to men they deserve to sit in side of the house and don't have the right to work in society. Now as I believe myself on the base of achieving knowledge and skills, I do challenge that the women also can be good social worker as the men. For instance: women can be a good doctor, engineer, lawyer, scientist etc. as we know that most of the doctors in the city and most of the teacher in the school are women and they expedite their jobs in appropriate manner. I believe for the great positive changes in the Afghan women and men lives, if knowledge and right awareness are being given properly to all afghan women and girls, I promise most of the violations against women and girls will be vanished and decreased, I do hope that program must be promoted to the other far flung areas of the different provinces of Afghanistan, I am really appreciating Shuhada Organization for such a useful and effective program for our deprive communities.


text:
Building a Machine-Learning Platform? Open-Source It!
by Nick Kolakowski September 6, 2018 3 min read
Artificial Intelligencemachine learningOpen Source
To open source or keep things tightly proprietary—that's the existential question that any number of companies and developers confront on a regular basis. When it comes to machine learning and artificial intelligence (A.I.), though, it seems that open source might prove the way to go, especially for smaller firms.
Salesforce recently opened up TransmogrifAI, the machine-learning library that underlies its Einstein A.I. platform. Described on GitHub as an "AutoML library for building modular, reusable, strongly typed machine learning workflows on Spark," TransmogrifAI is meant for building machine-learning models within the context of structured data such as spreadsheets—exactly the sort of thing that would appeal to Salesforce's customer-service audience.
Salesforce open-sourced TransmogrifAI the same day that Oracle did the same thing with Graphpipe. "Graphpipe is an attempt to standardize the protocol by which you speak to a remotely deployed machine learning model," is how Oracle cloud architect Vish Abrams described the platform to VentureBeat. To put it another way, Graphpipe allows developers to more easily work with machine-learning models in the context of smartphones and IoT devices that depend heavily on a cloud-based server. (For those interested, here's the GitHub repo.)
Salesforce and Oracle are following on the heels of tech giants such as Google, which have already opened up a solid chunk of their machine-learning work to the wider world. It's potentially a solid strategy for these companies that wish to attract companies and developers to their respective platforms: if you made the code easily accessible, more folks will try it out, and hopefully they'll like it enough to integrate it into their tech stacks.
For those companies that don't have the resources or the reach of Google, open-sourcing their A.I. and machine-learning work comes with yet another benefit: a crowd of third-party developers and companies more than happy to provide suggestions, tweak code, and point out errors. Placing your code on GitHub encourages a positive feedback loop that can, potentially, improve a product very quickly—certainly much faster than if a small team of developers tried to iterate in isolation.
Given how smaller companies will never have the funding or human resources to catch up to Google or Oracle in terms of A.I., open-sourcing might represent the best way to give a new initiative as much (metaphorical) oxygen as possible.
Amazon Launches Machine-Learning Platform
Older Programming Languages Refuse to Die: RedMonk
Apple Watch, Google's Wear OS, Fitbit: Fall's Big Smartwatch Contenders
IT Ops Support Analyst
Eclaro - Quincy, WA
U.S. Tech Solutions Inc. - Quincy, WA
Machine Learning Expert
Artificial Intelligence Researcher
Explore the most common moves for a Machine Learning Expert.
Data Scientist Machine Learning Engineer
Machine Learning Consultant


text:
Real Ipad competitors finally appearing
Apr 18, 2011 by Wayne Borean
Contrary to popular belief, Apple's pricing is in no higher than the competition for most products. If you compare Mac computers with identical specifications (same processor, front side bus, memory type, drive speed, and spec Windows Ultimate since it's the closest to OS X) you'll find that Dell and HP computers are equivalent to Mac computers in price.
Take the MP3 player market. It isn't called the IPod market because Apple overcharges for a product that under performs. If we take out batter issues it's a popular product for a reason, lots of room for lots of music. And then we get to the Tablet Computer market, a market invented by Microsoft, and now pretty well owned by Apple. For the last year none of Apple's competitors have been competing. Instead they've produced one over priced piece of kit after another, while Apple has merrily sold every IPad Foxcon could build.
Apple is quite capable of using low pricing in an attempt to prevent competition from entering the market, and that's what they did with the IPad. Virtually every analyst expected Apple to sell the entry level IPad for $1000.00, instead Apple sold it for $500.00. From Apple's earnings call as reported by Business Insider:
5:12 Looking ahead to June quarter, expect revs between $13b-13.4b, vs. $9.7b last year. Expecting margins to decrease. Expect about 25% of GM decline to be driven by iPad sales. Very aggressive with pricing and delivering tremendous value, want to capitalize on first mover advantage. The other factors: Stronger US dollar, Mac portable transition, education buying season beginning, and a future product transition. (Oooooooh.)
So what does a competitor do when Apple doesn't follow the playbook? Pray like crazy. It was about all they could do, since Apple had managed to keep enough of the details under wraps until the release date, and no one else had a working operating system ready.
Finally however there's a couple of competitors for the IPad that can compete on features, and price. Apple's year long happy time may be about to end.
First up is the Acer Iconia Tab A500 running the Honeycomb version of Google's Android OS. it will be carrying the Nvidia Tegra 2 at 1Ghz. Yes, this one will have an OS that is optimized for tablets, as compared to the earlier competing Android tablets which had the smartphone version. Yes, it's cheaper than them, and cheaper than the IPad 2. It also has a marginally larger screen, but weighs more. Will it sell? Let's wait six months and see. Still it looks like a relatively competent attempt to beat the IPad 2 at it's own game.
Second up is the Shenzhen GS30, a Chinese designed and built IPad 1 clone. It claims to use the same processor, screen, battery, and a bunch of other components as the original IPad, which is good. That translates to the Samsung S5PC11o running at 1Ghz. It will be running Google's Android operating system, but here's where we hit a problem. We don't know which Android. The reported price is 2000 Yuan ($306.00 US) to OEMs. Volume pricing would be lower, so we might see them on the North American market for as little as $400.00 in the shops, or on Amazon. We hope these guys did their cold weather testing unlike the first Iphone clones that died in northern China.
Third is the Rim Playbook, which is in the shops. There's a curious rumor about it which needs to be checked before we report on it though, stay tuned. S|A
Wayne Borean
Latest posts by Wayne Borean (see all)
Darwin does Free Software - Jun 28, 2011
The Nokia-Apple Patent Deal - Jun 28, 2011
The Mac OS X Virus That Wasn't - May 24, 2011
Microsoft Death Watch* – Microsoft Buys Skype - May 11, 2011
Patent Wars: Oracle v. Google Part 2 - May 9, 2011
Tags: Acer, honeycomb, iconia, ipad, playbook, rim, shenzhen, Tablet
Intel picks up a second foundry customer, Tabula
Intel pulls in Z68 launch date


Why not treat your dog to something special this Christmas?
Complementary pet food for adult dogs. PEDIGREE® Stocking Pedigree® Rodeo® with Beef – With its unique twists of flavour and delicious chewy texture. Pedigree® Schmackos® with chicken – Meaty strips with tasty chicken. A real favourite! Pedigree® Dentastix – Pedigree® Daily DentaStix® has a unique X shape and, when fed daily, the combination of its special texture and active ingredients, is scientifically proven to help reduce tartar build-up by up to 80%. Rope Tug Toy – A rope tug toy your dog will love to play with (toy design and colour may vary from pack to pack, and the size of the ball image on pack is not to scale).


text:
// TnzCore includes
#include "tsimplecolorstyles.h"
#include "timage_io.h"
#include "tconvert.h"
#include "tvectorimage.h"
#include "tpixelutils.h"
#include "tsystem.h"
#include "tstream.h"

// Qt includes
#include <QMutexLocker>

#include "tpalette.h"

#include <memory>

PERSIST_IDENTIFIER(TPalette, "palette")

TPersistDeclarationT<TPalette> auxPaletteDeclaration("vectorpalette");

DEFINE_CLASS_CODE(TPalette, 30)

//*************************************************************************************
//    Local namespace  stuff
//*************************************************************************************

namespace {

const int maxStyleIndex = 32765;

}  // namespace

//===================================================================
//
// TPalette::Page
//
//-------------------------------------------------------------------

TPalette::Page::Page(std::wstring name)
    : m_name(name), m_index(-1), m_palette(0) {}

//-------------------------------------------------------------------

TColorStyle *TPalette::Page::getStyle(int index) const {
  assert(m_palette);
  if (0 <= index && index < getStyleCount())
    return m_palette->getStyle(m_styleIds[index]);
  else
    return 0;
}

//-------------------------------------------------------------------

int TPalette::Page::getStyleId(int index) const {
  assert(m_palette);
  if (0 <= index && index < getStyleCount())
    return m_styleIds[index];
  else
    return -1;
}

//-------------------------------------------------------------------

int TPalette::Page::addStyle(int styleId) {
  assert(m_palette);
  if (styleId < 0 || styleId >= m_palette->getStyleCount()) return -1;
  if (m_palette->m_styles[styleId].first != 0) return -1;
  m_palette->m_styles[styleId].first = this;
  int indexInPage                    = int(m_styleIds.size());
  m_styleIds.push_back(styleId);
  return indexInPage;
}

//-------------------------------------------------------------------

int TPalette::Page::addStyle(TColorStyle *style) {
  assert(m_palette);
  int stylesCount = int(m_palette->m_styles.size());
  int styleId;
  for (styleId = 0; styleId < stylesCount; styleId++)
    if (m_palette->m_styles[styleId].first == 0) break;
  if (styleId >= stylesCount - 1) return addStyle(m_palette->addStyle(style));
  m_palette->setStyle(styleId, style);
  return addStyle(styleId);
}

//-------------------------------------------------------------------

int TPalette::Page::addStyle(TPixel32 color) {
  return addStyle(new TSolidColorStyle(color));
}

//-------------------------------------------------------------------

void TPalette::Page::insertStyle(int indexInPage, int styleId) {
  assert(m_palette);
  if (styleId < 0 || styleId >= m_palette->getStyleCount()) return;
  if (m_palette->m_styles[styleId].first != 0) return;
  m_palette->m_styles[styleId].first = this;
  if (indexInPage < 0)
    indexInPage = 0;
  else if (indexInPage > getStyleCount())
    indexInPage = getStyleCount();
  m_styleIds.insert(m_styleIds.begin() + indexInPage, styleId);
}

//-------------------------------------------------------------------

void TPalette::Page::insertStyle(int indexInPage, TColorStyle *style) {
  assert(m_palette);
  int styleId = m_palette->addStyle(style);
  if (styleId >= 0) insertStyle(indexInPage, styleId);
}

//-------------------------------------------------------------------

void TPalette::Page::insertStyle(int indexInPage, TPixel32 color) {
  assert(m_palette);
  int styleId = m_palette->addStyle(color);
  if (styleId >= 0) insertStyle(indexInPage, styleId);
}

//-------------------------------------------------------------------

void TPalette::Page::removeStyle(int indexInPage) {
  if (indexInPage < 0 || indexInPage >= getStyleCount()) return;
  assert(m_palette);
  int styleId = getStyleId(indexInPage);
  assert(0 <= styleId && styleId < m_palette->getStyleCount());
  assert(m_palette->m_styles[styleId].first == this);
  m_palette->m_styles[styleId].first = 0;
  m_styleIds.erase(m_styleIds.begin() + indexInPage);
}

//-------------------------------------------------------------------

int TPalette::Page::search(int styleId) const {
  std::vector<int>::const_iterator it =
      std::find(m_styleIds.begin(), m_styleIds.end(), styleId);
  if (it == m_styleIds.end())
    return -1;
  else
    return it - m_styleIds.begin();
}

//-------------------------------------------------------------------

int TPalette::Page::search(TColorStyle *style) const {
  assert(style);
  assert(m_palette);
  for (int i = 0; i < getStyleCount(); i++)
    if (m_palette->getStyle(m_styleIds[i]) == style) return i;
  return -1;
}

//===================================================================
//
// TPalette
//
//-------------------------------------------------------------------

TPalette::TPalette()
    : m_version(0)
    , m_isCleanupPalette(false)
    , m_currentFrame(-1)
    , m_dirtyFlag(false)
    , m_mutex(QMutex::Recursive)
    , m_isLocked(false)
    , m_askOverwriteFlag(false) {
  QString tempName(QObject::tr("colors"));
  std::wstring pageName = tempName.toStdWString();
  Page *page            = addPage(pageName);
  page->addStyle(TPixel32(255, 255, 255, 0));
  page->addStyle(TPixel32(0, 0, 0, 255));
  getStyle(0)->setName(L"color_0");
  getStyle(1)->setName(L"color_1");

  for (int i = 0; i < 10; i++) m_shortcuts['0' + i] = i;
}

//-------------------------------------------------------------------

TPalette::~TPalette() {
  std::set<TColorStyle *> table;
  int i = 0;
  for (i = 0; i < getStyleCount(); i++) {
    assert(table.find(getStyle(i)) == table.end());
    table.insert(getStyle(i));
  }
  clearPointerContainer(m_pages);
}

//-------------------------------------------------------------------

TPalette *TPalette::clone() const {
  TPalette *palette = new TPalette;
  palette->assign(this);
  return palette;
}

//-------------------------------------------------------------------

TColorStyle *TPalette::getStyle(int index) const {
  if (0 <= index && index < getStyleCount())
    return m_styles[index].second.getPointer();
  else {
    static TSolidColorStyle *ss = new TSolidColorStyle(TPixel32::Red);
    ss->addRef();
    return ss;
  }
}

//-------------------------------------------------------------------

int TPalette::getStyleInPagesCount() const {
  int styleInPagesCount = 0;
  for (int i = 0; i < getStyleCount(); i++)
    if (m_styles[i].first != 0) styleInPagesCount++;
  return styleInPagesCount;
}

//-------------------------------------------------------------------

int TPalette::getFirstUnpagedStyle() const {
  for (int i = 0; i < getStyleCount(); i++)
    if (m_styles[i].first == 0) return i;
  return -1;
}

//-------------------------------------------------------------------
/*! Adding style with new styleId. Even if there are deleted styles in the
 * palette, the new style will be appended to the end of the list.
*/
int TPalette::addStyle(TColorStyle *style) {
  // limit the number of cleanup style to 7
  if (isCleanupPalette() && getStyleInPagesCount() >= 8) return -1;

  int styleId = int(m_styles.size());
  if (styleId < 4096) {
    // checking if the style is overlapped
    int i = 0;
    for (i = 0; i < styleId; i++)
      if (getStyle(i) == style) break;
    if (i == styleId) {
      m_styles.push_back(std::make_pair((Page *)0, style));
      return styleId;
    }
  }
  delete style;
  return -1;
}

//-------------------------------------------------------------------

int TPalette::addStyle(const TPixel32 &color) {
  return addStyle(new TSolidColorStyle(color));
}

//-------------------------------------------------------------------

void TPalette::setStyle(int styleId, TColorStyle *style) {
  std::auto_ptr<TColorStyle> styleOwner(style);

  int styleCount = getStyleCount();

  if (0 <= styleId && styleId < styleCount) {
    // Find out if the supplied style is already in the palette
    // with a different style id. In that case, bail out as a noop.
    for (int i = 0; i < styleCount; ++i)
      if (style == getStyle(i)) return;

    // Substitution can take place
    if (typeid(*m_styles[styleId].second.getPointer()) != typeid(*style))
      m_styleAnimationTable.erase(styleId);

    m_styles[styleId].second = styleOwner.release();
  }
}

//-------------------------------------------------------------------

void TPalette::setStyle(int styleId, const TPixelRGBM32 &color) {
  setStyle(styleId, new TSolidColorStyle(color));
}

//-------------------------------------------------------------------

int TPalette::getPageCount() const { return int(m_pages.size()); }

//-------------------------------------------------------------------

TPalette::Page *TPalette::getPage(int pageIndex) {
  if (0 <= pageIndex && pageIndex < getPageCount()) {
    Page *page = m_pages[pageIndex];
    assert(page->getIndex() == pageIndex);
    assert(page->m_palette == this);
    return page;
  } else
    return 0;
}

//-------------------------------------------------------------------

const TPalette::Page *TPalette::getPage(int pageIndex) const {
  if (0 <= pageIndex && pageIndex < getPageCount()) {
    Page *page = m_pages[pageIndex];
    assert(page->getIndex() == pageIndex);
    assert(page->m_palette == this);
    return page;
  } else
    return 0;
}

//-------------------------------------------------------------------

TPalette::Page *TPalette::addPage(std::wstring name) {
  Page *page      = new Page(name);
  page->m_index   = getPageCount();
  page->m_palette = this;
  m_pages.push_back(page);
  return page;
}

//-------------------------------------------------------------------

void TPalette::erasePage(int index) {
  Page *page = getPage(index);
  if (!page) return;
  m_pages.erase(m_pages.begin() + index);
  int i;
  for (i = 0; i < getPageCount(); i++) m_pages[i]->m_index = i;
  for (i                                = 0; i < page->getStyleCount(); i++)
    m_styles[page->getStyleId(i)].first = 0;
  page->m_palette                       = 0;
  delete page;
}

//-------------------------------------------------------------------

void TPalette::movePage(Page *page, int dstPageIndex) {
  assert(page);
  assert(page->m_palette == this);
  dstPageIndex = tcrop(dstPageIndex, 0, getPageCount() - 1);
  if (dstPageIndex == page->getIndex()) return;
  m_pages.erase(m_pages.begin() + page->getIndex());
  m_pages.insert(m_pages.begin() + dstPageIndex, page);
  for (int i = 0; i < getPageCount(); i++) m_pages[i]->m_index = i;
  assert(page->getIndex() == dstPageIndex);
}

//-------------------------------------------------------------------

TPalette::Page *TPalette::getStylePage(int styleId) const {
  if (0 <= styleId && styleId < getStyleCount())
    return m_styles[styleId].first;
  else
    return 0;
}

//-------------------------------------------------------------------

int TPalette::getClosestStyle(const TPixel32 &color) const {
  struct locals {
    static inline int getDistance2(const TPixel32 &a, const TPixel32 &b) {
      return (a.r - b.r) * (a.r - b.r) + (a.g - b.g) * (a.g - b.g) +
             (a.b - b.b) * (a.b - b.b) + (a.m - b.m) * (a.m - b.m);
    }
  };  // locals

  if (color == TPixel32::Transparent) return 0;
  int bestIndex    = -1;
  int bestDistance = 255 * 255 * 4 + 1;
  for (int i = 1; i < (int)m_styles.size(); i++) {
    // if(i==FirstUserStyle+2) continue;
    TSolidColorStyle *scs =
        dynamic_cast<TSolidColorStyle *>(m_styles[i].second.getPointer());
    if (scs) {
      int d = locals::getDistance2(scs->getMainColor(), color);
      if (d < bestDistance) {
        bestIndex    = i;
        bestDistance = d;
      }
    }
  }
  return bestIndex;
}

//-------------------------------------------------------------------

bool TPalette::getFxRects(const TRect &rect, TRect &rectIn, TRect &rectOut) {
  int i;
  bool ret = false;
  int borderIn, borderOut, fullBorderIn = 0, fullBorderOut = 0;

  for (i = 0; i < (int)m_styles.size(); i++)
    if (m_styles[i].second->isRasterStyle()) {
      m_styles[i].second->getRasterStyleFx()->getEnlargement(borderIn,
                                                             borderOut);
      fullBorderIn  = std::max(fullBorderIn, borderIn);
      fullBorderOut = std::max(fullBorderOut, borderOut);
      ret           = true;
    }

  rectIn  = rect.enlarge(fullBorderIn);
  rectOut = rect.enlarge(fullBorderOut);
  return ret;
}

//===================================================================
//
// I/O
//
//-------------------------------------------------------------------

namespace {

class StyleWriter : public TOutputStreamInterface {
  TOStream &m_os;
  int m_index;

public:
  static TFilePath m_rootDir;
  StyleWriter(TOStream &os, int index) : m_os(os), m_index(index) {}
  static void setRootDir(const TFilePath &fp) { m_rootDir = fp; }

  TOutputStreamInterface &operator<<(double x) {
    m_os << x;
    return *this;
  };
  TOutputStreamInterface &operator<<(int x) {
    m_os << x;
    return *this;
  };
  TOutputStreamInterface &operator<<(std::string x) {
    m_os << x;
    return *this;
  };
  TOutputStreamInterface &operator<<(UCHAR x) {
    m_os << (int)x;
    return *this;
  };
  TOutputStreamInterface &operator<<(USHORT x) {
    m_os << (int)x;
    return *this;
  };
  TOutputStreamInterface &operator<<(const TPixel32 &x) {
    m_os << x;
    return *this;
  };
  TOutputStreamInterface &operator<<(const TRaster32P &ras) {
    assert(m_rootDir != TFilePath());

    std::string name = "texture_" + std::to_string(m_index);
    m_os << name;
    TFilePath filename = ((m_rootDir + "textures") + name).withType("bmp");
    if (!TFileStatus(m_rootDir + "textures").doesExist()) {
      try {
        TSystem::mkDir(m_rootDir + "textures");
      } catch (...) {
      }
    }

    TImageWriter::save(filename, ras);
    return *this;
  };
};

//-------------------------------------------------------------------

class StyleReader : public TInputStreamInterface {
  TIStream &m_is;           //!< Wrapped input stream.
  VersionNumber m_version;  //!< Palette version number (overrides m_is's one).

public:
  static TFilePath m_rootDir;

public:
  StyleReader(TIStream &is, const VersionNumber &version)
      : m_is(is), m_version(version) {}

  static void setRootDir(const TFilePath &fp) { m_rootDir = fp; }

  virtual TInputStreamInterface &operator>>(double &x) {
    m_is >> x;
    return *this;
  }
  virtual TInputStreamInterface &operator>>(int &x) {
    m_is >> x;
    return *this;
  }
  virtual TInputStreamInterface &operator>>(std::string &x) {
    m_is >> x;
    return *this;
  }
  virtual TInputStreamInterface &operator>>(UCHAR &x) {
    int v;
    m_is >> v;
    x = v;
    return *this;
  }
  virtual TInputStreamInterface &operator>>(USHORT &x) {
    int v;
    m_is >> v;
    x = v;
    return *this;
  }
  virtual TInputStreamInterface &operator>>(TRaster32P &x) {
    assert(m_rootDir != TFilePath());
    std::string name;
    m_is >> name;
    TFilePath filename = ((m_rootDir + "textures") + name).withType("bmp");
    TRasterP ras;
    if (TImageReader::load(filename, ras)) {
      x = ras;
    }
    return *this;
  }
  virtual TInputStreamInterface &operator>>(TPixel32 &x) {
    m_is >> x;
    return *this;
  }

  /*!
\details  Explicitly ovverrides the stream's version, returning m_version.
        This is necessary since palettes have their \a own version number,
        which is \a not the TIStream's file one.
*/
  virtual VersionNumber versionNumber() const {
    return m_version;
  }  //!< Returns the palette's version number.
};

TFilePath StyleWriter::m_rootDir = TFilePath();
TFilePath StyleReader::m_rootDir = TFilePath();

}  // namespace

//===================================================================

void TPalette::setRootDir(const TFilePath &fp) {
  StyleWriter::setRootDir(fp);
  StyleReader::setRootDir(fp);
}

//-------------------------------------------------------------------

void TPalette::saveData(TOStream &os) {
  os.child("version") << 71 << 0;  // Inserting the version tag at this level.
  // This is necessary to support the tpl format
  if (m_refImgPath !=
      TFilePath())  // since it performs *untagged* stream output
    os.child("refImgPath")
        << m_refImgPath;  // (the palette is streamed directly).

  os.openChild("styles");
  {
    for (int i = 0; i < getStyleCount(); ++i) {
      os.openChild("style");
      {
        StyleWriter w(os, i);
        m_styles[i].second->save(w);
      }
      os.closeChild();
    }
  }
  os.closeChild();

  os.openChild("stylepages");
  {
    for (int i = 0; i < getPageCount(); ++i) {
      Page *page = getPage(i);
      os.openChild("page");
      {
        os.child("name") << page->getName();

        os.openChild("indices");
        {
          int m = page->getStyleCount();

          for (int j = 0; j < m; ++j) os << page->getStyleId(j);
        }
        os.closeChild();
      }
      os.closeChild();
    }
  }
  os.closeChild();

  if (isAnimated()) {
    os.openChild("animation");
    {
      StyleAnimationTable::iterator sat, saEnd = m_styleAnimationTable.end();
      for (sat = m_styleAnimationTable.begin(); sat != saEnd; ++sat) {
        int styleId               = sat->first;
        StyleAnimation &animation = sat->second;

        std::map<std::string, std::string> attributes;
        attributes["id"] = std::to_string(styleId);

        os.openChild("style", attributes);
        {
          StyleAnimation::iterator kt, kEnd = animation.end();
          for (kt = animation.begin(); kt != kEnd; ++kt) {
            int frame = kt->first;

            TColorStyle *cs = kt->second.getPointer();
            assert(cs);

            attributes.clear();
            attributes["frame"] = std::to_string(frame);

            /*os.openChild("keycolor", attributes);                       // Up to Toonz 7.0, animations saved
              os << cs->getMainColor();                                   // the main color only
            os.closeChild();*/  //

            os.openChild("keyframe", attributes);
            {
              StyleWriter w(os, sat->first);
              kt->second->save(w);
            }
            os.closeChild();
          }
        }
        os.closeChild();
      }
    }
    os.closeChild();
  }

  // salvo gli shortcuts solo se sono non standard
  int i;
  for (i = 0; i < 10; ++i)
    if (getShortcutValue('0' + i) != i) break;

  if (i < 10) {
    os.openChild("shortcuts");
    {
      for (i = 0; i < 10; i++) os << getShortcutValue('0' + i);
    }
    os.closeChild();
  }
  if (isLocked()) {
    os.openChild("lock");
    os << 1;
    os.closeChild();
  }
}

//-------------------------------------------------------------------

void TPalette::loadData(TIStream &is) {
  m_styles.clear();
  clearPointerContainer(m_pages);

  VersionNumber version = is.getVersion();

  std::string tagName;
  while (is.openChild(tagName)) {
    if (tagName == "version") {
      is >> version.first >> version.second;
      if (version > VersionNumber(71, 0))
        throw TException("palette, unsupported version number");
    } else if (tagName == "styles") {
      while (!is.eos())  // I think while(is.openChild(tagName))
      {                  // would be better. However, I don't trust
        if (!is.openChild(tagName) ||
            tagName !=
                "style")  // TIStream's implementation very much. Keeping it
          throw TException(
              "palette, expected tag <style>");  // like this for now.
        {
          StyleReader r(is, version);
          TColorStyle *cs = TColorStyle::load(r);

          addStyle(cs);
        }

        is.closeChild();
      }
    } else if (tagName == "stylepages") {
      while (!is.eos()) {
        if (!is.openChild(tagName) || tagName != "page")
          throw TException("palette, expected tag <stylepage>");
        {
          std::wstring pageName;

          if (!is.openChild(tagName) || tagName != "name")
            throw TException("palette, expected tag <name>");
          { is >> pageName; }
          is.closeChild();

          Page *page = addPage(pageName);

          if (!is.openChild(tagName) || tagName != "indices")
            throw TException("palette, expected tag <indices>");
          {
            while (!is.eos()) {
              int index;
              is >> index;
              page->addStyle(index);
            }
          }
          is.closeChild();
        }
        is.closeChild();
      }
    } else if (tagName == "refImgPath")
      is >> m_refImgPath;
    else if (tagName == "animation") {
      while (!is.eos()) {
        if (!is.openChild(tagName) || tagName != "style")
          throw TException("palette, expected tag <style>");
        {
          int styleId = 0;
          if (!is.getTagParam("id", styleId))
            throw TException("palette, missing id attribute in tag <style>");

          StyleAnimation animation;

          TColorStyle *style = getStyle(styleId);
          assert(style);

          while (is.matchTag(tagName)) {
            TColorStyle *cs = 0;
            int frame       = 0;

            if (tagName == "keycolor") {
              if (!is.getTagParam("frame", frame))
                throw TException(
                    "palette, missing frame attribute in tag <keycolor>");

              TPixel32 color;
              is >> color;

              cs = style->clone();
              cs->setMainColor(color);
            } else if (tagName == "keyframe") {
              if (!is.getTagParam("frame", frame))
                throw TException(
                    "palette, missing frame attribute in tag <keyframe>");

              StyleReader r(is, version);
              cs = TColorStyle::load(r);
            } else
              throw TException("palette, expected <keyframe> tag");

            animation[frame] = cs;
            is.closeChild();
          }

          m_styleAnimationTable[styleId] = animation;
        }
        is.closeChild();
      }
    } else if (tagName == "stylepages") {
      int key = '0';
      while (!is.eos()) {
        int styleId = 0;
        is >> styleId;

        if (key <= '9') setShortcutValue(key, styleId);
      }
    } else if (tagName == "shortcuts") {
      for (int i = 0; i < 10; ++i) {
        int v;
        is >> v;

        setShortcutValue('0' + i, v);
      }
    } else if (tagName == "lock") {
      int lockValue;
      is >> lockValue;
      m_isLocked = (bool)lockValue;
    } else
      throw TException("palette, unknown tag: " + tagName);

    is.closeChild();
  }
}

//===================================================================

/*! if the palette is copied from studio palette, this function will modify the
 * original names.
*/
void TPalette::assign(const TPalette *src, bool isFromStudioPalette) {
  if (src == this) return;
  int i;
  m_isCleanupPalette = src->isCleanupPalette();
  // for(i=0;i<getStyleCount();i++) delete getStyle(i);
  m_styles.clear();
  clearPointerContainer(m_pages);

  for (i = 0; i < src->getStyleCount(); i++) {
    TColorStyle *srcStyle = src->getStyle(i);
    TColorStyle *dstStyle = srcStyle->clone();
    dstStyle->setName(
        srcStyle->getName());  // per un baco del TColorStyle::clone()
    dstStyle->setGlobalName(
        srcStyle->getGlobalName());  // per un baco del TColorStyle::clone()

    // if the style is copied from studio palette, put its name to the original
    // name.
    // check if the style has the global name (i.e. it comes from studio
    // palette)
    if (isFromStudioPalette && srcStyle->getGlobalName() != L"") {
      // If the original style has no original name (i.e. if the style is copied
      // from the studio palette)
      if (srcStyle->getOriginalName() == L"") {
        // put the original style name to the "original name" of the pasted
        // style.
        dstStyle->setOriginalName(srcStyle->getName());
      }
    }

    int j = addStyle(dstStyle);
    assert(i == j);
  }

  for (i = 0; i < src->getPageCount(); i++) {
    const Page *srcPage = src->getPage(i);
    Page *dstPage       = addPage(srcPage->getName());
    for (int j = 0; j < srcPage->getStyleCount(); j++)
      dstPage->addStyle(srcPage->getStyleId(j));
  }
  m_refImg     = !!src->m_refImg ? src->m_refImg->cloneImage() : TImageP();
  m_refImgPath = src->m_refImgPath;

  StyleAnimationTable::iterator it;
  StyleAnimation::iterator j;
  for (it = m_styleAnimationTable.begin(); it != m_styleAnimationTable.end();
       ++it) {
    // for(j = it->second.begin(); j != it->second.end(); ++j)
    //   delete j->second;
    it->second.clear();
  }
  m_styleAnimationTable.clear();
  StyleAnimationTable::const_iterator cit;
  for (cit = src->m_styleAnimationTable.begin();
       cit != src->m_styleAnimationTable.end(); ++cit) {
    StyleAnimation animation = cit->second;
    for (j = animation.begin(); j != animation.end(); j++)
      j->second                       = j->second->clone();
    m_styleAnimationTable[cit->first] = cit->second;
  }
  m_globalName   = src->getGlobalName();
  m_shortcuts    = src->m_shortcuts;
  m_currentFrame = src->m_currentFrame;
  // setDirtyFlag(true);
}

//-------------------------------------------------------------------
/*!if the palette is merged from studio palette, this function will modify the
 * original names.
*/
void TPalette::merge(const TPalette *src, bool isFromStudioPalette) {
  std::map<int, int> table;
  int i;
  for (i = 1; i < src->getStyleCount(); i++) {
    TColorStyle *srcStyle = src->getStyle(i);
    TColorStyle *dstStyle = srcStyle->clone();
    dstStyle->setName(srcStyle->getName());
    dstStyle->setGlobalName(srcStyle->getGlobalName());

    // if the style is copied from studio palette, put its name to the original
    // name.
    // check if the style has the global name (i.e. it comes from studio
    // palette)
    if (isFromStudioPalette && srcStyle->getGlobalName() != L"") {
      // If the original style has no original name (i.e. if the style is copied
      // from the studio palette)
      if (srcStyle->getOriginalName() == L"") {
        // put the original style name to the "original name" of the pasted
        // style.
        dstStyle->setOriginalName(srcStyle->getName());
      }
    }

    int j    = addStyle(dstStyle);
    table[i] = j;
  }

  int pageCount = src->getPageCount();
  for (i = 0; i < pageCount; i++) {
    const Page *srcPage   = src->getPage(i);
    std::wstring pageName = srcPage->getName();
    if (pageName == L"colors" && src->getPaletteName() != L"")
      pageName    = src->getPaletteName();
    Page *dstPage = addPage(pageName);  //;
    for (int j = 0; j < srcPage->getStyleCount(); j++) {
      int styleId = srcPage->getStyleId(j);
      if (styleId == 0) continue;
      assert(table.find(styleId) != table.end());
      dstPage->addStyle(table[styleId]);
    }
    assert(dstPage->m_palette == this);
  }
}

//-------------------------------------------------------------------

void TPalette::setIsCleanupPalette(bool on) { m_isCleanupPalette = on; }

//-------------------------------------------------------------------

void TPalette::setRefImg(const TImageP &img) {
  m_refImg = img;
  if (img) {
    assert(img->getPalette() == 0);
  }
}

//-------------------------------------------------------------------

void TPalette::setRefLevelFids(const std::vector<TFrameId> fids) {
  m_refLevelFids = fids;
}

//-------------------------------------------------------------------

std::vector<TFrameId> TPalette::getRefLevelFids() { return m_refLevelFids; }

//-------------------------------------------------------------------

void TPalette::setRefImgPath(const TFilePath &refImgPath) {
  m_refImgPath = refImgPath;
}

//===================================================================

bool TPalette::isAnimated() const { return !m_styleAnimationTable.empty(); }

//-------------------------------------------------------------------

int TPalette::getFrame() const { return m_currentFrame; }

//-------------------------------------------------------------------

void TPalette::setFrame(int frame) {
  QMutexLocker muLock(&m_mutex);

  if (m_currentFrame == frame) return;

  m_currentFrame = frame;

  StyleAnimationTable::iterator sat, saEnd = m_styleAnimationTable.end();
  for (sat = m_styleAnimationTable.begin(); sat != saEnd; ++sat) {
    StyleAnimation &animation = sat->second;
    assert(!animation.empty());

    // Retrieve the associated style to interpolate
    int styleId = sat->first;
    assert(0 <= styleId && styleId < getStyleCount());

    TColorStyle *cs = getStyle(styleId);
    assert(cs);

    // Buid the keyframes interval containing frame
    StyleAnimation::iterator j0, j1;

    j1 = animation.lower_bound(
        frame);  // j1 is the first element:  j1->first >= frame
    if (j1 == animation.begin())
      cs->copy(*j1->second);
    else {
      j0 = j1, --j0;
      assert(j0->first <= frame);

      if (j1 == animation.end())
        cs->copy(*j0->second);
      else {
        assert(frame <= j1->first);

        cs->assignBlend(*j0->second, *j1->second,
                        (frame - j0->first) / double(j1->first - j0->first));
      }
    }
  }
}

//-------------------------------------------------------------------

bool TPalette::isKeyframe(int styleId, int frame) const {
  StyleAnimationTable::const_iterator it = m_styleAnimationTable.find(styleId);
  if (it == m_styleAnimationTable.end()) return false;
  return it->second.count(frame) > 0;
}

//-------------------------------------------------------------------

int TPalette::getKeyframeCount(int styleId) const {
  StyleAnimationTable::const_iterator it = m_styleAnimationTable.find(styleId);
  if (it == m_styleAnimationTable.end()) return 0;
  return int(it->second.size());
}

//-------------------------------------------------------------------

int TPalette::getKeyframe(int styleId, int index) const {
  StyleAnimationTable::const_iterator it = m_styleAnimationTable.find(styleId);
  if (it == m_styleAnimationTable.end()) return -1;
  const StyleAnimation &animation = it->second;
  if (index < 0 || index >= (int)animation.size()) return -1;
  StyleAnimation::const_iterator j = animation.begin();
  std::advance(j, index);
  return j->first;
}

//-------------------------------------------------------------------

void TPalette::setKeyframe(int styleId, int frame) {
  assert(styleId >= 0 && styleId < getStyleCount());
  assert(frame >= 0);

  StyleAnimationTable::iterator sat = m_styleAnimationTable.find(styleId);

  if (sat == m_styleAnimationTable.end())
    sat =
        m_styleAnimationTable.insert(std::make_pair(styleId, StyleAnimation()))
            .first;

  assert(sat != m_styleAnimationTable.end());

  StyleAnimation &animation = sat->second;
  animation[frame]          = getStyle(styleId)->clone();
}

//-------------------------------------------------------------------

void TPalette::clearKeyframe(int styleId, int frame) {
  assert(0 <= styleId && styleId < getStyleCount());
  assert(0 <= frame);
  StyleAnimationTable::iterator it = m_styleAnimationTable.find(styleId);
  if (it == m_styleAnimationTable.end()) return;
  StyleAnimation &animation  = it->second;
  StyleAnimation::iterator j = animation.find(frame);
  if (j == animation.end()) return;
  // j->second->release();
  animation.erase(j);
  if (animation.empty()) {
    m_styleAnimationTable.erase(styleId);
  }
}

//-------------------------------------------------------------------

int TPalette::getShortcutValue(int key) const {
  assert('0' <= key && key <= '9');
  std::map<int, int>::const_iterator it;
  it = m_shortcuts.find(key);
  if (it == m_shortcuts.end()) return -1;
  int styleId = it->second;
  return 0 <= styleId && styleId < getStyleCount() ? styleId : -1;
}

//-------------------------------------------------------------------

int TPalette::getStyleShortcut(int styleId) const {
  assert(0 <= styleId && styleId < getStyleCount());
  std::map<int, int>::const_iterator it;
  for (it = m_shortcuts.begin(); it != m_shortcuts.end(); ++it)
    if (it->second == styleId) return it->first;
  return -1;
}

//-------------------------------------------------------------------

void TPalette::setShortcutValue(int key, int styleId) {
  assert('0' <= key && key <= '9');
  assert(styleId == -1 || 0 <= styleId && styleId < getStyleCount());
  if (styleId == -1)
    m_shortcuts.erase(key);
  else {
    std::map<int, int>::iterator it;
    for (it = m_shortcuts.begin(); it != m_shortcuts.end(); ++it)
      if (it->second == styleId) {
        m_shortcuts.erase(it);
        break;
      }
    m_shortcuts[key] = styleId;
  }
}